mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-22 14:55:36 +08:00
bug fixes for multi-pass drawing and HDR mode
This commit is contained in:
@@ -442,6 +442,7 @@ typedef void (* XPMPPlaneNotifier_f)(
|
||||
*
|
||||
*/
|
||||
typedef void (* XPMPRenderPlanes_f)(
|
||||
int inIsBlend,
|
||||
void * inRef);
|
||||
|
||||
/*
|
||||
|
||||
@@ -29,6 +29,6 @@
|
||||
// These functions do "the drawing" once per frame.
|
||||
|
||||
void XPMPInitDefaultPlaneRenderer(void);
|
||||
void XPMPDefaultPlaneRenderer(void);
|
||||
void XPMPDefaultPlaneRenderer(int is_blend);
|
||||
|
||||
#endif
|
||||
@@ -33,6 +33,7 @@
|
||||
|
||||
#include "XPLMProcessing.h"
|
||||
#include "XPLMPlanes.h"
|
||||
#include "XPLMDataAccess.h"
|
||||
#include "XPLMDisplay.h"
|
||||
#include "XPLMPlugin.h"
|
||||
#include "XPLMUtilities.h"
|
||||
@@ -476,10 +477,22 @@ int XPMPRenderMultiplayerPlanes(
|
||||
int inIsBefore,
|
||||
void * inRefcon)
|
||||
{
|
||||
static int is_blend = 0;
|
||||
|
||||
static XPLMDataRef wrt = XPLMFindDataRef("sim/graphics/view/world_render_type");
|
||||
static XPLMDataRef prt = XPLMFindDataRef("sim/graphics/view/plane_render_type");
|
||||
|
||||
int is_shadow = wrt != NULL && XPLMGetDatai(wrt) != 0;
|
||||
|
||||
if(prt)
|
||||
is_blend = XPLMGetDatai(prt) == 2;
|
||||
|
||||
if (gRenderer)
|
||||
gRenderer(gRendererRef);
|
||||
gRenderer(is_shadow ? 0 : is_blend,gRendererRef);
|
||||
else
|
||||
XPMPDefaultPlaneRenderer();
|
||||
XPMPDefaultPlaneRenderer(is_shadow ? 0 : is_blend);
|
||||
if(!is_shadow)
|
||||
is_blend = 1 - is_blend;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -256,7 +256,7 @@ struct PlaneToRender_t {
|
||||
typedef std::map<float, PlaneToRender_t> RenderMap;
|
||||
|
||||
|
||||
void XPMPDefaultPlaneRenderer(void)
|
||||
void XPMPDefaultPlaneRenderer(int is_blend)
|
||||
{
|
||||
long planeCount = XPMPCountPlanes();
|
||||
#if DEBUG_RENDERER
|
||||
@@ -510,6 +510,7 @@ void XPMPDefaultPlaneRenderer(void)
|
||||
// Using the user's planes can cause the internal flight model to get f-cked up.
|
||||
// Using a non-loaded plane can trigger internal asserts in x-plane.
|
||||
if (modelCount > 1)
|
||||
if(!is_blend)
|
||||
XPLMDrawAircraft(1,
|
||||
(float) iter->second.x, (float) iter->second.y, (float) iter->second.z,
|
||||
iter->second.pitch, iter->second.roll, iter->second.heading,
|
||||
@@ -532,6 +533,7 @@ void XPMPDefaultPlaneRenderer(void)
|
||||
|
||||
// PASS 1 - draw Austin's planes.
|
||||
|
||||
if(!is_blend)
|
||||
for (planeMapIter = planes_austin.begin(); planeMapIter != planes_austin.end(); ++planeMapIter)
|
||||
{
|
||||
CSL_DrawObject( planeMapIter->second->model,
|
||||
@@ -554,7 +556,14 @@ void XPMPDefaultPlaneRenderer(void)
|
||||
}
|
||||
|
||||
// PASS 2 - draw OBJs
|
||||
|
||||
// Blend for solid OBJ7s? YES! First, in HDR mode, they DO NOT draw to the gbuffer properly -
|
||||
// they splat their livery into the normal map, which is terrifying and stupid. Then they are also
|
||||
// pre-lit...the net result is surprisingly not much worse than regular rendering considering how many
|
||||
// bad things have happened, but for all I know we're getting NaNs somewhere.
|
||||
//
|
||||
// Blending isn't going to hurt things in NON-HDR because our rendering is so stupid for old objs - there's
|
||||
// pretty much never translucency so we aren't going to get Z-order fails. So f--- it...always draw blend.<
|
||||
if(is_blend)
|
||||
for (planeMapIter = planes_obj.begin(); planeMapIter != planes_obj.end(); ++planeMapIter)
|
||||
{
|
||||
CSL_DrawObject(
|
||||
@@ -589,10 +598,12 @@ void XPMPDefaultPlaneRenderer(void)
|
||||
&(*planeIter)->state);
|
||||
}
|
||||
|
||||
obj_draw_solid();
|
||||
if(!is_blend)
|
||||
obj_draw_solid();
|
||||
|
||||
// PASS 3 - draw OBJ lights.
|
||||
|
||||
if(is_blend)
|
||||
if (!planes_obj_lites.empty())
|
||||
{
|
||||
OBJ_BeginLightDrawing();
|
||||
@@ -614,10 +625,12 @@ void XPMPDefaultPlaneRenderer(void)
|
||||
}
|
||||
}
|
||||
|
||||
obj_draw_translucent();
|
||||
if(is_blend)
|
||||
obj_draw_translucent();
|
||||
obj_draw_done();
|
||||
|
||||
// PASS 4 - Labels
|
||||
if(is_blend)
|
||||
if ( gDrawLabels )
|
||||
{
|
||||
GLfloat vp[4];
|
||||
|
||||
Reference in New Issue
Block a user