diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.cpp b/src/common/rendering/hwrenderer/data/hw_mesh.cpp index 18e91b645..fdde56154 100644 --- a/src/common/rendering/hwrenderer/data/hw_mesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_mesh.cpp @@ -1,11 +1,37 @@ #include "hw_mesh.h" +#include "v_video.h" + +#define USE_MESH_VERTEX_BUFFER void Mesh::Draw(FRenderState& renderstate) { +#ifdef USE_MESH_VERTEX_BUFFER + + if (!mVertexBuffer && mVertices.Size() != 0) + { + mVertexBuffer.reset(screen->CreateVertexBuffer()); + mVertexBuffer->SetData(mVertices.Size() * sizeof(FFlatVertex), mVertices.Data(), BufferUsageType::Static); + + static const FVertexBufferAttribute format[] = + { + { 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(FFlatVertex, x) }, + { 0, VATTR_TEXCOORD, VFmt_Float2, (int)myoffsetof(FFlatVertex, u) }, + { 0, VATTR_LIGHTMAP, VFmt_Float3, (int)myoffsetof(FFlatVertex, lu) }, + }; + mVertexBuffer->SetFormat(1, 3, sizeof(FFlatVertex), format); + } + + if (mVertexBuffer) + renderstate.SetVertexBuffer(mVertexBuffer.get(), 0, 0); + +#else + auto pair = renderstate.AllocVertices(mVertices.Size()); memcpy(pair.first, mVertices.Data(), mVertices.Size() * sizeof(FFlatVertex)); +#endif + MeshApplyState origState; origState.RenderStyle = renderstate.mRenderStyle; origState.SpecialEffect = renderstate.mSpecialEffect; @@ -42,9 +68,19 @@ void Mesh::Draw(FRenderState& renderstate) applyIndex = cmd.ApplyIndex; Apply(renderstate, mApplys[cmd.ApplyIndex]); } + +#ifdef USE_MESH_VERTEX_BUFFER + renderstate.Draw(cmd.DrawType, cmd.Start, cmd.Count, apply); +#else renderstate.Draw(cmd.DrawType, pair.second + cmd.Start, cmd.Count, apply); +#endif } +#ifdef USE_MESH_VERTEX_BUFFER + if (mVertexBuffer) + renderstate.SetVertexBuffer(screen->mVertexData); +#endif + for (const MeshDrawCommand& cmd : mIndexedDraws) { bool apply = applyIndex != cmd.ApplyIndex; diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.h b/src/common/rendering/hwrenderer/data/hw_mesh.h index 913ccde2c..810ecc729 100644 --- a/src/common/rendering/hwrenderer/data/hw_mesh.h +++ b/src/common/rendering/hwrenderer/data/hw_mesh.h @@ -14,6 +14,7 @@ private: TArray mDraws; TArray mIndexedDraws; TArray mVertices; + std::unique_ptr mVertexBuffer; friend class MeshBuilder; }; diff --git a/src/rendering/hwrenderer/scene/hw_meshcache.cpp b/src/rendering/hwrenderer/scene/hw_meshcache.cpp index 4340da2b6..07c77bfcf 100644 --- a/src/rendering/hwrenderer/scene/hw_meshcache.cpp +++ b/src/rendering/hwrenderer/scene/hw_meshcache.cpp @@ -44,7 +44,8 @@ void HWMeshCache::Update(FRenderViewpoint& vp) } } - // Refresh 10 sectors per frame. Shouldn't be needed but for some reason some initial flats are black!! +#if 0 + // Refresh 10 sectors per frame. for (int i = 0; i < 10; i++) { if (nextRefresh < count) @@ -54,6 +55,7 @@ void HWMeshCache::Update(FRenderViewpoint& vp) if (count > 0) nextRefresh = (nextRefresh + 1) % count; } +#endif // Update changed sectors for (unsigned int i = 0; i < count; i++)