the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1//package net.minecraft.world.phys;
2
3//import java->util.ArrayList;
4//import java->util.List;
5
6#include "stdafx.h"
7#include "AABB.h"
8#include "HitResult.h"
9
10DWORD AABB::tlsIdx = 0;
11AABB::ThreadStorage *AABB::tlsDefault = NULL;
12
13AABB::ThreadStorage::ThreadStorage()
14{
15 pool = new AABB[POOL_SIZE];
16 poolPointer = 0;
17}
18
19
20AABB::ThreadStorage::~ThreadStorage()
21{
22 delete pool;
23}
24
25void AABB::CreateNewThreadStorage()
26{
27 ThreadStorage *tls = new ThreadStorage();
28 if(tlsDefault == NULL )
29 {
30 tlsIdx = TlsAlloc();
31 tlsDefault = tls;
32 }
33
34 TlsSetValue(tlsIdx, tls);
35}
36
37void AABB::UseDefaultThreadStorage()
38{
39 TlsSetValue(tlsIdx, tlsDefault);
40}
41
42void AABB::ReleaseThreadStorage()
43{
44 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(tlsIdx);
45 if( tls == tlsDefault ) return;
46
47 delete tls;
48}
49
50AABB *AABB::newPermanent(double x0, double y0, double z0, double x1, double y1, double z1)
51{
52 return new AABB(x0, y0, z0, x1, y1, z1);
53}
54
55void AABB::clearPool()
56{
57}
58
59void AABB::resetPool()
60{
61}
62
63AABB *AABB::newTemp(double x0, double y0, double z0, double x1, double y1, double z1)
64{
65 ThreadStorage *tls = (ThreadStorage *)TlsGetValue(tlsIdx);
66 AABB *thisAABB = &tls->pool[tls->poolPointer];
67 thisAABB->set(x0, y0, z0, x1, y1, z1);
68 tls->poolPointer = ( tls->poolPointer + 1 ) % ThreadStorage::POOL_SIZE;
69 return thisAABB;
70}
71
72AABB::AABB(double x0, double y0, double z0, double x1, double y1, double z1)
73{
74 this->x0 = x0;
75 this->y0 = y0;
76 this->z0 = z0;
77 this->x1 = x1;
78 this->y1 = y1;
79 this->z1 = z1;
80}
81
82
83AABB *AABB::set(double x0, double y0, double z0, double x1, double y1, double z1)
84{
85 this->x0 = x0;
86 this->y0 = y0;
87 this->z0 = z0;
88 this->x1 = x1;
89 this->y1 = y1;
90 this->z1 = z1;
91 return this;
92}
93
94AABB *AABB::expand(double xa, double ya, double za)
95{
96 double _x0 = x0;
97 double _y0 = y0;
98 double _z0 = z0;
99 double _x1 = x1;
100 double _y1 = y1;
101 double _z1 = z1;
102
103 if (xa < 0) _x0 += xa;
104 if (xa > 0) _x1 += xa;
105
106 if (ya < 0) _y0 += ya;
107 if (ya > 0) _y1 += ya;
108
109 if (za < 0) _z0 += za;
110 if (za > 0) _z1 += za;
111
112 return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
113}
114
115AABB *AABB::grow(double xa, double ya, double za)
116{
117 double _x0 = x0 - xa;
118 double _y0 = y0 - ya;
119 double _z0 = z0 - za;
120 double _x1 = x1 + xa;
121 double _y1 = y1 + ya;
122 double _z1 = z1 + za;
123
124 return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
125}
126
127AABB *AABB::minmax(AABB *other)
128{
129 double _x0 = min(x0, other->x0);
130 double _y0 = min(y0, other->y0);
131 double _z0 = min(z0, other->z0);
132 double _x1 = max(x1, other->x1);
133 double _y1 = max(y1, other->y1);
134 double _z1 = max(z1, other->z1);
135
136 return newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
137}
138
139AABB *AABB::cloneMove(double xa, double ya, double za)
140{
141 return AABB::newTemp(x0 + xa, y0 + ya, z0 + za, x1 + xa, y1 + ya, z1 + za);
142}
143
144double AABB::clipXCollide(AABB *c, double xa)
145{
146 if (c->y1 <= y0 || c->y0 >= y1) return xa;
147 if (c->z1 <= z0 || c->z0 >= z1) return xa;
148
149 if (xa > 0 && c->x1 <= x0)
150 {
151 double max = x0 - c->x1;
152 if (max < xa) xa = max;
153 }
154 if (xa < 0 && c->x0 >= x1)
155 {
156 double max = x1 - c->x0;
157 if (max > xa) xa = max;
158 }
159
160 return xa;
161}
162
163double AABB::clipYCollide(AABB *c, double ya)
164{
165 if (c->x1 <= x0 || c->x0 >= x1) return ya;
166 if (c->z1 <= z0 || c->z0 >= z1) return ya;
167
168 if (ya > 0 && c->y1 <= y0)
169 {
170 double max = y0 - c->y1;
171 if (max < ya) ya = max;
172 }
173 if (ya < 0 && c->y0 >= y1)
174 {
175 double max = y1 - c->y0;
176 if (max > ya) ya = max;
177 }
178
179 return ya;
180}
181
182double AABB::clipZCollide(AABB *c, double za)
183{
184 if (c->x1 <= x0 || c->x0 >= x1) return za;
185 if (c->y1 <= y0 || c->y0 >= y1) return za;
186
187 if (za > 0 && c->z1 <= z0)
188 {
189 double max = z0 - c->z1;
190 if (max < za) za = max;
191 }
192 if (za < 0 && c->z0 >= z1)
193 {
194 double max = z1 - c->z0;
195 if (max > za) za = max;
196 }
197
198 return za;
199}
200
201bool AABB::intersects(AABB *c)
202{
203 if (c->x1 <= x0 || c->x0 >= x1) return false;
204 if (c->y1 <= y0 || c->y0 >= y1) return false;
205 if (c->z1 <= z0 || c->z0 >= z1) return false;
206 return true;
207}
208
209bool AABB::intersectsInner(AABB *c)
210{
211 if (c->x1 < x0 || c->x0 > x1) return false;
212 if (c->y1 < y0 || c->y0 > y1) return false;
213 if (c->z1 < z0 || c->z0 > z1) return false;
214 return true;
215}
216
217AABB *AABB::move(double xa, double ya, double za)
218{
219 x0 += xa;
220 y0 += ya;
221 z0 += za;
222 x1 += xa;
223 y1 += ya;
224 z1 += za;
225 return this;
226}
227
228bool AABB::intersects(double x02, double y02, double z02, double x12, double y12, double z12)
229{
230 if (x12 <= x0 || x02 >= x1) return false;
231 if (y12 <= y0 || y02 >= y1) return false;
232 if (z12 <= z0 || z02 >= z1) return false;
233 return true;
234}
235
236bool AABB::contains(Vec3 *p)
237{
238 if (p->x <= x0 || p->x >= x1) return false;
239 if (p->y <= y0 || p->y >= y1) return false;
240 if (p->z <= z0 || p->z >= z1) return false;
241 return true;
242}
243
244// 4J Added
245bool AABB::containsIncludingLowerBound(Vec3 *p)
246{
247 if (p->x < x0 || p->x >= x1) return false;
248 if (p->y < y0 || p->y >= y1) return false;
249 if (p->z < z0 || p->z >= z1) return false;
250 return true;
251}
252
253double AABB::getSize()
254{
255 double xs = x1 - x0;
256 double ys = y1 - y0;
257 double zs = z1 - z0;
258 return (xs + ys + zs) / 3.0f;
259}
260
261AABB *AABB::shrink(double xa, double ya, double za)
262{
263 double _x0 = x0 + xa;
264 double _y0 = y0 + ya;
265 double _z0 = z0 + za;
266 double _x1 = x1 - xa;
267 double _y1 = y1 - ya;
268 double _z1 = z1 - za;
269
270 return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1);
271}
272
273AABB *AABB::copy()
274{
275 return AABB::newTemp(x0, y0, z0, x1, y1, z1);
276}
277
278HitResult *AABB::clip(Vec3 *a, Vec3 *b)
279{
280 Vec3 *xh0 = a->clipX(b, x0);
281 Vec3 *xh1 = a->clipX(b, x1);
282
283 Vec3 *yh0 = a->clipY(b, y0);
284 Vec3 *yh1 = a->clipY(b, y1);
285
286 Vec3 *zh0 = a->clipZ(b, z0);
287 Vec3 *zh1 = a->clipZ(b, z1);
288
289 if (!containsX(xh0)) xh0 = NULL;
290 if (!containsX(xh1)) xh1 = NULL;
291 if (!containsY(yh0)) yh0 = NULL;
292 if (!containsY(yh1)) yh1 = NULL;
293 if (!containsZ(zh0)) zh0 = NULL;
294 if (!containsZ(zh1)) zh1 = NULL;
295
296 Vec3 *closest = NULL;
297
298 if (xh0 != NULL && (closest == NULL || a->distanceToSqr(xh0) < a->distanceToSqr(closest))) closest = xh0;
299 if (xh1 != NULL && (closest == NULL || a->distanceToSqr(xh1) < a->distanceToSqr(closest))) closest = xh1;
300 if (yh0 != NULL && (closest == NULL || a->distanceToSqr(yh0) < a->distanceToSqr(closest))) closest = yh0;
301 if (yh1 != NULL && (closest == NULL || a->distanceToSqr(yh1) < a->distanceToSqr(closest))) closest = yh1;
302 if (zh0 != NULL && (closest == NULL || a->distanceToSqr(zh0) < a->distanceToSqr(closest))) closest = zh0;
303 if (zh1 != NULL && (closest == NULL || a->distanceToSqr(zh1) < a->distanceToSqr(closest))) closest = zh1;
304
305 if (closest == NULL) return NULL;
306
307 int face = -1;
308
309 if (closest == xh0) face = 4;
310 if (closest == xh1) face = 5;
311 if (closest == yh0) face = 0;
312 if (closest == yh1) face = 1;
313 if (closest == zh0) face = 2;
314 if (closest == zh1) face = 3;
315
316 return new HitResult(0, 0, 0, face, closest);
317}
318
319
320bool AABB::containsX(Vec3 *v)
321{
322 if (v == NULL) return false;
323 return v->y >= y0 && v->y <= y1 && v->z >= z0 && v->z <= z1;
324}
325
326bool AABB::containsY(Vec3 *v)
327{
328 if (v == NULL) return false;
329 return v->x >= x0 && v->x <= x1 && v->z >= z0 && v->z <= z1;
330}
331
332bool AABB::containsZ(Vec3 *v)
333{
334 if (v == NULL) return false;
335 return v->x >= x0 && v->x <= x1 && v->y >= y0 && v->y <= y1;
336}
337
338
339void AABB::set(AABB *b)
340{
341 x0 = b->x0;
342 y0 = b->y0;
343 z0 = b->z0;
344 x1 = b->x1;
345 y1 = b->y1;
346 z1 = b->z1;
347}
348
349wstring AABB::toString()
350{
351 return L"box[" + _toString<double>(x0) + L", " + _toString<double>(y0) + L", " + _toString<double>(z0) + L" -> " +
352 _toString<double>(x1) + L", " + _toString<double>(y1) + L", " + _toString<double>(z1) + L"]";
353}
354