#ifndef _CPARTICLEDATAFACTORY
#define _CPARTICLEDATAFACTORY

#include "Kyoto/CSimplePool.hpp"
#include "Kyoto/Particles/CElectricDescription.hpp"
#include "Kyoto/Particles/CGenDescription.hpp"
#include "Kyoto/Particles/IElement.hpp"
#include "Kyoto/SObjectTag.hpp"

class CInputStream;

class CParticleDataFactory {
public:
  static CGenDescription* GetGeneratorDesc(CInputStream& in, CSimplePool* pool, uint offset);
  static CGenDescription* CreateGeneratorDescription(CInputStream&, rstl::vector< uint >& assets,
                                                     uint offset, CSimplePool* pool);
  static bool CreateGPSM(CGenDescription* desc, CInputStream& in,
                         rstl::vector< CAssetId >& resources, CSimplePool* pool);
  static CUVElement* GetTextureElement(CInputStream& in, CSimplePool* resPool);
  static CColorElement* GetColorElement(CInputStream& in);
  static CModVectorElement* GetModVectorElement(CInputStream& in);
  static CEmitterElement* GetEmitterElement(CInputStream& in);
  static CVectorElement* GetVectorElement(CInputStream& in);
  static CRealElement* GetRealElement(CInputStream& in);
  static CIntElement* GetIntElement(CInputStream& in);

  static float GetReal(CInputStream& in);
  static int GetInt(CInputStream& in);
  static bool GetBool(CInputStream& in);
  static FourCC GetClassID(CInputStream& in);
  static rstl::optional_object< TToken< CModel > > GetModel(CInputStream& in, CSimplePool* pool);
  static rstl::optional_object< TToken< CGenDescription > >
  GetChildGeneratorDesc(CInputStream& in, CSimplePool* pool, rstl::vector< CAssetId >& resources);
  static rstl::optional_object< TToken< CSwooshDescription > >
  GetSwooshGeneratorDesc(CInputStream& in, CSimplePool* pool);
  static rstl::optional_object< TToken< CElectricDescription > >
  GetElectricGeneratorDesc(CInputStream& in, CSimplePool* pool);
};

#endif // _CPARTICLEDATAFACTORY
