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