the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 354 lines 7.5 kB view raw
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