J3DModelData fakematch, J3DModel progress

This commit is contained in:
Jasper St. Pierre
2023-09-30 15:59:54 -07:00
parent 57e735af39
commit f90a89fd87
12 changed files with 139 additions and 107 deletions
+1 -1
View File
@@ -871,7 +871,7 @@ config.libs = [
JSystemLib(
"J3DGraphAnimator",
[
Object(NonMatching, "JSystem/J3DGraphAnimator/J3DModelData.cpp"),
Object(Matching, "JSystem/J3DGraphAnimator/J3DModelData.cpp"),
Object(NonMatching, "JSystem/J3DGraphAnimator/J3DModel.cpp"),
Object(NonMatching, "JSystem/J3DGraphAnimator/J3DAnimation.cpp"),
Object(NonMatching, "JSystem/J3DGraphAnimator/J3DMaterialAnm.cpp"),
@@ -99,6 +99,13 @@ public:
virtual void calc(u16 v) { J3DMtxCalcAnm::calc(v); }
};
enum J3DJointMtxType {
J3DJntMtxType_Normal,
J3DJntMtxType_BBoard,
J3DJntMtxType_YBBoard,
J3DJntMtxType_Multi,
};
class J3DJoint : public J3DNode {
public:
void initialize();
@@ -114,6 +121,8 @@ public:
J3DMaterial* getMesh() { return mMesh; }
u16 getJntNo() const { return mJntNo; }
u8 getKind() const { return mKind; }
u8 getMtxType() const { return getKind() >> 4; }
u8 getScaleCompensate() const { return mScaleCompensate; }
void setCurrentMtxCalc(J3DMtxCalc* pMtxCalc) { mCurrentMtxCalc = pMtxCalc; }
J3DTransformInfo& getTransformInfo() { return mTransformInfo; }
@@ -10,6 +10,8 @@ class JUTNameTab;
struct J3DModelHierarchy {
/* 0x0 */ u16 mType;
/* 0x2 */ u16 mValue;
inline u16 getValue() const { return mValue; }
};
class J3DMaterialTable;
@@ -35,7 +35,7 @@ public:
virtual ~J3DMaterialTable();
J3DMaterial* getMaterialNodePointer(u16 idx) const { return mMaterialNodePointer[idx]; }
J3DMaterial* getMaterialNodePointer(const u16 idx) const { return mMaterialNodePointer[idx]; }
J3DTexture* getTexture() const { return mTexture; }
JUTNameTab* getTextureName() const { return mTextureName; }
+6 -1
View File
@@ -105,14 +105,19 @@ public:
u32 getMtxCalcMode() const { return mFlags & 0x03; }
u32* getCurrentViewNoPtr() { return &mCurrentViewNo; }
u8* getScaleFlagArray() const { return mpScaleFlagArr; }
u8 getScaleFlag(u32 idx) const { return mpScaleFlagArr[idx]; }
u8 getEnvScaleFlag(u32 idx) const { return mpEvlpScaleFlagArr[idx]; }
J3DVertexBuffer* getVertexBuffer() const { return (J3DVertexBuffer*)&mVertexBuffer; }
J3DMatPacket* getMatPacket(u16 idx) const { return &mpMatPacket[idx]; }
J3DShapePacket* getShapePacket(u16 idx) const { return &mpShapePacket[idx]; }
Mtx** getDrawMtxPtrPtr() const { return mpDrawMtxBuf[1]; }
Mtx* getDrawMtxPtr() const { return mpDrawMtxBuf[1][mCurrentViewNo]; }
Mtx& getDrawMtx(u32 idx) const { return getDrawMtxPtr()[idx]; }
Mtx33** getNrmMtxPtrPtr() const { return mpNrmMtxBuf[1]; }
Mtx33* getNrmMtxPtr() const { return mpNrmMtxBuf[1][mCurrentViewNo]; }
Mtx33*** getBumpMtxPtrPtr() const { return mpBumpMtxArr[1]; }
Mtx33& getNrmMtx(u32 idx) const { return getNrmMtxPtr()[idx]; }
Mtx33** getBumpMtxPtrPtr(u32 idx) const { return mpBumpMtxArr[1][idx]; }
Mtx33* getBumpMtxPtr(u32 idx) const { return mpBumpMtxArr[1][idx][mCurrentViewNo]; }
void setBaseScale(const Vec& scale) { mBaseScale = scale; }
void setUserArea(u32 area) { mUserArea = area; }
u32 getUserArea() const { return mUserArea; }
@@ -55,6 +55,7 @@ public:
JUTNameTab* getTextureName() const { return mMaterialTable.getTextureName(); }
void setTexture(J3DTexture* pTexture) { mMaterialTable.setTexture(pTexture); }
void setTextureName(JUTNameTab* pTextureName) { mMaterialTable.setTextureName(pTextureName); }
u16 getDrawFullWgtMtxNum() const { return mJointTree.getDrawFullWgtMtxNum(); }
u16 getWEvlpMtxNum() const { return mJointTree.getWEvlpMtxNum(); }
u16* getWEvlpMixMtxIndex() const { return mJointTree.getWEvlpMixIndex(); }
f32* getWEvlpMixWeight() const { return mJointTree.getWEvlpMixWeight(); }
@@ -1,81 +0,0 @@
#ifndef J3DMTXBUFFER_H
#define J3DMTXBUFFER_H
#include "JSystem/J3DGraphAnimator/J3DModelData.h"
#include "dolphin/types.h"
class J3DModelData;
class J3DMtxBuffer {
public:
J3DMtxBuffer() { initialize(); }
void initialize();
s32 create(J3DModelData*, u32);
s32 createAnmMtx(J3DModelData*);
s32 createWeightEnvelopeMtx(J3DModelData*);
s32 setNoUseDrawMtx();
s32 createDoubleDrawMtx(J3DModelData*, u32);
s32 createBumpMtxArray(J3DModelData*, u32);
void calcWeightEnvelopeMtx();
void calcDrawMtx(u32, Vec const&, f32 const (&)[3][4]);
void calcNrmMtx();
void calcBBoardMtx();
MtxP getAnmMtx(int idx) const { return mpAnmMtx[idx]; }
void setAnmMtx(int i, Mtx m) { MTXCopy(m, (MtxP)mpAnmMtx[i]); }
MtxP getWeightAnmMtx(int idx) const { return mpWeightEvlpMtx[idx]; }
void setScaleFlag(int idx, u8 flag) { mpScaleFlagArr[idx] = flag; }
u32* getCurrentViewNoPtr() { return &mCurrentViewNo; }
u8* getScaleFlagArray() const { return mpScaleFlagArr; }
u8 getScaleFlag(int idx) const { return mpScaleFlagArr[idx]; }
u8 getEnvScaleFlag(int idx) const { return mpEvlpScaleFlagArr[idx]; }
Mtx** getDrawMtxPtrPtr() const { return mpDrawMtxArr[1]; }
Mtx* getDrawMtxPtr() const { return mpDrawMtxArr[1][mCurrentViewNo]; }
Mtx* getDrawMtx(u16 idx) const { return &mpDrawMtxArr[1][mCurrentViewNo][idx]; }
Mtx33** getNrmMtxPtrPtr() const { return mpNrmMtxArr[1]; }
Mtx33* getNrmMtxPtr() const { return mpNrmMtxArr[1][mCurrentViewNo]; }
Mtx33* getNrmMtx(u16 idx) const { return &mpNrmMtxArr[1][mCurrentViewNo][idx]; }
Mtx33*** getBumpMtxPtrPtr() const { return mpBumpMtxArr[1]; }
Mtx33* getBumpMtxPtr(int idx) const { return mpBumpMtxArr[1][idx][mCurrentViewNo]; }
J3DJointTree* getJointTree() const { return mJointTree; }
void swapDrawMtx() {
Mtx* tmp = mpDrawMtxArr[0][mCurrentViewNo];
mpDrawMtxArr[0][mCurrentViewNo] = mpDrawMtxArr[1][mCurrentViewNo];
mpDrawMtxArr[1][mCurrentViewNo] = tmp;
}
void swapNrmMtx() {
Mtx33* tmp = mpNrmMtxArr[0][mCurrentViewNo];
mpNrmMtxArr[0][mCurrentViewNo] = mpNrmMtxArr[1][mCurrentViewNo];
mpNrmMtxArr[1][mCurrentViewNo] = tmp;
}
static Mtx sNoUseDrawMtx;
static Mtx33 sNoUseNrmMtx;
static Mtx* sNoUseDrawMtxPtr;
static Mtx33* sNoUseNrmMtxPtr;
private:
/* 0x00 */ J3DJointTree* mJointTree;
/* 0x04 */ u8* mpScaleFlagArr;
/* 0x08 */ u8* mpEvlpScaleFlagArr;
/* 0x0C */ Mtx* mpAnmMtx;
/* 0x10 */ Mtx* mpWeightEvlpMtx;
/* 0x14 */ Mtx** mpDrawMtxArr[2];
/* 0x1C */ Mtx33** mpNrmMtxArr[2];
/* 0x28 */ Mtx33*** mpBumpMtxArr[2];
/* 0x2C */ u32 mFlags;
/* 0x30 */ u32 mCurrentViewNo;
/* 0x34 */ Mtx* mpUserAnmMtx;
public:
virtual ~J3DMtxBuffer();
};
void J3DCalcViewBaseMtx(f32 (*param_0)[4], Vec const& param_1, f32 const (&param_2)[3][4],
f32 (*param_3)[4]);
#endif /* J3DMTXBUFFER_H */
@@ -2,10 +2,11 @@
#define J3DSKINDEFORM_H
#include "JSystem/J3DGraphAnimator/J3DCluster.h"
#include "JSystem/J3DGraphAnimator/J3DMtxBuffer.h"
#include "JSystem/J3DGraphBase/J3DTransform.h"
#include "dolphin/types.h"
class J3DModelData;
class J3DVertexBuffer;
class J3DModel;
class J3DAnmCluster;
@@ -51,13 +52,13 @@ public:
void initSkinInfo(J3DModelData*);
int initMtxIndexArray(J3DModelData*);
void changeFastSkinDL(J3DModelData*);
void calcNrmMtx(J3DMtxBuffer*);
// void calcNrmMtx(J3DMtxBuffer*);
void transformVtxPosNrm(J3DModelData*);
void calcAnmInvJointMtx(J3DMtxBuffer*);
void deformFastVtxPos_F32(J3DVertexBuffer*, J3DMtxBuffer*) const;
void deformFastVtxNrm_F32(J3DVertexBuffer*, J3DMtxBuffer*) const;
void deformVtxPos_F32(J3DVertexBuffer*, J3DMtxBuffer*) const;
void deformVtxPos_S16(J3DVertexBuffer*, J3DMtxBuffer*) const;
// void calcAnmInvJointMtx(J3DMtxBuffer*);
// void deformFastVtxPos_F32(J3DVertexBuffer*, J3DMtxBuffer*) const;
// void deformFastVtxNrm_F32(J3DVertexBuffer*, J3DMtxBuffer*) const;
// void deformVtxPos_F32(J3DVertexBuffer*, J3DMtxBuffer*) const;
// void deformVtxPos_S16(J3DVertexBuffer*, J3DMtxBuffer*) const;
void deformVtxNrm_F32(J3DVertexBuffer*) const;
void deformVtxNrm_S16(J3DVertexBuffer*) const;
void setNrmMtx(int i, MtxP mtx) {
+2
View File
@@ -170,6 +170,8 @@ public:
void setDrawMtx(Mtx** pDrawMtx) { mpDrawMtx = pDrawMtx; }
void setNrmMtx(Mtx33** pNrmMtx) { mpNrmMtx = pNrmMtx; }
void setBaseMtxPtr(Mtx* pMtx) { mpBaseMtxPtr = pMtx; }
void setScaleFlagArray(u8* pScaleFlagArray) { mpScaleFlagArray = pScaleFlagArray; }
void setCurrentViewNoPtr(u32* pCurrentViewNo) { mpCurrentViewNo = pCurrentViewNo; }
J3DShape* getShape() const { return mpShape; }
J3DModel* getModel() const { return mpModel; }
+102 -12
View File
@@ -4,6 +4,7 @@
//
#include "JSystem/J3DGraphAnimator/J3DModel.h"
#include "JSystem/J3DGraphAnimator/J3DJoint.h"
#include "JSystem/J3DGraphAnimator/J3DMaterialAnm.h"
#include "JSystem/J3DGraphBase/J3DSys.h"
#include "JSystem/JKernel/JKRHeap.h"
@@ -441,12 +442,12 @@ void J3DModel::calcAnmMtx() {
j3dSys.setCurrentMtxCalc(getModelData()->getJointTree().getBasicMtxCalc());
j3dSys.setModel(this);
if (checkFlag(2))
if (checkFlag(J3DMdlFlag_Unk00002))
j3dSys.getCurrentMtxCalc()->init(j3dDefaultScale, j3dDefaultMtx);
else
j3dSys.getCurrentMtxCalc()->init(mBaseScale, mBaseTransformMtx);
j3dSys.getCurrentMtxCalc()->recursiveCalc(getModelData()->getJointTree().getRootNode());
getModelData()->getJointTree().getBasicMtxCalc()->recursiveCalc(getModelData()->getJointTree().getRootNode());
}
/* 802EE67C-802EE874 .text calcWeightEnvelopeMtx__8J3DModelFv */
@@ -527,13 +528,51 @@ void J3DModel::entry() {
}
/* 802EEB24-802EEBDC .text calcViewBaseMtx__FPA4_fRC3VecRA3_A4_CfPA4_f */
void calcViewBaseMtx(float(*)[4], const Vec&, const float(&)[3][4], float(*)[4]) {
/* Nonmatching */
void calcViewBaseMtx(MtxP viewMtx, const Vec& scale, const Mtx& baseMtx, MtxP dstMtx) {
Mtx mtx;
mtx[0][0] = baseMtx[0][0] * scale.x;
mtx[0][1] = baseMtx[0][1] * scale.y;
mtx[0][2] = baseMtx[0][2] * scale.z;
mtx[0][3] = baseMtx[0][3];
mtx[1][0] = baseMtx[1][0] * scale.x;
mtx[1][1] = baseMtx[1][1] * scale.y;
mtx[1][2] = baseMtx[1][2] * scale.z;
mtx[1][3] = baseMtx[1][3];
mtx[2][0] = baseMtx[2][0] * scale.x;
mtx[2][1] = baseMtx[2][1] * scale.y;
mtx[2][2] = baseMtx[2][2] * scale.z;
mtx[2][3] = baseMtx[2][3];
MTXConcat(viewMtx, mtx, dstMtx);
}
extern void J3DPSMtxArrayConcat(f32(*)[4], f32(*)[4], f32(*)[4], u32);
/* 802EEBDC-802EEE30 .text calcDrawMtx__8J3DModelFv */
void J3DModel::calcDrawMtx() {
/* Nonmatching */
switch (mFlags & 0x03) {
case 1:
for (u32 i = 0; i < getModelData()->getDrawFullWgtMtxNum(); i++)
MTXConcat(j3dSys.getViewMtx(), getAnmMtx(getModelData()->getDrawMtxIndex(i)), getDrawMtxPtr()[i]);
if (getModelData()->getDrawFullWgtMtxNum() < getModelData()->getDrawMtxNum())
J3DPSMtxArrayConcat(j3dSys.getViewMtx(), (MtxP)mpWeightEnvMtx, (MtxP)getDrawMtxPtr(), getModelData()->getWEvlpMtxNum());
break;
case 0:
for (u32 i = 0; i < getModelData()->getDrawFullWgtMtxNum(); i++)
MTXCopy(getAnmMtx(getModelData()->getDrawMtxIndex(i)), getDrawMtxPtr()[i]);
for (u32 i = 0; i < getModelData()->getWEvlpMtxNum(); i++)
MTXCopy(getWeightAnmMtx(i), getDrawMtxPtr()[getModelData()->getDrawFullWgtMtxNum() + i]);
break;
case 2:
calcViewBaseMtx(j3dSys.getViewMtx(), mBaseScale, mBaseTransformMtx, mInternalView);
for (u32 i = 0; i < getModelData()->getDrawFullWgtMtxNum(); i++)
MTXConcat(mInternalView, getAnmMtx(getModelData()->getDrawMtxIndex(i)), getDrawMtxPtr()[i]);
if (getModelData()->getDrawFullWgtMtxNum() < getModelData()->getDrawMtxNum())
J3DPSMtxArrayConcat(mInternalView, (MtxP)mpWeightEnvMtx, (MtxP)getDrawMtxPtr(), getModelData()->getWEvlpMtxNum());
break;
}
}
/* 802EEE30-802EF050 .text viewCalc__8J3DModelFv */
@@ -577,17 +616,70 @@ void J3DModel::viewCalc() {
/* 802EF050-802EF1B8 .text calcNrmMtx__8J3DModelFv */
void J3DModel::calcNrmMtx() {
/* Nonmatching */
if (getModelData()->checkFlag(J3DMdlDataFlag_ConcatView) == 0) {
for (u16 i = 0; i < getModelData()->getDrawMtxNum(); i++) {
if (getModelData()->getDrawMtxFlag(i) == 0) {
if (getScaleFlag(getModelData()->getDrawMtxIndex(i)) == 1)
J3DPSMtx33CopyFrom34(getDrawMtx(i), getNrmMtx(i));
else
J3DPSCalcInverseTranspose(getDrawMtx(i), getNrmMtx(i));
} else {
if (getEnvScaleFlag(getModelData()->getDrawMtxIndex(i)) == 1)
J3DPSMtx33CopyFrom34(getDrawMtx(i), getNrmMtx(i));
else
J3DPSCalcInverseTranspose(getDrawMtx(i), getNrmMtx(i));
}
}
}
}
/* 802EF1B8-802EF2B0 .text calcBumpMtx__8J3DModelFv */
void J3DModel::calcBumpMtx() {
/* Nonmatching */
if (getModelData()->checkBumpFlag() == 1) {
s32 bumpMtxOffset = 0;
for (s32 i = 0; i < getModelData()->getMaterialNum(); i++) {
J3DMaterial * pMaterial = getModelData()->getMaterialNodePointer(i);
if (pMaterial->getNBTScale()->mbHasScale == 1) {
pMaterial->getShape()->calcNBTScale(*pMaterial->getNBTScale()->getScale(), getNrmMtxPtr(), getBumpMtxPtr(bumpMtxOffset));
DCStoreRange(getBumpMtxPtr(bumpMtxOffset), getModelData()->getDrawMtxNum() * sizeof(Mtx33));
bumpMtxOffset++;
}
}
}
}
/* 802EF2B0-802EF414 .text calcBBoard__8J3DModelFv */
void J3DModel::calcBBoard() {
/* Nonmatching */
if (getModelData()->checkBBoardFlag()) {
for (u16 i = 0; i < getModelData()->getDrawMtxNum(); i++) {
if (getModelData()->getDrawMtxFlag(i) != 0)
continue;
u8 mtxType = getModelData()->getJointNodePointer(getModelData()->getDrawMtxIndex(i))->getMtxType();
if (mtxType == J3DJntMtxType_BBoard) {
Mtx& 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 (mtxType == J3DJntMtxType_YBBoard) {
Mtx& drawMtx = getDrawMtx(i);
J3DCalcYBBoardMtx(drawMtx);
Mtx33& nrmMtx = getNrmMtx(i);
J3DPSCalcInverseTranspose(drawMtx, nrmMtx);
}
}
}
}
/* 802EF414-802EF5D8 .text prepareShapePackets__8J3DModelFv */
@@ -624,11 +716,9 @@ void J3DModel::prepareShapePackets() {
if (getModelData()->checkBumpFlag() == 1) {
for (s32 i = 0; i < getModelData()->getMaterialNum(); i++) {
J3DMaterial* pMaterial = getModelData()->getMaterialNodePointer(i);
if (pMaterial->getTexGenBlock()->getNBTScale()->mbHasScale) {
if (pMaterial->getTexGenBlock()->getNBTScale()->mbHasScale == 1) {
J3DShape *pShape = pMaterial->getShape();
J3DShapePacket *pPacket = getShapePacket(pShape->getIndex());
u32 bumpMtxOffset = pShape->getBumpMtxOffset();
pPacket->setNrmMtx(getBumpMtxPtrPtr()[bumpMtxOffset]);
getShapePacket(pShape->getIndex())->setNrmMtx(getBumpMtxPtrPtr(pShape->getBumpMtxOffset()));
}
}
}
@@ -63,8 +63,10 @@ void J3DJointTree::makeHierarchy(J3DNode* pRootNode, const J3DModelHierarchy** p
}
break;
case kTypeMaterial:
*pHierarchy = inf + 1;
pNewMaterial = pMaterialTable->mMaterialNodePointer[inf->mValue];
{
*pHierarchy = inf + 1;
pNewMaterial = pMaterialTable->getMaterialNodePointer(inf->getValue());
}
break;
case kTypeShape:
*pHierarchy = inf + 1;
@@ -81,7 +83,7 @@ void J3DJointTree::makeHierarchy(J3DNode* pRootNode, const J3DModelHierarchy** p
} else if (pNewMaterial != NULL && pRootNode->getType() == 'NJNT') {
((J3DJoint*)pRootNode)->addMesh(pNewMaterial);
pNewMaterial->mJoint = ((J3DJoint*)pRootNode);
} else if (pNewShape != NULL && pNewNode->getType() == 'NJNT') {
} else if (pNewShape != NULL && pRootNode->getType() == 'NJNT') {
pNewMaterial = ((J3DJoint*)pRootNode)->getMesh();
pNewMaterial->mShape = pNewShape;
pNewShape->mMaterial = pNewMaterial;
+2 -1
View File
@@ -6,10 +6,11 @@
#include "JSystem/J3DGraphBase/J3DShapeMtx.h"
#include "JSystem/J3DGraphBase/J3DGD.h"
#include "JSystem/J3DGraphBase/J3DPacket.h"
#include "JSystem/J3DGraphAnimator/J3DModel.h"
#include "JSystem/J3DGraphBase/J3DShapeDraw.h"
#include "JSystem/J3DGraphBase/J3DSys.h"
#include "JSystem/J3DGraphBase/J3DTransform.h"
#include "JSystem/J3DGraphAnimator/J3DModel.h"
#include "JSystem/J3DGraphAnimator/J3DModelData.h"
extern void J3DFifoLoadNrmMtxImm(Mtx, u32);
extern void J3DFifoLoadNrmMtxImm3x3(Mtx33, u32);