From 3f8141ed0485ba9c9a98a18b78a184461a8833f5 Mon Sep 17 00:00:00 2001 From: Shiny Metagross <30511800+ShinyMetagross@users.noreply.github.com> Date: Mon, 15 Aug 2022 17:29:42 -0700 Subject: [PATCH] I'm not done with this - I need to figure out how I'm gonna reference the same boneStartIndex between the indices. Maybe some property in smf? The problem is that even though the bone calculations are done just once per instance of the actor when the flag is enabled, the bone buffers are being copied still, and if there's too much data, some will quit uploading because it's full. Besides doing this, I may just see about increasing the buffer size if possible. It's really just not very big. --- src/common/models/modelrenderer.h | 2 +- src/common/models/models_iqm.cpp | 2 +- src/rendering/hwrenderer/hw_models.cpp | 3 ++- src/rendering/hwrenderer/hw_models.h | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/common/models/modelrenderer.h b/src/common/models/modelrenderer.h index 9a91cad4f..dce0ebf21 100644 --- a/src/common/models/modelrenderer.h +++ b/src/common/models/modelrenderer.h @@ -24,6 +24,6 @@ public: virtual void SetMaterial(FGameTexture *skin, bool clampNoFilter, int translation) = 0; virtual void DrawArrays(int start, int count) = 0; virtual void DrawElements(int numIndices, size_t offset) = 0; - virtual void SetupFrame(FModel* model, unsigned int frame1, unsigned int frame2, unsigned int size, const TArray& bones) = 0; + virtual void SetupFrame(FModel* model, unsigned int frame1, unsigned int frame2, unsigned int size, const TArray& bones, int boneStartIndex) = 0; }; diff --git a/src/common/models/models_iqm.cpp b/src/common/models/models_iqm.cpp index 70efae4f9..4ecbce928 100644 --- a/src/common/models/models_iqm.cpp +++ b/src/common/models/models_iqm.cpp @@ -495,7 +495,7 @@ int IQMModel::FindFrame(const char* name, bool nodefault) void IQMModel::RenderFrame(FModelRenderer* renderer, FGameTexture* skin, int frame1, int frame2, double inter, int translation, const FTextureID* surfaceskinids, const TArray& boneData) { - renderer->SetupFrame(this, 0, 0, NumVertices, boneData); + renderer->SetupFrame(this, 0, 0, NumVertices, boneData, 0); FGameTexture* lastSkin = nullptr; for (int i = 0; i < Meshes.Size(); i++) diff --git a/src/rendering/hwrenderer/hw_models.cpp b/src/rendering/hwrenderer/hw_models.cpp index ff9a953cf..d8d3156e2 100644 --- a/src/rendering/hwrenderer/hw_models.cpp +++ b/src/rendering/hwrenderer/hw_models.cpp @@ -136,9 +136,10 @@ void FHWModelRenderer::DrawElements(int numIndices, size_t offset) // //=========================================================================== -void FHWModelRenderer::SetupFrame(FModel *model, unsigned int frame1, unsigned int frame2, unsigned int size, const TArray& bones) +void FHWModelRenderer::SetupFrame(FModel *model, unsigned int frame1, unsigned int frame2, unsigned int size, const TArray& bones, int boneStartIndex) { auto mdbuff = static_cast(model->GetVertexBuffer(GetType())); + boneIndexBase = screen->mBones->UploadBones(bones); state.SetBoneIndexBase(screen->mBones->UploadBones(bones)); state.SetVertexBuffer(mdbuff->vertexBuffer(), frame1, frame2); if (mdbuff->indexBuffer()) state.SetIndexBuffer(mdbuff->indexBuffer()); diff --git a/src/rendering/hwrenderer/hw_models.h b/src/rendering/hwrenderer/hw_models.h index 0af0e0ceb..da3cce9cf 100644 --- a/src/rendering/hwrenderer/hw_models.h +++ b/src/rendering/hwrenderer/hw_models.h @@ -39,6 +39,7 @@ class FHWModelRenderer : public FModelRenderer { friend class FModelVertexBuffer; int modellightindex = -1; + int boneIndexBase = -1; HWDrawInfo *di; FRenderState &state; public: @@ -55,7 +56,7 @@ public: void SetMaterial(FGameTexture *skin, bool clampNoFilter, int translation) override; void DrawArrays(int start, int count) override; void DrawElements(int numIndices, size_t offset) override; - void SetupFrame(FModel *model, unsigned int frame1, unsigned int frame2, unsigned int size, const TArray& bones) override; + void SetupFrame(FModel *model, unsigned int frame1, unsigned int frame2, unsigned int size, const TArray& bones, int boneStartIndex) override; };