diff options
| author | Jasper St. Pierre <jstpierre@mecheye.net> | 2022-04-24 01:25:34 -0700 |
|---|---|---|
| committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2022-04-24 01:57:11 -0700 |
| commit | 9bee853ab45970c60019df74f4be1f282bb90bb4 (patch) | |
| tree | 7cd642e8613edce4c82b6c05cc8a9ad9929cb30a /libs/JSystem/J3DGraphBase | |
| parent | f1f9cc713d57df482fc8ea1ec6b73a928f088d21 (diff) | |
J3DShape / J3DShapeDraw: More OK
Diffstat (limited to 'libs/JSystem/J3DGraphBase')
| -rw-r--r-- | libs/JSystem/J3DGraphBase/J3DShape.cpp | 210 | ||||
| -rw-r--r-- | libs/JSystem/J3DGraphBase/J3DShapeDraw.cpp | 87 |
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; |
