summaryrefslogtreecommitdiff
path: root/src/JSystem/J3DGraphBase/J3DShape.cpp
diff options
context:
space:
mode:
authorTakaRikka <38417346+TakaRikka@users.noreply.github.com>2025-09-04 07:56:59 -0700
committerGitHub <noreply@github.com>2025-09-04 17:56:59 +0300
commitb45a089e15d79821b07be020db628e01a49b1fd2 (patch)
tree948057548cc19b19d644bd4f300ca6434e6bff11 /src/JSystem/J3DGraphBase/J3DShape.cpp
parentee8b843996f4d888903f8c125b95ec1af376877e (diff)
some J3D/misc cleanup (#2628)
* some j3d cleanup * begin using uintptr_t * j3dgraphbase cleanup * j3dgraphanimator cleanup
Diffstat (limited to 'src/JSystem/J3DGraphBase/J3DShape.cpp')
-rw-r--r--src/JSystem/J3DGraphBase/J3DShape.cpp114
1 files changed, 56 insertions, 58 deletions
diff --git a/src/JSystem/J3DGraphBase/J3DShape.cpp b/src/JSystem/J3DGraphBase/J3DShape.cpp
index fee08feb08..b825f095b1 100644
--- a/src/JSystem/J3DGraphBase/J3DShape.cpp
+++ b/src/JSystem/J3DGraphBase/J3DShape.cpp
@@ -1,18 +1,13 @@
#include "JSystem/J3DGraphBase/J3DShape.h"
#include "JSystem/J3DGraphBase/J3DPacket.h"
#include "JSystem/J3DGraphBase/J3DVertex.h"
-#include "dolphin/gd.h"
-#include "dolphin/os.h"
+#include "JSystem/J3DGraphBase/J3DFifo.h"
+#include <dolphin/gd.h>
void J3DGDSetVtxAttrFmtv(_GXVtxFmt, GXVtxAttrFmtList const*, bool);
void J3DFifoLoadPosMtxImm(Mtx, u32);
void J3DFifoLoadNrmMtxImm(Mtx, u32);
-
-enum {
- kVcdVatDLSize = 0xC0,
-};
-
void J3DShape::initialize() {
mMaterial = NULL;
mIndex = -1;
@@ -62,19 +57,24 @@ void J3DShape::addTexMtxIndexInDL(GXAttr attr, u32 valueBase) {
if (pnmtxidxOffs == -1)
return;
- for (u16 i = 0; i < getMtxGroupNum(); i++)
+ for (u16 i = 0; i < (u16)getMtxGroupNum(); i++)
getShapeDraw(i)->addTexMtxIndexInDL(stride, attrOffs, (s32)valueBase);
}
/* 80314CBC-80314DA8 30F5FC 00EC+00 0/0 1/1 0/0 .text addTexMtxIndexInVcd__8J3DShapeF7_GXAttr */
void J3DShape::addTexMtxIndexInVcd(GXAttr attr) {
+ u32 kSize[] = {0, 1, 1, 2}; // stripped data
+
s32 attrIdx = -1;
- GXVtxDescList* vtxDesc = mVtxDesc;
+ s32 attrOffs = -1;
+ s32 stride = 0;
+
+ GXVtxDescList* vtxDesc = getVtxDesc();
s32 attrCount = 0;
for (; vtxDesc->attr != GX_VA_NULL; attrCount++, vtxDesc++) {
if (vtxDesc->attr == GX_VA_PNMTXIDX)
- attrIdx = 0;
+ attrIdx = stride;
}
if (attrIdx == -1)
@@ -83,17 +83,21 @@ void J3DShape::addTexMtxIndexInVcd(GXAttr attr) {
GXVtxDescList* newVtxDesc = new GXVtxDescList[attrCount + 2];
bool inserted = false;
- vtxDesc = mVtxDesc;
+ vtxDesc = getVtxDesc();
GXVtxDescList* dst = newVtxDesc;
for (; vtxDesc->attr != GX_VA_NULL; dst++, vtxDesc++) {
if ((attr < vtxDesc->attr) && !inserted) {
dst->attr = attr;
dst->type = GX_DIRECT;
- inserted = true;
+ attrOffs = stride;
dst++;
+
+ inserted = true;
}
- *dst = *vtxDesc;
+ dst->attr = vtxDesc->attr;
+ dst->type = vtxDesc->type;
+ stride = stride + kSize[vtxDesc->type];
}
dst->attr = GX_VA_NULL;
@@ -104,7 +108,7 @@ void J3DShape::addTexMtxIndexInVcd(GXAttr attr) {
/* 80314DA8-80314E28 30F6E8 0080+00 0/0 1/1 0/0 .text
* calcNBTScale__8J3DShapeFRC3VecPA3_A3_fPA3_A3_f */
-void J3DShape::calcNBTScale(Vec const& param_0, f32 (*param_1)[3][3], f32 (*param_2)[3][3]) {
+void J3DShape::calcNBTScale(const Vec& param_0, f32 (*param_1)[3][3], f32 (*param_2)[3][3]) {
for (u16 i = 0; i < mMtxGroupNum; i++)
mShapeMtx[i]->calcNBTScale(param_0, param_1, param_2);
}
@@ -114,28 +118,31 @@ u16 J3DShape::countBumpMtxNum() const {
u16 num = 0;
for (u16 i = 0; i < mMtxGroupNum; i++)
num += mShapeMtx[i]->getUseMtxNum();
+
return num;
}
/* 80314E98-80314EB0 30F7D8 0018+00 1/1 0/0 0/0 .text J3DLoadCPCmd__FUcUl */
-void J3DLoadCPCmd(u8 cmd, u32 param) {
- GXWGFifo.u8 = GX_LOAD_CP_REG;
- GXWGFifo.u8 = cmd;
- GXWGFifo.u32 = param;
+void J3DLoadCPCmd(u8 addr, u32 val) {
+ GXCmd1u8(GX_LOAD_CP_REG);
+ GXCmd1u8(addr);
+ GXCmd1u32(val);
}
/* 80314EB0-80314EEC 30F7F0 003C+00 1/1 0/0 0/0 .text J3DLoadArrayBasePtr__F7_GXAttrPv */
-static void J3DLoadArrayBasePtr(_GXAttr attr, void* data) {
+static void J3DLoadArrayBasePtr(GXAttr attr, void* data) {
u32 idx = (attr == GX_VA_NBT) ? 1 : (attr - GX_VA_POS);
- J3DLoadCPCmd(0xA0 + idx, ((u32)data & 0x7FFFFFFF));
+ J3DLoadCPCmd(0xA0 + idx, ((uintptr_t)data & 0x7FFFFFFF));
}
/* 80314EEC-80314F5C 30F82C 0070+00 3/3 0/0 0/0 .text loadVtxArray__8J3DShapeCFv */
void J3DShape::loadVtxArray() const {
J3DLoadArrayBasePtr(GX_VA_POS, j3dSys.getVtxPos());
+
if (!mHasNBT) {
J3DLoadArrayBasePtr(GX_VA_NRM, j3dSys.getVtxNrm());
}
+
J3DLoadArrayBasePtr(GX_VA_CLR0, j3dSys.getVtxCol());
}
@@ -146,6 +153,7 @@ bool J3DShape::isSameVcdVatCmd(J3DShape* other) {
for (u32 i = 0; i < kVcdVatDLSize; i++)
if (a[i] != b[i])
return false;
+
return true;
}
@@ -153,9 +161,9 @@ bool J3DShape::isSameVcdVatCmd(J3DShape* other) {
void J3DShape::makeVtxArrayCmd() {
GXVtxAttrFmtList* vtxAttr = mVertexData->getVtxAttrFmtList();
- u8 stride[0x0C];
- void* array[0x0C];
- for (u32 i = 0; i < 0x0C; i++) {
+ u8 stride[12];
+ void* array[12];
+ for (u32 i = 0; i < 12; i++) {
stride[i] = 0;
array[i] = 0;
}
@@ -164,27 +172,28 @@ void J3DShape::makeVtxArrayCmd() {
switch (vtxAttr->attr) {
case GX_VA_POS: {
if (vtxAttr->type == GX_F32)
- stride[vtxAttr->attr - GX_VA_POS] = 0x0C;
+ stride[vtxAttr->attr - GX_VA_POS] = 12;
else
- stride[vtxAttr->attr - GX_VA_POS] = 0x06;
+ stride[vtxAttr->attr - GX_VA_POS] = 6;
+
array[vtxAttr->attr - GX_VA_POS] = mVertexData->getVtxPosArray();
- mVertexData->setVtxPosFrac(vtxAttr->frac);
+ mVertexData->setVtxPosFrac((u8)vtxAttr->frac);
mVertexData->setVtxPosType((GXCompType)vtxAttr->type);
} break;
case GX_VA_NRM: {
if (vtxAttr->type == GX_F32)
- stride[vtxAttr->attr - GX_VA_POS] = 0x0C;
+ stride[vtxAttr->attr - GX_VA_POS] = 12;
else
- stride[vtxAttr->attr - GX_VA_POS] = 0x06;
+ stride[vtxAttr->attr - GX_VA_POS] = 6;
+
array[vtxAttr->attr - GX_VA_POS] = mVertexData->getVtxNrmArray();
- mVertexData->setVtxNrmFrac(vtxAttr->frac);
+ mVertexData->setVtxNrmFrac((u8)vtxAttr->frac);
mVertexData->setVtxNrmType((GXCompType)vtxAttr->type);
} break;
case GX_VA_CLR0:
case GX_VA_CLR1: {
- stride[vtxAttr->attr - GX_VA_POS] = 0x04;
- array[vtxAttr->attr - GX_VA_POS] =
- mVertexData->getVtxColorArray(vtxAttr->attr - GX_VA_CLR0);
+ stride[vtxAttr->attr - GX_VA_POS] = 4;
+ array[vtxAttr->attr - GX_VA_POS] = mVertexData->getVtxColorArray(vtxAttr->attr - GX_VA_CLR0);
} break;
case GX_VA_TEX0:
case GX_VA_TEX1:
@@ -195,11 +204,11 @@ void J3DShape::makeVtxArrayCmd() {
case GX_VA_TEX6:
case GX_VA_TEX7: {
if (vtxAttr->type == GX_F32)
- stride[vtxAttr->attr - GX_VA_POS] = 0x08;
+ stride[vtxAttr->attr - GX_VA_POS] = 8;
else
- stride[vtxAttr->attr - GX_VA_POS] = 0x04;
- array[vtxAttr->attr - GX_VA_POS] =
- mVertexData->getVtxTexCoordArray(vtxAttr->attr - GX_VA_TEX0);
+ stride[vtxAttr->attr - GX_VA_POS] = 4;
+
+ array[vtxAttr->attr - GX_VA_POS] = mVertexData->getVtxTexCoordArray(vtxAttr->attr - GX_VA_TEX0);
} break;
default:
break;
@@ -218,7 +227,7 @@ void J3DShape::makeVtxArrayCmd() {
}
}
- for (u32 i = 0; i < 0x0C; i++) {
+ for (u32 i = 0; i < 12; i++) {
if (array[i] != 0)
GDSetArray((GXAttr)(i + GX_VA_POS), array[i], stride[i]);
else
@@ -226,19 +235,9 @@ void J3DShape::makeVtxArrayCmd() {
}
}
-/* ############################################################################################## */
-/* 804515C8-804515CC 000AC8 0004+00 1/1 0/0 0/0 .sbss sInterruptFlag$903 */
-static s32 sInterruptFlag;
-
-/* 804515CC-804515D0 000ACC 0004+00 1/1 0/0 0/0 .sbss None */
-static s8 sInitInterruptFlag;
-
/* 80315260-80315300 30FBA0 00A0+00 1/1 2/2 0/0 .text makeVcdVatCmd__8J3DShapeFv */
void J3DShape::makeVcdVatCmd() {
- if (!sInitInterruptFlag) {
- sInterruptFlag = OSDisableInterrupts();
- sInitInterruptFlag = true;
- }
+ static BOOL sInterruptFlag = OSDisableInterrupts();
OSDisableScheduler();
GDLObj gdl_obj;
@@ -254,10 +253,13 @@ void J3DShape::makeVcdVatCmd() {
OSRestoreInterrupts(sInterruptFlag);
}
-/* ############################################################################################## */
/* 804515D0-804515D4 000AD0 0004+00 5/5 25/25 9/9 .sbss sOldVcdVatCmd__8J3DShape */
void* J3DShape::sOldVcdVatCmd;
+void J3DShape::loadCurrentMtx() const {
+ mCurrentMtx.load();
+}
+
/* 80315300-80315398 30FC40 0098+00 2/2 6/6 3/3 .text loadPreDrawSetting__8J3DShapeCFv */
void J3DShape::loadPreDrawSetting() const {
if (sOldVcdVatCmd != mVcdVatCmd) {
@@ -268,9 +270,8 @@ void J3DShape::loadPreDrawSetting() const {
mCurrentMtx.load();
}
-/* ############################################################################################## */
/* 804515D4-804515D8 000AD4 0004+00 3/3 0/0 0/0 .sbss None */
-static u8 data_804515D4[4];
+bool J3DShape::sEnvelopeFlag;
/* 80315398-8031544C 30FCD8 00B4+00 1/1 0/0 0/0 .text setArrayAndBindPipeline__8J3DShapeCFv */
void J3DShape::setArrayAndBindPipeline() const {
@@ -279,10 +280,8 @@ void J3DShape::setArrayAndBindPipeline() const {
j3dSys.setModelDrawMtx(mDrawMtx[*mCurrentViewNo]);
j3dSys.setModelNrmMtx(mNrmMtx[*mCurrentViewNo]);
J3DShapeMtx::sCurrentScaleFlag = mScaleFlagArray;
- // The below struct_804515B0 is actually a continuation of sCurrentScaleFlag, I believe?
- // Also, there seems to be an extra entry in the array that's only there in DEBUG builds.
J3DShapeMtx::sNBTFlag = mHasNBT;
- data_804515D4[0] = mHasPNMTXIdx;
+ sEnvelopeFlag = mHasPNMTXIdx;
J3DShapeMtx::sTexMtxLoadType = getTexMtxLoadType();
}
@@ -293,13 +292,12 @@ void J3DShape::drawFast() const {
sOldVcdVatCmd = mVcdVatCmd;
}
- if (data_804515D4[0] != 0 && !mHasPNMTXIdx)
+ if (sEnvelopeFlag != 0 && !mHasPNMTXIdx)
mCurrentMtx.load();
setArrayAndBindPipeline();
if (!checkFlag(J3DShpFlag_NoMtx)) {
- // LOD flag shenanigans
- if (J3DShapeMtx::getLODFlag() != 0)
+ if (J3DShapeMtx::getLODFlag())
J3DShapeMtx::resetMtxLoadCache();
for (u16 n = mMtxGroupNum, i = 0; i < n; i++) {
@@ -344,7 +342,7 @@ void J3DShape::simpleDrawCache() const {
sOldVcdVatCmd = mVcdVatCmd;
}
- if (data_804515D4[0] != 0 && !mHasPNMTXIdx)
+ if (sEnvelopeFlag && !mHasPNMTXIdx)
mCurrentMtx.load();
loadVtxArray();