mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-09-21 20:06:40 +00:00
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:
@@ -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);
|
||||
|
||||
@@ -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]);
|
||||
|
||||
Reference in New Issue
Block a user