diff --git a/include/XPMPMultiplayer.h b/include/XPMPMultiplayer.h index 71f9ec514..ca22f5445 100644 --- a/include/XPMPMultiplayer.h +++ b/include/XPMPMultiplayer.h @@ -442,6 +442,7 @@ typedef void (* XPMPPlaneNotifier_f)( * */ typedef void (* XPMPRenderPlanes_f)( + int inIsBlend, void * inRef); /* diff --git a/include/XPMPPlaneRenderer.h b/include/XPMPPlaneRenderer.h index f19e0dc95..e4dcfc401 100644 --- a/include/XPMPPlaneRenderer.h +++ b/include/XPMPPlaneRenderer.h @@ -29,6 +29,6 @@ // These functions do "the drawing" once per frame. void XPMPInitDefaultPlaneRenderer(void); -void XPMPDefaultPlaneRenderer(void); +void XPMPDefaultPlaneRenderer(int is_blend); #endif \ No newline at end of file diff --git a/src/XPMPMultiplayer.cpp b/src/XPMPMultiplayer.cpp index e2185ff10..1f1493e9a 100644 --- a/src/XPMPMultiplayer.cpp +++ b/src/XPMPMultiplayer.cpp @@ -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; } diff --git a/src/XPMPPlaneRenderer.cpp b/src/XPMPPlaneRenderer.cpp index d1b481a93..1641de9af 100644 --- a/src/XPMPPlaneRenderer.cpp +++ b/src/XPMPPlaneRenderer.cpp @@ -256,7 +256,7 @@ struct PlaneToRender_t { typedef std::map 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];