summaryrefslogtreecommitdiff
path: root/libs/JSystem/J3DGraphBase
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2022-04-24 01:25:34 -0700
committerJasper St. Pierre <jstpierre@mecheye.net>2022-04-24 01:57:11 -0700
commit9bee853ab45970c60019df74f4be1f282bb90bb4 (patch)
tree7cd642e8613edce4c82b6c05cc8a9ad9929cb30a /libs/JSystem/J3DGraphBase
parentf1f9cc713d57df482fc8ea1ec6b73a928f088d21 (diff)
J3DShape / J3DShapeDraw: More OK
Diffstat (limited to 'libs/JSystem/J3DGraphBase')
-rw-r--r--libs/JSystem/J3DGraphBase/J3DShape.cpp210
-rw-r--r--libs/JSystem/J3DGraphBase/J3DShapeDraw.cpp87
2 files changed, 199 insertions, 98 deletions
diff --git a/libs/JSystem/J3DGraphBase/J3DShape.cpp b/libs/JSystem/J3DGraphBase/J3DShape.cpp
index 306362d494..154850d3e3 100644
--- a/libs/JSystem/J3DGraphBase/J3DShape.cpp
+++ b/libs/JSystem/J3DGraphBase/J3DShape.cpp
@@ -58,7 +58,7 @@ extern "C" void _savegpr_29();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
-extern "C" extern u8 j3dDefaultViewNo[4 + 4 /* padding */];
+extern "C" extern u32 j3dDefaultViewNo;
extern "C" u32 sCurrentPipeline__11J3DShapeMtx;
extern "C" u32 sCurrentScaleFlag__11J3DShapeMtx;
extern "C" extern u8 struct_804515B0[4];
@@ -72,32 +72,38 @@ enum {
kVcdVatDLSize = 0xC0,
};
-/* ############################################################################################## */
-/* 804563A0-804563A8 0049A0 0004+04 1/1 0/0 0/0 .sdata2 @687 */
-SECTION_SDATA2 static f32 lit_687[1 + 1 /* padding */] = {
- 0.0f,
- /* padding */
- 0.0f,
-};
-
-/* 80314B48-80314BB8 30F488 0070+00 0/0 1/1 0/0 .text initialize__8J3DShapeFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DShape::initialize() {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DShape/initialize__8J3DShapeFv.s"
+void J3DShape::initialize() {
+ mMaterial = NULL;
+ mIndex = -1;
+ mMtxGroupNum = 0;
+ mFlags = 0;
+ mRadius = 0.0f;
+ mMin.x = 0.0f;
+ mMin.y = 0.0f;
+ mMin.z = 0.0f;
+ mMax.x = 0.0f;
+ mMax.y = 0.0f;
+ mMax.z = 0.0f;
+ mVtxDesc = NULL;
+ mShapeMtx = NULL;
+ mShapeDraw = NULL;
+ mVertexData = NULL;
+ mDrawMtxData = NULL;
+ mScaleFlagArray = NULL;
+ mDrawMtx = NULL;
+ mNrmMtx = NULL;
+ mCurrentViewNo = &j3dDefaultViewNo;
+ mHasNBT = false;
+ mHasPNMTXIdx = false;
}
-#pragma pop
/* 80314BB8-80314CBC 30F4F8 0104+00 0/0 1/1 0/0 .text addTexMtxIndexInDL__8J3DShapeF7_GXAttrUl */
-#ifdef NONMATCHING
-void J3DShape::addTexMtxIndexInDL(GXAttr attr, u32 param_1) {
+void J3DShape::addTexMtxIndexInDL(GXAttr attr, u32 valueBase) {
u32 kSize[] = { 0, 1, 1, 2 };
s32 pnmtxidxOffs = -1;
s32 attrOffs = -1;
- u32 stride = 0;
+ s32 stride = 0;
bool found = false;
for (GXVtxDescList* vtxDesc = mVtxDesc; vtxDesc->attr != GX_VA_NULL; vtxDesc++) {
@@ -115,28 +121,9 @@ void J3DShape::addTexMtxIndexInDL(GXAttr attr, u32 param_1) {
if (pnmtxidxOffs == -1)
return;
- for (u16 i = 0; i < mMtxGroupNum; i++)
- mShapeDraw[i]->addTexMtxIndexInDL(stride, attrOffs, param_1);
-}
-#else
-
-/* ############################################################################################## */
-/* 803A1E98-803A1EA8 02E4F8 0010+00 1/1 0/0 0/0 .rodata @697 */
-SECTION_RODATA static u8 const lit_697[16] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-};
-COMPILER_STRIP_GATE(0x803A1E98, &lit_697);
-
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DShape::addTexMtxIndexInDL(_GXAttr param_0, u32 param_1) {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DShape/addTexMtxIndexInDL__8J3DShapeF7_GXAttrUl.s"
+ for (u16 i = 0; i < getMtxGroupNum(); i++)
+ getShapeDraw(i)->addTexMtxIndexInDL(stride, attrOffs, (s32)valueBase);
}
-#pragma pop
-
-#endif
/* 80314CBC-80314DA8 30F5FC 00EC+00 0/0 1/1 0/0 .text addTexMtxIndexInVcd__8J3DShapeF7_GXAttr */
void J3DShape::addTexMtxIndexInVcd(GXAttr attr) {
@@ -177,15 +164,15 @@ 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]) {
- for (u16 i = 0; i < mMtxGroupNum; i++)
- mShapeMtx[i]->calcNBTScale(param_0, param_1, param_2);
+ for (u16 i = 0; i < getMtxGroupNum(); i++)
+ getShapeMtx(i)->calcNBTScale(param_0, param_1, param_2);
}
/* 80314E28-80314E98 30F768 0070+00 0/0 1/1 0/0 .text countBumpMtxNum__8J3DShapeCFv */
u32 J3DShape::countBumpMtxNum() const {
u32 num = 0;
- for (u16 i = 0; i < mMtxGroupNum; i++)
- num += mShapeMtx[i]->getUseMtxNum();
+ for (u16 i = 0; i < getMtxGroupNum(); i++)
+ num += getShapeMtx(i)->getUseMtxNum();
return num;
}
@@ -222,14 +209,87 @@ bool J3DShape::isSameVcdVatCmd(J3DShape* other) {
}
/* 80314F98-80315260 30F8D8 02C8+00 1/1 0/0 0/0 .text makeVtxArrayCmd__8J3DShapeFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DShape::makeVtxArrayCmd() {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DShape/makeVtxArrayCmd__8J3DShapeFv.s"
+void J3DShape::makeVtxArrayCmd() {
+ GXVtxAttrFmtList *vtxAttr = mVertexData->getVtxAttrFmtList();
+
+ u8 stride[0x0C];
+ void* array[0x0C];
+ for (u32 i = 0; i < 0x0C; i++) {
+ stride[i] = 0;
+ array[i] = 0;
+ }
+
+ for (; vtxAttr->mAttrib != GX_VA_NULL; vtxAttr++) {
+ switch (vtxAttr->mAttrib) {
+ case GX_VA_POS:
+ {
+ if (vtxAttr->mCompType == GX_F32)
+ stride[vtxAttr->mAttrib - GX_VA_POS] = 0x0C;
+ else
+ stride[vtxAttr->mAttrib - GX_VA_POS] = 0x06;
+ array[vtxAttr->mAttrib - GX_VA_POS] = mVertexData->getVtxPosArray();
+ mVertexData->setVtxPosFrac(vtxAttr->mCompShift);
+ mVertexData->setVtxPosType((GXCompType) vtxAttr->mCompType);
+ }
+ break;
+ case GX_VA_NRM:
+ {
+ if (vtxAttr->mCompType == GX_F32)
+ stride[vtxAttr->mAttrib - GX_VA_POS] = 0x0C;
+ else
+ stride[vtxAttr->mAttrib - GX_VA_POS] = 0x06;
+ array[vtxAttr->mAttrib - GX_VA_POS] = mVertexData->getVtxNrmArray();
+ mVertexData->setVtxNrmFrac(vtxAttr->mCompShift);
+ mVertexData->setVtxNrmType((GXCompType) vtxAttr->mCompType);
+ }
+ break;
+ case GX_VA_CLR0:
+ case GX_VA_CLR1:
+ {
+ stride[vtxAttr->mAttrib - GX_VA_POS] = 0x04;
+ array[vtxAttr->mAttrib - GX_VA_POS] = mVertexData->getVtxColorArray(vtxAttr->mAttrib - GX_VA_CLR0);
+ }
+ break;
+ case GX_VA_TEX0:
+ case GX_VA_TEX1:
+ case GX_VA_TEX2:
+ case GX_VA_TEX3:
+ case GX_VA_TEX4:
+ case GX_VA_TEX5:
+ case GX_VA_TEX6:
+ case GX_VA_TEX7:
+ {
+ if (vtxAttr->mCompType == GX_F32)
+ stride[vtxAttr->mAttrib - GX_VA_POS] = 0x08;
+ else
+ stride[vtxAttr->mAttrib - GX_VA_POS] = 0x04;
+ array[vtxAttr->mAttrib - GX_VA_POS] = mVertexData->getVtxTexCoordArray(vtxAttr->mAttrib - GX_VA_TEX0);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ GXVtxDescList* vtxDesc = mVtxDesc;
+ mHasPNMTXIdx = false;
+ for (; vtxDesc->attr != GX_VA_NULL; vtxDesc++) {
+ if (vtxDesc->attr == GX_VA_NBT && vtxDesc->type != GX_NONE) {
+ mHasNBT = true;
+ stride[GX_VA_NRM - GX_VA_POS] *= 3;
+ array[GX_VA_NRM - GX_VA_POS] = mVertexData->getVtxNBTArray();
+ } else if (vtxDesc->attr == GX_VA_PNMTXIDX && vtxDesc->type != GX_NONE) {
+ mHasPNMTXIdx = true;
+ }
+ }
+
+ for (u32 i = 0; i < 0x0C; i++) {
+ if (array[i] != 0)
+ GDSetArray((GXAttr)(i + GX_VA_POS), array[i], stride[i]);
+ else
+ GDSetArrayRaw((GXAttr)(i + GX_VA_POS), NULL, stride[i]);
+ }
}
-#pragma pop
/* ############################################################################################## */
/* 804515C8-804515CC 000AC8 0004+00 1/1 0/0 0/0 .sbss sInterruptFlag$903 */
@@ -264,14 +324,14 @@ void J3DShape::makeVcdVatCmd() {
void* J3DShape::sOldVcdVatCmd;
/* 80315300-80315398 30FC40 0098+00 2/2 6/6 3/3 .text loadPreDrawSetting__8J3DShapeCFv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DShape::loadPreDrawSetting() const {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DShape/loadPreDrawSetting__8J3DShapeCFv.s"
+void J3DShape::loadPreDrawSetting() const {
+ if (sOldVcdVatCmd != mVcdVatCmd) {
+ GXCallDisplayList(mVcdVatCmd, kVcdVatDLSize);
+ sOldVcdVatCmd = mVcdVatCmd;
+ }
+
+ mCurrentMtx.load();
}
-#pragma pop
/* ############################################################################################## */
/* 804515D4-804515D8 000AD4 0004+00 3/3 0/0 0/0 .sbss None */
@@ -308,18 +368,18 @@ void J3DShape::drawFast() const {
if (J3DShapeMtx::getLODFlag() != 0)
J3DShapeMtx::resetMtxLoadCache();
- for (u16 n = mMtxGroupNum, i = 0; i < n; i++) {
- if (mShapeMtx[i] != NULL)
- mShapeMtx[i]->load();
- if (mShapeDraw[i] != NULL)
- mShapeDraw[i]->draw();
+ for (u16 n = getMtxGroupNum(), i = 0; i < n; i++) {
+ if (getShapeMtx(i) != NULL)
+ getShapeMtx(i)->load();
+ if (getShapeDraw(i) != NULL)
+ getShapeDraw(i)->draw();
}
} else {
- J3DFifoLoadPosMtxImm(*j3dSys.mShapePacket->getBaseMtxPtr(), GX_PNMTX0);
- J3DFifoLoadNrmMtxImm(*j3dSys.mShapePacket->getBaseMtxPtr(), GX_PNMTX0);
- for (u16 n = mMtxGroupNum, i = 0; i < n; i++)
- if (mShapeDraw[i] != NULL)
- mShapeDraw[i]->draw();
+ J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), GX_PNMTX0);
+ J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), GX_PNMTX0);
+ for (u16 n = getMtxGroupNum(), i = 0; i < n; i++)
+ if (getShapeDraw(i) != NULL)
+ getShapeDraw(i)->draw();
}
}
#else
@@ -348,9 +408,9 @@ void J3DShape::simpleDraw() const {
loadPreDrawSetting();
J3DShapeMtx::setCurrentPipeline(getPipeline());
loadVtxArray();
- for (u16 n = mMtxGroupNum, i = 0; i < n; i++) {
- if (mShapeDraw[i] != NULL) {
- mShapeDraw[i]->draw();
+ for (u16 n = getMtxGroupNum(), i = 0; i < n; i++) {
+ if (getShapeDraw(i) != NULL) {
+ getShapeDraw(i)->draw();
}
}
}
@@ -366,7 +426,7 @@ void J3DShape::simpleDrawCache() const {
mCurrentMtx.load();
loadVtxArray();
- for (u16 n = mMtxGroupNum, i = 0; i < n; i++)
- if (mShapeDraw[i] != NULL)
- mShapeDraw[i]->draw();
+ for (u16 n = getMtxGroupNum(), i = 0; i < n; i++)
+ if (getShapeDraw(i) != NULL)
+ getShapeDraw(i)->draw();
}
diff --git a/libs/JSystem/J3DGraphBase/J3DShapeDraw.cpp b/libs/JSystem/J3DGraphBase/J3DShapeDraw.cpp
index befab13ce8..6da5f00bcd 100644
--- a/libs/JSystem/J3DGraphBase/J3DShapeDraw.cpp
+++ b/libs/JSystem/J3DGraphBase/J3DShapeDraw.cpp
@@ -4,46 +4,85 @@
//
#include "JSystem/J3DGraphBase/J3DShapeDraw.h"
+#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
+#include "dolphin/os/OSCache.h"
#include "dolphin/gx/GX.h"
#include "dolphin/types.h"
-
-//
-// Forward References:
-//
-
-extern "C" void countVertex__12J3DShapeDrawFUl();
-extern "C" void addTexMtxIndexInDL__12J3DShapeDrawFUlUlUl();
-extern "C" void __ct__12J3DShapeDrawFPCUcUl();
-extern "C" void draw__12J3DShapeDrawCFv();
-extern "C" void __dt__12J3DShapeDrawFv();
+#include "MSL_C/MSL_Common/Src/string.h"
//
// External References:
//
-SECTION_INIT void memcpy();
+extern "C" void countVertex__12J3DShapeDrawFUl();
extern "C" void* __nwa__FUli();
extern "C" void __dl__FPv();
-extern "C" void DCStoreRange();
extern "C" void _savegpr_18();
extern "C" void _restgpr_18();
-//
-// Declarations:
-//
-
/* 80314924-80314974 30F264 0050+00 1/1 0/0 0/0 .text countVertex__12J3DShapeDrawFUl */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DShapeDraw::countVertex(u32 param_0) {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DShapeDraw/countVertex__12J3DShapeDrawFUl.s"
+u32 J3DShapeDraw::countVertex(u32 stride) {
+ u32 count = 0;
+ u32 dlStart = (u32)getDisplayList();
+ for (u8* dl = (u8*)dlStart; ((u32)dl - dlStart) < getDisplayListSize();) {
+ if (*dl != 0xA0 && *dl != 0x98)
+ break;
+ u16 vtxNum = *((u16*)(dl + 1));
+ count += vtxNum;
+ dl += stride * vtxNum;
+ dl += 3;
+ }
+ return count;
}
-#pragma pop
+#ifdef NONMATCHING
/* 80314974-80314ABC 30F2B4 0148+00 0/0 1/1 0/0 .text addTexMtxIndexInDL__12J3DShapeDrawFUlUlUl */
+void J3DShapeDraw::addTexMtxIndexInDL(u32 stride, u32 attrOffs, u32 valueBase) {
+ u32 byteNum = countVertex(stride);
+ u32 newSize = ALIGN_NEXT(mDisplayListSize + byteNum, 0x20);
+ u8* newDLStart = new (0x20) u8[newSize];
+ u8* oldDLStart = getDisplayList();
+ u8* oldDL = oldDLStart;
+ u8* newDL = newDLStart;
+ for (; (oldDL - oldDLStart) < mDisplayListSize;) {
+ // Copy command
+ u8 h = *oldDL;
+ *newDL++ = h;
+
+ if (h != 0xA0 && h != 0x98)
+ break;
+
+ // Copy count
+ // regalloc (I suspect there's a way to shove this in a u16 temp without an mr)
+ u32 vtxNum = *((u16*)(oldDL + 1));
+ *((u16*)newDL) = vtxNum;
+ newDL += 2;
+
+ for (s32 i = 0; i < (u16)vtxNum; i++) {
+ // mul arg swap
+ u8* oldDLVtx = (&oldDL[stride * i + 3]);
+ u8 pnmtxidx = *oldDLVtx;
+ memcpy(newDL, oldDLVtx, attrOffs);
+ u8* newDL1 = &newDL[attrOffs];
+ *newDL1++ = valueBase + pnmtxidx;
+ memcpy(newDL1, oldDLVtx + attrOffs, stride - attrOffs);
+ newDL = newDL1 + (stride - attrOffs);
+ }
+
+ oldDL += stride * vtxNum;
+ oldDL += 3;
+ }
+
+ u32 realSize = ALIGN_NEXT((u32)newDL - (u32)newDLStart, 0x20);
+ for (; (newDL - newDLStart) < newSize; newDL++)
+ *newDL = 0;
+ mDisplayListSize = realSize;
+ mDisplayList = newDLStart;
+ DCStoreRange(newDLStart, mDisplayListSize);
+}
+#else
+
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -53,6 +92,8 @@ asm void J3DShapeDraw::addTexMtxIndexInDL(u32 param_0, u32 param_1, u32 param_2)
}
#pragma pop
+#endif
+
/* 80314ABC-80314AD4 30F3FC 0018+00 0/0 1/1 0/0 .text __ct__12J3DShapeDrawFPCUcUl */
J3DShapeDraw::J3DShapeDraw(u8 const* displayList, u32 displayListSize) {
mDisplayList = (void*)displayList;