aboutsummaryrefslogtreecommitdiff
path: root/NvCloth/samples/SampleBase/renderer/Renderable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'NvCloth/samples/SampleBase/renderer/Renderable.cpp')
-rw-r--r--NvCloth/samples/SampleBase/renderer/Renderable.cpp55
1 files changed, 38 insertions, 17 deletions
diff --git a/NvCloth/samples/SampleBase/renderer/Renderable.cpp b/NvCloth/samples/SampleBase/renderer/Renderable.cpp
index 51a151d..c0560fd 100644
--- a/NvCloth/samples/SampleBase/renderer/Renderable.cpp
+++ b/NvCloth/samples/SampleBase/renderer/Renderable.cpp
@@ -14,35 +14,56 @@
const DirectX::XMFLOAT4 DEFAULT_COLOR(0.5f, 0.5f, 0.5f, 1.0f);
-Renderable::Renderable(IRenderMesh& mesh, RenderMaterial& material) : m_mesh(mesh), m_scale(1, 1, 1), m_color(DEFAULT_COLOR), m_hidden(false), m_transform(PxIdentity)
+Renderable::Renderable(IRenderMesh& mesh, RenderMaterial& material) : m_mesh(mesh), m_scale(1, 1, 1), m_hidden(false), m_transform(PxIdentity)
{
+ setColor(DEFAULT_COLOR);
setMaterial(material);
}
void Renderable::setMaterial(RenderMaterial& material)
{
- m_materialInstance = material.getMaterialInstance(&m_mesh);
+ m_materialInstances.clear();
+ m_materialInstances.push_back(material.getMaterialInstance(&m_mesh));
+}
+
+void Renderable::addMaterial(RenderMaterial& material)
+{
+ m_materialInstances.push_back(material.getMaterialInstance(&m_mesh));
}
void Renderable::render(Renderer& renderer, bool depthStencilOnly) const
{
- if (!m_materialInstance->isValid())
+ for(int submeshId = 0; submeshId < m_mesh.getSubMeshCount(); submeshId++)
{
- PX_ALWAYS_ASSERT();
- return;
- }
+ if(m_mesh.isRenderSubmeshHidden(submeshId))
+ continue;
+ //physx::PxMat44 submeshTransform = m_mesh.getRenderSubmeshTransform(submeshId);
- m_materialInstance->bind(*renderer.m_context, 0, depthStencilOnly);
+ auto& material = m_materialInstances[submeshId%getMaterialCount()];
+ if(!material->isValid())
+ {
+ PX_ALWAYS_ASSERT();
+ return;
+ }
- // setup object CB
- {
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- renderer.m_context->Map(renderer.m_objectCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- Renderer::CBObject* objectBuffer = (Renderer::CBObject*)mappedResource.pData;
- objectBuffer->world = PxMat44ToXMMATRIX(getModelMatrix());
- objectBuffer->color = getColor();
- renderer.m_context->Unmap(renderer.m_objectCB, 0);
- }
+ //skip transparent submeshes in the depthStensil pass
+ if(depthStencilOnly && !(material->getMaterial().getBlending() == RenderMaterial::BLEND_NONE))
+ continue;
+
+ material->bind(*renderer.m_context, 0, depthStencilOnly);
- m_mesh.render(*renderer.m_context);
+ // setup object CB
+ {
+ D3D11_MAPPED_SUBRESOURCE mappedResource;
+ renderer.m_context->Map(renderer.m_objectCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+ Renderer::CBObject* objectBuffer = (Renderer::CBObject*)mappedResource.pData;
+ objectBuffer->world = PxMat44ToXMMATRIX(getModelMatrix());
+ objectBuffer->color = getColor(submeshId % getColorCount());
+ objectBuffer->boneoffsetoffset = getBoneCount()*(1+submeshId);
+ objectBuffer->submesh = submeshId;
+ renderer.m_context->Unmap(renderer.m_objectCB, 0);
+ }
+
+ m_mesh.render(*renderer.m_context, submeshId);
+ }
}