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