/********************************************************************
*
* Created: 20/3/2014 11:09
*
* File: fsCParticleEmitter.h
*
* Author: Mick Waites
*
* Purpose: Emits, updates and renders particles.
*
*********************************************************************/
#ifndef fsCParticleEmitterhdr
#define fsCParticleEmitterhdr
#include <vector>
#include <functional>
#include <memory>
#include <fsCore/fsPoint.h>
#include <fsCore/fsRect.h>
#include <fsCore/fsStr.h>
#include "../../fsIRenderable.h"
#include "fsCParticleDataInstance.h"
class fsCParticleData;
class fsIParticle;
class fsCResourceName;
class fsCEntity;
class fsIScene;
class fsCSprite;
class fsINative;
class fsIRenderableComponent;
class fsAffineMtx2d;
class fsCParticleCloud;
class fsCParticleEmitter : public fsIRenderable
{
public:
const fsStr& collectableTypeGet() const;
void particleCloudRegister(fsIParticleCloud* pSpawnCloud);
fsS32 remainingParticleCountGet() const;
fsBool collectableGet() const;
fsS32 photoScoreGet(const fsRect& pScreenRect) const;
fsBool hitTestAndCollect(const fsPoint& pPointerPos, std::function<void(fsIParticle* pParticle)> pCallBack);
fsBool hitTest(const fsPoint& pPointerPos);
void shortCircuit();
fsBool preRunable() const;
void preRun();
void particleEmitterParentEntSet(fsCEntity* pParent);
fsBool runsForeverGet() const;
void spawnPositionUpdate(const fsPoint& pPos);
void update(fsS32 pDeltaMs);
fsBool particlesLinkToEmitterGet() const;
fsBool isActiveGet() const;
fsS32 numLiveParticlesGet() const;
void initialise();
fsCParticleEmitter(fsCParticleDataInstance pParticleData);
virtual ~fsCParticleEmitter();<--- Destructor in derived class
protected:
void matrixApplyDo(const fsAffineMtx2d& pRenderMatrix) override;
void renderDo() override;
private:
void particlesUpdate(fsS32 pTimeDelta);
void emptySlotsFill(fsS32 pTimeDelta);
fsBool mStarted;
fsF32 mParticleToEmitNow;
fsS32 mElapsedTimeMs;
fsS32 mNumLiveParticles;
fsS32 mCollectableParticleCount;
fsPoint mSpawnPosition;
fsCEntity* mParent;
fsIParticle* mHitTestParticle;
fsCParticleDataInstance mParticleData;
std::vector<std::unique_ptr<fsIParticle>> mParticles;
};
#endif