three
Version:
JavaScript 3D library
1,418 lines • 1.14 MB
JavaScript
// Generated by Haxe 4.2.0
var oimo = oimo || {};
if(!oimo.collision) oimo.collision = {};
if(!oimo.collision.broadphase) oimo.collision.broadphase = {};
oimo.collision.broadphase.BroadPhase = class oimo_collision_broadphase_BroadPhase {
constructor(type) {
this._type = type;
this._numProxies = 0;
this._proxyList = null;
this._proxyListLast = null;
this._proxyPairList = null;
this._incremental = false;
this._testCount = 0;
this._proxyPairPool = null;
this._idCount = 0;
this._convexSweep = new oimo.collision.broadphase._BroadPhase.ConvexSweepGeometry();
this._aabb = new oimo.collision.broadphase._BroadPhase.AabbGeometry();
this.identity = new oimo.common.Transform();
this.zero = new oimo.common.Vec3();
this.rayCastHit = new oimo.collision.geometry.RayCastHit();
}
createProxy(userData,aabb) {
return null;
}
destroyProxy(proxy) {
}
moveProxy(proxy,aabb,displacement) {
}
isOverlapping(proxy1,proxy2) {
if(proxy1._aabbMinX < proxy2._aabbMaxX && proxy1._aabbMaxX > proxy2._aabbMinX && proxy1._aabbMinY < proxy2._aabbMaxY && proxy1._aabbMaxY > proxy2._aabbMinY && proxy1._aabbMinZ < proxy2._aabbMaxZ) {
return proxy1._aabbMaxZ > proxy2._aabbMinZ;
} else {
return false;
}
}
collectPairs() {
}
getProxyPairList() {
return this._proxyPairList;
}
isIncremental() {
return this._incremental;
}
getTestCount() {
return this._testCount;
}
rayCast(begin,end,callback) {
}
convexCast(convex,begin,translation,callback) {
}
aabbTest(aabb,callback) {
}
}
if(!oimo.collision.geometry) oimo.collision.geometry = {};
oimo.collision.geometry.Geometry = class oimo_collision_geometry_Geometry {
constructor(type) {
this._type = type;
this._volume = 0;
}
_updateMass() {
}
_computeAabb(aabb,tf) {
}
_rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) {
return false;
}
getType() {
return this._type;
}
getVolume() {
return this._volume;
}
rayCast(begin,end,transform,hit) {
let beginLocalX;
let beginLocalY;
let beginLocalZ;
let endLocalX;
let endLocalY;
let endLocalZ;
beginLocalX = begin.x;
beginLocalY = begin.y;
beginLocalZ = begin.z;
endLocalX = end.x;
endLocalY = end.y;
endLocalZ = end.z;
beginLocalX -= transform._positionX;
beginLocalY -= transform._positionY;
beginLocalZ -= transform._positionZ;
endLocalX -= transform._positionX;
endLocalY -= transform._positionY;
endLocalZ -= transform._positionZ;
let __tmp__X;
let __tmp__Y;
let __tmp__Z;
__tmp__X = transform._rotation00 * beginLocalX + transform._rotation10 * beginLocalY + transform._rotation20 * beginLocalZ;
__tmp__Y = transform._rotation01 * beginLocalX + transform._rotation11 * beginLocalY + transform._rotation21 * beginLocalZ;
__tmp__Z = transform._rotation02 * beginLocalX + transform._rotation12 * beginLocalY + transform._rotation22 * beginLocalZ;
beginLocalX = __tmp__X;
beginLocalY = __tmp__Y;
beginLocalZ = __tmp__Z;
let __tmp__X1;
let __tmp__Y1;
let __tmp__Z1;
__tmp__X1 = transform._rotation00 * endLocalX + transform._rotation10 * endLocalY + transform._rotation20 * endLocalZ;
__tmp__Y1 = transform._rotation01 * endLocalX + transform._rotation11 * endLocalY + transform._rotation21 * endLocalZ;
__tmp__Z1 = transform._rotation02 * endLocalX + transform._rotation12 * endLocalY + transform._rotation22 * endLocalZ;
endLocalX = __tmp__X1;
endLocalY = __tmp__Y1;
endLocalZ = __tmp__Z1;
if(this._rayCastLocal(beginLocalX,beginLocalY,beginLocalZ,endLocalX,endLocalY,endLocalZ,hit)) {
let localPosX;
let localPosY;
let localPosZ;
let localNormalX;
let localNormalY;
let localNormalZ;
let v = hit.position;
localPosX = v.x;
localPosY = v.y;
localPosZ = v.z;
let v1 = hit.normal;
localNormalX = v1.x;
localNormalY = v1.y;
localNormalZ = v1.z;
let __tmp__X;
let __tmp__Y;
let __tmp__Z;
__tmp__X = transform._rotation00 * localPosX + transform._rotation01 * localPosY + transform._rotation02 * localPosZ;
__tmp__Y = transform._rotation10 * localPosX + transform._rotation11 * localPosY + transform._rotation12 * localPosZ;
__tmp__Z = transform._rotation20 * localPosX + transform._rotation21 * localPosY + transform._rotation22 * localPosZ;
localPosX = __tmp__X;
localPosY = __tmp__Y;
localPosZ = __tmp__Z;
let __tmp__X1;
let __tmp__Y1;
let __tmp__Z1;
__tmp__X1 = transform._rotation00 * localNormalX + transform._rotation01 * localNormalY + transform._rotation02 * localNormalZ;
__tmp__Y1 = transform._rotation10 * localNormalX + transform._rotation11 * localNormalY + transform._rotation12 * localNormalZ;
__tmp__Z1 = transform._rotation20 * localNormalX + transform._rotation21 * localNormalY + transform._rotation22 * localNormalZ;
localNormalX = __tmp__X1;
localNormalY = __tmp__Y1;
localNormalZ = __tmp__Z1;
localPosX += transform._positionX;
localPosY += transform._positionY;
localPosZ += transform._positionZ;
let v2 = hit.position;
v2.x = localPosX;
v2.y = localPosY;
v2.z = localPosZ;
let v3 = hit.normal;
v3.x = localNormalX;
v3.y = localNormalY;
v3.z = localNormalZ;
return true;
}
return false;
}
}
oimo.collision.geometry.ConvexGeometry = class oimo_collision_geometry_ConvexGeometry extends oimo.collision.geometry.Geometry {
constructor(type) {
super(type);
this._gjkMargin = oimo.common.Setting.defaultGJKMargin;
this._useGjkRayCast = false;
}
getGjkMergin() {
return this._gjkMargin;
}
setGjkMergin(gjkMergin) {
if(gjkMergin < 0) {
gjkMergin = 0;
}
this._gjkMargin = gjkMergin;
}
computeLocalSupportingVertex(dir,out) {
}
rayCast(begin,end,transform,hit) {
if(this._useGjkRayCast) {
return oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance.rayCast(this,transform,begin,end,hit);
} else {
return super.rayCast(begin,end,transform,hit);
}
}
}
if(!oimo.collision.broadphase._BroadPhase) oimo.collision.broadphase._BroadPhase = {};
oimo.collision.broadphase._BroadPhase.ConvexSweepGeometry = class oimo_collision_broadphase__$BroadPhase_ConvexSweepGeometry extends oimo.collision.geometry.ConvexGeometry {
constructor() {
super(-1);
}
init(c,transform,translation) {
this.c = c;
let trX;
let trY;
let trZ;
trX = translation.x;
trY = translation.y;
trZ = translation.z;
let localTrX;
let localTrY;
let localTrZ;
let __tmp__X;
let __tmp__Y;
let __tmp__Z;
__tmp__X = transform._rotation00 * trX + transform._rotation10 * trY + transform._rotation20 * trZ;
__tmp__Y = transform._rotation01 * trX + transform._rotation11 * trY + transform._rotation21 * trZ;
__tmp__Z = transform._rotation02 * trX + transform._rotation12 * trY + transform._rotation22 * trZ;
localTrX = __tmp__X;
localTrY = __tmp__Y;
localTrZ = __tmp__Z;
this.localTranslation = new oimo.common.Vec3();
let v = this.localTranslation;
v.x = localTrX;
v.y = localTrY;
v.z = localTrZ;
this._gjkMargin = c._gjkMargin;
}
computeLocalSupportingVertex(dir,out) {
this.c.computeLocalSupportingVertex(dir,out);
let v = this.localTranslation;
if(dir.x * v.x + dir.y * v.y + dir.z * v.z > 0) {
let v = this.localTranslation;
out.x += v.x;
out.y += v.y;
out.z += v.z;
}
}
}
oimo.collision.broadphase._BroadPhase.AabbGeometry = class oimo_collision_broadphase__$BroadPhase_AabbGeometry extends oimo.collision.geometry.ConvexGeometry {
constructor() {
super(-1);
this.min = new oimo.common.Vec3();
this.max = new oimo.common.Vec3();
}
computeLocalSupportingVertex(dir,out) {
out.x = dir.x > 0 ? this.max.x : this.min.x;
out.y = dir.y > 0 ? this.max.y : this.min.y;
out.z = dir.z > 0 ? this.max.z : this.min.z;
}
}
oimo.collision.broadphase.BroadPhaseProxyCallback = class oimo_collision_broadphase_BroadPhaseProxyCallback {
constructor() {
}
process(proxy) {
}
}
oimo.collision.broadphase.BroadPhaseType = class oimo_collision_broadphase_BroadPhaseType {
}
oimo.collision.broadphase.Proxy = class oimo_collision_broadphase_Proxy {
constructor(userData,id) {
this.userData = userData;
this._id = id;
this._prev = null;
this._next = null;
this._aabbMinX = 0;
this._aabbMinY = 0;
this._aabbMinZ = 0;
this._aabbMaxX = 0;
this._aabbMaxY = 0;
this._aabbMaxZ = 0;
}
getId() {
return this._id;
}
getFatAabb() {
let aabb = new oimo.collision.geometry.Aabb();
aabb._minX = this._aabbMinX;
aabb._minY = this._aabbMinY;
aabb._minZ = this._aabbMinZ;
aabb._maxX = this._aabbMaxX;
aabb._maxY = this._aabbMaxY;
aabb._maxZ = this._aabbMaxZ;
return aabb;
}
getFatAabbTo(aabb) {
aabb._minX = this._aabbMinX;
aabb._minY = this._aabbMinY;
aabb._minZ = this._aabbMinZ;
aabb._maxX = this._aabbMaxX;
aabb._maxY = this._aabbMaxY;
aabb._maxZ = this._aabbMaxZ;
}
}
oimo.collision.broadphase.ProxyPair = class oimo_collision_broadphase_ProxyPair {
constructor() {
this._p1 = null;
this._p2 = null;
}
getProxy1() {
return this._p1;
}
getProxy2() {
return this._p2;
}
getNext() {
return this._next;
}
}
if(!oimo.collision.broadphase.bruteforce) oimo.collision.broadphase.bruteforce = {};
oimo.collision.broadphase.bruteforce.BruteForceBroadPhase = class oimo_collision_broadphase_bruteforce_BruteForceBroadPhase extends oimo.collision.broadphase.BroadPhase {
constructor() {
super(1);
this._incremental = false;
}
createProxy(userData,aabb) {
let proxy = new oimo.collision.broadphase.Proxy(userData,this._idCount++);
this._numProxies++;
if(this._proxyList == null) {
this._proxyList = proxy;
this._proxyListLast = proxy;
} else {
this._proxyListLast._next = proxy;
proxy._prev = this._proxyListLast;
this._proxyListLast = proxy;
}
proxy._aabbMinX = aabb._minX;
proxy._aabbMinY = aabb._minY;
proxy._aabbMinZ = aabb._minZ;
proxy._aabbMaxX = aabb._maxX;
proxy._aabbMaxY = aabb._maxY;
proxy._aabbMaxZ = aabb._maxZ;
return proxy;
}
destroyProxy(proxy) {
this._numProxies--;
let prev = proxy._prev;
let next = proxy._next;
if(prev != null) {
prev._next = next;
}
if(next != null) {
next._prev = prev;
}
if(proxy == this._proxyList) {
this._proxyList = this._proxyList._next;
}
if(proxy == this._proxyListLast) {
this._proxyListLast = this._proxyListLast._prev;
}
proxy._next = null;
proxy._prev = null;
proxy.userData = null;
}
moveProxy(proxy,aabb,dislacement) {
proxy._aabbMinX = aabb._minX;
proxy._aabbMinY = aabb._minY;
proxy._aabbMinZ = aabb._minZ;
proxy._aabbMaxX = aabb._maxX;
proxy._aabbMaxY = aabb._maxY;
proxy._aabbMaxZ = aabb._maxZ;
}
collectPairs() {
let p = this._proxyPairList;
if(p != null) {
while(true) {
p._p1 = null;
p._p2 = null;
p = p._next;
if(!(p != null)) {
break;
}
}
this._proxyPairList._next = this._proxyPairPool;
this._proxyPairPool = this._proxyPairList;
this._proxyPairList = null;
}
this._testCount = 0;
let p1 = this._proxyList;
while(p1 != null) {
let n = p1._next;
let p2 = p1._next;
while(p2 != null) {
let n = p2._next;
this._testCount++;
if(p1._aabbMinX < p2._aabbMaxX && p1._aabbMaxX > p2._aabbMinX && p1._aabbMinY < p2._aabbMaxY && p1._aabbMaxY > p2._aabbMinY && p1._aabbMinZ < p2._aabbMaxZ && p1._aabbMaxZ > p2._aabbMinZ) {
let first = this._proxyPairPool;
if(first != null) {
this._proxyPairPool = first._next;
first._next = null;
} else {
first = new oimo.collision.broadphase.ProxyPair();
}
let pp = first;
if(this._proxyPairList == null) {
this._proxyPairList = pp;
} else {
pp._next = this._proxyPairList;
this._proxyPairList = pp;
}
pp._p1 = p1;
pp._p2 = p2;
}
p2 = n;
}
p1 = n;
}
}
rayCast(begin,end,callback) {
let p1X;
let p1Y;
let p1Z;
let p2X;
let p2Y;
let p2Z;
p1X = begin.x;
p1Y = begin.y;
p1Z = begin.z;
p2X = end.x;
p2Y = end.y;
p2Z = end.z;
let p = this._proxyList;
while(p != null) {
let n = p._next;
let x1 = p1X;
let y1 = p1Y;
let z1 = p1Z;
let x2 = p2X;
let y2 = p2Y;
let z2 = p2Z;
let pminx = p._aabbMinX;
let pminy = p._aabbMinY;
let pminz = p._aabbMinZ;
let pmaxx = p._aabbMaxX;
let pmaxy = p._aabbMaxY;
let pmaxz = p._aabbMaxZ;
let tmp;
if(pminx > (x1 > x2 ? x1 : x2) || pmaxx < (x1 < x2 ? x1 : x2) || pminy > (y1 > y2 ? y1 : y2) || pmaxy < (y1 < y2 ? y1 : y2) || pminz > (z1 > z2 ? z1 : z2) || pmaxz < (z1 < z2 ? z1 : z2)) {
tmp = false;
} else {
let dx = x2 - x1;
let dy = y2 - y1;
let dz = z2 - z1;
let adx = dx < 0 ? -dx : dx;
let ady = dy < 0 ? -dy : dy;
let adz = dz < 0 ? -dz : dz;
let pextx = (pmaxx - pminx) * 0.5;
let pexty = (pmaxy - pminy) * 0.5;
let pextz = (pmaxz - pminz) * 0.5;
let cpx = x1 - (pmaxx + pminx) * 0.5;
let cpy = y1 - (pmaxy + pminy) * 0.5;
let cpz = z1 - (pmaxz + pminz) * 0.5;
let tmp1;
let tmp2;
let x = cpy * dz - cpz * dy;
if(!((x < 0 ? -x : x) - (pexty * adz + pextz * ady) > 0)) {
let x = cpz * dx - cpx * dz;
tmp2 = (x < 0 ? -x : x) - (pextz * adx + pextx * adz) > 0;
} else {
tmp2 = true;
}
if(!tmp2) {
let x = cpx * dy - cpy * dx;
tmp1 = (x < 0 ? -x : x) - (pextx * ady + pexty * adx) > 0;
} else {
tmp1 = true;
}
tmp = tmp1 ? false : true;
}
if(tmp) {
callback.process(p);
}
p = n;
}
}
convexCast(convex,begin,translation,callback) {
let p = this._proxyList;
while(p != null) {
let n = p._next;
let v = this._aabb.min;
v.x = p._aabbMinX;
v.y = p._aabbMinY;
v.z = p._aabbMinZ;
let v1 = this._aabb.max;
v1.x = p._aabbMaxX;
v1.y = p._aabbMaxY;
v1.z = p._aabbMaxZ;
this._convexSweep.init(convex,begin,translation);
let gjkEpa = oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance;
if(gjkEpa.computeClosestPointsImpl(this._convexSweep,this._aabb,begin,this.identity,null,false) == 0 && gjkEpa.distance <= 0) {
callback.process(p);
}
p = n;
}
}
aabbTest(aabb,callback) {
let p = this._proxyList;
while(p != null) {
let n = p._next;
if(aabb._minX < p._aabbMaxX && aabb._maxX > p._aabbMinX && aabb._minY < p._aabbMaxY && aabb._maxY > p._aabbMinY && aabb._minZ < p._aabbMaxZ && aabb._maxZ > p._aabbMinZ) {
callback.process(p);
}
p = n;
}
}
}
if(!oimo.collision.broadphase.bvh) oimo.collision.broadphase.bvh = {};
oimo.collision.broadphase.bvh.BvhBroadPhase = class oimo_collision_broadphase_bvh_BvhBroadPhase extends oimo.collision.broadphase.BroadPhase {
constructor() {
super(2);
this._incremental = true;
this._tree = new oimo.collision.broadphase.bvh.BvhTree();
this.movedProxies = new Array(1024);
this.numMovedProxies = 0;
}
collide(n1,n2) {
this._testCount++;
let l1 = n1._height == 0;
let l2 = n2._height == 0;
if(n1 == n2) {
if(l1) {
return;
}
this.collide(n1._children[0],n2);
this.collide(n1._children[1],n2);
return;
}
if(!(n1._aabbMinX < n2._aabbMaxX && n1._aabbMaxX > n2._aabbMinX && n1._aabbMinY < n2._aabbMaxY && n1._aabbMaxY > n2._aabbMinY && n1._aabbMinZ < n2._aabbMaxZ && n1._aabbMaxZ > n2._aabbMinZ)) {
return;
}
if(l1 && l2) {
let first = this._proxyPairPool;
if(first != null) {
this._proxyPairPool = first._next;
first._next = null;
} else {
first = new oimo.collision.broadphase.ProxyPair();
}
let pp = first;
if(this._proxyPairList == null) {
this._proxyPairList = pp;
} else {
pp._next = this._proxyPairList;
this._proxyPairList = pp;
}
pp._p1 = n1._proxy;
pp._p2 = n2._proxy;
return;
}
if(l2 || n1._height > n2._height) {
this.collide(n1._children[0],n2);
this.collide(n1._children[1],n2);
} else {
this.collide(n2._children[0],n1);
this.collide(n2._children[1],n1);
}
}
rayCastRecursive(node,_p1X,_p1Y,_p1Z,_p2X,_p2Y,_p2Z,callback) {
let x1 = _p1X;
let y1 = _p1Y;
let z1 = _p1Z;
let x2 = _p2X;
let y2 = _p2Y;
let z2 = _p2Z;
let pminx = node._aabbMinX;
let pminy = node._aabbMinY;
let pminz = node._aabbMinZ;
let pmaxx = node._aabbMaxX;
let pmaxy = node._aabbMaxY;
let pmaxz = node._aabbMaxZ;
let tmp;
if(pminx > (x1 > x2 ? x1 : x2) || pmaxx < (x1 < x2 ? x1 : x2) || pminy > (y1 > y2 ? y1 : y2) || pmaxy < (y1 < y2 ? y1 : y2) || pminz > (z1 > z2 ? z1 : z2) || pmaxz < (z1 < z2 ? z1 : z2)) {
tmp = false;
} else {
let dx = x2 - x1;
let dy = y2 - y1;
let dz = z2 - z1;
let adx = dx < 0 ? -dx : dx;
let ady = dy < 0 ? -dy : dy;
let adz = dz < 0 ? -dz : dz;
let pextx = (pmaxx - pminx) * 0.5;
let pexty = (pmaxy - pminy) * 0.5;
let pextz = (pmaxz - pminz) * 0.5;
let cpx = x1 - (pmaxx + pminx) * 0.5;
let cpy = y1 - (pmaxy + pminy) * 0.5;
let cpz = z1 - (pmaxz + pminz) * 0.5;
let tmp1;
let tmp2;
let x = cpy * dz - cpz * dy;
if(!((x < 0 ? -x : x) - (pexty * adz + pextz * ady) > 0)) {
let x = cpz * dx - cpx * dz;
tmp2 = (x < 0 ? -x : x) - (pextz * adx + pextx * adz) > 0;
} else {
tmp2 = true;
}
if(!tmp2) {
let x = cpx * dy - cpy * dx;
tmp1 = (x < 0 ? -x : x) - (pextx * ady + pexty * adx) > 0;
} else {
tmp1 = true;
}
tmp = tmp1 ? false : true;
}
if(!tmp) {
return;
}
if(node._height == 0) {
callback.process(node._proxy);
return;
}
this.rayCastRecursive(node._children[0],_p1X,_p1Y,_p1Z,_p2X,_p2Y,_p2Z,callback);
this.rayCastRecursive(node._children[1],_p1X,_p1Y,_p1Z,_p2X,_p2Y,_p2Z,callback);
}
convexCastRecursive(node,convex,begin,translation,callback) {
let v = this._aabb.min;
v.x = node._aabbMinX;
v.y = node._aabbMinY;
v.z = node._aabbMinZ;
let v1 = this._aabb.max;
v1.x = node._aabbMaxX;
v1.y = node._aabbMaxY;
v1.z = node._aabbMaxZ;
this._convexSweep.init(convex,begin,translation);
let gjkEpa = oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance;
if(!(gjkEpa.computeClosestPointsImpl(this._convexSweep,this._aabb,begin,this.identity,null,false) == 0 && gjkEpa.distance <= 0)) {
return;
}
if(node._height == 0) {
callback.process(node._proxy);
return;
}
this.convexCastRecursive(node._children[0],convex,begin,translation,callback);
this.convexCastRecursive(node._children[1],convex,begin,translation,callback);
}
aabbTestRecursive(node,aabb,callback) {
if(!(node._aabbMinX < aabb._maxX && node._aabbMaxX > aabb._minX && node._aabbMinY < aabb._maxY && node._aabbMaxY > aabb._minY && node._aabbMinZ < aabb._maxZ && node._aabbMaxZ > aabb._minZ)) {
return;
}
if(node._height == 0) {
callback.process(node._proxy);
return;
}
this.aabbTestRecursive(node._children[0],aabb,callback);
this.aabbTestRecursive(node._children[1],aabb,callback);
}
createProxy(userData,aabb) {
let p = new oimo.collision.broadphase.bvh.BvhProxy(userData,this._idCount++);
this._numProxies++;
if(this._proxyList == null) {
this._proxyList = p;
this._proxyListLast = p;
} else {
this._proxyListLast._next = p;
p._prev = this._proxyListLast;
this._proxyListLast = p;
}
p._aabbMinX = aabb._minX;
p._aabbMinY = aabb._minY;
p._aabbMinZ = aabb._minZ;
p._aabbMaxX = aabb._maxX;
p._aabbMaxY = aabb._maxY;
p._aabbMaxZ = aabb._maxZ;
let padding = oimo.common.Setting.bvhProxyPadding;
p._aabbMinX -= padding;
p._aabbMinY -= padding;
p._aabbMinZ -= padding;
p._aabbMaxX += padding;
p._aabbMaxY += padding;
p._aabbMaxZ += padding;
let _this = this._tree;
let first = _this._nodePool;
if(first != null) {
_this._nodePool = first._next;
first._next = null;
} else {
first = new oimo.collision.broadphase.bvh.BvhNode();
}
let leaf = first;
leaf._proxy = p;
p._leaf = leaf;
leaf._aabbMinX = p._aabbMinX;
leaf._aabbMinY = p._aabbMinY;
leaf._aabbMinZ = p._aabbMinZ;
leaf._aabbMaxX = p._aabbMaxX;
leaf._aabbMaxY = p._aabbMaxY;
leaf._aabbMaxZ = p._aabbMaxZ;
_this._numLeaves++;
if(_this.leafList == null) {
_this.leafList = leaf;
_this.leafListLast = leaf;
} else {
_this.leafListLast._nextLeaf = leaf;
leaf._prevLeaf = _this.leafListLast;
_this.leafListLast = leaf;
}
if(_this._root == null) {
_this._root = leaf;
} else {
let sibling = _this._root;
while(sibling._height > 0) {
let nextStep = _this._strategy._decideInsertion(sibling,leaf);
if(nextStep == -1) {
break;
} else {
sibling = sibling._children[nextStep];
}
}
let parent = sibling._parent;
let first = _this._nodePool;
if(first != null) {
_this._nodePool = first._next;
first._next = null;
} else {
first = new oimo.collision.broadphase.bvh.BvhNode();
}
let node = first;
if(parent == null) {
_this._root = node;
} else {
let index = sibling._childIndex;
parent._children[index] = node;
node._parent = parent;
node._childIndex = index;
}
let index = sibling._childIndex;
node._children[index] = sibling;
sibling._parent = node;
sibling._childIndex = index;
let index1 = sibling._childIndex ^ 1;
node._children[index1] = leaf;
leaf._parent = node;
leaf._childIndex = index1;
while(node != null) {
if(_this._strategy._balancingEnabled) {
if(node._height >= 2) {
let p = node._parent;
let l = node._children[0];
let r = node._children[1];
let balance = l._height - r._height;
let nodeIndex = node._childIndex;
if(balance > 1) {
let ll = l._children[0];
let lr = l._children[1];
if(ll._height > lr._height) {
l._children[1] = node;
node._parent = l;
node._childIndex = 1;
node._children[0] = lr;
lr._parent = node;
lr._childIndex = 0;
let c1 = l._children[0];
let c2 = l._children[1];
l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = l._children[0]._height;
let h2 = l._children[1]._height;
l._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
let h11 = node._children[0]._height;
let h21 = node._children[1]._height;
node._height = (h11 > h21 ? h11 : h21) + 1;
} else {
l._children[0] = node;
node._parent = l;
node._childIndex = 0;
node._children[0] = ll;
ll._parent = node;
ll._childIndex = 0;
let c1 = l._children[0];
let c2 = l._children[1];
l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = l._children[0]._height;
let h2 = l._children[1]._height;
l._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
let h11 = node._children[0]._height;
let h21 = node._children[1]._height;
node._height = (h11 > h21 ? h11 : h21) + 1;
}
if(p != null) {
p._children[nodeIndex] = l;
l._parent = p;
l._childIndex = nodeIndex;
} else {
_this._root = l;
l._parent = null;
}
node = l;
} else if(balance < -1) {
let rl = r._children[0];
let rr = r._children[1];
if(rl._height > rr._height) {
r._children[1] = node;
node._parent = r;
node._childIndex = 1;
node._children[1] = rr;
rr._parent = node;
rr._childIndex = 1;
let c1 = r._children[0];
let c2 = r._children[1];
r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = r._children[0]._height;
let h2 = r._children[1]._height;
r._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
let h11 = node._children[0]._height;
let h21 = node._children[1]._height;
node._height = (h11 > h21 ? h11 : h21) + 1;
} else {
r._children[0] = node;
node._parent = r;
node._childIndex = 0;
node._children[1] = rl;
rl._parent = node;
rl._childIndex = 1;
let c1 = r._children[0];
let c2 = r._children[1];
r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = r._children[0]._height;
let h2 = r._children[1]._height;
r._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
let h11 = node._children[0]._height;
let h21 = node._children[1]._height;
node._height = (h11 > h21 ? h11 : h21) + 1;
}
if(p != null) {
p._children[nodeIndex] = r;
r._parent = p;
r._childIndex = nodeIndex;
} else {
_this._root = r;
r._parent = null;
}
node = r;
}
}
}
let h1 = node._children[0]._height;
let h2 = node._children[1]._height;
node._height = (h1 > h2 ? h1 : h2) + 1;
let c1 = node._children[0];
let c2 = node._children[1];
node._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
node._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
node._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
node._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
node._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
node._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
node = node._parent;
}
}
if(!p._moved) {
p._moved = true;
if(this.movedProxies.length == this.numMovedProxies) {
let newArray = new Array(this.numMovedProxies << 1);
let _g = 0;
let _g1 = this.numMovedProxies;
while(_g < _g1) {
let i = _g++;
newArray[i] = this.movedProxies[i];
this.movedProxies[i] = null;
}
this.movedProxies = newArray;
}
this.movedProxies[this.numMovedProxies++] = p;
}
return p;
}
destroyProxy(proxy) {
this._numProxies--;
let prev = proxy._prev;
let next = proxy._next;
if(prev != null) {
prev._next = next;
}
if(next != null) {
next._prev = prev;
}
if(proxy == this._proxyList) {
this._proxyList = this._proxyList._next;
}
if(proxy == this._proxyListLast) {
this._proxyListLast = this._proxyListLast._prev;
}
proxy._next = null;
proxy._prev = null;
let bvhProxy = proxy;
let _this = this._tree;
let leaf = bvhProxy._leaf;
_this._numLeaves--;
let prev1 = leaf._prevLeaf;
let next1 = leaf._nextLeaf;
if(prev1 != null) {
prev1._nextLeaf = next1;
}
if(next1 != null) {
next1._prevLeaf = prev1;
}
if(leaf == _this.leafList) {
_this.leafList = _this.leafList._nextLeaf;
}
if(leaf == _this.leafListLast) {
_this.leafListLast = _this.leafListLast._prevLeaf;
}
leaf._nextLeaf = null;
leaf._prevLeaf = null;
if(_this._root == leaf) {
_this._root = null;
} else {
let parent = leaf._parent;
let sibling = parent._children[leaf._childIndex ^ 1];
let grandParent = parent._parent;
if(grandParent == null) {
sibling._parent = null;
sibling._childIndex = 0;
_this._root = sibling;
parent._next = null;
parent._childIndex = 0;
parent._children[0] = null;
parent._children[1] = null;
parent._childIndex = 0;
parent._parent = null;
parent._height = 0;
parent._proxy = null;
parent._next = _this._nodePool;
_this._nodePool = parent;
} else {
sibling._parent = grandParent;
let index = parent._childIndex;
grandParent._children[index] = sibling;
sibling._parent = grandParent;
sibling._childIndex = index;
parent._next = null;
parent._childIndex = 0;
parent._children[0] = null;
parent._children[1] = null;
parent._childIndex = 0;
parent._parent = null;
parent._height = 0;
parent._proxy = null;
parent._next = _this._nodePool;
_this._nodePool = parent;
let node = grandParent;
while(node != null) {
if(_this._strategy._balancingEnabled) {
if(node._height >= 2) {
let p = node._parent;
let l = node._children[0];
let r = node._children[1];
let balance = l._height - r._height;
let nodeIndex = node._childIndex;
if(balance > 1) {
let ll = l._children[0];
let lr = l._children[1];
if(ll._height > lr._height) {
l._children[1] = node;
node._parent = l;
node._childIndex = 1;
node._children[0] = lr;
lr._parent = node;
lr._childIndex = 0;
let c1 = l._children[0];
let c2 = l._children[1];
l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = l._children[0]._height;
let h2 = l._children[1]._height;
l._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
let h11 = node._children[0]._height;
let h21 = node._children[1]._height;
node._height = (h11 > h21 ? h11 : h21) + 1;
} else {
l._children[0] = node;
node._parent = l;
node._childIndex = 0;
node._children[0] = ll;
ll._parent = node;
ll._childIndex = 0;
let c1 = l._children[0];
let c2 = l._children[1];
l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = l._children[0]._height;
let h2 = l._children[1]._height;
l._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
let h11 = node._children[0]._height;
let h21 = node._children[1]._height;
node._height = (h11 > h21 ? h11 : h21) + 1;
}
if(p != null) {
p._children[nodeIndex] = l;
l._parent = p;
l._childIndex = nodeIndex;
} else {
_this._root = l;
l._parent = null;
}
node = l;
} else if(balance < -1) {
let rl = r._children[0];
let rr = r._children[1];
if(rl._height > rr._height) {
r._children[1] = node;
node._parent = r;
node._childIndex = 1;
node._children[1] = rr;
rr._parent = node;
rr._childIndex = 1;
let c1 = r._children[0];
let c2 = r._children[1];
r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = r._children[0]._height;
let h2 = r._children[1]._height;
r._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
let h11 = node._children[0]._height;
let h21 = node._children[1]._height;
node._height = (h11 > h21 ? h11 : h21) + 1;
} else {
r._children[0] = node;
node._parent = r;
node._childIndex = 0;
node._children[1] = rl;
rl._parent = node;
rl._childIndex = 1;
let c1 = r._children[0];
let c2 = r._children[1];
r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = r._children[0]._height;
let h2 = r._children[1]._height;
r._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
let h11 = node._children[0]._height;
let h21 = node._children[1]._height;
node._height = (h11 > h21 ? h11 : h21) + 1;
}
if(p != null) {
p._children[nodeIndex] = r;
r._parent = p;
r._childIndex = nodeIndex;
} else {
_this._root = r;
r._parent = null;
}
node = r;
}
}
}
let h1 = node._children[0]._height;
let h2 = node._children[1]._height;
node._height = (h1 > h2 ? h1 : h2) + 1;
let c1 = node._children[0];
let c2 = node._children[1];
node._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
node._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
node._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
node._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
node._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
node._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
node = node._parent;
}
}
}
bvhProxy._leaf = null;
leaf._next = null;
leaf._childIndex = 0;
leaf._children[0] = null;
leaf._children[1] = null;
leaf._childIndex = 0;
leaf._parent = null;
leaf._height = 0;
leaf._proxy = null;
leaf._next = _this._nodePool;
_this._nodePool = leaf;
bvhProxy.userData = null;
bvhProxy._next = null;
bvhProxy._prev = null;
if(bvhProxy._moved) {
bvhProxy._moved = false;
}
}
moveProxy(proxy,aabb,displacement) {
let p = proxy;
if(p._aabbMinX <= aabb._minX && p._aabbMaxX >= aabb._maxX && p._aabbMinY <= aabb._minY && p._aabbMaxY >= aabb._maxY && p._aabbMinZ <= aabb._minZ && p._aabbMaxZ >= aabb._maxZ) {
return;
}
p._aabbMinX = aabb._minX;
p._aabbMinY = aabb._minY;
p._aabbMinZ = aabb._minZ;
p._aabbMaxX = aabb._maxX;
p._aabbMaxY = aabb._maxY;
p._aabbMaxZ = aabb._maxZ;
let padding = oimo.common.Setting.bvhProxyPadding;
p._aabbMinX -= padding;
p._aabbMinY -= padding;
p._aabbMinZ -= padding;
p._aabbMaxX += padding;
p._aabbMaxY += padding;
p._aabbMaxZ += padding;
if(displacement != null) {
let dX;
let dY;
let dZ;
let zeroX;
let zeroY;
let zeroZ;
let addToMinX;
let addToMinY;
let addToMinZ;
let addToMaxX;
let addToMaxY;
let addToMaxZ;
zeroX = 0;
zeroY = 0;
zeroZ = 0;
dX = displacement.x;
dY = displacement.y;
dZ = displacement.z;
addToMinX = zeroX < dX ? zeroX : dX;
addToMinY = zeroY < dY ? zeroY : dY;
addToMinZ = zeroZ < dZ ? zeroZ : dZ;
addToMaxX = zeroX > dX ? zeroX : dX;
addToMaxY = zeroY > dY ? zeroY : dY;
addToMaxZ = zeroZ > dZ ? zeroZ : dZ;
p._aabbMinX += addToMinX;
p._aabbMinY += addToMinY;
p._aabbMinZ += addToMinZ;
p._aabbMaxX += addToMaxX;
p._aabbMaxY += addToMaxY;
p._aabbMaxZ += addToMaxZ;
}
if(!p._moved) {
p._moved = true;
if(this.movedProxies.length == this.numMovedProxies) {
let newArray = new Array(this.numMovedProxies << 1);
let _g = 0;
let _g1 = this.numMovedProxies;
while(_g < _g1) {
let i = _g++;
newArray[i] = this.movedProxies[i];
this.movedProxies[i] = null;
}
this.movedProxies = newArray;
}
this.movedProxies[this.numMovedProxies++] = p;
}
}
collectPairs() {
let p = this._proxyPairList;
if(p != null) {
while(true) {
p._p1 = null;
p._p2 = null;
p = p._next;
if(!(p != null)) {
break;
}
}
this._proxyPairList._next = this._proxyPairPool;
this._proxyPairPool = this._proxyPairList;
this._proxyPairList = null;
}
this._testCount = 0;
if(this._numProxies < 2) {
return;
}
let incrementalCollision = this.numMovedProxies / this._numProxies < oimo.common.Setting.bvhIncrementalCollisionThreshold;
let _g = 0;
let _g1 = this.numMovedProxies;
while(_g < _g1) {
let i = _g++;
let p = this.movedProxies[i];
if(p._moved) {
let _this = this._tree;
let leaf = p._leaf;
_this._numLeaves--;
let prev = leaf._prevLeaf;
let next = leaf._nextLeaf;
if(prev != null) {
prev._nextLeaf = next;
}
if(next != null) {
next._prevLeaf = prev;
}
if(leaf == _this.leafList) {
_this.leafList = _this.leafList._nextLeaf;
}
if(leaf == _this.leafListLast) {
_this.leafListLast = _this.leafListLast._prevLeaf;
}
leaf._nextLeaf = null;
leaf._prevLeaf = null;
if(_this._root == leaf) {
_this._root = null;
} else {
let parent = leaf._parent;
let sibling = parent._children[leaf._childIndex ^ 1];
let grandParent = parent._parent;
if(grandParent == null) {
sibling._parent = null;
sibling._childIndex = 0;
_this._root = sibling;
parent._next = null;
parent._childIndex = 0;
parent._children[0] = null;
parent._children[1] = null;
parent._childIndex = 0;
parent._parent = null;
parent._height = 0;
parent._proxy = null;
parent._next = _this._nodePool;
_this._nodePool = parent;
} else {
sibling._parent = grandParent;
let index = parent._childIndex;
grandParent._children[index] = sibling;
sibling._parent = grandParent;
sibling._childIndex = index;
parent._next = null;
parent._childIndex = 0;
parent._children[0] = null;
parent._children[1] = null;
parent._childIndex = 0;
parent._parent = null;
parent._height = 0;
parent._proxy = null;
parent._next = _this._nodePool;
_this._nodePool = parent;
let node = grandParent;
while(node != null) {
if(_this._strategy._balancingEnabled) {
if(node._height >= 2) {
let p = node._parent;
let l = node._children[0];
let r = node._children[1];
let balance = l._height - r._height;
let nodeIndex = node._childIndex;
if(balance > 1) {
let ll = l._children[0];
let lr = l._children[1];
if(ll._height > lr._height) {
l._children[1] = node;
node._parent = l;
node._childIndex = 1;
node._children[0] = lr;
lr._parent = node;
lr._childIndex = 0;
let c1 = l._children[0];
let c2 = l._children[1];
l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = l._children[0]._height;
let h2 = l._children[1]._height;
l._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
let h11 = node._children[0]._height;
let h21 = node._children[1]._height;
node._height = (h11 > h21 ? h11 : h21) + 1;
} else {
l._children[0] = node;
node._parent = l;
node._childIndex = 0;
node._children[0] = ll;
ll._parent = node;
ll._childIndex = 0;
let c1 = l._children[0];
let c2 = l._children[1];
l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = l._children[0]._height;
let h2 = l._children[1]._height;
l._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
let h11 = node._children[0]._height;
let h21 = node._children[1]._height;
node._height = (h11 > h21 ? h11 : h21) + 1;
}
if(p != null) {
p._children[nodeIndex] = l;
l._parent = p;
l._childIndex = nodeIndex;
} else {
_this._root = l;
l._parent = null;
}
node = l;
} else if(balance < -1) {
let rl = r._children[0];
let rr = r._children[1];
if(rl._height > rr._height) {
r._children[1] = node;
node._parent = r;
node._childIndex = 1;
node._children[1] = rr;
rr._parent = node;
rr._childIndex = 1;
let c1 = r._children[0];
let c2 = r._children[1];
r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
let h1 = r._children[0]._height;
let h2 = r._children[1]._height;
r._height = (h1 > h2 ? h1 : h2) + 1;
let c11 = node._children[0];
let c21 = node._children[1];
node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMax