This commit is contained in:
Caroline Madsen
2024-10-15 16:59:31 -04:00
committed by GitHub
parent 9895999b7b
commit 9f58034704
26 changed files with 1502 additions and 1647 deletions
File diff suppressed because it is too large Load Diff
+153 -87
View File
@@ -6,7 +6,8 @@
#include "JSystem/J3DGraphAnimator/J3DCluster.h"
#include "JSystem/J3DGraphAnimator/J3DAnimation.h"
#include "JSystem/J3DGraphAnimator/J3DModel.h"
#include "dol2asm.h"
#include "JSystem/JMath/JMATrigonometric.h"
#include "dolphin/base/PPCArch.h"
#include "dolphin/os.h"
#ifdef DEBUG
@@ -20,42 +21,6 @@
#define J3D_ASSERT(COND)
#endif
//
// Forward References:
//
extern "C" void __ct__13J3DDeformDataFv();
extern "C" void offAllFlag__13J3DDeformDataFUl();
extern "C" void deform__13J3DDeformDataFP8J3DModel();
extern "C" void deform__13J3DDeformDataFP15J3DVertexBuffer();
extern "C" void setAnm__13J3DDeformDataFP13J3DAnmCluster();
extern "C" void __ct__11J3DDeformerFP13J3DDeformData();
extern "C" void deform__11J3DDeformerFP15J3DVertexBufferUs();
extern "C" void deform_VtxPosF32__11J3DDeformerFP15J3DVertexBufferP10J3DClusterP13J3DClusterKeyPf();
extern "C" void deform_VtxNrmF32__11J3DDeformerFP15J3DVertexBufferP10J3DClusterP13J3DClusterKeyPf();
extern "C" void deform__11J3DDeformerFP15J3DVertexBufferUsPf();
extern "C" void normalizeWeight__11J3DDeformerFiPf();
//
// External References:
//
extern "C" void PPCSync();
extern "C" void __cvt_fp2unsigned();
extern "C" void _savegpr_21();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _savegpr_29();
extern "C" void _restgpr_21();
extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" void _restgpr_29();
extern "C" f32 asinAcosTable___5JMath[1032];
//
// Declarations:
//
/* 8032E1F8-8032E230 328B38 0038+00 0/0 1/1 0/0 .text __ct__13J3DDeformDataFv */
J3DDeformData::J3DDeformData() {
mClusterNum = 0;
@@ -145,68 +110,169 @@ void J3DDeformer::deform(J3DVertexBuffer* buffer, u16 param_1) {
}
}
/* ############################################################################################## */
/* 80456470-80456474 004A70 0004+00 2/2 0/0 0/0 .sdata2 @830 */
SECTION_SDATA2 static f32 lit_830 = 1.0f;
/* 80456474-80456478 004A74 0004+00 1/1 0/0 0/0 .sdata2 @840 */
SECTION_SDATA2 static f32 lit_840 = 1.0f;
/* 80456478-8045647C 004A78 0004+00 1/1 0/0 0/0 .sdata2 None */
SECTION_SDATA2 static f32 data_80456478 = -1.0f;
/* 8045647C-80456480 004A7C 0004+00 3/3 0/0 0/0 .sdata2 @866 */
SECTION_SDATA2 static u8 lit_866[4] = {
0x00,
0x00,
0x00,
0x00,
};
/* 8032E4A4-8032E60C 328DE4 0168+00 1/1 0/0 0/0 .text
* deform_VtxPosF32__11J3DDeformerFP15J3DVertexBufferP10J3DClusterP13J3DClusterKeyPf */
void J3DDeformer::deform_VtxPosF32(J3DVertexBuffer* param_0, J3DCluster* param_1,
J3DClusterKey* param_2, f32* param_3) {
// NONMATCHING
void J3DDeformer::deform_VtxPosF32(J3DVertexBuffer* i_buffer, J3DCluster* i_cluster,
J3DClusterKey* i_key, f32* i_weights) {
int posNum = i_cluster->mPosNum;
int keyNum = i_cluster->mKeyNum;
f32* vtxPosArray = (f32*)i_buffer->getVtxPosArrayPointer(0);
f32* deformVtxPos = mDeformData->getVtxPos();
u16* iVar9 = i_cluster->field_0x18;
for (int i = 0; i < posNum; i++) {
int index = iVar9[i] * 3;
vtxPosArray[index] = 0.0f;
vtxPosArray[index + 1] = 0.0f;
vtxPosArray[index + 2] = 0.0f;
}
f32 local_58[2] = {1.0f, -1.0f};
for (u16 i = 0; i < posNum; i++) {
int index = i_cluster->field_0x18[i] * 3;
for (u16 j = 0; j < keyNum; j++) {
int uVar7 = ((u16*)i_key[j].field_0x4)[i];
f32* deform = &deformVtxPos[(uVar7 & ~0xE000) * 3];
f32 deform0 = deform[0];
f32 deform1 = deform[1];
f32 deform2 = deform[2];
deform0 *= local_58[((uVar7 & 0x8000) >> 0xF)];
deform1 *= local_58[((uVar7 & 0x4000) >> 0xE)];
deform2 *= local_58[((uVar7 & 0x2000) >> 0xD)];
vtxPosArray[index] += deform0 * i_weights[j];
vtxPosArray[index + 1] += deform1 * i_weights[j];
vtxPosArray[index + 2] += deform2 * i_weights[j];
}
}
}
/* ############################################################################################## */
/* 80456480-80456484 004A80 0004+00 1/1 0/0 0/0 .sdata2 @1020 */
SECTION_SDATA2 static f32 lit_1020 = -1.0f;
/* 80456484-80456488 004A84 0004+00 1/1 0/0 0/0 .sdata2 @1021 */
SECTION_SDATA2 static f32 lit_1021 = 3.1415927410125732f;
/* 80456488-8045648C 004A88 0004+00 1/1 0/0 0/0 .sdata2 @1022 */
SECTION_SDATA2 static f32 lit_1022 = 1023.5f;
/* 8045648C-80456490 004A8C 0004+00 1/1 0/0 0/0 .sdata2 @1023 */
SECTION_SDATA2 static f32 lit_1023 = 1.5707963705062866f;
/* 80456490-80456494 004A90 0004+00 1/1 0/0 0/0 .sdata2 @1024 */
SECTION_SDATA2 static f32 lit_1024 = 57.2957763671875f;
/* 80456494-80456498 004A94 0004+00 1/1 0/0 0/0 .sdata2 @1025 */
SECTION_SDATA2 static f32 lit_1025 = 180.0f;
/* 80456498-804564A0 004A98 0008+00 1/1 0/0 0/0 .sdata2 @1027 */
SECTION_SDATA2 static f64 lit_1027 = 4503599627370496.0 /* cast u32 to float */;
/* 8032E60C-8032EAB4 328F4C 04A8+00 1/1 0/0 0/0 .text
* deform_VtxNrmF32__11J3DDeformerFP15J3DVertexBufferP10J3DClusterP13J3DClusterKeyPf */
void J3DDeformer::deform_VtxNrmF32(J3DVertexBuffer* param_0, J3DCluster* param_1,
J3DClusterKey* param_2, f32* param_3) {
// NONMATCHING
// NONMATCHING one missing mr
void J3DDeformer::deform_VtxNrmF32(J3DVertexBuffer* i_buffer, J3DCluster* i_cluster,
J3DClusterKey* i_key, f32* i_weights) {
f32* vtxNrmArray = (f32*)i_buffer->getVtxNrmArrayPointer(0);
f32* deformVtxNrm = mDeformData->getVtxNrm();
f32* iVar13 = field_0xc;
u16 keyNum = i_cluster->mKeyNum;
int uVar2 = i_cluster->field_0x16;
for (u16 i = 0; i < i_cluster->field_0x14; i++) {
int index = i * 3;
iVar13[index] = 0.0f;
iVar13[index + 1] = 0.0f;
iVar13[index + 2] = 0.0f;
for (u16 j = 0; j < keyNum; j++) {
int uVar3 = ((u16*)i_key[j].field_0x8)[i];
f32 deform0, deform1, deform2;
if (uVar3 & 0x8000) {
deform0 = -deformVtxNrm[(uVar3 & ~0xE000) * 3];
} else {
deform0 = deformVtxNrm[(uVar3 & ~0xE000) * 3];
}
if (uVar3 & 0x4000) {
deform1 = -deformVtxNrm[(uVar3 & ~0xE000) * 3 + 1];
} else {
deform1 = deformVtxNrm[(uVar3 & ~0xE000) * 3 + 1];
}
if (uVar3 & 0x2000) {
deform2 = -deformVtxNrm[(uVar3 & ~0xE000) * 3 + 2];
} else {
deform2 = deformVtxNrm[(uVar3 & ~0xE000) * 3 + 2];
}
iVar13[index] += deform0 * i_weights[j];
iVar13[index + 1] += deform1 * i_weights[j];
iVar13[index + 2] += deform2 * i_weights[j];
}
normalize(&iVar13[index]);
}
for (u16 i = 0; i < uVar2; i++) {
J3DClusterVertex* clusterVtx = &i_cluster->mClusterVertex[i];
Vec vec;
vec.x = 0.0f;
vec.y = 0.0f;
vec.z = 0.0f;
f32 scale = 1.0f / clusterVtx->mNum;
for (u16 j = 0; j < clusterVtx->mNum; j++) {
int index = clusterVtx->field_0x4[j] * 3;
vec.x += scale * iVar13[index];
vec.y += scale * iVar13[index + 1];
vec.z += scale * iVar13[index + 2];
}
normalize((f32*)&vec);
for (u16 j = 0; j < clusterVtx->mNum; j++) {
u16 tmp = clusterVtx->field_0x8[j];
if (tmp == 0xffff) {
continue;
}
int index = tmp * 3;
int index2 = clusterVtx->field_0x4[j] * 3;
f32 dot = vec.x * iVar13[index2] + vec.y * iVar13[index2 + 1]
+ vec.z * iVar13[index2 + 2];
f32 angle;
if (dot >= 1.0f) {
angle = 0.0f;
} else if (dot > -1.0f) {
angle = JMath::acosDegree(dot);
} else {
angle = 180.0f;
}
if (angle <= i_cluster->mMinAngle) {
vtxNrmArray[index] = vec.x;
vtxNrmArray[index + 1] = vec.y;
vtxNrmArray[index + 2] = vec.z;
} else if (angle > i_cluster->mMaxAngle) {
int index3 = clusterVtx->field_0x4[j];
Vec* iVar13a = (Vec*)iVar13;
vtxNrmArray[index] = iVar13a[index3].x;
vtxNrmArray[index + 1] = iVar13a[index3].y;
vtxNrmArray[index + 2] = iVar13a[index3].z;
} else {
f32 weight1 = (angle - i_cluster->mMinAngle)
/ (i_cluster->mMaxAngle - i_cluster->mMinAngle);
f32 weight2 = 1.0f - weight1;
vtxNrmArray[index] = weight1 * iVar13[index2] + weight2 * vec.x;
vtxNrmArray[index + 1] = weight1 * iVar13[index2 + 1] + weight2 * vec.y;
vtxNrmArray[index + 2] = weight1 * iVar13[index2 + 2] + weight2 * vec.z;
}
}
}
}
/* 8032EAB4-8032EBCC 3293F4 0118+00 1/1 0/0 0/0 .text deform__11J3DDeformerFP15J3DVertexBufferUsPf
*/
void J3DDeformer::deform(J3DVertexBuffer* param_0, u16 param_1, f32* param_2) {
// NONMATCHING
void J3DDeformer::deform(J3DVertexBuffer* i_buffer, u16 param_1, f32* i_weights) {
if (checkFlag(2) && i_buffer->getVertexData()->getVtxPosType() == 4) {
J3DCluster* cluster = mDeformData->getClusterPointer(param_1);
u16 offset = 0;
for (u16 i = 0; i < param_1; i++) {
offset += mDeformData->getClusterPointer(i)->mKeyNum + 1;
}
J3DClusterKey* clusterKey = mDeformData->getClusterKeyPointer(offset);
normalizeWeight(cluster->mKeyNum, i_weights);
deform_VtxPosF32(i_buffer, cluster, clusterKey, i_weights);
if (checkFlag(1) && cluster->mFlags != 0 && i_buffer->getVertexData()->getVtxNrmType() == 4)
{
deform_VtxNrmF32(i_buffer, cluster, clusterKey, i_weights);
}
}
}
/* 8032EBCC-8032EC28 32950C 005C+00 1/1 0/0 0/0 .text normalizeWeight__11J3DDeformerFiPf
*/
void J3DDeformer::normalizeWeight(int param_0, f32* param_1) {
// NONMATCHING
void J3DDeformer::normalizeWeight(int i_keyNum, f32* i_weights) {
f32 totalWeight = 0.0f;
for (u16 i = 0; i < i_keyNum; i++) {
totalWeight += i_weights[i];
}
f32 scale = 1.0f / totalWeight;
for (u16 i = 0; i < i_keyNum; i++) {
i_weights[i] *= scale;
}
}
@@ -4,7 +4,6 @@
#include "JSystem/J3DGraphBase/J3DDrawBuffer.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "JSystem/JMath/JMath.h"
#include "dol2asm.h"
#include "m_Do/m_Do_mtx.h"
/* 8032EC28-8032ECAC 329568 0084+00 0/0 1/1 0/0 .text
@@ -6,9 +6,9 @@
/* 80325A18-80325A9C 320358 0084+00 0/0 1/1 0/0 .text __ct__12J3DJointTreeFv */
J3DJointTree::J3DJointTree()
: mHierarchy(NULL), mFlags(0), mModelDataType(0), mRootNode(NULL), mBasicMtxCalc(NULL),
mJointNodePointer(NULL), mJointNum(0), mWEvlpMtxNum(0), mWEvlpMixMtxNum(0), mWEvlpMixIndex(0),
mWEvlpMixWeight(0), mInvJointMtx(NULL), mWEvlpImportantMtxIdx(0), field_0x40(0),
mJointName(NULL) {}
mJointNodePointer(NULL), mJointNum(0), mWEvlpMtxNum(0), mWEvlpMixMtxNum(0),
mWEvlpMixMtxIndex(0), mWEvlpMixWeight(0), mInvJointMtx(NULL), mWEvlpImportantMtxIdx(0),
field_0x40(0), mJointName(NULL) {}
/* 80325A9C-80325C00 3203DC 0164+00 1/0 2/2 0/0 .text
* makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable
@@ -86,7 +86,7 @@ void J3DJointTree::findImportantMtxIndex() {
const s32 wEvlpMtxNum = getWEvlpMtxNum();
u32 tableIdx = 0;
const u16 drawFullWgtMtxNum = getDrawFullWgtMtxNum();
const u16 * wEvlpMixIndex = getWEvlpMixIndex();
const u16 * wEvlpMixIndex = getWEvlpMixMtxIndex();
const f32 * wEvlpMixWeight = getWEvlpMixWeight();
u16 * wEvlpImportantMtxIdx = getWEvlpImportantMtxIndex();
@@ -132,6 +132,3 @@ void J3DJointTree::calc(J3DMtxBuffer* pMtxBuffer, Vec const& scale, f32 const (&
void J3DMtxCalc::setMtxBuffer(J3DMtxBuffer* mtxBuffer) {
J3DMtxCalc::mMtxBuffer = mtxBuffer;
}
/* 80325D24-80325D88 320664 0064+00 1/0 0/0 0/0 .text __dt__12J3DJointTreeFv */
J3DJointTree::~J3DJointTree() {}
@@ -7,46 +7,6 @@
#include "JSystem/J3DGraphAnimator/J3DMaterialAnm.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "dolphin/types.h"
//
// Forward References:
//
extern "C" void clear__16J3DMaterialTableFv();
extern "C" void __ct__16J3DMaterialTableFv();
extern "C" void __dt__16J3DMaterialTableFv();
extern "C" void removeMatColorAnimator__16J3DMaterialTableFP11J3DAnmColor();
extern "C" void removeTexNoAnimator__16J3DMaterialTableFP16J3DAnmTexPattern();
extern "C" void removeTexMtxAnimator__16J3DMaterialTableFP19J3DAnmTextureSRTKey();
extern "C" void removeTevRegAnimator__16J3DMaterialTableFP15J3DAnmTevRegKey();
extern "C" void createTexMtxForAnimator__16J3DMaterialTableFP19J3DAnmTextureSRTKey();
extern "C" void entryMatColorAnimator__16J3DMaterialTableFP11J3DAnmColor();
extern "C" void entryTexNoAnimator__16J3DMaterialTableFP16J3DAnmTexPattern();
extern "C" void entryTexMtxAnimator__16J3DMaterialTableFP19J3DAnmTextureSRTKey();
extern "C" void entryTevRegAnimator__16J3DMaterialTableFP15J3DAnmTevRegKey();
//
// External References:
//
extern "C" void* __nw__FUl();
extern "C" void __dl__FPv();
extern "C" void __as__13J3DTexMtxInfoFRC13J3DTexMtxInfo();
extern "C" void setMatColorAnm__14J3DMaterialAnmFiP14J3DMatColorAnm();
extern "C" void setTexMtxAnm__14J3DMaterialAnmFiP12J3DTexMtxAnm();
extern "C" void setTexNoAnm__14J3DMaterialAnmFiP11J3DTexNoAnm();
extern "C" void setTevColorAnm__14J3DMaterialAnmFiP14J3DTevColorAnm();
extern "C" void setTevKColorAnm__14J3DMaterialAnmFiP15J3DTevKColorAnm();
extern "C" void _savegpr_22();
extern "C" void _savegpr_24();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _restgpr_22();
extern "C" void _restgpr_24();
extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" extern void* __vt__11J3DTexNoAnm[3];
/* 8032F5A8-8032F5D0 329EE8 0028+00 0/0 1/1 0/0 .text clear__16J3DMaterialTableFv */
void J3DMaterialTable::clear() {
@@ -250,8 +210,7 @@ int J3DMaterialTable::entryTexNoAnimator(J3DAnmTexPattern* param_1) {
/* 8032FCC4-8032FE70 32A604 01AC+00 0/0 14/14 6/6 .text
* entryTexMtxAnimator__16J3DMaterialTableFP19J3DAnmTextureSRTKey */
// getUpdateTexMtxID u8 issue / getSRTCenter
#ifdef NONMATCHING
// NONMATCHING getUpdateTexMtxID u8 issue
int J3DMaterialTable::entryTexMtxAnimator(J3DAnmTextureSRTKey* param_1) {
int rv = 0;
u16 materialNum = param_1->getUpdateMaterialNum();
@@ -275,10 +234,13 @@ int J3DMaterialTable::entryTexMtxAnimator(J3DAnmTextureSRTKey* param_1) {
material->getTexCoord(texMtxID)->setTexGenMtx(texMtxID * 3 + 30);
}
J3DTexMtxInfo& iVar3 = material->getTexMtx(texMtxID)->getTexMtxInfo();
iVar3.mInfo = (iVar3.mInfo & 0x3f)| (param_1->getTexMtxCalcType() << 7);
iVar3.mCenter.x = param_1->getSRTCenter(i)->x;
iVar3.mCenter.y = param_1->getSRTCenter(i)->y;
iVar3.mCenter.z = param_1->getSRTCenter(i)->z;
iVar3.mInfo = (iVar3.mInfo & 0x3f) | (param_1->getTexMtxCalcType() << 7);
Vec* vec = param_1->getSRTCenter(i);
iVar3.mCenter.x = vec->x;
vec = param_1->getSRTCenter(i);
iVar3.mCenter.y = vec->y;
vec = param_1->getSRTCenter(i);
iVar3.mCenter.z = vec->z;
J3DTexMtxAnm texMtxAnm(i, param_1);
materialAnm->setTexMtxAnm(texMtxID, &texMtxAnm);
}
@@ -287,11 +249,6 @@ int J3DMaterialTable::entryTexMtxAnimator(J3DAnmTextureSRTKey* param_1) {
}
return rv;
}
#else
int J3DMaterialTable::entryTexMtxAnimator(J3DAnmTextureSRTKey* param_0) {
// NONMATCHING
}
#endif
/* 8032FE70-8032FFEC 32A7B0 017C+00 0/0 10/10 4/4 .text
* entryTevRegAnimator__16J3DMaterialTableFP15J3DAnmTevRegKey */
+7 -144
View File
@@ -6,106 +6,8 @@
#include "JSystem/J3DGraphAnimator/J3DModel.h"
#include "JSystem/J3DGraphAnimator/J3DMaterialAnm.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "dol2asm.h"
#include "dolphin/os.h"
//
// Forward References:
//
extern "C" void initialize__8J3DModelFv();
extern "C" void entryModelData__8J3DModelFP12J3DModelDataUlUl();
extern "C" void createShapePacket__8J3DModelFP12J3DModelData();
extern "C" void createMatPacket__8J3DModelFP12J3DModelDataUl();
extern "C" void newDifferedDisplayList__8J3DModelFUl();
extern "C" void lock__8J3DModelFv();
extern "C" void unlock__8J3DModelFv();
extern "C" void calcMaterial__8J3DModelFv();
extern "C" void calcDiffTexMtx__8J3DModelFv();
extern "C" void diff__8J3DModelFv();
extern "C" void setDeformData__8J3DModelFP13J3DDeformDataUl();
extern "C" void setSkinDeform__8J3DModelFP13J3DSkinDeformUl();
extern "C" void calcAnmMtx__8J3DModelFv();
extern "C" void calcWeightEnvelopeMtx__8J3DModelFv();
extern "C" void update__8J3DModelFv();
extern "C" void calc__8J3DModelFv();
extern "C" void entry__8J3DModelFv();
extern "C" void viewCalc__8J3DModelFv();
extern "C" void calcNrmMtx__8J3DModelFv();
extern "C" void calcBumpMtx__8J3DModelFv();
extern "C" void calcBBoardMtx__8J3DModelFv();
extern "C" void prepareShapePackets__8J3DModelFv();
extern "C" void __dt__8J3DModelFv();
extern "C" void __dt__12J3DMtxBufferFv();
//
// External References:
//
extern "C" void* __nw__FUl();
extern "C" void* __nwa__FUl();
extern "C" void __dl__FPv();
extern "C" void setVertexData__15J3DVertexBufferFP13J3DVertexData();
extern "C" void __dt__15J3DVertexBufferFv();
extern "C" void copyLocalVtxArray__15J3DVertexBufferFUl();
extern "C" void allocTransformedVtxPosArray__15J3DVertexBufferFv();
extern "C" void allocTransformedVtxNrmArray__15J3DVertexBufferFv();
extern "C" void single_To_Double__17J3DDisplayListObjFv();
extern "C" void newDisplayList__13J3DDrawPacketFUl();
extern "C" void newSingleDisplayList__13J3DDrawPacketFUl();
extern "C" void __ct__12J3DMatPacketFv();
extern "C" void __dt__12J3DMatPacketFv();
extern "C" void addShapePacket__12J3DMatPacketFP14J3DShapePacket();
extern "C" void __ct__14J3DShapePacketFv();
extern "C" void __dt__14J3DShapePacketFv();
extern "C" void newDifferedDisplayList__14J3DShapePacketFUl();
extern "C" void calcNBTScale__8J3DShapeFRC3VecPA3_A3_fPA3_A3_f();
extern "C" void countDLSize__11J3DMaterialFv();
extern "C" void newSharedDisplayList__11J3DMaterialFUl();
extern "C" void newSingleSharedDisplayList__11J3DMaterialFUl();
extern "C" void syncJ3DSysFlags__12J3DModelDataCFv();
extern "C" void initialize__12J3DMtxBufferFv();
extern "C" void create__12J3DMtxBufferFP12J3DModelDataUl();
extern "C" void calcWeightEnvelopeMtx__12J3DMtxBufferFv();
extern "C" void calcDrawMtx__12J3DMtxBufferFUlRC3VecRA3_A4_Cf();
extern "C" void calcNrmMtx__12J3DMtxBufferFv();
extern "C" void calcBBoardMtx__12J3DMtxBufferFv();
extern "C" void J3DCalcViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f();
extern "C" void initSkinInfo__13J3DSkinDeformFP12J3DModelData();
extern "C" void initMtxIndexArray__13J3DSkinDeformFP12J3DModelData();
extern "C" void changeFastSkinDL__13J3DSkinDeformFP12J3DModelData();
extern "C" void transformVtxPosNrm__13J3DSkinDeformFP12J3DModelData();
extern "C" void deform__13J3DSkinDeformFP8J3DModel();
extern "C" void calc__15J3DVtxColorCalcFP8J3DModel();
extern "C" void offAllFlag__13J3DDeformDataFUl();
extern "C" void deform__13J3DDeformDataFP8J3DModel();
extern "C" void entryIn__8J3DJointFv();
extern "C" void __construct_new_array();
extern "C" void _savegpr_23();
extern "C" void _savegpr_25();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_23();
extern "C" void _restgpr_25();
extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
//
// Declarations:
//
/* ############################################################################################## */
/* 80456428-80456430 004A28 0004+04 1/1 0/0 0/0 .sdata2 @896 */
SECTION_SDATA2 static f32 lit_896[1 + 1 /* padding */] = {
1.0f,
/* padding */
0.0f,
};
/* 80327100-80327184 321A40 0084+00 0/0 3/3 0/0 .text initialize__8J3DModelFv */
void J3DModel::initialize() {
mModelData = NULL;
@@ -131,27 +33,6 @@ void J3DModel::initialize() {
mUnkCalc2 = NULL;
}
/* ############################################################################################## */
/* 803CED20-803CED44 02BE40 0024+00 1/1 3/3 0/0 .data __vt__8J3DModel */
SECTION_DATA extern void* __vt__8J3DModel[9] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)update__8J3DModelFv,
(void*)entry__8J3DModelFv,
(void*)calc__8J3DModelFv,
(void*)calcMaterial__8J3DModelFv,
(void*)calcDiffTexMtx__8J3DModelFv,
(void*)viewCalc__8J3DModelFv,
(void*)__dt__8J3DModelFv,
};
/* 803CED44-803CED50 02BE64 000C+00 2/2 0/0 0/0 .data __vt__12J3DMtxBuffer */
SECTION_DATA extern void* __vt__12J3DMtxBuffer[3] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__12J3DMtxBufferFv,
};
/* 80327184-80327300 321AC4 017C+00 0/0 3/3 0/0 .text
* entryModelData__8J3DModelFP12J3DModelDataUlUl */
s32 J3DModel::entryModelData(J3DModelData* p_modelData, u32 modelFlag, u32 mtxBufferFlag) {
@@ -373,38 +254,29 @@ void J3DModel::calcMaterial() {
}
/* 80327858-803279A0 322198 0148+00 1/0 0/0 0/0 .text calcDiffTexMtx__8J3DModelFv */
#if defined NON_MATCHING
// NONMATCHING regalloc
void J3DModel::calcDiffTexMtx() {
// regalloc
j3dSys.setModel(this);
u16 num;
num = getModelData()->getMaterialNum();
for (u16 i = 0; i < num; i++) {
j3dSys.setMatPacket(getMatPacket(i));
J3DMaterial* materialNode = getModelData()->getMaterialNodePointer(i);
for (u16 num = mModelData->getMaterialNum(), i = 0; i < num; i++) {
j3dSys.setMatPacket(&mMatPacket[i]);
J3DMaterial* materialNode = mModelData->getMaterialNodePointer(i);
materialNode->calcDiffTexMtx(getAnmMtx(materialNode->getJoint()->getJntNo()));
}
num = getModelData()->getShapeNum();
for (u16 i = 0; i < num; i++) {
for (u16 num = mModelData->getShapeNum(), i = 0; i < num; i++) {
J3DShapePacket* shapePacket = getShapePacket(i);
J3DTexGenBlock* texGenBlock =
getModelData()->getShapeNodePointer(i)->getMaterial()->getTexGenBlock();
mModelData->getShapeNodePointer(i)->getMaterial()->getTexGenBlock();
for (u16 j = 0; (int)j < 8; j++) {
J3DTexMtx* texMtxNode = texGenBlock->getTexMtx(j);
J3DTexMtxObj* texMtxObj = shapePacket->getTexMtxObj();
if (texMtxNode != NULL && texMtxObj != NULL) {
MTXCopy(texMtxNode->getMtx(), texMtxObj->getMtx(j));
texMtxObj->setMtx(j, &texMtxNode->getMtx());
}
}
}
}
#else
void J3DModel::calcDiffTexMtx() {
// NONMATCHING
}
#endif
/* 803279A0-80327A2C 3222E0 008C+00 0/0 2/2 0/0 .text diff__8J3DModelFv */
void J3DModel::diff() {
@@ -668,12 +540,3 @@ void J3DModel::prepareShapePackets() {
}
}
}
/* 80328350-803283B4 322C90 0064+00 1/0 0/0 0/0 .text __dt__8J3DModelFv */
J3DModel::~J3DModel() {}
/* 803283B4-803283FC 322CF4 0048+00 1/0 0/0 0/0 .text __dt__12J3DMtxBufferFv */
extern "C" void __dt__12J3DMtxBufferFv() {
// asm J3DMtxBuffer::~J3DMtxBuffer() {
// NONMATCHING
}
@@ -6,47 +6,8 @@
#include "JSystem/J3DGraphAnimator/J3DModelData.h"
#include "JSystem/J3DGraphAnimator/J3DMaterialAnm.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "dol2asm.h"
#include "dolphin/os.h"
//
// Forward References:
//
extern "C" void clear__12J3DModelDataFv();
extern "C" void __ct__12J3DModelDataFv();
extern "C" void newSharedDisplayList__12J3DModelDataFUl();
extern "C" void indexToPtr__12J3DModelDataFv();
extern "C" void makeSharedDL__12J3DModelDataFv();
extern "C" void simpleCalcMaterial__12J3DModelDataFUsPA4_f();
extern "C" void syncJ3DSysPointers__12J3DModelDataCFv();
extern "C" void syncJ3DSysFlags__12J3DModelDataCFv();
extern "C" void __dt__13J3DShapeTableFv();
extern "C" void __dt__12J3DModelDataFv();
//
// External References:
//
extern "C" void __dl__FPv();
extern "C" void __ct__13J3DVertexDataFv();
extern "C" void __dt__14J3DDrawMtxDataFv();
extern "C" void countDLSize__11J3DMaterialFv();
extern "C" void newSharedDisplayList__11J3DMaterialFUl();
extern "C" void newSingleSharedDisplayList__11J3DMaterialFUl();
extern "C" void __ct__12J3DJointTreeFv();
extern "C" void __ct__16J3DMaterialTableFv();
extern "C" void __dt__16J3DMaterialTableFv();
extern "C" void _savegpr_27();
extern "C" void _savegpr_29();
extern "C" void _restgpr_27();
extern "C" void _restgpr_29();
extern "C" extern void* __vt__12J3DJointTree[4 + 1 /* padding */];
//
// Declarations:
//
/* 80325D88-80325DA0 3206C8 0018+00 1/1 2/2 0/0 .text clear__12J3DModelDataFv */
void J3DModelData::clear() {
mpRawData = 0;
@@ -55,21 +16,6 @@ void J3DModelData::clear() {
mbHasBillboard = 0;
}
/* ############################################################################################## */
/* 803CED08-803CED14 02BE28 000C+00 3/3 0/0 0/0 .data __vt__13J3DShapeTable */
SECTION_DATA extern void* __vt__13J3DShapeTable[3] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__13J3DShapeTableFv,
};
/* 803CED14-803CED20 02BE34 000C+00 2/2 0/0 0/0 .data __vt__12J3DModelData */
SECTION_DATA extern void* __vt__12J3DModelData[3] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__12J3DModelDataFv,
};
/* 80325DA0-80325E14 3206E0 0074+00 0/0 2/2 0/0 .text __ct__12J3DModelDataFv */
J3DModelData::J3DModelData() {
clear();
@@ -169,14 +115,3 @@ void J3DModelData::syncJ3DSysFlags() const {
j3dSys.offFlag(J3DSysFlag_PostTexMtx);
}
}
/* 80326134-8032617C 320A74 0048+00 1/0 0/0 0/0 .text __dt__13J3DShapeTableFv */
extern "C" void __dt__13J3DShapeTableFv() {
// asm J3DShapeTable::~J3DShapeTable() {
// NONMATCHING
}
/* 8032617C-80326214 320ABC 0098+00 1/0 0/0 0/0 .text __dt__12J3DModelDataFv */
J3DModelData::~J3DModelData() {
// NONMATCHING
}
+147 -70
View File
@@ -4,55 +4,8 @@
//
#include "JSystem/J3DGraphAnimator/J3DMtxBuffer.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
//
// Forward References:
//
extern "C" void initialize__12J3DMtxBufferFv();
extern "C" void create__12J3DMtxBufferFP12J3DModelDataUl();
extern "C" void createAnmMtx__12J3DMtxBufferFP12J3DModelData();
extern "C" void createWeightEnvelopeMtx__12J3DMtxBufferFP12J3DModelData();
extern "C" void setNoUseDrawMtx__12J3DMtxBufferFv();
extern "C" void createDoubleDrawMtx__12J3DMtxBufferFP12J3DModelDataUl();
extern "C" void createBumpMtxArray__12J3DMtxBufferFP12J3DModelDataUl();
extern "C" void calcWeightEnvelopeMtx__12J3DMtxBufferFv();
extern "C" void calcDrawMtx__12J3DMtxBufferFUlRC3VecRA3_A4_Cf();
extern "C" void calcNrmMtx__12J3DMtxBufferFv();
extern "C" void calcBBoardMtx__12J3DMtxBufferFv();
extern "C" void J3DCalcViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f();
extern "C" u8 sNoUseDrawMtx__12J3DMtxBuffer[48];
extern "C" u8 sNoUseNrmMtx__12J3DMtxBuffer[36 + 4 /* padding */];
extern "C" void* sNoUseDrawMtxPtr__12J3DMtxBuffer;
extern "C" void* sNoUseNrmMtxPtr__12J3DMtxBuffer;
//
// External References:
//
extern "C" void* __nwa__FUl();
extern "C" void* __nwa__FUli();
extern "C" void J3DCalcBBoardMtx__FPA4_f();
extern "C" void J3DCalcYBBoardMtx__FPA4_f();
extern "C" void J3DPSCalcInverseTranspose__FPA4_fPA3_f();
extern "C" void J3DPSMtxArrayConcat__FPA4_fPA4_fPA4_fUl();
extern "C" void countBumpMtxNum__8J3DShapeCFv();
extern "C" void _savegpr_19();
extern "C" void _savegpr_24();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_19();
extern "C" void _restgpr_24();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
//
// Declarations:
//
/* 80326214-80326258 320B54 0044+00 0/0 1/1 0/0 .text initialize__12J3DMtxBufferFv */
void J3DMtxBuffer::initialize() {
@@ -156,7 +109,6 @@ s32 J3DMtxBuffer::createWeightEnvelopeMtx(J3DModelData* p_modelData) {
return kJ3DError_Success;
}
/* ############################################################################################## */
/* 804371C0-804371F0 063EE0 0030+00 1/0 0/0 0/0 .bss sNoUseDrawMtx__12J3DMtxBuffer */
Mtx J3DMtxBuffer::sNoUseDrawMtx;
@@ -226,13 +178,71 @@ s32 J3DMtxBuffer::createDoubleDrawMtx(J3DModelData* p_modelData, u32 num) {
/* 80326664-803268D4 320FA4 0270+00 1/1 0/0 0/0 .text
* createBumpMtxArray__12J3DMtxBufferFP12J3DModelDataUl */
s32 J3DMtxBuffer::createBumpMtxArray(J3DModelData* param_0, u32 param_1) {
// NONMATCHING
s32 J3DMtxBuffer::createBumpMtxArray(J3DModelData* i_modelData, u32 param_1) {
if (i_modelData->getModelDataType() == 0) {
u32 bumpMtxNum = 0;
u16 materialCount = 0;
u16 materialNum = i_modelData->getMaterialNum();
for (u16 j = 0; j < materialNum; j++) {
J3DMaterial* material = i_modelData->getMaterialNodePointer(j);
if (material->getNBTScale()->mbHasScale == true) {
bumpMtxNum += material->getShape()->countBumpMtxNum();
materialCount++;
}
}
if ((u16)bumpMtxNum != 0 && param_1 != 0) {
for (int i = 0; i < 2; i++) {
mpBumpMtxArr[i] = new Mtx33**[(u16)materialCount];
if (mpBumpMtxArr[i] == NULL) {
return kJ3DError_Alloc;
}
}
}
for (int i = 0; i < 2; i++) {
u32 offset = 0;
u16 materialNum = i_modelData->getMaterialNum();
for (u16 j = 0; j < materialNum; j++) {
J3DMaterial* material = i_modelData->getMaterialNodePointer(j);
if (material->getNBTScale()->mbHasScale == true) {
mpBumpMtxArr[i][offset] = new Mtx33*[param_1];
if (mpBumpMtxArr[i][offset] == NULL) {
return kJ3DError_Alloc;
}
material->getShape()->setBumpMtxOffset(offset);
offset++;
}
}
}
for (int i = 0; i < 2; i++) {
u32 offset = 0;
u16 materialNum = i_modelData->getMaterialNum();
for (u16 j = 0; j < materialNum; j++) {
J3DMaterial* material = i_modelData->getMaterialNodePointer(j);
if (material->getNBTScale()->mbHasScale == true) {
for (int k = 0; k < param_1; k++) {
mpBumpMtxArr[i][offset][k] = new (0x20) Mtx33[i_modelData->getDrawMtxNum()];
if (mpBumpMtxArr[i][offset][k] == NULL) {
return kJ3DError_Alloc;
}
}
offset++;
}
}
}
if (materialCount != 0) {
i_modelData->setBumpFlag(1);
}
}
return kJ3DError_Success;
}
/* ############################################################################################## */
/* 80450978-80450980 0003F8 0008+00 1/1 0/0 0/0 .sdata J3DUnit01 */
SECTION_SDATA static u8 J3DUnit01[8] = {
static u8 J3DUnit01[8] = {
0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00,
};
@@ -243,32 +253,99 @@ void J3DMtxBuffer::calcWeightEnvelopeMtx() {
/* 80326ACC-80326D3C 32140C 0270+00 0/0 1/1 0/0 .text
* calcDrawMtx__12J3DMtxBufferFUlRC3VecRA3_A4_Cf */
void J3DMtxBuffer::calcDrawMtx(u32 param_0, Vec const& param_1, f32 const (&param_2)[3][4]) {
// NONMATCHING
void J3DMtxBuffer::calcDrawMtx(u32 param_0, Vec const& param_1, Mtx const& param_2) {
MtxP viewMtx;
Mtx viewBaseMtx;
u16 fullWgtNum;
switch (param_0) {
case 0:
viewMtx = j3dSys.getViewMtx();
fullWgtNum = mJointTree->getDrawFullWgtMtxNum();
for (u16 i = 0; i < fullWgtNum; i++) {
MTXConcat(viewMtx, getAnmMtx(mJointTree->getDrawMtxIndex(i)), *getDrawMtx(i));
}
if (mJointTree->getDrawMtxNum() > fullWgtNum) {
J3DPSMtxArrayConcat(viewMtx, *mpWeightEvlpMtx, *getDrawMtx(fullWgtNum),
mJointTree->getWEvlpMtxNum());
}
break;
case 1:
fullWgtNum = mJointTree->getDrawFullWgtMtxNum();
for (u16 i = 0; i < fullWgtNum; i++) {
MTXCopy(getAnmMtx(mJointTree->getDrawMtxIndex(i)), *getDrawMtx(i));
}
fullWgtNum = mJointTree->getDrawFullWgtMtxNum();
for (u16 i = 0; i < fullWgtNum; i++) {
MTXCopy(getWeightAnmMtx(i), *getDrawMtx(mJointTree->getDrawFullWgtMtxNum() + i));
}
break;
case 2:
J3DCalcViewBaseMtx(j3dSys.getViewMtx(), param_1, param_2, viewBaseMtx);
fullWgtNum = mJointTree->getDrawFullWgtMtxNum();
for (u16 i = 0; i < fullWgtNum; i++) {
MTXConcat(viewBaseMtx, getAnmMtx(mJointTree->getDrawMtxIndex(i)), *getDrawMtx(i));
}
if (mJointTree->getDrawMtxNum() > mJointTree->getDrawFullWgtMtxNum()) {
J3DPSMtxArrayConcat(viewBaseMtx, *mpWeightEvlpMtx,
*getDrawMtx(mJointTree->getDrawFullWgtMtxNum()),
mJointTree->getWEvlpMtxNum());
}
break;
}
}
extern void J3DPSCalcInverseTranspose(Mtx p1, Mtx33 p2);
/* 80326D3C-80326EF0 32167C 01B4+00 0/0 1/1 0/0 .text calcNrmMtx__12J3DMtxBufferFv */
void J3DMtxBuffer::calcNrmMtx() {
// NONMATCHING
u16 drawMtxNum = mJointTree->getDrawMtxNum();
for (u16 i = 0; i < drawMtxNum; i++) {
if (mJointTree->getDrawMtxFlag(i) == 0) {
if (getScaleFlag(mJointTree->getDrawMtxIndex(i)) == 1) {
setNrmMtx(i, getDrawMtx(i));
} else {
J3DPSCalcInverseTranspose(*getDrawMtx(i), *getNrmMtx(i));
}
} else {
if (getEnvScaleFlag(mJointTree->getDrawMtxIndex(i)) == 1) {
setNrmMtx(i, getDrawMtx(i));
} else {
J3DPSCalcInverseTranspose(*getDrawMtx(i), *getNrmMtx(i));
}
}
}
}
/* ############################################################################################## */
/* 80456420-80456424 004A20 0004+00 1/1 0/0 0/0 .sdata2 @1320 */
SECTION_SDATA2 static f32 lit_1320 = 1.0f;
/* 80456424-80456428 004A24 0004+00 1/1 0/0 0/0 .sdata2 @1321 */
SECTION_SDATA2 static u8 lit_1321[4] = {
0x00,
0x00,
0x00,
0x00,
};
/* 80326EF0-80327048 321830 0158+00 0/0 1/1 0/0 .text calcBBoardMtx__12J3DMtxBufferFv */
void J3DMtxBuffer::calcBBoardMtx() {
// NONMATCHING
u16 drawMtxNum = mJointTree->getDrawMtxNum();
for (u16 i = 0; i < drawMtxNum; i++) {
if (mJointTree->getDrawMtxFlag(i) == 0) {
u16 index = mJointTree->getDrawMtxIndex(i);
if (mJointTree->getJointNodePointer(index)->getMtxType() == 1) {
MtxP drawMtx = *getDrawMtx(i);
J3DCalcBBoardMtx(drawMtx);
Mtx33* nrmMtx = getNrmMtx(i);
(*nrmMtx)[0][0] = 1.0f / drawMtx[0][0];
(*nrmMtx)[0][1] = 0.0f;
(*nrmMtx)[0][2] = 0.0f;
(*nrmMtx)[1][0] = 0.0f;
(*nrmMtx)[1][1] = 1.0f / drawMtx[1][1];
(*nrmMtx)[1][2] = 0.0f;
(*nrmMtx)[2][0] = 0.0f;
(*nrmMtx)[2][1] = 0.0f;
(*nrmMtx)[2][2] = 1.0f / drawMtx[2][2];
} else if (mJointTree->getJointNodePointer(index)->getMtxType() == 2) {
MtxP drawMtx = *getDrawMtx(i);
J3DCalcYBBoardMtx(drawMtx);
Mtx33* nrmMtx = getNrmMtx(i);
J3DPSCalcInverseTranspose(drawMtx, *nrmMtx);
}
}
}
}
/* 80327048-80327100 321988 00B8+00 1/1 1/1 0/0 .text
@@ -292,4 +369,4 @@ void J3DCalcViewBaseMtx(Mtx view, Vec const& scale, const Mtx& base, Mtx dst) {
m[2][3] = base[2][3];
MTXConcat(view, m, dst);
}
}