// 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._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; } } } p._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; let _this1 = this._tree; let first = _this1._nodePool; if(first != null) { _this1._nodePool = first._next; first._next = null; } else { first = new oimo.collision.broadphase.bvh.BvhNode(); } let leaf1 = first; leaf1._proxy = p; p._leaf = leaf1; leaf1._aabbMinX = p._aabbMinX; leaf1._aabbMinY = p._aabbMinY; leaf1._aabbMinZ = p._aabbMinZ; leaf1._aabbMaxX = p._aabbMaxX; leaf1._aabbMaxY = p._aabbMaxY; leaf1._aabbMaxZ = p._aabbMaxZ; _this1._numLeaves++; if(_this1.leafList == null) { _this1.leafList = leaf1; _this1.leafListLast = leaf1; } else { _this1.leafListLast._nextLeaf = leaf1; leaf1._prevLeaf = _this1.leafListLast; _this1.leafListLast = leaf1; } if(_this1._root == null) { _this1._root = leaf1; } else { let sibling = _this1._root; while(sibling._height > 0) { let nextStep = _this1._strategy._decideInsertion(sibling,leaf1); if(nextStep == -1) { break; } else { sibling = sibling._children[nextStep]; } } let parent = sibling._parent; let first = _this1._nodePool; if(first != null) { _this1._nodePool = first._next; first._next = null; } else { first = new oimo.collision.broadphase.bvh.BvhNode(); } let node = first; if(parent == null) { _this1._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] = leaf1; leaf1._parent = node; leaf1._childIndex = index1; while(node != null) { if(_this1._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 { _this1._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 { _this1._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(incrementalCollision) { this.collide(this._tree._root,p._leaf); } p._moved = false; } this.movedProxies[i] = null; } if(!incrementalCollision) { this.collide(this._tree._root,this._tree._root); } this.numMovedProxies = 0; } rayCast(begin,end,callback) { if(this._tree._root == null) { return; } 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; this.rayCastRecursive(this._tree._root,p1X,p1Y,p1Z,p2X,p2Y,p2Z,callback); } convexCast(convex,begin,translation,callback) { if(this._tree._root == null) { return; } this.convexCastRecursive(this._tree._root,convex,begin,translation,callback); } aabbTest(aabb,callback) { if(this._tree._root == null) { return; } this.aabbTestRecursive(this._tree._root,aabb,callback); } getTreeBalance() { return this._tree._getBalance(); } } oimo.collision.broadphase.bvh.BvhInsertionStrategy = class oimo_collision_broadphase_bvh_BvhInsertionStrategy { } oimo.collision.broadphase.bvh.BvhNode = class oimo_collision_broadphase_bvh_BvhNode { constructor() { this._next = null; this._prevLeaf = null; this._nextLeaf = null; this._children = new Array(2); this._childIndex = 0; this._parent = null; this._height = 0; this._proxy = null; this._aabbMinX = 0; this._aabbMinY = 0; this._aabbMinZ = 0; this._aabbMaxX = 0; this._aabbMaxY = 0; this._aabbMaxZ = 0; } } oimo.collision.broadphase.bvh.BvhProxy = class oimo_collision_broadphase_bvh_BvhProxy extends oimo.collision.broadphase.Proxy { constructor(userData,id) { super(userData,id); this._leaf = null; this._moved = false; } } oimo.collision.broadphase.bvh.BvhStrategy = class oimo_collision_broadphase_bvh_BvhStrategy { constructor() { this._insertionStrategy = 0; this._balancingEnabled = false; } _decideInsertion(currentNode,leaf) { switch(this._insertionStrategy) { case 0: let centerX; let centerY; let centerZ; centerX = leaf._aabbMinX + leaf._aabbMaxX; centerY = leaf._aabbMinY + leaf._aabbMaxY; centerZ = leaf._aabbMinZ + leaf._aabbMaxZ; let c1 = currentNode._children[0]; let c2 = currentNode._children[1]; let diff1X; let diff1Y; let diff1Z; let diff2X; let diff2Y; let diff2Z; diff1X = c1._aabbMinX + c1._aabbMaxX; diff1Y = c1._aabbMinY + c1._aabbMaxY; diff1Z = c1._aabbMinZ + c1._aabbMaxZ; diff2X = c2._aabbMinX + c2._aabbMaxX; diff2Y = c2._aabbMinY + c2._aabbMaxY; diff2Z = c2._aabbMinZ + c2._aabbMaxZ; diff1X -= centerX; diff1Y -= centerY; diff1Z -= centerZ; diff2X -= centerX; diff2Y -= centerY; diff2Z -= centerZ; if(diff1X * diff1X + diff1Y * diff1Y + diff1Z * diff1Z < diff2X * diff2X + diff2Y * diff2Y + diff2Z * diff2Z) { return 0; } else { return 1; } break; case 1: let c11 = currentNode._children[0]; let c21 = currentNode._children[1]; let ey = currentNode._aabbMaxY - currentNode._aabbMinY; let ez = currentNode._aabbMaxZ - currentNode._aabbMinZ; let combinedMinX; let combinedMinY; let combinedMinZ; let combinedMaxX; let combinedMaxY; let combinedMaxZ; combinedMinX = currentNode._aabbMinX < leaf._aabbMinX ? currentNode._aabbMinX : leaf._aabbMinX; combinedMinY = currentNode._aabbMinY < leaf._aabbMinY ? currentNode._aabbMinY : leaf._aabbMinY; combinedMinZ = currentNode._aabbMinZ < leaf._aabbMinZ ? currentNode._aabbMinZ : leaf._aabbMinZ; combinedMaxX = currentNode._aabbMaxX > leaf._aabbMaxX ? currentNode._aabbMaxX : leaf._aabbMaxX; combinedMaxY = currentNode._aabbMaxY > leaf._aabbMaxY ? currentNode._aabbMaxY : leaf._aabbMaxY; combinedMaxZ = currentNode._aabbMaxZ > leaf._aabbMaxZ ? currentNode._aabbMaxZ : leaf._aabbMaxZ; let ey1 = combinedMaxY - combinedMinY; let ez1 = combinedMaxZ - combinedMinZ; let newArea = ((combinedMaxX - combinedMinX) * (ey1 + ez1) + ey1 * ez1) * 2; let creatingCost = newArea * 2; let incrementalCost = (newArea - ((currentNode._aabbMaxX - currentNode._aabbMinX) * (ey + ez) + ey * ez) * 2) * 2; let descendingCost1; combinedMinX = c11._aabbMinX < leaf._aabbMinX ? c11._aabbMinX : leaf._aabbMinX; combinedMinY = c11._aabbMinY < leaf._aabbMinY ? c11._aabbMinY : leaf._aabbMinY; combinedMinZ = c11._aabbMinZ < leaf._aabbMinZ ? c11._aabbMinZ : leaf._aabbMinZ; combinedMaxX = c11._aabbMaxX > leaf._aabbMaxX ? c11._aabbMaxX : leaf._aabbMaxX; combinedMaxY = c11._aabbMaxY > leaf._aabbMaxY ? c11._aabbMaxY : leaf._aabbMaxY; combinedMaxZ = c11._aabbMaxZ > leaf._aabbMaxZ ? c11._aabbMaxZ : leaf._aabbMaxZ; if(c11._height == 0) { let ey = combinedMaxY - combinedMinY; let ez = combinedMaxZ - combinedMinZ; descendingCost1 = incrementalCost + ((combinedMaxX - combinedMinX) * (ey + ez) + ey * ez) * 2; } else { let ey = combinedMaxY - combinedMinY; let ez = combinedMaxZ - combinedMinZ; let ey1 = c11._aabbMaxY - c11._aabbMinY; let ez1 = c11._aabbMaxZ - c11._aabbMinZ; descendingCost1 = incrementalCost + (((combinedMaxX - combinedMinX) * (ey + ez) + ey * ez) * 2 - ((c11._aabbMaxX - c11._aabbMinX) * (ey1 + ez1) + ey1 * ez1) * 2); } let descendingCost2; combinedMinX = c21._aabbMinX < leaf._aabbMinX ? c21._aabbMinX : leaf._aabbMinX; combinedMinY = c21._aabbMinY < leaf._aabbMinY ? c21._aabbMinY : leaf._aabbMinY; combinedMinZ = c21._aabbMinZ < leaf._aabbMinZ ? c21._aabbMinZ : leaf._aabbMinZ; combinedMaxX = c21._aabbMaxX > leaf._aabbMaxX ? c21._aabbMaxX : leaf._aabbMaxX; combinedMaxY = c21._aabbMaxY > leaf._aabbMaxY ? c21._aabbMaxY : leaf._aabbMaxY; combinedMaxZ = c21._aabbMaxZ > leaf._aabbMaxZ ? c21._aabbMaxZ : leaf._aabbMaxZ; if(c21._height == 0) { let ey = combinedMaxY - combinedMinY; let ez = combinedMaxZ - combinedMinZ; descendingCost2 = incrementalCost + ((combinedMaxX - combinedMinX) * (ey + ez) + ey * ez) * 2; } else { let ey = combinedMaxY - combinedMinY; let ez = combinedMaxZ - combinedMinZ; let ey1 = c21._aabbMaxY - c21._aabbMinY; let ez1 = c21._aabbMaxZ - c21._aabbMinZ; descendingCost2 = incrementalCost + (((combinedMaxX - combinedMinX) * (ey + ez) + ey * ez) * 2 - ((c21._aabbMaxX - c21._aabbMinX) * (ey1 + ez1) + ey1 * ez1) * 2); } if(creatingCost < descendingCost1) { if(creatingCost < descendingCost2) { return -1; } else { return 1; } } else if(descendingCost1 < descendingCost2) { return 0; } else { return 1; } break; default: console.log("src/oimo/collision/broadphase/bvh/BvhStrategy.hx:37:","invalid BVH insertion strategy: " + this._insertionStrategy); return -1; } } _splitLeaves(leaves,from,until) { let invN = 1.0 / (until - from); let centerMeanX; let centerMeanY; let centerMeanZ; centerMeanX = 0; centerMeanY = 0; centerMeanZ = 0; let _g = from; while(_g < until) { let leaf = leaves[_g++]; leaf._tmpX = leaf._aabbMaxX + leaf._aabbMinX; leaf._tmpY = leaf._aabbMaxY + leaf._aabbMinY; leaf._tmpZ = leaf._aabbMaxZ + leaf._aabbMinZ; centerMeanX += leaf._tmpX; centerMeanY += leaf._tmpY; centerMeanZ += leaf._tmpZ; } centerMeanX *= invN; centerMeanY *= invN; centerMeanZ *= invN; let varianceX; let varianceY; let varianceZ; varianceX = 0; varianceY = 0; varianceZ = 0; let _g1 = from; while(_g1 < until) { let leaf = leaves[_g1++]; let diffX; let diffY; let diffZ; diffX = leaf._tmpX - centerMeanX; diffY = leaf._tmpY - centerMeanY; diffZ = leaf._tmpZ - centerMeanZ; diffX *= diffX; diffY *= diffY; diffZ *= diffZ; varianceX += diffX; varianceY += diffY; varianceZ += diffZ; } let varX = varianceX; let varY = varianceY; let varZ = varianceZ; let l = from; let r = until - 1; if(varX > varY) { if(varX > varZ) { let mean = centerMeanX; while(true) { while(!(leaves[l]._tmpX <= mean)) ++l; while(!(leaves[r]._tmpX >= mean)) --r; if(l >= r) { break; } let tmp = leaves[l]; leaves[l] = leaves[r]; leaves[r] = tmp; ++l; --r; } } else { let mean = centerMeanZ; while(true) { while(!(leaves[l]._tmpZ <= mean)) ++l; while(!(leaves[r]._tmpZ >= mean)) --r; if(l >= r) { break; } let tmp = leaves[l]; leaves[l] = leaves[r]; leaves[r] = tmp; ++l; --r; } } } else if(varY > varZ) { let mean = centerMeanY; while(true) { while(!(leaves[l]._tmpY <= mean)) ++l; while(!(leaves[r]._tmpY >= mean)) --r; if(l >= r) { break; } let tmp = leaves[l]; leaves[l] = leaves[r]; leaves[r] = tmp; ++l; --r; } } else { let mean = centerMeanZ; while(true) { while(!(leaves[l]._tmpZ <= mean)) ++l; while(!(leaves[r]._tmpZ >= mean)) --r; if(l >= r) { break; } let tmp = leaves[l]; leaves[l] = leaves[r]; leaves[r] = tmp; ++l; --r; } } return l; } } oimo.collision.broadphase.bvh.BvhTree = class oimo_collision_broadphase_bvh_BvhTree { constructor() { this._root = null; this._numLeaves = 0; this._strategy = new oimo.collision.broadphase.bvh.BvhStrategy(); this._nodePool = null; this.leafList = null; this.leafListLast = null; this.tmp = new Array(1024); } _print(root,indent) { if(indent == null) { indent = ""; } if(root == null) { return; } if(root._height == 0) { console.log("src/oimo/collision/broadphase/bvh/BvhTree.hx:39:",indent + root._proxy._id); } else { this._print(root._children[0],indent + " "); let tmp; let sizeX; let sizeY; let sizeZ; sizeX = root._aabbMaxX - root._aabbMinX; sizeY = root._aabbMaxY - root._aabbMinY; sizeZ = root._aabbMaxZ - root._aabbMinZ; let y = sizeY; let z = sizeZ; if(sizeX * (y + z) + y * z > 0) { let sizeX; let sizeY; let sizeZ; sizeX = root._aabbMaxX - root._aabbMinX; sizeY = root._aabbMaxY - root._aabbMinY; sizeZ = root._aabbMaxZ - root._aabbMinZ; let y = sizeY; let z = sizeZ; tmp = ((sizeX * (y + z) + y * z) * 1000 + 0.5 | 0) / 1000; } else { let sizeX; let sizeY; let sizeZ; sizeX = root._aabbMaxX - root._aabbMinX; sizeY = root._aabbMaxY - root._aabbMinY; sizeZ = root._aabbMaxZ - root._aabbMinZ; let y = sizeY; let z = sizeZ; tmp = ((sizeX * (y + z) + y * z) * 1000 - 0.5 | 0) / 1000; } console.log("src/oimo/collision/broadphase/bvh/BvhTree.hx:42:",indent + "#" + root._height + ", " + tmp); this._print(root._children[1],indent + " "); } } _getBalance() { return this.getBalanceRecursive(this._root); } deleteRecursive(root) { if(root._height == 0) { let prev = root._prevLeaf; let next = root._nextLeaf; if(prev != null) { prev._nextLeaf = next; } if(next != null) { next._prevLeaf = prev; } if(root == this.leafList) { this.leafList = this.leafList._nextLeaf; } if(root == this.leafListLast) { this.leafListLast = this.leafListLast._prevLeaf; } root._nextLeaf = null; root._prevLeaf = null; root._proxy._leaf = null; root._next = null; root._childIndex = 0; root._children[0] = null; root._children[1] = null; root._childIndex = 0; root._parent = null; root._height = 0; root._proxy = null; root._next = this._nodePool; this._nodePool = root; return; } this.deleteRecursive(root._children[0]); this.deleteRecursive(root._children[1]); root._next = null; root._childIndex = 0; root._children[0] = null; root._children[1] = null; root._childIndex = 0; root._parent = null; root._height = 0; root._proxy = null; root._next = this._nodePool; this._nodePool = root; } decomposeRecursive(root) { if(root._height == 0) { root._childIndex = 0; root._parent = null; return; } this.decomposeRecursive(root._children[0]); this.decomposeRecursive(root._children[1]); root._next = null; root._childIndex = 0; root._children[0] = null; root._children[1] = null; root._childIndex = 0; root._parent = null; root._height = 0; root._proxy = null; root._next = this._nodePool; this._nodePool = root; } buildTopDownRecursive(leaves,from,until) { if(until - from == 1) { let leaf = leaves[from]; let proxy = leaf._proxy; leaf._aabbMinX = proxy._aabbMinX; leaf._aabbMinY = proxy._aabbMinY; leaf._aabbMinZ = proxy._aabbMinZ; leaf._aabbMaxX = proxy._aabbMaxX; leaf._aabbMaxY = proxy._aabbMaxY; leaf._aabbMaxZ = proxy._aabbMaxZ; return leaf; } let splitAt = this._strategy._splitLeaves(leaves,from,until); let child1 = this.buildTopDownRecursive(leaves,from,splitAt); let child2 = this.buildTopDownRecursive(leaves,splitAt,until); let first = this._nodePool; if(first != null) { this._nodePool = first._next; first._next = null; } else { first = new oimo.collision.broadphase.bvh.BvhNode(); } let parent = first; parent._children[0] = child1; child1._parent = parent; child1._childIndex = 0; parent._children[1] = child2; child2._parent = parent; child2._childIndex = 1; let c1 = parent._children[0]; let c2 = parent._children[1]; parent._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX; parent._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY; parent._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ; parent._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX; parent._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY; parent._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ; let h1 = parent._children[0]._height; let h2 = parent._children[1]._height; parent._height = (h1 > h2 ? h1 : h2) + 1; return parent; } getBalanceRecursive(root) { if(root == null || root._height == 0) { return 0; } let balance = root._children[0]._height - root._children[1]._height; if(balance < 0) { balance = -balance; } return balance + this.getBalanceRecursive(root._children[0]) + this.getBalanceRecursive(root._children[1]); } } oimo.collision.geometry.Aabb = class oimo_collision_geometry_Aabb { constructor() { this._minX = 0; this._minY = 0; this._minZ = 0; this._maxX = 0; this._maxY = 0; this._maxZ = 0; } init(min,max) { this._minX = min.x; this._minY = min.y; this._minZ = min.z; this._maxX = max.x; this._maxY = max.y; this._maxZ = max.z; return this; } getMin() { let min = new oimo.common.Vec3(); min.x = this._minX; min.y = this._minY; min.z = this._minZ; return min; } getMinTo(min) { min.x = this._minX; min.y = this._minY; min.z = this._minZ; } setMin(min) { this._minX = min.x; this._minY = min.y; this._minZ = min.z; return this; } getMax() { let max = new oimo.common.Vec3(); max.x = this._maxX; max.y = this._maxY; max.z = this._maxZ; return max; } getMaxTo(max) { max.x = this._maxX; max.y = this._maxY; max.z = this._maxZ; } setMax(max) { this._maxX = max.x; this._maxY = max.y; this._maxZ = max.z; return this; } getCenter() { let v = new oimo.common.Vec3(); let cX; let cY; let cZ; cX = this._minX + this._maxX; cY = this._minY + this._maxY; cZ = this._minZ + this._maxZ; cX *= 0.5; cY *= 0.5; cZ *= 0.5; v.x = cX; v.y = cY; v.z = cZ; return v; } getCenterTo(center) { let cX; let cY; let cZ; cX = this._minX + this._maxX; cY = this._minY + this._maxY; cZ = this._minZ + this._maxZ; cX *= 0.5; cY *= 0.5; cZ *= 0.5; center.x = cX; center.y = cY; center.z = cZ; } getExtents() { let v = new oimo.common.Vec3(); let cX; let cY; let cZ; cX = this._maxX - this._minX; cY = this._maxY - this._minY; cZ = this._maxZ - this._minZ; cX *= 0.5; cY *= 0.5; cZ *= 0.5; v.x = cX; v.y = cY; v.z = cZ; return v; } getExtentsTo(halfExtents) { let cX; let cY; let cZ; cX = this._maxX - this._minX; cY = this._maxY - this._minY; cZ = this._maxZ - this._minZ; cX *= 0.5; cY *= 0.5; cZ *= 0.5; halfExtents.x = cX; halfExtents.y = cY; halfExtents.z = cZ; } combine(other) { this._minX = this._minX < other._minX ? this._minX : other._minX; this._minY = this._minY < other._minY ? this._minY : other._minY; this._minZ = this._minZ < other._minZ ? this._minZ : other._minZ; this._maxX = this._maxX > other._maxX ? this._maxX : other._maxX; this._maxY = this._maxY > other._maxY ? this._maxY : other._maxY; this._maxZ = this._maxZ > other._maxZ ? this._maxZ : other._maxZ; return this; } combined(other) { let aabb = new oimo.collision.geometry.Aabb(); aabb._minX = this._minX < other._minX ? this._minX : other._minX; aabb._minY = this._minY < other._minY ? this._minY : other._minY; aabb._minZ = this._minZ < other._minZ ? this._minZ : other._minZ; aabb._maxX = this._maxX > other._maxX ? this._maxX : other._maxX; aabb._maxY = this._maxY > other._maxY ? this._maxY : other._maxY; aabb._maxZ = this._maxZ > other._maxZ ? this._maxZ : other._maxZ; return aabb; } overlap(other) { if(this._minX < other._maxX && this._maxX > other._minX && this._minY < other._maxY && this._maxY > other._minY && this._minZ < other._maxZ) { return this._maxZ > other._minZ; } else { return false; } } getIntersection(other) { let aabb = new oimo.collision.geometry.Aabb(); aabb._minX = this._minX > other._minX ? this._minX : other._minX; aabb._minY = this._minY > other._minY ? this._minY : other._minY; aabb._minZ = this._minZ > other._minZ ? this._minZ : other._minZ; aabb._maxX = this._maxX < other._maxX ? this._maxX : other._maxX; aabb._maxY = this._maxY < other._maxY ? this._maxY : other._maxY; aabb._maxZ = this._maxZ < other._maxZ ? this._maxZ : other._maxZ; return aabb; } getIntersectionTo(other,intersection) { intersection._minX = this._minX > other._minX ? this._minX : other._minX; intersection._minY = this._minY > other._minY ? this._minY : other._minY; intersection._minZ = this._minZ > other._minZ ? this._minZ : other._minZ; intersection._maxX = this._maxX < other._maxX ? this._maxX : other._maxX; intersection._maxY = this._maxY < other._maxY ? this._maxY : other._maxY; intersection._maxZ = this._maxZ < other._maxZ ? this._maxZ : other._maxZ; } copyFrom(aabb) { this._minX = aabb._minX; this._minY = aabb._minY; this._minZ = aabb._minZ; this._maxX = aabb._maxX; this._maxY = aabb._maxY; this._maxZ = aabb._maxZ; return this; } clone() { let aabb = new oimo.collision.geometry.Aabb(); aabb._minX = this._minX; aabb._minY = this._minY; aabb._minZ = this._minZ; aabb._maxX = this._maxX; aabb._maxY = this._maxY; aabb._maxZ = this._maxZ; return aabb; } } oimo.collision.geometry.BoxGeometry = class oimo_collision_geometry_BoxGeometry extends oimo.collision.geometry.ConvexGeometry { constructor(halfExtents) { super(1); this._halfExtentsX = halfExtents.x; this._halfExtentsY = halfExtents.y; this._halfExtentsZ = halfExtents.z; this._halfAxisXX = halfExtents.x; this._halfAxisXY = 0; this._halfAxisXZ = 0; this._halfAxisYX = 0; this._halfAxisYY = halfExtents.y; this._halfAxisYZ = 0; this._halfAxisZX = 0; this._halfAxisZY = 0; this._halfAxisZZ = halfExtents.z; this._updateMass(); let minHalfExtents = halfExtents.x < halfExtents.y ? halfExtents.z < halfExtents.x ? halfExtents.z : halfExtents.x : halfExtents.z < halfExtents.y ? halfExtents.z : halfExtents.y; if(this._gjkMargin > minHalfExtents * 0.2) { this._gjkMargin = minHalfExtents * 0.2; } } getHalfExtents() { let v = new oimo.common.Vec3(); v.x = this._halfExtentsX; v.y = this._halfExtentsY; v.z = this._halfExtentsZ; return v; } getHalfExtentsTo(halfExtents) { halfExtents.x = this._halfExtentsX; halfExtents.y = this._halfExtentsY; halfExtents.z = this._halfExtentsZ; } _updateMass() { this._volume = 8 * (this._halfExtentsX * this._halfExtentsY * this._halfExtentsZ); let sqX; let sqY; let sqZ; sqX = this._halfExtentsX * this._halfExtentsX; sqY = this._halfExtentsY * this._halfExtentsY; sqZ = this._halfExtentsZ * this._halfExtentsZ; this._inertiaCoeff00 = 0.33333333333333331 * (sqY + sqZ); this._inertiaCoeff01 = 0; this._inertiaCoeff02 = 0; this._inertiaCoeff10 = 0; this._inertiaCoeff11 = 0.33333333333333331 * (sqZ + sqX); this._inertiaCoeff12 = 0; this._inertiaCoeff20 = 0; this._inertiaCoeff21 = 0; this._inertiaCoeff22 = 0.33333333333333331 * (sqX + sqY); } _computeAabb(aabb,tf) { let tfxX; let tfxY; let tfxZ; let tfyX; let tfyY; let tfyZ; let tfzX; let tfzY; let tfzZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf._rotation00 * this._halfAxisXX + tf._rotation01 * this._halfAxisXY + tf._rotation02 * this._halfAxisXZ; __tmp__Y = tf._rotation10 * this._halfAxisXX + tf._rotation11 * this._halfAxisXY + tf._rotation12 * this._halfAxisXZ; __tmp__Z = tf._rotation20 * this._halfAxisXX + tf._rotation21 * this._halfAxisXY + tf._rotation22 * this._halfAxisXZ; tfxX = __tmp__X; tfxY = __tmp__Y; tfxZ = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf._rotation00 * this._halfAxisYX + tf._rotation01 * this._halfAxisYY + tf._rotation02 * this._halfAxisYZ; __tmp__Y1 = tf._rotation10 * this._halfAxisYX + tf._rotation11 * this._halfAxisYY + tf._rotation12 * this._halfAxisYZ; __tmp__Z1 = tf._rotation20 * this._halfAxisYX + tf._rotation21 * this._halfAxisYY + tf._rotation22 * this._halfAxisYZ; tfyX = __tmp__X1; tfyY = __tmp__Y1; tfyZ = __tmp__Z1; let __tmp__X2; let __tmp__Y2; let __tmp__Z2; __tmp__X2 = tf._rotation00 * this._halfAxisZX + tf._rotation01 * this._halfAxisZY + tf._rotation02 * this._halfAxisZZ; __tmp__Y2 = tf._rotation10 * this._halfAxisZX + tf._rotation11 * this._halfAxisZY + tf._rotation12 * this._halfAxisZZ; __tmp__Z2 = tf._rotation20 * this._halfAxisZX + tf._rotation21 * this._halfAxisZY + tf._rotation22 * this._halfAxisZZ; tfzX = __tmp__X2; tfzY = __tmp__Y2; tfzZ = __tmp__Z2; if(tfxX < 0) { tfxX = -tfxX; } if(tfxY < 0) { tfxY = -tfxY; } if(tfxZ < 0) { tfxZ = -tfxZ; } if(tfyX < 0) { tfyX = -tfyX; } if(tfyY < 0) { tfyY = -tfyY; } if(tfyZ < 0) { tfyZ = -tfyZ; } if(tfzX < 0) { tfzX = -tfzX; } if(tfzY < 0) { tfzY = -tfzY; } if(tfzZ < 0) { tfzZ = -tfzZ; } let tfsX; let tfsY; let tfsZ; tfsX = tfxX + tfyX; tfsY = tfxY + tfyY; tfsZ = tfxZ + tfyZ; tfsX += tfzX; tfsY += tfzY; tfsZ += tfzZ; aabb._minX = tf._positionX - tfsX; aabb._minY = tf._positionY - tfsY; aabb._minZ = tf._positionZ - tfsZ; aabb._maxX = tf._positionX + tfsX; aabb._maxY = tf._positionY + tfsY; aabb._maxZ = tf._positionZ + tfsZ; } computeLocalSupportingVertex(dir,out) { let gjkMarginsX; let gjkMarginsY; let gjkMarginsZ; let coreExtentsX; let coreExtentsY; let coreExtentsZ; gjkMarginsX = this._gjkMargin; gjkMarginsY = this._gjkMargin; gjkMarginsZ = this._gjkMargin; if(!(gjkMarginsX < this._halfExtentsX)) { gjkMarginsX = this._halfExtentsX; } if(!(gjkMarginsY < this._halfExtentsY)) { gjkMarginsY = this._halfExtentsY; } if(!(gjkMarginsZ < this._halfExtentsZ)) { gjkMarginsZ = this._halfExtentsZ; } coreExtentsX = this._halfExtentsX - gjkMarginsX; coreExtentsY = this._halfExtentsY - gjkMarginsY; coreExtentsZ = this._halfExtentsZ - gjkMarginsZ; out.x = dir.x > 0 ? coreExtentsX : -coreExtentsX; out.y = dir.y > 0 ? coreExtentsY : -coreExtentsY; out.z = dir.z > 0 ? coreExtentsZ : -coreExtentsZ; } _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) { let halfW = this._halfExtentsX; let halfH = this._halfExtentsY; let halfD = this._halfExtentsZ; let dx = endX - beginX; let dy = endY - beginY; let dz = endZ - beginZ; let tminx = 0; let tminy = 0; let tminz = 0; let tmaxx = 1; let tmaxy = 1; let tmaxz = 1; if(dx > -1e-6 && dx < 1e-6) { if(beginX <= -halfW || beginX >= halfW) { return false; } } else { let invDx = 1 / dx; let t1 = (-halfW - beginX) * invDx; let t2 = (halfW - beginX) * invDx; if(t1 > t2) { let tmp = t1; t1 = t2; t2 = tmp; } if(t1 > 0) { tminx = t1; } if(t2 < 1) { tmaxx = t2; } } if(dy > -1e-6 && dy < 1e-6) { if(beginY <= -halfH || beginY >= halfH) { return false; } } else { let invDy = 1 / dy; let t1 = (-halfH - beginY) * invDy; let t2 = (halfH - beginY) * invDy; if(t1 > t2) { let tmp = t1; t1 = t2; t2 = tmp; } if(t1 > 0) { tminy = t1; } if(t2 < 1) { tmaxy = t2; } } if(dz > -1e-6 && dz < 1e-6) { if(beginZ <= -halfD || beginZ >= halfD) { return false; } } else { let invDz = 1 / dz; let t1 = (-halfD - beginZ) * invDz; let t2 = (halfD - beginZ) * invDz; if(t1 > t2) { let tmp = t1; t1 = t2; t2 = tmp; } if(t1 > 0) { tminz = t1; } if(t2 < 1) { tmaxz = t2; } } if(tminx >= 1 || tminy >= 1 || tminz >= 1 || tmaxx <= 0 || tmaxy <= 0 || tmaxz <= 0) { return false; } let min = tminx; let max = tmaxx; let hitDirection = 0; if(tminy > min) { min = tminy; hitDirection = 1; } if(tminz > min) { min = tminz; hitDirection = 2; } if(tmaxy < max) { max = tmaxy; } if(tmaxz < max) { max = tmaxz; } if(min > max) { return false; } if(min == 0) { return false; } switch(hitDirection) { case 0: hit.normal.init(dx > 0 ? -1 : 1,0,0); break; case 1: hit.normal.init(0,dy > 0 ? -1 : 1,0); break; case 2: hit.normal.init(0,0,dz > 0 ? -1 : 1); break; } hit.position.init(beginX + min * dx,beginY + min * dy,beginZ + min * dz); hit.fraction = min; return true; } } oimo.collision.geometry.CapsuleGeometry = class oimo_collision_geometry_CapsuleGeometry extends oimo.collision.geometry.ConvexGeometry { constructor(radius,halfHeight) { super(4); this._radius = radius; this._halfHeight = halfHeight; this._gjkMargin = this._radius; this._updateMass(); } getRadius() { return this._radius; } getHalfHeight() { return this._halfHeight; } _updateMass() { let r2 = this._radius * this._radius; let hh2 = this._halfHeight * this._halfHeight; let cylinderVolume = 6.28318530717958 * r2 * this._halfHeight; let sphereVolume = 3.14159265358979 * r2 * this._radius * 4 / 3; this._volume = cylinderVolume + sphereVolume; let invVolume = this._volume == 0 ? 0 : 1 / this._volume; let inertiaXZ = invVolume * (cylinderVolume * (r2 * 0.25 + hh2 / 3) + sphereVolume * (r2 * 0.4 + this._halfHeight * this._radius * 0.75 + hh2)); this._inertiaCoeff00 = inertiaXZ; this._inertiaCoeff01 = 0; this._inertiaCoeff02 = 0; this._inertiaCoeff10 = 0; this._inertiaCoeff11 = invVolume * (cylinderVolume * r2 * 0.5 + sphereVolume * r2 * 0.4); this._inertiaCoeff12 = 0; this._inertiaCoeff20 = 0; this._inertiaCoeff21 = 0; this._inertiaCoeff22 = inertiaXZ; } _computeAabb(aabb,tf) { let radVecX; let radVecY; let radVecZ; radVecX = this._radius; radVecY = this._radius; radVecZ = this._radius; let axisX; let axisY; let axisZ; axisX = tf._rotation01; axisY = tf._rotation11; axisZ = tf._rotation21; if(axisX < 0) { axisX = -axisX; } if(axisY < 0) { axisY = -axisY; } if(axisZ < 0) { axisZ = -axisZ; } axisX *= this._halfHeight; axisY *= this._halfHeight; axisZ *= this._halfHeight; radVecX += axisX; radVecY += axisY; radVecZ += axisZ; aabb._minX = tf._positionX - radVecX; aabb._minY = tf._positionY - radVecY; aabb._minZ = tf._positionZ - radVecZ; aabb._maxX = tf._positionX + radVecX; aabb._maxY = tf._positionY + radVecY; aabb._maxZ = tf._positionZ + radVecZ; } computeLocalSupportingVertex(dir,out) { if(dir.y > 0) { out.init(0,this._halfHeight,0); } else { out.init(0,-this._halfHeight,0); } } _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) { let halfH = this._halfHeight; let dx = endX - beginX; let dz = endZ - beginZ; let tminxz = 0; let tmaxxz; let a = dx * dx + dz * dz; let b = beginX * dx + beginZ * dz; let c = beginX * beginX + beginZ * beginZ - this._radius * this._radius; let D = b * b - a * c; if(D < 0) { return false; } if(a > 0) { let sqrtD = Math.sqrt(D); tminxz = (-b - sqrtD) / a; tmaxxz = (-b + sqrtD) / a; if(tminxz >= 1 || tmaxxz <= 0) { return false; } } else { if(c >= 0) { return false; } tminxz = 0; } let crossY = beginY + (endY - beginY) * tminxz; let min; if(crossY > -halfH && crossY < halfH) { if(tminxz > 0) { min = tminxz; let _this = hit.normal.init(beginX + dx * min,0,beginZ + dz * min); let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z); if(invLen > 0) { invLen = 1 / invLen; } _this.x *= invLen; _this.y *= invLen; _this.z *= invLen; hit.position.init(beginX + min * dx,crossY,beginZ + min * dz); hit.fraction = min; return true; } return false; } let spherePosX; let spherePosY; let spherePosZ; let sphereToBeginX; let sphereToBeginY; let sphereToBeginZ; spherePosX = 0; spherePosY = crossY < 0 ? -halfH : halfH; spherePosZ = 0; sphereToBeginX = beginX - spherePosX; sphereToBeginY = beginY - spherePosY; sphereToBeginZ = beginZ - spherePosZ; let dX; let dY; let dZ; dX = endX - beginX; dY = endY - beginY; dZ = endZ - beginZ; a = dX * dX + dY * dY + dZ * dZ; b = sphereToBeginX * dX + sphereToBeginY * dY + sphereToBeginZ * dZ; c = sphereToBeginX * sphereToBeginX + sphereToBeginY * sphereToBeginY + sphereToBeginZ * sphereToBeginZ - this._radius * this._radius; D = b * b - a * c; if(D < 0) { return false; } let t = (-b - Math.sqrt(D)) / a; if(t < 0 || t > 1) { return false; } let hitPosX; let hitPosY; let hitPosZ; let hitNormalX; let hitNormalY; let hitNormalZ; hitPosX = sphereToBeginX + dX * t; hitPosY = sphereToBeginY + dY * t; hitPosZ = sphereToBeginZ + dZ * t; let l = hitPosX * hitPosX + hitPosY * hitPosY + hitPosZ * hitPosZ; if(l > 0) { l = 1 / Math.sqrt(l); } hitNormalX = hitPosX * l; hitNormalY = hitPosY * l; hitNormalZ = hitPosZ * l; hitPosX += spherePosX; hitPosY += spherePosY; hitPosZ += spherePosZ; let v = hit.position; v.x = hitPosX; v.y = hitPosY; v.z = hitPosZ; let v1 = hit.normal; v1.x = hitNormalX; v1.y = hitNormalY; v1.z = hitNormalZ; hit.fraction = t; return true; } } oimo.collision.geometry.ConeGeometry = class oimo_collision_geometry_ConeGeometry extends oimo.collision.geometry.ConvexGeometry { constructor(radius,halfHeight) { super(3); this._radius = radius; this._halfHeight = halfHeight; this.sinTheta = radius / Math.sqrt(radius * radius + 4 * halfHeight * halfHeight); this.cosTheta = 2 * halfHeight / Math.sqrt(radius * radius + 4 * halfHeight * halfHeight); this._updateMass(); } getRadius() { return this._radius; } getHalfHeight() { return this._halfHeight; } _updateMass() { let r2 = this._radius * this._radius; let h2 = this._halfHeight * this._halfHeight * 4; this._volume = 3.14159265358979 * r2 * this._halfHeight * 2 / 3; this._inertiaCoeff00 = 0.05 * (3 * r2 + 2 * h2); this._inertiaCoeff01 = 0; this._inertiaCoeff02 = 0; this._inertiaCoeff10 = 0; this._inertiaCoeff11 = 0.3 * r2; this._inertiaCoeff12 = 0; this._inertiaCoeff20 = 0; this._inertiaCoeff21 = 0; this._inertiaCoeff22 = 0.05 * (3 * r2 + 2 * h2); } _computeAabb(aabb,tf) { let axisX; let axisY; let axisZ; let axis2X; let axis2Y; let axis2Z; let ehX; let ehY; let ehZ; let erX; let erY; let erZ; axisX = tf._rotation01; axisY = tf._rotation11; axisZ = tf._rotation21; axis2X = axisX * axisX; axis2Y = axisY * axisY; axis2Z = axisZ * axisZ; erX = Math.sqrt(1 - axis2X); erY = Math.sqrt(1 - axis2Y); erZ = Math.sqrt(1 - axis2Z); erX *= this._radius; erY *= this._radius; erZ *= this._radius; ehX = axisX * this._halfHeight; ehY = axisY * this._halfHeight; ehZ = axisZ * this._halfHeight; let rminX; let rminY; let rminZ; let rmaxX; let rmaxY; let rmaxZ; rminX = -ehX; rminY = -ehY; rminZ = -ehZ; rminX -= erX; rminY -= erY; rminZ -= erZ; rmaxX = -ehX; rmaxY = -ehY; rmaxZ = -ehZ; rmaxX += erX; rmaxY += erY; rmaxZ += erZ; let maxX; let maxY; let maxZ; let minX; let minY; let minZ; maxX = rminX > rmaxX ? rminX : rmaxX; maxY = rminY > rmaxY ? rminY : rmaxY; maxZ = rminZ > rmaxZ ? rminZ : rmaxZ; if(!(maxX > ehX)) { maxX = ehX; } if(!(maxY > ehY)) { maxY = ehY; } if(!(maxZ > ehZ)) { maxZ = ehZ; } minX = rminX < rmaxX ? rminX : rmaxX; minY = rminY < rmaxY ? rminY : rmaxY; minZ = rminZ < rmaxZ ? rminZ : rmaxZ; if(!(minX < ehX)) { minX = ehX; } if(!(minY < ehY)) { minY = ehY; } if(!(minZ < ehZ)) { minZ = ehZ; } aabb._minX = tf._positionX + minX; aabb._minY = tf._positionY + minY; aabb._minZ = tf._positionZ + minZ; aabb._maxX = tf._positionX + maxX; aabb._maxY = tf._positionY + maxY; aabb._maxZ = tf._positionZ + maxZ; } computeLocalSupportingVertex(dir,out) { let dx = dir.x; let dy = dir.y; let dz = dir.z; if(dy > 0 && dy * dy > this.sinTheta * this.sinTheta * (dx * dx + dy * dy + dz * dz)) { out.init(0,this._halfHeight - this._gjkMargin / this.sinTheta,0); if(out.y < 0) { out.y = 0; } return; } let rx = dir.x; let rz = dir.z; let len = rx * rx + rz * rz; let height = 2 * this._halfHeight; let coreRadius = (height - this._gjkMargin) / height * this._radius - this._gjkMargin / this.cosTheta; if(coreRadius < 0) { coreRadius = 0; } let invLen = len > 0 ? coreRadius / Math.sqrt(len) : 0; let coreHalfHeight = this._halfHeight - this._gjkMargin; if(coreHalfHeight < 0) { coreHalfHeight = 0; } out.x = rx * invLen; out.y = -coreHalfHeight; out.z = rz * invLen; } _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) { let p1y; let halfH = this._halfHeight; let dx = endX - beginX; let dy = endY - beginY; let dz = endZ - beginZ; let tminy = 0; let tmaxy = 1; if(dy > -1e-6 && dy < 1e-6) { if(beginY <= -halfH || beginY >= halfH) { return false; } } else { let invDy = 1 / dy; let t1 = (-halfH - beginY) * invDy; let t2 = (halfH - beginY) * invDy; if(t1 > t2) { let tmp = t1; t1 = t2; t2 = tmp; } if(t1 > 0) { tminy = t1; } if(t2 < 1) { tmaxy = t2; } } if(tminy >= 1 || tmaxy <= 0) { return false; } let tminxz = 0; let tmaxxz = 0; p1y = beginY - halfH; let cos2 = this.cosTheta * this.cosTheta; let a = cos2 * (dx * dx + dy * dy + dz * dz) - dy * dy; let b = cos2 * (beginX * dx + p1y * dy + beginZ * dz) - p1y * dy; let c = cos2 * (beginX * beginX + p1y * p1y + beginZ * beginZ) - p1y * p1y; let D = b * b - a * c; if(a != 0) { if(D < 0) { return false; } let sqrtD = Math.sqrt(D); if(a < 0) { if(dy > 0) { tminxz = 0; tmaxxz = (-b + sqrtD) / a; if(tmaxxz <= 0) { return false; } } else { tminxz = (-b - sqrtD) / a; tmaxxz = 1; if(tminxz >= 1) { return false; } } } else { tminxz = (-b - sqrtD) / a; tmaxxz = (-b + sqrtD) / a; if(tminxz >= 1 || tmaxxz <= 0) { return false; } } } else { let t = -c / (2 * b); if(b > 0) { tminxz = 0; tmaxxz = t; if(t <= 0) { return false; } } else { tminxz = t; tmaxxz = 1; if(t >= 1) { return false; } } } p1y += halfH; let min; if(tmaxxz <= tminy || tmaxy <= tminxz) { return false; } if(tminxz < tminy) { min = tminy; if(min == 0) { return false; } hit.normal.init(0,dy > 0 ? -1 : 1,0); } else { min = tminxz; if(min == 0) { return false; } let _this = hit.normal.init(beginX + dx * min,0,beginZ + dz * min); let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z); if(invLen > 0) { invLen = 1 / invLen; } _this.x *= invLen; _this.y *= invLen; _this.z *= invLen; let s = this.cosTheta; _this.x *= s; _this.y *= s; _this.z *= s; hit.normal.y += this.sinTheta; } hit.position.init(beginX + min * dx,p1y + min * dy,beginZ + min * dz); hit.fraction = min; return true; } } oimo.collision.geometry.ConvexHullGeometry = class oimo_collision_geometry_ConvexHullGeometry extends oimo.collision.geometry.ConvexGeometry { constructor(vertices) { super(5); this._numVertices = vertices.length; this._vertices = new Array(this._numVertices); this._tmpVertices = new Array(this._numVertices); let _g = 0; let _g1 = this._numVertices; while(_g < _g1) { let i = _g++; this._vertices[i] = vertices[i]; this._tmpVertices[i] = new oimo.common.Vec3(); } this._useGjkRayCast = true; this._updateMass(); } getVertices() { return this._vertices; } _updateMass() { this._volume = 1; this._inertiaCoeff00 = 1; this._inertiaCoeff01 = 0; this._inertiaCoeff02 = 0; this._inertiaCoeff10 = 0; this._inertiaCoeff11 = 1; this._inertiaCoeff12 = 0; this._inertiaCoeff20 = 0; this._inertiaCoeff21 = 0; this._inertiaCoeff22 = 1; let minx = this._vertices[0].x; let miny = this._vertices[0].y; let minz = this._vertices[0].z; let maxx = this._vertices[0].x; let maxy = this._vertices[0].y; let maxz = this._vertices[0].z; let _g = 1; let _g1 = this._numVertices; while(_g < _g1) { let i = _g++; let vx = this._vertices[i].x; let vy = this._vertices[i].y; let vz = this._vertices[i].z; if(vx < minx) { minx = vx; } else if(vx > maxx) { maxx = vx; } if(vy < miny) { miny = vy; } else if(vy > maxy) { maxy = vy; } if(vz < minz) { minz = vz; } else if(vz > maxz) { maxz = vz; } } let sizex = maxx - minx; let sizey = maxy - miny; let sizez = maxz - minz; this._volume = sizex * sizey * sizez; let diffCog = ((minx + maxx) * (minx + maxx) + (miny + maxy) * (miny + maxy) + (minz + maxz) * (minz + maxz)) * 0.25; sizex = sizex * sizex * 0.25; sizey = sizey * sizey * 0.25; sizez = sizez * sizez * 0.25; this._inertiaCoeff00 = 0.33333333333333331 * (sizey + sizez) + diffCog; this._inertiaCoeff01 = 0; this._inertiaCoeff02 = 0; this._inertiaCoeff10 = 0; this._inertiaCoeff11 = 0.33333333333333331 * (sizez + sizex) + diffCog; this._inertiaCoeff12 = 0; this._inertiaCoeff20 = 0; this._inertiaCoeff21 = 0; this._inertiaCoeff22 = 0.33333333333333331 * (sizex + sizey) + diffCog; } _computeAabb(aabb,tf) { let minX; let minY; let minZ; let maxX; let maxY; let maxZ; let marginX; let marginY; let marginZ; marginX = this._gjkMargin; marginY = this._gjkMargin; marginZ = this._gjkMargin; let localVX; let localVY; let localVZ; let v = this._vertices[0]; localVX = v.x; localVY = v.y; localVZ = v.z; let worldVX; let worldVY; let worldVZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf._rotation00 * localVX + tf._rotation01 * localVY + tf._rotation02 * localVZ; __tmp__Y = tf._rotation10 * localVX + tf._rotation11 * localVY + tf._rotation12 * localVZ; __tmp__Z = tf._rotation20 * localVX + tf._rotation21 * localVY + tf._rotation22 * localVZ; worldVX = __tmp__X; worldVY = __tmp__Y; worldVZ = __tmp__Z; worldVX += tf._positionX; worldVY += tf._positionY; worldVZ += tf._positionZ; minX = worldVX; minY = worldVY; minZ = worldVZ; maxX = worldVX; maxY = worldVY; maxZ = worldVZ; let _g = 1; let _g1 = this._numVertices; while(_g < _g1) { let v = this._vertices[_g++]; localVX = v.x; localVY = v.y; localVZ = v.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf._rotation00 * localVX + tf._rotation01 * localVY + tf._rotation02 * localVZ; __tmp__Y = tf._rotation10 * localVX + tf._rotation11 * localVY + tf._rotation12 * localVZ; __tmp__Z = tf._rotation20 * localVX + tf._rotation21 * localVY + tf._rotation22 * localVZ; worldVX = __tmp__X; worldVY = __tmp__Y; worldVZ = __tmp__Z; worldVX += tf._positionX; worldVY += tf._positionY; worldVZ += tf._positionZ; if(!(minX < worldVX)) { minX = worldVX; } if(!(minY < worldVY)) { minY = worldVY; } if(!(minZ < worldVZ)) { minZ = worldVZ; } if(!(maxX > worldVX)) { maxX = worldVX; } if(!(maxY > worldVY)) { maxY = worldVY; } if(!(maxZ > worldVZ)) { maxZ = worldVZ; } } aabb._minX = minX - marginX; aabb._minY = minY - marginY; aabb._minZ = minZ - marginZ; aabb._maxX = maxX + marginX; aabb._maxY = maxY + marginY; aabb._maxZ = maxZ + marginZ; } computeLocalSupportingVertex(dir,out) { let _this = this._vertices[0]; let maxDot = _this.x * dir.x + _this.y * dir.y + _this.z * dir.z; let maxIndex = 0; let _g = 1; let _g1 = this._numVertices; while(_g < _g1) { let i = _g++; let _this = this._vertices[i]; let dot = _this.x * dir.x + _this.y * dir.y + _this.z * dir.z; if(dot > maxDot) { maxDot = dot; maxIndex = i; } } let v = this._vertices[maxIndex]; out.x = v.x; out.y = v.y; out.z = v.z; } } oimo.collision.geometry.CylinderGeometry = class oimo_collision_geometry_CylinderGeometry extends oimo.collision.geometry.ConvexGeometry { constructor(radius,halfHeight) { super(2); this._radius = radius; this._halfHeight = halfHeight; this._updateMass(); } getRadius() { return this._radius; } getHalfHeight() { return this._halfHeight; } _updateMass() { let r2 = this._radius * this._radius; let h2 = this._halfHeight * this._halfHeight * 4; this._volume = 3.14159265358979 * r2 * this._halfHeight * 2; this._inertiaCoeff00 = 0.083333333333333329 * (3 * r2 + h2); this._inertiaCoeff01 = 0; this._inertiaCoeff02 = 0; this._inertiaCoeff10 = 0; this._inertiaCoeff11 = 0.5 * r2; this._inertiaCoeff12 = 0; this._inertiaCoeff20 = 0; this._inertiaCoeff21 = 0; this._inertiaCoeff22 = 0.083333333333333329 * (3 * r2 + h2); } _computeAabb(aabb,tf) { let axisX; let axisY; let axisZ; let axis2X; let axis2Y; let axis2Z; let ehX; let ehY; let ehZ; let erX; let erY; let erZ; axisX = tf._rotation01; axisY = tf._rotation11; axisZ = tf._rotation21; if(axisX < 0) { axisX = -axisX; } if(axisY < 0) { axisY = -axisY; } if(axisZ < 0) { axisZ = -axisZ; } axis2X = axisX * axisX; axis2Y = axisY * axisY; axis2Z = axisZ * axisZ; erX = Math.sqrt(1 - axis2X); erY = Math.sqrt(1 - axis2Y); erZ = Math.sqrt(1 - axis2Z); erX *= this._radius; erY *= this._radius; erZ *= this._radius; ehX = axisX * this._halfHeight; ehY = axisY * this._halfHeight; ehZ = axisZ * this._halfHeight; let maxX; let maxY; let maxZ; maxX = erX + ehX; maxY = erY + ehY; maxZ = erZ + ehZ; aabb._minX = tf._positionX - maxX; aabb._minY = tf._positionY - maxY; aabb._minZ = tf._positionZ - maxZ; aabb._maxX = tf._positionX + maxX; aabb._maxY = tf._positionY + maxY; aabb._maxZ = tf._positionZ + maxZ; } computeLocalSupportingVertex(dir,out) { let rx = dir.x; let rz = dir.z; let len = rx * rx + rz * rz; let coreRadius = this._radius - this._gjkMargin; if(coreRadius < 0) { coreRadius = 0; } let invLen = len > 0 ? coreRadius / Math.sqrt(len) : 0; let coreHeight = this._halfHeight - this._gjkMargin; if(coreHeight < 0) { coreHeight = 0; } out.x = rx * invLen; out.y = dir.y > 0 ? coreHeight : -coreHeight; out.z = rz * invLen; } _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) { let halfH = this._halfHeight; let dx = endX - beginX; let dy = endY - beginY; let dz = endZ - beginZ; let tminy = 0; let tmaxy = 1; if(dy > -1e-6 && dy < 1e-6) { if(beginY <= -halfH || beginY >= halfH) { return false; } } else { let invDy = 1 / dy; let t1 = (-halfH - beginY) * invDy; let t2 = (halfH - beginY) * invDy; if(t1 > t2) { let tmp = t1; t1 = t2; t2 = tmp; } if(t1 > 0) { tminy = t1; } if(t2 < 1) { tmaxy = t2; } } if(tminy >= 1 || tmaxy <= 0) { return false; } let tminxz = 0; let tmaxxz; let a = dx * dx + dz * dz; let b = beginX * dx + beginZ * dz; let c = beginX * beginX + beginZ * beginZ - this._radius * this._radius; let D = b * b - a * c; if(D < 0) { return false; } if(a > 0) { let sqrtD = Math.sqrt(D); tminxz = (-b - sqrtD) / a; tmaxxz = (-b + sqrtD) / a; if(tminxz >= 1 || tmaxxz <= 0) { return false; } } else { if(c >= 0) { return false; } tminxz = 0; tmaxxz = 1; } let min; if(tmaxxz <= tminy || tmaxy <= tminxz) { return false; } if(tminxz < tminy) { min = tminy; if(min == 0) { return false; } hit.normal.init(0,dy > 0 ? -1 : 1,0); } else { min = tminxz; if(min == 0) { return false; } let _this = hit.normal.init(beginX + dx * min,0,beginZ + dz * min); let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z); if(invLen > 0) { invLen = 1 / invLen; } _this.x *= invLen; _this.y *= invLen; _this.z *= invLen; } hit.position.init(beginX + min * dx,beginY + min * dy,beginZ + min * dz); hit.fraction = min; return true; } } oimo.collision.geometry.GeometryType = class oimo_collision_geometry_GeometryType { } oimo.collision.geometry.RayCastHit = class oimo_collision_geometry_RayCastHit { constructor() { this.position = new oimo.common.Vec3(); this.normal = new oimo.common.Vec3(); this.fraction = 0; } } oimo.collision.geometry.SphereGeometry = class oimo_collision_geometry_SphereGeometry extends oimo.collision.geometry.ConvexGeometry { constructor(radius) { super(0); this._radius = radius; this._gjkMargin = this._radius; this._updateMass(); } getRadius() { return this._radius; } _updateMass() { this._volume = 4.1887902047863861 * this._radius * this._radius * this._radius; this._inertiaCoeff00 = 0.4 * this._radius * this._radius; this._inertiaCoeff01 = 0; this._inertiaCoeff02 = 0; this._inertiaCoeff10 = 0; this._inertiaCoeff11 = 0.4 * this._radius * this._radius; this._inertiaCoeff12 = 0; this._inertiaCoeff20 = 0; this._inertiaCoeff21 = 0; this._inertiaCoeff22 = 0.4 * this._radius * this._radius; } _computeAabb(aabb,tf) { let radVecX; let radVecY; let radVecZ; radVecX = this._radius; radVecY = this._radius; radVecZ = this._radius; aabb._minX = tf._positionX - radVecX; aabb._minY = tf._positionY - radVecY; aabb._minZ = tf._positionZ - radVecZ; aabb._maxX = tf._positionX + radVecX; aabb._maxY = tf._positionY + radVecY; aabb._maxZ = tf._positionZ + radVecZ; } computeLocalSupportingVertex(dir,out) { out.zero(); } _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) { let dX; let dY; let dZ; dX = endX - beginX; dY = endY - beginY; dZ = endZ - beginZ; let a = dX * dX + dY * dY + dZ * dZ; let b = beginX * dX + beginY * dY + beginZ * dZ; let D = b * b - a * (beginX * beginX + beginY * beginY + beginZ * beginZ - this._radius * this._radius); if(D < 0) { return false; } let t = (-b - Math.sqrt(D)) / a; if(t < 0 || t > 1) { return false; } let hitPosX; let hitPosY; let hitPosZ; let hitNormalX; let hitNormalY; let hitNormalZ; hitPosX = beginX + dX * t; hitPosY = beginY + dY * t; hitPosZ = beginZ + dZ * t; let l = hitPosX * hitPosX + hitPosY * hitPosY + hitPosZ * hitPosZ; if(l > 0) { l = 1 / Math.sqrt(l); } hitNormalX = hitPosX * l; hitNormalY = hitPosY * l; hitNormalZ = hitPosZ * l; let v = hit.position; v.x = hitPosX; v.y = hitPosY; v.z = hitPosZ; let v1 = hit.normal; v1.x = hitNormalX; v1.y = hitNormalY; v1.z = hitNormalZ; hit.fraction = t; return true; } } if(!oimo.collision.narrowphase) oimo.collision.narrowphase = {}; oimo.collision.narrowphase.CollisionMatrix = class oimo_collision_narrowphase_CollisionMatrix { constructor() { this.detectors = new Array(8); this.detectors[0] = new Array(8); this.detectors[1] = new Array(8); this.detectors[2] = new Array(8); this.detectors[3] = new Array(8); this.detectors[4] = new Array(8); this.detectors[5] = new Array(8); let gjkEpaDetector = new oimo.collision.narrowphase.detector.GjkEpaDetector(); this.detectors[0][0] = new oimo.collision.narrowphase.detector.SphereSphereDetector(); this.detectors[0][1] = new oimo.collision.narrowphase.detector.SphereBoxDetector(false); this.detectors[0][2] = gjkEpaDetector; this.detectors[0][3] = gjkEpaDetector; this.detectors[0][4] = new oimo.collision.narrowphase.detector.SphereCapsuleDetector(false); this.detectors[0][5] = gjkEpaDetector; this.detectors[1][0] = new oimo.collision.narrowphase.detector.SphereBoxDetector(true); this.detectors[1][1] = new oimo.collision.narrowphase.detector.BoxBoxDetector(); this.detectors[1][2] = gjkEpaDetector; this.detectors[1][3] = gjkEpaDetector; this.detectors[1][4] = gjkEpaDetector; this.detectors[1][5] = gjkEpaDetector; this.detectors[2][0] = gjkEpaDetector; this.detectors[2][1] = gjkEpaDetector; this.detectors[2][2] = gjkEpaDetector; this.detectors[2][3] = gjkEpaDetector; this.detectors[2][4] = gjkEpaDetector; this.detectors[2][5] = gjkEpaDetector; this.detectors[3][0] = gjkEpaDetector; this.detectors[3][1] = gjkEpaDetector; this.detectors[3][2] = gjkEpaDetector; this.detectors[3][3] = gjkEpaDetector; this.detectors[3][4] = gjkEpaDetector; this.detectors[3][5] = gjkEpaDetector; this.detectors[4][0] = new oimo.collision.narrowphase.detector.SphereCapsuleDetector(true); this.detectors[4][1] = gjkEpaDetector; this.detectors[4][2] = gjkEpaDetector; this.detectors[4][3] = gjkEpaDetector; this.detectors[4][4] = new oimo.collision.narrowphase.detector.CapsuleCapsuleDetector(); this.detectors[4][5] = gjkEpaDetector; this.detectors[5][0] = gjkEpaDetector; this.detectors[5][1] = gjkEpaDetector; this.detectors[5][2] = gjkEpaDetector; this.detectors[5][3] = gjkEpaDetector; this.detectors[5][4] = gjkEpaDetector; this.detectors[5][5] = gjkEpaDetector; } getDetector(geomType1,geomType2) { return this.detectors[geomType1][geomType2]; } } oimo.collision.narrowphase.DetectorResult = class oimo_collision_narrowphase_DetectorResult { constructor() { this.numPoints = 0; this.normal = new oimo.common.Vec3(); this.points = new Array(oimo.common.Setting.maxManifoldPoints); this.incremental = false; let _g = 0; let _g1 = oimo.common.Setting.maxManifoldPoints; while(_g < _g1) this.points[_g++] = new oimo.collision.narrowphase.DetectorResultPoint(); } getMaxDepth() { let max = 0; let _g = 0; let _g1 = this.numPoints; while(_g < _g1) { let i = _g++; if(this.points[i].depth > max) { max = this.points[i].depth; } } return max; } clear() { this.numPoints = 0; let _g = 0; let _g1 = this.points; while(_g < _g1.length) { let p = _g1[_g]; ++_g; p.position1.zero(); p.position2.zero(); p.depth = 0; p.id = 0; } this.normal.zero(); } } oimo.collision.narrowphase.DetectorResultPoint = class oimo_collision_narrowphase_DetectorResultPoint { constructor() { this.position1 = new oimo.common.Vec3(); this.position2 = new oimo.common.Vec3(); this.depth = 0; this.id = 0; } } if(!oimo.collision.narrowphase.detector) oimo.collision.narrowphase.detector = {}; oimo.collision.narrowphase.detector.Detector = class oimo_collision_narrowphase_detector_Detector { constructor(swapped) { this.swapped = swapped; } setNormal(result,nX,nY,nZ) { let v = result.normal; v.x = nX; v.y = nY; v.z = nZ; if(this.swapped) { let _this = result.normal; _this.x = -_this.x; _this.y = -_this.y; _this.z = -_this.z; } } addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,depth,id) { let p = result.points[result.numPoints++]; p.depth = depth; p.id = id; if(this.swapped) { let v = p.position1; v.x = pos2X; v.y = pos2Y; v.z = pos2Z; let v1 = p.position2; v1.x = pos1X; v1.y = pos1Y; v1.z = pos1Z; } else { let v = p.position1; v.x = pos1X; v.y = pos1Y; v.z = pos1Z; let v1 = p.position2; v1.x = pos2X; v1.y = pos2Y; v1.z = pos2Z; } } detectImpl(result,geom1,geom2,tf1,tf2,cachedData) { } detect(result,geom1,geom2,transform1,transform2,cachedData) { result.numPoints = 0; let _g = 0; let _g1 = result.points; while(_g < _g1.length) { let p = _g1[_g]; ++_g; p.position1.zero(); p.position2.zero(); p.depth = 0; p.id = 0; } result.normal.zero(); if(this.swapped) { this.detectImpl(result,geom2,geom1,transform2,transform1,cachedData); } else { this.detectImpl(result,geom1,geom2,transform1,transform2,cachedData); } } } oimo.collision.narrowphase.detector.BoxBoxDetector = class oimo_collision_narrowphase_detector_BoxBoxDetector extends oimo.collision.narrowphase.detector.Detector { constructor() { super(false); this.clipper = new oimo.collision.narrowphase.detector._BoxBoxDetector.FaceClipper(); } detectImpl(result,geom1,geom2,tf1,tf2,cachedData) { let b1 = geom1; let b2 = geom2; result.incremental = false; let c1X; let c1Y; let c1Z; let c2X; let c2Y; let c2Z; let c12X; let c12Y; let c12Z; c1X = tf1._positionX; c1Y = tf1._positionY; c1Z = tf1._positionZ; c2X = tf2._positionX; c2Y = tf2._positionY; c2Z = tf2._positionZ; c12X = c2X - c1X; c12Y = c2Y - c1Y; c12Z = c2Z - c1Z; let x1X; let x1Y; let x1Z; let y1X; let y1Y; let y1Z; let z1X; let z1Y; let z1Z; let x2X; let x2Y; let x2Z; let y2X; let y2Y; let y2Z; let z2X; let z2Y; let z2Z; x1X = tf1._rotation00; x1Y = tf1._rotation10; x1Z = tf1._rotation20; y1X = tf1._rotation01; y1Y = tf1._rotation11; y1Z = tf1._rotation21; z1X = tf1._rotation02; z1Y = tf1._rotation12; z1Z = tf1._rotation22; x2X = tf2._rotation00; x2Y = tf2._rotation10; x2Z = tf2._rotation20; y2X = tf2._rotation01; y2Y = tf2._rotation11; y2Z = tf2._rotation21; z2X = tf2._rotation02; z2Y = tf2._rotation12; z2Z = tf2._rotation22; let w1 = b1._halfExtentsX; let h1 = b1._halfExtentsY; let d1 = b1._halfExtentsZ; let w2 = b2._halfExtentsX; let h2 = b2._halfExtentsY; let d2 = b2._halfExtentsZ; let sx1X; let sx1Y; let sx1Z; let sy1X; let sy1Y; let sy1Z; let sz1X; let sz1Y; let sz1Z; let sx2X; let sx2Y; let sx2Z; let sy2X; let sy2Y; let sy2Z; let sz2X; let sz2Y; let sz2Z; sx1X = x1X * w1; sx1Y = x1Y * w1; sx1Z = x1Z * w1; sy1X = y1X * h1; sy1Y = y1Y * h1; sy1Z = y1Z * h1; sz1X = z1X * d1; sz1Y = z1Y * d1; sz1Z = z1Z * d1; sx2X = x2X * w2; sx2Y = x2Y * w2; sx2Z = x2Z * w2; sy2X = y2X * h2; sy2Y = y2Y * h2; sy2Z = y2Z * h2; sz2X = z2X * d2; sz2Y = z2Y * d2; sz2Z = z2Z * d2; let mDepth = 1e65536; let mId = -1; let mSign = 0; let mAxisX; let mAxisY; let mAxisZ; mAxisX = 0; mAxisY = 0; mAxisZ = 0; let proj1 = w1; let dx = x1X * sx2X + x1Y * sx2Y + x1Z * sx2Z; let dy = x1X * sy2X + x1Y * sy2Y + x1Z * sy2Z; let dz = x1X * sz2X + x1Y * sz2Y + x1Z * sz2Z; if(dx < 0) { dx = -dx; } if(dy < 0) { dy = -dy; } if(dz < 0) { dz = -dz; } let proj2 = dx + dy + dz; let projC12 = x1X * c12X + x1Y * c12Y + x1Z * c12Z; let sum = proj1 + proj2; let neg = projC12 < 0; let abs = neg ? -projC12 : projC12; if(abs < sum) { let depth = sum - abs; if(depth < 1e65536) { mDepth = depth; mId = 0; mAxisX = x1X; mAxisY = x1Y; mAxisZ = x1Z; mSign = neg ? -1 : 1; } } else { return; } proj1 = h1; let dx1 = y1X * sx2X + y1Y * sx2Y + y1Z * sx2Z; let dy1 = y1X * sy2X + y1Y * sy2Y + y1Z * sy2Z; let dz1 = y1X * sz2X + y1Y * sz2Y + y1Z * sz2Z; if(dx1 < 0) { dx1 = -dx1; } if(dy1 < 0) { dy1 = -dy1; } if(dz1 < 0) { dz1 = -dz1; } proj2 = dx1 + dy1 + dz1; projC12 = y1X * c12X + y1Y * c12Y + y1Z * c12Z; let sum1 = proj1 + proj2; let neg1 = projC12 < 0; let abs1 = neg1 ? -projC12 : projC12; if(abs1 < sum1) { let depth = sum1 - abs1; if(depth < mDepth) { mDepth = depth; mId = 1; mAxisX = y1X; mAxisY = y1Y; mAxisZ = y1Z; mSign = neg1 ? -1 : 1; } } else { return; } proj1 = d1; let dx2 = z1X * sx2X + z1Y * sx2Y + z1Z * sx2Z; let dy2 = z1X * sy2X + z1Y * sy2Y + z1Z * sy2Z; let dz2 = z1X * sz2X + z1Y * sz2Y + z1Z * sz2Z; if(dx2 < 0) { dx2 = -dx2; } if(dy2 < 0) { dy2 = -dy2; } if(dz2 < 0) { dz2 = -dz2; } proj2 = dx2 + dy2 + dz2; projC12 = z1X * c12X + z1Y * c12Y + z1Z * c12Z; let sum2 = proj1 + proj2; let neg2 = projC12 < 0; let abs2 = neg2 ? -projC12 : projC12; if(abs2 < sum2) { let depth = sum2 - abs2; if(depth < mDepth) { mDepth = depth; mId = 2; mAxisX = z1X; mAxisY = z1Y; mAxisZ = z1Z; mSign = neg2 ? -1 : 1; } } else { return; } if(mDepth > oimo.common.Setting.linearSlop) { mDepth -= oimo.common.Setting.linearSlop; } else { mDepth = 0; } let dx3 = x2X * sx1X + x2Y * sx1Y + x2Z * sx1Z; let dy3 = x2X * sy1X + x2Y * sy1Y + x2Z * sy1Z; let dz3 = x2X * sz1X + x2Y * sz1Y + x2Z * sz1Z; if(dx3 < 0) { dx3 = -dx3; } if(dy3 < 0) { dy3 = -dy3; } if(dz3 < 0) { dz3 = -dz3; } proj1 = dx3 + dy3 + dz3; proj2 = w2; projC12 = x2X * c12X + x2Y * c12Y + x2Z * c12Z; let sum3 = proj1 + proj2; let neg3 = projC12 < 0; let abs3 = neg3 ? -projC12 : projC12; if(abs3 < sum3) { let depth = sum3 - abs3; if(depth < mDepth) { mDepth = depth; mId = 3; mAxisX = x2X; mAxisY = x2Y; mAxisZ = x2Z; mSign = neg3 ? -1 : 1; } } else { return; } let dx4 = y2X * sx1X + y2Y * sx1Y + y2Z * sx1Z; let dy4 = y2X * sy1X + y2Y * sy1Y + y2Z * sy1Z; let dz4 = y2X * sz1X + y2Y * sz1Y + y2Z * sz1Z; if(dx4 < 0) { dx4 = -dx4; } if(dy4 < 0) { dy4 = -dy4; } if(dz4 < 0) { dz4 = -dz4; } proj1 = dx4 + dy4 + dz4; proj2 = h2; projC12 = y2X * c12X + y2Y * c12Y + y2Z * c12Z; let sum4 = proj1 + proj2; let neg4 = projC12 < 0; let abs4 = neg4 ? -projC12 : projC12; if(abs4 < sum4) { let depth = sum4 - abs4; if(depth < mDepth) { mDepth = depth; mId = 4; mAxisX = y2X; mAxisY = y2Y; mAxisZ = y2Z; mSign = neg4 ? -1 : 1; } } else { return; } let dx5 = z2X * sx1X + z2Y * sx1Y + z2Z * sx1Z; let dy5 = z2X * sy1X + z2Y * sy1Y + z2Z * sy1Z; let dz5 = z2X * sz1X + z2Y * sz1Y + z2Z * sz1Z; if(dx5 < 0) { dx5 = -dx5; } if(dy5 < 0) { dy5 = -dy5; } if(dz5 < 0) { dz5 = -dz5; } proj1 = dx5 + dy5 + dz5; proj2 = d2; projC12 = z2X * c12X + z2Y * c12Y + z2Z * c12Z; let sum5 = proj1 + proj2; let neg5 = projC12 < 0; let abs5 = neg5 ? -projC12 : projC12; if(abs5 < sum5) { let depth = sum5 - abs5; if(depth < mDepth) { mDepth = depth; mId = 5; mAxisX = z2X; mAxisY = z2Y; mAxisZ = z2Z; mSign = neg5 ? -1 : 1; } } else { return; } if(mDepth > oimo.common.Setting.linearSlop) { mDepth -= oimo.common.Setting.linearSlop; } else { mDepth = 0; } let edgeAxisX; let edgeAxisY; let edgeAxisZ; edgeAxisX = x1Y * x2Z - x1Z * x2Y; edgeAxisY = x1Z * x2X - x1X * x2Z; edgeAxisZ = x1X * x2Y - x1Y * x2X; if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) { let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ; if(l > 0) { l = 1 / Math.sqrt(l); } edgeAxisX *= l; edgeAxisY *= l; edgeAxisZ *= l; let dx = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z; let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z; if(dx < 0) { dx = -dx; } if(dy < 0) { dy = -dy; } proj1 = dx + dy; let dx1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z; let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z; if(dx1 < 0) { dx1 = -dx1; } if(dy1 < 0) { dy1 = -dy1; } proj2 = dx1 + dy1; projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z; let sum = proj1 + proj2; let neg = projC12 < 0; let abs = neg ? -projC12 : projC12; if(abs < sum) { let depth = sum - abs; if(depth < mDepth) { mDepth = depth; mId = 6; mAxisX = edgeAxisX; mAxisY = edgeAxisY; mAxisZ = edgeAxisZ; mSign = neg ? -1 : 1; } } else { return; } } edgeAxisX = x1Y * y2Z - x1Z * y2Y; edgeAxisY = x1Z * y2X - x1X * y2Z; edgeAxisZ = x1X * y2Y - x1Y * y2X; if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) { let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ; if(l > 0) { l = 1 / Math.sqrt(l); } edgeAxisX *= l; edgeAxisY *= l; edgeAxisZ *= l; let dx = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z; let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z; if(dx < 0) { dx = -dx; } if(dy < 0) { dy = -dy; } proj1 = dx + dy; let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z; let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z; if(dx1 < 0) { dx1 = -dx1; } if(dy1 < 0) { dy1 = -dy1; } proj2 = dx1 + dy1; projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z; let sum = proj1 + proj2; let neg = projC12 < 0; let abs = neg ? -projC12 : projC12; if(abs < sum) { let depth = sum - abs; if(depth < mDepth) { mDepth = depth; mId = 7; mAxisX = edgeAxisX; mAxisY = edgeAxisY; mAxisZ = edgeAxisZ; mSign = neg ? -1 : 1; } } else { return; } } edgeAxisX = x1Y * z2Z - x1Z * z2Y; edgeAxisY = x1Z * z2X - x1X * z2Z; edgeAxisZ = x1X * z2Y - x1Y * z2X; if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) { let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ; if(l > 0) { l = 1 / Math.sqrt(l); } edgeAxisX *= l; edgeAxisY *= l; edgeAxisZ *= l; let dx = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z; let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z; if(dx < 0) { dx = -dx; } if(dy < 0) { dy = -dy; } proj1 = dx + dy; let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z; let dy1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z; if(dx1 < 0) { dx1 = -dx1; } if(dy1 < 0) { dy1 = -dy1; } proj2 = dx1 + dy1; projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z; let sum = proj1 + proj2; let neg = projC12 < 0; let abs = neg ? -projC12 : projC12; if(abs < sum) { let depth = sum - abs; if(depth < mDepth) { mDepth = depth; mId = 8; mAxisX = edgeAxisX; mAxisY = edgeAxisY; mAxisZ = edgeAxisZ; mSign = neg ? -1 : 1; } } else { return; } } edgeAxisX = y1Y * x2Z - y1Z * x2Y; edgeAxisY = y1Z * x2X - y1X * x2Z; edgeAxisZ = y1X * x2Y - y1Y * x2X; if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) { let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ; if(l > 0) { l = 1 / Math.sqrt(l); } edgeAxisX *= l; edgeAxisY *= l; edgeAxisZ *= l; let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z; let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z; if(dx < 0) { dx = -dx; } if(dy < 0) { dy = -dy; } proj1 = dx + dy; let dx1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z; let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z; if(dx1 < 0) { dx1 = -dx1; } if(dy1 < 0) { dy1 = -dy1; } proj2 = dx1 + dy1; projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z; let sum = proj1 + proj2; let neg = projC12 < 0; let abs = neg ? -projC12 : projC12; if(abs < sum) { let depth = sum - abs; if(depth < mDepth) { mDepth = depth; mId = 9; mAxisX = edgeAxisX; mAxisY = edgeAxisY; mAxisZ = edgeAxisZ; mSign = neg ? -1 : 1; } } else { return; } } edgeAxisX = y1Y * y2Z - y1Z * y2Y; edgeAxisY = y1Z * y2X - y1X * y2Z; edgeAxisZ = y1X * y2Y - y1Y * y2X; if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) { let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ; if(l > 0) { l = 1 / Math.sqrt(l); } edgeAxisX *= l; edgeAxisY *= l; edgeAxisZ *= l; let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z; let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z; if(dx < 0) { dx = -dx; } if(dy < 0) { dy = -dy; } proj1 = dx + dy; let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z; let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z; if(dx1 < 0) { dx1 = -dx1; } if(dy1 < 0) { dy1 = -dy1; } proj2 = dx1 + dy1; projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z; let sum = proj1 + proj2; let neg = projC12 < 0; let abs = neg ? -projC12 : projC12; if(abs < sum) { let depth = sum - abs; if(depth < mDepth) { mDepth = depth; mId = 10; mAxisX = edgeAxisX; mAxisY = edgeAxisY; mAxisZ = edgeAxisZ; mSign = neg ? -1 : 1; } } else { return; } } edgeAxisX = y1Y * z2Z - y1Z * z2Y; edgeAxisY = y1Z * z2X - y1X * z2Z; edgeAxisZ = y1X * z2Y - y1Y * z2X; if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) { let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ; if(l > 0) { l = 1 / Math.sqrt(l); } edgeAxisX *= l; edgeAxisY *= l; edgeAxisZ *= l; let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z; let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z; if(dx < 0) { dx = -dx; } if(dy < 0) { dy = -dy; } proj1 = dx + dy; let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z; let dy1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z; if(dx1 < 0) { dx1 = -dx1; } if(dy1 < 0) { dy1 = -dy1; } proj2 = dx1 + dy1; projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z; let sum = proj1 + proj2; let neg = projC12 < 0; let abs = neg ? -projC12 : projC12; if(abs < sum) { let depth = sum - abs; if(depth < mDepth) { mDepth = depth; mId = 11; mAxisX = edgeAxisX; mAxisY = edgeAxisY; mAxisZ = edgeAxisZ; mSign = neg ? -1 : 1; } } else { return; } } edgeAxisX = z1Y * x2Z - z1Z * x2Y; edgeAxisY = z1Z * x2X - z1X * x2Z; edgeAxisZ = z1X * x2Y - z1Y * x2X; if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) { let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ; if(l > 0) { l = 1 / Math.sqrt(l); } edgeAxisX *= l; edgeAxisY *= l; edgeAxisZ *= l; let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z; let dy = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z; if(dx < 0) { dx = -dx; } if(dy < 0) { dy = -dy; } proj1 = dx + dy; let dx1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z; let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z; if(dx1 < 0) { dx1 = -dx1; } if(dy1 < 0) { dy1 = -dy1; } proj2 = dx1 + dy1; projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z; let sum = proj1 + proj2; let neg = projC12 < 0; let abs = neg ? -projC12 : projC12; if(abs < sum) { let depth = sum - abs; if(depth < mDepth) { mDepth = depth; mId = 12; mAxisX = edgeAxisX; mAxisY = edgeAxisY; mAxisZ = edgeAxisZ; mSign = neg ? -1 : 1; } } else { return; } } edgeAxisX = z1Y * y2Z - z1Z * y2Y; edgeAxisY = z1Z * y2X - z1X * y2Z; edgeAxisZ = z1X * y2Y - z1Y * y2X; if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) { let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ; if(l > 0) { l = 1 / Math.sqrt(l); } edgeAxisX *= l; edgeAxisY *= l; edgeAxisZ *= l; let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z; let dy = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z; if(dx < 0) { dx = -dx; } if(dy < 0) { dy = -dy; } proj1 = dx + dy; let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z; let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z; if(dx1 < 0) { dx1 = -dx1; } if(dy1 < 0) { dy1 = -dy1; } proj2 = dx1 + dy1; projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z; let sum = proj1 + proj2; let neg = projC12 < 0; let abs = neg ? -projC12 : projC12; if(abs < sum) { let depth = sum - abs; if(depth < mDepth) { mDepth = depth; mId = 13; mAxisX = edgeAxisX; mAxisY = edgeAxisY; mAxisZ = edgeAxisZ; mSign = neg ? -1 : 1; } } else { return; } } edgeAxisX = z1Y * z2Z - z1Z * z2Y; edgeAxisY = z1Z * z2X - z1X * z2Z; edgeAxisZ = z1X * z2Y - z1Y * z2X; if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) { let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ; if(l > 0) { l = 1 / Math.sqrt(l); } edgeAxisX *= l; edgeAxisY *= l; edgeAxisZ *= l; let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z; let dy = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z; if(dx < 0) { dx = -dx; } if(dy < 0) { dy = -dy; } proj1 = dx + dy; let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z; let dy1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z; if(dx1 < 0) { dx1 = -dx1; } if(dy1 < 0) { dy1 = -dy1; } proj2 = dx1 + dy1; projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z; let sum = proj1 + proj2; let neg = projC12 < 0; let abs = neg ? -projC12 : projC12; if(abs < sum) { let depth = sum - abs; if(depth < mDepth) { mDepth = depth; mId = 14; mAxisX = edgeAxisX; mAxisY = edgeAxisY; mAxisZ = edgeAxisZ; mSign = neg ? -1 : 1; } } else { return; } } if(mId >= 6) { mAxisX *= mSign; mAxisY *= mSign; mAxisZ *= mSign; let id1 = (mId - 6) / 3 | 0; let id2 = mId - 6 - id1 * 3; let p1X; let p1Y; let p1Z; let p2X; let p2Y; let p2Z; let d1X; let d1Y; let d1Z; let d2X; let d2Y; let d2Z; switch(id1) { case 0: d1X = x1X; d1Y = x1Y; d1Z = x1Z; let signY = sz1X * mAxisX + sz1Y * mAxisY + sz1Z * mAxisZ > 0; if(sy1X * mAxisX + sy1Y * mAxisY + sy1Z * mAxisZ > 0) { if(signY) { p1X = sy1X + sz1X; p1Y = sy1Y + sz1Y; p1Z = sy1Z + sz1Z; } else { p1X = sy1X - sz1X; p1Y = sy1Y - sz1Y; p1Z = sy1Z - sz1Z; } } else if(signY) { p1X = sz1X - sy1X; p1Y = sz1Y - sy1Y; p1Z = sz1Z - sy1Z; } else { p1X = sy1X + sz1X; p1Y = sy1Y + sz1Y; p1Z = sy1Z + sz1Z; p1X = -p1X; p1Y = -p1Y; p1Z = -p1Z; } break; case 1: d1X = y1X; d1Y = y1Y; d1Z = y1Z; let signY1 = sz1X * mAxisX + sz1Y * mAxisY + sz1Z * mAxisZ > 0; if(sx1X * mAxisX + sx1Y * mAxisY + sx1Z * mAxisZ > 0) { if(signY1) { p1X = sx1X + sz1X; p1Y = sx1Y + sz1Y; p1Z = sx1Z + sz1Z; } else { p1X = sx1X - sz1X; p1Y = sx1Y - sz1Y; p1Z = sx1Z - sz1Z; } } else if(signY1) { p1X = sz1X - sx1X; p1Y = sz1Y - sx1Y; p1Z = sz1Z - sx1Z; } else { p1X = sx1X + sz1X; p1Y = sx1Y + sz1Y; p1Z = sx1Z + sz1Z; p1X = -p1X; p1Y = -p1Y; p1Z = -p1Z; } break; default: d1X = z1X; d1Y = z1Y; d1Z = z1Z; let signY2 = sy1X * mAxisX + sy1Y * mAxisY + sy1Z * mAxisZ > 0; if(sx1X * mAxisX + sx1Y * mAxisY + sx1Z * mAxisZ > 0) { if(signY2) { p1X = sx1X + sy1X; p1Y = sx1Y + sy1Y; p1Z = sx1Z + sy1Z; } else { p1X = sx1X - sy1X; p1Y = sx1Y - sy1Y; p1Z = sx1Z - sy1Z; } } else if(signY2) { p1X = sy1X - sx1X; p1Y = sy1Y - sx1Y; p1Z = sy1Z - sx1Z; } else { p1X = sx1X + sy1X; p1Y = sx1Y + sy1Y; p1Z = sx1Z + sy1Z; p1X = -p1X; p1Y = -p1Y; p1Z = -p1Z; } } p1X = c1X + p1X; p1Y = c1Y + p1Y; p1Z = c1Z + p1Z; switch(id2) { case 0: d2X = x2X; d2Y = x2Y; d2Z = x2Z; let signY3 = sz2X * mAxisX + sz2Y * mAxisY + sz2Z * mAxisZ > 0; if(sy2X * mAxisX + sy2Y * mAxisY + sy2Z * mAxisZ > 0) { if(signY3) { p2X = sy2X + sz2X; p2Y = sy2Y + sz2Y; p2Z = sy2Z + sz2Z; } else { p2X = sy2X - sz2X; p2Y = sy2Y - sz2Y; p2Z = sy2Z - sz2Z; } } else if(signY3) { p2X = sz2X - sy2X; p2Y = sz2Y - sy2Y; p2Z = sz2Z - sy2Z; } else { p2X = sy2X + sz2X; p2Y = sy2Y + sz2Y; p2Z = sy2Z + sz2Z; p2X = -p2X; p2Y = -p2Y; p2Z = -p2Z; } break; case 1: d2X = y2X; d2Y = y2Y; d2Z = y2Z; let signY4 = sz2X * mAxisX + sz2Y * mAxisY + sz2Z * mAxisZ > 0; if(sx2X * mAxisX + sx2Y * mAxisY + sx2Z * mAxisZ > 0) { if(signY4) { p2X = sx2X + sz2X; p2Y = sx2Y + sz2Y; p2Z = sx2Z + sz2Z; } else { p2X = sx2X - sz2X; p2Y = sx2Y - sz2Y; p2Z = sx2Z - sz2Z; } } else if(signY4) { p2X = sz2X - sx2X; p2Y = sz2Y - sx2Y; p2Z = sz2Z - sx2Z; } else { p2X = sx2X + sz2X; p2Y = sx2Y + sz2Y; p2Z = sx2Z + sz2Z; p2X = -p2X; p2Y = -p2Y; p2Z = -p2Z; } break; default: d2X = z2X; d2Y = z2Y; d2Z = z2Z; let signY5 = sy2X * mAxisX + sy2Y * mAxisY + sy2Z * mAxisZ > 0; if(sx2X * mAxisX + sx2Y * mAxisY + sx2Z * mAxisZ > 0) { if(signY5) { p2X = sx2X + sy2X; p2Y = sx2Y + sy2Y; p2Z = sx2Z + sy2Z; } else { p2X = sx2X - sy2X; p2Y = sx2Y - sy2Y; p2Z = sx2Z - sy2Z; } } else if(signY5) { p2X = sy2X - sx2X; p2Y = sy2Y - sx2Y; p2Z = sy2Z - sx2Z; } else { p2X = sx2X + sy2X; p2Y = sx2Y + sy2Y; p2Z = sx2Z + sy2Z; p2X = -p2X; p2Y = -p2Y; p2Z = -p2Z; } } p2X = c2X - p2X; p2Y = c2Y - p2Y; p2Z = c2Z - p2Z; let rX; let rY; let rZ; rX = p1X - p2X; rY = p1Y - p2Y; rZ = p1Z - p2Z; let dot12 = d1X * d2X + d1Y * d2Y + d1Z * d2Z; let dot1r = d1X * rX + d1Y * rY + d1Z * rZ; let dot2r = d2X * rX + d2Y * rY + d2Z * rZ; let invDet = 1 / (1 - dot12 * dot12); let t1 = (dot12 * dot2r - dot1r) * invDet; let t2 = (dot2r - dot12 * dot1r) * invDet; let cp1X; let cp1Y; let cp1Z; let cp2X; let cp2Y; let cp2Z; cp1X = p1X + d1X * t1; cp1Y = p1Y + d1Y * t1; cp1Z = p1Z + d1Z * t1; cp2X = p2X + d2X * t2; cp2Y = p2Y + d2Y * t2; cp2Z = p2Z + d2Z * t2; let normalX; let normalY; let normalZ; normalX = -mAxisX; normalY = -mAxisY; normalZ = -mAxisZ; this.setNormal(result,normalX,normalY,normalZ); this.addPoint(result,cp1X,cp1Y,cp1Z,cp2X,cp2Y,cp2Z,mDepth,4); return; } let tmpX; let tmpY; let tmpZ; let swapped; if(mId >= 3) { mSign = -mSign; c12X = -c12X; c12Y = -c12Y; c12Z = -c12Z; w1 = w2; h1 = h2; d1 = d2; c1X = c2X; c1Y = c2Y; c1Z = c2Z; tmpX = x1X; tmpY = x1Y; tmpZ = x1Z; x1X = x2X; x1Y = x2Y; x1Z = x2Z; x2X = tmpX; x2Y = tmpY; x2Z = tmpZ; tmpX = y1X; tmpY = y1Y; tmpZ = y1Z; y1X = y2X; y1Y = y2Y; y1Z = y2Z; y2X = tmpX; y2Y = tmpY; y2Z = tmpZ; tmpX = z1X; tmpY = z1Y; tmpZ = z1Z; z1X = z2X; z1Y = z2Y; z1Z = z2Z; z2X = tmpX; z2Y = tmpY; z2Z = tmpZ; tmpX = sx1X; tmpY = sx1Y; tmpZ = sx1Z; sx1X = sx2X; sx1Y = sx2Y; sx1Z = sx2Z; sx2X = tmpX; sx2Y = tmpY; sx2Z = tmpZ; tmpX = sy1X; tmpY = sy1Y; tmpZ = sy1Z; sy1X = sy2X; sy1Y = sy2Y; sy1Z = sy2Z; sy2X = tmpX; sy2Y = tmpY; sy2Z = tmpZ; tmpX = sz1X; tmpY = sz1Y; tmpZ = sz1Z; sz1X = sz2X; sz1Y = sz2Y; sz1Z = sz2Z; sz2X = tmpX; sz2Y = tmpY; sz2Z = tmpZ; mId -= 3; swapped = true; } else { swapped = false; } let refCenterX; let refCenterY; let refCenterZ; let refNormalX; let refNormalY; let refNormalZ; let refXX; let refXY; let refXZ; let refYX; let refYY; let refYZ; let refW; let refH; switch(mId) { case 0: refCenterX = sx1X; refCenterY = sx1Y; refCenterZ = sx1Z; refNormalX = x1X; refNormalY = x1Y; refNormalZ = x1Z; refXX = y1X; refXY = y1Y; refXZ = y1Z; refYX = z1X; refYY = z1Y; refYZ = z1Z; refW = h1; refH = d1; break; case 1: refCenterX = sy1X; refCenterY = sy1Y; refCenterZ = sy1Z; refNormalX = y1X; refNormalY = y1Y; refNormalZ = y1Z; refXX = z1X; refXY = z1Y; refXZ = z1Z; refYX = x1X; refYY = x1Y; refYZ = x1Z; refW = d1; refH = w1; break; default: refCenterX = sz1X; refCenterY = sz1Y; refCenterZ = sz1Z; refNormalX = z1X; refNormalY = z1Y; refNormalZ = z1Z; refXX = x1X; refXY = x1Y; refXZ = x1Z; refYX = y1X; refYY = y1Y; refYZ = y1Z; refW = w1; refH = h1; } if(mSign < 0) { refCenterX = -refCenterX; refCenterY = -refCenterY; refCenterZ = -refCenterZ; refNormalX = -refNormalX; refNormalY = -refNormalY; refNormalZ = -refNormalZ; tmpX = refXX; tmpY = refXY; tmpZ = refXZ; refXX = refYX; refXY = refYY; refXZ = refYZ; refYX = tmpX; refYY = tmpY; refYZ = tmpZ; let tmp = refW; refW = refH; refH = tmp; } refCenterX += c1X; refCenterY += c1Y; refCenterZ += c1Z; let minIncDot = 1; let incId = 0; let incDot = refNormalX * x2X + refNormalY * x2Y + refNormalZ * x2Z; if(incDot < minIncDot) { minIncDot = incDot; incId = 0; } if(-incDot < minIncDot) { minIncDot = -incDot; incId = 1; } incDot = refNormalX * y2X + refNormalY * y2Y + refNormalZ * y2Z; if(incDot < minIncDot) { minIncDot = incDot; incId = 2; } if(-incDot < minIncDot) { minIncDot = -incDot; incId = 3; } incDot = refNormalX * z2X + refNormalY * z2Y + refNormalZ * z2Z; if(incDot < minIncDot) { minIncDot = incDot; incId = 4; } if(-incDot < minIncDot) { incId = 5; } let incV1X; let incV1Y; let incV1Z; let incV2X; let incV2Y; let incV2Z; let incV3X; let incV3Y; let incV3Z; let incV4X; let incV4Y; let incV4Z; switch(incId) { case 0: incV1X = sx2X + sy2X; incV1Y = sx2Y + sy2Y; incV1Z = sx2Z + sy2Z; incV1X += sz2X; incV1Y += sz2Y; incV1Z += sz2Z; incV2X = sx2X - sy2X; incV2Y = sx2Y - sy2Y; incV2Z = sx2Z - sy2Z; incV2X += sz2X; incV2Y += sz2Y; incV2Z += sz2Z; incV3X = sx2X - sy2X; incV3Y = sx2Y - sy2Y; incV3Z = sx2Z - sy2Z; incV3X -= sz2X; incV3Y -= sz2Y; incV3Z -= sz2Z; incV4X = sx2X + sy2X; incV4Y = sx2Y + sy2Y; incV4Z = sx2Z + sy2Z; incV4X -= sz2X; incV4Y -= sz2Y; incV4Z -= sz2Z; break; case 1: incV1X = sy2X - sx2X; incV1Y = sy2Y - sx2Y; incV1Z = sy2Z - sx2Z; incV1X += sz2X; incV1Y += sz2Y; incV1Z += sz2Z; incV2X = sy2X - sx2X; incV2Y = sy2Y - sx2Y; incV2Z = sy2Z - sx2Z; incV2X -= sz2X; incV2Y -= sz2Y; incV2Z -= sz2Z; incV3X = sx2X + sy2X; incV3Y = sx2Y + sy2Y; incV3Z = sx2Z + sy2Z; incV3X = -incV3X; incV3Y = -incV3Y; incV3Z = -incV3Z; incV3X -= sz2X; incV3Y -= sz2Y; incV3Z -= sz2Z; incV4X = sx2X + sy2X; incV4Y = sx2Y + sy2Y; incV4Z = sx2Z + sy2Z; incV4X = -incV4X; incV4Y = -incV4Y; incV4Z = -incV4Z; incV4X += sz2X; incV4Y += sz2Y; incV4Z += sz2Z; break; case 2: incV1X = sx2X + sy2X; incV1Y = sx2Y + sy2Y; incV1Z = sx2Z + sy2Z; incV1X += sz2X; incV1Y += sz2Y; incV1Z += sz2Z; incV2X = sx2X + sy2X; incV2Y = sx2Y + sy2Y; incV2Z = sx2Z + sy2Z; incV2X -= sz2X; incV2Y -= sz2Y; incV2Z -= sz2Z; incV3X = sy2X - sx2X; incV3Y = sy2Y - sx2Y; incV3Z = sy2Z - sx2Z; incV3X -= sz2X; incV3Y -= sz2Y; incV3Z -= sz2Z; incV4X = sy2X - sx2X; incV4Y = sy2Y - sx2Y; incV4Z = sy2Z - sx2Z; incV4X += sz2X; incV4Y += sz2Y; incV4Z += sz2Z; break; case 3: incV1X = sx2X - sy2X; incV1Y = sx2Y - sy2Y; incV1Z = sx2Z - sy2Z; incV1X += sz2X; incV1Y += sz2Y; incV1Z += sz2Z; incV2X = sx2X + sy2X; incV2Y = sx2Y + sy2Y; incV2Z = sx2Z + sy2Z; incV2X = -incV2X; incV2Y = -incV2Y; incV2Z = -incV2Z; incV2X += sz2X; incV2Y += sz2Y; incV2Z += sz2Z; incV3X = sx2X + sy2X; incV3Y = sx2Y + sy2Y; incV3Z = sx2Z + sy2Z; incV3X = -incV3X; incV3Y = -incV3Y; incV3Z = -incV3Z; incV3X -= sz2X; incV3Y -= sz2Y; incV3Z -= sz2Z; incV4X = sx2X - sy2X; incV4Y = sx2Y - sy2Y; incV4Z = sx2Z - sy2Z; incV4X -= sz2X; incV4Y -= sz2Y; incV4Z -= sz2Z; break; case 4: incV1X = sx2X + sy2X; incV1Y = sx2Y + sy2Y; incV1Z = sx2Z + sy2Z; incV1X += sz2X; incV1Y += sz2Y; incV1Z += sz2Z; incV2X = sy2X - sx2X; incV2Y = sy2Y - sx2Y; incV2Z = sy2Z - sx2Z; incV2X += sz2X; incV2Y += sz2Y; incV2Z += sz2Z; incV3X = sx2X + sy2X; incV3Y = sx2Y + sy2Y; incV3Z = sx2Z + sy2Z; incV3X = -incV3X; incV3Y = -incV3Y; incV3Z = -incV3Z; incV3X += sz2X; incV3Y += sz2Y; incV3Z += sz2Z; incV4X = sx2X - sy2X; incV4Y = sx2Y - sy2Y; incV4Z = sx2Z - sy2Z; incV4X += sz2X; incV4Y += sz2Y; incV4Z += sz2Z; break; default: incV1X = sx2X + sy2X; incV1Y = sx2Y + sy2Y; incV1Z = sx2Z + sy2Z; incV1X -= sz2X; incV1Y -= sz2Y; incV1Z -= sz2Z; incV2X = sx2X - sy2X; incV2Y = sx2Y - sy2Y; incV2Z = sx2Z - sy2Z; incV2X -= sz2X; incV2Y -= sz2Y; incV2Z -= sz2Z; incV3X = sx2X + sy2X; incV3Y = sx2Y + sy2Y; incV3Z = sx2Z + sy2Z; incV3X = -incV3X; incV3Y = -incV3Y; incV3Z = -incV3Z; incV3X -= sz2X; incV3Y -= sz2Y; incV3Z -= sz2Z; incV4X = sy2X - sx2X; incV4Y = sy2Y - sx2Y; incV4Z = sy2Z - sx2Z; incV4X -= sz2X; incV4Y -= sz2Y; incV4Z -= sz2Z; } incV1X += c12X; incV1Y += c12Y; incV1Z += c12Z; incV2X += c12X; incV2Y += c12Y; incV2Z += c12Z; incV3X += c12X; incV3Y += c12Y; incV3Z += c12Z; incV4X += c12X; incV4Y += c12Y; incV4Z += c12Z; let _this = this.clipper; _this.w = refW; _this.h = refH; _this.numVertices = 0; _this.numTmpVertices = 0; let _this1 = this.clipper; let _this2 = _this1.vertices[_this1.numVertices++]; _this2.x = incV1X * refXX + incV1Y * refXY + incV1Z * refXZ; _this2.y = incV1X * refYX + incV1Y * refYY + incV1Z * refYZ; _this2.wx = incV1X; _this2.wy = incV1Y; _this2.wz = incV1Z; let _this3 = this.clipper; let _this4 = _this3.vertices[_this3.numVertices++]; _this4.x = incV2X * refXX + incV2Y * refXY + incV2Z * refXZ; _this4.y = incV2X * refYX + incV2Y * refYY + incV2Z * refYZ; _this4.wx = incV2X; _this4.wy = incV2Y; _this4.wz = incV2Z; let _this5 = this.clipper; let _this6 = _this5.vertices[_this5.numVertices++]; _this6.x = incV3X * refXX + incV3Y * refXY + incV3Z * refXZ; _this6.y = incV3X * refYX + incV3Y * refYY + incV3Z * refYZ; _this6.wx = incV3X; _this6.wy = incV3Y; _this6.wz = incV3Z; let _this7 = this.clipper; let _this8 = _this7.vertices[_this7.numVertices++]; _this8.x = incV4X * refXX + incV4Y * refXY + incV4Z * refXZ; _this8.y = incV4X * refYX + incV4Y * refYY + incV4Z * refYZ; _this8.wx = incV4X; _this8.wy = incV4Y; _this8.wz = incV4Z; this.clipper.clip(); this.clipper.reduce(); let normalX; let normalY; let normalZ; if(swapped) { normalX = refNormalX; normalY = refNormalY; normalZ = refNormalZ; } else { normalX = -refNormalX; normalY = -refNormalY; normalZ = -refNormalZ; } this.setNormal(result,normalX,normalY,normalZ); let _g = 0; let _g1 = this.clipper.numVertices; while(_g < _g1) { let i = _g++; let v = this.clipper.vertices[i]; let clippedVertexX; let clippedVertexY; let clippedVertexZ; clippedVertexX = v.wx; clippedVertexY = v.wy; clippedVertexZ = v.wz; clippedVertexX += c1X; clippedVertexY += c1Y; clippedVertexZ += c1Z; let clippedVertexToRefCenterX; let clippedVertexToRefCenterY; let clippedVertexToRefCenterZ; clippedVertexToRefCenterX = refCenterX - clippedVertexX; clippedVertexToRefCenterY = refCenterY - clippedVertexY; clippedVertexToRefCenterZ = refCenterZ - clippedVertexZ; let depth = clippedVertexToRefCenterX * refNormalX + clippedVertexToRefCenterY * refNormalY + clippedVertexToRefCenterZ * refNormalZ; let clippedVertexOnRefFaceX; let clippedVertexOnRefFaceY; let clippedVertexOnRefFaceZ; clippedVertexOnRefFaceX = clippedVertexX + refNormalX * depth; clippedVertexOnRefFaceY = clippedVertexY + refNormalY * depth; clippedVertexOnRefFaceZ = clippedVertexZ + refNormalZ * depth; if(depth > -oimo.common.Setting.contactPersistenceThreshold) { if(swapped) { this.addPoint(result,clippedVertexX,clippedVertexY,clippedVertexZ,clippedVertexOnRefFaceX,clippedVertexOnRefFaceY,clippedVertexOnRefFaceZ,depth,i); } else { this.addPoint(result,clippedVertexOnRefFaceX,clippedVertexOnRefFaceY,clippedVertexOnRefFaceZ,clippedVertexX,clippedVertexY,clippedVertexZ,depth,i); } } } } } if(!oimo.collision.narrowphase.detector._BoxBoxDetector) oimo.collision.narrowphase.detector._BoxBoxDetector = {}; oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex = class oimo_collision_narrowphase_detector__$BoxBoxDetector_IncidentVertex { constructor() { this.x = 0; this.y = 0; this.wx = 0; this.wy = 0; this.wz = 0; } } oimo.collision.narrowphase.detector._BoxBoxDetector.FaceClipper = class oimo_collision_narrowphase_detector__$BoxBoxDetector_FaceClipper { constructor() { this.w = 0; this.h = 0; this.numVertices = 0; this.numTmpVertices = 0; this.vertices = new Array(8); this.tmpVertices = new Array(8); this.vertices[0] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.tmpVertices[0] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.vertices[1] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.tmpVertices[1] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.vertices[2] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.tmpVertices[2] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.vertices[3] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.tmpVertices[3] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.vertices[4] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.tmpVertices[4] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.vertices[5] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.tmpVertices[5] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.vertices[6] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.tmpVertices[6] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.vertices[7] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); this.tmpVertices[7] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex(); } clip() { let _g = 0; let _g1 = this.numVertices; while(_g < _g1) { let i = _g++; let v1 = this.vertices[i]; let v2 = this.vertices[(i + 1) % this.numVertices]; let s1 = this.w + v1.x; let s2 = this.w + v2.x; if(s1 > 0 && s2 > 0) { let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x; _this.y = v1.y; _this.wx = v1.wx; _this.wy = v1.wy; _this.wz = v1.wz; } else if(s1 > 0 && s2 <= 0) { let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x; _this.y = v1.y; _this.wx = v1.wx; _this.wy = v1.wy; _this.wz = v1.wz; let t = s1 / (s1 - s2); let _this1 = this.tmpVertices[this.numTmpVertices++]; _this1.x = v1.x + (v2.x - v1.x) * t; _this1.y = v1.y + (v2.y - v1.y) * t; _this1.wx = v1.wx + (v2.wx - v1.wx) * t; _this1.wy = v1.wy + (v2.wy - v1.wy) * t; _this1.wz = v1.wz + (v2.wz - v1.wz) * t; } else if(s1 <= 0 && s2 > 0) { let t = s1 / (s1 - s2); let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x + (v2.x - v1.x) * t; _this.y = v1.y + (v2.y - v1.y) * t; _this.wx = v1.wx + (v2.wx - v1.wx) * t; _this.wy = v1.wy + (v2.wy - v1.wy) * t; _this.wz = v1.wz + (v2.wz - v1.wz) * t; } } let tmp = this.vertices; this.vertices = this.tmpVertices; this.tmpVertices = tmp; this.numVertices = this.numTmpVertices; this.numTmpVertices = 0; let _g2 = 0; let _g3 = this.numVertices; while(_g2 < _g3) { let i = _g2++; let v1 = this.vertices[i]; let v2 = this.vertices[(i + 1) % this.numVertices]; let s1 = this.w - v1.x; let s2 = this.w - v2.x; if(s1 > 0 && s2 > 0) { let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x; _this.y = v1.y; _this.wx = v1.wx; _this.wy = v1.wy; _this.wz = v1.wz; } else if(s1 > 0 && s2 <= 0) { let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x; _this.y = v1.y; _this.wx = v1.wx; _this.wy = v1.wy; _this.wz = v1.wz; let t = s1 / (s1 - s2); let _this1 = this.tmpVertices[this.numTmpVertices++]; _this1.x = v1.x + (v2.x - v1.x) * t; _this1.y = v1.y + (v2.y - v1.y) * t; _this1.wx = v1.wx + (v2.wx - v1.wx) * t; _this1.wy = v1.wy + (v2.wy - v1.wy) * t; _this1.wz = v1.wz + (v2.wz - v1.wz) * t; } else if(s1 <= 0 && s2 > 0) { let t = s1 / (s1 - s2); let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x + (v2.x - v1.x) * t; _this.y = v1.y + (v2.y - v1.y) * t; _this.wx = v1.wx + (v2.wx - v1.wx) * t; _this.wy = v1.wy + (v2.wy - v1.wy) * t; _this.wz = v1.wz + (v2.wz - v1.wz) * t; } } let tmp1 = this.vertices; this.vertices = this.tmpVertices; this.tmpVertices = tmp1; this.numVertices = this.numTmpVertices; this.numTmpVertices = 0; let _g4 = 0; let _g5 = this.numVertices; while(_g4 < _g5) { let i = _g4++; let v1 = this.vertices[i]; let v2 = this.vertices[(i + 1) % this.numVertices]; let s1 = this.h + v1.y; let s2 = this.h + v2.y; if(s1 > 0 && s2 > 0) { let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x; _this.y = v1.y; _this.wx = v1.wx; _this.wy = v1.wy; _this.wz = v1.wz; } else if(s1 > 0 && s2 <= 0) { let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x; _this.y = v1.y; _this.wx = v1.wx; _this.wy = v1.wy; _this.wz = v1.wz; let t = s1 / (s1 - s2); let _this1 = this.tmpVertices[this.numTmpVertices++]; _this1.x = v1.x + (v2.x - v1.x) * t; _this1.y = v1.y + (v2.y - v1.y) * t; _this1.wx = v1.wx + (v2.wx - v1.wx) * t; _this1.wy = v1.wy + (v2.wy - v1.wy) * t; _this1.wz = v1.wz + (v2.wz - v1.wz) * t; } else if(s1 <= 0 && s2 > 0) { let t = s1 / (s1 - s2); let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x + (v2.x - v1.x) * t; _this.y = v1.y + (v2.y - v1.y) * t; _this.wx = v1.wx + (v2.wx - v1.wx) * t; _this.wy = v1.wy + (v2.wy - v1.wy) * t; _this.wz = v1.wz + (v2.wz - v1.wz) * t; } } let tmp2 = this.vertices; this.vertices = this.tmpVertices; this.tmpVertices = tmp2; this.numVertices = this.numTmpVertices; this.numTmpVertices = 0; let _g6 = 0; let _g7 = this.numVertices; while(_g6 < _g7) { let i = _g6++; let v1 = this.vertices[i]; let v2 = this.vertices[(i + 1) % this.numVertices]; let s1 = this.h - v1.y; let s2 = this.h - v2.y; if(s1 > 0 && s2 > 0) { let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x; _this.y = v1.y; _this.wx = v1.wx; _this.wy = v1.wy; _this.wz = v1.wz; } else if(s1 > 0 && s2 <= 0) { let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x; _this.y = v1.y; _this.wx = v1.wx; _this.wy = v1.wy; _this.wz = v1.wz; let t = s1 / (s1 - s2); let _this1 = this.tmpVertices[this.numTmpVertices++]; _this1.x = v1.x + (v2.x - v1.x) * t; _this1.y = v1.y + (v2.y - v1.y) * t; _this1.wx = v1.wx + (v2.wx - v1.wx) * t; _this1.wy = v1.wy + (v2.wy - v1.wy) * t; _this1.wz = v1.wz + (v2.wz - v1.wz) * t; } else if(s1 <= 0 && s2 > 0) { let t = s1 / (s1 - s2); let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = v1.x + (v2.x - v1.x) * t; _this.y = v1.y + (v2.y - v1.y) * t; _this.wx = v1.wx + (v2.wx - v1.wx) * t; _this.wy = v1.wy + (v2.wy - v1.wy) * t; _this.wz = v1.wz + (v2.wz - v1.wz) * t; } } let tmp3 = this.vertices; this.vertices = this.tmpVertices; this.tmpVertices = tmp3; this.numVertices = this.numTmpVertices; this.numTmpVertices = 0; } reduce() { if(this.numVertices < 4) { return; } let max1 = -1e65536; let min1 = 1e65536; let max2 = -1e65536; let min2 = 1e65536; let max1V = null; let min1V = null; let max2V = null; let min2V = null; let e1x = 1; let e1y = 1; let e2x = -1; let e2y = 1; let _g = 0; let _g1 = this.numVertices; while(_g < _g1) { let v = this.vertices[_g++]; let dot1 = v.x * e1x + v.y * e1y; let dot2 = v.x * e2x + v.y * e2y; if(dot1 > max1) { max1 = dot1; max1V = v; } if(dot1 < min1) { min1 = dot1; min1V = v; } if(dot2 > max2) { max2 = dot2; max2V = v; } if(dot2 < min2) { min2 = dot2; min2V = v; } } let _this = this.tmpVertices[this.numTmpVertices++]; _this.x = max1V.x; _this.y = max1V.y; _this.wx = max1V.wx; _this.wy = max1V.wy; _this.wz = max1V.wz; let _this1 = this.tmpVertices[this.numTmpVertices++]; _this1.x = max2V.x; _this1.y = max2V.y; _this1.wx = max2V.wx; _this1.wy = max2V.wy; _this1.wz = max2V.wz; let _this2 = this.tmpVertices[this.numTmpVertices++]; _this2.x = min1V.x; _this2.y = min1V.y; _this2.wx = min1V.wx; _this2.wy = min1V.wy; _this2.wz = min1V.wz; let _this3 = this.tmpVertices[this.numTmpVertices++]; _this3.x = min2V.x; _this3.y = min2V.y; _this3.wx = min2V.wx; _this3.wy = min2V.wy; _this3.wz = min2V.wz; let tmp = this.vertices; this.vertices = this.tmpVertices; this.tmpVertices = tmp; this.numVertices = this.numTmpVertices; this.numTmpVertices = 0; } } oimo.collision.narrowphase.detector.BoxBoxDetectorMacro = class oimo_collision_narrowphase_detector_BoxBoxDetectorMacro { } oimo.collision.narrowphase.detector.CachedDetectorData = class oimo_collision_narrowphase_detector_CachedDetectorData { constructor() { } _clear() { if(this._gjkCache != null) { this._gjkCache.clear(); } } } oimo.collision.narrowphase.detector.CapsuleCapsuleDetector = class oimo_collision_narrowphase_detector_CapsuleCapsuleDetector extends oimo.collision.narrowphase.detector.Detector { constructor() { super(false); } detectImpl(result,geom1,geom2,tf1,tf2,cachedData) { let c1 = geom1; let c2 = geom2; result.incremental = false; let axis1X; let axis1Y; let axis1Z; let axis2X; let axis2Y; let axis2Z; axis1X = tf1._rotation01; axis1Y = tf1._rotation11; axis1Z = tf1._rotation21; axis2X = tf2._rotation01; axis2Y = tf2._rotation11; axis2Z = tf2._rotation21; let hh1 = c1._halfHeight; let hh2 = c2._halfHeight; let r1 = c1._radius; let r2 = c2._radius; let p1X; let p1Y; let p1Z; let q1X; let q1Y; let q1Z; let p2X; let p2Y; let p2Z; let q2X; let q2Y; let q2Z; p1X = tf1._positionX + axis1X * -hh1; p1Y = tf1._positionY + axis1Y * -hh1; p1Z = tf1._positionZ + axis1Z * -hh1; q1X = tf1._positionX + axis1X * hh1; q1Y = tf1._positionY + axis1Y * hh1; q1Z = tf1._positionZ + axis1Z * hh1; p2X = tf2._positionX + axis2X * -hh2; p2Y = tf2._positionY + axis2Y * -hh2; p2Z = tf2._positionZ + axis2Z * -hh2; q2X = tf2._positionX + axis2X * hh2; q2Y = tf2._positionY + axis2Y * hh2; q2Z = tf2._positionZ + axis2Z * hh2; let p12X; let p12Y; let p12Z; p12X = p1X - p2X; p12Y = p1Y - p2Y; p12Z = p1Z - p2Z; let d1X; let d1Y; let d1Z; let d2X; let d2Y; let d2Z; d1X = q1X - p1X; d1Y = q1Y - p1Y; d1Z = q1Z - p1Z; d2X = q2X - p2X; d2Y = q2Y - p2Y; d2Z = q2Z - p2Z; let p21d1 = -(p12X * d1X + p12Y * d1Y + p12Z * d1Z); let p12d2 = p12X * d2X + p12Y * d2Y + p12Z * d2Z; let d11 = hh1 * hh1 * 4; let d12 = d1X * d2X + d1Y * d2Y + d1Z * d2Z; let d22 = hh2 * hh2 * 4; let t1; let t2; if(d11 == 0 && d22 == 0) { t1 = 0; t2 = 0; } else if(d11 == 0) { t1 = 0; if(p12d2 < 0) { t2 = 0; } else if(p12d2 > d22) { t2 = 1; } else { t2 = p12d2 / d22; } } else if(d22 == 0) { t2 = 0; if(p21d1 < 0) { t1 = 0; } else if(p21d1 > d11) { t1 = 1; } else { t1 = p21d1 / d11; } } else { let det = d11 * d22 - d12 * d12; if(det == 0) { t1 = 0; } else { t1 = d12 * p12d2 + d22 * p21d1; if(t1 < 0) { t1 = 0; } else if(t1 > det) { t1 = 1; } else { t1 /= det; } } t2 = t1 * d12 + p12d2; if(t2 < 0) { t2 = 0; if(p21d1 < 0) { t1 = 0; } else if(p21d1 > d11) { t1 = 1; } else { t1 = p21d1 / d11; } } else if(t2 > d22) { t2 = 1; t1 = d12 + p21d1; if(t1 < 0) { t1 = 0; } else if(t1 > d11) { t1 = 1; } else { t1 /= d11; } } else { t2 /= d22; } } let cp1X; let cp1Y; let cp1Z; let cp2X; let cp2Y; let cp2Z; cp1X = p1X + d1X * t1; cp1Y = p1Y + d1Y * t1; cp1Z = p1Z + d1Z * t1; cp2X = p2X + d2X * t2; cp2Y = p2Y + d2Y * t2; cp2Z = p2Z + d2Z * t2; let dX; let dY; let dZ; dX = cp1X - cp2X; dY = cp1Y - cp2Y; dZ = cp1Z - cp2Z; let len2 = dX * dX + dY * dY + dZ * dZ; if(len2 >= (r1 + r2) * (r1 + r2)) { return; } let len = Math.sqrt(len2); let nX; let nY; let nZ; if(len > 0) { nX = dX * (1 / len); nY = dY * (1 / len); nZ = dZ * (1 / len); } else { nX = 1; nY = 0; nZ = 0; } this.setNormal(result,nX,nY,nZ); let pos1X; let pos1Y; let pos1Z; let pos2X; let pos2Y; let pos2Z; pos1X = cp1X + nX * -r1; pos1Y = cp1Y + nY * -r1; pos1Z = cp1Z + nZ * -r1; pos2X = cp2X + nX * r2; pos2Y = cp2Y + nY * r2; pos2Z = cp2Z + nZ * r2; this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,r1 + r2 - len,0); } } oimo.collision.narrowphase.detector.GjkEpaDetector = class oimo_collision_narrowphase_detector_GjkEpaDetector extends oimo.collision.narrowphase.detector.Detector { constructor() { super(false); } detectImpl(result,geom1,geom2,tf1,tf2,cachedData) { let gjkEpa = oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance; let g1 = geom1; let g2 = geom2; let status = gjkEpa.computeClosestPointsImpl(g1,g2,tf1,tf2,oimo.common.Setting.enableGJKCaching ? cachedData : null,true); result.incremental = true; if(status != oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.SUCCEEDED) { console.log("src/oimo/collision/narrowphase/detector/GjkEpaDetector.hx:28:","GJK/EPA failed: status=" + status); return; } if(gjkEpa.distance > g1._gjkMargin + g2._gjkMargin) { return; } let pos1X; let pos1Y; let pos1Z; let pos2X; let pos2Y; let pos2Z; let v = gjkEpa.closestPoint1; pos1X = v.x; pos1Y = v.y; pos1Z = v.z; let v1 = gjkEpa.closestPoint2; pos2X = v1.x; pos2Y = v1.y; pos2Z = v1.z; let normalX; let normalY; let normalZ; normalX = pos1X - pos2X; normalY = pos1Y - pos2Y; normalZ = pos1Z - pos2Z; if(normalX * normalX + normalY * normalY + normalZ * normalZ == 0) { return; } if(gjkEpa.distance < 0) { normalX = -normalX; normalY = -normalY; normalZ = -normalZ; } let l = normalX * normalX + normalY * normalY + normalZ * normalZ; if(l > 0) { l = 1 / Math.sqrt(l); } normalX *= l; normalY *= l; normalZ *= l; this.setNormal(result,normalX,normalY,normalZ); pos1X += normalX * -g1._gjkMargin; pos1Y += normalY * -g1._gjkMargin; pos1Z += normalZ * -g1._gjkMargin; pos2X += normalX * g2._gjkMargin; pos2Y += normalY * g2._gjkMargin; pos2Z += normalZ * g2._gjkMargin; this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,g1._gjkMargin + g2._gjkMargin - gjkEpa.distance,0); } } oimo.collision.narrowphase.detector.SphereBoxDetector = class oimo_collision_narrowphase_detector_SphereBoxDetector extends oimo.collision.narrowphase.detector.Detector { constructor(swapped) { super(swapped); } detectImpl(result,geom1,geom2,tf1,tf2,cachedData) { let b = geom2; result.incremental = false; let halfExtX; let halfExtY; let halfExtZ; let negHalfExtX; let negHalfExtY; let negHalfExtZ; halfExtX = b._halfExtentsX; halfExtY = b._halfExtentsY; halfExtZ = b._halfExtentsZ; negHalfExtX = -halfExtX; negHalfExtY = -halfExtY; negHalfExtZ = -halfExtZ; let r = geom1._radius; let boxToSphereX; let boxToSphereY; let boxToSphereZ; boxToSphereX = tf1._positionX - tf2._positionX; boxToSphereY = tf1._positionY - tf2._positionY; boxToSphereZ = tf1._positionZ - tf2._positionZ; let boxToSphereInBoxX; let boxToSphereInBoxY; let boxToSphereInBoxZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf2._rotation00 * boxToSphereX + tf2._rotation10 * boxToSphereY + tf2._rotation20 * boxToSphereZ; __tmp__Y = tf2._rotation01 * boxToSphereX + tf2._rotation11 * boxToSphereY + tf2._rotation21 * boxToSphereZ; __tmp__Z = tf2._rotation02 * boxToSphereX + tf2._rotation12 * boxToSphereY + tf2._rotation22 * boxToSphereZ; boxToSphereInBoxX = __tmp__X; boxToSphereInBoxY = __tmp__Y; boxToSphereInBoxZ = __tmp__Z; if(negHalfExtX < boxToSphereInBoxX && halfExtX > boxToSphereInBoxX && negHalfExtY < boxToSphereInBoxY && halfExtY > boxToSphereInBoxY && negHalfExtZ < boxToSphereInBoxZ && halfExtZ > boxToSphereInBoxZ) { let sphereToBoxSurfaceX; let sphereToBoxSurfaceY; let sphereToBoxSurfaceZ; sphereToBoxSurfaceX = boxToSphereInBoxX < 0 ? -boxToSphereInBoxX : boxToSphereInBoxX; sphereToBoxSurfaceY = boxToSphereInBoxY < 0 ? -boxToSphereInBoxY : boxToSphereInBoxY; sphereToBoxSurfaceZ = boxToSphereInBoxZ < 0 ? -boxToSphereInBoxZ : boxToSphereInBoxZ; sphereToBoxSurfaceX = halfExtX - sphereToBoxSurfaceX; sphereToBoxSurfaceY = halfExtY - sphereToBoxSurfaceY; sphereToBoxSurfaceZ = halfExtZ - sphereToBoxSurfaceZ; let normalInBoxX; let normalInBoxY; let normalInBoxZ; let distX = sphereToBoxSurfaceX; let distY = sphereToBoxSurfaceY; let distZ = sphereToBoxSurfaceZ; let depth; let projectionMaskX; let projectionMaskY; let projectionMaskZ; if(distX < distY) { if(distX < distZ) { if(boxToSphereInBoxX > 0) { normalInBoxX = 1; normalInBoxY = 0; normalInBoxZ = 0; } else { normalInBoxX = -1; normalInBoxY = 0; normalInBoxZ = 0; } projectionMaskX = 0; projectionMaskY = 1; projectionMaskZ = 1; depth = distX; } else { if(boxToSphereInBoxZ > 0) { normalInBoxX = 0; normalInBoxY = 0; normalInBoxZ = 1; } else { normalInBoxX = 0; normalInBoxY = 0; normalInBoxZ = -1; } projectionMaskX = 1; projectionMaskY = 1; projectionMaskZ = 0; depth = distZ; } } else if(distY < distZ) { if(boxToSphereInBoxY > 0) { normalInBoxX = 0; normalInBoxY = 1; normalInBoxZ = 0; } else { normalInBoxX = 0; normalInBoxY = -1; normalInBoxZ = 0; } projectionMaskX = 1; projectionMaskY = 0; projectionMaskZ = 1; depth = distY; } else { if(boxToSphereInBoxZ > 0) { normalInBoxX = 0; normalInBoxY = 0; normalInBoxZ = 1; } else { normalInBoxX = 0; normalInBoxY = 0; normalInBoxZ = -1; } projectionMaskX = 1; projectionMaskY = 1; projectionMaskZ = 0; depth = distZ; } let baseX; let baseY; let baseZ; baseX = projectionMaskX * boxToSphereInBoxX; baseY = projectionMaskY * boxToSphereInBoxY; baseZ = projectionMaskZ * boxToSphereInBoxZ; let boxToClosestPointInBoxX; let boxToClosestPointInBoxY; let boxToClosestPointInBoxZ; boxToClosestPointInBoxX = normalInBoxX * halfExtX; boxToClosestPointInBoxY = normalInBoxY * halfExtY; boxToClosestPointInBoxZ = normalInBoxZ * halfExtZ; boxToClosestPointInBoxX += baseX; boxToClosestPointInBoxY += baseY; boxToClosestPointInBoxZ += baseZ; let boxToClosestPointX; let boxToClosestPointY; let boxToClosestPointZ; let normalX; let normalY; let normalZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf2._rotation00 * boxToClosestPointInBoxX + tf2._rotation01 * boxToClosestPointInBoxY + tf2._rotation02 * boxToClosestPointInBoxZ; __tmp__Y = tf2._rotation10 * boxToClosestPointInBoxX + tf2._rotation11 * boxToClosestPointInBoxY + tf2._rotation12 * boxToClosestPointInBoxZ; __tmp__Z = tf2._rotation20 * boxToClosestPointInBoxX + tf2._rotation21 * boxToClosestPointInBoxY + tf2._rotation22 * boxToClosestPointInBoxZ; boxToClosestPointX = __tmp__X; boxToClosestPointY = __tmp__Y; boxToClosestPointZ = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * normalInBoxX + tf2._rotation01 * normalInBoxY + tf2._rotation02 * normalInBoxZ; __tmp__Y1 = tf2._rotation10 * normalInBoxX + tf2._rotation11 * normalInBoxY + tf2._rotation12 * normalInBoxZ; __tmp__Z1 = tf2._rotation20 * normalInBoxX + tf2._rotation21 * normalInBoxY + tf2._rotation22 * normalInBoxZ; normalX = __tmp__X1; normalY = __tmp__Y1; normalZ = __tmp__Z1; this.setNormal(result,normalX,normalY,normalZ); let pos1X; let pos1Y; let pos1Z; let pos2X; let pos2Y; let pos2Z; pos1X = tf1._positionX + normalX * -r; pos1Y = tf1._positionY + normalY * -r; pos1Z = tf1._positionZ + normalZ * -r; pos2X = tf2._positionX + boxToClosestPointX; pos2Y = tf2._positionY + boxToClosestPointY; pos2Z = tf2._positionZ + boxToClosestPointZ; this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,depth,0); return; } let boxToClosestPointInBoxX; let boxToClosestPointInBoxY; let boxToClosestPointInBoxZ; halfExtX -= 1e-9; halfExtY -= 1e-9; halfExtZ -= 1e-9; negHalfExtX += 1e-9; negHalfExtY += 1e-9; negHalfExtZ += 1e-9; boxToClosestPointInBoxX = boxToSphereInBoxX < halfExtX ? boxToSphereInBoxX : halfExtX; boxToClosestPointInBoxY = boxToSphereInBoxY < halfExtY ? boxToSphereInBoxY : halfExtY; boxToClosestPointInBoxZ = boxToSphereInBoxZ < halfExtZ ? boxToSphereInBoxZ : halfExtZ; if(!(boxToClosestPointInBoxX > negHalfExtX)) { boxToClosestPointInBoxX = negHalfExtX; } if(!(boxToClosestPointInBoxY > negHalfExtY)) { boxToClosestPointInBoxY = negHalfExtY; } if(!(boxToClosestPointInBoxZ > negHalfExtZ)) { boxToClosestPointInBoxZ = negHalfExtZ; } let closestPointToSphereInBoxX; let closestPointToSphereInBoxY; let closestPointToSphereInBoxZ; closestPointToSphereInBoxX = boxToSphereInBoxX - boxToClosestPointInBoxX; closestPointToSphereInBoxY = boxToSphereInBoxY - boxToClosestPointInBoxY; closestPointToSphereInBoxZ = boxToSphereInBoxZ - boxToClosestPointInBoxZ; let dist = closestPointToSphereInBoxX * closestPointToSphereInBoxX + closestPointToSphereInBoxY * closestPointToSphereInBoxY + closestPointToSphereInBoxZ * closestPointToSphereInBoxZ; if(dist >= r * r) { return; } dist = Math.sqrt(dist); let boxToClosestPointX; let boxToClosestPointY; let boxToClosestPointZ; let closestPointToSphereX; let closestPointToSphereY; let closestPointToSphereZ; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * boxToClosestPointInBoxX + tf2._rotation01 * boxToClosestPointInBoxY + tf2._rotation02 * boxToClosestPointInBoxZ; __tmp__Y1 = tf2._rotation10 * boxToClosestPointInBoxX + tf2._rotation11 * boxToClosestPointInBoxY + tf2._rotation12 * boxToClosestPointInBoxZ; __tmp__Z1 = tf2._rotation20 * boxToClosestPointInBoxX + tf2._rotation21 * boxToClosestPointInBoxY + tf2._rotation22 * boxToClosestPointInBoxZ; boxToClosestPointX = __tmp__X1; boxToClosestPointY = __tmp__Y1; boxToClosestPointZ = __tmp__Z1; let __tmp__X2; let __tmp__Y2; let __tmp__Z2; __tmp__X2 = tf2._rotation00 * closestPointToSphereInBoxX + tf2._rotation01 * closestPointToSphereInBoxY + tf2._rotation02 * closestPointToSphereInBoxZ; __tmp__Y2 = tf2._rotation10 * closestPointToSphereInBoxX + tf2._rotation11 * closestPointToSphereInBoxY + tf2._rotation12 * closestPointToSphereInBoxZ; __tmp__Z2 = tf2._rotation20 * closestPointToSphereInBoxX + tf2._rotation21 * closestPointToSphereInBoxY + tf2._rotation22 * closestPointToSphereInBoxZ; closestPointToSphereX = __tmp__X2; closestPointToSphereY = __tmp__Y2; closestPointToSphereZ = __tmp__Z2; let normalX; let normalY; let normalZ; let l = closestPointToSphereX * closestPointToSphereX + closestPointToSphereY * closestPointToSphereY + closestPointToSphereZ * closestPointToSphereZ; if(l > 0) { l = 1 / Math.sqrt(l); } normalX = closestPointToSphereX * l; normalY = closestPointToSphereY * l; normalZ = closestPointToSphereZ * l; this.setNormal(result,normalX,normalY,normalZ); let pos1X; let pos1Y; let pos1Z; let pos2X; let pos2Y; let pos2Z; pos1X = tf1._positionX + normalX * -r; pos1Y = tf1._positionY + normalY * -r; pos1Z = tf1._positionZ + normalZ * -r; pos2X = tf2._positionX + boxToClosestPointX; pos2Y = tf2._positionY + boxToClosestPointY; pos2Z = tf2._positionZ + boxToClosestPointZ; this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,r - dist,0); } } oimo.collision.narrowphase.detector.SphereCapsuleDetector = class oimo_collision_narrowphase_detector_SphereCapsuleDetector extends oimo.collision.narrowphase.detector.Detector { constructor(swapped) { super(swapped); } detectImpl(result,geom1,geom2,tf1,tf2,cachedData) { let c2 = geom2; result.incremental = false; let hh2 = c2._halfHeight; let r1 = geom1._radius; let r2 = c2._radius; let axis2X; let axis2Y; let axis2Z; axis2X = tf2._rotation01; axis2Y = tf2._rotation11; axis2Z = tf2._rotation21; let cp1X; let cp1Y; let cp1Z; cp1X = tf1._positionX; cp1Y = tf1._positionY; cp1Z = tf1._positionZ; let p2X; let p2Y; let p2Z; let q2X; let q2Y; let q2Z; p2X = tf2._positionX + axis2X * -hh2; p2Y = tf2._positionY + axis2Y * -hh2; p2Z = tf2._positionZ + axis2Z * -hh2; q2X = tf2._positionX + axis2X * hh2; q2Y = tf2._positionY + axis2Y * hh2; q2Z = tf2._positionZ + axis2Z * hh2; let p12X; let p12Y; let p12Z; p12X = cp1X - p2X; p12Y = cp1Y - p2Y; p12Z = cp1Z - p2Z; let d2X; let d2Y; let d2Z; d2X = q2X - p2X; d2Y = q2Y - p2Y; d2Z = q2Z - p2Z; let d22 = hh2 * hh2 * 4; let t = p12X * d2X + p12Y * d2Y + p12Z * d2Z; if(t < 0) { t = 0; } else if(t > d22) { t = 1; } else { t /= d22; } let cp2X; let cp2Y; let cp2Z; cp2X = p2X + d2X * t; cp2Y = p2Y + d2Y * t; cp2Z = p2Z + d2Z * t; let dX; let dY; let dZ; dX = cp1X - cp2X; dY = cp1Y - cp2Y; dZ = cp1Z - cp2Z; let len2 = dX * dX + dY * dY + dZ * dZ; if(len2 >= (r1 + r2) * (r1 + r2)) { return; } let len = Math.sqrt(len2); let nX; let nY; let nZ; if(len > 0) { nX = dX * (1 / len); nY = dY * (1 / len); nZ = dZ * (1 / len); } else { nX = 1; nY = 0; nZ = 0; } this.setNormal(result,nX,nY,nZ); let pos1X; let pos1Y; let pos1Z; let pos2X; let pos2Y; let pos2Z; pos1X = cp1X + nX * -r1; pos1Y = cp1Y + nY * -r1; pos1Z = cp1Z + nZ * -r1; pos2X = cp2X + nX * r2; pos2Y = cp2Y + nY * r2; pos2Z = cp2Z + nZ * r2; this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,r1 + r2 - len,0); } } oimo.collision.narrowphase.detector.SphereSphereDetector = class oimo_collision_narrowphase_detector_SphereSphereDetector extends oimo.collision.narrowphase.detector.Detector { constructor() { super(false); } detectImpl(result,geom1,geom2,tf1,tf2,cachedData) { result.incremental = false; let dX; let dY; let dZ; dX = tf1._positionX - tf2._positionX; dY = tf1._positionY - tf2._positionY; dZ = tf1._positionZ - tf2._positionZ; let r1 = geom1._radius; let r2 = geom2._radius; let len2 = dX * dX + dY * dY + dZ * dZ; if(len2 >= (r1 + r2) * (r1 + r2)) { return; } let len = Math.sqrt(len2); let nX; let nY; let nZ; if(len > 0) { nX = dX * (1 / len); nY = dY * (1 / len); nZ = dZ * (1 / len); } else { nX = 1; nY = 0; nZ = 0; } this.setNormal(result,nX,nY,nZ); let pos1X; let pos1Y; let pos1Z; let pos2X; let pos2Y; let pos2Z; pos1X = tf1._positionX + nX * -r1; pos1Y = tf1._positionY + nY * -r1; pos1Z = tf1._positionZ + nZ * -r1; pos2X = tf2._positionX + nX * r2; pos2Y = tf2._positionY + nY * r2; pos2Z = tf2._positionZ + nZ * r2; this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,r1 + r2 - len,0); } } if(!oimo.collision.narrowphase.detector.gjkepa) oimo.collision.narrowphase.detector.gjkepa = {}; oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedron = class oimo_collision_narrowphase_detector_gjkepa_EpaPolyhedron { constructor() { this._vertices = new Array(oimo.common.Setting.maxEPAVertices); this._center = new oimo.common.Vec3(); this._numVertices = 0; this._triangleList = null; this._triangleListLast = null; this._numTriangles = 0; this._trianglePool = null; this._vertexPool = null; } dumpHoleEdge(first) { } validate() { let t = this._triangleList; while(t != null) { t._vertices[0]._tmpEdgeLoopOuterTriangle = null; t._vertices[0]._tmpEdgeLoopNext = null; if(t._adjacentPairIndex[0] == -1) { this._status = 2; return false; } if(t._adjacentTriangles[0] == null) { this._status = 3; return false; } t._vertices[1]._tmpEdgeLoopOuterTriangle = null; t._vertices[1]._tmpEdgeLoopNext = null; if(t._adjacentPairIndex[1] == -1) { this._status = 2; return false; } if(t._adjacentTriangles[1] == null) { this._status = 3; return false; } t._vertices[2]._tmpEdgeLoopOuterTriangle = null; t._vertices[2]._tmpEdgeLoopNext = null; if(t._adjacentPairIndex[2] == -1) { this._status = 2; return false; } if(t._adjacentTriangles[2] == null) { this._status = 3; return false; } t = t._next; } return true; } findEdgeLoop(id,base,from) { if(base._tmpDfsId == id) { return; } base._tmpDfsId = id; let _this = base.tmp; _this.x = from.x; _this.y = from.y; _this.z = from.z; let v = base._vertices[0].v; _this.x -= v.x; _this.y -= v.y; _this.z -= v.z; let _this1 = base.tmp; let v1 = base._normal; base._tmpDfsVisible = _this1.x * v1.x + _this1.y * v1.y + _this1.z * v1.z > 0; if(!base._tmpDfsVisible) { this._status = 6; return; } let _g = 0; while(_g < 3) { let i = _g++; let t = base._adjacentTriangles[i]; if(t == null) { continue; } let _this = t.tmp; _this.x = from.x; _this.y = from.y; _this.z = from.z; let v = t._vertices[0].v; _this.x -= v.x; _this.y -= v.y; _this.z -= v.z; let _this1 = t.tmp; let v1 = t._normal; t._tmpDfsVisible = _this1.x * v1.x + _this1.y * v1.y + _this1.z * v1.z > 0; if(t._tmpDfsVisible) { this.findEdgeLoop(id,t,from); } else { let v1 = base._vertices[i]; v1._tmpEdgeLoopNext = base._vertices[base._nextIndex[i]]; v1._tmpEdgeLoopOuterTriangle = t; } } let triangle = base._adjacentTriangles[0]; if(triangle != null) { let pairIndex = base._adjacentPairIndex[0]; triangle._adjacentTriangles[pairIndex] = null; triangle._adjacentPairIndex[pairIndex] = -1; base._adjacentTriangles[0] = null; base._adjacentPairIndex[0] = -1; } let triangle1 = base._adjacentTriangles[1]; if(triangle1 != null) { let pairIndex = base._adjacentPairIndex[1]; triangle1._adjacentTriangles[pairIndex] = null; triangle1._adjacentPairIndex[pairIndex] = -1; base._adjacentTriangles[1] = null; base._adjacentPairIndex[1] = -1; } let triangle2 = base._adjacentTriangles[2]; if(triangle2 != null) { let pairIndex = base._adjacentPairIndex[2]; triangle2._adjacentTriangles[pairIndex] = null; triangle2._adjacentPairIndex[pairIndex] = -1; base._adjacentTriangles[2] = null; base._adjacentPairIndex[2] = -1; } this._numTriangles--; let prev = base._prev; let next = base._next; if(prev != null) { prev._next = next; } if(next != null) { next._prev = prev; } if(base == this._triangleList) { this._triangleList = this._triangleList._next; } if(base == this._triangleListLast) { this._triangleListLast = this._triangleListLast._prev; } base._next = null; base._prev = null; base.removeReferences(); base._next = this._trianglePool; this._trianglePool = base; } _init(v1,v2,v3,v4) { this._status = 0; this._numVertices = 4; this._vertices[0] = v1; this._vertices[1] = v2; this._vertices[2] = v3; this._vertices[3] = v4; let _this = this._center; let v = v1.v; _this.x = v.x; _this.y = v.y; _this.z = v.z; let v5 = v2.v; _this.x += v5.x; _this.y += v5.y; _this.z += v5.z; let v6 = v3.v; _this.x += v6.x; _this.y += v6.y; _this.z += v6.z; let v7 = v4.v; _this.x += v7.x; _this.y += v7.y; _this.z += v7.z; _this.x *= 0.25; _this.y *= 0.25; _this.z *= 0.25; let first = this._trianglePool; if(first != null) { this._trianglePool = first._next; first._next = null; } else { first = new oimo.collision.narrowphase.detector.gjkepa.EpaTriangle(); } let t1 = first; let first1 = this._trianglePool; if(first1 != null) { this._trianglePool = first1._next; first1._next = null; } else { first1 = new oimo.collision.narrowphase.detector.gjkepa.EpaTriangle(); } let t2 = first1; let first2 = this._trianglePool; if(first2 != null) { this._trianglePool = first2._next; first2._next = null; } else { first2 = new oimo.collision.narrowphase.detector.gjkepa.EpaTriangle(); } let t3 = first2; let first3 = this._trianglePool; if(first3 != null) { this._trianglePool = first3._next; first3._next = null; } else { first3 = new oimo.collision.narrowphase.detector.gjkepa.EpaTriangle(); } let t4 = first3; if(!t1.init(v1,v2,v3,this._center,true)) { this._status = 1; } if(!t2.init(v1,v2,v4,this._center,true)) { this._status = 1; } if(!t3.init(v1,v3,v4,this._center,true)) { this._status = 1; } if(!t4.init(v2,v3,v4,this._center,true)) { this._status = 1; } if(!t1.setAdjacentTriangle(t2)) { this._status = 1; } if(!t1.setAdjacentTriangle(t3)) { this._status = 1; } if(!t1.setAdjacentTriangle(t4)) { this._status = 1; } if(!t2.setAdjacentTriangle(t3)) { this._status = 1; } if(!t2.setAdjacentTriangle(t4)) { this._status = 1; } if(!t3.setAdjacentTriangle(t4)) { this._status = 1; } this._numTriangles++; if(this._triangleList == null) { this._triangleList = t1; this._triangleListLast = t1; } else { this._triangleListLast._next = t1; t1._prev = this._triangleListLast; this._triangleListLast = t1; } this._numTriangles++; if(this._triangleList == null) { this._triangleList = t2; this._triangleListLast = t2; } else { this._triangleListLast._next = t2; t2._prev = this._triangleListLast; this._triangleListLast = t2; } this._numTriangles++; if(this._triangleList == null) { this._triangleList = t3; this._triangleListLast = t3; } else { this._triangleListLast._next = t3; t3._prev = this._triangleListLast; this._triangleListLast = t3; } this._numTriangles++; if(this._triangleList == null) { this._triangleList = t4; this._triangleListLast = t4; } else { this._triangleListLast._next = t4; t4._prev = this._triangleListLast; this._triangleListLast = t4; } return this._status == 0; } _addVertex(vertex,base) { this._vertices[this._numVertices++] = vertex; let v1 = base._vertices[0]; this.findEdgeLoop(this._numVertices,base,vertex.v); if(this._status != 0) { return false; } let v = v1; let prevT = null; let firstT = null; while(true) { if(v._tmpEdgeLoopNext == null) { this._dumpAsObjModel(); this._status = 4; return false; } if(v._tmpEdgeLoopOuterTriangle == null) { this._status = 5; return false; } let first = this._trianglePool; if(first != null) { this._trianglePool = first._next; first._next = null; } else { first = new oimo.collision.narrowphase.detector.gjkepa.EpaTriangle(); } let t = first; if(firstT == null) { firstT = t; } if(!t.init(v,v._tmpEdgeLoopNext,vertex,this._center,false)) { this._status = 1; } if(this._status != 0) { return false; } this._numTriangles++; if(this._triangleList == null) { this._triangleList = t; this._triangleListLast = t; } else { this._triangleListLast._next = t; t._prev = this._triangleListLast; this._triangleListLast = t; } if(!t.setAdjacentTriangle(v._tmpEdgeLoopOuterTriangle)) { this._status = 1; } if(prevT != null) { if(!t.setAdjacentTriangle(prevT)) { this._status = 1; } } prevT = t; v = v._tmpEdgeLoopNext; if(!(v != v1)) { break; } } if(!prevT.setAdjacentTriangle(firstT)) { this._status = 1; } if(this._status == 0) { return this.validate(); } else { return false; } } _dumpAsObjModel() { } } oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState = class oimo_collision_narrowphase_detector_gjkepa_EpaPolyhedronState { } oimo.collision.narrowphase.detector.gjkepa.EpaTriangle = class oimo_collision_narrowphase_detector_gjkepa_EpaTriangle { constructor() { this.id = ++oimo.collision.narrowphase.detector.gjkepa.EpaTriangle.count; this._next = null; this._prev = null; this._normal = new oimo.common.Vec3(); this._distanceSq = 0; this._tmpDfsId = 0; this._tmpDfsVisible = false; this._vertices = new Array(3); this._adjacentTriangles = new Array(3); this._adjacentPairIndex = new Array(3); this.tmp = new oimo.common.Vec3(); this._nextIndex = new Array(3); this._nextIndex[0] = 1; this._nextIndex[1] = 2; this._nextIndex[2] = 0; } init(vertex1,vertex2,vertex3,center,autoCheck) { if(autoCheck == null) { autoCheck = false; } let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let vcX; let vcY; let vcZ; let v = vertex1.v; v1X = v.x; v1Y = v.y; v1Z = v.z; let v1 = vertex2.v; v2X = v1.x; v2Y = v1.y; v2Z = v1.z; let v2 = vertex3.v; v3X = v2.x; v3Y = v2.y; v3Z = v2.z; vcX = center.x; vcY = center.y; vcZ = center.z; let v12X; let v12Y; let v12Z; let v13X; let v13Y; let v13Z; let vc1X; let vc1Y; let vc1Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v13X = v3X - v1X; v13Y = v3Y - v1Y; v13Z = v3Z - v1Z; vc1X = v1X - vcX; vc1Y = v1Y - vcY; vc1Z = v1Z - vcZ; let inorX; let inorY; let inorZ; inorX = v12Y * v13Z - v12Z * v13Y; inorY = v12Z * v13X - v12X * v13Z; inorZ = v12X * v13Y - v12Y * v13X; let inverted = false; if(vc1X * inorX + vc1Y * inorY + vc1Z * inorZ < 0) { if(autoCheck) { let tmp = vertex2; vertex2 = vertex3; vertex3 = tmp; inorX *= -1; inorY *= -1; inorZ *= -1; } else { inverted = true; } } this._vertices[0] = vertex1; this._vertices[1] = vertex2; this._vertices[2] = vertex3; let v3 = this._normal; v3.x = inorX; v3.y = inorY; v3.z = inorZ; let vec1 = vertex1.v; let vec2 = vertex2.v; let vec3 = vertex3.v; let out = this.tmp; let v1X1; let v1Y1; let v1Z1; let v2X1; let v2Y1; let v2Z1; let v3X1; let v3Y1; let v3Z1; let v12X1; let v12Y1; let v12Z1; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X1 = vec1.x; v1Y1 = vec1.y; v1Z1 = vec1.z; v2X1 = vec2.x; v2Y1 = vec2.y; v2Z1 = vec2.z; v3X1 = vec3.x; v3Y1 = vec3.y; v3Z1 = vec3.z; v12X1 = v2X1 - v1X1; v12Y1 = v2Y1 - v1Y1; v12Z1 = v2Z1 - v1Z1; v23X = v3X1 - v2X1; v23Y = v3Y1 - v2Y1; v23Z = v3Z1 - v2Z1; v31X = v1X1 - v3X1; v31Y = v1Y1 - v3Y1; v31Z = v1Z1 - v3Z1; let nX; let nY; let nZ; nX = v12Y1 * v23Z - v12Z1 * v23Y; nY = v12Z1 * v23X - v12X1 * v23Z; nZ = v12X1 * v23Y - v12Y1 * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y1 * nZ - v12Z1 * nY; n12Y = v12Z1 * nX - v12X1 * nZ; n12Z = v12X1 * nY - v12Y1 * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; minvX = 0; minvY = 0; minvZ = 0; if(v1X1 * n12X + v1Y1 * n12Y + v1Z1 * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; } mind = out.x * out.x + out.y * out.y + out.z * out.z; minvX = out.x; minvY = out.y; minvZ = out.z; } if(v2X1 * n23X + v2Y1 * n23Y + v2Z1 * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec2.x; v1Y = vec2.y; v1Z = vec2.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind < 0 || d < mind) { mind = d; minvX = out.x; minvY = out.y; minvZ = out.z; } } if(v3X1 * n31X + v3Y1 * n31Y + v3Z1 * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind < 0 || d < mind) { mind = d; minvX = out.x; minvY = out.y; minvZ = out.z; } } if(mind > 0) { out.x = minvX; out.y = minvY; out.z = minvZ; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X1 * nX + v1Y1 * nY + v1Z1 * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; out.x = minvX; out.y = minvY; out.z = minvZ; } let _this = this.tmp; this._distanceSq = _this.x * _this.x + _this.y * _this.y + _this.z * _this.z; this._adjacentTriangles[0] = null; this._adjacentTriangles[1] = null; this._adjacentTriangles[2] = null; this._adjacentPairIndex[0] = -1; this._adjacentPairIndex[1] = -1; this._adjacentPairIndex[2] = -1; return !inverted; } setAdjacentTriangle(triangle) { let count = 0; if(this._vertices[0] == triangle._vertices[this._nextIndex[0]] && this._vertices[this._nextIndex[0]] == triangle._vertices[0]) { this._adjacentTriangles[0] = triangle; this._adjacentPairIndex[0] = 0; triangle._adjacentTriangles[0] = this; triangle._adjacentPairIndex[0] = 0; count = 1; } if(this._vertices[0] == triangle._vertices[this._nextIndex[1]] && this._vertices[this._nextIndex[0]] == triangle._vertices[1]) { this._adjacentTriangles[0] = triangle; this._adjacentPairIndex[0] = 1; triangle._adjacentTriangles[1] = this; triangle._adjacentPairIndex[1] = 0; ++count; } if(this._vertices[0] == triangle._vertices[this._nextIndex[2]] && this._vertices[this._nextIndex[0]] == triangle._vertices[2]) { this._adjacentTriangles[0] = triangle; this._adjacentPairIndex[0] = 2; triangle._adjacentTriangles[2] = this; triangle._adjacentPairIndex[2] = 0; ++count; } if(this._vertices[1] == triangle._vertices[this._nextIndex[0]] && this._vertices[this._nextIndex[1]] == triangle._vertices[0]) { this._adjacentTriangles[1] = triangle; this._adjacentPairIndex[1] = 0; triangle._adjacentTriangles[0] = this; triangle._adjacentPairIndex[0] = 1; ++count; } if(this._vertices[1] == triangle._vertices[this._nextIndex[1]] && this._vertices[this._nextIndex[1]] == triangle._vertices[1]) { this._adjacentTriangles[1] = triangle; this._adjacentPairIndex[1] = 1; triangle._adjacentTriangles[1] = this; triangle._adjacentPairIndex[1] = 1; ++count; } if(this._vertices[1] == triangle._vertices[this._nextIndex[2]] && this._vertices[this._nextIndex[1]] == triangle._vertices[2]) { this._adjacentTriangles[1] = triangle; this._adjacentPairIndex[1] = 2; triangle._adjacentTriangles[2] = this; triangle._adjacentPairIndex[2] = 1; ++count; } if(this._vertices[2] == triangle._vertices[this._nextIndex[0]] && this._vertices[this._nextIndex[2]] == triangle._vertices[0]) { this._adjacentTriangles[2] = triangle; this._adjacentPairIndex[2] = 0; triangle._adjacentTriangles[0] = this; triangle._adjacentPairIndex[0] = 2; ++count; } if(this._vertices[2] == triangle._vertices[this._nextIndex[1]] && this._vertices[this._nextIndex[2]] == triangle._vertices[1]) { this._adjacentTriangles[2] = triangle; this._adjacentPairIndex[2] = 1; triangle._adjacentTriangles[1] = this; triangle._adjacentPairIndex[1] = 2; ++count; } if(this._vertices[2] == triangle._vertices[this._nextIndex[2]] && this._vertices[this._nextIndex[2]] == triangle._vertices[2]) { this._adjacentTriangles[2] = triangle; this._adjacentPairIndex[2] = 2; triangle._adjacentTriangles[2] = this; triangle._adjacentPairIndex[2] = 2; ++count; } if(count != 1) { return false; } return true; } removeAdjacentTriangles() { let triangle = this._adjacentTriangles[0]; if(triangle != null) { let pairIndex = this._adjacentPairIndex[0]; triangle._adjacentTriangles[pairIndex] = null; triangle._adjacentPairIndex[pairIndex] = -1; this._adjacentTriangles[0] = null; this._adjacentPairIndex[0] = -1; } let triangle1 = this._adjacentTriangles[1]; if(triangle1 != null) { let pairIndex = this._adjacentPairIndex[1]; triangle1._adjacentTriangles[pairIndex] = null; triangle1._adjacentPairIndex[pairIndex] = -1; this._adjacentTriangles[1] = null; this._adjacentPairIndex[1] = -1; } let triangle2 = this._adjacentTriangles[2]; if(triangle2 != null) { let pairIndex = this._adjacentPairIndex[2]; triangle2._adjacentTriangles[pairIndex] = null; triangle2._adjacentPairIndex[pairIndex] = -1; this._adjacentTriangles[2] = null; this._adjacentPairIndex[2] = -1; } } removeReferences() { this._next = null; this._prev = null; this._tmpDfsId = 0; this._tmpDfsVisible = false; this._distanceSq = 0; this._vertices[0] = null; this._vertices[1] = null; this._vertices[2] = null; this._adjacentTriangles[0] = null; this._adjacentTriangles[1] = null; this._adjacentTriangles[2] = null; this._adjacentPairIndex[0] = 0; this._adjacentPairIndex[1] = 0; this._adjacentPairIndex[2] = 0; } dump() { } } oimo.collision.narrowphase.detector.gjkepa.EpaVertex = class oimo_collision_narrowphase_detector_gjkepa_EpaVertex { constructor() { this.randId = Math.random() * 100000 | 0; this.v = new oimo.common.Vec3(); this.w1 = new oimo.common.Vec3(); this.w2 = new oimo.common.Vec3(); } init(v,w1,w2) { let _this = this.v; _this.x = v.x; _this.y = v.y; _this.z = v.z; let _this1 = this.w1; _this1.x = w1.x; _this1.y = w1.y; _this1.z = w1.z; let _this2 = this.w2; _this2.x = w2.x; _this2.y = w2.y; _this2.z = w2.z; this._next = null; this._tmpEdgeLoopNext = null; this._tmpEdgeLoopOuterTriangle = null; return this; } removeReferences() { this._next = null; this._tmpEdgeLoopNext = null; this._tmpEdgeLoopOuterTriangle = null; } } oimo.collision.narrowphase.detector.gjkepa.GjkCache = class oimo_collision_narrowphase_detector_gjkepa_GjkCache { constructor() { this.prevClosestDir = new oimo.common.Vec3(); } clear() { this.prevClosestDir.zero(); } } if(!oimo.common) oimo.common = {}; oimo.common.Vec3 = class oimo_common_Vec3 { constructor(x,y,z) { if(z == null) { z = 0; } if(y == null) { y = 0; } if(x == null) { x = 0; } this.x = x; this.y = y; this.z = z; oimo.common.Vec3.numCreations++; } init(x,y,z) { this.x = x; this.y = y; this.z = z; return this; } zero() { this.x = 0; this.y = 0; this.z = 0; return this; } add(v) { return new oimo.common.Vec3(this.x + v.x,this.y + v.y,this.z + v.z); } add3(vx,vy,vz) { return new oimo.common.Vec3(this.x + vx,this.y + vy,this.z + vz); } addScaled(v,s) { return new oimo.common.Vec3(this.x + v.x * s,this.y + v.y * s,this.z + v.z * s); } sub(v) { return new oimo.common.Vec3(this.x - v.x,this.y - v.y,this.z - v.z); } sub3(vx,vy,vz) { return new oimo.common.Vec3(this.x - vx,this.y - vy,this.z - vz); } scale(s) { return new oimo.common.Vec3(this.x * s,this.y * s,this.z * s); } scale3(sx,sy,sz) { return new oimo.common.Vec3(this.x * sx,this.y * sy,this.z * sz); } dot(v) { return this.x * v.x + this.y * v.y + this.z * v.z; } cross(v) { return new oimo.common.Vec3(this.y * v.z - this.z * v.y,this.z * v.x - this.x * v.z,this.x * v.y - this.y * v.x); } addEq(v) { this.x += v.x; this.y += v.y; this.z += v.z; return this; } add3Eq(vx,vy,vz) { this.x += vx; this.y += vy; this.z += vz; return this; } addScaledEq(v,s) { this.x += v.x * s; this.y += v.y * s; this.z += v.z * s; return this; } subEq(v) { this.x -= v.x; this.y -= v.y; this.z -= v.z; return this; } sub3Eq(vx,vy,vz) { this.x -= vx; this.y -= vy; this.z -= vz; return this; } scaleEq(s) { this.x *= s; this.y *= s; this.z *= s; return this; } scale3Eq(sx,sy,sz) { this.x *= sx; this.y *= sy; this.z *= sz; return this; } crossEq(v) { let y = this.z * v.x - this.x * v.z; let z = this.x * v.y - this.y * v.x; this.x = this.y * v.z - this.z * v.y; this.y = y; this.z = z; return this; } mulMat3(m) { return new oimo.common.Vec3(this.x * m.e00 + this.y * m.e01 + this.z * m.e02,this.x * m.e10 + this.y * m.e11 + this.z * m.e12,this.x * m.e20 + this.y * m.e21 + this.z * m.e22); } mulMat4(m) { return new oimo.common.Vec3(this.x * m.e00 + this.y * m.e01 + this.z * m.e02 + m.e03,this.x * m.e10 + this.y * m.e11 + this.z * m.e12 + m.e13,this.x * m.e20 + this.y * m.e21 + this.z * m.e22 + m.e23); } mulTransform(tf) { let vX; let vY; let vZ; vX = this.x; vY = this.y; vZ = this.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf._rotation00 * vX + tf._rotation01 * vY + tf._rotation02 * vZ; __tmp__Y = tf._rotation10 * vX + tf._rotation11 * vY + tf._rotation12 * vZ; __tmp__Z = tf._rotation20 * vX + tf._rotation21 * vY + tf._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; vX += tf._positionX; vY += tf._positionY; vZ += tf._positionZ; let res = new oimo.common.Vec3(); res.x = vX; res.y = vY; res.z = vZ; return res; } mulMat3Eq(m) { let y = this.x * m.e10 + this.y * m.e11 + this.z * m.e12; let z = this.x * m.e20 + this.y * m.e21 + this.z * m.e22; this.x = this.x * m.e00 + this.y * m.e01 + this.z * m.e02; this.y = y; this.z = z; return this; } mulMat4Eq(m) { let y = this.x * m.e10 + this.y * m.e11 + this.z * m.e12 + m.e13; let z = this.x * m.e20 + this.y * m.e21 + this.z * m.e22 + m.e23; this.x = this.x * m.e00 + this.y * m.e01 + this.z * m.e02 + m.e03; this.y = y; this.z = z; return this; } mulTransformEq(tf) { let vX; let vY; let vZ; vX = this.x; vY = this.y; vZ = this.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf._rotation00 * vX + tf._rotation01 * vY + tf._rotation02 * vZ; __tmp__Y = tf._rotation10 * vX + tf._rotation11 * vY + tf._rotation12 * vZ; __tmp__Z = tf._rotation20 * vX + tf._rotation21 * vY + tf._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; vX += tf._positionX; vY += tf._positionY; vZ += tf._positionZ; this.x = vX; this.y = vY; this.z = vZ; return this; } length() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); } lengthSq() { return this.x * this.x + this.y * this.y + this.z * this.z; } normalized() { let invLen = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); if(invLen > 0) { invLen = 1 / invLen; } return new oimo.common.Vec3(this.x * invLen,this.y * invLen,this.z * invLen); } normalize() { let invLen = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); if(invLen > 0) { invLen = 1 / invLen; } this.x *= invLen; this.y *= invLen; this.z *= invLen; return this; } negate() { return new oimo.common.Vec3(-this.x,-this.y,-this.z); } negateEq() { this.x = -this.x; this.y = -this.y; this.z = -this.z; return this; } copyFrom(v) { this.x = v.x; this.y = v.y; this.z = v.z; return this; } clone() { return new oimo.common.Vec3(this.x,this.y,this.z); } toString() { return "Vec3[" + (this.x > 0 ? (this.x * 10000000 + 0.5 | 0) / 10000000 : (this.x * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.y > 0 ? (this.y * 10000000 + 0.5 | 0) / 10000000 : (this.y * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.z > 0 ? (this.z * 10000000 + 0.5 | 0) / 10000000 : (this.z * 10000000 - 0.5 | 0) / 10000000) + "]"; } } oimo.common.Transform = class oimo_common_Transform { constructor() { this._positionX = 0; this._positionY = 0; this._positionZ = 0; this._rotation00 = 1; this._rotation01 = 0; this._rotation02 = 0; this._rotation10 = 0; this._rotation11 = 1; this._rotation12 = 0; this._rotation20 = 0; this._rotation21 = 0; this._rotation22 = 1; } identity() { this._positionX = 0; this._positionY = 0; this._positionZ = 0; this._rotation00 = 1; this._rotation01 = 0; this._rotation02 = 0; this._rotation10 = 0; this._rotation11 = 1; this._rotation12 = 0; this._rotation20 = 0; this._rotation21 = 0; this._rotation22 = 1; return this; } getPosition() { let position = new oimo.common.Vec3(); position.x = this._positionX; position.y = this._positionY; position.z = this._positionZ; return position; } getPositionTo(position) { position.x = this._positionX; position.y = this._positionY; position.z = this._positionZ; } setPosition(position) { this._positionX = position.x; this._positionY = position.y; this._positionZ = position.z; return this; } translate(translation) { let diffX; let diffY; let diffZ; diffX = translation.x; diffY = translation.y; diffZ = translation.z; this._positionX += diffX; this._positionY += diffY; this._positionZ += diffZ; } getRotation() { let rotation = new oimo.common.Mat3(); rotation.e00 = this._rotation00; rotation.e01 = this._rotation01; rotation.e02 = this._rotation02; rotation.e10 = this._rotation10; rotation.e11 = this._rotation11; rotation.e12 = this._rotation12; rotation.e20 = this._rotation20; rotation.e21 = this._rotation21; rotation.e22 = this._rotation22; return rotation; } getRotationTo(out) { out.e00 = this._rotation00; out.e01 = this._rotation01; out.e02 = this._rotation02; out.e10 = this._rotation10; out.e11 = this._rotation11; out.e12 = this._rotation12; out.e20 = this._rotation20; out.e21 = this._rotation21; out.e22 = this._rotation22; } setRotation(rotation) { this._rotation00 = rotation.e00; this._rotation01 = rotation.e01; this._rotation02 = rotation.e02; this._rotation10 = rotation.e10; this._rotation11 = rotation.e11; this._rotation12 = rotation.e12; this._rotation20 = rotation.e20; this._rotation21 = rotation.e21; this._rotation22 = rotation.e22; return this; } setRotationXyz(eulerAngles) { let xyzX; let xyzY; let xyzZ; xyzX = eulerAngles.x; xyzY = eulerAngles.y; xyzZ = eulerAngles.z; let sx = Math.sin(xyzX); let sy = Math.sin(xyzY); let sz = Math.sin(xyzZ); let cx = Math.cos(xyzX); let cy = Math.cos(xyzY); let cz = Math.cos(xyzZ); this._rotation00 = cy * cz; this._rotation01 = -cy * sz; this._rotation02 = sy; this._rotation10 = cx * sz + cz * sx * sy; this._rotation11 = cx * cz - sx * sy * sz; this._rotation12 = -cy * sx; this._rotation20 = sx * sz - cx * cz * sy; this._rotation21 = cz * sx + cx * sy * sz; this._rotation22 = cx * cy; } rotate(rotation) { let rot00; let rot01; let rot02; let rot10; let rot11; let rot12; let rot20; let rot21; let rot22; rot00 = rotation.e00; rot01 = rotation.e01; rot02 = rotation.e02; rot10 = rotation.e10; rot11 = rotation.e11; rot12 = rotation.e12; rot20 = rotation.e20; rot21 = rotation.e21; rot22 = rotation.e22; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = rot00 * this._rotation00 + rot01 * this._rotation10 + rot02 * this._rotation20; __tmp__01 = rot00 * this._rotation01 + rot01 * this._rotation11 + rot02 * this._rotation21; __tmp__02 = rot00 * this._rotation02 + rot01 * this._rotation12 + rot02 * this._rotation22; __tmp__10 = rot10 * this._rotation00 + rot11 * this._rotation10 + rot12 * this._rotation20; __tmp__11 = rot10 * this._rotation01 + rot11 * this._rotation11 + rot12 * this._rotation21; __tmp__12 = rot10 * this._rotation02 + rot11 * this._rotation12 + rot12 * this._rotation22; __tmp__20 = rot20 * this._rotation00 + rot21 * this._rotation10 + rot22 * this._rotation20; __tmp__21 = rot20 * this._rotation01 + rot21 * this._rotation11 + rot22 * this._rotation21; __tmp__22 = rot20 * this._rotation02 + rot21 * this._rotation12 + rot22 * this._rotation22; this._rotation00 = __tmp__00; this._rotation01 = __tmp__01; this._rotation02 = __tmp__02; this._rotation10 = __tmp__10; this._rotation11 = __tmp__11; this._rotation12 = __tmp__12; this._rotation20 = __tmp__20; this._rotation21 = __tmp__21; this._rotation22 = __tmp__22; } rotateXyz(eulerAngles) { let xyzX; let xyzY; let xyzZ; let rot00; let rot01; let rot02; let rot10; let rot11; let rot12; let rot20; let rot21; let rot22; xyzX = eulerAngles.x; xyzY = eulerAngles.y; xyzZ = eulerAngles.z; let sx = Math.sin(xyzX); let sy = Math.sin(xyzY); let sz = Math.sin(xyzZ); let cx = Math.cos(xyzX); let cy = Math.cos(xyzY); let cz = Math.cos(xyzZ); rot00 = cy * cz; rot01 = -cy * sz; rot02 = sy; rot10 = cx * sz + cz * sx * sy; rot11 = cx * cz - sx * sy * sz; rot12 = -cy * sx; rot20 = sx * sz - cx * cz * sy; rot21 = cz * sx + cx * sy * sz; rot22 = cx * cy; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = rot00 * this._rotation00 + rot01 * this._rotation10 + rot02 * this._rotation20; __tmp__01 = rot00 * this._rotation01 + rot01 * this._rotation11 + rot02 * this._rotation21; __tmp__02 = rot00 * this._rotation02 + rot01 * this._rotation12 + rot02 * this._rotation22; __tmp__10 = rot10 * this._rotation00 + rot11 * this._rotation10 + rot12 * this._rotation20; __tmp__11 = rot10 * this._rotation01 + rot11 * this._rotation11 + rot12 * this._rotation21; __tmp__12 = rot10 * this._rotation02 + rot11 * this._rotation12 + rot12 * this._rotation22; __tmp__20 = rot20 * this._rotation00 + rot21 * this._rotation10 + rot22 * this._rotation20; __tmp__21 = rot20 * this._rotation01 + rot21 * this._rotation11 + rot22 * this._rotation21; __tmp__22 = rot20 * this._rotation02 + rot21 * this._rotation12 + rot22 * this._rotation22; this._rotation00 = __tmp__00; this._rotation01 = __tmp__01; this._rotation02 = __tmp__02; this._rotation10 = __tmp__10; this._rotation11 = __tmp__11; this._rotation12 = __tmp__12; this._rotation20 = __tmp__20; this._rotation21 = __tmp__21; this._rotation22 = __tmp__22; } getOrientation() { let q = new oimo.common.Quat(); let iqX; let iqY; let iqZ; let iqW; let e00 = this._rotation00; let e11 = this._rotation11; let e22 = this._rotation22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); iqW = 0.5 * s; s = 0.5 / s; iqX = (this._rotation21 - this._rotation12) * s; iqY = (this._rotation02 - this._rotation20) * s; iqZ = (this._rotation10 - this._rotation01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); iqX = 0.5 * s; s = 0.5 / s; iqY = (this._rotation01 + this._rotation10) * s; iqZ = (this._rotation02 + this._rotation20) * s; iqW = (this._rotation21 - this._rotation12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); iqZ = 0.5 * s; s = 0.5 / s; iqX = (this._rotation02 + this._rotation20) * s; iqY = (this._rotation12 + this._rotation21) * s; iqW = (this._rotation10 - this._rotation01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); iqY = 0.5 * s; s = 0.5 / s; iqX = (this._rotation01 + this._rotation10) * s; iqZ = (this._rotation12 + this._rotation21) * s; iqW = (this._rotation02 - this._rotation20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); iqZ = 0.5 * s; s = 0.5 / s; iqX = (this._rotation02 + this._rotation20) * s; iqY = (this._rotation12 + this._rotation21) * s; iqW = (this._rotation10 - this._rotation01) * s; } q.x = iqX; q.y = iqY; q.z = iqZ; q.w = iqW; return q; } getOrientationTo(orientation) { let iqX; let iqY; let iqZ; let iqW; let e00 = this._rotation00; let e11 = this._rotation11; let e22 = this._rotation22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); iqW = 0.5 * s; s = 0.5 / s; iqX = (this._rotation21 - this._rotation12) * s; iqY = (this._rotation02 - this._rotation20) * s; iqZ = (this._rotation10 - this._rotation01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); iqX = 0.5 * s; s = 0.5 / s; iqY = (this._rotation01 + this._rotation10) * s; iqZ = (this._rotation02 + this._rotation20) * s; iqW = (this._rotation21 - this._rotation12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); iqZ = 0.5 * s; s = 0.5 / s; iqX = (this._rotation02 + this._rotation20) * s; iqY = (this._rotation12 + this._rotation21) * s; iqW = (this._rotation10 - this._rotation01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); iqY = 0.5 * s; s = 0.5 / s; iqX = (this._rotation01 + this._rotation10) * s; iqZ = (this._rotation12 + this._rotation21) * s; iqW = (this._rotation02 - this._rotation20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); iqZ = 0.5 * s; s = 0.5 / s; iqX = (this._rotation02 + this._rotation20) * s; iqY = (this._rotation12 + this._rotation21) * s; iqW = (this._rotation10 - this._rotation01) * s; } orientation.x = iqX; orientation.y = iqY; orientation.z = iqZ; orientation.w = iqW; } setOrientation(quaternion) { let qX; let qY; let qZ; let qW; qX = quaternion.x; qY = quaternion.y; qZ = quaternion.z; qW = quaternion.w; let x = qX; let y = qY; let z = qZ; let w = qW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; this._rotation00 = 1 - yy - zz; this._rotation01 = xy - wz; this._rotation02 = xz + wy; this._rotation10 = xy + wz; this._rotation11 = 1 - xx - zz; this._rotation12 = yz - wx; this._rotation20 = xz - wy; this._rotation21 = yz + wx; this._rotation22 = 1 - xx - yy; return this; } clone() { let tf = new oimo.common.Transform(); tf._positionX = this._positionX; tf._positionY = this._positionY; tf._positionZ = this._positionZ; tf._rotation00 = this._rotation00; tf._rotation01 = this._rotation01; tf._rotation02 = this._rotation02; tf._rotation10 = this._rotation10; tf._rotation11 = this._rotation11; tf._rotation12 = this._rotation12; tf._rotation20 = this._rotation20; tf._rotation21 = this._rotation21; tf._rotation22 = this._rotation22; return tf; } copyFrom(transform) { this._positionX = transform._positionX; this._positionY = transform._positionY; this._positionZ = transform._positionZ; this._rotation00 = transform._rotation00; this._rotation01 = transform._rotation01; this._rotation02 = transform._rotation02; this._rotation10 = transform._rotation10; this._rotation11 = transform._rotation11; this._rotation12 = transform._rotation12; this._rotation20 = transform._rotation20; this._rotation21 = transform._rotation21; this._rotation22 = transform._rotation22; return this; } } oimo.common.Setting = class oimo_common_Setting { } oimo.collision.narrowphase.detector.gjkepa.GjkEpa = class oimo_collision_narrowphase_detector_gjkepa_GjkEpa { constructor() { this.s = new Array(4); this.w1 = new Array(4); this.w2 = new Array(4); this.baseDirs = new Array(3); this.baseDirs[0] = new oimo.common.Vec3(1,0,0); this.baseDirs[1] = new oimo.common.Vec3(0,1,0); this.baseDirs[2] = new oimo.common.Vec3(0,0,1); this.tl1 = new oimo.common.Vec3(); this.tl2 = new oimo.common.Vec3(); this.rayX = new oimo.common.Vec3(); this.rayR = new oimo.common.Vec3(); this.tempTransform = new oimo.common.Transform(); this.s[0] = new oimo.common.Vec3(); this.w1[0] = new oimo.common.Vec3(); this.w2[0] = new oimo.common.Vec3(); this.s[1] = new oimo.common.Vec3(); this.w1[1] = new oimo.common.Vec3(); this.w2[1] = new oimo.common.Vec3(); this.s[2] = new oimo.common.Vec3(); this.w1[2] = new oimo.common.Vec3(); this.w2[2] = new oimo.common.Vec3(); this.s[3] = new oimo.common.Vec3(); this.w1[3] = new oimo.common.Vec3(); this.w2[3] = new oimo.common.Vec3(); this.dir = new oimo.common.Vec3(); this.closest = new oimo.common.Vec3(); this.closestPoint1 = new oimo.common.Vec3(); this.closestPoint2 = new oimo.common.Vec3(); this.polyhedron = new oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedron(); } computeClosestPointsImpl(c1,c2,tf1,tf2,cache,useEpa) { this.c1 = c1; this.c2 = c2; this.tf1 = tf1; this.tf2 = tf2; let s = this.s; let w1 = this.w1; let w2 = this.w2; let closest = this.closest; let dir = this.dir; if(cache != null) { if(cache._gjkCache == null) { cache._gjkCache = new oimo.collision.narrowphase.detector.gjkepa.GjkCache(); } this.loadCache(cache._gjkCache); } else { dir.zero(); } if(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z == 0) { let firstDirX; let firstDirY; let firstDirZ; firstDirX = tf2._positionX - tf1._positionX; firstDirY = tf2._positionY - tf1._positionY; firstDirZ = tf2._positionZ - tf1._positionZ; dir.x = firstDirX; dir.y = firstDirY; dir.z = firstDirZ; if(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z < 1e-6) { dir.init(1,0,0); } } this.simplexSize = 0; this.computeWitnessPoint1(false); this.computeWitnessPoint2(false); let _this = this.s[this.simplexSize]; let v = this.w1[this.simplexSize]; _this.x = v.x; _this.y = v.y; _this.z = v.z; let v1 = this.w2[this.simplexSize]; _this.x -= v1.x; _this.y -= v1.y; _this.z -= v1.z; this.simplexSize = 1; let count = 0; while(count < 40) { let v = 0; switch(this.simplexSize) { case 1: let v1 = s[0]; closest.x = v1.x; closest.y = v1.y; closest.z = v1.z; v = 1; break; case 2: let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v2 = s[0]; v1X = v2.x; v1Y = v2.y; v1Z = v2.z; let v3 = s[1]; v2X = v3.x; v2Y = v3.y; v2Z = v3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; v = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; v = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; v = 3; } break; case 3: let vec1 = s[0]; let vec2 = s[1]; let vec3 = s[2]; let v1X1; let v1Y1; let v1Z1; let v2X1; let v2Y1; let v2Z1; let v3X; let v3Y; let v3Z; let v12X1; let v12Y1; let v12Z1; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X1 = vec1.x; v1Y1 = vec1.y; v1Z1 = vec1.z; v2X1 = vec2.x; v2Y1 = vec2.y; v2Z1 = vec2.z; v3X = vec3.x; v3Y = vec3.y; v3Z = vec3.z; v12X1 = v2X1 - v1X1; v12Y1 = v2Y1 - v1Y1; v12Z1 = v2Z1 - v1Z1; v23X = v3X - v2X1; v23Y = v3Y - v2Y1; v23Z = v3Z - v2Z1; v31X = v1X1 - v3X; v31Y = v1Y1 - v3Y; v31Z = v1Z1 - v3Z; let nX; let nY; let nZ; nX = v12Y1 * v23Z - v12Z1 * v23Y; nY = v12Z1 * v23X - v12X1 * v23Z; nZ = v12X1 * v23Y - v12Y1 * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y1 * nZ - v12Z1 * nY; n12Y = v12Z1 * nX - v12X1 * nZ; n12Z = v12X1 * nY - v12Y1 * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X1 * n12X + v1Y1 * n12Y + v1Z1 * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } mini = b; mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } if(v2X1 * n23X + v2Y1 * n23Y + v2Z1 * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec2.x; v1Y = vec2.y; v1Z = vec2.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(mind > 0) { closest.x = minvX; closest.y = minvY; closest.z = minvZ; v = mini; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X1 * nX + v1Y1 * nY + v1Z1 * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; closest.x = minvX; closest.y = minvY; closest.z = minvZ; v = 7; } break; case 4: let vec11 = s[0]; let vec21 = s[1]; let vec31 = s[2]; let vec4 = s[3]; let v1X2; let v1Y2; let v1Z2; let v2X2; let v2Y2; let v2Z2; let v3X1; let v3Y1; let v3Z1; let v4X; let v4Y; let v4Z; let v12X2; let v12Y2; let v12Z2; let v13X; let v13Y; let v13Z; let v14X; let v14Y; let v14Z; let v23X1; let v23Y1; let v23Z1; let v24X; let v24Y; let v24Z; v1X2 = vec11.x; v1Y2 = vec11.y; v1Z2 = vec11.z; v2X2 = vec21.x; v2Y2 = vec21.y; v2Z2 = vec21.z; v3X1 = vec31.x; v3Y1 = vec31.y; v3Z1 = vec31.z; v4X = vec4.x; v4Y = vec4.y; v4Z = vec4.z; v12X2 = v2X2 - v1X2; v12Y2 = v2Y2 - v1Y2; v12Z2 = v2Z2 - v1Z2; v13X = v3X1 - v1X2; v13Y = v3Y1 - v1Y2; v13Z = v3Z1 - v1Z2; v14X = v4X - v1X2; v14Y = v4Y - v1Y2; v14Z = v4Z - v1Z2; v23X1 = v3X1 - v2X2; v23Y1 = v3Y1 - v2Y2; v23Z1 = v3Z1 - v2Z2; v24X = v4X - v2X2; v24Y = v4Y - v2Y2; v24Z = v4Z - v2Z2; let n123X; let n123Y; let n123Z; let n134X; let n134Y; let n134Z; let n142X; let n142Y; let n142Z; let n243X; let n243Y; let n243Z; n123X = v12Y2 * v13Z - v12Z2 * v13Y; n123Y = v12Z2 * v13X - v12X2 * v13Z; n123Z = v12X2 * v13Y - v12Y2 * v13X; n134X = v13Y * v14Z - v13Z * v14Y; n134Y = v13Z * v14X - v13X * v14Z; n134Z = v13X * v14Y - v13Y * v14X; n142X = v14Y * v12Z2 - v14Z * v12Y2; n142Y = v14Z * v12X2 - v14X * v12Z2; n142Z = v14X * v12Y2 - v14Y * v12X2; n243X = v24Y * v23Z1 - v24Z * v23Y1; n243Y = v24Z * v23X1 - v24X * v23Z1; n243Z = v24X * v23Y1 - v24Y * v23X1; let sign = v12X2 * n243X + v12Y2 * n243Y + v12Z2 * n243Z > 0 ? 1 : -1; let mind1 = -1; let minvX1; let minvY1; let minvZ1; let mini1 = 0; minvX1 = 0; minvY1 = 0; minvZ1 = 0; if((v1X2 * n123X + v1Y2 * n123Y + v1Z2 * n123Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec21.x; v2Y = vec21.y; v2Z = vec21.z; v3X = vec31.x; v3Y = vec31.y; v3Z = vec31.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec21.x; v2Y = vec21.y; v2Z = vec21.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } mini = b; mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec21.x; v1Y = vec21.y; v1Z = vec21.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } let b; if(mind > 0) { closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = mini; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = 7; } mini1 = b; mind1 = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX1 = closest.x; minvY1 = closest.y; minvZ1 = closest.z; } if((v1X2 * n134X + v1Y2 * n134Y + v1Z2 * n134Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; v3X = vec4.x; v3Y = vec4.y; v3Z = vec4.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } mini = b; mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec31.x; v1Y = vec31.y; v1Z = vec31.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } let b; if(mind > 0) { closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = mini; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = 7; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind1 < 0 || d < mind1) { mini1 = b & 1 | (b & 6) << 1; mind1 = d; minvX1 = closest.x; minvY1 = closest.y; minvZ1 = closest.z; } } if((v1X2 * n142X + v1Y2 * n142Y + v1Z2 * n142Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec21.x; v2Y = vec21.y; v2Z = vec21.z; v3X = vec4.x; v3Y = vec4.y; v3Z = vec4.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec21.x; v2Y = vec21.y; v2Z = vec21.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } mini = b; mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec21.x; v1Y = vec21.y; v1Z = vec21.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } let b; if(mind > 0) { closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = mini; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = 7; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind1 < 0 || d < mind1) { mini1 = b & 3 | (b & 4) << 1; mind1 = d; minvX1 = closest.x; minvY1 = closest.y; minvZ1 = closest.z; } } if((v2X2 * n243X + v2Y2 * n243Y + v2Z2 * n243Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec21.x; v1Y = vec21.y; v1Z = vec21.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; v3X = vec4.x; v3Y = vec4.y; v3Z = vec4.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec21.x; v1Y = vec21.y; v1Z = vec21.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } mini = b; mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec31.x; v1Y = vec31.y; v1Z = vec31.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec21.x; v1Y = vec21.y; v1Z = vec21.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } let b; if(mind > 0) { closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = mini; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = 7; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind1 < 0 || d < mind1) { mini1 = b << 1; mind1 = d; minvX1 = closest.x; minvY1 = closest.y; minvZ1 = closest.z; } } if(mind1 > 0) { closest.x = minvX1; closest.y = minvY1; closest.z = minvZ1; v = mini1; } else { closest.zero(); v = 15; } break; } if(closest.x * closest.x + closest.y * closest.y + closest.z * closest.z < 1e-008) { if(!useEpa) { this.distance = 0; return 0; } switch(this.simplexSize) { case 1: this.pointToTetrahedron(); break; case 2: this.lineToTetrahedron(); break; case 3: this.triangleToTetrahedron(); break; } if(this.simplexSize == 4) { let epaState = this.computeDepth(c1,c2,tf1,tf2,s,w1,w2); if(epaState != 0) { this.distance = 0; return epaState; } this.distance = -this.depth; return 0; } this.distance = 0; return 1; } this.shrinkSimplex(v); dir.x = closest.x; dir.y = closest.y; dir.z = closest.z; dir.x = -dir.x; dir.y = -dir.y; dir.z = -dir.z; this.computeWitnessPoint1(false); this.computeWitnessPoint2(false); let _this = this.s[this.simplexSize]; let v4 = this.w1[this.simplexSize]; _this.x = v4.x; _this.y = v4.y; _this.z = v4.z; let v5 = this.w2[this.simplexSize]; _this.x -= v5.x; _this.y -= v5.y; _this.z -= v5.z; if(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z < 1e-008) { throw new Error("!?"); } let _this1 = s[this.simplexSize]; if(_this1.x * dir.x + _this1.y * dir.y + _this1.z * dir.z - (closest.x * dir.x + closest.y * dir.y + closest.z * dir.z) < 1e-008) { this.interpolateClosestPoints(); this.distance = Math.sqrt(closest.x * closest.x + closest.y * closest.y + closest.z * closest.z); if(cache != null && cache._gjkCache != null) { this.saveCache(cache._gjkCache); } return 0; } this.simplexSize++; ++count; } return 2; } convexCastImpl(c1,c2,tf1,tf2,tl1,tl2,hit) { this.c1 = c1; this.c2 = c2; this.tf1 = tf1; this.tf2 = tf2; let s = this.s; let closest = this.closest; let dir = this.dir; let firstDirX; let firstDirY; let firstDirZ; firstDirX = tf2._positionX - tf1._positionX; firstDirY = tf2._positionY - tf1._positionY; firstDirZ = tf2._positionZ - tf1._positionZ; dir.x = firstDirX; dir.y = firstDirY; dir.z = firstDirZ; if(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z < 1e-6) { dir.init(1,0,0); } this.simplexSize = 0; if(this.c1 != null) { this.computeWitnessPoint1(true); } else { let v = this.w1[this.simplexSize]; v.x = this.tf1._positionX; v.y = this.tf1._positionY; v.z = this.tf1._positionZ; } this.computeWitnessPoint2(true); let _this = this.s[this.simplexSize]; let v = this.w1[this.simplexSize]; _this.x = v.x; _this.y = v.y; _this.z = v.z; let v1 = this.w2[this.simplexSize]; _this.x -= v1.x; _this.y -= v1.y; _this.z -= v1.z; this.simplexSize = 1; let count = 0; let lambda = 0.0; let rayX = this.rayX; let rayR = this.rayR; rayX.zero(); rayR.x = tl2.x; rayR.y = tl2.y; rayR.z = tl2.z; rayR.x -= tl1.x; rayR.y -= tl1.y; rayR.z -= tl1.z; while(count < 40) { let v = 0; switch(this.simplexSize) { case 1: let v1 = s[0]; closest.x = v1.x; closest.y = v1.y; closest.z = v1.z; v = 1; break; case 2: let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v2 = s[0]; v1X = v2.x; v1Y = v2.y; v1Z = v2.z; let v3 = s[1]; v2X = v3.x; v2Y = v3.y; v2Z = v3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; v = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; v = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; v = 3; } break; case 3: let vec1 = s[0]; let vec2 = s[1]; let vec3 = s[2]; let v1X1; let v1Y1; let v1Z1; let v2X1; let v2Y1; let v2Z1; let v3X; let v3Y; let v3Z; let v12X1; let v12Y1; let v12Z1; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X1 = vec1.x; v1Y1 = vec1.y; v1Z1 = vec1.z; v2X1 = vec2.x; v2Y1 = vec2.y; v2Z1 = vec2.z; v3X = vec3.x; v3Y = vec3.y; v3Z = vec3.z; v12X1 = v2X1 - v1X1; v12Y1 = v2Y1 - v1Y1; v12Z1 = v2Z1 - v1Z1; v23X = v3X - v2X1; v23Y = v3Y - v2Y1; v23Z = v3Z - v2Z1; v31X = v1X1 - v3X; v31Y = v1Y1 - v3Y; v31Z = v1Z1 - v3Z; let nX; let nY; let nZ; nX = v12Y1 * v23Z - v12Z1 * v23Y; nY = v12Z1 * v23X - v12X1 * v23Z; nZ = v12X1 * v23Y - v12Y1 * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y1 * nZ - v12Z1 * nY; n12Y = v12Z1 * nX - v12X1 * nZ; n12Z = v12X1 * nY - v12Y1 * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X1 * n12X + v1Y1 * n12Y + v1Z1 * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } mini = b; mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } if(v2X1 * n23X + v2Y1 * n23Y + v2Z1 * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec2.x; v1Y = vec2.y; v1Z = vec2.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(mind > 0) { closest.x = minvX; closest.y = minvY; closest.z = minvZ; v = mini; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X1 * nX + v1Y1 * nY + v1Z1 * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; closest.x = minvX; closest.y = minvY; closest.z = minvZ; v = 7; } break; case 4: let vec11 = s[0]; let vec21 = s[1]; let vec31 = s[2]; let vec4 = s[3]; let v1X2; let v1Y2; let v1Z2; let v2X2; let v2Y2; let v2Z2; let v3X1; let v3Y1; let v3Z1; let v4X; let v4Y; let v4Z; let v12X2; let v12Y2; let v12Z2; let v13X; let v13Y; let v13Z; let v14X; let v14Y; let v14Z; let v23X1; let v23Y1; let v23Z1; let v24X; let v24Y; let v24Z; v1X2 = vec11.x; v1Y2 = vec11.y; v1Z2 = vec11.z; v2X2 = vec21.x; v2Y2 = vec21.y; v2Z2 = vec21.z; v3X1 = vec31.x; v3Y1 = vec31.y; v3Z1 = vec31.z; v4X = vec4.x; v4Y = vec4.y; v4Z = vec4.z; v12X2 = v2X2 - v1X2; v12Y2 = v2Y2 - v1Y2; v12Z2 = v2Z2 - v1Z2; v13X = v3X1 - v1X2; v13Y = v3Y1 - v1Y2; v13Z = v3Z1 - v1Z2; v14X = v4X - v1X2; v14Y = v4Y - v1Y2; v14Z = v4Z - v1Z2; v23X1 = v3X1 - v2X2; v23Y1 = v3Y1 - v2Y2; v23Z1 = v3Z1 - v2Z2; v24X = v4X - v2X2; v24Y = v4Y - v2Y2; v24Z = v4Z - v2Z2; let n123X; let n123Y; let n123Z; let n134X; let n134Y; let n134Z; let n142X; let n142Y; let n142Z; let n243X; let n243Y; let n243Z; n123X = v12Y2 * v13Z - v12Z2 * v13Y; n123Y = v12Z2 * v13X - v12X2 * v13Z; n123Z = v12X2 * v13Y - v12Y2 * v13X; n134X = v13Y * v14Z - v13Z * v14Y; n134Y = v13Z * v14X - v13X * v14Z; n134Z = v13X * v14Y - v13Y * v14X; n142X = v14Y * v12Z2 - v14Z * v12Y2; n142Y = v14Z * v12X2 - v14X * v12Z2; n142Z = v14X * v12Y2 - v14Y * v12X2; n243X = v24Y * v23Z1 - v24Z * v23Y1; n243Y = v24Z * v23X1 - v24X * v23Z1; n243Z = v24X * v23Y1 - v24Y * v23X1; let sign = v12X2 * n243X + v12Y2 * n243Y + v12Z2 * n243Z > 0 ? 1 : -1; let mind1 = -1; let minvX1; let minvY1; let minvZ1; let mini1 = 0; minvX1 = 0; minvY1 = 0; minvZ1 = 0; if((v1X2 * n123X + v1Y2 * n123Y + v1Z2 * n123Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec21.x; v2Y = vec21.y; v2Z = vec21.z; v3X = vec31.x; v3Y = vec31.y; v3Z = vec31.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec21.x; v2Y = vec21.y; v2Z = vec21.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } mini = b; mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec21.x; v1Y = vec21.y; v1Z = vec21.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } let b; if(mind > 0) { closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = mini; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = 7; } mini1 = b; mind1 = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX1 = closest.x; minvY1 = closest.y; minvZ1 = closest.z; } if((v1X2 * n134X + v1Y2 * n134Y + v1Z2 * n134Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; v3X = vec4.x; v3Y = vec4.y; v3Z = vec4.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } mini = b; mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec31.x; v1Y = vec31.y; v1Z = vec31.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } let b; if(mind > 0) { closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = mini; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = 7; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind1 < 0 || d < mind1) { mini1 = b & 1 | (b & 6) << 1; mind1 = d; minvX1 = closest.x; minvY1 = closest.y; minvZ1 = closest.z; } } if((v1X2 * n142X + v1Y2 * n142Y + v1Z2 * n142Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec21.x; v2Y = vec21.y; v2Z = vec21.z; v3X = vec4.x; v3Y = vec4.y; v3Z = vec4.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec21.x; v2Y = vec21.y; v2Z = vec21.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } mini = b; mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec21.x; v1Y = vec21.y; v1Z = vec21.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec11.x; v1Y = vec11.y; v1Z = vec11.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } let b; if(mind > 0) { closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = mini; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = 7; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind1 < 0 || d < mind1) { mini1 = b & 3 | (b & 4) << 1; mind1 = d; minvX1 = closest.x; minvY1 = closest.y; minvZ1 = closest.z; } } if((v2X2 * n243X + v2Y2 * n243Y + v2Z2 * n243Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec21.x; v1Y = vec21.y; v1Z = vec21.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; v3X = vec4.x; v3Y = vec4.y; v3Z = vec4.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec21.x; v1Y = vec21.y; v1Z = vec21.z; v2X = vec31.x; v2Y = vec31.y; v2Z = vec31.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } mini = b; mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec31.x; v1Y = vec31.y; v1Z = vec31.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec21.x; v1Y = vec21.y; v1Z = vec21.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { closest.x = v1X; closest.y = v1Y; closest.z = v1Z; b = 1; } else if(t > 1) { closest.x = v2X; closest.y = v2Y; closest.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; closest.x = pX; closest.y = pY; closest.z = pZ; b = 3; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = closest.x; minvY = closest.y; minvZ = closest.z; } } let b; if(mind > 0) { closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = mini; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; closest.x = minvX; closest.y = minvY; closest.z = minvZ; b = 7; } let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z; if(mind1 < 0 || d < mind1) { mini1 = b << 1; mind1 = d; minvX1 = closest.x; minvY1 = closest.y; minvZ1 = closest.z; } } if(mind1 > 0) { closest.x = minvX1; closest.y = minvY1; closest.z = minvZ1; v = mini1; } else { closest.zero(); v = 15; } break; } this.shrinkSimplex(v); if(closest.x * closest.x + closest.y * closest.y + closest.z * closest.z < 1e-008) { if(lambda == 0 || this.simplexSize == 4) { hit.fraction = lambda; return false; } this.interpolateClosestPoints(); hit.fraction = lambda; let _this = hit.normal; _this.x = dir.x; _this.y = dir.y; _this.z = dir.z; let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z); if(invLen > 0) { invLen = 1 / invLen; } _this.x *= invLen; _this.y *= invLen; _this.z *= invLen; let _this1 = hit.position; let v = this.closestPoint1; _this1.x = v.x; _this1.y = v.y; _this1.z = v.z; _this1.x += tl1.x * lambda; _this1.y += tl1.y * lambda; _this1.z += tl1.z * lambda; return true; } dir.x = closest.x; dir.y = closest.y; dir.z = closest.z; dir.x = -dir.x; dir.y = -dir.y; dir.z = -dir.z; if(this.c1 != null) { this.computeWitnessPoint1(true); } else { let v = this.w1[this.simplexSize]; v.x = this.tf1._positionX; v.y = this.tf1._positionY; v.z = this.tf1._positionZ; } this.computeWitnessPoint2(true); let _this = this.s[this.simplexSize]; let v4 = this.w1[this.simplexSize]; _this.x = v4.x; _this.y = v4.y; _this.z = v4.z; let v5 = this.w2[this.simplexSize]; _this.x -= v5.x; _this.y -= v5.y; _this.z -= v5.z; let _this1 = s[this.simplexSize]; _this1.x -= rayX.x; _this1.y -= rayX.y; _this1.z -= rayX.z; if(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z < 1e-008) { throw new Error("!?"); } let p = s[this.simplexSize]; let pn = p.x * dir.x + p.y * dir.y + p.z * dir.z; if(pn < 0) { if(rayR.x * dir.x + rayR.y * dir.y + rayR.z * dir.z >= 0) { return false; } let dLambda = pn / (rayR.x * dir.x + rayR.y * dir.y + rayR.z * dir.z); lambda += dLambda; if(lambda >= 1) { return false; } rayX.x += rayR.x * dLambda; rayX.y += rayR.y * dLambda; rayX.z += rayR.z * dLambda; let _g = 0; let _g1 = this.simplexSize + 1; while(_g < _g1) { let _this = s[_g++]; let s1 = -dLambda; _this.x += rayR.x * s1; _this.y += rayR.y * s1; _this.z += rayR.z * s1; } } let duplicate = false; let _g = 0; let _g1 = this.simplexSize; while(_g < _g1) { let i = _g++; let dx = s[i].x - s[this.simplexSize].x; let dy = s[i].y - s[this.simplexSize].y; let dz = s[i].z - s[this.simplexSize].z; if(dx * dx + dy * dy + dz * dz < 1e-008) { duplicate = true; break; } } if(!duplicate) { this.simplexSize++; } ++count; } return false; } interpolateClosestPoints() { switch(this.simplexSize) { case 1: let _this = this.closestPoint1; let v = this.w1[0]; _this.x = v.x; _this.y = v.y; _this.z = v.z; let _this1 = this.closestPoint2; let v1 = this.w2[0]; _this1.x = v1.x; _this1.y = v1.y; _this1.z = v1.z; break; case 2: let cX; let cY; let cZ; let v2 = this.closest; cX = v2.x; cY = v2.y; cZ = v2.z; let s0X; let s0Y; let s0Z; let w10X; let w10Y; let w10Z; let w20X; let w20Y; let w20Z; let s1X; let s1Y; let s1Z; let w11X; let w11Y; let w11Z; let w21X; let w21Y; let w21Z; let v3 = this.s[0]; s0X = v3.x; s0Y = v3.y; s0Z = v3.z; let v4 = this.w1[0]; w10X = v4.x; w10Y = v4.y; w10Z = v4.z; let v5 = this.w2[0]; w20X = v5.x; w20Y = v5.y; w20Z = v5.z; let v6 = this.s[1]; s1X = v6.x; s1Y = v6.y; s1Z = v6.z; let v7 = this.w1[1]; w11X = v7.x; w11Y = v7.y; w11Z = v7.z; let v8 = this.w2[1]; w21X = v8.x; w21Y = v8.y; w21Z = v8.z; let s01X; let s01Y; let s01Z; s01X = s1X - s0X; s01Y = s1Y - s0Y; s01Z = s1Z - s0Z; let invDet = s01X * s01X + s01Y * s01Y + s01Z * s01Z; if(invDet != 0) { invDet = 1 / invDet; } let s0cX; let s0cY; let s0cZ; s0cX = cX - s0X; s0cY = cY - s0Y; s0cZ = cZ - s0Z; let t = (s0cX * s01X + s0cY * s01Y + s0cZ * s01Z) * invDet; let diffX; let diffY; let diffZ; let cp1X; let cp1Y; let cp1Z; let cp2X; let cp2Y; let cp2Z; diffX = w11X - w10X; diffY = w11Y - w10Y; diffZ = w11Z - w10Z; cp1X = w10X + diffX * t; cp1Y = w10Y + diffY * t; cp1Z = w10Z + diffZ * t; diffX = w21X - w20X; diffY = w21Y - w20Y; diffZ = w21Z - w20Z; cp2X = w20X + diffX * t; cp2Y = w20Y + diffY * t; cp2Z = w20Z + diffZ * t; let v9 = this.closestPoint1; v9.x = cp1X; v9.y = cp1Y; v9.z = cp1Z; let v10 = this.closestPoint2; v10.x = cp2X; v10.y = cp2Y; v10.z = cp2Z; break; case 3: let cX1; let cY1; let cZ1; let v11 = this.closest; cX1 = v11.x; cY1 = v11.y; cZ1 = v11.z; let s0X1; let s0Y1; let s0Z1; let w10X1; let w10Y1; let w10Z1; let w20X1; let w20Y1; let w20Z1; let s1X1; let s1Y1; let s1Z1; let w11X1; let w11Y1; let w11Z1; let w21X1; let w21Y1; let w21Z1; let s2X; let s2Y; let s2Z; let w12X; let w12Y; let w12Z; let w22X; let w22Y; let w22Z; let v12 = this.s[0]; s0X1 = v12.x; s0Y1 = v12.y; s0Z1 = v12.z; let v13 = this.w1[0]; w10X1 = v13.x; w10Y1 = v13.y; w10Z1 = v13.z; let v14 = this.w2[0]; w20X1 = v14.x; w20Y1 = v14.y; w20Z1 = v14.z; let v15 = this.s[1]; s1X1 = v15.x; s1Y1 = v15.y; s1Z1 = v15.z; let v16 = this.w1[1]; w11X1 = v16.x; w11Y1 = v16.y; w11Z1 = v16.z; let v17 = this.w2[1]; w21X1 = v17.x; w21Y1 = v17.y; w21Z1 = v17.z; let v18 = this.s[2]; s2X = v18.x; s2Y = v18.y; s2Z = v18.z; let v19 = this.w1[2]; w12X = v19.x; w12Y = v19.y; w12Z = v19.z; let v20 = this.w2[2]; w22X = v20.x; w22Y = v20.y; w22Z = v20.z; let s01X1; let s01Y1; let s01Z1; let s02X; let s02Y; let s02Z; let s0cX1; let s0cY1; let s0cZ1; s01X1 = s1X1 - s0X1; s01Y1 = s1Y1 - s0Y1; s01Z1 = s1Z1 - s0Z1; s02X = s2X - s0X1; s02Y = s2Y - s0Y1; s02Z = s2Z - s0Z1; s0cX1 = cX1 - s0X1; s0cY1 = cY1 - s0Y1; s0cZ1 = cZ1 - s0Z1; let d11 = s01X1 * s01X1 + s01Y1 * s01Y1 + s01Z1 * s01Z1; let d12 = s01X1 * s02X + s01Y1 * s02Y + s01Z1 * s02Z; let d22 = s02X * s02X + s02Y * s02Y + s02Z * s02Z; let d1c = s01X1 * s0cX1 + s01Y1 * s0cY1 + s01Z1 * s0cZ1; let d2c = s02X * s0cX1 + s02Y * s0cY1 + s02Z * s0cZ1; let invDet1 = d11 * d22 - d12 * d12; if(invDet1 != 0) { invDet1 = 1 / invDet1; } let s = (d1c * d22 - d2c * d12) * invDet1; let t1 = (-d1c * d12 + d2c * d11) * invDet1; let diffX1; let diffY1; let diffZ1; let cp1X1; let cp1Y1; let cp1Z1; let cp2X1; let cp2Y1; let cp2Z1; diffX1 = w11X1 - w10X1; diffY1 = w11Y1 - w10Y1; diffZ1 = w11Z1 - w10Z1; cp1X1 = w10X1 + diffX1 * s; cp1Y1 = w10Y1 + diffY1 * s; cp1Z1 = w10Z1 + diffZ1 * s; diffX1 = w12X - w10X1; diffY1 = w12Y - w10Y1; diffZ1 = w12Z - w10Z1; cp1X1 += diffX1 * t1; cp1Y1 += diffY1 * t1; cp1Z1 += diffZ1 * t1; diffX1 = w21X1 - w20X1; diffY1 = w21Y1 - w20Y1; diffZ1 = w21Z1 - w20Z1; cp2X1 = w20X1 + diffX1 * s; cp2Y1 = w20Y1 + diffY1 * s; cp2Z1 = w20Z1 + diffZ1 * s; diffX1 = w22X - w20X1; diffY1 = w22Y - w20Y1; diffZ1 = w22Z - w20Z1; cp2X1 += diffX1 * t1; cp2Y1 += diffY1 * t1; cp2Z1 += diffZ1 * t1; let v21 = this.closestPoint1; v21.x = cp1X1; v21.y = cp1Y1; v21.z = cp1Z1; let v22 = this.closestPoint2; v22.x = cp2X1; v22.y = cp2Y1; v22.z = cp2Z1; break; default: throw new Error("!?"); } } loadCache(gjkCache) { let _this = this.dir; let v = gjkCache.prevClosestDir; _this.x = v.x; _this.y = v.y; _this.z = v.z; } saveCache(gjkCache) { let _this = gjkCache.prevClosestDir; let v = this.closest; _this.x = v.x; _this.y = v.y; _this.z = v.z; _this.x = -_this.x; _this.y = -_this.y; _this.z = -_this.z; } shrinkSimplex(vertexBits) { this.simplexSize = vertexBits; this.simplexSize = (this.simplexSize & 5) + (this.simplexSize >> 1 & 5); this.simplexSize = (this.simplexSize & 3) + (this.simplexSize >> 2 & 3); switch(vertexBits) { case 2: let _this = this.s[0]; let v = this.s[1]; _this.x = v.x; _this.y = v.y; _this.z = v.z; let _this1 = this.w1[0]; let v1 = this.w1[1]; _this1.x = v1.x; _this1.y = v1.y; _this1.z = v1.z; let _this2 = this.w2[0]; let v2 = this.w2[1]; _this2.x = v2.x; _this2.y = v2.y; _this2.z = v2.z; break; case 4: let _this3 = this.s[0]; let v3 = this.s[2]; _this3.x = v3.x; _this3.y = v3.y; _this3.z = v3.z; let _this4 = this.w1[0]; let v4 = this.w1[2]; _this4.x = v4.x; _this4.y = v4.y; _this4.z = v4.z; let _this5 = this.w2[0]; let v5 = this.w2[2]; _this5.x = v5.x; _this5.y = v5.y; _this5.z = v5.z; break; case 5: let _this6 = this.s[1]; let v6 = this.s[2]; _this6.x = v6.x; _this6.y = v6.y; _this6.z = v6.z; let _this7 = this.w1[1]; let v7 = this.w1[2]; _this7.x = v7.x; _this7.y = v7.y; _this7.z = v7.z; let _this8 = this.w2[1]; let v8 = this.w2[2]; _this8.x = v8.x; _this8.y = v8.y; _this8.z = v8.z; break; case 6: let _this9 = this.s[0]; let v9 = this.s[2]; _this9.x = v9.x; _this9.y = v9.y; _this9.z = v9.z; let _this10 = this.w1[0]; let v10 = this.w1[2]; _this10.x = v10.x; _this10.y = v10.y; _this10.z = v10.z; let _this11 = this.w2[0]; let v11 = this.w2[2]; _this11.x = v11.x; _this11.y = v11.y; _this11.z = v11.z; break; case 8: let _this12 = this.s[0]; let v12 = this.s[3]; _this12.x = v12.x; _this12.y = v12.y; _this12.z = v12.z; let _this13 = this.w1[0]; let v13 = this.w1[3]; _this13.x = v13.x; _this13.y = v13.y; _this13.z = v13.z; let _this14 = this.w2[0]; let v14 = this.w2[3]; _this14.x = v14.x; _this14.y = v14.y; _this14.z = v14.z; break; case 9: let _this15 = this.s[1]; let v15 = this.s[3]; _this15.x = v15.x; _this15.y = v15.y; _this15.z = v15.z; let _this16 = this.w1[1]; let v16 = this.w1[3]; _this16.x = v16.x; _this16.y = v16.y; _this16.z = v16.z; let _this17 = this.w2[1]; let v17 = this.w2[3]; _this17.x = v17.x; _this17.y = v17.y; _this17.z = v17.z; break; case 10: let _this18 = this.s[0]; let v18 = this.s[3]; _this18.x = v18.x; _this18.y = v18.y; _this18.z = v18.z; let _this19 = this.w1[0]; let v19 = this.w1[3]; _this19.x = v19.x; _this19.y = v19.y; _this19.z = v19.z; let _this20 = this.w2[0]; let v20 = this.w2[3]; _this20.x = v20.x; _this20.y = v20.y; _this20.z = v20.z; break; case 11: let _this21 = this.s[2]; let v21 = this.s[3]; _this21.x = v21.x; _this21.y = v21.y; _this21.z = v21.z; let _this22 = this.w1[2]; let v22 = this.w1[3]; _this22.x = v22.x; _this22.y = v22.y; _this22.z = v22.z; let _this23 = this.w2[2]; let v23 = this.w2[3]; _this23.x = v23.x; _this23.y = v23.y; _this23.z = v23.z; break; case 12: let _this24 = this.s[0]; let v24 = this.s[2]; _this24.x = v24.x; _this24.y = v24.y; _this24.z = v24.z; let _this25 = this.w1[0]; let v25 = this.w1[2]; _this25.x = v25.x; _this25.y = v25.y; _this25.z = v25.z; let _this26 = this.w2[0]; let v26 = this.w2[2]; _this26.x = v26.x; _this26.y = v26.y; _this26.z = v26.z; let _this27 = this.s[1]; let v27 = this.s[3]; _this27.x = v27.x; _this27.y = v27.y; _this27.z = v27.z; let _this28 = this.w1[1]; let v28 = this.w1[3]; _this28.x = v28.x; _this28.y = v28.y; _this28.z = v28.z; let _this29 = this.w2[1]; let v29 = this.w2[3]; _this29.x = v29.x; _this29.y = v29.y; _this29.z = v29.z; break; case 13: let _this30 = this.s[1]; let v30 = this.s[3]; _this30.x = v30.x; _this30.y = v30.y; _this30.z = v30.z; let _this31 = this.w1[1]; let v31 = this.w1[3]; _this31.x = v31.x; _this31.y = v31.y; _this31.z = v31.z; let _this32 = this.w2[1]; let v32 = this.w2[3]; _this32.x = v32.x; _this32.y = v32.y; _this32.z = v32.z; break; case 14: let _this33 = this.s[0]; let v33 = this.s[3]; _this33.x = v33.x; _this33.y = v33.y; _this33.z = v33.z; let _this34 = this.w1[0]; let v34 = this.w1[3]; _this34.x = v34.x; _this34.y = v34.y; _this34.z = v34.z; let _this35 = this.w2[0]; let v35 = this.w2[3]; _this35.x = v35.x; _this35.y = v35.y; _this35.z = v35.z; break; } } computeWitnessPoint1(addMargin) { let tmpX; let tmpY; let tmpZ; let idirX; let idirY; let idirZ; let v = this.dir; idirX = v.x; idirY = v.y; idirZ = v.z; let ldir1X; let ldir1Y; let ldir1Z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this.tf1._rotation00 * idirX + this.tf1._rotation10 * idirY + this.tf1._rotation20 * idirZ; __tmp__Y = this.tf1._rotation01 * idirX + this.tf1._rotation11 * idirY + this.tf1._rotation21 * idirZ; __tmp__Z = this.tf1._rotation02 * idirX + this.tf1._rotation12 * idirY + this.tf1._rotation22 * idirZ; ldir1X = __tmp__X; ldir1Y = __tmp__Y; ldir1Z = __tmp__Z; let iw1X; let iw1Y; let iw1Z; let v1 = this.dir; v1.x = ldir1X; v1.y = ldir1Y; v1.z = ldir1Z; this.c1.computeLocalSupportingVertex(this.dir,this.w1[this.simplexSize]); if(addMargin) { let _this = this.dir; let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z); if(invLen > 0) { invLen = 1 / invLen; } _this.x *= invLen; _this.y *= invLen; _this.z *= invLen; let _this1 = this.w1[this.simplexSize]; let v = this.dir; let s = this.c1._gjkMargin; _this1.x += v.x * s; _this1.y += v.y * s; _this1.z += v.z * s; } let v2 = this.w1[this.simplexSize]; tmpX = v2.x; tmpY = v2.y; tmpZ = v2.z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = this.tf1._rotation00 * tmpX + this.tf1._rotation01 * tmpY + this.tf1._rotation02 * tmpZ; __tmp__Y1 = this.tf1._rotation10 * tmpX + this.tf1._rotation11 * tmpY + this.tf1._rotation12 * tmpZ; __tmp__Z1 = this.tf1._rotation20 * tmpX + this.tf1._rotation21 * tmpY + this.tf1._rotation22 * tmpZ; iw1X = __tmp__X1; iw1Y = __tmp__Y1; iw1Z = __tmp__Z1; iw1X += this.tf1._positionX; iw1Y += this.tf1._positionY; iw1Z += this.tf1._positionZ; let v3 = this.w1[this.simplexSize]; v3.x = iw1X; v3.y = iw1Y; v3.z = iw1Z; let v4 = this.dir; v4.x = idirX; v4.y = idirY; v4.z = idirZ; } computeWitnessPoint2(addMargin) { let tmpX; let tmpY; let tmpZ; let idirX; let idirY; let idirZ; let v = this.dir; idirX = v.x; idirY = v.y; idirZ = v.z; let ldir2X; let ldir2Y; let ldir2Z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this.tf2._rotation00 * idirX + this.tf2._rotation10 * idirY + this.tf2._rotation20 * idirZ; __tmp__Y = this.tf2._rotation01 * idirX + this.tf2._rotation11 * idirY + this.tf2._rotation21 * idirZ; __tmp__Z = this.tf2._rotation02 * idirX + this.tf2._rotation12 * idirY + this.tf2._rotation22 * idirZ; ldir2X = __tmp__X; ldir2Y = __tmp__Y; ldir2Z = __tmp__Z; ldir2X = -ldir2X; ldir2Y = -ldir2Y; ldir2Z = -ldir2Z; let iw2X; let iw2Y; let iw2Z; let v1 = this.dir; v1.x = ldir2X; v1.y = ldir2Y; v1.z = ldir2Z; this.c2.computeLocalSupportingVertex(this.dir,this.w2[this.simplexSize]); if(addMargin) { let _this = this.dir; let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z); if(invLen > 0) { invLen = 1 / invLen; } _this.x *= invLen; _this.y *= invLen; _this.z *= invLen; let _this1 = this.w2[this.simplexSize]; let v = this.dir; let s = this.c2._gjkMargin; _this1.x += v.x * s; _this1.y += v.y * s; _this1.z += v.z * s; } let v2 = this.w2[this.simplexSize]; tmpX = v2.x; tmpY = v2.y; tmpZ = v2.z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = this.tf2._rotation00 * tmpX + this.tf2._rotation01 * tmpY + this.tf2._rotation02 * tmpZ; __tmp__Y1 = this.tf2._rotation10 * tmpX + this.tf2._rotation11 * tmpY + this.tf2._rotation12 * tmpZ; __tmp__Z1 = this.tf2._rotation20 * tmpX + this.tf2._rotation21 * tmpY + this.tf2._rotation22 * tmpZ; iw2X = __tmp__X1; iw2Y = __tmp__Y1; iw2Z = __tmp__Z1; iw2X += this.tf2._positionX; iw2Y += this.tf2._positionY; iw2Z += this.tf2._positionZ; let v3 = this.w2[this.simplexSize]; v3.x = iw2X; v3.y = iw2Y; v3.z = iw2Z; let v4 = this.dir; v4.x = idirX; v4.y = idirY; v4.z = idirZ; } pointToTetrahedron() { let _g = 0; while(_g < 3) { let _this = this.dir; let v = this.baseDirs[_g++]; _this.x = v.x; _this.y = v.y; _this.z = v.z; this.computeWitnessPoint1(false); this.computeWitnessPoint2(false); let _this1 = this.s[this.simplexSize]; let v1 = this.w1[this.simplexSize]; _this1.x = v1.x; _this1.y = v1.y; _this1.z = v1.z; let v2 = this.w2[this.simplexSize]; _this1.x -= v2.x; _this1.y -= v2.y; _this1.z -= v2.z; this.simplexSize++; this.lineToTetrahedron(); if(this.simplexSize == 4) { break; } this.simplexSize--; let _this2 = this.dir; _this2.x = -_this2.x; _this2.y = -_this2.y; _this2.z = -_this2.z; this.computeWitnessPoint1(false); this.computeWitnessPoint2(false); let _this3 = this.s[this.simplexSize]; let v3 = this.w1[this.simplexSize]; _this3.x = v3.x; _this3.y = v3.y; _this3.z = v3.z; let v4 = this.w2[this.simplexSize]; _this3.x -= v4.x; _this3.y -= v4.y; _this3.z -= v4.z; this.simplexSize++; this.lineToTetrahedron(); if(this.simplexSize == 4) { break; } this.simplexSize--; } } lineToTetrahedron() { let oldDirX; let oldDirY; let oldDirZ; let v = this.dir; oldDirX = v.x; oldDirY = v.y; oldDirZ = v.z; let s0X; let s0Y; let s0Z; let s1X; let s1Y; let s1Z; let lineDirX; let lineDirY; let lineDirZ; let v1 = this.s[0]; s0X = v1.x; s0Y = v1.y; s0Z = v1.z; let v2 = this.s[1]; s1X = v2.x; s1Y = v2.y; s1Z = v2.z; lineDirX = s0X - s1X; lineDirY = s0Y - s1Y; lineDirZ = s0Z - s1Z; let _g = 0; while(_g < 3) { let baseDirX; let baseDirY; let baseDirZ; let v = this.baseDirs[_g++]; baseDirX = v.x; baseDirY = v.y; baseDirZ = v.z; let newDirX; let newDirY; let newDirZ; newDirX = lineDirY * baseDirZ - lineDirZ * baseDirY; newDirY = lineDirZ * baseDirX - lineDirX * baseDirZ; newDirZ = lineDirX * baseDirY - lineDirY * baseDirX; let v1 = this.dir; v1.x = newDirX; v1.y = newDirY; v1.z = newDirZ; this.computeWitnessPoint1(false); this.computeWitnessPoint2(false); let _this = this.s[this.simplexSize]; let v2 = this.w1[this.simplexSize]; _this.x = v2.x; _this.y = v2.y; _this.z = v2.z; let v3 = this.w2[this.simplexSize]; _this.x -= v3.x; _this.y -= v3.y; _this.z -= v3.z; this.simplexSize++; this.triangleToTetrahedron(); if(this.simplexSize == 4) { break; } this.simplexSize--; let _this1 = this.dir; _this1.x = -_this1.x; _this1.y = -_this1.y; _this1.z = -_this1.z; this.computeWitnessPoint1(false); this.computeWitnessPoint2(false); let _this2 = this.s[this.simplexSize]; let v4 = this.w1[this.simplexSize]; _this2.x = v4.x; _this2.y = v4.y; _this2.z = v4.z; let v5 = this.w2[this.simplexSize]; _this2.x -= v5.x; _this2.y -= v5.y; _this2.z -= v5.z; this.simplexSize++; this.triangleToTetrahedron(); if(this.simplexSize == 4) { break; } this.simplexSize--; } let v3 = this.dir; v3.x = oldDirX; v3.y = oldDirY; v3.z = oldDirZ; } triangleToTetrahedron() { let oldDirX; let oldDirY; let oldDirZ; let v = this.dir; oldDirX = v.x; oldDirY = v.y; oldDirZ = v.z; while(true) { let s0X; let s0Y; let s0Z; let s1X; let s1Y; let s1Z; let s2X; let s2Y; let s2Z; let s01X; let s01Y; let s01Z; let s02X; let s02Y; let s02Z; let v = this.s[0]; s0X = v.x; s0Y = v.y; s0Z = v.z; let v1 = this.s[1]; s1X = v1.x; s1Y = v1.y; s1Z = v1.z; let v2 = this.s[2]; s2X = v2.x; s2Y = v2.y; s2Z = v2.z; s01X = s1X - s0X; s01Y = s1Y - s0Y; s01Z = s1Z - s0Z; s02X = s2X - s0X; s02Y = s2Y - s0Y; s02Z = s2Z - s0Z; let nX; let nY; let nZ; nX = s01Y * s02Z - s01Z * s02Y; nY = s01Z * s02X - s01X * s02Z; nZ = s01X * s02Y - s01Y * s02X; let v3 = this.dir; v3.x = nX; v3.y = nY; v3.z = nZ; this.computeWitnessPoint1(false); this.computeWitnessPoint2(false); let _this = this.s[this.simplexSize]; let v4 = this.w1[this.simplexSize]; _this.x = v4.x; _this.y = v4.y; _this.z = v4.z; let v5 = this.w2[this.simplexSize]; _this.x -= v5.x; _this.y -= v5.y; _this.z -= v5.z; this.simplexSize++; if(this.isValidTetrahedron()) { break; } this.simplexSize--; let _this1 = this.dir; _this1.x = -_this1.x; _this1.y = -_this1.y; _this1.z = -_this1.z; this.computeWitnessPoint1(false); this.computeWitnessPoint2(false); let _this2 = this.s[this.simplexSize]; let v6 = this.w1[this.simplexSize]; _this2.x = v6.x; _this2.y = v6.y; _this2.z = v6.z; let v7 = this.w2[this.simplexSize]; _this2.x -= v7.x; _this2.y -= v7.y; _this2.z -= v7.z; this.simplexSize++; if(this.isValidTetrahedron()) { break; } this.simplexSize--; break; } let v1 = this.dir; v1.x = oldDirX; v1.y = oldDirY; v1.z = oldDirZ; } isValidTetrahedron() { let e10 = this.s[2].x - this.s[0].x; let e11 = this.s[2].y - this.s[0].y; let e12 = this.s[2].z - this.s[0].z; let e20 = this.s[3].x - this.s[0].x; let e21 = this.s[3].y - this.s[0].y; let e22 = this.s[3].z - this.s[0].z; let det = (this.s[1].x - this.s[0].x) * (e11 * e22 - e12 * e21) - (this.s[1].y - this.s[0].y) * (e10 * e22 - e12 * e20) + (this.s[1].z - this.s[0].z) * (e10 * e21 - e11 * e20); if(!(det > 1e-12)) { return det < -1e-12; } else { return true; } } computeDepth(convex1,convex2,tf1,tf2,initialPolyhedron,initialPolyhedron1,initialPolyhedron2) { let _this = this.polyhedron; while(_this._numTriangles > 0) { let t = _this._triangleList; _this._numTriangles--; let prev = t._prev; let next = t._next; if(prev != null) { prev._next = next; } if(next != null) { next._prev = prev; } if(t == _this._triangleList) { _this._triangleList = _this._triangleList._next; } if(t == _this._triangleListLast) { _this._triangleListLast = _this._triangleListLast._prev; } t._next = null; t._prev = null; t.removeReferences(); t._next = _this._trianglePool; _this._trianglePool = t; } while(_this._numVertices > 0) { let v = _this._vertices[--_this._numVertices]; v.removeReferences(); v._next = _this._vertexPool; _this._vertexPool = v; } let tmp = this.polyhedron; let _this1 = this.polyhedron; let first = _this1._vertexPool; if(first != null) { _this1._vertexPool = first._next; first._next = null; } else { first = new oimo.collision.narrowphase.detector.gjkepa.EpaVertex(); } let tmp1 = first.init(initialPolyhedron[0],initialPolyhedron1[0],initialPolyhedron2[0]); let _this2 = this.polyhedron; let first1 = _this2._vertexPool; if(first1 != null) { _this2._vertexPool = first1._next; first1._next = null; } else { first1 = new oimo.collision.narrowphase.detector.gjkepa.EpaVertex(); } let tmp2 = first1.init(initialPolyhedron[1],initialPolyhedron1[1],initialPolyhedron2[1]); let _this3 = this.polyhedron; let first2 = _this3._vertexPool; if(first2 != null) { _this3._vertexPool = first2._next; first2._next = null; } else { first2 = new oimo.collision.narrowphase.detector.gjkepa.EpaVertex(); } let tmp3 = first2.init(initialPolyhedron[2],initialPolyhedron1[2],initialPolyhedron2[2]); let _this4 = this.polyhedron; let first3 = _this4._vertexPool; if(first3 != null) { _this4._vertexPool = first3._next; first3._next = null; } else { first3 = new oimo.collision.narrowphase.detector.gjkepa.EpaVertex(); } if(!tmp._init(tmp1,tmp2,tmp3,first3.init(initialPolyhedron[3],initialPolyhedron1[3],initialPolyhedron2[3]))) { return oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_FAILED_TO_INIT; } this.simplexSize = 0; let supportingVertex = this.s[0]; let witness1 = this.w1[0]; let witness2 = this.w2[0]; let count = 0; while(count < 40) { let f = this.polyhedron._triangleList; let mind = 1e65536; let minf = null; while(f != null) { if(f._distanceSq < mind) { mind = f._distanceSq; minf = f; } f = f._next; } let face = minf; let _this = this.dir; let v = face._normal; _this.x = v.x; _this.y = v.y; _this.z = v.z; let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z); if(invLen > 0) { invLen = 1 / invLen; } _this.x *= invLen; _this.y *= invLen; _this.z *= invLen; this.computeWitnessPoint1(false); this.computeWitnessPoint2(false); let _this1 = this.s[this.simplexSize]; let v1 = this.w1[this.simplexSize]; _this1.x = v1.x; _this1.y = v1.y; _this1.z = v1.z; let v2 = this.w2[this.simplexSize]; _this1.x -= v2.x; _this1.y -= v2.y; _this1.z -= v2.z; let v0 = face._vertices[0]; let v11 = face._vertices[1]; let v21 = face._vertices[2]; let _this2 = v0.v; let v3 = this.dir; let v4 = this.dir; if(supportingVertex.x * v4.x + supportingVertex.y * v4.y + supportingVertex.z * v4.z - (_this2.x * v3.x + _this2.y * v3.y + _this2.z * v3.z) < 1e-6 || count == 39) { let _this = this.closest; let v = this.dir; _this.x = v.x; _this.y = v.y; _this.z = v.z; let _this1 = this.dir; let v1 = v0.v; let _this2 = this.dir; let s = (_this1.x * v1.x + _this1.y * v1.y + _this1.z * v1.z) / (_this2.x * _this2.x + _this2.y * _this2.y + _this2.z * _this2.z); _this.x *= s; _this.y *= s; _this.z *= s; let cX; let cY; let cZ; let v2 = this.closest; cX = v2.x; cY = v2.y; cZ = v2.z; let s0X; let s0Y; let s0Z; let w10X; let w10Y; let w10Z; let w20X; let w20Y; let w20Z; let s1X; let s1Y; let s1Z; let w11X; let w11Y; let w11Z; let w21X; let w21Y; let w21Z; let s2X; let s2Y; let s2Z; let w12X; let w12Y; let w12Z; let w22X; let w22Y; let w22Z; let v3 = v0.v; s0X = v3.x; s0Y = v3.y; s0Z = v3.z; let v4 = v0.w1; w10X = v4.x; w10Y = v4.y; w10Z = v4.z; let v5 = v0.w2; w20X = v5.x; w20Y = v5.y; w20Z = v5.z; let v6 = v11.v; s1X = v6.x; s1Y = v6.y; s1Z = v6.z; let v7 = v11.w1; w11X = v7.x; w11Y = v7.y; w11Z = v7.z; let v8 = v11.w2; w21X = v8.x; w21Y = v8.y; w21Z = v8.z; let v9 = v21.v; s2X = v9.x; s2Y = v9.y; s2Z = v9.z; let v10 = v21.w1; w12X = v10.x; w12Y = v10.y; w12Z = v10.z; let v12 = v21.w2; w22X = v12.x; w22Y = v12.y; w22Z = v12.z; let s01X; let s01Y; let s01Z; let s02X; let s02Y; let s02Z; let s0cX; let s0cY; let s0cZ; s01X = s1X - s0X; s01Y = s1Y - s0Y; s01Z = s1Z - s0Z; s02X = s2X - s0X; s02Y = s2Y - s0Y; s02Z = s2Z - s0Z; s0cX = cX - s0X; s0cY = cY - s0Y; s0cZ = cZ - s0Z; let d11 = s01X * s01X + s01Y * s01Y + s01Z * s01Z; let d12 = s01X * s02X + s01Y * s02Y + s01Z * s02Z; let d22 = s02X * s02X + s02Y * s02Y + s02Z * s02Z; let d1c = s01X * s0cX + s01Y * s0cY + s01Z * s0cZ; let d2c = s02X * s0cX + s02Y * s0cY + s02Z * s0cZ; let invDet = d11 * d22 - d12 * d12; if(invDet != 0) { invDet = 1 / invDet; } let s1 = (d1c * d22 - d2c * d12) * invDet; let t = (-d1c * d12 + d2c * d11) * invDet; let diffX; let diffY; let diffZ; let cp1X; let cp1Y; let cp1Z; let cp2X; let cp2Y; let cp2Z; diffX = w11X - w10X; diffY = w11Y - w10Y; diffZ = w11Z - w10Z; cp1X = w10X + diffX * s1; cp1Y = w10Y + diffY * s1; cp1Z = w10Z + diffZ * s1; diffX = w12X - w10X; diffY = w12Y - w10Y; diffZ = w12Z - w10Z; cp1X += diffX * t; cp1Y += diffY * t; cp1Z += diffZ * t; diffX = w21X - w20X; diffY = w21Y - w20Y; diffZ = w21Z - w20Z; cp2X = w20X + diffX * s1; cp2Y = w20Y + diffY * s1; cp2Z = w20Z + diffZ * s1; diffX = w22X - w20X; diffY = w22Y - w20Y; diffZ = w22Z - w20Z; cp2X += diffX * t; cp2Y += diffY * t; cp2Z += diffZ * t; let v13 = this.closestPoint1; v13.x = cp1X; v13.y = cp1Y; v13.z = cp1Z; let v14 = this.closestPoint2; v14.x = cp2X; v14.y = cp2Y; v14.z = cp2Z; let _this3 = this.closest; this.depth = Math.sqrt(_this3.x * _this3.x + _this3.y * _this3.y + _this3.z * _this3.z); return oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.SUCCEEDED; } let _this3 = this.polyhedron; let first = _this3._vertexPool; if(first != null) { _this3._vertexPool = first._next; first._next = null; } else { first = new oimo.collision.narrowphase.detector.gjkepa.EpaVertex(); } let epaVertex = first.init(supportingVertex,witness1,witness2); if(!this.polyhedron._addVertex(epaVertex,face)) { return oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_FAILED_TO_ADD_VERTEX; } ++count; } return oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_DID_NOT_CONVERGE; } computeClosestPoints(c1,c2,tf1,tf2,cache) { return this.computeClosestPointsImpl(c1,c2,tf1,tf2,cache,true); } computeDistance(c1,c2,tf1,tf2,cache) { return this.computeClosestPointsImpl(c1,c2,tf1,tf2,cache,false); } convexCast(c1,c2,tf1,tf2,tl1,tl2,hit) { return this.convexCastImpl(c1,c2,tf1,tf2,tl1,tl2,hit); } rayCast(c,tf,begin,end,hit) { let tf1 = this.tempTransform; tf1._positionX = begin.x; tf1._positionY = begin.y; tf1._positionZ = begin.z; let tl1 = this.tl1; let tl2 = this.tl2; tl1.x = end.x; tl1.y = end.y; tl1.z = end.z; tl1.x -= begin.x; tl1.y -= begin.y; tl1.z -= begin.z; tl2.zero(); return this.convexCastImpl(null,c,tf1,tf,tl1,tl2,hit); } static getInstance() { return oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance; } } oimo.collision.narrowphase.detector.gjkepa.GjkEpaLog = class oimo_collision_narrowphase_detector_gjkepa_GjkEpaLog { } oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState = class oimo_collision_narrowphase_detector_gjkepa_GjkEpaResultState { } oimo.collision.narrowphase.detector.gjkepa.SimplexUtil = class oimo_collision_narrowphase_detector_gjkepa_SimplexUtil { static projectOrigin2(vec1,vec2,out) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; return 1; } if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; return 2; } let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; return 3; } static projectOrigin3(vec1,vec2,vec3,out) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; v3X = vec3.x; v3Y = vec3.y; v3Z = vec3.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } mini = b; mind = out.x * out.x + out.y * out.y + out.z * out.z; minvX = out.x; minvY = out.y; minvZ = out.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec2.x; v1Y = vec2.y; v1Z = vec2.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = out.x; minvY = out.y; minvZ = out.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 2) << 1; mind = d; minvX = out.x; minvY = out.y; minvZ = out.z; } } if(mind > 0) { out.x = minvX; out.y = minvY; out.z = minvZ; return mini; } let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX = nX * l2; minvY = nY * l2; minvZ = nZ * l2; out.x = minvX; out.y = minvY; out.z = minvZ; return 7; } static projectOrigin4(vec1,vec2,vec3,vec4,out) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v4X; let v4Y; let v4Z; let v12X; let v12Y; let v12Z; let v13X; let v13Y; let v13Z; let v14X; let v14Y; let v14Z; let v23X; let v23Y; let v23Z; let v24X; let v24Y; let v24Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; v3X = vec3.x; v3Y = vec3.y; v3Z = vec3.z; v4X = vec4.x; v4Y = vec4.y; v4Z = vec4.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v13X = v3X - v1X; v13Y = v3Y - v1Y; v13Z = v3Z - v1Z; v14X = v4X - v1X; v14Y = v4Y - v1Y; v14Z = v4Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v24X = v4X - v2X; v24Y = v4Y - v2Y; v24Z = v4Z - v2Z; let n123X; let n123Y; let n123Z; let n134X; let n134Y; let n134Z; let n142X; let n142Y; let n142Z; let n243X; let n243Y; let n243Z; n123X = v12Y * v13Z - v12Z * v13Y; n123Y = v12Z * v13X - v12X * v13Z; n123Z = v12X * v13Y - v12Y * v13X; n134X = v13Y * v14Z - v13Z * v14Y; n134Y = v13Z * v14X - v13X * v14Z; n134Z = v13X * v14Y - v13Y * v14X; n142X = v14Y * v12Z - v14Z * v12Y; n142Y = v14Z * v12X - v14X * v12Z; n142Z = v14X * v12Y - v14Y * v12X; n243X = v24Y * v23Z - v24Z * v23Y; n243Y = v24Z * v23X - v24X * v23Z; n243Z = v24X * v23Y - v24Y * v23X; let sign = v12X * n243X + v12Y * n243Y + v12Z * n243Z > 0 ? 1 : -1; let mind = -1; let minvX; let minvY; let minvZ; let mini = 0; minvX = 0; minvY = 0; minvZ = 0; if((v1X * n123X + v1Y * n123Y + v1Z * n123Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; v3X = vec3.x; v3Y = vec3.y; v3Z = vec3.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind1 = -1; let minvX1; let minvY1; let minvZ1; let mini1 = 0; minvX1 = 0; minvY1 = 0; minvZ1 = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } mini1 = b; mind1 = out.x * out.x + out.y * out.y + out.z * out.z; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec2.x; v1Y = vec2.y; v1Z = vec2.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind1 < 0 || d < mind1) { mini1 = b << 1; mind1 = d; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind1 < 0 || d < mind1) { mini1 = b & 1 | (b & 2) << 1; mind1 = d; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } } let b; if(mind1 > 0) { out.x = minvX1; out.y = minvY1; out.z = minvZ1; b = mini1; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX1 = nX * l2; minvY1 = nY * l2; minvZ1 = nZ * l2; out.x = minvX1; out.y = minvY1; out.z = minvZ1; b = 7; } mini = b; mind = out.x * out.x + out.y * out.y + out.z * out.z; minvX = out.x; minvY = out.y; minvZ = out.z; } if((v1X * n134X + v1Y * n134Y + v1Z * n134Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; v3X = vec4.x; v3Y = vec4.y; v3Z = vec4.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind1 = -1; let minvX1; let minvY1; let minvZ1; let mini1 = 0; minvX1 = 0; minvY1 = 0; minvZ1 = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } mini1 = b; mind1 = out.x * out.x + out.y * out.y + out.z * out.z; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec3.x; v1Y = vec3.y; v1Z = vec3.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind1 < 0 || d < mind1) { mini1 = b << 1; mind1 = d; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind1 < 0 || d < mind1) { mini1 = b & 1 | (b & 2) << 1; mind1 = d; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } } let b; if(mind1 > 0) { out.x = minvX1; out.y = minvY1; out.z = minvZ1; b = mini1; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX1 = nX * l2; minvY1 = nY * l2; minvZ1 = nZ * l2; out.x = minvX1; out.y = minvY1; out.z = minvZ1; b = 7; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind < 0 || d < mind) { mini = b & 1 | (b & 6) << 1; mind = d; minvX = out.x; minvY = out.y; minvZ = out.z; } } if((v1X * n142X + v1Y * n142Y + v1Z * n142Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; v3X = vec4.x; v3Y = vec4.y; v3Z = vec4.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind1 = -1; let minvX1; let minvY1; let minvZ1; let mini1 = 0; minvX1 = 0; minvY1 = 0; minvZ1 = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec2.x; v2Y = vec2.y; v2Z = vec2.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } mini1 = b; mind1 = out.x * out.x + out.y * out.y + out.z * out.z; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec2.x; v1Y = vec2.y; v1Z = vec2.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind1 < 0 || d < mind1) { mini1 = b << 1; mind1 = d; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec1.x; v1Y = vec1.y; v1Z = vec1.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind1 < 0 || d < mind1) { mini1 = b & 1 | (b & 2) << 1; mind1 = d; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } } let b; if(mind1 > 0) { out.x = minvX1; out.y = minvY1; out.z = minvZ1; b = mini1; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX1 = nX * l2; minvY1 = nY * l2; minvZ1 = nZ * l2; out.x = minvX1; out.y = minvY1; out.z = minvZ1; b = 7; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind < 0 || d < mind) { mini = b & 3 | (b & 4) << 1; mind = d; minvX = out.x; minvY = out.y; minvZ = out.z; } } if((v2X * n243X + v2Y * n243Y + v2Z * n243Z) * sign < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; let v3X; let v3Y; let v3Z; let v12X; let v12Y; let v12Z; let v23X; let v23Y; let v23Z; let v31X; let v31Y; let v31Z; v1X = vec2.x; v1Y = vec2.y; v1Z = vec2.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; v3X = vec4.x; v3Y = vec4.y; v3Z = vec4.z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; v23X = v3X - v2X; v23Y = v3Y - v2Y; v23Z = v3Z - v2Z; v31X = v1X - v3X; v31Y = v1Y - v3Y; v31Z = v1Z - v3Z; let nX; let nY; let nZ; nX = v12Y * v23Z - v12Z * v23Y; nY = v12Z * v23X - v12X * v23Z; nZ = v12X * v23Y - v12Y * v23X; let n12X; let n12Y; let n12Z; let n23X; let n23Y; let n23Z; let n31X; let n31Y; let n31Z; n12X = v12Y * nZ - v12Z * nY; n12Y = v12Z * nX - v12X * nZ; n12Z = v12X * nY - v12Y * nX; n23X = v23Y * nZ - v23Z * nY; n23Y = v23Z * nX - v23X * nZ; n23Z = v23X * nY - v23Y * nX; n31X = v31Y * nZ - v31Z * nY; n31Y = v31Z * nX - v31X * nZ; n31Z = v31X * nY - v31Y * nX; let mind1 = -1; let minvX1; let minvY1; let minvZ1; let mini1 = 0; minvX1 = 0; minvY1 = 0; minvZ1 = 0; if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec2.x; v1Y = vec2.y; v1Z = vec2.z; v2X = vec3.x; v2Y = vec3.y; v2Z = vec3.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } mini1 = b; mind1 = out.x * out.x + out.y * out.y + out.z * out.z; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec3.x; v1Y = vec3.y; v1Z = vec3.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind1 < 0 || d < mind1) { mini1 = b << 1; mind1 = d; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } } if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) { let v1X; let v1Y; let v1Z; let v2X; let v2Y; let v2Z; v1X = vec2.x; v1Y = vec2.y; v1Z = vec2.z; v2X = vec4.x; v2Y = vec4.y; v2Z = vec4.z; let v12X; let v12Y; let v12Z; v12X = v2X - v1X; v12Y = v2Y - v1Y; v12Z = v2Z - v1Z; let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z; t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z); let b; if(t < 0) { out.x = v1X; out.y = v1Y; out.z = v1Z; b = 1; } else if(t > 1) { out.x = v2X; out.y = v2Y; out.z = v2Z; b = 2; } else { let pX; let pY; let pZ; pX = v1X + v12X * t; pY = v1Y + v12Y * t; pZ = v1Z + v12Z * t; out.x = pX; out.y = pY; out.z = pZ; b = 3; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind1 < 0 || d < mind1) { mini1 = b & 1 | (b & 2) << 1; mind1 = d; minvX1 = out.x; minvY1 = out.y; minvZ1 = out.z; } } let b; if(mind1 > 0) { out.x = minvX1; out.y = minvY1; out.z = minvZ1; b = mini1; } else { let l = nX * nX + nY * nY + nZ * nZ; if(l > 0) { l = 1 / Math.sqrt(l); } nX *= l; nY *= l; nZ *= l; let l2 = nX * nX + nY * nY + nZ * nZ; l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2; minvX1 = nX * l2; minvY1 = nY * l2; minvZ1 = nZ * l2; out.x = minvX1; out.y = minvY1; out.z = minvZ1; b = 7; } let d = out.x * out.x + out.y * out.y + out.z * out.z; if(mind < 0 || d < mind) { mini = b << 1; mind = d; minvX = out.x; minvY = out.y; minvZ = out.z; } } if(mind > 0) { out.x = minvX; out.y = minvY; out.z = minvZ; return mini; } out.zero(); return 15; } } oimo.common.Mat3 = class oimo_common_Mat3 { constructor(e00,e01,e02,e10,e11,e12,e20,e21,e22) { if(e22 == null) { e22 = 1; } if(e21 == null) { e21 = 0; } if(e20 == null) { e20 = 0; } if(e12 == null) { e12 = 0; } if(e11 == null) { e11 = 1; } if(e10 == null) { e10 = 0; } if(e02 == null) { e02 = 0; } if(e01 == null) { e01 = 0; } if(e00 == null) { e00 = 1; } this.e00 = e00; this.e01 = e01; this.e02 = e02; this.e10 = e10; this.e11 = e11; this.e12 = e12; this.e20 = e20; this.e21 = e21; this.e22 = e22; oimo.common.Mat3.numCreations++; } init(e00,e01,e02,e10,e11,e12,e20,e21,e22) { this.e00 = e00; this.e01 = e01; this.e02 = e02; this.e10 = e10; this.e11 = e11; this.e12 = e12; this.e20 = e20; this.e21 = e21; this.e22 = e22; return this; } identity() { this.e00 = 1; this.e01 = 0; this.e02 = 0; this.e10 = 0; this.e11 = 1; this.e12 = 0; this.e20 = 0; this.e21 = 0; this.e22 = 1; return this; } add(m) { return new oimo.common.Mat3(this.e00 + m.e00,this.e01 + m.e01,this.e02 + m.e02,this.e10 + m.e10,this.e11 + m.e11,this.e12 + m.e12,this.e20 + m.e20,this.e21 + m.e21,this.e22 + m.e22); } sub(m) { return new oimo.common.Mat3(this.e00 - m.e00,this.e01 - m.e01,this.e02 - m.e02,this.e10 - m.e10,this.e11 - m.e11,this.e12 - m.e12,this.e20 - m.e20,this.e21 - m.e21,this.e22 - m.e22); } scale(s) { return new oimo.common.Mat3(this.e00 * s,this.e01 * s,this.e02 * s,this.e10 * s,this.e11 * s,this.e12 * s,this.e20 * s,this.e21 * s,this.e22 * s); } mul(m) { return new oimo.common.Mat3(this.e00 * m.e00 + this.e01 * m.e10 + this.e02 * m.e20,this.e00 * m.e01 + this.e01 * m.e11 + this.e02 * m.e21,this.e00 * m.e02 + this.e01 * m.e12 + this.e02 * m.e22,this.e10 * m.e00 + this.e11 * m.e10 + this.e12 * m.e20,this.e10 * m.e01 + this.e11 * m.e11 + this.e12 * m.e21,this.e10 * m.e02 + this.e11 * m.e12 + this.e12 * m.e22,this.e20 * m.e00 + this.e21 * m.e10 + this.e22 * m.e20,this.e20 * m.e01 + this.e21 * m.e11 + this.e22 * m.e21,this.e20 * m.e02 + this.e21 * m.e12 + this.e22 * m.e22); } addEq(m) { this.e00 += m.e00; this.e01 += m.e01; this.e02 += m.e02; this.e10 += m.e10; this.e11 += m.e11; this.e12 += m.e12; this.e20 += m.e20; this.e21 += m.e21; this.e22 += m.e22; return this; } subEq(m) { this.e00 -= m.e00; this.e01 -= m.e01; this.e02 -= m.e02; this.e10 -= m.e10; this.e11 -= m.e11; this.e12 -= m.e12; this.e20 -= m.e20; this.e21 -= m.e21; this.e22 -= m.e22; return this; } scaleEq(s) { this.e00 *= s; this.e01 *= s; this.e02 *= s; this.e10 *= s; this.e11 *= s; this.e12 *= s; this.e20 *= s; this.e21 *= s; this.e22 *= s; return this; } mulEq(m) { let e01 = this.e00 * m.e01 + this.e01 * m.e11 + this.e02 * m.e21; let e02 = this.e00 * m.e02 + this.e01 * m.e12 + this.e02 * m.e22; let e10 = this.e10 * m.e00 + this.e11 * m.e10 + this.e12 * m.e20; let e11 = this.e10 * m.e01 + this.e11 * m.e11 + this.e12 * m.e21; let e12 = this.e10 * m.e02 + this.e11 * m.e12 + this.e12 * m.e22; let e20 = this.e20 * m.e00 + this.e21 * m.e10 + this.e22 * m.e20; let e21 = this.e20 * m.e01 + this.e21 * m.e11 + this.e22 * m.e21; let e22 = this.e20 * m.e02 + this.e21 * m.e12 + this.e22 * m.e22; this.e00 = this.e00 * m.e00 + this.e01 * m.e10 + this.e02 * m.e20; this.e01 = e01; this.e02 = e02; this.e10 = e10; this.e11 = e11; this.e12 = e12; this.e20 = e20; this.e21 = e21; this.e22 = e22; return this; } prependScale(sx,sy,sz) { return new oimo.common.Mat3(this.e00 * sx,this.e01 * sx,this.e02 * sx,this.e10 * sy,this.e11 * sy,this.e12 * sy,this.e20 * sz,this.e21 * sz,this.e22 * sz); } appendScale(sx,sy,sz) { return new oimo.common.Mat3(this.e00 * sx,this.e01 * sy,this.e02 * sz,this.e10 * sx,this.e11 * sy,this.e12 * sz,this.e20 * sx,this.e21 * sy,this.e22 * sz); } prependRotation(rad,axisX,axisY,axisZ) { let s = Math.sin(rad); let c = Math.cos(rad); let c1 = 1 - c; let r00 = axisX * axisX * c1 + c; let r01 = axisX * axisY * c1 - axisZ * s; let r02 = axisX * axisZ * c1 + axisY * s; let r10 = axisY * axisX * c1 + axisZ * s; let r11 = axisY * axisY * c1 + c; let r12 = axisY * axisZ * c1 - axisX * s; let r20 = axisZ * axisX * c1 - axisY * s; let r21 = axisZ * axisY * c1 + axisX * s; let r22 = axisZ * axisZ * c1 + c; return new oimo.common.Mat3(r00 * this.e00 + r01 * this.e10 + r02 * this.e20,r00 * this.e01 + r01 * this.e11 + r02 * this.e21,r00 * this.e02 + r01 * this.e12 + r02 * this.e22,r10 * this.e00 + r11 * this.e10 + r12 * this.e20,r10 * this.e01 + r11 * this.e11 + r12 * this.e21,r10 * this.e02 + r11 * this.e12 + r12 * this.e22,r20 * this.e00 + r21 * this.e10 + r22 * this.e20,r20 * this.e01 + r21 * this.e11 + r22 * this.e21,r20 * this.e02 + r21 * this.e12 + r22 * this.e22); } appendRotation(rad,axisX,axisY,axisZ) { let s = Math.sin(rad); let c = Math.cos(rad); let c1 = 1 - c; let r00 = axisX * axisX * c1 + c; let r01 = axisX * axisY * c1 - axisZ * s; let r02 = axisX * axisZ * c1 + axisY * s; let r10 = axisY * axisX * c1 + axisZ * s; let r11 = axisY * axisY * c1 + c; let r12 = axisY * axisZ * c1 - axisX * s; let r20 = axisZ * axisX * c1 - axisY * s; let r21 = axisZ * axisY * c1 + axisX * s; let r22 = axisZ * axisZ * c1 + c; return new oimo.common.Mat3(this.e00 * r00 + this.e01 * r10 + this.e02 * r20,this.e00 * r01 + this.e01 * r11 + this.e02 * r21,this.e00 * r02 + this.e01 * r12 + this.e02 * r22,this.e10 * r00 + this.e11 * r10 + this.e12 * r20,this.e10 * r01 + this.e11 * r11 + this.e12 * r21,this.e10 * r02 + this.e11 * r12 + this.e12 * r22,this.e20 * r00 + this.e21 * r10 + this.e22 * r20,this.e20 * r01 + this.e21 * r11 + this.e22 * r21,this.e20 * r02 + this.e21 * r12 + this.e22 * r22); } prependScaleEq(sx,sy,sz) { this.e00 *= sx; this.e01 *= sx; this.e02 *= sx; this.e10 *= sy; this.e11 *= sy; this.e12 *= sy; this.e20 *= sz; this.e21 *= sz; this.e22 *= sz; return this; } appendScaleEq(sx,sy,sz) { this.e00 *= sx; this.e01 *= sy; this.e02 *= sz; this.e10 *= sx; this.e11 *= sy; this.e12 *= sz; this.e20 *= sx; this.e21 *= sy; this.e22 *= sz; return this; } prependRotationEq(rad,axisX,axisY,axisZ) { let s = Math.sin(rad); let c = Math.cos(rad); let c1 = 1 - c; let r00 = axisX * axisX * c1 + c; let r01 = axisX * axisY * c1 - axisZ * s; let r02 = axisX * axisZ * c1 + axisY * s; let r10 = axisY * axisX * c1 + axisZ * s; let r11 = axisY * axisY * c1 + c; let r12 = axisY * axisZ * c1 - axisX * s; let r20 = axisZ * axisX * c1 - axisY * s; let r21 = axisZ * axisY * c1 + axisX * s; let r22 = axisZ * axisZ * c1 + c; let e10 = r10 * this.e00 + r11 * this.e10 + r12 * this.e20; let e11 = r10 * this.e01 + r11 * this.e11 + r12 * this.e21; let e12 = r10 * this.e02 + r11 * this.e12 + r12 * this.e22; let e20 = r20 * this.e00 + r21 * this.e10 + r22 * this.e20; let e21 = r20 * this.e01 + r21 * this.e11 + r22 * this.e21; let e22 = r20 * this.e02 + r21 * this.e12 + r22 * this.e22; this.e00 = r00 * this.e00 + r01 * this.e10 + r02 * this.e20; this.e01 = r00 * this.e01 + r01 * this.e11 + r02 * this.e21; this.e02 = r00 * this.e02 + r01 * this.e12 + r02 * this.e22; this.e10 = e10; this.e11 = e11; this.e12 = e12; this.e20 = e20; this.e21 = e21; this.e22 = e22; return this; } appendRotationEq(rad,axisX,axisY,axisZ) { let s = Math.sin(rad); let c = Math.cos(rad); let c1 = 1 - c; let r00 = axisX * axisX * c1 + c; let r01 = axisX * axisY * c1 - axisZ * s; let r02 = axisX * axisZ * c1 + axisY * s; let r10 = axisY * axisX * c1 + axisZ * s; let r11 = axisY * axisY * c1 + c; let r12 = axisY * axisZ * c1 - axisX * s; let r20 = axisZ * axisX * c1 - axisY * s; let r21 = axisZ * axisY * c1 + axisX * s; let r22 = axisZ * axisZ * c1 + c; let e01 = this.e00 * r01 + this.e01 * r11 + this.e02 * r21; let e02 = this.e00 * r02 + this.e01 * r12 + this.e02 * r22; let e11 = this.e10 * r01 + this.e11 * r11 + this.e12 * r21; let e12 = this.e10 * r02 + this.e11 * r12 + this.e12 * r22; let e21 = this.e20 * r01 + this.e21 * r11 + this.e22 * r21; let e22 = this.e20 * r02 + this.e21 * r12 + this.e22 * r22; this.e00 = this.e00 * r00 + this.e01 * r10 + this.e02 * r20; this.e01 = e01; this.e02 = e02; this.e10 = this.e10 * r00 + this.e11 * r10 + this.e12 * r20; this.e11 = e11; this.e12 = e12; this.e20 = this.e20 * r00 + this.e21 * r10 + this.e22 * r20; this.e21 = e21; this.e22 = e22; return this; } transpose() { return new oimo.common.Mat3(this.e00,this.e10,this.e20,this.e01,this.e11,this.e21,this.e02,this.e12,this.e22); } transposeEq() { let e10 = this.e01; let e20 = this.e02; let e21 = this.e12; this.e01 = this.e10; this.e02 = this.e20; this.e10 = e10; this.e12 = this.e21; this.e20 = e20; this.e21 = e21; return this; } determinant() { return this.e00 * (this.e11 * this.e22 - this.e12 * this.e21) - this.e01 * (this.e10 * this.e22 - this.e12 * this.e20) + this.e02 * (this.e10 * this.e21 - this.e11 * this.e20); } trace() { return this.e00 + this.e11 + this.e22; } inverse() { let d00 = this.e11 * this.e22 - this.e12 * this.e21; let d01 = this.e10 * this.e22 - this.e12 * this.e20; let d02 = this.e10 * this.e21 - this.e11 * this.e20; let invDet = this.e00 * d00 - this.e01 * d01 + this.e02 * d02; if(invDet != 0) { invDet = 1 / invDet; } return new oimo.common.Mat3(d00 * invDet,-(this.e01 * this.e22 - this.e02 * this.e21) * invDet,(this.e01 * this.e12 - this.e02 * this.e11) * invDet,-d01 * invDet,(this.e00 * this.e22 - this.e02 * this.e20) * invDet,-(this.e00 * this.e12 - this.e02 * this.e10) * invDet,d02 * invDet,-(this.e00 * this.e21 - this.e01 * this.e20) * invDet,(this.e00 * this.e11 - this.e01 * this.e10) * invDet); } inverseEq() { let d00 = this.e11 * this.e22 - this.e12 * this.e21; let d01 = this.e10 * this.e22 - this.e12 * this.e20; let d02 = this.e10 * this.e21 - this.e11 * this.e20; let invDet = this.e00 * d00 - this.e01 * d01 + this.e02 * d02; if(invDet != 0) { invDet = 1 / invDet; } let t02 = (this.e01 * this.e12 - this.e02 * this.e11) * invDet; let t11 = (this.e00 * this.e22 - this.e02 * this.e20) * invDet; let t12 = -(this.e00 * this.e12 - this.e02 * this.e10) * invDet; let t21 = -(this.e00 * this.e21 - this.e01 * this.e20) * invDet; let t22 = (this.e00 * this.e11 - this.e01 * this.e10) * invDet; this.e00 = d00 * invDet; this.e01 = -(this.e01 * this.e22 - this.e02 * this.e21) * invDet; this.e02 = t02; this.e10 = -d01 * invDet; this.e11 = t11; this.e12 = t12; this.e20 = d02 * invDet; this.e21 = t21; this.e22 = t22; return this; } toArray(columnMajor) { if(columnMajor == null) { columnMajor = false; } if(columnMajor) { return [this.e00,this.e10,this.e20,this.e01,this.e11,this.e21,this.e02,this.e12,this.e22]; } else { return [this.e00,this.e01,this.e02,this.e10,this.e11,this.e12,this.e20,this.e21,this.e22]; } } copyFrom(m) { this.e00 = m.e00; this.e01 = m.e01; this.e02 = m.e02; this.e10 = m.e10; this.e11 = m.e11; this.e12 = m.e12; this.e20 = m.e20; this.e21 = m.e21; this.e22 = m.e22; return this; } clone() { return new oimo.common.Mat3(this.e00,this.e01,this.e02,this.e10,this.e11,this.e12,this.e20,this.e21,this.e22); } fromQuat(q) { let x = q.x; let y = q.y; let z = q.z; let w = q.w; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; this.e00 = 1 - yy - zz; this.e01 = xy - wz; this.e02 = xz + wy; this.e10 = xy + wz; this.e11 = 1 - xx - zz; this.e12 = yz - wx; this.e20 = xz - wy; this.e21 = yz + wx; this.e22 = 1 - xx - yy; return this; } toQuat() { let _this = new oimo.common.Quat(); let e00 = this.e00; let e11 = this.e11; let e22 = this.e22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); _this.w = 0.5 * s; s = 0.5 / s; _this.x = (this.e21 - this.e12) * s; _this.y = (this.e02 - this.e20) * s; _this.z = (this.e10 - this.e01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); _this.x = 0.5 * s; s = 0.5 / s; _this.y = (this.e01 + this.e10) * s; _this.z = (this.e02 + this.e20) * s; _this.w = (this.e21 - this.e12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); _this.z = 0.5 * s; s = 0.5 / s; _this.x = (this.e02 + this.e20) * s; _this.y = (this.e12 + this.e21) * s; _this.w = (this.e10 - this.e01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); _this.y = 0.5 * s; s = 0.5 / s; _this.x = (this.e01 + this.e10) * s; _this.z = (this.e12 + this.e21) * s; _this.w = (this.e02 - this.e20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); _this.z = 0.5 * s; s = 0.5 / s; _this.x = (this.e02 + this.e20) * s; _this.y = (this.e12 + this.e21) * s; _this.w = (this.e10 - this.e01) * s; } return _this; } fromEulerXyz(eulerAngles) { let sx = Math.sin(eulerAngles.x); let sy = Math.sin(eulerAngles.y); let sz = Math.sin(eulerAngles.z); let cx = Math.cos(eulerAngles.x); let cy = Math.cos(eulerAngles.y); let cz = Math.cos(eulerAngles.z); this.e00 = cy * cz; this.e01 = -cy * sz; this.e02 = sy; this.e10 = cx * sz + cz * sx * sy; this.e11 = cx * cz - sx * sy * sz; this.e12 = -cy * sx; this.e20 = sx * sz - cx * cz * sy; this.e21 = cz * sx + cx * sy * sz; this.e22 = cx * cy; return this; } toEulerXyz() { let sy = this.e02; if(sy <= -1) { let xSubZ = Math.atan2(this.e21,this.e11); return new oimo.common.Vec3(xSubZ * 0.5,-1.570796326794895,-xSubZ * 0.5); } if(sy >= 1) { let xAddZ = Math.atan2(this.e21,this.e11); return new oimo.common.Vec3(xAddZ * 0.5,1.570796326794895,xAddZ * 0.5); } return new oimo.common.Vec3(Math.atan2(-this.e12,this.e22),Math.asin(sy),Math.atan2(-this.e01,this.e00)); } getRow(index) { if(index == 0) { return new oimo.common.Vec3(this.e00,this.e01,this.e02); } else if(index == 1) { return new oimo.common.Vec3(this.e10,this.e11,this.e12); } else if(index == 2) { return new oimo.common.Vec3(this.e20,this.e21,this.e22); } else { return null; } } getCol(index) { if(index == 0) { return new oimo.common.Vec3(this.e00,this.e10,this.e20); } else if(index == 1) { return new oimo.common.Vec3(this.e01,this.e11,this.e21); } else if(index == 2) { return new oimo.common.Vec3(this.e02,this.e12,this.e22); } else { return null; } } getRowTo(index,dst) { if(index == 0) { dst.init(this.e00,this.e01,this.e02); } else if(index == 1) { dst.init(this.e10,this.e11,this.e12); } else if(index == 2) { dst.init(this.e20,this.e21,this.e22); } else { dst.zero(); } } getColTo(index,dst) { if(index == 0) { dst.init(this.e00,this.e10,this.e20); } else if(index == 1) { dst.init(this.e01,this.e11,this.e21); } else if(index == 2) { dst.init(this.e02,this.e12,this.e22); } else { dst.zero(); } } fromRows(row0,row1,row2) { this.e00 = row0.x; this.e01 = row0.y; this.e02 = row0.z; this.e10 = row1.x; this.e11 = row1.y; this.e12 = row1.z; this.e20 = row2.x; this.e21 = row2.y; this.e22 = row2.z; return this; } fromCols(col0,col1,col2) { this.e00 = col0.x; this.e01 = col1.x; this.e02 = col2.x; this.e10 = col0.y; this.e11 = col1.y; this.e12 = col2.y; this.e20 = col0.z; this.e21 = col1.z; this.e22 = col2.z; return this; } toString() { return "Mat3[" + (this.e00 > 0 ? (this.e00 * 10000000 + 0.5 | 0) / 10000000 : (this.e00 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e01 > 0 ? (this.e01 * 10000000 + 0.5 | 0) / 10000000 : (this.e01 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e02 > 0 ? (this.e02 * 10000000 + 0.5 | 0) / 10000000 : (this.e02 * 10000000 - 0.5 | 0) / 10000000) + ",\n" + " " + (this.e10 > 0 ? (this.e10 * 10000000 + 0.5 | 0) / 10000000 : (this.e10 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e11 > 0 ? (this.e11 * 10000000 + 0.5 | 0) / 10000000 : (this.e11 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e12 > 0 ? (this.e12 * 10000000 + 0.5 | 0) / 10000000 : (this.e12 * 10000000 - 0.5 | 0) / 10000000) + ",\n" + " " + (this.e20 > 0 ? (this.e20 * 10000000 + 0.5 | 0) / 10000000 : (this.e20 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e21 > 0 ? (this.e21 * 10000000 + 0.5 | 0) / 10000000 : (this.e21 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e22 > 0 ? (this.e22 * 10000000 + 0.5 | 0) / 10000000 : (this.e22 * 10000000 - 0.5 | 0) / 10000000) + "]"; } } oimo.common.Mat4 = class oimo_common_Mat4 { constructor(e00,e01,e02,e03,e10,e11,e12,e13,e20,e21,e22,e23,e30,e31,e32,e33) { if(e33 == null) { e33 = 1; } if(e32 == null) { e32 = 0; } if(e31 == null) { e31 = 0; } if(e30 == null) { e30 = 0; } if(e23 == null) { e23 = 0; } if(e22 == null) { e22 = 1; } if(e21 == null) { e21 = 0; } if(e20 == null) { e20 = 0; } if(e13 == null) { e13 = 0; } if(e12 == null) { e12 = 0; } if(e11 == null) { e11 = 1; } if(e10 == null) { e10 = 0; } if(e03 == null) { e03 = 0; } if(e02 == null) { e02 = 0; } if(e01 == null) { e01 = 0; } if(e00 == null) { e00 = 1; } this.e00 = e00; this.e01 = e01; this.e02 = e02; this.e03 = e03; this.e10 = e10; this.e11 = e11; this.e12 = e12; this.e13 = e13; this.e20 = e20; this.e21 = e21; this.e22 = e22; this.e23 = e23; this.e30 = e30; this.e31 = e31; this.e32 = e32; this.e33 = e33; oimo.common.Mat4.numCreations++; } init(e00,e01,e02,e03,e10,e11,e12,e13,e20,e21,e22,e23,e30,e31,e32,e33) { this.e00 = e00; this.e01 = e01; this.e02 = e02; this.e03 = e03; this.e10 = e10; this.e11 = e11; this.e12 = e12; this.e13 = e13; this.e20 = e20; this.e21 = e21; this.e22 = e22; this.e23 = e23; this.e30 = e30; this.e31 = e31; this.e32 = e32; this.e33 = e33; return this; } identity() { this.e00 = 1; this.e01 = 0; this.e02 = 0; this.e03 = 0; this.e10 = 0; this.e11 = 1; this.e12 = 0; this.e13 = 0; this.e20 = 0; this.e21 = 0; this.e22 = 1; this.e23 = 0; this.e30 = 0; this.e31 = 0; this.e32 = 0; this.e33 = 1; return this; } add(m) { return new oimo.common.Mat4(this.e00 + m.e00,this.e01 + m.e01,this.e02 + m.e02,this.e03 + m.e03,this.e10 + m.e10,this.e11 + m.e11,this.e12 + m.e12,this.e13 + m.e13,this.e20 + m.e20,this.e21 + m.e21,this.e22 + m.e22,this.e23 + m.e23,this.e30 + m.e30,this.e31 + m.e31,this.e32 + m.e32,this.e33 + m.e33); } sub(m) { return new oimo.common.Mat4(this.e00 - m.e00,this.e01 - m.e01,this.e02 - m.e02,this.e03 - m.e03,this.e10 - m.e10,this.e11 - m.e11,this.e12 - m.e12,this.e13 - m.e13,this.e20 - m.e20,this.e21 - m.e21,this.e22 - m.e22,this.e23 - m.e23,this.e30 - m.e30,this.e31 - m.e31,this.e32 - m.e32,this.e33 - m.e33); } scale(s) { return new oimo.common.Mat4(this.e00 * s,this.e01 * s,this.e02 * s,this.e03 * s,this.e10 * s,this.e11 * s,this.e12 * s,this.e13 * s,this.e20 * s,this.e21 * s,this.e22 * s,this.e23 * s,this.e30 * s,this.e31 * s,this.e32 * s,this.e33 * s); } mul(m) { return new oimo.common.Mat4(this.e00 * m.e00 + this.e01 * m.e10 + this.e02 * m.e20 + this.e03 * m.e30,this.e00 * m.e01 + this.e01 * m.e11 + this.e02 * m.e21 + this.e03 * m.e31,this.e00 * m.e02 + this.e01 * m.e12 + this.e02 * m.e22 + this.e03 * m.e32,this.e00 * m.e03 + this.e01 * m.e13 + this.e02 * m.e23 + this.e03 * m.e33,this.e10 * m.e00 + this.e11 * m.e10 + this.e12 * m.e20 + this.e13 * m.e30,this.e10 * m.e01 + this.e11 * m.e11 + this.e12 * m.e21 + this.e13 * m.e31,this.e10 * m.e02 + this.e11 * m.e12 + this.e12 * m.e22 + this.e13 * m.e32,this.e10 * m.e03 + this.e11 * m.e13 + this.e12 * m.e23 + this.e13 * m.e33,this.e20 * m.e00 + this.e21 * m.e10 + this.e22 * m.e20 + this.e23 * m.e30,this.e20 * m.e01 + this.e21 * m.e11 + this.e22 * m.e21 + this.e23 * m.e31,this.e20 * m.e02 + this.e21 * m.e12 + this.e22 * m.e22 + this.e23 * m.e32,this.e20 * m.e03 + this.e21 * m.e13 + this.e22 * m.e23 + this.e23 * m.e33,this.e30 * m.e00 + this.e31 * m.e10 + this.e32 * m.e20 + this.e33 * m.e30,this.e30 * m.e01 + this.e31 * m.e11 + this.e32 * m.e21 + this.e33 * m.e31,this.e30 * m.e02 + this.e31 * m.e12 + this.e32 * m.e22 + this.e33 * m.e32,this.e30 * m.e03 + this.e31 * m.e13 + this.e32 * m.e23 + this.e33 * m.e33); } addEq(m) { this.e00 += m.e00; this.e01 += m.e01; this.e02 += m.e02; this.e03 += m.e03; this.e10 += m.e10; this.e11 += m.e11; this.e12 += m.e12; this.e13 += m.e13; this.e20 += m.e20; this.e21 += m.e21; this.e22 += m.e22; this.e23 += m.e23; this.e30 += m.e30; this.e31 += m.e31; this.e32 += m.e32; this.e33 += m.e33; return this; } subEq(m) { this.e00 -= m.e00; this.e01 -= m.e01; this.e02 -= m.e02; this.e03 -= m.e03; this.e10 -= m.e10; this.e11 -= m.e11; this.e12 -= m.e12; this.e13 -= m.e13; this.e20 -= m.e20; this.e21 -= m.e21; this.e22 -= m.e22; this.e23 -= m.e23; this.e30 -= m.e30; this.e31 -= m.e31; this.e32 -= m.e32; this.e33 -= m.e33; return this; } scaleEq(s) { this.e00 *= s; this.e01 *= s; this.e02 *= s; this.e03 *= s; this.e10 *= s; this.e11 *= s; this.e12 *= s; this.e13 *= s; this.e20 *= s; this.e21 *= s; this.e22 *= s; this.e23 *= s; this.e30 *= s; this.e31 *= s; this.e32 *= s; this.e33 *= s; return this; } mulEq(m) { let e01 = this.e00 * m.e01 + this.e01 * m.e11 + this.e02 * m.e21 + this.e03 * m.e31; let e02 = this.e00 * m.e02 + this.e01 * m.e12 + this.e02 * m.e22 + this.e03 * m.e32; let e03 = this.e00 * m.e03 + this.e01 * m.e13 + this.e02 * m.e23 + this.e03 * m.e33; let e10 = this.e10 * m.e00 + this.e11 * m.e10 + this.e12 * m.e20 + this.e13 * m.e30; let e11 = this.e10 * m.e01 + this.e11 * m.e11 + this.e12 * m.e21 + this.e13 * m.e31; let e12 = this.e10 * m.e02 + this.e11 * m.e12 + this.e12 * m.e22 + this.e13 * m.e32; let e13 = this.e10 * m.e03 + this.e11 * m.e13 + this.e12 * m.e23 + this.e13 * m.e33; let e20 = this.e20 * m.e00 + this.e21 * m.e10 + this.e22 * m.e20 + this.e23 * m.e30; let e21 = this.e20 * m.e01 + this.e21 * m.e11 + this.e22 * m.e21 + this.e23 * m.e31; let e22 = this.e20 * m.e02 + this.e21 * m.e12 + this.e22 * m.e22 + this.e23 * m.e32; let e23 = this.e20 * m.e03 + this.e21 * m.e13 + this.e22 * m.e23 + this.e23 * m.e33; let e30 = this.e30 * m.e00 + this.e31 * m.e10 + this.e32 * m.e20 + this.e33 * m.e30; let e31 = this.e30 * m.e01 + this.e31 * m.e11 + this.e32 * m.e21 + this.e33 * m.e31; let e32 = this.e30 * m.e02 + this.e31 * m.e12 + this.e32 * m.e22 + this.e33 * m.e32; let e33 = this.e30 * m.e03 + this.e31 * m.e13 + this.e32 * m.e23 + this.e33 * m.e33; this.e00 = this.e00 * m.e00 + this.e01 * m.e10 + this.e02 * m.e20 + this.e03 * m.e30; this.e01 = e01; this.e02 = e02; this.e03 = e03; this.e10 = e10; this.e11 = e11; this.e12 = e12; this.e13 = e13; this.e20 = e20; this.e21 = e21; this.e22 = e22; this.e23 = e23; this.e30 = e30; this.e31 = e31; this.e32 = e32; this.e33 = e33; return this; } prependScale(sx,sy,sz) { return new oimo.common.Mat4(this.e00 * sx,this.e01 * sx,this.e02 * sx,this.e03 * sx,this.e10 * sy,this.e11 * sy,this.e12 * sy,this.e13 * sy,this.e20 * sz,this.e21 * sz,this.e22 * sz,this.e23 * sz,this.e30,this.e31,this.e32,this.e33); } appendScale(sx,sy,sz) { return new oimo.common.Mat4(this.e00 * sx,this.e01 * sy,this.e02 * sz,this.e03,this.e10 * sx,this.e11 * sy,this.e12 * sz,this.e13,this.e20 * sx,this.e21 * sy,this.e22 * sz,this.e23,this.e30 * sx,this.e31 * sy,this.e32 * sz,this.e33); } prependRotation(rad,axisX,axisY,axisZ) { let s = Math.sin(rad); let c = Math.cos(rad); let c1 = 1 - c; let r00 = axisX * axisX * c1 + c; let r01 = axisX * axisY * c1 - axisZ * s; let r02 = axisX * axisZ * c1 + axisY * s; let r10 = axisY * axisX * c1 + axisZ * s; let r11 = axisY * axisY * c1 + c; let r12 = axisY * axisZ * c1 - axisX * s; let r20 = axisZ * axisX * c1 - axisY * s; let r21 = axisZ * axisY * c1 + axisX * s; let r22 = axisZ * axisZ * c1 + c; return new oimo.common.Mat4(r00 * this.e00 + r01 * this.e10 + r02 * this.e20,r00 * this.e01 + r01 * this.e11 + r02 * this.e21,r00 * this.e02 + r01 * this.e12 + r02 * this.e22,r00 * this.e03 + r01 * this.e13 + r02 * this.e23,r10 * this.e00 + r11 * this.e10 + r12 * this.e20,r10 * this.e01 + r11 * this.e11 + r12 * this.e21,r10 * this.e02 + r11 * this.e12 + r12 * this.e22,r10 * this.e03 + r11 * this.e13 + r12 * this.e23,r20 * this.e00 + r21 * this.e10 + r22 * this.e20,r20 * this.e01 + r21 * this.e11 + r22 * this.e21,r20 * this.e02 + r21 * this.e12 + r22 * this.e22,r20 * this.e03 + r21 * this.e13 + r22 * this.e23,this.e30,this.e31,this.e32,this.e33); } appendRotation(rad,axisX,axisY,axisZ) { let s = Math.sin(rad); let c = Math.cos(rad); let c1 = 1 - c; let r00 = axisX * axisX * c1 + c; let r01 = axisX * axisY * c1 - axisZ * s; let r02 = axisX * axisZ * c1 + axisY * s; let r10 = axisY * axisX * c1 + axisZ * s; let r11 = axisY * axisY * c1 + c; let r12 = axisY * axisZ * c1 - axisX * s; let r20 = axisZ * axisX * c1 - axisY * s; let r21 = axisZ * axisY * c1 + axisX * s; let r22 = axisZ * axisZ * c1 + c; return new oimo.common.Mat4(this.e00 * r00 + this.e01 * r10 + this.e02 * r20,this.e00 * r01 + this.e01 * r11 + this.e02 * r21,this.e00 * r02 + this.e01 * r12 + this.e02 * r22,this.e03,this.e10 * r00 + this.e11 * r10 + this.e12 * r20,this.e10 * r01 + this.e11 * r11 + this.e12 * r21,this.e10 * r02 + this.e11 * r12 + this.e12 * r22,this.e13,this.e20 * r00 + this.e21 * r10 + this.e22 * r20,this.e20 * r01 + this.e21 * r11 + this.e22 * r21,this.e20 * r02 + this.e21 * r12 + this.e22 * r22,this.e23,this.e30 * r00 + this.e31 * r10 + this.e32 * r20,this.e30 * r01 + this.e31 * r11 + this.e32 * r21,this.e30 * r02 + this.e31 * r12 + this.e32 * r22,this.e33); } prependTranslation(tx,ty,tz) { return new oimo.common.Mat4(this.e00 + tx * this.e30,this.e01 + tx * this.e31,this.e02 + tx * this.e32,this.e03 + tx * this.e33,this.e10 + ty * this.e30,this.e11 + ty * this.e31,this.e12 + ty * this.e32,this.e13 + ty * this.e33,this.e20 + tz * this.e30,this.e21 + tz * this.e31,this.e22 + tz * this.e32,this.e23 + tz * this.e33,this.e30,this.e31,this.e32,this.e33); } appendTranslation(tx,ty,tz) { return new oimo.common.Mat4(this.e00,this.e01,this.e02,this.e00 * tx + this.e01 * ty + this.e02 * tz + this.e03,this.e10,this.e11,this.e12,this.e10 * tx + this.e11 * ty + this.e12 * tz + this.e13,this.e20,this.e21,this.e22,this.e20 * tx + this.e21 * ty + this.e22 * tz + this.e23,this.e30,this.e31,this.e32,this.e30 * tx + this.e31 * ty + this.e32 * tz + this.e33); } prependScaleEq(sx,sy,sz) { this.e00 *= sx; this.e01 *= sx; this.e02 *= sx; this.e03 *= sx; this.e10 *= sy; this.e11 *= sy; this.e12 *= sy; this.e13 *= sy; this.e20 *= sz; this.e21 *= sz; this.e22 *= sz; this.e23 *= sz; return this; } appendScaleEq(sx,sy,sz) { this.e00 *= sx; this.e01 *= sy; this.e02 *= sz; this.e10 *= sx; this.e11 *= sy; this.e12 *= sz; this.e20 *= sx; this.e21 *= sy; this.e22 *= sz; this.e30 *= sx; this.e31 *= sy; this.e32 *= sz; return this; } prependRotationEq(rad,axisX,axisY,axisZ) { let s = Math.sin(rad); let c = Math.cos(rad); let c1 = 1 - c; let r00 = axisX * axisX * c1 + c; let r01 = axisX * axisY * c1 - axisZ * s; let r02 = axisX * axisZ * c1 + axisY * s; let r10 = axisY * axisX * c1 + axisZ * s; let r11 = axisY * axisY * c1 + c; let r12 = axisY * axisZ * c1 - axisX * s; let r20 = axisZ * axisX * c1 - axisY * s; let r21 = axisZ * axisY * c1 + axisX * s; let r22 = axisZ * axisZ * c1 + c; let e10 = r10 * this.e00 + r11 * this.e10 + r12 * this.e20; let e11 = r10 * this.e01 + r11 * this.e11 + r12 * this.e21; let e12 = r10 * this.e02 + r11 * this.e12 + r12 * this.e22; let e13 = r10 * this.e03 + r11 * this.e13 + r12 * this.e23; let e20 = r20 * this.e00 + r21 * this.e10 + r22 * this.e20; let e21 = r20 * this.e01 + r21 * this.e11 + r22 * this.e21; let e22 = r20 * this.e02 + r21 * this.e12 + r22 * this.e22; let e23 = r20 * this.e03 + r21 * this.e13 + r22 * this.e23; this.e00 = r00 * this.e00 + r01 * this.e10 + r02 * this.e20; this.e01 = r00 * this.e01 + r01 * this.e11 + r02 * this.e21; this.e02 = r00 * this.e02 + r01 * this.e12 + r02 * this.e22; this.e03 = r00 * this.e03 + r01 * this.e13 + r02 * this.e23; this.e10 = e10; this.e11 = e11; this.e12 = e12; this.e13 = e13; this.e20 = e20; this.e21 = e21; this.e22 = e22; this.e23 = e23; return this; } appendRotationEq(rad,axisX,axisY,axisZ) { let s = Math.sin(rad); let c = Math.cos(rad); let c1 = 1 - c; let r00 = axisX * axisX * c1 + c; let r01 = axisX * axisY * c1 - axisZ * s; let r02 = axisX * axisZ * c1 + axisY * s; let r10 = axisY * axisX * c1 + axisZ * s; let r11 = axisY * axisY * c1 + c; let r12 = axisY * axisZ * c1 - axisX * s; let r20 = axisZ * axisX * c1 - axisY * s; let r21 = axisZ * axisY * c1 + axisX * s; let r22 = axisZ * axisZ * c1 + c; let e01 = this.e00 * r01 + this.e01 * r11 + this.e02 * r21; let e02 = this.e00 * r02 + this.e01 * r12 + this.e02 * r22; let e11 = this.e10 * r01 + this.e11 * r11 + this.e12 * r21; let e12 = this.e10 * r02 + this.e11 * r12 + this.e12 * r22; let e21 = this.e20 * r01 + this.e21 * r11 + this.e22 * r21; let e22 = this.e20 * r02 + this.e21 * r12 + this.e22 * r22; let e31 = this.e30 * r01 + this.e31 * r11 + this.e32 * r21; let e32 = this.e30 * r02 + this.e31 * r12 + this.e32 * r22; this.e00 = this.e00 * r00 + this.e01 * r10 + this.e02 * r20; this.e01 = e01; this.e02 = e02; this.e10 = this.e10 * r00 + this.e11 * r10 + this.e12 * r20; this.e11 = e11; this.e12 = e12; this.e20 = this.e20 * r00 + this.e21 * r10 + this.e22 * r20; this.e21 = e21; this.e22 = e22; this.e30 = this.e30 * r00 + this.e31 * r10 + this.e32 * r20; this.e31 = e31; this.e32 = e32; return this; } prependTranslationEq(tx,ty,tz) { this.e00 += tx * this.e30; this.e01 += tx * this.e31; this.e02 += tx * this.e32; this.e03 += tx * this.e33; this.e10 += ty * this.e30; this.e11 += ty * this.e31; this.e12 += ty * this.e32; this.e13 += ty * this.e33; this.e20 += tz * this.e30; this.e21 += tz * this.e31; this.e22 += tz * this.e32; this.e23 += tz * this.e33; return this; } appendTranslationEq(tx,ty,tz) { let e03 = this.e00 * tx + this.e01 * ty + this.e02 * tz + this.e03; let e13 = this.e10 * tx + this.e11 * ty + this.e12 * tz + this.e13; let e23 = this.e20 * tx + this.e21 * ty + this.e22 * tz + this.e23; let e33 = this.e30 * tx + this.e31 * ty + this.e32 * tz + this.e33; this.e03 = e03; this.e13 = e13; this.e23 = e23; this.e33 = e33; return this; } transpose() { return new oimo.common.Mat4(this.e00,this.e10,this.e20,this.e30,this.e01,this.e11,this.e21,this.e31,this.e02,this.e12,this.e22,this.e32,this.e03,this.e13,this.e23,this.e33); } transposeEq() { let e10 = this.e01; let e20 = this.e02; let e21 = this.e12; let e30 = this.e03; let e31 = this.e13; let e32 = this.e23; this.e01 = this.e10; this.e02 = this.e20; this.e03 = this.e30; this.e10 = e10; this.e12 = this.e21; this.e13 = this.e31; this.e20 = e20; this.e21 = e21; this.e23 = this.e32; this.e30 = e30; this.e31 = e31; this.e32 = e32; return this; } determinant() { let d23_01 = this.e20 * this.e31 - this.e21 * this.e30; let d23_02 = this.e20 * this.e32 - this.e22 * this.e30; let d23_03 = this.e20 * this.e33 - this.e23 * this.e30; let d23_12 = this.e21 * this.e32 - this.e22 * this.e31; let d23_13 = this.e21 * this.e33 - this.e23 * this.e31; let d23_23 = this.e22 * this.e33 - this.e23 * this.e32; return this.e00 * (this.e11 * d23_23 - this.e12 * d23_13 + this.e13 * d23_12) - this.e01 * (this.e10 * d23_23 - this.e12 * d23_03 + this.e13 * d23_02) + this.e02 * (this.e10 * d23_13 - this.e11 * d23_03 + this.e13 * d23_01) - this.e03 * (this.e10 * d23_12 - this.e11 * d23_02 + this.e12 * d23_01); } trace() { return this.e00 + this.e11 + this.e22 + this.e33; } inverse() { let d01_01 = this.e00 * this.e11 - this.e01 * this.e10; let d01_02 = this.e00 * this.e12 - this.e02 * this.e10; let d01_03 = this.e00 * this.e13 - this.e03 * this.e10; let d01_12 = this.e01 * this.e12 - this.e02 * this.e11; let d01_13 = this.e01 * this.e13 - this.e03 * this.e11; let d01_23 = this.e02 * this.e13 - this.e03 * this.e12; let d23_01 = this.e20 * this.e31 - this.e21 * this.e30; let d23_02 = this.e20 * this.e32 - this.e22 * this.e30; let d23_03 = this.e20 * this.e33 - this.e23 * this.e30; let d23_12 = this.e21 * this.e32 - this.e22 * this.e31; let d23_13 = this.e21 * this.e33 - this.e23 * this.e31; let d23_23 = this.e22 * this.e33 - this.e23 * this.e32; let d00 = this.e11 * d23_23 - this.e12 * d23_13 + this.e13 * d23_12; let d01 = this.e10 * d23_23 - this.e12 * d23_03 + this.e13 * d23_02; let d02 = this.e10 * d23_13 - this.e11 * d23_03 + this.e13 * d23_01; let d03 = this.e10 * d23_12 - this.e11 * d23_02 + this.e12 * d23_01; let invDet = this.e00 * d00 - this.e01 * d01 + this.e02 * d02 - this.e03 * d03; if(invDet != 0) { invDet = 1 / invDet; } return new oimo.common.Mat4(d00 * invDet,-(this.e01 * d23_23 - this.e02 * d23_13 + this.e03 * d23_12) * invDet,(this.e31 * d01_23 - this.e32 * d01_13 + this.e33 * d01_12) * invDet,-(this.e21 * d01_23 - this.e22 * d01_13 + this.e23 * d01_12) * invDet,-d01 * invDet,(this.e00 * d23_23 - this.e02 * d23_03 + this.e03 * d23_02) * invDet,-(this.e30 * d01_23 - this.e32 * d01_03 + this.e33 * d01_02) * invDet,(this.e20 * d01_23 - this.e22 * d01_03 + this.e23 * d01_02) * invDet,d02 * invDet,-(this.e00 * d23_13 - this.e01 * d23_03 + this.e03 * d23_01) * invDet,(this.e30 * d01_13 - this.e31 * d01_03 + this.e33 * d01_01) * invDet,-(this.e20 * d01_13 - this.e21 * d01_03 + this.e23 * d01_01) * invDet,-d03 * invDet,(this.e00 * d23_12 - this.e01 * d23_02 + this.e02 * d23_01) * invDet,-(this.e30 * d01_12 - this.e31 * d01_02 + this.e32 * d01_01) * invDet,(this.e20 * d01_12 - this.e21 * d01_02 + this.e22 * d01_01) * invDet); } inverseEq() { let d01_01 = this.e00 * this.e11 - this.e01 * this.e10; let d01_02 = this.e00 * this.e12 - this.e02 * this.e10; let d01_03 = this.e00 * this.e13 - this.e03 * this.e10; let d01_12 = this.e01 * this.e12 - this.e02 * this.e11; let d01_13 = this.e01 * this.e13 - this.e03 * this.e11; let d01_23 = this.e02 * this.e13 - this.e03 * this.e12; let d23_01 = this.e20 * this.e31 - this.e21 * this.e30; let d23_02 = this.e20 * this.e32 - this.e22 * this.e30; let d23_03 = this.e20 * this.e33 - this.e23 * this.e30; let d23_12 = this.e21 * this.e32 - this.e22 * this.e31; let d23_13 = this.e21 * this.e33 - this.e23 * this.e31; let d23_23 = this.e22 * this.e33 - this.e23 * this.e32; let d00 = this.e11 * d23_23 - this.e12 * d23_13 + this.e13 * d23_12; let d01 = this.e10 * d23_23 - this.e12 * d23_03 + this.e13 * d23_02; let d02 = this.e10 * d23_13 - this.e11 * d23_03 + this.e13 * d23_01; let d03 = this.e10 * d23_12 - this.e11 * d23_02 + this.e12 * d23_01; let invDet = this.e00 * d00 - this.e01 * d01 + this.e02 * d02 - this.e03 * d03; if(invDet != 0) { invDet = 1 / invDet; } let t11 = (this.e00 * d23_23 - this.e02 * d23_03 + this.e03 * d23_02) * invDet; let t21 = -(this.e00 * d23_13 - this.e01 * d23_03 + this.e03 * d23_01) * invDet; let t23 = -(this.e20 * d01_13 - this.e21 * d01_03 + this.e23 * d01_01) * invDet; let t31 = (this.e00 * d23_12 - this.e01 * d23_02 + this.e02 * d23_01) * invDet; let t32 = -(this.e30 * d01_12 - this.e31 * d01_02 + this.e32 * d01_01) * invDet; let t33 = (this.e20 * d01_12 - this.e21 * d01_02 + this.e22 * d01_01) * invDet; this.e00 = d00 * invDet; this.e01 = -(this.e01 * d23_23 - this.e02 * d23_13 + this.e03 * d23_12) * invDet; this.e02 = (this.e31 * d01_23 - this.e32 * d01_13 + this.e33 * d01_12) * invDet; this.e03 = -(this.e21 * d01_23 - this.e22 * d01_13 + this.e23 * d01_12) * invDet; this.e10 = -d01 * invDet; this.e11 = t11; this.e12 = -(this.e30 * d01_23 - this.e32 * d01_03 + this.e33 * d01_02) * invDet; this.e13 = (this.e20 * d01_23 - this.e22 * d01_03 + this.e23 * d01_02) * invDet; this.e20 = d02 * invDet; this.e21 = t21; this.e22 = (this.e30 * d01_13 - this.e31 * d01_03 + this.e33 * d01_01) * invDet; this.e23 = t23; this.e30 = -d03 * invDet; this.e31 = t31; this.e32 = t32; this.e33 = t33; return this; } lookAt(eyeX,eyeY,eyeZ,atX,atY,atZ,upX,upY,upZ) { let zx = eyeX - atX; let zy = eyeY - atY; let zz = eyeZ - atZ; let tmp = 1 / Math.sqrt(zx * zx + zy * zy + zz * zz); zx *= tmp; zy *= tmp; zz *= tmp; let xx = upY * zz - upZ * zy; let xy = upZ * zx - upX * zz; let xz = upX * zy - upY * zx; tmp = 1 / Math.sqrt(xx * xx + xy * xy + xz * xz); xx *= tmp; xy *= tmp; xz *= tmp; let yx = zy * xz - zz * xy; let yy = zz * xx - zx * xz; let yz = zx * xy - zy * xx; this.e00 = xx; this.e01 = xy; this.e02 = xz; this.e03 = -(xx * eyeX + xy * eyeY + xz * eyeZ); this.e10 = yx; this.e11 = yy; this.e12 = yz; this.e13 = -(yx * eyeX + yy * eyeY + yz * eyeZ); this.e20 = zx; this.e21 = zy; this.e22 = zz; this.e23 = -(zx * eyeX + zy * eyeY + zz * eyeZ); this.e30 = 0; this.e31 = 0; this.e32 = 0; this.e33 = 1; return this; } perspective(fovY,aspect,near,far) { let h = 1 / Math.tan(fovY * 0.5); let fnf = far / (near - far); this.e00 = h / aspect; this.e01 = 0; this.e02 = 0; this.e03 = 0; this.e10 = 0; this.e11 = h; this.e12 = 0; this.e13 = 0; this.e20 = 0; this.e21 = 0; this.e22 = fnf; this.e23 = near * fnf; this.e30 = 0; this.e31 = 0; this.e32 = -1; this.e33 = 0; return this; } ortho(width,height,near,far) { let nf = 1 / (near - far); this.e00 = 2 / width; this.e01 = 0; this.e02 = 0; this.e03 = 0; this.e10 = 0; this.e11 = 2 / height; this.e12 = 0; this.e13 = 0; this.e20 = 0; this.e21 = 0; this.e22 = nf; this.e23 = near * nf; this.e30 = 0; this.e31 = 0; this.e32 = 0; this.e33 = 1; return this; } toArray(columnMajor) { if(columnMajor == null) { columnMajor = false; } if(columnMajor) { return [this.e00,this.e10,this.e20,this.e30,this.e01,this.e11,this.e21,this.e31,this.e02,this.e12,this.e22,this.e32,this.e03,this.e13,this.e23,this.e33]; } else { return [this.e00,this.e01,this.e02,this.e03,this.e10,this.e11,this.e12,this.e13,this.e20,this.e21,this.e22,this.e23,this.e30,this.e31,this.e32,this.e33]; } } copyFrom(m) { this.e00 = m.e00; this.e01 = m.e01; this.e02 = m.e02; this.e03 = m.e03; this.e10 = m.e10; this.e11 = m.e11; this.e12 = m.e12; this.e13 = m.e13; this.e20 = m.e20; this.e21 = m.e21; this.e22 = m.e22; this.e23 = m.e23; this.e30 = m.e30; this.e31 = m.e31; this.e32 = m.e32; this.e33 = m.e33; return this; } fromMat3(m) { this.e00 = m.e00; this.e01 = m.e01; this.e02 = m.e02; this.e03 = 0; this.e10 = m.e10; this.e11 = m.e11; this.e12 = m.e12; this.e13 = 0; this.e20 = m.e20; this.e21 = m.e21; this.e22 = m.e22; this.e23 = 0; this.e30 = 0; this.e31 = 0; this.e32 = 0; this.e33 = 1; return this; } fromTransform(transform) { this.e00 = transform._rotation00; this.e01 = transform._rotation01; this.e02 = transform._rotation02; this.e10 = transform._rotation10; this.e11 = transform._rotation11; this.e12 = transform._rotation12; this.e20 = transform._rotation20; this.e21 = transform._rotation21; this.e22 = transform._rotation22; this.e03 = transform._positionX; this.e13 = transform._positionY; this.e23 = transform._positionZ; this.e30 = 0; this.e31 = 0; this.e32 = 0; this.e33 = 1; return this; } clone() { return new oimo.common.Mat4(this.e00,this.e01,this.e02,this.e03,this.e10,this.e11,this.e12,this.e13,this.e20,this.e21,this.e22,this.e23,this.e30,this.e31,this.e32,this.e33); } toString() { return "Mat4[" + (this.e00 > 0 ? (this.e00 * 10000000 + 0.5 | 0) / 10000000 : (this.e00 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e01 > 0 ? (this.e01 * 10000000 + 0.5 | 0) / 10000000 : (this.e01 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e02 > 0 ? (this.e02 * 10000000 + 0.5 | 0) / 10000000 : (this.e02 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e03 > 0 ? (this.e03 * 10000000 + 0.5 | 0) / 10000000 : (this.e03 * 10000000 - 0.5 | 0) / 10000000) + ",\n" + " " + (this.e10 > 0 ? (this.e10 * 10000000 + 0.5 | 0) / 10000000 : (this.e10 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e11 > 0 ? (this.e11 * 10000000 + 0.5 | 0) / 10000000 : (this.e11 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e12 > 0 ? (this.e12 * 10000000 + 0.5 | 0) / 10000000 : (this.e12 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e13 > 0 ? (this.e13 * 10000000 + 0.5 | 0) / 10000000 : (this.e13 * 10000000 - 0.5 | 0) / 10000000) + ",\n" + " " + (this.e20 > 0 ? (this.e20 * 10000000 + 0.5 | 0) / 10000000 : (this.e20 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e21 > 0 ? (this.e21 * 10000000 + 0.5 | 0) / 10000000 : (this.e21 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e22 > 0 ? (this.e22 * 10000000 + 0.5 | 0) / 10000000 : (this.e22 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e23 > 0 ? (this.e23 * 10000000 + 0.5 | 0) / 10000000 : (this.e23 * 10000000 - 0.5 | 0) / 10000000) + ",\n" + " " + (this.e30 > 0 ? (this.e30 * 10000000 + 0.5 | 0) / 10000000 : (this.e30 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e31 > 0 ? (this.e31 * 10000000 + 0.5 | 0) / 10000000 : (this.e31 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e32 > 0 ? (this.e32 * 10000000 + 0.5 | 0) / 10000000 : (this.e32 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e33 > 0 ? (this.e33 * 10000000 + 0.5 | 0) / 10000000 : (this.e33 * 10000000 - 0.5 | 0) / 10000000) + "]"; } } oimo.common.MathUtil = class oimo_common_MathUtil { static abs(x) { if(x > 0) { return x; } else { return -x; } } static sin(x) { return Math.sin(x); } static cos(x) { return Math.cos(x); } static tan(x) { return Math.tan(x); } static asin(x) { return Math.asin(x); } static acos(x) { return Math.acos(x); } static atan(x) { return Math.atan(x); } static safeAsin(x) { if(x <= -1) { return -1.570796326794895; } if(x >= 1) { return 1.570796326794895; } return Math.asin(x); } static safeAcos(x) { if(x <= -1) { return 3.14159265358979; } if(x >= 1) { return 0; } return Math.acos(x); } static atan2(y,x) { return Math.atan2(y,x); } static sqrt(x) { return Math.sqrt(x); } static clamp(x,min,max) { if(x < min) { return min; } else if(x > max) { return max; } else { return x; } } static rand() { return Math.random(); } static randIn(min,max) { return min + Math.random() * (max - min); } static randVec3In(min,max) { return new oimo.common.Vec3(min + Math.random() * (max - min),min + Math.random() * (max - min),min + Math.random() * (max - min)); } static randVec3() { return new oimo.common.Vec3(-1 + Math.random() * 2,-1 + Math.random() * 2,-1 + Math.random() * 2); } } oimo.common.Pool = class oimo_common_Pool { constructor() { this.stackVec3 = new Array(256); this.sizeVec3 = 0; this.stackMat3 = new Array(256); this.sizeMat3 = 0; this.stackMat4 = new Array(256); this.sizeMat4 = 0; this.stackQuat = new Array(256); this.sizeQuat = 0; } vec3() { if(this.sizeVec3 == 0) { return new oimo.common.Vec3(); } else { return this.stackVec3[--this.sizeVec3]; } } mat3() { if(this.sizeMat3 == 0) { return new oimo.common.Mat3(); } else { return this.stackMat3[--this.sizeMat3]; } } mat4() { if(this.sizeMat4 == 0) { return new oimo.common.Mat4(); } else { return this.stackMat4[--this.sizeMat4]; } } quat() { if(this.sizeQuat == 0) { return new oimo.common.Quat(); } else { return this.stackQuat[--this.sizeQuat]; } } dispose(vec3,mat3,mat4,quat) { if(vec3 != null) { vec3.zero(); if(this.sizeVec3 == this.stackVec3.length) { let newArray = new Array(this.sizeVec3 << 1); let _g = 0; let _g1 = this.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = this.stackVec3[i]; this.stackVec3[i] = null; } this.stackVec3 = newArray; } this.stackVec3[this.sizeVec3++] = vec3; } if(mat3 != null) { mat3.e00 = 1; mat3.e01 = 0; mat3.e02 = 0; mat3.e10 = 0; mat3.e11 = 1; mat3.e12 = 0; mat3.e20 = 0; mat3.e21 = 0; mat3.e22 = 1; if(this.sizeMat3 == this.stackMat3.length) { let newArray = new Array(this.sizeMat3 << 1); let _g = 0; let _g1 = this.sizeMat3; while(_g < _g1) { let i = _g++; newArray[i] = this.stackMat3[i]; this.stackMat3[i] = null; } this.stackMat3 = newArray; } this.stackMat3[this.sizeMat3++] = mat3; } if(mat4 != null) { mat4.e00 = 1; mat4.e01 = 0; mat4.e02 = 0; mat4.e03 = 0; mat4.e10 = 0; mat4.e11 = 1; mat4.e12 = 0; mat4.e13 = 0; mat4.e20 = 0; mat4.e21 = 0; mat4.e22 = 1; mat4.e23 = 0; mat4.e30 = 0; mat4.e31 = 0; mat4.e32 = 0; mat4.e33 = 1; if(this.sizeMat4 == this.stackMat4.length) { let newArray = new Array(this.sizeMat4 << 1); let _g = 0; let _g1 = this.sizeMat4; while(_g < _g1) { let i = _g++; newArray[i] = this.stackMat4[i]; this.stackMat4[i] = null; } this.stackMat4 = newArray; } this.stackMat4[this.sizeMat4++] = mat4; } if(quat != null) { quat.x = 0; quat.y = 0; quat.z = 0; quat.w = 1; if(this.sizeQuat == this.stackQuat.length) { let newArray = new Array(this.sizeQuat << 1); let _g = 0; let _g1 = this.sizeQuat; while(_g < _g1) { let i = _g++; newArray[i] = this.stackQuat[i]; this.stackQuat[i] = null; } this.stackQuat = newArray; } this.stackQuat[this.sizeQuat++] = quat; } } disposeVec3(v) { v.zero(); if(this.sizeVec3 == this.stackVec3.length) { let newArray = new Array(this.sizeVec3 << 1); let _g = 0; let _g1 = this.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = this.stackVec3[i]; this.stackVec3[i] = null; } this.stackVec3 = newArray; } this.stackVec3[this.sizeVec3++] = v; } disposeMat3(m) { m.e00 = 1; m.e01 = 0; m.e02 = 0; m.e10 = 0; m.e11 = 1; m.e12 = 0; m.e20 = 0; m.e21 = 0; m.e22 = 1; if(this.sizeMat3 == this.stackMat3.length) { let newArray = new Array(this.sizeMat3 << 1); let _g = 0; let _g1 = this.sizeMat3; while(_g < _g1) { let i = _g++; newArray[i] = this.stackMat3[i]; this.stackMat3[i] = null; } this.stackMat3 = newArray; } this.stackMat3[this.sizeMat3++] = m; } disposeMat4(m) { m.e00 = 1; m.e01 = 0; m.e02 = 0; m.e03 = 0; m.e10 = 0; m.e11 = 1; m.e12 = 0; m.e13 = 0; m.e20 = 0; m.e21 = 0; m.e22 = 1; m.e23 = 0; m.e30 = 0; m.e31 = 0; m.e32 = 0; m.e33 = 1; if(this.sizeMat4 == this.stackMat4.length) { let newArray = new Array(this.sizeMat4 << 1); let _g = 0; let _g1 = this.sizeMat4; while(_g < _g1) { let i = _g++; newArray[i] = this.stackMat4[i]; this.stackMat4[i] = null; } this.stackMat4 = newArray; } this.stackMat4[this.sizeMat4++] = m; } disposeQuat(q) { q.x = 0; q.y = 0; q.z = 0; q.w = 1; if(this.sizeQuat == this.stackQuat.length) { let newArray = new Array(this.sizeQuat << 1); let _g = 0; let _g1 = this.sizeQuat; while(_g < _g1) { let i = _g++; newArray[i] = this.stackQuat[i]; this.stackQuat[i] = null; } this.stackQuat = newArray; } this.stackQuat[this.sizeQuat++] = q; } } oimo.common.Quat = class oimo_common_Quat { constructor(x,y,z,w) { if(w == null) { w = 1; } if(z == null) { z = 0; } if(y == null) { y = 0; } if(x == null) { x = 0; } this.x = x; this.y = y; this.z = z; this.w = w; oimo.common.Quat.numCreations++; } identity() { this.x = 0; this.y = 0; this.z = 0; this.w = 1; return this; } init(x,y,z,w) { this.x = x; this.y = y; this.z = z; this.w = w; return this; } add(q) { return new oimo.common.Quat(this.x + q.x,this.y + q.y,this.z + q.z,this.w + q.w); } sub(q) { return new oimo.common.Quat(this.x - q.x,this.y - q.y,this.z - q.z,this.w - q.w); } scale(s) { return new oimo.common.Quat(this.x * s,this.y * s,this.z * s,this.w * s); } addEq(q) { this.x += q.x; this.y += q.y; this.z += q.z; this.w += q.w; return this; } subEq(q) { this.x -= q.x; this.y -= q.y; this.z -= q.z; this.w -= q.w; return this; } scaleEq(s) { this.x *= s; this.y *= s; this.z *= s; this.w *= s; return this; } length() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); } lengthSq() { return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; } dot(q) { return this.x * q.x + this.y * q.y + this.z * q.z + this.w * q.w; } normalized() { let invLen = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); if(invLen > 0) { invLen = 1 / invLen; } return new oimo.common.Quat(this.x * invLen,this.y * invLen,this.z * invLen,this.w * invLen); } normalize() { let invLen = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); if(invLen > 0) { invLen = 1 / invLen; } this.x *= invLen; this.y *= invLen; this.z *= invLen; this.w *= invLen; return this; } setArc(v1,v2) { let x1 = v1.x; let y1 = v1.y; let z1 = v1.z; let x2 = v2.x; let y2 = v2.y; let z2 = v2.z; let d = x1 * x2 + y1 * y2 + z1 * z2; this.w = Math.sqrt((1 + d) * 0.5); if(this.w == 0) { x2 = x1 * x1; y2 = y1 * y1; z2 = z1 * z1; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); this.x = 0; this.y = z1 * d; this.z = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); this.z = 0; this.x = y1 * d; this.y = -x1 * d; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); this.y = 0; this.z = x1 * d; this.x = -z1 * d; } else { d = 1 / Math.sqrt(x2 + y2); this.z = 0; this.x = y1 * d; this.y = -x1 * d; } return this; } d = 0.5 / this.w; this.x = (y1 * z2 - z1 * y2) * d; this.y = (z1 * x2 - x1 * z2) * d; this.z = (x1 * y2 - y1 * x2) * d; return this; } slerp(q,t) { let qx; let qy; let qz; let qw; let d = this.x * q.x + this.y * q.y + this.z * q.z + this.w * q.w; if(d < 0) { d = -d; qx = -q.x; qy = -q.y; qz = -q.z; qw = -q.w; } else { qx = q.x; qy = q.y; qz = q.z; qw = q.w; } if(d > 0.999999) { let _this = new oimo.common.Quat(this.x + (qx - this.x) * t,this.y + (qy - this.y) * t,this.z + (qz - this.z) * t,this.w + (qw - this.w) * t); let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z + _this.w * _this.w); if(invLen > 0) { invLen = 1 / invLen; } _this.x *= invLen; _this.y *= invLen; _this.z *= invLen; _this.w *= invLen; return _this; } let theta = t * Math.acos(d); qx -= this.x * d; qy -= this.y * d; qz -= this.z * d; qw -= this.w * d; let invLen = 1 / Math.sqrt(qx * qx + qy * qy + qz * qz + qw * qw); qx *= invLen; qy *= invLen; qz *= invLen; qw *= invLen; let sin = Math.sin(theta); let cos = Math.cos(theta); return new oimo.common.Quat(this.x * cos + qx * sin,this.y * cos + qy * sin,this.z * cos + qz * sin,this.w * cos + qw * sin); } copyFrom(q) { this.x = q.x; this.y = q.y; this.z = q.z; this.w = q.w; return this; } clone() { return new oimo.common.Quat(this.x,this.y,this.z,this.w); } fromMat3(m) { let e00 = m.e00; let e11 = m.e11; let e22 = m.e22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); this.w = 0.5 * s; s = 0.5 / s; this.x = (m.e21 - m.e12) * s; this.y = (m.e02 - m.e20) * s; this.z = (m.e10 - m.e01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); this.x = 0.5 * s; s = 0.5 / s; this.y = (m.e01 + m.e10) * s; this.z = (m.e02 + m.e20) * s; this.w = (m.e21 - m.e12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); this.z = 0.5 * s; s = 0.5 / s; this.x = (m.e02 + m.e20) * s; this.y = (m.e12 + m.e21) * s; this.w = (m.e10 - m.e01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); this.y = 0.5 * s; s = 0.5 / s; this.x = (m.e01 + m.e10) * s; this.z = (m.e12 + m.e21) * s; this.w = (m.e02 - m.e20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); this.z = 0.5 * s; s = 0.5 / s; this.x = (m.e02 + m.e20) * s; this.y = (m.e12 + m.e21) * s; this.w = (m.e10 - m.e01) * s; } return this; } toMat3() { let _this = new oimo.common.Mat3(); let x = this.x; let y = this.y; let z = this.z; let w = this.w; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; _this.e00 = 1 - yy - zz; _this.e01 = xy - wz; _this.e02 = xz + wy; _this.e10 = xy + wz; _this.e11 = 1 - xx - zz; _this.e12 = yz - wx; _this.e20 = xz - wy; _this.e21 = yz + wx; _this.e22 = 1 - xx - yy; return _this; } toString() { return "Quat[" + (this.x > 0 ? (this.x * 10000000 + 0.5 | 0) / 10000000 : (this.x * 10000000 - 0.5 | 0) / 10000000) + " i,\n" + " " + (this.y > 0 ? (this.y * 10000000 + 0.5 | 0) / 10000000 : (this.y * 10000000 - 0.5 | 0) / 10000000) + " j,\n" + " " + (this.z > 0 ? (this.z * 10000000 + 0.5 | 0) / 10000000 : (this.z * 10000000 - 0.5 | 0) / 10000000) + " k,\n" + " " + (this.w > 0 ? (this.w * 10000000 + 0.5 | 0) / 10000000 : (this.w * 10000000 - 0.5 | 0) / 10000000) + "]"; } } if(!oimo.dynamics) oimo.dynamics = {}; oimo.dynamics.Contact = class oimo_dynamics_Contact { constructor() { this._next = null; this._prev = null; this._link1 = new oimo.dynamics.ContactLink(); this._link2 = new oimo.dynamics.ContactLink(); this._s1 = null; this._s2 = null; this._b1 = null; this._b2 = null; this._detector = null; this._cachedDetectorData = new oimo.collision.narrowphase.detector.CachedDetectorData(); this._detectorResult = new oimo.collision.narrowphase.DetectorResult(); this._latest = false; this._shouldBeSkipped = false; this._manifold = new oimo.dynamics.constraint.contact.Manifold(); this._updater = new oimo.dynamics.constraint.contact.ManifoldUpdater(this._manifold); this._contactConstraint = new oimo.dynamics.constraint.contact.ContactConstraint(this._manifold); this._touching = false; } _updateManifold() { if(this._detector == null) { return; } let ptouching = this._touching; let result = this._detectorResult; this._detector.detect(result,this._s1._geom,this._s2._geom,this._s1._transform,this._s2._transform,this._cachedDetectorData); this._touching = result.numPoints > 0; if(this._touching) { this._manifold._buildBasis(result.normal); if(result.getMaxDepth() > oimo.common.Setting.contactUseAlternativePositionCorrectionAlgorithmDepthThreshold) { this._contactConstraint._positionCorrectionAlgorithm = oimo.common.Setting.alternativeContactPositionCorrectionAlgorithm; } else { this._contactConstraint._positionCorrectionAlgorithm = oimo.common.Setting.defaultContactPositionCorrectionAlgorithm; } if(result.incremental) { this._updater.incrementalUpdate(result,this._b1._transform,this._b2._transform); } else { this._updater.totalUpdate(result,this._b1._transform,this._b2._transform); } } else { this._manifold._clear(); } if(this._touching && !ptouching) { let cc1 = this._s1._contactCallback; let cc2 = this._s2._contactCallback; if(cc1 == cc2) { cc2 = null; } if(cc1 != null) { cc1.beginContact(this); } if(cc2 != null) { cc2.beginContact(this); } } if(!this._touching && ptouching) { let cc1 = this._s1._contactCallback; let cc2 = this._s2._contactCallback; if(cc1 == cc2) { cc2 = null; } if(cc1 != null) { cc1.endContact(this); } if(cc2 != null) { cc2.endContact(this); } } if(this._touching) { let cc1 = this._s1._contactCallback; let cc2 = this._s2._contactCallback; if(cc1 == cc2) { cc2 = null; } if(cc1 != null) { cc1.preSolve(this); } if(cc2 != null) { cc2.preSolve(this); } } } _postSolve() { let cc1 = this._s1._contactCallback; let cc2 = this._s2._contactCallback; if(cc1 == cc2) { cc2 = null; } if(cc1 != null) { cc1.postSolve(this); } if(cc2 != null) { cc2.postSolve(this); } } getShape1() { return this._s1; } getShape2() { return this._s2; } isTouching() { return this._touching; } getManifold() { return this._manifold; } getContactConstraint() { return this._contactConstraint; } getPrev() { return this._prev; } getNext() { return this._next; } } oimo.dynamics.ContactLink = class oimo_dynamics_ContactLink { constructor() { this._prev = null; this._next = null; this._contact = null; this._other = null; } getContact() { return this._contact; } getOther() { return this._other; } getPrev() { return this._prev; } getNext() { return this._next; } } oimo.dynamics.ContactManager = class oimo_dynamics_ContactManager { constructor(broadPhase) { this._broadPhase = broadPhase; this._collisionMatrix = new oimo.collision.narrowphase.CollisionMatrix(); this._numContacts = 0; } createContacts() { let pp = this._broadPhase._proxyPairList; while(pp != null) { let n = pp._next; while(true) { let s1; let s2; if(pp._p1._id < pp._p2._id) { s1 = pp._p1.userData; s2 = pp._p2.userData; } else { s1 = pp._p2.userData; s2 = pp._p1.userData; } if(!this.shouldCollide(s1,s2)) { break; } let b1 = s1._rigidBody; let b2 = s2._rigidBody; let l; if(b1._numContactLinks < b2._numContactLinks) { l = b1._contactLinkList; } else { l = b2._contactLinkList; } let id1 = s1._id; let id2 = s2._id; let found = false; while(l != null) { let c = l._contact; if(c._s1._id == id1 && c._s2._id == id2) { c._latest = true; found = true; break; } l = l._next; } if(!found) { let first = this._contactPool; if(first != null) { this._contactPool = first._next; first._next = null; } else { first = new oimo.dynamics.Contact(); } let c = first; if(this._contactList == null) { this._contactList = c; this._contactListLast = c; } else { this._contactListLast._next = c; c._prev = this._contactListLast; this._contactListLast = c; } c._latest = true; let detector = this._collisionMatrix.detectors[s1._geom._type][s2._geom._type]; c._s1 = s1; c._s2 = s2; c._b1 = s1._rigidBody; c._b2 = s2._rigidBody; c._touching = false; if(c._b1._contactLinkList == null) { c._b1._contactLinkList = c._link1; c._b1._contactLinkListLast = c._link1; } else { c._b1._contactLinkListLast._next = c._link1; c._link1._prev = c._b1._contactLinkListLast; c._b1._contactLinkListLast = c._link1; } if(c._b2._contactLinkList == null) { c._b2._contactLinkList = c._link2; c._b2._contactLinkListLast = c._link2; } else { c._b2._contactLinkListLast._next = c._link2; c._link2._prev = c._b2._contactLinkListLast; c._b2._contactLinkListLast = c._link2; } c._b1._numContactLinks++; c._b2._numContactLinks++; c._link1._other = c._b2; c._link2._other = c._b1; c._link1._contact = c; c._link2._contact = c; c._detector = detector; let _this = c._contactConstraint; _this._s1 = s1; _this._s2 = s2; _this._b1 = _this._s1._rigidBody; _this._b2 = _this._s2._rigidBody; _this._tf1 = _this._b1._transform; _this._tf2 = _this._b2._transform; this._numContacts++; } break; } pp = n; } } destroyOutdatedContacts() { let incremental = this._broadPhase._incremental; let c = this._contactList; while(c != null) { let n = c._next; while(true) { if(c._latest) { c._latest = false; c._shouldBeSkipped = false; break; } if(!incremental) { let prev = c._prev; let next = c._next; if(prev != null) { prev._next = next; } if(next != null) { next._prev = prev; } if(c == this._contactList) { this._contactList = this._contactList._next; } if(c == this._contactListLast) { this._contactListLast = this._contactListLast._prev; } c._next = null; c._prev = null; if(c._touching) { let cc1 = c._s1._contactCallback; let cc2 = c._s2._contactCallback; if(cc1 == cc2) { cc2 = null; } if(cc1 != null) { cc1.endContact(c); } if(cc2 != null) { cc2.endContact(c); } } let prev1 = c._link1._prev; let next1 = c._link1._next; if(prev1 != null) { prev1._next = next1; } if(next1 != null) { next1._prev = prev1; } if(c._link1 == c._b1._contactLinkList) { c._b1._contactLinkList = c._b1._contactLinkList._next; } if(c._link1 == c._b1._contactLinkListLast) { c._b1._contactLinkListLast = c._b1._contactLinkListLast._prev; } c._link1._next = null; c._link1._prev = null; let prev2 = c._link2._prev; let next2 = c._link2._next; if(prev2 != null) { prev2._next = next2; } if(next2 != null) { next2._prev = prev2; } if(c._link2 == c._b2._contactLinkList) { c._b2._contactLinkList = c._b2._contactLinkList._next; } if(c._link2 == c._b2._contactLinkListLast) { c._b2._contactLinkListLast = c._b2._contactLinkListLast._prev; } c._link2._next = null; c._link2._prev = null; c._b1._numContactLinks--; c._b2._numContactLinks--; c._link1._other = null; c._link2._other = null; c._link1._contact = null; c._link2._contact = null; c._s1 = null; c._s2 = null; c._b1 = null; c._b2 = null; c._touching = false; c._cachedDetectorData._clear(); c._manifold._clear(); c._detector = null; let _this = c._contactConstraint; _this._s1 = null; _this._s2 = null; _this._b1 = null; _this._b2 = null; _this._tf1 = null; _this._tf2 = null; c._next = this._contactPool; this._contactPool = c; this._numContacts--; break; } let s1 = c._s1; let s2 = c._s2; let r1 = s1._rigidBody; let r2 = s2._rigidBody; if(!(!r1._sleeping && r1._type != 1) && !(!r2._sleeping && r2._type != 1)) { c._shouldBeSkipped = true; break; } let aabb1 = s1._aabb; let aabb2 = s2._aabb; let proxy1 = s1._proxy; let proxy2 = s2._proxy; if(!(proxy1._aabbMinX < proxy2._aabbMaxX && proxy1._aabbMaxX > proxy2._aabbMinX && proxy1._aabbMinY < proxy2._aabbMaxY && proxy1._aabbMaxY > proxy2._aabbMinY && proxy1._aabbMinZ < proxy2._aabbMaxZ && proxy1._aabbMaxZ > proxy2._aabbMinZ) || !this.shouldCollide(s1,s2)) { let prev = c._prev; let next = c._next; if(prev != null) { prev._next = next; } if(next != null) { next._prev = prev; } if(c == this._contactList) { this._contactList = this._contactList._next; } if(c == this._contactListLast) { this._contactListLast = this._contactListLast._prev; } c._next = null; c._prev = null; if(c._touching) { let cc1 = c._s1._contactCallback; let cc2 = c._s2._contactCallback; if(cc1 == cc2) { cc2 = null; } if(cc1 != null) { cc1.endContact(c); } if(cc2 != null) { cc2.endContact(c); } } let prev1 = c._link1._prev; let next1 = c._link1._next; if(prev1 != null) { prev1._next = next1; } if(next1 != null) { next1._prev = prev1; } if(c._link1 == c._b1._contactLinkList) { c._b1._contactLinkList = c._b1._contactLinkList._next; } if(c._link1 == c._b1._contactLinkListLast) { c._b1._contactLinkListLast = c._b1._contactLinkListLast._prev; } c._link1._next = null; c._link1._prev = null; let prev2 = c._link2._prev; let next2 = c._link2._next; if(prev2 != null) { prev2._next = next2; } if(next2 != null) { next2._prev = prev2; } if(c._link2 == c._b2._contactLinkList) { c._b2._contactLinkList = c._b2._contactLinkList._next; } if(c._link2 == c._b2._contactLinkListLast) { c._b2._contactLinkListLast = c._b2._contactLinkListLast._prev; } c._link2._next = null; c._link2._prev = null; c._b1._numContactLinks--; c._b2._numContactLinks--; c._link1._other = null; c._link2._other = null; c._link1._contact = null; c._link2._contact = null; c._s1 = null; c._s2 = null; c._b1 = null; c._b2 = null; c._touching = false; c._cachedDetectorData._clear(); c._manifold._clear(); c._detector = null; let _this = c._contactConstraint; _this._s1 = null; _this._s2 = null; _this._b1 = null; _this._b2 = null; _this._tf1 = null; _this._tf2 = null; c._next = this._contactPool; this._contactPool = c; this._numContacts--; break; } c._shouldBeSkipped = !(aabb1._minX < aabb2._maxX && aabb1._maxX > aabb2._minX && aabb1._minY < aabb2._maxY && aabb1._maxY > aabb2._minY && aabb1._minZ < aabb2._maxZ && aabb1._maxZ > aabb2._minZ); break; } c = n; } } shouldCollide(s1,s2) { let r1 = s1._rigidBody; let r2 = s2._rigidBody; if(r1 == r2) { return false; } if(r1._type != 0 && r2._type != 0) { return false; } if((s1._collisionGroup & s2._collisionMask) == 0 || (s2._collisionGroup & s1._collisionMask) == 0) { return false; } let jl; let other; if(r1._numJointLinks < r2._numJointLinks) { jl = r1._jointLinkList; other = r2; } else { jl = r2._jointLinkList; other = r1; } while(jl != null) { if(jl._other == other && !jl._joint._allowCollision) { return false; } jl = jl._next; } return true; } _updateContacts() { this._broadPhase.collectPairs(); this.createContacts(); this.destroyOutdatedContacts(); } _postSolve() { let c = this._contactList; while(c != null) { let n = c._next; if(c._touching) { c._postSolve(); } c = n; } } getNumContacts() { return this._numContacts; } getContactList() { return this._contactList; } } oimo.dynamics.Island = class oimo_dynamics_Island { constructor() { this.rigidBodies = new Array(oimo.common.Setting.islandInitialRigidBodyArraySize); this.solvers = new Array(oimo.common.Setting.islandInitialConstraintArraySize); this.solversSi = new Array(oimo.common.Setting.islandInitialConstraintArraySize); this.solversNgs = new Array(oimo.common.Setting.islandInitialConstraintArraySize); this.numRigidBodies = 0; this.numSolvers = 0; this.numSolversSi = 0; this.numSolversNgs = 0; } _clear() { while(this.numRigidBodies > 0) this.rigidBodies[--this.numRigidBodies] = null; while(this.numSolvers > 0) this.solvers[--this.numSolvers] = null; while(this.numSolversSi > 0) this.solversSi[--this.numSolversSi] = null; while(this.numSolversNgs > 0) this.solversNgs[--this.numSolversNgs] = null; } _addRigidBody(rigidBody) { if(this.numRigidBodies == this.rigidBodies.length) { let newArray = new Array(this.numRigidBodies << 1); let _g = 0; let _g1 = this.numRigidBodies; while(_g < _g1) { let i = _g++; newArray[i] = this.rigidBodies[i]; this.rigidBodies[i] = null; } this.rigidBodies = newArray; } rigidBody._addedToIsland = true; this.rigidBodies[this.numRigidBodies++] = rigidBody; } _addConstraintSolver(solver,positionCorrection) { if(this.numSolvers == this.solvers.length) { let newArray = new Array(this.numSolvers << 1); let _g = 0; let _g1 = this.numSolvers; while(_g < _g1) { let i = _g++; newArray[i] = this.solvers[i]; this.solvers[i] = null; } this.solvers = newArray; } solver._addedToIsland = true; this.solvers[this.numSolvers++] = solver; if(positionCorrection == oimo.dynamics.constraint.PositionCorrectionAlgorithm.SPLIT_IMPULSE) { if(this.numSolversSi == this.solversSi.length) { let newArray = new Array(this.numSolversSi << 1); let _g = 0; let _g1 = this.numSolversSi; while(_g < _g1) { let i = _g++; newArray[i] = this.solversSi[i]; this.solversSi[i] = null; } this.solversSi = newArray; } this.solversSi[this.numSolversSi++] = solver; } if(positionCorrection == oimo.dynamics.constraint.PositionCorrectionAlgorithm.NGS) { if(this.numSolversNgs == this.solversNgs.length) { let newArray = new Array(this.numSolversNgs << 1); let _g = 0; let _g1 = this.numSolversNgs; while(_g < _g1) { let i = _g++; newArray[i] = this.solversNgs[i]; this.solversNgs[i] = null; } this.solversNgs = newArray; } this.solversNgs[this.numSolversNgs++] = solver; } } _stepSingleRigidBody(timeStep,rb) { let dt = timeStep.dt; let dst = rb._ptransform; let src = rb._transform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; rb._linearContactImpulseX = 0; rb._linearContactImpulseY = 0; rb._linearContactImpulseZ = 0; rb._angularContactImpulseX = 0; rb._angularContactImpulseY = 0; rb._angularContactImpulseZ = 0; if(rb._autoSleep && rb._velX * rb._velX + rb._velY * rb._velY + rb._velZ * rb._velZ < oimo.common.Setting.sleepingVelocityThreshold * oimo.common.Setting.sleepingVelocityThreshold && rb._angVelX * rb._angVelX + rb._angVelY * rb._angVelY + rb._angVelZ * rb._angVelZ < oimo.common.Setting.sleepingAngularVelocityThreshold * oimo.common.Setting.sleepingAngularVelocityThreshold) { rb._sleepTime += dt; if(rb._sleepTime > oimo.common.Setting.sleepingTimeThreshold) { rb._sleeping = true; rb._sleepTime = 0; } } else { rb._sleepTime = 0; } if(!rb._sleeping) { if(rb._type == 0) { let x = dt * rb._linearDamping; let x2 = x * x; let linScale = 1 / (1 + x + x2 * (0.5 + x * 0.16666666666666666 + x2 * 0.041666666666666664)); let x1 = dt * rb._angularDamping; let x21 = x1 * x1; let angScale = 1 / (1 + x1 + x21 * (0.5 + x1 * 0.16666666666666666 + x21 * 0.041666666666666664)); let linAccX; let linAccY; let linAccZ; let angAccX; let angAccY; let angAccZ; linAccX = this.gravityX * rb._gravityScale; linAccY = this.gravityY * rb._gravityScale; linAccZ = this.gravityZ * rb._gravityScale; linAccX += rb._forceX * rb._invMass; linAccY += rb._forceY * rb._invMass; linAccZ += rb._forceZ * rb._invMass; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = rb._invInertia00 * rb._torqueX + rb._invInertia01 * rb._torqueY + rb._invInertia02 * rb._torqueZ; __tmp__Y = rb._invInertia10 * rb._torqueX + rb._invInertia11 * rb._torqueY + rb._invInertia12 * rb._torqueZ; __tmp__Z = rb._invInertia20 * rb._torqueX + rb._invInertia21 * rb._torqueY + rb._invInertia22 * rb._torqueZ; angAccX = __tmp__X; angAccY = __tmp__Y; angAccZ = __tmp__Z; rb._velX += linAccX * dt; rb._velY += linAccY * dt; rb._velZ += linAccZ * dt; rb._velX *= linScale; rb._velY *= linScale; rb._velZ *= linScale; rb._angVelX += angAccX * dt; rb._angVelY += angAccY * dt; rb._angVelZ += angAccZ * dt; rb._angVelX *= angScale; rb._angVelY *= angScale; rb._angVelZ *= angScale; } rb._integrate(dt); let s = rb._shapeList; while(s != null) { let n = s._next; let tf1 = rb._ptransform; let tf2 = rb._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } } } _step(timeStep,numVelocityIterations,numPositionIterations) { let dt = timeStep.dt; let sleepIsland = true; let _g = 0; let _g1 = this.numRigidBodies; while(_g < _g1) { let rb = this.rigidBodies[_g++]; let dst = rb._ptransform; let src = rb._transform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; rb._linearContactImpulseX = 0; rb._linearContactImpulseY = 0; rb._linearContactImpulseZ = 0; rb._angularContactImpulseX = 0; rb._angularContactImpulseY = 0; rb._angularContactImpulseZ = 0; rb._sleeping = false; if(rb._autoSleep && rb._velX * rb._velX + rb._velY * rb._velY + rb._velZ * rb._velZ < oimo.common.Setting.sleepingVelocityThreshold * oimo.common.Setting.sleepingVelocityThreshold && rb._angVelX * rb._angVelX + rb._angVelY * rb._angVelY + rb._angVelZ * rb._angVelZ < oimo.common.Setting.sleepingAngularVelocityThreshold * oimo.common.Setting.sleepingAngularVelocityThreshold) { rb._sleepTime += dt; } else { rb._sleepTime = 0; } if(rb._sleepTime < oimo.common.Setting.sleepingTimeThreshold) { sleepIsland = false; } if(rb._type == 0) { let x = dt * rb._linearDamping; let x2 = x * x; let linScale = 1 / (1 + x + x2 * (0.5 + x * 0.16666666666666666 + x2 * 0.041666666666666664)); let x1 = dt * rb._angularDamping; let x21 = x1 * x1; let angScale = 1 / (1 + x1 + x21 * (0.5 + x1 * 0.16666666666666666 + x21 * 0.041666666666666664)); let linAccX; let linAccY; let linAccZ; let angAccX; let angAccY; let angAccZ; linAccX = this.gravityX * rb._gravityScale; linAccY = this.gravityY * rb._gravityScale; linAccZ = this.gravityZ * rb._gravityScale; linAccX += rb._forceX * rb._invMass; linAccY += rb._forceY * rb._invMass; linAccZ += rb._forceZ * rb._invMass; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = rb._invInertia00 * rb._torqueX + rb._invInertia01 * rb._torqueY + rb._invInertia02 * rb._torqueZ; __tmp__Y = rb._invInertia10 * rb._torqueX + rb._invInertia11 * rb._torqueY + rb._invInertia12 * rb._torqueZ; __tmp__Z = rb._invInertia20 * rb._torqueX + rb._invInertia21 * rb._torqueY + rb._invInertia22 * rb._torqueZ; angAccX = __tmp__X; angAccY = __tmp__Y; angAccZ = __tmp__Z; rb._velX += linAccX * dt; rb._velY += linAccY * dt; rb._velZ += linAccZ * dt; rb._velX *= linScale; rb._velY *= linScale; rb._velZ *= linScale; rb._angVelX += angAccX * dt; rb._angVelY += angAccY * dt; rb._angVelZ += angAccZ * dt; rb._angVelX *= angScale; rb._angVelY *= angScale; rb._angVelZ *= angScale; } } if(sleepIsland) { let _g = 0; let _g1 = this.numRigidBodies; while(_g < _g1) { let rb = this.rigidBodies[_g++]; rb._sleeping = true; rb._sleepTime = 0; } return; } let _g2 = 0; let _g3 = this.numSolvers; while(_g2 < _g3) this.solvers[_g2++].preSolveVelocity(timeStep); let _g4 = 0; let _g5 = this.numSolvers; while(_g4 < _g5) this.solvers[_g4++].warmStart(timeStep); let _g6 = 0; while(_g6 < numVelocityIterations) { ++_g6; let _g = 0; let _g1 = this.numSolvers; while(_g < _g1) this.solvers[_g++].solveVelocity(); } let _g7 = 0; let _g8 = this.numSolvers; while(_g7 < _g8) this.solvers[_g7++].postSolveVelocity(timeStep); let _g9 = 0; let _g10 = this.numRigidBodies; while(_g9 < _g10) this.rigidBodies[_g9++]._integrate(dt); let _g11 = 0; let _g12 = this.numSolversSi; while(_g11 < _g12) this.solversSi[_g11++].preSolvePosition(timeStep); let _g13 = 0; while(_g13 < numPositionIterations) { ++_g13; let _g = 0; let _g1 = this.numSolversSi; while(_g < _g1) this.solversSi[_g++].solvePositionSplitImpulse(); } let _g14 = 0; let _g15 = this.numRigidBodies; while(_g14 < _g15) this.rigidBodies[_g14++]._integratePseudoVelocity(); let _g16 = 0; let _g17 = this.numSolversNgs; while(_g16 < _g17) this.solversNgs[_g16++].preSolvePosition(timeStep); let _g18 = 0; while(_g18 < numPositionIterations) { ++_g18; let _g = 0; let _g1 = this.numSolversNgs; while(_g < _g1) this.solversNgs[_g++].solvePositionNgs(timeStep); } let _g19 = 0; let _g20 = this.numSolvers; while(_g19 < _g20) this.solvers[_g19++].postSolve(); let _g21 = 0; let _g22 = this.numRigidBodies; while(_g21 < _g22) { let rb = this.rigidBodies[_g21++]; let s = rb._shapeList; while(s != null) { let n = s._next; let tf1 = rb._ptransform; let tf2 = rb._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } } } } oimo.dynamics.TimeStep = class oimo_dynamics_TimeStep { constructor() { this.dt = 0; this.invDt = 0; this.dtRatio = 1; } } oimo.dynamics.World = class oimo_dynamics_World { constructor(broadPhaseType,gravity) { if(broadPhaseType == null) { broadPhaseType = 2; } switch(broadPhaseType) { case 1: this._broadPhase = new oimo.collision.broadphase.bruteforce.BruteForceBroadPhase(); break; case 2: this._broadPhase = new oimo.collision.broadphase.bvh.BvhBroadPhase(); break; } this._contactManager = new oimo.dynamics.ContactManager(this._broadPhase); if(gravity == null) { gravity = new oimo.common.Vec3(0,-9.80665,0); } this._gravity = new oimo.common.Vec3(gravity.x,gravity.y,gravity.z); this._rigidBodyList = null; this._rigidBodyListLast = null; this._jointList = null; this._jointListLast = null; this._numRigidBodies = 0; this._numShapes = 0; this._numJoints = 0; this._numIslands = 0; this._numVelocityIterations = 10; this._numPositionIterations = 5; this._rayCastWrapper = new oimo.dynamics._World.RayCastWrapper(); this._convexCastWrapper = new oimo.dynamics._World.ConvexCastWrapper(); this._aabbTestWrapper = new oimo.dynamics._World.AabbTestWrapper(); this._island = new oimo.dynamics.Island(); this._solversInIslands = new Array(oimo.common.Setting.islandInitialConstraintArraySize); this._rigidBodyStack = new Array(oimo.common.Setting.islandInitialRigidBodyArraySize); this._timeStep = new oimo.dynamics.TimeStep(); this._pool = new oimo.common.Pool(); this._shapeIdCount = 0; } _updateContacts() { let st = Date.now() / 1000; this._contactManager._updateContacts(); oimo.dynamics.common.Performance.broadPhaseCollisionTime = (Date.now() / 1000 - st) * 1000; let st1 = Date.now() / 1000; let c = this._contactManager._contactList; while(c != null) { let n = c._next; if(!c._shouldBeSkipped) { c._updateManifold(); } c = n; } oimo.dynamics.common.Performance.narrowPhaseCollisionTime = (Date.now() / 1000 - st1) * 1000; } _solveIslands() { let st = Date.now() / 1000; if(oimo.common.Setting.disableSleeping) { let b = this._rigidBodyList; while(b != null) { b._sleeping = false; b._sleepTime = 0; b = b._next; } } if(this._rigidBodyStack.length < this._numRigidBodies) { let newStackSize = this._rigidBodyStack.length << 1; while(newStackSize < this._numRigidBodies) newStackSize <<= 1; this._rigidBodyStack = new Array(newStackSize); } this._numIslands = 0; let _this = this._island; let gravity = this._gravity; _this.gravityX = gravity.x; _this.gravityY = gravity.y; _this.gravityZ = gravity.z; let b = this._rigidBodyList; this._numSolversInIslands = 0; while(b != null) { let n = b._next; while(!(b._addedToIsland || b._sleeping || b._type == 1)) { if(b._numContactLinks == 0 && b._numJointLinks == 0) { this._island._stepSingleRigidBody(this._timeStep,b); this._numIslands++; break; } this.buildIsland(b); this._island._step(this._timeStep,this._numVelocityIterations,this._numPositionIterations); this._island._clear(); this._numIslands++; break; } b = n; } this._contactManager._postSolve(); b = this._rigidBodyList; while(b != null) { b._addedToIsland = false; b = b._next; } b = this._rigidBodyList; while(b != null) { b._forceX = 0; b._forceY = 0; b._forceZ = 0; b._torqueX = 0; b._torqueY = 0; b._torqueZ = 0; b = b._next; } while(this._numSolversInIslands > 0) { this._solversInIslands[--this._numSolversInIslands]._addedToIsland = false; this._solversInIslands[this._numSolversInIslands] = null; } oimo.dynamics.common.Performance.dynamicsTime = (Date.now() / 1000 - st) * 1000; } buildIsland(base) { let stackCount = 1; this._island._addRigidBody(base); this._rigidBodyStack[0] = base; while(stackCount > 0) { let rb = this._rigidBodyStack[--stackCount]; this._rigidBodyStack[stackCount] = null; if(rb._type == 1) { continue; } let cl = rb._contactLinkList; while(cl != null) { let n = cl._next; let cc = cl._contact._contactConstraint; let ccs = cl._contact._contactConstraint._solver; if(cc.isTouching() && !ccs._addedToIsland) { if(this._solversInIslands.length == this._numSolversInIslands) { let newArray = new Array(this._numSolversInIslands << 1); let _g = 0; let _g1 = this._numSolversInIslands; while(_g < _g1) { let i = _g++; newArray[i] = this._solversInIslands[i]; this._solversInIslands[i] = null; } this._solversInIslands = newArray; } this._solversInIslands[this._numSolversInIslands++] = ccs; this._island._addConstraintSolver(ccs,cc._positionCorrectionAlgorithm); let other = cl._other; if(!other._addedToIsland) { this._island._addRigidBody(other); this._rigidBodyStack[stackCount++] = other; } } cl = n; } let jl = rb._jointLinkList; while(jl != null) { let n = jl._next; let j = jl._joint; let js1 = j._solver; if(!js1._addedToIsland) { if(this._solversInIslands.length == this._numSolversInIslands) { let newArray = new Array(this._numSolversInIslands << 1); let _g = 0; let _g1 = this._numSolversInIslands; while(_g < _g1) { let i = _g++; newArray[i] = this._solversInIslands[i]; this._solversInIslands[i] = null; } this._solversInIslands = newArray; } this._solversInIslands[this._numSolversInIslands++] = js1; this._island._addConstraintSolver(js1,j._positionCorrectionAlgorithm); let other = jl._other; if(!other._addedToIsland) { this._island._addRigidBody(other); this._rigidBodyStack[stackCount++] = other; } } jl = n; } } } _drawBvh(d,tree) { if(d.drawBvh) { this._drawBvhNode(d,tree._root,0,d.style.bvhNodeColor); } } _drawBvhNode(d,node,level,color) { if(node == null) { return; } if(level >= d.drawBvhMinLevel && level <= d.drawBvhMaxLevel) { let _this = this._pool; let min = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this._pool; let max = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]; let v = min; v.x = node._aabbMinX; v.y = node._aabbMinY; v.z = node._aabbMinZ; let v1 = max; v1.x = node._aabbMaxX; v1.y = node._aabbMaxY; v1.z = node._aabbMaxZ; d.aabb(min,max,color); let _this2 = this._pool; if(min != null) { min.zero(); if(_this2.sizeVec3 == _this2.stackVec3.length) { let newArray = new Array(_this2.sizeVec3 << 1); let _g = 0; let _g1 = _this2.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this2.stackVec3[i]; _this2.stackVec3[i] = null; } _this2.stackVec3 = newArray; } _this2.stackVec3[_this2.sizeVec3++] = min; } let _this3 = this._pool; if(max != null) { max.zero(); if(_this3.sizeVec3 == _this3.stackVec3.length) { let newArray = new Array(_this3.sizeVec3 << 1); let _g = 0; let _g1 = _this3.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this3.stackVec3[i]; _this3.stackVec3[i] = null; } _this3.stackVec3 = newArray; } _this3.stackVec3[_this3.sizeVec3++] = max; } } this._drawBvhNode(d,node._children[0],level + 1,color); this._drawBvhNode(d,node._children[1],level + 1,color); } _drawRigidBodies(d) { let style = d.style; let r = this._rigidBodyList; while(r != null) { let n = r._next; if(d.drawBases) { let style = d.style; d.basis(r._transform,style.basisLength,style.basisColorX,style.basisColorY,style.basisColorZ); } let shapeColor = null; let isDynamic = r._type == 0; if(!isDynamic) { shapeColor = r._type == 2 ? style.kinematicShapeColor : style.staticShapeColor; } let s = r._shapeList; while(s != null) { let n = s._next; if(isDynamic) { if((s._id & 1) == 0) { shapeColor = r._sleeping ? style.sleepingShapeColor1 : r._sleepTime > oimo.common.Setting.sleepingTimeThreshold ? style.sleepyShapeColor1 : style.shapeColor1; } else { shapeColor = r._sleeping ? style.sleepingShapeColor2 : r._sleepTime > oimo.common.Setting.sleepingTimeThreshold ? style.sleepyShapeColor2 : style.shapeColor2; } } if(d.drawShapes) { let geom = s._geom; let tf = s._transform; switch(geom._type) { case 0: d.sphere(tf,geom._radius,shapeColor); break; case 1: let g = geom; let _this = this._pool; let hx = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let v = hx; v.x = g._halfExtentsX; v.y = g._halfExtentsY; v.z = g._halfExtentsZ; d.box(tf,hx,shapeColor); let _this1 = this._pool; if(hx != null) { hx.zero(); if(_this1.sizeVec3 == _this1.stackVec3.length) { let newArray = new Array(_this1.sizeVec3 << 1); let _g = 0; let _g1 = _this1.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this1.stackVec3[i]; _this1.stackVec3[i] = null; } _this1.stackVec3 = newArray; } _this1.stackVec3[_this1.sizeVec3++] = hx; } break; case 2: let g1 = geom; d.cylinder(tf,g1._radius,g1._halfHeight,shapeColor); break; case 3: let g2 = geom; d.cone(tf,g2._radius,g2._halfHeight,shapeColor); break; case 4: let g3 = geom; d.capsule(tf,g3._radius,g3._halfHeight,shapeColor); break; case 5: let g4 = geom; let n = g4._numVertices; let _this2 = this._pool; let v1 = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]; let _this3 = this._pool; let v2 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; let _this4 = this._pool; let v3 = _this4.sizeVec3 == 0 ? new oimo.common.Vec3() : _this4.stackVec3[--_this4.sizeVec3]; let _this5 = this._pool; let v12 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3]; let _this6 = this._pool; let v13 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3]; let _this7 = this._pool; let normal = _this7.sizeVec3 == 0 ? new oimo.common.Vec3() : _this7.stackVec3[--_this7.sizeVec3]; let _this8 = this._pool; let m = _this8.sizeMat3 == 0 ? new oimo.common.Mat3() : _this8.stackMat3[--_this8.sizeMat3]; let _this9 = this._pool; let o = _this9.sizeVec3 == 0 ? new oimo.common.Vec3() : _this9.stackVec3[--_this9.sizeVec3]; let m1 = m; m1.e00 = tf._rotation00; m1.e01 = tf._rotation01; m1.e02 = tf._rotation02; m1.e10 = tf._rotation10; m1.e11 = tf._rotation11; m1.e12 = tf._rotation12; m1.e20 = tf._rotation20; m1.e21 = tf._rotation21; m1.e22 = tf._rotation22; let v4 = o; v4.x = tf._positionX; v4.y = tf._positionY; v4.z = tf._positionZ; let _g = 0; while(_g < n) { let i = _g++; let _this = g4._tmpVertices[i]; let v = g4._vertices[i]; _this.x = v.x; _this.y = v.y; _this.z = v.z; let y = _this.x * m.e10 + _this.y * m.e11 + _this.z * m.e12; let z = _this.x * m.e20 + _this.y * m.e21 + _this.z * m.e22; _this.x = _this.x * m.e00 + _this.y * m.e01 + _this.z * m.e02; _this.y = y; _this.z = z; _this.x += o.x; _this.y += o.y; _this.z += o.z; } if(n > 30) { let _g = 0; while(_g < n) { let i = _g++; let v = g4._tmpVertices[i]; v1.x = v.x; v1.y = v.y; v1.z = v.z; let v3 = g4._tmpVertices[(i + 1) % n]; v2.x = v3.x; v2.y = v3.y; v2.z = v3.z; d.line(v1,v2,shapeColor); } } else if(this._debugDraw.wireframe || n > 10) { let _g = 0; while(_g < n) { let i = _g++; let v = g4._tmpVertices[i]; v1.x = v.x; v1.y = v.y; v1.z = v.z; let _g1 = 0; while(_g1 < i) { let v = g4._tmpVertices[_g1++]; v2.x = v.x; v2.y = v.y; v2.z = v.z; d.line(v1,v2,shapeColor); } } } else { let _g = 0; while(_g < n) { let i = _g++; let v = g4._tmpVertices[i]; v1.x = v.x; v1.y = v.y; v1.z = v.z; let _g1 = 0; while(_g1 < i) { let j = _g1++; let v = g4._tmpVertices[j]; v2.x = v.x; v2.y = v.y; v2.z = v.z; let _g = 0; while(_g < j) { let v = g4._tmpVertices[_g++]; v3.x = v.x; v3.y = v.y; v3.z = v.z; v12.x = v2.x; v12.y = v2.y; v12.z = v2.z; let _this = v12; _this.x -= v1.x; _this.y -= v1.y; _this.z -= v1.z; v13.x = v3.x; v13.y = v3.y; v13.z = v3.z; let _this1 = v13; _this1.x -= v1.x; _this1.y -= v1.y; _this1.z -= v1.z; normal.x = v12.x; normal.y = v12.y; normal.z = v12.z; let _this2 = normal; let y = _this2.z * v13.x - _this2.x * v13.z; let z = _this2.x * v13.y - _this2.y * v13.x; _this2.x = _this2.y * v13.z - _this2.z * v13.y; _this2.y = y; _this2.z = z; let invLen = Math.sqrt(_this2.x * _this2.x + _this2.y * _this2.y + _this2.z * _this2.z); if(invLen > 0) { invLen = 1 / invLen; } _this2.x *= invLen; _this2.y *= invLen; _this2.z *= invLen; d.triangle(v1,v2,v3,normal,normal,normal,shapeColor); normal.x = -normal.x; normal.y = -normal.y; normal.z = -normal.z; d.triangle(v1,v3,v2,normal,normal,normal,shapeColor); } } } } let _this10 = this._pool; if(v1 != null) { v1.zero(); if(_this10.sizeVec3 == _this10.stackVec3.length) { let newArray = new Array(_this10.sizeVec3 << 1); let _g = 0; let _g1 = _this10.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this10.stackVec3[i]; _this10.stackVec3[i] = null; } _this10.stackVec3 = newArray; } _this10.stackVec3[_this10.sizeVec3++] = v1; } let _this11 = this._pool; if(v2 != null) { v2.zero(); if(_this11.sizeVec3 == _this11.stackVec3.length) { let newArray = new Array(_this11.sizeVec3 << 1); let _g = 0; let _g1 = _this11.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this11.stackVec3[i]; _this11.stackVec3[i] = null; } _this11.stackVec3 = newArray; } _this11.stackVec3[_this11.sizeVec3++] = v2; } let _this12 = this._pool; if(v3 != null) { v3.zero(); if(_this12.sizeVec3 == _this12.stackVec3.length) { let newArray = new Array(_this12.sizeVec3 << 1); let _g = 0; let _g1 = _this12.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this12.stackVec3[i]; _this12.stackVec3[i] = null; } _this12.stackVec3 = newArray; } _this12.stackVec3[_this12.sizeVec3++] = v3; } let _this13 = this._pool; if(v12 != null) { v12.zero(); if(_this13.sizeVec3 == _this13.stackVec3.length) { let newArray = new Array(_this13.sizeVec3 << 1); let _g = 0; let _g1 = _this13.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this13.stackVec3[i]; _this13.stackVec3[i] = null; } _this13.stackVec3 = newArray; } _this13.stackVec3[_this13.sizeVec3++] = v12; } let _this14 = this._pool; if(v13 != null) { v13.zero(); if(_this14.sizeVec3 == _this14.stackVec3.length) { let newArray = new Array(_this14.sizeVec3 << 1); let _g = 0; let _g1 = _this14.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this14.stackVec3[i]; _this14.stackVec3[i] = null; } _this14.stackVec3 = newArray; } _this14.stackVec3[_this14.sizeVec3++] = v13; } let _this15 = this._pool; if(normal != null) { normal.zero(); if(_this15.sizeVec3 == _this15.stackVec3.length) { let newArray = new Array(_this15.sizeVec3 << 1); let _g = 0; let _g1 = _this15.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this15.stackVec3[i]; _this15.stackVec3[i] = null; } _this15.stackVec3 = newArray; } _this15.stackVec3[_this15.sizeVec3++] = normal; } let _this16 = this._pool; if(m != null) { m.e00 = 1; m.e01 = 0; m.e02 = 0; m.e10 = 0; m.e11 = 1; m.e12 = 0; m.e20 = 0; m.e21 = 0; m.e22 = 1; if(_this16.sizeMat3 == _this16.stackMat3.length) { let newArray = new Array(_this16.sizeMat3 << 1); let _g = 0; let _g1 = _this16.sizeMat3; while(_g < _g1) { let i = _g++; newArray[i] = _this16.stackMat3[i]; _this16.stackMat3[i] = null; } _this16.stackMat3 = newArray; } _this16.stackMat3[_this16.sizeMat3++] = m; } let _this17 = this._pool; if(o != null) { o.zero(); if(_this17.sizeVec3 == _this17.stackVec3.length) { let newArray = new Array(_this17.sizeVec3 << 1); let _g = 0; let _g1 = _this17.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this17.stackVec3[i]; _this17.stackVec3[i] = null; } _this17.stackVec3 = newArray; } _this17.stackVec3[_this17.sizeVec3++] = o; } break; } } if(d.drawAabbs) { let aabb = s._aabb; let color = style.aabbColor; let _this = this._pool; let min = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this._pool; let max = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]; let v = min; v.x = aabb._minX; v.y = aabb._minY; v.z = aabb._minZ; let v1 = max; v1.x = aabb._maxX; v1.y = aabb._maxY; v1.z = aabb._maxZ; d.aabb(min,max,color); let _this2 = this._pool; if(min != null) { min.zero(); if(_this2.sizeVec3 == _this2.stackVec3.length) { let newArray = new Array(_this2.sizeVec3 << 1); let _g = 0; let _g1 = _this2.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this2.stackVec3[i]; _this2.stackVec3[i] = null; } _this2.stackVec3 = newArray; } _this2.stackVec3[_this2.sizeVec3++] = min; } let _this3 = this._pool; if(max != null) { max.zero(); if(_this3.sizeVec3 == _this3.stackVec3.length) { let newArray = new Array(_this3.sizeVec3 << 1); let _g = 0; let _g1 = _this3.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this3.stackVec3[i]; _this3.stackVec3[i] = null; } _this3.stackVec3 = newArray; } _this3.stackVec3[_this3.sizeVec3++] = max; } } s = n; } r = n; } } _drawConstraints(d) { let style = d.style; if(d.drawPairs || d.drawContacts) { let c = this._contactManager._contactList; while(c != null) { let n = c._next; if(d.drawPairs) { let color = style.pairColor; let _this = this._pool; let v1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this._pool; let v2 = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]; let v = v1; v.x = c._s1._transform._positionX; v.y = c._s1._transform._positionY; v.z = c._s1._transform._positionZ; let v3 = v2; v3.x = c._s2._transform._positionX; v3.y = c._s2._transform._positionY; v3.z = c._s2._transform._positionZ; d.line(v1,v2,color); let _this2 = this._pool; if(v1 != null) { v1.zero(); if(_this2.sizeVec3 == _this2.stackVec3.length) { let newArray = new Array(_this2.sizeVec3 << 1); let _g = 0; let _g1 = _this2.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this2.stackVec3[i]; _this2.stackVec3[i] = null; } _this2.stackVec3 = newArray; } _this2.stackVec3[_this2.sizeVec3++] = v1; } let _this3 = this._pool; if(v2 != null) { v2.zero(); if(_this3.sizeVec3 == _this3.stackVec3.length) { let newArray = new Array(_this3.sizeVec3 << 1); let _g = 0; let _g1 = _this3.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this3.stackVec3[i]; _this3.stackVec3[i] = null; } _this3.stackVec3 = newArray; } _this3.stackVec3[_this3.sizeVec3++] = v2; } } if(d.drawContacts) { let cc = c._contactConstraint; let ps = c._contactConstraint._manifold._points; let _g = 0; let _g1 = c._contactConstraint._manifold._numPoints; while(_g < _g1) { let p = ps[_g++]; let style = d.style; let _this = this._pool; let pos1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this._pool; let pos2 = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]; let _this2 = this._pool; let normal = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]; let _this3 = this._pool; let tangent = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; let _this4 = this._pool; let binormal = _this4.sizeVec3 == 0 ? new oimo.common.Vec3() : _this4.stackVec3[--_this4.sizeVec3]; let v = pos1; v.x = p._pos1X; v.y = p._pos1Y; v.z = p._pos1Z; let v1 = pos2; v1.x = p._pos2X; v1.y = p._pos2Y; v1.z = p._pos2Z; let v2 = normal; v2.x = cc._manifold._normalX; v2.y = cc._manifold._normalY; v2.z = cc._manifold._normalZ; let v3 = tangent; v3.x = cc._manifold._tangentX; v3.y = cc._manifold._tangentY; v3.z = cc._manifold._tangentZ; let v4 = binormal; v4.x = cc._manifold._binormalX; v4.y = cc._manifold._binormalY; v4.z = cc._manifold._binormalZ; if(p._disabled) { d.point(pos1,style.disabledContactColor); d.point(pos2,style.disabledContactColor); d.line(pos1,pos2,style.disabledContactColor); } else if(p._warmStarted) { let color; switch(p._id & 3) { case 0: color = style.contactColor; break; case 1: color = style.contactColor2; break; case 2: color = style.contactColor3; break; default: color = style.contactColor4; } d.point(pos1,color); d.point(pos2,color); d.line(pos1,pos2,style.contactColor); } else { d.point(pos1,style.newContactColor); d.point(pos2,style.newContactColor); d.line(pos1,pos2,style.newContactColor); } pos2.x = pos1.x; pos2.y = pos1.y; pos2.z = pos1.z; let _this5 = pos2; let s = style.contactNormalLength; _this5.x += normal.x * s; _this5.y += normal.y * s; _this5.z += normal.z * s; d.line(pos1,pos2,style.contactNormalColor); if(d.drawContactBases) { pos2.x = pos1.x; pos2.y = pos1.y; pos2.z = pos1.z; let _this = pos2; let s = style.contactTangentLength; _this.x += tangent.x * s; _this.y += tangent.y * s; _this.z += tangent.z * s; d.line(pos1,pos2,style.contactTangentColor); pos2.x = pos1.x; pos2.y = pos1.y; pos2.z = pos1.z; let _this1 = pos2; let s1 = style.contactBinormalLength; _this1.x += binormal.x * s1; _this1.y += binormal.y * s1; _this1.z += binormal.z * s1; d.line(pos1,pos2,style.contactBinormalColor); } let _this6 = this._pool; if(pos1 != null) { pos1.zero(); if(_this6.sizeVec3 == _this6.stackVec3.length) { let newArray = new Array(_this6.sizeVec3 << 1); let _g = 0; let _g1 = _this6.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this6.stackVec3[i]; _this6.stackVec3[i] = null; } _this6.stackVec3 = newArray; } _this6.stackVec3[_this6.sizeVec3++] = pos1; } let _this7 = this._pool; if(pos2 != null) { pos2.zero(); if(_this7.sizeVec3 == _this7.stackVec3.length) { let newArray = new Array(_this7.sizeVec3 << 1); let _g = 0; let _g1 = _this7.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this7.stackVec3[i]; _this7.stackVec3[i] = null; } _this7.stackVec3 = newArray; } _this7.stackVec3[_this7.sizeVec3++] = pos2; } let _this8 = this._pool; if(normal != null) { normal.zero(); if(_this8.sizeVec3 == _this8.stackVec3.length) { let newArray = new Array(_this8.sizeVec3 << 1); let _g = 0; let _g1 = _this8.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this8.stackVec3[i]; _this8.stackVec3[i] = null; } _this8.stackVec3 = newArray; } _this8.stackVec3[_this8.sizeVec3++] = normal; } let _this9 = this._pool; if(tangent != null) { tangent.zero(); if(_this9.sizeVec3 == _this9.stackVec3.length) { let newArray = new Array(_this9.sizeVec3 << 1); let _g = 0; let _g1 = _this9.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this9.stackVec3[i]; _this9.stackVec3[i] = null; } _this9.stackVec3 = newArray; } _this9.stackVec3[_this9.sizeVec3++] = tangent; } let _this10 = this._pool; if(binormal != null) { binormal.zero(); if(_this10.sizeVec3 == _this10.stackVec3.length) { let newArray = new Array(_this10.sizeVec3 << 1); let _g = 0; let _g1 = _this10.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this10.stackVec3[i]; _this10.stackVec3[i] = null; } _this10.stackVec3 = newArray; } _this10.stackVec3[_this10.sizeVec3++] = binormal; } } } c = n; } } if(d.drawJoints) { let j = this._jointList; while(j != null) { let n = j._next; let _this = this._pool; let p1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this._pool; let p2 = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]; let v = p1; v.x = j._b1._transform._positionX; v.y = j._b1._transform._positionY; v.z = j._b1._transform._positionZ; let v1 = p2; v1.x = j._b2._transform._positionX; v1.y = j._b2._transform._positionY; v1.z = j._b2._transform._positionZ; let _this2 = this._pool; let anchor1 = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]; let _this3 = this._pool; let anchor2 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; let _this4 = this._pool; let basisX1 = _this4.sizeVec3 == 0 ? new oimo.common.Vec3() : _this4.stackVec3[--_this4.sizeVec3]; let _this5 = this._pool; let basisY1 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3]; let _this6 = this._pool; let basisZ1 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3]; let _this7 = this._pool; let basisX2 = _this7.sizeVec3 == 0 ? new oimo.common.Vec3() : _this7.stackVec3[--_this7.sizeVec3]; let _this8 = this._pool; let basisY2 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3]; let _this9 = this._pool; let basisZ2 = _this9.sizeVec3 == 0 ? new oimo.common.Vec3() : _this9.stackVec3[--_this9.sizeVec3]; let v2 = anchor1; v2.x = j._anchor1X; v2.y = j._anchor1Y; v2.z = j._anchor1Z; let v3 = anchor2; v3.x = j._anchor2X; v3.y = j._anchor2Y; v3.z = j._anchor2Z; let v4 = basisX1; v4.x = j._basisX1X; v4.y = j._basisX1Y; v4.z = j._basisX1Z; let v5 = basisY1; v5.x = j._basisY1X; v5.y = j._basisY1Y; v5.z = j._basisY1Z; let v6 = basisZ1; v6.x = j._basisZ1X; v6.y = j._basisZ1Y; v6.z = j._basisZ1Z; let v7 = basisX2; v7.x = j._basisX2X; v7.y = j._basisX2Y; v7.z = j._basisX2Z; let v8 = basisY2; v8.x = j._basisY2X; v8.y = j._basisY2Y; v8.z = j._basisY2Z; let v9 = basisZ2; v9.x = j._basisZ2X; v9.y = j._basisZ2Y; v9.z = j._basisZ2Z; d.line(p1,anchor1,d.style.jointLineColor); d.line(p2,anchor2,d.style.jointLineColor); if(d.drawJointLimits) { switch(j._type) { case 0: break; case 1: let lm = j._lm; this._drawRotationalLimit(d,anchor1,basisY1,basisZ1,basisY2,d.style.jointRotationalConstraintRadius,lm.lowerLimit,lm.upperLimit,d.style.jointLineColor); break; case 2: let j1 = j; let color = d.style.jointLineColor; let rlm = j1._rotLm; let tlm = j1._translLm; this._drawRotationalLimit(d,anchor2,basisY1,basisZ1,basisY2,d.style.jointRotationalConstraintRadius,rlm.lowerLimit,rlm.upperLimit,color); this._drawTranslationalLimit(d,anchor1,basisX1,tlm.lowerLimit,tlm.upperLimit,color); break; case 3: let lm1 = j._lm; this._drawTranslationalLimit(d,anchor1,basisX1,lm1.lowerLimit,lm1.upperLimit,d.style.jointLineColor); break; case 4: let j2 = j; let radius = d.style.jointRotationalConstraintRadius; let color1 = d.style.jointLineColor; let lm11 = j2._lm1; let lm2 = j2._lm2; this._drawRotationalLimit(d,anchor1,basisY1,basisZ1,basisY1,radius,j2._angleX - lm11.upperLimit,j2._angleX - lm11.lowerLimit,color1); this._drawRotationalLimit(d,anchor2,basisX2,basisY2,basisX2,radius,lm2.lowerLimit - j2._angleZ,lm2.upperLimit - j2._angleZ,color1); break; case 5: let j3 = j; let radius1 = d.style.jointRotationalConstraintRadius; let color2 = d.style.jointLineColor; let lm3 = j3._twistLm; this._drawRotationalLimit(d,anchor2,basisY2,basisZ2,basisY2,radius1,lm3.lowerLimit - j3._twistAngle,lm3.upperLimit - j3._twistAngle,color2); this._drawEllipseOnSphere(d,anchor1,basisX1,basisY1,basisZ1,j3._maxSwingAngle1,j3._maxSwingAngle2,radius1,color2); let _this10 = this._pool; let _this11 = _this10.sizeVec3 == 0 ? new oimo.common.Vec3() : _this10.stackVec3[--_this10.sizeVec3]; _this11.x = anchor2.x; _this11.y = anchor2.y; _this11.z = anchor2.z; let _this12 = _this11; _this12.x += basisX2.x * radius1; _this12.y += basisX2.y * radius1; _this12.z += basisX2.z * radius1; d.line(anchor2,_this12,color2); let _this13 = this._pool; if(_this12 != null) { _this12.zero(); if(_this13.sizeVec3 == _this13.stackVec3.length) { let newArray = new Array(_this13.sizeVec3 << 1); let _g = 0; let _g1 = _this13.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this13.stackVec3[i]; _this13.stackVec3[i] = null; } _this13.stackVec3 = newArray; } _this13.stackVec3[_this13.sizeVec3++] = _this12; } break; case 6: let j4 = j; let radius2 = d.style.jointRotationalConstraintRadius; let color3 = d.style.jointLineColor; let rxlm = j4._rotLms[0]; let rylm = j4._rotLms[1]; let rzlm = j4._rotLms[2]; this._drawTranslationalLimit3D(d,anchor1,basisX1,basisY1,basisZ1,j4._translLms[0],j4._translLms[1],j4._translLms[2],color3); let _this14 = this._pool; let rotYAxis = _this14.sizeVec3 == 0 ? new oimo.common.Vec3() : _this14.stackVec3[--_this14.sizeVec3]; let v10 = rotYAxis; v10.x = j4._axisYX; v10.y = j4._axisYY; v10.z = j4._axisYZ; let _this15 = this._pool; let _this16 = _this15.sizeVec3 == 0 ? new oimo.common.Vec3() : _this15.stackVec3[--_this15.sizeVec3]; _this16.x = basisX1.x; _this16.y = basisX1.y; _this16.z = basisX1.z; let rotYBasisX = _this16; let _this17 = this._pool; let _this18 = _this17.sizeVec3 == 0 ? new oimo.common.Vec3() : _this17.stackVec3[--_this17.sizeVec3]; _this18.x = basisX1.x; _this18.y = basisX1.y; _this18.z = basisX1.z; let _this19 = _this18; let y = _this19.z * rotYAxis.x - _this19.x * rotYAxis.z; let z = _this19.x * rotYAxis.y - _this19.y * rotYAxis.x; _this19.x = _this19.y * rotYAxis.z - _this19.z * rotYAxis.y; _this19.y = y; _this19.z = z; this._drawRotationalLimit(d,anchor2,basisY1,basisZ1,basisY1,radius2,j4._angleX - rxlm.upperLimit,j4._angleX - rxlm.lowerLimit,color3); this._drawRotationalLimit(d,anchor2,rotYBasisX,_this19,rotYBasisX,radius2,rylm.lowerLimit - j4._angleY,rylm.upperLimit - j4._angleY,color3); this._drawRotationalLimit(d,anchor2,basisX2,basisY2,basisX2,radius2,rzlm.lowerLimit - j4._angleZ,rzlm.upperLimit - j4._angleZ,color3); break; } } d.line(anchor1,anchor2,d.style.jointErrorColor); let _this20 = this._pool; if(p1 != null) { p1.zero(); if(_this20.sizeVec3 == _this20.stackVec3.length) { let newArray = new Array(_this20.sizeVec3 << 1); let _g = 0; let _g1 = _this20.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this20.stackVec3[i]; _this20.stackVec3[i] = null; } _this20.stackVec3 = newArray; } _this20.stackVec3[_this20.sizeVec3++] = p1; } let _this21 = this._pool; if(p2 != null) { p2.zero(); if(_this21.sizeVec3 == _this21.stackVec3.length) { let newArray = new Array(_this21.sizeVec3 << 1); let _g = 0; let _g1 = _this21.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this21.stackVec3[i]; _this21.stackVec3[i] = null; } _this21.stackVec3 = newArray; } _this21.stackVec3[_this21.sizeVec3++] = p2; } let _this22 = this._pool; if(anchor1 != null) { anchor1.zero(); if(_this22.sizeVec3 == _this22.stackVec3.length) { let newArray = new Array(_this22.sizeVec3 << 1); let _g = 0; let _g1 = _this22.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this22.stackVec3[i]; _this22.stackVec3[i] = null; } _this22.stackVec3 = newArray; } _this22.stackVec3[_this22.sizeVec3++] = anchor1; } let _this23 = this._pool; if(anchor2 != null) { anchor2.zero(); if(_this23.sizeVec3 == _this23.stackVec3.length) { let newArray = new Array(_this23.sizeVec3 << 1); let _g = 0; let _g1 = _this23.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this23.stackVec3[i]; _this23.stackVec3[i] = null; } _this23.stackVec3 = newArray; } _this23.stackVec3[_this23.sizeVec3++] = anchor2; } let _this24 = this._pool; if(basisX1 != null) { basisX1.zero(); if(_this24.sizeVec3 == _this24.stackVec3.length) { let newArray = new Array(_this24.sizeVec3 << 1); let _g = 0; let _g1 = _this24.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this24.stackVec3[i]; _this24.stackVec3[i] = null; } _this24.stackVec3 = newArray; } _this24.stackVec3[_this24.sizeVec3++] = basisX1; } let _this25 = this._pool; if(basisY1 != null) { basisY1.zero(); if(_this25.sizeVec3 == _this25.stackVec3.length) { let newArray = new Array(_this25.sizeVec3 << 1); let _g = 0; let _g1 = _this25.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this25.stackVec3[i]; _this25.stackVec3[i] = null; } _this25.stackVec3 = newArray; } _this25.stackVec3[_this25.sizeVec3++] = basisY1; } let _this26 = this._pool; if(basisZ1 != null) { basisZ1.zero(); if(_this26.sizeVec3 == _this26.stackVec3.length) { let newArray = new Array(_this26.sizeVec3 << 1); let _g = 0; let _g1 = _this26.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this26.stackVec3[i]; _this26.stackVec3[i] = null; } _this26.stackVec3 = newArray; } _this26.stackVec3[_this26.sizeVec3++] = basisZ1; } let _this27 = this._pool; if(basisX2 != null) { basisX2.zero(); if(_this27.sizeVec3 == _this27.stackVec3.length) { let newArray = new Array(_this27.sizeVec3 << 1); let _g = 0; let _g1 = _this27.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this27.stackVec3[i]; _this27.stackVec3[i] = null; } _this27.stackVec3 = newArray; } _this27.stackVec3[_this27.sizeVec3++] = basisX2; } let _this28 = this._pool; if(basisY2 != null) { basisY2.zero(); if(_this28.sizeVec3 == _this28.stackVec3.length) { let newArray = new Array(_this28.sizeVec3 << 1); let _g = 0; let _g1 = _this28.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this28.stackVec3[i]; _this28.stackVec3[i] = null; } _this28.stackVec3 = newArray; } _this28.stackVec3[_this28.sizeVec3++] = basisY2; } let _this29 = this._pool; if(basisZ2 != null) { basisZ2.zero(); if(_this29.sizeVec3 == _this29.stackVec3.length) { let newArray = new Array(_this29.sizeVec3 << 1); let _g = 0; let _g1 = _this29.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this29.stackVec3[i]; _this29.stackVec3[i] = null; } _this29.stackVec3 = newArray; } _this29.stackVec3[_this29.sizeVec3++] = basisZ2; } j = n; } } } _drawRotationalLimit(d,center,ex,ey,needle,radius,min,max,color) { if(min != max) { let _this = this._pool; let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; _this1.x = center.x; _this1.y = center.y; _this1.z = center.z; let _this2 = _this1; _this2.x += needle.x * radius; _this2.y += needle.y * radius; _this2.z += needle.z * radius; d.line(center,_this2,color); let _this3 = this._pool; if(_this2 != null) { _this2.zero(); if(_this3.sizeVec3 == _this3.stackVec3.length) { let newArray = new Array(_this3.sizeVec3 << 1); let _g = 0; let _g1 = _this3.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this3.stackVec3[i]; _this3.stackVec3[i] = null; } _this3.stackVec3 = newArray; } _this3.stackVec3[_this3.sizeVec3++] = _this2; } if(min > max) { d.ellipse(center,ex,ey,radius,radius,color); } else { d.arc(center,ex,ey,radius,radius,min,max,true,color); } } } _drawTranslationalLimit(d,center,ex,min,max,color) { if(min < max) { let _this = this._pool; let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; _this1.x = center.x; _this1.y = center.y; _this1.z = center.z; let _this2 = _this1; _this2.x += ex.x * min; _this2.y += ex.y * min; _this2.z += ex.z * min; let _this3 = this._pool; let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; _this4.x = center.x; _this4.y = center.y; _this4.z = center.z; let _this5 = _this4; _this5.x += ex.x * max; _this5.y += ex.y * max; _this5.z += ex.z * max; d.line(_this2,_this5,color); let _this6 = this._pool; if(_this2 != null) { _this2.zero(); if(_this6.sizeVec3 == _this6.stackVec3.length) { let newArray = new Array(_this6.sizeVec3 << 1); let _g = 0; let _g1 = _this6.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this6.stackVec3[i]; _this6.stackVec3[i] = null; } _this6.stackVec3 = newArray; } _this6.stackVec3[_this6.sizeVec3++] = _this2; } let _this7 = this._pool; if(_this5 != null) { _this5.zero(); if(_this7.sizeVec3 == _this7.stackVec3.length) { let newArray = new Array(_this7.sizeVec3 << 1); let _g = 0; let _g1 = _this7.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this7.stackVec3[i]; _this7.stackVec3[i] = null; } _this7.stackVec3 = newArray; } _this7.stackVec3[_this7.sizeVec3++] = _this5; } } } _drawTranslationalLimit3D(d,center,ex,ey,ez,xlm,ylm,zlm,color) { let minx = xlm.lowerLimit; let maxx = xlm.upperLimit; let miny = ylm.lowerLimit; let maxy = ylm.upperLimit; let minz = zlm.lowerLimit; let maxz = zlm.upperLimit; let _this = this._pool; if(_this.sizeVec3 == 0) { new oimo.common.Vec3(); } else { --_this.sizeVec3; } let _this1 = this._pool; if(_this1.sizeVec3 == 0) { new oimo.common.Vec3(); } else { --_this1.sizeVec3; } let _this2 = this._pool; let _this3 = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]; _this3.x = center.x; _this3.y = center.y; _this3.z = center.z; let _this4 = _this3; _this4.x += ex.x * minx; _this4.y += ex.y * minx; _this4.z += ex.z * minx; _this4.x += ey.x * miny; _this4.y += ey.y * miny; _this4.z += ey.z * miny; _this4.x += ez.x * minz; _this4.y += ez.y * minz; _this4.z += ez.z * minz; let _this5 = this._pool; let _this6 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3]; _this6.x = center.x; _this6.y = center.y; _this6.z = center.z; let _this7 = _this6; _this7.x += ex.x * minx; _this7.y += ex.y * minx; _this7.z += ex.z * minx; _this7.x += ey.x * miny; _this7.y += ey.y * miny; _this7.z += ey.z * miny; _this7.x += ez.x * maxz; _this7.y += ez.y * maxz; _this7.z += ez.z * maxz; let _this8 = this._pool; let _this9 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3]; _this9.x = center.x; _this9.y = center.y; _this9.z = center.z; let _this10 = _this9; _this10.x += ex.x * minx; _this10.y += ex.y * minx; _this10.z += ex.z * minx; _this10.x += ey.x * maxy; _this10.y += ey.y * maxy; _this10.z += ey.z * maxy; _this10.x += ez.x * minz; _this10.y += ez.y * minz; _this10.z += ez.z * minz; let _this11 = this._pool; let _this12 = _this11.sizeVec3 == 0 ? new oimo.common.Vec3() : _this11.stackVec3[--_this11.sizeVec3]; _this12.x = center.x; _this12.y = center.y; _this12.z = center.z; let _this13 = _this12; _this13.x += ex.x * minx; _this13.y += ex.y * minx; _this13.z += ex.z * minx; _this13.x += ey.x * maxy; _this13.y += ey.y * maxy; _this13.z += ey.z * maxy; _this13.x += ez.x * maxz; _this13.y += ez.y * maxz; _this13.z += ez.z * maxz; let _this14 = this._pool; let _this15 = _this14.sizeVec3 == 0 ? new oimo.common.Vec3() : _this14.stackVec3[--_this14.sizeVec3]; _this15.x = center.x; _this15.y = center.y; _this15.z = center.z; let _this16 = _this15; _this16.x += ex.x * maxx; _this16.y += ex.y * maxx; _this16.z += ex.z * maxx; _this16.x += ey.x * miny; _this16.y += ey.y * miny; _this16.z += ey.z * miny; _this16.x += ez.x * minz; _this16.y += ez.y * minz; _this16.z += ez.z * minz; let _this17 = this._pool; let _this18 = _this17.sizeVec3 == 0 ? new oimo.common.Vec3() : _this17.stackVec3[--_this17.sizeVec3]; _this18.x = center.x; _this18.y = center.y; _this18.z = center.z; let _this19 = _this18; _this19.x += ex.x * maxx; _this19.y += ex.y * maxx; _this19.z += ex.z * maxx; _this19.x += ey.x * miny; _this19.y += ey.y * miny; _this19.z += ey.z * miny; _this19.x += ez.x * maxz; _this19.y += ez.y * maxz; _this19.z += ez.z * maxz; let _this20 = this._pool; let _this21 = _this20.sizeVec3 == 0 ? new oimo.common.Vec3() : _this20.stackVec3[--_this20.sizeVec3]; _this21.x = center.x; _this21.y = center.y; _this21.z = center.z; let _this22 = _this21; _this22.x += ex.x * maxx; _this22.y += ex.y * maxx; _this22.z += ex.z * maxx; _this22.x += ey.x * maxy; _this22.y += ey.y * maxy; _this22.z += ey.z * maxy; _this22.x += ez.x * minz; _this22.y += ez.y * minz; _this22.z += ez.z * minz; let _this23 = this._pool; let _this24 = _this23.sizeVec3 == 0 ? new oimo.common.Vec3() : _this23.stackVec3[--_this23.sizeVec3]; _this24.x = center.x; _this24.y = center.y; _this24.z = center.z; let _this25 = _this24; _this25.x += ex.x * maxx; _this25.y += ex.y * maxx; _this25.z += ex.z * maxx; _this25.x += ey.x * maxy; _this25.y += ey.y * maxy; _this25.z += ey.z * maxy; _this25.x += ez.x * maxz; _this25.y += ez.y * maxz; _this25.z += ez.z * maxz; d.line(_this4,_this16,color); d.line(_this10,_this22,color); d.line(_this7,_this19,color); d.line(_this13,_this25,color); d.line(_this4,_this10,color); d.line(_this16,_this22,color); d.line(_this7,_this13,color); d.line(_this19,_this25,color); d.line(_this4,_this7,color); d.line(_this16,_this19,color); d.line(_this10,_this13,color); d.line(_this22,_this25,color); let _this26 = this._pool; if(_this4 != null) { _this4.zero(); if(_this26.sizeVec3 == _this26.stackVec3.length) { let newArray = new Array(_this26.sizeVec3 << 1); let _g = 0; let _g1 = _this26.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this26.stackVec3[i]; _this26.stackVec3[i] = null; } _this26.stackVec3 = newArray; } _this26.stackVec3[_this26.sizeVec3++] = _this4; } let _this27 = this._pool; if(_this7 != null) { _this7.zero(); if(_this27.sizeVec3 == _this27.stackVec3.length) { let newArray = new Array(_this27.sizeVec3 << 1); let _g = 0; let _g1 = _this27.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this27.stackVec3[i]; _this27.stackVec3[i] = null; } _this27.stackVec3 = newArray; } _this27.stackVec3[_this27.sizeVec3++] = _this7; } let _this28 = this._pool; if(_this10 != null) { _this10.zero(); if(_this28.sizeVec3 == _this28.stackVec3.length) { let newArray = new Array(_this28.sizeVec3 << 1); let _g = 0; let _g1 = _this28.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this28.stackVec3[i]; _this28.stackVec3[i] = null; } _this28.stackVec3 = newArray; } _this28.stackVec3[_this28.sizeVec3++] = _this10; } let _this29 = this._pool; if(_this13 != null) { _this13.zero(); if(_this29.sizeVec3 == _this29.stackVec3.length) { let newArray = new Array(_this29.sizeVec3 << 1); let _g = 0; let _g1 = _this29.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this29.stackVec3[i]; _this29.stackVec3[i] = null; } _this29.stackVec3 = newArray; } _this29.stackVec3[_this29.sizeVec3++] = _this13; } let _this30 = this._pool; if(_this16 != null) { _this16.zero(); if(_this30.sizeVec3 == _this30.stackVec3.length) { let newArray = new Array(_this30.sizeVec3 << 1); let _g = 0; let _g1 = _this30.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this30.stackVec3[i]; _this30.stackVec3[i] = null; } _this30.stackVec3 = newArray; } _this30.stackVec3[_this30.sizeVec3++] = _this16; } let _this31 = this._pool; if(_this19 != null) { _this19.zero(); if(_this31.sizeVec3 == _this31.stackVec3.length) { let newArray = new Array(_this31.sizeVec3 << 1); let _g = 0; let _g1 = _this31.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this31.stackVec3[i]; _this31.stackVec3[i] = null; } _this31.stackVec3 = newArray; } _this31.stackVec3[_this31.sizeVec3++] = _this19; } let _this32 = this._pool; if(_this22 != null) { _this22.zero(); if(_this32.sizeVec3 == _this32.stackVec3.length) { let newArray = new Array(_this32.sizeVec3 << 1); let _g = 0; let _g1 = _this32.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this32.stackVec3[i]; _this32.stackVec3[i] = null; } _this32.stackVec3 = newArray; } _this32.stackVec3[_this32.sizeVec3++] = _this22; } let _this33 = this._pool; if(_this25 != null) { _this25.zero(); if(_this33.sizeVec3 == _this33.stackVec3.length) { let newArray = new Array(_this33.sizeVec3 << 1); let _g = 0; let _g1 = _this33.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this33.stackVec3[i]; _this33.stackVec3[i] = null; } _this33.stackVec3 = newArray; } _this33.stackVec3[_this33.sizeVec3++] = _this25; } } _drawEllipseOnSphere(d,center,normal,x,y,radiansX,radiansY,radius,color) { let theta = 0; let _this = this._pool; let rotVec = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this._pool; let rotQ = _this1.sizeQuat == 0 ? new oimo.common.Quat() : _this1.stackQuat[--_this1.sizeQuat]; let _this2 = this._pool; let rotM = _this2.sizeMat3 == 0 ? new oimo.common.Mat3() : _this2.stackMat3[--_this2.sizeMat3]; let _this3 = this._pool; let prevV = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; let _g = 0; while(_g < 17) { let i = _g++; let rx = Math.cos(theta) * radiansX; let ry = Math.sin(theta) * radiansY; let halfRotAng = Math.sqrt(rx * rx + ry * ry); let rotSin = Math.sin(halfRotAng * 0.5); let rotCos = Math.cos(halfRotAng * 0.5); let _this = rotVec.zero(); _this.x += x.x * rx; _this.y += x.y * rx; _this.z += x.z * rx; _this.x += y.x * ry; _this.y += y.y * ry; _this.z += y.z * ry; let s = 1 / halfRotAng * rotSin; rotVec.x *= s; rotVec.y *= s; rotVec.z *= s; rotQ.x = rotVec.x; rotQ.y = rotVec.y; rotQ.z = rotVec.z; rotQ.w = rotCos; let x1 = rotQ.x; let y1 = rotQ.y; let z = rotQ.z; let w = rotQ.w; let x2 = 2 * x1; let y2 = 2 * y1; let z2 = 2 * z; let xx = x1 * x2; let yy = y1 * y2; let zz = z * z2; let xy = x1 * y2; let yz = y1 * z2; let xz = x1 * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; rotM.e00 = 1 - yy - zz; rotM.e01 = xy - wz; rotM.e02 = xz + wy; rotM.e10 = xy + wz; rotM.e11 = 1 - xx - zz; rotM.e12 = yz - wx; rotM.e20 = xz - wy; rotM.e21 = yz + wx; rotM.e22 = 1 - xx - yy; let _this1 = this._pool; let _this2 = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]; _this2.x += normal.x * radius; _this2.y += normal.y * radius; _this2.z += normal.z * radius; let v = _this2; let y3 = v.x * rotM.e10 + v.y * rotM.e11 + v.z * rotM.e12; let z1 = v.x * rotM.e20 + v.y * rotM.e21 + v.z * rotM.e22; v.x = v.x * rotM.e00 + v.y * rotM.e01 + v.z * rotM.e02; v.y = y3; v.z = z1; v.x += center.x; v.y += center.y; v.z += center.z; if(i >= 1) { d.line(prevV,v,color); } let _this3 = this._pool; if(prevV != null) { prevV.zero(); if(_this3.sizeVec3 == _this3.stackVec3.length) { let newArray = new Array(_this3.sizeVec3 << 1); let _g = 0; let _g1 = _this3.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this3.stackVec3[i]; _this3.stackVec3[i] = null; } _this3.stackVec3 = newArray; } _this3.stackVec3[_this3.sizeVec3++] = prevV; } prevV = v; theta += 0.39269908169872375; } let _this4 = this._pool; if(rotVec != null) { rotVec.zero(); if(_this4.sizeVec3 == _this4.stackVec3.length) { let newArray = new Array(_this4.sizeVec3 << 1); let _g = 0; let _g1 = _this4.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this4.stackVec3[i]; _this4.stackVec3[i] = null; } _this4.stackVec3 = newArray; } _this4.stackVec3[_this4.sizeVec3++] = rotVec; } let _this5 = this._pool; if(rotQ != null) { rotQ.x = 0; rotQ.y = 0; rotQ.z = 0; rotQ.w = 1; if(_this5.sizeQuat == _this5.stackQuat.length) { let newArray = new Array(_this5.sizeQuat << 1); let _g = 0; let _g1 = _this5.sizeQuat; while(_g < _g1) { let i = _g++; newArray[i] = _this5.stackQuat[i]; _this5.stackQuat[i] = null; } _this5.stackQuat = newArray; } _this5.stackQuat[_this5.sizeQuat++] = rotQ; } let _this6 = this._pool; if(rotM != null) { rotM.e00 = 1; rotM.e01 = 0; rotM.e02 = 0; rotM.e10 = 0; rotM.e11 = 1; rotM.e12 = 0; rotM.e20 = 0; rotM.e21 = 0; rotM.e22 = 1; if(_this6.sizeMat3 == _this6.stackMat3.length) { let newArray = new Array(_this6.sizeMat3 << 1); let _g = 0; let _g1 = _this6.sizeMat3; while(_g < _g1) { let i = _g++; newArray[i] = _this6.stackMat3[i]; _this6.stackMat3[i] = null; } _this6.stackMat3 = newArray; } _this6.stackMat3[_this6.sizeMat3++] = rotM; } let _this7 = this._pool; if(prevV != null) { prevV.zero(); if(_this7.sizeVec3 == _this7.stackVec3.length) { let newArray = new Array(_this7.sizeVec3 << 1); let _g = 0; let _g1 = _this7.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this7.stackVec3[i]; _this7.stackVec3[i] = null; } _this7.stackVec3 = newArray; } _this7.stackVec3[_this7.sizeVec3++] = prevV; } } step(timeStep) { if(this._timeStep.dt > 0) { this._timeStep.dtRatio = timeStep / this._timeStep.dt; } this._timeStep.dt = timeStep; this._timeStep.invDt = 1 / timeStep; let st = Date.now() / 1000; this._updateContacts(); this._solveIslands(); oimo.dynamics.common.Performance.totalTime = (Date.now() / 1000 - st) * 1000; } addRigidBody(rigidBody) { if(rigidBody._world != null) { throw new Error("A rigid body cannot belong to multiple worlds."); } if(this._rigidBodyList == null) { this._rigidBodyList = rigidBody; this._rigidBodyListLast = rigidBody; } else { this._rigidBodyListLast._next = rigidBody; rigidBody._prev = this._rigidBodyListLast; this._rigidBodyListLast = rigidBody; } rigidBody._world = this; let s = rigidBody._shapeList; while(s != null) { let n = s._next; s._proxy = this._broadPhase.createProxy(s,s._aabb); s._id = this._shapeIdCount++; this._numShapes++; s = n; } this._numRigidBodies++; } removeRigidBody(rigidBody) { if(rigidBody._world != this) { throw new Error("The rigid body doesn't belong to the world."); } let prev = rigidBody._prev; let next = rigidBody._next; if(prev != null) { prev._next = next; } if(next != null) { next._prev = prev; } if(rigidBody == this._rigidBodyList) { this._rigidBodyList = this._rigidBodyList._next; } if(rigidBody == this._rigidBodyListLast) { this._rigidBodyListLast = this._rigidBodyListLast._prev; } rigidBody._next = null; rigidBody._prev = null; rigidBody._world = null; let s = rigidBody._shapeList; while(s != null) { let n = s._next; this._broadPhase.destroyProxy(s._proxy); s._proxy = null; s._id = -1; let cl = s._rigidBody._contactLinkList; while(cl != null) { let n = cl._next; let c = cl._contact; if(c._s1 == s || c._s2 == s) { let _this = cl._other; _this._sleeping = false; _this._sleepTime = 0; let _this1 = this._contactManager; let prev = c._prev; let next = c._next; if(prev != null) { prev._next = next; } if(next != null) { next._prev = prev; } if(c == _this1._contactList) { _this1._contactList = _this1._contactList._next; } if(c == _this1._contactListLast) { _this1._contactListLast = _this1._contactListLast._prev; } c._next = null; c._prev = null; if(c._touching) { let cc1 = c._s1._contactCallback; let cc2 = c._s2._contactCallback; if(cc1 == cc2) { cc2 = null; } if(cc1 != null) { cc1.endContact(c); } if(cc2 != null) { cc2.endContact(c); } } let prev1 = c._link1._prev; let next1 = c._link1._next; if(prev1 != null) { prev1._next = next1; } if(next1 != null) { next1._prev = prev1; } if(c._link1 == c._b1._contactLinkList) { c._b1._contactLinkList = c._b1._contactLinkList._next; } if(c._link1 == c._b1._contactLinkListLast) { c._b1._contactLinkListLast = c._b1._contactLinkListLast._prev; } c._link1._next = null; c._link1._prev = null; let prev2 = c._link2._prev; let next2 = c._link2._next; if(prev2 != null) { prev2._next = next2; } if(next2 != null) { next2._prev = prev2; } if(c._link2 == c._b2._contactLinkList) { c._b2._contactLinkList = c._b2._contactLinkList._next; } if(c._link2 == c._b2._contactLinkListLast) { c._b2._contactLinkListLast = c._b2._contactLinkListLast._prev; } c._link2._next = null; c._link2._prev = null; c._b1._numContactLinks--; c._b2._numContactLinks--; c._link1._other = null; c._link2._other = null; c._link1._contact = null; c._link2._contact = null; c._s1 = null; c._s2 = null; c._b1 = null; c._b2 = null; c._touching = false; c._cachedDetectorData._clear(); c._manifold._clear(); c._detector = null; let _this2 = c._contactConstraint; _this2._s1 = null; _this2._s2 = null; _this2._b1 = null; _this2._b2 = null; _this2._tf1 = null; _this2._tf2 = null; c._next = _this1._contactPool; _this1._contactPool = c; _this1._numContacts--; } cl = n; } this._numShapes--; s = n; } this._numRigidBodies--; } addJoint(joint) { if(joint._world != null) { throw new Error("A joint cannot belong to multiple worlds."); } if(this._jointList == null) { this._jointList = joint; this._jointListLast = joint; } else { this._jointListLast._next = joint; joint._prev = this._jointListLast; this._jointListLast = joint; } joint._world = this; joint._link1._other = joint._b2; joint._link2._other = joint._b1; if(joint._b1._jointLinkList == null) { joint._b1._jointLinkList = joint._link1; joint._b1._jointLinkListLast = joint._link1; } else { joint._b1._jointLinkListLast._next = joint._link1; joint._link1._prev = joint._b1._jointLinkListLast; joint._b1._jointLinkListLast = joint._link1; } if(joint._b2._jointLinkList == null) { joint._b2._jointLinkList = joint._link2; joint._b2._jointLinkListLast = joint._link2; } else { joint._b2._jointLinkListLast._next = joint._link2; joint._link2._prev = joint._b2._jointLinkListLast; joint._b2._jointLinkListLast = joint._link2; } joint._b1._numJointLinks++; joint._b2._numJointLinks++; let _this = joint._b1; _this._sleeping = false; _this._sleepTime = 0; let _this1 = joint._b2; _this1._sleeping = false; _this1._sleepTime = 0; joint._syncAnchors(); this._numJoints++; } removeJoint(joint) { if(joint._world != this) { throw new Error("The joint doesn't belong to the world."); } let prev = joint._prev; let next = joint._next; if(prev != null) { prev._next = next; } if(next != null) { next._prev = prev; } if(joint == this._jointList) { this._jointList = this._jointList._next; } if(joint == this._jointListLast) { this._jointListLast = this._jointListLast._prev; } joint._next = null; joint._prev = null; joint._world = null; let prev1 = joint._link1._prev; let next1 = joint._link1._next; if(prev1 != null) { prev1._next = next1; } if(next1 != null) { next1._prev = prev1; } if(joint._link1 == joint._b1._jointLinkList) { joint._b1._jointLinkList = joint._b1._jointLinkList._next; } if(joint._link1 == joint._b1._jointLinkListLast) { joint._b1._jointLinkListLast = joint._b1._jointLinkListLast._prev; } joint._link1._next = null; joint._link1._prev = null; let prev2 = joint._link2._prev; let next2 = joint._link2._next; if(prev2 != null) { prev2._next = next2; } if(next2 != null) { next2._prev = prev2; } if(joint._link2 == joint._b2._jointLinkList) { joint._b2._jointLinkList = joint._b2._jointLinkList._next; } if(joint._link2 == joint._b2._jointLinkListLast) { joint._b2._jointLinkListLast = joint._b2._jointLinkListLast._prev; } joint._link2._next = null; joint._link2._prev = null; joint._link1._other = null; joint._link2._other = null; joint._b1._numJointLinks--; joint._b2._numJointLinks--; let _this = joint._b1; _this._sleeping = false; _this._sleepTime = 0; let _this1 = joint._b2; _this1._sleeping = false; _this1._sleepTime = 0; this._numJoints--; } setDebugDraw(debugDraw) { this._debugDraw = debugDraw; } getDebugDraw() { return this._debugDraw; } debugDraw() { if(this._debugDraw != null) { if(this._broadPhase._type == 2) { this._drawBvh(this._debugDraw,this._broadPhase._tree); } this._drawRigidBodies(this._debugDraw); this._drawConstraints(this._debugDraw); } } rayCast(begin,end,callback) { let _this = this._rayCastWrapper.begin; _this.x = begin.x; _this.y = begin.y; _this.z = begin.z; let _this1 = this._rayCastWrapper.end; _this1.x = end.x; _this1.y = end.y; _this1.z = end.z; this._rayCastWrapper.callback = callback; this._broadPhase.rayCast(begin,end,this._rayCastWrapper); } convexCast(convex,begin,translation,callback) { this._convexCastWrapper.convex = convex; let _this = this._convexCastWrapper.begin; _this._positionX = begin._positionX; _this._positionY = begin._positionY; _this._positionZ = begin._positionZ; _this._rotation00 = begin._rotation00; _this._rotation01 = begin._rotation01; _this._rotation02 = begin._rotation02; _this._rotation10 = begin._rotation10; _this._rotation11 = begin._rotation11; _this._rotation12 = begin._rotation12; _this._rotation20 = begin._rotation20; _this._rotation21 = begin._rotation21; _this._rotation22 = begin._rotation22; let _this1 = this._convexCastWrapper.translation; _this1.x = translation.x; _this1.y = translation.y; _this1.z = translation.z; this._convexCastWrapper.callback = callback; this._broadPhase.convexCast(convex,begin,translation,this._convexCastWrapper); } aabbTest(aabb,callback) { this._aabbTestWrapper._aabb.copyFrom(aabb); this._aabbTestWrapper._callback = callback; this._broadPhase.aabbTest(aabb,this._aabbTestWrapper); } getRigidBodyList() { return this._rigidBodyList; } getJointList() { return this._jointList; } getBroadPhase() { return this._broadPhase; } getContactManager() { return this._contactManager; } getNumRigidBodies() { return this._numRigidBodies; } getNumJoints() { return this._numJoints; } getNumShapes() { return this._numShapes; } getNumIslands() { return this._numIslands; } getNumVelocityIterations() { return this._numVelocityIterations; } setNumVelocityIterations(numVelocityIterations) { this._numVelocityIterations = numVelocityIterations; } getNumPositionIterations() { return this._numPositionIterations; } setNumPositionIterations(numPositionIterations) { this._numPositionIterations = numPositionIterations; } getGravity() { return this._gravity; } setGravity(gravity) { let _this = this._gravity; _this.x = gravity.x; _this.y = gravity.y; _this.z = gravity.z; } } if(!oimo.dynamics._World) oimo.dynamics._World = {}; oimo.dynamics._World.RayCastWrapper = class oimo_dynamics__$World_RayCastWrapper extends oimo.collision.broadphase.BroadPhaseProxyCallback { constructor() { super(); this.rayCastHit = new oimo.collision.geometry.RayCastHit(); this.begin = new oimo.common.Vec3(); this.end = new oimo.common.Vec3(); this.callback = null; } process(proxy) { let shape = proxy.userData; if(shape._geom.rayCast(this.begin,this.end,shape._transform,this.rayCastHit)) { this.callback.process(shape,this.rayCastHit); } } } oimo.dynamics._World.ConvexCastWrapper = class oimo_dynamics__$World_ConvexCastWrapper extends oimo.collision.broadphase.BroadPhaseProxyCallback { constructor() { super(); this.rayCastHit = new oimo.collision.geometry.RayCastHit(); this.begin = new oimo.common.Transform(); this.translation = new oimo.common.Vec3(); this.zero = new oimo.common.Vec3(); this.callback = null; this.convex = null; } process(proxy) { let shape = proxy.userData; let type = shape._geom._type; if(type < 0 || type > 5) { return; } if(oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance.convexCast(this.convex,shape._geom,this.begin,shape._transform,this.translation,this.zero,this.rayCastHit)) { this.callback.process(shape,this.rayCastHit); } } } oimo.dynamics._World.AabbTestWrapper = class oimo_dynamics__$World_AabbTestWrapper extends oimo.collision.broadphase.BroadPhaseProxyCallback { constructor() { super(); this._aabb = new oimo.collision.geometry.Aabb(); this._callback = null; } process(proxy) { let shape = proxy.userData; let shapeAabb = shape._aabb; if(shapeAabb._minX < this._aabb._maxX && shapeAabb._maxX > this._aabb._minX && shapeAabb._minY < this._aabb._maxY && shapeAabb._maxY > this._aabb._minY && shapeAabb._minZ < this._aabb._maxZ && shapeAabb._maxZ > this._aabb._minZ) { this._callback.process(shape); } } } if(!oimo.dynamics.callback) oimo.dynamics.callback = {}; oimo.dynamics.callback.AabbTestCallback = class oimo_dynamics_callback_AabbTestCallback { constructor() { } process(shape) { } } oimo.dynamics.callback.ContactCallback = class oimo_dynamics_callback_ContactCallback { constructor() { } beginContact(c) { } preSolve(c) { } postSolve(c) { } endContact(c) { } } oimo.dynamics.callback.RayCastCallback = class oimo_dynamics_callback_RayCastCallback { constructor() { } process(shape,hit) { } } oimo.dynamics.callback.RayCastClosest = class oimo_dynamics_callback_RayCastClosest extends oimo.dynamics.callback.RayCastCallback { constructor() { super(); this.position = new oimo.common.Vec3(); this.normal = new oimo.common.Vec3(); this.shape = null; this.fraction = 1; this.position.zero(); this.normal.zero(); this.hit = false; } clear() { this.shape = null; this.fraction = 1; this.position.zero(); this.normal.zero(); this.hit = false; } process(shape,hit) { if(hit.fraction < this.fraction) { this.shape = shape; this.hit = true; this.fraction = hit.fraction; let _this = this.position; let v = hit.position; _this.x = v.x; _this.y = v.y; _this.z = v.z; let _this1 = this.normal; let v1 = hit.normal; _this1.x = v1.x; _this1.y = v1.y; _this1.z = v1.z; } } } if(!oimo.dynamics.common) oimo.dynamics.common = {}; oimo.dynamics.common.DebugDraw = class oimo_dynamics_common_DebugDraw { constructor() { this.p = new oimo.common.Pool(); this.wireframe = false; this.drawShapes = true; this.drawBvh = false; this.drawBvhMinLevel = 0; this.drawBvhMaxLevel = 65536; this.drawAabbs = false; this.drawBases = false; this.drawPairs = false; this.drawContacts = false; this.drawJoints = true; this.drawJointLimits = false; this.sphereCoords = new Array(5); this.tmpSphereVerts = new Array(5); this.tmpSphereNorms = new Array(5); let _g = 0; while(_g < 5) { let i = _g++; let num = i == 0 || i == 4 ? 1 : 8; this.sphereCoords[i] = new Array(num); this.tmpSphereVerts[i] = new Array(num); this.tmpSphereNorms[i] = new Array(num); let _g1 = 0; while(_g1 < 8) { let j = _g1++; let theta = i * 0.7853981633974475; let phi = j * 0.7853981633974475; this.sphereCoords[i][j] = new oimo.common.Vec3(Math.sin(theta) * Math.cos(phi),Math.cos(theta),-Math.sin(theta) * Math.sin(phi)); this.tmpSphereVerts[i][j] = new oimo.common.Vec3(); this.tmpSphereNorms[i][j] = new oimo.common.Vec3(); } } this.circleCoords = new Array(8); this.circleCoordsShift = new Array(8); this.tmpCircleVerts1 = new Array(8); this.tmpCircleVerts2 = new Array(8); this.tmpCircleNorms = new Array(8); let _g1 = 0; while(_g1 < 8) { let i = _g1++; this.circleCoords[i] = new oimo.common.Vec3(Math.cos(i * 0.7853981633974475),0,-Math.sin(i * 0.7853981633974475)); this.circleCoordsShift[i] = new oimo.common.Vec3(Math.cos((i + 0.5) * 0.7853981633974475),0,-Math.sin((i + 0.5) * 0.7853981633974475)); this.tmpCircleVerts1[i] = new oimo.common.Vec3(); this.tmpCircleVerts2[i] = new oimo.common.Vec3(); this.tmpCircleNorms[i] = new oimo.common.Vec3(); } this.style = new oimo.dynamics.common.DebugDrawStyle(); } aabb(min,max,color) { let _this = this.p; let v1 = (_this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]).init(min.x,min.y,min.z); let _this1 = this.p; let v2 = (_this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]).init(min.x,min.y,max.z); let _this2 = this.p; let v3 = (_this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]).init(min.x,max.y,min.z); let _this3 = this.p; let v4 = (_this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]).init(min.x,max.y,max.z); let _this4 = this.p; let v5 = (_this4.sizeVec3 == 0 ? new oimo.common.Vec3() : _this4.stackVec3[--_this4.sizeVec3]).init(max.x,min.y,min.z); let _this5 = this.p; let v6 = (_this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3]).init(max.x,min.y,max.z); let _this6 = this.p; let v7 = (_this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3]).init(max.x,max.y,min.z); let _this7 = this.p; let v8 = (_this7.sizeVec3 == 0 ? new oimo.common.Vec3() : _this7.stackVec3[--_this7.sizeVec3]).init(max.x,max.y,max.z); this.line(v1,v2,color); this.line(v3,v4,color); this.line(v5,v6,color); this.line(v7,v8,color); this.line(v1,v3,color); this.line(v2,v4,color); this.line(v5,v7,color); this.line(v6,v8,color); this.line(v1,v5,color); this.line(v2,v6,color); this.line(v3,v7,color); this.line(v4,v8,color); let _this8 = this.p; if(v1 != null) { v1.zero(); if(_this8.sizeVec3 == _this8.stackVec3.length) { let newArray = new Array(_this8.sizeVec3 << 1); let _g = 0; let _g1 = _this8.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this8.stackVec3[i]; _this8.stackVec3[i] = null; } _this8.stackVec3 = newArray; } _this8.stackVec3[_this8.sizeVec3++] = v1; } let _this9 = this.p; if(v2 != null) { v2.zero(); if(_this9.sizeVec3 == _this9.stackVec3.length) { let newArray = new Array(_this9.sizeVec3 << 1); let _g = 0; let _g1 = _this9.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this9.stackVec3[i]; _this9.stackVec3[i] = null; } _this9.stackVec3 = newArray; } _this9.stackVec3[_this9.sizeVec3++] = v2; } let _this10 = this.p; if(v3 != null) { v3.zero(); if(_this10.sizeVec3 == _this10.stackVec3.length) { let newArray = new Array(_this10.sizeVec3 << 1); let _g = 0; let _g1 = _this10.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this10.stackVec3[i]; _this10.stackVec3[i] = null; } _this10.stackVec3 = newArray; } _this10.stackVec3[_this10.sizeVec3++] = v3; } let _this11 = this.p; if(v4 != null) { v4.zero(); if(_this11.sizeVec3 == _this11.stackVec3.length) { let newArray = new Array(_this11.sizeVec3 << 1); let _g = 0; let _g1 = _this11.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this11.stackVec3[i]; _this11.stackVec3[i] = null; } _this11.stackVec3 = newArray; } _this11.stackVec3[_this11.sizeVec3++] = v4; } let _this12 = this.p; if(v5 != null) { v5.zero(); if(_this12.sizeVec3 == _this12.stackVec3.length) { let newArray = new Array(_this12.sizeVec3 << 1); let _g = 0; let _g1 = _this12.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this12.stackVec3[i]; _this12.stackVec3[i] = null; } _this12.stackVec3 = newArray; } _this12.stackVec3[_this12.sizeVec3++] = v5; } let _this13 = this.p; if(v6 != null) { v6.zero(); if(_this13.sizeVec3 == _this13.stackVec3.length) { let newArray = new Array(_this13.sizeVec3 << 1); let _g = 0; let _g1 = _this13.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this13.stackVec3[i]; _this13.stackVec3[i] = null; } _this13.stackVec3 = newArray; } _this13.stackVec3[_this13.sizeVec3++] = v6; } let _this14 = this.p; if(v7 != null) { v7.zero(); if(_this14.sizeVec3 == _this14.stackVec3.length) { let newArray = new Array(_this14.sizeVec3 << 1); let _g = 0; let _g1 = _this14.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this14.stackVec3[i]; _this14.stackVec3[i] = null; } _this14.stackVec3 = newArray; } _this14.stackVec3[_this14.sizeVec3++] = v7; } let _this15 = this.p; if(v8 != null) { v8.zero(); if(_this15.sizeVec3 == _this15.stackVec3.length) { let newArray = new Array(_this15.sizeVec3 << 1); let _g = 0; let _g1 = _this15.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this15.stackVec3[i]; _this15.stackVec3[i] = null; } _this15.stackVec3 = newArray; } _this15.stackVec3[_this15.sizeVec3++] = v8; } } basis(transform,length,colorX,colorY,colorZ) { let _this = this.p; let pos = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this.p; let rot = _this1.sizeMat3 == 0 ? new oimo.common.Mat3() : _this1.stackMat3[--_this1.sizeMat3]; let _this2 = this.p; let ex = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]; let _this3 = this.p; let ey = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; let _this4 = this.p; let ez = _this4.sizeVec3 == 0 ? new oimo.common.Vec3() : _this4.stackVec3[--_this4.sizeVec3]; let v = pos; v.x = transform._positionX; v.y = transform._positionY; v.z = transform._positionZ; let m = rot; m.e00 = transform._rotation00; m.e01 = transform._rotation01; m.e02 = transform._rotation02; m.e10 = transform._rotation10; m.e11 = transform._rotation11; m.e12 = transform._rotation12; m.e20 = transform._rotation20; m.e21 = transform._rotation21; m.e22 = transform._rotation22; ex.init(rot.e00,rot.e10,rot.e20); ey.init(rot.e01,rot.e11,rot.e21); ez.init(rot.e02,rot.e12,rot.e22); ex.x *= length; ex.y *= length; ex.z *= length; let _this5 = ex; _this5.x += pos.x; _this5.y += pos.y; _this5.z += pos.z; ey.x *= length; ey.y *= length; ey.z *= length; let _this6 = ey; _this6.x += pos.x; _this6.y += pos.y; _this6.z += pos.z; ez.x *= length; ez.y *= length; ez.z *= length; let _this7 = ez; _this7.x += pos.x; _this7.y += pos.y; _this7.z += pos.z; this.line(pos,ex,colorX); this.line(pos,ey,colorY); this.line(pos,ez,colorZ); let _this8 = this.p; if(pos != null) { pos.zero(); if(_this8.sizeVec3 == _this8.stackVec3.length) { let newArray = new Array(_this8.sizeVec3 << 1); let _g = 0; let _g1 = _this8.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this8.stackVec3[i]; _this8.stackVec3[i] = null; } _this8.stackVec3 = newArray; } _this8.stackVec3[_this8.sizeVec3++] = pos; } let _this9 = this.p; if(rot != null) { rot.e00 = 1; rot.e01 = 0; rot.e02 = 0; rot.e10 = 0; rot.e11 = 1; rot.e12 = 0; rot.e20 = 0; rot.e21 = 0; rot.e22 = 1; if(_this9.sizeMat3 == _this9.stackMat3.length) { let newArray = new Array(_this9.sizeMat3 << 1); let _g = 0; let _g1 = _this9.sizeMat3; while(_g < _g1) { let i = _g++; newArray[i] = _this9.stackMat3[i]; _this9.stackMat3[i] = null; } _this9.stackMat3 = newArray; } _this9.stackMat3[_this9.sizeMat3++] = rot; } let _this10 = this.p; if(ex != null) { ex.zero(); if(_this10.sizeVec3 == _this10.stackVec3.length) { let newArray = new Array(_this10.sizeVec3 << 1); let _g = 0; let _g1 = _this10.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this10.stackVec3[i]; _this10.stackVec3[i] = null; } _this10.stackVec3 = newArray; } _this10.stackVec3[_this10.sizeVec3++] = ex; } let _this11 = this.p; if(ey != null) { ey.zero(); if(_this11.sizeVec3 == _this11.stackVec3.length) { let newArray = new Array(_this11.sizeVec3 << 1); let _g = 0; let _g1 = _this11.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this11.stackVec3[i]; _this11.stackVec3[i] = null; } _this11.stackVec3 = newArray; } _this11.stackVec3[_this11.sizeVec3++] = ey; } let _this12 = this.p; if(ez != null) { ez.zero(); if(_this12.sizeVec3 == _this12.stackVec3.length) { let newArray = new Array(_this12.sizeVec3 << 1); let _g = 0; let _g1 = _this12.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this12.stackVec3[i]; _this12.stackVec3[i] = null; } _this12.stackVec3 = newArray; } _this12.stackVec3[_this12.sizeVec3++] = ez; } } ellipse(center,ex,ey,radiusX,radiusY,color) { this.arc(center,ex,ey,radiusX,radiusY,0,6.28318530717958,false,color); } arc(center,ex,ey,radiusX,radiusY,startAngle,endAngle,drawSector,color) { let _this = this.p; let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; _this1.x = ex.x; _this1.y = ex.y; _this1.z = ex.z; let _this2 = _this1; _this2.x *= radiusX; _this2.y *= radiusX; _this2.z *= radiusX; let _this3 = this.p; let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; _this4.x = ey.x; _this4.y = ey.y; _this4.z = ey.z; let _this5 = _this4; _this5.x *= radiusY; _this5.y *= radiusY; _this5.z *= radiusY; let angDiff = endAngle - startAngle; if(angDiff < 0) { angDiff = -angDiff; } let n = angDiff / 0.52359877559829837 + 0.5 | 0; if(n == 0) { n = 1; } let theta = startAngle; let dt = (endAngle - startAngle) / n; let _this6 = this.p; let _this7 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3]; _this7.x = center.x; _this7.y = center.y; _this7.z = center.z; let _this8 = _this7; let s = Math.cos(startAngle); _this8.x += _this2.x * s; _this8.y += _this2.y * s; _this8.z += _this2.z * s; let s1 = Math.sin(startAngle); _this8.x += _this5.x * s1; _this8.y += _this5.y * s1; _this8.z += _this5.z * s1; let prevV = _this8; if(drawSector) { this.line(center,_this8,color); } let _g = 0; let _g1 = n; while(_g < _g1) { ++_g; theta += dt; let _this = this.p; let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; _this1.x = center.x; _this1.y = center.y; _this1.z = center.z; let _this3 = _this1; let s = Math.cos(theta); _this3.x += _this2.x * s; _this3.y += _this2.y * s; _this3.z += _this2.z * s; let s1 = Math.sin(theta); _this3.x += _this5.x * s1; _this3.y += _this5.y * s1; _this3.z += _this5.z * s1; this.line(prevV,_this3,color); let _this4 = this.p; if(prevV != null) { prevV.zero(); if(_this4.sizeVec3 == _this4.stackVec3.length) { let newArray = new Array(_this4.sizeVec3 << 1); let _g = 0; let _g1 = _this4.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this4.stackVec3[i]; _this4.stackVec3[i] = null; } _this4.stackVec3 = newArray; } _this4.stackVec3[_this4.sizeVec3++] = prevV; } prevV = _this3; } if(drawSector) { this.line(center,prevV,color); } let _this9 = this.p; if(prevV != null) { prevV.zero(); if(_this9.sizeVec3 == _this9.stackVec3.length) { let newArray = new Array(_this9.sizeVec3 << 1); let _g = 0; let _g1 = _this9.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this9.stackVec3[i]; _this9.stackVec3[i] = null; } _this9.stackVec3 = newArray; } _this9.stackVec3[_this9.sizeVec3++] = prevV; } let _this10 = this.p; if(_this2 != null) { _this2.zero(); if(_this10.sizeVec3 == _this10.stackVec3.length) { let newArray = new Array(_this10.sizeVec3 << 1); let _g = 0; let _g1 = _this10.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this10.stackVec3[i]; _this10.stackVec3[i] = null; } _this10.stackVec3 = newArray; } _this10.stackVec3[_this10.sizeVec3++] = _this2; } let _this11 = this.p; if(_this5 != null) { _this5.zero(); if(_this11.sizeVec3 == _this11.stackVec3.length) { let newArray = new Array(_this11.sizeVec3 << 1); let _g = 0; let _g1 = _this11.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this11.stackVec3[i]; _this11.stackVec3[i] = null; } _this11.stackVec3 = newArray; } _this11.stackVec3[_this11.sizeVec3++] = _this5; } } cone(tf,radius,halfHeight,color) { let _this = this.p; let ex = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this.p; let ey = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]; let _this2 = this.p; let ez = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]; let _this3 = this.p; let o = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; let _this4 = this.p; let m = _this4.sizeMat3 == 0 ? new oimo.common.Mat3() : _this4.stackMat3[--_this4.sizeMat3]; let v = o; v.x = tf._positionX; v.y = tf._positionY; v.z = tf._positionZ; let m1 = m; m1.e00 = tf._rotation00; m1.e01 = tf._rotation01; m1.e02 = tf._rotation02; m1.e10 = tf._rotation10; m1.e11 = tf._rotation11; m1.e12 = tf._rotation12; m1.e20 = tf._rotation20; m1.e21 = tf._rotation21; m1.e22 = tf._rotation22; ex.init(m.e00,m.e10,m.e20); ey.init(m.e01,m.e11,m.e21); ez.init(m.e02,m.e12,m.e22); let _this5 = this.p; let _this6 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3]; _this6.x = o.x; _this6.y = o.y; _this6.z = o.z; let _this7 = _this6; _this7.x += ey.x * halfHeight; _this7.y += ey.y * halfHeight; _this7.z += ey.z * halfHeight; let _this8 = this.p; let _this9 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3]; _this9.x = o.x; _this9.y = o.y; _this9.z = o.z; let _this10 = _this9; let s = -halfHeight; _this10.x += ey.x * s; _this10.y += ey.y * s; _this10.z += ey.z * s; if(this.wireframe) { let _this = this.p; let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; _this1.x = _this10.x; _this1.y = _this10.y; _this1.z = _this10.z; let _this2 = _this1; let s = -radius; _this2.x += ex.x * s; _this2.y += ex.y * s; _this2.z += ex.z * s; _this2.x += ez.x * 0; _this2.y += ez.y * 0; _this2.z += ez.z * 0; let _this3 = this.p; let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; _this4.x = _this10.x; _this4.y = _this10.y; _this4.z = _this10.z; let _this5 = _this4; _this5.x += ex.x * radius; _this5.y += ex.y * radius; _this5.z += ex.z * radius; _this5.x += ez.x * 0; _this5.y += ez.y * 0; _this5.z += ez.z * 0; let _this6 = this.p; let _this8 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3]; _this8.x = _this10.x; _this8.y = _this10.y; _this8.z = _this10.z; let _this9 = _this8; _this9.x += ex.x * 0; _this9.y += ex.y * 0; _this9.z += ex.z * 0; let s1 = -radius; _this9.x += ez.x * s1; _this9.y += ez.y * s1; _this9.z += ez.z * s1; let _this11 = this.p; let _this12 = _this11.sizeVec3 == 0 ? new oimo.common.Vec3() : _this11.stackVec3[--_this11.sizeVec3]; _this12.x = _this10.x; _this12.y = _this10.y; _this12.z = _this10.z; let _this13 = _this12; _this13.x += ex.x * 0; _this13.y += ex.y * 0; _this13.z += ex.z * 0; _this13.x += ez.x * radius; _this13.y += ez.y * radius; _this13.z += ez.z * radius; this.ellipse(_this10,ex,ez,radius,radius,color); this.line(_this7,_this2,color); this.line(_this7,_this5,color); this.line(_this7,_this9,color); this.line(_this7,_this13,color); let _this14 = this.p; if(_this2 != null) { _this2.zero(); if(_this14.sizeVec3 == _this14.stackVec3.length) { let newArray = new Array(_this14.sizeVec3 << 1); let _g = 0; let _g1 = _this14.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this14.stackVec3[i]; _this14.stackVec3[i] = null; } _this14.stackVec3 = newArray; } _this14.stackVec3[_this14.sizeVec3++] = _this2; } let _this15 = this.p; if(_this5 != null) { _this5.zero(); if(_this15.sizeVec3 == _this15.stackVec3.length) { let newArray = new Array(_this15.sizeVec3 << 1); let _g = 0; let _g1 = _this15.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this15.stackVec3[i]; _this15.stackVec3[i] = null; } _this15.stackVec3 = newArray; } _this15.stackVec3[_this15.sizeVec3++] = _this5; } let _this16 = this.p; if(_this9 != null) { _this9.zero(); if(_this16.sizeVec3 == _this16.stackVec3.length) { let newArray = new Array(_this16.sizeVec3 << 1); let _g = 0; let _g1 = _this16.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this16.stackVec3[i]; _this16.stackVec3[i] = null; } _this16.stackVec3 = newArray; } _this16.stackVec3[_this16.sizeVec3++] = _this9; } let _this17 = this.p; if(_this13 != null) { _this13.zero(); if(_this17.sizeVec3 == _this17.stackVec3.length) { let newArray = new Array(_this17.sizeVec3 << 1); let _g = 0; let _g1 = _this17.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this17.stackVec3[i]; _this17.stackVec3[i] = null; } _this17.stackVec3 = newArray; } _this17.stackVec3[_this17.sizeVec3++] = _this13; } } else { let invDenom = 1 / Math.sqrt(radius * radius + 4 * halfHeight * halfHeight); let cos = 2 * halfHeight * invDenom; let sin = radius * invDenom; let _g = 0; while(_g < 8) { let i = _g++; let _this = this.tmpCircleNorms[i]; let v = this.circleCoords[i]; _this.x = v.x; _this.y = v.y; _this.z = v.z; _this.x *= cos; _this.y *= cos; _this.z *= cos; _this.y += sin; let _this1 = this.tmpCircleNorms[i]; let y = _this1.x * m.e10 + _this1.y * m.e11 + _this1.z * m.e12; let z = _this1.x * m.e20 + _this1.y * m.e21 + _this1.z * m.e22; _this1.x = _this1.x * m.e00 + _this1.y * m.e01 + _this1.z * m.e02; _this1.y = y; _this1.z = z; let _this2 = this.tmpCircleVerts1[i]; let v1 = this.circleCoordsShift[i]; _this2.x = v1.x; _this2.y = v1.y; _this2.z = v1.z; _this2.x *= cos; _this2.y *= cos; _this2.z *= cos; _this2.y += sin; let _this3 = this.tmpCircleVerts1[i]; let y1 = _this3.x * m.e10 + _this3.y * m.e11 + _this3.z * m.e12; let z1 = _this3.x * m.e20 + _this3.y * m.e21 + _this3.z * m.e22; _this3.x = _this3.x * m.e00 + _this3.y * m.e01 + _this3.z * m.e02; _this3.y = y1; _this3.z = z1; let _this4 = this.tmpCircleVerts2[i]; let v2 = this.circleCoords[i]; _this4.x = v2.x; _this4.y = v2.y; _this4.z = v2.z; let y2 = _this4.x * m.e10 + _this4.y * m.e11 + _this4.z * m.e12; let z2 = _this4.x * m.e20 + _this4.y * m.e21 + _this4.z * m.e22; _this4.x = _this4.x * m.e00 + _this4.y * m.e01 + _this4.z * m.e02; _this4.y = y2; _this4.z = z2; _this4.x *= radius; _this4.y *= radius; _this4.z *= radius; _this4.x += o.x; _this4.y += o.y; _this4.z += o.z; let _this5 = this.tmpCircleVerts2[i]; let s = -halfHeight; _this5.x += ey.x * s; _this5.y += ey.y * s; _this5.z += ey.z * s; } let _g1 = 0; while(_g1 < 8) { let i = _g1++; let v2 = this.tmpCircleVerts2[i]; let v3 = this.tmpCircleVerts2[(i + 1) % 8]; let n1 = this.tmpCircleVerts1[i]; this.triangle(_this7,v2,v3,n1,this.tmpCircleNorms[i],this.tmpCircleNorms[(i + 1) % 8],color); v2 = this.tmpCircleVerts2[(i + 1) % 8]; v3 = this.tmpCircleVerts2[i]; let _this = this.p; let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; _this1.x = ey.x; _this1.y = ey.y; _this1.z = ey.z; let _this2 = _this1; _this2.x = -_this2.x; _this2.y = -_this2.y; _this2.z = -_this2.z; this.triangle(_this10,v2,v3,_this2,_this2,_this2,color); let _this3 = this.p; if(_this2 != null) { _this2.zero(); if(_this3.sizeVec3 == _this3.stackVec3.length) { let newArray = new Array(_this3.sizeVec3 << 1); let _g = 0; let _g1 = _this3.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this3.stackVec3[i]; _this3.stackVec3[i] = null; } _this3.stackVec3 = newArray; } _this3.stackVec3[_this3.sizeVec3++] = _this2; } } } let _this11 = this.p; if(_this7 != null) { _this7.zero(); if(_this11.sizeVec3 == _this11.stackVec3.length) { let newArray = new Array(_this11.sizeVec3 << 1); let _g = 0; let _g1 = _this11.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this11.stackVec3[i]; _this11.stackVec3[i] = null; } _this11.stackVec3 = newArray; } _this11.stackVec3[_this11.sizeVec3++] = _this7; } let _this12 = this.p; if(_this10 != null) { _this10.zero(); if(_this12.sizeVec3 == _this12.stackVec3.length) { let newArray = new Array(_this12.sizeVec3 << 1); let _g = 0; let _g1 = _this12.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this12.stackVec3[i]; _this12.stackVec3[i] = null; } _this12.stackVec3 = newArray; } _this12.stackVec3[_this12.sizeVec3++] = _this10; } let _this13 = this.p; if(o != null) { o.zero(); if(_this13.sizeVec3 == _this13.stackVec3.length) { let newArray = new Array(_this13.sizeVec3 << 1); let _g = 0; let _g1 = _this13.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this13.stackVec3[i]; _this13.stackVec3[i] = null; } _this13.stackVec3 = newArray; } _this13.stackVec3[_this13.sizeVec3++] = o; } let _this14 = this.p; if(m != null) { m.e00 = 1; m.e01 = 0; m.e02 = 0; m.e10 = 0; m.e11 = 1; m.e12 = 0; m.e20 = 0; m.e21 = 0; m.e22 = 1; if(_this14.sizeMat3 == _this14.stackMat3.length) { let newArray = new Array(_this14.sizeMat3 << 1); let _g = 0; let _g1 = _this14.sizeMat3; while(_g < _g1) { let i = _g++; newArray[i] = _this14.stackMat3[i]; _this14.stackMat3[i] = null; } _this14.stackMat3 = newArray; } _this14.stackMat3[_this14.sizeMat3++] = m; } let _this15 = this.p; if(ex != null) { ex.zero(); if(_this15.sizeVec3 == _this15.stackVec3.length) { let newArray = new Array(_this15.sizeVec3 << 1); let _g = 0; let _g1 = _this15.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this15.stackVec3[i]; _this15.stackVec3[i] = null; } _this15.stackVec3 = newArray; } _this15.stackVec3[_this15.sizeVec3++] = ex; } let _this16 = this.p; if(ey != null) { ey.zero(); if(_this16.sizeVec3 == _this16.stackVec3.length) { let newArray = new Array(_this16.sizeVec3 << 1); let _g = 0; let _g1 = _this16.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this16.stackVec3[i]; _this16.stackVec3[i] = null; } _this16.stackVec3 = newArray; } _this16.stackVec3[_this16.sizeVec3++] = ey; } let _this17 = this.p; if(ez != null) { ez.zero(); if(_this17.sizeVec3 == _this17.stackVec3.length) { let newArray = new Array(_this17.sizeVec3 << 1); let _g = 0; let _g1 = _this17.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this17.stackVec3[i]; _this17.stackVec3[i] = null; } _this17.stackVec3 = newArray; } _this17.stackVec3[_this17.sizeVec3++] = ez; } } cylinder(tf,radius,halfHeight,color) { let _this = this.p; let ex = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this.p; let ey = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]; let _this2 = this.p; let ez = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]; let _this3 = this.p; let o = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; let _this4 = this.p; let m = _this4.sizeMat3 == 0 ? new oimo.common.Mat3() : _this4.stackMat3[--_this4.sizeMat3]; let v = o; v.x = tf._positionX; v.y = tf._positionY; v.z = tf._positionZ; let m1 = m; m1.e00 = tf._rotation00; m1.e01 = tf._rotation01; m1.e02 = tf._rotation02; m1.e10 = tf._rotation10; m1.e11 = tf._rotation11; m1.e12 = tf._rotation12; m1.e20 = tf._rotation20; m1.e21 = tf._rotation21; m1.e22 = tf._rotation22; ex.init(m.e00,m.e10,m.e20); ey.init(m.e01,m.e11,m.e21); ez.init(m.e02,m.e12,m.e22); let _this5 = this.p; let _this6 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3]; _this6.x = o.x; _this6.y = o.y; _this6.z = o.z; let _this7 = _this6; _this7.x += ey.x * halfHeight; _this7.y += ey.y * halfHeight; _this7.z += ey.z * halfHeight; let _this8 = this.p; let _this9 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3]; _this9.x = o.x; _this9.y = o.y; _this9.z = o.z; let _this10 = _this9; let s = -halfHeight; _this10.x += ey.x * s; _this10.y += ey.y * s; _this10.z += ey.z * s; if(this.wireframe) { let _this = this.p; let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; _this1.x = _this7.x; _this1.y = _this7.y; _this1.z = _this7.z; let _this2 = _this1; let s = -radius; _this2.x += ex.x * s; _this2.y += ex.y * s; _this2.z += ex.z * s; _this2.x += ez.x * 0; _this2.y += ez.y * 0; _this2.z += ez.z * 0; let _this3 = this.p; let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; _this4.x = _this7.x; _this4.y = _this7.y; _this4.z = _this7.z; let _this5 = _this4; _this5.x += ex.x * radius; _this5.y += ex.y * radius; _this5.z += ex.z * radius; _this5.x += ez.x * 0; _this5.y += ez.y * 0; _this5.z += ez.z * 0; let _this6 = this.p; let _this8 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3]; _this8.x = _this7.x; _this8.y = _this7.y; _this8.z = _this7.z; let _this9 = _this8; _this9.x += ex.x * 0; _this9.y += ex.y * 0; _this9.z += ex.z * 0; let s1 = -radius; _this9.x += ez.x * s1; _this9.y += ez.y * s1; _this9.z += ez.z * s1; let _this11 = this.p; let _this12 = _this11.sizeVec3 == 0 ? new oimo.common.Vec3() : _this11.stackVec3[--_this11.sizeVec3]; _this12.x = _this7.x; _this12.y = _this7.y; _this12.z = _this7.z; let _this13 = _this12; _this13.x += ex.x * 0; _this13.y += ex.y * 0; _this13.z += ex.z * 0; _this13.x += ez.x * radius; _this13.y += ez.y * radius; _this13.z += ez.z * radius; let _this14 = this.p; let _this15 = _this14.sizeVec3 == 0 ? new oimo.common.Vec3() : _this14.stackVec3[--_this14.sizeVec3]; _this15.x = _this10.x; _this15.y = _this10.y; _this15.z = _this10.z; let _this16 = _this15; let s2 = -radius; _this16.x += ex.x * s2; _this16.y += ex.y * s2; _this16.z += ex.z * s2; _this16.x += ez.x * 0; _this16.y += ez.y * 0; _this16.z += ez.z * 0; let _this17 = this.p; let _this18 = _this17.sizeVec3 == 0 ? new oimo.common.Vec3() : _this17.stackVec3[--_this17.sizeVec3]; _this18.x = _this10.x; _this18.y = _this10.y; _this18.z = _this10.z; let _this19 = _this18; _this19.x += ex.x * radius; _this19.y += ex.y * radius; _this19.z += ex.z * radius; _this19.x += ez.x * 0; _this19.y += ez.y * 0; _this19.z += ez.z * 0; let _this20 = this.p; let _this21 = _this20.sizeVec3 == 0 ? new oimo.common.Vec3() : _this20.stackVec3[--_this20.sizeVec3]; _this21.x = _this10.x; _this21.y = _this10.y; _this21.z = _this10.z; let _this22 = _this21; _this22.x += ex.x * 0; _this22.y += ex.y * 0; _this22.z += ex.z * 0; let s3 = -radius; _this22.x += ez.x * s3; _this22.y += ez.y * s3; _this22.z += ez.z * s3; let _this23 = this.p; let _this24 = _this23.sizeVec3 == 0 ? new oimo.common.Vec3() : _this23.stackVec3[--_this23.sizeVec3]; _this24.x = _this10.x; _this24.y = _this10.y; _this24.z = _this10.z; let _this25 = _this24; _this25.x += ex.x * 0; _this25.y += ex.y * 0; _this25.z += ex.z * 0; _this25.x += ez.x * radius; _this25.y += ez.y * radius; _this25.z += ez.z * radius; this.ellipse(_this7,ex,ez,radius,radius,color); this.ellipse(_this10,ex,ez,radius,radius,color); this.line(_this2,_this16,color); this.line(_this5,_this19,color); this.line(_this9,_this22,color); this.line(_this13,_this25,color); let _this26 = this.p; if(_this2 != null) { _this2.zero(); if(_this26.sizeVec3 == _this26.stackVec3.length) { let newArray = new Array(_this26.sizeVec3 << 1); let _g = 0; let _g1 = _this26.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this26.stackVec3[i]; _this26.stackVec3[i] = null; } _this26.stackVec3 = newArray; } _this26.stackVec3[_this26.sizeVec3++] = _this2; } let _this27 = this.p; if(_this5 != null) { _this5.zero(); if(_this27.sizeVec3 == _this27.stackVec3.length) { let newArray = new Array(_this27.sizeVec3 << 1); let _g = 0; let _g1 = _this27.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this27.stackVec3[i]; _this27.stackVec3[i] = null; } _this27.stackVec3 = newArray; } _this27.stackVec3[_this27.sizeVec3++] = _this5; } let _this28 = this.p; if(_this9 != null) { _this9.zero(); if(_this28.sizeVec3 == _this28.stackVec3.length) { let newArray = new Array(_this28.sizeVec3 << 1); let _g = 0; let _g1 = _this28.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this28.stackVec3[i]; _this28.stackVec3[i] = null; } _this28.stackVec3 = newArray; } _this28.stackVec3[_this28.sizeVec3++] = _this9; } let _this29 = this.p; if(_this13 != null) { _this13.zero(); if(_this29.sizeVec3 == _this29.stackVec3.length) { let newArray = new Array(_this29.sizeVec3 << 1); let _g = 0; let _g1 = _this29.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this29.stackVec3[i]; _this29.stackVec3[i] = null; } _this29.stackVec3 = newArray; } _this29.stackVec3[_this29.sizeVec3++] = _this13; } let _this30 = this.p; if(_this16 != null) { _this16.zero(); if(_this30.sizeVec3 == _this30.stackVec3.length) { let newArray = new Array(_this30.sizeVec3 << 1); let _g = 0; let _g1 = _this30.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this30.stackVec3[i]; _this30.stackVec3[i] = null; } _this30.stackVec3 = newArray; } _this30.stackVec3[_this30.sizeVec3++] = _this16; } let _this31 = this.p; if(_this19 != null) { _this19.zero(); if(_this31.sizeVec3 == _this31.stackVec3.length) { let newArray = new Array(_this31.sizeVec3 << 1); let _g = 0; let _g1 = _this31.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this31.stackVec3[i]; _this31.stackVec3[i] = null; } _this31.stackVec3 = newArray; } _this31.stackVec3[_this31.sizeVec3++] = _this19; } let _this32 = this.p; if(_this22 != null) { _this22.zero(); if(_this32.sizeVec3 == _this32.stackVec3.length) { let newArray = new Array(_this32.sizeVec3 << 1); let _g = 0; let _g1 = _this32.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this32.stackVec3[i]; _this32.stackVec3[i] = null; } _this32.stackVec3 = newArray; } _this32.stackVec3[_this32.sizeVec3++] = _this22; } let _this33 = this.p; if(_this25 != null) { _this25.zero(); if(_this33.sizeVec3 == _this33.stackVec3.length) { let newArray = new Array(_this33.sizeVec3 << 1); let _g = 0; let _g1 = _this33.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this33.stackVec3[i]; _this33.stackVec3[i] = null; } _this33.stackVec3 = newArray; } _this33.stackVec3[_this33.sizeVec3++] = _this25; } } else { let _g = 0; while(_g < 8) { let i = _g++; let _this = this.tmpCircleNorms[i]; let v = this.circleCoords[i]; _this.x = v.x; _this.y = v.y; _this.z = v.z; let y = _this.x * m.e10 + _this.y * m.e11 + _this.z * m.e12; let z = _this.x * m.e20 + _this.y * m.e21 + _this.z * m.e22; _this.x = _this.x * m.e00 + _this.y * m.e01 + _this.z * m.e02; _this.y = y; _this.z = z; let _this1 = this.tmpCircleVerts1[i]; let v1 = this.tmpCircleNorms[i]; _this1.x = v1.x; _this1.y = v1.y; _this1.z = v1.z; _this1.x *= radius; _this1.y *= radius; _this1.z *= radius; _this1.x += o.x; _this1.y += o.y; _this1.z += o.z; let _this2 = this.tmpCircleVerts2[i]; let v2 = this.tmpCircleVerts1[i]; _this2.x = v2.x; _this2.y = v2.y; _this2.z = v2.z; let _this3 = this.tmpCircleVerts1[i]; _this3.x += ey.x * halfHeight; _this3.y += ey.y * halfHeight; _this3.z += ey.z * halfHeight; let _this4 = this.tmpCircleVerts2[i]; let s = -halfHeight; _this4.x += ey.x * s; _this4.y += ey.y * s; _this4.z += ey.z * s; } let _g1 = 0; while(_g1 < 8) { let i = _g1++; let v1; let v2 = this.tmpCircleVerts1[i]; let v3 = this.tmpCircleVerts1[(i + 1) % 8]; let n1 = ey; this.triangle(_this7,v2,v3,n1,n1,n1,color); v2 = this.tmpCircleVerts2[(i + 1) % 8]; v3 = this.tmpCircleVerts2[i]; let _this = this.p; let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; _this1.x = ey.x; _this1.y = ey.y; _this1.z = ey.z; let _this2 = _this1; _this2.x = -_this2.x; _this2.y = -_this2.y; _this2.z = -_this2.z; this.triangle(_this10,v2,v3,_this2,_this2,_this2,color); let _this3 = this.p; if(_this2 != null) { _this2.zero(); if(_this3.sizeVec3 == _this3.stackVec3.length) { let newArray = new Array(_this3.sizeVec3 << 1); let _g = 0; let _g1 = _this3.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this3.stackVec3[i]; _this3.stackVec3[i] = null; } _this3.stackVec3 = newArray; } _this3.stackVec3[_this3.sizeVec3++] = _this2; } v1 = this.tmpCircleVerts1[i]; v2 = this.tmpCircleVerts2[i]; v3 = this.tmpCircleVerts2[(i + 1) % 8]; n1 = this.tmpCircleNorms[i]; let n2 = this.tmpCircleNorms[(i + 1) % 8]; this.rect(v1,v2,v3,this.tmpCircleVerts1[(i + 1) % 8],n1,n1,n2,n2,color); } } let _this11 = this.p; if(_this7 != null) { _this7.zero(); if(_this11.sizeVec3 == _this11.stackVec3.length) { let newArray = new Array(_this11.sizeVec3 << 1); let _g = 0; let _g1 = _this11.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this11.stackVec3[i]; _this11.stackVec3[i] = null; } _this11.stackVec3 = newArray; } _this11.stackVec3[_this11.sizeVec3++] = _this7; } let _this12 = this.p; if(_this10 != null) { _this10.zero(); if(_this12.sizeVec3 == _this12.stackVec3.length) { let newArray = new Array(_this12.sizeVec3 << 1); let _g = 0; let _g1 = _this12.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this12.stackVec3[i]; _this12.stackVec3[i] = null; } _this12.stackVec3 = newArray; } _this12.stackVec3[_this12.sizeVec3++] = _this10; } let _this13 = this.p; if(o != null) { o.zero(); if(_this13.sizeVec3 == _this13.stackVec3.length) { let newArray = new Array(_this13.sizeVec3 << 1); let _g = 0; let _g1 = _this13.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this13.stackVec3[i]; _this13.stackVec3[i] = null; } _this13.stackVec3 = newArray; } _this13.stackVec3[_this13.sizeVec3++] = o; } let _this14 = this.p; if(m != null) { m.e00 = 1; m.e01 = 0; m.e02 = 0; m.e10 = 0; m.e11 = 1; m.e12 = 0; m.e20 = 0; m.e21 = 0; m.e22 = 1; if(_this14.sizeMat3 == _this14.stackMat3.length) { let newArray = new Array(_this14.sizeMat3 << 1); let _g = 0; let _g1 = _this14.sizeMat3; while(_g < _g1) { let i = _g++; newArray[i] = _this14.stackMat3[i]; _this14.stackMat3[i] = null; } _this14.stackMat3 = newArray; } _this14.stackMat3[_this14.sizeMat3++] = m; } let _this15 = this.p; if(ex != null) { ex.zero(); if(_this15.sizeVec3 == _this15.stackVec3.length) { let newArray = new Array(_this15.sizeVec3 << 1); let _g = 0; let _g1 = _this15.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this15.stackVec3[i]; _this15.stackVec3[i] = null; } _this15.stackVec3 = newArray; } _this15.stackVec3[_this15.sizeVec3++] = ex; } let _this16 = this.p; if(ey != null) { ey.zero(); if(_this16.sizeVec3 == _this16.stackVec3.length) { let newArray = new Array(_this16.sizeVec3 << 1); let _g = 0; let _g1 = _this16.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this16.stackVec3[i]; _this16.stackVec3[i] = null; } _this16.stackVec3 = newArray; } _this16.stackVec3[_this16.sizeVec3++] = ey; } let _this17 = this.p; if(ez != null) { ez.zero(); if(_this17.sizeVec3 == _this17.stackVec3.length) { let newArray = new Array(_this17.sizeVec3 << 1); let _g = 0; let _g1 = _this17.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this17.stackVec3[i]; _this17.stackVec3[i] = null; } _this17.stackVec3 = newArray; } _this17.stackVec3[_this17.sizeVec3++] = ez; } } capsule(tf,radius,halfHeight,color) { let _this = this.p; let ex = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this.p; let ey = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]; let _this2 = this.p; let ez = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]; let _this3 = this.p; let o = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; let _this4 = this.p; let m = _this4.sizeMat3 == 0 ? new oimo.common.Mat3() : _this4.stackMat3[--_this4.sizeMat3]; let v = o; v.x = tf._positionX; v.y = tf._positionY; v.z = tf._positionZ; let m1 = m; m1.e00 = tf._rotation00; m1.e01 = tf._rotation01; m1.e02 = tf._rotation02; m1.e10 = tf._rotation10; m1.e11 = tf._rotation11; m1.e12 = tf._rotation12; m1.e20 = tf._rotation20; m1.e21 = tf._rotation21; m1.e22 = tf._rotation22; ex.init(m.e00,m.e10,m.e20); ey.init(m.e01,m.e11,m.e21); ez.init(m.e02,m.e12,m.e22); let vs = this.tmpSphereVerts; let ns = this.tmpSphereNorms; let _g = 0; while(_g < 5) { let i2 = _g++; let n = this.tmpSphereVerts[i2].length; let _g1 = 0; while(_g1 < n) { let j2 = _g1++; let _this = ns[i2][j2]; let v = this.sphereCoords[i2][j2]; _this.x = v.x; _this.y = v.y; _this.z = v.z; let y = _this.x * m.e10 + _this.y * m.e11 + _this.z * m.e12; let z = _this.x * m.e20 + _this.y * m.e21 + _this.z * m.e22; _this.x = _this.x * m.e00 + _this.y * m.e01 + _this.z * m.e02; _this.y = y; _this.z = z; } } let _g1 = 0; while(_g1 < 4) { let i = _g1++; if(i == 0) { let _g = 0; while(_g < 3) { let i2 = _g++; let n = this.tmpSphereVerts[i2].length; let _g1 = 0; while(_g1 < n) { let j2 = _g1++; let _this = vs[i2][j2]; let v = ns[i2][j2]; _this.x = v.x; _this.y = v.y; _this.z = v.z; _this.x *= radius; _this.y *= radius; _this.z *= radius; _this.x += o.x; _this.y += o.y; _this.z += o.z; _this.x += ey.x * halfHeight; _this.y += ey.y * halfHeight; _this.z += ey.z * halfHeight; } } } if(i == 2) { let _g = 2; while(_g < 5) { let i2 = _g++; let n = this.tmpSphereVerts[i2].length; let _g1 = 0; while(_g1 < n) { let j2 = _g1++; let _this = vs[i2][j2]; let v = ns[i2][j2]; _this.x = v.x; _this.y = v.y; _this.z = v.z; _this.x *= radius; _this.y *= radius; _this.z *= radius; _this.x += o.x; _this.y += o.y; _this.z += o.z; let s = -halfHeight; _this.x += ey.x * s; _this.y += ey.y * s; _this.z += ey.z * s; } } } let _g = 0; while(_g < 8) { let j = _g++; let v1; let v2; let v3; let v4; let n1; let n2; let n3; let n4; if(i == 0) { if(this.wireframe) { v1 = vs[0][0]; v2 = vs[1][j]; this.line(v1,v2,color); } else { v1 = vs[0][0]; v2 = vs[1][j]; v3 = vs[1][(j + 1) % 8]; n1 = ns[0][0]; n2 = ns[1][j]; n3 = ns[1][(j + 1) % 8]; this.triangle(v1,v2,v3,n1,n2,n3,color); } } else if(i == 3) { if(this.wireframe) { v1 = vs[4][0]; v2 = vs[i][(j + 1) % 8]; v3 = vs[i][j]; this.line(v1,v2,color); this.line(v2,v3,color); } else { v1 = vs[4][0]; v2 = vs[i][(j + 1) % 8]; v3 = vs[i][j]; n1 = ns[4][0]; n2 = ns[i][(j + 1) % 8]; n3 = ns[i][j]; this.triangle(v1,v2,v3,n1,n2,n3,color); } } else if(this.wireframe) { v1 = vs[i][j]; v2 = vs[i][(j + 1) % 8]; v3 = vs[i + 1][j]; this.line(v1,v2,color); this.line(v1,v3,color); } else { v1 = vs[i][j]; v2 = vs[i][(j + 1) % 8]; v3 = vs[i + 1][j]; v4 = vs[i + 1][(j + 1) % 8]; n1 = ns[i][j]; n2 = ns[i][(j + 1) % 8]; n3 = ns[i + 1][j]; n4 = ns[i + 1][(j + 1) % 8]; this.rect(v1,v3,v4,v2,n1,n3,n4,n2,color); } } } let _this5 = this.p; let _this6 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3]; _this6.x = o.x; _this6.y = o.y; _this6.z = o.z; let _this7 = _this6; _this7.x += ey.x * halfHeight; _this7.y += ey.y * halfHeight; _this7.z += ey.z * halfHeight; let _this8 = this.p; let _this9 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3]; _this9.x = o.x; _this9.y = o.y; _this9.z = o.z; let _this10 = _this9; let s = -halfHeight; _this10.x += ey.x * s; _this10.y += ey.y * s; _this10.z += ey.z * s; if(this.wireframe) { let _this = this.p; let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; _this1.x = _this7.x; _this1.y = _this7.y; _this1.z = _this7.z; let _this2 = _this1; let s = -radius; _this2.x += ex.x * s; _this2.y += ex.y * s; _this2.z += ex.z * s; _this2.x += ez.x * 0; _this2.y += ez.y * 0; _this2.z += ez.z * 0; let _this3 = this.p; let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; _this4.x = _this7.x; _this4.y = _this7.y; _this4.z = _this7.z; let _this5 = _this4; _this5.x += ex.x * radius; _this5.y += ex.y * radius; _this5.z += ex.z * radius; _this5.x += ez.x * 0; _this5.y += ez.y * 0; _this5.z += ez.z * 0; let _this6 = this.p; let _this8 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3]; _this8.x = _this7.x; _this8.y = _this7.y; _this8.z = _this7.z; let _this9 = _this8; _this9.x += ex.x * 0; _this9.y += ex.y * 0; _this9.z += ex.z * 0; let s1 = -radius; _this9.x += ez.x * s1; _this9.y += ez.y * s1; _this9.z += ez.z * s1; let _this11 = this.p; let _this12 = _this11.sizeVec3 == 0 ? new oimo.common.Vec3() : _this11.stackVec3[--_this11.sizeVec3]; _this12.x = _this7.x; _this12.y = _this7.y; _this12.z = _this7.z; let _this13 = _this12; _this13.x += ex.x * 0; _this13.y += ex.y * 0; _this13.z += ex.z * 0; _this13.x += ez.x * radius; _this13.y += ez.y * radius; _this13.z += ez.z * radius; let _this14 = this.p; let _this15 = _this14.sizeVec3 == 0 ? new oimo.common.Vec3() : _this14.stackVec3[--_this14.sizeVec3]; _this15.x = _this10.x; _this15.y = _this10.y; _this15.z = _this10.z; let _this16 = _this15; let s2 = -radius; _this16.x += ex.x * s2; _this16.y += ex.y * s2; _this16.z += ex.z * s2; _this16.x += ez.x * 0; _this16.y += ez.y * 0; _this16.z += ez.z * 0; let _this17 = this.p; let _this18 = _this17.sizeVec3 == 0 ? new oimo.common.Vec3() : _this17.stackVec3[--_this17.sizeVec3]; _this18.x = _this10.x; _this18.y = _this10.y; _this18.z = _this10.z; let _this19 = _this18; _this19.x += ex.x * radius; _this19.y += ex.y * radius; _this19.z += ex.z * radius; _this19.x += ez.x * 0; _this19.y += ez.y * 0; _this19.z += ez.z * 0; let _this20 = this.p; let _this21 = _this20.sizeVec3 == 0 ? new oimo.common.Vec3() : _this20.stackVec3[--_this20.sizeVec3]; _this21.x = _this10.x; _this21.y = _this10.y; _this21.z = _this10.z; let _this22 = _this21; _this22.x += ex.x * 0; _this22.y += ex.y * 0; _this22.z += ex.z * 0; let s3 = -radius; _this22.x += ez.x * s3; _this22.y += ez.y * s3; _this22.z += ez.z * s3; let _this23 = this.p; let _this24 = _this23.sizeVec3 == 0 ? new oimo.common.Vec3() : _this23.stackVec3[--_this23.sizeVec3]; _this24.x = _this10.x; _this24.y = _this10.y; _this24.z = _this10.z; let _this25 = _this24; _this25.x += ex.x * 0; _this25.y += ex.y * 0; _this25.z += ex.z * 0; _this25.x += ez.x * radius; _this25.y += ez.y * radius; _this25.z += ez.z * radius; this.ellipse(_this7,ex,ez,radius,radius,color); this.ellipse(_this10,ex,ez,radius,radius,color); this.line(_this2,_this16,color); this.line(_this5,_this19,color); this.line(_this9,_this22,color); this.line(_this13,_this25,color); let _this26 = this.p; if(_this2 != null) { _this2.zero(); if(_this26.sizeVec3 == _this26.stackVec3.length) { let newArray = new Array(_this26.sizeVec3 << 1); let _g = 0; let _g1 = _this26.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this26.stackVec3[i]; _this26.stackVec3[i] = null; } _this26.stackVec3 = newArray; } _this26.stackVec3[_this26.sizeVec3++] = _this2; } let _this27 = this.p; if(_this5 != null) { _this5.zero(); if(_this27.sizeVec3 == _this27.stackVec3.length) { let newArray = new Array(_this27.sizeVec3 << 1); let _g = 0; let _g1 = _this27.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this27.stackVec3[i]; _this27.stackVec3[i] = null; } _this27.stackVec3 = newArray; } _this27.stackVec3[_this27.sizeVec3++] = _this5; } let _this28 = this.p; if(_this9 != null) { _this9.zero(); if(_this28.sizeVec3 == _this28.stackVec3.length) { let newArray = new Array(_this28.sizeVec3 << 1); let _g = 0; let _g1 = _this28.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this28.stackVec3[i]; _this28.stackVec3[i] = null; } _this28.stackVec3 = newArray; } _this28.stackVec3[_this28.sizeVec3++] = _this9; } let _this29 = this.p; if(_this13 != null) { _this13.zero(); if(_this29.sizeVec3 == _this29.stackVec3.length) { let newArray = new Array(_this29.sizeVec3 << 1); let _g = 0; let _g1 = _this29.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this29.stackVec3[i]; _this29.stackVec3[i] = null; } _this29.stackVec3 = newArray; } _this29.stackVec3[_this29.sizeVec3++] = _this13; } let _this30 = this.p; if(_this16 != null) { _this16.zero(); if(_this30.sizeVec3 == _this30.stackVec3.length) { let newArray = new Array(_this30.sizeVec3 << 1); let _g = 0; let _g1 = _this30.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this30.stackVec3[i]; _this30.stackVec3[i] = null; } _this30.stackVec3 = newArray; } _this30.stackVec3[_this30.sizeVec3++] = _this16; } let _this31 = this.p; if(_this19 != null) { _this19.zero(); if(_this31.sizeVec3 == _this31.stackVec3.length) { let newArray = new Array(_this31.sizeVec3 << 1); let _g = 0; let _g1 = _this31.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this31.stackVec3[i]; _this31.stackVec3[i] = null; } _this31.stackVec3 = newArray; } _this31.stackVec3[_this31.sizeVec3++] = _this19; } let _this32 = this.p; if(_this22 != null) { _this22.zero(); if(_this32.sizeVec3 == _this32.stackVec3.length) { let newArray = new Array(_this32.sizeVec3 << 1); let _g = 0; let _g1 = _this32.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this32.stackVec3[i]; _this32.stackVec3[i] = null; } _this32.stackVec3 = newArray; } _this32.stackVec3[_this32.sizeVec3++] = _this22; } let _this33 = this.p; if(_this25 != null) { _this25.zero(); if(_this33.sizeVec3 == _this33.stackVec3.length) { let newArray = new Array(_this33.sizeVec3 << 1); let _g = 0; let _g1 = _this33.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this33.stackVec3[i]; _this33.stackVec3[i] = null; } _this33.stackVec3 = newArray; } _this33.stackVec3[_this33.sizeVec3++] = _this25; } } else { let _g = 0; while(_g < 8) { let i = _g++; let _this = this.tmpCircleNorms[i]; let v = this.circleCoords[i]; _this.x = v.x; _this.y = v.y; _this.z = v.z; let y = _this.x * m.e10 + _this.y * m.e11 + _this.z * m.e12; let z = _this.x * m.e20 + _this.y * m.e21 + _this.z * m.e22; _this.x = _this.x * m.e00 + _this.y * m.e01 + _this.z * m.e02; _this.y = y; _this.z = z; let _this1 = this.tmpCircleVerts1[i]; let v1 = this.tmpCircleNorms[i]; _this1.x = v1.x; _this1.y = v1.y; _this1.z = v1.z; _this1.x *= radius; _this1.y *= radius; _this1.z *= radius; _this1.x += o.x; _this1.y += o.y; _this1.z += o.z; let _this2 = this.tmpCircleVerts2[i]; let v2 = this.tmpCircleVerts1[i]; _this2.x = v2.x; _this2.y = v2.y; _this2.z = v2.z; let _this3 = this.tmpCircleVerts1[i]; _this3.x += ey.x * halfHeight; _this3.y += ey.y * halfHeight; _this3.z += ey.z * halfHeight; let _this4 = this.tmpCircleVerts2[i]; let s = -halfHeight; _this4.x += ey.x * s; _this4.y += ey.y * s; _this4.z += ey.z * s; } let _g1 = 0; while(_g1 < 8) { let i = _g1++; let n1 = this.tmpCircleNorms[i]; let n2 = this.tmpCircleNorms[(i + 1) % 8]; this.rect(this.tmpCircleVerts1[i],this.tmpCircleVerts2[i],this.tmpCircleVerts2[(i + 1) % 8],this.tmpCircleVerts1[(i + 1) % 8],n1,n1,n2,n2,color); } } let _this11 = this.p; if(_this7 != null) { _this7.zero(); if(_this11.sizeVec3 == _this11.stackVec3.length) { let newArray = new Array(_this11.sizeVec3 << 1); let _g = 0; let _g1 = _this11.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this11.stackVec3[i]; _this11.stackVec3[i] = null; } _this11.stackVec3 = newArray; } _this11.stackVec3[_this11.sizeVec3++] = _this7; } let _this12 = this.p; if(_this10 != null) { _this10.zero(); if(_this12.sizeVec3 == _this12.stackVec3.length) { let newArray = new Array(_this12.sizeVec3 << 1); let _g = 0; let _g1 = _this12.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this12.stackVec3[i]; _this12.stackVec3[i] = null; } _this12.stackVec3 = newArray; } _this12.stackVec3[_this12.sizeVec3++] = _this10; } let _this13 = this.p; if(o != null) { o.zero(); if(_this13.sizeVec3 == _this13.stackVec3.length) { let newArray = new Array(_this13.sizeVec3 << 1); let _g = 0; let _g1 = _this13.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this13.stackVec3[i]; _this13.stackVec3[i] = null; } _this13.stackVec3 = newArray; } _this13.stackVec3[_this13.sizeVec3++] = o; } let _this14 = this.p; if(m != null) { m.e00 = 1; m.e01 = 0; m.e02 = 0; m.e10 = 0; m.e11 = 1; m.e12 = 0; m.e20 = 0; m.e21 = 0; m.e22 = 1; if(_this14.sizeMat3 == _this14.stackMat3.length) { let newArray = new Array(_this14.sizeMat3 << 1); let _g = 0; let _g1 = _this14.sizeMat3; while(_g < _g1) { let i = _g++; newArray[i] = _this14.stackMat3[i]; _this14.stackMat3[i] = null; } _this14.stackMat3 = newArray; } _this14.stackMat3[_this14.sizeMat3++] = m; } let _this15 = this.p; if(ex != null) { ex.zero(); if(_this15.sizeVec3 == _this15.stackVec3.length) { let newArray = new Array(_this15.sizeVec3 << 1); let _g = 0; let _g1 = _this15.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this15.stackVec3[i]; _this15.stackVec3[i] = null; } _this15.stackVec3 = newArray; } _this15.stackVec3[_this15.sizeVec3++] = ex; } let _this16 = this.p; if(ey != null) { ey.zero(); if(_this16.sizeVec3 == _this16.stackVec3.length) { let newArray = new Array(_this16.sizeVec3 << 1); let _g = 0; let _g1 = _this16.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this16.stackVec3[i]; _this16.stackVec3[i] = null; } _this16.stackVec3 = newArray; } _this16.stackVec3[_this16.sizeVec3++] = ey; } let _this17 = this.p; if(ez != null) { ez.zero(); if(_this17.sizeVec3 == _this17.stackVec3.length) { let newArray = new Array(_this17.sizeVec3 << 1); let _g = 0; let _g1 = _this17.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this17.stackVec3[i]; _this17.stackVec3[i] = null; } _this17.stackVec3 = newArray; } _this17.stackVec3[_this17.sizeVec3++] = ez; } } sphere(tf,radius,color) { let _this = this.p; let o = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this.p; let m = _this1.sizeMat3 == 0 ? new oimo.common.Mat3() : _this1.stackMat3[--_this1.sizeMat3]; let v = o; v.x = tf._positionX; v.y = tf._positionY; v.z = tf._positionZ; let m1 = m; m1.e00 = tf._rotation00; m1.e01 = tf._rotation01; m1.e02 = tf._rotation02; m1.e10 = tf._rotation10; m1.e11 = tf._rotation11; m1.e12 = tf._rotation12; m1.e20 = tf._rotation20; m1.e21 = tf._rotation21; m1.e22 = tf._rotation22; let vs = this.tmpSphereVerts; let ns = this.tmpSphereNorms; let _g = 0; while(_g < 5) { let i = _g++; let n = this.tmpSphereVerts[i].length; let _g1 = 0; while(_g1 < n) { let j = _g1++; let _this = ns[i][j]; let v = this.sphereCoords[i][j]; _this.x = v.x; _this.y = v.y; _this.z = v.z; let y = _this.x * m.e10 + _this.y * m.e11 + _this.z * m.e12; let z = _this.x * m.e20 + _this.y * m.e21 + _this.z * m.e22; _this.x = _this.x * m.e00 + _this.y * m.e01 + _this.z * m.e02; _this.y = y; _this.z = z; let _this1 = vs[i][j]; let v1 = ns[i][j]; _this1.x = v1.x; _this1.y = v1.y; _this1.z = v1.z; _this1.x *= radius; _this1.y *= radius; _this1.z *= radius; _this1.x += o.x; _this1.y += o.y; _this1.z += o.z; } } let _g1 = 0; while(_g1 < 4) { let i = _g1++; let _g = 0; while(_g < 8) { let j = _g++; let v1; let v2; let v3; let v4; let n1; let n2; let n3; let n4; if(i == 0) { if(this.wireframe) { v1 = vs[0][0]; v2 = vs[1][j]; this.line(v1,v2,color); } else { v1 = vs[0][0]; v2 = vs[1][j]; v3 = vs[1][(j + 1) % 8]; n1 = ns[0][0]; n2 = ns[1][j]; n3 = ns[1][(j + 1) % 8]; this.triangle(v1,v2,v3,n1,n2,n3,color); } } else if(i == 3) { if(this.wireframe) { v1 = vs[4][0]; v2 = vs[i][(j + 1) % 8]; v3 = vs[i][j]; this.line(v1,v2,color); this.line(v2,v3,color); } else { v1 = vs[4][0]; v2 = vs[i][(j + 1) % 8]; v3 = vs[i][j]; n1 = ns[4][0]; n2 = ns[i][(j + 1) % 8]; n3 = ns[i][j]; this.triangle(v1,v2,v3,n1,n2,n3,color); } } else if(this.wireframe) { v1 = vs[i][j]; v2 = vs[i][(j + 1) % 8]; v3 = vs[i + 1][j]; this.line(v1,v2,color); this.line(v1,v3,color); } else { v1 = vs[i][j]; v2 = vs[i][(j + 1) % 8]; v3 = vs[i + 1][j]; v4 = vs[i + 1][(j + 1) % 8]; n1 = ns[i][j]; n2 = ns[i][(j + 1) % 8]; n3 = ns[i + 1][j]; n4 = ns[i + 1][(j + 1) % 8]; this.rect(v1,v3,v4,v2,n1,n3,n4,n2,color); } } } let _this2 = this.p; if(o != null) { o.zero(); if(_this2.sizeVec3 == _this2.stackVec3.length) { let newArray = new Array(_this2.sizeVec3 << 1); let _g = 0; let _g1 = _this2.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this2.stackVec3[i]; _this2.stackVec3[i] = null; } _this2.stackVec3 = newArray; } _this2.stackVec3[_this2.sizeVec3++] = o; } let _this3 = this.p; if(m != null) { m.e00 = 1; m.e01 = 0; m.e02 = 0; m.e10 = 0; m.e11 = 1; m.e12 = 0; m.e20 = 0; m.e21 = 0; m.e22 = 1; if(_this3.sizeMat3 == _this3.stackMat3.length) { let newArray = new Array(_this3.sizeMat3 << 1); let _g = 0; let _g1 = _this3.sizeMat3; while(_g < _g1) { let i = _g++; newArray[i] = _this3.stackMat3[i]; _this3.stackMat3[i] = null; } _this3.stackMat3 = newArray; } _this3.stackMat3[_this3.sizeMat3++] = m; } } box(tf,halfExtents,color) { let _this = this.p; let ex = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; let _this1 = this.p; let ey = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]; let _this2 = this.p; let ez = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]; let _this3 = this.p; let o = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; let _this4 = this.p; let m = _this4.sizeMat3 == 0 ? new oimo.common.Mat3() : _this4.stackMat3[--_this4.sizeMat3]; let v = o; v.x = tf._positionX; v.y = tf._positionY; v.z = tf._positionZ; let m1 = m; m1.e00 = tf._rotation00; m1.e01 = tf._rotation01; m1.e02 = tf._rotation02; m1.e10 = tf._rotation10; m1.e11 = tf._rotation11; m1.e12 = tf._rotation12; m1.e20 = tf._rotation20; m1.e21 = tf._rotation21; m1.e22 = tf._rotation22; ex.init(m.e00,m.e10,m.e20); ey.init(m.e01,m.e11,m.e21); ez.init(m.e02,m.e12,m.e22); let hx = halfExtents.x; let hy = halfExtents.y; let hz = halfExtents.z; let _this5 = this.p; let _this6 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3]; _this6.x = o.x; _this6.y = o.y; _this6.z = o.z; let _this7 = _this6; let s = -hx; _this7.x += ex.x * s; _this7.y += ex.y * s; _this7.z += ex.z * s; let s1 = -hy; _this7.x += ey.x * s1; _this7.y += ey.y * s1; _this7.z += ey.z * s1; let s2 = -hz; _this7.x += ez.x * s2; _this7.y += ez.y * s2; _this7.z += ez.z * s2; let _this8 = this.p; let _this9 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3]; _this9.x = o.x; _this9.y = o.y; _this9.z = o.z; let _this10 = _this9; let s3 = -hx; _this10.x += ex.x * s3; _this10.y += ex.y * s3; _this10.z += ex.z * s3; let s4 = -hy; _this10.x += ey.x * s4; _this10.y += ey.y * s4; _this10.z += ey.z * s4; _this10.x += ez.x * hz; _this10.y += ez.y * hz; _this10.z += ez.z * hz; let _this11 = this.p; let _this12 = _this11.sizeVec3 == 0 ? new oimo.common.Vec3() : _this11.stackVec3[--_this11.sizeVec3]; _this12.x = o.x; _this12.y = o.y; _this12.z = o.z; let _this13 = _this12; let s5 = -hx; _this13.x += ex.x * s5; _this13.y += ex.y * s5; _this13.z += ex.z * s5; _this13.x += ey.x * hy; _this13.y += ey.y * hy; _this13.z += ey.z * hy; let s6 = -hz; _this13.x += ez.x * s6; _this13.y += ez.y * s6; _this13.z += ez.z * s6; let _this14 = this.p; let _this15 = _this14.sizeVec3 == 0 ? new oimo.common.Vec3() : _this14.stackVec3[--_this14.sizeVec3]; _this15.x = o.x; _this15.y = o.y; _this15.z = o.z; let _this16 = _this15; let s7 = -hx; _this16.x += ex.x * s7; _this16.y += ex.y * s7; _this16.z += ex.z * s7; _this16.x += ey.x * hy; _this16.y += ey.y * hy; _this16.z += ey.z * hy; _this16.x += ez.x * hz; _this16.y += ez.y * hz; _this16.z += ez.z * hz; let _this17 = this.p; let _this18 = _this17.sizeVec3 == 0 ? new oimo.common.Vec3() : _this17.stackVec3[--_this17.sizeVec3]; _this18.x = o.x; _this18.y = o.y; _this18.z = o.z; let _this19 = _this18; _this19.x += ex.x * hx; _this19.y += ex.y * hx; _this19.z += ex.z * hx; let s8 = -hy; _this19.x += ey.x * s8; _this19.y += ey.y * s8; _this19.z += ey.z * s8; let s9 = -hz; _this19.x += ez.x * s9; _this19.y += ez.y * s9; _this19.z += ez.z * s9; let _this20 = this.p; let _this21 = _this20.sizeVec3 == 0 ? new oimo.common.Vec3() : _this20.stackVec3[--_this20.sizeVec3]; _this21.x = o.x; _this21.y = o.y; _this21.z = o.z; let _this22 = _this21; _this22.x += ex.x * hx; _this22.y += ex.y * hx; _this22.z += ex.z * hx; let s10 = -hy; _this22.x += ey.x * s10; _this22.y += ey.y * s10; _this22.z += ey.z * s10; _this22.x += ez.x * hz; _this22.y += ez.y * hz; _this22.z += ez.z * hz; let _this23 = this.p; let _this24 = _this23.sizeVec3 == 0 ? new oimo.common.Vec3() : _this23.stackVec3[--_this23.sizeVec3]; _this24.x = o.x; _this24.y = o.y; _this24.z = o.z; let _this25 = _this24; _this25.x += ex.x * hx; _this25.y += ex.y * hx; _this25.z += ex.z * hx; _this25.x += ey.x * hy; _this25.y += ey.y * hy; _this25.z += ey.z * hy; let s11 = -hz; _this25.x += ez.x * s11; _this25.y += ez.y * s11; _this25.z += ez.z * s11; let _this26 = this.p; let _this27 = _this26.sizeVec3 == 0 ? new oimo.common.Vec3() : _this26.stackVec3[--_this26.sizeVec3]; _this27.x = o.x; _this27.y = o.y; _this27.z = o.z; let _this28 = _this27; _this28.x += ex.x * hx; _this28.y += ex.y * hx; _this28.z += ex.z * hx; _this28.x += ey.x * hy; _this28.y += ey.y * hy; _this28.z += ey.z * hy; _this28.x += ez.x * hz; _this28.y += ez.y * hz; _this28.z += ez.z * hz; if(this.wireframe) { this.line(_this7,_this10,color); this.line(_this13,_this16,color); this.line(_this19,_this22,color); this.line(_this25,_this28,color); this.line(_this7,_this13,color); this.line(_this10,_this16,color); this.line(_this19,_this25,color); this.line(_this22,_this28,color); this.line(_this7,_this19,color); this.line(_this10,_this22,color); this.line(_this13,_this25,color); this.line(_this16,_this28,color); } else { let _this = this.p; let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]; _this1.x = ex.x; _this1.y = ex.y; _this1.z = ex.z; let _this2 = _this1; _this2.x = -_this2.x; _this2.y = -_this2.y; _this2.z = -_this2.z; let _this3 = this.p; let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]; _this4.x = ey.x; _this4.y = ey.y; _this4.z = ey.z; let _this5 = _this4; _this5.x = -_this5.x; _this5.y = -_this5.y; _this5.z = -_this5.z; let _this6 = this.p; let _this8 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3]; _this8.x = ez.x; _this8.y = ez.y; _this8.z = ez.z; let _this9 = _this8; _this9.x = -_this9.x; _this9.y = -_this9.y; _this9.z = -_this9.z; this.rect(_this7,_this10,_this16,_this13,_this2,_this2,_this2,_this2,color); this.rect(_this19,_this25,_this28,_this22,ex,ex,ex,ex,color); this.rect(_this7,_this19,_this22,_this10,_this5,_this5,_this5,_this5,color); this.rect(_this13,_this16,_this28,_this25,ey,ey,ey,ey,color); this.rect(_this7,_this13,_this25,_this19,_this9,_this9,_this9,_this9,color); this.rect(_this10,_this22,_this28,_this16,ez,ez,ez,ez,color); let _this11 = this.p; if(_this2 != null) { _this2.zero(); if(_this11.sizeVec3 == _this11.stackVec3.length) { let newArray = new Array(_this11.sizeVec3 << 1); let _g = 0; let _g1 = _this11.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this11.stackVec3[i]; _this11.stackVec3[i] = null; } _this11.stackVec3 = newArray; } _this11.stackVec3[_this11.sizeVec3++] = _this2; } let _this12 = this.p; if(_this5 != null) { _this5.zero(); if(_this12.sizeVec3 == _this12.stackVec3.length) { let newArray = new Array(_this12.sizeVec3 << 1); let _g = 0; let _g1 = _this12.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this12.stackVec3[i]; _this12.stackVec3[i] = null; } _this12.stackVec3 = newArray; } _this12.stackVec3[_this12.sizeVec3++] = _this5; } let _this14 = this.p; if(_this9 != null) { _this9.zero(); if(_this14.sizeVec3 == _this14.stackVec3.length) { let newArray = new Array(_this14.sizeVec3 << 1); let _g = 0; let _g1 = _this14.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this14.stackVec3[i]; _this14.stackVec3[i] = null; } _this14.stackVec3 = newArray; } _this14.stackVec3[_this14.sizeVec3++] = _this9; } } let _this29 = this.p; if(_this7 != null) { _this7.zero(); if(_this29.sizeVec3 == _this29.stackVec3.length) { let newArray = new Array(_this29.sizeVec3 << 1); let _g = 0; let _g1 = _this29.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this29.stackVec3[i]; _this29.stackVec3[i] = null; } _this29.stackVec3 = newArray; } _this29.stackVec3[_this29.sizeVec3++] = _this7; } let _this30 = this.p; if(_this10 != null) { _this10.zero(); if(_this30.sizeVec3 == _this30.stackVec3.length) { let newArray = new Array(_this30.sizeVec3 << 1); let _g = 0; let _g1 = _this30.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this30.stackVec3[i]; _this30.stackVec3[i] = null; } _this30.stackVec3 = newArray; } _this30.stackVec3[_this30.sizeVec3++] = _this10; } let _this31 = this.p; if(_this13 != null) { _this13.zero(); if(_this31.sizeVec3 == _this31.stackVec3.length) { let newArray = new Array(_this31.sizeVec3 << 1); let _g = 0; let _g1 = _this31.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this31.stackVec3[i]; _this31.stackVec3[i] = null; } _this31.stackVec3 = newArray; } _this31.stackVec3[_this31.sizeVec3++] = _this13; } let _this32 = this.p; if(_this16 != null) { _this16.zero(); if(_this32.sizeVec3 == _this32.stackVec3.length) { let newArray = new Array(_this32.sizeVec3 << 1); let _g = 0; let _g1 = _this32.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this32.stackVec3[i]; _this32.stackVec3[i] = null; } _this32.stackVec3 = newArray; } _this32.stackVec3[_this32.sizeVec3++] = _this16; } let _this33 = this.p; if(_this19 != null) { _this19.zero(); if(_this33.sizeVec3 == _this33.stackVec3.length) { let newArray = new Array(_this33.sizeVec3 << 1); let _g = 0; let _g1 = _this33.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this33.stackVec3[i]; _this33.stackVec3[i] = null; } _this33.stackVec3 = newArray; } _this33.stackVec3[_this33.sizeVec3++] = _this19; } let _this34 = this.p; if(_this22 != null) { _this22.zero(); if(_this34.sizeVec3 == _this34.stackVec3.length) { let newArray = new Array(_this34.sizeVec3 << 1); let _g = 0; let _g1 = _this34.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this34.stackVec3[i]; _this34.stackVec3[i] = null; } _this34.stackVec3 = newArray; } _this34.stackVec3[_this34.sizeVec3++] = _this22; } let _this35 = this.p; if(_this25 != null) { _this25.zero(); if(_this35.sizeVec3 == _this35.stackVec3.length) { let newArray = new Array(_this35.sizeVec3 << 1); let _g = 0; let _g1 = _this35.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this35.stackVec3[i]; _this35.stackVec3[i] = null; } _this35.stackVec3 = newArray; } _this35.stackVec3[_this35.sizeVec3++] = _this25; } let _this36 = this.p; if(_this28 != null) { _this28.zero(); if(_this36.sizeVec3 == _this36.stackVec3.length) { let newArray = new Array(_this36.sizeVec3 << 1); let _g = 0; let _g1 = _this36.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this36.stackVec3[i]; _this36.stackVec3[i] = null; } _this36.stackVec3 = newArray; } _this36.stackVec3[_this36.sizeVec3++] = _this28; } let _this37 = this.p; if(o != null) { o.zero(); if(_this37.sizeVec3 == _this37.stackVec3.length) { let newArray = new Array(_this37.sizeVec3 << 1); let _g = 0; let _g1 = _this37.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this37.stackVec3[i]; _this37.stackVec3[i] = null; } _this37.stackVec3 = newArray; } _this37.stackVec3[_this37.sizeVec3++] = o; } let _this38 = this.p; if(m != null) { m.e00 = 1; m.e01 = 0; m.e02 = 0; m.e10 = 0; m.e11 = 1; m.e12 = 0; m.e20 = 0; m.e21 = 0; m.e22 = 1; if(_this38.sizeMat3 == _this38.stackMat3.length) { let newArray = new Array(_this38.sizeMat3 << 1); let _g = 0; let _g1 = _this38.sizeMat3; while(_g < _g1) { let i = _g++; newArray[i] = _this38.stackMat3[i]; _this38.stackMat3[i] = null; } _this38.stackMat3 = newArray; } _this38.stackMat3[_this38.sizeMat3++] = m; } let _this39 = this.p; if(ex != null) { ex.zero(); if(_this39.sizeVec3 == _this39.stackVec3.length) { let newArray = new Array(_this39.sizeVec3 << 1); let _g = 0; let _g1 = _this39.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this39.stackVec3[i]; _this39.stackVec3[i] = null; } _this39.stackVec3 = newArray; } _this39.stackVec3[_this39.sizeVec3++] = ex; } let _this40 = this.p; if(ey != null) { ey.zero(); if(_this40.sizeVec3 == _this40.stackVec3.length) { let newArray = new Array(_this40.sizeVec3 << 1); let _g = 0; let _g1 = _this40.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this40.stackVec3[i]; _this40.stackVec3[i] = null; } _this40.stackVec3 = newArray; } _this40.stackVec3[_this40.sizeVec3++] = ey; } let _this41 = this.p; if(ez != null) { ez.zero(); if(_this41.sizeVec3 == _this41.stackVec3.length) { let newArray = new Array(_this41.sizeVec3 << 1); let _g = 0; let _g1 = _this41.sizeVec3; while(_g < _g1) { let i = _g++; newArray[i] = _this41.stackVec3[i]; _this41.stackVec3[i] = null; } _this41.stackVec3 = newArray; } _this41.stackVec3[_this41.sizeVec3++] = ez; } } rect(v1,v2,v3,v4,n1,n2,n3,n4,color) { this.triangle(v1,v2,v3,n1,n2,n3,color); this.triangle(v1,v3,v4,n1,n3,n4,color); } point(v,color) { } triangle(v1,v2,v3,n1,n2,n3,color) { } line(v1,v2,color) { } } oimo.dynamics.common.DebugDrawStyle = class oimo_dynamics_common_DebugDrawStyle { constructor() { this.basisColorZ = new oimo.common.Vec3(0.0,0.0,1.0); this.basisColorY = new oimo.common.Vec3(0.0,1.0,0.0); this.basisColorX = new oimo.common.Vec3(1.0,0.0,0.0); this.basisLength = 0.5; this.jointRotationalConstraintRadius = 0.3; this.jointErrorColor = new oimo.common.Vec3(1.0,0.1,0.1); this.jointLineColor = new oimo.common.Vec3(0.8,0.8,0.8); this.contactBinormalLength = 0.5; this.contactTangentLength = 0.5; this.contactNormalLength = 0.5; this.contactBinormalColor = new oimo.common.Vec3(0.2,0.2,1.0); this.contactTangentColor = new oimo.common.Vec3(0.1,0.8,0.1); this.contactNormalColor = new oimo.common.Vec3(1.0,0.1,0.1); this.disabledContactColor = new oimo.common.Vec3(0.5,0.1,0.1); this.newContactColor = new oimo.common.Vec3(1.0,1.0,0.1); this.contactColor4 = new oimo.common.Vec3(0.8,0.1,1.0); this.contactColor3 = new oimo.common.Vec3(0.1,0.8,0.6); this.contactColor2 = new oimo.common.Vec3(1.0,0.6,0.1); this.contactColor = new oimo.common.Vec3(1.0,0.1,0.1); this.pairColor = new oimo.common.Vec3(1.0,1.0,0.1); this.bvhNodeColor = new oimo.common.Vec3(0.4,0.4,0.4); this.aabbColor = new oimo.common.Vec3(1.0,0.1,0.1); this.kinematicShapeColor = new oimo.common.Vec3(1.0,0.5,0.1); this.staticShapeColor = new oimo.common.Vec3(0.7,0.7,0.7); this.sleepingShapeColor2 = new oimo.common.Vec3(0.2,0.8,0.5); this.sleepingShapeColor1 = new oimo.common.Vec3(0.3,0.3,0.8); this.sleepyShapeColor2 = new oimo.common.Vec3(0.6,0.8,0.3); this.sleepyShapeColor1 = new oimo.common.Vec3(0.5,0.25,0.6); this.shapeColor2 = new oimo.common.Vec3(1.0,0.8,0.1); this.shapeColor1 = new oimo.common.Vec3(0.7,0.2,0.4); } } oimo.dynamics.common.Performance = class oimo_dynamics_common_Performance { } if(!oimo.dynamics.constraint) oimo.dynamics.constraint = {}; oimo.dynamics.constraint.ConstraintSolver = class oimo_dynamics_constraint_ConstraintSolver { constructor() { this._b1 = null; this._b2 = null; this._addedToIsland = false; } preSolveVelocity(timeStep) { } warmStart(timeStep) { } solveVelocity() { } postSolveVelocity(timeStep) { } preSolvePosition(timeStep) { } solvePositionSplitImpulse() { } solvePositionNgs(timeStep) { } postSolve() { } } oimo.dynamics.constraint.PositionCorrectionAlgorithm = class oimo_dynamics_constraint_PositionCorrectionAlgorithm { } if(!oimo.dynamics.constraint.contact) oimo.dynamics.constraint.contact = {}; oimo.dynamics.constraint.contact.ContactConstraint = class oimo_dynamics_constraint_contact_ContactConstraint { constructor(manifold) { this._solver = new oimo.dynamics.constraint.solver.pgs.PgsContactConstraintSolver(this); this._manifold = manifold; } _getVelocitySolverInfo(timeStep,info) { info.b1 = this._b1; info.b2 = this._b2; let normalX; let normalY; let normalZ; let tangentX; let tangentY; let tangentZ; let binormalX; let binormalY; let binormalZ; normalX = this._manifold._normalX; normalY = this._manifold._normalY; normalZ = this._manifold._normalZ; tangentX = this._manifold._tangentX; tangentY = this._manifold._tangentY; tangentZ = this._manifold._tangentZ; binormalX = this._manifold._binormalX; binormalY = this._manifold._binormalY; binormalZ = this._manifold._binormalZ; let friction = Math.sqrt(this._s1._friction * this._s2._friction); let restitution = Math.sqrt(this._s1._restitution * this._s2._restitution); let num = this._manifold._numPoints; info.numRows = 0; let _g = 0; while(_g < num) { let p = this._manifold._points[_g++]; if(p._depth < 0) { p._disabled = true; let _this = p._impulse; _this.impulseN = 0; _this.impulseT = 0; _this.impulseB = 0; _this.impulseP = 0; _this.impulseLX = 0; _this.impulseLY = 0; _this.impulseLZ = 0; continue; } else { p._disabled = false; } let row = info.rows[info.numRows++]; row.friction = friction; row.cfm = 0; let j = row.jacobianN; j.lin1X = normalX; j.lin1Y = normalY; j.lin1Z = normalZ; j.lin2X = normalX; j.lin2Y = normalY; j.lin2Z = normalZ; j.ang1X = p._relPos1Y * normalZ - p._relPos1Z * normalY; j.ang1Y = p._relPos1Z * normalX - p._relPos1X * normalZ; j.ang1Z = p._relPos1X * normalY - p._relPos1Y * normalX; j.ang2X = p._relPos2Y * normalZ - p._relPos2Z * normalY; j.ang2Y = p._relPos2Z * normalX - p._relPos2X * normalZ; j.ang2Z = p._relPos2X * normalY - p._relPos2Y * normalX; j = row.jacobianT; j.lin1X = tangentX; j.lin1Y = tangentY; j.lin1Z = tangentZ; j.lin2X = tangentX; j.lin2Y = tangentY; j.lin2Z = tangentZ; j.ang1X = p._relPos1Y * tangentZ - p._relPos1Z * tangentY; j.ang1Y = p._relPos1Z * tangentX - p._relPos1X * tangentZ; j.ang1Z = p._relPos1X * tangentY - p._relPos1Y * tangentX; j.ang2X = p._relPos2Y * tangentZ - p._relPos2Z * tangentY; j.ang2Y = p._relPos2Z * tangentX - p._relPos2X * tangentZ; j.ang2Z = p._relPos2X * tangentY - p._relPos2Y * tangentX; j = row.jacobianB; j.lin1X = binormalX; j.lin1Y = binormalY; j.lin1Z = binormalZ; j.lin2X = binormalX; j.lin2Y = binormalY; j.lin2Z = binormalZ; j.ang1X = p._relPos1Y * binormalZ - p._relPos1Z * binormalY; j.ang1Y = p._relPos1Z * binormalX - p._relPos1X * binormalZ; j.ang1Z = p._relPos1X * binormalY - p._relPos1Y * binormalX; j.ang2X = p._relPos2Y * binormalZ - p._relPos2Z * binormalY; j.ang2Y = p._relPos2Z * binormalX - p._relPos2X * binormalZ; j.ang2Z = p._relPos2X * binormalY - p._relPos2Y * binormalX; j = row.jacobianN; let rvn = j.lin1X * this._b1._velX + j.lin1Y * this._b1._velY + j.lin1Z * this._b1._velZ + (j.ang1X * this._b1._angVelX + j.ang1Y * this._b1._angVelY + j.ang1Z * this._b1._angVelZ) - (j.lin2X * this._b2._velX + j.lin2Y * this._b2._velY + j.lin2Z * this._b2._velZ + (j.ang2X * this._b2._angVelX + j.ang2Y * this._b2._angVelY + j.ang2Z * this._b2._angVelZ)); if(rvn < -oimo.common.Setting.contactEnableBounceThreshold && !p._warmStarted) { row.rhs = -rvn * restitution; } else { row.rhs = 0; } if(this._positionCorrectionAlgorithm == oimo.dynamics.constraint.PositionCorrectionAlgorithm.BAUMGARTE) { if(p._depth > oimo.common.Setting.linearSlop) { let minRhs = (p._depth - oimo.common.Setting.linearSlop) * oimo.common.Setting.velocityBaumgarte * timeStep.invDt; if(row.rhs < minRhs) { row.rhs = minRhs; } } } if(!p._warmStarted) { let _this = p._impulse; _this.impulseN = 0; _this.impulseT = 0; _this.impulseB = 0; _this.impulseP = 0; _this.impulseLX = 0; _this.impulseLY = 0; _this.impulseLZ = 0; } row.impulse = p._impulse; } } _getPositionSolverInfo(info) { info.b1 = this._b1; info.b2 = this._b2; let normalX; let normalY; let normalZ; normalX = this._manifold._normalX; normalY = this._manifold._normalY; normalZ = this._manifold._normalZ; let num = this._manifold._numPoints; info.numRows = 0; let _g = 0; while(_g < num) { let p = this._manifold._points[_g++]; if(p._disabled) { continue; } let row = info.rows[info.numRows++]; let j = row.jacobianN; j.lin1X = normalX; j.lin1Y = normalY; j.lin1Z = normalZ; j.lin2X = normalX; j.lin2Y = normalY; j.lin2Z = normalZ; j.ang1X = p._relPos1Y * normalZ - p._relPos1Z * normalY; j.ang1Y = p._relPos1Z * normalX - p._relPos1X * normalZ; j.ang1Z = p._relPos1X * normalY - p._relPos1Y * normalX; j.ang2X = p._relPos2Y * normalZ - p._relPos2Z * normalY; j.ang2Y = p._relPos2Z * normalX - p._relPos2X * normalZ; j.ang2Z = p._relPos2X * normalY - p._relPos2Y * normalX; row.rhs = p._depth - oimo.common.Setting.linearSlop; if(row.rhs < 0) { row.rhs = 0; } row.impulse = p._impulse; } } _syncManifold() { this._manifold._updateDepthsAndPositions(this._tf1,this._tf2); } getShape1() { return this._s1; } getShape2() { return this._s2; } getManifold() { return this._manifold; } isTouching() { let _g = 0; let _g1 = this._manifold._numPoints; while(_g < _g1) if(this._manifold._points[_g++]._depth >= 0) { return true; } return false; } } oimo.dynamics.constraint.contact.ContactImpulse = class oimo_dynamics_constraint_contact_ContactImpulse { constructor() { this.impulseN = 0; this.impulseT = 0; this.impulseB = 0; this.impulseP = 0; this.impulseLX = 0; this.impulseLY = 0; this.impulseLZ = 0; } copyFrom(imp) { this.impulseN = imp.impulseN; this.impulseT = imp.impulseT; this.impulseB = imp.impulseB; this.impulseLX = imp.impulseLX; this.impulseLY = imp.impulseLY; this.impulseLZ = imp.impulseLZ; } } oimo.dynamics.constraint.contact.Manifold = class oimo_dynamics_constraint_contact_Manifold { constructor() { this._normalX = 0; this._normalY = 0; this._normalZ = 0; this._tangentX = 0; this._tangentY = 0; this._tangentZ = 0; this._binormalX = 0; this._binormalY = 0; this._binormalZ = 0; this._numPoints = 0; this._points = new Array(oimo.common.Setting.maxManifoldPoints); let _g = 0; let _g1 = oimo.common.Setting.maxManifoldPoints; while(_g < _g1) this._points[_g++] = new oimo.dynamics.constraint.contact.ManifoldPoint(); } _clear() { let _g = 0; let _g1 = this._numPoints; while(_g < _g1) { let _this = this._points[_g++]; _this._localPos1X = 0; _this._localPos1Y = 0; _this._localPos1Z = 0; _this._localPos2X = 0; _this._localPos2Y = 0; _this._localPos2Z = 0; _this._relPos1X = 0; _this._relPos1Y = 0; _this._relPos1Z = 0; _this._relPos2X = 0; _this._relPos2Y = 0; _this._relPos2Z = 0; _this._pos1X = 0; _this._pos1Y = 0; _this._pos1Z = 0; _this._pos2X = 0; _this._pos2Y = 0; _this._pos2Z = 0; _this._depth = 0; let _this1 = _this._impulse; _this1.impulseN = 0; _this1.impulseT = 0; _this1.impulseB = 0; _this1.impulseP = 0; _this1.impulseLX = 0; _this1.impulseLY = 0; _this1.impulseLZ = 0; _this._warmStarted = false; _this._disabled = false; _this._id = -1; } this._numPoints = 0; } _buildBasis(normal) { this._normalX = normal.x; this._normalY = normal.y; this._normalZ = normal.z; let nx = normal.x; let ny = normal.y; let nz = normal.z; let nx2 = nx * nx; let ny2 = ny * ny; let nz2 = nz * nz; let tx; let ty; let tz; let bx; let by; let bz; if(nx2 < ny2) { if(nx2 < nz2) { let invL = 1 / Math.sqrt(ny2 + nz2); tx = 0; ty = -nz * invL; tz = ny * invL; bx = ny * tz - nz * ty; by = -nx * tz; bz = nx * ty; } else { let invL = 1 / Math.sqrt(nx2 + ny2); tx = -ny * invL; ty = nx * invL; tz = 0; bx = -nz * ty; by = nz * tx; bz = nx * ty - ny * tx; } } else if(ny2 < nz2) { let invL = 1 / Math.sqrt(nx2 + nz2); tx = nz * invL; ty = 0; tz = -nx * invL; bx = ny * tz; by = nz * tx - nx * tz; bz = -ny * tx; } else { let invL = 1 / Math.sqrt(nx2 + ny2); tx = -ny * invL; ty = nx * invL; tz = 0; bx = -nz * ty; by = nz * tx; bz = nx * ty - ny * tx; } this._tangentX = tx; this._tangentY = ty; this._tangentZ = tz; this._binormalX = bx; this._binormalY = by; this._binormalZ = bz; } _updateDepthsAndPositions(tf1,tf2) { let _g = 0; let _g1 = this._numPoints; while(_g < _g1) { let p = this._points[_g++]; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * p._localPos1X + tf1._rotation01 * p._localPos1Y + tf1._rotation02 * p._localPos1Z; __tmp__Y = tf1._rotation10 * p._localPos1X + tf1._rotation11 * p._localPos1Y + tf1._rotation12 * p._localPos1Z; __tmp__Z = tf1._rotation20 * p._localPos1X + tf1._rotation21 * p._localPos1Y + tf1._rotation22 * p._localPos1Z; p._relPos1X = __tmp__X; p._relPos1Y = __tmp__Y; p._relPos1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * p._localPos2X + tf2._rotation01 * p._localPos2Y + tf2._rotation02 * p._localPos2Z; __tmp__Y1 = tf2._rotation10 * p._localPos2X + tf2._rotation11 * p._localPos2Y + tf2._rotation12 * p._localPos2Z; __tmp__Z1 = tf2._rotation20 * p._localPos2X + tf2._rotation21 * p._localPos2Y + tf2._rotation22 * p._localPos2Z; p._relPos2X = __tmp__X1; p._relPos2Y = __tmp__Y1; p._relPos2Z = __tmp__Z1; p._pos1X = p._relPos1X + tf1._positionX; p._pos1Y = p._relPos1Y + tf1._positionY; p._pos1Z = p._relPos1Z + tf1._positionZ; p._pos2X = p._relPos2X + tf2._positionX; p._pos2Y = p._relPos2Y + tf2._positionY; p._pos2Z = p._relPos2Z + tf2._positionZ; let diffX; let diffY; let diffZ; diffX = p._pos1X - p._pos2X; diffY = p._pos1Y - p._pos2Y; diffZ = p._pos1Z - p._pos2Z; p._depth = -(diffX * this._normalX + diffY * this._normalY + diffZ * this._normalZ); } } getNormal() { let v = new oimo.common.Vec3(); v.x = this._normalX; v.y = this._normalY; v.z = this._normalZ; return v; } getNormalTo(normal) { normal.x = this._normalX; normal.y = this._normalY; normal.z = this._normalZ; } getTangent() { let v = new oimo.common.Vec3(); v.x = this._tangentX; v.y = this._tangentY; v.z = this._tangentZ; return v; } getTangentTo(tangent) { tangent.x = this._tangentX; tangent.y = this._tangentY; tangent.z = this._tangentZ; } getBinormal() { let v = new oimo.common.Vec3(); v.x = this._binormalX; v.y = this._binormalY; v.z = this._binormalZ; return v; } getBinormalTo(binormal) { binormal.x = this._binormalX; binormal.y = this._binormalY; binormal.z = this._binormalZ; } getPoints() { return this._points; } getNumPoints() { return this._numPoints; } } oimo.dynamics.constraint.contact.ManifoldPoint = class oimo_dynamics_constraint_contact_ManifoldPoint { constructor() { this._localPos1X = 0; this._localPos1Y = 0; this._localPos1Z = 0; this._localPos2X = 0; this._localPos2Y = 0; this._localPos2Z = 0; this._relPos1X = 0; this._relPos1Y = 0; this._relPos1Z = 0; this._relPos2X = 0; this._relPos2Y = 0; this._relPos2Z = 0; this._pos1X = 0; this._pos1Y = 0; this._pos1Z = 0; this._pos2X = 0; this._pos2Y = 0; this._pos2Z = 0; this._depth = 0; this._impulse = new oimo.dynamics.constraint.contact.ContactImpulse(); this._warmStarted = false; this._disabled = false; this._id = -1; } getPosition1() { let v = new oimo.common.Vec3(); v.x = this._pos1X; v.y = this._pos1Y; v.z = this._pos1Z; return v; } getPosition1To(position) { position.x = this._pos1X; position.y = this._pos1Y; position.z = this._pos1Z; } getPosition2() { let v = new oimo.common.Vec3(); v.x = this._pos2X; v.y = this._pos2Y; v.z = this._pos2Z; return v; } getPosition2To(position) { position.x = this._pos2X; position.y = this._pos2Y; position.z = this._pos2Z; } getDepth() { return this._depth; } isWarmStarted() { return this._warmStarted; } getNormalImpulse() { return this._impulse.impulseN; } getTangentImpulse() { return this._impulse.impulseT; } getBinormalImpulse() { return this._impulse.impulseB; } isEnabled() { return !this._disabled; } } oimo.dynamics.constraint.contact.ManifoldUpdater = class oimo_dynamics_constraint_contact_ManifoldUpdater { constructor(manifold) { this._manifold = manifold; this.numOldPoints = 0; this.oldPoints = new Array(oimo.common.Setting.maxManifoldPoints); let _g = 0; let _g1 = oimo.common.Setting.maxManifoldPoints; while(_g < _g1) this.oldPoints[_g++] = new oimo.dynamics.constraint.contact.ManifoldPoint(); } removeOutdatedPoints() { let index = this._manifold._numPoints; while(--index >= 0) { let p = this._manifold._points[index]; let diffX; let diffY; let diffZ; diffX = p._pos1X - p._pos2X; diffY = p._pos1Y - p._pos2Y; diffZ = p._pos1Z - p._pos2Z; let dotN = this._manifold._normalX * diffX + this._manifold._normalY * diffY + this._manifold._normalZ * diffZ; if(dotN > oimo.common.Setting.contactPersistenceThreshold) { this.removeManifoldPoint(index); continue; } diffX += this._manifold._normalX * -dotN; diffY += this._manifold._normalY * -dotN; diffZ += this._manifold._normalZ * -dotN; if(diffX * diffX + diffY * diffY + diffZ * diffZ > oimo.common.Setting.contactPersistenceThreshold * oimo.common.Setting.contactPersistenceThreshold) { this.removeManifoldPoint(index); continue; } } } removeManifoldPoint(index) { let lastIndex = --this._manifold._numPoints; if(index != lastIndex) { let tmp = this._manifold._points[index]; this._manifold._points[index] = this._manifold._points[lastIndex]; this._manifold._points[lastIndex] = tmp; } let _this = this._manifold._points[lastIndex]; _this._localPos1X = 0; _this._localPos1Y = 0; _this._localPos1Z = 0; _this._localPos2X = 0; _this._localPos2Y = 0; _this._localPos2Z = 0; _this._relPos1X = 0; _this._relPos1Y = 0; _this._relPos1Z = 0; _this._relPos2X = 0; _this._relPos2Y = 0; _this._relPos2Z = 0; _this._pos1X = 0; _this._pos1Y = 0; _this._pos1Z = 0; _this._pos2X = 0; _this._pos2Y = 0; _this._pos2Z = 0; _this._depth = 0; let _this1 = _this._impulse; _this1.impulseN = 0; _this1.impulseT = 0; _this1.impulseB = 0; _this1.impulseP = 0; _this1.impulseLX = 0; _this1.impulseLY = 0; _this1.impulseLZ = 0; _this._warmStarted = false; _this._disabled = false; _this._id = -1; } addManifoldPoint(point,tf1,tf2) { let num = this._manifold._numPoints; if(num == oimo.common.Setting.maxManifoldPoints) { let targetIndex = this.computeTargetIndex(point,tf1,tf2); let _this = this._manifold._points[targetIndex]; let v = point.position1; _this._pos1X = v.x; _this._pos1Y = v.y; _this._pos1Z = v.z; let v1 = point.position2; _this._pos2X = v1.x; _this._pos2Y = v1.y; _this._pos2Z = v1.z; _this._relPos1X = _this._pos1X - tf1._positionX; _this._relPos1Y = _this._pos1Y - tf1._positionY; _this._relPos1Z = _this._pos1Z - tf1._positionZ; _this._relPos2X = _this._pos2X - tf2._positionX; _this._relPos2Y = _this._pos2Y - tf2._positionY; _this._relPos2Z = _this._pos2Z - tf2._positionZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * _this._relPos1X + tf1._rotation10 * _this._relPos1Y + tf1._rotation20 * _this._relPos1Z; __tmp__Y = tf1._rotation01 * _this._relPos1X + tf1._rotation11 * _this._relPos1Y + tf1._rotation21 * _this._relPos1Z; __tmp__Z = tf1._rotation02 * _this._relPos1X + tf1._rotation12 * _this._relPos1Y + tf1._rotation22 * _this._relPos1Z; _this._localPos1X = __tmp__X; _this._localPos1Y = __tmp__Y; _this._localPos1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * _this._relPos2X + tf2._rotation10 * _this._relPos2Y + tf2._rotation20 * _this._relPos2Z; __tmp__Y1 = tf2._rotation01 * _this._relPos2X + tf2._rotation11 * _this._relPos2Y + tf2._rotation21 * _this._relPos2Z; __tmp__Z1 = tf2._rotation02 * _this._relPos2X + tf2._rotation12 * _this._relPos2Y + tf2._rotation22 * _this._relPos2Z; _this._localPos2X = __tmp__X1; _this._localPos2Y = __tmp__Y1; _this._localPos2Z = __tmp__Z1; _this._depth = point.depth; let _this1 = _this._impulse; _this1.impulseN = 0; _this1.impulseT = 0; _this1.impulseB = 0; _this1.impulseP = 0; _this1.impulseLX = 0; _this1.impulseLY = 0; _this1.impulseLZ = 0; _this._id = point.id; _this._warmStarted = false; _this._disabled = false; return; } let _this = this._manifold._points[num]; let v = point.position1; _this._pos1X = v.x; _this._pos1Y = v.y; _this._pos1Z = v.z; let v1 = point.position2; _this._pos2X = v1.x; _this._pos2Y = v1.y; _this._pos2Z = v1.z; _this._relPos1X = _this._pos1X - tf1._positionX; _this._relPos1Y = _this._pos1Y - tf1._positionY; _this._relPos1Z = _this._pos1Z - tf1._positionZ; _this._relPos2X = _this._pos2X - tf2._positionX; _this._relPos2Y = _this._pos2Y - tf2._positionY; _this._relPos2Z = _this._pos2Z - tf2._positionZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * _this._relPos1X + tf1._rotation10 * _this._relPos1Y + tf1._rotation20 * _this._relPos1Z; __tmp__Y = tf1._rotation01 * _this._relPos1X + tf1._rotation11 * _this._relPos1Y + tf1._rotation21 * _this._relPos1Z; __tmp__Z = tf1._rotation02 * _this._relPos1X + tf1._rotation12 * _this._relPos1Y + tf1._rotation22 * _this._relPos1Z; _this._localPos1X = __tmp__X; _this._localPos1Y = __tmp__Y; _this._localPos1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * _this._relPos2X + tf2._rotation10 * _this._relPos2Y + tf2._rotation20 * _this._relPos2Z; __tmp__Y1 = tf2._rotation01 * _this._relPos2X + tf2._rotation11 * _this._relPos2Y + tf2._rotation21 * _this._relPos2Z; __tmp__Z1 = tf2._rotation02 * _this._relPos2X + tf2._rotation12 * _this._relPos2Y + tf2._rotation22 * _this._relPos2Z; _this._localPos2X = __tmp__X1; _this._localPos2Y = __tmp__Y1; _this._localPos2Z = __tmp__Z1; _this._depth = point.depth; let _this1 = _this._impulse; _this1.impulseN = 0; _this1.impulseT = 0; _this1.impulseB = 0; _this1.impulseP = 0; _this1.impulseLX = 0; _this1.impulseLY = 0; _this1.impulseLZ = 0; _this._id = point.id; _this._warmStarted = false; _this._disabled = false; this._manifold._numPoints++; } computeTargetIndex(newPoint,tf1,tf2) { let p1 = this._manifold._points[0]; let p2 = this._manifold._points[1]; let p3 = this._manifold._points[2]; let p4 = this._manifold._points[3]; let maxDepth = p1._depth; let maxDepthIndex = 0; if(p2._depth > maxDepth) { maxDepth = p2._depth; maxDepthIndex = 1; } if(p3._depth > maxDepth) { maxDepth = p3._depth; maxDepthIndex = 2; } if(p4._depth > maxDepth) { maxDepthIndex = 3; } let rp1X; let rp1Y; let rp1Z; let v = newPoint.position1; rp1X = v.x; rp1Y = v.y; rp1Z = v.z; rp1X -= tf1._positionX; rp1Y -= tf1._positionY; rp1Z -= tf1._positionZ; let p1X = p2._relPos1X; let p1Y = p2._relPos1Y; let p1Z = p2._relPos1Z; let p2X = p3._relPos1X; let p2Y = p3._relPos1Y; let p2Z = p3._relPos1Z; let p3X = p4._relPos1X; let p3Y = p4._relPos1Y; let p3Z = p4._relPos1Z; let v12X; let v12Y; let v12Z; let v34X; let v34Y; let v34Z; let v13X; let v13Y; let v13Z; let v24X; let v24Y; let v24Z; let v14X; let v14Y; let v14Z; let v23X; let v23Y; let v23Z; v12X = p2X - p1X; v12Y = p2Y - p1Y; v12Z = p2Z - p1Z; v34X = rp1X - p3X; v34Y = rp1Y - p3Y; v34Z = rp1Z - p3Z; v13X = p3X - p1X; v13Y = p3Y - p1Y; v13Z = p3Z - p1Z; v24X = rp1X - p2X; v24Y = rp1Y - p2Y; v24Z = rp1Z - p2Z; v14X = rp1X - p1X; v14Y = rp1Y - p1Y; v14Z = rp1Z - p1Z; v23X = p3X - p2X; v23Y = p3Y - p2Y; v23Z = p3Z - p2Z; let cross1X; let cross1Y; let cross1Z; let cross2X; let cross2Y; let cross2Z; let cross3X; let cross3Y; let cross3Z; cross1X = v12Y * v34Z - v12Z * v34Y; cross1Y = v12Z * v34X - v12X * v34Z; cross1Z = v12X * v34Y - v12Y * v34X; cross2X = v13Y * v24Z - v13Z * v24Y; cross2Y = v13Z * v24X - v13X * v24Z; cross2Z = v13X * v24Y - v13Y * v24X; cross3X = v14Y * v23Z - v14Z * v23Y; cross3Y = v14Z * v23X - v14X * v23Z; cross3Z = v14X * v23Y - v14Y * v23X; let a1 = cross1X * cross1X + cross1Y * cross1Y + cross1Z * cross1Z; let a2 = cross2X * cross2X + cross2Y * cross2Y + cross2Z * cross2Z; let a3 = cross3X * cross3X + cross3Y * cross3Y + cross3Z * cross3Z; let p1X1 = p1._relPos1X; let p1Y1 = p1._relPos1Y; let p1Z1 = p1._relPos1Z; let p2X1 = p3._relPos1X; let p2Y1 = p3._relPos1Y; let p2Z1 = p3._relPos1Z; let p3X1 = p4._relPos1X; let p3Y1 = p4._relPos1Y; let p3Z1 = p4._relPos1Z; let v12X1; let v12Y1; let v12Z1; let v34X1; let v34Y1; let v34Z1; let v13X1; let v13Y1; let v13Z1; let v24X1; let v24Y1; let v24Z1; let v14X1; let v14Y1; let v14Z1; let v23X1; let v23Y1; let v23Z1; v12X1 = p2X1 - p1X1; v12Y1 = p2Y1 - p1Y1; v12Z1 = p2Z1 - p1Z1; v34X1 = rp1X - p3X1; v34Y1 = rp1Y - p3Y1; v34Z1 = rp1Z - p3Z1; v13X1 = p3X1 - p1X1; v13Y1 = p3Y1 - p1Y1; v13Z1 = p3Z1 - p1Z1; v24X1 = rp1X - p2X1; v24Y1 = rp1Y - p2Y1; v24Z1 = rp1Z - p2Z1; v14X1 = rp1X - p1X1; v14Y1 = rp1Y - p1Y1; v14Z1 = rp1Z - p1Z1; v23X1 = p3X1 - p2X1; v23Y1 = p3Y1 - p2Y1; v23Z1 = p3Z1 - p2Z1; let cross1X1; let cross1Y1; let cross1Z1; let cross2X1; let cross2Y1; let cross2Z1; let cross3X1; let cross3Y1; let cross3Z1; cross1X1 = v12Y1 * v34Z1 - v12Z1 * v34Y1; cross1Y1 = v12Z1 * v34X1 - v12X1 * v34Z1; cross1Z1 = v12X1 * v34Y1 - v12Y1 * v34X1; cross2X1 = v13Y1 * v24Z1 - v13Z1 * v24Y1; cross2Y1 = v13Z1 * v24X1 - v13X1 * v24Z1; cross2Z1 = v13X1 * v24Y1 - v13Y1 * v24X1; cross3X1 = v14Y1 * v23Z1 - v14Z1 * v23Y1; cross3Y1 = v14Z1 * v23X1 - v14X1 * v23Z1; cross3Z1 = v14X1 * v23Y1 - v14Y1 * v23X1; let a11 = cross1X1 * cross1X1 + cross1Y1 * cross1Y1 + cross1Z1 * cross1Z1; let a21 = cross2X1 * cross2X1 + cross2Y1 * cross2Y1 + cross2Z1 * cross2Z1; let a31 = cross3X1 * cross3X1 + cross3Y1 * cross3Y1 + cross3Z1 * cross3Z1; let a22 = a11 > a21 ? a11 > a31 ? a11 : a31 : a21 > a31 ? a21 : a31; let p1X2 = p1._relPos1X; let p1Y2 = p1._relPos1Y; let p1Z2 = p1._relPos1Z; let p2X2 = p2._relPos1X; let p2Y2 = p2._relPos1Y; let p2Z2 = p2._relPos1Z; let p3X2 = p4._relPos1X; let p3Y2 = p4._relPos1Y; let p3Z2 = p4._relPos1Z; let v12X2; let v12Y2; let v12Z2; let v34X2; let v34Y2; let v34Z2; let v13X2; let v13Y2; let v13Z2; let v24X2; let v24Y2; let v24Z2; let v14X2; let v14Y2; let v14Z2; let v23X2; let v23Y2; let v23Z2; v12X2 = p2X2 - p1X2; v12Y2 = p2Y2 - p1Y2; v12Z2 = p2Z2 - p1Z2; v34X2 = rp1X - p3X2; v34Y2 = rp1Y - p3Y2; v34Z2 = rp1Z - p3Z2; v13X2 = p3X2 - p1X2; v13Y2 = p3Y2 - p1Y2; v13Z2 = p3Z2 - p1Z2; v24X2 = rp1X - p2X2; v24Y2 = rp1Y - p2Y2; v24Z2 = rp1Z - p2Z2; v14X2 = rp1X - p1X2; v14Y2 = rp1Y - p1Y2; v14Z2 = rp1Z - p1Z2; v23X2 = p3X2 - p2X2; v23Y2 = p3Y2 - p2Y2; v23Z2 = p3Z2 - p2Z2; let cross1X2; let cross1Y2; let cross1Z2; let cross2X2; let cross2Y2; let cross2Z2; let cross3X2; let cross3Y2; let cross3Z2; cross1X2 = v12Y2 * v34Z2 - v12Z2 * v34Y2; cross1Y2 = v12Z2 * v34X2 - v12X2 * v34Z2; cross1Z2 = v12X2 * v34Y2 - v12Y2 * v34X2; cross2X2 = v13Y2 * v24Z2 - v13Z2 * v24Y2; cross2Y2 = v13Z2 * v24X2 - v13X2 * v24Z2; cross2Z2 = v13X2 * v24Y2 - v13Y2 * v24X2; cross3X2 = v14Y2 * v23Z2 - v14Z2 * v23Y2; cross3Y2 = v14Z2 * v23X2 - v14X2 * v23Z2; cross3Z2 = v14X2 * v23Y2 - v14Y2 * v23X2; let a12 = cross1X2 * cross1X2 + cross1Y2 * cross1Y2 + cross1Z2 * cross1Z2; let a23 = cross2X2 * cross2X2 + cross2Y2 * cross2Y2 + cross2Z2 * cross2Z2; let a32 = cross3X2 * cross3X2 + cross3Y2 * cross3Y2 + cross3Z2 * cross3Z2; let a33 = a12 > a23 ? a12 > a32 ? a12 : a32 : a23 > a32 ? a23 : a32; let p1X3 = p1._relPos1X; let p1Y3 = p1._relPos1Y; let p1Z3 = p1._relPos1Z; let p2X3 = p2._relPos1X; let p2Y3 = p2._relPos1Y; let p2Z3 = p2._relPos1Z; let p3X3 = p3._relPos1X; let p3Y3 = p3._relPos1Y; let p3Z3 = p3._relPos1Z; let v12X3; let v12Y3; let v12Z3; let v34X3; let v34Y3; let v34Z3; let v13X3; let v13Y3; let v13Z3; let v24X3; let v24Y3; let v24Z3; let v14X3; let v14Y3; let v14Z3; let v23X3; let v23Y3; let v23Z3; v12X3 = p2X3 - p1X3; v12Y3 = p2Y3 - p1Y3; v12Z3 = p2Z3 - p1Z3; v34X3 = rp1X - p3X3; v34Y3 = rp1Y - p3Y3; v34Z3 = rp1Z - p3Z3; v13X3 = p3X3 - p1X3; v13Y3 = p3Y3 - p1Y3; v13Z3 = p3Z3 - p1Z3; v24X3 = rp1X - p2X3; v24Y3 = rp1Y - p2Y3; v24Z3 = rp1Z - p2Z3; v14X3 = rp1X - p1X3; v14Y3 = rp1Y - p1Y3; v14Z3 = rp1Z - p1Z3; v23X3 = p3X3 - p2X3; v23Y3 = p3Y3 - p2Y3; v23Z3 = p3Z3 - p2Z3; let cross1X3; let cross1Y3; let cross1Z3; let cross2X3; let cross2Y3; let cross2Z3; let cross3X3; let cross3Y3; let cross3Z3; cross1X3 = v12Y3 * v34Z3 - v12Z3 * v34Y3; cross1Y3 = v12Z3 * v34X3 - v12X3 * v34Z3; cross1Z3 = v12X3 * v34Y3 - v12Y3 * v34X3; cross2X3 = v13Y3 * v24Z3 - v13Z3 * v24Y3; cross2Y3 = v13Z3 * v24X3 - v13X3 * v24Z3; cross2Z3 = v13X3 * v24Y3 - v13Y3 * v24X3; cross3X3 = v14Y3 * v23Z3 - v14Z3 * v23Y3; cross3Y3 = v14Z3 * v23X3 - v14X3 * v23Z3; cross3Z3 = v14X3 * v23Y3 - v14Y3 * v23X3; let a13 = cross1X3 * cross1X3 + cross1Y3 * cross1Y3 + cross1Z3 * cross1Z3; let a24 = cross2X3 * cross2X3 + cross2Y3 * cross2Y3 + cross2Z3 * cross2Z3; let a34 = cross3X3 * cross3X3 + cross3Y3 * cross3Y3 + cross3Z3 * cross3Z3; let a4 = a13 > a24 ? a13 > a34 ? a13 : a34 : a24 > a34 ? a24 : a34; let max = a1 > a2 ? a1 > a3 ? a1 : a3 : a2 > a3 ? a2 : a3; let target = 0; if(a22 > max && maxDepthIndex != 1 || maxDepthIndex == 0) { max = a22; target = 1; } if(a33 > max && maxDepthIndex != 2) { max = a33; target = 2; } if(a4 > max && maxDepthIndex != 3) { target = 3; } return target; } computeRelativePositions(tf1,tf2) { let num = this._manifold._numPoints; let _g = 0; while(_g < num) { let p = this._manifold._points[_g++]; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * p._localPos1X + tf1._rotation01 * p._localPos1Y + tf1._rotation02 * p._localPos1Z; __tmp__Y = tf1._rotation10 * p._localPos1X + tf1._rotation11 * p._localPos1Y + tf1._rotation12 * p._localPos1Z; __tmp__Z = tf1._rotation20 * p._localPos1X + tf1._rotation21 * p._localPos1Y + tf1._rotation22 * p._localPos1Z; p._relPos1X = __tmp__X; p._relPos1Y = __tmp__Y; p._relPos1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * p._localPos2X + tf2._rotation01 * p._localPos2Y + tf2._rotation02 * p._localPos2Z; __tmp__Y1 = tf2._rotation10 * p._localPos2X + tf2._rotation11 * p._localPos2Y + tf2._rotation12 * p._localPos2Z; __tmp__Z1 = tf2._rotation20 * p._localPos2X + tf2._rotation21 * p._localPos2Y + tf2._rotation22 * p._localPos2Z; p._relPos2X = __tmp__X1; p._relPos2Y = __tmp__Y1; p._relPos2Z = __tmp__Z1; p._warmStarted = true; } } findNearestContactPointIndex(target,tf1,tf2) { let nearestSq = oimo.common.Setting.contactPersistenceThreshold * oimo.common.Setting.contactPersistenceThreshold; let idx = -1; let _g = 0; let _g1 = this._manifold._numPoints; while(_g < _g1) { let i = _g++; let mp = this._manifold._points[i]; let rp1X; let rp1Y; let rp1Z; let rp2X; let rp2Y; let rp2Z; let v = target.position1; rp1X = v.x; rp1Y = v.y; rp1Z = v.z; let v1 = target.position2; rp2X = v1.x; rp2Y = v1.y; rp2Z = v1.z; rp1X -= tf1._positionX; rp1Y -= tf1._positionY; rp1Z -= tf1._positionZ; rp2X -= tf2._positionX; rp2Y -= tf2._positionY; rp2Z -= tf2._positionZ; let diff1X; let diff1Y; let diff1Z; let diff2X; let diff2Y; let diff2Z; diff1X = mp._relPos1X - rp1X; diff1Y = mp._relPos1Y - rp1Y; diff1Z = mp._relPos1Z - rp1Z; diff2X = mp._relPos2X - rp2X; diff2Y = mp._relPos2Y - rp2Y; diff2Z = mp._relPos2Z - rp2Z; let sq1 = diff1X * diff1X + diff1Y * diff1Y + diff1Z * diff1Z; let sq2 = diff2X * diff2X + diff2Y * diff2Y + diff2Z * diff2Z; let d = sq1 < sq2 ? sq1 : sq2; if(d < nearestSq) { nearestSq = d; idx = i; } } return idx; } totalUpdate(result,tf1,tf2) { this.numOldPoints = this._manifold._numPoints; let _g = 0; let _g1 = this.numOldPoints; while(_g < _g1) { let i = _g++; let _this = this.oldPoints[i]; let cp = this._manifold._points[i]; _this._localPos1X = cp._localPos1X; _this._localPos1Y = cp._localPos1Y; _this._localPos1Z = cp._localPos1Z; _this._localPos2X = cp._localPos2X; _this._localPos2Y = cp._localPos2Y; _this._localPos2Z = cp._localPos2Z; _this._relPos1X = cp._relPos1X; _this._relPos1Y = cp._relPos1Y; _this._relPos1Z = cp._relPos1Z; _this._relPos2X = cp._relPos2X; _this._relPos2Y = cp._relPos2Y; _this._relPos2Z = cp._relPos2Z; _this._pos1X = cp._pos1X; _this._pos1Y = cp._pos1Y; _this._pos1Z = cp._pos1Z; _this._pos2X = cp._pos2X; _this._pos2Y = cp._pos2Y; _this._pos2Z = cp._pos2Z; _this._depth = cp._depth; _this._impulse.copyFrom(cp._impulse); _this._id = cp._id; _this._warmStarted = cp._warmStarted; _this._disabled = false; } let num = result.numPoints; this._manifold._numPoints = num; let _g2 = 0; while(_g2 < num) { let i = _g2++; let p = this._manifold._points[i]; let ref = result.points[i]; let v = ref.position1; p._pos1X = v.x; p._pos1Y = v.y; p._pos1Z = v.z; let v1 = ref.position2; p._pos2X = v1.x; p._pos2Y = v1.y; p._pos2Z = v1.z; p._relPos1X = p._pos1X - tf1._positionX; p._relPos1Y = p._pos1Y - tf1._positionY; p._relPos1Z = p._pos1Z - tf1._positionZ; p._relPos2X = p._pos2X - tf2._positionX; p._relPos2Y = p._pos2Y - tf2._positionY; p._relPos2Z = p._pos2Z - tf2._positionZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * p._relPos1X + tf1._rotation10 * p._relPos1Y + tf1._rotation20 * p._relPos1Z; __tmp__Y = tf1._rotation01 * p._relPos1X + tf1._rotation11 * p._relPos1Y + tf1._rotation21 * p._relPos1Z; __tmp__Z = tf1._rotation02 * p._relPos1X + tf1._rotation12 * p._relPos1Y + tf1._rotation22 * p._relPos1Z; p._localPos1X = __tmp__X; p._localPos1Y = __tmp__Y; p._localPos1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * p._relPos2X + tf2._rotation10 * p._relPos2Y + tf2._rotation20 * p._relPos2Z; __tmp__Y1 = tf2._rotation01 * p._relPos2X + tf2._rotation11 * p._relPos2Y + tf2._rotation21 * p._relPos2Z; __tmp__Z1 = tf2._rotation02 * p._relPos2X + tf2._rotation12 * p._relPos2Y + tf2._rotation22 * p._relPos2Z; p._localPos2X = __tmp__X1; p._localPos2Y = __tmp__Y1; p._localPos2Z = __tmp__Z1; p._depth = ref.depth; let _this = p._impulse; _this.impulseN = 0; _this.impulseT = 0; _this.impulseB = 0; _this.impulseP = 0; _this.impulseLX = 0; _this.impulseLY = 0; _this.impulseLZ = 0; p._id = ref.id; p._warmStarted = false; p._disabled = false; let _g = 0; let _g1 = this.numOldPoints; while(_g < _g1) { let ocp = this.oldPoints[_g++]; if(p._id == ocp._id) { p._impulse.copyFrom(ocp._impulse); p._warmStarted = true; break; } } } } incrementalUpdate(result,tf1,tf2) { this._manifold._updateDepthsAndPositions(tf1,tf2); let _g = 0; let _g1 = this._manifold._numPoints; while(_g < _g1) this._manifold._points[_g++]._warmStarted = true; let newPoint = result.points[0]; let index = this.findNearestContactPointIndex(newPoint,tf1,tf2); if(index == -1) { this.addManifoldPoint(newPoint,tf1,tf2); } else { let cp = this._manifold._points[index]; let v = newPoint.position1; cp._pos1X = v.x; cp._pos1Y = v.y; cp._pos1Z = v.z; let v1 = newPoint.position2; cp._pos2X = v1.x; cp._pos2Y = v1.y; cp._pos2Z = v1.z; cp._relPos1X = cp._pos1X - tf1._positionX; cp._relPos1Y = cp._pos1Y - tf1._positionY; cp._relPos1Z = cp._pos1Z - tf1._positionZ; cp._relPos2X = cp._pos2X - tf2._positionX; cp._relPos2Y = cp._pos2Y - tf2._positionY; cp._relPos2Z = cp._pos2Z - tf2._positionZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * cp._relPos1X + tf1._rotation10 * cp._relPos1Y + tf1._rotation20 * cp._relPos1Z; __tmp__Y = tf1._rotation01 * cp._relPos1X + tf1._rotation11 * cp._relPos1Y + tf1._rotation21 * cp._relPos1Z; __tmp__Z = tf1._rotation02 * cp._relPos1X + tf1._rotation12 * cp._relPos1Y + tf1._rotation22 * cp._relPos1Z; cp._localPos1X = __tmp__X; cp._localPos1Y = __tmp__Y; cp._localPos1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * cp._relPos2X + tf2._rotation10 * cp._relPos2Y + tf2._rotation20 * cp._relPos2Z; __tmp__Y1 = tf2._rotation01 * cp._relPos2X + tf2._rotation11 * cp._relPos2Y + tf2._rotation21 * cp._relPos2Z; __tmp__Z1 = tf2._rotation02 * cp._relPos2X + tf2._rotation12 * cp._relPos2Y + tf2._rotation22 * cp._relPos2Z; cp._localPos2X = __tmp__X1; cp._localPos2Y = __tmp__Y1; cp._localPos2Z = __tmp__Z1; cp._depth = newPoint.depth; } this.removeOutdatedPoints(); } } if(!oimo.dynamics.constraint.info) oimo.dynamics.constraint.info = {}; oimo.dynamics.constraint.info.JacobianRow = class oimo_dynamics_constraint_info_JacobianRow { constructor() { this.lin1X = 0; this.lin1Y = 0; this.lin1Z = 0; this.lin2X = 0; this.lin2Y = 0; this.lin2Z = 0; this.ang1X = 0; this.ang1Y = 0; this.ang1Z = 0; this.ang2X = 0; this.ang2Y = 0; this.ang2Z = 0; this.flag = 0; } updateSparsity() { this.flag = 0; if(!(this.lin1X == 0 && this.lin1Y == 0 && this.lin1Z == 0) || !(this.lin2X == 0 && this.lin2Y == 0 && this.lin2Z == 0)) { this.flag |= 1; } if(!(this.ang1X == 0 && this.ang1Y == 0 && this.ang1Z == 0) || !(this.ang2X == 0 && this.ang2Y == 0 && this.ang2Z == 0)) { this.flag |= 2; } } } if(!oimo.dynamics.constraint.info.contact) oimo.dynamics.constraint.info.contact = {}; oimo.dynamics.constraint.info.contact.ContactSolverInfo = class oimo_dynamics_constraint_info_contact_ContactSolverInfo { constructor() { this.b1 = null; this.b2 = null; this.numRows = 0; this.rows = new Array(oimo.common.Setting.maxManifoldPoints); let _g = 0; let _g1 = this.rows.length; while(_g < _g1) this.rows[_g++] = new oimo.dynamics.constraint.info.contact.ContactSolverInfoRow(); } } oimo.dynamics.constraint.info.contact.ContactSolverInfoRow = class oimo_dynamics_constraint_info_contact_ContactSolverInfoRow { constructor() { this.jacobianN = new oimo.dynamics.constraint.info.JacobianRow(); this.jacobianT = new oimo.dynamics.constraint.info.JacobianRow(); this.jacobianB = new oimo.dynamics.constraint.info.JacobianRow(); this.rhs = 0; this.cfm = 0; this.friction = 0; this.impulse = null; } } if(!oimo.dynamics.constraint.info.joint) oimo.dynamics.constraint.info.joint = {}; oimo.dynamics.constraint.info.joint.JointSolverInfo = class oimo_dynamics_constraint_info_joint_JointSolverInfo { constructor() { this.b1 = null; this.b2 = null; this.numRows = 0; this.rows = new Array(oimo.common.Setting.maxJacobianRows); let _g = 0; let _g1 = this.rows.length; while(_g < _g1) this.rows[_g++] = new oimo.dynamics.constraint.info.joint.JointSolverInfoRow(); } } oimo.dynamics.constraint.info.joint.JointSolverInfoRow = class oimo_dynamics_constraint_info_joint_JointSolverInfoRow { constructor() { this.jacobian = new oimo.dynamics.constraint.info.JacobianRow(); this.rhs = 0; this.cfm = 0; this.minImpulse = 0; this.maxImpulse = 0; this.motorSpeed = 0; this.motorMaxImpulse = 0; this.impulse = null; } } if(!oimo.dynamics.constraint.joint) oimo.dynamics.constraint.joint = {}; oimo.dynamics.constraint.joint.BasisTracker = class oimo_dynamics_constraint_joint_BasisTracker { constructor(joint) { this.joint = joint; this.xX = 0; this.xY = 0; this.xZ = 0; this.yX = 0; this.yY = 0; this.yZ = 0; this.zX = 0; this.zY = 0; this.zZ = 0; } } oimo.dynamics.constraint.joint.Joint = class oimo_dynamics_constraint_joint_Joint { constructor(config,type) { this._link1 = new oimo.dynamics.constraint.joint.JointLink(this); this._link2 = new oimo.dynamics.constraint.joint.JointLink(this); this._positionCorrectionAlgorithm = oimo.common.Setting.defaultJointPositionCorrectionAlgorithm; this._type = type; this._world = null; this._b1 = config.rigidBody1; this._b2 = config.rigidBody2; this._allowCollision = config.allowCollision; this._breakForce = config.breakForce; this._breakTorque = config.breakTorque; switch(config.solverType) { case 0: this._solver = new oimo.dynamics.constraint.solver.pgs.PgsJointConstraintSolver(this); break; case 1: this._solver = new oimo.dynamics.constraint.solver.direct.DirectJointConstraintSolver(this); break; } let v = config.localAnchor1; this._localAnchor1X = v.x; this._localAnchor1Y = v.y; this._localAnchor1Z = v.z; let v1 = config.localAnchor2; this._localAnchor2X = v1.x; this._localAnchor2Y = v1.y; this._localAnchor2Z = v1.z; this._relativeAnchor1X = 0; this._relativeAnchor1Y = 0; this._relativeAnchor1Z = 0; this._relativeAnchor2X = 0; this._relativeAnchor2Y = 0; this._relativeAnchor2Z = 0; this._anchor1X = 0; this._anchor1Y = 0; this._anchor1Z = 0; this._anchor2X = 0; this._anchor2Y = 0; this._anchor2Z = 0; this._localBasisX1X = 0; this._localBasisX1Y = 0; this._localBasisX1Z = 0; this._localBasisY1X = 0; this._localBasisY1Y = 0; this._localBasisY1Z = 0; this._localBasisZ1X = 0; this._localBasisZ1Y = 0; this._localBasisZ1Z = 0; this._localBasisX2X = 0; this._localBasisX2Y = 0; this._localBasisX2Z = 0; this._localBasisY2X = 0; this._localBasisY2Y = 0; this._localBasisY2Z = 0; this._localBasisZ2X = 0; this._localBasisZ2Y = 0; this._localBasisZ2Z = 0; this._impulses = new Array(oimo.common.Setting.maxJacobianRows); let _g = 0; let _g1 = oimo.common.Setting.maxJacobianRows; while(_g < _g1) this._impulses[_g++] = new oimo.dynamics.constraint.joint.JointImpulse(); } buildLocalBasesFromX() { if(this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z == 0) { this._localBasisX1X = 1; this._localBasisX1Y = 0; this._localBasisX1Z = 0; } else { let l = this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z; if(l > 0) { l = 1 / Math.sqrt(l); } this._localBasisX1X *= l; this._localBasisX1Y *= l; this._localBasisX1Z *= l; } if(this._localBasisX2X * this._localBasisX2X + this._localBasisX2Y * this._localBasisX2Y + this._localBasisX2Z * this._localBasisX2Z == 0) { this._localBasisX2X = 1; this._localBasisX2Y = 0; this._localBasisX2Z = 0; } else { let l = this._localBasisX2X * this._localBasisX2X + this._localBasisX2Y * this._localBasisX2Y + this._localBasisX2Z * this._localBasisX2Z; if(l > 0) { l = 1 / Math.sqrt(l); } this._localBasisX2X *= l; this._localBasisX2Y *= l; this._localBasisX2Z *= l; } let slerpQX; let slerpQY; let slerpQZ; let slerpQW; let slerpM00; let slerpM01; let slerpM02; let slerpM10; let slerpM11; let slerpM12; let slerpM20; let slerpM21; let slerpM22; let d = this._localBasisX1X * this._localBasisX2X + this._localBasisX1Y * this._localBasisX2Y + this._localBasisX1Z * this._localBasisX2Z; if(d < -0.999999999) { let vX; let vY; let vZ; let x1 = this._localBasisX1X; let y1 = this._localBasisX1Y; let z1 = this._localBasisX1Z; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); vX = 0; vY = z1 * d; vZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); vX = -z1 * d; vY = 0; vZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } slerpQX = vX; slerpQY = vY; slerpQZ = vZ; slerpQW = 0; } else { let cX; let cY; let cZ; cX = this._localBasisX1Y * this._localBasisX2Z - this._localBasisX1Z * this._localBasisX2Y; cY = this._localBasisX1Z * this._localBasisX2X - this._localBasisX1X * this._localBasisX2Z; cZ = this._localBasisX1X * this._localBasisX2Y - this._localBasisX1Y * this._localBasisX2X; let w = Math.sqrt((1 + d) * 0.5); d = 0.5 / w; cX *= d; cY *= d; cZ *= d; slerpQX = cX; slerpQY = cY; slerpQZ = cZ; slerpQW = w; } let x = slerpQX; let y = slerpQY; let z = slerpQZ; let w = slerpQW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; slerpM00 = 1 - yy - zz; slerpM01 = xy - wz; slerpM02 = xz + wy; slerpM10 = xy + wz; slerpM11 = 1 - xx - zz; slerpM12 = yz - wx; slerpM20 = xz - wy; slerpM21 = yz + wx; slerpM22 = 1 - xx - yy; let x1 = this._localBasisX1X; let y1 = this._localBasisX1Y; let z1 = this._localBasisX1Z; let x21 = x1 * x1; let y21 = y1 * y1; let z21 = z1 * z1; let d1; if(x21 < y21) { if(x21 < z21) { d1 = 1 / Math.sqrt(y21 + z21); this._localBasisY1X = 0; this._localBasisY1Y = z1 * d1; this._localBasisY1Z = -y1 * d1; } else { d1 = 1 / Math.sqrt(x21 + y21); this._localBasisY1X = y1 * d1; this._localBasisY1Y = -x1 * d1; this._localBasisY1Z = 0; } } else if(y21 < z21) { d1 = 1 / Math.sqrt(z21 + x21); this._localBasisY1X = -z1 * d1; this._localBasisY1Y = 0; this._localBasisY1Z = x1 * d1; } else { d1 = 1 / Math.sqrt(x21 + y21); this._localBasisY1X = y1 * d1; this._localBasisY1Y = -x1 * d1; this._localBasisY1Z = 0; } this._localBasisZ1X = this._localBasisX1Y * this._localBasisY1Z - this._localBasisX1Z * this._localBasisY1Y; this._localBasisZ1Y = this._localBasisX1Z * this._localBasisY1X - this._localBasisX1X * this._localBasisY1Z; this._localBasisZ1Z = this._localBasisX1X * this._localBasisY1Y - this._localBasisX1Y * this._localBasisY1X; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = slerpM00 * this._localBasisX1X + slerpM01 * this._localBasisX1Y + slerpM02 * this._localBasisX1Z; __tmp__Y = slerpM10 * this._localBasisX1X + slerpM11 * this._localBasisX1Y + slerpM12 * this._localBasisX1Z; __tmp__Z = slerpM20 * this._localBasisX1X + slerpM21 * this._localBasisX1Y + slerpM22 * this._localBasisX1Z; this._localBasisX2X = __tmp__X; this._localBasisX2Y = __tmp__Y; this._localBasisX2Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = slerpM00 * this._localBasisY1X + slerpM01 * this._localBasisY1Y + slerpM02 * this._localBasisY1Z; __tmp__Y1 = slerpM10 * this._localBasisY1X + slerpM11 * this._localBasisY1Y + slerpM12 * this._localBasisY1Z; __tmp__Z1 = slerpM20 * this._localBasisY1X + slerpM21 * this._localBasisY1Y + slerpM22 * this._localBasisY1Z; this._localBasisY2X = __tmp__X1; this._localBasisY2Y = __tmp__Y1; this._localBasisY2Z = __tmp__Z1; let __tmp__X2; let __tmp__Y2; let __tmp__Z2; __tmp__X2 = slerpM00 * this._localBasisZ1X + slerpM01 * this._localBasisZ1Y + slerpM02 * this._localBasisZ1Z; __tmp__Y2 = slerpM10 * this._localBasisZ1X + slerpM11 * this._localBasisZ1Y + slerpM12 * this._localBasisZ1Z; __tmp__Z2 = slerpM20 * this._localBasisZ1X + slerpM21 * this._localBasisZ1Y + slerpM22 * this._localBasisZ1Z; this._localBasisZ2X = __tmp__X2; this._localBasisZ2Y = __tmp__Y2; this._localBasisZ2Z = __tmp__Z2; } buildLocalBasesFromXY() { if(this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z == 0) { this._localBasisX1X = 1; this._localBasisX1Y = 0; this._localBasisX1Z = 0; } else { let l = this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z; if(l > 0) { l = 1 / Math.sqrt(l); } this._localBasisX1X *= l; this._localBasisX1Y *= l; this._localBasisX1Z *= l; } if(this._localBasisX2X * this._localBasisX2X + this._localBasisX2Y * this._localBasisX2Y + this._localBasisX2Z * this._localBasisX2Z == 0) { this._localBasisX2X = 1; this._localBasisX2Y = 0; this._localBasisX2Z = 0; } else { let l = this._localBasisX2X * this._localBasisX2X + this._localBasisX2Y * this._localBasisX2Y + this._localBasisX2Z * this._localBasisX2Z; if(l > 0) { l = 1 / Math.sqrt(l); } this._localBasisX2X *= l; this._localBasisX2Y *= l; this._localBasisX2Z *= l; } this._localBasisZ1X = this._localBasisX1Y * this._localBasisY1Z - this._localBasisX1Z * this._localBasisY1Y; this._localBasisZ1Y = this._localBasisX1Z * this._localBasisY1X - this._localBasisX1X * this._localBasisY1Z; this._localBasisZ1Z = this._localBasisX1X * this._localBasisY1Y - this._localBasisX1Y * this._localBasisY1X; this._localBasisZ2X = this._localBasisX2Y * this._localBasisY2Z - this._localBasisX2Z * this._localBasisY2Y; this._localBasisZ2Y = this._localBasisX2Z * this._localBasisY2X - this._localBasisX2X * this._localBasisY2Z; this._localBasisZ2Z = this._localBasisX2X * this._localBasisY2Y - this._localBasisX2Y * this._localBasisY2X; if(this._localBasisZ1X * this._localBasisZ1X + this._localBasisZ1Y * this._localBasisZ1Y + this._localBasisZ1Z * this._localBasisZ1Z == 0) { let x1 = this._localBasisX1X; let y1 = this._localBasisX1Y; let z1 = this._localBasisX1Z; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); this._localBasisY1X = 0; this._localBasisY1Y = z1 * d; this._localBasisY1Z = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); this._localBasisY1X = y1 * d; this._localBasisY1Y = -x1 * d; this._localBasisY1Z = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); this._localBasisY1X = -z1 * d; this._localBasisY1Y = 0; this._localBasisY1Z = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); this._localBasisY1X = y1 * d; this._localBasisY1Y = -x1 * d; this._localBasisY1Z = 0; } this._localBasisZ1X = this._localBasisX1Y * this._localBasisY1Z - this._localBasisX1Z * this._localBasisY1Y; this._localBasisZ1Y = this._localBasisX1Z * this._localBasisY1X - this._localBasisX1X * this._localBasisY1Z; this._localBasisZ1Z = this._localBasisX1X * this._localBasisY1Y - this._localBasisX1Y * this._localBasisY1X; } else { let l = this._localBasisZ1X * this._localBasisZ1X + this._localBasisZ1Y * this._localBasisZ1Y + this._localBasisZ1Z * this._localBasisZ1Z; if(l > 0) { l = 1 / Math.sqrt(l); } this._localBasisZ1X *= l; this._localBasisZ1Y *= l; this._localBasisZ1Z *= l; this._localBasisY1X = this._localBasisZ1Y * this._localBasisX1Z - this._localBasisZ1Z * this._localBasisX1Y; this._localBasisY1Y = this._localBasisZ1Z * this._localBasisX1X - this._localBasisZ1X * this._localBasisX1Z; this._localBasisY1Z = this._localBasisZ1X * this._localBasisX1Y - this._localBasisZ1Y * this._localBasisX1X; } if(this._localBasisZ2X * this._localBasisZ2X + this._localBasisZ2Y * this._localBasisZ2Y + this._localBasisZ2Z * this._localBasisZ2Z == 0) { let x1 = this._localBasisX2X; let y1 = this._localBasisX2Y; let z1 = this._localBasisX2Z; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); this._localBasisY2X = 0; this._localBasisY2Y = z1 * d; this._localBasisY2Z = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); this._localBasisY2X = y1 * d; this._localBasisY2Y = -x1 * d; this._localBasisY2Z = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); this._localBasisY2X = -z1 * d; this._localBasisY2Y = 0; this._localBasisY2Z = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); this._localBasisY2X = y1 * d; this._localBasisY2Y = -x1 * d; this._localBasisY2Z = 0; } this._localBasisZ2X = this._localBasisX2Y * this._localBasisY2Z - this._localBasisX2Z * this._localBasisY2Y; this._localBasisZ2Y = this._localBasisX2Z * this._localBasisY2X - this._localBasisX2X * this._localBasisY2Z; this._localBasisZ2Z = this._localBasisX2X * this._localBasisY2Y - this._localBasisX2Y * this._localBasisY2X; } else { let l = this._localBasisZ2X * this._localBasisZ2X + this._localBasisZ2Y * this._localBasisZ2Y + this._localBasisZ2Z * this._localBasisZ2Z; if(l > 0) { l = 1 / Math.sqrt(l); } this._localBasisZ2X *= l; this._localBasisZ2Y *= l; this._localBasisZ2Z *= l; this._localBasisY2X = this._localBasisZ2Y * this._localBasisX2Z - this._localBasisZ2Z * this._localBasisX2Y; this._localBasisY2Y = this._localBasisZ2Z * this._localBasisX2X - this._localBasisZ2X * this._localBasisX2Z; this._localBasisY2Z = this._localBasisZ2X * this._localBasisX2Y - this._localBasisZ2Y * this._localBasisX2X; } } buildLocalBasesFromX1Z2() { if(this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z == 0) { this._localBasisX1X = 1; this._localBasisX1Y = 0; this._localBasisX1Z = 0; } else { let l = this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z; if(l > 0) { l = 1 / Math.sqrt(l); } this._localBasisX1X *= l; this._localBasisX1Y *= l; this._localBasisX1Z *= l; } if(this._localBasisZ2X * this._localBasisZ2X + this._localBasisZ2Y * this._localBasisZ2Y + this._localBasisZ2Z * this._localBasisZ2Z == 0) { this._localBasisZ2X = 0; this._localBasisZ2Y = 0; this._localBasisZ2Z = 1; } else { let l = this._localBasisZ2X * this._localBasisZ2X + this._localBasisZ2Y * this._localBasisZ2Y + this._localBasisZ2Z * this._localBasisZ2Z; if(l > 0) { l = 1 / Math.sqrt(l); } this._localBasisZ2X *= l; this._localBasisZ2Y *= l; this._localBasisZ2Z *= l; } let tf1 = this._b1._transform; let tf2 = this._b2._transform; let worldX1X; let worldX1Y; let worldX1Z; let worldZ1X; let worldZ1Y; let worldZ1Z; let worldYX; let worldYY; let worldYZ; let worldX2X; let worldX2Y; let worldX2Z; let worldZ2X; let worldZ2Y; let worldZ2Z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * this._localBasisX1X + tf1._rotation01 * this._localBasisX1Y + tf1._rotation02 * this._localBasisX1Z; __tmp__Y = tf1._rotation10 * this._localBasisX1X + tf1._rotation11 * this._localBasisX1Y + tf1._rotation12 * this._localBasisX1Z; __tmp__Z = tf1._rotation20 * this._localBasisX1X + tf1._rotation21 * this._localBasisX1Y + tf1._rotation22 * this._localBasisX1Z; worldX1X = __tmp__X; worldX1Y = __tmp__Y; worldX1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * this._localBasisZ2X + tf2._rotation01 * this._localBasisZ2Y + tf2._rotation02 * this._localBasisZ2Z; __tmp__Y1 = tf2._rotation10 * this._localBasisZ2X + tf2._rotation11 * this._localBasisZ2Y + tf2._rotation12 * this._localBasisZ2Z; __tmp__Z1 = tf2._rotation20 * this._localBasisZ2X + tf2._rotation21 * this._localBasisZ2Y + tf2._rotation22 * this._localBasisZ2Z; worldZ2X = __tmp__X1; worldZ2Y = __tmp__Y1; worldZ2Z = __tmp__Z1; worldYX = worldZ2Y * worldX1Z - worldZ2Z * worldX1Y; worldYY = worldZ2Z * worldX1X - worldZ2X * worldX1Z; worldYZ = worldZ2X * worldX1Y - worldZ2Y * worldX1X; if(worldYX * worldYX + worldYY * worldYY + worldYZ * worldYZ == 0) { let x1 = worldX1X; let y1 = worldX1Y; let z1 = worldX1Z; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); worldYX = 0; worldYY = z1 * d; worldYZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); worldYX = y1 * d; worldYY = -x1 * d; worldYZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); worldYX = -z1 * d; worldYY = 0; worldYZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); worldYX = y1 * d; worldYY = -x1 * d; worldYZ = 0; } } worldZ1X = worldX1Y * worldYZ - worldX1Z * worldYY; worldZ1Y = worldX1Z * worldYX - worldX1X * worldYZ; worldZ1Z = worldX1X * worldYY - worldX1Y * worldYX; worldX2X = worldYY * worldZ2Z - worldYZ * worldZ2Y; worldX2Y = worldYZ * worldZ2X - worldYX * worldZ2Z; worldX2Z = worldYX * worldZ2Y - worldYY * worldZ2X; let __tmp__X2; let __tmp__Y2; let __tmp__Z2; __tmp__X2 = tf1._rotation00 * worldX1X + tf1._rotation10 * worldX1Y + tf1._rotation20 * worldX1Z; __tmp__Y2 = tf1._rotation01 * worldX1X + tf1._rotation11 * worldX1Y + tf1._rotation21 * worldX1Z; __tmp__Z2 = tf1._rotation02 * worldX1X + tf1._rotation12 * worldX1Y + tf1._rotation22 * worldX1Z; this._localBasisX1X = __tmp__X2; this._localBasisX1Y = __tmp__Y2; this._localBasisX1Z = __tmp__Z2; let __tmp__X3; let __tmp__Y3; let __tmp__Z3; __tmp__X3 = tf1._rotation00 * worldYX + tf1._rotation10 * worldYY + tf1._rotation20 * worldYZ; __tmp__Y3 = tf1._rotation01 * worldYX + tf1._rotation11 * worldYY + tf1._rotation21 * worldYZ; __tmp__Z3 = tf1._rotation02 * worldYX + tf1._rotation12 * worldYY + tf1._rotation22 * worldYZ; this._localBasisY1X = __tmp__X3; this._localBasisY1Y = __tmp__Y3; this._localBasisY1Z = __tmp__Z3; let __tmp__X4; let __tmp__Y4; let __tmp__Z4; __tmp__X4 = tf1._rotation00 * worldZ1X + tf1._rotation10 * worldZ1Y + tf1._rotation20 * worldZ1Z; __tmp__Y4 = tf1._rotation01 * worldZ1X + tf1._rotation11 * worldZ1Y + tf1._rotation21 * worldZ1Z; __tmp__Z4 = tf1._rotation02 * worldZ1X + tf1._rotation12 * worldZ1Y + tf1._rotation22 * worldZ1Z; this._localBasisZ1X = __tmp__X4; this._localBasisZ1Y = __tmp__Y4; this._localBasisZ1Z = __tmp__Z4; let __tmp__X5; let __tmp__Y5; let __tmp__Z5; __tmp__X5 = tf2._rotation00 * worldX2X + tf2._rotation10 * worldX2Y + tf2._rotation20 * worldX2Z; __tmp__Y5 = tf2._rotation01 * worldX2X + tf2._rotation11 * worldX2Y + tf2._rotation21 * worldX2Z; __tmp__Z5 = tf2._rotation02 * worldX2X + tf2._rotation12 * worldX2Y + tf2._rotation22 * worldX2Z; this._localBasisX2X = __tmp__X5; this._localBasisX2Y = __tmp__Y5; this._localBasisX2Z = __tmp__Z5; let __tmp__X6; let __tmp__Y6; let __tmp__Z6; __tmp__X6 = tf2._rotation00 * worldYX + tf2._rotation10 * worldYY + tf2._rotation20 * worldYZ; __tmp__Y6 = tf2._rotation01 * worldYX + tf2._rotation11 * worldYY + tf2._rotation21 * worldYZ; __tmp__Z6 = tf2._rotation02 * worldYX + tf2._rotation12 * worldYY + tf2._rotation22 * worldYZ; this._localBasisY2X = __tmp__X6; this._localBasisY2Y = __tmp__Y6; this._localBasisY2Z = __tmp__Z6; let __tmp__X7; let __tmp__Y7; let __tmp__Z7; __tmp__X7 = tf2._rotation00 * worldZ2X + tf2._rotation10 * worldZ2Y + tf2._rotation20 * worldZ2Z; __tmp__Y7 = tf2._rotation01 * worldZ2X + tf2._rotation11 * worldZ2Y + tf2._rotation21 * worldZ2Z; __tmp__Z7 = tf2._rotation02 * worldZ2X + tf2._rotation12 * worldZ2Y + tf2._rotation22 * worldZ2Z; this._localBasisZ2X = __tmp__X7; this._localBasisZ2Y = __tmp__Y7; this._localBasisZ2Z = __tmp__Z7; } buildLocalBasesFromXY1X2() { if(this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z == 0) { this._localBasisX1X = 1; this._localBasisX1Y = 0; this._localBasisX1Z = 0; } else { let l = this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z; if(l > 0) { l = 1 / Math.sqrt(l); } this._localBasisX1X *= l; this._localBasisX1Y *= l; this._localBasisX1Z *= l; } this._localBasisZ1X = this._localBasisX1Y * this._localBasisY1Z - this._localBasisX1Z * this._localBasisY1Y; this._localBasisZ1Y = this._localBasisX1Z * this._localBasisY1X - this._localBasisX1X * this._localBasisY1Z; this._localBasisZ1Z = this._localBasisX1X * this._localBasisY1Y - this._localBasisX1Y * this._localBasisY1X; if(this._localBasisZ1X * this._localBasisZ1X + this._localBasisZ1Y * this._localBasisZ1Y + this._localBasisZ1Z * this._localBasisZ1Z == 0) { let x1 = this._localBasisX1X; let y1 = this._localBasisX1Y; let z1 = this._localBasisX1Z; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); this._localBasisY1X = 0; this._localBasisY1Y = z1 * d; this._localBasisY1Z = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); this._localBasisY1X = y1 * d; this._localBasisY1Y = -x1 * d; this._localBasisY1Z = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); this._localBasisY1X = -z1 * d; this._localBasisY1Y = 0; this._localBasisY1Z = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); this._localBasisY1X = y1 * d; this._localBasisY1Y = -x1 * d; this._localBasisY1Z = 0; } this._localBasisZ1X = this._localBasisX1Y * this._localBasisY1Z - this._localBasisX1Z * this._localBasisY1Y; this._localBasisZ1Y = this._localBasisX1Z * this._localBasisY1X - this._localBasisX1X * this._localBasisY1Z; this._localBasisZ1Z = this._localBasisX1X * this._localBasisY1Y - this._localBasisX1Y * this._localBasisY1X; } else { let l = this._localBasisZ1X * this._localBasisZ1X + this._localBasisZ1Y * this._localBasisZ1Y + this._localBasisZ1Z * this._localBasisZ1Z; if(l > 0) { l = 1 / Math.sqrt(l); } this._localBasisZ1X *= l; this._localBasisZ1Y *= l; this._localBasisZ1Z *= l; this._localBasisY1X = this._localBasisZ1Y * this._localBasisX1Z - this._localBasisZ1Z * this._localBasisX1Y; this._localBasisY1Y = this._localBasisZ1Z * this._localBasisX1X - this._localBasisZ1X * this._localBasisX1Z; this._localBasisY1Z = this._localBasisZ1X * this._localBasisX1Y - this._localBasisZ1Y * this._localBasisX1X; } let slerpQX; let slerpQY; let slerpQZ; let slerpQW; let slerpM00; let slerpM01; let slerpM02; let slerpM10; let slerpM11; let slerpM12; let slerpM20; let slerpM21; let slerpM22; let d = this._localBasisX1X * this._localBasisX2X + this._localBasisX1Y * this._localBasisX2Y + this._localBasisX1Z * this._localBasisX2Z; if(d < -0.999999999) { let vX; let vY; let vZ; let x1 = this._localBasisX1X; let y1 = this._localBasisX1Y; let z1 = this._localBasisX1Z; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); vX = 0; vY = z1 * d; vZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); vX = -z1 * d; vY = 0; vZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } slerpQX = vX; slerpQY = vY; slerpQZ = vZ; slerpQW = 0; } else { let cX; let cY; let cZ; cX = this._localBasisX1Y * this._localBasisX2Z - this._localBasisX1Z * this._localBasisX2Y; cY = this._localBasisX1Z * this._localBasisX2X - this._localBasisX1X * this._localBasisX2Z; cZ = this._localBasisX1X * this._localBasisX2Y - this._localBasisX1Y * this._localBasisX2X; let w = Math.sqrt((1 + d) * 0.5); d = 0.5 / w; cX *= d; cY *= d; cZ *= d; slerpQX = cX; slerpQY = cY; slerpQZ = cZ; slerpQW = w; } let x = slerpQX; let y = slerpQY; let z = slerpQZ; let w = slerpQW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; slerpM00 = 1 - yy - zz; slerpM01 = xy - wz; slerpM02 = xz + wy; slerpM10 = xy + wz; slerpM11 = 1 - xx - zz; slerpM12 = yz - wx; slerpM20 = xz - wy; slerpM21 = yz + wx; slerpM22 = 1 - xx - yy; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = slerpM00 * this._localBasisX1X + slerpM01 * this._localBasisX1Y + slerpM02 * this._localBasisX1Z; __tmp__Y = slerpM10 * this._localBasisX1X + slerpM11 * this._localBasisX1Y + slerpM12 * this._localBasisX1Z; __tmp__Z = slerpM20 * this._localBasisX1X + slerpM21 * this._localBasisX1Y + slerpM22 * this._localBasisX1Z; this._localBasisX2X = __tmp__X; this._localBasisX2Y = __tmp__Y; this._localBasisX2Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = slerpM00 * this._localBasisY1X + slerpM01 * this._localBasisY1Y + slerpM02 * this._localBasisY1Z; __tmp__Y1 = slerpM10 * this._localBasisY1X + slerpM11 * this._localBasisY1Y + slerpM12 * this._localBasisY1Z; __tmp__Z1 = slerpM20 * this._localBasisY1X + slerpM21 * this._localBasisY1Y + slerpM22 * this._localBasisY1Z; this._localBasisY2X = __tmp__X1; this._localBasisY2Y = __tmp__Y1; this._localBasisY2Z = __tmp__Z1; let __tmp__X2; let __tmp__Y2; let __tmp__Z2; __tmp__X2 = slerpM00 * this._localBasisZ1X + slerpM01 * this._localBasisZ1Y + slerpM02 * this._localBasisZ1Z; __tmp__Y2 = slerpM10 * this._localBasisZ1X + slerpM11 * this._localBasisZ1Y + slerpM12 * this._localBasisZ1Z; __tmp__Z2 = slerpM20 * this._localBasisZ1X + slerpM21 * this._localBasisZ1Y + slerpM22 * this._localBasisZ1Z; this._localBasisZ2X = __tmp__X2; this._localBasisZ2Y = __tmp__Y2; this._localBasisZ2Z = __tmp__Z2; } setSolverInfoRowLinear(row,diff,lm,mass,sd,timeStep,isPositionPart) { let cfmFactor; let erp; let slop = oimo.common.Setting.linearSlop; if(isPositionPart) { cfmFactor = 0; erp = 1; } else { if(sd.frequency > 0) { slop = 0; let omega = 6.28318530717958 * sd.frequency; let zeta = sd.dampingRatio; if(zeta < oimo.common.Setting.minSpringDamperDampingRatio) { zeta = oimo.common.Setting.minSpringDamperDampingRatio; } let h = timeStep.dt; let c = 2 * zeta * omega; let k = omega * omega; if(sd.useSymplecticEuler) { cfmFactor = 1 / (h * c); erp = k / c; } else { cfmFactor = 1 / (h * (h * k + c)); erp = k / (h * k + c); } } else { cfmFactor = 0; erp = this.getErp(timeStep,false); } if(lm.motorForce > 0) { row.motorSpeed = lm.motorSpeed; row.motorMaxImpulse = lm.motorForce * timeStep.dt; } else { row.motorSpeed = 0; row.motorMaxImpulse = 0; } } let lower = lm.lowerLimit; let upper = lm.upperLimit; let minImp; let maxImp; let error; if(lower > upper) { minImp = 0; maxImp = 0; error = 0; } else if(lower == upper) { minImp = -1e65536; maxImp = 1e65536; error = diff - lower; } else if(diff < lower) { minImp = -1e65536; maxImp = 0; error = diff - lower + slop; if(error > 0) { error = 0; } } else if(diff > upper) { minImp = 0; maxImp = 1e65536; error = diff - upper - slop; if(error < 0) { error = 0; } } else { minImp = 0; maxImp = 0; error = 0; } row.minImpulse = minImp; row.maxImpulse = maxImp; row.cfm = cfmFactor * (mass == 0 ? 0 : 1 / mass); row.rhs = error * erp; } setSolverInfoRowAngular(row,diff,lm,mass,sd,timeStep,isPositionPart) { let cfmFactor; let erp; let slop = oimo.common.Setting.angularSlop; if(isPositionPart) { cfmFactor = 0; erp = 1; } else { if(sd.frequency > 0) { slop = 0; let omega = 6.28318530717958 * sd.frequency; let zeta = sd.dampingRatio; if(zeta < oimo.common.Setting.minSpringDamperDampingRatio) { zeta = oimo.common.Setting.minSpringDamperDampingRatio; } let h = timeStep.dt; let c = 2 * zeta * omega; let k = omega * omega; if(sd.useSymplecticEuler) { cfmFactor = 1 / (h * c); erp = k / c; } else { cfmFactor = 1 / (h * (h * k + c)); erp = k / (h * k + c); } } else { cfmFactor = 0; erp = this.getErp(timeStep,false); } if(lm.motorTorque > 0) { row.motorSpeed = lm.motorSpeed; row.motorMaxImpulse = lm.motorTorque * timeStep.dt; } else { row.motorSpeed = 0; row.motorMaxImpulse = 0; } } let lower = lm.lowerLimit; let upper = lm.upperLimit; let mid = (lower + upper) * 0.5; diff -= mid; diff = ((diff + 3.14159265358979) % 6.28318530717958 + 6.28318530717958) % 6.28318530717958 - 3.14159265358979; diff += mid; let minImp; let maxImp; let error; if(lower > upper) { minImp = 0; maxImp = 0; error = 0; } else if(lower == upper) { minImp = -1e65536; maxImp = 1e65536; error = diff - lower; } else if(diff < lower) { minImp = -1e65536; maxImp = 0; error = diff - lower + slop; if(error > 0) { error = 0; } } else if(diff > upper) { minImp = 0; maxImp = 1e65536; error = diff - upper - slop; if(error < 0) { error = 0; } } else { minImp = 0; maxImp = 0; error = 0; } row.minImpulse = minImp; row.maxImpulse = maxImp; row.cfm = cfmFactor * (mass == 0 ? 0 : 1 / mass); row.rhs = error * erp; } getErp(timeStep,isPositionPart) { if(isPositionPart) { return 1; } else if(this._positionCorrectionAlgorithm == oimo.dynamics.constraint.PositionCorrectionAlgorithm.BAUMGARTE) { return timeStep.invDt * oimo.common.Setting.velocityBaumgarte; } else { return 0; } } computeEffectiveInertiaMoment(axisX,axisY,axisZ) { let ia1X; let ia1Y; let ia1Z; let ia2X; let ia2Y; let ia2Z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._b1._invInertia00 * axisX + this._b1._invInertia01 * axisY + this._b1._invInertia02 * axisZ; __tmp__Y = this._b1._invInertia10 * axisX + this._b1._invInertia11 * axisY + this._b1._invInertia12 * axisZ; __tmp__Z = this._b1._invInertia20 * axisX + this._b1._invInertia21 * axisY + this._b1._invInertia22 * axisZ; ia1X = __tmp__X; ia1Y = __tmp__Y; ia1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = this._b2._invInertia00 * axisX + this._b2._invInertia01 * axisY + this._b2._invInertia02 * axisZ; __tmp__Y1 = this._b2._invInertia10 * axisX + this._b2._invInertia11 * axisY + this._b2._invInertia12 * axisZ; __tmp__Z1 = this._b2._invInertia20 * axisX + this._b2._invInertia21 * axisY + this._b2._invInertia22 * axisZ; ia2X = __tmp__X1; ia2Y = __tmp__Y1; ia2Z = __tmp__Z1; let invI1 = ia1X * axisX + ia1Y * axisY + ia1Z * axisZ; let invI2 = ia2X * axisX + ia2Y * axisY + ia2Z * axisZ; if(invI1 > 0) { let dot = axisX * this._relativeAnchor1X + axisY * this._relativeAnchor1Y + axisZ * this._relativeAnchor1Z; let projsq = this._relativeAnchor1X * this._relativeAnchor1X + this._relativeAnchor1Y * this._relativeAnchor1Y + this._relativeAnchor1Z * this._relativeAnchor1Z - dot * dot; if(projsq > 0) { if(this._b1._invMass > 0) { invI1 = 1 / (1 / invI1 + this._b1._mass * projsq); } else { invI1 = 0; } } } if(invI2 > 0) { let dot = axisX * this._relativeAnchor2X + axisY * this._relativeAnchor2Y + axisZ * this._relativeAnchor2Z; let projsq = this._relativeAnchor2X * this._relativeAnchor2X + this._relativeAnchor2Y * this._relativeAnchor2Y + this._relativeAnchor2Z * this._relativeAnchor2Z - dot * dot; if(projsq > 0) { if(this._b2._invMass > 0) { invI2 = 1 / (1 / invI2 + this._b2._mass * projsq); } else { invI2 = 0; } } } if(invI1 + invI2 == 0) { return 0; } else { return 1 / (invI1 + invI2); } } computeEffectiveInertiaMoment2(axis1X,axis1Y,axis1Z,axis2X,axis2Y,axis2Z) { let ia1X; let ia1Y; let ia1Z; let ia2X; let ia2Y; let ia2Z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._b1._invInertia00 * axis1X + this._b1._invInertia01 * axis1Y + this._b1._invInertia02 * axis1Z; __tmp__Y = this._b1._invInertia10 * axis1X + this._b1._invInertia11 * axis1Y + this._b1._invInertia12 * axis1Z; __tmp__Z = this._b1._invInertia20 * axis1X + this._b1._invInertia21 * axis1Y + this._b1._invInertia22 * axis1Z; ia1X = __tmp__X; ia1Y = __tmp__Y; ia1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = this._b2._invInertia00 * axis2X + this._b2._invInertia01 * axis2Y + this._b2._invInertia02 * axis2Z; __tmp__Y1 = this._b2._invInertia10 * axis2X + this._b2._invInertia11 * axis2Y + this._b2._invInertia12 * axis2Z; __tmp__Z1 = this._b2._invInertia20 * axis2X + this._b2._invInertia21 * axis2Y + this._b2._invInertia22 * axis2Z; ia2X = __tmp__X1; ia2Y = __tmp__Y1; ia2Z = __tmp__Z1; let invI1 = ia1X * axis1X + ia1Y * axis1Y + ia1Z * axis1Z; let invI2 = ia2X * axis2X + ia2Y * axis2Y + ia2Z * axis2Z; if(invI1 > 0) { let rsq = this._relativeAnchor1X * this._relativeAnchor1X + this._relativeAnchor1Y * this._relativeAnchor1Y + this._relativeAnchor1Z * this._relativeAnchor1Z; let dot = axis1X * this._relativeAnchor1X + axis1Y * this._relativeAnchor1Y + axis1Z * this._relativeAnchor1Z; let projsq = rsq * rsq - dot * dot; if(projsq > 0) { if(this._b1._invMass > 0) { invI1 = 1 / (1 / invI1 + this._b1._mass * projsq); } else { invI1 = 0; } } } if(invI2 > 0) { let rsq = this._relativeAnchor2X * this._relativeAnchor2X + this._relativeAnchor2Y * this._relativeAnchor2Y + this._relativeAnchor2Z * this._relativeAnchor2Z; let dot = axis2X * this._relativeAnchor2X + axis2Y * this._relativeAnchor2Y + axis2Z * this._relativeAnchor2Z; let projsq = rsq * rsq - dot * dot; if(projsq > 0) { if(this._b2._invMass > 0) { invI2 = 1 / (1 / invI2 + this._b2._mass * projsq); } else { invI2 = 0; } } } if(invI1 + invI2 == 0) { return 0; } else { return 1 / (invI1 + invI2); } } _syncAnchors() { let tf1 = this._b1._transform; let tf2 = this._b2._transform; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * this._localAnchor1X + tf1._rotation01 * this._localAnchor1Y + tf1._rotation02 * this._localAnchor1Z; __tmp__Y = tf1._rotation10 * this._localAnchor1X + tf1._rotation11 * this._localAnchor1Y + tf1._rotation12 * this._localAnchor1Z; __tmp__Z = tf1._rotation20 * this._localAnchor1X + tf1._rotation21 * this._localAnchor1Y + tf1._rotation22 * this._localAnchor1Z; this._relativeAnchor1X = __tmp__X; this._relativeAnchor1Y = __tmp__Y; this._relativeAnchor1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * this._localAnchor2X + tf2._rotation01 * this._localAnchor2Y + tf2._rotation02 * this._localAnchor2Z; __tmp__Y1 = tf2._rotation10 * this._localAnchor2X + tf2._rotation11 * this._localAnchor2Y + tf2._rotation12 * this._localAnchor2Z; __tmp__Z1 = tf2._rotation20 * this._localAnchor2X + tf2._rotation21 * this._localAnchor2Y + tf2._rotation22 * this._localAnchor2Z; this._relativeAnchor2X = __tmp__X1; this._relativeAnchor2Y = __tmp__Y1; this._relativeAnchor2Z = __tmp__Z1; this._anchor1X = this._relativeAnchor1X + tf1._positionX; this._anchor1Y = this._relativeAnchor1Y + tf1._positionY; this._anchor1Z = this._relativeAnchor1Z + tf1._positionZ; this._anchor2X = this._relativeAnchor2X + tf2._positionX; this._anchor2Y = this._relativeAnchor2Y + tf2._positionY; this._anchor2Z = this._relativeAnchor2Z + tf2._positionZ; let __tmp__X2; let __tmp__Y2; let __tmp__Z2; __tmp__X2 = tf1._rotation00 * this._localBasisX1X + tf1._rotation01 * this._localBasisX1Y + tf1._rotation02 * this._localBasisX1Z; __tmp__Y2 = tf1._rotation10 * this._localBasisX1X + tf1._rotation11 * this._localBasisX1Y + tf1._rotation12 * this._localBasisX1Z; __tmp__Z2 = tf1._rotation20 * this._localBasisX1X + tf1._rotation21 * this._localBasisX1Y + tf1._rotation22 * this._localBasisX1Z; this._basisX1X = __tmp__X2; this._basisX1Y = __tmp__Y2; this._basisX1Z = __tmp__Z2; let __tmp__X3; let __tmp__Y3; let __tmp__Z3; __tmp__X3 = tf1._rotation00 * this._localBasisY1X + tf1._rotation01 * this._localBasisY1Y + tf1._rotation02 * this._localBasisY1Z; __tmp__Y3 = tf1._rotation10 * this._localBasisY1X + tf1._rotation11 * this._localBasisY1Y + tf1._rotation12 * this._localBasisY1Z; __tmp__Z3 = tf1._rotation20 * this._localBasisY1X + tf1._rotation21 * this._localBasisY1Y + tf1._rotation22 * this._localBasisY1Z; this._basisY1X = __tmp__X3; this._basisY1Y = __tmp__Y3; this._basisY1Z = __tmp__Z3; let __tmp__X4; let __tmp__Y4; let __tmp__Z4; __tmp__X4 = tf1._rotation00 * this._localBasisZ1X + tf1._rotation01 * this._localBasisZ1Y + tf1._rotation02 * this._localBasisZ1Z; __tmp__Y4 = tf1._rotation10 * this._localBasisZ1X + tf1._rotation11 * this._localBasisZ1Y + tf1._rotation12 * this._localBasisZ1Z; __tmp__Z4 = tf1._rotation20 * this._localBasisZ1X + tf1._rotation21 * this._localBasisZ1Y + tf1._rotation22 * this._localBasisZ1Z; this._basisZ1X = __tmp__X4; this._basisZ1Y = __tmp__Y4; this._basisZ1Z = __tmp__Z4; let __tmp__X5; let __tmp__Y5; let __tmp__Z5; __tmp__X5 = tf2._rotation00 * this._localBasisX2X + tf2._rotation01 * this._localBasisX2Y + tf2._rotation02 * this._localBasisX2Z; __tmp__Y5 = tf2._rotation10 * this._localBasisX2X + tf2._rotation11 * this._localBasisX2Y + tf2._rotation12 * this._localBasisX2Z; __tmp__Z5 = tf2._rotation20 * this._localBasisX2X + tf2._rotation21 * this._localBasisX2Y + tf2._rotation22 * this._localBasisX2Z; this._basisX2X = __tmp__X5; this._basisX2Y = __tmp__Y5; this._basisX2Z = __tmp__Z5; let __tmp__X6; let __tmp__Y6; let __tmp__Z6; __tmp__X6 = tf2._rotation00 * this._localBasisY2X + tf2._rotation01 * this._localBasisY2Y + tf2._rotation02 * this._localBasisY2Z; __tmp__Y6 = tf2._rotation10 * this._localBasisY2X + tf2._rotation11 * this._localBasisY2Y + tf2._rotation12 * this._localBasisY2Z; __tmp__Z6 = tf2._rotation20 * this._localBasisY2X + tf2._rotation21 * this._localBasisY2Y + tf2._rotation22 * this._localBasisY2Z; this._basisY2X = __tmp__X6; this._basisY2Y = __tmp__Y6; this._basisY2Z = __tmp__Z6; let __tmp__X7; let __tmp__Y7; let __tmp__Z7; __tmp__X7 = tf2._rotation00 * this._localBasisZ2X + tf2._rotation01 * this._localBasisZ2Y + tf2._rotation02 * this._localBasisZ2Z; __tmp__Y7 = tf2._rotation10 * this._localBasisZ2X + tf2._rotation11 * this._localBasisZ2Y + tf2._rotation12 * this._localBasisZ2Z; __tmp__Z7 = tf2._rotation20 * this._localBasisZ2X + tf2._rotation21 * this._localBasisZ2Y + tf2._rotation22 * this._localBasisZ2Z; this._basisZ2X = __tmp__X7; this._basisZ2Y = __tmp__Y7; this._basisZ2Z = __tmp__Z7; } _getVelocitySolverInfo(timeStep,info) { info.b1 = this._b1; info.b2 = this._b2; info.numRows = 0; } _getPositionSolverInfo(info) { info.b1 = this._b1; info.b2 = this._b2; info.numRows = 0; } _checkDestruction() { let torqueSq = this._appliedTorqueX * this._appliedTorqueX + this._appliedTorqueY * this._appliedTorqueY + this._appliedTorqueZ * this._appliedTorqueZ; if(this._breakForce > 0 && this._appliedForceX * this._appliedForceX + this._appliedForceY * this._appliedForceY + this._appliedForceZ * this._appliedForceZ > this._breakForce * this._breakForce) { this._world.removeJoint(this); return; } if(this._breakTorque > 0 && torqueSq > this._breakTorque * this._breakTorque) { this._world.removeJoint(this); return; } } getRigidBody1() { return this._b1; } getRigidBody2() { return this._b2; } getType() { return this._type; } getAnchor1() { let v = new oimo.common.Vec3(); v.x = this._anchor1X; v.y = this._anchor1Y; v.z = this._anchor1Z; return v; } getAnchor2() { let v = new oimo.common.Vec3(); v.x = this._anchor2X; v.y = this._anchor2Y; v.z = this._anchor2Z; return v; } getAnchor1To(anchor) { anchor.x = this._anchor1X; anchor.y = this._anchor1Y; anchor.z = this._anchor1Z; } getAnchor2To(anchor) { anchor.x = this._anchor2X; anchor.y = this._anchor2Y; anchor.z = this._anchor2Z; } getLocalAnchor1() { let v = new oimo.common.Vec3(); v.x = this._localAnchor1X; v.y = this._localAnchor1Y; v.z = this._localAnchor1Z; return v; } getLocalAnchor2() { let v = new oimo.common.Vec3(); v.x = this._localAnchor2X; v.y = this._localAnchor2Y; v.z = this._localAnchor2Z; return v; } getLocalAnchor1To(localAnchor) { localAnchor.x = this._localAnchor1X; localAnchor.y = this._localAnchor1Y; localAnchor.z = this._localAnchor1Z; } getLocalAnchor2To(localAnchor) { localAnchor.x = this._localAnchor2X; localAnchor.y = this._localAnchor2Y; localAnchor.z = this._localAnchor2Z; } getBasis1() { let m = new oimo.common.Mat3(); let b00; let b01; let b02; let b10; let b11; let b12; let b20; let b21; let b22; b00 = this._basisX1X; b01 = this._basisY1X; b02 = this._basisZ1X; b10 = this._basisX1Y; b11 = this._basisY1Y; b12 = this._basisZ1Y; b20 = this._basisX1Z; b21 = this._basisY1Z; b22 = this._basisZ1Z; m.e00 = b00; m.e01 = b01; m.e02 = b02; m.e10 = b10; m.e11 = b11; m.e12 = b12; m.e20 = b20; m.e21 = b21; m.e22 = b22; return m; } getBasis2() { let m = new oimo.common.Mat3(); let b00; let b01; let b02; let b10; let b11; let b12; let b20; let b21; let b22; b00 = this._basisX2X; b01 = this._basisY2X; b02 = this._basisZ2X; b10 = this._basisX2Y; b11 = this._basisY2Y; b12 = this._basisZ2Y; b20 = this._basisX2Z; b21 = this._basisY2Z; b22 = this._basisZ2Z; m.e00 = b00; m.e01 = b01; m.e02 = b02; m.e10 = b10; m.e11 = b11; m.e12 = b12; m.e20 = b20; m.e21 = b21; m.e22 = b22; return m; } getBasis1To(basis) { let b00; let b01; let b02; let b10; let b11; let b12; let b20; let b21; let b22; b00 = this._basisX1X; b01 = this._basisY1X; b02 = this._basisZ1X; b10 = this._basisX1Y; b11 = this._basisY1Y; b12 = this._basisZ1Y; b20 = this._basisX1Z; b21 = this._basisY1Z; b22 = this._basisZ1Z; basis.e00 = b00; basis.e01 = b01; basis.e02 = b02; basis.e10 = b10; basis.e11 = b11; basis.e12 = b12; basis.e20 = b20; basis.e21 = b21; basis.e22 = b22; } getBasis2To(basis) { let b00; let b01; let b02; let b10; let b11; let b12; let b20; let b21; let b22; b00 = this._basisX2X; b01 = this._basisY2X; b02 = this._basisZ2X; b10 = this._basisX2Y; b11 = this._basisY2Y; b12 = this._basisZ2Y; b20 = this._basisX2Z; b21 = this._basisY2Z; b22 = this._basisZ2Z; basis.e00 = b00; basis.e01 = b01; basis.e02 = b02; basis.e10 = b10; basis.e11 = b11; basis.e12 = b12; basis.e20 = b20; basis.e21 = b21; basis.e22 = b22; } getAllowCollision() { return this._allowCollision; } setAllowCollision(allowCollision) { this._allowCollision = allowCollision; } getBreakForce() { return this._breakForce; } setBreakForce(breakForce) { this._breakForce = breakForce; } getBreakTorque() { return this._breakTorque; } setBreakTorque(breakTorque) { this._breakTorque = breakTorque; } getPositionCorrectionAlgorithm() { return this._positionCorrectionAlgorithm; } setPositionCorrectionAlgorithm(positionCorrectionAlgorithm) { switch(positionCorrectionAlgorithm) { case 0:case 1:case 2: break; default: throw new Error("invalid position correction algorithm id: " + positionCorrectionAlgorithm); } this._positionCorrectionAlgorithm = positionCorrectionAlgorithm; } getAppliedForce() { let v = new oimo.common.Vec3(); v.x = this._appliedForceX; v.y = this._appliedForceY; v.z = this._appliedForceZ; return v; } getAppliedForceTo(appliedForce) { appliedForce.x = this._appliedForceX; appliedForce.y = this._appliedForceY; appliedForce.z = this._appliedForceZ; } getAppliedTorque() { let v = new oimo.common.Vec3(); v.x = this._appliedTorqueX; v.y = this._appliedTorqueY; v.z = this._appliedTorqueZ; return v; } getAppliedTorqueTo(appliedTorque) { appliedTorque.x = this._appliedTorqueX; appliedTorque.y = this._appliedTorqueY; appliedTorque.z = this._appliedTorqueZ; } getPrev() { return this._prev; } getNext() { return this._next; } } oimo.dynamics.constraint.joint.CylindricalJoint = class oimo_dynamics_constraint_joint_CylindricalJoint extends oimo.dynamics.constraint.joint.Joint { constructor(config) { super(config,2); let v = config.localAxis1; this._localBasisX1X = v.x; this._localBasisX1Y = v.y; this._localBasisX1Z = v.z; let v1 = config.localAxis2; this._localBasisX2X = v1.x; this._localBasisX2Y = v1.y; this._localBasisX2Z = v1.z; this.buildLocalBasesFromX(); this.angle = 0; this.angularErrorY = 0; this.angularErrorZ = 0; this.translation = 0; this.linearErrorY = 0; this.linearErrorZ = 0; this._basis = new oimo.dynamics.constraint.joint.BasisTracker(this); this._translSd = config.translationalSpringDamper.clone(); this._translLm = config.translationalLimitMotor.clone(); this._rotSd = config.rotationalSpringDamper.clone(); this._rotLm = config.rotationalLimitMotor.clone(); } getInfo(info,timeStep,isPositionPart) { let erp = this.getErp(timeStep,isPositionPart); let linRhsY = this.linearErrorY * erp; let linRhsZ = this.linearErrorZ * erp; let angRhsY = this.angularErrorY * erp; let angRhsZ = this.angularErrorZ * erp; let j; let translationalMotorMass = 1 / (this._b1._invMass + this._b2._invMass); let rotationalMotorMass = this.computeEffectiveInertiaMoment(this._basis.xX,this._basis.xY,this._basis.xZ); if(this._translSd.frequency <= 0 || !isPositionPart) { let impulse = this._impulses[0]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowLinear(row,this.translation,this._translLm,translationalMotorMass,this._translSd,timeStep,isPositionPart); j = row.jacobian; j.lin1X = this._basis.xX; j.lin1Y = this._basis.xY; j.lin1Z = this._basis.xZ; j.lin2X = this._basis.xX; j.lin2Y = this._basis.xY; j.lin2Z = this._basis.xZ; j.ang1X = this._relativeAnchor1Y * this._basis.xZ - this._relativeAnchor1Z * this._basis.xY; j.ang1Y = this._relativeAnchor1Z * this._basis.xX - this._relativeAnchor1X * this._basis.xZ; j.ang1Z = this._relativeAnchor1X * this._basis.xY - this._relativeAnchor1Y * this._basis.xX; j.ang2X = this._relativeAnchor2Y * this._basis.xZ - this._relativeAnchor2Z * this._basis.xY; j.ang2Y = this._relativeAnchor2Z * this._basis.xX - this._relativeAnchor2X * this._basis.xZ; j.ang2Z = this._relativeAnchor2X * this._basis.xY - this._relativeAnchor2Y * this._basis.xX; } let impulse = this._impulses[1]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; row.rhs = linRhsY; row.cfm = 0; row.minImpulse = -1e65536; row.maxImpulse = 1e65536; j = row.jacobian; j.lin1X = this._basis.yX; j.lin1Y = this._basis.yY; j.lin1Z = this._basis.yZ; j.lin2X = this._basis.yX; j.lin2Y = this._basis.yY; j.lin2Z = this._basis.yZ; j.ang1X = this._relativeAnchor1Y * this._basis.yZ - this._relativeAnchor1Z * this._basis.yY; j.ang1Y = this._relativeAnchor1Z * this._basis.yX - this._relativeAnchor1X * this._basis.yZ; j.ang1Z = this._relativeAnchor1X * this._basis.yY - this._relativeAnchor1Y * this._basis.yX; j.ang2X = this._relativeAnchor2Y * this._basis.yZ - this._relativeAnchor2Z * this._basis.yY; j.ang2Y = this._relativeAnchor2Z * this._basis.yX - this._relativeAnchor2X * this._basis.yZ; j.ang2Z = this._relativeAnchor2X * this._basis.yY - this._relativeAnchor2Y * this._basis.yX; let impulse1 = this._impulses[2]; let row1 = info.rows[info.numRows++]; let _this1 = row1.jacobian; _this1.lin1X = 0; _this1.lin1Y = 0; _this1.lin1Z = 0; _this1.lin2X = 0; _this1.lin2Y = 0; _this1.lin2Z = 0; _this1.ang1X = 0; _this1.ang1Y = 0; _this1.ang1Z = 0; _this1.ang2X = 0; _this1.ang2Y = 0; _this1.ang2Z = 0; row1.rhs = 0; row1.cfm = 0; row1.minImpulse = 0; row1.maxImpulse = 0; row1.motorSpeed = 0; row1.motorMaxImpulse = 0; row1.impulse = null; row1.impulse = impulse1; row1.rhs = linRhsZ; row1.cfm = 0; row1.minImpulse = -1e65536; row1.maxImpulse = 1e65536; j = row1.jacobian; j.lin1X = this._basis.zX; j.lin1Y = this._basis.zY; j.lin1Z = this._basis.zZ; j.lin2X = this._basis.zX; j.lin2Y = this._basis.zY; j.lin2Z = this._basis.zZ; j.ang1X = this._relativeAnchor1Y * this._basis.zZ - this._relativeAnchor1Z * this._basis.zY; j.ang1Y = this._relativeAnchor1Z * this._basis.zX - this._relativeAnchor1X * this._basis.zZ; j.ang1Z = this._relativeAnchor1X * this._basis.zY - this._relativeAnchor1Y * this._basis.zX; j.ang2X = this._relativeAnchor2Y * this._basis.zZ - this._relativeAnchor2Z * this._basis.zY; j.ang2Y = this._relativeAnchor2Z * this._basis.zX - this._relativeAnchor2X * this._basis.zZ; j.ang2Z = this._relativeAnchor2X * this._basis.zY - this._relativeAnchor2Y * this._basis.zX; if(this._rotSd.frequency <= 0 || !isPositionPart) { let impulse = this._impulses[3]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowAngular(row,this.angle,this._rotLm,rotationalMotorMass,this._rotSd,timeStep,isPositionPart); j = row.jacobian; j.ang1X = this._basis.xX; j.ang1Y = this._basis.xY; j.ang1Z = this._basis.xZ; j.ang2X = this._basis.xX; j.ang2Y = this._basis.xY; j.ang2Z = this._basis.xZ; } let impulse2 = this._impulses[4]; let row2 = info.rows[info.numRows++]; let _this2 = row2.jacobian; _this2.lin1X = 0; _this2.lin1Y = 0; _this2.lin1Z = 0; _this2.lin2X = 0; _this2.lin2Y = 0; _this2.lin2Z = 0; _this2.ang1X = 0; _this2.ang1Y = 0; _this2.ang1Z = 0; _this2.ang2X = 0; _this2.ang2Y = 0; _this2.ang2Z = 0; row2.rhs = 0; row2.cfm = 0; row2.minImpulse = 0; row2.maxImpulse = 0; row2.motorSpeed = 0; row2.motorMaxImpulse = 0; row2.impulse = null; row2.impulse = impulse2; row2.rhs = angRhsY; row2.cfm = 0; row2.minImpulse = -1e65536; row2.maxImpulse = 1e65536; j = row2.jacobian; j.ang1X = this._basis.yX; j.ang1Y = this._basis.yY; j.ang1Z = this._basis.yZ; j.ang2X = this._basis.yX; j.ang2Y = this._basis.yY; j.ang2Z = this._basis.yZ; let impulse3 = this._impulses[5]; let row3 = info.rows[info.numRows++]; let _this3 = row3.jacobian; _this3.lin1X = 0; _this3.lin1Y = 0; _this3.lin1Z = 0; _this3.lin2X = 0; _this3.lin2Y = 0; _this3.lin2Z = 0; _this3.ang1X = 0; _this3.ang1Y = 0; _this3.ang1Z = 0; _this3.ang2X = 0; _this3.ang2Y = 0; _this3.ang2Z = 0; row3.rhs = 0; row3.cfm = 0; row3.minImpulse = 0; row3.maxImpulse = 0; row3.motorSpeed = 0; row3.motorMaxImpulse = 0; row3.impulse = null; row3.impulse = impulse3; row3.rhs = angRhsZ; row3.cfm = 0; row3.minImpulse = -1e65536; row3.maxImpulse = 1e65536; j = row3.jacobian; j.ang1X = this._basis.zX; j.ang1Y = this._basis.zY; j.ang1Z = this._basis.zZ; j.ang2X = this._basis.zX; j.ang2Y = this._basis.zY; j.ang2Z = this._basis.zZ; } _syncAnchors() { super._syncAnchors(); let _this = this._basis; let invM1 = _this.joint._b1._invMass; let invM2 = _this.joint._b2._invMass; let qX; let qY; let qZ; let qW; let idQX; let idQY; let idQZ; let idQW; let slerpQX; let slerpQY; let slerpQZ; let slerpQW; let slerpM00; let slerpM01; let slerpM02; let slerpM10; let slerpM11; let slerpM12; let slerpM20; let slerpM21; let slerpM22; let newXX; let newXY; let newXZ; let newYX; let newYY; let newYZ; let newZX; let newZY; let newZZ; let prevXX; let prevXY; let prevXZ; let prevYX; let prevYY; let prevYZ; let d = _this.joint._basisX1X * _this.joint._basisX2X + _this.joint._basisX1Y * _this.joint._basisX2Y + _this.joint._basisX1Z * _this.joint._basisX2Z; if(d < -0.999999999) { let vX; let vY; let vZ; let x1 = _this.joint._basisX1X; let y1 = _this.joint._basisX1Y; let z1 = _this.joint._basisX1Z; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); vX = 0; vY = z1 * d; vZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); vX = -z1 * d; vY = 0; vZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } qX = vX; qY = vY; qZ = vZ; qW = 0; } else { let cX; let cY; let cZ; cX = _this.joint._basisX1Y * _this.joint._basisX2Z - _this.joint._basisX1Z * _this.joint._basisX2Y; cY = _this.joint._basisX1Z * _this.joint._basisX2X - _this.joint._basisX1X * _this.joint._basisX2Z; cZ = _this.joint._basisX1X * _this.joint._basisX2Y - _this.joint._basisX1Y * _this.joint._basisX2X; let w = Math.sqrt((1 + d) * 0.5); d = 0.5 / w; cX *= d; cY *= d; cZ *= d; qX = cX; qY = cY; qZ = cZ; qW = w; } idQX = 0; idQY = 0; idQZ = 0; idQW = 1; let q1X; let q1Y; let q1Z; let q1W; let q2X; let q2Y; let q2Z; let q2W; q1X = idQX; q1Y = idQY; q1Z = idQZ; q1W = idQW; q2X = qX; q2Y = qY; q2Z = qZ; q2W = qW; let d1 = q1X * q2X + q1Y * q2Y + q1Z * q2Z + q1W * q2W; if(d1 < 0) { d1 = -d1; q2X = -q2X; q2Y = -q2Y; q2Z = -q2Z; q2W = -q2W; } if(d1 > 0.999999) { let dqX; let dqY; let dqZ; let dqW; dqX = q2X - q1X; dqY = q2Y - q1Y; dqZ = q2Z - q1Z; dqW = q2W - q1W; q2X = q1X + dqX * (invM1 / (invM1 + invM2)); q2Y = q1Y + dqY * (invM1 / (invM1 + invM2)); q2Z = q1Z + dqZ * (invM1 / (invM1 + invM2)); q2W = q1W + dqW * (invM1 / (invM1 + invM2)); let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W; if(l > 1e-32) { l = 1 / Math.sqrt(l); } slerpQX = q2X * l; slerpQY = q2Y * l; slerpQZ = q2Z * l; slerpQW = q2W * l; } else { let theta = invM1 / (invM1 + invM2) * Math.acos(d1); q2X += q1X * -d1; q2Y += q1Y * -d1; q2Z += q1Z * -d1; q2W += q1W * -d1; let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W; if(l > 1e-32) { l = 1 / Math.sqrt(l); } q2X *= l; q2Y *= l; q2Z *= l; q2W *= l; let sin = Math.sin(theta); let cos = Math.cos(theta); q1X *= cos; q1Y *= cos; q1Z *= cos; q1W *= cos; slerpQX = q1X + q2X * sin; slerpQY = q1Y + q2Y * sin; slerpQZ = q1Z + q2Z * sin; slerpQW = q1W + q2W * sin; } let x = slerpQX; let y = slerpQY; let z = slerpQZ; let w = slerpQW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; slerpM00 = 1 - yy - zz; slerpM01 = xy - wz; slerpM02 = xz + wy; slerpM10 = xy + wz; slerpM11 = 1 - xx - zz; slerpM12 = yz - wx; slerpM20 = xz - wy; slerpM21 = yz + wx; slerpM22 = 1 - xx - yy; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = slerpM00 * _this.joint._basisX1X + slerpM01 * _this.joint._basisX1Y + slerpM02 * _this.joint._basisX1Z; __tmp__Y = slerpM10 * _this.joint._basisX1X + slerpM11 * _this.joint._basisX1Y + slerpM12 * _this.joint._basisX1Z; __tmp__Z = slerpM20 * _this.joint._basisX1X + slerpM21 * _this.joint._basisX1Y + slerpM22 * _this.joint._basisX1Z; newXX = __tmp__X; newXY = __tmp__Y; newXZ = __tmp__Z; prevXX = _this.xX; prevXY = _this.xY; prevXZ = _this.xZ; prevYX = _this.yX; prevYY = _this.yY; prevYZ = _this.yZ; let d2 = prevXX * newXX + prevXY * newXY + prevXZ * newXZ; if(d2 < -0.999999999) { let vX; let vY; let vZ; let x1 = prevXX; let y1 = prevXY; let z1 = prevXZ; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); vX = 0; vY = z1 * d; vZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); vX = -z1 * d; vY = 0; vZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } slerpQX = vX; slerpQY = vY; slerpQZ = vZ; slerpQW = 0; } else { let cX; let cY; let cZ; cX = prevXY * newXZ - prevXZ * newXY; cY = prevXZ * newXX - prevXX * newXZ; cZ = prevXX * newXY - prevXY * newXX; let w = Math.sqrt((1 + d2) * 0.5); d2 = 0.5 / w; cX *= d2; cY *= d2; cZ *= d2; slerpQX = cX; slerpQY = cY; slerpQZ = cZ; slerpQW = w; } let x1 = slerpQX; let y1 = slerpQY; let z1 = slerpQZ; let w1 = slerpQW; let x21 = 2 * x1; let y21 = 2 * y1; let z21 = 2 * z1; let xx1 = x1 * x21; let yy1 = y1 * y21; let zz1 = z1 * z21; let xy1 = x1 * y21; let yz1 = y1 * z21; let xz1 = x1 * z21; let wx1 = w1 * x21; let wy1 = w1 * y21; let wz1 = w1 * z21; slerpM00 = 1 - yy1 - zz1; slerpM01 = xy1 - wz1; slerpM02 = xz1 + wy1; slerpM10 = xy1 + wz1; slerpM11 = 1 - xx1 - zz1; slerpM12 = yz1 - wx1; slerpM20 = xz1 - wy1; slerpM21 = yz1 + wx1; slerpM22 = 1 - xx1 - yy1; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = slerpM00 * prevYX + slerpM01 * prevYY + slerpM02 * prevYZ; __tmp__Y1 = slerpM10 * prevYX + slerpM11 * prevYY + slerpM12 * prevYZ; __tmp__Z1 = slerpM20 * prevYX + slerpM21 * prevYY + slerpM22 * prevYZ; newYX = __tmp__X1; newYY = __tmp__Y1; newYZ = __tmp__Z1; newZX = newXY * newYZ - newXZ * newYY; newZY = newXZ * newYX - newXX * newYZ; newZZ = newXX * newYY - newXY * newYX; if(newZX * newZX + newZY * newZY + newZZ * newZZ > 1e-6) { let l = newZX * newZX + newZY * newZY + newZZ * newZZ; if(l > 0) { l = 1 / Math.sqrt(l); } newZX *= l; newZY *= l; newZZ *= l; } else { let x1 = newXX; let y1 = newXY; let z1 = newXZ; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); newZX = 0; newZY = z1 * d; newZZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); newZX = y1 * d; newZY = -x1 * d; newZZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); newZX = -z1 * d; newZY = 0; newZZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); newZX = y1 * d; newZY = -x1 * d; newZZ = 0; } } newYX = newZY * newXZ - newZZ * newXY; newYY = newZZ * newXX - newZX * newXZ; newYZ = newZX * newXY - newZY * newXX; _this.xX = newXX; _this.xY = newXY; _this.xZ = newXZ; _this.yX = newYX; _this.yY = newYY; _this.yZ = newYZ; _this.zX = newZX; _this.zY = newZY; _this.zZ = newZZ; let angErrorX; let angErrorY; let angErrorZ; angErrorX = this._basisX1Y * this._basisX2Z - this._basisX1Z * this._basisX2Y; angErrorY = this._basisX1Z * this._basisX2X - this._basisX1X * this._basisX2Z; angErrorZ = this._basisX1X * this._basisX2Y - this._basisX1Y * this._basisX2X; let cos = this._basisX1X * this._basisX2X + this._basisX1Y * this._basisX2Y + this._basisX1Z * this._basisX2Z; let theta = cos <= -1 ? 3.14159265358979 : cos >= 1 ? 0 : Math.acos(cos); let l = angErrorX * angErrorX + angErrorY * angErrorY + angErrorZ * angErrorZ; if(l > 0) { l = 1 / Math.sqrt(l); } angErrorX *= l; angErrorY *= l; angErrorZ *= l; angErrorX *= theta; angErrorY *= theta; angErrorZ *= theta; this.angularErrorY = angErrorX * this._basis.yX + angErrorY * this._basis.yY + angErrorZ * this._basis.yZ; this.angularErrorZ = angErrorX * this._basis.zX + angErrorY * this._basis.zY + angErrorZ * this._basis.zZ; let perpCrossX; let perpCrossY; let perpCrossZ; perpCrossX = this._basisY1Y * this._basisY2Z - this._basisY1Z * this._basisY2Y; perpCrossY = this._basisY1Z * this._basisY2X - this._basisY1X * this._basisY2Z; perpCrossZ = this._basisY1X * this._basisY2Y - this._basisY1Y * this._basisY2X; cos = this._basisY1X * this._basisY2X + this._basisY1Y * this._basisY2Y + this._basisY1Z * this._basisY2Z; this.angle = cos <= -1 ? 3.14159265358979 : cos >= 1 ? 0 : Math.acos(cos); if(perpCrossX * this._basis.xX + perpCrossY * this._basis.xY + perpCrossZ * this._basis.xZ < 0) { this.angle = -this.angle; } let anchorDiffX; let anchorDiffY; let anchorDiffZ; anchorDiffX = this._anchor2X - this._anchor1X; anchorDiffY = this._anchor2Y - this._anchor1Y; anchorDiffZ = this._anchor2Z - this._anchor1Z; this.translation = anchorDiffX * this._basis.xX + anchorDiffY * this._basis.xY + anchorDiffZ * this._basis.xZ; this.linearErrorY = anchorDiffX * this._basis.yX + anchorDiffY * this._basis.yY + anchorDiffZ * this._basis.yZ; this.linearErrorZ = anchorDiffX * this._basis.zX + anchorDiffY * this._basis.zY + anchorDiffZ * this._basis.zZ; } _getVelocitySolverInfo(timeStep,info) { super._getVelocitySolverInfo(timeStep,info); this.getInfo(info,timeStep,false); } _getPositionSolverInfo(info) { super._getPositionSolverInfo(info); this.getInfo(info,null,true); } getAxis1() { let v = new oimo.common.Vec3(); v.x = this._basisX1X; v.y = this._basisX1Y; v.z = this._basisX1Z; return v; } getAxis2() { let v = new oimo.common.Vec3(); v.x = this._basisX2X; v.y = this._basisX2Y; v.z = this._basisX2Z; return v; } getAxis1To(axis) { axis.x = this._basisX1X; axis.y = this._basisX1Y; axis.z = this._basisX1Z; } getAxis2To(axis) { axis.x = this._basisX2X; axis.y = this._basisX2Y; axis.z = this._basisX2Z; } getLocalAxis1() { let v = new oimo.common.Vec3(); v.x = this._localBasisX1X; v.y = this._localBasisX1Y; v.z = this._localBasisX1Z; return v; } getLocalAxis2() { let v = new oimo.common.Vec3(); v.x = this._localBasisX2X; v.y = this._localBasisX2Y; v.z = this._localBasisX2Z; return v; } getLocalAxis1To(axis) { axis.x = this._localBasisX1X; axis.y = this._localBasisX1Y; axis.z = this._localBasisX1Z; } getLocalAxis2To(axis) { axis.x = this._localBasisX2X; axis.y = this._localBasisX2Y; axis.z = this._localBasisX2Z; } getTranslationalSpringDamper() { return this._translSd; } getRotationalSpringDamper() { return this._rotSd; } getTranslationalLimitMotor() { return this._translLm; } getRotationalLimitMotor() { return this._rotLm; } getAngle() { return this.angle; } getTranslation() { return this.translation; } } oimo.dynamics.constraint.joint.JointConfig = class oimo_dynamics_constraint_joint_JointConfig { constructor() { this.rigidBody1 = null; this.rigidBody2 = null; this.localAnchor1 = new oimo.common.Vec3(); this.localAnchor2 = new oimo.common.Vec3(); this.allowCollision = false; this.solverType = oimo.common.Setting.defaultJointConstraintSolverType; this.positionCorrectionAlgorithm = oimo.common.Setting.defaultJointPositionCorrectionAlgorithm; this.breakForce = 0; this.breakTorque = 0; } _init(rb1,rb2,worldAnchor) { this.rigidBody1 = rb1; this.rigidBody2 = rb2; let _this = this.rigidBody1; let localPoint = this.localAnchor1; let vX; let vY; let vZ; vX = worldAnchor.x; vY = worldAnchor.y; vZ = worldAnchor.z; vX -= _this._transform._positionX; vY -= _this._transform._positionY; vZ -= _this._transform._positionZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = _this._transform._rotation00 * vX + _this._transform._rotation10 * vY + _this._transform._rotation20 * vZ; __tmp__Y = _this._transform._rotation01 * vX + _this._transform._rotation11 * vY + _this._transform._rotation21 * vZ; __tmp__Z = _this._transform._rotation02 * vX + _this._transform._rotation12 * vY + _this._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; localPoint.x = vX; localPoint.y = vY; localPoint.z = vZ; let _this1 = this.rigidBody2; let localPoint1 = this.localAnchor2; let vX1; let vY1; let vZ1; vX1 = worldAnchor.x; vY1 = worldAnchor.y; vZ1 = worldAnchor.z; vX1 -= _this1._transform._positionX; vY1 -= _this1._transform._positionY; vZ1 -= _this1._transform._positionZ; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = _this1._transform._rotation00 * vX1 + _this1._transform._rotation10 * vY1 + _this1._transform._rotation20 * vZ1; __tmp__Y1 = _this1._transform._rotation01 * vX1 + _this1._transform._rotation11 * vY1 + _this1._transform._rotation21 * vZ1; __tmp__Z1 = _this1._transform._rotation02 * vX1 + _this1._transform._rotation12 * vY1 + _this1._transform._rotation22 * vZ1; vX1 = __tmp__X1; vY1 = __tmp__Y1; vZ1 = __tmp__Z1; localPoint1.x = vX1; localPoint1.y = vY1; localPoint1.z = vZ1; } } oimo.dynamics.constraint.joint.CylindricalJointConfig = class oimo_dynamics_constraint_joint_CylindricalJointConfig extends oimo.dynamics.constraint.joint.JointConfig { constructor() { super(); this.localAxis1 = new oimo.common.Vec3(1,0,0); this.localAxis2 = new oimo.common.Vec3(1,0,0); this.translationalLimitMotor = new oimo.dynamics.constraint.joint.TranslationalLimitMotor(); this.translationalSpringDamper = new oimo.dynamics.constraint.joint.SpringDamper(); this.rotationalLimitMotor = new oimo.dynamics.constraint.joint.RotationalLimitMotor(); this.rotationalSpringDamper = new oimo.dynamics.constraint.joint.SpringDamper(); } init(rigidBody1,rigidBody2,worldAnchor,worldAxis) { this._init(rigidBody1,rigidBody2,worldAnchor); let localVector = this.localAxis1; let vX; let vY; let vZ; vX = worldAxis.x; vY = worldAxis.y; vZ = worldAxis.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = rigidBody1._transform._rotation00 * vX + rigidBody1._transform._rotation10 * vY + rigidBody1._transform._rotation20 * vZ; __tmp__Y = rigidBody1._transform._rotation01 * vX + rigidBody1._transform._rotation11 * vY + rigidBody1._transform._rotation21 * vZ; __tmp__Z = rigidBody1._transform._rotation02 * vX + rigidBody1._transform._rotation12 * vY + rigidBody1._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; localVector.x = vX; localVector.y = vY; localVector.z = vZ; let localVector1 = this.localAxis2; let vX1; let vY1; let vZ1; vX1 = worldAxis.x; vY1 = worldAxis.y; vZ1 = worldAxis.z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = rigidBody2._transform._rotation00 * vX1 + rigidBody2._transform._rotation10 * vY1 + rigidBody2._transform._rotation20 * vZ1; __tmp__Y1 = rigidBody2._transform._rotation01 * vX1 + rigidBody2._transform._rotation11 * vY1 + rigidBody2._transform._rotation21 * vZ1; __tmp__Z1 = rigidBody2._transform._rotation02 * vX1 + rigidBody2._transform._rotation12 * vY1 + rigidBody2._transform._rotation22 * vZ1; vX1 = __tmp__X1; vY1 = __tmp__Y1; vZ1 = __tmp__Z1; localVector1.x = vX1; localVector1.y = vY1; localVector1.z = vZ1; return this; } } oimo.dynamics.constraint.joint.GenericJoint = class oimo_dynamics_constraint_joint_GenericJoint extends oimo.dynamics.constraint.joint.Joint { constructor(config) { super(config,oimo.dynamics.constraint.joint.JointType.GENERIC); let tmp; let _this = config.localBasis1; if(!(_this.e00 * (_this.e11 * _this.e22 - _this.e12 * _this.e21) - _this.e01 * (_this.e10 * _this.e22 - _this.e12 * _this.e20) + _this.e02 * (_this.e10 * _this.e21 - _this.e11 * _this.e20) < 0)) { let _this = config.localBasis2; tmp = _this.e00 * (_this.e11 * _this.e22 - _this.e12 * _this.e21) - _this.e01 * (_this.e10 * _this.e22 - _this.e12 * _this.e20) + _this.e02 * (_this.e10 * _this.e21 - _this.e11 * _this.e20) < 0; } else { tmp = true; } if(tmp) { console.log("src/oimo/dynamics/constraint/joint/GenericJoint.hx:50:","[warning] joint basis must be right handed"); } let lb100; let lb101; let lb102; let lb110; let lb111; let lb112; let lb120; let lb121; let lb122; let lb200; let lb201; let lb202; let lb210; let lb211; let lb212; let lb220; let lb221; let lb222; let m = config.localBasis1; lb100 = m.e00; lb101 = m.e01; lb102 = m.e02; lb110 = m.e10; lb111 = m.e11; lb112 = m.e12; lb120 = m.e20; lb121 = m.e21; lb122 = m.e22; let m1 = config.localBasis2; lb200 = m1.e00; lb201 = m1.e01; lb202 = m1.e02; lb210 = m1.e10; lb211 = m1.e11; lb212 = m1.e12; lb220 = m1.e20; lb221 = m1.e21; lb222 = m1.e22; this._localBasisX1X = lb100; this._localBasisX1Y = lb110; this._localBasisX1Z = lb120; this._localBasisY1X = lb101; this._localBasisY1Y = lb111; this._localBasisY1Z = lb121; this._localBasisZ1X = lb102; this._localBasisZ1Y = lb112; this._localBasisZ1Z = lb122; this._localBasisX2X = lb200; this._localBasisX2Y = lb210; this._localBasisX2Z = lb220; this._localBasisY2X = lb201; this._localBasisY2Y = lb211; this._localBasisY2Z = lb221; this._localBasisZ2X = lb202; this._localBasisZ2Y = lb212; this._localBasisZ2Z = lb222; this._angleX = 0; this._angleY = 0; this._angleZ = 0; this.translationX = 0; this.translationY = 0; this.translationZ = 0; this.xSingular = false; this.ySingular = false; this.zSingular = false; this._translLms = new Array(3); this._translSds = new Array(3); this._rotLms = new Array(3); this._rotSds = new Array(3); this._translLms[0] = config.translationalLimitMotors[0].clone(); this._translLms[1] = config.translationalLimitMotors[1].clone(); this._translLms[2] = config.translationalLimitMotors[2].clone(); this._translSds[0] = config.translationalSpringDampers[0].clone(); this._translSds[1] = config.translationalSpringDampers[1].clone(); this._translSds[2] = config.translationalSpringDampers[2].clone(); this._rotLms[0] = config.rotationalLimitMotors[0].clone(); this._rotLms[1] = config.rotationalLimitMotors[1].clone(); this._rotLms[2] = config.rotationalLimitMotors[2].clone(); this._rotSds[0] = config.rotationalSpringDampers[0].clone(); this._rotSds[1] = config.rotationalSpringDampers[1].clone(); this._rotSds[2] = config.rotationalSpringDampers[2].clone(); } getInfo(info,timeStep,isPositionPart) { let j; let translMotorMass = 1 / (this._b1._invMass + this._b2._invMass); let motorMassX = this.computeEffectiveInertiaMoment(this._axisXX,this._axisXY,this._axisXZ); let motorMassY = this.computeEffectiveInertiaMoment(this._axisYX,this._axisYY,this._axisYZ); let motorMassZ = this.computeEffectiveInertiaMoment(this._axisZX,this._axisZY,this._axisZZ); if(this._translSds[0].frequency <= 0 || !isPositionPart) { let impulse = this._impulses[0]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowLinear(row,this.translationX,this._translLms[0],translMotorMass,this._translSds[0],timeStep,isPositionPart); j = row.jacobian; j.lin1X = this._basisX1X; j.lin1Y = this._basisX1Y; j.lin1Z = this._basisX1Z; j.lin2X = this._basisX1X; j.lin2Y = this._basisX1Y; j.lin2Z = this._basisX1Z; j.ang1X = this._relativeAnchor1Y * this._basisX1Z - this._relativeAnchor1Z * this._basisX1Y; j.ang1Y = this._relativeAnchor1Z * this._basisX1X - this._relativeAnchor1X * this._basisX1Z; j.ang1Z = this._relativeAnchor1X * this._basisX1Y - this._relativeAnchor1Y * this._basisX1X; j.ang2X = this._relativeAnchor2Y * this._basisX1Z - this._relativeAnchor2Z * this._basisX1Y; j.ang2Y = this._relativeAnchor2Z * this._basisX1X - this._relativeAnchor2X * this._basisX1Z; j.ang2Z = this._relativeAnchor2X * this._basisX1Y - this._relativeAnchor2Y * this._basisX1X; } if(this._translSds[1].frequency <= 0 || !isPositionPart) { let impulse = this._impulses[1]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowLinear(row,this.translationY,this._translLms[1],translMotorMass,this._translSds[1],timeStep,isPositionPart); j = row.jacobian; j.lin1X = this._basisY1X; j.lin1Y = this._basisY1Y; j.lin1Z = this._basisY1Z; j.lin2X = this._basisY1X; j.lin2Y = this._basisY1Y; j.lin2Z = this._basisY1Z; j.ang1X = this._relativeAnchor1Y * this._basisY1Z - this._relativeAnchor1Z * this._basisY1Y; j.ang1Y = this._relativeAnchor1Z * this._basisY1X - this._relativeAnchor1X * this._basisY1Z; j.ang1Z = this._relativeAnchor1X * this._basisY1Y - this._relativeAnchor1Y * this._basisY1X; j.ang2X = this._relativeAnchor2Y * this._basisY1Z - this._relativeAnchor2Z * this._basisY1Y; j.ang2Y = this._relativeAnchor2Z * this._basisY1X - this._relativeAnchor2X * this._basisY1Z; j.ang2Z = this._relativeAnchor2X * this._basisY1Y - this._relativeAnchor2Y * this._basisY1X; } if(this._translSds[2].frequency <= 0 || !isPositionPart) { let impulse = this._impulses[2]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowLinear(row,this.translationZ,this._translLms[2],translMotorMass,this._translSds[2],timeStep,isPositionPart); j = row.jacobian; j.lin1X = this._basisZ1X; j.lin1Y = this._basisZ1Y; j.lin1Z = this._basisZ1Z; j.lin2X = this._basisZ1X; j.lin2Y = this._basisZ1Y; j.lin2Z = this._basisZ1Z; j.ang1X = this._relativeAnchor1Y * this._basisZ1Z - this._relativeAnchor1Z * this._basisZ1Y; j.ang1Y = this._relativeAnchor1Z * this._basisZ1X - this._relativeAnchor1X * this._basisZ1Z; j.ang1Z = this._relativeAnchor1X * this._basisZ1Y - this._relativeAnchor1Y * this._basisZ1X; j.ang2X = this._relativeAnchor2Y * this._basisZ1Z - this._relativeAnchor2Z * this._basisZ1Y; j.ang2Y = this._relativeAnchor2Z * this._basisZ1X - this._relativeAnchor2X * this._basisZ1Z; j.ang2Z = this._relativeAnchor2X * this._basisZ1Y - this._relativeAnchor2Y * this._basisZ1X; } if(!this.xSingular && (this._rotSds[0].frequency <= 0 || !isPositionPart)) { let impulse = this._impulses[3]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowAngular(row,this._angleX,this._rotLms[0],motorMassX,this._rotSds[0],timeStep,isPositionPart); j = row.jacobian; j.ang1X = this._axisXX; j.ang1Y = this._axisXY; j.ang1Z = this._axisXZ; j.ang2X = this._axisXX; j.ang2Y = this._axisXY; j.ang2Z = this._axisXZ; } if(!this.ySingular && (this._rotSds[1].frequency <= 0 || !isPositionPart)) { let impulse = this._impulses[4]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowAngular(row,this._angleY,this._rotLms[1],motorMassY,this._rotSds[1],timeStep,isPositionPart); j = row.jacobian; j.ang1X = this._axisYX; j.ang1Y = this._axisYY; j.ang1Z = this._axisYZ; j.ang2X = this._axisYX; j.ang2Y = this._axisYY; j.ang2Z = this._axisYZ; } if(!this.zSingular && (this._rotSds[2].frequency <= 0 || !isPositionPart)) { let impulse = this._impulses[5]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowAngular(row,this._angleZ,this._rotLms[2],motorMassZ,this._rotSds[2],timeStep,isPositionPart); j = row.jacobian; j.ang1X = this._axisZX; j.ang1Y = this._axisZY; j.ang1Z = this._axisZZ; j.ang2X = this._axisZX; j.ang2Y = this._axisZY; j.ang2Z = this._axisZZ; } } _syncAnchors() { super._syncAnchors(); let angleAxisXX; let angleAxisXY; let angleAxisXZ; let angleAxisYX; let angleAxisYY; let angleAxisYZ; let angleAxisZX; let angleAxisZY; let angleAxisZZ; angleAxisXX = this._basisX1X; angleAxisXY = this._basisX1Y; angleAxisXZ = this._basisX1Z; angleAxisZX = this._basisZ2X; angleAxisZY = this._basisZ2Y; angleAxisZZ = this._basisZ2Z; angleAxisYX = angleAxisZY * angleAxisXZ - angleAxisZZ * angleAxisXY; angleAxisYY = angleAxisZZ * angleAxisXX - angleAxisZX * angleAxisXZ; angleAxisYZ = angleAxisZX * angleAxisXY - angleAxisZY * angleAxisXX; this._axisXX = angleAxisYY * angleAxisZZ - angleAxisYZ * angleAxisZY; this._axisXY = angleAxisYZ * angleAxisZX - angleAxisYX * angleAxisZZ; this._axisXZ = angleAxisYX * angleAxisZY - angleAxisYY * angleAxisZX; this._axisYX = angleAxisYX; this._axisYY = angleAxisYY; this._axisYZ = angleAxisYZ; this._axisZX = angleAxisXY * angleAxisYZ - angleAxisXZ * angleAxisYY; this._axisZY = angleAxisXZ * angleAxisYX - angleAxisXX * angleAxisYZ; this._axisZZ = angleAxisXX * angleAxisYY - angleAxisXY * angleAxisYX; let l = this._axisXX * this._axisXX + this._axisXY * this._axisXY + this._axisXZ * this._axisXZ; if(l > 0) { l = 1 / Math.sqrt(l); } this._axisXX *= l; this._axisXY *= l; this._axisXZ *= l; let l1 = this._axisYX * this._axisYX + this._axisYY * this._axisYY + this._axisYZ * this._axisYZ; if(l1 > 0) { l1 = 1 / Math.sqrt(l1); } this._axisYX *= l1; this._axisYY *= l1; this._axisYZ *= l1; let l2 = this._axisZX * this._axisZX + this._axisZY * this._axisZY + this._axisZZ * this._axisZZ; if(l2 > 0) { l2 = 1 / Math.sqrt(l2); } this._axisZX *= l2; this._axisZY *= l2; this._axisZZ *= l2; this.xSingular = this._axisXX * this._axisXX + this._axisXY * this._axisXY + this._axisXZ * this._axisXZ == 0; this.ySingular = this._axisYX * this._axisYX + this._axisYY * this._axisYY + this._axisYZ * this._axisYZ == 0; this.zSingular = this._axisZX * this._axisZX + this._axisZY * this._axisZY + this._axisZZ * this._axisZZ == 0; let rot100; let rot101; let rot102; let rot110; let rot111; let rot112; let rot120; let rot121; let rot122; let rot200; let rot201; let rot202; let rot210; let rot211; let rot212; let rot220; let rot221; let rot222; rot100 = this._basisX1X; rot101 = this._basisY1X; rot102 = this._basisZ1X; rot110 = this._basisX1Y; rot111 = this._basisY1Y; rot112 = this._basisZ1Y; rot120 = this._basisX1Z; rot121 = this._basisY1Z; rot122 = this._basisZ1Z; rot200 = this._basisX2X; rot201 = this._basisY2X; rot202 = this._basisZ2X; rot210 = this._basisX2Y; rot211 = this._basisY2Y; rot212 = this._basisZ2Y; rot220 = this._basisX2Z; rot221 = this._basisY2Z; rot222 = this._basisZ2Z; let relRot00; let relRot01; let relRot02; let relRot11; let relRot12; let relRot21; let relRot22; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__11; let __tmp__12; let __tmp__21; let __tmp__22; __tmp__00 = rot100 * rot200 + rot110 * rot210 + rot120 * rot220; __tmp__01 = rot100 * rot201 + rot110 * rot211 + rot120 * rot221; __tmp__02 = rot100 * rot202 + rot110 * rot212 + rot120 * rot222; __tmp__11 = rot101 * rot201 + rot111 * rot211 + rot121 * rot221; __tmp__12 = rot101 * rot202 + rot111 * rot212 + rot121 * rot222; __tmp__21 = rot102 * rot201 + rot112 * rot211 + rot122 * rot221; __tmp__22 = rot102 * rot202 + rot112 * rot212 + rot122 * rot222; relRot00 = __tmp__00; relRot01 = __tmp__01; relRot02 = __tmp__02; relRot11 = __tmp__11; relRot12 = __tmp__12; relRot21 = __tmp__21; relRot22 = __tmp__22; let anglesX; let anglesY; let anglesZ; let sy = relRot02; if(sy <= -1) { let xSubZ = Math.atan2(relRot21,relRot11); anglesX = xSubZ * 0.5; anglesY = -1.570796326794895; anglesZ = -xSubZ * 0.5; } else if(sy >= 1) { let xAddZ = Math.atan2(relRot21,relRot11); anglesX = xAddZ * 0.5; anglesY = 1.570796326794895; anglesZ = xAddZ * 0.5; } else { anglesX = Math.atan2(-relRot12,relRot22); anglesY = Math.asin(sy); anglesZ = Math.atan2(-relRot01,relRot00); } this._angleX = anglesX; this._angleY = anglesY; this._angleZ = anglesZ; let anchorDiffX; let anchorDiffY; let anchorDiffZ; anchorDiffX = this._anchor2X - this._anchor1X; anchorDiffY = this._anchor2Y - this._anchor1Y; anchorDiffZ = this._anchor2Z - this._anchor1Z; this.translationX = anchorDiffX * this._basisX1X + anchorDiffY * this._basisX1Y + anchorDiffZ * this._basisX1Z; this.translationY = anchorDiffX * this._basisY1X + anchorDiffY * this._basisY1Y + anchorDiffZ * this._basisY1Z; this.translationZ = anchorDiffX * this._basisZ1X + anchorDiffY * this._basisZ1Y + anchorDiffZ * this._basisZ1Z; } _getVelocitySolverInfo(timeStep,info) { super._getVelocitySolverInfo(timeStep,info); this.getInfo(info,timeStep,false); } _getPositionSolverInfo(info) { super._getPositionSolverInfo(info); this.getInfo(info,null,true); } getAxisX() { let v = new oimo.common.Vec3(); v.x = this._basisX1X; v.y = this._basisX1Y; v.z = this._basisX1Z; return v; } getAxisY() { let v = new oimo.common.Vec3(); v.x = this._axisYX; v.y = this._axisYY; v.z = this._axisYZ; return v; } getAxisZ() { let v = new oimo.common.Vec3(); v.x = this._basisZ2X; v.y = this._basisZ2Y; v.z = this._basisZ2Z; return v; } getTranslationalSpringDampers() { return this._translSds.slice(0); } getRotationalSpringDampers() { return this._translSds.slice(0); } getTranslationalLimitMotors() { return this._translLms.slice(0); } getRotationalLimitMotors() { return this._rotLms.slice(0); } getAngles() { return new oimo.common.Vec3(this._angleX,this._angleY,this._angleZ); } getTranslations() { return new oimo.common.Vec3(this.translationX,this.translationY,this.translationZ); } } oimo.dynamics.constraint.joint.GenericJointConfig = class oimo_dynamics_constraint_joint_GenericJointConfig extends oimo.dynamics.constraint.joint.JointConfig { constructor() { super(); this.localBasis1 = new oimo.common.Mat3(); this.localBasis2 = new oimo.common.Mat3(); let _g = []; _g.push(new oimo.dynamics.constraint.joint.TranslationalLimitMotor().setLimits(0,0)); _g.push(new oimo.dynamics.constraint.joint.TranslationalLimitMotor().setLimits(0,0)); _g.push(new oimo.dynamics.constraint.joint.TranslationalLimitMotor().setLimits(0,0)); this.translationalLimitMotors = _g; let _g1 = []; _g1.push(new oimo.dynamics.constraint.joint.RotationalLimitMotor().setLimits(0,0)); _g1.push(new oimo.dynamics.constraint.joint.RotationalLimitMotor().setLimits(0,0)); _g1.push(new oimo.dynamics.constraint.joint.RotationalLimitMotor().setLimits(0,0)); this.rotationalLimitMotors = _g1; this.translationalSpringDampers = [new oimo.dynamics.constraint.joint.SpringDamper(),new oimo.dynamics.constraint.joint.SpringDamper(),new oimo.dynamics.constraint.joint.SpringDamper()]; this.rotationalSpringDampers = [new oimo.dynamics.constraint.joint.SpringDamper(),new oimo.dynamics.constraint.joint.SpringDamper(),new oimo.dynamics.constraint.joint.SpringDamper()]; } init(rigidBody1,rigidBody2,worldAnchor,worldBasis1,worldBasis2) { this._init(rigidBody1,rigidBody2,worldAnchor); let tf1 = rigidBody1._transform; let tf2 = rigidBody2._transform; let wb100; let wb101; let wb102; let wb110; let wb111; let wb112; let wb120; let wb121; let wb122; let wb200; let wb201; let wb202; let wb210; let wb211; let wb212; let wb220; let wb221; let wb222; let lb100; let lb101; let lb102; let lb110; let lb111; let lb112; let lb120; let lb121; let lb122; let lb200; let lb201; let lb202; let lb210; let lb211; let lb212; let lb220; let lb221; let lb222; wb100 = worldBasis1.e00; wb101 = worldBasis1.e01; wb102 = worldBasis1.e02; wb110 = worldBasis1.e10; wb111 = worldBasis1.e11; wb112 = worldBasis1.e12; wb120 = worldBasis1.e20; wb121 = worldBasis1.e21; wb122 = worldBasis1.e22; wb200 = worldBasis2.e00; wb201 = worldBasis2.e01; wb202 = worldBasis2.e02; wb210 = worldBasis2.e10; wb211 = worldBasis2.e11; wb212 = worldBasis2.e12; wb220 = worldBasis2.e20; wb221 = worldBasis2.e21; wb222 = worldBasis2.e22; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * wb100 + tf1._rotation10 * wb110 + tf1._rotation20 * wb120; __tmp__01 = tf1._rotation00 * wb101 + tf1._rotation10 * wb111 + tf1._rotation20 * wb121; __tmp__02 = tf1._rotation00 * wb102 + tf1._rotation10 * wb112 + tf1._rotation20 * wb122; __tmp__10 = tf1._rotation01 * wb100 + tf1._rotation11 * wb110 + tf1._rotation21 * wb120; __tmp__11 = tf1._rotation01 * wb101 + tf1._rotation11 * wb111 + tf1._rotation21 * wb121; __tmp__12 = tf1._rotation01 * wb102 + tf1._rotation11 * wb112 + tf1._rotation21 * wb122; __tmp__20 = tf1._rotation02 * wb100 + tf1._rotation12 * wb110 + tf1._rotation22 * wb120; __tmp__21 = tf1._rotation02 * wb101 + tf1._rotation12 * wb111 + tf1._rotation22 * wb121; __tmp__22 = tf1._rotation02 * wb102 + tf1._rotation12 * wb112 + tf1._rotation22 * wb122; lb100 = __tmp__00; lb101 = __tmp__01; lb102 = __tmp__02; lb110 = __tmp__10; lb111 = __tmp__11; lb112 = __tmp__12; lb120 = __tmp__20; lb121 = __tmp__21; lb122 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * wb200 + tf2._rotation10 * wb210 + tf2._rotation20 * wb220; __tmp__011 = tf2._rotation00 * wb201 + tf2._rotation10 * wb211 + tf2._rotation20 * wb221; __tmp__021 = tf2._rotation00 * wb202 + tf2._rotation10 * wb212 + tf2._rotation20 * wb222; __tmp__101 = tf2._rotation01 * wb200 + tf2._rotation11 * wb210 + tf2._rotation21 * wb220; __tmp__111 = tf2._rotation01 * wb201 + tf2._rotation11 * wb211 + tf2._rotation21 * wb221; __tmp__121 = tf2._rotation01 * wb202 + tf2._rotation11 * wb212 + tf2._rotation21 * wb222; __tmp__201 = tf2._rotation02 * wb200 + tf2._rotation12 * wb210 + tf2._rotation22 * wb220; __tmp__211 = tf2._rotation02 * wb201 + tf2._rotation12 * wb211 + tf2._rotation22 * wb221; __tmp__221 = tf2._rotation02 * wb202 + tf2._rotation12 * wb212 + tf2._rotation22 * wb222; lb200 = __tmp__001; lb201 = __tmp__011; lb202 = __tmp__021; lb210 = __tmp__101; lb211 = __tmp__111; lb212 = __tmp__121; lb220 = __tmp__201; lb221 = __tmp__211; lb222 = __tmp__221; let m = this.localBasis1; m.e00 = lb100; m.e01 = lb101; m.e02 = lb102; m.e10 = lb110; m.e11 = lb111; m.e12 = lb112; m.e20 = lb120; m.e21 = lb121; m.e22 = lb122; let m1 = this.localBasis2; m1.e00 = lb200; m1.e01 = lb201; m1.e02 = lb202; m1.e10 = lb210; m1.e11 = lb211; m1.e12 = lb212; m1.e20 = lb220; m1.e21 = lb221; m1.e22 = lb222; return this; } } oimo.dynamics.constraint.joint.JointImpulse = class oimo_dynamics_constraint_joint_JointImpulse { constructor() { this.impulse = 0; this.impulseM = 0; this.impulseP = 0; } } oimo.dynamics.constraint.joint.JointLink = class oimo_dynamics_constraint_joint_JointLink { constructor(joint) { this._joint = joint; } getContact() { return this._joint; } getOther() { return this._other; } getPrev() { return this._prev; } getNext() { return this._next; } } oimo.dynamics.constraint.joint.JointMacro = class oimo_dynamics_constraint_joint_JointMacro { } oimo.dynamics.constraint.joint.JointType = class oimo_dynamics_constraint_joint_JointType { } oimo.dynamics.constraint.joint.PrismaticJoint = class oimo_dynamics_constraint_joint_PrismaticJoint extends oimo.dynamics.constraint.joint.Joint { constructor(config) { super(config,oimo.dynamics.constraint.joint.JointType.PRISMATIC); let v = config.localAxis1; this._localBasisX1X = v.x; this._localBasisX1Y = v.y; this._localBasisX1Z = v.z; let v1 = config.localAxis2; this._localBasisX2X = v1.x; this._localBasisX2Y = v1.y; this._localBasisX2Z = v1.z; this.buildLocalBasesFromX(); this._basis = new oimo.dynamics.constraint.joint.BasisTracker(this); this.translation = 0; this.linearErrorY = 0; this.linearErrorZ = 0; this.angularErrorX = 0; this.angularErrorY = 0; this.angularErrorZ = 0; this._sd = config.springDamper.clone(); this._lm = config.limitMotor.clone(); } getInfo(info,timeStep,isPositionPart) { let erp = this.getErp(timeStep,isPositionPart); let linRhsY = this.linearErrorY * erp; let linRhsZ = this.linearErrorZ * erp; let angRhsX = this.angularErrorX * erp; let angRhsY = this.angularErrorY * erp; let angRhsZ = this.angularErrorZ * erp; let j; if(this._sd.frequency <= 0 || !isPositionPart) { let impulse = this._impulses[0]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowLinear(row,this.translation,this._lm,1 / (this._b1._invMass + this._b2._invMass),this._sd,timeStep,isPositionPart); j = row.jacobian; j.lin1X = this._basis.xX; j.lin1Y = this._basis.xY; j.lin1Z = this._basis.xZ; j.lin2X = this._basis.xX; j.lin2Y = this._basis.xY; j.lin2Z = this._basis.xZ; j.ang1X = this._relativeAnchor1Y * this._basis.xZ - this._relativeAnchor1Z * this._basis.xY; j.ang1Y = this._relativeAnchor1Z * this._basis.xX - this._relativeAnchor1X * this._basis.xZ; j.ang1Z = this._relativeAnchor1X * this._basis.xY - this._relativeAnchor1Y * this._basis.xX; j.ang2X = this._relativeAnchor2Y * this._basis.xZ - this._relativeAnchor2Z * this._basis.xY; j.ang2Y = this._relativeAnchor2Z * this._basis.xX - this._relativeAnchor2X * this._basis.xZ; j.ang2Z = this._relativeAnchor2X * this._basis.xY - this._relativeAnchor2Y * this._basis.xX; } let impulse = this._impulses[1]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; row.rhs = linRhsY; row.cfm = 0; row.minImpulse = -1e65536; row.maxImpulse = 1e65536; j = row.jacobian; j.lin1X = this._basis.yX; j.lin1Y = this._basis.yY; j.lin1Z = this._basis.yZ; j.lin2X = this._basis.yX; j.lin2Y = this._basis.yY; j.lin2Z = this._basis.yZ; j.ang1X = this._relativeAnchor1Y * this._basis.yZ - this._relativeAnchor1Z * this._basis.yY; j.ang1Y = this._relativeAnchor1Z * this._basis.yX - this._relativeAnchor1X * this._basis.yZ; j.ang1Z = this._relativeAnchor1X * this._basis.yY - this._relativeAnchor1Y * this._basis.yX; j.ang2X = this._relativeAnchor2Y * this._basis.yZ - this._relativeAnchor2Z * this._basis.yY; j.ang2Y = this._relativeAnchor2Z * this._basis.yX - this._relativeAnchor2X * this._basis.yZ; j.ang2Z = this._relativeAnchor2X * this._basis.yY - this._relativeAnchor2Y * this._basis.yX; let impulse1 = this._impulses[2]; let row1 = info.rows[info.numRows++]; let _this1 = row1.jacobian; _this1.lin1X = 0; _this1.lin1Y = 0; _this1.lin1Z = 0; _this1.lin2X = 0; _this1.lin2Y = 0; _this1.lin2Z = 0; _this1.ang1X = 0; _this1.ang1Y = 0; _this1.ang1Z = 0; _this1.ang2X = 0; _this1.ang2Y = 0; _this1.ang2Z = 0; row1.rhs = 0; row1.cfm = 0; row1.minImpulse = 0; row1.maxImpulse = 0; row1.motorSpeed = 0; row1.motorMaxImpulse = 0; row1.impulse = null; row1.impulse = impulse1; row1.rhs = linRhsZ; row1.cfm = 0; row1.minImpulse = -1e65536; row1.maxImpulse = 1e65536; j = row1.jacobian; j.lin1X = this._basis.zX; j.lin1Y = this._basis.zY; j.lin1Z = this._basis.zZ; j.lin2X = this._basis.zX; j.lin2Y = this._basis.zY; j.lin2Z = this._basis.zZ; j.ang1X = this._relativeAnchor1Y * this._basis.zZ - this._relativeAnchor1Z * this._basis.zY; j.ang1Y = this._relativeAnchor1Z * this._basis.zX - this._relativeAnchor1X * this._basis.zZ; j.ang1Z = this._relativeAnchor1X * this._basis.zY - this._relativeAnchor1Y * this._basis.zX; j.ang2X = this._relativeAnchor2Y * this._basis.zZ - this._relativeAnchor2Z * this._basis.zY; j.ang2Y = this._relativeAnchor2Z * this._basis.zX - this._relativeAnchor2X * this._basis.zZ; j.ang2Z = this._relativeAnchor2X * this._basis.zY - this._relativeAnchor2Y * this._basis.zX; let impulse2 = this._impulses[3]; let row2 = info.rows[info.numRows++]; let _this2 = row2.jacobian; _this2.lin1X = 0; _this2.lin1Y = 0; _this2.lin1Z = 0; _this2.lin2X = 0; _this2.lin2Y = 0; _this2.lin2Z = 0; _this2.ang1X = 0; _this2.ang1Y = 0; _this2.ang1Z = 0; _this2.ang2X = 0; _this2.ang2Y = 0; _this2.ang2Z = 0; row2.rhs = 0; row2.cfm = 0; row2.minImpulse = 0; row2.maxImpulse = 0; row2.motorSpeed = 0; row2.motorMaxImpulse = 0; row2.impulse = null; row2.impulse = impulse2; row2.rhs = angRhsX; row2.cfm = 0; row2.minImpulse = -1e65536; row2.maxImpulse = 1e65536; j = row2.jacobian; j.ang1X = 1; j.ang1Y = 0; j.ang1Z = 0; j.ang2X = 1; j.ang2Y = 0; j.ang2Z = 0; let impulse3 = this._impulses[4]; let row3 = info.rows[info.numRows++]; let _this3 = row3.jacobian; _this3.lin1X = 0; _this3.lin1Y = 0; _this3.lin1Z = 0; _this3.lin2X = 0; _this3.lin2Y = 0; _this3.lin2Z = 0; _this3.ang1X = 0; _this3.ang1Y = 0; _this3.ang1Z = 0; _this3.ang2X = 0; _this3.ang2Y = 0; _this3.ang2Z = 0; row3.rhs = 0; row3.cfm = 0; row3.minImpulse = 0; row3.maxImpulse = 0; row3.motorSpeed = 0; row3.motorMaxImpulse = 0; row3.impulse = null; row3.impulse = impulse3; row3.rhs = angRhsY; row3.cfm = 0; row3.minImpulse = -1e65536; row3.maxImpulse = 1e65536; j = row3.jacobian; j.ang1X = 0; j.ang1Y = 1; j.ang1Z = 0; j.ang2X = 0; j.ang2Y = 1; j.ang2Z = 0; let impulse4 = this._impulses[5]; let row4 = info.rows[info.numRows++]; let _this4 = row4.jacobian; _this4.lin1X = 0; _this4.lin1Y = 0; _this4.lin1Z = 0; _this4.lin2X = 0; _this4.lin2Y = 0; _this4.lin2Z = 0; _this4.ang1X = 0; _this4.ang1Y = 0; _this4.ang1Z = 0; _this4.ang2X = 0; _this4.ang2Y = 0; _this4.ang2Z = 0; row4.rhs = 0; row4.cfm = 0; row4.minImpulse = 0; row4.maxImpulse = 0; row4.motorSpeed = 0; row4.motorMaxImpulse = 0; row4.impulse = null; row4.impulse = impulse4; row4.rhs = angRhsZ; row4.cfm = 0; row4.minImpulse = -1e65536; row4.maxImpulse = 1e65536; j = row4.jacobian; j.ang1X = 0; j.ang1Y = 0; j.ang1Z = 1; j.ang2X = 0; j.ang2Y = 0; j.ang2Z = 1; } _syncAnchors() { super._syncAnchors(); let _this = this._basis; let invM1 = _this.joint._b1._invMass; let invM2 = _this.joint._b2._invMass; let qX; let qY; let qZ; let qW; let idQX; let idQY; let idQZ; let idQW; let slerpQX; let slerpQY; let slerpQZ; let slerpQW; let slerpM00; let slerpM01; let slerpM02; let slerpM10; let slerpM11; let slerpM12; let slerpM20; let slerpM21; let slerpM22; let newXX; let newXY; let newXZ; let newYX; let newYY; let newYZ; let newZX; let newZY; let newZZ; let prevXX; let prevXY; let prevXZ; let prevYX; let prevYY; let prevYZ; let d = _this.joint._basisX1X * _this.joint._basisX2X + _this.joint._basisX1Y * _this.joint._basisX2Y + _this.joint._basisX1Z * _this.joint._basisX2Z; if(d < -0.999999999) { let vX; let vY; let vZ; let x1 = _this.joint._basisX1X; let y1 = _this.joint._basisX1Y; let z1 = _this.joint._basisX1Z; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); vX = 0; vY = z1 * d; vZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); vX = -z1 * d; vY = 0; vZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } qX = vX; qY = vY; qZ = vZ; qW = 0; } else { let cX; let cY; let cZ; cX = _this.joint._basisX1Y * _this.joint._basisX2Z - _this.joint._basisX1Z * _this.joint._basisX2Y; cY = _this.joint._basisX1Z * _this.joint._basisX2X - _this.joint._basisX1X * _this.joint._basisX2Z; cZ = _this.joint._basisX1X * _this.joint._basisX2Y - _this.joint._basisX1Y * _this.joint._basisX2X; let w = Math.sqrt((1 + d) * 0.5); d = 0.5 / w; cX *= d; cY *= d; cZ *= d; qX = cX; qY = cY; qZ = cZ; qW = w; } idQX = 0; idQY = 0; idQZ = 0; idQW = 1; let q1X; let q1Y; let q1Z; let q1W; let q2X; let q2Y; let q2Z; let q2W; q1X = idQX; q1Y = idQY; q1Z = idQZ; q1W = idQW; q2X = qX; q2Y = qY; q2Z = qZ; q2W = qW; let d1 = q1X * q2X + q1Y * q2Y + q1Z * q2Z + q1W * q2W; if(d1 < 0) { d1 = -d1; q2X = -q2X; q2Y = -q2Y; q2Z = -q2Z; q2W = -q2W; } if(d1 > 0.999999) { let dqX; let dqY; let dqZ; let dqW; dqX = q2X - q1X; dqY = q2Y - q1Y; dqZ = q2Z - q1Z; dqW = q2W - q1W; q2X = q1X + dqX * (invM1 / (invM1 + invM2)); q2Y = q1Y + dqY * (invM1 / (invM1 + invM2)); q2Z = q1Z + dqZ * (invM1 / (invM1 + invM2)); q2W = q1W + dqW * (invM1 / (invM1 + invM2)); let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W; if(l > 1e-32) { l = 1 / Math.sqrt(l); } slerpQX = q2X * l; slerpQY = q2Y * l; slerpQZ = q2Z * l; slerpQW = q2W * l; } else { let theta = invM1 / (invM1 + invM2) * Math.acos(d1); q2X += q1X * -d1; q2Y += q1Y * -d1; q2Z += q1Z * -d1; q2W += q1W * -d1; let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W; if(l > 1e-32) { l = 1 / Math.sqrt(l); } q2X *= l; q2Y *= l; q2Z *= l; q2W *= l; let sin = Math.sin(theta); let cos = Math.cos(theta); q1X *= cos; q1Y *= cos; q1Z *= cos; q1W *= cos; slerpQX = q1X + q2X * sin; slerpQY = q1Y + q2Y * sin; slerpQZ = q1Z + q2Z * sin; slerpQW = q1W + q2W * sin; } let x = slerpQX; let y = slerpQY; let z = slerpQZ; let w = slerpQW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; slerpM00 = 1 - yy - zz; slerpM01 = xy - wz; slerpM02 = xz + wy; slerpM10 = xy + wz; slerpM11 = 1 - xx - zz; slerpM12 = yz - wx; slerpM20 = xz - wy; slerpM21 = yz + wx; slerpM22 = 1 - xx - yy; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = slerpM00 * _this.joint._basisX1X + slerpM01 * _this.joint._basisX1Y + slerpM02 * _this.joint._basisX1Z; __tmp__Y = slerpM10 * _this.joint._basisX1X + slerpM11 * _this.joint._basisX1Y + slerpM12 * _this.joint._basisX1Z; __tmp__Z = slerpM20 * _this.joint._basisX1X + slerpM21 * _this.joint._basisX1Y + slerpM22 * _this.joint._basisX1Z; newXX = __tmp__X; newXY = __tmp__Y; newXZ = __tmp__Z; prevXX = _this.xX; prevXY = _this.xY; prevXZ = _this.xZ; prevYX = _this.yX; prevYY = _this.yY; prevYZ = _this.yZ; let d2 = prevXX * newXX + prevXY * newXY + prevXZ * newXZ; if(d2 < -0.999999999) { let vX; let vY; let vZ; let x1 = prevXX; let y1 = prevXY; let z1 = prevXZ; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); vX = 0; vY = z1 * d; vZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); vX = -z1 * d; vY = 0; vZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } slerpQX = vX; slerpQY = vY; slerpQZ = vZ; slerpQW = 0; } else { let cX; let cY; let cZ; cX = prevXY * newXZ - prevXZ * newXY; cY = prevXZ * newXX - prevXX * newXZ; cZ = prevXX * newXY - prevXY * newXX; let w = Math.sqrt((1 + d2) * 0.5); d2 = 0.5 / w; cX *= d2; cY *= d2; cZ *= d2; slerpQX = cX; slerpQY = cY; slerpQZ = cZ; slerpQW = w; } let x1 = slerpQX; let y1 = slerpQY; let z1 = slerpQZ; let w1 = slerpQW; let x21 = 2 * x1; let y21 = 2 * y1; let z21 = 2 * z1; let xx1 = x1 * x21; let yy1 = y1 * y21; let zz1 = z1 * z21; let xy1 = x1 * y21; let yz1 = y1 * z21; let xz1 = x1 * z21; let wx1 = w1 * x21; let wy1 = w1 * y21; let wz1 = w1 * z21; slerpM00 = 1 - yy1 - zz1; slerpM01 = xy1 - wz1; slerpM02 = xz1 + wy1; slerpM10 = xy1 + wz1; slerpM11 = 1 - xx1 - zz1; slerpM12 = yz1 - wx1; slerpM20 = xz1 - wy1; slerpM21 = yz1 + wx1; slerpM22 = 1 - xx1 - yy1; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = slerpM00 * prevYX + slerpM01 * prevYY + slerpM02 * prevYZ; __tmp__Y1 = slerpM10 * prevYX + slerpM11 * prevYY + slerpM12 * prevYZ; __tmp__Z1 = slerpM20 * prevYX + slerpM21 * prevYY + slerpM22 * prevYZ; newYX = __tmp__X1; newYY = __tmp__Y1; newYZ = __tmp__Z1; newZX = newXY * newYZ - newXZ * newYY; newZY = newXZ * newYX - newXX * newYZ; newZZ = newXX * newYY - newXY * newYX; if(newZX * newZX + newZY * newZY + newZZ * newZZ > 1e-6) { let l = newZX * newZX + newZY * newZY + newZZ * newZZ; if(l > 0) { l = 1 / Math.sqrt(l); } newZX *= l; newZY *= l; newZZ *= l; } else { let x1 = newXX; let y1 = newXY; let z1 = newXZ; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); newZX = 0; newZY = z1 * d; newZZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); newZX = y1 * d; newZY = -x1 * d; newZZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); newZX = -z1 * d; newZY = 0; newZZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); newZX = y1 * d; newZY = -x1 * d; newZZ = 0; } } newYX = newZY * newXZ - newZZ * newXY; newYY = newZZ * newXX - newZX * newXZ; newYZ = newZX * newXY - newZY * newXX; _this.xX = newXX; _this.xY = newXY; _this.xZ = newXZ; _this.yX = newYX; _this.yY = newYY; _this.yZ = newYZ; _this.zX = newZX; _this.zY = newZY; _this.zZ = newZZ; let rot100; let rot101; let rot102; let rot110; let rot111; let rot112; let rot120; let rot121; let rot122; let rot200; let rot201; let rot202; let rot210; let rot211; let rot212; let rot220; let rot221; let rot222; rot100 = this._basisX1X; rot101 = this._basisY1X; rot102 = this._basisZ1X; rot110 = this._basisX1Y; rot111 = this._basisY1Y; rot112 = this._basisZ1Y; rot120 = this._basisX1Z; rot121 = this._basisY1Z; rot122 = this._basisZ1Z; rot200 = this._basisX2X; rot201 = this._basisY2X; rot202 = this._basisZ2X; rot210 = this._basisX2Y; rot211 = this._basisY2Y; rot212 = this._basisZ2Y; rot220 = this._basisX2Z; rot221 = this._basisY2Z; rot222 = this._basisZ2Z; let relRot00; let relRot01; let relRot02; let relRot10; let relRot11; let relRot12; let relRot20; let relRot21; let relRot22; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = rot200 * rot100 + rot201 * rot101 + rot202 * rot102; __tmp__01 = rot200 * rot110 + rot201 * rot111 + rot202 * rot112; __tmp__02 = rot200 * rot120 + rot201 * rot121 + rot202 * rot122; __tmp__10 = rot210 * rot100 + rot211 * rot101 + rot212 * rot102; __tmp__11 = rot210 * rot110 + rot211 * rot111 + rot212 * rot112; __tmp__12 = rot210 * rot120 + rot211 * rot121 + rot212 * rot122; __tmp__20 = rot220 * rot100 + rot221 * rot101 + rot222 * rot102; __tmp__21 = rot220 * rot110 + rot221 * rot111 + rot222 * rot112; __tmp__22 = rot220 * rot120 + rot221 * rot121 + rot222 * rot122; relRot00 = __tmp__00; relRot01 = __tmp__01; relRot02 = __tmp__02; relRot10 = __tmp__10; relRot11 = __tmp__11; relRot12 = __tmp__12; relRot20 = __tmp__20; relRot21 = __tmp__21; relRot22 = __tmp__22; let relQX; let relQY; let relQZ; let relQW; let e00 = relRot00; let e11 = relRot11; let e22 = relRot22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); relQW = 0.5 * s; s = 0.5 / s; relQX = (relRot21 - relRot12) * s; relQY = (relRot02 - relRot20) * s; relQZ = (relRot10 - relRot01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); relQX = 0.5 * s; s = 0.5 / s; relQY = (relRot01 + relRot10) * s; relQZ = (relRot02 + relRot20) * s; relQW = (relRot21 - relRot12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); relQZ = 0.5 * s; s = 0.5 / s; relQX = (relRot02 + relRot20) * s; relQY = (relRot12 + relRot21) * s; relQW = (relRot10 - relRot01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); relQY = 0.5 * s; s = 0.5 / s; relQX = (relRot01 + relRot10) * s; relQZ = (relRot12 + relRot21) * s; relQW = (relRot02 - relRot20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); relQZ = 0.5 * s; s = 0.5 / s; relQX = (relRot02 + relRot20) * s; relQY = (relRot12 + relRot21) * s; relQW = (relRot10 - relRot01) * s; } let cosHalfTheta = relQW; let theta = (cosHalfTheta <= -1 ? 3.14159265358979 : cosHalfTheta >= 1 ? 0 : Math.acos(cosHalfTheta)) * 2; this.angularErrorX = relQX; this.angularErrorY = relQY; this.angularErrorZ = relQZ; let l = this.angularErrorX * this.angularErrorX + this.angularErrorY * this.angularErrorY + this.angularErrorZ * this.angularErrorZ; if(l > 0) { l = 1 / Math.sqrt(l); } this.angularErrorX *= l; this.angularErrorY *= l; this.angularErrorZ *= l; this.angularErrorX *= theta; this.angularErrorY *= theta; this.angularErrorZ *= theta; let anchorDiffX; let anchorDiffY; let anchorDiffZ; anchorDiffX = this._anchor2X - this._anchor1X; anchorDiffY = this._anchor2Y - this._anchor1Y; anchorDiffZ = this._anchor2Z - this._anchor1Z; this.translation = anchorDiffX * this._basis.xX + anchorDiffY * this._basis.xY + anchorDiffZ * this._basis.xZ; this.linearErrorY = anchorDiffX * this._basis.yX + anchorDiffY * this._basis.yY + anchorDiffZ * this._basis.yZ; this.linearErrorZ = anchorDiffX * this._basis.zX + anchorDiffY * this._basis.zY + anchorDiffZ * this._basis.zZ; } _getVelocitySolverInfo(timeStep,info) { super._getVelocitySolverInfo(timeStep,info); this.getInfo(info,timeStep,false); } _getPositionSolverInfo(info) { super._getPositionSolverInfo(info); this.getInfo(info,null,true); } getAxis1() { let v = new oimo.common.Vec3(); v.x = this._basisX1X; v.y = this._basisX1Y; v.z = this._basisX1Z; return v; } getAxis2() { let v = new oimo.common.Vec3(); v.x = this._basisX2X; v.y = this._basisX2Y; v.z = this._basisX2Z; return v; } getAxis1To(axis) { axis.x = this._basisX1X; axis.y = this._basisX1Y; axis.z = this._basisX1Z; } getAxis2To(axis) { axis.x = this._basisX2X; axis.y = this._basisX2Y; axis.z = this._basisX2Z; } getLocalAxis1() { let v = new oimo.common.Vec3(); v.x = this._localBasisX1X; v.y = this._localBasisX1Y; v.z = this._localBasisX1Z; return v; } getLocalAxis2() { let v = new oimo.common.Vec3(); v.x = this._localBasisX2X; v.y = this._localBasisX2Y; v.z = this._localBasisX2Z; return v; } getLocalAxis1To(axis) { axis.x = this._localBasisX1X; axis.y = this._localBasisX1Y; axis.z = this._localBasisX1Z; } getLocalAxis2To(axis) { axis.x = this._localBasisX2X; axis.y = this._localBasisX2Y; axis.z = this._localBasisX2Z; } getSpringDamper() { return this._sd; } getLimitMotor() { return this._lm; } getTranslation() { return this.translation; } } oimo.dynamics.constraint.joint.PrismaticJointConfig = class oimo_dynamics_constraint_joint_PrismaticJointConfig extends oimo.dynamics.constraint.joint.JointConfig { constructor() { super(); this.localAxis1 = new oimo.common.Vec3(1,0,0); this.localAxis2 = new oimo.common.Vec3(1,0,0); this.limitMotor = new oimo.dynamics.constraint.joint.TranslationalLimitMotor(); this.springDamper = new oimo.dynamics.constraint.joint.SpringDamper(); } init(rigidBody1,rigidBody2,worldAnchor,worldAxis) { this._init(rigidBody1,rigidBody2,worldAnchor); let localVector = this.localAxis1; let vX; let vY; let vZ; vX = worldAxis.x; vY = worldAxis.y; vZ = worldAxis.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = rigidBody1._transform._rotation00 * vX + rigidBody1._transform._rotation10 * vY + rigidBody1._transform._rotation20 * vZ; __tmp__Y = rigidBody1._transform._rotation01 * vX + rigidBody1._transform._rotation11 * vY + rigidBody1._transform._rotation21 * vZ; __tmp__Z = rigidBody1._transform._rotation02 * vX + rigidBody1._transform._rotation12 * vY + rigidBody1._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; localVector.x = vX; localVector.y = vY; localVector.z = vZ; let localVector1 = this.localAxis2; let vX1; let vY1; let vZ1; vX1 = worldAxis.x; vY1 = worldAxis.y; vZ1 = worldAxis.z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = rigidBody2._transform._rotation00 * vX1 + rigidBody2._transform._rotation10 * vY1 + rigidBody2._transform._rotation20 * vZ1; __tmp__Y1 = rigidBody2._transform._rotation01 * vX1 + rigidBody2._transform._rotation11 * vY1 + rigidBody2._transform._rotation21 * vZ1; __tmp__Z1 = rigidBody2._transform._rotation02 * vX1 + rigidBody2._transform._rotation12 * vY1 + rigidBody2._transform._rotation22 * vZ1; vX1 = __tmp__X1; vY1 = __tmp__Y1; vZ1 = __tmp__Z1; localVector1.x = vX1; localVector1.y = vY1; localVector1.z = vZ1; return this; } } oimo.dynamics.constraint.joint.RagdollJoint = class oimo_dynamics_constraint_joint_RagdollJoint extends oimo.dynamics.constraint.joint.Joint { constructor(config) { super(config,oimo.dynamics.constraint.joint.JointType.RAGDOLL); let v = config.localTwistAxis1; this._localBasisX1X = v.x; this._localBasisX1Y = v.y; this._localBasisX1Z = v.z; let v1 = config.localSwingAxis1; this._localBasisY1X = v1.x; this._localBasisY1Y = v1.y; this._localBasisY1Z = v1.z; let v2 = config.localTwistAxis2; this._localBasisX2X = v2.x; this._localBasisX2Y = v2.y; this._localBasisX2Z = v2.z; this.buildLocalBasesFromXY1X2(); this._twistSd = config.twistSpringDamper.clone(); this._twistLm = config.twistLimitMotor.clone(); this._swingSd = config.swingSpringDamper.clone(); this._maxSwingAngle1 = config.maxSwingAngle1; this._maxSwingAngle2 = config.maxSwingAngle2; if(this._maxSwingAngle1 < oimo.common.Setting.minRagdollMaxSwingAngle) { this._maxSwingAngle1 = oimo.common.Setting.minRagdollMaxSwingAngle; } if(this._maxSwingAngle2 < oimo.common.Setting.minRagdollMaxSwingAngle) { this._maxSwingAngle2 = oimo.common.Setting.minRagdollMaxSwingAngle; } this.dummySwingLm = new oimo.dynamics.constraint.joint.RotationalLimitMotor(); this.dummySwingLm.lowerLimit = -1; this.dummySwingLm.upperLimit = 0; this._swingAngle = 0; this._twistAngle = 0; this.swingError = 0; this.swingAxisX = 0; this.swingAxisY = 0; this.swingAxisZ = 0; this.twistAxisX = 0; this.twistAxisY = 0; this.twistAxisZ = 0; } getInfo(info,timeStep,isPositionPart) { let erp = this.getErp(timeStep,isPositionPart); let linearRhsX; let linearRhsY; let linearRhsZ; linearRhsX = this.linearErrorX * erp; linearRhsY = this.linearErrorY * erp; linearRhsZ = this.linearErrorZ * erp; let crossR100; let crossR101; let crossR102; let crossR110; let crossR111; let crossR112; let crossR120; let crossR121; let crossR122; let crossR200; let crossR201; let crossR202; let crossR210; let crossR211; let crossR212; let crossR220; let crossR221; let crossR222; crossR100 = 0; crossR101 = -this._relativeAnchor1Z; crossR102 = this._relativeAnchor1Y; crossR110 = this._relativeAnchor1Z; crossR111 = 0; crossR112 = -this._relativeAnchor1X; crossR120 = -this._relativeAnchor1Y; crossR121 = this._relativeAnchor1X; crossR122 = 0; crossR200 = 0; crossR201 = -this._relativeAnchor2Z; crossR202 = this._relativeAnchor2Y; crossR210 = this._relativeAnchor2Z; crossR211 = 0; crossR212 = -this._relativeAnchor2X; crossR220 = -this._relativeAnchor2Y; crossR221 = this._relativeAnchor2X; crossR222 = 0; crossR100 = -crossR100; crossR101 = -crossR101; crossR102 = -crossR102; crossR110 = -crossR110; crossR111 = -crossR111; crossR112 = -crossR112; crossR120 = -crossR120; crossR121 = -crossR121; crossR122 = -crossR122; crossR200 = -crossR200; crossR201 = -crossR201; crossR202 = -crossR202; crossR210 = -crossR210; crossR211 = -crossR211; crossR212 = -crossR212; crossR220 = -crossR220; crossR221 = -crossR221; crossR222 = -crossR222; let swingMass = this.computeEffectiveInertiaMoment(this.swingAxisX,this.swingAxisY,this.swingAxisZ); let twistMass = this.computeEffectiveInertiaMoment(this._basisX2X,this._basisX2Y,this._basisX2Z); let impulse = this._impulses[0]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; row.rhs = linearRhsX; row.cfm = 0; row.minImpulse = -1e65536; row.maxImpulse = 1e65536; let j = row.jacobian; j.lin1X = 1; j.lin1Y = 0; j.lin1Z = 0; j.lin2X = 1; j.lin2Y = 0; j.lin2Z = 0; j.ang1X = crossR100; j.ang1Y = crossR101; j.ang1Z = crossR102; j.ang2X = crossR200; j.ang2Y = crossR201; j.ang2Z = crossR202; let impulse1 = this._impulses[1]; let row1 = info.rows[info.numRows++]; let _this1 = row1.jacobian; _this1.lin1X = 0; _this1.lin1Y = 0; _this1.lin1Z = 0; _this1.lin2X = 0; _this1.lin2Y = 0; _this1.lin2Z = 0; _this1.ang1X = 0; _this1.ang1Y = 0; _this1.ang1Z = 0; _this1.ang2X = 0; _this1.ang2Y = 0; _this1.ang2Z = 0; row1.rhs = 0; row1.cfm = 0; row1.minImpulse = 0; row1.maxImpulse = 0; row1.motorSpeed = 0; row1.motorMaxImpulse = 0; row1.impulse = null; row1.impulse = impulse1; row1.rhs = linearRhsY; row1.cfm = 0; row1.minImpulse = -1e65536; row1.maxImpulse = 1e65536; j = row1.jacobian; j.lin1X = 0; j.lin1Y = 1; j.lin1Z = 0; j.lin2X = 0; j.lin2Y = 1; j.lin2Z = 0; j.ang1X = crossR110; j.ang1Y = crossR111; j.ang1Z = crossR112; j.ang2X = crossR210; j.ang2Y = crossR211; j.ang2Z = crossR212; let impulse2 = this._impulses[2]; let row2 = info.rows[info.numRows++]; let _this2 = row2.jacobian; _this2.lin1X = 0; _this2.lin1Y = 0; _this2.lin1Z = 0; _this2.lin2X = 0; _this2.lin2Y = 0; _this2.lin2Z = 0; _this2.ang1X = 0; _this2.ang1Y = 0; _this2.ang1Z = 0; _this2.ang2X = 0; _this2.ang2Y = 0; _this2.ang2Z = 0; row2.rhs = 0; row2.cfm = 0; row2.minImpulse = 0; row2.maxImpulse = 0; row2.motorSpeed = 0; row2.motorMaxImpulse = 0; row2.impulse = null; row2.impulse = impulse2; row2.rhs = linearRhsZ; row2.cfm = 0; row2.minImpulse = -1e65536; row2.maxImpulse = 1e65536; j = row2.jacobian; j.lin1X = 0; j.lin1Y = 0; j.lin1Z = 1; j.lin2X = 0; j.lin2Y = 0; j.lin2Z = 1; j.ang1X = crossR120; j.ang1Y = crossR121; j.ang1Z = crossR122; j.ang2X = crossR220; j.ang2Y = crossR221; j.ang2Z = crossR222; if(this.swingError > 0 && (this._swingSd.frequency <= 0 || !isPositionPart)) { let impulse = this._impulses[3]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowAngular(row,this.swingError,this.dummySwingLm,swingMass,this._swingSd,timeStep,isPositionPart); j = row.jacobian; j.ang1X = this.swingAxisX; j.ang1Y = this.swingAxisY; j.ang1Z = this.swingAxisZ; j.ang2X = this.swingAxisX; j.ang2Y = this.swingAxisY; j.ang2Z = this.swingAxisZ; } if(this._twistSd.frequency <= 0 || !isPositionPart) { let impulse = this._impulses[4]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowAngular(row,this._twistAngle,this._twistLm,twistMass,this._twistSd,timeStep,isPositionPart); j = row.jacobian; j.ang1X = this.twistAxisX; j.ang1Y = this.twistAxisY; j.ang1Z = this.twistAxisZ; j.ang2X = this.twistAxisX; j.ang2Y = this.twistAxisY; j.ang2Z = this.twistAxisZ; } } _syncAnchors() { super._syncAnchors(); let axis1X; let axis1Y; let axis1Z; let axis2X; let axis2Y; let axis2Z; axis1X = this._basisX1X; axis1Y = this._basisX1Y; axis1Z = this._basisX1Z; axis2X = this._basisX2X; axis2Y = this._basisX2Y; axis2Z = this._basisX2Z; let basis1Mat00; let basis1Mat01; let basis1Mat02; let basis1Mat10; let basis1Mat11; let basis1Mat12; let basis1Mat20; let basis1Mat21; let basis1Mat22; basis1Mat00 = this._basisX1X; basis1Mat01 = this._basisY1X; basis1Mat02 = this._basisZ1X; basis1Mat10 = this._basisX1Y; basis1Mat11 = this._basisY1Y; basis1Mat12 = this._basisZ1Y; basis1Mat20 = this._basisX1Z; basis1Mat21 = this._basisY1Z; basis1Mat22 = this._basisZ1Z; let swingQX; let swingQY; let swingQZ; let swingQW; let swingM00; let swingM01; let swingM02; let swingM10; let swingM11; let swingM12; let swingM20; let swingM21; let swingM22; let swingVX; let swingVY; let swingVZ; let d = axis1X * axis2X + axis1Y * axis2Y + axis1Z * axis2Z; if(d < -0.999999999) { let vX; let vY; let vZ; let x1 = axis1X; let y1 = axis1Y; let z1 = axis1Z; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); vX = 0; vY = z1 * d; vZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); vX = -z1 * d; vY = 0; vZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } swingQX = vX; swingQY = vY; swingQZ = vZ; swingQW = 0; } else { let cX; let cY; let cZ; cX = axis1Y * axis2Z - axis1Z * axis2Y; cY = axis1Z * axis2X - axis1X * axis2Z; cZ = axis1X * axis2Y - axis1Y * axis2X; let w = Math.sqrt((1 + d) * 0.5); d = 0.5 / w; cX *= d; cY *= d; cZ *= d; swingQX = cX; swingQY = cY; swingQZ = cZ; swingQW = w; } let x = swingQX; let y = swingQY; let z = swingQZ; let w = swingQW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; swingM00 = 1 - yy - zz; swingM01 = xy - wz; swingM02 = xz + wy; swingM10 = xy + wz; swingM11 = 1 - xx - zz; swingM12 = yz - wx; swingM20 = xz - wy; swingM21 = yz + wx; swingM22 = 1 - xx - yy; this._swingAngle = (swingQW <= -1 ? 3.14159265358979 : swingQW >= 1 ? 0 : Math.acos(swingQW)) * 2; swingVX = swingQX; swingVY = swingQY; swingVZ = swingQZ; let basisY2In1X; let basisY2In1Y; let basisY2In1Z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = swingM00 * this._basisY2X + swingM10 * this._basisY2Y + swingM20 * this._basisY2Z; __tmp__Y = swingM01 * this._basisY2X + swingM11 * this._basisY2Y + swingM21 * this._basisY2Z; __tmp__Z = swingM02 * this._basisY2X + swingM12 * this._basisY2Y + swingM22 * this._basisY2Z; basisY2In1X = __tmp__X; basisY2In1Y = __tmp__Y; basisY2In1Z = __tmp__Z; this._twistAngle = Math.atan2(this._basisZ1X * basisY2In1X + this._basisZ1Y * basisY2In1Y + this._basisZ1Z * basisY2In1Z,this._basisY1X * basisY2In1X + this._basisY1Y * basisY2In1Y + this._basisY1Z * basisY2In1Z); this.twistAxisX = this._basisX1X + this._basisX2X; this.twistAxisY = this._basisX1Y + this._basisX2Y; this.twistAxisZ = this._basisX1Z + this._basisX2Z; let l = this.twistAxisX * this.twistAxisX + this.twistAxisY * this.twistAxisY + this.twistAxisZ * this.twistAxisZ; if(l > 0) { l = 1 / Math.sqrt(l); } this.twistAxisX *= l; this.twistAxisY *= l; this.twistAxisZ *= l; let invLen = Math.sqrt(swingVX * swingVX + swingVY * swingVY + swingVZ * swingVZ); if(invLen > 0) { invLen = 1 / invLen; } swingVX *= invLen * this._swingAngle; swingVY *= invLen * this._swingAngle; swingVZ *= invLen * this._swingAngle; let __tmp__Y1; let __tmp__Z1; __tmp__Y1 = basis1Mat01 * swingVX + basis1Mat11 * swingVY + basis1Mat21 * swingVZ; __tmp__Z1 = basis1Mat02 * swingVX + basis1Mat12 * swingVY + basis1Mat22 * swingVZ; swingVY = __tmp__Y1; swingVZ = __tmp__Z1; let x1 = swingVY; let y1 = swingVZ; let a = this._maxSwingAngle1; let b = this._maxSwingAngle2; let invA2 = 1 / (a * a); let invB2 = 1 / (b * b); let w1 = x1 * x1 * invA2 + y1 * y1 * invB2; if(w1 == 0) { this.swingAxisX = 0; this.swingAxisY = 0; this.swingAxisZ = 0; this.swingError = 0; } else { let t = Math.sqrt(1 / w1); let x0 = x1 * t; let y0 = y1 * t; let nx = x0 * invA2; let ny = y0 * invB2; invLen = 1 / Math.sqrt(nx * nx + ny * ny); nx *= invLen; ny *= invLen; let depth = (x1 - x0) * nx + (y1 - y0) * ny; if(depth > 0) { this.swingError = depth; this.swingAxisX = 0; this.swingAxisY = nx; this.swingAxisZ = ny; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = basis1Mat00 * this.swingAxisX + basis1Mat01 * this.swingAxisY + basis1Mat02 * this.swingAxisZ; __tmp__Y = basis1Mat10 * this.swingAxisX + basis1Mat11 * this.swingAxisY + basis1Mat12 * this.swingAxisZ; __tmp__Z = basis1Mat20 * this.swingAxisX + basis1Mat21 * this.swingAxisY + basis1Mat22 * this.swingAxisZ; this.swingAxisX = __tmp__X; this.swingAxisY = __tmp__Y; this.swingAxisZ = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = swingM00 * this.swingAxisX + swingM01 * this.swingAxisY + swingM02 * this.swingAxisZ; __tmp__Y1 = swingM10 * this.swingAxisX + swingM11 * this.swingAxisY + swingM12 * this.swingAxisZ; __tmp__Z1 = swingM20 * this.swingAxisX + swingM21 * this.swingAxisY + swingM22 * this.swingAxisZ; this.swingAxisX = __tmp__X1; this.swingAxisY = __tmp__Y1; this.swingAxisZ = __tmp__Z1; } else { this.swingError = 0; } } this.linearErrorX = this._anchor2X - this._anchor1X; this.linearErrorY = this._anchor2Y - this._anchor1Y; this.linearErrorZ = this._anchor2Z - this._anchor1Z; } _getVelocitySolverInfo(timeStep,info) { super._getVelocitySolverInfo(timeStep,info); this.getInfo(info,timeStep,false); } _getPositionSolverInfo(info) { super._getPositionSolverInfo(info); this.getInfo(info,null,true); } getAxis1() { let v = new oimo.common.Vec3(); v.x = this._basisX1X; v.y = this._basisX1Y; v.z = this._basisX1Z; return v; } getAxis2() { let v = new oimo.common.Vec3(); v.x = this._basisX2X; v.y = this._basisX2Y; v.z = this._basisX2Z; return v; } getAxis1To(axis) { axis.x = this._basisX1X; axis.y = this._basisX1Y; axis.z = this._basisX1Z; } getAxis2To(axis) { axis.x = this._basisX2X; axis.y = this._basisX2Y; axis.z = this._basisX2Z; } getLocalAxis1() { let v = new oimo.common.Vec3(); v.x = this._localBasisX1X; v.y = this._localBasisX1Y; v.z = this._localBasisX1Z; return v; } getLocalAxis2() { let v = new oimo.common.Vec3(); v.x = this._localBasisX2X; v.y = this._localBasisX2Y; v.z = this._localBasisX2Z; return v; } getLocalAxis1To(axis) { axis.x = this._localBasisX1X; axis.y = this._localBasisX1Y; axis.z = this._localBasisX1Z; } getLocalAxis2To(axis) { axis.x = this._localBasisX2X; axis.y = this._localBasisX2Y; axis.z = this._localBasisX2Z; } getTwistSpringDamper() { return this._twistSd; } getTwistLimitMotor() { return this._twistLm; } getSwingSpringDamper() { return this._swingSd; } getSwingAxis() { let v = new oimo.common.Vec3(); v.x = this.swingAxisX; v.y = this.swingAxisY; v.z = this.swingAxisZ; return v; } getSwingAxisTo(axis) { axis.x = this.swingAxisX; axis.y = this.swingAxisY; axis.z = this.swingAxisZ; } getSwingAngle() { return this._swingAngle; } getTwistAngle() { return this._twistAngle; } } oimo.dynamics.constraint.joint.RagdollJointConfig = class oimo_dynamics_constraint_joint_RagdollJointConfig extends oimo.dynamics.constraint.joint.JointConfig { constructor() { super(); this.localTwistAxis1 = new oimo.common.Vec3(1,0,0); this.localTwistAxis2 = new oimo.common.Vec3(1,0,0); this.localSwingAxis1 = new oimo.common.Vec3(0,1,0); this.twistSpringDamper = new oimo.dynamics.constraint.joint.SpringDamper(); this.swingSpringDamper = new oimo.dynamics.constraint.joint.SpringDamper(); this.twistLimitMotor = new oimo.dynamics.constraint.joint.RotationalLimitMotor(); this.maxSwingAngle1 = 3.14159265358979; this.maxSwingAngle2 = 3.14159265358979; } init(rigidBody1,rigidBody2,worldAnchor,worldTwistAxis,worldSwingAxis) { this._init(rigidBody1,rigidBody2,worldAnchor); let localVector = this.localTwistAxis1; let vX; let vY; let vZ; vX = worldTwistAxis.x; vY = worldTwistAxis.y; vZ = worldTwistAxis.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = rigidBody1._transform._rotation00 * vX + rigidBody1._transform._rotation10 * vY + rigidBody1._transform._rotation20 * vZ; __tmp__Y = rigidBody1._transform._rotation01 * vX + rigidBody1._transform._rotation11 * vY + rigidBody1._transform._rotation21 * vZ; __tmp__Z = rigidBody1._transform._rotation02 * vX + rigidBody1._transform._rotation12 * vY + rigidBody1._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; localVector.x = vX; localVector.y = vY; localVector.z = vZ; let localVector1 = this.localTwistAxis2; let vX1; let vY1; let vZ1; vX1 = worldTwistAxis.x; vY1 = worldTwistAxis.y; vZ1 = worldTwistAxis.z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = rigidBody2._transform._rotation00 * vX1 + rigidBody2._transform._rotation10 * vY1 + rigidBody2._transform._rotation20 * vZ1; __tmp__Y1 = rigidBody2._transform._rotation01 * vX1 + rigidBody2._transform._rotation11 * vY1 + rigidBody2._transform._rotation21 * vZ1; __tmp__Z1 = rigidBody2._transform._rotation02 * vX1 + rigidBody2._transform._rotation12 * vY1 + rigidBody2._transform._rotation22 * vZ1; vX1 = __tmp__X1; vY1 = __tmp__Y1; vZ1 = __tmp__Z1; localVector1.x = vX1; localVector1.y = vY1; localVector1.z = vZ1; let localVector2 = this.localSwingAxis1; let vX2; let vY2; let vZ2; vX2 = worldSwingAxis.x; vY2 = worldSwingAxis.y; vZ2 = worldSwingAxis.z; let __tmp__X2; let __tmp__Y2; let __tmp__Z2; __tmp__X2 = rigidBody1._transform._rotation00 * vX2 + rigidBody1._transform._rotation10 * vY2 + rigidBody1._transform._rotation20 * vZ2; __tmp__Y2 = rigidBody1._transform._rotation01 * vX2 + rigidBody1._transform._rotation11 * vY2 + rigidBody1._transform._rotation21 * vZ2; __tmp__Z2 = rigidBody1._transform._rotation02 * vX2 + rigidBody1._transform._rotation12 * vY2 + rigidBody1._transform._rotation22 * vZ2; vX2 = __tmp__X2; vY2 = __tmp__Y2; vZ2 = __tmp__Z2; localVector2.x = vX2; localVector2.y = vY2; localVector2.z = vZ2; return this; } } oimo.dynamics.constraint.joint.RevoluteJoint = class oimo_dynamics_constraint_joint_RevoluteJoint extends oimo.dynamics.constraint.joint.Joint { constructor(config) { super(config,1); let v = config.localAxis1; this._localBasisX1X = v.x; this._localBasisX1Y = v.y; this._localBasisX1Z = v.z; let v1 = config.localAxis2; this._localBasisX2X = v1.x; this._localBasisX2Y = v1.y; this._localBasisX2Z = v1.z; this.buildLocalBasesFromX(); this.angle = 0; this.angularErrorY = 0; this.angularErrorZ = 0; this._basis = new oimo.dynamics.constraint.joint.BasisTracker(this); this._sd = config.springDamper.clone(); this._lm = config.limitMotor.clone(); } getInfo(info,timeStep,isPositionPart) { let erp = this.getErp(timeStep,isPositionPart); let linearRhsX; let linearRhsY; let linearRhsZ; linearRhsX = this.linearErrorX * erp; linearRhsY = this.linearErrorY * erp; linearRhsZ = this.linearErrorZ * erp; let angRhsY = this.angularErrorY * erp; let angRhsZ = this.angularErrorZ * erp; let crossR100; let crossR101; let crossR102; let crossR110; let crossR111; let crossR112; let crossR120; let crossR121; let crossR122; let crossR200; let crossR201; let crossR202; let crossR210; let crossR211; let crossR212; let crossR220; let crossR221; let crossR222; crossR100 = 0; crossR101 = -this._relativeAnchor1Z; crossR102 = this._relativeAnchor1Y; crossR110 = this._relativeAnchor1Z; crossR111 = 0; crossR112 = -this._relativeAnchor1X; crossR120 = -this._relativeAnchor1Y; crossR121 = this._relativeAnchor1X; crossR122 = 0; crossR200 = 0; crossR201 = -this._relativeAnchor2Z; crossR202 = this._relativeAnchor2Y; crossR210 = this._relativeAnchor2Z; crossR211 = 0; crossR212 = -this._relativeAnchor2X; crossR220 = -this._relativeAnchor2Y; crossR221 = this._relativeAnchor2X; crossR222 = 0; crossR100 = -crossR100; crossR101 = -crossR101; crossR102 = -crossR102; crossR110 = -crossR110; crossR111 = -crossR111; crossR112 = -crossR112; crossR120 = -crossR120; crossR121 = -crossR121; crossR122 = -crossR122; crossR200 = -crossR200; crossR201 = -crossR201; crossR202 = -crossR202; crossR210 = -crossR210; crossR211 = -crossR211; crossR212 = -crossR212; crossR220 = -crossR220; crossR221 = -crossR221; crossR222 = -crossR222; let motorMass = this.computeEffectiveInertiaMoment(this._basis.xX,this._basis.xY,this._basis.xZ); let impulse = this._impulses[0]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; row.rhs = linearRhsX; row.cfm = 0; row.minImpulse = -1e65536; row.maxImpulse = 1e65536; let j = row.jacobian; j.lin1X = 1; j.lin1Y = 0; j.lin1Z = 0; j.lin2X = 1; j.lin2Y = 0; j.lin2Z = 0; j.ang1X = crossR100; j.ang1Y = crossR101; j.ang1Z = crossR102; j.ang2X = crossR200; j.ang2Y = crossR201; j.ang2Z = crossR202; let impulse1 = this._impulses[1]; let row1 = info.rows[info.numRows++]; let _this1 = row1.jacobian; _this1.lin1X = 0; _this1.lin1Y = 0; _this1.lin1Z = 0; _this1.lin2X = 0; _this1.lin2Y = 0; _this1.lin2Z = 0; _this1.ang1X = 0; _this1.ang1Y = 0; _this1.ang1Z = 0; _this1.ang2X = 0; _this1.ang2Y = 0; _this1.ang2Z = 0; row1.rhs = 0; row1.cfm = 0; row1.minImpulse = 0; row1.maxImpulse = 0; row1.motorSpeed = 0; row1.motorMaxImpulse = 0; row1.impulse = null; row1.impulse = impulse1; row1.rhs = linearRhsY; row1.cfm = 0; row1.minImpulse = -1e65536; row1.maxImpulse = 1e65536; j = row1.jacobian; j.lin1X = 0; j.lin1Y = 1; j.lin1Z = 0; j.lin2X = 0; j.lin2Y = 1; j.lin2Z = 0; j.ang1X = crossR110; j.ang1Y = crossR111; j.ang1Z = crossR112; j.ang2X = crossR210; j.ang2Y = crossR211; j.ang2Z = crossR212; let impulse2 = this._impulses[2]; let row2 = info.rows[info.numRows++]; let _this2 = row2.jacobian; _this2.lin1X = 0; _this2.lin1Y = 0; _this2.lin1Z = 0; _this2.lin2X = 0; _this2.lin2Y = 0; _this2.lin2Z = 0; _this2.ang1X = 0; _this2.ang1Y = 0; _this2.ang1Z = 0; _this2.ang2X = 0; _this2.ang2Y = 0; _this2.ang2Z = 0; row2.rhs = 0; row2.cfm = 0; row2.minImpulse = 0; row2.maxImpulse = 0; row2.motorSpeed = 0; row2.motorMaxImpulse = 0; row2.impulse = null; row2.impulse = impulse2; row2.rhs = linearRhsZ; row2.cfm = 0; row2.minImpulse = -1e65536; row2.maxImpulse = 1e65536; j = row2.jacobian; j.lin1X = 0; j.lin1Y = 0; j.lin1Z = 1; j.lin2X = 0; j.lin2Y = 0; j.lin2Z = 1; j.ang1X = crossR120; j.ang1Y = crossR121; j.ang1Z = crossR122; j.ang2X = crossR220; j.ang2Y = crossR221; j.ang2Z = crossR222; if(this._sd.frequency <= 0 || !isPositionPart) { let impulse = this._impulses[3]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowAngular(row,this.angle,this._lm,motorMass,this._sd,timeStep,isPositionPart); j = row.jacobian; j.ang1X = this._basis.xX; j.ang1Y = this._basis.xY; j.ang1Z = this._basis.xZ; j.ang2X = this._basis.xX; j.ang2Y = this._basis.xY; j.ang2Z = this._basis.xZ; } let impulse3 = this._impulses[4]; let row3 = info.rows[info.numRows++]; let _this3 = row3.jacobian; _this3.lin1X = 0; _this3.lin1Y = 0; _this3.lin1Z = 0; _this3.lin2X = 0; _this3.lin2Y = 0; _this3.lin2Z = 0; _this3.ang1X = 0; _this3.ang1Y = 0; _this3.ang1Z = 0; _this3.ang2X = 0; _this3.ang2Y = 0; _this3.ang2Z = 0; row3.rhs = 0; row3.cfm = 0; row3.minImpulse = 0; row3.maxImpulse = 0; row3.motorSpeed = 0; row3.motorMaxImpulse = 0; row3.impulse = null; row3.impulse = impulse3; row3.rhs = angRhsY; row3.cfm = 0; row3.minImpulse = -1e65536; row3.maxImpulse = 1e65536; j = row3.jacobian; j.ang1X = this._basis.yX; j.ang1Y = this._basis.yY; j.ang1Z = this._basis.yZ; j.ang2X = this._basis.yX; j.ang2Y = this._basis.yY; j.ang2Z = this._basis.yZ; let impulse4 = this._impulses[5]; let row4 = info.rows[info.numRows++]; let _this4 = row4.jacobian; _this4.lin1X = 0; _this4.lin1Y = 0; _this4.lin1Z = 0; _this4.lin2X = 0; _this4.lin2Y = 0; _this4.lin2Z = 0; _this4.ang1X = 0; _this4.ang1Y = 0; _this4.ang1Z = 0; _this4.ang2X = 0; _this4.ang2Y = 0; _this4.ang2Z = 0; row4.rhs = 0; row4.cfm = 0; row4.minImpulse = 0; row4.maxImpulse = 0; row4.motorSpeed = 0; row4.motorMaxImpulse = 0; row4.impulse = null; row4.impulse = impulse4; row4.rhs = angRhsZ; row4.cfm = 0; row4.minImpulse = -1e65536; row4.maxImpulse = 1e65536; j = row4.jacobian; j.ang1X = this._basis.zX; j.ang1Y = this._basis.zY; j.ang1Z = this._basis.zZ; j.ang2X = this._basis.zX; j.ang2Y = this._basis.zY; j.ang2Z = this._basis.zZ; } _syncAnchors() { super._syncAnchors(); let _this = this._basis; let invM1 = _this.joint._b1._invMass; let invM2 = _this.joint._b2._invMass; let qX; let qY; let qZ; let qW; let idQX; let idQY; let idQZ; let idQW; let slerpQX; let slerpQY; let slerpQZ; let slerpQW; let slerpM00; let slerpM01; let slerpM02; let slerpM10; let slerpM11; let slerpM12; let slerpM20; let slerpM21; let slerpM22; let newXX; let newXY; let newXZ; let newYX; let newYY; let newYZ; let newZX; let newZY; let newZZ; let prevXX; let prevXY; let prevXZ; let prevYX; let prevYY; let prevYZ; let d = _this.joint._basisX1X * _this.joint._basisX2X + _this.joint._basisX1Y * _this.joint._basisX2Y + _this.joint._basisX1Z * _this.joint._basisX2Z; if(d < -0.999999999) { let vX; let vY; let vZ; let x1 = _this.joint._basisX1X; let y1 = _this.joint._basisX1Y; let z1 = _this.joint._basisX1Z; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); vX = 0; vY = z1 * d; vZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); vX = -z1 * d; vY = 0; vZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } qX = vX; qY = vY; qZ = vZ; qW = 0; } else { let cX; let cY; let cZ; cX = _this.joint._basisX1Y * _this.joint._basisX2Z - _this.joint._basisX1Z * _this.joint._basisX2Y; cY = _this.joint._basisX1Z * _this.joint._basisX2X - _this.joint._basisX1X * _this.joint._basisX2Z; cZ = _this.joint._basisX1X * _this.joint._basisX2Y - _this.joint._basisX1Y * _this.joint._basisX2X; let w = Math.sqrt((1 + d) * 0.5); d = 0.5 / w; cX *= d; cY *= d; cZ *= d; qX = cX; qY = cY; qZ = cZ; qW = w; } idQX = 0; idQY = 0; idQZ = 0; idQW = 1; let q1X; let q1Y; let q1Z; let q1W; let q2X; let q2Y; let q2Z; let q2W; q1X = idQX; q1Y = idQY; q1Z = idQZ; q1W = idQW; q2X = qX; q2Y = qY; q2Z = qZ; q2W = qW; let d1 = q1X * q2X + q1Y * q2Y + q1Z * q2Z + q1W * q2W; if(d1 < 0) { d1 = -d1; q2X = -q2X; q2Y = -q2Y; q2Z = -q2Z; q2W = -q2W; } if(d1 > 0.999999) { let dqX; let dqY; let dqZ; let dqW; dqX = q2X - q1X; dqY = q2Y - q1Y; dqZ = q2Z - q1Z; dqW = q2W - q1W; q2X = q1X + dqX * (invM1 / (invM1 + invM2)); q2Y = q1Y + dqY * (invM1 / (invM1 + invM2)); q2Z = q1Z + dqZ * (invM1 / (invM1 + invM2)); q2W = q1W + dqW * (invM1 / (invM1 + invM2)); let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W; if(l > 1e-32) { l = 1 / Math.sqrt(l); } slerpQX = q2X * l; slerpQY = q2Y * l; slerpQZ = q2Z * l; slerpQW = q2W * l; } else { let theta = invM1 / (invM1 + invM2) * Math.acos(d1); q2X += q1X * -d1; q2Y += q1Y * -d1; q2Z += q1Z * -d1; q2W += q1W * -d1; let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W; if(l > 1e-32) { l = 1 / Math.sqrt(l); } q2X *= l; q2Y *= l; q2Z *= l; q2W *= l; let sin = Math.sin(theta); let cos = Math.cos(theta); q1X *= cos; q1Y *= cos; q1Z *= cos; q1W *= cos; slerpQX = q1X + q2X * sin; slerpQY = q1Y + q2Y * sin; slerpQZ = q1Z + q2Z * sin; slerpQW = q1W + q2W * sin; } let x = slerpQX; let y = slerpQY; let z = slerpQZ; let w = slerpQW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; slerpM00 = 1 - yy - zz; slerpM01 = xy - wz; slerpM02 = xz + wy; slerpM10 = xy + wz; slerpM11 = 1 - xx - zz; slerpM12 = yz - wx; slerpM20 = xz - wy; slerpM21 = yz + wx; slerpM22 = 1 - xx - yy; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = slerpM00 * _this.joint._basisX1X + slerpM01 * _this.joint._basisX1Y + slerpM02 * _this.joint._basisX1Z; __tmp__Y = slerpM10 * _this.joint._basisX1X + slerpM11 * _this.joint._basisX1Y + slerpM12 * _this.joint._basisX1Z; __tmp__Z = slerpM20 * _this.joint._basisX1X + slerpM21 * _this.joint._basisX1Y + slerpM22 * _this.joint._basisX1Z; newXX = __tmp__X; newXY = __tmp__Y; newXZ = __tmp__Z; prevXX = _this.xX; prevXY = _this.xY; prevXZ = _this.xZ; prevYX = _this.yX; prevYY = _this.yY; prevYZ = _this.yZ; let d2 = prevXX * newXX + prevXY * newXY + prevXZ * newXZ; if(d2 < -0.999999999) { let vX; let vY; let vZ; let x1 = prevXX; let y1 = prevXY; let z1 = prevXZ; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); vX = 0; vY = z1 * d; vZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); vX = -z1 * d; vY = 0; vZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); vX = y1 * d; vY = -x1 * d; vZ = 0; } slerpQX = vX; slerpQY = vY; slerpQZ = vZ; slerpQW = 0; } else { let cX; let cY; let cZ; cX = prevXY * newXZ - prevXZ * newXY; cY = prevXZ * newXX - prevXX * newXZ; cZ = prevXX * newXY - prevXY * newXX; let w = Math.sqrt((1 + d2) * 0.5); d2 = 0.5 / w; cX *= d2; cY *= d2; cZ *= d2; slerpQX = cX; slerpQY = cY; slerpQZ = cZ; slerpQW = w; } let x1 = slerpQX; let y1 = slerpQY; let z1 = slerpQZ; let w1 = slerpQW; let x21 = 2 * x1; let y21 = 2 * y1; let z21 = 2 * z1; let xx1 = x1 * x21; let yy1 = y1 * y21; let zz1 = z1 * z21; let xy1 = x1 * y21; let yz1 = y1 * z21; let xz1 = x1 * z21; let wx1 = w1 * x21; let wy1 = w1 * y21; let wz1 = w1 * z21; slerpM00 = 1 - yy1 - zz1; slerpM01 = xy1 - wz1; slerpM02 = xz1 + wy1; slerpM10 = xy1 + wz1; slerpM11 = 1 - xx1 - zz1; slerpM12 = yz1 - wx1; slerpM20 = xz1 - wy1; slerpM21 = yz1 + wx1; slerpM22 = 1 - xx1 - yy1; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = slerpM00 * prevYX + slerpM01 * prevYY + slerpM02 * prevYZ; __tmp__Y1 = slerpM10 * prevYX + slerpM11 * prevYY + slerpM12 * prevYZ; __tmp__Z1 = slerpM20 * prevYX + slerpM21 * prevYY + slerpM22 * prevYZ; newYX = __tmp__X1; newYY = __tmp__Y1; newYZ = __tmp__Z1; newZX = newXY * newYZ - newXZ * newYY; newZY = newXZ * newYX - newXX * newYZ; newZZ = newXX * newYY - newXY * newYX; if(newZX * newZX + newZY * newZY + newZZ * newZZ > 1e-6) { let l = newZX * newZX + newZY * newZY + newZZ * newZZ; if(l > 0) { l = 1 / Math.sqrt(l); } newZX *= l; newZY *= l; newZZ *= l; } else { let x1 = newXX; let y1 = newXY; let z1 = newXZ; let x2 = x1 * x1; let y2 = y1 * y1; let z2 = z1 * z1; let d; if(x2 < y2) { if(x2 < z2) { d = 1 / Math.sqrt(y2 + z2); newZX = 0; newZY = z1 * d; newZZ = -y1 * d; } else { d = 1 / Math.sqrt(x2 + y2); newZX = y1 * d; newZY = -x1 * d; newZZ = 0; } } else if(y2 < z2) { d = 1 / Math.sqrt(z2 + x2); newZX = -z1 * d; newZY = 0; newZZ = x1 * d; } else { d = 1 / Math.sqrt(x2 + y2); newZX = y1 * d; newZY = -x1 * d; newZZ = 0; } } newYX = newZY * newXZ - newZZ * newXY; newYY = newZZ * newXX - newZX * newXZ; newYZ = newZX * newXY - newZY * newXX; _this.xX = newXX; _this.xY = newXY; _this.xZ = newXZ; _this.yX = newYX; _this.yY = newYY; _this.yZ = newYZ; _this.zX = newZX; _this.zY = newZY; _this.zZ = newZZ; let angErrorX; let angErrorY; let angErrorZ; angErrorX = this._basisX1Y * this._basisX2Z - this._basisX1Z * this._basisX2Y; angErrorY = this._basisX1Z * this._basisX2X - this._basisX1X * this._basisX2Z; angErrorZ = this._basisX1X * this._basisX2Y - this._basisX1Y * this._basisX2X; let cos = this._basisX1X * this._basisX2X + this._basisX1Y * this._basisX2Y + this._basisX1Z * this._basisX2Z; let theta = cos <= -1 ? 3.14159265358979 : cos >= 1 ? 0 : Math.acos(cos); let l = angErrorX * angErrorX + angErrorY * angErrorY + angErrorZ * angErrorZ; if(l > 0) { l = 1 / Math.sqrt(l); } angErrorX *= l; angErrorY *= l; angErrorZ *= l; angErrorX *= theta; angErrorY *= theta; angErrorZ *= theta; this.angularErrorY = angErrorX * this._basis.yX + angErrorY * this._basis.yY + angErrorZ * this._basis.yZ; this.angularErrorZ = angErrorX * this._basis.zX + angErrorY * this._basis.zY + angErrorZ * this._basis.zZ; let perpCrossX; let perpCrossY; let perpCrossZ; perpCrossX = this._basisY1Y * this._basisY2Z - this._basisY1Z * this._basisY2Y; perpCrossY = this._basisY1Z * this._basisY2X - this._basisY1X * this._basisY2Z; perpCrossZ = this._basisY1X * this._basisY2Y - this._basisY1Y * this._basisY2X; cos = this._basisY1X * this._basisY2X + this._basisY1Y * this._basisY2Y + this._basisY1Z * this._basisY2Z; this.angle = cos <= -1 ? 3.14159265358979 : cos >= 1 ? 0 : Math.acos(cos); if(perpCrossX * this._basis.xX + perpCrossY * this._basis.xY + perpCrossZ * this._basis.xZ < 0) { this.angle = -this.angle; } this.linearErrorX = this._anchor2X - this._anchor1X; this.linearErrorY = this._anchor2Y - this._anchor1Y; this.linearErrorZ = this._anchor2Z - this._anchor1Z; } _getVelocitySolverInfo(timeStep,info) { super._getVelocitySolverInfo(timeStep,info); this.getInfo(info,timeStep,false); } _getPositionSolverInfo(info) { super._getPositionSolverInfo(info); this.getInfo(info,null,true); } getAxis1() { let v = new oimo.common.Vec3(); v.x = this._basisX1X; v.y = this._basisX1Y; v.z = this._basisX1Z; return v; } getAxis2() { let v = new oimo.common.Vec3(); v.x = this._basisX2X; v.y = this._basisX2Y; v.z = this._basisX2Z; return v; } getAxis1To(axis) { axis.x = this._basisX1X; axis.y = this._basisX1Y; axis.z = this._basisX1Z; } getAxis2To(axis) { axis.x = this._basisX2X; axis.y = this._basisX2Y; axis.z = this._basisX2Z; } getLocalAxis1() { let v = new oimo.common.Vec3(); v.x = this._localBasisX1X; v.y = this._localBasisX1Y; v.z = this._localBasisX1Z; return v; } getLocalAxis2() { let v = new oimo.common.Vec3(); v.x = this._localBasisX2X; v.y = this._localBasisX2Y; v.z = this._localBasisX2Z; return v; } getLocalAxis1To(axis) { axis.x = this._localBasisX1X; axis.y = this._localBasisX1Y; axis.z = this._localBasisX1Z; } getLocalAxis2To(axis) { axis.x = this._localBasisX2X; axis.y = this._localBasisX2Y; axis.z = this._localBasisX2Z; } getSpringDamper() { return this._sd; } getLimitMotor() { return this._lm; } getAngle() { return this.angle; } } oimo.dynamics.constraint.joint.RevoluteJointConfig = class oimo_dynamics_constraint_joint_RevoluteJointConfig extends oimo.dynamics.constraint.joint.JointConfig { constructor() { super(); this.localAxis1 = new oimo.common.Vec3(1,0,0); this.localAxis2 = new oimo.common.Vec3(1,0,0); this.springDamper = new oimo.dynamics.constraint.joint.SpringDamper(); this.limitMotor = new oimo.dynamics.constraint.joint.RotationalLimitMotor(); } init(rigidBody1,rigidBody2,worldAnchor,worldAxis) { this._init(rigidBody1,rigidBody2,worldAnchor); let localVector = this.localAxis1; let vX; let vY; let vZ; vX = worldAxis.x; vY = worldAxis.y; vZ = worldAxis.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = rigidBody1._transform._rotation00 * vX + rigidBody1._transform._rotation10 * vY + rigidBody1._transform._rotation20 * vZ; __tmp__Y = rigidBody1._transform._rotation01 * vX + rigidBody1._transform._rotation11 * vY + rigidBody1._transform._rotation21 * vZ; __tmp__Z = rigidBody1._transform._rotation02 * vX + rigidBody1._transform._rotation12 * vY + rigidBody1._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; localVector.x = vX; localVector.y = vY; localVector.z = vZ; let localVector1 = this.localAxis2; let vX1; let vY1; let vZ1; vX1 = worldAxis.x; vY1 = worldAxis.y; vZ1 = worldAxis.z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = rigidBody2._transform._rotation00 * vX1 + rigidBody2._transform._rotation10 * vY1 + rigidBody2._transform._rotation20 * vZ1; __tmp__Y1 = rigidBody2._transform._rotation01 * vX1 + rigidBody2._transform._rotation11 * vY1 + rigidBody2._transform._rotation21 * vZ1; __tmp__Z1 = rigidBody2._transform._rotation02 * vX1 + rigidBody2._transform._rotation12 * vY1 + rigidBody2._transform._rotation22 * vZ1; vX1 = __tmp__X1; vY1 = __tmp__Y1; vZ1 = __tmp__Z1; localVector1.x = vX1; localVector1.y = vY1; localVector1.z = vZ1; return this; } } oimo.dynamics.constraint.joint.RotationalLimitMotor = class oimo_dynamics_constraint_joint_RotationalLimitMotor { constructor() { this.lowerLimit = 1; this.upperLimit = 0; this.motorTorque = 0; } setLimits(lower,upper) { this.lowerLimit = lower; this.upperLimit = upper; return this; } setMotor(speed,torque) { this.motorSpeed = speed; this.motorTorque = torque; return this; } clone() { let lm = new oimo.dynamics.constraint.joint.RotationalLimitMotor(); lm.lowerLimit = this.lowerLimit; lm.upperLimit = this.upperLimit; lm.motorSpeed = this.motorSpeed; lm.motorTorque = this.motorTorque; return lm; } } oimo.dynamics.constraint.joint.SphericalJoint = class oimo_dynamics_constraint_joint_SphericalJoint extends oimo.dynamics.constraint.joint.Joint { constructor(config) { super(config,0); this._sd = config.springDamper.clone(); } getInfo(info,timeStep,isPositionPart) { if(this._sd.frequency > 0 && isPositionPart) { return; } let errorX; let errorY; let errorZ; errorX = this._anchor2X - this._anchor1X; errorY = this._anchor2Y - this._anchor1Y; errorZ = this._anchor2Z - this._anchor1Z; let cfm; let erp; if(this._sd.frequency > 0) { let omega = 6.28318530717958 * this._sd.frequency; let zeta = this._sd.dampingRatio; if(zeta < oimo.common.Setting.minSpringDamperDampingRatio) { zeta = oimo.common.Setting.minSpringDamperDampingRatio; } let h = timeStep.dt; let c = 2 * zeta * omega; let k = omega * omega; if(this._sd.useSymplecticEuler) { cfm = 1 / (h * c); erp = k / c; } else { cfm = 1 / (h * (h * k + c)); erp = k / (h * k + c); } cfm *= this._b1._invMass + this._b2._invMass; } else { cfm = 0; erp = this.getErp(timeStep,isPositionPart); } let linearRhsX; let linearRhsY; let linearRhsZ; linearRhsX = errorX * erp; linearRhsY = errorY * erp; linearRhsZ = errorZ * erp; let crossR100; let crossR101; let crossR102; let crossR110; let crossR111; let crossR112; let crossR120; let crossR121; let crossR122; let crossR200; let crossR201; let crossR202; let crossR210; let crossR211; let crossR212; let crossR220; let crossR221; let crossR222; crossR100 = 0; crossR101 = -this._relativeAnchor1Z; crossR102 = this._relativeAnchor1Y; crossR110 = this._relativeAnchor1Z; crossR111 = 0; crossR112 = -this._relativeAnchor1X; crossR120 = -this._relativeAnchor1Y; crossR121 = this._relativeAnchor1X; crossR122 = 0; crossR200 = 0; crossR201 = -this._relativeAnchor2Z; crossR202 = this._relativeAnchor2Y; crossR210 = this._relativeAnchor2Z; crossR211 = 0; crossR212 = -this._relativeAnchor2X; crossR220 = -this._relativeAnchor2Y; crossR221 = this._relativeAnchor2X; crossR222 = 0; crossR100 = -crossR100; crossR101 = -crossR101; crossR102 = -crossR102; crossR110 = -crossR110; crossR111 = -crossR111; crossR112 = -crossR112; crossR120 = -crossR120; crossR121 = -crossR121; crossR122 = -crossR122; crossR200 = -crossR200; crossR201 = -crossR201; crossR202 = -crossR202; crossR210 = -crossR210; crossR211 = -crossR211; crossR212 = -crossR212; crossR220 = -crossR220; crossR221 = -crossR221; crossR222 = -crossR222; let impulse = this._impulses[0]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; row.rhs = linearRhsX; row.cfm = cfm; row.minImpulse = -1e65536; row.maxImpulse = 1e65536; let j = row.jacobian; j.lin1X = 1; j.lin1Y = 0; j.lin1Z = 0; j.lin2X = 1; j.lin2Y = 0; j.lin2Z = 0; j.ang1X = crossR100; j.ang1Y = crossR101; j.ang1Z = crossR102; j.ang2X = crossR200; j.ang2Y = crossR201; j.ang2Z = crossR202; let impulse1 = this._impulses[1]; let row1 = info.rows[info.numRows++]; let _this1 = row1.jacobian; _this1.lin1X = 0; _this1.lin1Y = 0; _this1.lin1Z = 0; _this1.lin2X = 0; _this1.lin2Y = 0; _this1.lin2Z = 0; _this1.ang1X = 0; _this1.ang1Y = 0; _this1.ang1Z = 0; _this1.ang2X = 0; _this1.ang2Y = 0; _this1.ang2Z = 0; row1.rhs = 0; row1.cfm = 0; row1.minImpulse = 0; row1.maxImpulse = 0; row1.motorSpeed = 0; row1.motorMaxImpulse = 0; row1.impulse = null; row1.impulse = impulse1; row1.rhs = linearRhsY; row1.cfm = cfm; row1.minImpulse = -1e65536; row1.maxImpulse = 1e65536; j = row1.jacobian; j.lin1X = 0; j.lin1Y = 1; j.lin1Z = 0; j.lin2X = 0; j.lin2Y = 1; j.lin2Z = 0; j.ang1X = crossR110; j.ang1Y = crossR111; j.ang1Z = crossR112; j.ang2X = crossR210; j.ang2Y = crossR211; j.ang2Z = crossR212; let impulse2 = this._impulses[2]; let row2 = info.rows[info.numRows++]; let _this2 = row2.jacobian; _this2.lin1X = 0; _this2.lin1Y = 0; _this2.lin1Z = 0; _this2.lin2X = 0; _this2.lin2Y = 0; _this2.lin2Z = 0; _this2.ang1X = 0; _this2.ang1Y = 0; _this2.ang1Z = 0; _this2.ang2X = 0; _this2.ang2Y = 0; _this2.ang2Z = 0; row2.rhs = 0; row2.cfm = 0; row2.minImpulse = 0; row2.maxImpulse = 0; row2.motorSpeed = 0; row2.motorMaxImpulse = 0; row2.impulse = null; row2.impulse = impulse2; row2.rhs = linearRhsZ; row2.cfm = cfm; row2.minImpulse = -1e65536; row2.maxImpulse = 1e65536; j = row2.jacobian; j.lin1X = 0; j.lin1Y = 0; j.lin1Z = 1; j.lin2X = 0; j.lin2Y = 0; j.lin2Z = 1; j.ang1X = crossR120; j.ang1Y = crossR121; j.ang1Z = crossR122; j.ang2X = crossR220; j.ang2Y = crossR221; j.ang2Z = crossR222; } _getVelocitySolverInfo(timeStep,info) { super._getVelocitySolverInfo(timeStep,info); this.getInfo(info,timeStep,false); } _getPositionSolverInfo(info) { super._getPositionSolverInfo(info); this.getInfo(info,null,true); } getSpringDamper() { return this._sd; } } oimo.dynamics.constraint.joint.SphericalJointConfig = class oimo_dynamics_constraint_joint_SphericalJointConfig extends oimo.dynamics.constraint.joint.JointConfig { constructor() { super(); this.springDamper = new oimo.dynamics.constraint.joint.SpringDamper(); } init(rigidBody1,rigidBody2,worldAnchor) { this._init(rigidBody1,rigidBody2,worldAnchor); return this; } } oimo.dynamics.constraint.joint.SpringDamper = class oimo_dynamics_constraint_joint_SpringDamper { constructor() { this.frequency = 0; this.dampingRatio = 0; this.useSymplecticEuler = false; } setSpring(frequency,dampingRatio) { this.frequency = frequency; this.dampingRatio = dampingRatio; return this; } setSymplecticEuler(useSymplecticEuler) { this.useSymplecticEuler = useSymplecticEuler; return this; } clone() { let sd = new oimo.dynamics.constraint.joint.SpringDamper(); sd.frequency = this.frequency; sd.dampingRatio = this.dampingRatio; sd.useSymplecticEuler = this.useSymplecticEuler; return sd; } } oimo.dynamics.constraint.joint.TranslationalLimitMotor = class oimo_dynamics_constraint_joint_TranslationalLimitMotor { constructor() { this.lowerLimit = 1; this.upperLimit = 0; this.motorForce = 0; } setLimits(lower,upper) { this.lowerLimit = lower; this.upperLimit = upper; return this; } setMotor(speed,force) { this.motorSpeed = speed; this.motorForce = force; return this; } clone() { let lm = new oimo.dynamics.constraint.joint.TranslationalLimitMotor(); lm.lowerLimit = this.lowerLimit; lm.upperLimit = this.upperLimit; lm.motorSpeed = this.motorSpeed; lm.motorForce = this.motorForce; return lm; } } oimo.dynamics.constraint.joint.UniversalJoint = class oimo_dynamics_constraint_joint_UniversalJoint extends oimo.dynamics.constraint.joint.Joint { constructor(config) { super(config,oimo.dynamics.constraint.joint.JointType.UNIVERSAL); let v = config.localAxis1; this._localBasisX1X = v.x; this._localBasisX1Y = v.y; this._localBasisX1Z = v.z; let v1 = config.localAxis2; this._localBasisZ2X = v1.x; this._localBasisZ2Y = v1.y; this._localBasisZ2Z = v1.z; this.buildLocalBasesFromX1Z2(); this._angleX = 0; this._angleY = 0; this._angleZ = 0; this.xSingular = false; this.ySingular = false; this.zSingular = false; this._sd1 = config.springDamper1.clone(); this._sd2 = config.springDamper2.clone(); this._lm1 = config.limitMotor1.clone(); this._lm2 = config.limitMotor2.clone(); } getInfo(info,timeStep,isPositionPart) { let erp = this.getErp(timeStep,isPositionPart); let linearRhsX; let linearRhsY; let linearRhsZ; linearRhsX = this.linearErrorX * erp; linearRhsY = this.linearErrorY * erp; linearRhsZ = this.linearErrorZ * erp; let angRhsY = this._angleY * erp; let crossR100; let crossR101; let crossR102; let crossR110; let crossR111; let crossR112; let crossR120; let crossR121; let crossR122; let crossR200; let crossR201; let crossR202; let crossR210; let crossR211; let crossR212; let crossR220; let crossR221; let crossR222; crossR100 = 0; crossR101 = -this._relativeAnchor1Z; crossR102 = this._relativeAnchor1Y; crossR110 = this._relativeAnchor1Z; crossR111 = 0; crossR112 = -this._relativeAnchor1X; crossR120 = -this._relativeAnchor1Y; crossR121 = this._relativeAnchor1X; crossR122 = 0; crossR200 = 0; crossR201 = -this._relativeAnchor2Z; crossR202 = this._relativeAnchor2Y; crossR210 = this._relativeAnchor2Z; crossR211 = 0; crossR212 = -this._relativeAnchor2X; crossR220 = -this._relativeAnchor2Y; crossR221 = this._relativeAnchor2X; crossR222 = 0; crossR100 = -crossR100; crossR101 = -crossR101; crossR102 = -crossR102; crossR110 = -crossR110; crossR111 = -crossR111; crossR112 = -crossR112; crossR120 = -crossR120; crossR121 = -crossR121; crossR122 = -crossR122; crossR200 = -crossR200; crossR201 = -crossR201; crossR202 = -crossR202; crossR210 = -crossR210; crossR211 = -crossR211; crossR212 = -crossR212; crossR220 = -crossR220; crossR221 = -crossR221; crossR222 = -crossR222; let motorMassX = this.computeEffectiveInertiaMoment(this._axisXX,this._axisXY,this._axisXZ); let motorMassZ = this.computeEffectiveInertiaMoment(this._axisZX,this._axisZY,this._axisZZ); let impulse = this._impulses[0]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; row.rhs = linearRhsX; row.cfm = 0; row.minImpulse = -1e65536; row.maxImpulse = 1e65536; let j = row.jacobian; j.lin1X = 1; j.lin1Y = 0; j.lin1Z = 0; j.lin2X = 1; j.lin2Y = 0; j.lin2Z = 0; j.ang1X = crossR100; j.ang1Y = crossR101; j.ang1Z = crossR102; j.ang2X = crossR200; j.ang2Y = crossR201; j.ang2Z = crossR202; let impulse1 = this._impulses[1]; let row1 = info.rows[info.numRows++]; let _this1 = row1.jacobian; _this1.lin1X = 0; _this1.lin1Y = 0; _this1.lin1Z = 0; _this1.lin2X = 0; _this1.lin2Y = 0; _this1.lin2Z = 0; _this1.ang1X = 0; _this1.ang1Y = 0; _this1.ang1Z = 0; _this1.ang2X = 0; _this1.ang2Y = 0; _this1.ang2Z = 0; row1.rhs = 0; row1.cfm = 0; row1.minImpulse = 0; row1.maxImpulse = 0; row1.motorSpeed = 0; row1.motorMaxImpulse = 0; row1.impulse = null; row1.impulse = impulse1; row1.rhs = linearRhsY; row1.cfm = 0; row1.minImpulse = -1e65536; row1.maxImpulse = 1e65536; j = row1.jacobian; j.lin1X = 0; j.lin1Y = 1; j.lin1Z = 0; j.lin2X = 0; j.lin2Y = 1; j.lin2Z = 0; j.ang1X = crossR110; j.ang1Y = crossR111; j.ang1Z = crossR112; j.ang2X = crossR210; j.ang2Y = crossR211; j.ang2Z = crossR212; let impulse2 = this._impulses[2]; let row2 = info.rows[info.numRows++]; let _this2 = row2.jacobian; _this2.lin1X = 0; _this2.lin1Y = 0; _this2.lin1Z = 0; _this2.lin2X = 0; _this2.lin2Y = 0; _this2.lin2Z = 0; _this2.ang1X = 0; _this2.ang1Y = 0; _this2.ang1Z = 0; _this2.ang2X = 0; _this2.ang2Y = 0; _this2.ang2Z = 0; row2.rhs = 0; row2.cfm = 0; row2.minImpulse = 0; row2.maxImpulse = 0; row2.motorSpeed = 0; row2.motorMaxImpulse = 0; row2.impulse = null; row2.impulse = impulse2; row2.rhs = linearRhsZ; row2.cfm = 0; row2.minImpulse = -1e65536; row2.maxImpulse = 1e65536; j = row2.jacobian; j.lin1X = 0; j.lin1Y = 0; j.lin1Z = 1; j.lin2X = 0; j.lin2Y = 0; j.lin2Z = 1; j.ang1X = crossR120; j.ang1Y = crossR121; j.ang1Z = crossR122; j.ang2X = crossR220; j.ang2Y = crossR221; j.ang2Z = crossR222; if(!this.xSingular && (this._sd1.frequency <= 0 || !isPositionPart)) { let impulse = this._impulses[3]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowAngular(row,this._angleX,this._lm1,motorMassX,this._sd1,timeStep,isPositionPart); j = row.jacobian; j.ang1X = this._axisXX; j.ang1Y = this._axisXY; j.ang1Z = this._axisXZ; j.ang2X = this._axisXX; j.ang2Y = this._axisXY; j.ang2Z = this._axisXZ; } if(!this.ySingular) { let impulse = this._impulses[4]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; row.rhs = angRhsY; row.cfm = 0; row.minImpulse = -1e65536; row.maxImpulse = 1e65536; j = row.jacobian; j.ang1X = this._axisYX; j.ang1Y = this._axisYY; j.ang1Z = this._axisYZ; j.ang2X = this._axisYX; j.ang2Y = this._axisYY; j.ang2Z = this._axisYZ; } if(!this.zSingular && (this._sd2.frequency <= 0 || !isPositionPart)) { let impulse = this._impulses[5]; let row = info.rows[info.numRows++]; let _this = row.jacobian; _this.lin1X = 0; _this.lin1Y = 0; _this.lin1Z = 0; _this.lin2X = 0; _this.lin2Y = 0; _this.lin2Z = 0; _this.ang1X = 0; _this.ang1Y = 0; _this.ang1Z = 0; _this.ang2X = 0; _this.ang2Y = 0; _this.ang2Z = 0; row.rhs = 0; row.cfm = 0; row.minImpulse = 0; row.maxImpulse = 0; row.motorSpeed = 0; row.motorMaxImpulse = 0; row.impulse = null; row.impulse = impulse; this.setSolverInfoRowAngular(row,this._angleZ,this._lm2,motorMassZ,this._sd2,timeStep,isPositionPart); j = row.jacobian; j.ang1X = this._axisZX; j.ang1Y = this._axisZY; j.ang1Z = this._axisZZ; j.ang2X = this._axisZX; j.ang2Y = this._axisZY; j.ang2Z = this._axisZZ; } } _syncAnchors() { super._syncAnchors(); let angleAxisXX; let angleAxisXY; let angleAxisXZ; let angleAxisYX; let angleAxisYY; let angleAxisYZ; let angleAxisZX; let angleAxisZY; let angleAxisZZ; angleAxisXX = this._basisX1X; angleAxisXY = this._basisX1Y; angleAxisXZ = this._basisX1Z; angleAxisZX = this._basisZ2X; angleAxisZY = this._basisZ2Y; angleAxisZZ = this._basisZ2Z; angleAxisYX = angleAxisZY * angleAxisXZ - angleAxisZZ * angleAxisXY; angleAxisYY = angleAxisZZ * angleAxisXX - angleAxisZX * angleAxisXZ; angleAxisYZ = angleAxisZX * angleAxisXY - angleAxisZY * angleAxisXX; this._axisXX = angleAxisYY * angleAxisZZ - angleAxisYZ * angleAxisZY; this._axisXY = angleAxisYZ * angleAxisZX - angleAxisYX * angleAxisZZ; this._axisXZ = angleAxisYX * angleAxisZY - angleAxisYY * angleAxisZX; this._axisYX = angleAxisYX; this._axisYY = angleAxisYY; this._axisYZ = angleAxisYZ; this._axisZX = angleAxisXY * angleAxisYZ - angleAxisXZ * angleAxisYY; this._axisZY = angleAxisXZ * angleAxisYX - angleAxisXX * angleAxisYZ; this._axisZZ = angleAxisXX * angleAxisYY - angleAxisXY * angleAxisYX; let l = this._axisXX * this._axisXX + this._axisXY * this._axisXY + this._axisXZ * this._axisXZ; if(l > 0) { l = 1 / Math.sqrt(l); } this._axisXX *= l; this._axisXY *= l; this._axisXZ *= l; let l1 = this._axisYX * this._axisYX + this._axisYY * this._axisYY + this._axisYZ * this._axisYZ; if(l1 > 0) { l1 = 1 / Math.sqrt(l1); } this._axisYX *= l1; this._axisYY *= l1; this._axisYZ *= l1; let l2 = this._axisZX * this._axisZX + this._axisZY * this._axisZY + this._axisZZ * this._axisZZ; if(l2 > 0) { l2 = 1 / Math.sqrt(l2); } this._axisZX *= l2; this._axisZY *= l2; this._axisZZ *= l2; this.xSingular = this._axisXX * this._axisXX + this._axisXY * this._axisXY + this._axisXZ * this._axisXZ == 0; this.ySingular = this._axisYX * this._axisYX + this._axisYY * this._axisYY + this._axisYZ * this._axisYZ == 0; this.zSingular = this._axisZX * this._axisZX + this._axisZY * this._axisZY + this._axisZZ * this._axisZZ == 0; let rot100; let rot101; let rot102; let rot110; let rot111; let rot112; let rot120; let rot121; let rot122; let rot200; let rot201; let rot202; let rot210; let rot211; let rot212; let rot220; let rot221; let rot222; rot100 = this._basisX1X; rot101 = this._basisY1X; rot102 = this._basisZ1X; rot110 = this._basisX1Y; rot111 = this._basisY1Y; rot112 = this._basisZ1Y; rot120 = this._basisX1Z; rot121 = this._basisY1Z; rot122 = this._basisZ1Z; rot200 = this._basisX2X; rot201 = this._basisY2X; rot202 = this._basisZ2X; rot210 = this._basisX2Y; rot211 = this._basisY2Y; rot212 = this._basisZ2Y; rot220 = this._basisX2Z; rot221 = this._basisY2Z; rot222 = this._basisZ2Z; let relRot00; let relRot01; let relRot02; let relRot11; let relRot12; let relRot21; let relRot22; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__11; let __tmp__12; let __tmp__21; let __tmp__22; __tmp__00 = rot100 * rot200 + rot110 * rot210 + rot120 * rot220; __tmp__01 = rot100 * rot201 + rot110 * rot211 + rot120 * rot221; __tmp__02 = rot100 * rot202 + rot110 * rot212 + rot120 * rot222; __tmp__11 = rot101 * rot201 + rot111 * rot211 + rot121 * rot221; __tmp__12 = rot101 * rot202 + rot111 * rot212 + rot121 * rot222; __tmp__21 = rot102 * rot201 + rot112 * rot211 + rot122 * rot221; __tmp__22 = rot102 * rot202 + rot112 * rot212 + rot122 * rot222; relRot00 = __tmp__00; relRot01 = __tmp__01; relRot02 = __tmp__02; relRot11 = __tmp__11; relRot12 = __tmp__12; relRot21 = __tmp__21; relRot22 = __tmp__22; let anglesX; let anglesY; let anglesZ; let sy = relRot02; if(sy <= -1) { let xSubZ = Math.atan2(relRot21,relRot11); anglesX = xSubZ * 0.5; anglesY = -1.570796326794895; anglesZ = -xSubZ * 0.5; } else if(sy >= 1) { let xAddZ = Math.atan2(relRot21,relRot11); anglesX = xAddZ * 0.5; anglesY = 1.570796326794895; anglesZ = xAddZ * 0.5; } else { anglesX = Math.atan2(-relRot12,relRot22); anglesY = Math.asin(sy); anglesZ = Math.atan2(-relRot01,relRot00); } this._angleX = anglesX; this._angleY = anglesY; this._angleZ = anglesZ; this.linearErrorX = this._anchor2X - this._anchor1X; this.linearErrorY = this._anchor2Y - this._anchor1Y; this.linearErrorZ = this._anchor2Z - this._anchor1Z; } _getVelocitySolverInfo(timeStep,info) { super._getVelocitySolverInfo(timeStep,info); this.getInfo(info,timeStep,false); } _getPositionSolverInfo(info) { super._getPositionSolverInfo(info); this.getInfo(info,null,true); } getAxis1() { let v = new oimo.common.Vec3(); v.x = this._basisX1X; v.y = this._basisX1Y; v.z = this._basisX1Z; return v; } getAxis2() { let v = new oimo.common.Vec3(); v.x = this._basisZ2X; v.y = this._basisZ2Y; v.z = this._basisZ2Z; return v; } getAxis1To(axis) { axis.x = this._basisX1X; axis.y = this._basisX1Y; axis.z = this._basisX1Z; } getAxis2To(axis) { axis.x = this._basisZ2X; axis.y = this._basisZ2Y; axis.z = this._basisZ2Z; } getLocalAxis1() { let v = new oimo.common.Vec3(); v.x = this._localBasisX1X; v.y = this._localBasisX1Y; v.z = this._localBasisX1Z; return v; } getLocalAxis2() { let v = new oimo.common.Vec3(); v.x = this._localBasisZ2X; v.y = this._localBasisZ2Y; v.z = this._localBasisZ2Z; return v; } getLocalAxis1To(axis) { axis.x = this._localBasisX1X; axis.y = this._localBasisX1Y; axis.z = this._localBasisX1Z; } getLocalAxis2To(axis) { axis.x = this._localBasisZ2X; axis.y = this._localBasisZ2Y; axis.z = this._localBasisZ2Z; } getSpringDamper1() { return this._sd1; } getSpringDamper2() { return this._sd2; } getLimitMotor1() { return this._lm1; } getLimitMotor2() { return this._lm2; } getAngle1() { return this._angleX; } getAngle2() { return this._angleZ; } } oimo.dynamics.constraint.joint.UniversalJointConfig = class oimo_dynamics_constraint_joint_UniversalJointConfig extends oimo.dynamics.constraint.joint.JointConfig { constructor() { super(); this.localAxis1 = new oimo.common.Vec3(1,0,0); this.localAxis2 = new oimo.common.Vec3(1,0,0); this.springDamper1 = new oimo.dynamics.constraint.joint.SpringDamper(); this.springDamper2 = new oimo.dynamics.constraint.joint.SpringDamper(); this.limitMotor1 = new oimo.dynamics.constraint.joint.RotationalLimitMotor(); this.limitMotor2 = new oimo.dynamics.constraint.joint.RotationalLimitMotor(); } init(rigidBody1,rigidBody2,worldAnchor,worldAxis1,worldAxis2) { this._init(rigidBody1,rigidBody2,worldAnchor); let localVector = this.localAxis1; let vX; let vY; let vZ; vX = worldAxis1.x; vY = worldAxis1.y; vZ = worldAxis1.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = rigidBody1._transform._rotation00 * vX + rigidBody1._transform._rotation10 * vY + rigidBody1._transform._rotation20 * vZ; __tmp__Y = rigidBody1._transform._rotation01 * vX + rigidBody1._transform._rotation11 * vY + rigidBody1._transform._rotation21 * vZ; __tmp__Z = rigidBody1._transform._rotation02 * vX + rigidBody1._transform._rotation12 * vY + rigidBody1._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; localVector.x = vX; localVector.y = vY; localVector.z = vZ; let localVector1 = this.localAxis2; let vX1; let vY1; let vZ1; vX1 = worldAxis2.x; vY1 = worldAxis2.y; vZ1 = worldAxis2.z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = rigidBody2._transform._rotation00 * vX1 + rigidBody2._transform._rotation10 * vY1 + rigidBody2._transform._rotation20 * vZ1; __tmp__Y1 = rigidBody2._transform._rotation01 * vX1 + rigidBody2._transform._rotation11 * vY1 + rigidBody2._transform._rotation21 * vZ1; __tmp__Z1 = rigidBody2._transform._rotation02 * vX1 + rigidBody2._transform._rotation12 * vY1 + rigidBody2._transform._rotation22 * vZ1; vX1 = __tmp__X1; vY1 = __tmp__Y1; vZ1 = __tmp__Z1; localVector1.x = vX1; localVector1.y = vY1; localVector1.z = vZ1; return this; } } if(!oimo.dynamics.constraint.solver) oimo.dynamics.constraint.solver = {}; oimo.dynamics.constraint.solver.ConstraintSolverType = class oimo_dynamics_constraint_solver_ConstraintSolverType { } if(!oimo.dynamics.constraint.solver.common) oimo.dynamics.constraint.solver.common = {}; oimo.dynamics.constraint.solver.common.ContactSolverMassDataRow = class oimo_dynamics_constraint_solver_common_ContactSolverMassDataRow { constructor() { this.invMLinN1X = 0; this.invMLinN1Y = 0; this.invMLinN1Z = 0; this.invMLinN2X = 0; this.invMLinN2Y = 0; this.invMLinN2Z = 0; this.invMAngN1X = 0; this.invMAngN1Y = 0; this.invMAngN1Z = 0; this.invMAngN2X = 0; this.invMAngN2Y = 0; this.invMAngN2Z = 0; this.invMLinT1X = 0; this.invMLinT1Y = 0; this.invMLinT1Z = 0; this.invMLinT2X = 0; this.invMLinT2Y = 0; this.invMLinT2Z = 0; this.invMAngT1X = 0; this.invMAngT1Y = 0; this.invMAngT1Z = 0; this.invMAngT2X = 0; this.invMAngT2Y = 0; this.invMAngT2Z = 0; this.invMLinB1X = 0; this.invMLinB1Y = 0; this.invMLinB1Z = 0; this.invMLinB2X = 0; this.invMLinB2Y = 0; this.invMLinB2Z = 0; this.invMAngB1X = 0; this.invMAngB1Y = 0; this.invMAngB1Z = 0; this.invMAngB2X = 0; this.invMAngB2Y = 0; this.invMAngB2Z = 0; this.massN = 0; this.massTB00 = 0; this.massTB01 = 0; this.massTB10 = 0; this.massTB11 = 0; } } oimo.dynamics.constraint.solver.common.JointSolverMassDataRow = class oimo_dynamics_constraint_solver_common_JointSolverMassDataRow { constructor() { this.invMLin1X = 0; this.invMLin1Y = 0; this.invMLin1Z = 0; this.invMLin2X = 0; this.invMLin2Y = 0; this.invMLin2Z = 0; this.invMAng1X = 0; this.invMAng1Y = 0; this.invMAng1Z = 0; this.invMAng2X = 0; this.invMAng2Y = 0; this.invMAng2Z = 0; this.mass = 0; this.massWithoutCfm = 0; } } if(!oimo.dynamics.constraint.solver.direct) oimo.dynamics.constraint.solver.direct = {}; oimo.dynamics.constraint.solver.direct.Boundary = class oimo_dynamics_constraint_solver_direct_Boundary { constructor(maxRows) { this.iBounded = new Array(maxRows); this.iUnbounded = new Array(maxRows); this.signs = new Array(maxRows); this.b = new Array(maxRows); this.numBounded = 0; this.numUnbounded = 0; this.matrixId = 0; } init(buildInfo) { this.numBounded = buildInfo.numBounded; let _g = 0; let _g1 = this.numBounded; while(_g < _g1) { let i = _g++; this.iBounded[i] = buildInfo.iBounded[i]; this.signs[i] = buildInfo.signs[i]; } this.numUnbounded = buildInfo.numUnbounded; this.matrixId = 0; let _g2 = 0; let _g3 = this.numUnbounded; while(_g2 < _g3) { let i = _g2++; let idx = buildInfo.iUnbounded[i]; this.iUnbounded[i] = idx; this.matrixId |= 1 << idx; } } computeImpulses(info,mass,relVels,impulses,dImpulses,impulseFactor,noCheck) { let _g = 0; let _g1 = this.numUnbounded; while(_g < _g1) { let idx = this.iUnbounded[_g++]; let row = info.rows[idx]; this.b[idx] = row.rhs * impulseFactor - relVels[idx] - row.cfm * impulses[idx]; } let invMassWithoutCfm = mass._invMassWithoutCfm; let _g2 = 0; let _g3 = this.numBounded; while(_g2 < _g3) { let i = _g2++; let idx = this.iBounded[i]; let sign = this.signs[i]; let row = info.rows[idx]; let dImpulse = (sign < 0 ? row.minImpulse : sign > 0 ? row.maxImpulse : 0) - impulses[idx]; dImpulses[idx] = dImpulse; if(dImpulse != 0) { let _g = 0; let _g1 = this.numUnbounded; while(_g < _g1) { let idx2 = this.iUnbounded[_g++]; this.b[idx2] -= invMassWithoutCfm[idx][idx2] * dImpulse; } } } let indices = this.iUnbounded; let n = this.numUnbounded; let id = 0; let _g4 = 0; while(_g4 < n) id |= 1 << indices[_g4++]; let massMatrix; if(mass._cacheComputed[id]) { massMatrix = mass._cachedSubmatrices[id]; } else { mass.computeSubmatrix(id,indices,n); mass._cacheComputed[id] = true; massMatrix = mass._cachedSubmatrices[id]; } let ok = true; let _g5 = 0; let _g6 = this.numUnbounded; while(_g5 < _g6) { let i = _g5++; let idx = this.iUnbounded[i]; let row = info.rows[idx]; let oldImpulse = impulses[idx]; let impulse = oldImpulse; let _g = 0; let _g1 = this.numUnbounded; while(_g < _g1) { let j = _g++; impulse += this.b[this.iUnbounded[j]] * massMatrix[i][j]; } if(impulse < row.minImpulse - oimo.common.Setting.directMlcpSolverEps || impulse > row.maxImpulse + oimo.common.Setting.directMlcpSolverEps) { ok = false; break; } dImpulses[idx] = impulse - oldImpulse; } if(noCheck) { return true; } if(!ok) { return false; } let _g7 = 0; let _g8 = this.numBounded; while(_g7 < _g8) { let i = _g7++; let idx = this.iBounded[i]; let row = info.rows[idx]; let sign = this.signs[i]; let error = 0; let newImpulse = impulses[idx] + dImpulses[idx]; let relVel = relVels[idx]; let _g = 0; let _g1 = info.numRows; while(_g < _g1) { let j = _g++; relVel += invMassWithoutCfm[idx][j] * dImpulses[j]; } error = row.rhs * impulseFactor - relVel - row.cfm * newImpulse; if(sign < 0 && error > oimo.common.Setting.directMlcpSolverEps || sign > 0 && error < -oimo.common.Setting.directMlcpSolverEps) { ok = false; break; } } return ok; } } oimo.dynamics.constraint.solver.direct.BoundaryBuildInfo = class oimo_dynamics_constraint_solver_direct_BoundaryBuildInfo { constructor(size) { this.size = size; this.numBounded = 0; this.iBounded = new Array(size); this.signs = new Array(size); this.numUnbounded = 0; this.iUnbounded = new Array(size); } } oimo.dynamics.constraint.solver.direct.BoundaryBuilder = class oimo_dynamics_constraint_solver_direct_BoundaryBuilder { constructor(maxRows) { this.maxRows = maxRows; this.numBoundaries = 0; this.boundaries = new Array(1 << maxRows); this.bbInfo = new oimo.dynamics.constraint.solver.direct.BoundaryBuildInfo(maxRows); } buildBoundariesRecursive(info,i) { if(i == info.numRows) { if(this.boundaries[this.numBoundaries] == null) { this.boundaries[this.numBoundaries] = new oimo.dynamics.constraint.solver.direct.Boundary(this.maxRows); } this.boundaries[this.numBoundaries++].init(this.bbInfo); return; } let row = info.rows[i]; let lowerLimitEnabled = row.minImpulse > -1e65536; let upperLimitEnabled = row.maxImpulse < 1e65536; if(row.minImpulse == 0 && row.maxImpulse == 0) { let _this = this.bbInfo; _this.iBounded[_this.numBounded] = i; _this.signs[_this.numBounded] = 0; _this.numBounded++; this.buildBoundariesRecursive(info,i + 1); this.bbInfo.numBounded--; return; } let _this = this.bbInfo; _this.iUnbounded[_this.numUnbounded] = i; _this.numUnbounded++; this.buildBoundariesRecursive(info,i + 1); this.bbInfo.numUnbounded--; if(lowerLimitEnabled) { let _this = this.bbInfo; _this.iBounded[_this.numBounded] = i; _this.signs[_this.numBounded] = -1; _this.numBounded++; this.buildBoundariesRecursive(info,i + 1); this.bbInfo.numBounded--; } if(upperLimitEnabled) { let _this = this.bbInfo; _this.iBounded[_this.numBounded] = i; _this.signs[_this.numBounded] = 1; _this.numBounded++; this.buildBoundariesRecursive(info,i + 1); this.bbInfo.numBounded--; } } buildBoundaries(info) { this.numBoundaries = 0; let _this = this.bbInfo; _this.numBounded = 0; _this.numUnbounded = 0; this.buildBoundariesRecursive(info,0); } } oimo.dynamics.constraint.solver.direct.BoundarySelector = class oimo_dynamics_constraint_solver_direct_BoundarySelector { constructor(n) { this.n = n; this.indices = new Array(n); this.tmpIndices = new Array(n); let _g = 0; while(_g < n) { let i = _g++; this.indices[i] = i; } } getIndex(i) { return this.indices[i]; } select(index) { let i = 0; while(this.indices[i] != index) ++i; while(i > 0) { let tmp = this.indices[i]; this.indices[i] = this.indices[i - 1]; this.indices[i - 1] = tmp; --i; } } setSize(size) { let numSmaller = 0; let numGreater = 0; let _g = 0; let _g1 = this.n; while(_g < _g1) { let idx = this.indices[_g++]; if(idx < size) { this.tmpIndices[numSmaller] = idx; ++numSmaller; } else { this.tmpIndices[size + numGreater] = idx; ++numGreater; } } let tmp = this.indices; this.indices = this.tmpIndices; this.tmpIndices = tmp; } } oimo.dynamics.constraint.solver.direct.DirectJointConstraintSolver = class oimo_dynamics_constraint_solver_direct_DirectJointConstraintSolver extends oimo.dynamics.constraint.ConstraintSolver { constructor(joint) { super(); this.joint = joint; this.info = new oimo.dynamics.constraint.info.joint.JointSolverInfo(); let maxRows = oimo.common.Setting.maxJacobianRows; this.massMatrix = new oimo.dynamics.constraint.solver.direct.MassMatrix(maxRows); this.boundaryBuilder = new oimo.dynamics.constraint.solver.direct.BoundaryBuilder(maxRows); this.massData = new Array(maxRows); let _g = 0; let _g1 = this.massData.length; while(_g < _g1) this.massData[_g++] = new oimo.dynamics.constraint.solver.common.JointSolverMassDataRow(); let numMaxBoundaries = this.boundaryBuilder.boundaries.length; this.velBoundarySelector = new oimo.dynamics.constraint.solver.direct.BoundarySelector(numMaxBoundaries); this.posBoundarySelector = new oimo.dynamics.constraint.solver.direct.BoundarySelector(numMaxBoundaries); this.relVels = new Array(maxRows); this.impulses = new Array(maxRows); this.dImpulses = new Array(maxRows); this.dTotalImpulses = new Array(maxRows); let _g2 = 0; while(_g2 < maxRows) { let i = _g2++; this.relVels[i] = 0; this.impulses[i] = 0; this.dImpulses[i] = 0; this.dTotalImpulses[i] = 0; } } preSolveVelocity(timeStep) { this.joint._syncAnchors(); this.joint._getVelocitySolverInfo(timeStep,this.info); this._b1 = this.info.b1; this._b2 = this.info.b2; this.massMatrix.computeInvMass(this.info,this.massData); let _this = this.boundaryBuilder; _this.numBoundaries = 0; let _this1 = _this.bbInfo; _this1.numBounded = 0; _this1.numUnbounded = 0; _this.buildBoundariesRecursive(this.info,0); let _this2 = this.velBoundarySelector; let size = this.boundaryBuilder.numBoundaries; let numSmaller = 0; let numGreater = 0; let _g = 0; let _g1 = _this2.n; while(_g < _g1) { let idx = _this2.indices[_g++]; if(idx < size) { _this2.tmpIndices[numSmaller] = idx; ++numSmaller; } else { _this2.tmpIndices[size + numGreater] = idx; ++numGreater; } } let tmp = _this2.indices; _this2.indices = _this2.tmpIndices; _this2.tmpIndices = tmp; } warmStart(timeStep) { let factor = this.joint._positionCorrectionAlgorithm == oimo.dynamics.constraint.PositionCorrectionAlgorithm.BAUMGARTE ? oimo.common.Setting.jointWarmStartingFactorForBaungarte : oimo.common.Setting.jointWarmStartingFactor; factor *= timeStep.dtRatio; if(factor <= 0) { let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let _this = this.info.rows[_g++].impulse; _this.impulse = 0; _this.impulseM = 0; _this.impulseP = 0; } return; } let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let row = this.info.rows[i]; let imp = row.impulse; let impulse = imp.impulse * factor; if(impulse < row.minImpulse) { impulse = row.minImpulse; } else if(impulse > row.maxImpulse) { impulse = row.maxImpulse; } imp.impulse = impulse; if(row.motorMaxImpulse > 0) { let impulseM = imp.impulseM * factor; let max = row.motorMaxImpulse; if(impulseM < -max) { impulseM = -max; } else if(impulseM > max) { impulseM = max; } imp.impulseM = impulseM; } else { imp.impulseM = 0; } this.dImpulses[i] = imp.impulse + imp.impulseM; } let impulses = this.dImpulses; let linearSet = false; let angularSet = false; let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._velX; lv1Y = this._b1._velY; lv1Z = this._b1._velZ; lv2X = this._b2._velX; lv2Y = this._b2._velY; lv2Z = this._b2._velZ; av1X = this._b1._angVelX; av1Y = this._b1._angVelY; av1Z = this._b1._angVelZ; av2X = this._b2._angVelX; av2Y = this._b2._angVelY; av2Z = this._b2._angVelZ; let _g2 = 0; let _g3 = this.info.numRows; while(_g2 < _g3) { let i = _g2++; let j = this.info.rows[i].jacobian; let md = this.massData[i]; let imp = impulses[i]; if((j.flag & 1) != 0) { lv1X += md.invMLin1X * imp; lv1Y += md.invMLin1Y * imp; lv1Z += md.invMLin1Z * imp; lv2X += md.invMLin2X * -imp; lv2Y += md.invMLin2Y * -imp; lv2Z += md.invMLin2Z * -imp; linearSet = true; } if((j.flag & 2) != 0) { av1X += md.invMAng1X * imp; av1Y += md.invMAng1Y * imp; av1Z += md.invMAng1Z * imp; av2X += md.invMAng2X * -imp; av2Y += md.invMAng2Y * -imp; av2Z += md.invMAng2Z * -imp; angularSet = true; } } if(linearSet) { this._b1._velX = lv1X; this._b1._velY = lv1Y; this._b1._velZ = lv1Z; this._b2._velX = lv2X; this._b2._velY = lv2Y; this._b2._velZ = lv2Z; } if(angularSet) { this._b1._angVelX = av1X; this._b1._angVelY = av1Y; this._b1._angVelZ = av1Z; this._b2._angVelX = av2X; this._b2._angVelY = av2Y; this._b2._angVelZ = av2Z; } } solveVelocity() { let numRows = this.info.numRows; let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._velX; lv1Y = this._b1._velY; lv1Z = this._b1._velZ; lv2X = this._b2._velX; lv2Y = this._b2._velY; lv2Z = this._b2._velZ; av1X = this._b1._angVelX; av1Y = this._b1._angVelY; av1Z = this._b1._angVelZ; av2X = this._b2._angVelX; av2Y = this._b2._angVelY; av2Z = this._b2._angVelZ; let _g = 0; while(_g < numRows) { let i = _g++; let row = this.info.rows[i]; let j = row.jacobian; let relVel = 0; relVel += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; relVel -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; relVel += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; relVel -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; this.relVels[i] = relVel; this.impulses[i] = row.impulse.impulse; this.dTotalImpulses[i] = 0; } let invMass = this.massMatrix._invMassWithoutCfm; let _g1 = 0; while(_g1 < numRows) { let i = _g1++; let row = this.info.rows[i]; let imp = row.impulse; if(row.motorMaxImpulse > 0) { let oldImpulseM = imp.impulseM; let impulseM = oldImpulseM + this.massData[i].massWithoutCfm * (-row.motorSpeed - this.relVels[i]); let maxImpulseM = row.motorMaxImpulse; if(impulseM < -maxImpulseM) { impulseM = -maxImpulseM; } else if(impulseM > maxImpulseM) { impulseM = maxImpulseM; } imp.impulseM = impulseM; let dImpulseM = impulseM - oldImpulseM; this.dTotalImpulses[i] = dImpulseM; let _g = 0; while(_g < numRows) { let j = _g++; this.relVels[j] += dImpulseM * invMass[i][j]; } } } let solved = false; let _g2 = 0; let _g3 = this.boundaryBuilder.numBoundaries; while(_g2 < _g3) { let idx = this.velBoundarySelector.indices[_g2++]; if(this.boundaryBuilder.boundaries[idx].computeImpulses(this.info,this.massMatrix,this.relVels,this.impulses,this.dImpulses,1,false)) { let _g = 0; while(_g < numRows) { let j = _g++; let dimp = this.dImpulses[j]; this.info.rows[j].impulse.impulse += dimp; this.dTotalImpulses[j] += dimp; } let impulses = this.dTotalImpulses; let linearSet = false; let angularSet = false; let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._velX; lv1Y = this._b1._velY; lv1Z = this._b1._velZ; lv2X = this._b2._velX; lv2Y = this._b2._velY; lv2Z = this._b2._velZ; av1X = this._b1._angVelX; av1Y = this._b1._angVelY; av1Z = this._b1._angVelZ; av2X = this._b2._angVelX; av2Y = this._b2._angVelY; av2Z = this._b2._angVelZ; let _g1 = 0; let _g2 = this.info.numRows; while(_g1 < _g2) { let i = _g1++; let j = this.info.rows[i].jacobian; let md = this.massData[i]; let imp = impulses[i]; if((j.flag & 1) != 0) { lv1X += md.invMLin1X * imp; lv1Y += md.invMLin1Y * imp; lv1Z += md.invMLin1Z * imp; lv2X += md.invMLin2X * -imp; lv2Y += md.invMLin2Y * -imp; lv2Z += md.invMLin2Z * -imp; linearSet = true; } if((j.flag & 2) != 0) { av1X += md.invMAng1X * imp; av1Y += md.invMAng1Y * imp; av1Z += md.invMAng1Z * imp; av2X += md.invMAng2X * -imp; av2Y += md.invMAng2Y * -imp; av2Z += md.invMAng2Z * -imp; angularSet = true; } } if(linearSet) { this._b1._velX = lv1X; this._b1._velY = lv1Y; this._b1._velZ = lv1Z; this._b2._velX = lv2X; this._b2._velY = lv2Y; this._b2._velZ = lv2Z; } if(angularSet) { this._b1._angVelX = av1X; this._b1._angVelY = av1Y; this._b1._angVelZ = av1Z; this._b2._angVelX = av2X; this._b2._angVelY = av2Y; this._b2._angVelZ = av2Z; } let _this = this.velBoundarySelector; let i = 0; while(_this.indices[i] != idx) ++i; while(i > 0) { let tmp = _this.indices[i]; _this.indices[i] = _this.indices[i - 1]; _this.indices[i - 1] = tmp; --i; } solved = true; break; } } if(!solved) { console.log("src/oimo/dynamics/constraint/solver/direct/DirectJointConstraintSolver.hx:335:","could not find solution. (velocity)"); return; } } postSolveVelocity(timeStep) { let linX; let linY; let linZ; let angX; let angY; let angZ; linX = 0; linY = 0; linZ = 0; angX = 0; angY = 0; angZ = 0; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let row = this.info.rows[_g++]; let imp = row.impulse; let j = row.jacobian; if((j.flag & 1) != 0) { linX += j.lin1X * imp.impulse; linY += j.lin1Y * imp.impulse; linZ += j.lin1Z * imp.impulse; } else if((j.flag & 2) != 0) { angX += j.ang1X * imp.impulse; angY += j.ang1Y * imp.impulse; angZ += j.ang1Z * imp.impulse; } } this.joint._appliedForceX = linX * timeStep.invDt; this.joint._appliedForceY = linY * timeStep.invDt; this.joint._appliedForceZ = linZ * timeStep.invDt; this.joint._appliedTorqueX = angX * timeStep.invDt; this.joint._appliedTorqueY = angY * timeStep.invDt; this.joint._appliedTorqueZ = angZ * timeStep.invDt; } preSolvePosition(timeStep) { this.joint._syncAnchors(); this.joint._getPositionSolverInfo(this.info); this._b1 = this.info.b1; this._b2 = this.info.b2; this.massMatrix.computeInvMass(this.info,this.massData); let _this = this.boundaryBuilder; _this.numBoundaries = 0; let _this1 = _this.bbInfo; _this1.numBounded = 0; _this1.numUnbounded = 0; _this.buildBoundariesRecursive(this.info,0); let _this2 = this.posBoundarySelector; let size = this.boundaryBuilder.numBoundaries; let numSmaller = 0; let numGreater = 0; let _g = 0; let _g1 = _this2.n; while(_g < _g1) { let idx = _this2.indices[_g++]; if(idx < size) { _this2.tmpIndices[numSmaller] = idx; ++numSmaller; } else { _this2.tmpIndices[size + numGreater] = idx; ++numGreater; } } let tmp = _this2.indices; _this2.indices = _this2.tmpIndices; _this2.tmpIndices = tmp; let _g2 = 0; let _g3 = this.info.numRows; while(_g2 < _g3) this.info.rows[_g2++].impulse.impulseP = 0; } solvePositionSplitImpulse() { let numRows = this.info.numRows; let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._pseudoVelX; lv1Y = this._b1._pseudoVelY; lv1Z = this._b1._pseudoVelZ; lv2X = this._b2._pseudoVelX; lv2Y = this._b2._pseudoVelY; lv2Z = this._b2._pseudoVelZ; av1X = this._b1._angPseudoVelX; av1Y = this._b1._angPseudoVelY; av1Z = this._b1._angPseudoVelZ; av2X = this._b2._angPseudoVelX; av2Y = this._b2._angPseudoVelY; av2Z = this._b2._angPseudoVelZ; let _g = 0; while(_g < numRows) { let i = _g++; let row = this.info.rows[i]; let j = row.jacobian; let relVel = 0; relVel += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; relVel -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; relVel += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; relVel -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; this.relVels[i] = relVel; this.impulses[i] = row.impulse.impulseP; } let solved = false; let _g1 = 0; let _g2 = this.boundaryBuilder.numBoundaries; while(_g1 < _g2) { let idx = this.posBoundarySelector.indices[_g1++]; if(this.boundaryBuilder.boundaries[idx].computeImpulses(this.info,this.massMatrix,this.relVels,this.impulses,this.dImpulses,oimo.common.Setting.positionSplitImpulseBaumgarte,false)) { let _g = 0; while(_g < numRows) { let j = _g++; this.info.rows[j].impulse.impulseP += this.dImpulses[j]; } let impulses = this.dImpulses; let linearSet = false; let angularSet = false; let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._pseudoVelX; lv1Y = this._b1._pseudoVelY; lv1Z = this._b1._pseudoVelZ; lv2X = this._b2._pseudoVelX; lv2Y = this._b2._pseudoVelY; lv2Z = this._b2._pseudoVelZ; av1X = this._b1._angPseudoVelX; av1Y = this._b1._angPseudoVelY; av1Z = this._b1._angPseudoVelZ; av2X = this._b2._angPseudoVelX; av2Y = this._b2._angPseudoVelY; av2Z = this._b2._angPseudoVelZ; let _g1 = 0; let _g2 = this.info.numRows; while(_g1 < _g2) { let i = _g1++; let j = this.info.rows[i].jacobian; let md = this.massData[i]; let imp = impulses[i]; if((j.flag & 1) != 0) { lv1X += md.invMLin1X * imp; lv1Y += md.invMLin1Y * imp; lv1Z += md.invMLin1Z * imp; lv2X += md.invMLin2X * -imp; lv2Y += md.invMLin2Y * -imp; lv2Z += md.invMLin2Z * -imp; linearSet = true; } if((j.flag & 2) != 0) { av1X += md.invMAng1X * imp; av1Y += md.invMAng1Y * imp; av1Z += md.invMAng1Z * imp; av2X += md.invMAng2X * -imp; av2Y += md.invMAng2Y * -imp; av2Z += md.invMAng2Z * -imp; angularSet = true; } } if(linearSet) { this._b1._pseudoVelX = lv1X; this._b1._pseudoVelY = lv1Y; this._b1._pseudoVelZ = lv1Z; this._b2._pseudoVelX = lv2X; this._b2._pseudoVelY = lv2Y; this._b2._pseudoVelZ = lv2Z; } if(angularSet) { this._b1._angPseudoVelX = av1X; this._b1._angPseudoVelY = av1Y; this._b1._angPseudoVelZ = av1Z; this._b2._angPseudoVelX = av2X; this._b2._angPseudoVelY = av2Y; this._b2._angPseudoVelZ = av2Z; } let _this = this.posBoundarySelector; let i = 0; while(_this.indices[i] != idx) ++i; while(i > 0) { let tmp = _this.indices[i]; _this.indices[i] = _this.indices[i - 1]; _this.indices[i - 1] = tmp; --i; } solved = true; break; } } if(!solved) { console.log("src/oimo/dynamics/constraint/solver/direct/DirectJointConstraintSolver.hx:450:","could not find solution. (split impulse)"); return; } } solvePositionNgs(timeStep) { this.joint._syncAnchors(); this.joint._getPositionSolverInfo(this.info); this._b1 = this.info.b1; this._b2 = this.info.b2; this.massMatrix.computeInvMass(this.info,this.massData); let _this = this.boundaryBuilder; _this.numBoundaries = 0; let _this1 = _this.bbInfo; _this1.numBounded = 0; _this1.numUnbounded = 0; _this.buildBoundariesRecursive(this.info,0); let _this2 = this.posBoundarySelector; let size = this.boundaryBuilder.numBoundaries; let numSmaller = 0; let numGreater = 0; let _g = 0; let _g1 = _this2.n; while(_g < _g1) { let idx = _this2.indices[_g++]; if(idx < size) { _this2.tmpIndices[numSmaller] = idx; ++numSmaller; } else { _this2.tmpIndices[size + numGreater] = idx; ++numGreater; } } let tmp = _this2.indices; _this2.indices = _this2.tmpIndices; _this2.tmpIndices = tmp; let numRows = this.info.numRows; let _g2 = 0; while(_g2 < numRows) { let i = _g2++; let imp = this.info.rows[i].impulse; this.relVels[i] = 0; this.impulses[i] = imp.impulseP; } let solved = false; let _g3 = 0; let _g4 = this.boundaryBuilder.numBoundaries; while(_g3 < _g4) { let idx = this.posBoundarySelector.indices[_g3++]; if(this.boundaryBuilder.boundaries[idx].computeImpulses(this.info,this.massMatrix,this.relVels,this.impulses,this.dImpulses,oimo.common.Setting.positionNgsBaumgarte,false)) { let _g = 0; while(_g < numRows) { let j = _g++; this.info.rows[j].impulse.impulseP += this.dImpulses[j]; } let impulses = this.dImpulses; let linearSet = false; let angularSet = false; let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = 0; lv1Y = 0; lv1Z = 0; lv2X = 0; lv2Y = 0; lv2Z = 0; av1X = 0; av1Y = 0; av1Z = 0; av2X = 0; av2Y = 0; av2Z = 0; let _g1 = 0; let _g2 = this.info.numRows; while(_g1 < _g2) { let i = _g1++; let j = this.info.rows[i].jacobian; let md = this.massData[i]; let imp = impulses[i]; if((j.flag & 1) != 0) { lv1X += md.invMLin1X * imp; lv1Y += md.invMLin1Y * imp; lv1Z += md.invMLin1Z * imp; lv2X += md.invMLin2X * -imp; lv2Y += md.invMLin2Y * -imp; lv2Z += md.invMLin2Z * -imp; linearSet = true; } if((j.flag & 2) != 0) { av1X += md.invMAng1X * imp; av1Y += md.invMAng1Y * imp; av1Z += md.invMAng1Z * imp; av2X += md.invMAng2X * -imp; av2Y += md.invMAng2Y * -imp; av2Z += md.invMAng2Z * -imp; angularSet = true; } } if(linearSet) { let _this = this._b1; _this._transform._positionX += lv1X; _this._transform._positionY += lv1Y; _this._transform._positionZ += lv1Z; let _this1 = this._b2; _this1._transform._positionX += lv2X; _this1._transform._positionY += lv2Y; _this1._transform._positionZ += lv2Z; } if(angularSet) { let _this = this._b1; let theta = Math.sqrt(av1X * av1X + av1Y * av1Y + av1Z * av1Z); let halfTheta = theta * 0.5; let rotationToSinAxisFactor; let cosHalfTheta; if(halfTheta < 0.5) { let ht2 = halfTheta * halfTheta; rotationToSinAxisFactor = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332); cosHalfTheta = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664; } else { rotationToSinAxisFactor = Math.sin(halfTheta) / theta; cosHalfTheta = Math.cos(halfTheta); } let sinAxisX; let sinAxisY; let sinAxisZ; sinAxisX = av1X * rotationToSinAxisFactor; sinAxisY = av1Y * rotationToSinAxisFactor; sinAxisZ = av1Z * rotationToSinAxisFactor; let dqX; let dqY; let dqZ; let dqW; dqX = sinAxisX; dqY = sinAxisY; dqZ = sinAxisZ; dqW = cosHalfTheta; let qX; let qY; let qZ; let qW; let e00 = _this._transform._rotation00; let e11 = _this._transform._rotation11; let e22 = _this._transform._rotation22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); qW = 0.5 * s; s = 0.5 / s; qX = (_this._transform._rotation21 - _this._transform._rotation12) * s; qY = (_this._transform._rotation02 - _this._transform._rotation20) * s; qZ = (_this._transform._rotation10 - _this._transform._rotation01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); qX = 0.5 * s; s = 0.5 / s; qY = (_this._transform._rotation01 + _this._transform._rotation10) * s; qZ = (_this._transform._rotation02 + _this._transform._rotation20) * s; qW = (_this._transform._rotation21 - _this._transform._rotation12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); qZ = 0.5 * s; s = 0.5 / s; qX = (_this._transform._rotation02 + _this._transform._rotation20) * s; qY = (_this._transform._rotation12 + _this._transform._rotation21) * s; qW = (_this._transform._rotation10 - _this._transform._rotation01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); qY = 0.5 * s; s = 0.5 / s; qX = (_this._transform._rotation01 + _this._transform._rotation10) * s; qZ = (_this._transform._rotation12 + _this._transform._rotation21) * s; qW = (_this._transform._rotation02 - _this._transform._rotation20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); qZ = 0.5 * s; s = 0.5 / s; qX = (_this._transform._rotation02 + _this._transform._rotation20) * s; qY = (_this._transform._rotation12 + _this._transform._rotation21) * s; qW = (_this._transform._rotation10 - _this._transform._rotation01) * s; } qX = dqW * qX + dqX * qW + dqY * qZ - dqZ * qY; qY = dqW * qY - dqX * qZ + dqY * qW + dqZ * qX; qZ = dqW * qZ + dqX * qY - dqY * qX + dqZ * qW; qW = dqW * qW - dqX * qX - dqY * qY - dqZ * qZ; let l = qX * qX + qY * qY + qZ * qZ + qW * qW; if(l > 1e-32) { l = 1 / Math.sqrt(l); } qX *= l; qY *= l; qZ *= l; qW *= l; let x = qX; let y = qY; let z = qZ; let w = qW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; _this._transform._rotation00 = 1 - yy - zz; _this._transform._rotation01 = xy - wz; _this._transform._rotation02 = xz + wy; _this._transform._rotation10 = xy + wz; _this._transform._rotation11 = 1 - xx - zz; _this._transform._rotation12 = yz - wx; _this._transform._rotation20 = xz - wy; _this._transform._rotation21 = yz + wx; _this._transform._rotation22 = 1 - xx - yy; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = _this._transform._rotation00 * _this._invLocalInertia00 + _this._transform._rotation01 * _this._invLocalInertia10 + _this._transform._rotation02 * _this._invLocalInertia20; __tmp__01 = _this._transform._rotation00 * _this._invLocalInertia01 + _this._transform._rotation01 * _this._invLocalInertia11 + _this._transform._rotation02 * _this._invLocalInertia21; __tmp__02 = _this._transform._rotation00 * _this._invLocalInertia02 + _this._transform._rotation01 * _this._invLocalInertia12 + _this._transform._rotation02 * _this._invLocalInertia22; __tmp__10 = _this._transform._rotation10 * _this._invLocalInertia00 + _this._transform._rotation11 * _this._invLocalInertia10 + _this._transform._rotation12 * _this._invLocalInertia20; __tmp__11 = _this._transform._rotation10 * _this._invLocalInertia01 + _this._transform._rotation11 * _this._invLocalInertia11 + _this._transform._rotation12 * _this._invLocalInertia21; __tmp__12 = _this._transform._rotation10 * _this._invLocalInertia02 + _this._transform._rotation11 * _this._invLocalInertia12 + _this._transform._rotation12 * _this._invLocalInertia22; __tmp__20 = _this._transform._rotation20 * _this._invLocalInertia00 + _this._transform._rotation21 * _this._invLocalInertia10 + _this._transform._rotation22 * _this._invLocalInertia20; __tmp__21 = _this._transform._rotation20 * _this._invLocalInertia01 + _this._transform._rotation21 * _this._invLocalInertia11 + _this._transform._rotation22 * _this._invLocalInertia21; __tmp__22 = _this._transform._rotation20 * _this._invLocalInertia02 + _this._transform._rotation21 * _this._invLocalInertia12 + _this._transform._rotation22 * _this._invLocalInertia22; _this._invInertia00 = __tmp__00; _this._invInertia01 = __tmp__01; _this._invInertia02 = __tmp__02; _this._invInertia10 = __tmp__10; _this._invInertia11 = __tmp__11; _this._invInertia12 = __tmp__12; _this._invInertia20 = __tmp__20; _this._invInertia21 = __tmp__21; _this._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = _this._invInertia00 * _this._transform._rotation00 + _this._invInertia01 * _this._transform._rotation01 + _this._invInertia02 * _this._transform._rotation02; __tmp__011 = _this._invInertia00 * _this._transform._rotation10 + _this._invInertia01 * _this._transform._rotation11 + _this._invInertia02 * _this._transform._rotation12; __tmp__021 = _this._invInertia00 * _this._transform._rotation20 + _this._invInertia01 * _this._transform._rotation21 + _this._invInertia02 * _this._transform._rotation22; __tmp__101 = _this._invInertia10 * _this._transform._rotation00 + _this._invInertia11 * _this._transform._rotation01 + _this._invInertia12 * _this._transform._rotation02; __tmp__111 = _this._invInertia10 * _this._transform._rotation10 + _this._invInertia11 * _this._transform._rotation11 + _this._invInertia12 * _this._transform._rotation12; __tmp__121 = _this._invInertia10 * _this._transform._rotation20 + _this._invInertia11 * _this._transform._rotation21 + _this._invInertia12 * _this._transform._rotation22; __tmp__201 = _this._invInertia20 * _this._transform._rotation00 + _this._invInertia21 * _this._transform._rotation01 + _this._invInertia22 * _this._transform._rotation02; __tmp__211 = _this._invInertia20 * _this._transform._rotation10 + _this._invInertia21 * _this._transform._rotation11 + _this._invInertia22 * _this._transform._rotation12; __tmp__221 = _this._invInertia20 * _this._transform._rotation20 + _this._invInertia21 * _this._transform._rotation21 + _this._invInertia22 * _this._transform._rotation22; _this._invInertia00 = __tmp__001; _this._invInertia01 = __tmp__011; _this._invInertia02 = __tmp__021; _this._invInertia10 = __tmp__101; _this._invInertia11 = __tmp__111; _this._invInertia12 = __tmp__121; _this._invInertia20 = __tmp__201; _this._invInertia21 = __tmp__211; _this._invInertia22 = __tmp__221; _this._invInertia00 *= _this._rotFactor.x; _this._invInertia01 *= _this._rotFactor.x; _this._invInertia02 *= _this._rotFactor.x; _this._invInertia10 *= _this._rotFactor.y; _this._invInertia11 *= _this._rotFactor.y; _this._invInertia12 *= _this._rotFactor.y; _this._invInertia20 *= _this._rotFactor.z; _this._invInertia21 *= _this._rotFactor.z; _this._invInertia22 *= _this._rotFactor.z; let _this1 = this._b2; let theta1 = Math.sqrt(av2X * av2X + av2Y * av2Y + av2Z * av2Z); let halfTheta1 = theta1 * 0.5; let rotationToSinAxisFactor1; let cosHalfTheta1; if(halfTheta1 < 0.5) { let ht2 = halfTheta1 * halfTheta1; rotationToSinAxisFactor1 = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332); cosHalfTheta1 = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664; } else { rotationToSinAxisFactor1 = Math.sin(halfTheta1) / theta1; cosHalfTheta1 = Math.cos(halfTheta1); } let sinAxisX1; let sinAxisY1; let sinAxisZ1; sinAxisX1 = av2X * rotationToSinAxisFactor1; sinAxisY1 = av2Y * rotationToSinAxisFactor1; sinAxisZ1 = av2Z * rotationToSinAxisFactor1; let dqX1; let dqY1; let dqZ1; let dqW1; dqX1 = sinAxisX1; dqY1 = sinAxisY1; dqZ1 = sinAxisZ1; dqW1 = cosHalfTheta1; let qX1; let qY1; let qZ1; let qW1; let e001 = _this1._transform._rotation00; let e111 = _this1._transform._rotation11; let e221 = _this1._transform._rotation22; let t1 = e001 + e111 + e221; let s1; if(t1 > 0) { s1 = Math.sqrt(t1 + 1); qW1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this1._transform._rotation21 - _this1._transform._rotation12) * s1; qY1 = (_this1._transform._rotation02 - _this1._transform._rotation20) * s1; qZ1 = (_this1._transform._rotation10 - _this1._transform._rotation01) * s1; } else if(e001 > e111) { if(e001 > e221) { s1 = Math.sqrt(e001 - e111 - e221 + 1); qX1 = 0.5 * s1; s1 = 0.5 / s1; qY1 = (_this1._transform._rotation01 + _this1._transform._rotation10) * s1; qZ1 = (_this1._transform._rotation02 + _this1._transform._rotation20) * s1; qW1 = (_this1._transform._rotation21 - _this1._transform._rotation12) * s1; } else { s1 = Math.sqrt(e221 - e001 - e111 + 1); qZ1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this1._transform._rotation02 + _this1._transform._rotation20) * s1; qY1 = (_this1._transform._rotation12 + _this1._transform._rotation21) * s1; qW1 = (_this1._transform._rotation10 - _this1._transform._rotation01) * s1; } } else if(e111 > e221) { s1 = Math.sqrt(e111 - e221 - e001 + 1); qY1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this1._transform._rotation01 + _this1._transform._rotation10) * s1; qZ1 = (_this1._transform._rotation12 + _this1._transform._rotation21) * s1; qW1 = (_this1._transform._rotation02 - _this1._transform._rotation20) * s1; } else { s1 = Math.sqrt(e221 - e001 - e111 + 1); qZ1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this1._transform._rotation02 + _this1._transform._rotation20) * s1; qY1 = (_this1._transform._rotation12 + _this1._transform._rotation21) * s1; qW1 = (_this1._transform._rotation10 - _this1._transform._rotation01) * s1; } qX1 = dqW1 * qX1 + dqX1 * qW1 + dqY1 * qZ1 - dqZ1 * qY1; qY1 = dqW1 * qY1 - dqX1 * qZ1 + dqY1 * qW1 + dqZ1 * qX1; qZ1 = dqW1 * qZ1 + dqX1 * qY1 - dqY1 * qX1 + dqZ1 * qW1; qW1 = dqW1 * qW1 - dqX1 * qX1 - dqY1 * qY1 - dqZ1 * qZ1; let l1 = qX1 * qX1 + qY1 * qY1 + qZ1 * qZ1 + qW1 * qW1; if(l1 > 1e-32) { l1 = 1 / Math.sqrt(l1); } qX1 *= l1; qY1 *= l1; qZ1 *= l1; qW1 *= l1; let x1 = qX1; let y1 = qY1; let z1 = qZ1; let w1 = qW1; let x21 = 2 * x1; let y21 = 2 * y1; let z21 = 2 * z1; let xx1 = x1 * x21; let yy1 = y1 * y21; let zz1 = z1 * z21; let xy1 = x1 * y21; let yz1 = y1 * z21; let xz1 = x1 * z21; let wx1 = w1 * x21; let wy1 = w1 * y21; let wz1 = w1 * z21; _this1._transform._rotation00 = 1 - yy1 - zz1; _this1._transform._rotation01 = xy1 - wz1; _this1._transform._rotation02 = xz1 + wy1; _this1._transform._rotation10 = xy1 + wz1; _this1._transform._rotation11 = 1 - xx1 - zz1; _this1._transform._rotation12 = yz1 - wx1; _this1._transform._rotation20 = xz1 - wy1; _this1._transform._rotation21 = yz1 + wx1; _this1._transform._rotation22 = 1 - xx1 - yy1; let __tmp__002; let __tmp__012; let __tmp__022; let __tmp__102; let __tmp__112; let __tmp__122; let __tmp__202; let __tmp__212; let __tmp__222; __tmp__002 = _this1._transform._rotation00 * _this1._invLocalInertia00 + _this1._transform._rotation01 * _this1._invLocalInertia10 + _this1._transform._rotation02 * _this1._invLocalInertia20; __tmp__012 = _this1._transform._rotation00 * _this1._invLocalInertia01 + _this1._transform._rotation01 * _this1._invLocalInertia11 + _this1._transform._rotation02 * _this1._invLocalInertia21; __tmp__022 = _this1._transform._rotation00 * _this1._invLocalInertia02 + _this1._transform._rotation01 * _this1._invLocalInertia12 + _this1._transform._rotation02 * _this1._invLocalInertia22; __tmp__102 = _this1._transform._rotation10 * _this1._invLocalInertia00 + _this1._transform._rotation11 * _this1._invLocalInertia10 + _this1._transform._rotation12 * _this1._invLocalInertia20; __tmp__112 = _this1._transform._rotation10 * _this1._invLocalInertia01 + _this1._transform._rotation11 * _this1._invLocalInertia11 + _this1._transform._rotation12 * _this1._invLocalInertia21; __tmp__122 = _this1._transform._rotation10 * _this1._invLocalInertia02 + _this1._transform._rotation11 * _this1._invLocalInertia12 + _this1._transform._rotation12 * _this1._invLocalInertia22; __tmp__202 = _this1._transform._rotation20 * _this1._invLocalInertia00 + _this1._transform._rotation21 * _this1._invLocalInertia10 + _this1._transform._rotation22 * _this1._invLocalInertia20; __tmp__212 = _this1._transform._rotation20 * _this1._invLocalInertia01 + _this1._transform._rotation21 * _this1._invLocalInertia11 + _this1._transform._rotation22 * _this1._invLocalInertia21; __tmp__222 = _this1._transform._rotation20 * _this1._invLocalInertia02 + _this1._transform._rotation21 * _this1._invLocalInertia12 + _this1._transform._rotation22 * _this1._invLocalInertia22; _this1._invInertia00 = __tmp__002; _this1._invInertia01 = __tmp__012; _this1._invInertia02 = __tmp__022; _this1._invInertia10 = __tmp__102; _this1._invInertia11 = __tmp__112; _this1._invInertia12 = __tmp__122; _this1._invInertia20 = __tmp__202; _this1._invInertia21 = __tmp__212; _this1._invInertia22 = __tmp__222; let __tmp__003; let __tmp__013; let __tmp__023; let __tmp__103; let __tmp__113; let __tmp__123; let __tmp__203; let __tmp__213; let __tmp__223; __tmp__003 = _this1._invInertia00 * _this1._transform._rotation00 + _this1._invInertia01 * _this1._transform._rotation01 + _this1._invInertia02 * _this1._transform._rotation02; __tmp__013 = _this1._invInertia00 * _this1._transform._rotation10 + _this1._invInertia01 * _this1._transform._rotation11 + _this1._invInertia02 * _this1._transform._rotation12; __tmp__023 = _this1._invInertia00 * _this1._transform._rotation20 + _this1._invInertia01 * _this1._transform._rotation21 + _this1._invInertia02 * _this1._transform._rotation22; __tmp__103 = _this1._invInertia10 * _this1._transform._rotation00 + _this1._invInertia11 * _this1._transform._rotation01 + _this1._invInertia12 * _this1._transform._rotation02; __tmp__113 = _this1._invInertia10 * _this1._transform._rotation10 + _this1._invInertia11 * _this1._transform._rotation11 + _this1._invInertia12 * _this1._transform._rotation12; __tmp__123 = _this1._invInertia10 * _this1._transform._rotation20 + _this1._invInertia11 * _this1._transform._rotation21 + _this1._invInertia12 * _this1._transform._rotation22; __tmp__203 = _this1._invInertia20 * _this1._transform._rotation00 + _this1._invInertia21 * _this1._transform._rotation01 + _this1._invInertia22 * _this1._transform._rotation02; __tmp__213 = _this1._invInertia20 * _this1._transform._rotation10 + _this1._invInertia21 * _this1._transform._rotation11 + _this1._invInertia22 * _this1._transform._rotation12; __tmp__223 = _this1._invInertia20 * _this1._transform._rotation20 + _this1._invInertia21 * _this1._transform._rotation21 + _this1._invInertia22 * _this1._transform._rotation22; _this1._invInertia00 = __tmp__003; _this1._invInertia01 = __tmp__013; _this1._invInertia02 = __tmp__023; _this1._invInertia10 = __tmp__103; _this1._invInertia11 = __tmp__113; _this1._invInertia12 = __tmp__123; _this1._invInertia20 = __tmp__203; _this1._invInertia21 = __tmp__213; _this1._invInertia22 = __tmp__223; _this1._invInertia00 *= _this1._rotFactor.x; _this1._invInertia01 *= _this1._rotFactor.x; _this1._invInertia02 *= _this1._rotFactor.x; _this1._invInertia10 *= _this1._rotFactor.y; _this1._invInertia11 *= _this1._rotFactor.y; _this1._invInertia12 *= _this1._rotFactor.y; _this1._invInertia20 *= _this1._rotFactor.z; _this1._invInertia21 *= _this1._rotFactor.z; _this1._invInertia22 *= _this1._rotFactor.z; } let _this = this.posBoundarySelector; let i = 0; while(_this.indices[i] != idx) ++i; while(i > 0) { let tmp = _this.indices[i]; _this.indices[i] = _this.indices[i - 1]; _this.indices[i - 1] = tmp; --i; } solved = true; break; } } if(!solved) { console.log("src/oimo/dynamics/constraint/solver/direct/DirectJointConstraintSolver.hx:502:","could not find solution. (NGS)"); return; } } postSolve() { this.joint._syncAnchors(); this.joint._checkDestruction(); } } oimo.dynamics.constraint.solver.direct.MassMatrix = class oimo_dynamics_constraint_solver_direct_MassMatrix { constructor(size) { this._size = size; this.tmpMatrix = new Array(this._size); this._invMass = new Array(this._size); this._invMassWithoutCfm = new Array(this._size); let _g = 0; let _g1 = this._size; while(_g < _g1) { let i = _g++; this.tmpMatrix[i] = new Array(this._size); this._invMass[i] = new Array(this._size); this._invMassWithoutCfm[i] = new Array(this._size); let _g1 = 0; let _g2 = this._size; while(_g1 < _g2) { let j = _g1++; this.tmpMatrix[i][j] = 0; this._invMass[i][j] = 0; this._invMassWithoutCfm[i][j] = 0; } } this._maxSubmatrixId = 1 << this._size; this._cacheComputed = new Array(this._maxSubmatrixId); this._cachedSubmatrices = new Array(this._maxSubmatrixId); let _g2 = 0; let _g3 = this._maxSubmatrixId; while(_g2 < _g3) { let i = _g2++; let t; t = (i & 85) + (i >> 1 & 85); t = (t & 51) + (t >> 2 & 51); t = (t & 15) + (t >> 4 & 15); let matrixSize = t; let subMatrix = new Array(matrixSize); let _g = 0; while(_g < matrixSize) { let j = _g++; subMatrix[j] = new Array(matrixSize); let _g1 = 0; while(_g1 < matrixSize) subMatrix[j][_g1++] = 0; } this._cacheComputed[i] = false; this._cachedSubmatrices[i] = subMatrix; } } computeSubmatrix(id,indices,size) { let _g = 0; while(_g < size) { let i = _g++; let ii = indices[i]; let _g1 = 0; while(_g1 < size) { let j = _g1++; this.tmpMatrix[i][j] = this._invMass[ii][indices[j]]; } } let src = this.tmpMatrix; let dst = this._cachedSubmatrices[id]; let srci; let dsti; let srcj; let dstj; let diag; switch(size) { case 4: srci = src[0]; dsti = dst[0]; diag = 1 / srci[0]; dsti[0] = diag; srci[1] *= diag; srci[2] *= diag; srci[3] *= diag; srcj = src[1]; dstj = dst[1]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj = src[2]; dstj = dst[2]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj = src[3]; dstj = dst[3]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srci = src[1]; dsti = dst[1]; diag = 1 / srci[1]; dsti[1] = diag; dsti[0] *= diag; srci[2] *= diag; srci[3] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj = src[2]; dstj = dst[2]; dstj[0] -= dsti[0] * srcj[1]; dstj[1] = -diag * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj = src[3]; dstj = dst[3]; dstj[0] -= dsti[0] * srcj[1]; dstj[1] = -diag * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srci = src[2]; dsti = dst[2]; diag = 1 / srci[2]; dsti[2] = diag; dsti[0] *= diag; dsti[1] *= diag; srci[3] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj = src[1]; dstj = dst[1]; dstj[0] -= dsti[0] * srcj[2]; dstj[1] -= dsti[1] * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj = src[3]; dstj = dst[3]; dstj[0] -= dsti[0] * srcj[2]; dstj[1] -= dsti[1] * srcj[2]; dstj[2] = -diag * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srci = src[3]; dsti = dst[3]; diag = 1 / srci[3]; dsti[3] = diag; dsti[0] *= diag; dsti[1] *= diag; dsti[2] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[3]; srcj = src[1]; dstj = dst[1]; dstj[0] -= dsti[0] * srcj[3]; dstj[1] -= dsti[1] * srcj[3]; srcj = src[2]; dstj = dst[2]; dstj[0] -= dsti[0] * srcj[3]; dstj[1] -= dsti[1] * srcj[3]; dstj[2] -= dsti[2] * srcj[3]; dsti = dst[1]; dst[0][1] = dsti[0]; dsti = dst[2]; dst[0][2] = dsti[0]; dst[1][2] = dsti[1]; dsti = dst[3]; dst[0][3] = dsti[0]; dst[1][3] = dsti[1]; dst[2][3] = dsti[2]; break; case 5: srci = src[0]; dsti = dst[0]; diag = 1 / srci[0]; dsti[0] = diag; srci[1] *= diag; srci[2] *= diag; srci[3] *= diag; srci[4] *= diag; srcj = src[1]; dstj = dst[1]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj[4] -= srci[4] * srcj[0]; srcj = src[2]; dstj = dst[2]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj[4] -= srci[4] * srcj[0]; srcj = src[3]; dstj = dst[3]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj[4] -= srci[4] * srcj[0]; srcj = src[4]; dstj = dst[4]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj[4] -= srci[4] * srcj[0]; srci = src[1]; dsti = dst[1]; diag = 1 / srci[1]; dsti[1] = diag; dsti[0] *= diag; srci[2] *= diag; srci[3] *= diag; srci[4] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj[4] -= srci[4] * srcj[1]; srcj = src[2]; dstj = dst[2]; dstj[0] -= dsti[0] * srcj[1]; dstj[1] = -diag * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj[4] -= srci[4] * srcj[1]; srcj = src[3]; dstj = dst[3]; dstj[0] -= dsti[0] * srcj[1]; dstj[1] = -diag * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj[4] -= srci[4] * srcj[1]; srcj = src[4]; dstj = dst[4]; dstj[0] -= dsti[0] * srcj[1]; dstj[1] = -diag * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj[4] -= srci[4] * srcj[1]; srci = src[2]; dsti = dst[2]; diag = 1 / srci[2]; dsti[2] = diag; dsti[0] *= diag; dsti[1] *= diag; srci[3] *= diag; srci[4] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj[4] -= srci[4] * srcj[2]; srcj = src[1]; dstj = dst[1]; dstj[0] -= dsti[0] * srcj[2]; dstj[1] -= dsti[1] * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj[4] -= srci[4] * srcj[2]; srcj = src[3]; dstj = dst[3]; dstj[0] -= dsti[0] * srcj[2]; dstj[1] -= dsti[1] * srcj[2]; dstj[2] = -diag * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj[4] -= srci[4] * srcj[2]; srcj = src[4]; dstj = dst[4]; dstj[0] -= dsti[0] * srcj[2]; dstj[1] -= dsti[1] * srcj[2]; dstj[2] = -diag * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj[4] -= srci[4] * srcj[2]; srci = src[3]; dsti = dst[3]; diag = 1 / srci[3]; dsti[3] = diag; dsti[0] *= diag; dsti[1] *= diag; dsti[2] *= diag; srci[4] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[3]; srcj[4] -= srci[4] * srcj[3]; srcj = src[1]; dstj = dst[1]; dstj[0] -= dsti[0] * srcj[3]; dstj[1] -= dsti[1] * srcj[3]; srcj[4] -= srci[4] * srcj[3]; srcj = src[2]; dstj = dst[2]; dstj[0] -= dsti[0] * srcj[3]; dstj[1] -= dsti[1] * srcj[3]; dstj[2] -= dsti[2] * srcj[3]; srcj[4] -= srci[4] * srcj[3]; srcj = src[4]; dstj = dst[4]; dstj[0] -= dsti[0] * srcj[3]; dstj[1] -= dsti[1] * srcj[3]; dstj[2] -= dsti[2] * srcj[3]; dstj[3] = -diag * srcj[3]; srcj[4] -= srci[4] * srcj[3]; srci = src[4]; dsti = dst[4]; diag = 1 / srci[4]; dsti[4] = diag; dsti[0] *= diag; dsti[1] *= diag; dsti[2] *= diag; dsti[3] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[4]; srcj = src[1]; dstj = dst[1]; dstj[0] -= dsti[0] * srcj[4]; dstj[1] -= dsti[1] * srcj[4]; srcj = src[2]; dstj = dst[2]; dstj[0] -= dsti[0] * srcj[4]; dstj[1] -= dsti[1] * srcj[4]; dstj[2] -= dsti[2] * srcj[4]; srcj = src[3]; dstj = dst[3]; dstj[0] -= dsti[0] * srcj[4]; dstj[1] -= dsti[1] * srcj[4]; dstj[2] -= dsti[2] * srcj[4]; dstj[3] -= dsti[3] * srcj[4]; dsti = dst[1]; dst[0][1] = dsti[0]; dsti = dst[2]; dst[0][2] = dsti[0]; dst[1][2] = dsti[1]; dsti = dst[3]; dst[0][3] = dsti[0]; dst[1][3] = dsti[1]; dst[2][3] = dsti[2]; dsti = dst[4]; dst[0][4] = dsti[0]; dst[1][4] = dsti[1]; dst[2][4] = dsti[2]; dst[3][4] = dsti[3]; break; case 6: srci = src[0]; dsti = dst[0]; diag = 1 / srci[0]; dsti[0] = diag; srci[1] *= diag; srci[2] *= diag; srci[3] *= diag; srci[4] *= diag; srci[5] *= diag; srcj = src[1]; dstj = dst[1]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj[4] -= srci[4] * srcj[0]; srcj[5] -= srci[5] * srcj[0]; srcj = src[2]; dstj = dst[2]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj[4] -= srci[4] * srcj[0]; srcj[5] -= srci[5] * srcj[0]; srcj = src[3]; dstj = dst[3]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj[4] -= srci[4] * srcj[0]; srcj[5] -= srci[5] * srcj[0]; srcj = src[4]; dstj = dst[4]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj[4] -= srci[4] * srcj[0]; srcj[5] -= srci[5] * srcj[0]; srcj = src[5]; dstj = dst[5]; dstj[0] = -diag * srcj[0]; srcj[1] -= srci[1] * srcj[0]; srcj[2] -= srci[2] * srcj[0]; srcj[3] -= srci[3] * srcj[0]; srcj[4] -= srci[4] * srcj[0]; srcj[5] -= srci[5] * srcj[0]; srci = src[1]; dsti = dst[1]; diag = 1 / srci[1]; dsti[1] = diag; dsti[0] *= diag; srci[2] *= diag; srci[3] *= diag; srci[4] *= diag; srci[5] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj[4] -= srci[4] * srcj[1]; srcj[5] -= srci[5] * srcj[1]; srcj = src[2]; dstj = dst[2]; dstj[0] -= dsti[0] * srcj[1]; dstj[1] = -diag * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj[4] -= srci[4] * srcj[1]; srcj[5] -= srci[5] * srcj[1]; srcj = src[3]; dstj = dst[3]; dstj[0] -= dsti[0] * srcj[1]; dstj[1] = -diag * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj[4] -= srci[4] * srcj[1]; srcj[5] -= srci[5] * srcj[1]; srcj = src[4]; dstj = dst[4]; dstj[0] -= dsti[0] * srcj[1]; dstj[1] = -diag * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj[4] -= srci[4] * srcj[1]; srcj[5] -= srci[5] * srcj[1]; srcj = src[5]; dstj = dst[5]; dstj[0] -= dsti[0] * srcj[1]; dstj[1] = -diag * srcj[1]; srcj[2] -= srci[2] * srcj[1]; srcj[3] -= srci[3] * srcj[1]; srcj[4] -= srci[4] * srcj[1]; srcj[5] -= srci[5] * srcj[1]; srci = src[2]; dsti = dst[2]; diag = 1 / srci[2]; dsti[2] = diag; dsti[0] *= diag; dsti[1] *= diag; srci[3] *= diag; srci[4] *= diag; srci[5] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj[4] -= srci[4] * srcj[2]; srcj[5] -= srci[5] * srcj[2]; srcj = src[1]; dstj = dst[1]; dstj[0] -= dsti[0] * srcj[2]; dstj[1] -= dsti[1] * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj[4] -= srci[4] * srcj[2]; srcj[5] -= srci[5] * srcj[2]; srcj = src[3]; dstj = dst[3]; dstj[0] -= dsti[0] * srcj[2]; dstj[1] -= dsti[1] * srcj[2]; dstj[2] = -diag * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj[4] -= srci[4] * srcj[2]; srcj[5] -= srci[5] * srcj[2]; srcj = src[4]; dstj = dst[4]; dstj[0] -= dsti[0] * srcj[2]; dstj[1] -= dsti[1] * srcj[2]; dstj[2] = -diag * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj[4] -= srci[4] * srcj[2]; srcj[5] -= srci[5] * srcj[2]; srcj = src[5]; dstj = dst[5]; dstj[0] -= dsti[0] * srcj[2]; dstj[1] -= dsti[1] * srcj[2]; dstj[2] = -diag * srcj[2]; srcj[3] -= srci[3] * srcj[2]; srcj[4] -= srci[4] * srcj[2]; srcj[5] -= srci[5] * srcj[2]; srci = src[3]; dsti = dst[3]; diag = 1 / srci[3]; dsti[3] = diag; dsti[0] *= diag; dsti[1] *= diag; dsti[2] *= diag; srci[4] *= diag; srci[5] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[3]; srcj[4] -= srci[4] * srcj[3]; srcj[5] -= srci[5] * srcj[3]; srcj = src[1]; dstj = dst[1]; dstj[0] -= dsti[0] * srcj[3]; dstj[1] -= dsti[1] * srcj[3]; srcj[4] -= srci[4] * srcj[3]; srcj[5] -= srci[5] * srcj[3]; srcj = src[2]; dstj = dst[2]; dstj[0] -= dsti[0] * srcj[3]; dstj[1] -= dsti[1] * srcj[3]; dstj[2] -= dsti[2] * srcj[3]; srcj[4] -= srci[4] * srcj[3]; srcj[5] -= srci[5] * srcj[3]; srcj = src[4]; dstj = dst[4]; dstj[0] -= dsti[0] * srcj[3]; dstj[1] -= dsti[1] * srcj[3]; dstj[2] -= dsti[2] * srcj[3]; dstj[3] = -diag * srcj[3]; srcj[4] -= srci[4] * srcj[3]; srcj[5] -= srci[5] * srcj[3]; srcj = src[5]; dstj = dst[5]; dstj[0] -= dsti[0] * srcj[3]; dstj[1] -= dsti[1] * srcj[3]; dstj[2] -= dsti[2] * srcj[3]; dstj[3] = -diag * srcj[3]; srcj[4] -= srci[4] * srcj[3]; srcj[5] -= srci[5] * srcj[3]; srci = src[4]; dsti = dst[4]; diag = 1 / srci[4]; dsti[4] = diag; dsti[0] *= diag; dsti[1] *= diag; dsti[2] *= diag; dsti[3] *= diag; srci[5] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[4]; srcj[5] -= srci[5] * srcj[4]; srcj = src[1]; dstj = dst[1]; dstj[0] -= dsti[0] * srcj[4]; dstj[1] -= dsti[1] * srcj[4]; srcj[5] -= srci[5] * srcj[4]; srcj = src[2]; dstj = dst[2]; dstj[0] -= dsti[0] * srcj[4]; dstj[1] -= dsti[1] * srcj[4]; dstj[2] -= dsti[2] * srcj[4]; srcj[5] -= srci[5] * srcj[4]; srcj = src[3]; dstj = dst[3]; dstj[0] -= dsti[0] * srcj[4]; dstj[1] -= dsti[1] * srcj[4]; dstj[2] -= dsti[2] * srcj[4]; dstj[3] -= dsti[3] * srcj[4]; srcj[5] -= srci[5] * srcj[4]; srcj = src[5]; dstj = dst[5]; dstj[0] -= dsti[0] * srcj[4]; dstj[1] -= dsti[1] * srcj[4]; dstj[2] -= dsti[2] * srcj[4]; dstj[3] -= dsti[3] * srcj[4]; dstj[4] = -diag * srcj[4]; srcj[5] -= srci[5] * srcj[4]; srci = src[5]; dsti = dst[5]; diag = 1 / srci[5]; dsti[5] = diag; dsti[0] *= diag; dsti[1] *= diag; dsti[2] *= diag; dsti[3] *= diag; dsti[4] *= diag; srcj = src[0]; dstj = dst[0]; dstj[0] -= dsti[0] * srcj[5]; srcj = src[1]; dstj = dst[1]; dstj[0] -= dsti[0] * srcj[5]; dstj[1] -= dsti[1] * srcj[5]; srcj = src[2]; dstj = dst[2]; dstj[0] -= dsti[0] * srcj[5]; dstj[1] -= dsti[1] * srcj[5]; dstj[2] -= dsti[2] * srcj[5]; srcj = src[3]; dstj = dst[3]; dstj[0] -= dsti[0] * srcj[5]; dstj[1] -= dsti[1] * srcj[5]; dstj[2] -= dsti[2] * srcj[5]; dstj[3] -= dsti[3] * srcj[5]; srcj = src[4]; dstj = dst[4]; dstj[0] -= dsti[0] * srcj[5]; dstj[1] -= dsti[1] * srcj[5]; dstj[2] -= dsti[2] * srcj[5]; dstj[3] -= dsti[3] * srcj[5]; dstj[4] -= dsti[4] * srcj[5]; dsti = dst[1]; dst[0][1] = dsti[0]; dsti = dst[2]; dst[0][2] = dsti[0]; dst[1][2] = dsti[1]; dsti = dst[3]; dst[0][3] = dsti[0]; dst[1][3] = dsti[1]; dst[2][3] = dsti[2]; dsti = dst[4]; dst[0][4] = dsti[0]; dst[1][4] = dsti[1]; dst[2][4] = dsti[2]; dst[3][4] = dsti[3]; dsti = dst[5]; dst[0][5] = dsti[0]; dst[1][5] = dsti[1]; dst[2][5] = dsti[2]; dst[3][5] = dsti[3]; dst[4][5] = dsti[4]; break; default: let _g1 = 0; while(_g1 < size) { let i = _g1++; srci = src[i]; dsti = dst[i]; let diag = 1 / srci[i]; dsti[i] = diag; let _g = 0; while(_g < i) dsti[_g++] *= diag; let _g2 = i + 1; while(_g2 < size) srci[_g2++] *= diag; let _g3 = 0; while(_g3 < i) { let j = _g3++; srcj = src[j]; dstj = dst[j]; let _g = 0; let _g1 = j + 1; while(_g < _g1) { let k = _g++; dstj[k] -= dsti[k] * srcj[i]; } let _g2 = i + 1; while(_g2 < size) { let k = _g2++; srcj[k] -= srci[k] * srcj[i]; } } let _g4 = i + 1; while(_g4 < size) { let j = _g4++; srcj = src[j]; dstj = dst[j]; let _g = 0; while(_g < i) { let k = _g++; dstj[k] -= dsti[k] * srcj[i]; } dstj[i] = -diag * srcj[i]; let _g1 = i + 1; while(_g1 < size) { let k = _g1++; srcj[k] -= srci[k] * srcj[i]; } } } let _g2 = 1; while(_g2 < size) { let i = _g2++; dsti = dst[i]; let _g = 0; while(_g < i) { let j = _g++; dst[j][i] = dsti[j]; } } } } computeInvMass(info,massData) { let invMass = this._invMass; let invMassWithoutCfm = this._invMassWithoutCfm; let numRows = info.numRows; let b1 = info.b1; let b2 = info.b2; let invM1 = b1._invMass; let invM2 = b2._invMass; let invI100; let invI101; let invI102; let invI110; let invI111; let invI112; let invI120; let invI121; let invI122; let invI200; let invI201; let invI202; let invI210; let invI211; let invI212; let invI220; let invI221; let invI222; invI100 = b1._invInertia00; invI101 = b1._invInertia01; invI102 = b1._invInertia02; invI110 = b1._invInertia10; invI111 = b1._invInertia11; invI112 = b1._invInertia12; invI120 = b1._invInertia20; invI121 = b1._invInertia21; invI122 = b1._invInertia22; invI200 = b2._invInertia00; invI201 = b2._invInertia01; invI202 = b2._invInertia02; invI210 = b2._invInertia10; invI211 = b2._invInertia11; invI212 = b2._invInertia12; invI220 = b2._invInertia20; invI221 = b2._invInertia21; invI222 = b2._invInertia22; let _g = 0; while(_g < numRows) { let i = _g++; let j = info.rows[i].jacobian; let md = massData[i]; j.updateSparsity(); if((j.flag & 1) != 0) { md.invMLin1X = j.lin1X * invM1; md.invMLin1Y = j.lin1Y * invM1; md.invMLin1Z = j.lin1Z * invM1; md.invMLin2X = j.lin2X * invM2; md.invMLin2Y = j.lin2Y * invM2; md.invMLin2Z = j.lin2Z * invM2; } else { md.invMLin1X = 0; md.invMLin1Y = 0; md.invMLin1Z = 0; md.invMLin2X = 0; md.invMLin2Y = 0; md.invMLin2Z = 0; } if((j.flag & 2) != 0) { let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z; __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z; __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z; md.invMAng1X = __tmp__X; md.invMAng1Y = __tmp__Y; md.invMAng1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z; __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z; __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z; md.invMAng2X = __tmp__X1; md.invMAng2Y = __tmp__Y1; md.invMAng2Z = __tmp__Z1; } else { md.invMAng1X = 0; md.invMAng1Y = 0; md.invMAng1Z = 0; md.invMAng2X = 0; md.invMAng2Y = 0; md.invMAng2Z = 0; } } let _g1 = 0; while(_g1 < numRows) { let i = _g1++; let j1 = info.rows[i].jacobian; let _g = i; while(_g < numRows) { let j = _g++; let md2 = massData[j]; let val = j1.lin1X * md2.invMLin1X + j1.lin1Y * md2.invMLin1Y + j1.lin1Z * md2.invMLin1Z + (j1.ang1X * md2.invMAng1X + j1.ang1Y * md2.invMAng1Y + j1.ang1Z * md2.invMAng1Z) + (j1.lin2X * md2.invMLin2X + j1.lin2Y * md2.invMLin2Y + j1.lin2Z * md2.invMLin2Z) + (j1.ang2X * md2.invMAng2X + j1.ang2Y * md2.invMAng2Y + j1.ang2Z * md2.invMAng2Z); if(i == j) { invMass[i][j] = val + info.rows[i].cfm; invMassWithoutCfm[i][j] = val; md2.mass = val + info.rows[i].cfm; md2.massWithoutCfm = val; if(md2.mass != 0) { md2.mass = 1 / md2.mass; } if(md2.massWithoutCfm != 0) { md2.massWithoutCfm = 1 / md2.massWithoutCfm; } } else { invMass[i][j] = val; invMass[j][i] = val; invMassWithoutCfm[i][j] = val; invMassWithoutCfm[j][i] = val; } } } let _g2 = 0; let _g3 = this._maxSubmatrixId; while(_g2 < _g3) this._cacheComputed[_g2++] = false; } } if(!oimo.dynamics.constraint.solver.pgs) oimo.dynamics.constraint.solver.pgs = {}; oimo.dynamics.constraint.solver.pgs.PgsContactConstraintSolver = class oimo_dynamics_constraint_solver_pgs_PgsContactConstraintSolver extends oimo.dynamics.constraint.ConstraintSolver { constructor(constraint) { super(); this.constraint = constraint; this.info = new oimo.dynamics.constraint.info.contact.ContactSolverInfo(); this.massData = new Array(oimo.common.Setting.maxManifoldPoints); let _g = 0; let _g1 = this.massData.length; while(_g < _g1) this.massData[_g++] = new oimo.dynamics.constraint.solver.common.ContactSolverMassDataRow(); } preSolveVelocity(timeStep) { this.constraint._getVelocitySolverInfo(timeStep,this.info); this._b1 = this.info.b1; this._b2 = this.info.b2; let invM1 = this._b1._invMass; let invM2 = this._b2._invMass; let invI100; let invI101; let invI102; let invI110; let invI111; let invI112; let invI120; let invI121; let invI122; let invI200; let invI201; let invI202; let invI210; let invI211; let invI212; let invI220; let invI221; let invI222; invI100 = this._b1._invInertia00; invI101 = this._b1._invInertia01; invI102 = this._b1._invInertia02; invI110 = this._b1._invInertia10; invI111 = this._b1._invInertia11; invI112 = this._b1._invInertia12; invI120 = this._b1._invInertia20; invI121 = this._b1._invInertia21; invI122 = this._b1._invInertia22; invI200 = this._b2._invInertia00; invI201 = this._b2._invInertia01; invI202 = this._b2._invInertia02; invI210 = this._b2._invInertia10; invI211 = this._b2._invInertia11; invI212 = this._b2._invInertia12; invI220 = this._b2._invInertia20; invI221 = this._b2._invInertia21; invI222 = this._b2._invInertia22; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let row = this.info.rows[i]; let md = this.massData[i]; let j = row.jacobianN; md.invMLinN1X = j.lin1X * invM1; md.invMLinN1Y = j.lin1Y * invM1; md.invMLinN1Z = j.lin1Z * invM1; md.invMLinN2X = j.lin2X * invM2; md.invMLinN2Y = j.lin2Y * invM2; md.invMLinN2Z = j.lin2Z * invM2; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z; __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z; __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z; md.invMAngN1X = __tmp__X; md.invMAngN1Y = __tmp__Y; md.invMAngN1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z; __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z; __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z; md.invMAngN2X = __tmp__X1; md.invMAngN2Y = __tmp__Y1; md.invMAngN2Z = __tmp__Z1; md.massN = invM1 + invM2 + (md.invMAngN1X * j.ang1X + md.invMAngN1Y * j.ang1Y + md.invMAngN1Z * j.ang1Z) + (md.invMAngN2X * j.ang2X + md.invMAngN2Y * j.ang2Y + md.invMAngN2Z * j.ang2Z); if(md.massN != 0) { md.massN = 1 / md.massN; } let jt = row.jacobianT; let jb = row.jacobianB; md.invMLinT1X = jt.lin1X * invM1; md.invMLinT1Y = jt.lin1Y * invM1; md.invMLinT1Z = jt.lin1Z * invM1; md.invMLinT2X = jt.lin2X * invM2; md.invMLinT2Y = jt.lin2Y * invM2; md.invMLinT2Z = jt.lin2Z * invM2; md.invMLinB1X = jb.lin1X * invM1; md.invMLinB1Y = jb.lin1Y * invM1; md.invMLinB1Z = jb.lin1Z * invM1; md.invMLinB2X = jb.lin2X * invM2; md.invMLinB2Y = jb.lin2Y * invM2; md.invMLinB2Z = jb.lin2Z * invM2; let __tmp__X2; let __tmp__Y2; let __tmp__Z2; __tmp__X2 = invI100 * jt.ang1X + invI101 * jt.ang1Y + invI102 * jt.ang1Z; __tmp__Y2 = invI110 * jt.ang1X + invI111 * jt.ang1Y + invI112 * jt.ang1Z; __tmp__Z2 = invI120 * jt.ang1X + invI121 * jt.ang1Y + invI122 * jt.ang1Z; md.invMAngT1X = __tmp__X2; md.invMAngT1Y = __tmp__Y2; md.invMAngT1Z = __tmp__Z2; let __tmp__X3; let __tmp__Y3; let __tmp__Z3; __tmp__X3 = invI200 * jt.ang2X + invI201 * jt.ang2Y + invI202 * jt.ang2Z; __tmp__Y3 = invI210 * jt.ang2X + invI211 * jt.ang2Y + invI212 * jt.ang2Z; __tmp__Z3 = invI220 * jt.ang2X + invI221 * jt.ang2Y + invI222 * jt.ang2Z; md.invMAngT2X = __tmp__X3; md.invMAngT2Y = __tmp__Y3; md.invMAngT2Z = __tmp__Z3; let __tmp__X4; let __tmp__Y4; let __tmp__Z4; __tmp__X4 = invI100 * jb.ang1X + invI101 * jb.ang1Y + invI102 * jb.ang1Z; __tmp__Y4 = invI110 * jb.ang1X + invI111 * jb.ang1Y + invI112 * jb.ang1Z; __tmp__Z4 = invI120 * jb.ang1X + invI121 * jb.ang1Y + invI122 * jb.ang1Z; md.invMAngB1X = __tmp__X4; md.invMAngB1Y = __tmp__Y4; md.invMAngB1Z = __tmp__Z4; let __tmp__X5; let __tmp__Y5; let __tmp__Z5; __tmp__X5 = invI200 * jb.ang2X + invI201 * jb.ang2Y + invI202 * jb.ang2Z; __tmp__Y5 = invI210 * jb.ang2X + invI211 * jb.ang2Y + invI212 * jb.ang2Z; __tmp__Z5 = invI220 * jb.ang2X + invI221 * jb.ang2Y + invI222 * jb.ang2Z; md.invMAngB2X = __tmp__X5; md.invMAngB2Y = __tmp__Y5; md.invMAngB2Z = __tmp__Z5; let invMassTB00 = invM1 + invM2 + (md.invMAngT1X * jt.ang1X + md.invMAngT1Y * jt.ang1Y + md.invMAngT1Z * jt.ang1Z) + (md.invMAngT2X * jt.ang2X + md.invMAngT2Y * jt.ang2Y + md.invMAngT2Z * jt.ang2Z); let invMassTB01 = md.invMAngT1X * jb.ang1X + md.invMAngT1Y * jb.ang1Y + md.invMAngT1Z * jb.ang1Z + (md.invMAngT2X * jb.ang2X + md.invMAngT2Y * jb.ang2Y + md.invMAngT2Z * jb.ang2Z); let invMassTB11 = invM1 + invM2 + (md.invMAngB1X * jb.ang1X + md.invMAngB1Y * jb.ang1Y + md.invMAngB1Z * jb.ang1Z) + (md.invMAngB2X * jb.ang2X + md.invMAngB2Y * jb.ang2Y + md.invMAngB2Z * jb.ang2Z); let invDet = invMassTB00 * invMassTB11 - invMassTB01 * invMassTB01; if(invDet != 0) { invDet = 1 / invDet; } md.massTB00 = invMassTB11 * invDet; md.massTB01 = -invMassTB01 * invDet; md.massTB10 = -invMassTB01 * invDet; md.massTB11 = invMassTB00 * invDet; } } warmStart(timeStep) { let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._velX; lv1Y = this._b1._velY; lv1Z = this._b1._velZ; lv2X = this._b2._velX; lv2Y = this._b2._velY; lv2Z = this._b2._velZ; av1X = this._b1._angVelX; av1Y = this._b1._angVelY; av1Z = this._b1._angVelZ; av2X = this._b2._angVelX; av2Y = this._b2._angVelY; av2Z = this._b2._angVelZ; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let row = this.info.rows[i]; let imp = row.impulse; let md = this.massData[i]; let jt = row.jacobianT; let jb = row.jacobianB; let impulseN = imp.impulseN; let impulseT = imp.impulseLX * jt.lin1X + imp.impulseLY * jt.lin1Y + imp.impulseLZ * jt.lin1Z; let impulseB = imp.impulseLX * jb.lin1X + imp.impulseLY * jb.lin1Y + imp.impulseLZ * jb.lin1Z; imp.impulseT = impulseT; imp.impulseB = impulseB; imp.impulseN *= timeStep.dtRatio; imp.impulseT *= timeStep.dtRatio; imp.impulseB *= timeStep.dtRatio; lv1X += md.invMLinN1X * impulseN; lv1Y += md.invMLinN1Y * impulseN; lv1Z += md.invMLinN1Z * impulseN; lv1X += md.invMLinT1X * impulseT; lv1Y += md.invMLinT1Y * impulseT; lv1Z += md.invMLinT1Z * impulseT; lv1X += md.invMLinB1X * impulseB; lv1Y += md.invMLinB1Y * impulseB; lv1Z += md.invMLinB1Z * impulseB; lv2X += md.invMLinN2X * -impulseN; lv2Y += md.invMLinN2Y * -impulseN; lv2Z += md.invMLinN2Z * -impulseN; lv2X += md.invMLinT2X * -impulseT; lv2Y += md.invMLinT2Y * -impulseT; lv2Z += md.invMLinT2Z * -impulseT; lv2X += md.invMLinB2X * -impulseB; lv2Y += md.invMLinB2Y * -impulseB; lv2Z += md.invMLinB2Z * -impulseB; av1X += md.invMAngN1X * impulseN; av1Y += md.invMAngN1Y * impulseN; av1Z += md.invMAngN1Z * impulseN; av1X += md.invMAngT1X * impulseT; av1Y += md.invMAngT1Y * impulseT; av1Z += md.invMAngT1Z * impulseT; av1X += md.invMAngB1X * impulseB; av1Y += md.invMAngB1Y * impulseB; av1Z += md.invMAngB1Z * impulseB; av2X += md.invMAngN2X * -impulseN; av2Y += md.invMAngN2Y * -impulseN; av2Z += md.invMAngN2Z * -impulseN; av2X += md.invMAngT2X * -impulseT; av2Y += md.invMAngT2Y * -impulseT; av2Z += md.invMAngT2Z * -impulseT; av2X += md.invMAngB2X * -impulseB; av2Y += md.invMAngB2Y * -impulseB; av2Z += md.invMAngB2Z * -impulseB; } this._b1._velX = lv1X; this._b1._velY = lv1Y; this._b1._velZ = lv1Z; this._b2._velX = lv2X; this._b2._velY = lv2Y; this._b2._velZ = lv2Z; this._b1._angVelX = av1X; this._b1._angVelY = av1Y; this._b1._angVelZ = av1Z; this._b2._angVelX = av2X; this._b2._angVelY = av2Y; this._b2._angVelZ = av2Z; } solveVelocity() { let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._velX; lv1Y = this._b1._velY; lv1Z = this._b1._velZ; lv2X = this._b2._velX; lv2Y = this._b2._velY; lv2Z = this._b2._velZ; av1X = this._b1._angVelX; av1Y = this._b1._angVelY; av1Z = this._b1._angVelZ; av2X = this._b2._angVelX; av2Y = this._b2._angVelY; av2Z = this._b2._angVelZ; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let row = this.info.rows[i]; let md = this.massData[i]; let imp = row.impulse; let rvt = 0; let j = row.jacobianT; rvt += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; rvt -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; rvt += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; rvt -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; let rvb = 0; j = row.jacobianB; rvb += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; rvb -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; rvb += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; rvb -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; let impulseT = -(rvt * md.massTB00 + rvb * md.massTB01); let impulseB = -(rvt * md.massTB10 + rvb * md.massTB11); let oldImpulseT = imp.impulseT; let oldImpulseB = imp.impulseB; imp.impulseT += impulseT; imp.impulseB += impulseB; let maxImpulse = row.friction * imp.impulseN; if(maxImpulse == 0) { imp.impulseT = 0; imp.impulseB = 0; } else { let impulseLengthSq = imp.impulseT * imp.impulseT + imp.impulseB * imp.impulseB; if(impulseLengthSq > maxImpulse * maxImpulse) { let invL = maxImpulse / Math.sqrt(impulseLengthSq); imp.impulseT *= invL; imp.impulseB *= invL; } } impulseT = imp.impulseT - oldImpulseT; impulseB = imp.impulseB - oldImpulseB; lv1X += md.invMLinT1X * impulseT; lv1Y += md.invMLinT1Y * impulseT; lv1Z += md.invMLinT1Z * impulseT; lv1X += md.invMLinB1X * impulseB; lv1Y += md.invMLinB1Y * impulseB; lv1Z += md.invMLinB1Z * impulseB; lv2X += md.invMLinT2X * -impulseT; lv2Y += md.invMLinT2Y * -impulseT; lv2Z += md.invMLinT2Z * -impulseT; lv2X += md.invMLinB2X * -impulseB; lv2Y += md.invMLinB2Y * -impulseB; lv2Z += md.invMLinB2Z * -impulseB; av1X += md.invMAngT1X * impulseT; av1Y += md.invMAngT1Y * impulseT; av1Z += md.invMAngT1Z * impulseT; av1X += md.invMAngB1X * impulseB; av1Y += md.invMAngB1Y * impulseB; av1Z += md.invMAngB1Z * impulseB; av2X += md.invMAngT2X * -impulseT; av2Y += md.invMAngT2Y * -impulseT; av2Z += md.invMAngT2Z * -impulseT; av2X += md.invMAngB2X * -impulseB; av2Y += md.invMAngB2Y * -impulseB; av2Z += md.invMAngB2Z * -impulseB; } let _g2 = 0; let _g3 = this.info.numRows; while(_g2 < _g3) { let i = _g2++; let row = this.info.rows[i]; let md = this.massData[i]; let imp = row.impulse; let rvn = 0; let j = row.jacobianN; rvn += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; rvn -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; rvn += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; rvn -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; let impulseN = (row.rhs - rvn) * md.massN; let oldImpulseN = imp.impulseN; imp.impulseN += impulseN; if(imp.impulseN < 0) { imp.impulseN = 0; } impulseN = imp.impulseN - oldImpulseN; lv1X += md.invMLinN1X * impulseN; lv1Y += md.invMLinN1Y * impulseN; lv1Z += md.invMLinN1Z * impulseN; lv2X += md.invMLinN2X * -impulseN; lv2Y += md.invMLinN2Y * -impulseN; lv2Z += md.invMLinN2Z * -impulseN; av1X += md.invMAngN1X * impulseN; av1Y += md.invMAngN1Y * impulseN; av1Z += md.invMAngN1Z * impulseN; av2X += md.invMAngN2X * -impulseN; av2Y += md.invMAngN2Y * -impulseN; av2Z += md.invMAngN2Z * -impulseN; } this._b1._velX = lv1X; this._b1._velY = lv1Y; this._b1._velZ = lv1Z; this._b2._velX = lv2X; this._b2._velY = lv2Y; this._b2._velZ = lv2Z; this._b1._angVelX = av1X; this._b1._angVelY = av1Y; this._b1._angVelZ = av1Z; this._b2._angVelX = av2X; this._b2._angVelY = av2Y; this._b2._angVelZ = av2Z; } preSolvePosition(timeStep) { this.constraint._syncManifold(); this.constraint._getPositionSolverInfo(this.info); let invM1 = this._b1._invMass; let invM2 = this._b2._invMass; let invI100; let invI101; let invI102; let invI110; let invI111; let invI112; let invI120; let invI121; let invI122; let invI200; let invI201; let invI202; let invI210; let invI211; let invI212; let invI220; let invI221; let invI222; invI100 = this._b1._invInertia00; invI101 = this._b1._invInertia01; invI102 = this._b1._invInertia02; invI110 = this._b1._invInertia10; invI111 = this._b1._invInertia11; invI112 = this._b1._invInertia12; invI120 = this._b1._invInertia20; invI121 = this._b1._invInertia21; invI122 = this._b1._invInertia22; invI200 = this._b2._invInertia00; invI201 = this._b2._invInertia01; invI202 = this._b2._invInertia02; invI210 = this._b2._invInertia10; invI211 = this._b2._invInertia11; invI212 = this._b2._invInertia12; invI220 = this._b2._invInertia20; invI221 = this._b2._invInertia21; invI222 = this._b2._invInertia22; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let md = this.massData[i]; let j = this.info.rows[i].jacobianN; md.invMLinN1X = j.lin1X * invM1; md.invMLinN1Y = j.lin1Y * invM1; md.invMLinN1Z = j.lin1Z * invM1; md.invMLinN2X = j.lin2X * invM2; md.invMLinN2Y = j.lin2Y * invM2; md.invMLinN2Z = j.lin2Z * invM2; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z; __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z; __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z; md.invMAngN1X = __tmp__X; md.invMAngN1Y = __tmp__Y; md.invMAngN1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z; __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z; __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z; md.invMAngN2X = __tmp__X1; md.invMAngN2Y = __tmp__Y1; md.invMAngN2Z = __tmp__Z1; md.massN = invM1 + invM2 + (md.invMAngN1X * j.ang1X + md.invMAngN1Y * j.ang1Y + md.invMAngN1Z * j.ang1Z) + (md.invMAngN2X * j.ang2X + md.invMAngN2Y * j.ang2Y + md.invMAngN2Z * j.ang2Z); if(md.massN != 0) { md.massN = 1 / md.massN; } } let _g2 = 0; let _g3 = this.info.numRows; while(_g2 < _g3) this.info.rows[_g2++].impulse.impulseP = 0; } solvePositionSplitImpulse() { let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._pseudoVelX; lv1Y = this._b1._pseudoVelY; lv1Z = this._b1._pseudoVelZ; lv2X = this._b2._pseudoVelX; lv2Y = this._b2._pseudoVelY; lv2Z = this._b2._pseudoVelZ; av1X = this._b1._angPseudoVelX; av1Y = this._b1._angPseudoVelY; av1Z = this._b1._angPseudoVelZ; av2X = this._b2._angPseudoVelX; av2Y = this._b2._angPseudoVelY; av2Z = this._b2._angPseudoVelZ; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let row = this.info.rows[i]; let md = this.massData[i]; let imp = row.impulse; let j = row.jacobianN; let rvn = 0; rvn += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; rvn -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; rvn += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; rvn -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; let impulseP = (row.rhs - rvn) * md.massN * oimo.common.Setting.positionSplitImpulseBaumgarte; let oldImpulseP = imp.impulseP; imp.impulseP += impulseP; if(imp.impulseP < 0) { imp.impulseP = 0; } impulseP = imp.impulseP - oldImpulseP; lv1X += md.invMLinN1X * impulseP; lv1Y += md.invMLinN1Y * impulseP; lv1Z += md.invMLinN1Z * impulseP; lv2X += md.invMLinN2X * -impulseP; lv2Y += md.invMLinN2Y * -impulseP; lv2Z += md.invMLinN2Z * -impulseP; av1X += md.invMAngN1X * impulseP; av1Y += md.invMAngN1Y * impulseP; av1Z += md.invMAngN1Z * impulseP; av2X += md.invMAngN2X * -impulseP; av2Y += md.invMAngN2Y * -impulseP; av2Z += md.invMAngN2Z * -impulseP; } this._b1._pseudoVelX = lv1X; this._b1._pseudoVelY = lv1Y; this._b1._pseudoVelZ = lv1Z; this._b2._pseudoVelX = lv2X; this._b2._pseudoVelY = lv2Y; this._b2._pseudoVelZ = lv2Z; this._b1._angPseudoVelX = av1X; this._b1._angPseudoVelY = av1Y; this._b1._angPseudoVelZ = av1Z; this._b2._angPseudoVelX = av2X; this._b2._angPseudoVelY = av2Y; this._b2._angPseudoVelZ = av2Z; } solvePositionNgs(timeStep) { this.constraint._syncManifold(); this.constraint._getPositionSolverInfo(this.info); let invM1 = this._b1._invMass; let invM2 = this._b2._invMass; let invI100; let invI101; let invI102; let invI110; let invI111; let invI112; let invI120; let invI121; let invI122; let invI200; let invI201; let invI202; let invI210; let invI211; let invI212; let invI220; let invI221; let invI222; invI100 = this._b1._invInertia00; invI101 = this._b1._invInertia01; invI102 = this._b1._invInertia02; invI110 = this._b1._invInertia10; invI111 = this._b1._invInertia11; invI112 = this._b1._invInertia12; invI120 = this._b1._invInertia20; invI121 = this._b1._invInertia21; invI122 = this._b1._invInertia22; invI200 = this._b2._invInertia00; invI201 = this._b2._invInertia01; invI202 = this._b2._invInertia02; invI210 = this._b2._invInertia10; invI211 = this._b2._invInertia11; invI212 = this._b2._invInertia12; invI220 = this._b2._invInertia20; invI221 = this._b2._invInertia21; invI222 = this._b2._invInertia22; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let md = this.massData[i]; let j = this.info.rows[i].jacobianN; md.invMLinN1X = j.lin1X * invM1; md.invMLinN1Y = j.lin1Y * invM1; md.invMLinN1Z = j.lin1Z * invM1; md.invMLinN2X = j.lin2X * invM2; md.invMLinN2Y = j.lin2Y * invM2; md.invMLinN2Z = j.lin2Z * invM2; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z; __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z; __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z; md.invMAngN1X = __tmp__X; md.invMAngN1Y = __tmp__Y; md.invMAngN1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z; __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z; __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z; md.invMAngN2X = __tmp__X1; md.invMAngN2Y = __tmp__Y1; md.invMAngN2Z = __tmp__Z1; md.massN = invM1 + invM2 + (md.invMAngN1X * j.ang1X + md.invMAngN1Y * j.ang1Y + md.invMAngN1Z * j.ang1Z) + (md.invMAngN2X * j.ang2X + md.invMAngN2Y * j.ang2Y + md.invMAngN2Z * j.ang2Z); if(md.massN != 0) { md.massN = 1 / md.massN; } } let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = 0; lv1Y = 0; lv1Z = 0; lv2X = 0; lv2Y = 0; lv2Z = 0; av1X = 0; av1Y = 0; av1Z = 0; av2X = 0; av2Y = 0; av2Z = 0; let _g2 = 0; let _g3 = this.info.numRows; while(_g2 < _g3) { let i = _g2++; let row = this.info.rows[i]; let md = this.massData[i]; let imp = row.impulse; let j = row.jacobianN; let rvn = 0; rvn += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; rvn -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; rvn += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; rvn -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; let impulseP = (row.rhs - rvn) * md.massN * oimo.common.Setting.positionNgsBaumgarte; let oldImpulseP = imp.impulseP; imp.impulseP += impulseP; if(imp.impulseP < 0) { imp.impulseP = 0; } impulseP = imp.impulseP - oldImpulseP; lv1X += md.invMLinN1X * impulseP; lv1Y += md.invMLinN1Y * impulseP; lv1Z += md.invMLinN1Z * impulseP; lv2X += md.invMLinN2X * -impulseP; lv2Y += md.invMLinN2Y * -impulseP; lv2Z += md.invMLinN2Z * -impulseP; av1X += md.invMAngN1X * impulseP; av1Y += md.invMAngN1Y * impulseP; av1Z += md.invMAngN1Z * impulseP; av2X += md.invMAngN2X * -impulseP; av2Y += md.invMAngN2Y * -impulseP; av2Z += md.invMAngN2Z * -impulseP; } let _this = this._b1; _this._transform._positionX += lv1X; _this._transform._positionY += lv1Y; _this._transform._positionZ += lv1Z; let _this1 = this._b2; _this1._transform._positionX += lv2X; _this1._transform._positionY += lv2Y; _this1._transform._positionZ += lv2Z; let _this2 = this._b1; let theta = Math.sqrt(av1X * av1X + av1Y * av1Y + av1Z * av1Z); let halfTheta = theta * 0.5; let rotationToSinAxisFactor; let cosHalfTheta; if(halfTheta < 0.5) { let ht2 = halfTheta * halfTheta; rotationToSinAxisFactor = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332); cosHalfTheta = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664; } else { rotationToSinAxisFactor = Math.sin(halfTheta) / theta; cosHalfTheta = Math.cos(halfTheta); } let sinAxisX; let sinAxisY; let sinAxisZ; sinAxisX = av1X * rotationToSinAxisFactor; sinAxisY = av1Y * rotationToSinAxisFactor; sinAxisZ = av1Z * rotationToSinAxisFactor; let dqX; let dqY; let dqZ; let dqW; dqX = sinAxisX; dqY = sinAxisY; dqZ = sinAxisZ; dqW = cosHalfTheta; let qX; let qY; let qZ; let qW; let e00 = _this2._transform._rotation00; let e11 = _this2._transform._rotation11; let e22 = _this2._transform._rotation22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); qW = 0.5 * s; s = 0.5 / s; qX = (_this2._transform._rotation21 - _this2._transform._rotation12) * s; qY = (_this2._transform._rotation02 - _this2._transform._rotation20) * s; qZ = (_this2._transform._rotation10 - _this2._transform._rotation01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); qX = 0.5 * s; s = 0.5 / s; qY = (_this2._transform._rotation01 + _this2._transform._rotation10) * s; qZ = (_this2._transform._rotation02 + _this2._transform._rotation20) * s; qW = (_this2._transform._rotation21 - _this2._transform._rotation12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); qZ = 0.5 * s; s = 0.5 / s; qX = (_this2._transform._rotation02 + _this2._transform._rotation20) * s; qY = (_this2._transform._rotation12 + _this2._transform._rotation21) * s; qW = (_this2._transform._rotation10 - _this2._transform._rotation01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); qY = 0.5 * s; s = 0.5 / s; qX = (_this2._transform._rotation01 + _this2._transform._rotation10) * s; qZ = (_this2._transform._rotation12 + _this2._transform._rotation21) * s; qW = (_this2._transform._rotation02 - _this2._transform._rotation20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); qZ = 0.5 * s; s = 0.5 / s; qX = (_this2._transform._rotation02 + _this2._transform._rotation20) * s; qY = (_this2._transform._rotation12 + _this2._transform._rotation21) * s; qW = (_this2._transform._rotation10 - _this2._transform._rotation01) * s; } qX = dqW * qX + dqX * qW + dqY * qZ - dqZ * qY; qY = dqW * qY - dqX * qZ + dqY * qW + dqZ * qX; qZ = dqW * qZ + dqX * qY - dqY * qX + dqZ * qW; qW = dqW * qW - dqX * qX - dqY * qY - dqZ * qZ; let l = qX * qX + qY * qY + qZ * qZ + qW * qW; if(l > 1e-32) { l = 1 / Math.sqrt(l); } qX *= l; qY *= l; qZ *= l; qW *= l; let x = qX; let y = qY; let z = qZ; let w = qW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; _this2._transform._rotation00 = 1 - yy - zz; _this2._transform._rotation01 = xy - wz; _this2._transform._rotation02 = xz + wy; _this2._transform._rotation10 = xy + wz; _this2._transform._rotation11 = 1 - xx - zz; _this2._transform._rotation12 = yz - wx; _this2._transform._rotation20 = xz - wy; _this2._transform._rotation21 = yz + wx; _this2._transform._rotation22 = 1 - xx - yy; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = _this2._transform._rotation00 * _this2._invLocalInertia00 + _this2._transform._rotation01 * _this2._invLocalInertia10 + _this2._transform._rotation02 * _this2._invLocalInertia20; __tmp__01 = _this2._transform._rotation00 * _this2._invLocalInertia01 + _this2._transform._rotation01 * _this2._invLocalInertia11 + _this2._transform._rotation02 * _this2._invLocalInertia21; __tmp__02 = _this2._transform._rotation00 * _this2._invLocalInertia02 + _this2._transform._rotation01 * _this2._invLocalInertia12 + _this2._transform._rotation02 * _this2._invLocalInertia22; __tmp__10 = _this2._transform._rotation10 * _this2._invLocalInertia00 + _this2._transform._rotation11 * _this2._invLocalInertia10 + _this2._transform._rotation12 * _this2._invLocalInertia20; __tmp__11 = _this2._transform._rotation10 * _this2._invLocalInertia01 + _this2._transform._rotation11 * _this2._invLocalInertia11 + _this2._transform._rotation12 * _this2._invLocalInertia21; __tmp__12 = _this2._transform._rotation10 * _this2._invLocalInertia02 + _this2._transform._rotation11 * _this2._invLocalInertia12 + _this2._transform._rotation12 * _this2._invLocalInertia22; __tmp__20 = _this2._transform._rotation20 * _this2._invLocalInertia00 + _this2._transform._rotation21 * _this2._invLocalInertia10 + _this2._transform._rotation22 * _this2._invLocalInertia20; __tmp__21 = _this2._transform._rotation20 * _this2._invLocalInertia01 + _this2._transform._rotation21 * _this2._invLocalInertia11 + _this2._transform._rotation22 * _this2._invLocalInertia21; __tmp__22 = _this2._transform._rotation20 * _this2._invLocalInertia02 + _this2._transform._rotation21 * _this2._invLocalInertia12 + _this2._transform._rotation22 * _this2._invLocalInertia22; _this2._invInertia00 = __tmp__00; _this2._invInertia01 = __tmp__01; _this2._invInertia02 = __tmp__02; _this2._invInertia10 = __tmp__10; _this2._invInertia11 = __tmp__11; _this2._invInertia12 = __tmp__12; _this2._invInertia20 = __tmp__20; _this2._invInertia21 = __tmp__21; _this2._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = _this2._invInertia00 * _this2._transform._rotation00 + _this2._invInertia01 * _this2._transform._rotation01 + _this2._invInertia02 * _this2._transform._rotation02; __tmp__011 = _this2._invInertia00 * _this2._transform._rotation10 + _this2._invInertia01 * _this2._transform._rotation11 + _this2._invInertia02 * _this2._transform._rotation12; __tmp__021 = _this2._invInertia00 * _this2._transform._rotation20 + _this2._invInertia01 * _this2._transform._rotation21 + _this2._invInertia02 * _this2._transform._rotation22; __tmp__101 = _this2._invInertia10 * _this2._transform._rotation00 + _this2._invInertia11 * _this2._transform._rotation01 + _this2._invInertia12 * _this2._transform._rotation02; __tmp__111 = _this2._invInertia10 * _this2._transform._rotation10 + _this2._invInertia11 * _this2._transform._rotation11 + _this2._invInertia12 * _this2._transform._rotation12; __tmp__121 = _this2._invInertia10 * _this2._transform._rotation20 + _this2._invInertia11 * _this2._transform._rotation21 + _this2._invInertia12 * _this2._transform._rotation22; __tmp__201 = _this2._invInertia20 * _this2._transform._rotation00 + _this2._invInertia21 * _this2._transform._rotation01 + _this2._invInertia22 * _this2._transform._rotation02; __tmp__211 = _this2._invInertia20 * _this2._transform._rotation10 + _this2._invInertia21 * _this2._transform._rotation11 + _this2._invInertia22 * _this2._transform._rotation12; __tmp__221 = _this2._invInertia20 * _this2._transform._rotation20 + _this2._invInertia21 * _this2._transform._rotation21 + _this2._invInertia22 * _this2._transform._rotation22; _this2._invInertia00 = __tmp__001; _this2._invInertia01 = __tmp__011; _this2._invInertia02 = __tmp__021; _this2._invInertia10 = __tmp__101; _this2._invInertia11 = __tmp__111; _this2._invInertia12 = __tmp__121; _this2._invInertia20 = __tmp__201; _this2._invInertia21 = __tmp__211; _this2._invInertia22 = __tmp__221; _this2._invInertia00 *= _this2._rotFactor.x; _this2._invInertia01 *= _this2._rotFactor.x; _this2._invInertia02 *= _this2._rotFactor.x; _this2._invInertia10 *= _this2._rotFactor.y; _this2._invInertia11 *= _this2._rotFactor.y; _this2._invInertia12 *= _this2._rotFactor.y; _this2._invInertia20 *= _this2._rotFactor.z; _this2._invInertia21 *= _this2._rotFactor.z; _this2._invInertia22 *= _this2._rotFactor.z; let _this3 = this._b2; let theta1 = Math.sqrt(av2X * av2X + av2Y * av2Y + av2Z * av2Z); let halfTheta1 = theta1 * 0.5; let rotationToSinAxisFactor1; let cosHalfTheta1; if(halfTheta1 < 0.5) { let ht2 = halfTheta1 * halfTheta1; rotationToSinAxisFactor1 = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332); cosHalfTheta1 = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664; } else { rotationToSinAxisFactor1 = Math.sin(halfTheta1) / theta1; cosHalfTheta1 = Math.cos(halfTheta1); } let sinAxisX1; let sinAxisY1; let sinAxisZ1; sinAxisX1 = av2X * rotationToSinAxisFactor1; sinAxisY1 = av2Y * rotationToSinAxisFactor1; sinAxisZ1 = av2Z * rotationToSinAxisFactor1; let dqX1; let dqY1; let dqZ1; let dqW1; dqX1 = sinAxisX1; dqY1 = sinAxisY1; dqZ1 = sinAxisZ1; dqW1 = cosHalfTheta1; let qX1; let qY1; let qZ1; let qW1; let e001 = _this3._transform._rotation00; let e111 = _this3._transform._rotation11; let e221 = _this3._transform._rotation22; let t1 = e001 + e111 + e221; let s1; if(t1 > 0) { s1 = Math.sqrt(t1 + 1); qW1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this3._transform._rotation21 - _this3._transform._rotation12) * s1; qY1 = (_this3._transform._rotation02 - _this3._transform._rotation20) * s1; qZ1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1; } else if(e001 > e111) { if(e001 > e221) { s1 = Math.sqrt(e001 - e111 - e221 + 1); qX1 = 0.5 * s1; s1 = 0.5 / s1; qY1 = (_this3._transform._rotation01 + _this3._transform._rotation10) * s1; qZ1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1; qW1 = (_this3._transform._rotation21 - _this3._transform._rotation12) * s1; } else { s1 = Math.sqrt(e221 - e001 - e111 + 1); qZ1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1; qY1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1; qW1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1; } } else if(e111 > e221) { s1 = Math.sqrt(e111 - e221 - e001 + 1); qY1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this3._transform._rotation01 + _this3._transform._rotation10) * s1; qZ1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1; qW1 = (_this3._transform._rotation02 - _this3._transform._rotation20) * s1; } else { s1 = Math.sqrt(e221 - e001 - e111 + 1); qZ1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1; qY1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1; qW1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1; } qX1 = dqW1 * qX1 + dqX1 * qW1 + dqY1 * qZ1 - dqZ1 * qY1; qY1 = dqW1 * qY1 - dqX1 * qZ1 + dqY1 * qW1 + dqZ1 * qX1; qZ1 = dqW1 * qZ1 + dqX1 * qY1 - dqY1 * qX1 + dqZ1 * qW1; qW1 = dqW1 * qW1 - dqX1 * qX1 - dqY1 * qY1 - dqZ1 * qZ1; let l1 = qX1 * qX1 + qY1 * qY1 + qZ1 * qZ1 + qW1 * qW1; if(l1 > 1e-32) { l1 = 1 / Math.sqrt(l1); } qX1 *= l1; qY1 *= l1; qZ1 *= l1; qW1 *= l1; let x1 = qX1; let y1 = qY1; let z1 = qZ1; let w1 = qW1; let x21 = 2 * x1; let y21 = 2 * y1; let z21 = 2 * z1; let xx1 = x1 * x21; let yy1 = y1 * y21; let zz1 = z1 * z21; let xy1 = x1 * y21; let yz1 = y1 * z21; let xz1 = x1 * z21; let wx1 = w1 * x21; let wy1 = w1 * y21; let wz1 = w1 * z21; _this3._transform._rotation00 = 1 - yy1 - zz1; _this3._transform._rotation01 = xy1 - wz1; _this3._transform._rotation02 = xz1 + wy1; _this3._transform._rotation10 = xy1 + wz1; _this3._transform._rotation11 = 1 - xx1 - zz1; _this3._transform._rotation12 = yz1 - wx1; _this3._transform._rotation20 = xz1 - wy1; _this3._transform._rotation21 = yz1 + wx1; _this3._transform._rotation22 = 1 - xx1 - yy1; let __tmp__002; let __tmp__012; let __tmp__022; let __tmp__102; let __tmp__112; let __tmp__122; let __tmp__202; let __tmp__212; let __tmp__222; __tmp__002 = _this3._transform._rotation00 * _this3._invLocalInertia00 + _this3._transform._rotation01 * _this3._invLocalInertia10 + _this3._transform._rotation02 * _this3._invLocalInertia20; __tmp__012 = _this3._transform._rotation00 * _this3._invLocalInertia01 + _this3._transform._rotation01 * _this3._invLocalInertia11 + _this3._transform._rotation02 * _this3._invLocalInertia21; __tmp__022 = _this3._transform._rotation00 * _this3._invLocalInertia02 + _this3._transform._rotation01 * _this3._invLocalInertia12 + _this3._transform._rotation02 * _this3._invLocalInertia22; __tmp__102 = _this3._transform._rotation10 * _this3._invLocalInertia00 + _this3._transform._rotation11 * _this3._invLocalInertia10 + _this3._transform._rotation12 * _this3._invLocalInertia20; __tmp__112 = _this3._transform._rotation10 * _this3._invLocalInertia01 + _this3._transform._rotation11 * _this3._invLocalInertia11 + _this3._transform._rotation12 * _this3._invLocalInertia21; __tmp__122 = _this3._transform._rotation10 * _this3._invLocalInertia02 + _this3._transform._rotation11 * _this3._invLocalInertia12 + _this3._transform._rotation12 * _this3._invLocalInertia22; __tmp__202 = _this3._transform._rotation20 * _this3._invLocalInertia00 + _this3._transform._rotation21 * _this3._invLocalInertia10 + _this3._transform._rotation22 * _this3._invLocalInertia20; __tmp__212 = _this3._transform._rotation20 * _this3._invLocalInertia01 + _this3._transform._rotation21 * _this3._invLocalInertia11 + _this3._transform._rotation22 * _this3._invLocalInertia21; __tmp__222 = _this3._transform._rotation20 * _this3._invLocalInertia02 + _this3._transform._rotation21 * _this3._invLocalInertia12 + _this3._transform._rotation22 * _this3._invLocalInertia22; _this3._invInertia00 = __tmp__002; _this3._invInertia01 = __tmp__012; _this3._invInertia02 = __tmp__022; _this3._invInertia10 = __tmp__102; _this3._invInertia11 = __tmp__112; _this3._invInertia12 = __tmp__122; _this3._invInertia20 = __tmp__202; _this3._invInertia21 = __tmp__212; _this3._invInertia22 = __tmp__222; let __tmp__003; let __tmp__013; let __tmp__023; let __tmp__103; let __tmp__113; let __tmp__123; let __tmp__203; let __tmp__213; let __tmp__223; __tmp__003 = _this3._invInertia00 * _this3._transform._rotation00 + _this3._invInertia01 * _this3._transform._rotation01 + _this3._invInertia02 * _this3._transform._rotation02; __tmp__013 = _this3._invInertia00 * _this3._transform._rotation10 + _this3._invInertia01 * _this3._transform._rotation11 + _this3._invInertia02 * _this3._transform._rotation12; __tmp__023 = _this3._invInertia00 * _this3._transform._rotation20 + _this3._invInertia01 * _this3._transform._rotation21 + _this3._invInertia02 * _this3._transform._rotation22; __tmp__103 = _this3._invInertia10 * _this3._transform._rotation00 + _this3._invInertia11 * _this3._transform._rotation01 + _this3._invInertia12 * _this3._transform._rotation02; __tmp__113 = _this3._invInertia10 * _this3._transform._rotation10 + _this3._invInertia11 * _this3._transform._rotation11 + _this3._invInertia12 * _this3._transform._rotation12; __tmp__123 = _this3._invInertia10 * _this3._transform._rotation20 + _this3._invInertia11 * _this3._transform._rotation21 + _this3._invInertia12 * _this3._transform._rotation22; __tmp__203 = _this3._invInertia20 * _this3._transform._rotation00 + _this3._invInertia21 * _this3._transform._rotation01 + _this3._invInertia22 * _this3._transform._rotation02; __tmp__213 = _this3._invInertia20 * _this3._transform._rotation10 + _this3._invInertia21 * _this3._transform._rotation11 + _this3._invInertia22 * _this3._transform._rotation12; __tmp__223 = _this3._invInertia20 * _this3._transform._rotation20 + _this3._invInertia21 * _this3._transform._rotation21 + _this3._invInertia22 * _this3._transform._rotation22; _this3._invInertia00 = __tmp__003; _this3._invInertia01 = __tmp__013; _this3._invInertia02 = __tmp__023; _this3._invInertia10 = __tmp__103; _this3._invInertia11 = __tmp__113; _this3._invInertia12 = __tmp__123; _this3._invInertia20 = __tmp__203; _this3._invInertia21 = __tmp__213; _this3._invInertia22 = __tmp__223; _this3._invInertia00 *= _this3._rotFactor.x; _this3._invInertia01 *= _this3._rotFactor.x; _this3._invInertia02 *= _this3._rotFactor.x; _this3._invInertia10 *= _this3._rotFactor.y; _this3._invInertia11 *= _this3._rotFactor.y; _this3._invInertia12 *= _this3._rotFactor.y; _this3._invInertia20 *= _this3._rotFactor.z; _this3._invInertia21 *= _this3._rotFactor.z; _this3._invInertia22 *= _this3._rotFactor.z; } postSolve() { let lin1X; let lin1Y; let lin1Z; let ang1X; let ang1Y; let ang1Z; let ang2X; let ang2Y; let ang2Z; lin1X = 0; lin1Y = 0; lin1Z = 0; ang1X = 0; ang1Y = 0; ang1Z = 0; ang2X = 0; ang2Y = 0; ang2Z = 0; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let row = this.info.rows[_g++]; let imp = row.impulse; let jn = row.jacobianN; let jt = row.jacobianT; let jb = row.jacobianB; let impN = imp.impulseN; let impT = imp.impulseT; let impB = imp.impulseB; let impulseLX; let impulseLY; let impulseLZ; impulseLX = 0; impulseLY = 0; impulseLZ = 0; impulseLX += jt.lin1X * impT; impulseLY += jt.lin1Y * impT; impulseLZ += jt.lin1Z * impT; impulseLX += jb.lin1X * impB; impulseLY += jb.lin1Y * impB; impulseLZ += jb.lin1Z * impB; imp.impulseLX = impulseLX; imp.impulseLY = impulseLY; imp.impulseLZ = impulseLZ; lin1X += jn.lin1X * impN; lin1Y += jn.lin1Y * impN; lin1Z += jn.lin1Z * impN; ang1X += jn.ang1X * impN; ang1Y += jn.ang1Y * impN; ang1Z += jn.ang1Z * impN; ang2X += jn.ang2X * impN; ang2Y += jn.ang2Y * impN; ang2Z += jn.ang2Z * impN; lin1X += jt.lin1X * impT; lin1Y += jt.lin1Y * impT; lin1Z += jt.lin1Z * impT; ang1X += jt.ang1X * impT; ang1Y += jt.ang1Y * impT; ang1Z += jt.ang1Z * impT; ang2X += jt.ang2X * impT; ang2Y += jt.ang2Y * impT; ang2Z += jt.ang2Z * impT; lin1X += jb.lin1X * impB; lin1Y += jb.lin1Y * impB; lin1Z += jb.lin1Z * impB; ang1X += jb.ang1X * impB; ang1Y += jb.ang1Y * impB; ang1Z += jb.ang1Z * impB; ang2X += jb.ang2X * impB; ang2Y += jb.ang2Y * impB; ang2Z += jb.ang2Z * impB; } this._b1._linearContactImpulseX += lin1X; this._b1._linearContactImpulseY += lin1Y; this._b1._linearContactImpulseZ += lin1Z; this._b1._angularContactImpulseX += ang1X; this._b1._angularContactImpulseY += ang1Y; this._b1._angularContactImpulseZ += ang1Z; this._b2._linearContactImpulseX -= lin1X; this._b2._linearContactImpulseY -= lin1Y; this._b2._linearContactImpulseZ -= lin1Z; this._b2._angularContactImpulseX -= ang2X; this._b2._angularContactImpulseY -= ang2Y; this._b2._angularContactImpulseZ -= ang2Z; this.constraint._syncManifold(); } } oimo.dynamics.constraint.solver.pgs.PgsJointConstraintSolver = class oimo_dynamics_constraint_solver_pgs_PgsJointConstraintSolver extends oimo.dynamics.constraint.ConstraintSolver { constructor(joint) { super(); this.joint = joint; this.info = new oimo.dynamics.constraint.info.joint.JointSolverInfo(); this.massData = new Array(oimo.common.Setting.maxJacobianRows); let _g = 0; let _g1 = this.massData.length; while(_g < _g1) this.massData[_g++] = new oimo.dynamics.constraint.solver.common.JointSolverMassDataRow(); } preSolveVelocity(timeStep) { this.joint._syncAnchors(); this.joint._getVelocitySolverInfo(timeStep,this.info); this._b1 = this.info.b1; this._b2 = this.info.b2; let invM1 = this._b1._invMass; let invM2 = this._b2._invMass; let invI100; let invI101; let invI102; let invI110; let invI111; let invI112; let invI120; let invI121; let invI122; let invI200; let invI201; let invI202; let invI210; let invI211; let invI212; let invI220; let invI221; let invI222; invI100 = this._b1._invInertia00; invI101 = this._b1._invInertia01; invI102 = this._b1._invInertia02; invI110 = this._b1._invInertia10; invI111 = this._b1._invInertia11; invI112 = this._b1._invInertia12; invI120 = this._b1._invInertia20; invI121 = this._b1._invInertia21; invI122 = this._b1._invInertia22; invI200 = this._b2._invInertia00; invI201 = this._b2._invInertia01; invI202 = this._b2._invInertia02; invI210 = this._b2._invInertia10; invI211 = this._b2._invInertia11; invI212 = this._b2._invInertia12; invI220 = this._b2._invInertia20; invI221 = this._b2._invInertia21; invI222 = this._b2._invInertia22; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let row = this.info.rows[i]; let md = this.massData[i]; let j = row.jacobian; j.updateSparsity(); if((j.flag & 1) != 0) { md.invMLin1X = j.lin1X * invM1; md.invMLin1Y = j.lin1Y * invM1; md.invMLin1Z = j.lin1Z * invM1; md.invMLin2X = j.lin2X * invM2; md.invMLin2Y = j.lin2Y * invM2; md.invMLin2Z = j.lin2Z * invM2; } else { md.invMLin1X = 0; md.invMLin1Y = 0; md.invMLin1Z = 0; md.invMLin2X = 0; md.invMLin2Y = 0; md.invMLin2Z = 0; } if((j.flag & 2) != 0) { let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z; __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z; __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z; md.invMAng1X = __tmp__X; md.invMAng1Y = __tmp__Y; md.invMAng1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z; __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z; __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z; md.invMAng2X = __tmp__X1; md.invMAng2Y = __tmp__Y1; md.invMAng2Z = __tmp__Z1; } else { md.invMAng1X = 0; md.invMAng1Y = 0; md.invMAng1Z = 0; md.invMAng2X = 0; md.invMAng2Y = 0; md.invMAng2Z = 0; } md.massWithoutCfm = md.invMLin1X * j.lin1X + md.invMLin1Y * j.lin1Y + md.invMLin1Z * j.lin1Z + (md.invMLin2X * j.lin2X + md.invMLin2Y * j.lin2Y + md.invMLin2Z * j.lin2Z) + (md.invMAng1X * j.ang1X + md.invMAng1Y * j.ang1Y + md.invMAng1Z * j.ang1Z) + (md.invMAng2X * j.ang2X + md.invMAng2Y * j.ang2Y + md.invMAng2Z * j.ang2Z); md.mass = md.massWithoutCfm + row.cfm; if(md.massWithoutCfm != 0) { md.massWithoutCfm = 1 / md.massWithoutCfm; } if(md.mass != 0) { md.mass = 1 / md.mass; } } } warmStart(timeStep) { let factor = this.joint._positionCorrectionAlgorithm == oimo.dynamics.constraint.PositionCorrectionAlgorithm.BAUMGARTE ? oimo.common.Setting.jointWarmStartingFactorForBaungarte : oimo.common.Setting.jointWarmStartingFactor; factor *= timeStep.dtRatio; if(factor <= 0) { let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let _this = this.info.rows[_g++].impulse; _this.impulse = 0; _this.impulseM = 0; _this.impulseP = 0; } return; } let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._velX; lv1Y = this._b1._velY; lv1Z = this._b1._velZ; lv2X = this._b2._velX; lv2Y = this._b2._velY; lv2Z = this._b2._velZ; av1X = this._b1._angVelX; av1Y = this._b1._angVelY; av1Z = this._b1._angVelZ; av2X = this._b2._angVelX; av2Y = this._b2._angVelY; av2Z = this._b2._angVelZ; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let md = this.massData[i]; let imp = this.info.rows[i].impulse; imp.impulse *= factor; imp.impulseM *= factor; let impulse = imp.impulse + imp.impulseM; lv1X += md.invMLin1X * impulse; lv1Y += md.invMLin1Y * impulse; lv1Z += md.invMLin1Z * impulse; lv2X += md.invMLin2X * -impulse; lv2Y += md.invMLin2Y * -impulse; lv2Z += md.invMLin2Z * -impulse; av1X += md.invMAng1X * impulse; av1Y += md.invMAng1Y * impulse; av1Z += md.invMAng1Z * impulse; av2X += md.invMAng2X * -impulse; av2Y += md.invMAng2Y * -impulse; av2Z += md.invMAng2Z * -impulse; } this._b1._velX = lv1X; this._b1._velY = lv1Y; this._b1._velZ = lv1Z; this._b2._velX = lv2X; this._b2._velY = lv2Y; this._b2._velZ = lv2Z; this._b1._angVelX = av1X; this._b1._angVelY = av1Y; this._b1._angVelZ = av1Z; this._b2._angVelX = av2X; this._b2._angVelY = av2Y; this._b2._angVelZ = av2Z; } solveVelocity() { let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._velX; lv1Y = this._b1._velY; lv1Z = this._b1._velZ; lv2X = this._b2._velX; lv2Y = this._b2._velY; lv2Z = this._b2._velZ; av1X = this._b1._angVelX; av1Y = this._b1._angVelY; av1Z = this._b1._angVelZ; av2X = this._b2._angVelX; av2Y = this._b2._angVelY; av2Z = this._b2._angVelZ; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let row = this.info.rows[i]; let md = this.massData[i]; let imp = row.impulse; let j = row.jacobian; if(row.motorMaxImpulse == 0) { continue; } let rv = 0; rv += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; rv -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; rv += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; rv -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; let impulseM = (-row.motorSpeed - rv) * md.massWithoutCfm; let oldImpulseM = imp.impulseM; imp.impulseM += impulseM; if(imp.impulseM < -row.motorMaxImpulse) { imp.impulseM = -row.motorMaxImpulse; } else if(imp.impulseM > row.motorMaxImpulse) { imp.impulseM = row.motorMaxImpulse; } impulseM = imp.impulseM - oldImpulseM; if((j.flag & 1) != 0) { lv1X += md.invMLin1X * impulseM; lv1Y += md.invMLin1Y * impulseM; lv1Z += md.invMLin1Z * impulseM; lv2X += md.invMLin2X * -impulseM; lv2Y += md.invMLin2Y * -impulseM; lv2Z += md.invMLin2Z * -impulseM; } if((j.flag & 2) != 0) { av1X += md.invMAng1X * impulseM; av1Y += md.invMAng1Y * impulseM; av1Z += md.invMAng1Z * impulseM; av2X += md.invMAng2X * -impulseM; av2Y += md.invMAng2Y * -impulseM; av2Z += md.invMAng2Z * -impulseM; } } let _g2 = 0; let _g3 = this.info.numRows; while(_g2 < _g3) { let i = _g2++; let row = this.info.rows[i]; let md = this.massData[i]; let imp = row.impulse; let j = row.jacobian; let rv = 0; rv += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; rv -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; rv += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; rv -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; let impulse = (row.rhs - rv - imp.impulse * row.cfm) * md.mass; let oldImpulse = imp.impulse; imp.impulse += impulse; if(imp.impulse < row.minImpulse) { imp.impulse = row.minImpulse; } else if(imp.impulse > row.maxImpulse) { imp.impulse = row.maxImpulse; } impulse = imp.impulse - oldImpulse; if((j.flag & 1) != 0) { lv1X += md.invMLin1X * impulse; lv1Y += md.invMLin1Y * impulse; lv1Z += md.invMLin1Z * impulse; lv2X += md.invMLin2X * -impulse; lv2Y += md.invMLin2Y * -impulse; lv2Z += md.invMLin2Z * -impulse; } if((j.flag & 2) != 0) { av1X += md.invMAng1X * impulse; av1Y += md.invMAng1Y * impulse; av1Z += md.invMAng1Z * impulse; av2X += md.invMAng2X * -impulse; av2Y += md.invMAng2Y * -impulse; av2Z += md.invMAng2Z * -impulse; } } this._b1._velX = lv1X; this._b1._velY = lv1Y; this._b1._velZ = lv1Z; this._b2._velX = lv2X; this._b2._velY = lv2Y; this._b2._velZ = lv2Z; this._b1._angVelX = av1X; this._b1._angVelY = av1Y; this._b1._angVelZ = av1Z; this._b2._angVelX = av2X; this._b2._angVelY = av2Y; this._b2._angVelZ = av2Z; } postSolveVelocity(timeStep) { let linX; let linY; let linZ; let angX; let angY; let angZ; linX = 0; linY = 0; linZ = 0; angX = 0; angY = 0; angZ = 0; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let row = this.info.rows[_g++]; let imp = row.impulse; let j = row.jacobian; if((j.flag & 1) != 0) { linX += j.lin1X * imp.impulse; linY += j.lin1Y * imp.impulse; linZ += j.lin1Z * imp.impulse; } else if((j.flag & 2) != 0) { angX += j.ang1X * imp.impulse; angY += j.ang1Y * imp.impulse; angZ += j.ang1Z * imp.impulse; } } this.joint._appliedForceX = linX * timeStep.invDt; this.joint._appliedForceY = linY * timeStep.invDt; this.joint._appliedForceZ = linZ * timeStep.invDt; this.joint._appliedTorqueX = angX * timeStep.invDt; this.joint._appliedTorqueY = angY * timeStep.invDt; this.joint._appliedTorqueZ = angZ * timeStep.invDt; } preSolvePosition(timeStep) { this.joint._syncAnchors(); this.joint._getPositionSolverInfo(this.info); this._b1 = this.info.b1; this._b2 = this.info.b2; let invM1 = this._b1._invMass; let invM2 = this._b2._invMass; let invI100; let invI101; let invI102; let invI110; let invI111; let invI112; let invI120; let invI121; let invI122; let invI200; let invI201; let invI202; let invI210; let invI211; let invI212; let invI220; let invI221; let invI222; invI100 = this._b1._invInertia00; invI101 = this._b1._invInertia01; invI102 = this._b1._invInertia02; invI110 = this._b1._invInertia10; invI111 = this._b1._invInertia11; invI112 = this._b1._invInertia12; invI120 = this._b1._invInertia20; invI121 = this._b1._invInertia21; invI122 = this._b1._invInertia22; invI200 = this._b2._invInertia00; invI201 = this._b2._invInertia01; invI202 = this._b2._invInertia02; invI210 = this._b2._invInertia10; invI211 = this._b2._invInertia11; invI212 = this._b2._invInertia12; invI220 = this._b2._invInertia20; invI221 = this._b2._invInertia21; invI222 = this._b2._invInertia22; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let md = this.massData[i]; let j = this.info.rows[i].jacobian; md.invMLin1X = j.lin1X * invM1; md.invMLin1Y = j.lin1Y * invM1; md.invMLin1Z = j.lin1Z * invM1; md.invMLin2X = j.lin2X * invM2; md.invMLin2Y = j.lin2Y * invM2; md.invMLin2Z = j.lin2Z * invM2; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z; __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z; __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z; md.invMAng1X = __tmp__X; md.invMAng1Y = __tmp__Y; md.invMAng1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z; __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z; __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z; md.invMAng2X = __tmp__X1; md.invMAng2Y = __tmp__Y1; md.invMAng2Z = __tmp__Z1; md.mass = md.invMLin1X * j.lin1X + md.invMLin1Y * j.lin1Y + md.invMLin1Z * j.lin1Z + (md.invMLin2X * j.lin2X + md.invMLin2Y * j.lin2Y + md.invMLin2Z * j.lin2Z) + (md.invMAng1X * j.ang1X + md.invMAng1Y * j.ang1Y + md.invMAng1Z * j.ang1Z) + (md.invMAng2X * j.ang2X + md.invMAng2Y * j.ang2Y + md.invMAng2Z * j.ang2Z); if(md.mass != 0) { md.mass = 1 / md.mass; } } let _g2 = 0; let _g3 = this.info.numRows; while(_g2 < _g3) this.info.rows[_g2++].impulse.impulseP = 0; } solvePositionSplitImpulse() { let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = this._b1._pseudoVelX; lv1Y = this._b1._pseudoVelY; lv1Z = this._b1._pseudoVelZ; lv2X = this._b2._pseudoVelX; lv2Y = this._b2._pseudoVelY; lv2Z = this._b2._pseudoVelZ; av1X = this._b1._angPseudoVelX; av1Y = this._b1._angPseudoVelY; av1Z = this._b1._angPseudoVelZ; av2X = this._b2._angPseudoVelX; av2Y = this._b2._angPseudoVelY; av2Z = this._b2._angPseudoVelZ; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let row = this.info.rows[i]; let md = this.massData[i]; let imp = row.impulse; let j = row.jacobian; let rv = 0; rv += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; rv -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; rv += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; rv -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; let impulseP = (row.rhs * oimo.common.Setting.positionSplitImpulseBaumgarte - rv) * md.mass; let oldImpulseP = imp.impulseP; imp.impulseP += impulseP; if(imp.impulseP < row.minImpulse) { imp.impulseP = row.minImpulse; } else if(imp.impulseP > row.maxImpulse) { imp.impulseP = row.maxImpulse; } impulseP = imp.impulseP - oldImpulseP; lv1X += md.invMLin1X * impulseP; lv1Y += md.invMLin1Y * impulseP; lv1Z += md.invMLin1Z * impulseP; lv2X += md.invMLin2X * -impulseP; lv2Y += md.invMLin2Y * -impulseP; lv2Z += md.invMLin2Z * -impulseP; av1X += md.invMAng1X * impulseP; av1Y += md.invMAng1Y * impulseP; av1Z += md.invMAng1Z * impulseP; av2X += md.invMAng2X * -impulseP; av2Y += md.invMAng2Y * -impulseP; av2Z += md.invMAng2Z * -impulseP; } this._b1._pseudoVelX = lv1X; this._b1._pseudoVelY = lv1Y; this._b1._pseudoVelZ = lv1Z; this._b2._pseudoVelX = lv2X; this._b2._pseudoVelY = lv2Y; this._b2._pseudoVelZ = lv2Z; this._b1._angPseudoVelX = av1X; this._b1._angPseudoVelY = av1Y; this._b1._angPseudoVelZ = av1Z; this._b2._angPseudoVelX = av2X; this._b2._angPseudoVelY = av2Y; this._b2._angPseudoVelZ = av2Z; } solvePositionNgs(timeStep) { this.joint._syncAnchors(); this.joint._getPositionSolverInfo(this.info); this._b1 = this.info.b1; this._b2 = this.info.b2; let invM1 = this._b1._invMass; let invM2 = this._b2._invMass; let invI100; let invI101; let invI102; let invI110; let invI111; let invI112; let invI120; let invI121; let invI122; let invI200; let invI201; let invI202; let invI210; let invI211; let invI212; let invI220; let invI221; let invI222; invI100 = this._b1._invInertia00; invI101 = this._b1._invInertia01; invI102 = this._b1._invInertia02; invI110 = this._b1._invInertia10; invI111 = this._b1._invInertia11; invI112 = this._b1._invInertia12; invI120 = this._b1._invInertia20; invI121 = this._b1._invInertia21; invI122 = this._b1._invInertia22; invI200 = this._b2._invInertia00; invI201 = this._b2._invInertia01; invI202 = this._b2._invInertia02; invI210 = this._b2._invInertia10; invI211 = this._b2._invInertia11; invI212 = this._b2._invInertia12; invI220 = this._b2._invInertia20; invI221 = this._b2._invInertia21; invI222 = this._b2._invInertia22; let _g = 0; let _g1 = this.info.numRows; while(_g < _g1) { let i = _g++; let md = this.massData[i]; let j = this.info.rows[i].jacobian; md.invMLin1X = j.lin1X * invM1; md.invMLin1Y = j.lin1Y * invM1; md.invMLin1Z = j.lin1Z * invM1; md.invMLin2X = j.lin2X * invM2; md.invMLin2Y = j.lin2Y * invM2; md.invMLin2Z = j.lin2Z * invM2; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z; __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z; __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z; md.invMAng1X = __tmp__X; md.invMAng1Y = __tmp__Y; md.invMAng1Z = __tmp__Z; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z; __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z; __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z; md.invMAng2X = __tmp__X1; md.invMAng2Y = __tmp__Y1; md.invMAng2Z = __tmp__Z1; md.mass = md.invMLin1X * j.lin1X + md.invMLin1Y * j.lin1Y + md.invMLin1Z * j.lin1Z + (md.invMLin2X * j.lin2X + md.invMLin2Y * j.lin2Y + md.invMLin2Z * j.lin2Z) + (md.invMAng1X * j.ang1X + md.invMAng1Y * j.ang1Y + md.invMAng1Z * j.ang1Z) + (md.invMAng2X * j.ang2X + md.invMAng2Y * j.ang2Y + md.invMAng2Z * j.ang2Z); if(md.mass != 0) { md.mass = 1 / md.mass; } } let lv1X; let lv1Y; let lv1Z; let lv2X; let lv2Y; let lv2Z; let av1X; let av1Y; let av1Z; let av2X; let av2Y; let av2Z; lv1X = 0; lv1Y = 0; lv1Z = 0; lv2X = 0; lv2Y = 0; lv2Z = 0; av1X = 0; av1Y = 0; av1Z = 0; av2X = 0; av2Y = 0; av2Z = 0; let _g2 = 0; let _g3 = this.info.numRows; while(_g2 < _g3) { let i = _g2++; let row = this.info.rows[i]; let md = this.massData[i]; let imp = row.impulse; let j = row.jacobian; let rv = 0; rv += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z; rv -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z; rv += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z; rv -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z; let impulseP = (row.rhs * oimo.common.Setting.positionNgsBaumgarte - rv) * md.mass; let oldImpulseP = imp.impulseP; imp.impulseP += impulseP; if(imp.impulseP < row.minImpulse) { imp.impulseP = row.minImpulse; } else if(imp.impulseP > row.maxImpulse) { imp.impulseP = row.maxImpulse; } impulseP = imp.impulseP - oldImpulseP; lv1X += md.invMLin1X * impulseP; lv1Y += md.invMLin1Y * impulseP; lv1Z += md.invMLin1Z * impulseP; lv2X += md.invMLin2X * -impulseP; lv2Y += md.invMLin2Y * -impulseP; lv2Z += md.invMLin2Z * -impulseP; av1X += md.invMAng1X * impulseP; av1Y += md.invMAng1Y * impulseP; av1Z += md.invMAng1Z * impulseP; av2X += md.invMAng2X * -impulseP; av2Y += md.invMAng2Y * -impulseP; av2Z += md.invMAng2Z * -impulseP; } let _this = this._b1; _this._transform._positionX += lv1X; _this._transform._positionY += lv1Y; _this._transform._positionZ += lv1Z; let _this1 = this._b2; _this1._transform._positionX += lv2X; _this1._transform._positionY += lv2Y; _this1._transform._positionZ += lv2Z; let _this2 = this._b1; let theta = Math.sqrt(av1X * av1X + av1Y * av1Y + av1Z * av1Z); let halfTheta = theta * 0.5; let rotationToSinAxisFactor; let cosHalfTheta; if(halfTheta < 0.5) { let ht2 = halfTheta * halfTheta; rotationToSinAxisFactor = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332); cosHalfTheta = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664; } else { rotationToSinAxisFactor = Math.sin(halfTheta) / theta; cosHalfTheta = Math.cos(halfTheta); } let sinAxisX; let sinAxisY; let sinAxisZ; sinAxisX = av1X * rotationToSinAxisFactor; sinAxisY = av1Y * rotationToSinAxisFactor; sinAxisZ = av1Z * rotationToSinAxisFactor; let dqX; let dqY; let dqZ; let dqW; dqX = sinAxisX; dqY = sinAxisY; dqZ = sinAxisZ; dqW = cosHalfTheta; let qX; let qY; let qZ; let qW; let e00 = _this2._transform._rotation00; let e11 = _this2._transform._rotation11; let e22 = _this2._transform._rotation22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); qW = 0.5 * s; s = 0.5 / s; qX = (_this2._transform._rotation21 - _this2._transform._rotation12) * s; qY = (_this2._transform._rotation02 - _this2._transform._rotation20) * s; qZ = (_this2._transform._rotation10 - _this2._transform._rotation01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); qX = 0.5 * s; s = 0.5 / s; qY = (_this2._transform._rotation01 + _this2._transform._rotation10) * s; qZ = (_this2._transform._rotation02 + _this2._transform._rotation20) * s; qW = (_this2._transform._rotation21 - _this2._transform._rotation12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); qZ = 0.5 * s; s = 0.5 / s; qX = (_this2._transform._rotation02 + _this2._transform._rotation20) * s; qY = (_this2._transform._rotation12 + _this2._transform._rotation21) * s; qW = (_this2._transform._rotation10 - _this2._transform._rotation01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); qY = 0.5 * s; s = 0.5 / s; qX = (_this2._transform._rotation01 + _this2._transform._rotation10) * s; qZ = (_this2._transform._rotation12 + _this2._transform._rotation21) * s; qW = (_this2._transform._rotation02 - _this2._transform._rotation20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); qZ = 0.5 * s; s = 0.5 / s; qX = (_this2._transform._rotation02 + _this2._transform._rotation20) * s; qY = (_this2._transform._rotation12 + _this2._transform._rotation21) * s; qW = (_this2._transform._rotation10 - _this2._transform._rotation01) * s; } qX = dqW * qX + dqX * qW + dqY * qZ - dqZ * qY; qY = dqW * qY - dqX * qZ + dqY * qW + dqZ * qX; qZ = dqW * qZ + dqX * qY - dqY * qX + dqZ * qW; qW = dqW * qW - dqX * qX - dqY * qY - dqZ * qZ; let l = qX * qX + qY * qY + qZ * qZ + qW * qW; if(l > 1e-32) { l = 1 / Math.sqrt(l); } qX *= l; qY *= l; qZ *= l; qW *= l; let x = qX; let y = qY; let z = qZ; let w = qW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; _this2._transform._rotation00 = 1 - yy - zz; _this2._transform._rotation01 = xy - wz; _this2._transform._rotation02 = xz + wy; _this2._transform._rotation10 = xy + wz; _this2._transform._rotation11 = 1 - xx - zz; _this2._transform._rotation12 = yz - wx; _this2._transform._rotation20 = xz - wy; _this2._transform._rotation21 = yz + wx; _this2._transform._rotation22 = 1 - xx - yy; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = _this2._transform._rotation00 * _this2._invLocalInertia00 + _this2._transform._rotation01 * _this2._invLocalInertia10 + _this2._transform._rotation02 * _this2._invLocalInertia20; __tmp__01 = _this2._transform._rotation00 * _this2._invLocalInertia01 + _this2._transform._rotation01 * _this2._invLocalInertia11 + _this2._transform._rotation02 * _this2._invLocalInertia21; __tmp__02 = _this2._transform._rotation00 * _this2._invLocalInertia02 + _this2._transform._rotation01 * _this2._invLocalInertia12 + _this2._transform._rotation02 * _this2._invLocalInertia22; __tmp__10 = _this2._transform._rotation10 * _this2._invLocalInertia00 + _this2._transform._rotation11 * _this2._invLocalInertia10 + _this2._transform._rotation12 * _this2._invLocalInertia20; __tmp__11 = _this2._transform._rotation10 * _this2._invLocalInertia01 + _this2._transform._rotation11 * _this2._invLocalInertia11 + _this2._transform._rotation12 * _this2._invLocalInertia21; __tmp__12 = _this2._transform._rotation10 * _this2._invLocalInertia02 + _this2._transform._rotation11 * _this2._invLocalInertia12 + _this2._transform._rotation12 * _this2._invLocalInertia22; __tmp__20 = _this2._transform._rotation20 * _this2._invLocalInertia00 + _this2._transform._rotation21 * _this2._invLocalInertia10 + _this2._transform._rotation22 * _this2._invLocalInertia20; __tmp__21 = _this2._transform._rotation20 * _this2._invLocalInertia01 + _this2._transform._rotation21 * _this2._invLocalInertia11 + _this2._transform._rotation22 * _this2._invLocalInertia21; __tmp__22 = _this2._transform._rotation20 * _this2._invLocalInertia02 + _this2._transform._rotation21 * _this2._invLocalInertia12 + _this2._transform._rotation22 * _this2._invLocalInertia22; _this2._invInertia00 = __tmp__00; _this2._invInertia01 = __tmp__01; _this2._invInertia02 = __tmp__02; _this2._invInertia10 = __tmp__10; _this2._invInertia11 = __tmp__11; _this2._invInertia12 = __tmp__12; _this2._invInertia20 = __tmp__20; _this2._invInertia21 = __tmp__21; _this2._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = _this2._invInertia00 * _this2._transform._rotation00 + _this2._invInertia01 * _this2._transform._rotation01 + _this2._invInertia02 * _this2._transform._rotation02; __tmp__011 = _this2._invInertia00 * _this2._transform._rotation10 + _this2._invInertia01 * _this2._transform._rotation11 + _this2._invInertia02 * _this2._transform._rotation12; __tmp__021 = _this2._invInertia00 * _this2._transform._rotation20 + _this2._invInertia01 * _this2._transform._rotation21 + _this2._invInertia02 * _this2._transform._rotation22; __tmp__101 = _this2._invInertia10 * _this2._transform._rotation00 + _this2._invInertia11 * _this2._transform._rotation01 + _this2._invInertia12 * _this2._transform._rotation02; __tmp__111 = _this2._invInertia10 * _this2._transform._rotation10 + _this2._invInertia11 * _this2._transform._rotation11 + _this2._invInertia12 * _this2._transform._rotation12; __tmp__121 = _this2._invInertia10 * _this2._transform._rotation20 + _this2._invInertia11 * _this2._transform._rotation21 + _this2._invInertia12 * _this2._transform._rotation22; __tmp__201 = _this2._invInertia20 * _this2._transform._rotation00 + _this2._invInertia21 * _this2._transform._rotation01 + _this2._invInertia22 * _this2._transform._rotation02; __tmp__211 = _this2._invInertia20 * _this2._transform._rotation10 + _this2._invInertia21 * _this2._transform._rotation11 + _this2._invInertia22 * _this2._transform._rotation12; __tmp__221 = _this2._invInertia20 * _this2._transform._rotation20 + _this2._invInertia21 * _this2._transform._rotation21 + _this2._invInertia22 * _this2._transform._rotation22; _this2._invInertia00 = __tmp__001; _this2._invInertia01 = __tmp__011; _this2._invInertia02 = __tmp__021; _this2._invInertia10 = __tmp__101; _this2._invInertia11 = __tmp__111; _this2._invInertia12 = __tmp__121; _this2._invInertia20 = __tmp__201; _this2._invInertia21 = __tmp__211; _this2._invInertia22 = __tmp__221; _this2._invInertia00 *= _this2._rotFactor.x; _this2._invInertia01 *= _this2._rotFactor.x; _this2._invInertia02 *= _this2._rotFactor.x; _this2._invInertia10 *= _this2._rotFactor.y; _this2._invInertia11 *= _this2._rotFactor.y; _this2._invInertia12 *= _this2._rotFactor.y; _this2._invInertia20 *= _this2._rotFactor.z; _this2._invInertia21 *= _this2._rotFactor.z; _this2._invInertia22 *= _this2._rotFactor.z; let _this3 = this._b2; let theta1 = Math.sqrt(av2X * av2X + av2Y * av2Y + av2Z * av2Z); let halfTheta1 = theta1 * 0.5; let rotationToSinAxisFactor1; let cosHalfTheta1; if(halfTheta1 < 0.5) { let ht2 = halfTheta1 * halfTheta1; rotationToSinAxisFactor1 = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332); cosHalfTheta1 = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664; } else { rotationToSinAxisFactor1 = Math.sin(halfTheta1) / theta1; cosHalfTheta1 = Math.cos(halfTheta1); } let sinAxisX1; let sinAxisY1; let sinAxisZ1; sinAxisX1 = av2X * rotationToSinAxisFactor1; sinAxisY1 = av2Y * rotationToSinAxisFactor1; sinAxisZ1 = av2Z * rotationToSinAxisFactor1; let dqX1; let dqY1; let dqZ1; let dqW1; dqX1 = sinAxisX1; dqY1 = sinAxisY1; dqZ1 = sinAxisZ1; dqW1 = cosHalfTheta1; let qX1; let qY1; let qZ1; let qW1; let e001 = _this3._transform._rotation00; let e111 = _this3._transform._rotation11; let e221 = _this3._transform._rotation22; let t1 = e001 + e111 + e221; let s1; if(t1 > 0) { s1 = Math.sqrt(t1 + 1); qW1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this3._transform._rotation21 - _this3._transform._rotation12) * s1; qY1 = (_this3._transform._rotation02 - _this3._transform._rotation20) * s1; qZ1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1; } else if(e001 > e111) { if(e001 > e221) { s1 = Math.sqrt(e001 - e111 - e221 + 1); qX1 = 0.5 * s1; s1 = 0.5 / s1; qY1 = (_this3._transform._rotation01 + _this3._transform._rotation10) * s1; qZ1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1; qW1 = (_this3._transform._rotation21 - _this3._transform._rotation12) * s1; } else { s1 = Math.sqrt(e221 - e001 - e111 + 1); qZ1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1; qY1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1; qW1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1; } } else if(e111 > e221) { s1 = Math.sqrt(e111 - e221 - e001 + 1); qY1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this3._transform._rotation01 + _this3._transform._rotation10) * s1; qZ1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1; qW1 = (_this3._transform._rotation02 - _this3._transform._rotation20) * s1; } else { s1 = Math.sqrt(e221 - e001 - e111 + 1); qZ1 = 0.5 * s1; s1 = 0.5 / s1; qX1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1; qY1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1; qW1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1; } qX1 = dqW1 * qX1 + dqX1 * qW1 + dqY1 * qZ1 - dqZ1 * qY1; qY1 = dqW1 * qY1 - dqX1 * qZ1 + dqY1 * qW1 + dqZ1 * qX1; qZ1 = dqW1 * qZ1 + dqX1 * qY1 - dqY1 * qX1 + dqZ1 * qW1; qW1 = dqW1 * qW1 - dqX1 * qX1 - dqY1 * qY1 - dqZ1 * qZ1; let l1 = qX1 * qX1 + qY1 * qY1 + qZ1 * qZ1 + qW1 * qW1; if(l1 > 1e-32) { l1 = 1 / Math.sqrt(l1); } qX1 *= l1; qY1 *= l1; qZ1 *= l1; qW1 *= l1; let x1 = qX1; let y1 = qY1; let z1 = qZ1; let w1 = qW1; let x21 = 2 * x1; let y21 = 2 * y1; let z21 = 2 * z1; let xx1 = x1 * x21; let yy1 = y1 * y21; let zz1 = z1 * z21; let xy1 = x1 * y21; let yz1 = y1 * z21; let xz1 = x1 * z21; let wx1 = w1 * x21; let wy1 = w1 * y21; let wz1 = w1 * z21; _this3._transform._rotation00 = 1 - yy1 - zz1; _this3._transform._rotation01 = xy1 - wz1; _this3._transform._rotation02 = xz1 + wy1; _this3._transform._rotation10 = xy1 + wz1; _this3._transform._rotation11 = 1 - xx1 - zz1; _this3._transform._rotation12 = yz1 - wx1; _this3._transform._rotation20 = xz1 - wy1; _this3._transform._rotation21 = yz1 + wx1; _this3._transform._rotation22 = 1 - xx1 - yy1; let __tmp__002; let __tmp__012; let __tmp__022; let __tmp__102; let __tmp__112; let __tmp__122; let __tmp__202; let __tmp__212; let __tmp__222; __tmp__002 = _this3._transform._rotation00 * _this3._invLocalInertia00 + _this3._transform._rotation01 * _this3._invLocalInertia10 + _this3._transform._rotation02 * _this3._invLocalInertia20; __tmp__012 = _this3._transform._rotation00 * _this3._invLocalInertia01 + _this3._transform._rotation01 * _this3._invLocalInertia11 + _this3._transform._rotation02 * _this3._invLocalInertia21; __tmp__022 = _this3._transform._rotation00 * _this3._invLocalInertia02 + _this3._transform._rotation01 * _this3._invLocalInertia12 + _this3._transform._rotation02 * _this3._invLocalInertia22; __tmp__102 = _this3._transform._rotation10 * _this3._invLocalInertia00 + _this3._transform._rotation11 * _this3._invLocalInertia10 + _this3._transform._rotation12 * _this3._invLocalInertia20; __tmp__112 = _this3._transform._rotation10 * _this3._invLocalInertia01 + _this3._transform._rotation11 * _this3._invLocalInertia11 + _this3._transform._rotation12 * _this3._invLocalInertia21; __tmp__122 = _this3._transform._rotation10 * _this3._invLocalInertia02 + _this3._transform._rotation11 * _this3._invLocalInertia12 + _this3._transform._rotation12 * _this3._invLocalInertia22; __tmp__202 = _this3._transform._rotation20 * _this3._invLocalInertia00 + _this3._transform._rotation21 * _this3._invLocalInertia10 + _this3._transform._rotation22 * _this3._invLocalInertia20; __tmp__212 = _this3._transform._rotation20 * _this3._invLocalInertia01 + _this3._transform._rotation21 * _this3._invLocalInertia11 + _this3._transform._rotation22 * _this3._invLocalInertia21; __tmp__222 = _this3._transform._rotation20 * _this3._invLocalInertia02 + _this3._transform._rotation21 * _this3._invLocalInertia12 + _this3._transform._rotation22 * _this3._invLocalInertia22; _this3._invInertia00 = __tmp__002; _this3._invInertia01 = __tmp__012; _this3._invInertia02 = __tmp__022; _this3._invInertia10 = __tmp__102; _this3._invInertia11 = __tmp__112; _this3._invInertia12 = __tmp__122; _this3._invInertia20 = __tmp__202; _this3._invInertia21 = __tmp__212; _this3._invInertia22 = __tmp__222; let __tmp__003; let __tmp__013; let __tmp__023; let __tmp__103; let __tmp__113; let __tmp__123; let __tmp__203; let __tmp__213; let __tmp__223; __tmp__003 = _this3._invInertia00 * _this3._transform._rotation00 + _this3._invInertia01 * _this3._transform._rotation01 + _this3._invInertia02 * _this3._transform._rotation02; __tmp__013 = _this3._invInertia00 * _this3._transform._rotation10 + _this3._invInertia01 * _this3._transform._rotation11 + _this3._invInertia02 * _this3._transform._rotation12; __tmp__023 = _this3._invInertia00 * _this3._transform._rotation20 + _this3._invInertia01 * _this3._transform._rotation21 + _this3._invInertia02 * _this3._transform._rotation22; __tmp__103 = _this3._invInertia10 * _this3._transform._rotation00 + _this3._invInertia11 * _this3._transform._rotation01 + _this3._invInertia12 * _this3._transform._rotation02; __tmp__113 = _this3._invInertia10 * _this3._transform._rotation10 + _this3._invInertia11 * _this3._transform._rotation11 + _this3._invInertia12 * _this3._transform._rotation12; __tmp__123 = _this3._invInertia10 * _this3._transform._rotation20 + _this3._invInertia11 * _this3._transform._rotation21 + _this3._invInertia12 * _this3._transform._rotation22; __tmp__203 = _this3._invInertia20 * _this3._transform._rotation00 + _this3._invInertia21 * _this3._transform._rotation01 + _this3._invInertia22 * _this3._transform._rotation02; __tmp__213 = _this3._invInertia20 * _this3._transform._rotation10 + _this3._invInertia21 * _this3._transform._rotation11 + _this3._invInertia22 * _this3._transform._rotation12; __tmp__223 = _this3._invInertia20 * _this3._transform._rotation20 + _this3._invInertia21 * _this3._transform._rotation21 + _this3._invInertia22 * _this3._transform._rotation22; _this3._invInertia00 = __tmp__003; _this3._invInertia01 = __tmp__013; _this3._invInertia02 = __tmp__023; _this3._invInertia10 = __tmp__103; _this3._invInertia11 = __tmp__113; _this3._invInertia12 = __tmp__123; _this3._invInertia20 = __tmp__203; _this3._invInertia21 = __tmp__213; _this3._invInertia22 = __tmp__223; _this3._invInertia00 *= _this3._rotFactor.x; _this3._invInertia01 *= _this3._rotFactor.x; _this3._invInertia02 *= _this3._rotFactor.x; _this3._invInertia10 *= _this3._rotFactor.y; _this3._invInertia11 *= _this3._rotFactor.y; _this3._invInertia12 *= _this3._rotFactor.y; _this3._invInertia20 *= _this3._rotFactor.z; _this3._invInertia21 *= _this3._rotFactor.z; _this3._invInertia22 *= _this3._rotFactor.z; } postSolve() { this.joint._syncAnchors(); this.joint._checkDestruction(); } } if(!oimo.dynamics.rigidbody) oimo.dynamics.rigidbody = {}; oimo.dynamics.rigidbody.MassData = class oimo_dynamics_rigidbody_MassData { constructor() { this.mass = 0; this.localInertia = new oimo.common.Mat3(); } } oimo.dynamics.rigidbody.RigidBody = class oimo_dynamics_rigidbody_RigidBody { constructor(config) { this._next = null; this._prev = null; this._shapeList = null; this._shapeListLast = null; this._numShapes = 0; this._contactLinkList = null; this._contactLinkListLast = null; this._numContactLinks = 0; this._jointLinkList = null; this._jointLinkListLast = null; this._numJointLinks = 0; let v = config.linearVelocity; this._velX = v.x; this._velY = v.y; this._velZ = v.z; let v1 = config.angularVelocity; this._angVelX = v1.x; this._angVelY = v1.y; this._angVelZ = v1.z; this._pseudoVelX = 0; this._pseudoVelY = 0; this._pseudoVelZ = 0; this._angPseudoVelX = 0; this._angPseudoVelY = 0; this._angPseudoVelZ = 0; this._ptransform = new oimo.common.Transform(); this._transform = new oimo.common.Transform(); let v2 = config.position; this._ptransform._positionX = v2.x; this._ptransform._positionY = v2.y; this._ptransform._positionZ = v2.z; let m = config.rotation; this._ptransform._rotation00 = m.e00; this._ptransform._rotation01 = m.e01; this._ptransform._rotation02 = m.e02; this._ptransform._rotation10 = m.e10; this._ptransform._rotation11 = m.e11; this._ptransform._rotation12 = m.e12; this._ptransform._rotation20 = m.e20; this._ptransform._rotation21 = m.e21; this._ptransform._rotation22 = m.e22; let dst = this._transform; let src = this._ptransform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; this._type = config.type; this._sleepTime = 0; this._sleeping = false; this._autoSleep = config.autoSleep; this._mass = 0; this._invMass = 0; this._localInertia00 = 0; this._localInertia01 = 0; this._localInertia02 = 0; this._localInertia10 = 0; this._localInertia11 = 0; this._localInertia12 = 0; this._localInertia20 = 0; this._localInertia21 = 0; this._localInertia22 = 0; this._invLocalInertia00 = 0; this._invLocalInertia01 = 0; this._invLocalInertia02 = 0; this._invLocalInertia10 = 0; this._invLocalInertia11 = 0; this._invLocalInertia12 = 0; this._invLocalInertia20 = 0; this._invLocalInertia21 = 0; this._invLocalInertia22 = 0; this._invLocalInertiaWithoutRotFactor00 = 0; this._invLocalInertiaWithoutRotFactor01 = 0; this._invLocalInertiaWithoutRotFactor02 = 0; this._invLocalInertiaWithoutRotFactor10 = 0; this._invLocalInertiaWithoutRotFactor11 = 0; this._invLocalInertiaWithoutRotFactor12 = 0; this._invLocalInertiaWithoutRotFactor20 = 0; this._invLocalInertiaWithoutRotFactor21 = 0; this._invLocalInertiaWithoutRotFactor22 = 0; this._invInertia00 = 0; this._invInertia01 = 0; this._invInertia02 = 0; this._invInertia10 = 0; this._invInertia11 = 0; this._invInertia12 = 0; this._invInertia20 = 0; this._invInertia21 = 0; this._invInertia22 = 0; this._linearDamping = config.linearDamping; this._angularDamping = config.angularDamping; this._forceX = 0; this._forceY = 0; this._forceZ = 0; this._torqueX = 0; this._torqueY = 0; this._torqueZ = 0; this._linearContactImpulseX = 0; this._linearContactImpulseY = 0; this._linearContactImpulseZ = 0; this._angularContactImpulseX = 0; this._angularContactImpulseY = 0; this._angularContactImpulseZ = 0; this._rotFactor = new oimo.common.Vec3(1,1,1); this._addedToIsland = false; this._gravityScale = 1; this._world = null; } _integrate(dt) { switch(this._type) { case 1: this._velX = 0; this._velY = 0; this._velZ = 0; this._angVelX = 0; this._angVelY = 0; this._angVelZ = 0; this._pseudoVelX = 0; this._pseudoVelY = 0; this._pseudoVelZ = 0; this._angPseudoVelX = 0; this._angPseudoVelY = 0; this._angPseudoVelZ = 0; break; case 0:case 2: let translationX; let translationY; let translationZ; let rotationX; let rotationY; let rotationZ; translationX = this._velX * dt; translationY = this._velY * dt; translationZ = this._velZ * dt; rotationX = this._angVelX * dt; rotationY = this._angVelY * dt; rotationZ = this._angVelZ * dt; let translationLengthSq = translationX * translationX + translationY * translationY + translationZ * translationZ; let rotationLengthSq = rotationX * rotationX + rotationY * rotationY + rotationZ * rotationZ; if(translationLengthSq == 0 && rotationLengthSq == 0) { return; } if(translationLengthSq > oimo.common.Setting.maxTranslationPerStep * oimo.common.Setting.maxTranslationPerStep) { let l = oimo.common.Setting.maxTranslationPerStep / Math.sqrt(translationLengthSq); this._velX *= l; this._velY *= l; this._velZ *= l; translationX *= l; translationY *= l; translationZ *= l; } if(rotationLengthSq > oimo.common.Setting.maxRotationPerStep * oimo.common.Setting.maxRotationPerStep) { let l = oimo.common.Setting.maxRotationPerStep / Math.sqrt(rotationLengthSq); this._angVelX *= l; this._angVelY *= l; this._angVelZ *= l; rotationX *= l; rotationY *= l; rotationZ *= l; } this._transform._positionX += translationX; this._transform._positionY += translationY; this._transform._positionZ += translationZ; let theta = Math.sqrt(rotationX * rotationX + rotationY * rotationY + rotationZ * rotationZ); let halfTheta = theta * 0.5; let rotationToSinAxisFactor; let cosHalfTheta; if(halfTheta < 0.5) { let ht2 = halfTheta * halfTheta; rotationToSinAxisFactor = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332); cosHalfTheta = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664; } else { rotationToSinAxisFactor = Math.sin(halfTheta) / theta; cosHalfTheta = Math.cos(halfTheta); } let sinAxisX; let sinAxisY; let sinAxisZ; sinAxisX = rotationX * rotationToSinAxisFactor; sinAxisY = rotationY * rotationToSinAxisFactor; sinAxisZ = rotationZ * rotationToSinAxisFactor; let dqX; let dqY; let dqZ; let dqW; dqX = sinAxisX; dqY = sinAxisY; dqZ = sinAxisZ; dqW = cosHalfTheta; let qX; let qY; let qZ; let qW; let e00 = this._transform._rotation00; let e11 = this._transform._rotation11; let e22 = this._transform._rotation22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); qW = 0.5 * s; s = 0.5 / s; qX = (this._transform._rotation21 - this._transform._rotation12) * s; qY = (this._transform._rotation02 - this._transform._rotation20) * s; qZ = (this._transform._rotation10 - this._transform._rotation01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); qX = 0.5 * s; s = 0.5 / s; qY = (this._transform._rotation01 + this._transform._rotation10) * s; qZ = (this._transform._rotation02 + this._transform._rotation20) * s; qW = (this._transform._rotation21 - this._transform._rotation12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); qZ = 0.5 * s; s = 0.5 / s; qX = (this._transform._rotation02 + this._transform._rotation20) * s; qY = (this._transform._rotation12 + this._transform._rotation21) * s; qW = (this._transform._rotation10 - this._transform._rotation01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); qY = 0.5 * s; s = 0.5 / s; qX = (this._transform._rotation01 + this._transform._rotation10) * s; qZ = (this._transform._rotation12 + this._transform._rotation21) * s; qW = (this._transform._rotation02 - this._transform._rotation20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); qZ = 0.5 * s; s = 0.5 / s; qX = (this._transform._rotation02 + this._transform._rotation20) * s; qY = (this._transform._rotation12 + this._transform._rotation21) * s; qW = (this._transform._rotation10 - this._transform._rotation01) * s; } qX = dqW * qX + dqX * qW + dqY * qZ - dqZ * qY; qY = dqW * qY - dqX * qZ + dqY * qW + dqZ * qX; qZ = dqW * qZ + dqX * qY - dqY * qX + dqZ * qW; qW = dqW * qW - dqX * qX - dqY * qY - dqZ * qZ; let l = qX * qX + qY * qY + qZ * qZ + qW * qW; if(l > 1e-32) { l = 1 / Math.sqrt(l); } qX *= l; qY *= l; qZ *= l; qW *= l; let x = qX; let y = qY; let z = qZ; let w = qW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; this._transform._rotation00 = 1 - yy - zz; this._transform._rotation01 = xy - wz; this._transform._rotation02 = xz + wy; this._transform._rotation10 = xy + wz; this._transform._rotation11 = 1 - xx - zz; this._transform._rotation12 = yz - wx; this._transform._rotation20 = xz - wy; this._transform._rotation21 = yz + wx; this._transform._rotation22 = 1 - xx - yy; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__00; this._invInertia01 = __tmp__01; this._invInertia02 = __tmp__02; this._invInertia10 = __tmp__10; this._invInertia11 = __tmp__11; this._invInertia12 = __tmp__12; this._invInertia20 = __tmp__20; this._invInertia21 = __tmp__21; this._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; break; } } _integratePseudoVelocity() { if(this._pseudoVelX * this._pseudoVelX + this._pseudoVelY * this._pseudoVelY + this._pseudoVelZ * this._pseudoVelZ == 0 && this._angPseudoVelX * this._angPseudoVelX + this._angPseudoVelY * this._angPseudoVelY + this._angPseudoVelZ * this._angPseudoVelZ == 0) { return; } switch(this._type) { case 1: this._pseudoVelX = 0; this._pseudoVelY = 0; this._pseudoVelZ = 0; this._angPseudoVelX = 0; this._angPseudoVelY = 0; this._angPseudoVelZ = 0; break; case 0:case 2: let translationX; let translationY; let translationZ; let rotationX; let rotationY; let rotationZ; translationX = this._pseudoVelX; translationY = this._pseudoVelY; translationZ = this._pseudoVelZ; rotationX = this._angPseudoVelX; rotationY = this._angPseudoVelY; rotationZ = this._angPseudoVelZ; this._pseudoVelX = 0; this._pseudoVelY = 0; this._pseudoVelZ = 0; this._angPseudoVelX = 0; this._angPseudoVelY = 0; this._angPseudoVelZ = 0; this._transform._positionX += translationX; this._transform._positionY += translationY; this._transform._positionZ += translationZ; let theta = Math.sqrt(rotationX * rotationX + rotationY * rotationY + rotationZ * rotationZ); let halfTheta = theta * 0.5; let rotationToSinAxisFactor; let cosHalfTheta; if(halfTheta < 0.5) { let ht2 = halfTheta * halfTheta; rotationToSinAxisFactor = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332); cosHalfTheta = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664; } else { rotationToSinAxisFactor = Math.sin(halfTheta) / theta; cosHalfTheta = Math.cos(halfTheta); } let sinAxisX; let sinAxisY; let sinAxisZ; sinAxisX = rotationX * rotationToSinAxisFactor; sinAxisY = rotationY * rotationToSinAxisFactor; sinAxisZ = rotationZ * rotationToSinAxisFactor; let dqX; let dqY; let dqZ; let dqW; dqX = sinAxisX; dqY = sinAxisY; dqZ = sinAxisZ; dqW = cosHalfTheta; let qX; let qY; let qZ; let qW; let e00 = this._transform._rotation00; let e11 = this._transform._rotation11; let e22 = this._transform._rotation22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); qW = 0.5 * s; s = 0.5 / s; qX = (this._transform._rotation21 - this._transform._rotation12) * s; qY = (this._transform._rotation02 - this._transform._rotation20) * s; qZ = (this._transform._rotation10 - this._transform._rotation01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); qX = 0.5 * s; s = 0.5 / s; qY = (this._transform._rotation01 + this._transform._rotation10) * s; qZ = (this._transform._rotation02 + this._transform._rotation20) * s; qW = (this._transform._rotation21 - this._transform._rotation12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); qZ = 0.5 * s; s = 0.5 / s; qX = (this._transform._rotation02 + this._transform._rotation20) * s; qY = (this._transform._rotation12 + this._transform._rotation21) * s; qW = (this._transform._rotation10 - this._transform._rotation01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); qY = 0.5 * s; s = 0.5 / s; qX = (this._transform._rotation01 + this._transform._rotation10) * s; qZ = (this._transform._rotation12 + this._transform._rotation21) * s; qW = (this._transform._rotation02 - this._transform._rotation20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); qZ = 0.5 * s; s = 0.5 / s; qX = (this._transform._rotation02 + this._transform._rotation20) * s; qY = (this._transform._rotation12 + this._transform._rotation21) * s; qW = (this._transform._rotation10 - this._transform._rotation01) * s; } qX = dqW * qX + dqX * qW + dqY * qZ - dqZ * qY; qY = dqW * qY - dqX * qZ + dqY * qW + dqZ * qX; qZ = dqW * qZ + dqX * qY - dqY * qX + dqZ * qW; qW = dqW * qW - dqX * qX - dqY * qY - dqZ * qZ; let l = qX * qX + qY * qY + qZ * qZ + qW * qW; if(l > 1e-32) { l = 1 / Math.sqrt(l); } qX *= l; qY *= l; qZ *= l; qW *= l; let x = qX; let y = qY; let z = qZ; let w = qW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; this._transform._rotation00 = 1 - yy - zz; this._transform._rotation01 = xy - wz; this._transform._rotation02 = xz + wy; this._transform._rotation10 = xy + wz; this._transform._rotation11 = 1 - xx - zz; this._transform._rotation12 = yz - wx; this._transform._rotation20 = xz - wy; this._transform._rotation21 = yz + wx; this._transform._rotation22 = 1 - xx - yy; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__00; this._invInertia01 = __tmp__01; this._invInertia02 = __tmp__02; this._invInertia10 = __tmp__10; this._invInertia11 = __tmp__11; this._invInertia12 = __tmp__12; this._invInertia20 = __tmp__20; this._invInertia21 = __tmp__21; this._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; break; } } updateMass() { let totalInertia00; let totalInertia01; let totalInertia02; let totalInertia10; let totalInertia11; let totalInertia12; let totalInertia20; let totalInertia21; let totalInertia22; totalInertia00 = 0; totalInertia01 = 0; totalInertia02 = 0; totalInertia10 = 0; totalInertia11 = 0; totalInertia12 = 0; totalInertia20 = 0; totalInertia21 = 0; totalInertia22 = 0; let totalMass = 0; let s = this._shapeList; while(s != null) { let n = s._next; let g = s._geom; g._updateMass(); let mass = s._density * g._volume; let inertia00; let inertia01; let inertia02; let inertia10; let inertia11; let inertia12; let inertia20; let inertia21; let inertia22; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = s._localTransform._rotation00 * g._inertiaCoeff00 + s._localTransform._rotation01 * g._inertiaCoeff10 + s._localTransform._rotation02 * g._inertiaCoeff20; __tmp__01 = s._localTransform._rotation00 * g._inertiaCoeff01 + s._localTransform._rotation01 * g._inertiaCoeff11 + s._localTransform._rotation02 * g._inertiaCoeff21; __tmp__02 = s._localTransform._rotation00 * g._inertiaCoeff02 + s._localTransform._rotation01 * g._inertiaCoeff12 + s._localTransform._rotation02 * g._inertiaCoeff22; __tmp__10 = s._localTransform._rotation10 * g._inertiaCoeff00 + s._localTransform._rotation11 * g._inertiaCoeff10 + s._localTransform._rotation12 * g._inertiaCoeff20; __tmp__11 = s._localTransform._rotation10 * g._inertiaCoeff01 + s._localTransform._rotation11 * g._inertiaCoeff11 + s._localTransform._rotation12 * g._inertiaCoeff21; __tmp__12 = s._localTransform._rotation10 * g._inertiaCoeff02 + s._localTransform._rotation11 * g._inertiaCoeff12 + s._localTransform._rotation12 * g._inertiaCoeff22; __tmp__20 = s._localTransform._rotation20 * g._inertiaCoeff00 + s._localTransform._rotation21 * g._inertiaCoeff10 + s._localTransform._rotation22 * g._inertiaCoeff20; __tmp__21 = s._localTransform._rotation20 * g._inertiaCoeff01 + s._localTransform._rotation21 * g._inertiaCoeff11 + s._localTransform._rotation22 * g._inertiaCoeff21; __tmp__22 = s._localTransform._rotation20 * g._inertiaCoeff02 + s._localTransform._rotation21 * g._inertiaCoeff12 + s._localTransform._rotation22 * g._inertiaCoeff22; inertia00 = __tmp__00; inertia01 = __tmp__01; inertia02 = __tmp__02; inertia10 = __tmp__10; inertia11 = __tmp__11; inertia12 = __tmp__12; inertia20 = __tmp__20; inertia21 = __tmp__21; inertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = inertia00 * s._localTransform._rotation00 + inertia01 * s._localTransform._rotation01 + inertia02 * s._localTransform._rotation02; __tmp__011 = inertia00 * s._localTransform._rotation10 + inertia01 * s._localTransform._rotation11 + inertia02 * s._localTransform._rotation12; __tmp__021 = inertia00 * s._localTransform._rotation20 + inertia01 * s._localTransform._rotation21 + inertia02 * s._localTransform._rotation22; __tmp__101 = inertia10 * s._localTransform._rotation00 + inertia11 * s._localTransform._rotation01 + inertia12 * s._localTransform._rotation02; __tmp__111 = inertia10 * s._localTransform._rotation10 + inertia11 * s._localTransform._rotation11 + inertia12 * s._localTransform._rotation12; __tmp__121 = inertia10 * s._localTransform._rotation20 + inertia11 * s._localTransform._rotation21 + inertia12 * s._localTransform._rotation22; __tmp__201 = inertia20 * s._localTransform._rotation00 + inertia21 * s._localTransform._rotation01 + inertia22 * s._localTransform._rotation02; __tmp__211 = inertia20 * s._localTransform._rotation10 + inertia21 * s._localTransform._rotation11 + inertia22 * s._localTransform._rotation12; __tmp__221 = inertia20 * s._localTransform._rotation20 + inertia21 * s._localTransform._rotation21 + inertia22 * s._localTransform._rotation22; inertia00 = __tmp__001; inertia01 = __tmp__011; inertia02 = __tmp__021; inertia10 = __tmp__101; inertia11 = __tmp__111; inertia12 = __tmp__121; inertia20 = __tmp__201; inertia21 = __tmp__211; inertia22 = __tmp__221; inertia00 *= mass; inertia01 *= mass; inertia02 *= mass; inertia10 *= mass; inertia11 *= mass; inertia12 *= mass; inertia20 *= mass; inertia21 *= mass; inertia22 *= mass; let cogInertia00; let cogInertia01; let cogInertia02; let cogInertia10; let cogInertia11; let cogInertia12; let cogInertia20; let cogInertia21; let cogInertia22; let xx = s._localTransform._positionX * s._localTransform._positionX; let yy = s._localTransform._positionY * s._localTransform._positionY; let zz = s._localTransform._positionZ * s._localTransform._positionZ; let xy = -s._localTransform._positionX * s._localTransform._positionY; let yz = -s._localTransform._positionY * s._localTransform._positionZ; let zx = -s._localTransform._positionZ * s._localTransform._positionX; cogInertia00 = yy + zz; cogInertia01 = xy; cogInertia02 = zx; cogInertia10 = xy; cogInertia11 = xx + zz; cogInertia12 = yz; cogInertia20 = zx; cogInertia21 = yz; cogInertia22 = xx + yy; inertia00 += cogInertia00 * mass; inertia01 += cogInertia01 * mass; inertia02 += cogInertia02 * mass; inertia10 += cogInertia10 * mass; inertia11 += cogInertia11 * mass; inertia12 += cogInertia12 * mass; inertia20 += cogInertia20 * mass; inertia21 += cogInertia21 * mass; inertia22 += cogInertia22 * mass; totalMass += mass; totalInertia00 += inertia00; totalInertia01 += inertia01; totalInertia02 += inertia02; totalInertia10 += inertia10; totalInertia11 += inertia11; totalInertia12 += inertia12; totalInertia20 += inertia20; totalInertia21 += inertia21; totalInertia22 += inertia22; s = n; } this._mass = totalMass; this._localInertia00 = totalInertia00; this._localInertia01 = totalInertia01; this._localInertia02 = totalInertia02; this._localInertia10 = totalInertia10; this._localInertia11 = totalInertia11; this._localInertia12 = totalInertia12; this._localInertia20 = totalInertia20; this._localInertia21 = totalInertia21; this._localInertia22 = totalInertia22; if(this._mass > 0 && this._localInertia00 * (this._localInertia11 * this._localInertia22 - this._localInertia12 * this._localInertia21) - this._localInertia01 * (this._localInertia10 * this._localInertia22 - this._localInertia12 * this._localInertia20) + this._localInertia02 * (this._localInertia10 * this._localInertia21 - this._localInertia11 * this._localInertia20) > 0 && this._type == 0) { this._invMass = 1 / this._mass; let d00 = this._localInertia11 * this._localInertia22 - this._localInertia12 * this._localInertia21; let d01 = this._localInertia10 * this._localInertia22 - this._localInertia12 * this._localInertia20; let d02 = this._localInertia10 * this._localInertia21 - this._localInertia11 * this._localInertia20; let d = this._localInertia00 * d00 - this._localInertia01 * d01 + this._localInertia02 * d02; if(d < -1e-32 || d > 1e-32) { d = 1 / d; } this._invLocalInertia00 = d00 * d; this._invLocalInertia01 = -(this._localInertia01 * this._localInertia22 - this._localInertia02 * this._localInertia21) * d; this._invLocalInertia02 = (this._localInertia01 * this._localInertia12 - this._localInertia02 * this._localInertia11) * d; this._invLocalInertia10 = -d01 * d; this._invLocalInertia11 = (this._localInertia00 * this._localInertia22 - this._localInertia02 * this._localInertia20) * d; this._invLocalInertia12 = -(this._localInertia00 * this._localInertia12 - this._localInertia02 * this._localInertia10) * d; this._invLocalInertia20 = d02 * d; this._invLocalInertia21 = -(this._localInertia00 * this._localInertia21 - this._localInertia01 * this._localInertia20) * d; this._invLocalInertia22 = (this._localInertia00 * this._localInertia11 - this._localInertia01 * this._localInertia10) * d; this._invLocalInertiaWithoutRotFactor00 = this._invLocalInertia00; this._invLocalInertiaWithoutRotFactor01 = this._invLocalInertia01; this._invLocalInertiaWithoutRotFactor02 = this._invLocalInertia02; this._invLocalInertiaWithoutRotFactor10 = this._invLocalInertia10; this._invLocalInertiaWithoutRotFactor11 = this._invLocalInertia11; this._invLocalInertiaWithoutRotFactor12 = this._invLocalInertia12; this._invLocalInertiaWithoutRotFactor20 = this._invLocalInertia20; this._invLocalInertiaWithoutRotFactor21 = this._invLocalInertia21; this._invLocalInertiaWithoutRotFactor22 = this._invLocalInertia22; this._invLocalInertia00 = this._invLocalInertiaWithoutRotFactor00 * this._rotFactor.x; this._invLocalInertia01 = this._invLocalInertiaWithoutRotFactor01 * this._rotFactor.x; this._invLocalInertia02 = this._invLocalInertiaWithoutRotFactor02 * this._rotFactor.x; this._invLocalInertia10 = this._invLocalInertiaWithoutRotFactor10 * this._rotFactor.y; this._invLocalInertia11 = this._invLocalInertiaWithoutRotFactor11 * this._rotFactor.y; this._invLocalInertia12 = this._invLocalInertiaWithoutRotFactor12 * this._rotFactor.y; this._invLocalInertia20 = this._invLocalInertiaWithoutRotFactor20 * this._rotFactor.z; this._invLocalInertia21 = this._invLocalInertiaWithoutRotFactor21 * this._rotFactor.z; this._invLocalInertia22 = this._invLocalInertiaWithoutRotFactor22 * this._rotFactor.z; } else { this._invMass = 0; this._invLocalInertia00 = 0; this._invLocalInertia01 = 0; this._invLocalInertia02 = 0; this._invLocalInertia10 = 0; this._invLocalInertia11 = 0; this._invLocalInertia12 = 0; this._invLocalInertia20 = 0; this._invLocalInertia21 = 0; this._invLocalInertia22 = 0; this._invLocalInertiaWithoutRotFactor00 = 0; this._invLocalInertiaWithoutRotFactor01 = 0; this._invLocalInertiaWithoutRotFactor02 = 0; this._invLocalInertiaWithoutRotFactor10 = 0; this._invLocalInertiaWithoutRotFactor11 = 0; this._invLocalInertiaWithoutRotFactor12 = 0; this._invLocalInertiaWithoutRotFactor20 = 0; this._invLocalInertiaWithoutRotFactor21 = 0; this._invLocalInertiaWithoutRotFactor22 = 0; if(this._type == 0) { this._type = 1; } } let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__00; this._invInertia01 = __tmp__01; this._invInertia02 = __tmp__02; this._invInertia10 = __tmp__10; this._invInertia11 = __tmp__11; this._invInertia12 = __tmp__12; this._invInertia20 = __tmp__20; this._invInertia21 = __tmp__21; this._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; this._sleeping = false; this._sleepTime = 0; } getPosition() { let v = new oimo.common.Vec3(); v.x = this._transform._positionX; v.y = this._transform._positionY; v.z = this._transform._positionZ; return v; } getPositionTo(position) { position.x = this._transform._positionX; position.y = this._transform._positionY; position.z = this._transform._positionZ; } setPosition(position) { this._transform._positionX = position.x; this._transform._positionY = position.y; this._transform._positionZ = position.z; let dst = this._ptransform; let src = this._transform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; let s = this._shapeList; while(s != null) { let n = s._next; let tf1 = this._ptransform; let tf2 = this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } this._sleeping = false; this._sleepTime = 0; } translate(translation) { let diffX; let diffY; let diffZ; diffX = translation.x; diffY = translation.y; diffZ = translation.z; this._transform._positionX += diffX; this._transform._positionY += diffY; this._transform._positionZ += diffZ; let dst = this._ptransform; let src = this._transform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; let s = this._shapeList; while(s != null) { let n = s._next; let tf1 = this._ptransform; let tf2 = this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } this._sleeping = false; this._sleepTime = 0; } getRotation() { let m = new oimo.common.Mat3(); m.e00 = this._transform._rotation00; m.e01 = this._transform._rotation01; m.e02 = this._transform._rotation02; m.e10 = this._transform._rotation10; m.e11 = this._transform._rotation11; m.e12 = this._transform._rotation12; m.e20 = this._transform._rotation20; m.e21 = this._transform._rotation21; m.e22 = this._transform._rotation22; return m; } getRotationTo(rotation) { rotation.e00 = this._transform._rotation00; rotation.e01 = this._transform._rotation01; rotation.e02 = this._transform._rotation02; rotation.e10 = this._transform._rotation10; rotation.e11 = this._transform._rotation11; rotation.e12 = this._transform._rotation12; rotation.e20 = this._transform._rotation20; rotation.e21 = this._transform._rotation21; rotation.e22 = this._transform._rotation22; } setRotation(rotation) { this._transform._rotation00 = rotation.e00; this._transform._rotation01 = rotation.e01; this._transform._rotation02 = rotation.e02; this._transform._rotation10 = rotation.e10; this._transform._rotation11 = rotation.e11; this._transform._rotation12 = rotation.e12; this._transform._rotation20 = rotation.e20; this._transform._rotation21 = rotation.e21; this._transform._rotation22 = rotation.e22; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__00; this._invInertia01 = __tmp__01; this._invInertia02 = __tmp__02; this._invInertia10 = __tmp__10; this._invInertia11 = __tmp__11; this._invInertia12 = __tmp__12; this._invInertia20 = __tmp__20; this._invInertia21 = __tmp__21; this._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; let dst = this._ptransform; let src = this._transform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; let s = this._shapeList; while(s != null) { let n = s._next; let tf1 = this._ptransform; let tf2 = this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } this._sleeping = false; this._sleepTime = 0; } setRotationXyz(eulerAngles) { let xyzX; let xyzY; let xyzZ; xyzX = eulerAngles.x; xyzY = eulerAngles.y; xyzZ = eulerAngles.z; let sx = Math.sin(xyzX); let sy = Math.sin(xyzY); let sz = Math.sin(xyzZ); let cx = Math.cos(xyzX); let cy = Math.cos(xyzY); let cz = Math.cos(xyzZ); this._transform._rotation00 = cy * cz; this._transform._rotation01 = -cy * sz; this._transform._rotation02 = sy; this._transform._rotation10 = cx * sz + cz * sx * sy; this._transform._rotation11 = cx * cz - sx * sy * sz; this._transform._rotation12 = -cy * sx; this._transform._rotation20 = sx * sz - cx * cz * sy; this._transform._rotation21 = cz * sx + cx * sy * sz; this._transform._rotation22 = cx * cy; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__00; this._invInertia01 = __tmp__01; this._invInertia02 = __tmp__02; this._invInertia10 = __tmp__10; this._invInertia11 = __tmp__11; this._invInertia12 = __tmp__12; this._invInertia20 = __tmp__20; this._invInertia21 = __tmp__21; this._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; let dst = this._ptransform; let src = this._transform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; let s = this._shapeList; while(s != null) { let n = s._next; let tf1 = this._ptransform; let tf2 = this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } this._sleeping = false; this._sleepTime = 0; } rotate(rotation) { let rot00; let rot01; let rot02; let rot10; let rot11; let rot12; let rot20; let rot21; let rot22; rot00 = rotation.e00; rot01 = rotation.e01; rot02 = rotation.e02; rot10 = rotation.e10; rot11 = rotation.e11; rot12 = rotation.e12; rot20 = rotation.e20; rot21 = rotation.e21; rot22 = rotation.e22; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = rot00 * this._transform._rotation00 + rot01 * this._transform._rotation10 + rot02 * this._transform._rotation20; __tmp__01 = rot00 * this._transform._rotation01 + rot01 * this._transform._rotation11 + rot02 * this._transform._rotation21; __tmp__02 = rot00 * this._transform._rotation02 + rot01 * this._transform._rotation12 + rot02 * this._transform._rotation22; __tmp__10 = rot10 * this._transform._rotation00 + rot11 * this._transform._rotation10 + rot12 * this._transform._rotation20; __tmp__11 = rot10 * this._transform._rotation01 + rot11 * this._transform._rotation11 + rot12 * this._transform._rotation21; __tmp__12 = rot10 * this._transform._rotation02 + rot11 * this._transform._rotation12 + rot12 * this._transform._rotation22; __tmp__20 = rot20 * this._transform._rotation00 + rot21 * this._transform._rotation10 + rot22 * this._transform._rotation20; __tmp__21 = rot20 * this._transform._rotation01 + rot21 * this._transform._rotation11 + rot22 * this._transform._rotation21; __tmp__22 = rot20 * this._transform._rotation02 + rot21 * this._transform._rotation12 + rot22 * this._transform._rotation22; this._transform._rotation00 = __tmp__00; this._transform._rotation01 = __tmp__01; this._transform._rotation02 = __tmp__02; this._transform._rotation10 = __tmp__10; this._transform._rotation11 = __tmp__11; this._transform._rotation12 = __tmp__12; this._transform._rotation20 = __tmp__20; this._transform._rotation21 = __tmp__21; this._transform._rotation22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__011 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__021 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__101 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__111 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__121 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__201 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__211 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__221 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; let __tmp__002; let __tmp__012; let __tmp__022; let __tmp__102; let __tmp__112; let __tmp__122; let __tmp__202; let __tmp__212; let __tmp__222; __tmp__002 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__012 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__022 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__102 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__112 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__122 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__202 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__212 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__222 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__002; this._invInertia01 = __tmp__012; this._invInertia02 = __tmp__022; this._invInertia10 = __tmp__102; this._invInertia11 = __tmp__112; this._invInertia12 = __tmp__122; this._invInertia20 = __tmp__202; this._invInertia21 = __tmp__212; this._invInertia22 = __tmp__222; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; let dst = this._ptransform; let src = this._transform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; let s = this._shapeList; while(s != null) { let n = s._next; let tf1 = this._ptransform; let tf2 = this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } this._sleeping = false; this._sleepTime = 0; } rotateXyz(eulerAngles) { let xyzX; let xyzY; let xyzZ; let rot00; let rot01; let rot02; let rot10; let rot11; let rot12; let rot20; let rot21; let rot22; xyzX = eulerAngles.x; xyzY = eulerAngles.y; xyzZ = eulerAngles.z; let sx = Math.sin(xyzX); let sy = Math.sin(xyzY); let sz = Math.sin(xyzZ); let cx = Math.cos(xyzX); let cy = Math.cos(xyzY); let cz = Math.cos(xyzZ); rot00 = cy * cz; rot01 = -cy * sz; rot02 = sy; rot10 = cx * sz + cz * sx * sy; rot11 = cx * cz - sx * sy * sz; rot12 = -cy * sx; rot20 = sx * sz - cx * cz * sy; rot21 = cz * sx + cx * sy * sz; rot22 = cx * cy; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = rot00 * this._transform._rotation00 + rot01 * this._transform._rotation10 + rot02 * this._transform._rotation20; __tmp__01 = rot00 * this._transform._rotation01 + rot01 * this._transform._rotation11 + rot02 * this._transform._rotation21; __tmp__02 = rot00 * this._transform._rotation02 + rot01 * this._transform._rotation12 + rot02 * this._transform._rotation22; __tmp__10 = rot10 * this._transform._rotation00 + rot11 * this._transform._rotation10 + rot12 * this._transform._rotation20; __tmp__11 = rot10 * this._transform._rotation01 + rot11 * this._transform._rotation11 + rot12 * this._transform._rotation21; __tmp__12 = rot10 * this._transform._rotation02 + rot11 * this._transform._rotation12 + rot12 * this._transform._rotation22; __tmp__20 = rot20 * this._transform._rotation00 + rot21 * this._transform._rotation10 + rot22 * this._transform._rotation20; __tmp__21 = rot20 * this._transform._rotation01 + rot21 * this._transform._rotation11 + rot22 * this._transform._rotation21; __tmp__22 = rot20 * this._transform._rotation02 + rot21 * this._transform._rotation12 + rot22 * this._transform._rotation22; this._transform._rotation00 = __tmp__00; this._transform._rotation01 = __tmp__01; this._transform._rotation02 = __tmp__02; this._transform._rotation10 = __tmp__10; this._transform._rotation11 = __tmp__11; this._transform._rotation12 = __tmp__12; this._transform._rotation20 = __tmp__20; this._transform._rotation21 = __tmp__21; this._transform._rotation22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__011 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__021 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__101 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__111 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__121 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__201 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__211 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__221 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; let __tmp__002; let __tmp__012; let __tmp__022; let __tmp__102; let __tmp__112; let __tmp__122; let __tmp__202; let __tmp__212; let __tmp__222; __tmp__002 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__012 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__022 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__102 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__112 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__122 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__202 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__212 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__222 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__002; this._invInertia01 = __tmp__012; this._invInertia02 = __tmp__022; this._invInertia10 = __tmp__102; this._invInertia11 = __tmp__112; this._invInertia12 = __tmp__122; this._invInertia20 = __tmp__202; this._invInertia21 = __tmp__212; this._invInertia22 = __tmp__222; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; let dst = this._ptransform; let src = this._transform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; let s = this._shapeList; while(s != null) { let n = s._next; let tf1 = this._ptransform; let tf2 = this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } this._sleeping = false; this._sleepTime = 0; } getOrientation() { let q = new oimo.common.Quat(); let iqX; let iqY; let iqZ; let iqW; let e00 = this._transform._rotation00; let e11 = this._transform._rotation11; let e22 = this._transform._rotation22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); iqW = 0.5 * s; s = 0.5 / s; iqX = (this._transform._rotation21 - this._transform._rotation12) * s; iqY = (this._transform._rotation02 - this._transform._rotation20) * s; iqZ = (this._transform._rotation10 - this._transform._rotation01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); iqX = 0.5 * s; s = 0.5 / s; iqY = (this._transform._rotation01 + this._transform._rotation10) * s; iqZ = (this._transform._rotation02 + this._transform._rotation20) * s; iqW = (this._transform._rotation21 - this._transform._rotation12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); iqZ = 0.5 * s; s = 0.5 / s; iqX = (this._transform._rotation02 + this._transform._rotation20) * s; iqY = (this._transform._rotation12 + this._transform._rotation21) * s; iqW = (this._transform._rotation10 - this._transform._rotation01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); iqY = 0.5 * s; s = 0.5 / s; iqX = (this._transform._rotation01 + this._transform._rotation10) * s; iqZ = (this._transform._rotation12 + this._transform._rotation21) * s; iqW = (this._transform._rotation02 - this._transform._rotation20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); iqZ = 0.5 * s; s = 0.5 / s; iqX = (this._transform._rotation02 + this._transform._rotation20) * s; iqY = (this._transform._rotation12 + this._transform._rotation21) * s; iqW = (this._transform._rotation10 - this._transform._rotation01) * s; } q.x = iqX; q.y = iqY; q.z = iqZ; q.w = iqW; return q; } getOrientationTo(orientation) { let iqX; let iqY; let iqZ; let iqW; let e00 = this._transform._rotation00; let e11 = this._transform._rotation11; let e22 = this._transform._rotation22; let t = e00 + e11 + e22; let s; if(t > 0) { s = Math.sqrt(t + 1); iqW = 0.5 * s; s = 0.5 / s; iqX = (this._transform._rotation21 - this._transform._rotation12) * s; iqY = (this._transform._rotation02 - this._transform._rotation20) * s; iqZ = (this._transform._rotation10 - this._transform._rotation01) * s; } else if(e00 > e11) { if(e00 > e22) { s = Math.sqrt(e00 - e11 - e22 + 1); iqX = 0.5 * s; s = 0.5 / s; iqY = (this._transform._rotation01 + this._transform._rotation10) * s; iqZ = (this._transform._rotation02 + this._transform._rotation20) * s; iqW = (this._transform._rotation21 - this._transform._rotation12) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); iqZ = 0.5 * s; s = 0.5 / s; iqX = (this._transform._rotation02 + this._transform._rotation20) * s; iqY = (this._transform._rotation12 + this._transform._rotation21) * s; iqW = (this._transform._rotation10 - this._transform._rotation01) * s; } } else if(e11 > e22) { s = Math.sqrt(e11 - e22 - e00 + 1); iqY = 0.5 * s; s = 0.5 / s; iqX = (this._transform._rotation01 + this._transform._rotation10) * s; iqZ = (this._transform._rotation12 + this._transform._rotation21) * s; iqW = (this._transform._rotation02 - this._transform._rotation20) * s; } else { s = Math.sqrt(e22 - e00 - e11 + 1); iqZ = 0.5 * s; s = 0.5 / s; iqX = (this._transform._rotation02 + this._transform._rotation20) * s; iqY = (this._transform._rotation12 + this._transform._rotation21) * s; iqW = (this._transform._rotation10 - this._transform._rotation01) * s; } orientation.x = iqX; orientation.y = iqY; orientation.z = iqZ; orientation.w = iqW; } setOrientation(quaternion) { let qX; let qY; let qZ; let qW; qX = quaternion.x; qY = quaternion.y; qZ = quaternion.z; qW = quaternion.w; let x = qX; let y = qY; let z = qZ; let w = qW; let x2 = 2 * x; let y2 = 2 * y; let z2 = 2 * z; let xx = x * x2; let yy = y * y2; let zz = z * z2; let xy = x * y2; let yz = y * z2; let xz = x * z2; let wx = w * x2; let wy = w * y2; let wz = w * z2; this._transform._rotation00 = 1 - yy - zz; this._transform._rotation01 = xy - wz; this._transform._rotation02 = xz + wy; this._transform._rotation10 = xy + wz; this._transform._rotation11 = 1 - xx - zz; this._transform._rotation12 = yz - wx; this._transform._rotation20 = xz - wy; this._transform._rotation21 = yz + wx; this._transform._rotation22 = 1 - xx - yy; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__00; this._invInertia01 = __tmp__01; this._invInertia02 = __tmp__02; this._invInertia10 = __tmp__10; this._invInertia11 = __tmp__11; this._invInertia12 = __tmp__12; this._invInertia20 = __tmp__20; this._invInertia21 = __tmp__21; this._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; let dst = this._ptransform; let src = this._transform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; let s = this._shapeList; while(s != null) { let n = s._next; let tf1 = this._ptransform; let tf2 = this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } this._sleeping = false; this._sleepTime = 0; } getTransform() { let _this = this._transform; let tf = new oimo.common.Transform(); tf._positionX = _this._positionX; tf._positionY = _this._positionY; tf._positionZ = _this._positionZ; tf._rotation00 = _this._rotation00; tf._rotation01 = _this._rotation01; tf._rotation02 = _this._rotation02; tf._rotation10 = _this._rotation10; tf._rotation11 = _this._rotation11; tf._rotation12 = _this._rotation12; tf._rotation20 = _this._rotation20; tf._rotation21 = _this._rotation21; tf._rotation22 = _this._rotation22; return tf; } getTransformTo(transform) { let transform1 = this._transform; transform._positionX = transform1._positionX; transform._positionY = transform1._positionY; transform._positionZ = transform1._positionZ; transform._rotation00 = transform1._rotation00; transform._rotation01 = transform1._rotation01; transform._rotation02 = transform1._rotation02; transform._rotation10 = transform1._rotation10; transform._rotation11 = transform1._rotation11; transform._rotation12 = transform1._rotation12; transform._rotation20 = transform1._rotation20; transform._rotation21 = transform1._rotation21; transform._rotation22 = transform1._rotation22; } setTransform(transform) { this._transform._positionX = transform._positionX; this._transform._positionY = transform._positionY; this._transform._positionZ = transform._positionZ; this._transform._rotation00 = transform._rotation00; this._transform._rotation01 = transform._rotation01; this._transform._rotation02 = transform._rotation02; this._transform._rotation10 = transform._rotation10; this._transform._rotation11 = transform._rotation11; this._transform._rotation12 = transform._rotation12; this._transform._rotation20 = transform._rotation20; this._transform._rotation21 = transform._rotation21; this._transform._rotation22 = transform._rotation22; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__00; this._invInertia01 = __tmp__01; this._invInertia02 = __tmp__02; this._invInertia10 = __tmp__10; this._invInertia11 = __tmp__11; this._invInertia12 = __tmp__12; this._invInertia20 = __tmp__20; this._invInertia21 = __tmp__21; this._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; let dst = this._ptransform; let src = this._transform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; let s = this._shapeList; while(s != null) { let n = s._next; let tf1 = this._ptransform; let tf2 = this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } this._sleeping = false; this._sleepTime = 0; } getMass() { return this._mass; } getLocalInertia() { let m = new oimo.common.Mat3(); m.e00 = this._localInertia00; m.e01 = this._localInertia01; m.e02 = this._localInertia02; m.e10 = this._localInertia10; m.e11 = this._localInertia11; m.e12 = this._localInertia12; m.e20 = this._localInertia20; m.e21 = this._localInertia21; m.e22 = this._localInertia22; return m; } getLocalInertiaTo(inertia) { inertia.e00 = this._localInertia00; inertia.e01 = this._localInertia01; inertia.e02 = this._localInertia02; inertia.e10 = this._localInertia10; inertia.e11 = this._localInertia11; inertia.e12 = this._localInertia12; inertia.e20 = this._localInertia20; inertia.e21 = this._localInertia21; inertia.e22 = this._localInertia22; } getMassData() { let md = new oimo.dynamics.rigidbody.MassData(); md.mass = this._mass; let m = md.localInertia; m.e00 = this._localInertia00; m.e01 = this._localInertia01; m.e02 = this._localInertia02; m.e10 = this._localInertia10; m.e11 = this._localInertia11; m.e12 = this._localInertia12; m.e20 = this._localInertia20; m.e21 = this._localInertia21; m.e22 = this._localInertia22; return md; } getMassDataTo(massData) { massData.mass = this._mass; let m = massData.localInertia; m.e00 = this._localInertia00; m.e01 = this._localInertia01; m.e02 = this._localInertia02; m.e10 = this._localInertia10; m.e11 = this._localInertia11; m.e12 = this._localInertia12; m.e20 = this._localInertia20; m.e21 = this._localInertia21; m.e22 = this._localInertia22; } setMassData(massData) { this._mass = massData.mass; let m = massData.localInertia; this._localInertia00 = m.e00; this._localInertia01 = m.e01; this._localInertia02 = m.e02; this._localInertia10 = m.e10; this._localInertia11 = m.e11; this._localInertia12 = m.e12; this._localInertia20 = m.e20; this._localInertia21 = m.e21; this._localInertia22 = m.e22; if(this._mass > 0 && this._localInertia00 * (this._localInertia11 * this._localInertia22 - this._localInertia12 * this._localInertia21) - this._localInertia01 * (this._localInertia10 * this._localInertia22 - this._localInertia12 * this._localInertia20) + this._localInertia02 * (this._localInertia10 * this._localInertia21 - this._localInertia11 * this._localInertia20) > 0 && this._type == 0) { this._invMass = 1 / this._mass; let d00 = this._localInertia11 * this._localInertia22 - this._localInertia12 * this._localInertia21; let d01 = this._localInertia10 * this._localInertia22 - this._localInertia12 * this._localInertia20; let d02 = this._localInertia10 * this._localInertia21 - this._localInertia11 * this._localInertia20; let d = this._localInertia00 * d00 - this._localInertia01 * d01 + this._localInertia02 * d02; if(d < -1e-32 || d > 1e-32) { d = 1 / d; } this._invLocalInertia00 = d00 * d; this._invLocalInertia01 = -(this._localInertia01 * this._localInertia22 - this._localInertia02 * this._localInertia21) * d; this._invLocalInertia02 = (this._localInertia01 * this._localInertia12 - this._localInertia02 * this._localInertia11) * d; this._invLocalInertia10 = -d01 * d; this._invLocalInertia11 = (this._localInertia00 * this._localInertia22 - this._localInertia02 * this._localInertia20) * d; this._invLocalInertia12 = -(this._localInertia00 * this._localInertia12 - this._localInertia02 * this._localInertia10) * d; this._invLocalInertia20 = d02 * d; this._invLocalInertia21 = -(this._localInertia00 * this._localInertia21 - this._localInertia01 * this._localInertia20) * d; this._invLocalInertia22 = (this._localInertia00 * this._localInertia11 - this._localInertia01 * this._localInertia10) * d; this._invLocalInertiaWithoutRotFactor00 = this._invLocalInertia00; this._invLocalInertiaWithoutRotFactor01 = this._invLocalInertia01; this._invLocalInertiaWithoutRotFactor02 = this._invLocalInertia02; this._invLocalInertiaWithoutRotFactor10 = this._invLocalInertia10; this._invLocalInertiaWithoutRotFactor11 = this._invLocalInertia11; this._invLocalInertiaWithoutRotFactor12 = this._invLocalInertia12; this._invLocalInertiaWithoutRotFactor20 = this._invLocalInertia20; this._invLocalInertiaWithoutRotFactor21 = this._invLocalInertia21; this._invLocalInertiaWithoutRotFactor22 = this._invLocalInertia22; this._invLocalInertia00 = this._invLocalInertiaWithoutRotFactor00 * this._rotFactor.x; this._invLocalInertia01 = this._invLocalInertiaWithoutRotFactor01 * this._rotFactor.x; this._invLocalInertia02 = this._invLocalInertiaWithoutRotFactor02 * this._rotFactor.x; this._invLocalInertia10 = this._invLocalInertiaWithoutRotFactor10 * this._rotFactor.y; this._invLocalInertia11 = this._invLocalInertiaWithoutRotFactor11 * this._rotFactor.y; this._invLocalInertia12 = this._invLocalInertiaWithoutRotFactor12 * this._rotFactor.y; this._invLocalInertia20 = this._invLocalInertiaWithoutRotFactor20 * this._rotFactor.z; this._invLocalInertia21 = this._invLocalInertiaWithoutRotFactor21 * this._rotFactor.z; this._invLocalInertia22 = this._invLocalInertiaWithoutRotFactor22 * this._rotFactor.z; } else { this._invMass = 0; this._invLocalInertia00 = 0; this._invLocalInertia01 = 0; this._invLocalInertia02 = 0; this._invLocalInertia10 = 0; this._invLocalInertia11 = 0; this._invLocalInertia12 = 0; this._invLocalInertia20 = 0; this._invLocalInertia21 = 0; this._invLocalInertia22 = 0; this._invLocalInertiaWithoutRotFactor00 = 0; this._invLocalInertiaWithoutRotFactor01 = 0; this._invLocalInertiaWithoutRotFactor02 = 0; this._invLocalInertiaWithoutRotFactor10 = 0; this._invLocalInertiaWithoutRotFactor11 = 0; this._invLocalInertiaWithoutRotFactor12 = 0; this._invLocalInertiaWithoutRotFactor20 = 0; this._invLocalInertiaWithoutRotFactor21 = 0; this._invLocalInertiaWithoutRotFactor22 = 0; if(this._type == 0) { this._type = 1; } } let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__00; this._invInertia01 = __tmp__01; this._invInertia02 = __tmp__02; this._invInertia10 = __tmp__10; this._invInertia11 = __tmp__11; this._invInertia12 = __tmp__12; this._invInertia20 = __tmp__20; this._invInertia21 = __tmp__21; this._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; this._sleeping = false; this._sleepTime = 0; } getRotationFactor() { let _this = this._rotFactor; return new oimo.common.Vec3(_this.x,_this.y,_this.z); } setRotationFactor(rotationFactor) { let _this = this._rotFactor; _this.x = rotationFactor.x; _this.y = rotationFactor.y; _this.z = rotationFactor.z; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20; __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21; __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22; __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20; __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21; __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22; __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20; __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21; __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22; this._invInertia00 = __tmp__00; this._invInertia01 = __tmp__01; this._invInertia02 = __tmp__02; this._invInertia10 = __tmp__10; this._invInertia11 = __tmp__11; this._invInertia12 = __tmp__12; this._invInertia20 = __tmp__20; this._invInertia21 = __tmp__21; this._invInertia22 = __tmp__22; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02; __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12; __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22; __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02; __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12; __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22; __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02; __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12; __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22; this._invInertia00 = __tmp__001; this._invInertia01 = __tmp__011; this._invInertia02 = __tmp__021; this._invInertia10 = __tmp__101; this._invInertia11 = __tmp__111; this._invInertia12 = __tmp__121; this._invInertia20 = __tmp__201; this._invInertia21 = __tmp__211; this._invInertia22 = __tmp__221; this._invInertia00 *= this._rotFactor.x; this._invInertia01 *= this._rotFactor.x; this._invInertia02 *= this._rotFactor.x; this._invInertia10 *= this._rotFactor.y; this._invInertia11 *= this._rotFactor.y; this._invInertia12 *= this._rotFactor.y; this._invInertia20 *= this._rotFactor.z; this._invInertia21 *= this._rotFactor.z; this._invInertia22 *= this._rotFactor.z; this._sleeping = false; this._sleepTime = 0; } getLinearVelocity() { let v = new oimo.common.Vec3(); v.x = this._velX; v.y = this._velY; v.z = this._velZ; return v; } getLinearVelocityTo(linearVelocity) { linearVelocity.x = this._velX; linearVelocity.y = this._velY; linearVelocity.z = this._velZ; } setLinearVelocity(linearVelocity) { if(this._type == 1) { this._velX = 0; this._velY = 0; this._velZ = 0; } else { this._velX = linearVelocity.x; this._velY = linearVelocity.y; this._velZ = linearVelocity.z; } this._sleeping = false; this._sleepTime = 0; } getAngularVelocity() { let v = new oimo.common.Vec3(); v.x = this._angVelX; v.y = this._angVelY; v.z = this._angVelZ; return v; } getAngularVelocityTo(angularVelocity) { angularVelocity.x = this._velX; angularVelocity.y = this._velY; angularVelocity.z = this._velZ; } setAngularVelocity(angularVelocity) { if(this._type == 1) { this._angVelX = 0; this._angVelY = 0; this._angVelZ = 0; } else { this._angVelX = angularVelocity.x; this._angVelY = angularVelocity.y; this._angVelZ = angularVelocity.z; } this._sleeping = false; this._sleepTime = 0; } addLinearVelocity(linearVelocityChange) { if(this._type != 1) { let dX; let dY; let dZ; dX = linearVelocityChange.x; dY = linearVelocityChange.y; dZ = linearVelocityChange.z; this._velX += dX; this._velY += dY; this._velZ += dZ; } this._sleeping = false; this._sleepTime = 0; } addAngularVelocity(angularVelocityChange) { if(this._type != 1) { let dX; let dY; let dZ; dX = angularVelocityChange.x; dY = angularVelocityChange.y; dZ = angularVelocityChange.z; this._angVelX += dX; this._angVelY += dY; this._angVelZ += dZ; } this._sleeping = false; this._sleepTime = 0; } applyImpulse(impulse,positionInWorld) { let impX; let impY; let impZ; impX = impulse.x; impY = impulse.y; impZ = impulse.z; this._velX += impX * this._invMass; this._velY += impY * this._invMass; this._velZ += impZ * this._invMass; let aimpX; let aimpY; let aimpZ; let posX; let posY; let posZ; posX = positionInWorld.x; posY = positionInWorld.y; posZ = positionInWorld.z; posX -= this._transform._positionX; posY -= this._transform._positionY; posZ -= this._transform._positionZ; aimpX = posY * impZ - posZ * impY; aimpY = posZ * impX - posX * impZ; aimpZ = posX * impY - posY * impX; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._invInertia00 * aimpX + this._invInertia01 * aimpY + this._invInertia02 * aimpZ; __tmp__Y = this._invInertia10 * aimpX + this._invInertia11 * aimpY + this._invInertia12 * aimpZ; __tmp__Z = this._invInertia20 * aimpX + this._invInertia21 * aimpY + this._invInertia22 * aimpZ; aimpX = __tmp__X; aimpY = __tmp__Y; aimpZ = __tmp__Z; this._angVelX += aimpX; this._angVelY += aimpY; this._angVelZ += aimpZ; this._sleeping = false; this._sleepTime = 0; } applyLinearImpulse(impulse) { let impX; let impY; let impZ; impX = impulse.x; impY = impulse.y; impZ = impulse.z; this._velX += impX * this._invMass; this._velY += impY * this._invMass; this._velZ += impZ * this._invMass; this._sleeping = false; this._sleepTime = 0; } applyAngularImpulse(impulse) { let impX; let impY; let impZ; impX = impulse.x; impY = impulse.y; impZ = impulse.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._invInertia00 * impX + this._invInertia01 * impY + this._invInertia02 * impZ; __tmp__Y = this._invInertia10 * impX + this._invInertia11 * impY + this._invInertia12 * impZ; __tmp__Z = this._invInertia20 * impX + this._invInertia21 * impY + this._invInertia22 * impZ; impX = __tmp__X; impY = __tmp__Y; impZ = __tmp__Z; this._angVelX += impX; this._angVelY += impY; this._angVelZ += impZ; this._sleeping = false; this._sleepTime = 0; } applyForce(force,positionInWorld) { let iforceX; let iforceY; let iforceZ; iforceX = force.x; iforceY = force.y; iforceZ = force.z; this._forceX += iforceX; this._forceY += iforceY; this._forceZ += iforceZ; let itorqueX; let itorqueY; let itorqueZ; let posX; let posY; let posZ; posX = positionInWorld.x; posY = positionInWorld.y; posZ = positionInWorld.z; posX -= this._transform._positionX; posY -= this._transform._positionY; posZ -= this._transform._positionZ; itorqueX = posY * iforceZ - posZ * iforceY; itorqueY = posZ * iforceX - posX * iforceZ; itorqueZ = posX * iforceY - posY * iforceX; this._torqueX += itorqueX; this._torqueY += itorqueY; this._torqueZ += itorqueZ; this._sleeping = false; this._sleepTime = 0; } applyForceToCenter(force) { let iforceX; let iforceY; let iforceZ; iforceX = force.x; iforceY = force.y; iforceZ = force.z; this._forceX += iforceX; this._forceY += iforceY; this._forceZ += iforceZ; this._sleeping = false; this._sleepTime = 0; } applyTorque(torque) { let itorqueX; let itorqueY; let itorqueZ; itorqueX = torque.x; itorqueY = torque.y; itorqueZ = torque.z; this._torqueX += itorqueX; this._torqueY += itorqueY; this._torqueZ += itorqueZ; this._sleeping = false; this._sleepTime = 0; } getLinearContactImpulse() { let res = new oimo.common.Vec3(); res.x = this._linearContactImpulseX; res.y = this._linearContactImpulseY; res.z = this._linearContactImpulseZ; return res; } getLinearContactImpulseTo(linearContactImpulse) { linearContactImpulse.x = this._linearContactImpulseX; linearContactImpulse.y = this._linearContactImpulseY; linearContactImpulse.z = this._linearContactImpulseZ; } getAngularContactImpulse() { let res = new oimo.common.Vec3(); res.x = this._angularContactImpulseX; res.y = this._angularContactImpulseY; res.z = this._angularContactImpulseZ; return res; } getAngularContactImpulseTo(angularContactImpulse) { angularContactImpulse.x = this._angularContactImpulseX; angularContactImpulse.y = this._angularContactImpulseY; angularContactImpulse.z = this._angularContactImpulseZ; } getGravityScale() { return this._gravityScale; } setGravityScale(gravityScale) { this._gravityScale = gravityScale; this._sleeping = false; this._sleepTime = 0; } getLocalPoint(worldPoint) { let vX; let vY; let vZ; vX = worldPoint.x; vY = worldPoint.y; vZ = worldPoint.z; vX -= this._transform._positionX; vY -= this._transform._positionY; vZ -= this._transform._positionZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._transform._rotation00 * vX + this._transform._rotation10 * vY + this._transform._rotation20 * vZ; __tmp__Y = this._transform._rotation01 * vX + this._transform._rotation11 * vY + this._transform._rotation21 * vZ; __tmp__Z = this._transform._rotation02 * vX + this._transform._rotation12 * vY + this._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; let res = new oimo.common.Vec3(); res.x = vX; res.y = vY; res.z = vZ; return res; } getLocalPointTo(worldPoint,localPoint) { let vX; let vY; let vZ; vX = worldPoint.x; vY = worldPoint.y; vZ = worldPoint.z; vX -= this._transform._positionX; vY -= this._transform._positionY; vZ -= this._transform._positionZ; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._transform._rotation00 * vX + this._transform._rotation10 * vY + this._transform._rotation20 * vZ; __tmp__Y = this._transform._rotation01 * vX + this._transform._rotation11 * vY + this._transform._rotation21 * vZ; __tmp__Z = this._transform._rotation02 * vX + this._transform._rotation12 * vY + this._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; localPoint.x = vX; localPoint.y = vY; localPoint.z = vZ; } getLocalVector(worldVector) { let vX; let vY; let vZ; vX = worldVector.x; vY = worldVector.y; vZ = worldVector.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._transform._rotation00 * vX + this._transform._rotation10 * vY + this._transform._rotation20 * vZ; __tmp__Y = this._transform._rotation01 * vX + this._transform._rotation11 * vY + this._transform._rotation21 * vZ; __tmp__Z = this._transform._rotation02 * vX + this._transform._rotation12 * vY + this._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; let res = new oimo.common.Vec3(); res.x = vX; res.y = vY; res.z = vZ; return res; } getLocalVectorTo(worldVector,localVector) { let vX; let vY; let vZ; vX = worldVector.x; vY = worldVector.y; vZ = worldVector.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._transform._rotation00 * vX + this._transform._rotation10 * vY + this._transform._rotation20 * vZ; __tmp__Y = this._transform._rotation01 * vX + this._transform._rotation11 * vY + this._transform._rotation21 * vZ; __tmp__Z = this._transform._rotation02 * vX + this._transform._rotation12 * vY + this._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; localVector.x = vX; localVector.y = vY; localVector.z = vZ; } getWorldPoint(localPoint) { let vX; let vY; let vZ; vX = localPoint.x; vY = localPoint.y; vZ = localPoint.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._transform._rotation00 * vX + this._transform._rotation01 * vY + this._transform._rotation02 * vZ; __tmp__Y = this._transform._rotation10 * vX + this._transform._rotation11 * vY + this._transform._rotation12 * vZ; __tmp__Z = this._transform._rotation20 * vX + this._transform._rotation21 * vY + this._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; vX += this._transform._positionX; vY += this._transform._positionY; vZ += this._transform._positionZ; let res = new oimo.common.Vec3(); res.x = vX; res.y = vY; res.z = vZ; return res; } getWorldPointTo(localPoint,worldPoint) { let vX; let vY; let vZ; vX = localPoint.x; vY = localPoint.y; vZ = localPoint.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._transform._rotation00 * vX + this._transform._rotation01 * vY + this._transform._rotation02 * vZ; __tmp__Y = this._transform._rotation10 * vX + this._transform._rotation11 * vY + this._transform._rotation12 * vZ; __tmp__Z = this._transform._rotation20 * vX + this._transform._rotation21 * vY + this._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; vX += this._transform._positionX; vY += this._transform._positionY; vZ += this._transform._positionZ; worldPoint.x = vX; worldPoint.y = vY; worldPoint.z = vZ; } getWorldVector(localVector) { let vX; let vY; let vZ; vX = localVector.x; vY = localVector.y; vZ = localVector.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._transform._rotation00 * vX + this._transform._rotation01 * vY + this._transform._rotation02 * vZ; __tmp__Y = this._transform._rotation10 * vX + this._transform._rotation11 * vY + this._transform._rotation12 * vZ; __tmp__Z = this._transform._rotation20 * vX + this._transform._rotation21 * vY + this._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; let res = new oimo.common.Vec3(); res.x = vX; res.y = vY; res.z = vZ; return res; } getWorldVectorTo(localVector,worldVector) { let vX; let vY; let vZ; vX = localVector.x; vY = localVector.y; vZ = localVector.z; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = this._transform._rotation00 * vX + this._transform._rotation01 * vY + this._transform._rotation02 * vZ; __tmp__Y = this._transform._rotation10 * vX + this._transform._rotation11 * vY + this._transform._rotation12 * vZ; __tmp__Z = this._transform._rotation20 * vX + this._transform._rotation21 * vY + this._transform._rotation22 * vZ; vX = __tmp__X; vY = __tmp__Y; vZ = __tmp__Z; worldVector.x = vX; worldVector.y = vY; worldVector.z = vZ; } getNumShapes() { return this._numShapes; } getShapeList() { return this._shapeList; } getNumContectLinks() { return this._numContactLinks; } getContactLinkList() { return this._contactLinkList; } getNumJointLinks() { return this._numJointLinks; } getJointLinkList() { return this._jointLinkList; } addShape(shape) { if(this._shapeList == null) { this._shapeList = shape; this._shapeListLast = shape; } else { this._shapeListLast._next = shape; shape._prev = this._shapeListLast; this._shapeListLast = shape; } this._numShapes++; shape._rigidBody = this; if(this._world != null) { let _this = this._world; shape._proxy = _this._broadPhase.createProxy(shape,shape._aabb); shape._id = _this._shapeIdCount++; _this._numShapes++; } this.updateMass(); let s = this._shapeList; while(s != null) { let n = s._next; let tf1 = this._ptransform; let tf2 = this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } } removeShape(shape) { let prev = shape._prev; let next = shape._next; if(prev != null) { prev._next = next; } if(next != null) { next._prev = prev; } if(shape == this._shapeList) { this._shapeList = this._shapeList._next; } if(shape == this._shapeListLast) { this._shapeListLast = this._shapeListLast._prev; } shape._next = null; shape._prev = null; this._numShapes--; shape._rigidBody = null; if(this._world != null) { let _this = this._world; _this._broadPhase.destroyProxy(shape._proxy); shape._proxy = null; shape._id = -1; let cl = shape._rigidBody._contactLinkList; while(cl != null) { let n = cl._next; let c = cl._contact; if(c._s1 == shape || c._s2 == shape) { let _this1 = cl._other; _this1._sleeping = false; _this1._sleepTime = 0; let _this2 = _this._contactManager; let prev = c._prev; let next = c._next; if(prev != null) { prev._next = next; } if(next != null) { next._prev = prev; } if(c == _this2._contactList) { _this2._contactList = _this2._contactList._next; } if(c == _this2._contactListLast) { _this2._contactListLast = _this2._contactListLast._prev; } c._next = null; c._prev = null; if(c._touching) { let cc1 = c._s1._contactCallback; let cc2 = c._s2._contactCallback; if(cc1 == cc2) { cc2 = null; } if(cc1 != null) { cc1.endContact(c); } if(cc2 != null) { cc2.endContact(c); } } let prev1 = c._link1._prev; let next1 = c._link1._next; if(prev1 != null) { prev1._next = next1; } if(next1 != null) { next1._prev = prev1; } if(c._link1 == c._b1._contactLinkList) { c._b1._contactLinkList = c._b1._contactLinkList._next; } if(c._link1 == c._b1._contactLinkListLast) { c._b1._contactLinkListLast = c._b1._contactLinkListLast._prev; } c._link1._next = null; c._link1._prev = null; let prev2 = c._link2._prev; let next2 = c._link2._next; if(prev2 != null) { prev2._next = next2; } if(next2 != null) { next2._prev = prev2; } if(c._link2 == c._b2._contactLinkList) { c._b2._contactLinkList = c._b2._contactLinkList._next; } if(c._link2 == c._b2._contactLinkListLast) { c._b2._contactLinkListLast = c._b2._contactLinkListLast._prev; } c._link2._next = null; c._link2._prev = null; c._b1._numContactLinks--; c._b2._numContactLinks--; c._link1._other = null; c._link2._other = null; c._link1._contact = null; c._link2._contact = null; c._s1 = null; c._s2 = null; c._b1 = null; c._b2 = null; c._touching = false; c._cachedDetectorData._clear(); c._manifold._clear(); c._detector = null; let _this3 = c._contactConstraint; _this3._s1 = null; _this3._s2 = null; _this3._b1 = null; _this3._b2 = null; _this3._tf1 = null; _this3._tf2 = null; c._next = _this2._contactPool; _this2._contactPool = c; _this2._numContacts--; } cl = n; } _this._numShapes--; } this.updateMass(); let s = this._shapeList; while(s != null) { let n = s._next; let tf1 = this._ptransform; let tf2 = this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } } getType() { return this._type; } setType(type) { this._type = type; this.updateMass(); } wakeUp() { this._sleeping = false; this._sleepTime = 0; } sleep() { this._sleeping = true; this._sleepTime = 0; } isSleeping() { return this._sleeping; } getSleepTime() { return this._sleepTime; } setAutoSleep(autoSleepEnabled) { this._autoSleep = autoSleepEnabled; this._sleeping = false; this._sleepTime = 0; } getLinearDamping() { return this._linearDamping; } setLinearDamping(damping) { this._linearDamping = damping; } getAngularDamping() { return this._angularDamping; } setAngularDamping(damping) { this._angularDamping = damping; } getPrev() { return this._prev; } getNext() { return this._next; } } oimo.dynamics.rigidbody.RigidBodyConfig = class oimo_dynamics_rigidbody_RigidBodyConfig { constructor() { this.position = new oimo.common.Vec3(); this.rotation = new oimo.common.Mat3(); this.linearVelocity = new oimo.common.Vec3(); this.angularVelocity = new oimo.common.Vec3(); this.type = 0; this.autoSleep = true; this.linearDamping = 0; this.angularDamping = 0; } } oimo.dynamics.rigidbody.RigidBodyType = class oimo_dynamics_rigidbody_RigidBodyType { } oimo.dynamics.rigidbody.Shape = class oimo_dynamics_rigidbody_Shape { constructor(config) { this._id = -1; this._localTransform = new oimo.common.Transform(); this._ptransform = new oimo.common.Transform(); this._transform = new oimo.common.Transform(); let v = config.position; this._localTransform._positionX = v.x; this._localTransform._positionY = v.y; this._localTransform._positionZ = v.z; let m = config.rotation; this._localTransform._rotation00 = m.e00; this._localTransform._rotation01 = m.e01; this._localTransform._rotation02 = m.e02; this._localTransform._rotation10 = m.e10; this._localTransform._rotation11 = m.e11; this._localTransform._rotation12 = m.e12; this._localTransform._rotation20 = m.e20; this._localTransform._rotation21 = m.e21; this._localTransform._rotation22 = m.e22; let dst = this._ptransform; let src = this._localTransform; dst._positionX = src._positionX; dst._positionY = src._positionY; dst._positionZ = src._positionZ; dst._rotation00 = src._rotation00; dst._rotation01 = src._rotation01; dst._rotation02 = src._rotation02; dst._rotation10 = src._rotation10; dst._rotation11 = src._rotation11; dst._rotation12 = src._rotation12; dst._rotation20 = src._rotation20; dst._rotation21 = src._rotation21; dst._rotation22 = src._rotation22; let dst1 = this._transform; let src1 = this._localTransform; dst1._positionX = src1._positionX; dst1._positionY = src1._positionY; dst1._positionZ = src1._positionZ; dst1._rotation00 = src1._rotation00; dst1._rotation01 = src1._rotation01; dst1._rotation02 = src1._rotation02; dst1._rotation10 = src1._rotation10; dst1._rotation11 = src1._rotation11; dst1._rotation12 = src1._rotation12; dst1._rotation20 = src1._rotation20; dst1._rotation21 = src1._rotation21; dst1._rotation22 = src1._rotation22; this._restitution = config.restitution; this._friction = config.friction; this._density = config.density; this._geom = config.geometry; this._collisionGroup = config.collisionGroup; this._collisionMask = config.collisionMask; this._contactCallback = config.contactCallback; this._aabb = new oimo.collision.geometry.Aabb(); this._proxy = null; this.displacement = new oimo.common.Vec3(); } getFriction() { return this._friction; } setFriction(friction) { this._friction = friction; } getRestitution() { return this._restitution; } setRestitution(restitution) { this._restitution = restitution; } getLocalTransform() { let _this = this._localTransform; let tf = new oimo.common.Transform(); tf._positionX = _this._positionX; tf._positionY = _this._positionY; tf._positionZ = _this._positionZ; tf._rotation00 = _this._rotation00; tf._rotation01 = _this._rotation01; tf._rotation02 = _this._rotation02; tf._rotation10 = _this._rotation10; tf._rotation11 = _this._rotation11; tf._rotation12 = _this._rotation12; tf._rotation20 = _this._rotation20; tf._rotation21 = _this._rotation21; tf._rotation22 = _this._rotation22; return tf; } getLocalTransformTo(transform) { let transform1 = this._localTransform; transform._positionX = transform1._positionX; transform._positionY = transform1._positionY; transform._positionZ = transform1._positionZ; transform._rotation00 = transform1._rotation00; transform._rotation01 = transform1._rotation01; transform._rotation02 = transform1._rotation02; transform._rotation10 = transform1._rotation10; transform._rotation11 = transform1._rotation11; transform._rotation12 = transform1._rotation12; transform._rotation20 = transform1._rotation20; transform._rotation21 = transform1._rotation21; transform._rotation22 = transform1._rotation22; } getTransform() { let _this = this._transform; let tf = new oimo.common.Transform(); tf._positionX = _this._positionX; tf._positionY = _this._positionY; tf._positionZ = _this._positionZ; tf._rotation00 = _this._rotation00; tf._rotation01 = _this._rotation01; tf._rotation02 = _this._rotation02; tf._rotation10 = _this._rotation10; tf._rotation11 = _this._rotation11; tf._rotation12 = _this._rotation12; tf._rotation20 = _this._rotation20; tf._rotation21 = _this._rotation21; tf._rotation22 = _this._rotation22; return tf; } getTransformTo(transform) { let transform1 = this._transform; transform._positionX = transform1._positionX; transform._positionY = transform1._positionY; transform._positionZ = transform1._positionZ; transform._rotation00 = transform1._rotation00; transform._rotation01 = transform1._rotation01; transform._rotation02 = transform1._rotation02; transform._rotation10 = transform1._rotation10; transform._rotation11 = transform1._rotation11; transform._rotation12 = transform1._rotation12; transform._rotation20 = transform1._rotation20; transform._rotation21 = transform1._rotation21; transform._rotation22 = transform1._rotation22; } setLocalTransform(transform) { let _this = this._localTransform; _this._positionX = transform._positionX; _this._positionY = transform._positionY; _this._positionZ = transform._positionZ; _this._rotation00 = transform._rotation00; _this._rotation01 = transform._rotation01; _this._rotation02 = transform._rotation02; _this._rotation10 = transform._rotation10; _this._rotation11 = transform._rotation11; _this._rotation12 = transform._rotation12; _this._rotation20 = transform._rotation20; _this._rotation21 = transform._rotation21; _this._rotation22 = transform._rotation22; if(this._rigidBody != null) { let _this = this._rigidBody; _this.updateMass(); let s = _this._shapeList; while(s != null) { let n = s._next; let tf1 = _this._ptransform; let tf2 = _this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } } } getDensity() { return this._density; } setDensity(density) { this._density = density; if(this._rigidBody != null) { let _this = this._rigidBody; _this.updateMass(); let s = _this._shapeList; while(s != null) { let n = s._next; let tf1 = _this._ptransform; let tf2 = _this._transform; let dst = s._ptransform; let src1 = s._localTransform; let __tmp__00; let __tmp__01; let __tmp__02; let __tmp__10; let __tmp__11; let __tmp__12; let __tmp__20; let __tmp__21; let __tmp__22; __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20; __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21; __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22; __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20; __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21; __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22; __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20; __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21; __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22; dst._rotation00 = __tmp__00; dst._rotation01 = __tmp__01; dst._rotation02 = __tmp__02; dst._rotation10 = __tmp__10; dst._rotation11 = __tmp__11; dst._rotation12 = __tmp__12; dst._rotation20 = __tmp__20; dst._rotation21 = __tmp__21; dst._rotation22 = __tmp__22; let __tmp__X; let __tmp__Y; let __tmp__Z; __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ; __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ; __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ; dst._positionX = __tmp__X; dst._positionY = __tmp__Y; dst._positionZ = __tmp__Z; dst._positionX += tf1._positionX; dst._positionY += tf1._positionY; dst._positionZ += tf1._positionZ; let dst1 = s._transform; let src11 = s._localTransform; let __tmp__001; let __tmp__011; let __tmp__021; let __tmp__101; let __tmp__111; let __tmp__121; let __tmp__201; let __tmp__211; let __tmp__221; __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20; __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21; __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22; __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20; __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21; __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22; __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20; __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21; __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22; dst1._rotation00 = __tmp__001; dst1._rotation01 = __tmp__011; dst1._rotation02 = __tmp__021; dst1._rotation10 = __tmp__101; dst1._rotation11 = __tmp__111; dst1._rotation12 = __tmp__121; dst1._rotation20 = __tmp__201; dst1._rotation21 = __tmp__211; dst1._rotation22 = __tmp__221; let __tmp__X1; let __tmp__Y1; let __tmp__Z1; __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ; __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ; __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ; dst1._positionX = __tmp__X1; dst1._positionY = __tmp__Y1; dst1._positionZ = __tmp__Z1; dst1._positionX += tf2._positionX; dst1._positionY += tf2._positionY; dst1._positionZ += tf2._positionZ; let minX; let minY; let minZ; let maxX; let maxY; let maxZ; s._geom._computeAabb(s._aabb,s._ptransform); minX = s._aabb._minX; minY = s._aabb._minY; minZ = s._aabb._minZ; maxX = s._aabb._maxX; maxY = s._aabb._maxY; maxZ = s._aabb._maxZ; s._geom._computeAabb(s._aabb,s._transform); s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX; s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY; s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ; s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX; s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY; s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ; if(s._proxy != null) { let dX; let dY; let dZ; dX = s._transform._positionX - s._ptransform._positionX; dY = s._transform._positionY - s._ptransform._positionY; dZ = s._transform._positionZ - s._ptransform._positionZ; let v = s.displacement; v.x = dX; v.y = dY; v.z = dZ; s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement); } s = n; } } } getAabb() { return this._aabb.clone(); } getAabbTo(aabb) { aabb.copyFrom(this._aabb); } getGeometry() { return this._geom; } getRigidBody() { return this._rigidBody; } getCollisionGroup() { return this._collisionGroup; } setCollisionGroup(collisionGroup) { this._collisionGroup = collisionGroup; } getCollisionMask() { return this._collisionMask; } setCollisionMask(collisionMask) { this._collisionMask = collisionMask; } getContactCallback() { return this._contactCallback; } setContactCallback(callback) { this._contactCallback = callback; } getPrev() { return this._prev; } getNext() { return this._next; } } oimo.dynamics.rigidbody.ShapeConfig = class oimo_dynamics_rigidbody_ShapeConfig { constructor() { this.position = new oimo.common.Vec3(); this.rotation = new oimo.common.Mat3(); this.friction = oimo.common.Setting.defaultFriction; this.restitution = oimo.common.Setting.defaultRestitution; this.density = oimo.common.Setting.defaultDensity; this.collisionGroup = oimo.common.Setting.defaultCollisionGroup; this.collisionMask = oimo.common.Setting.defaultCollisionMask; this.geometry = null; this.contactCallback = null; } } if(!oimo.m) oimo.m = {}; oimo.m.M = class oimo_m_M { } oimo.collision.broadphase.BroadPhaseType._BRUTE_FORCE = 1; oimo.collision.broadphase.BroadPhaseType._BVH = 2; oimo.collision.broadphase.BroadPhaseType.BRUTE_FORCE = 1; oimo.collision.broadphase.BroadPhaseType.BVH = 2; oimo.collision.broadphase.bvh.BvhInsertionStrategy.SIMPLE = 0; oimo.collision.broadphase.bvh.BvhInsertionStrategy.MINIMIZE_SURFACE_AREA = 1; oimo.collision.geometry.GeometryType._SPHERE = 0; oimo.collision.geometry.GeometryType._BOX = 1; oimo.collision.geometry.GeometryType._CYLINDER = 2; oimo.collision.geometry.GeometryType._CONE = 3; oimo.collision.geometry.GeometryType._CAPSULE = 4; oimo.collision.geometry.GeometryType._CONVEX_HULL = 5; oimo.collision.geometry.GeometryType._CONVEX_MIN = 0; oimo.collision.geometry.GeometryType._CONVEX_MAX = 5; oimo.collision.geometry.GeometryType.SPHERE = 0; oimo.collision.geometry.GeometryType.BOX = 1; oimo.collision.geometry.GeometryType.CYLINDER = 2; oimo.collision.geometry.GeometryType.CONE = 3; oimo.collision.geometry.GeometryType.CAPSULE = 4; oimo.collision.geometry.GeometryType.CONVEX_HULL = 5; oimo.collision.narrowphase.detector.BoxBoxDetector.EDGE_BIAS_MULT = 1.0; oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.OK = 0; oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.INVALID_TRIANGLE = 1; oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.NO_ADJACENT_PAIR_INDEX = 2; oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.NO_ADJACENT_TRIANGLE = 3; oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.EDGE_LOOP_BROKEN = 4; oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.NO_OUTER_TRIANGLE = 5; oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.TRIANGLE_INVISIBLE = 6; oimo.collision.narrowphase.detector.gjkepa.EpaTriangle.count = 0; oimo.common.Vec3.numCreations = 0; oimo.common.Setting.defaultFriction = 0.2; oimo.common.Setting.defaultRestitution = 0.2; oimo.common.Setting.defaultDensity = 1; oimo.common.Setting.defaultCollisionGroup = 1; oimo.common.Setting.defaultCollisionMask = 1; oimo.common.Setting.maxTranslationPerStep = 20; oimo.common.Setting.maxRotationPerStep = 3.14159265358979; oimo.common.Setting.bvhProxyPadding = 0.1; oimo.common.Setting.bvhIncrementalCollisionThreshold = 0.45; oimo.common.Setting.defaultGJKMargin = 0.05; oimo.common.Setting.enableGJKCaching = true; oimo.common.Setting.maxEPAVertices = 128; oimo.common.Setting.maxEPAPolyhedronFaces = 128; oimo.common.Setting.contactEnableBounceThreshold = 0.5; oimo.common.Setting.velocityBaumgarte = 0.2; oimo.common.Setting.positionSplitImpulseBaumgarte = 0.4; oimo.common.Setting.positionNgsBaumgarte = 1.0; oimo.common.Setting.contactUseAlternativePositionCorrectionAlgorithmDepthThreshold = 0.05; oimo.common.Setting.defaultContactPositionCorrectionAlgorithm = 0; oimo.common.Setting.alternativeContactPositionCorrectionAlgorithm = 1; oimo.common.Setting.contactPersistenceThreshold = 0.05; oimo.common.Setting.maxManifoldPoints = 4; oimo.common.Setting.defaultJointConstraintSolverType = 0; oimo.common.Setting.defaultJointPositionCorrectionAlgorithm = 0; oimo.common.Setting.jointWarmStartingFactorForBaungarte = 0.8; oimo.common.Setting.jointWarmStartingFactor = 0.95; oimo.common.Setting.minSpringDamperDampingRatio = 1e-6; oimo.common.Setting.minRagdollMaxSwingAngle = 1e-6; oimo.common.Setting.maxJacobianRows = 6; oimo.common.Setting.directMlcpSolverEps = 1e-9; oimo.common.Setting.islandInitialRigidBodyArraySize = 128; oimo.common.Setting.islandInitialConstraintArraySize = 128; oimo.common.Setting.sleepingVelocityThreshold = 0.2; oimo.common.Setting.sleepingAngularVelocityThreshold = 0.5; oimo.common.Setting.sleepingTimeThreshold = 1.0; oimo.common.Setting.disableSleeping = false; oimo.common.Setting.linearSlop = 0.005; oimo.common.Setting.angularSlop = 0.017453292519943278; oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance = new oimo.collision.narrowphase.detector.gjkepa.GjkEpa(); oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._SUCCEEDED = 0; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._GJK_FAILED_TO_MAKE_TETRAHEDRON = 1; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._GJK_DID_NOT_CONVERGE = 2; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._EPA_FAILED_TO_INIT = 257; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._EPA_FAILED_TO_ADD_VERTEX = 258; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._EPA_DID_NOT_CONVERGE = 259; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.SUCCEEDED = 0; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.GJK_FAILED_TO_MAKE_TETRAHEDRON = 1; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.GJK_DID_NOT_CONVERGE = 2; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_FAILED_TO_INIT = 257; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_FAILED_TO_ADD_VERTEX = 258; oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_DID_NOT_CONVERGE = 259; oimo.common.Mat3.numCreations = 0; oimo.common.Mat4.numCreations = 0; oimo.common.MathUtil.POSITIVE_INFINITY = 1e65536; oimo.common.MathUtil.NEGATIVE_INFINITY = -1e65536; oimo.common.MathUtil.PI = 3.14159265358979; oimo.common.MathUtil.TWO_PI = 6.28318530717958; oimo.common.MathUtil.HALF_PI = 1.570796326794895; oimo.common.MathUtil.TO_RADIANS = 0.017453292519943278; oimo.common.MathUtil.TO_DEGREES = 57.29577951308238; oimo.common.Quat.numCreations = 0; oimo.dynamics.common.DebugDraw.SPHERE_PHI_DIVISION = 8; oimo.dynamics.common.DebugDraw.SPHERE_THETA_DIVISION = 4; oimo.dynamics.common.DebugDraw.CIRCLE_THETA_DIVISION = 8; oimo.dynamics.common.Performance.broadPhaseCollisionTime = 0; oimo.dynamics.common.Performance.narrowPhaseCollisionTime = 0; oimo.dynamics.common.Performance.dynamicsTime = 0; oimo.dynamics.common.Performance.totalTime = 0; oimo.dynamics.constraint.PositionCorrectionAlgorithm._BAUMGARTE = 0; oimo.dynamics.constraint.PositionCorrectionAlgorithm._SPLIT_IMPULSE = 1; oimo.dynamics.constraint.PositionCorrectionAlgorithm._NGS = 2; oimo.dynamics.constraint.PositionCorrectionAlgorithm.BAUMGARTE = 0; oimo.dynamics.constraint.PositionCorrectionAlgorithm.SPLIT_IMPULSE = 1; oimo.dynamics.constraint.PositionCorrectionAlgorithm.NGS = 2; oimo.dynamics.constraint.info.JacobianRow.BIT_LINEAR_SET = 1; oimo.dynamics.constraint.info.JacobianRow.BIT_ANGULAR_SET = 2; oimo.dynamics.constraint.joint.JointType._SPHERICAL = 0; oimo.dynamics.constraint.joint.JointType._REVOLUTE = 1; oimo.dynamics.constraint.joint.JointType._CYLINDRICAL = 2; oimo.dynamics.constraint.joint.JointType._PRISMATIC = 3; oimo.dynamics.constraint.joint.JointType._UNIVERSAL = 4; oimo.dynamics.constraint.joint.JointType._RAGDOLL = 5; oimo.dynamics.constraint.joint.JointType._GENERIC = 6; oimo.dynamics.constraint.joint.JointType.SPHERICAL = 0; oimo.dynamics.constraint.joint.JointType.REVOLUTE = 1; oimo.dynamics.constraint.joint.JointType.CYLINDRICAL = 2; oimo.dynamics.constraint.joint.JointType.PRISMATIC = 3; oimo.dynamics.constraint.joint.JointType.UNIVERSAL = 4; oimo.dynamics.constraint.joint.JointType.RAGDOLL = 5; oimo.dynamics.constraint.joint.JointType.GENERIC = 6; oimo.dynamics.constraint.solver.ConstraintSolverType._ITERATIVE = 0; oimo.dynamics.constraint.solver.ConstraintSolverType._DIRECT = 1; oimo.dynamics.constraint.solver.ConstraintSolverType.ITERATIVE = 0; oimo.dynamics.constraint.solver.ConstraintSolverType.DIRECT = 1; oimo.dynamics.rigidbody.RigidBodyType._DYNAMIC = 0; oimo.dynamics.rigidbody.RigidBodyType._STATIC = 1; oimo.dynamics.rigidbody.RigidBodyType._KINEMATIC = 2; oimo.dynamics.rigidbody.RigidBodyType.DYNAMIC = 0; oimo.dynamics.rigidbody.RigidBodyType.STATIC = 1; oimo.dynamics.rigidbody.RigidBodyType.KINEMATIC = 2; export {oimo};