|
@@ -245,59 +245,68 @@ void ModelNode::drawCallback(RenderQueueDrawContext& ctx, WeakArray<const void*>
|
|
|
ANKI_ASSERT(userData.getSize() > 0 && userData.getSize() <= MAX_INSTANCES);
|
|
ANKI_ASSERT(userData.getSize() > 0 && userData.getSize() <= MAX_INSTANCES);
|
|
|
ANKI_ASSERT(ctx.m_key.m_instanceCount == userData.getSize());
|
|
ANKI_ASSERT(ctx.m_key.m_instanceCount == userData.getSize());
|
|
|
|
|
|
|
|
|
|
+ CommandBufferPtr& cmdb = ctx.m_commandBuffer;
|
|
|
|
|
+
|
|
|
const ModelNode& self = *static_cast<const ModelNode*>(userData[0]);
|
|
const ModelNode& self = *static_cast<const ModelNode*>(userData[0]);
|
|
|
ANKI_ASSERT(self.isSinglePatch());
|
|
ANKI_ASSERT(self.isSinglePatch());
|
|
|
- const ModelPatch* patch = self.m_model->getModelPatches()[0];
|
|
|
|
|
|
|
|
|
|
- CommandBufferPtr& cmdb = ctx.m_commandBuffer;
|
|
|
|
|
|
|
+ if(!ctx.m_debugDraw)
|
|
|
|
|
+ {
|
|
|
|
|
+ const ModelPatch* patch = self.m_model->getModelPatches()[0];
|
|
|
|
|
|
|
|
- // That will not work on multi-draw and instanced at the same time. Make sure that there is no multi-draw anywhere
|
|
|
|
|
- ANKI_ASSERT(patch->getSubMeshesCount() == 0);
|
|
|
|
|
|
|
+ // That will not work on multi-draw and instanced at the same time. Make sure that there is no multi-draw
|
|
|
|
|
+ // anywhere
|
|
|
|
|
+ ANKI_ASSERT(patch->getSubMeshesCount() == 0);
|
|
|
|
|
|
|
|
- ModelRenderingInfo modelInf;
|
|
|
|
|
- patch->getRenderingDataSub(ctx.m_key, WeakArray<U8>(), modelInf);
|
|
|
|
|
|
|
+ ModelRenderingInfo modelInf;
|
|
|
|
|
+ patch->getRenderingDataSub(ctx.m_key, WeakArray<U8>(), modelInf);
|
|
|
|
|
|
|
|
- // Program
|
|
|
|
|
- cmdb->bindShaderProgram(modelInf.m_program);
|
|
|
|
|
|
|
+ // Program
|
|
|
|
|
+ cmdb->bindShaderProgram(modelInf.m_program);
|
|
|
|
|
|
|
|
- // Set attributes
|
|
|
|
|
- for(U i = 0; i < modelInf.m_vertexAttributeCount; ++i)
|
|
|
|
|
- {
|
|
|
|
|
- const VertexAttributeInfo& attrib = modelInf.m_vertexAttributes[i];
|
|
|
|
|
- cmdb->setVertexAttribute(i, attrib.m_bufferBinding, attrib.m_format, attrib.m_relativeOffset);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // Set attributes
|
|
|
|
|
+ for(U i = 0; i < modelInf.m_vertexAttributeCount; ++i)
|
|
|
|
|
+ {
|
|
|
|
|
+ const VertexAttributeInfo& attrib = modelInf.m_vertexAttributes[i];
|
|
|
|
|
+ cmdb->setVertexAttribute(i, attrib.m_bufferBinding, attrib.m_format, attrib.m_relativeOffset);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- // Set vertex buffers
|
|
|
|
|
- for(U i = 0; i < modelInf.m_vertexBufferBindingCount; ++i)
|
|
|
|
|
- {
|
|
|
|
|
- const VertexBufferBinding& binding = modelInf.m_vertexBufferBindings[i];
|
|
|
|
|
- cmdb->bindVertexBuffer(i, binding.m_buffer, binding.m_offset, binding.m_stride, VertexStepRate::VERTEX);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // Set vertex buffers
|
|
|
|
|
+ for(U i = 0; i < modelInf.m_vertexBufferBindingCount; ++i)
|
|
|
|
|
+ {
|
|
|
|
|
+ const VertexBufferBinding& binding = modelInf.m_vertexBufferBindings[i];
|
|
|
|
|
+ cmdb->bindVertexBuffer(i, binding.m_buffer, binding.m_offset, binding.m_stride, VertexStepRate::VERTEX);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- // Index buffer
|
|
|
|
|
- cmdb->bindIndexBuffer(modelInf.m_indexBuffer, 0, IndexType::U16);
|
|
|
|
|
|
|
+ // Index buffer
|
|
|
|
|
+ cmdb->bindIndexBuffer(modelInf.m_indexBuffer, 0, IndexType::U16);
|
|
|
|
|
|
|
|
- // Uniforms
|
|
|
|
|
- Array<Mat4, MAX_INSTANCES> trfs;
|
|
|
|
|
- trfs[0] = Mat4(self.getComponentAt<MoveComponent>(0).getWorldTransform());
|
|
|
|
|
- for(U i = 1; i < userData.getSize(); ++i)
|
|
|
|
|
|
|
+ // Uniforms
|
|
|
|
|
+ Array<Mat4, MAX_INSTANCES> trfs;
|
|
|
|
|
+ trfs[0] = Mat4(self.getComponentAt<MoveComponent>(0).getWorldTransform());
|
|
|
|
|
+ for(U i = 1; i < userData.getSize(); ++i)
|
|
|
|
|
+ {
|
|
|
|
|
+ const ModelNode& self2 = *static_cast<const ModelNode*>(userData[i]);
|
|
|
|
|
+ trfs[i] = Mat4(self2.getComponentAt<MoveComponent>(0).getWorldTransform());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ self.getComponentAt<RenderComponent>(3).allocateAndSetupUniforms(patch->getMaterial()->getDescriptorSetIndex(),
|
|
|
|
|
+ ctx,
|
|
|
|
|
+ WeakArray<const Mat4>(&trfs[0], userData.getSize()),
|
|
|
|
|
+ *ctx.m_stagingGpuAllocator);
|
|
|
|
|
+
|
|
|
|
|
+ // Draw
|
|
|
|
|
+ cmdb->drawElements(PrimitiveTopology::TRIANGLES,
|
|
|
|
|
+ modelInf.m_indicesCountArray[0],
|
|
|
|
|
+ userData.getSize(),
|
|
|
|
|
+ modelInf.m_indicesOffsetArray[0] / sizeof(U16),
|
|
|
|
|
+ 0,
|
|
|
|
|
+ 0);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
{
|
|
{
|
|
|
- const ModelNode& self2 = *static_cast<const ModelNode*>(userData[i]);
|
|
|
|
|
- trfs[i] = Mat4(self2.getComponentAt<MoveComponent>(0).getWorldTransform());
|
|
|
|
|
|
|
+ ANKI_ASSERT(!"TODO");
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- self.getComponentAt<RenderComponent>(3).allocateAndSetupUniforms(patch->getMaterial()->getDescriptorSetIndex(),
|
|
|
|
|
- ctx,
|
|
|
|
|
- WeakArray<const Mat4>(&trfs[0], userData.getSize()),
|
|
|
|
|
- *ctx.m_stagingGpuAllocator);
|
|
|
|
|
-
|
|
|
|
|
- // Draw
|
|
|
|
|
- cmdb->drawElements(PrimitiveTopology::TRIANGLES,
|
|
|
|
|
- modelInf.m_indicesCountArray[0],
|
|
|
|
|
- userData.getSize(),
|
|
|
|
|
- modelInf.m_indicesOffsetArray[0] / sizeof(U16),
|
|
|
|
|
- 0,
|
|
|
|
|
- 0);
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
} // end namespace anki
|
|
} // end namespace anki
|