bug fixes for multi-pass drawing and HDR mode

This commit is contained in:
bsupnik
2013-11-19 16:46:42 -05:00
parent fe7f49da0d
commit bf91ea6ce1
4 changed files with 34 additions and 7 deletions

View File

@@ -442,6 +442,7 @@ typedef void (* XPMPPlaneNotifier_f)(
*
*/
typedef void (* XPMPRenderPlanes_f)(
int inIsBlend,
void * inRef);
/*

View File

@@ -29,6 +29,6 @@
// These functions do "the drawing" once per frame.
void XPMPInitDefaultPlaneRenderer(void);
void XPMPDefaultPlaneRenderer(void);
void XPMPDefaultPlaneRenderer(int is_blend);
#endif

View File

@@ -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;
}

View File

@@ -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];