From 84a9bfdeead4482ee53157a713d97bf6d3aa5117 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sat, 11 Apr 2020 07:34:29 +0200 Subject: [PATCH 1/2] renderer: introduce tess.bspSurface, ref #302 Make possible to test if a surface comes for a map model, even if if not world model or there is no lightmap. --- src/engine/renderer/tr_backend.cpp | 4 +++- src/engine/renderer/tr_local.h | 7 +++++-- src/engine/renderer/tr_main.cpp | 5 +++-- src/engine/renderer/tr_shade.cpp | 5 +++-- src/engine/renderer/tr_surface.cpp | 4 ++-- src/engine/renderer/tr_world.cpp | 2 +- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index 090cc278b2..386eac24ba 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -828,6 +828,7 @@ static void RB_RenderDrawSurfaces( shaderSort_t fromSort, shaderSort_t toSort, shader_t *shader, *oldShader; int lightmapNum, oldLightmapNum; int fogNum, oldFogNum; + bool bspSurface; bool depthRange, oldDepthRange; int i; drawSurf_t *drawSurf; @@ -854,6 +855,7 @@ static void RB_RenderDrawSurfaces( shaderSort_t fromSort, shaderSort_t toSort, shader = drawSurf->shader; lightmapNum = drawSurf->lightmapNum(); fogNum = drawSurf->fogNum(); + bspSurface = drawSurf->bspSurface; if( entity == &tr.worldEntity ) { if( !( drawSurfFilter & DRAWSURFACES_WORLD ) ) @@ -888,7 +890,7 @@ static void RB_RenderDrawSurfaces( shaderSort_t fromSort, shaderSort_t toSort, Tess_End(); } - Tess_Begin( Tess_StageIteratorGeneric, nullptr, shader, nullptr, false, false, lightmapNum, fogNum ); + Tess_Begin( Tess_StageIteratorGeneric, nullptr, shader, nullptr, false, false, lightmapNum, fogNum, bspSurface ); oldShader = shader; oldLightmapNum = lightmapNum; diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 752b6135ea..52908bb02f 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -1595,6 +1595,7 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out ) surfaceType_t *surface; // any of surface*_t shader_t *shader; uint64_t sort; + bool bspSurface; inline int index() const { return int( ( sort & SORT_INDEX_MASK ) ); @@ -3002,7 +3003,7 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out ) void R_AddPolygonSurfaces(); - void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int lightmapNum, int fogNum ); + void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int lightmapNum, int fogNum, bool bspSurface = false ); void R_LocalNormalToWorld( const vec3_t local, vec3_t world ); void R_LocalPointToWorld( const vec3_t local, vec3_t world ); @@ -3295,6 +3296,7 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out ) bool skipVBO; int16_t lightmapNum; int16_t fogNum; + bool bspSurface; uint32_t numIndexes; uint32_t numVertexes; @@ -3342,7 +3344,8 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out ) bool skipTangentSpaces, bool skipVBO, int lightmapNum, - int fogNum ); + int fogNum, + bool bspSurface = false ); // *INDENT-ON* void Tess_End(); diff --git a/src/engine/renderer/tr_main.cpp b/src/engine/renderer/tr_main.cpp index 73f4167a99..1a7bc96256 100644 --- a/src/engine/renderer/tr_main.cpp +++ b/src/engine/renderer/tr_main.cpp @@ -1947,7 +1947,7 @@ int R_SpriteFogNum( trRefEntity_t *ent ) R_AddDrawSurf ================= */ -void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int lightmapNum, int fogNum ) +void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int lightmapNum, int fogNum, bool bspSurface ) { int index; drawSurf_t *drawSurf; @@ -1961,6 +1961,7 @@ void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int lightmapNum, i drawSurf->entity = tr.currentEntity; drawSurf->surface = surface; drawSurf->shader = shader; + drawSurf->bspSurface = bspSurface; int entityNum; @@ -1983,7 +1984,7 @@ void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int lightmapNum, i tr.refdef.numDrawSurfs++; if ( shader->depthShader != nullptr ) { - R_AddDrawSurf( surface, shader->depthShader, 0, 0 ); + R_AddDrawSurf( surface, shader->depthShader, 0, 0, bspSurface ); } } diff --git a/src/engine/renderer/tr_shade.cpp b/src/engine/renderer/tr_shade.cpp index aceac14825..8026001fe8 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -505,7 +505,8 @@ void Tess_Begin( void ( *stageIteratorFunc )(), bool skipTangentSpaces, bool skipVBO, int lightmapNum, - int fogNum ) + int fogNum, + bool bspSurface ) { shader_t *state; @@ -535,7 +536,6 @@ void Tess_Begin( void ( *stageIteratorFunc )(), Tess_MapVBOs( false ); } - bool isSky = ( state != nullptr && state->isSky != false ); tess.lightShader = lightShader; @@ -569,6 +569,7 @@ void Tess_Begin( void ( *stageIteratorFunc )(), tess.skipVBO = skipVBO; tess.lightmapNum = lightmapNum; tess.fogNum = fogNum; + tess.bspSurface = bspSurface; if ( r_logFile->integer ) { diff --git a/src/engine/renderer/tr_surface.cpp b/src/engine/renderer/tr_surface.cpp index 1360b3fc15..974cb5d690 100644 --- a/src/engine/renderer/tr_surface.cpp +++ b/src/engine/renderer/tr_surface.cpp @@ -49,7 +49,7 @@ void Tess_EndBegin() { Tess_End(); Tess_Begin( tess.stageIteratorFunc, tess.stageIteratorFunc2, tess.surfaceShader, tess.lightShader, tess.skipTangentSpaces, tess.skipVBO, - tess.lightmapNum, tess.fogNum ); + tess.lightmapNum, tess.fogNum, tess.bspSurface ); } /* @@ -113,7 +113,7 @@ void Tess_CheckOverflow( int verts, int indexes ) } Tess_Begin( tess.stageIteratorFunc, tess.stageIteratorFunc2, tess.surfaceShader, tess.lightShader, tess.skipTangentSpaces, tess.skipVBO, - tess.lightmapNum, tess.fogNum ); + tess.lightmapNum, tess.fogNum, tess.bspSurface ); } /* diff --git a/src/engine/renderer/tr_world.cpp b/src/engine/renderer/tr_world.cpp index 1e9928d6cc..f0bc3d811e 100644 --- a/src/engine/renderer/tr_world.cpp +++ b/src/engine/renderer/tr_world.cpp @@ -296,7 +296,7 @@ static bool R_AddWorldSurface( bspSurface_t *surf, int fogIndex, int planeBits ) return true; } - R_AddDrawSurf( surf->data, surf->shader, surf->lightmapNum, fogIndex ); + R_AddDrawSurf( surf->data, surf->shader, surf->lightmapNum, fogIndex, true ); return true; } From cddfc7aa11d8a466278d3f4d75a61ad353726fdb Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sat, 11 Apr 2020 07:38:59 +0200 Subject: [PATCH 2/2] renderer: use tess.bspSurface to select the right renderer, fix #302 --- src/engine/renderer/tr_shade.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/engine/renderer/tr_shade.cpp b/src/engine/renderer/tr_shade.cpp index 8026001fe8..395ae298a8 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -3056,18 +3056,21 @@ void Tess_StageIteratorGeneric() { if ( r_precomputedLighting->integer || r_vertexLighting->integer ) { - if ( !r_vertexLighting->integer && tess.lightmapNum >= 0 && tess.lightmapNum <= tr.lightmaps.currentElements ) + + if ( tess.bspSurface ) { - Render_lightMapping( stage ); - } - else if ( backEnd.currentEntity != &tr.worldEntity ) - { - // FIXME: This can be reached if r_vertexLighting == 0 and tess.lightmapNum is invalid which doesn't seem right - Render_vertexLighting_DBS_entity( stage ); + if ( !r_vertexLighting->integer && tess.lightmapNum >= 0 && tess.lightmapNum <= tr.lightmaps.currentElements ) + { + Render_lightMapping( stage ); + } + else + { + Render_vertexLighting_DBS_world( stage ); + } } else { - Render_vertexLighting_DBS_world( stage ); + Render_vertexLighting_DBS_entity( stage ); } } else