summaryrefslogtreecommitdiff
path: root/src/JSystem/J3DGraphAnimator/J3DModel.cpp
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2023-09-30 15:59:54 -0700
committerJasper St. Pierre <jstpierre@mecheye.net>2023-09-30 15:59:54 -0700
commitf90a89fd8771fa0e0a7159cb46d7ba6bdf64d3fb (patch)
treeb12c8eb500e646029e52095dd646ae4c400f85b5 /src/JSystem/J3DGraphAnimator/J3DModel.cpp
parent57e735af3911621ce9482d033697bd95cbfdf290 (diff)
J3DModelData fakematch, J3DModel progress
Diffstat (limited to 'src/JSystem/J3DGraphAnimator/J3DModel.cpp')
-rw-r--r--src/JSystem/J3DGraphAnimator/J3DModel.cpp114
1 files changed, 102 insertions, 12 deletions
diff --git a/src/JSystem/J3DGraphAnimator/J3DModel.cpp b/src/JSystem/J3DGraphAnimator/J3DModel.cpp
index 187e4c1a..c248de41 100644
--- a/src/JSystem/J3DGraphAnimator/J3DModel.cpp
+++ b/src/JSystem/J3DGraphAnimator/J3DModel.cpp
@@ -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()));
}
}
}