metaforce/DataSpec/DNACommon/ANIM.hpp

93 lines
1.8 KiB
C++
Raw Normal View History

2015-08-11 23:32:02 +00:00
#ifndef _DNACOMMON_ANIMBITSTREAM_HPP_
#define _DNACOMMON_ANIMBITSTREAM_HPP_
#include "DNACommon.hpp"
namespace Retro
{
namespace DNAANIM
{
union Value
{
atVec3f v3;
atVec4f v4;
Value(atVec3f v) : v3(v) {}
Value(atVec4f v) : v4(v) {}
Value(float x, float y, float z)
{
v3.vec[0] = x;
v3.vec[1] = y;
v3.vec[2] = z;
v4.vec[3] = 0.0;
}
2015-08-13 21:29:07 +00:00
Value(float w, float x, float y, float z)
{
v4.vec[0] = w;
v4.vec[1] = x;
v4.vec[2] = y;
v4.vec[3] = z;
}
2015-08-11 23:32:02 +00:00
};
struct QuantizedValue
{
2015-09-26 03:12:08 +00:00
atInt16 v[4];
2015-08-11 23:32:02 +00:00
atInt16& operator[] (size_t idx)
{return v[idx];}
const atInt16& operator[] (size_t idx) const
{return v[idx];}
};
struct QuantizedRot
{
QuantizedValue v;
bool w;
};
struct Channel
{
2015-11-21 01:16:07 +00:00
enum class Type
2015-08-11 23:32:02 +00:00
{
2015-11-21 01:16:07 +00:00
Rotation,
Translation,
Scale,
KfHead,
RotationMP3
2015-08-11 23:32:02 +00:00
} type;
QuantizedValue i = {};
2015-09-26 03:12:08 +00:00
atUint8 q[4] = {};
2015-08-11 23:32:02 +00:00
};
size_t ComputeBitstreamSize(size_t keyFrameCount, const std::vector<Channel>& channels);
class BitstreamReader
{
size_t m_bitCur;
atInt16 dequantize(const atUint8* data, atUint8 q);
2015-08-13 21:29:07 +00:00
bool dequantizeBit(const atUint8* data);
2015-08-11 23:32:02 +00:00
public:
std::vector<std::vector<Value>>
read(const atUint8* data,
size_t keyFrameCount,
const std::vector<Channel>& channels,
atUint32 rotDiv,
float transMult);
};
class BitstreamWriter
{
size_t m_bitCur;
void quantize(atUint8* data, atUint8 q, atInt16 val);
2015-08-13 21:29:07 +00:00
void quantizeBit(atUint8* data, bool val);
2015-08-11 23:32:02 +00:00
public:
std::unique_ptr<atUint8[]>
write(const std::vector<std::vector<Value>>& chanKeys,
size_t keyFrameCount, std::vector<Channel>& channels,
atUint32& rotDivOut,
float& transMultOut,
size_t& sizeOut);
};
}
}
#endif // _DNACOMMON_ANIMBITSTREAM_HPP_