// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors. // All rights reserved. // Code licensed under the BSD License. // http://www.anki3d.org/LICENSE #include #include #include #include namespace anki { /// Decal feedback component. class DecalNode::MoveFeedbackComponent : public SceneComponent { ANKI_SCENE_COMPONENT(DecalNode::MoveFeedbackComponent) public: MoveFeedbackComponent(SceneNode* node) : SceneComponent(node, getStaticClassId(), true) { } ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override { updated = false; MoveComponent& movec = node.getFirstComponentOfType(); if(movec.getTimestamp() == node.getGlobalTimestamp()) { static_cast(node).onMove(movec); } return Error::NONE; } }; ANKI_SCENE_COMPONENT_STATICS(DecalNode::MoveFeedbackComponent) /// Decal feedback component. class DecalNode::ShapeFeedbackComponent : public SceneComponent { ANKI_SCENE_COMPONENT(DecalNode::ShapeFeedbackComponent) public: ShapeFeedbackComponent(SceneNode* node) : SceneComponent(node, getStaticClassId(), true) { } ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override { updated = false; DecalComponent& decalc = node.getFirstComponentOfType(); if(decalc.getTimestamp() == node.getGlobalTimestamp()) { static_cast(node).onDecalUpdated(decalc); } return Error::NONE; } }; ANKI_SCENE_COMPONENT_STATICS(DecalNode::ShapeFeedbackComponent) DecalNode::DecalNode(SceneGraph* scene, CString name) : SceneNode(scene, name) { newComponent(); newComponent(); newComponent(); newComponent(); newComponent(); } DecalNode::~DecalNode() { } void DecalNode::onMove(MoveComponent& movec) { getFirstComponentOfType().setSpatialOrigin(movec.getWorldTransform().getOrigin().xyz()); getFirstComponentOfType().setWorldTransform(movec.getWorldTransform()); } void DecalNode::onDecalUpdated(DecalComponent& decalc) { getFirstComponentOfType().setObbWorldSpace(decalc.getBoundingVolumeWorldSpace()); } } // end namespace anki