A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ResAnmChr.hh
1#pragma once
2
3#include "abstract/g3d/AnmObj.hh"
4#include "abstract/g3d/ResCommon.hh"
5#include "abstract/g3d/ResDic.hh"
6
7#include <egg/math/Matrix.hh>
8#include <egg/util/Stream.hh>
9
10// Credit: kiwi515/ogws
11
12namespace Kinoko::Abstract::g3d {
14 enum Flag {
15 FLAG_ANM_EXISTS = (1 << 0),
16 FLAG_MTX_IDENT = (1 << 1),
17 FLAG_ROT_TRANS_ZERO = (1 << 2),
18 FLAG_SCALE_ONE = (1 << 3),
19 FLAG_SCALE_UNIFORM = (1 << 4),
20 FLAG_ROT_ZERO = (1 << 5),
21 FLAG_TRANS_ZERO = (1 << 6),
22 FLAG_PATCH_SCALE = (1 << 7),
23 FLAG_PATCH_ROT = (1 << 8),
24 FLAG_PATCH_TRANS = (1 << 9),
25
26 // Maya Scale Compensation
27 FLAG_SSC_APPLY = (1 << 10),
28 FLAG_SSC_PARENT = (1 << 11),
29
30 // Softimage Hierarchical Scaling
31 FLAG_XSI_SCALING = (1 << 12),
32 };
33
35 [[nodiscard]] EGG::Vector3f scale() const {
36 return s;
37 }
38
39 u32 flags;
41 EGG::Vector3f rawR;
43};
44
46class ResAnmChr {
47public:
49 struct Frm48Data {
50 s16 frame; // at 0x0
51 u16 value; // at 0x2
52 s16 slope; // at 0x4
53 };
54 struct FVS48Data {
55 f32 scale; // at 0x0
56 f32 offset; // at 0x4
57 Frm48Data frameValues[1]; // at 0x8
58 };
59
60 struct Frm96Data {
61 f32 frame; // at 0x0
62 f32 value; // at 0x4
63 f32 slope; // at 0x8
64 };
65 struct FVS96Data {
66 Frm96Data frameValues[1]; // at 0x0
67 };
68
69 struct FVSData {
70 u16 numFrameValues; // at 0x0
71 u8 PADDING_0x2[0x4 - 0x2]; // at 0x2
72 f32 invKeyFrameRange; // at 0x4
73
74 union {
75 FVS48Data fvs48; // at 0x8
76 FVS96Data fvs96; // at 0x8
77 };
78 };
79
81 struct CV32Data {
82 f32 values[1]; // at 0x0
83 };
84
85 struct CVData {
86 CV32Data cv32; // at 0x0
87 };
88
89 struct AnmData {
90 union {
91 FVSData fvs; // at 0x0
92 CVData cv; // at 0x0
93 };
94 };
95
96 struct NodeData {
97 enum Flag {
98 FLAG_ANM_EXISTS = (1 << 0),
99 FLAG_MTX_IDENT = (1 << 1),
100 FLAG_ROT_TRANS_ZERO = (1 << 2),
101 FLAG_SCALE_ONE = (1 << 3),
102 FLAG_SCALE_UNIFORM = (1 << 4),
103 FLAG_ROT_ZERO = (1 << 5),
104 FLAG_TRANS_ZERO = (1 << 6),
105 FLAG_PATCH_SCALE = (1 << 7),
106 FLAG_PATCH_ROT = (1 << 8),
107 FLAG_PATCH_TRANS = (1 << 9),
108
109 // Maya Scale Compensation
110 FLAG_SSC_APPLY = (1 << 10),
111 FLAG_SSC_PARENT = (1 << 11),
112
113 // Softimage Hierarchical Scaling
114 FLAG_XSI_SCALING = (1 << 12),
115
116 FLAG_SCALE_X_CONST = (1 << 13),
117 FLAG_SCALE_Y_CONST = (1 << 14),
118 FLAG_SCALE_Z_CONST = (1 << 15),
119
120 FLAG_ROT_X_CONST = (1 << 16),
121 FLAG_ROT_Y_CONST = (1 << 17),
122 FLAG_ROT_Z_CONST = (1 << 18),
123
124 FLAG_TRANS_X_CONST = (1 << 19),
125 FLAG_TRANS_Y_CONST = (1 << 20),
126 FLAG_TRANS_Z_CONST = (1 << 21),
127
128 FLAG_HAS_SCALE = (1 << 22),
129 FLAG_HAS_ROT = (1 << 23),
130 FLAG_HAS_TRANS = (1 << 24),
131
132 FLAG_SCALE_FVS32_FMT = (1 << 25),
133 FLAG_SCALE_FVS48_FMT = (1 << 26),
134 FLAG_SCALE_FVS96_FMT = FLAG_SCALE_FVS32_FMT | FLAG_SCALE_FVS48_FMT,
135
136 FLAG_ROT_FVS32_FMT = (1 << 27),
137 FLAG_ROT_FVS48_FMT = (1 << 28),
138 FLAG_ROT_FVS96_FMT = FLAG_ROT_FVS32_FMT | FLAG_ROT_FVS48_FMT,
139
140 FLAG_ROT_CV8_FMT = (1 << 29),
141 FLAG_ROT_CV16_FMT = (1 << 27) | (1 << 29),
142 FLAG_ROT_CV32_FMT = (1 << 28) | (1 << 29),
143
144 FLAG_TRANS_FVS32_FMT = (1 << 30),
145 FLAG_TRANS_FVS48_FMT = (1 << 31),
146 FLAG_TRANS_FVS96_FMT = FLAG_TRANS_FVS32_FMT | FLAG_TRANS_FVS48_FMT,
147
148 FLAG_HAS_SRT_MASK = FLAG_HAS_SCALE | FLAG_HAS_ROT | FLAG_HAS_TRANS,
149
150 FLAG_SCALE_FMT_MASK =
151 FLAG_SCALE_FVS32_FMT | FLAG_SCALE_FVS48_FMT | FLAG_SCALE_FVS96_FMT,
152
153 FLAG_ROT_FMT_MASK = FLAG_ROT_FVS32_FMT | FLAG_ROT_FVS48_FMT | FLAG_ROT_FVS96_FMT |
154 FLAG_ROT_CV8_FMT | FLAG_ROT_CV16_FMT | FLAG_ROT_CV32_FMT,
155
156 FLAG_TRANS_FMT_MASK = FLAG_TRANS_FVS32_FMT | FLAG_TRANS_FVS48_FMT | FLAG_TRANS_FVS96_FMT
157 };
158
159 union AnmData {
160 s32 toResAnmChrAnmData;
161 f32 constValue;
162 };
163
164 s32 name;
165 u32 flags;
166 AnmData anms[1];
167 };
168 STATIC_ASSERT(sizeof(NodeData) == 0xC);
169
170 struct InfoData {
171 void read(EGG::Stream &stream) {
172 numFrame = stream.read_u16();
173 numNode = stream.read_u16();
174 policy = static_cast<AnmPolicy>(stream.read_u32());
175 scalingRule = stream.read_u32();
176 }
177
178 u16 numFrame;
179 u16 numNode;
180 AnmPolicy policy;
181 u32 scalingRule;
182 };
183 STATIC_ASSERT(sizeof(InfoData) == 0xC);
184
185 struct Data {
186 ResBlockHeaderData header;
187 u32 revision;
188 s32 toResFileData;
189 s32 toChrDataDic;
190 s32 toResUserData;
191 s32 name;
192 s32 originalPath;
193 InfoData info;
194 };
195 STATIC_ASSERT(sizeof(Data) == 0x2C);
196
197 ResAnmChr(const void *data) : m_rawData(reinterpret_cast<const Data *>(data)) {
198 EGG::RamStream stream = EGG::RamStream(data, sizeof(Data));
199 read(stream);
200 }
201
202 void read(EGG::Stream &stream) {
203 stream.jump(offsetof(Data, info));
204 m_infoData.read(stream);
205 }
206
207 [[nodiscard]] ChrAnmResult getAnmResult(f32 frame, size_t idx) const;
208
209 [[nodiscard]] u16 frameCount() const {
210 return m_infoData.numFrame;
211 }
212
213 [[nodiscard]] AnmPolicy policy() const {
214 return m_infoData.policy;
215 }
216
217private:
218 typedef void (*GetAnmResultFunc)(f32 frame, ChrAnmResult &result,
219 const ResAnmChr::InfoData &infoData, const ResAnmChr::NodeData *nodeData);
220
221 const Data *m_rawData;
222 InfoData m_infoData;
223
224 static constexpr size_t NUM_RESULT_FUNCS = 8;
225 static const std::array<GetAnmResultFunc, NUM_RESULT_FUNCS> s_getAnmResultTable;
226};
227
228class AnmObjChrRes : public FrameCtrl {
229public:
230 AnmObjChrRes(const ResAnmChr &chr)
231 : FrameCtrl(0.0f, chr.frameCount(), GetAnmPlayPolicy(chr.policy())), m_resAnmChr(chr) {}
232
233 [[nodiscard]] u16 frameCount() const {
234 return m_resAnmChr.frameCount();
235 }
236
237private:
238 ResAnmChr m_resAnmChr;
239};
240
241} // namespace Kinoko::Abstract::g3d
Represents the CHR0 file format, which pertains to model movement animations.
Definition ResAnmChr.hh:46
A 3 x 4 matrix.
Definition Matrix.hh:10
A stream of data stored in memory.
Definition Stream.hh:83
A stream of data, abstracted to allow for continuous seeking.
Definition Stream.hh:10
Const value (CV) animation data.
Definition ResAnmChr.hh:81
Frame values (FVS) animation data.
Definition ResAnmChr.hh:49
A 3D float vector.
Definition Vector.hh:107