summaryrefslogtreecommitdiff
path: root/src/JSystem/J3DGraphBase/J3DShape.cpp
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2023-09-12 20:16:11 -0700
committerJasper St. Pierre <jstpierre@mecheye.net>2023-09-12 20:16:11 -0700
commitc0d02ccfcf9ec93b0d8a427567e1dffd58182da5 (patch)
treecabf8857739bf73af73f37d48cc7b1b77d62be94 /src/JSystem/J3DGraphBase/J3DShape.cpp
parentd3b40925239896a0ae41b35b61f0250200dd0ec3 (diff)
J3DVertex almost
Diffstat (limited to 'src/JSystem/J3DGraphBase/J3DShape.cpp')
-rw-r--r--src/JSystem/J3DGraphBase/J3DShape.cpp225
1 files changed, 205 insertions, 20 deletions
diff --git a/src/JSystem/J3DGraphBase/J3DShape.cpp b/src/JSystem/J3DGraphBase/J3DShape.cpp
index 666ff9e7..1dcd464d 100644
--- a/src/JSystem/J3DGraphBase/J3DShape.cpp
+++ b/src/JSystem/J3DGraphBase/J3DShape.cpp
@@ -4,79 +4,264 @@
//
#include "JSystem/J3DGraphBase/J3DShape.h"
+#include "JSystem/J3DGraphBase/J3DPacket.h"
+#include "JSystem/J3DGraphBase/J3DSys.h"
+#include "JSystem/J3DGraphBase/J3DVertex.h"
+#include "dolphin/gd/GDBase.h"
+#include "dolphin/gd/GDGeometry.h"
+#include "dolphin/os/OS.h"
#include "dolphin/types.h"
+extern void J3DGDSetVtxAttrFmtv(_GXVtxFmt, GXVtxAttrFmtList *, bool);
+extern void J3DFifoLoadPosMtxImm(Mtx, u32);
+extern void J3DFifoLoadNrmMtxImm(Mtx, u32);
+
/* 802DD18C-802DD1FC .text initialize__8J3DShapeFv */
+
void J3DShape::initialize() {
- /* Nonmatching */
+ 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;
}
/* 802DD1FC-802DD27C .text calcNBTScale__8J3DShapeFRC3VecPA3_A3_fPA3_A3_f */
-void J3DShape::calcNBTScale(const Vec&, float(*)[3][3], float(*)[3][3]) {
- /* Nonmatching */
+void J3DShape::calcNBTScale(Vec const& param_0, Mtx33* param_1, Mtx33* param_2) {
+ for (u16 i = 0; i < getMtxGroupNum(); i++)
+ getShapeMtx(i)->calcNBTScale(param_0, param_1, param_2);
}
/* 802DD27C-802DD2F0 .text countBumpMtxNum__8J3DShapeCFv */
-void J3DShape::countBumpMtxNum() const {
- /* Nonmatching */
+u32 J3DShape::countBumpMtxNum() const {
+ u32 num = 0;
+ for (u16 i = 0; i < getMtxGroupNum(); i++)
+ num += getShapeMtx(i)->getUseMtxNum();
+ return num;
}
/* 802DD2F0-802DD308 .text J3DLoadCPCmd__FUcUl */
-void J3DLoadCPCmd(unsigned char, unsigned long) {
- /* Nonmatching */
+void J3DLoadCPCmd(u8 cmd, u32 param) {
+ GFX_FIFO(u8) = GX_CMD_LOAD_CP_REG;
+ GFX_FIFO(u8) = cmd;
+ GFX_FIFO(u32) = param;
}
/* 802DD308-802DD344 .text J3DLoadArrayBasePtr__F7_GXAttrPv */
-void J3DLoadArrayBasePtr(_GXAttr, void*) {
- /* Nonmatching */
+static void J3DLoadArrayBasePtr(_GXAttr attr, void* data) {
+ u32 idx = (attr == GX_VA_NBT) ? 1 : (attr - GX_VA_POS);
+ J3DLoadCPCmd(0xA0 + idx, ((u32)data & 0x7FFFFFFF));
}
/* 802DD344-802DD3B4 .text loadVtxArray__8J3DShapeCFv */
void J3DShape::loadVtxArray() const {
- /* Nonmatching */
+ J3DLoadArrayBasePtr(GX_VA_POS, j3dSys.getVtxPos());
+ if (!mHasNBT) {
+ J3DLoadArrayBasePtr(GX_VA_NRM, j3dSys.getVtxNrm());
+ }
+ J3DLoadArrayBasePtr(GX_VA_CLR0, j3dSys.getVtxCol());
}
/* 802DD3B4-802DD3F0 .text isSameVcdVatCmd__8J3DShapeFP8J3DShape */
-void J3DShape::isSameVcdVatCmd(J3DShape*) {
- /* Nonmatching */
+bool J3DShape::isSameVcdVatCmd(J3DShape* other) {
+ u8* a = other->mVcdVatCmd;
+ u8* b = mVcdVatCmd;
+ for (u32 i = 0; i < kVcdVatDLSize; i++)
+ if (a[i] != b[i])
+ return false;
+ return true;
}
/* 802DD3F0-802DD6B8 .text makeVtxArrayCmd__8J3DShapeFv */
void J3DShape::makeVtxArrayCmd() {
- /* Nonmatching */
+ 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 (s32 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]);
+ }
}
/* 802DD6B8-802DD72C .text makeVcdVatCmd__8J3DShapeFv */
void J3DShape::makeVcdVatCmd() {
- /* Nonmatching */
+ GDLObj gdl_obj;
+ GDInitGDLObj(&gdl_obj, mVcdVatCmd, kVcdVatDLSize);
+ GDSetCurrent(&gdl_obj);
+ GDSetVtxDescv(mVtxDesc);
+ makeVtxArrayCmd();
+ J3DGDSetVtxAttrFmtv(GX_VTXFMT0, mVertexData->getVtxAttrFmtList(), mHasNBT);
+ GDPadCurr32();
+ GDFlushCurrToMem();
+ GDSetCurrent(NULL);
}
+void* J3DShape::sOldVcdVatCmd;
+
/* 802DD72C-802DD7CC .text loadPreDrawSetting__8J3DShapeCFv */
void J3DShape::loadPreDrawSetting() const {
- /* Nonmatching */
+ if (sOldVcdVatCmd != mVcdVatCmd) {
+ GXCallDisplayList(mVcdVatCmd, kVcdVatDLSize);
+ sOldVcdVatCmd = mVcdVatCmd;
+ }
+
+ mCurrentMtx.load();
}
+u8 J3DShape::sEnvelopeFlag;
+
/* 802DD7CC-802DD874 .text setArrayAndBindPipeline__8J3DShapeCFv */
void J3DShape::setArrayAndBindPipeline() const {
- /* Nonmatching */
+ J3DShapeMtx::setCurrentPipeline(getPipeline());
+ loadVtxArray();
+ j3dSys.setModelDrawMtx(mDrawMtx[*mCurrentViewNo]);
+ j3dSys.setModelNrmMtx(mNrmMtx[*mCurrentViewNo]);
+ J3DShapeMtx::sCurrentScaleFlag = mScaleFlagArray;
+ J3DShapeMtx::sNBTFlag = mHasNBT;
+ J3DShape::sEnvelopeFlag = mHasPNMTXIdx;
}
/* 802DD874-802DD9FC .text drawFast__8J3DShapeCFv */
void J3DShape::drawFast() const {
- /* Nonmatching */
+ if (sOldVcdVatCmd != mVcdVatCmd) {
+ GXCallDisplayList(mVcdVatCmd, kVcdVatDLSize);
+ sOldVcdVatCmd = mVcdVatCmd;
+ }
+
+ if (sEnvelopeFlag != 0 && !mHasPNMTXIdx)
+ mCurrentMtx.load();
+
+ setArrayAndBindPipeline();
+ if (!checkFlag(J3DShpFlag_NoMtx)) {
+ for (u16 i = 0; i < getMtxGroupNum(); i++) {
+ if (getShapeMtx(i) != NULL)
+ getShapeMtx(i)->load();
+ if (getShapeDraw(i) != NULL)
+ getShapeDraw(i)->draw();
+ }
+ } else {
+ J3DFifoLoadPosMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), GX_PNMTX0);
+ J3DFifoLoadNrmMtxImm(*j3dSys.getShapePacket()->getBaseMtxPtr(), GX_PNMTX0);
+ for (u16 i = 0; i < getMtxGroupNum(); i++)
+ if (getShapeDraw(i) != NULL)
+ getShapeDraw(i)->draw();
+ }
}
/* 802DD9FC-802DDA44 .text draw__8J3DShapeCFv */
void J3DShape::draw() const {
- /* Nonmatching */
+ sOldVcdVatCmd = NULL;
+ loadPreDrawSetting();
+ drawFast();
}
/* 802DDA44-802DDAC8 .text simpleDraw__8J3DShapeCFv */
void J3DShape::simpleDraw() const {
- /* Nonmatching */
+ resetVcdVatCache();
+ loadPreDrawSetting();
+ J3DShapeMtx::setCurrentPipeline(getPipeline());
+ loadVtxArray();
+ for (u16 i = 0; i < getMtxGroupNum(); i++) {
+ if (getShapeDraw(i) != NULL) {
+ getShapeDraw(i)->draw();
+ }
+ }
}
/* 802DDAC8-802DDBC4 .text simpleDrawCache__8J3DShapeCFv */
void J3DShape::simpleDrawCache() const {
- /* Nonmatching */
+ if (sOldVcdVatCmd != mVcdVatCmd) {
+ GXCallDisplayList(mVcdVatCmd, kVcdVatDLSize);
+ sOldVcdVatCmd = mVcdVatCmd;
+ }
+
+ if (sEnvelopeFlag != 0 && !mHasPNMTXIdx)
+ mCurrentMtx.load();
+
+ loadVtxArray();
+ for (u16 i = 0; i < getMtxGroupNum(); i++)
+ if (getShapeDraw(i) != NULL)
+ getShapeDraw(i)->draw();
}