1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
#ifndef J3DJOINT_H
#define J3DJOINT_H
#include "JSystem/J3DGraphAnimator/J3DNode.h"
#include "JSystem/J3DGraphBase/J3DSys.h"
#include "JSystem/J3DGraphBase/J3DTransform.h"
class J3DAnmTransform;
class J3DJoint;
class J3DMaterial;
class J3DMtxBuffer;
class J3DMtxCalc {
public:
virtual void init(const Vec&, const Mtx&) {}
virtual void recursiveCalc(J3DNode*) {}
virtual void calcTransform(u16, const J3DTransformInfo&) {}
virtual void calc(u16 jnt_no) {}
void initAnm() {
for (int i = 0; i < 4; i++) {
mOne[i] = NULL;
mTwo[i] = 0.0f;
}
}
void setAnmTransform(J3DAnmTransform* mAnmTransform) { mOne[0] = mAnmTransform; }
public:
J3DAnmTransform* mOne[4];
f32 mTwo[4];
};
class J3DMtxCalcAnm : public virtual J3DMtxCalc {
public:
J3DMtxCalcAnm(J3DAnmTransform* mAnmTransform) : J3DMtxCalc() {
initAnm();
setAnmTransform(mAnmTransform);
}
virtual ~J3DMtxCalcAnm() { initAnm(); }
virtual void calc(u16);
};
class J3DMtxCalcBasic : public virtual J3DMtxCalc {
private:
Mtx mBackupMtx;
Vec mBackupS;
Vec mBackupParentS;
public:
J3DMtxCalcBasic();
virtual ~J3DMtxCalcBasic() {}
virtual void init(const Vec& vec, const Mtx& mtx) {
J3DSys::mCurrentS = vec;
#ifndef DECOMPCTX // Hack, see comment in dolzel.pch for details
J3DSys::mParentS = (Vec){1.0f, 1.0f, 1.0f};
#endif
J3DSys::mCurrentMtx[0][0] = mtx[0][0] * J3DSys::mCurrentS.x;
J3DSys::mCurrentMtx[0][1] = mtx[0][1] * J3DSys::mCurrentS.y;
J3DSys::mCurrentMtx[0][2] = mtx[0][2] * J3DSys::mCurrentS.z;
J3DSys::mCurrentMtx[0][3] = mtx[0][3];
J3DSys::mCurrentMtx[1][0] = mtx[1][0] * J3DSys::mCurrentS.x;
J3DSys::mCurrentMtx[1][1] = mtx[1][1] * J3DSys::mCurrentS.y;
J3DSys::mCurrentMtx[1][2] = mtx[1][2] * J3DSys::mCurrentS.z;
J3DSys::mCurrentMtx[1][3] = mtx[1][3];
J3DSys::mCurrentMtx[2][0] = mtx[2][0] * J3DSys::mCurrentS.x;
J3DSys::mCurrentMtx[2][1] = mtx[2][1] * J3DSys::mCurrentS.y;
J3DSys::mCurrentMtx[2][2] = mtx[2][2] * J3DSys::mCurrentS.z;
J3DSys::mCurrentMtx[2][3] = mtx[2][3];
}
virtual void recursiveCalc(J3DNode*);
virtual void calcTransform(u16, const J3DTransformInfo&);
virtual void calc(u16 jnt_no);
Mtx& getBackupMtx() { return mBackupMtx; }
Vec& getBackupS() { return mBackupS; }
Vec& getBackupParentS() { return mBackupParentS; }
void setBackupS(const Vec& vec) { mBackupS = vec; }
void setBackupParentS(const Vec& vec) { mBackupParentS = vec; }
};
class J3DMtxCalcSoftimage : public J3DMtxCalcBasic {
public:
J3DMtxCalcSoftimage() : J3DMtxCalc() {}
virtual void calcTransform(u16, const J3DTransformInfo&);
virtual ~J3DMtxCalcSoftimage() {}
virtual void init(const Vec& vec, const Mtx& mtx) {
J3DSys::mCurrentS = vec;
MTXCopy(mtx, J3DSys::mCurrentMtx);
}
};
class J3DMtxCalcMaya : public J3DMtxCalcBasic {
public:
J3DMtxCalcMaya() : J3DMtxCalcBasic() {}
virtual ~J3DMtxCalcMaya() {}
virtual void init(const Vec& vec, const Mtx& mtx) {
#ifndef DECOMPCTX // Hack, see comment in dolzel.pch for details
J3DSys::mParentS = (Vec){1.0f, 1.0f, 1.0f};
#endif
J3DSys::mCurrentS = vec;
J3DSys::mCurrentMtx[0][0] = mtx[0][0] * J3DSys::mCurrentS.x;
J3DSys::mCurrentMtx[0][1] = mtx[0][1] * J3DSys::mCurrentS.y;
J3DSys::mCurrentMtx[0][2] = mtx[0][2] * J3DSys::mCurrentS.z;
J3DSys::mCurrentMtx[0][3] = mtx[0][3];
J3DSys::mCurrentMtx[1][0] = mtx[1][0] * J3DSys::mCurrentS.x;
J3DSys::mCurrentMtx[1][1] = mtx[1][1] * J3DSys::mCurrentS.y;
J3DSys::mCurrentMtx[1][2] = mtx[1][2] * J3DSys::mCurrentS.z;
J3DSys::mCurrentMtx[1][3] = mtx[1][3];
J3DSys::mCurrentMtx[2][0] = mtx[2][0] * J3DSys::mCurrentS.x;
J3DSys::mCurrentMtx[2][1] = mtx[2][1] * J3DSys::mCurrentS.y;
J3DSys::mCurrentMtx[2][2] = mtx[2][2] * J3DSys::mCurrentS.z;
J3DSys::mCurrentMtx[2][3] = mtx[2][3];
}
virtual void calcTransform(u16, const J3DTransformInfo&);
};
class J3DMtxCalcMayaAnm : public J3DMtxCalcMaya, public J3DMtxCalcAnm {
public:
J3DMtxCalcMayaAnm(J3DAnmTransform* pAnmTransform)
: J3DMtxCalcMaya(), J3DMtxCalcAnm(pAnmTransform) {}
virtual ~J3DMtxCalcMayaAnm() {}
virtual void calc(u16 jnt_no) { J3DMtxCalcAnm::calc(jnt_no); }
};
enum J3DJointMtxType {
J3DJntMtxType_Normal,
J3DJntMtxType_BBoard,
J3DJntMtxType_YBBoard,
J3DJntMtxType_Multi,
};
class J3DJoint : public J3DNode {
public:
void initialize();
void addMesh(J3DMaterial*);
void calcIn();
void calcOut();
void entryIn();
u32 getType() const { return 'NJNT'; }
void recursiveCalc();
J3DJoint() { initialize(); }
~J3DJoint() {}
J3DMaterial* getMesh() { return mMesh; }
u16 getJntNo() const { return mJntNo; }
u8 getKind() const { return mKind & 0x0F; }
u8 getMtxType() const { return (mKind >> 4) & 0x0F; }
u8 getScaleCompensate() const { return mScaleCompensate; }
void setCurrentMtxCalc(J3DMtxCalc* pMtxCalc) { mCurrentMtxCalc = pMtxCalc; }
J3DTransformInfo& getTransformInfo() { return mTransformInfo; }
Vec* getMax() { return &mMax; }
Vec* getMin() { return &mMin; }
void setMtxCalc(J3DMtxCalc* i_mtxCalc) { mMtxCalc = i_mtxCalc; }
J3DMtxCalc* getMtxCalc() { return mMtxCalc; }
void setOldMtxCalc(J3DMtxCalc* i_mtxCalc) { mOldMtxCalc = i_mtxCalc; }
J3DMtxCalc* getOldMtxCalc() { return mOldMtxCalc; }
J3DMtxCalc* getCurrentMtxCalc() { return mCurrentMtxCalc; };
void setMtxType(u8 type) { mKind = (mKind & ~0xf0) | (type << 4); }
static J3DMtxCalc* mCurrentMtxCalc;
private:
friend struct J3DJointFactory;
friend class J3DJointTree;
/* 0x18 */ u16 mJntNo;
/* 0x1A */ u8 mKind;
/* 0x1B */ u8 mScaleCompensate;
/* 0x1C */ J3DTransformInfo mTransformInfo;
/* 0x3C */ f32 mRadius;
/* 0x40 */ Vec mMin;
/* 0x4C */ Vec mMax;
/* 0x58 */ J3DMtxCalc* mMtxCalc;
/* 0x5C */ J3DMtxCalc* mOldMtxCalc;
/* 0x60 */ J3DMaterial* mMesh;
}; // Size: 0x64
#endif /* J3DJOINT_H */
|