summaryrefslogtreecommitdiff
path: root/include/SSystem/SComponent/c_m3d_g_tri.h
blob: 29282c4be4613f3479628fe09e0e7d2c6de67005 (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
#ifndef C_M3D_G_TRI_H_
#define C_M3D_G_TRI_H_

#include "SSystem/SComponent/c_m3d_g_pla.h"
#include "dolphin/types.h"

class cM3dGCyl;

struct cM3dGTriS {
    Vec a;
    Vec b;
    Vec c;
};

class cM3dGTri : public cM3dGPla {
public:
    /* 0x00 */ /* cM3dGPla */
    /* 0x14 */ Vec mA;
    /* 0x20 */ Vec mB;
    /* 0x2C */ Vec mC;

public:
    cM3dGTri() {}
    cM3dGTri(const Vec *pA, const Vec *pB, const Vec *pC);

    bool cross(const cM3dGCyl* cyl, Vec* out) const;
    bool cross(const cM3dGLin* line, Vec* vec, bool param_3, bool param_4) const {
        return cM3d_Cross_LinTri(line, this, vec, param_3, param_4);
    }

    bool Cross(const cM3dGCps& cps, Vec* out) const { return cM3d_Cross_CpsTri(cps, *this, out); }
    bool Cross(const cM3dGCyl& cyl, Vec* out) const { return cross(&cyl, out); }
    bool Cross(const cM3dGSph& sph, Vec* out) const { return cM3d_Cross_SphTri(&sph, this, out); }
    bool Cross(const cM3dGTri& tri, Vec* out) const { return cM3d_Cross_TriTri(tri, *this, out); }

    bool crossX(const Vec* pos, f32* pcross_len) const { return cM3d_CrossX_Tri(this, pos, pcross_len); }
    bool crossY(const Vec* pos) const { return cM3d_CrossY_Tri(this, pos); }
    bool crossZ(const Vec* pos, f32* pcross_len) const { return cM3d_CrossZ_Tri(this, pos, pcross_len); }

    void Up(f32 dist) {
        Vec delta;
        VECScale(&mNormal, &delta, dist);
        VECAdd(&mA, &delta, &mA);
        VECAdd(&mB, &delta, &mB);
        VECAdd(&mC, &delta, &mC);
        mD -= dist;
    }

    void setBg(const Vec* a, const Vec* b, const Vec* c, const cM3dGPla* pla) {
        mA = *a;
        mB = *b;
        mC = *c;
        Set(pla);
    }
    void setPos(const Vec* a, const Vec* b, const Vec* c) {
        mA = *a;
        mB = *b;
        mC = *c;
        setUp();
    }
    void setUp() {
        SetupFrom3Vtx(&mA, &mB, &mC);
    }

    virtual ~cM3dGTri() {}
};  // Size: 0x38

#endif