Skip to content

Commit b5e932c

Browse files
authored
A Little j3d work (#2396)
1 parent 59ff71c commit b5e932c

File tree

12 files changed

+204
-149
lines changed

12 files changed

+204
-149
lines changed

configure.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,7 @@ def MatchingFor(*versions):
10611061
Object(MatchingFor("GZ2E01"), "JSystem/J3DGraphAnimator/J3DAnimation.cpp", extra_cflags=['-pragma "nosyminline off"']),
10621062
Object(MatchingFor("GZ2E01"), "JSystem/J3DGraphAnimator/J3DMaterialAnm.cpp"),
10631063
Object(NonMatching, "JSystem/J3DGraphAnimator/J3DSkinDeform.cpp"),
1064-
Object(NonMatching, "JSystem/J3DGraphAnimator/J3DCluster.cpp"),
1064+
Object(MatchingFor("GZ2E01"), "JSystem/J3DGraphAnimator/J3DCluster.cpp"),
10651065
Object(MatchingFor("GZ2E01"), "JSystem/J3DGraphAnimator/J3DJoint.cpp"),
10661066
Object(NonMatching, "JSystem/J3DGraphAnimator/J3DMaterialAttach.cpp"),
10671067
],

include/JSystem/J3DGraphAnimator/J3DAnimation.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ class J3DAnmColor : public J3DAnmBase {
722722
u16 getUpdateMaterialNum() const { return mUpdateMaterialNum; }
723723
bool isValidUpdateMaterialID(u16 id) const { return mUpdateMaterialID[id] != 0xFFFF; }
724724
u16 getUpdateMaterialID(u16 idx) const {
725-
JUT_ASSERT_MSG(1578, 0 <= mUpdateMaterialNum - idx, "Error : range over.")
725+
J3D_ASSERT(1578, idx < mUpdateMaterialNum, "Error : range over.")
726726
return mUpdateMaterialID[idx];
727727
}
728728

include/JSystem/J3DGraphAnimator/J3DCluster.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef J3DCLUSTER_H
22
#define J3DCLUSTER_H
33

4+
#include "JSystem/JUtility/JUTAssert.h"
45
#include "dolphin/types.h"
56

67
class J3DDeformer;
@@ -79,7 +80,10 @@ class J3DDeformData {
7980
/* 8032E274 */ void deform(J3DModel*);
8081
/* 8032E364 */ void setAnm(J3DAnmCluster*);
8182

82-
J3DCluster* getClusterPointer(u16 index) { return &mClusterPointer[index]; }
83+
J3DCluster* getClusterPointer(u16 index) {
84+
J3D_ASSERT(186, (index < mClusterNum),"Error : range over.");
85+
return &mClusterPointer[index];
86+
}
8387
u16 getClusterNum() const { return mClusterNum; }
8488
u16 getClusterKeyNum() const { return mClusterKeyNum; }
8589
J3DClusterKey* getClusterKeyPointer(u16 i) { return &mClusterKeyPointer[i]; }

include/JSystem/J3DGraphAnimator/J3DJointTree.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class J3DJointTree {
6565
J3DJoint* getRootNode() { return mRootNode; }
6666
J3DJoint* getJointNodePointer(u16 idx) const { return mJointNodePointer[idx]; }
6767
J3DMtxCalc* getBasicMtxCalc() const { return mBasicMtxCalc; }
68-
Mtx& getInvJointMtx(s32 idx) const { return mInvJointMtx[idx]; }
68+
Mtx& getInvJointMtx(int idx) { return mInvJointMtx[idx]; }
6969
u32 getModelDataType() const { return mModelDataType; }
7070
void setModelDataType(u32 type) { mModelDataType = type; }
7171
bool checkFlag(u32 flag) { return mFlags & flag; }

include/JSystem/J3DGraphAnimator/J3DModel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class J3DModel {
8686
Mtx& getBaseTRMtx() { return mBaseTransformMtx; }
8787
void setBaseTRMtx(Mtx m) { MTXCopy(m, mBaseTransformMtx); }
8888
u32 getMtxCalcMode() const { return mFlags & 0x03; }
89-
J3DVertexBuffer* getVertexBuffer() const { return (J3DVertexBuffer*)&mVertexBuffer; }
89+
J3DVertexBuffer* getVertexBuffer() { return (J3DVertexBuffer*)&mVertexBuffer; }
9090
J3DMatPacket* getMatPacket(u16 idx) const { return &mMatPacket[idx]; }
9191
J3DShapePacket* getShapePacket(u16 idx) const { return &mShapePacket[idx]; }
9292
J3DMtxBuffer* getMtxBuffer() const { return mMtxBuffer; }

include/JSystem/J3DGraphAnimator/J3DModelData.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class J3DModelData {
5252
void setHierarchy(J3DModelHierarchy* hierarchy) { mJointTree.setHierarchy(hierarchy); }
5353
void setBasicMtxCalc(J3DMtxCalc* calc) { mJointTree.setBasicMtxCalc(calc); }
5454
JUTNameTab* getJointName() const { return mJointTree.getJointName(); }
55-
Mtx& getInvJointMtx(s32 idx) const { return mJointTree.getInvJointMtx(idx); }
55+
Mtx& getInvJointMtx(int idx) { return mJointTree.getInvJointMtx(idx); }
5656
J3DTexture* getTexture() const { return mMaterialTable.getTexture(); }
5757
JUTNameTab* getTextureName() const { return mMaterialTable.getTextureName(); }
5858
u16 getWEvlpMtxNum() const { return mJointTree.getWEvlpMtxNum(); }

include/JSystem/J3DGraphAnimator/J3DMtxBuffer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class J3DMtxBuffer {
1515

1616
/* 80326214 */ void initialize();
1717
/* 80326258 */ s32 create(J3DModelData*, u32);
18-
/* 80326364 */ s32 createAnmMtx(J3DModelData*);
18+
/* 80326364 */ J3DError createAnmMtx(J3DModelData*);
1919
/* 803263F0 */ s32 createWeightEnvelopeMtx(J3DModelData*);
2020
/* 8032648C */ s32 setNoUseDrawMtx();
2121
/* 803264B8 */ s32 createDoubleDrawMtx(J3DModelData*, u32);

include/JSystem/J3DGraphBase/J3DVertex.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class J3DVertexBuffer {
102102

103103
void* getTransformedVtxPos(int idx) { return mTransformedVtxPosArray[idx]; }
104104
void* getTransformedVtxNrm(int idx) { return mTransformedVtxNrmArray[idx]; }
105-
J3DVertexData* getVertexData() { return mVtxData; }
105+
J3DVertexData* getVertexData() const { return mVtxData; }
106106

107107
void swapTransformedVtxPos() {
108108
void* tmp = mTransformedVtxPosArray[0];

include/JSystem/JUtility/JUTAssert.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#define JUT_ASSERT_MSG_F(LINE, COND, MSG, ...) \
1414
(COND) ? (void)0 : (JUTAssertion::showAssert_f(JUTAssertion::getSDevice(), __FILE__, LINE, MSG, __VA_ARGS__), OSPanic(__FILE__, LINE, "Halt"));
1515

16+
#define J3D_ASSERT(LINE, COND, MSG) JUT_ASSERT_MSG(LINE, (COND) != 0, MSG)
17+
1618
#define JUT_PANIC(LINE, TEXT) \
1719
JUTAssertion::showAssert(JUTAssertion::getSDevice(), __FILE__, LINE, TEXT); \
1820
OSPanic(__FILE__, LINE, "Halt");
@@ -33,6 +35,7 @@
3335
#define JUT_ASSERT(...) (void)0;
3436
#define JUT_ASSERT_MSG(...) (void)0;
3537
#define JUT_ASSERT_MSG_F(...) (void)0;
38+
#define J3D_ASSERT(...) (void)0;
3639
#define JUT_PANIC(...)
3740
#define JUT_WARN(...)
3841
#define JUT_WARN_DEVICE(...)

src/JSystem/J3DGraphAnimator/J3DCluster.cpp

Lines changed: 46 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,6 @@
1111
#include "dolphin/base/PPCArch.h"
1212
#include "dolphin/os.h"
1313

14-
#ifdef DEBUG
15-
#define J3D_ASSERT(COND) \
16-
if ((COND) == 0) { \
17-
JUTAssertion::showAssert(JUTAssertion::getSDevice(), __FILE__, __LINE__, \
18-
"Error : null pointer"); \
19-
OSPanic(__FILE__, __LINE__, "Halt"); \
20-
}
21-
#else
22-
#define J3D_ASSERT(COND)
23-
#endif
24-
2514
/* 8032E1F8-8032E230 328B38 0038+00 0/0 1/1 0/0 .text __ct__13J3DDeformDataFv */
2615
J3DDeformData::J3DDeformData() {
2716
mClusterNum = 0;
@@ -48,15 +37,15 @@ void J3DDeformData::offAllFlag(u32 i_flag) {
4837
/* 8032E274-8032E298 328BB4 0024+00 0/0 1/1 0/0 .text deform__13J3DDeformDataFP8J3DModel
4938
*/
5039
void J3DDeformData::deform(J3DModel* model) {
51-
J3D_ASSERT(model != NULL);
40+
J3D_ASSERT(110, model,"Error : null pointer");
5241

5342
deform(model->getVertexBuffer());
5443
}
5544

5645
/* 8032E298-8032E364 328BD8 00CC+00 1/1 0/0 0/0 .text deform__13J3DDeformDataFP15J3DVertexBuffer
5746
*/
5847
void J3DDeformData::deform(J3DVertexBuffer* buffer) {
59-
J3D_ASSERT(buffer != NULL);
48+
J3D_ASSERT(141, buffer,"Error : null pointer");
6049

6150
buffer->swapVtxPosArrayPointer();
6251
buffer->swapVtxNrmArrayPointer();
@@ -94,7 +83,7 @@ J3DDeformer::J3DDeformer(J3DDeformData* data) {
9483
/* 8032E3BC-8032E4A4 328CFC 00E8+00 1/1 0/0 0/0 .text deform__11J3DDeformerFP15J3DVertexBufferUs
9584
*/
9685
void J3DDeformer::deform(J3DVertexBuffer* buffer, u16 param_1) {
97-
J3D_ASSERT(buffer != 0);
86+
J3D_ASSERT(222, buffer,"Error : null pointer");
9887

9988
u16 var_r31 = 0;
10089
if (mAnmCluster != NULL) {
@@ -115,6 +104,7 @@ void J3DDeformer::deform(J3DVertexBuffer* buffer, u16 param_1) {
115104
* deform_VtxPosF32__11J3DDeformerFP15J3DVertexBufferP10J3DClusterP13J3DClusterKeyPf */
116105
void J3DDeformer::deform_VtxPosF32(J3DVertexBuffer* i_buffer, J3DCluster* i_cluster,
117106
J3DClusterKey* i_key, f32* i_weights) {
107+
J3DClusterKey* key;
118108
int posNum = i_cluster->mPosNum;
119109
int keyNum = i_cluster->mKeyNum;
120110
f32* vtxPosArray = (f32*)i_buffer->getVtxPosArrayPointer(0);
@@ -129,18 +119,22 @@ void J3DDeformer::deform_VtxPosF32(J3DVertexBuffer* i_buffer, J3DCluster* i_clus
129119
}
130120

131121
f32 local_58[2] = {1.0f, -1.0f};
132-
122+
133123
for (u16 i = 0; i < posNum; i++) {
134124
int index = i_cluster->field_0x18[i] * 3;
135125
for (u16 j = 0; j < keyNum; j++) {
136-
int uVar7 = ((u16*)i_key[j].field_0x4)[i];
137-
f32* deform = &deformVtxPos[(uVar7 & ~0xE000) * 3];
138-
f32 deform0 = deform[0];
139-
f32 deform1 = deform[1];
140-
f32 deform2 = deform[2];
141-
deform0 *= local_58[((uVar7 & 0x8000) >> 0xF)];
142-
deform1 *= local_58[((uVar7 & 0x4000) >> 0xE)];
143-
deform2 *= local_58[((uVar7 & 0x2000) >> 0xD)];
126+
int uVar8;
127+
int uVar7;
128+
key = &i_key[j];
129+
uVar8 = uVar7 = ((u16*)key->field_0x4)[i];
130+
uVar7 &= ~0xE000;
131+
uVar7 *= 3;
132+
f32 deform0 = deformVtxPos[uVar7];
133+
f32 deform1 = deformVtxPos[uVar7 + 1];
134+
f32 deform2 = deformVtxPos[uVar7 + 2];
135+
deform0 *= local_58[((uVar8 & 0x8000) >> 0xF)];
136+
deform1 *= local_58[((uVar8 & 0x4000) >> 0xE)];
137+
deform2 *= local_58[((uVar8 & 0x2000) >> 0xD)];
144138
vtxPosArray[index] += deform0 * i_weights[j];
145139
vtxPosArray[index + 1] += deform1 * i_weights[j];
146140
vtxPosArray[index + 2] += deform2 * i_weights[j];
@@ -165,26 +159,30 @@ void J3DDeformer::deform_VtxNrmF32(J3DVertexBuffer* i_buffer, J3DCluster* i_clus
165159
iVar13[index + 1] = 0.0f;
166160
iVar13[index + 2] = 0.0f;
167161
for (u16 j = 0; j < keyNum; j++) {
168-
int uVar3 = ((u16*)i_key[j].field_0x8)[i];
169-
f32 deform0, deform1, deform2;
170-
if (uVar3 & 0x8000) {
171-
deform0 = -deformVtxNrm[(uVar3 & ~0xE000) * 3];
162+
J3DClusterKey* key = &i_key[j];
163+
int uVar3 = ((u16*)key->field_0x8)[i];
164+
int uVar4 = uVar3;
165+
uVar3 &= ~0xE000;
166+
uVar3 *= 3;
167+
Vec deform0;
168+
if (uVar4 & 0x8000) {
169+
deform0.x = -deformVtxNrm[uVar3];
172170
} else {
173-
deform0 = deformVtxNrm[(uVar3 & ~0xE000) * 3];
171+
deform0.x = deformVtxNrm[uVar3];
174172
}
175-
if (uVar3 & 0x4000) {
176-
deform1 = -deformVtxNrm[(uVar3 & ~0xE000) * 3 + 1];
173+
if (uVar4 & 0x4000) {
174+
deform0.y = -deformVtxNrm[uVar3 + 1];
177175
} else {
178-
deform1 = deformVtxNrm[(uVar3 & ~0xE000) * 3 + 1];
176+
deform0.y = deformVtxNrm[uVar3 + 1];
179177
}
180-
if (uVar3 & 0x2000) {
181-
deform2 = -deformVtxNrm[(uVar3 & ~0xE000) * 3 + 2];
178+
if (uVar4 & 0x2000) {
179+
deform0.z = -deformVtxNrm[uVar3 + 2];
182180
} else {
183-
deform2 = deformVtxNrm[(uVar3 & ~0xE000) * 3 + 2];
181+
deform0.z = deformVtxNrm[uVar3 + 2];
184182
}
185-
iVar13[index] += deform0 * i_weights[j];
186-
iVar13[index + 1] += deform1 * i_weights[j];
187-
iVar13[index + 2] += deform2 * i_weights[j];
183+
iVar13[index] += deform0.x * i_weights[j];
184+
iVar13[index + 1] += deform0.y * i_weights[j];
185+
iVar13[index + 2] += deform0.z * i_weights[j];
188186
}
189187
normalize(&iVar13[index]);
190188
}
@@ -210,7 +208,8 @@ void J3DDeformer::deform_VtxNrmF32(J3DVertexBuffer* i_buffer, J3DCluster* i_clus
210208
continue;
211209
}
212210
int index = tmp * 3;
213-
int index2 = clusterVtx->field_0x4[j] * 3;
211+
u16 iVar4 = clusterVtx->field_0x4[j];
212+
int index2 = iVar4 * 3;
214213

215214
f32 dot = vec.x * iVar13[index2] + vec.y * iVar13[index2 + 1]
216215
+ vec.z * iVar13[index2 + 2];
@@ -228,18 +227,17 @@ void J3DDeformer::deform_VtxNrmF32(J3DVertexBuffer* i_buffer, J3DCluster* i_clus
228227
vtxNrmArray[index + 1] = vec.y;
229228
vtxNrmArray[index + 2] = vec.z;
230229
} else if (angle > i_cluster->mMaxAngle) {
231-
int index3 = clusterVtx->field_0x4[j];
232-
Vec* iVar13a = (Vec*)iVar13;
233-
vtxNrmArray[index] = iVar13a[index3].x;
234-
vtxNrmArray[index + 1] = iVar13a[index3].y;
235-
vtxNrmArray[index + 2] = iVar13a[index3].z;
230+
vtxNrmArray[index] = iVar13[iVar4 * 3];
231+
vtxNrmArray[index + 1] = iVar13[iVar4 * 3 + 1];
232+
vtxNrmArray[index + 2] = iVar13[iVar4 * 3 + 2];
236233
} else {
237-
f32 weight1 = (angle - i_cluster->mMinAngle)
234+
f32 weights[2];
235+
weights[0] = (angle - i_cluster->mMinAngle)
238236
/ (i_cluster->mMaxAngle - i_cluster->mMinAngle);
239-
f32 weight2 = 1.0f - weight1;
240-
vtxNrmArray[index] = weight1 * iVar13[index2] + weight2 * vec.x;
241-
vtxNrmArray[index + 1] = weight1 * iVar13[index2 + 1] + weight2 * vec.y;
242-
vtxNrmArray[index + 2] = weight1 * iVar13[index2 + 2] + weight2 * vec.z;
237+
weights[1] = 1.0f - weights[0];
238+
vtxNrmArray[index] = weights[0] * iVar13[index2] + weights[1] * vec.x;
239+
vtxNrmArray[index + 1] = weights[0] * iVar13[index2 + 1] + weights[1] * vec.y;
240+
vtxNrmArray[index + 2] = weights[0] * iVar13[index2 + 2] + weights[1] * vec.z;
243241
}
244242
}
245243
}

0 commit comments

Comments
 (0)