From 28ef69ca5a082ae15235ddf885e224dbdac26632 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 28 Dec 2022 15:56:39 +0100 Subject: [PATCH] Add the most basic implementation of a Mesh drawer as technically possible :) --- .../rendering/hwrenderer/data/hw_mesh.cpp | 50 +++++++++++++++++++ .../rendering/hwrenderer/data/hw_mesh.h | 11 ++++ .../hwrenderer/data/hw_meshbuilder.cpp | 4 +- .../hwrenderer/data/hw_renderstate.h | 1 + 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.cpp b/src/common/rendering/hwrenderer/data/hw_mesh.cpp index cdb653343..b9343b737 100644 --- a/src/common/rendering/hwrenderer/data/hw_mesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_mesh.cpp @@ -1,2 +1,52 @@ #include "hw_mesh.h" + +void Mesh::Draw(FRenderState& renderstate) +{ + auto pair = renderstate.AllocVertices(mVertices.Size()); + memcpy(pair.first, mVertices.Data(), mVertices.Size() * sizeof(FFlatVertex)); + + int applyIndex = -1; + int depthFunc = -1; + for (const MeshDrawCommand& cmd : mDraws) + { + bool apply = applyIndex != cmd.ApplyIndex; + if (apply) + { + int newDepthFunc = mApplys[cmd.ApplyIndex].DepthFunc; + if (depthFunc != newDepthFunc) + { + depthFunc = newDepthFunc; + renderstate.SetDepthFunc(depthFunc); + } + + applyIndex = cmd.ApplyIndex; + Apply(renderstate, mApplys[cmd.ApplyIndex]); + } + renderstate.Draw(cmd.DrawType, pair.second + cmd.Start, cmd.Count, apply); + } +} + +void Mesh::Apply(FRenderState& renderstate, const MeshApplyState& state) +{ + renderstate.mRenderStyle = state.RenderStyle; + renderstate.mSpecialEffect = state.SpecialEffect; + renderstate.mTextureEnabled = state.TextureEnabled; + renderstate.mAlphaThreshold = state.AlphaThreshold; + + renderstate.mStreamData = state.streamData; + renderstate.mMaterial = state.material; + + renderstate.mClipSplit[0] = state.uClipSplit[0]; + renderstate.mClipSplit[1] = state.uClipSplit[1]; + + renderstate.mFogEnabled = state.FogEnabled; + renderstate.mBrightmapEnabled = state.BrightmapEnabled; + renderstate.mTextureClamp = state.TextureClamp; + renderstate.mTextureMode = state.TextureMode; + + renderstate.mLightParms[0] = state.uLightDist; + renderstate.mLightParms[1] = state.uLightFactor; + renderstate.mLightParms[2] = state.uFogDensity; + renderstate.mLightParms[3] = state.uLightLevel; +} diff --git a/src/common/rendering/hwrenderer/data/hw_mesh.h b/src/common/rendering/hwrenderer/data/hw_mesh.h index 8e66e6e7d..0e3ddc765 100644 --- a/src/common/rendering/hwrenderer/data/hw_mesh.h +++ b/src/common/rendering/hwrenderer/data/hw_mesh.h @@ -1,7 +1,18 @@ #pragma once +#include "hw_meshbuilder.h" + class Mesh { public: + void Draw(FRenderState& renderstate); +private: + void Apply(FRenderState& renderstate, const MeshApplyState& apply); + + TArray mApplys; + TArray mDraws; + TArray mVertices; + + friend class MeshBuilder; }; diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp index c5912688a..a6edee800 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.cpp @@ -51,7 +51,9 @@ void MeshBuilder::Apply() std::unique_ptr MeshBuilder::Create() { auto mesh = std::make_unique(); - + mesh->mApplys = std::move(mApplys); + mesh->mDraws = std::move(mDraws); + mesh->mVertices = std::move(mVertices); return mesh; } diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 99b1030f7..fc5632932 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -765,5 +765,6 @@ public: SetColorMask(on, on, on, on); } + friend class Mesh; };