#ifndef _DNAMP1_ANIM_HPP_ #define _DNAMP1_ANIM_HPP_ #include "BlenderConnection.hpp" #include "DNAMP1.hpp" #include "../DNACommon/ANIM.hpp" #include "CINF.hpp" namespace Retro { namespace DNAMP1 { struct ANIM : BigDNA { Delete expl; struct IANIM : BigDNA { Delete expl; atUint32 m_version; IANIM(atUint32 version) : m_version(version) {} std::vector> bones; std::vector frames; std::vector channels; std::vector> chanKeys; float mainInterval = 0.0; UniqueID32 evnt; void sendANIMToBlender(HECL::BlenderConnection::PyOutStream&, const CINF&) const; }; struct ANIM0 : IANIM { DECL_EXPLICIT_DNA ANIM0() : IANIM(0) {} struct Header : BigDNA { DECL_DNA Value duration; Value unk0; Value interval; Value unk1; Value keyCount; Value unk2; Value boneSlotCount; }; }; struct ANIM2 : IANIM { DECL_EXPLICIT_DNA ANIM2() : IANIM(2) {} struct Header : BigDNA { DECL_DNA Value scratchSize; UniqueID32 evnt; Value unk0; Value duration; Value interval; Value unk1; Value unk2; Value rotDiv; Value translationMult; Value boneChannelCount; Value unk3; Value keyBitmapBitCount; }; struct ChannelDesc : BigDNA { Delete expl; Value id = 0; Value keyCount1 = 0; Value initRX = 0; Value qRX = 0; Value initRY = 0; Value qRY = 0; Value initRZ = 0; Value qRZ = 0; Value keyCount2 = 0; Value initTX = 0; Value qTX = 0; Value initTY = 0; Value qTY = 0; Value initTZ = 0; Value qTZ = 0; void read(Athena::io::IStreamReader& reader) { id = reader.readUint32Big(); keyCount1 = reader.readUint16Big(); initRX = reader.readUint16Big(); qRX = reader.readUByte(); initRY = reader.readUint16Big(); qRY = reader.readUByte(); initRZ = reader.readUint16Big(); qRZ = reader.readUByte(); keyCount2 = reader.readUint16Big(); if (keyCount2) { initTX = reader.readUint16Big(); qTX = reader.readUByte(); initTY = reader.readUint16Big(); qTY = reader.readUByte(); initTZ = reader.readUint16Big(); qTZ = reader.readUByte(); } } void write(Athena::io::IStreamWriter& writer) const { writer.writeUint32Big(id); writer.writeUint16Big(keyCount1); writer.writeUint16Big(initRX); writer.writeUByte(qRX); writer.writeUint16Big(initRY); writer.writeUByte(qRY); writer.writeUint16Big(initRZ); writer.writeUByte(qRZ); writer.writeUint16Big(keyCount2); if (keyCount2) { writer.writeUint16Big(initTX); writer.writeUByte(qTX); writer.writeUint16Big(initTY); writer.writeUByte(qTY); writer.writeUint16Big(initTZ); writer.writeUByte(qTZ); } } size_t binarySize(size_t __isz) const { __isz += 17; if (keyCount2) __isz += 9; return __isz; } }; }; std::unique_ptr m_anim; void read(Athena::io::IStreamReader& reader) { atUint32 version = reader.readUint32Big(); switch (version) { case 0: m_anim.reset(new struct ANIM0); m_anim->read(reader); break; case 2: m_anim.reset(new struct ANIM2); m_anim->read(reader); break; default: Log.report(LogVisor::Error, "unrecognized ANIM version"); break; } } void write(Athena::io::IStreamWriter& writer) const { writer.writeUint32Big(m_anim->m_version); m_anim->write(writer); } size_t binarySize(size_t __isz) const { return m_anim->binarySize(__isz + 4); } void sendANIMToBlender(HECL::BlenderConnection::PyOutStream& os, const CINF& cinf, bool) const { m_anim->sendANIMToBlender(os, cinf); } }; } } #endif // _DNAMP1_ANIM_HPP_