mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-23 06:54:16 -04:00
181 lines
6.0 KiB
C++
181 lines
6.0 KiB
C++
#ifndef J3DJOINT_H
|
|
#define J3DJOINT_H
|
|
|
|
#include "JSystem/J3DGraphAnimator/J3DNode.h"
|
|
#include "JSystem/J3DGraphBase/J3DSys.h"
|
|
#include "JSystem/J3DGraphBase/J3DTransform.h"
|
|
|
|
class J3DAnmTransform;
|
|
class J3DJoint;
|
|
class J3DMaterial;
|
|
class J3DMtxBuffer;
|
|
|
|
class J3DMtxCalc {
|
|
public:
|
|
virtual void init(const Vec&, const Mtx&) {}
|
|
virtual void recursiveCalc(J3DNode*) {}
|
|
virtual void calcTransform(u16, const J3DTransformInfo&) {}
|
|
virtual void calc(u16 jnt_no) {}
|
|
|
|
void initAnm() {
|
|
for (int i = 0; i < 4; i++) {
|
|
mOne[i] = NULL;
|
|
mTwo[i] = 0.0f;
|
|
}
|
|
}
|
|
void setAnmTransform(J3DAnmTransform* mAnmTransform) { mOne[0] = mAnmTransform; }
|
|
|
|
public:
|
|
J3DAnmTransform* mOne[4];
|
|
f32 mTwo[4];
|
|
};
|
|
|
|
class J3DMtxCalcAnm : public virtual J3DMtxCalc {
|
|
public:
|
|
J3DMtxCalcAnm(J3DAnmTransform* mAnmTransform) : J3DMtxCalc() {
|
|
initAnm();
|
|
setAnmTransform(mAnmTransform);
|
|
}
|
|
virtual ~J3DMtxCalcAnm() { initAnm(); }
|
|
virtual void calc(u16);
|
|
};
|
|
|
|
class J3DMtxCalcBasic : public virtual J3DMtxCalc {
|
|
private:
|
|
Mtx mBackupMtx;
|
|
Vec mBackupS;
|
|
Vec mBackupParentS;
|
|
|
|
public:
|
|
J3DMtxCalcBasic();
|
|
virtual ~J3DMtxCalcBasic() {}
|
|
virtual void init(const Vec& vec, const Mtx& mtx) {
|
|
J3DSys::mCurrentS = vec;
|
|
#ifndef DECOMPCTX // Hack, see comment in dolzel.pch for details
|
|
J3DSys::mParentS = (Vec){1.0f, 1.0f, 1.0f};
|
|
#endif
|
|
J3DSys::mCurrentMtx[0][0] = mtx[0][0] * J3DSys::mCurrentS.x;
|
|
J3DSys::mCurrentMtx[0][1] = mtx[0][1] * J3DSys::mCurrentS.y;
|
|
J3DSys::mCurrentMtx[0][2] = mtx[0][2] * J3DSys::mCurrentS.z;
|
|
J3DSys::mCurrentMtx[0][3] = mtx[0][3];
|
|
J3DSys::mCurrentMtx[1][0] = mtx[1][0] * J3DSys::mCurrentS.x;
|
|
J3DSys::mCurrentMtx[1][1] = mtx[1][1] * J3DSys::mCurrentS.y;
|
|
J3DSys::mCurrentMtx[1][2] = mtx[1][2] * J3DSys::mCurrentS.z;
|
|
J3DSys::mCurrentMtx[1][3] = mtx[1][3];
|
|
J3DSys::mCurrentMtx[2][0] = mtx[2][0] * J3DSys::mCurrentS.x;
|
|
J3DSys::mCurrentMtx[2][1] = mtx[2][1] * J3DSys::mCurrentS.y;
|
|
J3DSys::mCurrentMtx[2][2] = mtx[2][2] * J3DSys::mCurrentS.z;
|
|
J3DSys::mCurrentMtx[2][3] = mtx[2][3];
|
|
}
|
|
virtual void recursiveCalc(J3DNode*);
|
|
virtual void calcTransform(u16, const J3DTransformInfo&);
|
|
virtual void calc(u16 jnt_no);
|
|
|
|
Mtx& getBackupMtx() { return mBackupMtx; }
|
|
Vec& getBackupS() { return mBackupS; }
|
|
Vec& getBackupParentS() { return mBackupParentS; }
|
|
|
|
void setBackupS(const Vec& vec) { mBackupS = vec; }
|
|
void setBackupParentS(const Vec& vec) { mBackupParentS = vec; }
|
|
};
|
|
|
|
class J3DMtxCalcSoftimage : public J3DMtxCalcBasic {
|
|
public:
|
|
J3DMtxCalcSoftimage() : J3DMtxCalc() {}
|
|
virtual void calcTransform(u16, const J3DTransformInfo&);
|
|
virtual ~J3DMtxCalcSoftimage() {}
|
|
virtual void init(const Vec& vec, const Mtx& mtx) {
|
|
J3DSys::mCurrentS = vec;
|
|
MTXCopy(mtx, J3DSys::mCurrentMtx);
|
|
}
|
|
};
|
|
|
|
class J3DMtxCalcMaya : public J3DMtxCalcBasic {
|
|
public:
|
|
J3DMtxCalcMaya() : J3DMtxCalcBasic() {}
|
|
virtual ~J3DMtxCalcMaya() {}
|
|
virtual void init(const Vec& vec, const Mtx& mtx) {
|
|
#ifndef DECOMPCTX // Hack, see comment in dolzel.pch for details
|
|
J3DSys::mParentS = (Vec){1.0f, 1.0f, 1.0f};
|
|
#endif
|
|
J3DSys::mCurrentS = vec;
|
|
J3DSys::mCurrentMtx[0][0] = mtx[0][0] * J3DSys::mCurrentS.x;
|
|
J3DSys::mCurrentMtx[0][1] = mtx[0][1] * J3DSys::mCurrentS.y;
|
|
J3DSys::mCurrentMtx[0][2] = mtx[0][2] * J3DSys::mCurrentS.z;
|
|
J3DSys::mCurrentMtx[0][3] = mtx[0][3];
|
|
J3DSys::mCurrentMtx[1][0] = mtx[1][0] * J3DSys::mCurrentS.x;
|
|
J3DSys::mCurrentMtx[1][1] = mtx[1][1] * J3DSys::mCurrentS.y;
|
|
J3DSys::mCurrentMtx[1][2] = mtx[1][2] * J3DSys::mCurrentS.z;
|
|
J3DSys::mCurrentMtx[1][3] = mtx[1][3];
|
|
J3DSys::mCurrentMtx[2][0] = mtx[2][0] * J3DSys::mCurrentS.x;
|
|
J3DSys::mCurrentMtx[2][1] = mtx[2][1] * J3DSys::mCurrentS.y;
|
|
J3DSys::mCurrentMtx[2][2] = mtx[2][2] * J3DSys::mCurrentS.z;
|
|
J3DSys::mCurrentMtx[2][3] = mtx[2][3];
|
|
}
|
|
virtual void calcTransform(u16, const J3DTransformInfo&);
|
|
};
|
|
|
|
class J3DMtxCalcMayaAnm : public J3DMtxCalcMaya, public J3DMtxCalcAnm {
|
|
public:
|
|
J3DMtxCalcMayaAnm(J3DAnmTransform* pAnmTransform)
|
|
: J3DMtxCalcMaya(), J3DMtxCalcAnm(pAnmTransform) {}
|
|
virtual ~J3DMtxCalcMayaAnm() {}
|
|
virtual void calc(u16 jnt_no) { J3DMtxCalcAnm::calc(jnt_no); }
|
|
};
|
|
|
|
enum J3DJointMtxType {
|
|
J3DJntMtxType_Normal,
|
|
J3DJntMtxType_BBoard,
|
|
J3DJntMtxType_YBBoard,
|
|
J3DJntMtxType_Multi,
|
|
};
|
|
|
|
class J3DJoint : public J3DNode {
|
|
public:
|
|
void initialize();
|
|
void addMesh(J3DMaterial*);
|
|
void calcIn();
|
|
void calcOut();
|
|
void entryIn();
|
|
u32 getType() const { return 'NJNT'; }
|
|
void recursiveCalc();
|
|
|
|
J3DJoint() { initialize(); }
|
|
~J3DJoint() {}
|
|
|
|
J3DMaterial* getMesh() { return mMesh; }
|
|
u16 getJntNo() const { return mJntNo; }
|
|
u8 getKind() const { return mKind & 0x0F; }
|
|
u8 getMtxType() const { return (mKind >> 4) & 0x0F; }
|
|
u8 getScaleCompensate() const { return mScaleCompensate; }
|
|
void setCurrentMtxCalc(J3DMtxCalc* pMtxCalc) { mCurrentMtxCalc = pMtxCalc; }
|
|
J3DTransformInfo& getTransformInfo() { return mTransformInfo; }
|
|
Vec* getMax() { return &mMax; }
|
|
Vec* getMin() { return &mMin; }
|
|
void setMtxCalc(J3DMtxCalc* i_mtxCalc) { mMtxCalc = i_mtxCalc; }
|
|
J3DMtxCalc* getMtxCalc() { return mMtxCalc; }
|
|
void setOldMtxCalc(J3DMtxCalc* i_mtxCalc) { mOldMtxCalc = i_mtxCalc; }
|
|
J3DMtxCalc* getOldMtxCalc() { return mOldMtxCalc; }
|
|
J3DMtxCalc* getCurrentMtxCalc() { return mCurrentMtxCalc; };
|
|
void setMtxType(u8 type) { mKind = (mKind & ~0xf0) | (type << 4); }
|
|
|
|
static J3DMtxCalc* mCurrentMtxCalc;
|
|
|
|
private:
|
|
friend struct J3DJointFactory;
|
|
friend class J3DJointTree;
|
|
|
|
/* 0x18 */ u16 mJntNo;
|
|
/* 0x1A */ u8 mKind;
|
|
/* 0x1B */ u8 mScaleCompensate;
|
|
/* 0x1C */ J3DTransformInfo mTransformInfo;
|
|
/* 0x3C */ f32 mRadius;
|
|
/* 0x40 */ Vec mMin;
|
|
/* 0x4C */ Vec mMax;
|
|
/* 0x58 */ J3DMtxCalc* mMtxCalc;
|
|
/* 0x5C */ J3DMtxCalc* mOldMtxCalc;
|
|
/* 0x60 */ J3DMaterial* mMesh;
|
|
}; // Size: 0x64
|
|
|
|
#endif /* J3DJOINT_H */
|