diff --git a/src/gl/scene/gl_vertex.cpp b/src/gl/scene/gl_vertex.cpp index e0ca18b2b..e9aef4459 100644 --- a/src/gl/scene/gl_vertex.cpp +++ b/src/gl/scene/gl_vertex.cpp @@ -21,12 +21,9 @@ // - -#include "gl/system/gl_system.h" - -#include "gl/renderer/gl_renderer.h" -#include "gl/data/gl_vertexbuffer.h" -#include "gl/scene/gl_drawinfo.h" +#include "r_defs.h" +#include "hwrenderer/data/flatvertices.h" +#include "gl/scene/gl_wall.h" EXTERN_CVAR(Bool, gl_seamless) @@ -170,3 +167,26 @@ void GLWall::SplitRightEdge(FFlatVertex *&ptr) } } +//========================================================================== +// +// Create vertices for one wall +// +//========================================================================== + +void GLWall::CreateVertices(FFlatVertex *&ptr, bool nosplit) +{ + bool split = (gl_seamless && !nosplit && seg->sidedef != nullptr && !(seg->sidedef->Flags & WALLF_POLYOBJ) && !(flags & GLWF_NOSPLIT)); + ptr->Set(glseg.x1, zbottom[0], glseg.y1, tcs[LOLFT].u, tcs[LOLFT].v); + ptr++; + if (split && glseg.fracleft == 0) SplitLeftEdge(ptr); + ptr->Set(glseg.x1, ztop[0], glseg.y1, tcs[UPLFT].u, tcs[UPLFT].v); + ptr++; + if (split && !(flags & GLWF_NOSPLITUPPER)) SplitUpperEdge(ptr); + ptr->Set(glseg.x2, ztop[1], glseg.y2, tcs[UPRGT].u, tcs[UPRGT].v); + ptr++; + if (split && glseg.fracright == 1) SplitRightEdge(ptr); + ptr->Set(glseg.x2, zbottom[1], glseg.y2, tcs[LORGT].u, tcs[LORGT].v); + ptr++; + if (split && !(flags & GLWF_NOSPLITLOWER)) SplitLowerEdge(ptr); +} + diff --git a/src/gl/scene/gl_wall.h b/src/gl/scene/gl_wall.h index 49642e838..9b112963d 100644 --- a/src/gl/scene/gl_wall.h +++ b/src/gl/scene/gl_wall.h @@ -10,6 +10,8 @@ #include "textures/textures.h" #include "gl/renderer/gl_colormap.h" +#pragma warning(disable:4244) + struct GLHorizonInfo; struct F3DFloor; struct model_t; @@ -24,6 +26,7 @@ struct FSectorPortalGroup; struct FFlatVertex; struct FLinePortalSpan; class GLSceneDrawer; +struct FDynLightData; enum { @@ -207,7 +210,7 @@ private: bool SplitWallComplex(HWDrawInfo *di, sector_t * frontsector, bool translucent, float& maplightbottomleft, float& maplightbottomright); void SplitWall(HWDrawInfo *di, sector_t * frontsector, bool translucent); - void SetupLights(); + bool SetupLights(FDynLightData &lightdata); void MakeVertices(bool nosplit); void RenderWall(int textured); void RenderTextured(int rflags); @@ -257,6 +260,7 @@ private: void RenderMirrorSurface(); void RenderTranslucentWall(); + void CreateVertices(FFlatVertex *&ptr, bool nosplit); void SplitLeftEdge (FFlatVertex *&ptr); void SplitRightEdge(FFlatVertex *&ptr); void SplitUpperEdge(FFlatVertex *&ptr); diff --git a/src/gl/scene/gl_walls_draw.cpp b/src/gl/scene/gl_walls_draw.cpp index d24750d79..347a07d04 100644 --- a/src/gl/scene/gl_walls_draw.cpp +++ b/src/gl/scene/gl_walls_draw.cpp @@ -42,17 +42,17 @@ EXTERN_CVAR(Bool, gl_seamless) +FDynLightData lightdata; + //========================================================================== // // Collect lights for shader // //========================================================================== -FDynLightData lightdata; - -void GLWall::SetupLights() +bool GLWall::SetupLights(FDynLightData &lightdata) { - if (RenderStyle == STYLE_Add && !level.lightadditivesurfaces) return; // no lights on additively blended surfaces. + if (RenderStyle == STYLE_Add && !level.lightadditivesurfaces) return false; // no lights on additively blended surfaces. // check for wall types which cannot have dynamic lights on them (portal types never get here so they don't need to be checked.) switch (type) @@ -60,7 +60,7 @@ void GLWall::SetupLights() case RENDERWALL_FOGBOUNDARY: case RENDERWALL_MIRRORSURFACE: case RENDERWALL_COLOR: - return; + return false; } float vtx[]={glseg.x1,zbottom[0],glseg.y1, glseg.x1,ztop[0],glseg.y1, glseg.x2,ztop[1],glseg.y2, glseg.x2,zbottom[1],glseg.y2}; @@ -141,8 +141,7 @@ void GLWall::SetupLights() } node = node->nextLight; } - - dynlightindex = GLRenderer->mLights->UploadLights(lightdata); + return true; } //========================================================================== @@ -155,22 +154,8 @@ void GLWall::MakeVertices(bool nosplit) { if (vertcount == 0) { - bool split = (gl_seamless && !nosplit && seg->sidedef != NULL && !(seg->sidedef->Flags & WALLF_POLYOBJ) && !(flags & GLWF_NOSPLIT)); - FFlatVertex *ptr = GLRenderer->mVBO->GetBuffer(); - - ptr->Set(glseg.x1, zbottom[0], glseg.y1, tcs[LOLFT].u, tcs[LOLFT].v); - ptr++; - if (split && glseg.fracleft == 0) SplitLeftEdge(ptr); - ptr->Set(glseg.x1, ztop[0], glseg.y1, tcs[UPLFT].u, tcs[UPLFT].v); - ptr++; - if (split && !(flags & GLWF_NOSPLITUPPER)) SplitUpperEdge(ptr); - ptr->Set(glseg.x2, ztop[1], glseg.y2, tcs[UPRGT].u, tcs[UPRGT].v); - ptr++; - if (split && glseg.fracright == 1) SplitRightEdge(ptr); - ptr->Set(glseg.x2, zbottom[1], glseg.y2, tcs[LORGT].u, tcs[LORGT].v); - ptr++; - if (split && !(flags & GLWF_NOSPLITLOWER)) SplitLowerEdge(ptr); + CreateVertices(ptr, nosplit); vertcount = GLRenderer->mVBO->GetCount(ptr, &vertindex); } } @@ -389,7 +374,8 @@ void GLWall::RenderTranslucentWall() { if (mDrawer->FixedColormap == CM_DEFAULT && gl_lights && gl.lightmethod == LM_DIRECT) { - SetupLights(); + if (SetupLights(lightdata)) + dynlightindex = GLRenderer->mLights->UploadLights(lightdata); } if (!gltexture->tex->GetTranslucency()) gl_RenderState.AlphaFunc(GL_GEQUAL, gl_mask_threshold); else gl_RenderState.AlphaFunc(GL_GEQUAL, 0.f); @@ -419,11 +405,13 @@ void GLWall::Draw(int pass) switch (pass) { case GLPASS_LIGHTSONLY: - SetupLights(); + if (SetupLights(lightdata)) + dynlightindex = GLRenderer->mLights->UploadLights(lightdata); break; case GLPASS_ALL: - SetupLights(); + if (SetupLights(lightdata)) + dynlightindex = GLRenderer->mLights->UploadLights(lightdata); // fall through case GLPASS_PLAIN: RenderTextured(RWF_TEXTURED);