NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
g3d_anmobj.h
1#ifndef NW4R_G3D_ANM_OBJ_H
2#define NW4R_G3D_ANM_OBJ_H
3#include <nw4r/types_nw4r.h>
4
5#include <nw4r/g3d/g3d_obj.h>
6#include <nw4r/g3d/res/g3d_resanm.h>
7
8namespace nw4r {
9namespace g3d {
10
11// Forward declarations
12class ResMdl;
13
14/******************************************************************************
15 *
16 * AnmObj
17 *
18 ******************************************************************************/
19class AnmObj : public G3dObj {
20 NW4R_G3D_RTTI_DECL_DERIVED(AnmObj, G3dObj);
21
22public:
23 enum AnmFlag {
24 FLAG_NEED_UPDATE = (1 << 0),
25 FLAG_CACHE_OBSOLETE = (1 << 1),
26 FLAG_ANM_BOUND = (1 << 2),
27 FLAG_USE_QUATERNION_ROTATION_BLEND = (1 << 3),
28 FLAG_USE_ACCURATE_SCALE_BLEND = (1 << 4)
29 };
30
31public:
32 AnmObj(MEMAllocator* pAllocator, G3dObj* pParent)
33 : G3dObj(pAllocator, pParent), mFlags(0) {}
34
35 virtual void G3dProc(ulong task, ulong param, void* pInfo) = 0; // at 0xC
36 virtual ~AnmObj() {} // at 0x10
37
38 virtual void SetFrame(f32 frame) = 0; // at 0x1C
39 virtual f32 GetFrame() const = 0; // at 0x20
40 virtual void UpdateFrame() = 0; // at 0x24
41
42 virtual void SetUpdateRate(f32 rate) = 0; // at 0x28
43 virtual f32 GetUpdateRate() const = 0; // at 0x2C
44
45 virtual bool Bind(const ResMdl mdl) = 0; // at 0x30
46 virtual void Release(); // at 0x34
47
48 void SetAnmFlag(AnmFlag flag, bool value);
49 bool TestAnmFlag(AnmFlag flag) const;
50
51 bool IsBound() const {
52 return TestAnmFlag(FLAG_ANM_BOUND);
53 }
54
55private:
56 ulong mFlags; // at 0xC
57};
58
59/******************************************************************************
60 *
61 * PlayPolicy
62 *
63 ******************************************************************************/
64f32 PlayPolicy_Onetime(f32 start, f32 end, f32 frame);
65f32 PlayPolicy_Loop(f32 start, f32 end, f32 frame);
66
67typedef f32 (*PlayPolicyFunc)(f32 start, f32 end, f32 frame);
68
69inline PlayPolicyFunc GetAnmPlayPolicy(AnmPolicy policy) {
70 static PlayPolicyFunc policyTable[ANM_POLICY_MAX] = {PlayPolicy_Onetime,
71 PlayPolicy_Loop};
72 return policyTable[policy];
73}
74
75/******************************************************************************
76 *
77 * FrameCtrl
78 *
79 ******************************************************************************/
80class FrameCtrl {
81public:
82 FrameCtrl(f32 start, f32 end, PlayPolicyFunc pPolicy)
83 : mFrame(0.0f),
84 mUpdateRate(1.0f),
85 mStartFrame(start),
86 mEndFrame(end),
87 mpPlayPolicy(pPolicy) {}
88
89 f32 GetFrm() const {
90 return mFrame;
91 }
92 void SetFrm(f32 frame) {
93 mFrame = mpPlayPolicy(mStartFrame, mEndFrame, frame);
94 }
95 void UpdateFrm() {
96 SetFrm(mUpdateRate * smBaseUpdateRate + mFrame);
97 }
98
99 f32 GetRate() const {
100 return mUpdateRate;
101 }
102 void SetRate(f32 rate) {
103 mUpdateRate = rate;
104 }
105
106 void SetPlayPolicy(PlayPolicyFunc func) {
107 mpPlayPolicy = func;
108 }
109
110private:
111 f32 mFrame; // at 0x0
112 f32 mUpdateRate; // at 0x4
113 f32 mStartFrame; // at 0x8
114 f32 mEndFrame; // at 0xC
115 PlayPolicyFunc mpPlayPolicy; // at 0x10
116
117 static f32 smBaseUpdateRate;
118};
119
120} // namespace g3d
121} // namespace nw4r
122
123#endif
3D graphics drawing library.
Definition g3d_3dsmax.h:10