summaryrefslogtreecommitdiff
path: root/include/JSystem/J3DGraphAnimator/J3DModel.h
blob: 5619c06826fe5223a2f9e301fc69da02aa30e042 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#ifndef J3DMODEL_H
#define J3DMODEL_H

#include "JSystem/J3DGraphAnimator/J3DSkinDeform.h"
#include "JSystem/J3DGraphBase/J3DPacket.h"
#include "JSystem/J3DGraphBase/J3DVertex.h"
#include "dolphin/mtx/mtx.h"
#include "dolphin/types.h"

enum J3DMdlFlag {
    /* 0x00001 */ J3DMdlFlag_Unk00001 = 0x1,
    /* 0x00002 */ J3DMdlFlag_Unk00002 = 0x2,
    /* 0x00004 */ J3DMdlFlag_SkinPosCpu = 0x4,
    /* 0x00008 */ J3DMdlFlag_SkinNrmCpu = 0x8,
    /* 0x00010 */ J3DMdlFlag_Unk00010 = 0x10,
    /* 0x20000 */ J3DMdlFlag_Unk20000 = 0x20000,
    /* 0x40000 */ J3DMdlFlag_Unk40000 = 0x40000,
    /* 0x80000 */ J3DMdlFlag_Unk80000 = 0x80000,
};

struct J3DUnkCalc1 {
    virtual void calc(J3DModel* model);
};

struct J3DUnkCalc2 {
    virtual void unk();
    virtual void calc(J3DModelData* mpModelData);
};

typedef void (*J3DCalcCallBack)(J3DModel*, u32 timing);

class J3DAnmVisibilityFull;
class J3DMatPacket;
class J3DShapePacket;

class J3DVisibilityManager {
public:
    J3DVisibilityManager(J3DAnmVisibilityFull* visibility) {
        mAnmVisibility = visibility;
        mbActive = 1;
    }
    virtual ~J3DVisibilityManager() {}
    virtual void setVisibility(J3DModelData*);

    /* 0x04 */ J3DAnmVisibilityFull* mAnmVisibility;
    /* 0x08 */ int mbActive;
};

class J3DUnkCallBack {
public:
    virtual void calc(J3DModel*);
};

class J3DModel {
public:
    J3DModel();

    void initialize();
    s32 entryModelData(J3DModelData*, u32, u32);
    s32 createShapePacket(J3DModelData*);
    s32 createMatPacket(J3DModelData*, u32);
    s32 newDifferedDisplayList(u32);
    void lock();
    void unlock();
    void diff();
    s32 setDeformData(J3DDeformData*, u32);
    s32 setSkinDeform(J3DSkinDeform*, u32);
    void calcAnmMtx();
    void calcWeightEnvelopeMtx();
    void calcNrmMtx();
    void calcBumpMtx();
    void calcBBoard();
    void calcDrawMtx();
    void prepareShapePackets();
    MtxP getAnmMtx(int idx) { return mpNodeMtx[idx]; }
    void setAnmMtx(int idx, Mtx mtx) { MTXCopy(mtx, mpNodeMtx[idx]); }
    MtxP getWeightAnmMtx(int idx) { return mpWeightEnvMtx[idx]; }
    void setWeightAnmMtx(int idx, Mtx mtx) { MTXCopy(mtx, mpWeightEnvMtx[idx]); }

    s32 setNoUseDrawMtx();
    s32 createSingleDrawMtx(J3DModelData*);
    s32 createDoubleDrawMtx(J3DModelData*, u32);
    s32 createBumpMtxArray(J3DModelData*, u32);

    virtual void update();
    virtual void entry();
    virtual void calc();
    virtual void calcMaterial();
    virtual void viewCalc();
    virtual ~J3DModel();

    J3DModelData* getModelData() { return mModelData; }
    void setModelData(J3DModelData* modelData) { mModelData = modelData; }

    void onFlag(u32 flag) { mFlags |= flag; }
    void offFlag(u32 flag) { mFlags &= ~flag; }
    bool checkFlag(u32 flag) const { return (mFlags & flag) ? true : false; }

    bool isCpuSkinningOn() const { return (mFlags & J3DMdlFlag_SkinPosCpu) && (mFlags & J3DMdlFlag_SkinNrmCpu); }

    void swapDrawMtx() {
        Mtx* tmp = mpDrawMtxBuf[0][mCurrentViewNo];
        mpDrawMtxBuf[0][mCurrentViewNo] = mpDrawMtxBuf[1][mCurrentViewNo];
        mpDrawMtxBuf[1][mCurrentViewNo] = tmp;
    }

    void swapNrmMtx() {
        Mtx33* tmp = mpNrmMtxBuf[0][mCurrentViewNo];
        mpNrmMtxBuf[0][mCurrentViewNo] = mpNrmMtxBuf[1][mCurrentViewNo];
        mpNrmMtxBuf[1][mCurrentViewNo] = tmp;
    }

    Mtx& getBaseTRMtx() { return mBaseTransformMtx; }
    void setBaseTRMtx(Mtx m) { MTXCopy(m, mBaseTransformMtx); }
    u32 getMtxCalcMode() { return mFlags & 0x03; }
    u8 getScaleFlag(int idx) const { return mpScaleFlagArr[idx]; }
    void setScaleFlag(int idx, u8 param_1) { mpScaleFlagArr[idx] = param_1; }
    u8 getEnvScaleFlag(int idx) const { return mpEvlpScaleFlagArr[idx]; }
    J3DVertexBuffer* getVertexBuffer() { return &mVertexBuffer; }
    void* getCurrentVtxPos() { return mVertexBuffer.getCurrentVtxPos(); }
    void setCurrentVtxPos(void* v) { mVertexBuffer.setCurrentVtxPos(v); }
    void* getCurrentVtxNrm() { return mVertexBuffer.getCurrentVtxNrm(); }
    void setCurrentVtxNrm(void* v) { mVertexBuffer.setCurrentVtxNrm(v); }
    J3DMatPacket* getMatPacket(u16 idx) { return &mpMatPacket[idx]; }
    J3DMatPacket* getMatPacketArray() { return mpMatPacket; }
    J3DShapePacket* getShapePacket(u16 idx) { return &mpShapePacket[idx]; }
    J3DShapePacket* getShapePacketArray() { return mpShapePacket; }
    Mtx* getDrawMtxPtr() { return mpDrawMtxBuf[1][mCurrentViewNo]; }
    Mtx& getDrawMtx(int idx) { return getDrawMtxPtr()[idx]; }
    Mtx33* getNrmMtxPtr() { return mpNrmMtxBuf[1][mCurrentViewNo]; }
    Mtx33& getNrmMtx(int idx) { return getNrmMtxPtr()[idx]; }
    void setNrmMtx(int idx, Mtx m) { J3DPSMtx33CopyFrom34(m, getNrmMtxPtr()[idx]); }
    Mtx33* getBumpMtxPtr(int idx) { return mpBumpMtxArr[1][idx][mCurrentViewNo]; }
    Vec* getBaseScale() { return &mBaseScale; } // Unused in TWW
    void setBaseScale(const Vec& scale) { mBaseScale = scale; }
    void setUserArea(u32 area) { mUserArea = area; }
    u32 getUserArea() const { return mUserArea; }
    void setVisibilityManager(J3DVisibilityManager* manager) { mpVisibilityManager = manager; }
    J3DSkinDeform* getSkinDeform() { return mpSkinDeform; }

private:
    /* 0x000 */ /* vtable */
    /* 0x004 */ J3DModelData* mModelData;
    /* 0x008 */ u32 mFlags;
    /* 0x00C */ u32 mDiffFlag;
    /* 0x010 */ J3DCalcCallBack mCalcCallBack;
    /* 0x014 */ u32 mUserArea;
    /* 0x018 */ Vec mBaseScale;
    /* 0x024 */ Mtx mBaseTransformMtx;
    /* 0x054 */ Mtx mViewBaseMtx;
    /* 0x084 */ u8* mpScaleFlagArr;
    /* 0x088 */ u8* mpEvlpScaleFlagArr;
    /* 0x08C */ Mtx* mpNodeMtx;
    /* 0x090 */ Mtx* mpWeightEnvMtx;
    /* 0x094 */ Mtx** mpDrawMtxBuf[2];
    /* 0x09C */ Mtx33** mpNrmMtxBuf[2];
    /* 0x0A4 */ Mtx33*** mpBumpMtxArr[2];
    /* 0x0AC */ u32 mMtxBufferFlag;
    /* 0x0B0 */ u32 mCurrentViewNo;
    /* 0x0B4 */ J3DMatPacket* mpMatPacket;
    /* 0x0B8 */ J3DShapePacket* mpShapePacket;
    /* 0x0BC */ J3DDeformData* mpDeformData;
    /* 0x0C0 */ J3DSkinDeform* mpSkinDeform;
    /* 0x0C4 */ J3DUnkCallBack * field_0xc4;
    /* 0x0C8 */ J3DUnkCallBack * field_0xc8;
    /* 0x0CC */ J3DVertexBuffer mVertexBuffer;
    /* 0x104 */ J3DVisibilityManager * mpVisibilityManager;

    static Mtx sNoUseDrawMtx;
    static Mtx33 sNoUseNrmMtx;
    static Mtx* sNoUseDrawMtxPtr;
    static Mtx33* sNoUseNrmMtxPtr;
};

STATIC_ASSERT(sizeof(J3DModel) == 0x108);

#endif /* J3DMODEL_H */