Blob Blame Raw
#pragma once

//------------------------------------------------------------------
// Iwa_ParticlesManager for Marnie
// based on ParticlesManager by Digital Video
//------------------------------------------------------------------

#ifndef IWA_PARTICLES_CONTAINER
#define IWA_PARTICLES_CONTAINER

#include "tsmartpointer.h"
#include "trenderresourcemanager.h"
#include "trandom.h"
#include "iwa_particles.h"

#include <QThreadStorage>
#include <QMutex>

//-----------------------------------------------------------------------

//  Forward declarations
class Iwa_Particle;
class TRandom;

#include "iwa_particlesengine.h"

//-----------------------------------------------------------------------

class Iwa_ParticlesManager : public TRenderResourceManager
{
	T_RENDER_RESOURCE_MANAGER

public:
	struct FxData;

	struct FrameData {
		FxData *m_fxData;
		double m_frame;
		TRandom m_random;
		std::list<Iwa_Particle> m_particles;
		bool m_calculated;
		int m_maxTrail;
		int m_totalParticles;

		/*- しきつめ情報 -*/
		QList<ParticleOrigin> m_particleOrigins;

		FrameData(FxData *fxData);
		~FrameData();

		void buildMaxTrail();
		void clear();
	};

	struct FxData : public TSmartObject {
		DECLARE_CLASS_CODE

		QThreadStorage<FrameData *> m_frames;

		FxData();
	};

public:
	Iwa_ParticlesManager();
	~Iwa_ParticlesManager();

	static Iwa_ParticlesManager *instance();

	FrameData *data(unsigned long fxId);

	bool isCached(unsigned long fxId);

private:
	std::map<unsigned long, FxData *> m_fxs;
	QMutex m_mutex;

	int m_renderStatus;

	void onRenderStatusStart(int renderStatus);
};

#endif