|
|
@@ -31,10 +31,40 @@ public:
|
|
|
updated = false;
|
|
|
|
|
|
const MoveComponent& move = node.getComponent<MoveComponent>();
|
|
|
- if(move.getTimestamp() == node.getGlobalTimestamp())
|
|
|
+ const SkinComponent* skin = node.tryGetComponent<SkinComponent>();
|
|
|
+ if(move.getTimestamp() == node.getGlobalTimestamp()
|
|
|
+ || (skin && skin->getTimestamp() == node.getGlobalTimestamp()))
|
|
|
{
|
|
|
ModelNode& mnode = static_cast<ModelNode&>(node);
|
|
|
- mnode.onMoveComponentUpdate(move);
|
|
|
+ mnode.updateSpatialComponent(move);
|
|
|
+ }
|
|
|
+
|
|
|
+ return Error::NONE;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/// Feedback component.
|
|
|
+class ModelNode::SkinFeedbackComponent : public SceneComponent
|
|
|
+{
|
|
|
+public:
|
|
|
+ SkinFeedbackComponent()
|
|
|
+ : SceneComponent(SceneComponentType::NONE)
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
|
|
|
+ {
|
|
|
+ updated = false;
|
|
|
+
|
|
|
+ const SkinComponent& skin = node.getComponent<SkinComponent>();
|
|
|
+ if(skin.getTimestamp() == node.getGlobalTimestamp())
|
|
|
+ {
|
|
|
+ ModelNode& mnode = static_cast<ModelNode&>(node);
|
|
|
+
|
|
|
+ const Aabb& box = skin.getBoneBoundingVolume();
|
|
|
+ mnode.m_obbLocal.setCenter((box.getMin() + box.getMax()) / 2.0f);
|
|
|
+ mnode.m_obbLocal.setExtend(box.getMax() - mnode.m_obbLocal.getCenter());
|
|
|
+ mnode.m_obbLocal.setRotation(Mat3x4::getIdentity());
|
|
|
}
|
|
|
|
|
|
return Error::NONE;
|
|
|
@@ -68,10 +98,11 @@ Error ModelNode::init(ModelResourcePtr resource, U32 modelPatchIdx)
|
|
|
if(m_model->getSkeleton().isCreated())
|
|
|
{
|
|
|
newComponent<SkinComponent>(this, m_model->getSkeleton());
|
|
|
+ newComponent<SkinFeedbackComponent>();
|
|
|
}
|
|
|
newComponent<MoveComponent>();
|
|
|
newComponent<MoveFeedbackComponent>();
|
|
|
- newComponent<SpatialComponent>(this, &m_obb);
|
|
|
+ newComponent<SpatialComponent>(this, &m_obbWorld);
|
|
|
MaterialRenderComponent* rcomp =
|
|
|
newComponent<MaterialRenderComponent>(this, m_model->getModelPatches()[m_modelPatchIdx].getMaterial());
|
|
|
rcomp->setup(
|
|
|
@@ -82,6 +113,8 @@ Error ModelNode::init(ModelResourcePtr resource, U32 modelPatchIdx)
|
|
|
this,
|
|
|
m_mergeKey);
|
|
|
|
|
|
+ m_obbLocal = m_model->getModelPatches()[m_modelPatchIdx].getBoundingShape();
|
|
|
+
|
|
|
return Error::NONE;
|
|
|
}
|
|
|
|
|
|
@@ -105,9 +138,9 @@ Error ModelNode::init(const CString& modelFname)
|
|
|
return Error::NONE;
|
|
|
}
|
|
|
|
|
|
-void ModelNode::onMoveComponentUpdate(const MoveComponent& move)
|
|
|
+void ModelNode::updateSpatialComponent(const MoveComponent& move)
|
|
|
{
|
|
|
- m_obb = m_model->getModelPatches()[m_modelPatchIdx].getBoundingShape().getTransformed(move.getWorldTransform());
|
|
|
+ m_obbWorld = m_obbLocal.getTransformed(move.getWorldTransform());
|
|
|
|
|
|
SpatialComponent& sp = getComponent<SpatialComponent>();
|
|
|
sp.markForUpdate();
|
|
|
@@ -213,9 +246,9 @@ void ModelNode::draw(RenderQueueDrawContext& ctx, ConstWeakArray<void*> userData
|
|
|
{
|
|
|
const ModelNode& self2 = *static_cast<const ModelNode*>(userData[i]);
|
|
|
|
|
|
- const Mat3 rot = self2.m_obb.getRotation().getRotationPart();
|
|
|
- const Vec4 tsl = self2.m_obb.getCenter().xyz1();
|
|
|
- const Vec3 scale = self2.m_obb.getExtend().xyz();
|
|
|
+ const Mat3 rot = self2.m_obbWorld.getRotation().getRotationPart();
|
|
|
+ const Vec4 tsl = self2.m_obbWorld.getCenter().xyz1();
|
|
|
+ const Vec3 scale = self2.m_obbWorld.getExtend().xyz();
|
|
|
|
|
|
// Set non uniform scale. Add a margin to avoid flickering
|
|
|
Mat3 nonUniScale = Mat3::getZero();
|
|
|
@@ -239,7 +272,7 @@ void ModelNode::draw(RenderQueueDrawContext& ctx, ConstWeakArray<void*> userData
|
|
|
|
|
|
m_dbgDrawer.drawCubes(ConstWeakArray<Mat4>(mvps, userData.getSize()),
|
|
|
Vec4(1.0f, 0.0f, 1.0f, 1.0f),
|
|
|
- 1.0f,
|
|
|
+ 2.0f,
|
|
|
ctx.m_debugDrawFlags.get(RenderQueueDebugDrawFlag::DITHERED_DEPTH_TEST_ON),
|
|
|
2.0f,
|
|
|
*ctx.m_stagingGpuAllocator,
|