UNPKG

three

Version:

JavaScript 3D library

1,418 lines 1.14 MB
// 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