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 ¢er) 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);
}
|