From a374411279a9844367c99fe851c42e7ec024bf7e Mon Sep 17 00:00:00 2001 From: Vladislav Belov Date: Thu, 10 Sep 2026 15:27:04 +0200 Subject: [PATCH] Separates preparing for rendering of CPU skinned Only CPU skinned models require preparing for rendering to mark vertex buffer chunks as needed. --- source/renderer/CPUSkinnedModelRenderer.cpp | 13 ++++++++++--- source/renderer/CPUSkinnedModelRenderer.h | 6 ++++++ source/renderer/SceneRenderer.cpp | 10 ++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/source/renderer/CPUSkinnedModelRenderer.cpp b/source/renderer/CPUSkinnedModelRenderer.cpp index 013a4aa3ee..248841e592 100644 --- a/source/renderer/CPUSkinnedModelRenderer.cpp +++ b/source/renderer/CPUSkinnedModelRenderer.cpp @@ -206,10 +206,10 @@ void CPUSkinnedModelVertexRenderer::UpdateModelsData(Renderer::Backend::IDeviceC // Fill in and upload dynamic vertex array void CPUSkinnedModelVertexRenderer::UpdateModelData(CModel* model, CModelRData* data, int updateflags) { - ModelRData* modelRData = static_cast(data); - if (updateflags & RENDERDATA_UPDATE_VERTICES) { + ModelRData* modelRData = static_cast(data); + // build vertices VertexArrayIterator Position = modelRData->m_Position.GetIterator(); VertexArrayIterator Normal = modelRData->m_Normal.GetIterator(); @@ -219,8 +219,15 @@ void CPUSkinnedModelVertexRenderer::UpdateModelData(CModel* model, CModelRData* // upload everything to vertex buffer modelRData->m_Array.Upload(); } +} - modelRData->m_Array.PrepareForRendering(); +void CPUSkinnedModelVertexRenderer::PrepareForRendering(std::span models) +{ + for (CModel* model : models) + { + ModelRData* modelRData{static_cast(static_cast(model->GetRenderData()))}; + modelRData->m_Array.PrepareForRendering(); + } } void CPUSkinnedModelVertexRenderer::UploadModelsData( diff --git a/source/renderer/CPUSkinnedModelRenderer.h b/source/renderer/CPUSkinnedModelRenderer.h index 26a4b62896..038115cf14 100644 --- a/source/renderer/CPUSkinnedModelRenderer.h +++ b/source/renderer/CPUSkinnedModelRenderer.h @@ -55,6 +55,12 @@ public: Renderer::Backend::IDeviceCommandContext* deviceCommandContext, Renderer::Backend::IShaderProgram* shader, CModel* model, CModelRData* data) override; + /** + * For CPU skinning we need to mark dynamic buffer chunks as needed before rendering. + * It must be called before uploading. + */ + void PrepareForRendering(std::span models); + protected: void UpdateModelData( CModel* model, CModelRData* data, int updateflags); diff --git a/source/renderer/SceneRenderer.cpp b/source/renderer/SceneRenderer.cpp index 5b7cf1c4bd..1fd393964f 100644 --- a/source/renderer/SceneRenderer.cpp +++ b/source/renderer/SceneRenderer.cpp @@ -205,6 +205,16 @@ public: PrepareModels(deviceCommandContext, modelVertexSkinningRenderer, Model.TransparentSkinned.submissions[cullGroup]); } + // See CPUSkinnedModelVertexRenderer::PrepareForRendering comment. + if (!Model.GPUSkinningEnabled) + { + for (int cullGroup{0}; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup) + { + Model.VertexCPUSkinningShader.PrepareForRendering(Model.OpaqueSkinned.submissions[cullGroup]); + Model.VertexCPUSkinningShader.PrepareForRendering(Model.TransparentSkinned.submissions[cullGroup]); + } + } + for (int cullGroup{0}; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup) { PrepareModels(deviceCommandContext, Model.VertexInstancingShader, Model.OpaqueUnskinned.submissions[cullGroup]);