1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
#pragma once
#include "scene/Node.h"
#include "iparticlenode.h"
#include "iparticles.h"
#include "itransformnode.h"
#include "RenderableParticle.h"
namespace particles
{
/**
* Like the model nodes this ParticleNode encapsulates a renderable particle
* such that it can be inserted into the scenegraph as child node of an entity.
*/
class ParticleNode :
public IParticleNode,
public scene::Node,
public ITransformNode // to compensate parent rotations
{
// The actual particle system that will be rendered
RenderableParticlePtr _renderableParticle;
mutable Matrix4 _local2Parent;
public:
// Construct the node giving a renderable particle
ParticleNode(const RenderableParticlePtr& particle);
std::string name() const override;
Type getNodeType() const override;
IRenderableParticlePtr getParticle() const override;
const AABB& localAABB() const override;
std::size_t getHighlightFlags() override;
void onPreRender(const VolumeTest& volume) override;
void renderHighlights(IRenderableCollector& collector, const VolumeTest& volume) override;
void setRenderSystem(const RenderSystemPtr& renderSystem) override;
// ITransformNode
Matrix4 localToParent() const override;
void onRemoveFromScene(scene::IMapRootNode& root) override;
protected:
void onVisibilityChanged(bool isVisibleNow) override;
private:
void update(const VolumeTest& viewVolume) const;
};
typedef std::shared_ptr<ParticleNode> ParticleNodePtr;
} // namespace
|