// 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 #include namespace anki { /// Feedback component class ParticleEmitterNode::MoveFeedbackComponent : public SceneComponent { ANKI_SCENE_COMPONENT(ParticleEmitterNode::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; // Don't care about updates for this component MoveComponent& move = node.getFirstComponentOfType(); if(move.getTimestamp() == node.getGlobalTimestamp()) { static_cast(node).onMoveComponentUpdate(move); } return Error::NONE; } }; ANKI_SCENE_COMPONENT_STATICS(ParticleEmitterNode::MoveFeedbackComponent) /// Feedback component class ParticleEmitterNode::ShapeFeedbackComponent : public SceneComponent { ANKI_SCENE_COMPONENT(ParticleEmitterNode::ShapeFeedbackComponent) public: ShapeFeedbackComponent(SceneNode* node) : SceneComponent(node, getStaticClassId(), false // Not feedback because it's always being called ) { } ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override { updated = false; static_cast(node).onShapeUpdate(); return Error::NONE; } }; ANKI_SCENE_COMPONENT_STATICS(ParticleEmitterNode::ShapeFeedbackComponent) ParticleEmitterNode::ParticleEmitterNode(SceneGraph* scene, CString name) : SceneNode(scene, name) { // Components newComponent(); newComponent(); ParticleEmitterComponent* particleEmitterc = newComponent(); newComponent(); newComponent(); RenderComponent* rcomp = newComponent(); rcomp->initRaster(ParticleEmitterComponent::drawCallback, particleEmitterc, 0); // No merging } ParticleEmitterNode::~ParticleEmitterNode() { } void ParticleEmitterNode::onMoveComponentUpdate(MoveComponent& move) { getFirstComponentOfType().setWorldTransform(move.getWorldTransform()); getFirstComponentOfType().setSpatialOrigin(move.getWorldTransform().getOrigin().xyz()); } void ParticleEmitterNode::onShapeUpdate() { const ParticleEmitterComponent& pec = getFirstComponentOfType(); getFirstComponentOfType().setAabbWorldSpace(pec.getAabbWorldSpace()); } Error ParticleEmitterNode::frameUpdate(Second prevUpdateTime, Second crntTime) { const ParticleEmitterComponent& pec = getFirstComponentOfType(); if(pec.isEnabled()) { RenderComponent& rc = getFirstComponentOfType(); rc.setFlagsFromMaterial(pec.getParticleEmitterResource()->getMaterial()); } return Error::NONE; } } // end namespace anki