summaryrefslogtreecommitdiff
path: root/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h
blob: c7be046fd904911b92961ac820e2eb95f3964c7c (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
#ifndef J3DSKINDEFORM_H
#define J3DSKINDEFORM_H

#include "JSystem/J3DGraphAnimator/J3DCluster.h"
#include "JSystem/J3DGraphBase/J3DTransform.h"
#include "dolphin/types.h"
#include "global.h"

class J3DModelData;
class J3DModel;
class J3DVertexBuffer;
class J3DAnmCluster;

class J3DSkinDeform {
public:
    J3DSkinDeform();
    int initMtxIndexArray(J3DModelData*);
    void changeFastSkinDL(J3DModelData*);
    void calcNrmMtx(J3DModel*);
    void deformVtxPos_F32(J3DModel*) const;
    void deformVtxPos_S16(J3DModel*) const;
    void deformVtxNrm_F32(J3DModel*) const;
    void deformVtxNrm_S16(J3DModel*) const;
    void setNrmMtx(int i, MtxP mtx) {
        J3DPSMtx33CopyFrom34(mtx, (Mtx3P)mNrmMtx[i]);
    }
    Mtx3P getNrmMtx(int i) { return mNrmMtx[i]; }
    void onFlag(u32 flag) { mFlags |= flag; }
    void offFlag(u32 flag) { mFlags &= ~flag; }
    bool checkFlag(u32 flag) { return mFlags & flag; }

    virtual void deform(J3DModel*);
    virtual ~J3DSkinDeform() {}

    static u16* sWorkArea_WEvlpMixMtx[1024];
    static f32* sWorkArea_WEvlpMixWeight[1024];
    static u16 sWorkArea_MtxReg[1024 + 4 /* padding */];

private:
    /* 0x04 */ u16* mPosUseMtx;
    /* 0x08 */ u16* mNrmUseMtx;
    /* 0x0C */ Mtx33* mNrmMtx;
    /* 0x10 */ u32 mFlags;
    /* 0x14 */ u8 field_0x14;
};  // Size: 0x18

STATIC_ASSERT(sizeof(J3DSkinDeform) == 0x18);

class J3DDeformer {
public:
    J3DDeformer(J3DDeformData* data) {
        clear();
        mDeformData = data;
    }
    void clear();
    void deform(J3DVertexBuffer*, u16, f32*);
    void deform(J3DVertexBuffer*, u16);
    void deform_VtxPosF32(J3DVertexBuffer*, J3DCluster*, J3DClusterKey*, f32*);
    void deform_VtxNrmF32(J3DVertexBuffer*, J3DCluster*, J3DClusterKey*, f32*);
    void normalize(f32*);
    void normalizeWeight(int, f32*);

    bool checkFlag(u32 i_flag) { return mFlags & i_flag; }

private:
    friend class J3DClusterLoader;
    friend class J3DClusterLoader_v15;

    /* 0x00 */ J3DDeformData* mDeformData;
    /* 0x04 */ J3DAnmCluster* mAnmCluster;
    /* 0x08 */ f32* mWeightList;
    /* 0x0C */ f32* field_0x0c;
    /* 0x10 */ u32 mFlags;
};  // Size: 0x14

#endif /* J3DSKINDEFORM_H */