// 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 #include namespace anki { /// Feedback component class GpuParticleEmitterNode::MoveFeedbackComponent : public SceneComponent { ANKI_SCENE_COMPONENT(GpuParticleEmitterNode::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; const MoveComponent& move = node.getFirstComponentOfType(); if(move.getTimestamp() == node.getGlobalTimestamp()) { GpuParticleEmitterNode& mnode = static_cast(node); mnode.onMoveComponentUpdate(move); } return Error::NONE; } }; ANKI_SCENE_COMPONENT_STATICS(GpuParticleEmitterNode::MoveFeedbackComponent) /// Feedback component class GpuParticleEmitterNode::ShapeFeedbackComponent : public SceneComponent { ANKI_SCENE_COMPONENT(GpuParticleEmitterNode::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; const GpuParticleEmitterComponent& pec = node.getFirstComponentOfType(); if(pec.getTimestamp() == node.getGlobalTimestamp()) { GpuParticleEmitterNode& mnode = static_cast(node); mnode.onShapeUpdate(pec); } return Error::NONE; } }; ANKI_SCENE_COMPONENT_STATICS(GpuParticleEmitterNode::ShapeFeedbackComponent) GpuParticleEmitterNode::GpuParticleEmitterNode(SceneGraph* scene, CString name) : SceneNode(scene, name) { // Create the components newComponent(); newComponent(); GpuParticleEmitterComponent* pec = newComponent(); newComponent(); newComponent(); GenericGpuComputeJobComponent* gpuComp = newComponent(); gpuComp->setCallback(GpuParticleEmitterComponent::simulateCallback, pec); RenderComponent* rcomp = newComponent(); const U64 noMerging = 0; rcomp->initRaster(GpuParticleEmitterComponent::drawCallback, pec, noMerging); } GpuParticleEmitterNode::~GpuParticleEmitterNode() { } Error GpuParticleEmitterNode::frameUpdate(Second prevUpdateTime, Second crntTime) { const GpuParticleEmitterComponent& pec = getFirstComponentOfType(); if(pec.isEnabled()) { RenderComponent& rc = getFirstComponentOfType(); rc.setFlagsFromMaterial(pec.getParticleEmitterResource()->getMaterial()); } return Error::NONE; } void GpuParticleEmitterNode::onMoveComponentUpdate(const MoveComponent& movec) { getFirstComponentOfType().setSpatialOrigin(movec.getWorldTransform().getOrigin().xyz()); getFirstComponentOfType().setWorldTransform(movec.getWorldTransform()); } void GpuParticleEmitterNode::onShapeUpdate(const GpuParticleEmitterComponent& pec) { getFirstComponentOfType().setAabbWorldSpace(pec.getBoundingVolumeWorldSpace()); } } // end namespace anki