Separates preparing for rendering of CPU skinned

Only CPU skinned models require preparing for rendering to mark vertex
buffer chunks as needed.
This commit is contained in:
Vladislav Belov
2026-09-10 15:27:04 +02:00
parent 39c0dc69e4
commit a374411279
3 changed files with 26 additions and 3 deletions
+10 -3
View File
@@ -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<ModelRData*>(data);
if (updateflags & RENDERDATA_UPDATE_VERTICES)
{
ModelRData* modelRData = static_cast<ModelRData*>(data);
// build vertices
VertexArrayIterator<CVector3D> Position = modelRData->m_Position.GetIterator<CVector3D>();
VertexArrayIterator<CVector3D> Normal = modelRData->m_Normal.GetIterator<CVector3D>();
@@ -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<CModel*> models)
{
for (CModel* model : models)
{
ModelRData* modelRData{static_cast<ModelRData*>(static_cast<CModelRData*>(model->GetRenderData()))};
modelRData->m_Array.PrepareForRendering();
}
}
void CPUSkinnedModelVertexRenderer::UploadModelsData(
@@ -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<CModel*> models);
protected:
void UpdateModelData(
CModel* model, CModelRData* data, int updateflags);
+10
View File
@@ -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]);