-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathphyPart.min.js
1 lines (1 loc) · 7.46 KB
/
phyPart.min.js
1
function StaticPlane(t,o){var e=new Ammo.btStaticPlaneShape(t,o),a=new Ammo.btRigidBodyConstructionInfo(0,new Ammo.btDefaultMotionState(new Ammo.btTransform(new Ammo.btQuaternion(0,0,0,1),new Ammo.btVector3(0,0,0))),e,new Ammo.btVector3(0,0,0)),r=new Ammo.btRigidBody(a);return console.log("staticPlane:"+r.ptr),r}function RB(t,o,e){var a=new Ammo.btDefaultMotionState(new Ammo.btTransform(new Ammo.btQuaternion(0,0,0,1),t)),r=new Ammo.btVector3(0,0,0);o.calculateLocalInertia(e,r);var n=new Ammo.btRigidBodyConstructionInfo(e,a,o,r);return new Ammo.btRigidBody(n)}function SphereRB(t,o,e){var a=RB(t,new Ammo.btSphereShape(o),e);return console.log("sphere:"+a.ptr),a}function CubeRB(t,o,e){var a=RB(t,new Ammo.btBoxShape(o),e);return console.log("cube:"+a.ptr),a}function getMatrix(t){var o=trans.getOrigin(),e=trans.getRotation(),a=e.w()*e.w(),r=e.w()*e.x();r+=r;var n=e.w()*e.y();n+=n;var i=e.w()*e.z();i+=i;var s=e.x()*e.x(),d=e.x()*e.y();d+=d;var m=e.x()*e.z();m+=m;var l=e.y()*e.y(),c=e.y()*e.z();c+=c;var p=e.z()*e.z(),h=[];return h.length=16,h[0]=a+s-l-p,h[1]=d+i,h[2]=m-n,h[3]=0,h[4]=d-i,h[5]=a-s+l-p,h[6]=c+r,h[7]=0,h[8]=m+n,h[9]=c-r,h[10]=a-s-l+p,h[11]=0,h[12]=o.x(),h[13]=o.y(),h[14]=o.z(),h[15]=1,h}function invert(t){var o=[];o.length=16,o[0]=t[5]*t[10]*t[15]-t[5]*t[11]*t[14]-t[9]*t[6]*t[15]+t[9]*t[7]*t[14]+t[13]*t[6]*t[11]-t[13]*t[7]*t[10],o[1]=-t[1]*t[10]*t[15]+t[1]*t[11]*t[14]+t[9]*t[2]*t[15]-t[9]*t[3]*t[14]-t[13]*t[2]*t[11]+t[13]*t[3]*t[10],o[2]=t[1]*t[6]*t[15]-t[1]*t[7]*t[14]-t[5]*t[2]*t[15]+t[5]*t[3]*t[14]+t[13]*t[2]*t[7]-t[13]*t[3]*t[6],o[3]=-t[1]*t[6]*t[11]+t[1]*t[7]*t[10]+t[5]*t[2]*t[11]-t[5]*t[3]*t[10]-t[9]*t[2]*t[7]+t[9]*t[3]*t[6],o[4]=-t[4]*t[10]*t[15]+t[4]*t[11]*t[14]+t[8]*t[6]*t[15]-t[8]*t[7]*t[14]-t[12]*t[6]*t[11]+t[12]*t[7]*t[10],o[5]=t[0]*t[10]*t[15]-t[0]*t[11]*t[14]-t[8]*t[2]*t[15]+t[8]*t[3]*t[14]+t[12]*t[2]*t[11]-t[12]*t[3]*t[10],o[6]=-t[0]*t[6]*t[15]+t[0]*t[7]*t[14]+t[4]*t[2]*t[15]-t[4]*t[3]*t[14]-t[12]*t[2]*t[7]+t[12]*t[3]*t[6],o[7]=t[0]*t[6]*t[11]-t[0]*t[7]*t[10]-t[4]*t[2]*t[11]+t[4]*t[3]*t[10]+t[8]*t[2]*t[7]-t[8]*t[3]*t[6],o[8]=t[4]*t[9]*t[15]-t[4]*t[11]*t[13]-t[8]*t[5]*t[15]+t[8]*t[7]*t[13]+t[12]*t[5]*t[11]-t[12]*t[7]*t[9],o[9]=-t[0]*t[9]*t[15]+t[0]*t[11]*t[13]+t[8]*t[1]*t[15]-t[8]*t[3]*t[13]-t[12]*t[1]*t[11]+t[12]*t[3]*t[9],o[10]=t[0]*t[5]*t[15]-t[0]*t[7]*t[13]-t[4]*t[1]*t[15]+t[4]*t[3]*t[13]+t[12]*t[1]*t[7]-t[12]*t[3]*t[5],o[11]=-t[0]*t[5]*t[11]+t[0]*t[7]*t[9]+t[4]*t[1]*t[11]-t[4]*t[3]*t[9]-t[8]*t[1]*t[7]+t[8]*t[3]*t[5],o[12]=-t[4]*t[9]*t[14]+t[4]*t[10]*t[13]+t[8]*t[5]*t[14]-t[8]*t[6]*t[13]-t[12]*t[5]*t[10]+t[12]*t[6]*t[9],o[13]=t[0]*t[9]*t[14]-t[0]*t[10]*t[13]-t[8]*t[1]*t[14]+t[8]*t[2]*t[13]+t[12]*t[1]*t[10]-t[12]*t[2]*t[9],o[14]=-t[0]*t[5]*t[14]+t[0]*t[6]*t[13]+t[4]*t[1]*t[14]-t[4]*t[2]*t[13]-t[12]*t[1]*t[6]+t[12]*t[2]*t[5],o[15]=t[0]*t[5]*t[10]-t[0]*t[6]*t[9]-t[4]*t[1]*t[10]+t[4]*t[2]*t[9]+t[8]*t[1]*t[6]-t[8]*t[2]*t[5];var e=t[0]*o[0]+t[1]*o[4]+t[2]*o[8]+t[3]*o[12];if(0!=e)for(var a=0;16>a;a++)o[a]/=e;return o}function Transform(t,o){for(var e=[0,0,0,0],a=0;4>a;a++)for(var r=0;4>r;r++)e[r]+=t[4*a+r]*o[a];return e}function ArrFromVector3(t){return[t.x(),t.y(),t.z()]}function Vector3FromArr(t){return new Ammo.btVector3(t[0],t[1],t[2])}function getLocal(t,o){}function SetSelected(t,o){selected=-1;var e=Vector3FromArr(t.data[4]),a=Vector3FromArr(t.data[5]),r=new Ammo.ClosestRayResultCallback(e,a);if(r.set_m_collisionFilterMask(2),phyWorld.rayTest(e,a,r),r.hasHit()){for(var n=r.get_m_collisionObject(),i=void 0,s=0;10>s;s++)if(n.ptr==cubes[s].ptr){selected=s,i=cubes[s];break}if(n.ptr==sphRB.ptr&&(i=sphRB,selected=10),o&&i){join&&phyWorld.removeConstraint(join);var d=ArrFromVector3(r.get_m_hitPointWorld());d.push(1),i.getMotionState().getWorldTransform(trans);var m=getMatrix(trans),l=invert(m),c=Transform(l,d);join=new Ammo.btPoint2PointConstraint(n,Vector3FromArr(c)),phyWorld.addConstraint(join);var p=[Math.abs(t.data[5][0]-t.data[4][0]),Math.abs(t.data[5][1]-t.data[4][1]),Math.abs(t.data[5][2]-t.data[4][2])];collisionTime=p[0]>p[1]?p[0]>p[2]?(d[0]-t.data[4][0])/(t.data[5][0]-t.data[4][0]):(d[2]-t.data[4][2])/(t.data[5][2]-t.data[4][2]):p[1]>p[2]?(d[1]-t.data[4][1])/(t.data[5][1]-t.data[4][1]):(d[2]-t.data[4][2])/(t.data[5][2]-t.data[4][2])}}}function UpdateJoin(t){if(join){var o=[];o.length=3;for(var e=0;3>e;e++)o[e]=t.data[4][e]+(t.data[5][e]-t.data[4][e])*collisionTime;join.setPivotB(Vector3FromArr(o)),10>selected?cubes[selected].activate():sphRB.activate()}}function step(){var t=Date.now(),e=t-last;0==e&&(e=1/60),phyWorld.stepSimulation(e,2),last=t;var a=["phyUpdate"];sphRB.getMotionState().getWorldTransform(trans);var r=trans.getOrigin(),n=sphRB.getLinearVelocity();a.push([r.x(),r.y(),r.z(),n.x(),n.y(),n.z(),10==selected]);for(var i=0;10>i;i++)cubes[i].getMotionState().getWorldTransform(trans),n=trans.getOrigin(),a.push([n.x(),n.y(),n.z(),selected==i]),o=trans.getRotation(),a.push([o.x(),o.y(),o.z(),o.w()]);for(var s=[],d=phyDispatcher.getNumManifolds(),m={},i=0;d>i;i++){var l=phyDispatcher.getManifoldByIndexInternal(i),c=l.getBody0(),p=l.getBody1(),h=l.getNumContacts(),u=c.ptr+""+p.ptr,y=0;void 0!=myCollisions[u]&&(y=myCollisions[u]);for(var v=y;h>v;v++){var b=l.getContactPoint(v),g=b.getAppliedImpulse();if(b.getDistance()<0&&g>.1){var w=b.getPositionWorldOnA(),f=b.getPositionWorldOnB(),A=[];A[0]=(w.x()+f.x())/2,A[1]=(w.y()+f.y())/2,A[2]=(w.z()+f.z())/2,A[3]=g,s.push(A)}}m[u]=h}nSkip>0?(a.push([]),nSkip--):a.push(s),myCollisions=m,justStart=!1;for(var i=0;i<particles.length;i++){var r=particles[i];[r[0]+r[3]*e,r[1]+r[4]*e,r[2]+r[5]*e]}a.push(particles),postMessage(a)}importScripts("ammo.js");var pause=!0,phyBroadphase=new Ammo.btDbvtBroadphase,phyCollisionConfiguration=new Ammo.btDefaultCollisionConfiguration,phyDispatcher=new Ammo.btCollisionDispatcher(phyCollisionConfiguration),phySolver=new Ammo.btSequentialImpulseConstraintSolver,phyWorld=new Ammo.btDiscreteDynamicsWorld(phyDispatcher,phyBroadphase,phySolver,phyCollisionConfiguration);phyWorld.setGravity(new Ammo.btVector3(0,-9.8,0)),phyWorld.addRigidBody(StaticPlane(new Ammo.btVector3(0,0,1),-10),1,3),phyWorld.addRigidBody(StaticPlane(new Ammo.btVector3(0,0,-1),-10),1,3),phyWorld.addRigidBody(StaticPlane(new Ammo.btVector3(1,0,0),-10),1,3),phyWorld.addRigidBody(StaticPlane(new Ammo.btVector3(-1,0,0),-10),1,3),phyWorld.addRigidBody(StaticPlane(new Ammo.btVector3(0,1,0),-1),1,3),phyWorld.addRigidBody(StaticPlane(new Ammo.btVector3(0,-1,0),-10),1,3);var sphRB=SphereRB(new Ammo.btVector3(3,4,5),1,1);phyWorld.addRigidBody(sphRB,2,3),sphRB.applyCentralForce(new Ammo.btVector3(-240+200*Math.random(),-50+100*Math.random(),-300+20*Math.random()));for(var size=new Ammo.btVector3(1,1,1),cubes=[],x=[-3.75,-1.25,1.25,3.75,-2.5,0,2.5,-1.25,1.25,0],y=[0,0,0,0,2,2,2,4,4,6],i=0;10>i;i++){var pos=new Ammo.btVector3(x[i]+.2*Math.random()-.1,y[i],.2*Math.random()-.1),cbRB=CubeRB(pos,size,1);phyWorld.addRigidBody(cbRB,2,3),cubes.push(cbRB)}var trans=new Ammo.btTransform,last=Date.now(),myCollisions={},nSkip=2,particles=[[3,4,6,1,1,1]],mouseDown=!1,exX,exY,selected=-1,join,collisionTime;onmessage=function(t){switch(t.data[0]){case"mousedown":mouseDown=!0,exX=t.data[1],exY=t.data[2],SetSelected(t,!0);break;case"mouseup":mouseDown=!1,selected=-1,join&&(phyWorld.removeConstraint(join),join=void 0);break;case"mousemove":var o=t.data[1]-exX,e=t.data[2]-exY;exX=t.data[1],exY=t.data[2],mouseDown?-1==selected?postMessage(["camUpdate",o,e,0]):UpdateJoin(t):SetSelected(t);break;case"wheel":mouseDown?(t.data[3]>0&&(collisionTime+=.01),t.data[3]<0&&(collisionTime-=.01),UpdateJoin(t)):postMessage(["camUpdate",0,0,t.data[3]])}},setInterval(step,1e3/30);