summaryrefslogtreecommitdiff
path: root/include/JSystem/J3DGraphBase
diff options
context:
space:
mode:
authorTal Hayon <talhayon1@gmail.com>2023-07-14 11:30:07 +0300
committerTal Hayon <talhayon1@gmail.com>2023-07-14 11:30:07 +0300
commit6c945a4e29c567960fd77320cf6f72387811eb33 (patch)
treeab6cd4357646acf004f9ea886b67d373fd971d56 /include/JSystem/J3DGraphBase
parented40ffb06473018899329ec5aabbf6a74726e4b5 (diff)
Work on J3DSkinDeform
Diffstat (limited to 'include/JSystem/J3DGraphBase')
-rw-r--r--include/JSystem/J3DGraphBase/J3DShape.h1
-rw-r--r--include/JSystem/J3DGraphBase/J3DShapeDraw.h1
-rw-r--r--include/JSystem/J3DGraphBase/J3DTransform.h193
-rw-r--r--include/JSystem/J3DGraphBase/J3DVertex.h24
4 files changed, 219 insertions, 0 deletions
diff --git a/include/JSystem/J3DGraphBase/J3DShape.h b/include/JSystem/J3DGraphBase/J3DShape.h
index 8ceaf59661..102fb430da 100644
--- a/include/JSystem/J3DGraphBase/J3DShape.h
+++ b/include/JSystem/J3DGraphBase/J3DShape.h
@@ -107,6 +107,7 @@ public:
void setTexMtxLoadType(u32 type) { mFlags = (mFlags & 0xFFFF0FFF) | type; }
bool getNBTFlag() const { return mHasNBT; }
u32 getBumpMtxOffset() const { return mBumpMtxOffset; }
+ GXVtxDescList* getVtxDesc() const { return mVtxDesc; }
J3DMaterial* getMaterial() const { return mMaterial; }
u32 getIndex() const { return mIndex; }
diff --git a/include/JSystem/J3DGraphBase/J3DShapeDraw.h b/include/JSystem/J3DGraphBase/J3DShapeDraw.h
index 8ad82a0c3d..2293fd6337 100644
--- a/include/JSystem/J3DGraphBase/J3DShapeDraw.h
+++ b/include/JSystem/J3DGraphBase/J3DShapeDraw.h
@@ -14,6 +14,7 @@ public:
u8* getDisplayList() const { return (u8*)mDisplayList; }
u32 getDisplayListSize() const { return mDisplayListSize; }
+ void setDisplayListSize(u32 size) { mDisplayListSize = size; }
private:
/* 0x04 */ u32 mDisplayListSize;
diff --git a/include/JSystem/J3DGraphBase/J3DTransform.h b/include/JSystem/J3DGraphBase/J3DTransform.h
index a162bd5b7c..884506ce42 100644
--- a/include/JSystem/J3DGraphBase/J3DTransform.h
+++ b/include/JSystem/J3DGraphBase/J3DTransform.h
@@ -14,8 +14,201 @@ struct J3DTransformInfo {
extern J3DTransformInfo const j3dDefaultTransformInfo;
extern Vec const j3dDefaultScale;
extern Mtx const j3dDefaultMtx;
+extern f32 PSMulUnit01[2];
void J3DGetTranslateRotateMtx(J3DTransformInfo const&, Mtx);
void J3DGetTranslateRotateMtx(s16, s16, s16, f32, f32, f32, Mtx);
+void J3DPSCalcInverseTranspose(f32 (*param_0)[4], f32 (*param_1)[3]);
+void J3DGQRSetup7(u32 param_0, u32 param_1, u32 param_2, u32 param_3);
+
+inline void J3DPSMtx33CopyFrom34(register MtxP src, register Mtx3P dst) {
+ register f32 x_y1;
+ register f32 z1;
+ register f32 x_y2;
+ register f32 z2;
+ register f32 x_y3;
+ register f32 z3;
+ asm {
+ psq_l x_y1, 0(src), 0, 0
+ lfs z1, 8(src)
+ psq_l x_y2, 16(src), 0, 0
+ lfs z2, 0x18(src)
+ psq_l x_y3, 32(src), 0, 0
+ lfs z3, 0x28(src)
+ psq_st x_y1, 0(dst), 0, 0
+ stfs z1, 8(dst)
+ psq_st x_y2, 12(dst), 0, 0
+ stfs z2, 0x14(dst)
+ psq_st x_y3, 24(dst), 0, 0
+ stfs z3, 0x20(dst)
+ }
+}
+
+// regalloc issues
+inline void J3DPSMulMtxVec(register MtxP mtx, register Vec* vec, register Vec* dst) {
+ register f32 fr12;
+ register f32 fr11;
+ register f32 fr10;
+ register f32 fr9;
+ register f32 fr8;
+ register f32 fr6;
+ register f32 fra6;
+ register f32 fr5;
+ register f32 fra5;
+ register f32 fra4;
+ register f32 fr4;
+ register f32 fr3;
+ register f32 fr2;
+ register f32 fra2;
+ register f32 fr01;
+ register f32 fr00;
+ asm {
+ psq_l fr00, 0(vec), 0, 0
+ psq_l fr2, 0(mtx), 0, 0
+ psq_l fr01, 8(vec), 1, 0
+ ps_mul fr4, fr2, fr00
+ psq_l fr3, 8(mtx), 0, 0
+ ps_madd fr5, fr3, fr01, fr4
+ psq_l fr8, 16(mtx), 0, 0
+ ps_sum0 fr6, fr5, fr6, fr5
+ psq_l fr9, 24(mtx), 0, 0
+ ps_mul fr10, fr8, fr00
+ psq_st fr6, 0(dst), 1, 0
+ ps_madd fr11, fr9, fr01, fr10
+ psq_l fra2, 32(mtx), 0, 0
+ ps_sum0 fr12, fr11, fr12, fr11
+ psq_l fr3, 40(mtx), 0, 0
+ ps_mul fra4, fra2, fr00
+ psq_st fr12, 4(dst), 1, 0
+ ps_madd fra5, fr3, fr01, fra4
+ ps_sum0 fra6, fra5, fra6, fra5
+ psq_st fra6, 8(dst), 1, 0
+ }
+}
+
+// regalloc issues
+inline void J3DPSMulMtxVec(register MtxP mtx, register SVec* vec, register SVec* dst) {
+ register f32 fr12;
+ register f32 fr11;
+ register f32 fr10;
+ register f32 fr9;
+ register f32 fr8;
+ register f32 fr6;
+ register f32 fra6;
+ register f32 fr5;
+ register f32 fra5;
+ register f32 fra4;
+ register f32 fr4;
+ register f32 fr3;
+ register f32 fr2;
+ register f32 fra2;
+ register f32 fr01;
+ register f32 fr00;
+ asm {
+ psq_l fr00, 0(vec), 0, 7
+ psq_l fr2, 0(mtx), 0, 0
+ psq_l fr01, 4(vec), 1, 7
+ ps_mul fr4, fr2, fr00
+ psq_l fr3, 8(mtx), 0, 0
+ ps_madd fr5, fr3, fr01, fr4
+ psq_l fr8, 16(mtx), 0, 0
+ ps_sum0 fr6, fr5, fr6, fr5
+ psq_l fr9, 24(mtx), 0, 0
+ ps_mul fr10, fr8, fr00
+ psq_st fr6, 0(dst), 1, 7
+ ps_madd fr11, fr9, fr01, fr10
+ psq_l fra2, 32(mtx), 0, 0
+ ps_sum0 fr12, fr11, fr12, fr11
+ psq_l fr3, 40(mtx), 0, 0
+ ps_mul fra4, fra2, fr00
+ psq_st fr12, 2(dst), 1, 7
+ ps_madd fra5, fr3, fr01, fra4
+ ps_sum0 fra6, fra5, fra6, fra5
+ psq_st fra6, 4(dst), 1, 7
+ }
+}
+
+// regalloc issues
+inline void J3DPSMulMtxVec(register Mtx3P mtx, register Vec* vec, register Vec* dst) {
+ register f32* punit;
+ register f32 unit;
+ register f32 fr12;
+ register f32 fr11;
+ register f32 fr10;
+ register f32 fr9;
+ register f32 fr8;
+ register f32 fr6;
+ register f32 fr5;
+ register f32 fr4;
+ register f32 fr3;
+ register f32 fr2;
+ register f32 fr01;
+ register f32 fr00;
+ asm {
+ lis punit, PSMulUnit01@ha
+ psq_l fr00, 0(vec), 0, 0
+ addi punit, punit, PSMulUnit01@l
+ psq_l fr2, 0(mtx), 0, 0
+ psq_l unit, 0(punit), 0, 0
+ psq_l fr01, 8(vec), 1, 0
+ ps_add fr01, unit, fr01
+ psq_l fr3, 8(mtx), 1, 0
+ ps_mul fr4, fr2, fr00
+ psq_l fr8, 12(mtx), 0, 0
+ ps_madd fr5, fr3, fr01, fr4
+ ps_sum0 fr6, fr5, fr6, fr5
+ psq_l fr9, 20(mtx), 1, 0
+ ps_mul fr10, fr8, fr00
+ psq_st fr6, 0(dst), 1, 0
+ ps_madd fr11, fr9, fr01, fr10
+ psq_l fr2, 24(mtx), 0, 0
+ ps_sum0 fr12, fr11, fr12, fr11
+ psq_l fr3, 32(mtx), 1, 0
+ ps_mul fr4, fr2, fr00
+ psq_st fr12, 4(dst), 1, 0
+ ps_madd fr5, fr3, fr01, fr4
+ ps_sum0 fr6, fr5, fr6, fr5
+ psq_st fr6, 8(dst), 1, 0
+ }
+}
+
+// regalloc issues
+inline void J3DPSMulMtxVec(register Mtx3P mtx, register SVec* vec, register SVec* dst) {
+ register f32* punit;
+ register f32 unit;
+ register f32 fr6;
+ register f32 fr5;
+ register f32 fr4;
+ register f32 fr3;
+ register f32 fr2;
+ register f32 fr01;
+ register f32 fr00;
+ asm {
+ lis punit, PSMulUnit01@ha
+ psq_l fr00, 0(vec), 0, 7
+ addi punit, punit, PSMulUnit01@l
+ psq_l fr2, 0(mtx), 0, 0
+ psq_l unit, 0(punit), 0, 0
+ psq_l fr01, 4(vec), 1, 7
+ ps_add fr01, unit, fr01
+ psq_l fr3, 8(mtx), 1, 0
+ ps_mul fr4, fr2, fr00
+ psq_l fr2, 12(mtx), 0, 0
+ ps_madd fr5, fr3, fr01, fr4
+ ps_sum0 fr6, fr5, fr6, fr5
+ psq_l fr3, 20(mtx), 1, 0
+ ps_mul fr4, fr2, fr00
+ psq_st fr6, 0(dst), 1, 7
+ ps_madd fr5, fr3, fr01, fr4
+ psq_l fr2, 24(mtx), 0, 0
+ ps_sum0 fr6, fr5, fr6, fr5
+ psq_l fr3, 32(mtx), 1, 0
+ ps_mul fr4, fr2, fr00
+ psq_st fr6, 2(dst), 1, 7
+ ps_madd fr5, fr3, fr01, fr4
+ ps_sum0 fr6, fr5, fr6, fr5
+ psq_st fr6, 4(dst), 1, 7
+ }
+}
#endif /* J3DTRANSFORM_H */
diff --git a/include/JSystem/J3DGraphBase/J3DVertex.h b/include/JSystem/J3DGraphBase/J3DVertex.h
index a601987c1d..2803c7838a 100644
--- a/include/JSystem/J3DGraphBase/J3DVertex.h
+++ b/include/JSystem/J3DGraphBase/J3DVertex.h
@@ -9,9 +9,11 @@
typedef struct _GXColor GXColor;
class J3DModel;
struct J3DAnmVtxColor;
+struct J3DVertexBuffer;
struct J3DVtxColorCalc {
/* 8032E180 */ void calc(J3DModel*);
+ virtual void calc(J3DVertexBuffer*);
/* 0x0 */ void* vtable; // inlined vtable?
/* 0x4 */ u32 mFlags;
@@ -30,6 +32,10 @@ public:
u32 getNrmNum() const { return mNrmNum; }
u32 getVtxNum() const { return mVtxNum; }
GXVtxAttrFmtList* getVtxAttrFmtList() { return mVtxAttrFmtList; }
+ u8 getVtxPosFrac() { return mVtxPosFrac; }
+ u8 getVtxNrmFrac() { return mVtxNrmFrac; }
+ int getVtxPosType() { return mVtxPosType; }
+ int getVtxNrmType() { return mVtxNrmType; }
void setVtxPosFrac(u8 frac) { mVtxPosFrac = frac; }
void setVtxPosType(GXCompType type) { mVtxPosType = type; }
@@ -69,8 +75,10 @@ public:
/* 8031152C */ s32 allocTransformedVtxNrmArray();
void setCurrentVtxPos(void* pVtxPos) { mCurrentVtxPos = pVtxPos; }
+ void* getCurrentVtxPos() { return mCurrentVtxPos; }
void setCurrentVtxNrm(void* pVtxNrm) { mCurrentVtxNrm = pVtxNrm; }
+ void* getCurrentVtxNrm() { return mCurrentVtxNrm; }
void setCurrentVtxCol(GXColor* pVtxCol) { mCurrentVtxCol = pVtxCol; }
@@ -80,6 +88,22 @@ public:
setCurrentVtxCol(mVtxColArray[0]);
}
+ void* getTransformedVtxPos(int idx) { return mTransformedVtxPosArray[idx]; }
+ void* getTransformedVtxNrm(int idx) { return mTransformedVtxNrmArray[idx]; }
+ J3DVertexData* getVertexData() { return mVtxData; }
+
+ void swapTransformedVtxPos() {
+ void* tmp = mTransformedVtxPosArray[0];
+ mTransformedVtxPosArray[0] = mTransformedVtxPosArray[1];
+ mTransformedVtxPosArray[1] = tmp;
+ }
+
+ void swapTransformedVtxNrm() {
+ void* tmp = mTransformedVtxNrmArray[0];
+ mTransformedVtxNrmArray[0] = mTransformedVtxNrmArray[1];
+ mTransformedVtxNrmArray[1] = tmp;
+ }
+
private:
/* 0x00 */ J3DVertexData* mVtxData;
/* 0x04 */ void* mVtxPosArray[2];