summaryrefslogtreecommitdiff
path: root/src/d/col/c/c_m3d_g_aab.cpp
blob: 1878874137f6105c013192576017a5e9441eb13f (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
#include "d/col/c/c_m3d_g_aab.h"

#include "rvl/MTX.h" // IWYU pragma: export

void cM3dGAab::SetMin(const mVec3_c &min) {
    if (mMin.x > min.x) {
        mMin.x = min.x;
    }
    if (mMin.y > min.y) {
        mMin.y = min.y;
    }
    if (mMin.z > min.z) {
        mMin.z = min.z;
    }
}

void cM3dGAab::SetMax(const mVec3_c &max) {
    if (mMax.x < max.x) {
        mMax.x = max.x;
    }
    if (mMax.y < max.y) {
        mMax.y = max.y;
    }
    if (mMax.z < max.z) {
        mMax.z = max.z;
    }
}

void cM3dGAab::CalcCenter(mVec3_c &center) const {
    VECAdd(mMin, mMax, center);
    VECScale(center, center, 0.5f);
}

void cM3dGAab::PlusR(f32 r) {
    mMin -= r;
    mMax += r;
}

void cM3dGAab::Clamp(const mVec3_c &in, mVec3_c &out) const {
    f32 x = in.x;
    if (x < mMin.x) {
        x = mMin.x;
    }
    if (x > mMax.x) {
        x = mMax.x;
    }
    out.x = x;

    f32 y = in.y;
    if (y < mMin.y) {
        y = mMin.y;
    }
    if (y > mMax.y) {
        y = mMax.y;
    }
    out.y = y;

    f32 z = in.z;
    if (z < mMin.z) {
        z = mMin.z;
    }
    if (z > mMax.z) {
        z = mMax.z;
    }
    out.z = z;
}

void cM3dGAab::Set(const cM3dGSph &sph) {
    mVec3_c min, max;
    min = max = sph.GetC();

    f32 r = sph.GetR();

    f32 ratio = sph.mRatio;
    if (ratio < 1.0f) {
        ratio = 1.0f;
    }
    f32 h = r * ratio;

    min.x -= r;
    min.y -= h;
    min.z -= r;

    max.x += r;
    max.y += h;
    max.z += r;

    Set(min, max);
}

bool cM3dGAab::Cross(const mVec3_c &pos) const {
    if ((mMin.x < pos.x && pos.x < mMax.x) && (mMin.y < pos.y && pos.y < mMax.y) &&
        (mMin.z < pos.z && pos.z < mMax.z)) {
        return true;
    }
    return false;
}

void cM3dGAab::SetBounds(const mVec3_c &pntA, const mVec3_c &pntB) {
    if (pntA.x < pntB.x) {
        mMin.x = pntA.x;
        mMax.x = pntB.x;
    } else {
        mMin.x = pntB.x;
        mMax.x = pntA.x;
    }
    if (pntA.y < pntB.y) {
        mMin.y = pntA.y;
        mMax.y = pntB.y;
    } else {
        mMin.y = pntB.y;
        mMax.y = pntA.y;
    }
    if (pntA.z < pntB.z) {
        mMin.z = pntA.z;
        mMax.z = pntB.z;
    } else {
        mMin.z = pntB.z;
        mMax.z = pntA.z;
    }
    PlusR(1.0f);
}