metaforce/DataSpec/DNACommon/ParticleCommon.hpp

1211 lines
28 KiB
C++
Raw Normal View History

2016-02-02 04:29:58 +00:00
#ifndef __COMMON_PARTICLECOMMON_HPP__
#define __COMMON_PARTICLECOMMON_HPP__
#include "DNACommon.hpp"
namespace Retro
{
namespace DNAParticle
{
extern LogVisor::LogModule LogModule;
2016-02-02 04:29:58 +00:00
struct IElement : BigYAML
{
2016-02-02 23:41:55 +00:00
enum class EClassID : uint32_t
2016-02-02 08:22:01 +00:00
{
NONE = 'NONE',
CNST = 'CNST'
};
2016-02-02 04:29:58 +00:00
Delete _d;
virtual ~IElement() = default;
2016-02-02 23:41:55 +00:00
virtual const char* ClassID() const=0;
2016-02-02 04:29:58 +00:00
};
struct IRealElement : IElement {Delete _d;};
struct RealElementFactory : BigYAML
{
Delete _d;
std::unique_ptr<IRealElement> m_elem;
void read(Athena::io::YAMLDocReader& r);
void write(Athena::io::YAMLDocWriter& w) const;
size_t binarySize(size_t __isz) const;
void read(Athena::io::IStreamReader& r);
void write(Athena::io::IStreamWriter& w) const;
};
struct IIntElement : IElement {Delete _d;};
struct IntElementFactory : BigYAML
{
Delete _d;
std::unique_ptr<IIntElement> m_elem;
void read(Athena::io::YAMLDocReader& r);
void write(Athena::io::YAMLDocWriter& w) const;
size_t binarySize(size_t __isz) const;
void read(Athena::io::IStreamReader& r);
void write(Athena::io::IStreamWriter& w) const;
};
2016-02-02 08:22:01 +00:00
struct IVectorElement : IElement {Delete _d;};
struct VectorElementFactory : BigYAML
{
Delete _d;
std::unique_ptr<IVectorElement> m_elem;
void read(Athena::io::YAMLDocReader& r);
void write(Athena::io::YAMLDocWriter& w) const;
size_t binarySize(size_t __isz) const;
void read(Athena::io::IStreamReader& r);
void write(Athena::io::IStreamWriter& w) const;
};
struct IColorElement : IElement {Delete _d;};
struct ColorElementFactory : BigYAML
{
Delete _d;
std::unique_ptr<IColorElement> m_elem;
void read(Athena::io::YAMLDocReader& r);
void write(Athena::io::YAMLDocWriter& w) const;
size_t binarySize(size_t __isz) const;
void read(Athena::io::IStreamReader& r);
void write(Athena::io::IStreamWriter& w) const;
};
struct IModVectorElement : IElement {Delete _d;};
struct ModVectorElementFactory : BigYAML
{
Delete _d;
std::unique_ptr<IModVectorElement> m_elem;
void read(Athena::io::YAMLDocReader& r);
void write(Athena::io::YAMLDocWriter& w) const;
size_t binarySize(size_t __isz) const;
void read(Athena::io::IStreamReader& r);
void write(Athena::io::IStreamWriter& w) const;
};
struct IEmitterElement : IElement {Delete _d;};
struct EmitterElementFactory : BigYAML
{
Delete _d;
std::unique_ptr<IEmitterElement> m_elem;
void read(Athena::io::YAMLDocReader& r);
void write(Athena::io::YAMLDocWriter& w) const;
size_t binarySize(size_t __isz) const;
void read(Athena::io::IStreamReader& r);
void write(Athena::io::IStreamWriter& w) const;
};
2016-02-02 08:22:01 +00:00
struct IUVElement : IElement {Delete _d;};
2016-02-02 04:29:58 +00:00
struct RELifetimeTween : IRealElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "LFTW";}
2016-02-02 04:29:58 +00:00
};
struct REConstant : IRealElement
{
DECL_YAML
Value<float> val;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CNST";}
2016-02-02 04:29:58 +00:00
};
struct RETimeChain : IRealElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
IntElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CHAN";}
2016-02-02 04:29:58 +00:00
};
struct REAdd : IRealElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "ADD_";}
2016-02-02 04:29:58 +00:00
};
struct REClamp : IRealElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
RealElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CLMP";}
2016-02-02 04:29:58 +00:00
};
struct REKeyframeEmitter : IRealElement
{
DECL_YAML
2016-02-02 08:22:01 +00:00
Value<atUint32> percentage;
2016-02-02 04:29:58 +00:00
Value<atUint32> b;
Value<atUint8> c;
Value<atUint8> d;
Value<atUint32> e;
Value<atUint32> f;
Value<atUint32> count;
Vector<float, DNA_COUNT(count)> keys;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return percentage ? "KEYP" : "KEYE";}
2016-02-02 04:29:58 +00:00
};
struct REInitialRandom : IRealElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "IRND";}
2016-02-02 04:29:58 +00:00
};
struct RERandom : IRealElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "RAND";}
2016-02-02 04:29:58 +00:00
};
struct REMultiply : IRealElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "MULT";}
2016-02-02 04:29:58 +00:00
};
struct REPulse : IRealElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
RealElementFactory c;
RealElementFactory d;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "PULS";}
2016-02-02 04:29:58 +00:00
};
struct RETimeScale : IRealElement
{
DECL_YAML
RealElementFactory a;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "SCAL";}
2016-02-02 04:29:58 +00:00
};
struct RELifetimePercent : IRealElement
{
DECL_YAML
RealElementFactory a;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "RLPT";}
2016-02-02 04:29:58 +00:00
};
struct RESineWave : IRealElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
RealElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "SINE";}
2016-02-02 04:29:58 +00:00
};
struct IEKeyframeEmitter : IIntElement
{
DECL_YAML
2016-02-02 08:22:01 +00:00
Value<atUint32> percentage;
2016-02-02 04:29:58 +00:00
Value<atUint32> b;
Value<atUint8> c;
Value<atUint8> d;
Value<atUint32> e;
Value<atUint32> f;
Value<atUint32> count;
Vector<atUint32, DNA_COUNT(count)> keys;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return percentage ? "KEYP" : "KEYE";}
2016-02-02 04:29:58 +00:00
};
struct IEDeath : IIntElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "DETH";}
2016-02-02 04:29:58 +00:00
};
struct IEClamp : IIntElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
IntElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CLMP";}
2016-02-02 04:29:58 +00:00
};
struct IETimeChain : IIntElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
IntElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CHAN";}
2016-02-02 04:29:58 +00:00
};
struct IEAdd : IIntElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "ADD_";}
2016-02-02 04:29:58 +00:00
};
struct IEConstant : IIntElement
{
DECL_YAML
Value<atUint32> val;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CNST";}
2016-02-02 04:29:58 +00:00
};
struct IEImpulse : IIntElement
{
DECL_YAML
IntElementFactory a;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "IMPL";}
2016-02-02 04:29:58 +00:00
};
struct IELifetimePercent : IIntElement
{
DECL_YAML
IntElementFactory a;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "ILPT";}
2016-02-02 04:29:58 +00:00
};
struct IEInitialRandom : IIntElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "IRND";}
2016-02-02 04:29:58 +00:00
};
struct IEPulse : IIntElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
IntElementFactory c;
IntElementFactory d;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "PULS";}
2016-02-02 04:29:58 +00:00
};
struct IEMultiply : IIntElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "MULT";}
2016-02-02 04:29:58 +00:00
};
struct IESampleAndHold : IIntElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
IntElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "SPAH";}
2016-02-02 04:29:58 +00:00
};
struct IERandom : IIntElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "RAND";}
2016-02-02 04:29:58 +00:00
};
struct IETimeScale : IIntElement
{
DECL_YAML
RealElementFactory a;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "TSCL";}
2016-02-02 04:29:58 +00:00
};
2016-02-02 08:22:01 +00:00
struct VECone : IVectorElement
{
DECL_YAML
VectorElementFactory a;
RealElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CONE";}
2016-02-02 08:22:01 +00:00
};
struct VETimeChain : IVectorElement
{
DECL_YAML
VectorElementFactory a;
VectorElementFactory b;
IntElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CHAN";}
2016-02-02 08:22:01 +00:00
};
struct VEAngleCone : IVectorElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
RealElementFactory c;
RealElementFactory d;
RealElementFactory e;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "ANGC";}
2016-02-02 08:22:01 +00:00
};
struct VEAdd : IVectorElement
{
DECL_YAML
VectorElementFactory a;
VectorElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "ADD_";}
2016-02-02 08:22:01 +00:00
};
struct VECircleCluster : IVectorElement
{
DECL_YAML
VectorElementFactory a;
VectorElementFactory b;
IntElementFactory c;
RealElementFactory d;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CCLU";}
2016-02-02 08:22:01 +00:00
};
struct VEConstant : IVectorElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
RealElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CNST";}
2016-02-02 08:22:01 +00:00
};
struct VECircle : IVectorElement
{
DECL_YAML
VectorElementFactory a;
VectorElementFactory b;
RealElementFactory c;
RealElementFactory d;
RealElementFactory e;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CIRC";}
2016-02-02 08:22:01 +00:00
};
struct VEKeyframeEmitter : IVectorElement
{
DECL_YAML
Value<atUint32> percentage;
Value<atUint32> b;
Value<atUint8> c;
Value<atUint8> d;
Value<atUint32> e;
Value<atUint32> f;
Value<atUint32> count;
Vector<atVec3f, DNA_COUNT(count)> keys;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return percentage ? "KEYP" : "KEYE";}
2016-02-02 08:22:01 +00:00
};
struct VEMultiply : IVectorElement
{
DECL_YAML
VectorElementFactory a;
VectorElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "MULT";}
2016-02-02 08:22:01 +00:00
};
struct VERealToVector : IVectorElement
{
DECL_YAML
RealElementFactory a;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "RTOV";}
2016-02-02 08:22:01 +00:00
};
struct VEPulse : IVectorElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
VectorElementFactory c;
VectorElementFactory d;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "PULS";}
2016-02-02 08:22:01 +00:00
};
struct CEKeyframeEmitter : IColorElement
{
DECL_YAML
Value<atUint32> percentage;
Value<atUint32> b;
Value<atUint8> c;
Value<atUint8> d;
Value<atUint32> e;
Value<atUint32> f;
Value<atUint32> count;
Vector<atVec4f, DNA_COUNT(count)> keys;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return percentage ? "KEYP" : "KEYE";}
2016-02-02 08:22:01 +00:00
};
struct CEConstant : IColorElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
RealElementFactory c;
RealElementFactory d;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CNST";}
2016-02-02 08:22:01 +00:00
};
struct CETimeChain : IColorElement
{
DECL_YAML
ColorElementFactory a;
ColorElementFactory b;
IntElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CHAN";}
2016-02-02 08:22:01 +00:00
};
struct CEFadeEnd : IColorElement
{
DECL_YAML
ColorElementFactory a;
ColorElementFactory b;
RealElementFactory c;
RealElementFactory d;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CFDE";}
2016-02-02 08:22:01 +00:00
};
struct CEFade : IColorElement
{
DECL_YAML
ColorElementFactory a;
ColorElementFactory b;
RealElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "FADE";}
2016-02-02 08:22:01 +00:00
};
struct CEPulse : IColorElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
ColorElementFactory c;
ColorElementFactory d;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "PULS";}
2016-02-02 08:22:01 +00:00
};
struct MVEImplosion : IModVectorElement
{
DECL_YAML
VectorElementFactory a;
RealElementFactory b;
RealElementFactory c;
RealElementFactory d;
2016-02-02 23:41:55 +00:00
Value<EClassID> boolCls = EClassID::CNST;
2016-02-02 08:22:01 +00:00
Value<bool> boolVal;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "IMPL";}
2016-02-02 08:22:01 +00:00
};
struct MVEExponentialImplosion : IModVectorElement
{
DECL_YAML
VectorElementFactory a;
RealElementFactory b;
RealElementFactory c;
RealElementFactory d;
2016-02-02 23:41:55 +00:00
Value<EClassID> boolCls = EClassID::CNST;
2016-02-02 08:22:01 +00:00
Value<bool> boolVal;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "EMPL";}
2016-02-02 08:22:01 +00:00
};
struct MVETimeChain : IModVectorElement
{
DECL_YAML
ModVectorElementFactory a;
ModVectorElementFactory b;
IntElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CHAN";}
2016-02-02 08:22:01 +00:00
};
struct MVEBounce : IModVectorElement
{
DECL_YAML
VectorElementFactory a;
VectorElementFactory b;
RealElementFactory c;
RealElementFactory d;
2016-02-02 23:41:55 +00:00
Value<EClassID> boolCls = EClassID::CNST;
2016-02-02 08:22:01 +00:00
Value<bool> boolVal;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "BNCE";}
2016-02-02 08:22:01 +00:00
};
struct MVEConstant : IModVectorElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
RealElementFactory c;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "CNST";}
2016-02-02 08:22:01 +00:00
};
struct MVEGravity : IModVectorElement
{
DECL_YAML
VectorElementFactory a;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "GRAV";}
2016-02-02 08:22:01 +00:00
};
struct MVEExplode : IModVectorElement
{
DECL_YAML
RealElementFactory a;
RealElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "EXPL";}
2016-02-02 08:22:01 +00:00
};
struct MVESetPosition : IModVectorElement
{
DECL_YAML
VectorElementFactory a;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "SPOS";}
2016-02-02 08:22:01 +00:00
};
struct MVELinearImplosion : IModVectorElement
{
DECL_YAML
VectorElementFactory a;
RealElementFactory b;
RealElementFactory c;
RealElementFactory d;
2016-02-02 23:41:55 +00:00
Value<EClassID> boolCls = EClassID::CNST;
2016-02-02 08:22:01 +00:00
Value<bool> boolVal;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "LMPL";}
2016-02-02 08:22:01 +00:00
};
struct MVEPulse : IModVectorElement
{
DECL_YAML
IntElementFactory a;
IntElementFactory b;
ModVectorElementFactory c;
ModVectorElementFactory d;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "PULS";}
2016-02-02 08:22:01 +00:00
};
struct MVEWind : IModVectorElement
{
DECL_YAML
VectorElementFactory a;
RealElementFactory b;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "WIND";}
2016-02-02 08:22:01 +00:00
};
struct MVESwirl : IModVectorElement
{
DECL_YAML
VectorElementFactory a;
VectorElementFactory b;
RealElementFactory c;
RealElementFactory d;
2016-02-02 23:41:55 +00:00
const char* ClassID() const {return "SWRL";}
2016-02-02 08:22:01 +00:00
};
struct EESimpleEmitter : IEmitterElement
{
DECL_YAML
VectorElementFactory loc;
VectorElementFactory vec;
const char* ClassID() const {return "SEMR";}
};
struct VESphere : IEmitterElement
{
DECL_YAML
VectorElementFactory a;
RealElementFactory b;
RealElementFactory c;
const char* ClassID() const {return "SPHE";}
};
struct EESimpleEmitterTR : EESimpleEmitter
{
Delete _d;
void read(Athena::io::YAMLDocReader& r)
{
loc.m_elem.reset();
vec.m_elem.reset();
if (r.enterSubRecord("ILOC"))
{
loc.read(r);
r.leaveSubRecord();
}
if (r.enterSubRecord("IVEC"))
{
vec.read(r);
r.leaveSubRecord();
}
}
void write(Athena::io::YAMLDocWriter& w) const
{
w.enterSubRecord("ILOC");
loc.write(w);
w.leaveSubRecord();
w.enterSubRecord("IVEC");
vec.write(w);
w.leaveSubRecord();
}
size_t binarySize(size_t __isz) const
{
__isz += 8;
__isz = loc.binarySize(__isz);
__isz = vec.binarySize(__isz);
return __isz;
}
void read(Athena::io::IStreamReader& r)
{
loc.m_elem.reset();
vec.m_elem.reset();
uint32_t clsId;
r.readBytesToBuf(&clsId, 4);
if (clsId == SBIG('ILOC'))
{
loc.read(r);
r.readBytesToBuf(&clsId, 4);
if (clsId == SBIG('IVEC'))
vec.read(r);
}
}
void write(Athena::io::IStreamWriter& w) const
{
w.writeBytes((atInt8*)"ILOC", 4);
loc.write(w);
w.writeBytes((atInt8*)"IVEC", 4);
vec.write(w);
}
const char* ClassID() const {return "SETR";}
};
2016-02-02 08:22:01 +00:00
template <class IDType>
struct UVEConstant : IUVElement
{
Delete _d;
IDType tex;
void read(Athena::io::YAMLDocReader& r)
{
tex.clear();
if (r.enterSubRecord("tex"))
{
if (r.enterSubRecord("CNST"))
{
tex.read(r);
r.leaveSubRecord();
}
r.leaveSubRecord();
}
}
void write(Athena::io::YAMLDocWriter& w) const
{
if (tex)
{
w.enterSubRecord("CNST");
tex.write(w);
w.leaveSubRecord();
}
}
size_t binarySize(size_t __isz) const
{
if (tex)
return tex.binarySize(__isz + 4);
2016-02-02 08:22:01 +00:00
else
return __isz + 4;
}
void read(Athena::io::IStreamReader& r)
{
tex.clear();
uint32_t clsId;
r.readBytesToBuf(&clsId, 4);
if (clsId == SBIG('CNST'))
tex.read(r);
}
void write(Athena::io::IStreamWriter& w) const
{
if (tex)
{
w.writeBytes((atInt8*)"CNST", 4);
tex.write(w);
}
else
w.writeBytes((atInt8*)"NONE", 4);
}
const char* ClassID() const {return "CNST";}
2016-02-02 08:22:01 +00:00
};
template <class IDType>
struct UVEAnimTexture : IUVElement
{
Delete _d;
IDType tex;
IntElementFactory a;
IntElementFactory b;
IntElementFactory c;
IntElementFactory d;
IntElementFactory e;
2016-02-02 23:41:55 +00:00
Value<EClassID> boolCls = EClassID::CNST;
2016-02-02 08:22:01 +00:00
Value<bool> boolVal;
void read(Athena::io::YAMLDocReader& r)
{
tex.clear();
if (r.enterSubRecord("tex"))
{
if (r.enterSubRecord("CNST"))
{
tex.read(r);
r.leaveSubRecord();
}
r.leaveSubRecord();
}
if (r.enterSubRecord("a"))
{
a.read(r);
r.leaveSubRecord();
}
if (r.enterSubRecord("b"))
{
b.read(r);
r.leaveSubRecord();
}
if (r.enterSubRecord("c"))
{
c.read(r);
r.leaveSubRecord();
}
if (r.enterSubRecord("d"))
{
d.read(r);
r.leaveSubRecord();
}
if (r.enterSubRecord("e"))
{
e.read(r);
r.leaveSubRecord();
}
2016-02-02 23:41:55 +00:00
boolCls = EClassID::NONE;
2016-02-02 08:22:01 +00:00
if (r.enterSubRecord("bool"))
{
if (r.enterSubRecord("CNST"))
{
2016-02-02 23:41:55 +00:00
boolCls = EClassID::CNST;
2016-02-02 08:22:01 +00:00
boolVal = r.readBool(nullptr);
r.leaveSubRecord();
}
r.leaveSubRecord();
}
}
void write(Athena::io::YAMLDocWriter& w) const
{
if (tex)
{
w.enterSubRecord("CNST");
tex.write(w);
w.leaveSubRecord();
}
a.write(w);
b.write(w);
c.write(w);
d.write(w);
e.write(w);
w.enterSubRecord("bool");
2016-02-02 23:41:55 +00:00
if (boolCls == EClassID::CNST)
2016-02-02 08:22:01 +00:00
{
w.enterSubRecord("CNST");
w.writeBool(nullptr, boolVal);
w.leaveSubRecord();
}
w.leaveSubRecord();
}
size_t binarySize(size_t __isz) const
{
__isz += 8;
if (tex)
__isz = tex.binarySize(__isz);
2016-02-02 08:22:01 +00:00
__isz = a.binarySize(__isz);
__isz = b.binarySize(__isz);
__isz = c.binarySize(__isz);
__isz = d.binarySize(__isz);
__isz = e.binarySize(__isz);
2016-02-02 23:41:55 +00:00
if (boolCls == EClassID::CNST)
2016-02-02 08:22:01 +00:00
__isz += 1;
return __isz;
}
void read(Athena::io::IStreamReader& r)
{
tex.clear();
uint32_t clsId;
r.readBytesToBuf(&clsId, 4);
if (clsId == SBIG('CNST'))
tex.read(r);
a.read(r);
b.read(r);
c.read(r);
d.read(r);
e.read(r);
2016-02-02 23:41:55 +00:00
boolCls = EClassID::NONE;
2016-02-02 08:22:01 +00:00
r.readBytesToBuf(&clsId, 4);
if (clsId == SBIG('CNST'))
{
2016-02-02 23:41:55 +00:00
boolCls = EClassID::CNST;
2016-02-02 08:22:01 +00:00
boolVal = r.readBool();
}
}
void write(Athena::io::IStreamWriter& w) const
{
if (tex)
{
w.writeBytes((atInt8*)"CNST", 4);
tex.write(w);
}
else
w.writeBytes((atInt8*)"NONE", 4);
a.write(w);
b.write(w);
c.write(w);
d.write(w);
e.write(w);
2016-02-02 23:41:55 +00:00
if (boolCls == EClassID::CNST)
2016-02-02 08:22:01 +00:00
{
w.writeBytes((atInt8*)"CNST", 4);
w.writeBool(boolVal);
}
else
w.writeBytes((atInt8*)"NONE", 4);
}
const char* ClassID() const {return "ATEX";}
2016-02-02 08:22:01 +00:00
};
template <class IDType>
struct UVElementFactory : BigYAML
{
Delete _d;
std::unique_ptr<IUVElement> m_elem;
void read(Athena::io::YAMLDocReader& r)
{
if (r.enterSubRecord("CNST"))
{
m_elem.reset(new struct UVEConstant<IDType>);
m_elem->read(r);
r.leaveSubRecord();
}
else if (r.enterSubRecord("ATEX"))
{
m_elem.reset(new struct UVEAnimTexture<IDType>);
m_elem->read(r);
r.leaveSubRecord();
}
else
m_elem.reset();
}
void write(Athena::io::YAMLDocWriter& w) const
{
if (m_elem)
{
2016-02-02 23:41:55 +00:00
w.enterSubRecord(m_elem->ClassID());
2016-02-02 08:22:01 +00:00
m_elem->write(w);
w.leaveSubRecord();
}
}
size_t binarySize(size_t __isz) const
{
if (m_elem)
return m_elem->binarySize(__isz + 4);
else
return __isz + 4;
}
void read(Athena::io::IStreamReader& r)
{
uint32_t clsId;
r.readBytesToBuf(&clsId, 4);
switch (clsId)
{
case SBIG('CNST'):
m_elem.reset(new struct UVEConstant<IDType>);
break;
case SBIG('ATEX'):
m_elem.reset(new struct UVEAnimTexture<IDType>);
break;
default:
m_elem.reset();
return;
}
m_elem->read(r);
}
void write(Athena::io::IStreamWriter& w) const
{
if (m_elem)
{
2016-02-02 23:41:55 +00:00
w.writeBytes((atInt8*)m_elem->ClassID(), 4);
2016-02-02 08:22:01 +00:00
m_elem->write(w);
}
else
w.writeBytes((atInt8*)"NONE", 4);
}
};
2016-02-02 04:29:58 +00:00
template <class IDType>
struct SpawnSystemKeyframeData : BigYAML
{
Delete _d;
Value<atUint32> a;
Value<atUint32> b;
Value<atUint32> c;
Value<atUint32> d;
struct SpawnSystemKeyframeInfo : BigYAML
{
Delete _d;
IDType id;
Value<atUint32> a;
Value<atUint32> b;
Value<atUint32> c;
void read(Athena::io::YAMLDocReader& r)
{
if (r.enterSubRecord("id"))
{
id.read(r);
r.leaveSubRecord();
}
if (r.enterSubRecord("a"))
{
a = r.readUint32(nullptr);
r.leaveSubRecord();
}
if (r.enterSubRecord("b"))
{
b = r.readUint32(nullptr);
r.leaveSubRecord();
}
if (r.enterSubRecord("c"))
{
c = r.readUint32(nullptr);
r.leaveSubRecord();
}
}
void write(Athena::io::YAMLDocWriter& w) const
{
w.enterSubRecord("id");
id.write(w);
w.leaveSubRecord();
w.writeUint32("a", a);
w.writeUint32("b", b);
w.writeUint32("c", c);
}
size_t binarySize(size_t __isz) const
{
return id.binarySize(__isz + 12);
}
void read(Athena::io::IStreamReader& r)
{
id.read(r);
a = r.readUint32Big();
b = r.readUint32Big();
c = r.readUint32Big();
}
void write(Athena::io::IStreamWriter& w) const
{
id.write(w);
w.writeUint32Big(a);
w.writeUint32Big(b);
w.writeUint32Big(c);
}
};
std::vector<std::pair<atUint32, std::vector<SpawnSystemKeyframeInfo>>> spawns;
void read(Athena::io::YAMLDocReader& r)
{
if (r.enterSubRecord("a"))
{
a = r.readUint32(nullptr);
r.leaveSubRecord();
}
if (r.enterSubRecord("b"))
{
b = r.readUint32(nullptr);
r.leaveSubRecord();
}
if (r.enterSubRecord("c"))
{
c = r.readUint32(nullptr);
r.leaveSubRecord();
}
if (r.enterSubRecord("d"))
{
d = r.readUint32(nullptr);
r.leaveSubRecord();
}
spawns.clear();
if (r.enterSubVector("spawns"))
{
spawns.reserve(r.getCurNode()->m_seqChildren.size());
for (const auto& child : r.getCurNode()->m_seqChildren)
{
if (r.enterSubRecord(nullptr))
{
spawns.emplace_back();
spawns.back().first = r.readUint32("first");
if (r.enterSubVector("second"))
{
spawns.back().second.reserve(r.getCurNode()->m_seqChildren.size());
for (const auto& in : r.getCurNode()->m_seqChildren)
{
spawns.back().second.emplace_back();
SpawnSystemKeyframeInfo& info = spawns.back().second.back();
r.enterSubRecord(nullptr);
info.read(r);
r.leaveSubRecord();
}
r.leaveSubVector();
}
r.leaveSubRecord();
}
}
r.leaveSubVector();
}
}
void write(Athena::io::YAMLDocWriter& w) const
{
w.writeUint32("a", a);
w.writeUint32("b", b);
w.writeUint32("c", c);
w.writeUint32("d", d);
w.enterSubVector("spawns");
for (const auto& spawn : spawns)
{
w.writeUint32("first", spawn.first);
w.enterSubVector("second");
for (const auto& info : spawn.second)
{
w.enterSubRecord(nullptr);
info.write(w);
w.leaveSubRecord();
}
w.leaveSubVector();
}
w.leaveSubVector();
}
size_t binarySize(size_t __isz) const
{
__isz += 20;
for (const auto& spawn : spawns)
{
__isz += 8;
for (const auto& info : spawn.second)
__isz = info.binarySize(__isz);
}
return __isz;
}
void read(Athena::io::IStreamReader& r)
{
a = r.readUint32Big();
b = r.readUint32Big();
c = r.readUint32Big();
d = r.readUint32Big();
uint32_t count = r.readUint32Big();
spawns.clear();
spawns.reserve(count);
for (size_t i=0 ; i<count ; ++i)
{
spawns.emplace_back();
spawns.back().first = r.readUint32Big();
uint32_t infoCount = r.readUint32Big();
spawns.back().second.reserve(infoCount);
for (size_t j=0 ; j<infoCount ; ++j)
{
spawns.back().second.emplace_back();
spawns.back().second.back().read(r);
}
}
}
void write(Athena::io::IStreamWriter& w) const
{
w.writeUint32Big(a);
w.writeUint32Big(b);
w.writeUint32Big(c);
w.writeUint32Big(d);
w.writeUint32Big(spawns.size());
for (const auto& spawn : spawns)
{
w.writeUint32Big(spawn.first);
w.writeUint32Big(spawn.second.size());
for (const auto& info : spawn.second)
info.write(w);
}
}
};
template <class IDType>
struct ChildResourceFactory : BigYAML
2016-02-02 04:29:58 +00:00
{
Delete _d;
IDType id;
void read(Athena::io::YAMLDocReader& r)
{
id.clear();
if (r.enterSubRecord("CNST"))
{
id.read(r);
r.leaveSubRecord();
}
}
void write(Athena::io::YAMLDocWriter& w) const
{
if (id)
{
w.enterSubRecord("CNST");
id.write(w);
w.leaveSubRecord();
}
}
size_t binarySize(size_t __isz) const
{
if (id)
return id.binarySize(__isz + 4);
2016-02-02 04:29:58 +00:00
else
return __isz + 4;
}
void read(Athena::io::IStreamReader& r)
{
id.clear();
2016-02-02 08:22:01 +00:00
uint32_t clsId;
r.readBytesToBuf(&clsId, 4);
if (clsId == SBIG('CNST'))
2016-02-02 04:29:58 +00:00
id.read(r);
}
void write(Athena::io::IStreamWriter& w) const
{
if (id)
{
2016-02-02 08:22:01 +00:00
w.writeBytes((atInt8*)"CNST", 4);
2016-02-02 04:29:58 +00:00
id.write(w);
}
else
2016-02-02 08:22:01 +00:00
w.writeBytes((atInt8*)"NONE", 4);
2016-02-02 04:29:58 +00:00
}
};
}
}
#endif // __COMMON_PARTICLECOMMON_HPP__