From 3fe8b6909b7432806bcd4b049b2f4b7e1540ee63 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 28 Dec 2022 15:31:04 +0100 Subject: [PATCH] Add a basic renderstate->mesh builder class --- src/CMakeLists.txt | 2 + .../hwrenderer/data/flatvertices.cpp | 7 ++ .../rendering/hwrenderer/data/hw_mesh.cpp | 2 + .../rendering/hwrenderer/data/hw_mesh.h | 7 ++ .../hwrenderer/data/hw_meshbuilder.cpp | 62 ++++++++++++++ .../hwrenderer/data/hw_meshbuilder.h | 83 +++++++++++++++++++ .../hwrenderer/data/hw_renderstate.h | 5 ++ 7 files changed, 168 insertions(+) create mode 100644 src/common/rendering/hwrenderer/data/hw_mesh.cpp create mode 100644 src/common/rendering/hwrenderer/data/hw_mesh.h create mode 100644 src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp create mode 100644 src/common/rendering/hwrenderer/data/hw_meshbuilder.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cfe52065e..4e2ffed32 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1116,6 +1116,8 @@ set (PCH_SOURCES common/rendering/hwrenderer/data/hw_shadowmap.cpp common/rendering/hwrenderer/data/hw_shaderpatcher.cpp common/rendering/hwrenderer/data/hw_collision.cpp + common/rendering/hwrenderer/data/hw_meshbuilder.cpp + common/rendering/hwrenderer/data/hw_mesh.cpp common/rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp common/rendering/hwrenderer/postprocessing/hw_postprocess.cpp common/rendering/hwrenderer/postprocessing/hw_postprocess_cvars.cpp diff --git a/src/common/rendering/hwrenderer/data/flatvertices.cpp b/src/common/rendering/hwrenderer/data/flatvertices.cpp index 0066e3d4b..2ba92f55a 100644 --- a/src/common/rendering/hwrenderer/data/flatvertices.cpp +++ b/src/common/rendering/hwrenderer/data/flatvertices.cpp @@ -38,6 +38,7 @@ #include "cmdlib.h" #include "printf.h" #include "hwrenderer/data/buffers.h" +#include "hw_renderstate.h" //========================================================================== // @@ -176,3 +177,9 @@ void FFlatVertexBuffer::Copy(int start, int count) mVertexBuffer = old; } +//========================================================================== + +std::pair FRenderState::AllocVertices(unsigned int count) +{ + return screen->mVertexData->AllocVertices(count); +} diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.cpp b/src/common/rendering/hwrenderer/data/hw_mesh.cpp new file mode 100644 index 000000000..cdb653343 --- /dev/null +++ b/src/common/rendering/hwrenderer/data/hw_mesh.cpp @@ -0,0 +1,2 @@ + +#include "hw_mesh.h" diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.h b/src/common/rendering/hwrenderer/data/hw_mesh.h new file mode 100644 index 000000000..8e66e6e7d --- /dev/null +++ b/src/common/rendering/hwrenderer/data/hw_mesh.h @@ -0,0 +1,7 @@ +#pragma once + +class Mesh +{ +public: + +}; diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp new file mode 100644 index 000000000..c5912688a --- /dev/null +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -0,0 +1,62 @@ + +#include "hw_meshbuilder.h" +#include "hw_mesh.h" + +void MeshBuilder::Draw(int dt, int index, int count, bool apply) +{ + if (apply) + Apply(); + + MeshDrawCommand command; + command.DrawType = dt; + command.Start = index; + command.Count = count; + command.ApplyIndex = mApplys.Size() - 1; + mDraws.Push(command); +} + +void MeshBuilder::SetDepthFunc(int func) +{ + mDepthFunc = func; +} + +void MeshBuilder::Apply() +{ + MeshApplyState state; + + state.RenderStyle = mRenderStyle; + state.SpecialEffect = mSpecialEffect; + state.TextureEnabled = mTextureEnabled; + state.AlphaThreshold = mAlphaThreshold; + state.DepthFunc = mDepthFunc; + + state.streamData = mStreamData; + state.material = mMaterial; + + state.uClipSplit = { mClipSplit[0], mClipSplit[1] }; + + state.FogEnabled = mFogEnabled; + state.BrightmapEnabled = mBrightmapEnabled; + state.TextureClamp = mTextureClamp; + state.TextureMode = mTextureMode; + + state.uLightDist = mLightParms[0]; + state.uLightFactor = mLightParms[1]; + state.uFogDensity = mLightParms[2]; + state.uLightLevel = mLightParms[3]; + + mApplys.Push(state); +} + +std::unique_ptr MeshBuilder::Create() +{ + auto mesh = std::make_unique(); + + return mesh; +} + +std::pair MeshBuilder::AllocVertices(unsigned int count) +{ + unsigned int offset = mVertices.Reserve(count); + return { &mVertices[offset], offset }; +} diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.h b/src/common/rendering/hwrenderer/data/hw_meshbuilder.h new file mode 100644 index 000000000..1bb1cd55b --- /dev/null +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.h @@ -0,0 +1,83 @@ +#pragma once + +#include "hw_renderstate.h" +#include "hw_material.h" +#include "flatvertices.h" + +class Mesh; + +class MeshApplyState +{ +public: + FRenderStyle RenderStyle; + int SpecialEffect; + bool TextureEnabled; + float AlphaThreshold; + int DepthFunc; + + StreamData streamData; + FMaterialState material; + + FVector2 uClipSplit; + + uint8_t FogEnabled; + uint8_t BrightmapEnabled; + int TextureClamp; + int TextureMode; + + float uLightLevel; + float uFogDensity; + float uLightFactor; + float uLightDist; +}; + +class MeshDrawCommand +{ +public: + int DrawType; + int Start; + int Count; + int ApplyIndex; +}; + +class MeshBuilder : public FRenderState +{ +public: + // Vertices + std::pair AllocVertices(unsigned int count) override; + + // Draw commands + void Draw(int dt, int index, int count, bool apply = true) override; + void DrawIndexed(int dt, int index, int count, bool apply = true) override { } // TBD: this is only used for the sector flat rendering. + + // Immediate render state change commands. These only change infrequently and should not clutter the render state. + void SetDepthFunc(int func) override; + + // Commands not relevant for mesh building + void Clear(int targets) override { } + void ClearScreen() override { } + void SetScissor(int x, int y, int w, int h) override { } + void SetViewport(int x, int y, int w, int h) override { } + void EnableMultisampling(bool on) override { } + void EnableLineSmooth(bool on) override { } + void EnableDrawBuffers(int count, bool apply) override { } + void EnableClipDistance(int num, bool state) override { } + void SetDepthRange(float min, float max) override { } + bool SetDepthClamp(bool on) override { } + void SetDepthMask(bool on) override { } + void SetColorMask(bool r, bool g, bool b, bool a) override { } + void SetStencil(int offs, int op, int flags = -1) override { } + void SetCulling(int mode) override { } + void EnableStencil(bool on) override { } + void EnableDepthTest(bool on) override { } + + std::unique_ptr Create(); + +private: + void Apply(); + + TArray mApplys; + TArray mDraws; + TArray mVertices; + int mDepthFunc = 0; +}; diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index ef0c78c2d..99b1030f7 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -118,6 +118,8 @@ struct FDepthBiasState } }; +struct FFlatVertex; + enum EPassType { NORMAL_PASS, @@ -731,6 +733,9 @@ public: // API-dependent render interface + // Vertices + virtual std::pair AllocVertices(unsigned int count); + // Draw commands virtual void ClearScreen() = 0; virtual void Draw(int dt, int index, int count, bool apply = true) = 0;