action-engine-js 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +348 -0
  3. package/actionengine/3rdparty/goblin/goblin.js +9609 -0
  4. package/actionengine/3rdparty/goblin/goblin.min.js +5 -0
  5. package/actionengine/camera/actioncamera.js +90 -0
  6. package/actionengine/camera/cameracollisionhandler.js +69 -0
  7. package/actionengine/character/actioncharacter.js +360 -0
  8. package/actionengine/character/actioncharacter3D.js +61 -0
  9. package/actionengine/core/app.js +430 -0
  10. package/actionengine/debug/basedebugpanel.js +858 -0
  11. package/actionengine/display/canvasmanager.js +75 -0
  12. package/actionengine/display/gl/programmanager.js +570 -0
  13. package/actionengine/display/gl/shaders/lineshader.js +118 -0
  14. package/actionengine/display/gl/shaders/objectshader.js +1756 -0
  15. package/actionengine/display/gl/shaders/particleshader.js +43 -0
  16. package/actionengine/display/gl/shaders/shadowshader.js +319 -0
  17. package/actionengine/display/gl/shaders/spriteshader.js +100 -0
  18. package/actionengine/display/gl/shaders/watershader.js +67 -0
  19. package/actionengine/display/graphics/actionmodel3D.js +191 -0
  20. package/actionengine/display/graphics/actionsprite3D.js +230 -0
  21. package/actionengine/display/graphics/lighting/actiondirectionalshadowlight.js +864 -0
  22. package/actionengine/display/graphics/lighting/actionlight.js +211 -0
  23. package/actionengine/display/graphics/lighting/actionomnidirectionalshadowlight.js +862 -0
  24. package/actionengine/display/graphics/lighting/lightingconstants.js +263 -0
  25. package/actionengine/display/graphics/lighting/lightmanager.js +789 -0
  26. package/actionengine/display/graphics/renderableobject.js +44 -0
  27. package/actionengine/display/graphics/renderers/actionrenderer2D.js +341 -0
  28. package/actionengine/display/graphics/renderers/actionrenderer3D/actionrenderer3D.js +655 -0
  29. package/actionengine/display/graphics/renderers/actionrenderer3D/canvasmanager3D.js +82 -0
  30. package/actionengine/display/graphics/renderers/actionrenderer3D/debugrenderer3D.js +493 -0
  31. package/actionengine/display/graphics/renderers/actionrenderer3D/objectrenderer3D.js +790 -0
  32. package/actionengine/display/graphics/renderers/actionrenderer3D/spriteRenderer3D.js +266 -0
  33. package/actionengine/display/graphics/renderers/actionrenderer3D/sunrenderer3D.js +140 -0
  34. package/actionengine/display/graphics/renderers/actionrenderer3D/waterrenderer3D.js +173 -0
  35. package/actionengine/display/graphics/renderers/actionrenderer3D/weatherrenderer3D.js +87 -0
  36. package/actionengine/display/graphics/texture/proceduraltexture.js +192 -0
  37. package/actionengine/display/graphics/texture/texturemanager.js +242 -0
  38. package/actionengine/display/graphics/texture/textureregistry.js +177 -0
  39. package/actionengine/input/actionscrollablearea.js +1405 -0
  40. package/actionengine/input/inputhandler.js +1647 -0
  41. package/actionengine/math/geometry/geometrybuilder.js +161 -0
  42. package/actionengine/math/geometry/glbexporter.js +364 -0
  43. package/actionengine/math/geometry/glbloader.js +722 -0
  44. package/actionengine/math/geometry/modelcodegenerator.js +97 -0
  45. package/actionengine/math/geometry/triangle.js +33 -0
  46. package/actionengine/math/geometry/triangleutils.js +34 -0
  47. package/actionengine/math/mathutils.js +25 -0
  48. package/actionengine/math/matrix4.js +785 -0
  49. package/actionengine/math/physics/actionphysics.js +108 -0
  50. package/actionengine/math/physics/actionphysicsobject3D.js +164 -0
  51. package/actionengine/math/physics/actionphysicsworld3D.js +238 -0
  52. package/actionengine/math/physics/actionraycast.js +129 -0
  53. package/actionengine/math/physics/shapes/actionphysicsbox3D.js +158 -0
  54. package/actionengine/math/physics/shapes/actionphysicscapsule3D.js +200 -0
  55. package/actionengine/math/physics/shapes/actionphysicscompoundshape3D.js +147 -0
  56. package/actionengine/math/physics/shapes/actionphysicscone3D.js +126 -0
  57. package/actionengine/math/physics/shapes/actionphysicsconvexshape3D.js +72 -0
  58. package/actionengine/math/physics/shapes/actionphysicscylinder3D.js +117 -0
  59. package/actionengine/math/physics/shapes/actionphysicsmesh3D.js +74 -0
  60. package/actionengine/math/physics/shapes/actionphysicsplane3D.js +100 -0
  61. package/actionengine/math/physics/shapes/actionphysicssphere3D.js +95 -0
  62. package/actionengine/math/quaternion.js +61 -0
  63. package/actionengine/math/vector2.js +277 -0
  64. package/actionengine/math/vector3.js +318 -0
  65. package/actionengine/math/viewfrustum.js +136 -0
  66. package/actionengine/network/ACTIONNETREADME.md +810 -0
  67. package/actionengine/network/client/ActionNetManager.js +802 -0
  68. package/actionengine/network/client/ActionNetManagerGUI.js +1709 -0
  69. package/actionengine/network/client/ActionNetManagerP2P.js +1537 -0
  70. package/actionengine/network/client/SyncSystem.js +422 -0
  71. package/actionengine/network/p2p/ActionNetPeer.js +142 -0
  72. package/actionengine/network/p2p/ActionNetTrackerClient.js +623 -0
  73. package/actionengine/network/p2p/DataConnection.js +282 -0
  74. package/actionengine/network/p2p/README.md +510 -0
  75. package/actionengine/network/p2p/example.html +502 -0
  76. package/actionengine/network/server/ActionNetServer.js +577 -0
  77. package/actionengine/network/server/ActionNetServerSSL.js +579 -0
  78. package/actionengine/network/server/ActionNetServerUtils.js +458 -0
  79. package/actionengine/network/server/SERVERREADME.md +314 -0
  80. package/actionengine/network/server/package-lock.json +35 -0
  81. package/actionengine/network/server/package.json +13 -0
  82. package/actionengine/network/server/start.bat +27 -0
  83. package/actionengine/network/server/start.sh +25 -0
  84. package/actionengine/network/server/startwss.bat +27 -0
  85. package/actionengine/sound/audiomanager.js +1589 -0
  86. package/actionengine/sound/soundfont/ACTIONSOUNDFONT_README.md +205 -0
  87. package/actionengine/sound/soundfont/actionparser.js +718 -0
  88. package/actionengine/sound/soundfont/actionreverb.js +252 -0
  89. package/actionengine/sound/soundfont/actionsoundfont.js +543 -0
  90. package/actionengine/sound/soundfont/sf2playerlicence.txt +29 -0
  91. package/actionengine/sound/soundfont/soundfont.js +2 -0
  92. package/dist/action-engine.min.js +328 -0
  93. package/package.json +35 -0
@@ -0,0 +1,5 @@
1
+ !function(){function t(t){if(null!=t.limit.constraint_row){var i=t.rows.indexOf(t.limit.constraint_row);t.rows.splice(i,1),t.limit.constraint_row=null}}function i(t){if(null!=t.motor.constraint_row){var i=t.rows.indexOf(t.motor.constraint_row);t.rows.splice(i,1),t.motor.constraint_row=null}}var e={};e.Matrix3=function(t,i,e,o,s,n,a,r,h){this.e00=t||0,this.e01=i||0,this.e02=e||0,this.e10=o||0,this.e11=s||0,this.e12=n||0,this.e20=a||0,this.e21=r||0,this.e22=h||0},e.Matrix3.prototype={identity:function(){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},fromMatrix4:function(t){this.e00=t.e00,this.e01=t.e01,this.e02=t.e02,this.e10=t.e10,this.e11=t.e11,this.e12=t.e12,this.e20=t.e20,this.e21=t.e21,this.e22=t.e22},fromQuaternion:function(t){var i=t.x+t.x,e=t.y+t.y,o=t.z+t.z,s=t.x*i,n=t.x*e,a=t.x*o,r=t.y*e,h=t.y*o,c=t.z*o,l=t.w*i,p=t.w*e,_=t.w*o;this.e00=1-(r+c),this.e10=n+_,this.e20=a-p,this.e01=n-_,this.e11=1-(s+c),this.e21=h+l,this.e02=a+p,this.e12=h-l,this.e22=1-(s+r)},transformVector3:function(t){var i=t.x,e=t.y,o=t.z;t.x=this.e00*i+this.e01*e+this.e02*o,t.y=this.e10*i+this.e11*e+this.e12*o,t.z=this.e20*i+this.e21*e+this.e22*o},transformVector3Into:function(t,i){i.x=this.e00*t.x+this.e01*t.y+this.e02*t.z,i.y=this.e10*t.x+this.e11*t.y+this.e12*t.z,i.z=this.e20*t.x+this.e21*t.y+this.e22*t.z},transposeInto:function(t){t.e00=this.e00,t.e10=this.e01,t.e20=this.e02,t.e01=this.e10,t.e11=this.e11,t.e21=this.e12,t.e02=this.e20,t.e12=this.e21,t.e22=this.e22},invert:function(){var t,i=this.e00,e=this.e01,o=this.e02,s=this.e10,n=this.e11,a=this.e12,r=this.e20,h=this.e21,c=this.e22,l=c*n-a*h,p=-c*s+a*r,_=h*s-n*r,b=i*l+e*p+o*_;return b?(t=1/b,this.e00=l*t,this.e01=(-c*e+o*h)*t,this.e02=(a*e-o*n)*t,this.e10=p*t,this.e11=(c*i-o*r)*t,this.e12=(-a*i+o*s)*t,this.e20=_*t,this.e21=(-h*i+e*r)*t,this.e22=(n*i-e*s)*t,!0):!0},invertInto:function(t){var i,e=this.e00,o=this.e01,s=this.e02,n=this.e10,a=this.e11,r=this.e12,h=this.e20,c=this.e21,l=this.e22,p=l*a-r*c,_=-l*n+r*h,b=c*n-a*h,u=e*p+o*_+s*b;return u?(i=1/u,t.e00=p*i,t.e01=(-l*o+s*c)*i,t.e02=(r*o-s*a)*i,t.e10=_*i,t.e11=(l*e-s*h)*i,t.e12=(-r*e+s*n)*i,t.e20=b*i,t.e21=(-c*e+o*h)*i,t.e22=(a*e-o*n)*i,!0):!1},multiply:function(t){var i=this.e00,e=this.e01,o=this.e02,s=this.e10,n=this.e11,a=this.e12,r=this.e20,h=this.e21,c=this.e22,l=t.e00,p=t.e01,_=t.e02,b=t.e10,u=t.e11,f=t.e12,d=t.e20,m=t.e21,y=t.e22;this.e00=l*i+b*e+d*o,this.e10=l*s+b*n+d*a,this.e20=l*r+b*h+d*c,this.e01=p*i+u*e+m*o,this.e11=p*s+u*n+m*a,this.e21=p*r+u*h+m*c,this.e02=_*i+f*e+y*o,this.e12=_*s+f*n+y*a,this.e22=_*r+f*h+y*c},multiplyFrom:function(t,i){var e=t.e00,o=t.e01,s=t.e02,n=t.e10,a=t.e11,r=t.e12,h=t.e20,c=t.e21,l=t.e22,p=i.e00,_=i.e01,b=i.e02,u=i.e10,f=i.e11,d=i.e12,m=i.e20,y=i.e21,j=i.e22;this.e00=p*e+u*o+m*s,this.e10=p*n+u*a+m*r,this.e20=p*h+u*c+m*l,this.e01=_*e+f*o+y*s,this.e11=_*n+f*a+y*r,this.e21=_*h+f*c+y*l,this.e02=b*e+d*o+j*s,this.e12=b*n+d*a+j*r,this.e22=b*h+d*c+j*l}},e.Matrix4=function(){this.e00=0,this.e01=0,this.e02=0,this.e03=0,this.e10=0,this.e11=0,this.e12=0,this.e13=0,this.e20=0,this.e21=0,this.e22=0,this.e23=0,this.e30=0,this.e31=0,this.e32=0,this.e33=0},e.Matrix4.prototype={identity:function(){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},copy:function(t){this.e00=t.e00,this.e01=t.e01,this.e02=t.e02,this.e03=t.e03,this.e10=t.e10,this.e11=t.e11,this.e12=t.e12,this.e13=t.e13,this.e20=t.e20,this.e21=t.e21,this.e22=t.e22,this.e23=t.e23,this.e30=t.e30,this.e31=t.e31,this.e32=t.e32,this.e33=t.e33},makeTransform:function(t,i){var e=t.x+t.x,o=t.y+t.y,s=t.z+t.z,n=t.x*e,a=t.x*o,r=t.x*s,h=t.y*o,c=t.y*s,l=t.z*s,p=t.w*e,_=t.w*o,b=t.w*s;this.e00=1-(h+l),this.e10=a+b,this.e20=r-_,this.e30=0,this.e01=a-b,this.e11=1-(n+l),this.e21=c+p,this.e31=0,this.e02=r+_,this.e12=c-p,this.e22=1-(n+h),this.e32=0,this.e03=i.x,this.e13=i.y,this.e23=i.z,this.e33=1},transformVector3:function(t){var i=t.x,e=t.y,o=t.z;t.x=this.e00*i+this.e01*e+this.e02*o+this.e03,t.y=this.e10*i+this.e11*e+this.e12*o+this.e13,t.z=this.e20*i+this.e21*e+this.e22*o+this.e23},transformVector3Into:function(t,i){i.x=this.e00*t.x+this.e01*t.y+this.e02*t.z+this.e03,i.y=this.e10*t.x+this.e11*t.y+this.e12*t.z+this.e13,i.z=this.e20*t.x+this.e21*t.y+this.e22*t.z+this.e23},rotateVector3:function(t){var i=t.x,e=t.y,o=t.z;t.x=this.e00*i+this.e01*e+this.e02*o,t.y=this.e10*i+this.e11*e+this.e12*o,t.z=this.e20*i+this.e21*e+this.e22*o},rotateVector3Into:function(t,i){i.x=this.e00*t.x+this.e01*t.y+this.e02*t.z,i.y=this.e10*t.x+this.e11*t.y+this.e12*t.z,i.z=this.e20*t.x+this.e21*t.y+this.e22*t.z},invert:function(){var t,i=this.e00,e=this.e01,o=this.e02,s=this.e03,n=this.e10,a=this.e11,r=this.e12,h=this.e13,c=this.e20,l=this.e21,p=this.e22,_=this.e23,b=this.e30,u=this.e31,f=this.e32,d=this.e33,m=i*a-e*n,y=i*r-o*n,j=i*h-s*n,w=e*r-o*a,x=e*h-s*a,v=o*h-s*r,g=c*u-l*b,z=c*f-p*b,V=c*d-_*b,S=l*f-p*u,B=l*d-_*u,C=p*d-_*f,M=m*C-y*B+j*S+w*V-x*z+v*g;return M?(t=1/M,this.e00=(a*C-r*B+h*S)*t,this.e01=(-e*C+o*B-s*S)*t,this.e02=(u*v-f*x+d*w)*t,this.e03=(-l*v+p*x-_*w)*t,this.e10=(-n*C+r*V-h*z)*t,this.e11=(i*C-o*V+s*z)*t,this.e12=(-b*v+f*j-d*y)*t,this.e13=(c*v-p*j+_*y)*t,this.e20=(n*B-a*V+h*g)*t,this.e21=(-i*B+e*V-s*g)*t,this.e22=(b*x-u*j+d*m)*t,this.e23=(-c*x+l*j-_*m)*t,this.e30=(-n*S+a*z-r*g)*t,this.e31=(i*S-e*z+o*g)*t,this.e32=(-b*w+u*y-f*m)*t,this.e33=(c*w-l*y+p*m)*t,!0):!1},invertInto:function(t){var i,e=this.e00,o=this.e10,s=this.e20,n=this.e30,a=this.e01,r=this.e11,h=this.e21,c=this.e31,l=this.e02,p=this.e12,_=this.e22,b=this.e32,u=this.e03,f=this.e13,d=this.e23,m=this.e33,y=e*r-o*a,j=e*h-s*a,w=e*c-n*a,x=o*h-s*r,v=o*c-n*r,g=s*c-n*h,z=l*f-p*u,V=l*d-_*u,S=l*m-b*u,B=p*d-_*f,C=p*m-b*f,M=_*m-b*d,P=y*M-j*C+w*B+x*S-v*V+g*z;return P?(i=1/P,t.e00=(r*M-h*C+c*B)*i,t.e10=(-o*M+s*C-n*B)*i,t.e20=(f*g-d*v+m*x)*i,t.e30=(-p*g+_*v-b*x)*i,t.e01=(-a*M+h*S-c*V)*i,t.e11=(e*M-s*S+n*V)*i,t.e21=(-u*g+d*w-m*j)*i,t.e31=(l*g-_*w+b*j)*i,t.e02=(a*C-r*S+c*z)*i,t.e12=(-e*C+o*S-n*z)*i,t.e22=(u*v-f*w+m*y)*i,t.e32=(-l*v+p*w-b*y)*i,t.e03=(-a*B+r*V-h*z)*i,t.e13=(e*B-o*V+s*z)*i,t.e23=(-u*x+f*j-d*y)*i,void(t.e33=(l*x-p*j+_*y)*i)):!1},multiply:function(t){var i=this.e00,e=this.e10,o=this.e20,s=this.e30,n=this.e01,a=this.e11,r=this.e21,h=this.e31,c=this.e02,l=this.e12,p=this.e22,_=this.e32,b=this.e03,u=this.e13,f=this.e23,d=this.e33,m=t.e00,y=t.e10,j=t.e20,w=t.e30;this.e00=m*i+y*n+j*c+w*b,this.e10=m*e+y*a+j*l+w*u,this.e20=m*o+y*r+j*p+w*f,this.e30=m*s+y*h+j*_+w*d,m=t.e01,y=t.e11,j=t.e21,w=t.e31,this.e01=m*i+y*n+j*c+w*b,this.e11=m*e+y*a+j*l+w*u,this.e21=m*o+y*r+j*p+w*f,this.e31=m*s+y*h+j*_+w*d,m=t.e02,y=t.e12,j=t.e22,w=t.e32,this.e02=m*i+y*n+j*c+w*b,this.e12=m*e+y*a+j*l+w*u,this.e22=m*o+y*r+j*p+w*f,this.e32=m*s+y*h+j*_+w*d,m=t.e03,y=t.e13,j=t.e23,w=t.e33,this.e03=m*i+y*n+j*c+w*b,this.e13=m*e+y*a+j*l+w*u,this.e23=m*o+y*r+j*p+w*f,this.e33=m*s+y*h+j*_+w*d}},e.Quaternion=function(t,i,e,o){this.x=null!=t?t:0,this.y=null!=i?i:0,this.z=null!=e?e:0,this.w=null!=o?o:1,this.normalize()},e.Quaternion.prototype={set:function(t,i,e,o){this.x=t,this.y=i,this.z=e,this.w=o},multiply:function(t){var i=this.x,e=this.y,o=this.z,s=this.w,n=t.x,a=t.y,r=t.z,h=t.w;this.x=i*h+s*n+e*r-o*a,this.y=e*h+s*a+o*n-i*r,this.z=o*h+s*r+i*a-e*n,this.w=s*h-i*n-e*a-o*r},multiplyQuaternions:function(t,i){this.x=t.x*i.w+t.w*i.x+t.y*i.z-t.z*i.y,this.y=t.y*i.w+t.w*i.y+t.z*i.x-t.x*i.z,this.z=t.z*i.w+t.w*i.z+t.x*i.y-t.y*i.x,this.w=t.w*i.w-t.x*i.x-t.y*i.y-t.z*i.z},normalize:function(){var t=this.x,i=this.y,e=this.z,o=this.w,s=Math.sqrt(t*t+i*i+e*e+o*o);0===s?this.x=this.y=this.z=this.w=0:(s=1/s,this.x*=s,this.y*=s,this.z*=s,this.w*=s)},invertQuaternion:function(t){var i=t.x,e=t.y,o=t.z,s=t.w,n=i*i+e*e+o*o+s*s;if(0===n)this.x=this.y=this.z=this.w=0;else{var a=-1/n;this.x=t.x*a,this.y=t.y*a,this.z=t.z*a,this.w=t.w*-a}},transformVector3:function(t){var i=t.x,e=t.y,o=t.z,s=this.x,n=this.y,a=this.z,r=this.w,h=r*i+n*o-a*e,c=r*e+a*i-s*o,l=r*o+s*e-n*i,p=-s*i-n*e-a*o;t.x=h*r+p*-s+c*-a-l*-n,t.y=c*r+p*-n+l*-s-h*-a,t.z=l*r+p*-a+h*-n-c*-s},transformVector3Into:function(t,i){var e=t.x,o=t.y,s=t.z,n=this.x,a=this.y,r=this.z,h=this.w,c=h*e+a*s-r*o,l=h*o+r*e-n*s,p=h*s+n*o-a*e,_=-n*e-a*o-r*s;i.x=c*h+_*-n+l*-r-p*-a,i.y=l*h+_*-a+p*-n-c*-r,i.z=p*h+_*-r+c*-a-l*-n},angleBetween:function(t){return 2*Math.acos(this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w)},signedAngleBetween:function(t,i){return Math.abs(a.dot(i))<.5?o.set(1,0,0):o.set(0,0,1),this.transformVector3Into(o,s),t.transformVector3Into(o,n),o.crossVectors(s,n),Math.atan2(i.dot(o),s.dot(n))}},e.Vector3=function(t,i,e){this.x=t||0,this.y=i||0,this.z=e||0},e.Vector3.prototype={set:function(t,i,e){this.x=t,this.y=i,this.z=e},copy:function(t){this.x=t.x,this.y=t.y,this.z=t.z},add:function(t){this.x+=t.x,this.y+=t.y,this.z+=t.z},addVectors:function(t,i){this.x=t.x+i.x,this.y=t.y+i.y,this.z=t.z+i.z},subtract:function(t){this.x-=t.x,this.y-=t.y,this.z-=t.z},subtractVectors:function(t,i){this.x=t.x-i.x,this.y=t.y-i.y,this.z=t.z-i.z},multiply:function(t){this.x*=t.x,this.y*=t.y,this.z*=t.z},multiplyVectors:function(t,i){this.x=t.x*i.x,this.y=t.y*i.y,this.z=t.z*i.z},scale:function(t){this.x*=t,this.y*=t,this.z*=t},scaleVector:function(t,i){this.x=t.x*i,this.y=t.y*i,this.z=t.z*i},lengthSquared:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSquared())},normalize:function(){var t=this.length();0===t?this.x=this.y=this.z=0:this.scale(1/t)},normalizeVector:function(t){this.copy(t),this.normalize()},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z},cross:function(t){var i=this.x,e=this.y,o=this.z;this.x=e*t.z-o*t.y,this.y=o*t.x-i*t.z,this.z=i*t.y-e*t.x},crossVectors:function(t,i){this.x=t.y*i.z-t.z*i.y,this.y=t.z*i.x-t.x*i.z,this.z=t.x*i.y-t.y*i.x},distanceTo:function(t){var i=t.x-this.x,e=t.y-this.y,o=t.z-this.z;return Math.sqrt(i*i+e*e+o*o)},findOrthogonal:function(t,i){var e,o;Math.abs(this.z)>.7071067811865476?(e=-this.y*this.y+this.z*this.z,o=1/Math.sqrt(e),t.set(0,-this.z*o,this.y*o),i.set(e*o,-this.x*t.z,this.x*t.y)):(e=this.x*this.x+this.y*this.y,o=1/Math.sqrt(e),t.set(-this.y*o,this.x*o,0),i.set(-this.z*t.y,this.z*t.x,e*o))}},e.EPSILON=1e-5;var o=new e.Vector3,s=new e.Vector3,n=new e.Vector3,a=new e.Vector3(1,0,0),r=(new e.Vector3(0,1,0),new e.Vector3(0,0,1),new e.Quaternion),h=new e.Quaternion,c=new e.Matrix3,l=new e.Matrix3;e.EventEmitter=function(){},e.EventEmitter.prototype={addListener:function(t,i){null==this.listeners[t]&&(this.listeners[t]=[]),-1===this.listeners[t].indexOf(i)&&this.listeners[t].push(i)},removeListener:function(t,i){null==this.listeners[t]&&(this.listeners[t]=[]);var e=this.listeners[t].indexOf(i);-1!==e&&this.listeners[t].splice(e,1)},removeAllListeners:function(){for(var t=Object.keys(this.listeners),i=0;i<t.length;i++)this.listeners[t[i]].length=0},emit:function(t){var i,e=Array.prototype.slice.call(arguments,1);if(this.listeners[t]instanceof Array)for(var o=this.listeners[t].slice(),s=0;s<o.length;s++)if(i=o[s].apply(this,e),i===!1)return!1}},e.EventEmitter.apply=function(t){t.prototype.addListener=e.EventEmitter.prototype.addListener,t.prototype.removeListener=e.EventEmitter.prototype.removeListener,t.prototype.removeAllListeners=e.EventEmitter.prototype.removeAllListeners,t.prototype.emit=e.EventEmitter.prototype.emit},e.RigidBody=function(){var t=0;return function(i,o){this.id=t++,this.shape=i,this.aabb=new e.AABB,this._mass=o||1/0,this._mass_inverted=1/o,this.position=new e.Vector3,this.rotation=new e.Quaternion(0,0,0,1),this.linear_velocity=new e.Vector3,this.angular_velocity=new e.Vector3,this.transform=new e.Matrix4,this.transform.identity(),this.transform_inverse=new e.Matrix4,this.transform_inverse.identity(),this.inertiaTensor=i.getInertiaTensor(o),this.inverseInertiaTensor=new e.Matrix3,this.inertiaTensor.invertInto(this.inverseInertiaTensor),this.inertiaTensorWorldFrame=new e.Matrix3,this.inverseInertiaTensorWorldFrame=new e.Matrix3,this.acceleration=new e.Vector3,this.restitution=.1,this.friction=.5,this.collision_groups=0,this.collision_mask=0,this.gravity=null,this.linear_damping=0,this.angular_damping=0,this.linear_factor=new e.Vector3(1,1,1),this.angular_factor=new e.Vector3(1,1,1),this.world=null,this.accumulated_force=new e.Vector3,this.accumulated_torque=new e.Vector3,this.push_velocity=new e.Vector3,this.turn_velocity=new e.Vector3,this.solver_impulse=new Float64Array(6),this.updateDerived(),this.listeners={}}}(),e.EventEmitter.apply(e.RigidBody),Object.defineProperty(e.RigidBody.prototype,"mass",{get:function(){return this._mass},set:function(t){this._mass=t,this._mass_inverted=1/t,this.inertiaTensor=this.shape.getInertiaTensor(t)}}),e.RigidBody.prototype.findSupportPoint=function(){var t=new e.Vector3;return function(i,e){this.transform_inverse.rotateVector3Into(i,t),this.shape.findSupportPoint(t,e),this.transform.transformVector3(e)}}(),e.RigidBody.prototype.rayIntersect=function(){var t=new e.Vector3,i=new e.Vector3;return function(e,o,s){this.transform_inverse.transformVector3Into(e,t),this.transform_inverse.transformVector3Into(o,i);var n=this.shape.rayIntersect(t,i);null!=n&&(n.object=this,this.transform.transformVector3(n.point),this.transform.rotateVector3(n.normal),s.push(n))}}(),e.RigidBody.prototype.integrate=function(t){if(this._mass!==1/0){o.scaleVector(this.accumulated_force,this._mass_inverted),o.multiply(this.linear_factor),this.linear_velocity.add(o),this.inverseInertiaTensorWorldFrame.transformVector3Into(this.accumulated_torque,o),o.multiply(this.angular_factor),this.angular_velocity.add(o),this.linear_velocity.scale(Math.pow(1-this.linear_damping,t)),this.angular_velocity.scale(Math.pow(1-this.angular_damping,t)),o.scaleVector(this.linear_velocity,t),this.position.add(o),r.x=this.angular_velocity.x*t,r.y=this.angular_velocity.y*t,r.z=this.angular_velocity.z*t,r.w=0,r.multiply(this.rotation);var i=.5;this.rotation.x+=i*r.x,this.rotation.y+=i*r.y,this.rotation.z+=i*r.z,this.rotation.w+=i*r.w,this.rotation.normalize(),this.accumulated_force.x=this.accumulated_force.y=this.accumulated_force.z=0,this.accumulated_torque.x=this.accumulated_torque.y=this.accumulated_torque.z=0,this.solver_impulse[0]=this.solver_impulse[1]=this.solver_impulse[2]=this.solver_impulse[3]=this.solver_impulse[4]=this.solver_impulse[5]=0,this.push_velocity.x=this.push_velocity.y=this.push_velocity.z=0,this.turn_velocity.x=this.turn_velocity.y=this.turn_velocity.z=0}},e.RigidBody.prototype.setGravity=function(t,i,o){this.gravity?(this.gravity.x=t,this.gravity.y=i,this.gravity.z=o):this.gravity=new e.Vector3(t,i,o)},e.RigidBody.prototype.applyImpulse=function(t){o.multiplyVectors(t,this.linear_factor),this.linear_velocity.add(o)},e.RigidBody.prototype.applyForce=function(t){this.accumulated_force.add(t)},e.RigidBody.prototype.applyForceAtWorldPoint=function(t,i){o.copy(i),o.subtract(this.position),o.cross(t),this.accumulated_force.add(t),this.accumulated_torque.add(o)},e.RigidBody.prototype.applyForceAtLocalPoint=function(t,i){this.transform.transformVector3Into(i,o),this.applyForceAtWorldPoint(t,o)},e.RigidBody.prototype.getVelocityInLocalPoint=function(t,i){this._mass===1/0?i.set(0,0,0):(i.copy(this.angular_velocity),i.cross(t),i.add(this.linear_velocity))},e.RigidBody.prototype.updateDerived=function(){this.rotation.normalize(),this.transform.makeTransform(this.rotation,this.position),this.transform.invertInto(this.transform_inverse),this._mass!==1/0&&(c.fromMatrix4(this.transform_inverse),c.transposeInto(l),l.multiply(this.inertiaTensor),this.inertiaTensorWorldFrame.multiplyFrom(l,c),this.inertiaTensorWorldFrame.invertInto(this.inverseInertiaTensorWorldFrame)),this.aabb.transform(this.shape.aabb,this.transform)},e.ForceGenerator=function(t){this.force=t||new e.Vector3,this.enabled=!0,this.affected=[]},e.ForceGenerator.prototype.applyForce=function(){if(this.enabled){var t,i;for(t=0,i=this.affected.length;i>t;t++)this.affected[t].applyForce(this.force)}},e.ForceGenerator.prototype.enable=function(){this.enabled=!0},e.ForceGenerator.prototype.disable=function(){this.enabled=!1},e.ForceGenerator.prototype.affect=function(t){var i,e;for(i=0,e=this.affected.length;e>i;i++)if(this.affected[i]===t)return;this.affected.push(t)},e.ForceGenerator.prototype.unaffect=function(t){var i,e;for(i=0,e=this.affected.length;e>i;i++)if(this.affected[i]===t)return void this.affected.splice(i,1)},e.BasicBroadphase=function(){this.bodies=[],this.collision_pairs=[]},e.BasicBroadphase.prototype.addBody=function(t){this.bodies.push(t)},e.BasicBroadphase.prototype.removeBody=function(t){var i,e=this.bodies.length;for(i=0;e>i;i++)if(this.bodies[i]===t){this.bodies.splice(i,1);break}},e.BasicBroadphase.prototype.update=function(){var t,i,o,s,n=this.bodies.length;for(this.collision_pairs.length=0,t=0;n>t;t++)for(o=this.bodies[t],i=0;n>i;i++)i>=t||(s=this.bodies[i],e.CollisionUtils.canBodiesCollide(o,s)&&o.aabb.intersects(s.aabb)&&this.collision_pairs.push([s,o]))},e.BasicBroadphase.prototype.intersectsWith=function(t){var i,e,o=this.bodies.length,s=[];for(i=0;o>i;i++)e=this.bodies[i],t!==e&&t.aabb.intersects(e.aabb)&&s.push(e);return s},e.BasicBroadphase.prototype.rayIntersect=function(t,i){var e,o,s=this.bodies.length,n=[];for(e=0;s>e;e++)o=this.bodies[e],o.aabb.testRayIntersect(t,i)&&o.rayIntersect(t,i,n);return n},function(){var t=function(t,i,e){this.type=t,this.body=i,this.position=e,this.prev=null,this.next=null};t.TYPES={START:0,END:1};var i=function(){this.first=null,this.last=null};e.SAPBroadphase=function(){this.markers_x=new i,this.markers_y=new i,this.markers_z=new i,this.overlap_counter={},this.collision_pairs=[],this.pending_bodies=[]},e.SAPBroadphase.prototype={incrementOverlaps:function(t,i){if(e.CollisionUtils.canBodiesCollide(t,i)){var o=t.id<i.id?t.id+"-"+i.id:i.id+"-"+t.id;this.overlap_counter.hasOwnProperty(o)||(this.overlap_counter[o]=0),this.overlap_counter[o]++,3===this.overlap_counter[o]&&this.collision_pairs.push([t.id<i.id?t:i,t.id<i.id?i:t])}},decrementOverlaps:function(t,i){var e=t.id<i.id?t.id+"-"+i.id:i.id+"-"+t.id;this.overlap_counter.hasOwnProperty(e)||(this.overlap_counter[e]=0),this.overlap_counter[e]--,0===this.overlap_counter[e]?delete this.overlap_counter[e]:2===this.overlap_counter[e]&&(this.collision_pairs=this.collision_pairs.filter(function(e){return e[0]===t&&e[1]===i?!1:e[0]===i&&e[1]===t?!1:!0}))},addBody:function(t){this.pending_bodies.push(t)},removeBody:function(t){var i=this.pending_bodies.indexOf(t);if(-1!==i)return void this.pending_bodies.splice(i,1);for(var e,o,s=this.markers_x.first;s;)s.body===t&&(e=s.next,o=s.prev,null!=e?(e.prev=o,null!=o&&(o.next=e)):this.markers_x.last=o,null!=o?(o.next=e,null!=e&&(e.prev=o)):this.markers_x.first=e),s=s.next;for(s=this.markers_y.first;s;)s.body===t&&(e=s.next,o=s.prev,null!=e?(e.prev=o,null!=o&&(o.next=e)):this.markers_y.last=o,null!=o?(o.next=e,null!=e&&(e.prev=o)):this.markers_y.first=e),s=s.next;for(s=this.markers_z.first;s;)s.body===t&&(e=s.next,o=s.prev,null!=e?(e.prev=o,null!=o&&(o.next=e)):this.markers_z.last=o,null!=o?(o.next=e,null!=e&&(e.prev=o)):this.markers_z.first=e),s=s.next;this.collision_pairs=this.collision_pairs.filter(function(i){return i[0]===t||i[1]===t?!1:!0})},insertPending:function(){for(var i;i=this.pending_bodies.pop();){i.updateDerived();var e=new t(t.TYPES.START,i,i.aabb.min.x),o=new t(t.TYPES.START,i,i.aabb.min.y),s=new t(t.TYPES.START,i,i.aabb.min.z),n=new t(t.TYPES.END,i,i.aabb.max.x),a=new t(t.TYPES.END,i,i.aabb.max.y),r=new t(t.TYPES.END,i,i.aabb.max.z);this.insert(this.markers_x,e),this.insert(this.markers_x,n),this.insert(this.markers_y,o),this.insert(this.markers_y,a),this.insert(this.markers_z,s),this.insert(this.markers_z,r)}},insert:function(t,i){null==t.first?t.first=t.last=i:(i.prev=t.last,t.last.next=i,t.last=i,this.sort(t,i))},sort:function(i,e){for(var o;null!=e.prev&&(e.position<e.prev.position||e.position===e.prev.position&&e.type===t.TYPES.START&&e.prev.type===t.TYPES.END);)o=e.prev,e.type!==o.type&&(e.type===t.TYPES.START?this.incrementOverlaps(e.body,o.body):this.decrementOverlaps(e.body,o.body)),e.prev=o.prev,o.next=e.next,e.next=o,o.prev=e,null==e.prev?i.first=e:e.prev.next=e,null==o.next?i.last=o:o.next.prev=o},update:function(){this.insertPending();for(var i=this.markers_x.first;i;)i.position=i.type===t.TYPES.START?i.body.aabb.min.x:i.body.aabb.max.x,this.sort(this.markers_x,i),i=i.next;for(i=this.markers_y.first;i;)i.position=i.type===t.TYPES.START?i.body.aabb.min.y:i.body.aabb.max.y,this.sort(this.markers_y,i),i=i.next;for(i=this.markers_z.first;i;)i.position=i.type===t.TYPES.START?i.body.aabb.min.z:i.body.aabb.max.z,this.sort(this.markers_z,i),i=i.next},intersectsWith:function(t){this.addBody(t),this.update();var i=this.collision_pairs.filter(function(i){return i[0]===t||i[1]===t?!0:!1}).map(function(i){return i[0]===t?i[1]:i[0]});return this.removeBody(t),i},rayIntersect:function(i,e){this.pending_bodies.length>0&&this.update();var o,s,n,a,r,h,c,l,p={},_=[],b={},u={};for(n=this.markers_x.first,a=!1,p={},o=i.x<e.x?i.x:e.x,s=i.x<e.x?e.x:i.x;n;){if(n.type===t.TYPES.START&&(p[n.body.id]=n.body),n.position>=o)if(a===!1)for(a=!0,l=Object.keys(p),r=0;r<l.length;r++)c=l[r],h=p[c],null!=h&&(b[h.id]=h,u[h.id]=u[h.id]?u[h.id]+1:1);else n.type===t.TYPES.START&&(b[n.body.id]=n.body,u[n.body.id]=u[n.body.id]?u[n.body.id]+1:1);if(n.type===t.TYPES.END&&(p[n.body.id]=null),n.position>s)break;n=n.next}for(l=Object.keys(u),r=0;r<l.length;r++){var f=l[r];1===u[f]&&b[f].aabb.testRayIntersect(i,e)&&b[f].rayIntersect(i,e,_)}return _}}}(),e.BoxSphere=function(t,i){var a,r,h=t.shape instanceof e.SphereShape?t:i,c=t.shape instanceof e.SphereShape?i:t;return c.transform_inverse.transformVector3Into(h.position,o),Math.abs(o.x)-h.shape.radius>c.shape.half_width||Math.abs(o.y)-h.shape.radius>c.shape.half_height||Math.abs(o.z)-h.shape.radius>c.shape.half_depth||(s.x=s.y=s.z=0,r=o.x,r>c.shape.half_width?r=c.shape.half_width:r<-c.shape.half_width&&(r=-c.shape.half_width),s.x=r,r=o.y,r>c.shape.half_height?r=c.shape.half_height:r<-c.shape.half_height&&(r=-c.shape.half_height),s.y=r,r=o.z,r>c.shape.half_depth?r=c.shape.half_depth:r<-c.shape.half_depth&&(r=-c.shape.half_depth),s.z=r,n.subtractVectors(s,o),r=n.lengthSquared(),r>h.shape.radius*h.shape.radius)?void 0:(a=e.ObjectPool.getObject("ContactDetails"),a.object_a=h,a.object_b=c,0===r?e.BoxSphere.spherePenetration(c.shape,o,s,a):(a.contact_normal.subtractVectors(s,o),a.penetration_depth=-a.contact_normal.length(),a.contact_normal.scale(-1/a.penetration_depth),a.contact_point_in_b.copy(s)),a.penetration_depth+=h.shape.radius,c.transform.rotateVector3(a.contact_normal),h.transform_inverse.rotateVector3Into(a.contact_normal,a.contact_point_in_a),a.contact_point_in_a.scale(h.shape.radius),a.contact_point.scaleVector(a.contact_normal,h.shape.radius-a.penetration_depth/2),a.contact_point.add(h.position),a.restitution=(h.restitution+c.restitution)/2,a.friction=(h.friction+c.friction)/2,a)},e.BoxSphere.spherePenetration=function(t,i,e,o){var n,a;i.x<0?(n=t.half_width+i.x,e.x=-t.half_width,e.y=e.z=0,o.penetration_depth=n):(n=t.half_width-i.x,e.x=t.half_width,e.y=e.z=0,o.penetration_depth=n),i.y<0?(a=t.half_height+i.y,n>a&&(n=a,e.y=-t.half_height,e.x=e.z=0,o.penetration_depth=n)):(a=t.half_height-i.y,n>a&&(n=a,e.y=t.half_height,e.x=e.z=0,o.penetration_depth=n)),i.z<0?(a=t.half_depth+i.z,n>a&&(e.z=-t.half_depth,e.x=e.y=0,o.penetration_depth=n)):(a=t.half_depth-i.z,n>a&&(e.z=t.half_depth,e.x=e.y=0,o.penetration_depth=n)),o.contact_point_in_b.copy(s),o.contact_normal.scaleVector(o.contact_point_in_b,-1),o.contact_normal.normalize()},e.GjkEpa={margins:.01,result:null,max_iterations:20,epa_condition:.001,SupportPoint:function(t,i,e){this.witness_a=t,this.witness_b=i,this.point=e},findSupportPoint:function(){var t=new e.Vector3;return function(i,e,o,s){i.findSupportPoint(o,s.witness_a),t.scaleVector(o,-1),e.findSupportPoint(t,s.witness_b),s.point.subtractVectors(s.witness_a,s.witness_b)}}(),testCollision:function(t,i){var o=e.GjkEpa.GJK(t,i);return null!=e.GjkEpa.result?e.GjkEpa.result:null!=o?e.GjkEpa.EPA(o):void 0},GJK:function(){return function(t,i){var o,s=new e.GjkEpa.Simplex(t,i);for(e.GjkEpa.result=null;o=s.addPoint(););return o===!1?(e.GjkEpa.freeSimplex(s),null):s}}(),freeSimplex:function(t){for(var i=0,o=t.points.length;o>i;i++)e.ObjectPool.freeObject("GJK2SupportPoint",t.points[i])},freePolyhedron:function(t){for(var i=e.ObjectPool.pools.GJK2SupportPoint,o=0,s=t.faces.length;s>o;o++)-1===i.indexOf(t.faces[o].a)&&e.ObjectPool.freeObject("GJK2SupportPoint",t.faces[o].a),-1===i.indexOf(t.faces[o].b)&&e.ObjectPool.freeObject("GJK2SupportPoint",t.faces[o].b),-1===i.indexOf(t.faces[o].c)&&e.ObjectPool.freeObject("GJK2SupportPoint",t.faces[o].c)},EPA:function(){var t=new e.Vector3,i={a:new e.Vector3,b:new e.Vector3,c:new e.Vector3};return function(s){for(var n=new e.GjkEpa.Polyhedron(s),a=0;++a;){n.findFaceClosestToOrigin(),o.copy(n.closest_face_distance<e.EPSILON?n.faces[n.closest_face].normal:n.closest_point);var r=e.ObjectPool.getObject("GJK2SupportPoint");e.GjkEpa.findSupportPoint(s.object_a,s.object_b,o,r),o.subtractVectors(r.point,n.closest_point);var h=o.lengthSquared();if(a===e.GjkEpa.max_iterations||h<e.GjkEpa.epa_condition&&n.closest_face_distance>e.EPSILON){var c=e.ObjectPool.getObject("ContactDetails");return c.object_a=s.object_a,c.object_b=s.object_b,c.contact_normal.normalizeVector(n.closest_point),0===c.contact_normal.lengthSquared()&&c.contact_normal.subtractVectors(c.object_b.position,c.object_a.position),c.contact_normal.normalize(),e.GeometryMethods.findBarycentricCoordinates(n.closest_point,n.faces[n.closest_face].a.point,n.faces[n.closest_face].b.point,n.faces[n.closest_face].c.point,t),isNaN(t.x)?(e.GjkEpa.freePolyhedron(n),null):(i.a.scaleVector(n.faces[n.closest_face].a.witness_a,t.x),i.b.scaleVector(n.faces[n.closest_face].b.witness_a,t.y),i.c.scaleVector(n.faces[n.closest_face].c.witness_a,t.z),c.contact_point_in_a.addVectors(i.a,i.b),c.contact_point_in_a.add(i.c),i.a.scaleVector(n.faces[n.closest_face].a.witness_b,t.x),i.b.scaleVector(n.faces[n.closest_face].b.witness_b,t.y),i.c.scaleVector(n.faces[n.closest_face].c.witness_b,t.z),c.contact_point_in_b.addVectors(i.a,i.b),c.contact_point_in_b.add(i.c),c.contact_point.addVectors(c.contact_point_in_a,c.contact_point_in_b),c.contact_point.scale(.5),c.object_a.transform_inverse.transformVector3(c.contact_point_in_a),c.object_b.transform_inverse.transformVector3(c.contact_point_in_b),c.penetration_depth=n.closest_point.length()+e.GjkEpa.margins,c.restitution=(s.object_a.restitution+s.object_b.restitution)/2,c.friction=(s.object_a.friction+s.object_b.friction)/2,e.GjkEpa.freePolyhedron(n),c)}n.addVertex(r)}return e.GjkEpa.freePolyhedron(n),null}}(),Face:function(t,i,n,a){this.active=!0,this.a=i,this.b=n,this.c=a,this.normal=new e.Vector3,this.neighbors=[],o.subtractVectors(n.point,i.point),s.subtractVectors(a.point,i.point),this.normal.crossVectors(o,s),this.normal.normalize()}},e.GjkEpa.Polyhedron=function(t){this.closest_face=null,this.closest_face_distance=null,this.closest_point=new e.Vector3,this.faces=[new e.GjkEpa.Face(this,t.points[2],t.points[1],t.points[0]),new e.GjkEpa.Face(this,t.points[3],t.points[1],t.points[2]),new e.GjkEpa.Face(this,t.points[1],t.points[3],t.points[0]),new e.GjkEpa.Face(this,t.points[0],t.points[3],t.points[2])],this.faces[0].neighbors.push(this.faces[1],this.faces[2],this.faces[3]),this.faces[1].neighbors.push(this.faces[2],this.faces[0],this.faces[3]),this.faces[2].neighbors.push(this.faces[1],this.faces[3],this.faces[0]),this.faces[3].neighbors.push(this.faces[2],this.faces[1],this.faces[0])},e.GjkEpa.Polyhedron.prototype={addVertex:function(t){var i,o,s,n,a,r=[],h=[];for(this.faces[this.closest_face].silhouette(t,r),i=0;i<r.length-5;i+=5){if(s=r[i+3],n=r[i+4],0!==i&&a!==s)for(o=i+5;o<r.length;o+=5)if(r[o+3]===a){var c=r.slice(i,i+5);r[i]=r[o],r[i+1]=r[o+1],r[i+2]=r[o+2],r[i+3]=r[o+3],r[i+4]=r[o+4],r[o]=c[0],r[o+1]=c[1],r[o+2]=c[2],r[o+3]=c[3],r[o+4]=c[4],s=r[i+3],n=r[i+4];break}a=n}for(i=0;i<r.length;i+=5){var l=r[i];s=r[i+3],n=r[i+4];var p=new e.GjkEpa.Face(this,n,t,s);p.neighbors[2]=r[i],h.push(p),l.neighbors[l.neighbors.indexOf(r[i+2])]=p}for(i=0;i<h.length;i++)h[i].neighbors[0]=h[i+1===h.length?0:i+1],h[i].neighbors[1]=h[0>i-1?h.length-1:i-1];return Array.prototype.push.apply(this.faces,h),r},findFaceClosestToOrigin:function(){var t=new e.Vector3,i=new e.Vector3;return function(){this.closest_face_distance=1/0;var o,s;for(s=0;s<this.faces.length;s++)this.faces[s].active!==!1&&(e.GeometryMethods.findClosestPointInTriangle(t,this.faces[s].a.point,this.faces[s].b.point,this.faces[s].c.point,i),o=i.lengthSquared(),o<this.closest_face_distance&&(this.closest_face_distance=o,this.closest_face=s,this.closest_point.copy(i)))}}()},e.GjkEpa.Face.prototype={classifyVertex:function(t){var i=this.normal.dot(this.a.point);return this.normal.dot(t.point)-i},silhouette:function(t,i,e){if(this.active!==!1)if(this.classifyVertex(t)>0)this.active=!1,this.neighbors[0].silhouette(t,i,this),this.neighbors[1].silhouette(t,i,this),this.neighbors[2].silhouette(t,i,this);else if(e){var o,s,n=this.neighbors.indexOf(e);0===n?(o=this.a,s=this.b):1===n?(o=this.b,s=this.c):(o=this.c,s=this.a),i.push(this,n,e,s,o)}}},function(){var t=new e.Vector3,i=new e.Vector3,a=new e.Vector3,r=new e.Vector3,h=new e.Vector3,c=new e.Vector3,l={a:new e.Vector3,b:new e.Vector3,c:new e.Vector3};e.GjkEpa.Simplex=function(t,i){this.object_a=t,this.object_b=i,this.points=[],this.iterations=0,this.next_direction=new e.Vector3,this.updateDirection()},e.GjkEpa.Simplex.prototype={addPoint:function(){if(++this.iterations===e.GjkEpa.max_iterations)return!1;var i=e.ObjectPool.getObject("GJK2SupportPoint");if(e.GjkEpa.findSupportPoint(this.object_a,this.object_b,this.next_direction,i),this.points.push(i),i.point.dot(this.next_direction)<0&&this.points.length>1){if(this.points.length>=3){e.GeometryMethods.findClosestPointInTriangle(t,this.points[0].point,this.points[1].point,this.points[2].point,o);var s=o.lengthSquared();if(s<=e.GjkEpa.margins*e.GjkEpa.margins){var n=e.ObjectPool.getObject("ContactDetails");return n.object_a=this.object_a,n.object_b=this.object_b,n.contact_normal.normalizeVector(o),0===n.contact_normal.lengthSquared()&&n.contact_normal.subtractVectors(n.object_b.position,n.object_a.position),n.contact_normal.normalize(),n.contact_normal.scale(-1),n.penetration_depth=e.GjkEpa.margins-Math.sqrt(s),e.GeometryMethods.findBarycentricCoordinates(o,this.points[0].point,this.points[1].point,this.points[2].point,c),isNaN(c.x)?!1:(l.a.scaleVector(this.points[0].witness_a,c.x),l.b.scaleVector(this.points[1].witness_a,c.y),l.c.scaleVector(this.points[2].witness_a,c.z),n.contact_point_in_a.addVectors(l.a,l.b),n.contact_point_in_a.add(l.c),n.contact_point_in_b.scaleVector(n.contact_normal,-n.penetration_depth),n.contact_point_in_b.add(n.contact_point_in_a),n.contact_point.addVectors(n.contact_point_in_a,n.contact_point_in_b),n.contact_point.scale(.5),n.object_a.transform_inverse.transformVector3(n.contact_point_in_a),n.object_b.transform_inverse.transformVector3(n.contact_point_in_b),n.restitution=(this.object_a.restitution+this.object_b.restitution)/2,n.friction=(this.object_a.friction+this.object_b.friction)/2,e.GjkEpa.result=n,null)}}return!1}return this.updateDirection()===!0?null:i},findDirectionFromLine:function(){i.scaleVector(this.points[1].point,-1),a.subtractVectors(this.points[0].point,this.points[1].point),a.dot(i)<0?(this.next_direction.copy(i),e.ObjectPool.freeObject("GJK2SupportPoint",this.points[1]),this.points.length=1):(this.next_direction.crossVectors(a,i),this.next_direction.cross(a),0===this.next_direction.x&&0===this.next_direction.y&&0===this.next_direction.z&&(a.normalize(),this.next_direction.x=1-Math.abs(a.x),this.next_direction.y=1-Math.abs(a.y),this.next_direction.z=1-Math.abs(a.z)))},findDirectionFromTriangle:function(){var t=this.points[2],h=this.points[1],c=this.points[0];
2
+
3
+ i.scaleVector(t.point,-1),a.subtractVectors(h.point,t.point),r.subtractVectors(c.point,t.point),o.crossVectors(a,r),s.crossVectors(a,o),n.crossVectors(o,r),n.dot(i)>=0?r.dot(i)>=0?(this.points.length=0,this.points.push(c,t),e.ObjectPool.freeObject("GJK2SupportPoint",h),this.next_direction.crossVectors(r,i),this.next_direction.cross(r)):a.dot(i)>=0?(this.points.length=0,this.points.push(h,t),e.ObjectPool.freeObject("GJK2SupportPoint",c),this.next_direction.crossVectors(a,i),this.next_direction.cross(a)):(this.points.length=0,this.points.push(t),e.ObjectPool.freeObject("GJK2SupportPoint",h),e.ObjectPool.freeObject("GJK2SupportPoint",c)):s.dot(i)>=0?a.dot(i)>=0?(this.points.length=0,this.points.push(h,t),e.ObjectPool.freeObject("GJK2SupportPoint",c),this.next_direction.crossVectors(a,i),this.next_direction.cross(a)):(this.points.length=0,this.points.push(t),e.ObjectPool.freeObject("GJK2SupportPoint",h),e.ObjectPool.freeObject("GJK2SupportPoint",c)):o.dot(i)>=0?(this.next_direction.copy(o),this.points.length=0,this.points.push(t,h,c)):(this.next_direction.copy(o),this.next_direction.scale(-1))},getFaceNormal:function(t,i,e,o){a.subtractVectors(i.point,t.point),r.subtractVectors(e.point,t.point),o.crossVectors(a,r),o.normalize()},faceNormalDotOrigin:function(t,i,e){return this.getFaceNormal(t,i,e,o),s.addVectors(t.point,i.point),s.add(e.point),s.scale(-3),s.normalize(),o.dot(s)},findDirectionFromTetrahedron:function(){var t,i=this.points[3],s=this.points[2],n=this.points[1],a=this.points[0],r=null,h=e.EPSILON;return t=this.faceNormalDotOrigin(s,n,a),t>h&&(r=1,h=t),t=this.faceNormalDotOrigin(i,n,s),t>h&&(r=2,h=t),t=this.faceNormalDotOrigin(n,i,a),t>h&&(r=3,h=t),t=this.faceNormalDotOrigin(a,i,s),t>h&&(r=4,h=t),null===r?!0:void(1===r?(this.points.length=0,this.points.push(s,n,a),this.getFaceNormal(s,n,a,o),this.next_direction.copy(o)):2===r?(this.points.length=0,this.points.push(i,n,s),this.getFaceNormal(i,n,s,o),this.next_direction.copy(o)):3===r?(this.points.length=0,this.points.push(n,i,a),this.getFaceNormal(n,i,a,o),this.next_direction.copy(o)):4===r&&(this.points.length=0,this.points.push(a,i,s),this.getFaceNormal(a,i,s,o),this.next_direction.copy(o)))},containsOrigin:function(){var t=this.points[3],i=this.points[2],e=this.points[1],s=this.points[0];return a.subtractVectors(s.point,t.point),h.subtractVectors(e.point,t.point),o.crossVectors(a,h),o.dot(t.point)>0?!1:(a.subtractVectors(e.point,t.point),h.subtractVectors(i.point,t.point),o.crossVectors(a,h),o.dot(t.point)>0?!1:(a.subtractVectors(i.point,t.point),h.subtractVectors(s.point,t.point),o.crossVectors(a,h),o.dot(t.point)>0?!1:(a.subtractVectors(s.point,e.point),h.subtractVectors(i.point,e.point),o.crossVectors(a,h),o.dot(s.point)>0?!1:!0)))},updateDirection:function(){if(0===this.points.length)this.next_direction.subtractVectors(this.object_b.position,this.object_a.position);else if(1===this.points.length)this.next_direction.scale(-1);else if(2===this.points.length)this.findDirectionFromLine();else{if(3!==this.points.length)return this.findDirectionFromTetrahedron();this.findDirectionFromTriangle()}}}}(),e.SphereSphere=function(t,i){var s=t.position,n=i.position;o.subtractVectors(n,s);var a=o.length();if(!(a>t.shape.radius+i.shape.radius)){var r=e.ObjectPool.getObject("ContactDetails");return r.object_a=t,r.object_b=i,r.contact_normal.scaleVector(o,1/a),o.scale(-.5),r.contact_point.addVectors(o,s),r.penetration_depth=t.shape.radius+i.shape.radius-a,r.contact_point_in_a.scaleVector(r.contact_normal,r.object_a.shape.radius),r.contact_point_in_a.add(r.object_a.position),r.contact_point_in_b.scaleVector(r.contact_normal,-r.object_b.shape.radius),r.contact_point_in_b.add(r.object_b.position),r.contact_point.addVectors(r.contact_point_in_a,r.contact_point_in_b),r.contact_point.scale(.5),r.object_a.transform_inverse.transformVector3(r.contact_point_in_a),r.object_b.transform_inverse.transformVector3(r.contact_point_in_b),r.restitution=(t.restitution+i.restitution)/2,r.friction=(t.friction+i.friction)/2,r}},e.TriangleTriangle=function(t,i){var n=i.classifyVertex(t.a),a=i.classifyVertex(t.b),r=i.classifyVertex(t.c);if(n>0&&a>0&&r>0||0>n&&0>a&&0>r)return null;var h=t.classifyVertex(i.a),c=t.classifyVertex(i.b),l=t.classifyVertex(i.c);if(h>0&&c>0&&l>0||0>h&&0>c&&0>l)return null;var p=new e.Vector3;p.crossVectors(t.normal,i.normal),p.normalize();var _,b=p.dot(t.a),u=p.dot(t.b),f=p.dot(t.c),d=p.dot(i.a),m=p.dot(i.b),y=p.dot(i.c),j=t.a,w=t.b,x=t.c,v=i.a,g=i.b,z=i.c;Math.sign(n)===Math.sign(a)?(_=n,n=r,r=_,_=b,b=f,f=_,_=j,j=x,x=_):Math.sign(n)===Math.sign(r)&&(_=n,n=a,a=_,_=b,b=u,u=_,_=j,j=w,w=_),Math.sign(h)===Math.sign(c)?(_=h,h=l,l=_,_=d,d=y,y=_,_=v,v=z,z=_):Math.sign(h)===Math.sign(l)&&(_=h,h=c,c=_,_=d,d=m,m=_,_=v,v=g,g=_);var V=b+(u-b)*(n/(n-a)),S=b+(f-b)*(n/(n-r)),B=d+(m-d)*(h/(h-c)),C=d+(y-d)*(h/(h-l));if(V>S&&(_=V,V=S,S=_,_=u,u=f,f=_,_=w,w=x,x=_),B>C&&(_=B,B=C,C=_,_=m,m=y,y=_,_=g,g=z,z=_),V>=B&&C>=V||S>=B&&C>=S||B>=V&&S>=B||C>=V&&S>=C){var M=e.ObjectPool.getObject("ContactDetails");M.object_a=t,M.object_b=i;var P=new e.Vector3,O=new e.Vector3,I=new e.Vector3,A=new e.Vector3,T=new e.Vector3,E=new e.Vector3,F=!1,G=!1;return i.classifyVertex(j)<=0?(F=!0,e.GeometryMethods.findClosestPointInTriangle(j,v,g,z,O),P.copy(j),I.copy(i.normal),I.scale(-1)):V>=B&&C>=V?(F=!0,e.GeometryMethods.findClosestPointInTriangle(w,v,g,z,O),P.copy(w),I.copy(i.normal),I.scale(-1)):S>=B&&C>=S&&(F=!0,e.GeometryMethods.findClosestPointInTriangle(x,v,g,z,O),P.copy(x),I.copy(i.normal),I.scale(-1)),t.classifyVertex(v)<=0?(G=!0,e.GeometryMethods.findClosestPointInTriangle(v,j,w,x,A),T.copy(v),E.copy(t.normal)):B>=V&&S>=B?(G=!0,e.GeometryMethods.findClosestPointInTriangle(g,j,w,x,A),T.copy(g),E.copy(t.normal)):C>=V&&S>=C&&(G=!0,e.GeometryMethods.findClosestPointInTriangle(z,j,w,x,A),T.copy(z),E.copy(t.normal)),o.subtractVectors(P,O),s.subtractVectors(A,T),!G||F&&o.lengthSquared()<s.lengthSquared()?(M.contact_point_in_a.copy(P),M.contact_point_in_b.copy(O),M.contact_normal.copy(I)):(M.contact_point_in_a.copy(A),M.contact_point_in_b.copy(T),M.contact_normal.copy(E)),o.subtractVectors(M.contact_point_in_a,M.contact_point_in_b),M.penetration_depth=o.length(),M.contact_point.addVectors(M.contact_point_in_a,M.contact_point_in_b),M.contact_point.scale(.5),M}return null},e.Constraint=function(){var t=0;return function(){this.id=t++,this.active=!0,this.object_a=null,this.object_b=null,this.limit=new e.ConstraintLimit,this.motor=new e.ConstraintMotor,this.rows=[],this.factor=1,this.last_impulse=new e.Vector3,this.breaking_threshold=0,this.listeners={}}}(),e.EventEmitter.apply(e.Constraint),e.Constraint.prototype.deactivate=function(){this.active=!1,this.emit("deactivate")},e.Constraint.prototype.update=function(){},e.ConstraintLimit=function(t,i){this.erp=.3,this.constraint_row=null,this.set(t,i)},e.ConstraintLimit.prototype.set=function(t,i){this.limit_lower=t,this.limit_upper=i,this.enabled=null!=this.limit_lower||null!=this.limit_upper},e.ConstraintLimit.prototype.createConstraintRow=function(){this.constraint_row=e.ConstraintRow.createConstraintRow()},e.ConstraintMotor=function(t,i){this.constraint_row=null,this.set(t,i)},e.ConstraintMotor.prototype.set=function(t,i){this.enabled=null!=t&&null!=i,this.torque=t,this.max_speed=i},e.ConstraintMotor.prototype.createConstraintRow=function(){this.constraint_row=e.ConstraintRow.createConstraintRow()},e.ConstraintRow=function(){this.jacobian=new Float64Array(12),this.B=new Float64Array(12),this.D=0,this.lower_limit=-(1/0),this.upper_limit=1/0,this.bias=0,this.multiplier=0,this.multiplier_cached=0,this.eta=0,this.eta_row=new Float64Array(12)},e.ConstraintRow.createConstraintRow=function(){var t=e.ObjectPool.getObject("ConstraintRow");return t.lower_limit=-(1/0),t.upper_limit=1/0,t.bias=0,t.jacobian[0]=t.jacobian[1]=t.jacobian[2]=t.jacobian[3]=t.jacobian[4]=t.jacobian[5]=t.jacobian[6]=t.jacobian[7]=t.jacobian[8]=t.jacobian[9]=t.jacobian[10]=t.jacobian[11]=0,t},e.ConstraintRow.prototype.computeB=function(t){var i;null!=t.object_a&&t.object_a._mass!==1/0?(i=t.object_a._mass_inverted,this.B[0]=i*this.jacobian[0]*t.object_a.linear_factor.x,this.B[1]=i*this.jacobian[1]*t.object_a.linear_factor.y,this.B[2]=i*this.jacobian[2]*t.object_a.linear_factor.z,o.x=this.jacobian[3],o.y=this.jacobian[4],o.z=this.jacobian[5],t.object_a.inverseInertiaTensorWorldFrame.transformVector3(o),this.B[3]=o.x*t.object_a.angular_factor.x,this.B[4]=o.y*t.object_a.angular_factor.y,this.B[5]=o.z*t.object_a.angular_factor.z):(this.B[0]=this.B[1]=this.B[2]=0,this.B[3]=this.B[4]=this.B[5]=0),null!=t.object_b&&t.object_b._mass!==1/0?(i=t.object_b._mass_inverted,this.B[6]=i*this.jacobian[6]*t.object_b.linear_factor.x,this.B[7]=i*this.jacobian[7]*t.object_b.linear_factor.y,this.B[8]=i*this.jacobian[8]*t.object_b.linear_factor.z,o.x=this.jacobian[9],o.y=this.jacobian[10],o.z=this.jacobian[11],t.object_b.inverseInertiaTensorWorldFrame.transformVector3(o),this.B[9]=o.x*t.object_b.linear_factor.x,this.B[10]=o.y*t.object_b.linear_factor.y,this.B[11]=o.z*t.object_b.linear_factor.z):(this.B[6]=this.B[7]=this.B[8]=0,this.B[9]=this.B[10]=this.B[11]=0)},e.ConstraintRow.prototype.computeD=function(){this.D=this.jacobian[0]*this.B[0]+this.jacobian[1]*this.B[1]+this.jacobian[2]*this.B[2]+this.jacobian[3]*this.B[3]+this.jacobian[4]*this.B[4]+this.jacobian[5]*this.B[5]+this.jacobian[6]*this.B[6]+this.jacobian[7]*this.B[7]+this.jacobian[8]*this.B[8]+this.jacobian[9]*this.B[9]+this.jacobian[10]*this.B[10]+this.jacobian[11]*this.B[11]},e.ConstraintRow.prototype.computeEta=function(t,i){var e,s=1/i;null==t.object_a||t.object_a._mass===1/0?this.eta_row[0]=this.eta_row[1]=this.eta_row[2]=this.eta_row[3]=this.eta_row[4]=this.eta_row[5]=0:(e=t.object_a._mass_inverted,this.eta_row[0]=(t.object_a.linear_velocity.x+e*t.object_a.accumulated_force.x)*s,this.eta_row[1]=(t.object_a.linear_velocity.y+e*t.object_a.accumulated_force.y)*s,this.eta_row[2]=(t.object_a.linear_velocity.z+e*t.object_a.accumulated_force.z)*s,o.copy(t.object_a.accumulated_torque),t.object_a.inverseInertiaTensorWorldFrame.transformVector3(o),this.eta_row[3]=(t.object_a.angular_velocity.x+o.x)*s,this.eta_row[4]=(t.object_a.angular_velocity.y+o.y)*s,this.eta_row[5]=(t.object_a.angular_velocity.z+o.z)*s),null==t.object_b||t.object_b._mass===1/0?this.eta_row[6]=this.eta_row[7]=this.eta_row[8]=this.eta_row[9]=this.eta_row[10]=this.eta_row[11]=0:(e=t.object_b._mass_inverted,this.eta_row[6]=(t.object_b.linear_velocity.x+e*t.object_b.accumulated_force.x)*s,this.eta_row[7]=(t.object_b.linear_velocity.y+e*t.object_b.accumulated_force.y)*s,this.eta_row[8]=(t.object_b.linear_velocity.z+e*t.object_b.accumulated_force.z)*s,o.copy(t.object_b.accumulated_torque),t.object_b.inverseInertiaTensorWorldFrame.transformVector3(o),this.eta_row[9]=(t.object_b.angular_velocity.x+o.x)*s,this.eta_row[10]=(t.object_b.angular_velocity.y+o.y)*s,this.eta_row[11]=(t.object_b.angular_velocity.z+o.z)*s);var n=this.jacobian[0]*this.eta_row[0]+this.jacobian[1]*this.eta_row[1]+this.jacobian[2]*this.eta_row[2]+this.jacobian[3]*this.eta_row[3]+this.jacobian[4]*this.eta_row[4]+this.jacobian[5]*this.eta_row[5]+this.jacobian[6]*this.eta_row[6]+this.jacobian[7]*this.eta_row[7]+this.jacobian[8]*this.eta_row[8]+this.jacobian[9]*this.eta_row[9]+this.jacobian[10]*this.eta_row[10]+this.jacobian[11]*this.eta_row[11];this.eta=this.bias*s-n},e.ContactConstraint=function(){e.Constraint.call(this),this.contact=null},e.ContactConstraint.prototype=Object.create(e.Constraint.prototype),e.ContactConstraint.prototype.buildFromContact=function(t){this.object_a=t.object_a,this.object_b=t.object_b,this.contact=t;var i=this,o=function(){this.removeListener("destroy",o),i.deactivate()};this.contact.addListener("destroy",o);var s=this.rows[0]||e.ObjectPool.getObject("ConstraintRow");s.lower_limit=0,s.upper_limit=1/0,this.rows[0]=s,this.update()},e.ContactConstraint.prototype.update=function(){var t=this.rows[0];null==this.object_a||this.object_a._mass===1/0?(t.jacobian[0]=t.jacobian[1]=t.jacobian[2]=0,t.jacobian[3]=t.jacobian[4]=t.jacobian[5]=0):(t.jacobian[0]=-this.contact.contact_normal.x,t.jacobian[1]=-this.contact.contact_normal.y,t.jacobian[2]=-this.contact.contact_normal.z,o.subtractVectors(this.contact.contact_point,this.contact.object_a.position),o.cross(this.contact.contact_normal),t.jacobian[3]=-o.x,t.jacobian[4]=-o.y,t.jacobian[5]=-o.z),null==this.object_b||this.object_b._mass===1/0?(t.jacobian[6]=t.jacobian[7]=t.jacobian[8]=0,t.jacobian[9]=t.jacobian[10]=t.jacobian[11]=0):(t.jacobian[6]=this.contact.contact_normal.x,t.jacobian[7]=this.contact.contact_normal.y,t.jacobian[8]=this.contact.contact_normal.z,o.subtractVectors(this.contact.contact_point,this.contact.object_b.position),o.cross(this.contact.contact_normal),t.jacobian[9]=o.x,t.jacobian[10]=o.y,t.jacobian[11]=o.z),t.bias=0;var i=0;this.object_a._mass!==1/0&&(this.object_a.getVelocityInLocalPoint(this.contact.contact_point_in_a,o),i+=o.dot(this.contact.contact_normal)),this.object_b._mass!==1/0&&(this.object_b.getVelocityInLocalPoint(this.contact.contact_point_in_b,o),i-=o.dot(this.contact.contact_normal)),t.bias+=i*this.contact.restitution},e.FrictionConstraint=function(){e.Constraint.call(this),this.contact=null},e.FrictionConstraint.prototype=Object.create(e.Constraint.prototype),e.FrictionConstraint.prototype.buildFromContact=function(t){this.rows[0]=this.rows[0]||e.ObjectPool.getObject("ConstraintRow"),this.rows[1]=this.rows[1]||e.ObjectPool.getObject("ConstraintRow"),this.object_a=t.object_a,this.object_b=t.object_b,this.contact=t;var i=this,o=function(){this.removeListener("destroy",o),i.deactivate()};this.contact.addListener("destroy",o),this.update()},e.FrictionConstraint.prototype.update=function(){var t=new e.Vector3,i=new e.Vector3,s=new e.Vector3,n=new e.Vector3;return function(){var e=this.rows[0],a=this.rows[1];t.subtractVectors(this.contact.contact_point,this.object_a.position),i.subtractVectors(this.contact.contact_point,this.object_b.position),this.contact.contact_normal.findOrthogonal(s,n),null==this.object_a||this.object_a._mass===1/0?(e.jacobian[0]=e.jacobian[1]=e.jacobian[2]=0,e.jacobian[3]=e.jacobian[4]=e.jacobian[5]=0,a.jacobian[0]=a.jacobian[1]=a.jacobian[2]=0,a.jacobian[3]=a.jacobian[4]=a.jacobian[5]=0):(e.jacobian[0]=-s.x,e.jacobian[1]=-s.y,e.jacobian[2]=-s.z,o.crossVectors(t,s),e.jacobian[3]=-o.x,e.jacobian[4]=-o.y,e.jacobian[5]=-o.z,a.jacobian[0]=-n.x,a.jacobian[1]=-n.y,a.jacobian[2]=-n.z,o.crossVectors(t,n),a.jacobian[3]=-o.x,a.jacobian[4]=-o.y,a.jacobian[5]=-o.z),null==this.object_b||this.object_b._mass===1/0?(e.jacobian[6]=e.jacobian[7]=e.jacobian[8]=0,e.jacobian[9]=e.jacobian[10]=e.jacobian[11]=0,a.jacobian[6]=a.jacobian[7]=a.jacobian[8]=0,a.jacobian[9]=a.jacobian[10]=a.jacobian[11]=0):(e.jacobian[6]=s.x,e.jacobian[7]=s.y,e.jacobian[8]=s.z,o.crossVectors(i,s),e.jacobian[9]=o.x,e.jacobian[10]=o.y,e.jacobian[11]=o.z,a.jacobian[6]=n.x,a.jacobian[7]=n.y,a.jacobian[8]=n.z,o.crossVectors(i,n),a.jacobian[9]=o.x,a.jacobian[10]=o.y,a.jacobian[11]=o.z);var r=this.contact.friction;null!=this.object_a&&this.object_a._mass!==1/0&&(r*=this.object_a._mass),null!=this.object_b&&this.object_b._mass!==1/0&&(r*=this.object_b._mass),0>r&&(r=0),e.lower_limit=a.lower_limit=-r,e.upper_limit=a.upper_limit=r,e.bias=a.bias=0,this.rows[0]=e,this.rows[1]=a}}(),e.HingeConstraint=function(t,i,o,s,n){e.Constraint.call(this),this.object_a=t,this.hinge_a=i,this.point_a=o,this.initial_quaternion=new e.Quaternion,this.object_b=s||null,this.point_b=new e.Vector3,this.hinge_b=new e.Vector3,null!=this.object_b?(this.object_a.rotation.transformVector3Into(this.hinge_a,this.hinge_b),r.invertQuaternion(this.object_b.rotation),r.transformVector3(this.hinge_b),this.point_b=n,this.initial_quaternion.multiplyQuaternions(r,this.object_a.rotation)):(this.object_a.updateDerived(),this.object_a.rotation.transformVector3Into(this.hinge_a,this.hinge_b),this.object_a.transform.transformVector3Into(this.point_a,this.point_b),this.initial_quaternion.set(this.object_a.rotation.x,this.object_a.rotation.y,this.object_a.rotation.z,this.object_a.rotation.w)),this.erp=.1;for(var a=0;5>a;a++)this.rows[a]=e.ConstraintRow.createConstraintRow()},e.HingeConstraint.prototype=Object.create(e.Constraint.prototype),e.HingeConstraint.prototype.updateLimits=function(i,e){if(this.limit.enabled===!1)return void t(this);var o,s;return null==this.object_b?o=this.initial_quaternion.signedAngleBetween(this.object_a.rotation,i):(r.invertQuaternion(this.object_b.rotation),r.multiply(this.object_a.rotation),o=this.initial_quaternion.signedAngleBetween(r,i)),(null==this.limit.limit_lower||this.limit.limit_lower<o)&&(null==this.limit.limit_upper||this.limit.limit_upper>o)?void t(this):void(null!=this.limit.limit_lower&&o<=this.limit.limit_lower?(null==this.limit.constraint_row&&(this.limit.createConstraintRow(),this.limit.constraint_row.upper_limit=0,this.rows.push(this.limit.constraint_row)),this.limit.constraint_row.jacobian[3]=-i.x,this.limit.constraint_row.jacobian[4]=-i.y,this.limit.constraint_row.jacobian[5]=-i.z,null!=this.object_b&&(this.limit.constraint_row.jacobian[9]=i.x,this.limit.constraint_row.jacobian[10]=i.y,this.limit.constraint_row.jacobian[11]=i.z),s=o-this.limit.limit_lower,this.limit.constraint_row.bias=s*this.limit.erp/e):null!=this.limit.limit_upper&&o>=this.limit.limit_upper&&(null==this.limit.constraint_row&&(this.limit.createConstraintRow(),this.limit.constraint_row.lower_limit=0,this.rows.push(this.limit.constraint_row)),this.limit.constraint_row.jacobian[3]=-i.x,this.limit.constraint_row.jacobian[4]=-i.y,this.limit.constraint_row.jacobian[5]=-i.z,null!=this.object_b&&(this.limit.constraint_row.jacobian[9]=i.x,this.limit.constraint_row.jacobian[10]=i.y,this.limit.constraint_row.jacobian[11]=i.z),s=o-this.limit.limit_upper,this.limit.constraint_row.bias=s*this.limit.erp/e))},e.HingeConstraint.prototype.updateMotor=function(t){return this.motor.enabled===!1?void i(this):(null==this.motor.constraint_row&&(this.motor.createConstraintRow(),this.rows.push(this.motor.constraint_row),this.motor.constraint_row.jacobian[3]=t.x,this.motor.constraint_row.jacobian[4]=t.y,this.motor.constraint_row.jacobian[5]=t.z,null!=this.object_b&&(this.motor.constraint_row.jacobian[9]=-t.x,this.motor.constraint_row.jacobian[10]=-t.y,this.motor.constraint_row.jacobian[11]=-t.z)),this.motor.constraint_row.bias=this.motor.max_speed,void(this.motor.max_speed>=0?(this.motor.constraint_row.lower_limit=0,this.motor.constraint_row.upper_limit=this.motor.torque):(this.motor.constraint_row.lower_limit=-this.motor.torque,this.motor.constraint_row.upper_limit=0)))},e.HingeConstraint.prototype.update=function(){var t=new e.Vector3,i=new e.Vector3,a=new e.Vector3,r=new e.Vector3,h=new e.Vector3;return function(e){this.object_a.rotation.transformVector3Into(this.hinge_a,h),this.object_a.transform.transformVector3Into(this.point_a,o),t.subtractVectors(o,this.object_a.position),this.rows[0].jacobian[0]=-1,this.rows[0].jacobian[1]=0,this.rows[0].jacobian[2]=0,this.rows[0].jacobian[3]=0,this.rows[0].jacobian[4]=-t.z,this.rows[0].jacobian[5]=t.y,this.rows[1].jacobian[0]=0,this.rows[1].jacobian[1]=-1,this.rows[1].jacobian[2]=0,this.rows[1].jacobian[3]=t.z,this.rows[1].jacobian[4]=0,this.rows[1].jacobian[5]=-t.x,this.rows[2].jacobian[0]=0,this.rows[2].jacobian[1]=0,this.rows[2].jacobian[2]=-1,this.rows[2].jacobian[3]=-t.y,this.rows[2].jacobian[4]=t.x,this.rows[2].jacobian[5]=0,h.findOrthogonal(a,r),this.rows[3].jacobian[3]=-a.x,this.rows[3].jacobian[4]=-a.y,this.rows[3].jacobian[5]=-a.z,this.rows[4].jacobian[3]=-r.x,this.rows[4].jacobian[4]=-r.y,this.rows[4].jacobian[5]=-r.z,null!=this.object_b?(this.object_b.transform.transformVector3Into(this.point_b,s),i.subtractVectors(s,this.object_b.position),this.rows[0].jacobian[6]=1,this.rows[0].jacobian[7]=0,this.rows[0].jacobian[8]=0,this.rows[0].jacobian[9]=0,this.rows[0].jacobian[10]=i.z,this.rows[0].jacobian[11]=-i.y,this.rows[1].jacobian[6]=0,this.rows[1].jacobian[7]=1,this.rows[1].jacobian[8]=0,this.rows[1].jacobian[9]=-i.z,this.rows[1].jacobian[10]=0,this.rows[1].jacobian[11]=i.x,this.rows[2].jacobian[6]=0,this.rows[2].jacobian[7]=0,this.rows[2].jacobian[8]=1,this.rows[2].jacobian[9]=i.y,this.rows[2].jacobian[10]=-i.z,this.rows[2].jacobian[11]=0,this.rows[3].jacobian[9]=a.x,this.rows[3].jacobian[10]=a.y,this.rows[3].jacobian[11]=a.z,this.rows[4].jacobian[9]=r.x,this.rows[4].jacobian[10]=r.y,this.rows[4].jacobian[11]=r.z):s.copy(this.point_b),n.subtractVectors(o,s),n.scale(this.erp/e),this.rows[0].bias=n.x,this.rows[1].bias=n.y,this.rows[2].bias=n.z,null!=this.object_b?(this.object_a.rotation.transformVector3Into(this.hinge_a,o),this.object_b.rotation.transformVector3Into(this.hinge_b,s),o.cross(s),this.rows[3].bias=-o.dot(a)*this.erp/e,this.rows[4].bias=-o.dot(r)*this.erp/e):this.rows[3].bias=this.rows[4].bias=0,this.updateLimits(h,e),this.updateMotor(h)}}(),e.PointConstraint=function(t,i,o,s){e.Constraint.call(this),this.object_a=t,this.point_a=i,this.object_b=o||null,null!=this.object_b?this.point_b=s:(this.point_b=new e.Vector3,this.object_a.updateDerived(),this.object_a.transform.transformVector3Into(this.point_a,this.point_b)),this.erp=.1;for(var n=0;3>n;n++)this.rows[n]=e.ObjectPool.getObject("ConstraintRow"),this.rows[n].lower_limit=-(1/0),this.rows[n].upper_limit=1/0,this.rows[n].bias=0,this.rows[n].jacobian[6]=this.rows[n].jacobian[7]=this.rows[n].jacobian[8]=this.rows[n].jacobian[9]=this.rows[n].jacobian[10]=this.rows[n].jacobian[11]=0},e.PointConstraint.prototype=Object.create(e.Constraint.prototype),e.PointConstraint.prototype.update=function(){var t=new e.Vector3,i=new e.Vector3;return function(e){this.object_a.transform.transformVector3Into(this.point_a,o),t.subtractVectors(o,this.object_a.position),this.rows[0].jacobian[0]=-1,this.rows[0].jacobian[1]=0,this.rows[0].jacobian[2]=0,this.rows[0].jacobian[3]=0,this.rows[0].jacobian[4]=-t.z,this.rows[0].jacobian[5]=t.y,this.rows[1].jacobian[0]=0,this.rows[1].jacobian[1]=-1,this.rows[1].jacobian[2]=0,this.rows[1].jacobian[3]=t.z,this.rows[1].jacobian[4]=0,this.rows[1].jacobian[5]=-t.x,this.rows[2].jacobian[0]=0,this.rows[2].jacobian[1]=0,this.rows[2].jacobian[2]=-1,this.rows[2].jacobian[3]=-t.y,this.rows[2].jacobian[4]=t.x,this.rows[2].jacobian[5]=0,null!=this.object_b?(this.object_b.transform.transformVector3Into(this.point_b,s),i.subtractVectors(s,this.object_b.position),this.rows[0].jacobian[6]=1,this.rows[0].jacobian[7]=0,this.rows[0].jacobian[8]=0,this.rows[0].jacobian[9]=0,this.rows[0].jacobian[10]=i.z,this.rows[0].jacobian[11]=-i.y,this.rows[1].jacobian[6]=0,this.rows[1].jacobian[7]=1,this.rows[1].jacobian[8]=0,this.rows[1].jacobian[9]=-i.z,this.rows[1].jacobian[10]=0,this.rows[1].jacobian[11]=i.x,this.rows[2].jacobian[6]=0,this.rows[2].jacobian[7]=0,this.rows[2].jacobian[8]=1,this.rows[2].jacobian[9]=i.y,this.rows[2].jacobian[10]=-i.x,this.rows[2].jacobian[11]=0):s.copy(this.point_b),n.subtractVectors(o,s),n.scale(this.erp/e),this.rows[0].bias=n.x,this.rows[1].bias=n.y,this.rows[2].bias=n.z}}(),e.SliderConstraint=function(t,i,o){e.Constraint.call(this),this.object_a=t,this.axis=i,this.object_b=o,this.position_error=new e.Vector3,this.position_error.subtractVectors(this.object_b.position,this.object_a.position),r.invertQuaternion(this.object_a.rotation),r.transformVector3(this.position_error),this.rotation_difference=new e.Quaternion,null!=this.object_b&&(r.invertQuaternion(this.object_b.rotation),this.rotation_difference.multiplyQuaternions(r,this.object_a.rotation)),this.erp=.1;for(var s=0;5>s;s++)this.rows[s]=e.ObjectPool.getObject("ConstraintRow"),this.rows[s].lower_limit=-(1/0),this.rows[s].upper_limit=1/0,this.rows[s].bias=0,this.rows[s].jacobian[0]=this.rows[s].jacobian[1]=this.rows[s].jacobian[2]=this.rows[s].jacobian[3]=this.rows[s].jacobian[4]=this.rows[s].jacobian[5]=this.rows[s].jacobian[6]=this.rows[s].jacobian[7]=this.rows[s].jacobian[8]=this.rows[s].jacobian[9]=this.rows[s].jacobian[10]=this.rows[s].jacobian[11]=0},e.SliderConstraint.prototype=Object.create(e.Constraint.prototype),e.SliderConstraint.prototype.update=function(){var t=new e.Vector3,i=new e.Vector3,o=new e.Vector3;return function(e){this.object_a.rotation.transformVector3Into(this.axis,t),t.findOrthogonal(i,o),this._updateLinearConstraints(e,i,o),this._updateAngularConstraints(e,i,o)}}(),e.SliderConstraint.prototype._updateLinearConstraints=function(t,i,n){var a=new e.Vector3;a.subtractVectors(this.object_b.position,this.object_a.position);var r=new e.Vector3;r.crossVectors(a,i),this.rows[0].jacobian[0]=-i.x,this.rows[0].jacobian[1]=-i.y,this.rows[0].jacobian[2]=-i.z,this.rows[0].jacobian[6]=i.x,this.rows[0].jacobian[7]=i.y,this.rows[0].jacobian[8]=i.z,this.rows[0].jacobian[9]=0,this.rows[0].jacobian[10]=0,this.rows[0].jacobian[11]=0,r.crossVectors(a,n),this.rows[1].jacobian[0]=-n.x,this.rows[1].jacobian[1]=-n.y,this.rows[1].jacobian[2]=-n.z,this.rows[1].jacobian[6]=n.x,this.rows[1].jacobian[7]=n.y,this.rows[1].jacobian[8]=n.z,this.rows[1].jacobian[9]=0,this.rows[1].jacobian[10]=0,this.rows[1].jacobian[11]=0,this.object_a.rotation.transformVector3Into(this.position_error,o),s.subtractVectors(a,o),s.scale(this.erp/t),this.rows[0].bias=-i.dot(s),this.rows[1].bias=-n.dot(s)},e.SliderConstraint.prototype._updateAngularConstraints=function(t,i,o,s){this.rows[2].jacobian[3]=this.rows[3].jacobian[4]=this.rows[4].jacobian[5]=-1,this.rows[2].jacobian[9]=this.rows[3].jacobian[10]=this.rows[4].jacobian[11]=1,r.invertQuaternion(this.object_b.rotation),r.multiply(this.object_a.rotation),h.invertQuaternion(this.rotation_difference),h.multiply(r);var n=new e.Vector3;n.x=h.x,n.y=h.y,n.z=h.z,n.scale(this.erp/t)},e.WeldConstraint=function(t,i,o,s){e.Constraint.call(this),this.object_a=t,this.point_a=i,this.object_b=o||null,this.point_b=s||null,this.rotation_difference=new e.Quaternion,null!=this.object_b&&(r.invertQuaternion(this.object_b.rotation),this.rotation_difference.multiplyQuaternions(r,this.object_a.rotation)),this.erp=.1;for(var n=0;3>n;n++)this.rows[n]=e.ObjectPool.getObject("ConstraintRow"),this.rows[n].lower_limit=-(1/0),this.rows[n].upper_limit=1/0,this.rows[n].bias=0,null==this.object_b&&(this.rows[n].jacobian[0]=this.rows[n].jacobian[1]=this.rows[n].jacobian[2]=this.rows[n].jacobian[4]=this.rows[n].jacobian[5]=this.rows[n].jacobian[6]=this.rows[n].jacobian[7]=this.rows[n].jacobian[8]=this.rows[n].jacobian[9]=this.rows[n].jacobian[10]=this.rows[n].jacobian[11]=this.rows[n].jacobian[12]=0,this.rows[n].jacobian[n]=1);for(n=3;6>n;n++)this.rows[n]=e.ObjectPool.getObject("ConstraintRow"),this.rows[n].lower_limit=-(1/0),this.rows[n].upper_limit=1/0,this.rows[n].bias=0,null==this.object_b?(this.rows[n].jacobian[0]=this.rows[n].jacobian[1]=this.rows[n].jacobian[2]=this.rows[n].jacobian[4]=this.rows[n].jacobian[5]=this.rows[n].jacobian[6]=this.rows[n].jacobian[7]=this.rows[n].jacobian[8]=this.rows[n].jacobian[9]=this.rows[n].jacobian[10]=this.rows[n].jacobian[11]=this.rows[n].jacobian[12]=0,this.rows[n].jacobian[n]=1):(this.rows[n].jacobian[0]=this.rows[n].jacobian[1]=this.rows[n].jacobian[2]=0,this.rows[n].jacobian[3]=this.rows[n].jacobian[4]=this.rows[n].jacobian[5]=0,this.rows[n].jacobian[n]=-1,this.rows[n].jacobian[6]=this.rows[n].jacobian[7]=this.rows[n].jacobian[8]=0,this.rows[n].jacobian[9]=this.rows[n].jacobian[10]=this.rows[n].jacobian[11]=0,this.rows[n].jacobian[n+6]=1)},e.WeldConstraint.prototype=Object.create(e.Constraint.prototype),e.WeldConstraint.prototype.update=function(){var t=new e.Vector3,i=new e.Vector3;return function(n){if(null!=this.object_b){this.object_a.transform.transformVector3Into(this.point_a,o),t.subtractVectors(o,this.object_a.position),this.rows[0].jacobian[0]=-1,this.rows[0].jacobian[1]=0,this.rows[0].jacobian[2]=0,this.rows[0].jacobian[3]=0,this.rows[0].jacobian[4]=-t.z,this.rows[0].jacobian[5]=t.y,this.rows[1].jacobian[0]=0,this.rows[1].jacobian[1]=-1,this.rows[1].jacobian[2]=0,this.rows[1].jacobian[3]=t.z,this.rows[1].jacobian[4]=0,this.rows[1].jacobian[5]=-t.x,this.rows[2].jacobian[0]=0,this.rows[2].jacobian[1]=0,this.rows[2].jacobian[2]=-1,this.rows[2].jacobian[3]=-t.y,this.rows[2].jacobian[4]=t.x,this.rows[2].jacobian[5]=0,null!=this.object_b?(this.object_b.transform.transformVector3Into(this.point_b,s),i.subtractVectors(s,this.object_b.position),this.rows[0].jacobian[6]=1,this.rows[0].jacobian[7]=0,this.rows[0].jacobian[8]=0,this.rows[0].jacobian[9]=0,this.rows[0].jacobian[10]=i.z,this.rows[0].jacobian[11]=-i.y,this.rows[1].jacobian[6]=0,this.rows[1].jacobian[7]=1,this.rows[1].jacobian[8]=0,this.rows[1].jacobian[9]=-i.z,this.rows[1].jacobian[10]=0,this.rows[1].jacobian[11]=i.x,this.rows[2].jacobian[6]=0,this.rows[2].jacobian[7]=0,this.rows[2].jacobian[8]=1,this.rows[2].jacobian[9]=i.y,this.rows[2].jacobian[10]=-i.x,this.rows[2].jacobian[11]=0):s.copy(this.point_b);var a=new e.Vector3;a.subtractVectors(o,s),a.scale(this.erp/n),this.rows[0].bias=a.x,this.rows[1].bias=a.y,this.rows[2].bias=a.z,r.invertQuaternion(this.object_b.rotation),r.multiply(this.object_a.rotation),h.invertQuaternion(this.rotation_difference),h.multiply(r),a.x=h.x,a.y=h.y,a.z=h.z,a.scale(this.erp/n),this.rows[3].bias=a.x,this.rows[4].bias=a.y,this.rows[5].bias=a.z}}}(),e.DragForce=function(t,i){this.drag_coefficient=t||0,this.squared_drag_coefficient=i||0,this.enabled=!0,this.affected=[]},e.DragForce.prototype.enable=e.ForceGenerator.prototype.enable,e.DragForce.prototype.disable=e.ForceGenerator.prototype.disable,e.DragForce.prototype.affect=e.ForceGenerator.prototype.affect,e.DragForce.prototype.unaffect=e.ForceGenerator.prototype.unaffect,e.DragForce.prototype.applyForce=function(){if(this.enabled){var t,i,e,s,n=o;for(t=0,i=this.affected.length;i>t;t++)e=this.affected[t],n.copy(e.linear_velocity),s=n.length(),s=this.drag_coefficient*s+this.squared_drag_coefficient*s*s,n.normalize(),n.scale(-s),e.applyForce(n)}},e.RayIntersection=function(){this.object=null,this.point=new e.Vector3,this.t=null,this.normal=new e.Vector3},e.BoxShape=function(t,i,o){this.half_width=t,this.half_height=i,this.half_depth=o,this.aabb=new e.AABB,this.calculateLocalAABB(this.aabb)},e.BoxShape.prototype.calculateLocalAABB=function(t){t.min.x=-this.half_width,t.min.y=-this.half_height,t.min.z=-this.half_depth,t.max.x=this.half_width,t.max.y=this.half_height,t.max.z=this.half_depth},e.BoxShape.prototype.getInertiaTensor=function(t){var i=this.half_height*this.half_height*4,o=this.half_width*this.half_width*4,s=this.half_depth*this.half_depth*4,n=.0833*t;return new e.Matrix3(n*(i+s),0,0,0,n*(o+s),0,0,0,n*(i+o))},e.BoxShape.prototype.findSupportPoint=function(t,i){i.x=t.x<0?-this.half_width:this.half_width,i.y=t.y<0?-this.half_height:this.half_height,i.z=t.z<0?-this.half_depth:this.half_depth},e.BoxShape.prototype.rayIntersect=function(){var t,i,o,s,n,a,r,h=new e.Vector3;return function(c,l){t=0,h.subtractVectors(l,c),i=h.length(),h.scale(1/i);for(var p=0;3>p;p++){if(o=0===p?"x":1===p?"y":"z",r=0===p?this.half_width:1===p?this.half_height:this.half_depth,Math.abs(h[o])<e.EPSILON&&(c[o]<-r||c[o]>r))return null;if(s=1/h[o],n=(-r-c[o])*s,a=(r-c[o])*s,n>a&&(s=n,n=a,a=s),t=Math.max(t,n),i=Math.min(i,a),t>i)return null}var _=e.ObjectPool.getObject("RayIntersection");_.object=this,_.t=t,_.point.scaleVector(h,t),_.point.add(c);var b=1/0;for(p=0;3>p;p++)o=0===p?"x":1===p?"y":"z",r=0===p?this.half_width:1===p?this.half_height:this.half_depth,r-Math.abs(_.point[o])<b&&(_.normal.x=_.normal.y=_.normal.z=0,_.normal[o]=_.point[o]<0?-1:1,b=r-Math.abs(_.point[o]));return _}}(),e.CapsuleShape=function(t,i){if(this.radius=t,this.total_height=i,this.half_height=.5*i,this.cylinder_height=i-2*t,this.cylinder_half_height=.5*this.cylinder_height,this.cylinder_height<0)throw new Error("Total height must be greater than 2 * radius");this.aabb=new e.AABB,this.calculateLocalAABB(this.aabb)},e.CapsuleShape.prototype.calculateLocalAABB=function(t){t.min.x=t.min.z=-this.radius,t.min.y=-this.half_height,t.max.x=t.max.z=this.radius,t.max.y=this.half_height},e.CapsuleShape.prototype.getInertiaTensor=function(t){
4
+ var i=Math.PI*this.radius*this.radius*this.cylinder_height,o=4/3*Math.PI*this.radius*this.radius*this.radius,s=i+o,n=t*(i/s),a=t*(o/s),r=1/12*n*(3*this.radius*this.radius+this.cylinder_height*this.cylinder_height),h=.5*n*this.radius*this.radius,c=.4*a*this.radius*this.radius;return new e.Matrix3(r+c,0,0,0,h+c,0,0,0,r+c)},e.CapsuleShape.prototype.findSupportPoint=function(t,i){if(0===t.x&&0===t.z)i.x=i.z=0,i.y=t.y>0?this.half_height:-this.half_height;else{var e=Math.sqrt(t.x*t.x+t.z*t.z),o=this.radius/e;i.x=o*t.x,i.z=o*t.z,t.y>0?(i.y=this.cylinder_half_height,i.y+=this.radius*(t.y/t.length())):(i.y=-this.cylinder_half_height,i.y+=this.radius*(t.y/t.length()))}},e.CapsuleShape.prototype.sphereIntersect=function(t,i,o){var s=new e.Vector3;s.subtractVectors(i,t);var n=s.length();s.scale(1/n);var a=t.dot(s),r=t.dot(t)-o*o;if(a>=0&&r>=0)return null;var h=a*a-r;if(0>h)return null;var c=Math.sqrt(h),l=-a-c;if(0>l&&(l=-a+c),l>n)return null;var p=e.ObjectPool.getObject("RayIntersection");return p.point.scaleVector(s,l),p.t=l,p.point.add(t),p},e.CapsuleShape.prototype.rayIntersect=function(){var t=new e.Vector3,i=new e.Vector3,o=new e.Vector3;return function(s,n){t.y=this.cylinder_half_height,i.y=-this.cylinder_half_height;var a=new e.Vector3;a.subtractVectors(i,t);var r=new e.Vector3;r.subtractVectors(s,t);var h=new e.Vector3;h.subtractVectors(n,s);var c,l=r.dot(a),p=h.dot(a),_=a.dot(a),b=h.dot(h),u=r.dot(h),f=_*b-p*p,d=r.dot(r)-this.radius*this.radius,m=_*d-l*l,y=null;if(Math.abs(f)<e.EPSILON)m>0?y=null:(c=0>l?-u/b:l>_?(p-u)/b:0,c>=0&&1>=c&&(y=e.ObjectPool.getObject("RayIntersection"),y.t=c*h.length(),y.point.scaleVector(h,c),y.point.add(s)));else{var j=_*u-p*l,w=j*j-f*m;if(w>=0&&(c=(-j-Math.sqrt(w))/f,c>=0&&1>=c)){var x=l+c*p;x>=0&&_>=x&&(y=e.ObjectPool.getObject("RayIntersection"),y.t=c*h.length(),y.point.scaleVector(h,c),y.point.add(s))}}var v=null;o.copy(s),o.y-=this.cylinder_half_height;var g=this.sphereIntersect(o,n,this.radius);g&&(g.point.y+=this.cylinder_half_height,v=g),o.copy(s),o.y+=this.cylinder_half_height;var z=this.sphereIntersect(o,n,this.radius);z&&(z.point.y-=this.cylinder_half_height,(!v||z.t<v.t)&&(v=z));var V=null;return V=y&&v?y.t<v.t?y:v:y||v,V&&(V.object=this,Math.abs(V.point.y)>=this.cylinder_half_height?(o.copy(V.point),o.y+=V.point.y>0?-this.cylinder_half_height:this.cylinder_half_height,V.normal.normalizeVector(o)):(V.normal.x=V.point.x,V.normal.y=0,V.normal.z=V.point.z,V.normal.scale(1/this.radius))),V}}(),e.CompoundShape=function(){this.child_shapes=[],this.aabb=new e.AABB,this.calculateLocalAABB(this.aabb)},e.CompoundShape.prototype.addChildShape=function(t,i,o){this.child_shapes.push(new e.CompoundShapeChild(t,i,o)),this.calculateLocalAABB(this.aabb)},e.CompoundShape.prototype.calculateLocalAABB=function(t){t.min.x=t.min.y=t.min.z=1/0,t.max.x=t.max.y=t.max.z=-(1/0);var i,e;for(i=0;i<this.child_shapes.length;i++)e=this.child_shapes[i],t.min.x=Math.min(t.min.x,e.aabb.min.x),t.min.y=Math.min(t.min.y,e.aabb.min.y),t.min.z=Math.min(t.min.z,e.aabb.min.z),t.max.x=Math.max(t.max.x,e.aabb.max.x),t.max.y=Math.max(t.max.y,e.aabb.max.y),t.max.z=Math.max(t.max.z,e.aabb.max.z)},e.CompoundShape.prototype.getInertiaTensor=function(t){var i,s,n,a=new e.Matrix3,r=new e.Matrix3;for(t/=this.child_shapes.length,o.x=o.y=o.z=0,i=0;i<this.child_shapes.length;i++)s=this.child_shapes[i],o.subtract(s.position),r.e00=t*-(o.y*o.y+o.z*o.z),r.e10=t*o.x*o.y,r.e20=t*o.x*o.z,r.e01=t*o.x*o.y,r.e11=t*-(o.x*o.x+o.z*o.z),r.e21=t*o.y*o.z,r.e02=t*o.x*o.z,r.e12=t*o.y*o.z,r.e22=t*-(o.x*o.x+o.y*o.y),c.fromMatrix4(s.transform),n=s.shape.getInertiaTensor(t),c.transposeInto(l),c.multiply(n),c.multiply(l),a.e00+=c.e00+r.e00,a.e10+=c.e10+r.e10,a.e20+=c.e20+r.e20,a.e01+=c.e01+r.e01,a.e11+=c.e11+r.e11,a.e21+=c.e21+r.e21,a.e02+=c.e02+r.e02,a.e12+=c.e12+r.e12,a.e22+=c.e22+r.e22;return a},e.CompoundShape.prototype.rayIntersect=function(){var t=function(t,i){return t.t<i.t?-1:t.t>i.t?1:0};return function(i,o){var s,n,a,r=[],h=new e.Vector3,c=new e.Vector3;for(n=0;n<this.child_shapes.length;n++)a=this.child_shapes[n],a.transform_inverse.transformVector3Into(i,h),a.transform_inverse.transformVector3Into(o,c),s=a.shape.rayIntersect(h,c),null!=s&&(s.object=this,a.transform.transformVector3(s.point),r.push(s));return r.sort(t),r[0]||null}}(),e.CompoundShapeChild=function(t,i,o){this.shape=t,this.position=new e.Vector3(i.x,i.y,i.z),this.rotation=new e.Quaternion(o.x,o.y,o.z,o.w),this.transform=new e.Matrix4,this.transform_inverse=new e.Matrix4,this.transform.makeTransform(this.rotation,this.position),this.transform.invertInto(this.transform_inverse),this.aabb=new e.AABB,this.aabb.transform(this.shape.aabb,this.transform)},e.ConeShape=function(t,i){this.radius=t,this.half_height=i,this.aabb=new e.AABB,this.calculateLocalAABB(this.aabb),this._sinangle=this.radius/Math.sqrt(this.radius*this.radius+Math.pow(2*this.half_height,2)),this._cosangle=Math.cos(Math.asin(this._sinangle))},e.ConeShape.prototype.calculateLocalAABB=function(t){t.min.x=t.min.z=-this.radius,t.min.y=-this.half_height,t.max.x=t.max.z=this.radius,t.max.y=this.half_height},e.ConeShape.prototype.getInertiaTensor=function(t){var i=.1*t*Math.pow(2*this.half_height,2)+.15*t*this.radius*this.radius;return new e.Matrix3(i,0,0,0,.3*t*this.radius*this.radius,0,0,0,i)},e.ConeShape.prototype.findSupportPoint=function(t,i){var e=Math.sqrt(t.x*t.x+t.z*t.z);if(t.y>t.length()*this._sinangle)i.x=i.z=0,i.y=this.half_height;else if(e>0){var o=this.radius/e;i.x=o*t.x,i.y=-this.half_height,i.z=o*t.z}else i.x=i.z=0,i.y=-this.half_height},e.ConeShape.prototype.rayIntersect=function(){var t,i=new e.Vector3,o=new e.Vector3,s=new e.Vector3,n=new e.Vector3,a=new e.Vector3;return function(r,h){i.subtractVectors(h,r),t=i.length(),i.scale(1/t);var c,l;o.x=o.y=o.z=0,c=this._rayIntersectBase(r,h,o,n),s.x=s.y=s.z=0,l=this._rayIntersectCone(r,i,t,s,a);var p;return c||l?!l||c&&l>c?(p=e.ObjectPool.getObject("RayIntersection"),p.object=this,p.t=c,p.point.copy(o),p.normal.copy(n),p):!c||l&&c>l?(p=e.ObjectPool.getObject("RayIntersection"),p.object=this,p.t=l,p.point.copy(s),p.normal.copy(a),p):null:null}}(),e.ConeShape.prototype._rayIntersectBase=function(){var t,i=new e.Vector3(0,-1,0),o=new e.Vector3,s=new e.Vector3,n=new e.Vector3;return function(e,a,r,h){return s.x=e.x,s.y=e.y+this.half_height,s.z=e.z,n.x=a.x,n.y=a.y+this.half_height,n.z=a.z,o.subtractVectors(n,s),t=-i.dot(s)/i.dot(o),0>t||t>1?null:(r.scaleVector(o,t),r.add(e),r.x*r.x+r.z*r.z>this.radius*this.radius?null:(h.x=h.z=0,h.y=-1,t*o.length()))}}(),e.ConeShape.prototype._rayIntersectCone=function(){var t=new e.Vector3;return function(i,s,n,a,r){var h=new e.Vector3(0,-1,0),c=h.dot(s),l=this._cosangle*this._cosangle,p=new e.Vector3;p.x=i.x,p.y=i.y-this.half_height,p.z=i.z;var _,b,u=h.dot(p),f=s.dot(p),d=p.dot(p),m=c*c-l,y=c*u-l*f,j=u*u-l*d,w=null;if(Math.abs(m)>=e.EPSILON){var x=y*y-j*m;if(x<-e.EPSILON)return null;if(x>e.EPSILON){var v=Math.sqrt(x),g=1/m;if(b=(-y-v)*g,b>=0&&n>=b&&(t.scaleVector(s,b),t.add(i),p.y=t.y-this.half_height,_=p.dot(h),_>=0&&(w=b,a.copy(t))),b=(-y+v)*g,b>=0&&n>=b&&(null==w||w>b)&&(t.scaleVector(s,b),t.add(i),p.y=t.y-this.half_height,_=p.dot(h),_>=0&&(w=b,a.copy(t))),null==w)return null;w/=n}else{if(b=-y/m,t.scaleVector(s,b),t.add(i),p.y=t.y-this.half_height,_=p.dot(h),0>_)return null;if(o.subtractVectors(t,i),o.lengthSquared()>n*n)return null;w=b/n,a.copy(t)}}else{if(!(Math.abs(y)>=e.EPSILON))return null;if(b=.5*j/y,t.scaleVector(s,b),t.add(i),p.y=t.y-this.half_height,_=p.dot(h),0>_)return null;w=b,a.copy(t)}return a.y<-this.half_height?null:(r.x=a.x,r.y=0,r.z=a.z,r.normalize(),r.x*=2*this.half_height/this.radius,r.y=this.radius/(2*this.half_height),r.z*=2*this.half_height/this.radius,r.normalize(),w*n)}}(),e.ConvexShape=function(t){this.vertices=[],this.faces=[],this.volume=0,this.center_of_mass=new e.Vector3,this._integral=new Float32Array(10),this.process(t),this.aabb=new e.AABB,this.calculateLocalAABB(this.aabb)},e.ConvexShape.prototype.process=function(t){for(var i=t.slice(),n=null,a=null,r=0;r<i.length;r++){var h=i[r];(null==n||n.x>h.x)&&(n=h),(null==a||a.x>h.x)&&(a=h)}n===a&&(a=t[0]===n?t[1]:t[0]);var c=n,l=a;i.splice(i.indexOf(c),1),i.splice(i.indexOf(l),1);var p,_,b=-(1/0),u=null;for(r=0;r<i.length;r++)p=i[r],_=e.GeometryMethods.findSquaredDistanceFromSegment(p,c,l),_>b&&(b=_,u=r);var f=i[u];for(i.splice(u,1),o.subtractVectors(l,c),s.subtractVectors(f,c),o.cross(s),b=-(1/0),u=null,r=0;r<i.length;r++)p=i[r],_=Math.abs(o.dot(p)),_>b&&(b=_,u=r);var d=i[u];if(i.splice(u,1),o.dot(d)>0){var m=c;c=f,f=m}var y=new e.GjkEpa.Polyhedron({points:[{point:f},{point:l},{point:c},{point:d}]});for(r=0;r<i.length;r++){y.closest_face=null;for(var j=0;j<y.faces.length;j++)if(y.faces[j].active===!0&&y.faces[j].classifyVertex({point:i[r]})>0){y.closest_face=j;break}null!=y.closest_face&&y.addVertex({point:i[r]})}this.faces=y.faces.filter(function(t){return t.active});var w=this;this.faces.forEach(function(t){var i=t.a.point,e=t.b.point,o=t.c.point,s=w.vertices.indexOf(i),n=w.vertices.indexOf(e),a=w.vertices.indexOf(o);-1===s&&w.vertices.push(i),-1===n&&w.vertices.push(e),-1===a&&w.vertices.push(o)}),this.computeVolume(this.faces)},e.ConvexShape.prototype.calculateLocalAABB=function(t){t.min.x=t.min.y=t.min.z=0,t.max.x=t.max.y=t.max.z=0;for(var i=0;i<this.vertices.length;i++)t.min.x=Math.min(t.min.x,this.vertices[i].x),t.min.y=Math.min(t.min.y,this.vertices[i].y),t.min.z=Math.min(t.min.z,this.vertices[i].z),t.max.x=Math.max(t.max.x,this.vertices[i].x),t.max.y=Math.max(t.max.y,this.vertices[i].y),t.max.z=Math.max(t.max.z,this.vertices[i].z)},e.ConvexShape.prototype.computeVolume=function(){var t={point:new e.Vector3},i=new Float32Array(6),o=function(t,e,o){var s=t+e,n=t*t,a=n+e*s;i[0]=s+o,i[1]=a+o*i[0],i[2]=t*n+e*a+o*i[1],i[3]=i[1]+t*(i[0]+t),i[4]=i[1]+e*(i[0]+e),i[5]=i[1]+o*(i[0]+o)};return function(e){for(var s=0;s<e.length;s++){var n=e[s],a=n.a.point,r=n.b.point,h=n.c.point,c=r.x-a.x,l=r.y-a.y,p=r.z-a.z,_=h.x-a.x,b=h.y-a.y,u=h.z-a.z,f=l*u-b*p,d=_*p-c*u,m=c*b-_*l;o(a.x,r.x,h.x);var y=i[0],j=i[1],w=i[2],x=i[3],v=i[4],g=i[5];o(a.y,r.y,h.y);var z=(i[0],i[1]),V=i[2],S=i[3],B=i[4],C=i[5];o(a.z,r.z,h.z);var M=(i[0],i[1]),P=i[2],O=i[3],I=i[4],A=i[5],T=n.classifyVertex(t)>0?-1:1;this._integral[0]+=T*f*y,this._integral[1]+=T*f*j,this._integral[2]+=T*d*z,this._integral[3]+=T*m*M,this._integral[4]+=T*f*w,this._integral[5]+=T*d*V,this._integral[6]+=T*m*P,this._integral[7]+=T*f*(a.y*x+r.y*v+h.y*g),this._integral[8]+=T*d*(a.z*S+r.z*B+h.z*C),this._integral[9]+=T*m*(a.x*O+r.x*I+h.x*A)}this._integral[0]*=1/6,this._integral[1]*=1/24,this._integral[2]*=1/24,this._integral[3]*=1/24,this._integral[4]*=1/60,this._integral[5]*=1/60,this._integral[6]*=1/60,this._integral[7]*=1/120,this._integral[8]*=1/120,this._integral[9]*=1/120,this.volume=this._integral[0],this.center_of_mass.x=this._integral[1]/this.volume,this.center_of_mass.y=this._integral[2]/this.volume,this.center_of_mass.z=this._integral[3]/this.volume}}(),e.ConvexShape.prototype.getInertiaTensor=function(){return function(t){var i=new e.Matrix3;return t/=this.volume,i.e00=(this._integral[5]+this._integral[6])*t,i.e11=(this._integral[4]+this._integral[6])*t,i.e22=(this._integral[4]+this._integral[5])*t,i.e10=i.e01=-this._integral[7]*t,i.e21=i.e12=-this._integral[8]*t,i.e20=i.e02=-this._integral[9]*t,i.e00-=t*(this.center_of_mass.y*this.center_of_mass.y+this.center_of_mass.z*this.center_of_mass.z),i.e11-=t*(this.center_of_mass.x*this.center_of_mass.x+this.center_of_mass.z*this.center_of_mass.z),i.e22-=t*(this.center_of_mass.x*this.center_of_mass.x+this.center_of_mass.y*this.center_of_mass.y),i.e10+=t*this.center_of_mass.x*this.center_of_mass.y,i.e01+=t*this.center_of_mass.x*this.center_of_mass.y,i.e21+=t*this.center_of_mass.y*this.center_of_mass.z,i.e12+=t*this.center_of_mass.y*this.center_of_mass.z,i.e20+=t*this.center_of_mass.x*this.center_of_mass.z,i.e02+=t*this.center_of_mass.x*this.center_of_mass.z,i}}(),e.ConvexShape.prototype.findSupportPoint=function(t,i){for(var e,o,s=-(1/0),n=0;n<this.vertices.length;n++)o=this.vertices[n].dot(t),o>s&&(s=o,e=n);i.copy(this.vertices[e])},e.ConvexShape.prototype.rayIntersect=function(){{var t,i,o=new e.Vector3,s=new e.Vector3,n=new e.Vector3,a=new e.Vector3,r=new e.Vector3,h=new e.Vector3;new e.Vector3,new e.Vector3}return function(c,l){t=0,o.subtractVectors(l,c),i=o.length(),o.scale(1/i);for(var p=0;p<this.faces.length;p++){var _=this.faces[p];s.subtractVectors(_.b.point,_.a.point),n.subtractVectors(_.c.point,_.a.point),a.crossVectors(o,n);var b=s.dot(a);if(!(b<e.EPSILON)){var u=1/b;r.subtractVectors(c,_.a.point);var f=u*r.dot(a);if(!(0>f)){h.crossVectors(r,s);var d=u*o.dot(h);if(!(0>d||f+d>1)){var m=u*n.dot(h);if(!(t>m||m>i)){var y=e.ObjectPool.getObject("RayIntersection");return y.object=this,y.t=m,y.point.scaleVector(o,m),y.point.add(c),y.normal.copy(_.normal),y}}}}}return null}}(),e.CylinderShape=function(t,i){this.radius=t,this.half_height=i,this.aabb=new e.AABB,this.calculateLocalAABB(this.aabb)},e.CylinderShape.prototype.calculateLocalAABB=function(t){t.min.x=t.min.z=-this.radius,t.min.y=-this.half_height,t.max.x=t.max.z=this.radius,t.max.y=this.half_height},e.CylinderShape.prototype.getInertiaTensor=function(t){var i=.0833*t*(3*this.radius*this.radius+(this.half_height+this.half_height)*(this.half_height+this.half_height));return new e.Matrix3(i,0,0,0,.5*t*this.radius*this.radius,0,0,0,i)},e.CylinderShape.prototype.findSupportPoint=function(t,i){if(i.y=t.y<0?-this.half_height:this.half_height,0===t.x&&0===t.z)i.x=i.z=0;else{var e=Math.sqrt(t.x*t.x+t.z*t.z),o=this.radius/e;i.x=o*t.x,i.z=o*t.z}},e.CylinderShape.prototype.rayIntersect=function(){var t=new e.Vector3,i=new e.Vector3;return function(o,s){t.y=this.half_height,i.y=-this.half_height;var n=new e.Vector3;n.subtractVectors(i,t);var a=new e.Vector3;a.subtractVectors(o,t);var r=new e.Vector3;r.subtractVectors(s,o);var h=a.dot(n),c=r.dot(n),l=n.dot(n);if(0>h&&0>h+c)return null;if(h>l&&h+c>l)return null;var p,_,b=r.dot(r),u=a.dot(r),f=l*b-c*c,d=a.dot(a)-this.radius*this.radius,m=l*d-h*h;if(Math.abs(f)<e.EPSILON){if(m>0)return null;p=0>h?-u/b:h>l?(c-u)/b:0}else{var y=l*u-c*h,j=y*y-f*m;if(0>j)return null;if(_=p=(-y-Math.sqrt(j))/f,0>h+p*c){if(0>=c)return null;if(p=-h/c,!(0>=d+p*(2*u+p*b)))return null;_=p}else if(h+p*c>l){if(c>=0)return null;if(p=(l-h)/c,!(0>=d+l-2*h+p*(2*(u-c)+p*b)))return null;_=p}if(p=_,0>p||p>1)return null}var w=e.ObjectPool.getObject("RayIntersection");return w.object=this,w.t=p*r.length(),w.point.scaleVector(r,p),w.point.add(o),Math.abs(w.point.y-this.half_height)<=e.EPSILON?(w.normal.x=w.normal.z=0,w.normal.y=w.point.y<0?-1:1):(w.normal.y=0,w.normal.x=w.point.x,w.normal.z=w.point.z,w.normal.scale(1/this.radius)),w}}(),e.MeshShape=function(t,i){this.vertices=t,this.triangles=[];for(var o=0;o<i.length;o+=3)this.triangles.push(new e.TriangleShape(t[i[o]],t[i[o+1]],t[i[o+2]]));this.volume=0,this.center_of_mass=new e.Vector3,this._integral=new Float32Array(10),this.hierarchy=new e.BVH(this.triangles).tree;var s=this.triangles.map(function(t){return new e.GjkEpa.Face(null,{point:t.a},{point:t.b},{point:t.c})});e.ConvexShape.prototype.computeVolume.call(this,s),this.aabb=new e.AABB,this.calculateLocalAABB(this.aabb)},e.MeshShape.prototype.calculateLocalAABB=function(t){t.min.x=t.min.y=t.min.z=0,t.max.x=t.max.y=t.max.z=0;for(var i=0;i<this.vertices.length;i++)t.min.x=Math.min(t.min.x,this.vertices[i].x),t.min.y=Math.min(t.min.y,this.vertices[i].y),t.min.z=Math.min(t.min.z,this.vertices[i].z),t.max.x=Math.max(t.max.x,this.vertices[i].x),t.max.y=Math.max(t.max.y,this.vertices[i].y),t.max.z=Math.max(t.max.z,this.vertices[i].z)},e.MeshShape.prototype.getInertiaTensor=function(t){return e.ConvexShape.prototype.getInertiaTensor.call(this,t)},e.MeshShape.prototype.findSupportPoint=function(t,i){},e.MeshShape.prototype.rayIntersect=function(){var t=[],i=function(t,i){return t.t<i.t?-1:t.t>i.t?1:0};return function(e,o){var s,n=[this.hierarchy];t.length=0;for(var a=0;n.length>0;)if(a++,s=n.shift(),s.aabb.testRayIntersect(e,o))if(s.isLeaf()){var r=s.object.rayIntersect(e,o);null!=r&&t.push(r)}else n.push(s.left,s.right);return t.sort(i),t[0]||null}}(),e.PlaneShape=function(t,i,o){this.orientation=t,this.half_width=i,this.half_length=o,this.aabb=new e.AABB,this.calculateLocalAABB(this.aabb),0===this.orientation?(this._half_width=0,this._half_height=this.half_width,this._half_depth=this.half_length):1===this.orientation?(this._half_width=this.half_width,this._half_height=0,this._half_depth=this.half_length):(this._half_width=this.half_width,this._half_height=this.half_length,this._half_depth=0)},e.PlaneShape.prototype.calculateLocalAABB=function(t){0===this.orientation?(this._half_width=0,this._half_height=this.half_width,this._half_depth=this.half_length,t.min.x=0,t.min.y=-this.half_width,t.min.z=-this.half_length,t.max.x=0,t.max.y=this.half_width,t.max.z=this.half_length):1===this.orientation?(this._half_width=this.half_width,this._half_height=0,this._half_depth=this.half_length,t.min.x=-this.half_width,t.min.y=0,t.min.z=-this.half_length,t.max.x=this.half_width,t.max.y=0,t.max.z=this.half_length):(this._half_width=this.half_width,this._half_height=this.half_length,this._half_depth=0,t.min.x=-this.half_width,t.min.y=-this.half_length,t.min.z=0,t.max.x=this.half_width,t.max.y=this.half_length,t.max.z=0)},e.PlaneShape.prototype.getInertiaTensor=function(t){var i=this.half_width*this.half_width*4,o=this.half_length*this.half_length*4,s=.0833*t,n=s*o,a=s*(i+o),r=s*i;return 0===this.orientation?new e.Matrix3(a,0,0,0,n,0,0,0,r):1===this.orientation?new e.Matrix3(n,0,0,0,a,0,0,0,r):new e.Matrix3(a,0,0,0,r,0,0,0,n)},e.PlaneShape.prototype.findSupportPoint=function(t,i){i.x=t.x<0?-this._half_width:this._half_width,i.y=t.y<0?-this._half_height:this._half_height,i.z=t.z<0?-this._half_depth:this._half_depth},e.PlaneShape.prototype.rayIntersect=function(){var t,i=new e.Vector3,o=new e.Vector3,s=new e.Vector3;return function(n,a){if(0===this.orientation?(i.x=1,i.y=i.z=0):1===this.orientation?(i.y=1,i.x=i.z=0):(i.z=1,i.x=i.y=0),o.subtractVectors(a,n),t=-i.dot(n)/i.dot(o),0>t||t>1)return null;if(s.scaleVector(o,t),s.add(n),s.x<-this._half_width||s.x>this._half_width)return null;if(s.y<-this._half_height||s.y>this._half_height)return null;if(s.z<-this._half_depth||s.z>this._half_depth)return null;var r=e.ObjectPool.getObject("RayIntersection");return r.object=this,r.t=t*o.length(),r.point.copy(s),r.normal.copy(i),r}}(),e.SphereShape=function(t){this.radius=t,this.aabb=new e.AABB,this.calculateLocalAABB(this.aabb)},e.SphereShape.prototype.calculateLocalAABB=function(t){t.min.x=t.min.y=t.min.z=-this.radius,t.max.x=t.max.y=t.max.z=this.radius},e.SphereShape.prototype.getInertiaTensor=function(t){var i=.4*t*this.radius*this.radius;return new e.Matrix3(i,0,0,0,i,0,0,0,i)},e.SphereShape.prototype.findSupportPoint=function(){var t=new e.Vector3;return function(i,e){t.normalizeVector(i),e.scaleVector(t,this.radius)}}(),e.SphereShape.prototype.rayIntersect=function(){var t,i=new e.Vector3;return function(o,s){i.subtractVectors(s,o),t=i.length(),i.scale(1/t);var n=o.dot(i),a=o.dot(o)-this.radius*this.radius;if(n>=0&&a>=0)return null;var r=n*n-a;if(0>r)return null;var h=Math.sqrt(r),c=-n-h;if(0>c&&(c=-n+h),c>t)return null;var l=e.ObjectPool.getObject("RayIntersection");return l.object=this,l.point.scaleVector(i,c),l.t=c,l.point.add(o),l.normal.normalizeVector(l.point),l}}(),e.TriangleShape=function(t,i,n){this.a=t,this.b=i,this.c=n,this.normal=new e.Vector3,o.subtractVectors(this.b,this.a),s.subtractVectors(this.c,this.a),this.normal.crossVectors(o,s),this.volume=this.normal.length()/2,this.normal.normalize(),this.aabb=new e.AABB,this.calculateLocalAABB(this.aabb)},e.TriangleShape.prototype.calculateLocalAABB=function(t){t.min.x=Math.min(this.a.x,this.b.x,this.c.x),t.min.y=Math.min(this.a.y,this.b.y,this.c.y),t.min.z=Math.min(this.a.z,this.b.z,this.c.z),t.max.x=Math.max(this.a.x,this.b.x,this.c.x),t.max.y=Math.max(this.a.y,this.b.y,this.c.y),t.max.z=Math.max(this.a.z,this.b.z,this.c.z)},e.TriangleShape.prototype.getInertiaTensor=function(t){return new e.Matrix3(0,0,0,0,0,0,0,0,0)},e.TriangleShape.prototype.classifyVertex=function(t){var i=this.normal.dot(this.a);return this.normal.dot(t)-i},e.TriangleShape.prototype.findSupportPoint=function(t,i){var e,o=-(1/0);e=t.dot(this.a),e>o&&(i.copy(this.a),o=e),e=t.dot(this.b),e>o&&(i.copy(this.b),o=e),e=t.dot(this.c),e>o&&i.copy(this.c)},e.TriangleShape.prototype.rayIntersect=function(){var t=new e.Vector3,i=new e.Vector3,o=new e.Vector3,s=new e.Vector3,n=new e.Vector3,a=new e.Vector3;return function(r,h){t.subtractVectors(this.b,this.a),i.subtractVectors(this.c,this.a),o.crossVectors(t,i),s.subtractVectors(h,r);var c=-s.dot(o);if(0>=c)return null;n.subtractVectors(r,this.a);var l=n.dot(o)/c;if(0>l||l>1)return null;a.crossVectors(n,s);var p=i.dot(a)/c,_=-t.dot(a)/c;if(p+_>1||0>p||0>_)return null;var b=e.ObjectPool.getObject("RayIntersection");return b.object=this,b.t=l*s.length(),b.point.scaleVector(s,l),b.point.add(r),b.normal.copy(this.normal),b}}(),e.CollisionUtils={},e.CollisionUtils.canBodiesCollide=function(t,i){if(t._mass===1/0&&i._mass===1/0)return!1;if(0!==t.collision_mask)if(0===(1&t.collision_mask)){if(0!==(t.collision_mask&i.collision_groups))return!1}else if(0===(t.collision_mask&i.collision_groups))return!1;if(0!==i.collision_mask)if(0===(1&i.collision_mask)){if(0!==(i.collision_mask&t.collision_groups))return!1}else if(0===(i.collision_mask&t.collision_groups))return!1;return!0},e.GeometryMethods={findClosestPointInTriangle:function(){var t=new e.Vector3,i=new e.Vector3,o=new e.Vector3;return function(e,s,n,a,r){var h;t.subtractVectors(n,s),i.subtractVectors(a,s),o.subtractVectors(e,s);var c=t.dot(o),l=i.dot(o);if(0>=c&&0>=l)return void r.copy(s);o.subtractVectors(e,n);var p=t.dot(o),_=i.dot(o);if(p>=0&&p>=_)return void r.copy(n);var b=c*_-p*l;if(0>=b&&c>=0&&0>=p)return h=c/(c-p),r.scaleVector(t,h),void r.add(s);o.subtractVectors(e,a);var u=t.dot(o),f=i.dot(o);if(f>=0&&f>=u)return void r.copy(a);var d,m=u*l-c*f;if(0>=m&&l>=0&&0>=f)return d=l/(l-f),r.scaleVector(i,d),void r.add(s);var y=p*f-u*_;if(0>=y&&_-p>=0&&u-f>=0)return d=(_-p)/(_-p+(u-f)),r.subtractVectors(a,n),r.scale(d),void r.add(n);var j=1/(y+m+b);h=m*j,d=b*j,t.scale(h),t.add(s),i.scale(d),r.addVectors(t,i)}}(),findBarycentricCoordinates:function(t,i,o,s,n){var a=new e.Vector3,r=new e.Vector3,h=new e.Vector3;a.subtractVectors(o,i),r.subtractVectors(s,i),h.subtractVectors(t,i);var c=a.dot(a),l=a.dot(r),p=r.dot(r),_=h.dot(a),b=h.dot(r),u=c*p-l*l;n.y=(p*_-l*b)/u,n.z=(c*b-l*_)/u,n.x=1-n.y-n.z},findSquaredDistanceFromSegment:function(){var t=new e.Vector3,i=new e.Vector3,o=new e.Vector3;return function(e,s,n){t.subtractVectors(s,n),i.subtractVectors(s,e),o.subtractVectors(n,e);var a=i.dot(t);if(0>=a)return i.dot(i);var r=t.dot(t);return a>=r?o.dot(o):i.dot(i)-a*a/r}}(),findClosestPointsOnSegments:function(){var t=new e.Vector3,i=new e.Vector3,s=new e.Vector3,n=function(t,i,e){return Math.min(Math.max(t,i),e)};return function(a,r,h,c,l,p){t.subtractVectors(r,a),i.subtractVectors(c,h),s.subtractVectors(a,h);var _,b,u=t.dot(t),f=i.dot(i),d=i.dot(s);if(u<=e.EPSILON&&f<=e.EPSILON)return _=b=0,l.copy(a),p.copy(h),o.subtractVectors(l,p),o.dot(o);if(u<=e.EPSILON)_=0,b=d/f,b=n(b,0,1);else{var m=t.dot(s);if(f<=e.EPSILON)b=0,_=n(-m/u,0,1);else{var y=t.dot(i),j=u*f-y*y;_=0!==j?n((y*d-m*f)/j,0,1):0,b=(y*_+d)/f,0>b?(b=0,_=n(-m/u,0,1)):b>1&&(b=1,_=n((y-m)/u,0,1))}}return l.scaleVector(t,_),l.add(a),p.scaleVector(i,b),p.add(h),o.subtractVectors(l,p),o.dot(o)}}()},function(){e.MinHeap=function(t){this.heap=null==t?[]:t.slice(),this.heap.length>0&&this.heapify()},e.MinHeap.prototype={heapify:function(){for(var t=~~((this.heap.length-2)/2);t>=0;)this.siftUp(t,this.heap.length-1),t--},siftUp:function(t,i){for(var e=t;i>=2*e+1;){var o=2*e+1;if(i>=o+1&&this.heap[o+1].valueOf()<this.heap[o].valueOf()&&o++,!(this.heap[o].valueOf()<this.heap[e].valueOf()))return;var s=this.heap[o];this.heap[o]=this.heap[e],this.heap[e]=s,e=o}},push:function(t){this.heap.push(t);for(var i=this.heap.length-1;0!==i;){var e=~~((i-1)/2);if(this.heap[e].valueOf()>this.heap[i].valueOf()){var o=this.heap[e];this.heap[e]=this.heap[i],this.heap[i]=o}i=e}},peek:function(){return this.heap.length>0?this.heap[0]:null},pop:function(){var t=this.heap[0];return this.heap[0]=this.heap[this.heap.length-1],this.heap.length=this.heap.length-1,this.siftUp(0,this.heap.length-1),t}}}(),e.Utility={getUid:function(){var t=0;return function(){return t++}}()},e.AABB=function(t,i){this.min=t||new e.Vector3,this.max=i||new e.Vector3},e.AABB.prototype.copy=function(t){this.min.x=t.min.x,this.min.y=t.min.y,this.min.z=t.min.z,this.max.x=t.max.x,this.max.y=t.max.y,this.max.z=t.max.z},e.AABB.prototype.combineAABBs=function(t,i){this.min.x=Math.min(t.min.x,i.min.x),this.min.y=Math.min(t.min.y,i.min.y),this.min.z=Math.min(t.min.z,i.min.z),this.max.x=Math.max(t.max.x,i.max.x),this.max.y=Math.max(t.max.y,i.max.y),this.max.z=Math.max(t.max.z,i.max.z)},e.AABB.prototype.transform=function(){var t=new e.Vector3,i=new e.Vector3,s=new e.Vector3,n=new e.Vector3,a=new e.Matrix3;return function(e,r){t.subtractVectors(e.max,e.min),t.scale(.5),i.addVectors(e.max,e.min),i.scale(.5),r.transformVector3Into(i,s),a.e00=Math.abs(r.e00),a.e01=Math.abs(r.e01),a.e02=Math.abs(r.e02),a.e10=Math.abs(r.e10),a.e11=Math.abs(r.e11),a.e12=Math.abs(r.e12),a.e20=Math.abs(r.e20),a.e21=Math.abs(r.e21),a.e22=Math.abs(r.e22),o.x=a.e00,o.y=a.e10,o.z=a.e20,n.x=t.dot(o),o.x=a.e01,o.y=a.e11,o.z=a.e21,n.y=t.dot(o),o.x=a.e02,o.y=a.e12,o.z=a.e22,n.z=t.dot(o),this.min.subtractVectors(s,n),this.max.addVectors(s,n)}}(),e.AABB.prototype.intersects=function(t){return this.max.x<t.min.x||this.max.y<t.min.y||this.max.z<t.min.z||this.min.x>t.max.x||this.min.y>t.max.y||this.min.z>t.max.z?!1:!0},e.AABB.prototype.testRayIntersect=function(){var t,i,o,s,n,a=new e.Vector3;return function(r,h){t=0,a.subtractVectors(h,r),i=a.length(),a.scale(1/i);var c,l;if(c=this.min.x,l=this.max.x,Math.abs(a.x)<e.EPSILON){if(r.x<c||r.x>l)return!1}else if(o=1/a.x,s=(c-r.x)*o,n=(l-r.x)*o,s>n&&(o=s,s=n,n=o),t=Math.max(t,s),i=Math.min(i,n),t>i)return!1;if(c=this.min.y,l=this.max.y,Math.abs(a.y)<e.EPSILON){if(r.y<c||r.y>l)return!1}else if(o=1/a.y,s=(c-r.y)*o,n=(l-r.y)*o,s>n&&(o=s,s=n,n=o),t=Math.max(t,s),i=Math.min(i,n),t>i)return!1;if(c=this.min.z,l=this.max.z,Math.abs(a.z)<e.EPSILON){if(r.z<c||r.z>l)return!1}else if(o=1/a.z,s=(c-r.z)*o,n=(l-r.z)*o,s>n&&(o=s,s=n,n=o),t=Math.max(t,s),i=Math.min(i,n),t>i)return!1;return!0}}(),function(){function t(t){var i=t.max.x-t.min.x,e=t.max.y-t.min.y,o=t.max.z-t.min.z;return i*(e+o)+e*o}var i=function(t){this.aabb=new e.AABB,this.area=0,this.parent=null,this.left=null,this.right=null,this.morton=null,this.object=t||null};i.prototype={isLeaf:function(){return null!=this.object},computeBounds:function(i){this.isLeaf()?this.aabb.copy(this.object.aabb):this.aabb.combineAABBs(this.left.aabb,this.right.aabb),this.area=t(this.aabb)},valueOf:function(){return this.area}};var o=function(){function o(t){return t=4278190335&(t^t<<16),t=50393103&(t^t<<8),t=51130563&(t^t<<4),t=153391689&(t^t<<2)}function s(t,i,e){return(o(e)<<2)+(o(i)<<1)+o(t)}var n=new e.AABB,a=function(t,i){for(var e=t.max.x-t.min.x,o=t.max.y-t.min.y,n=t.max.z-t.min.z,r=512,h=r/e,c=r/o,l=r/n,p=0;p<i.length;p++){var _=i[p],b=(_.aabb.max.x-_.aabb.min.x)/2+_.aabb.min.x,u=(_.aabb.max.y-_.aabb.min.y)/2+_.aabb.min.y,f=(_.aabb.max.z-_.aabb.min.z)/2+_.aabb.min.z;_.morton=s((b+t.min.x)*h,(u+t.min.y)*c,(f+t.min.z)*l)}i.sort(a.mortonSort);var d=a.buildTree(i,29);return a.combineCluster(d,1),d};return a.mortonSort=function(t,i){return t.morton<i.morton?-1:t.morton>i.morton?1:0},a.clusterReductionCount=function(t){var i=Math.pow(t,.5)/2,e=.5;return Math.max(i*Math.pow(t,e),1)},a.buildTree=function(t,i){var e=[];if(t.length<a.max_bucket_size)e.push.apply(e,t),a.combineCluster(e,a.clusterReductionCount(a.max_bucket_size));else{var o=[],s=[];if(1>i)o=t.slice(0,t.length/2),s=t.slice(t.length/2);else for(var n=1<<i,r=0;r<t.length;r++){var h=t[r];h.morton&n?s.push(h):o.push(h)}e.push.apply(e,a.buildTree(o,i-1)),e.push.apply(e,a.buildTree(s,i-1)),a.combineCluster(e,a.clusterReductionCount(e.length))}return e},a.combineCluster=function(t,o){if(t.length<=1)return t;for(var s,n=new e.MinHeap,r=0;r<t.length;r++)s=new i,s.left=t[r],s.right=a.findBestMatch(t,t[r]),s.computeBounds(),n.push(s);for(var h;t.length>o;)for(h=n.pop(),t.splice(t.indexOf(h.left),1),t.splice(t.indexOf(h.right),1),t.push(h),n.heap.length=0,r=0;r<t.length;r++)s=new i,s.left=t[r],s.right=a.findBestMatch(t,t[r]),s.computeBounds(),n.push(s)},a.findBestMatch=function(i,e){for(var o,s=1/0,a=0,r=0;r<i.length;r++)i[r]!==e&&(n.combineAABBs(e.aabb,i[r].aabb),o=t(n),s>o&&(s=o,a=r));return i[a]},a.max_bucket_size=20,a}();e.BVH=function(t){for(var s=[],n=new e.AABB,a=0;a<t.length;a++){n.combineAABBs(n,t[a].aabb);var r=new i(t[a]);r.computeBounds(),s.push(r)}this.tree=o(n,s)[0]},e.BVH.AAC=o}(),e.CharacterController=function(t,i){if(!t.broadphase)throw new Error("CharacterController requires a GoblinPhysics world with a broadphase!");this.world=t,i=i||{};var o=i.radius||2,s=i.height||6;this.shape=new e.CapsuleShape(o,s),this.body=new e.RigidBody(this.shape,i.mass||1),this.body.angular_factor=i.allowYRotation===!0?new e.Vector3(0,1,0):new e.Vector3(0,0,0),this.moveSpeed=i.moveSpeed||50,this.maxSpeed=i.maxSpeed||50,this.stopFactor=i.stopFactor||.9,this.stoppingThreshold=i.stoppingThreshold||.1,this.jumpForce=i.jumpForce||60,this.airAcceleration=i.airAccleration||.3,this.groundAcceleration=i.groundAccleration||.3,this._inputDirection=new e.Vector3,this._hasInputThisFrame=!1,this.contactNormal=new e.Vector3(0,1,0),this.tempVector=new e.Vector3,this.moveVector=new e.Vector3,this.projectedMove=new e.Vector3,this.rideHeight=i.rideHeight||4,this.rayLength=i.rayLength||2*this.body.shape.half_height,this.springStrength=i.springStrength||10,this.springDamping=i.springDamping||.3,this.states={},this.currentState=null,this._lastStateChange={from:null,to:null,time:Date.now()},this._lastGroundHit=null,this._lastHeightError=null,this._lastSpringForce=null,this._lastMoveDelta=new e.Vector3,this._lastProjectedMove=new e.Vector3,this._initializeStates(),this.changeState("falling")},e.CharacterController.prototype._initializeStates=function(){this.states.falling={name:"falling",enter:function(){}.bind(this),update:function(t){return this.updateGroundSpring(),this._hasInputThisFrame&&this.move(this._inputDirection,t),this._lastGroundHit?"grounded":void 0}.bind(this),exit:function(){}.bind(this)},this.states.grounded={name:"grounded",enter:function(){}.bind(this),update:function(t){if(this.updateGroundSpring(),this._jumpRequested)return this._jumpRequested=!1,"jumping";if(this._hasInputThisFrame)this.move(this._inputDirection,t);else{var i=Math.sqrt(this.body.linear_velocity.x*this.body.linear_velocity.x+this.body.linear_velocity.z*this.body.linear_velocity.z);i>this.stoppingThreshold?(this.body.linear_velocity.x*=this.stopFactor,this.body.linear_velocity.z*=this.stopFactor):(this.body.linear_velocity.x=0,this.body.linear_velocity.z=0)}return this._lastGroundHit?void 0:"falling"}.bind(this),exit:function(){}.bind(this)},this.states.jumping={name:"jumping",enter:function(){this.body.linear_velocity.y=0,this.body.linear_velocity.y=this.jumpForce}.bind(this),update:function(t){return this._hasInputThisFrame&&this.move(this._inputDirection,t),this.body.linear_velocity.y<=0?"falling":void 0}.bind(this),exit:function(){}.bind(this)}},e.CharacterController.prototype.wishJump=function(){this.currentState&&"grounded"===this.currentState.name&&(this._jumpRequested=!0)},e.CharacterController.prototype.changeState=function(t){var i=this.states[t];if(!i)throw new Error("Invalid state: "+t);this.currentState&&this.currentState.exit.call(this),this._lastStateChange={from:this.currentState?this.currentState.name:null,to:i.name,time:Date.now()},this.currentState=i,
5
+ this.currentState.enter.call(this)},e.CharacterController.prototype.handleInput=function(t){t&&t.lengthSquared()>0?(this._inputDirection.copy(t),this._hasInputThisFrame=!0):(this._inputDirection.set(0,0,0),this._hasInputThisFrame=!1)},e.CharacterController.prototype.update=function(t){if(this.currentState){var i=this.currentState.update.call(this,t);i&&i!==this.currentState.name&&this.changeState(i)}this._hasInputThisFrame=!1},e.CharacterController.prototype.updateGroundSpring=function(){var t=new e.Vector3(this.body.position.x,this.body.position.y-this.body.shape.half_height-1e-5,this.body.position.z),i=new e.Vector3(t.x,t.y-this.rayLength,t.z),o=this.world.broadphase.rayIntersect(t,i);if(o.length>0){var s=o[0];this._lastGroundHit=s,this.contactNormal.copy(s.normal);var n=this.rideHeight-s.t,a=this.body.linear_velocity.y,r=n*this.springStrength-a*this.springDamping;this._lastHeightError=n,this._lastSpringForce=r,this.body.applyForce(new e.Vector3(0,r,0));for(var h=0;h<o.length;h++)e.ObjectPool.freeObject("RayIntersection",o[h])}else this._lastGroundHit=null,this._lastHeightError=null,this._lastSpringForce=null,this.contactNormal.set(0,1,0)},e.CharacterController.prototype.move=function(t,i){if(this.moveVector.copy(t),this.moveVector.scale(this.moveSpeed),this._lastMoveDelta.copy(this.moveVector),"falling"===this.currentState.name||"jumping"===this.currentState.name){var e=this.body.linear_velocity.y;this.body.linear_velocity.x+=(this.moveVector.x-this.body.linear_velocity.x)*this.airAcceleration,this.body.linear_velocity.z+=(this.moveVector.z-this.body.linear_velocity.z)*this.airAcceleration,this.body.linear_velocity.y=e}else{var o=this.moveVector.dot(this.contactNormal);this.projectedMove.copy(this.moveVector),this.tempVector.copy(this.contactNormal),this.tempVector.scale(o),this.projectedMove.subtract(this.tempVector),this._lastProjectedMove.copy(this.projectedMove),this.body.linear_velocity.x+=(this.projectedMove.x-this.body.linear_velocity.x)*this.groundAcceleration,this.body.linear_velocity.z+=(this.projectedMove.z-this.body.linear_velocity.z)*this.groundAcceleration}var s=Math.sqrt(this.body.linear_velocity.x*this.body.linear_velocity.x+this.body.linear_velocity.z*this.body.linear_velocity.z);if(s>this.maxSpeed){var n=this.maxSpeed/s;this.body.linear_velocity.x*=n,this.body.linear_velocity.z*=n}},e.CharacterController.prototype.getDebugInfo=function(){var t={position:{x:this.body.position.x,y:this.body.position.y,z:this.body.position.z},velocity:{x:this.body.linear_velocity.x,y:this.body.linear_velocity.y,z:this.body.linear_velocity.z}},i={input_direction:this._hasInputThisFrame?{x:this._inputDirection.x,y:this._inputDirection.y,z:this._inputDirection.z}:null,raw_move:{x:this._lastMoveDelta.x,y:this._lastMoveDelta.y,z:this._lastMoveDelta.z},projected_move:{x:this._lastProjectedMove.x,y:this._lastProjectedMove.y,z:this._lastProjectedMove.z},applied_force:this._lastAppliedForce?{x:this._lastAppliedForce.x,y:this._lastAppliedForce.y,z:this._lastAppliedForce.z}:null},e={hit_distance:this._lastGroundHit?this._lastGroundHit.t:null,height_error:this._lastHeightError,spring_force:this._lastSpringForce,target_height:this.rideHeight,spring_strength:this.springStrength,spring_damping:this.springDamping,ray_start:{x:this.body.position.x,y:this.body.position.y-this.body.shape.half_height,z:this.body.position.z},ray_end:{x:this.body.position.x,y:this.body.position.y-this.body.shape.half_height-this.rayLength,z:this.body.position.z}},o={normal:{x:this.contactNormal.x,y:this.contactNormal.y,z:this.contactNormal.z},hit:this._lastGroundHit?{point:this._lastGroundHit.point,normal:this._lastGroundHit.normal,distance:this._lastGroundHit.t}:null},s={current:this.currentState?this.currentState.name:null,lastTransition:this._lastStateChange};return{physics:t,movement:i,spring:e,state:s,contact:o}},e.EventEmitter.apply(e.CharacterController),e.ContactDetails=function(){this.uid=e.Utility.getUid(),this.object_a=null,this.object_b=null,this.contact_point=new e.Vector3,this.contact_point_in_a=new e.Vector3,this.contact_point_in_b=new e.Vector3,this.contact_normal=new e.Vector3,this.penetration_depth=0,this.restitution=0,this.friction=0,this.listeners={}},e.EventEmitter.apply(e.ContactDetails),e.ContactDetails.prototype.destroy=function(){this.emit("destroy"),e.ObjectPool.freeObject("ContactDetails",this)},e.ContactManifold=function(){this.object_a=null,this.object_b=null,this.points=[],this.next_manifold=null},e.ContactManifold.prototype.findWeakestContact=function(t){var i,e,n=-1,a=t.penetration_depth;for(i=0;4>i;i++)e=this.points[i],e.penetration_depth>a&&(a=e.penetration_depth,n=i);var r=0,h=0,c=0,l=0;0!==n&&(o.subtractVectors(t.contact_point_in_a,this.points[1].contact_point_in_a),s.subtractVectors(this.points[3].contact_point_in_a,this.points[2].contact_point_in_a),o.cross(s),r=o.lengthSquared()),1!==n&&(o.subtractVectors(t.contact_point_in_a,this.points[0].contact_point_in_a),s.subtractVectors(this.points[3].contact_point_in_a,this.points[2].contact_point_in_a),o.cross(s),h=o.lengthSquared()),2!==n&&(o.subtractVectors(t.contact_point_in_a,this.points[0].contact_point_in_a),s.subtractVectors(this.points[3].contact_point_in_a,this.points[1].contact_point_in_a),o.cross(s),c=o.lengthSquared()),3!==n&&(o.subtractVectors(t.contact_point_in_a,this.points[0].contact_point_in_a),s.subtractVectors(this.points[2].contact_point_in_a,this.points[1].contact_point_in_a),o.cross(s),l=o.lengthSquared());var p=0,_=r;return h>_&&(p=1,_=h),c>_&&(p=2,_=c),l>_&&(p=3),p},e.ContactManifold.prototype.addContact=function(t){var i;for(i=0;i<this.points.length;i++)if(this.points[i].contact_point.distanceTo(t.contact_point)<=.02)return void t.destroy();var e=!1;if(null!=t){if(e=t.object_a.emit("speculativeContact",t.object_b,t),e!==!1&&(e=t.object_b.emit("speculativeContact",t.object_a,t)),e===!1)return void t.destroy();t.object_a.emit("contact",t.object_b,t),t.object_b.emit("contact",t.object_a,t)}if(this.points.length<4)this.points.push(t);else{var o=this.findWeakestContact(t);this.points[o].destroy(),this.points[o]=t}},e.ContactManifold.prototype.update=function(){var t,i,s,n=new e.Vector3,a=new e.Vector3,r=new e.Vector3,h=this.points.length;for(t=0;t<this.points.length;t++)if(s=this.points[t],s.object_a.transform.transformVector3Into(s.contact_point_in_a,n),s.object_b.transform.transformVector3Into(s.contact_point_in_b,a),s.contact_point.addVectors(n,a),s.contact_point.scale(.5),r.subtractVectors(n,a),s.penetration_depth=r.dot(s.contact_normal),s.penetration_depth<-.02){for(s.destroy(),i=t;i<this.points.length;i++)this.points[i]=this.points[i+1];this.points.length=this.points.length-1,this.object_a.emit("endContact",this.object_b),this.object_b.emit("endContact",this.object_a)}else{o.scaleVector(s.contact_normal,s.penetration_depth),o.subtractVectors(n,o),o.subtractVectors(a,o);var c=o.lengthSquared();if(c>.2*.2){for(s.destroy(),i=t;i<this.points.length;i++)this.points[i]=this.points[i+1];this.points.length=this.points.length-1,this.object_a.emit("endContact",this.object_b),this.object_b.emit("endContact",this.object_a)}}h>0&&0===this.points.length&&(this.object_a.emit("endAllContact",this.object_b),this.object_b.emit("endAllContact",this.object_a))},e.ContactManifoldList=function(){this.first=null},e.ContactManifoldList.prototype.insert=function(t){t.next_manifold=this.first,this.first=t},e.ContactManifoldList.prototype.getManifoldForObjects=function(t,i){var o=null;if(null!==this.first)for(var s=this.first;null!==s;){if(s.object_a===t&&s.object_b===i||s.object_a===i&&s.object_b===t){o=s;break}s=s.next_manifold}return null===o&&(o=e.ObjectPool.getObject("ContactManifold"),o.object_a=t,o.object_b=i,this.insert(o)),o},e.GhostBody=function(t){e.RigidBody.call(this,t,1/0),this.contacts=[],this.tick_contacts=[],this.addListener("speculativeContact",e.GhostBody.prototype.onSpeculativeContact)},e.GhostBody.prototype=Object.create(e.RigidBody.prototype),e.GhostBody.prototype.onSpeculativeContact=function(t,i){return this.tick_contacts.push(t),-1===this.contacts.indexOf(t)?(this.contacts.push(t),this.emit("contactStart",t,i),t.emit("contactStart",this,i)):(this.emit("contactContinue",t,i),t.emit("contactContinue",this,i)),!1},e.GhostBody.prototype.checkForEndedContacts=function(){for(var t=0;t<this.contacts.length;t++)-1===this.tick_contacts.indexOf(this.contacts[t])&&(this.emit("contactEnd",this.contacts[t]),this.contacts.splice(t,1),t-=1);this.tick_contacts.length=0},e.IterativeSolver=function(){this.existing_contact_ids={},this.contact_constraints=[],this.friction_constraints=[],this.all_constraints=[],this.constraints=[],this.max_iterations=10,this.penetrations_max_iterations=5,this.relaxation=.9,this.sor_weight=.85,this.warmstarting_factor=.95;var t=this;this.onContactDeactivate=function(){this.removeListener("deactivate",t.onContactDeactivate);var i=t.contact_constraints.indexOf(this);t.contact_constraints.splice(i,1),delete t.existing_contact_ids[this.contact.uid]},this.onFrictionDeactivate=function(){this.removeListener("deactivate",t.onFrictionDeactivate);var i=t.friction_constraints.indexOf(this);t.friction_constraints.splice(i,1)}},e.IterativeSolver.prototype.addConstraint=function(t){-1===this.constraints.indexOf(t)&&this.constraints.push(t)},e.IterativeSolver.prototype.removeConstraint=function(t){var i=this.constraints.indexOf(t);-1!==i&&this.constraints.splice(i,1)},e.IterativeSolver.prototype.processContactManifolds=function(t){var i,o,s,n,a;for(o=t.first;o;){for(s=o.points.length,i=0;s>i;i++){n=o.points[i];var r=this.existing_contact_ids.hasOwnProperty(n.uid);r||(this.existing_contact_ids[n.uid]=!0,a=e.ObjectPool.getObject("ContactConstraint"),a.buildFromContact(n),this.contact_constraints.push(a),a.addListener("deactivate",this.onContactDeactivate),a=e.ObjectPool.getObject("FrictionConstraint"),a.buildFromContact(n),this.friction_constraints.push(a),a.addListener("deactivate",this.onFrictionDeactivate))}o=o.next_manifold}this.all_constraints.length=0,Array.prototype.push.apply(this.all_constraints,this.friction_constraints),Array.prototype.push.apply(this.all_constraints,this.constraints),Array.prototype.push.apply(this.all_constraints,this.contact_constraints)},e.IterativeSolver.prototype.prepareConstraints=function(t){var i,e,o,s,n=this.all_constraints.length;for(o=0;n>o;o++)if(i=this.all_constraints[o],i.active!==!1)for(i.update(t),s=0;s<i.rows.length;s++)e=i.rows[s],e.multiplier=0,e.computeB(i),e.computeD(),e.computeEta(i,t)},e.IterativeSolver.prototype.resolveContacts=function(){var t,i,s,n,a,h,c,l=0;for(t=0;t<this.penetrations_max_iterations;t++){for(l=0,a=0;a<this.contact_constraints.length;a++){i=this.contact_constraints[a],n=i.rows[0],s=0,null!=i.object_a&&i.object_a._mass!==1/0&&(s+=n.jacobian[0]*i.object_a.linear_factor.x*i.object_a.push_velocity.x+n.jacobian[1]*i.object_a.linear_factor.y*i.object_a.push_velocity.y+n.jacobian[2]*i.object_a.linear_factor.z*i.object_a.push_velocity.z+n.jacobian[3]*i.object_a.angular_factor.x*i.object_a.turn_velocity.x+n.jacobian[4]*i.object_a.angular_factor.y*i.object_a.turn_velocity.y+n.jacobian[5]*i.object_a.angular_factor.z*i.object_a.turn_velocity.z),null!=i.object_b&&i.object_b._mass!==1/0&&(s+=n.jacobian[6]*i.object_b.linear_factor.x*i.object_b.push_velocity.x+n.jacobian[7]*i.object_b.linear_factor.y*i.object_b.push_velocity.y+n.jacobian[8]*i.object_b.linear_factor.z*i.object_b.push_velocity.z+n.jacobian[9]*i.object_b.angular_factor.x*i.object_b.turn_velocity.x+n.jacobian[10]*i.object_b.angular_factor.y*i.object_b.turn_velocity.y+n.jacobian[11]*i.object_b.angular_factor.z*i.object_b.turn_velocity.z),h=(i.contact.penetration_depth-s)/n.D||0;var p=n.multiplier;n.multiplier=Math.max(n.lower_limit,Math.min(p+h,n.upper_limit)),h=n.multiplier-p,l=Math.max(l,h),i.object_a&&i.object_a._mass!==1/0&&(i.object_a.push_velocity.x+=h*n.B[0],i.object_a.push_velocity.y+=h*n.B[1],i.object_a.push_velocity.z+=h*n.B[2],i.object_a.turn_velocity.x+=h*n.B[3],i.object_a.turn_velocity.y+=h*n.B[4],i.object_a.turn_velocity.z+=h*n.B[5]),i.object_b&&i.object_b._mass!==1/0&&(i.object_b.push_velocity.x+=h*n.B[6],i.object_b.push_velocity.y+=h*n.B[7],i.object_b.push_velocity.z+=h*n.B[8],i.object_b.turn_velocity.x+=h*n.B[9],i.object_b.turn_velocity.y+=h*n.B[10],i.object_b.turn_velocity.z+=h*n.B[11])}if(l>=-e.EPSILON&&l<=e.EPSILON)break}for(a=0;a<this.contact_constraints.length;a++)i=this.contact_constraints[a],n=i.rows[0],null!=i.object_a&&i.object_a._mass!==1/0&&(c=i.object_a._mass_inverted,i.object_a.position.x+=c*n.jacobian[0]*i.object_a.linear_factor.x*n.multiplier*this.relaxation,i.object_a.position.y+=c*n.jacobian[1]*i.object_a.linear_factor.y*n.multiplier*this.relaxation,i.object_a.position.z+=c*n.jacobian[2]*i.object_a.linear_factor.z*n.multiplier*this.relaxation,o.x=n.jacobian[3]*i.object_a.angular_factor.x*n.multiplier*this.relaxation,o.y=n.jacobian[4]*i.object_a.angular_factor.y*n.multiplier*this.relaxation,o.z=n.jacobian[5]*i.object_a.angular_factor.z*n.multiplier*this.relaxation,i.object_a.inverseInertiaTensorWorldFrame.transformVector3(o),r.x=o.x,r.y=o.y,r.z=o.z,r.w=0,r.multiply(i.object_a.rotation),i.object_a.rotation.x+=.5*r.x,i.object_a.rotation.y+=.5*r.y,i.object_a.rotation.z+=.5*r.z,i.object_a.rotation.w+=.5*r.w,i.object_a.rotation.normalize()),null!=i.object_b&&i.object_b._mass!==1/0&&(c=i.object_b._mass_inverted,i.object_b.position.x+=c*n.jacobian[6]*i.object_b.linear_factor.x*n.multiplier*this.relaxation,i.object_b.position.y+=c*n.jacobian[7]*i.object_b.linear_factor.y*n.multiplier*this.relaxation,i.object_b.position.z+=c*n.jacobian[8]*i.object_b.linear_factor.z*n.multiplier*this.relaxation,o.x=n.jacobian[9]*i.object_b.angular_factor.x*n.multiplier*this.relaxation,o.y=n.jacobian[10]*i.object_b.angular_factor.y*n.multiplier*this.relaxation,o.z=n.jacobian[11]*i.object_b.angular_factor.z*n.multiplier*this.relaxation,i.object_b.inverseInertiaTensorWorldFrame.transformVector3(o),r.x=o.x,r.y=o.y,r.z=o.z,r.w=0,r.multiply(i.object_b.rotation),i.object_b.rotation.x+=.5*r.x,i.object_b.rotation.y+=.5*r.y,i.object_b.rotation.z+=.5*r.z,i.object_b.rotation.w+=.5*r.w,i.object_b.rotation.normalize()),n.multiplier=0},e.IterativeSolver.prototype.solveConstraints=function(){var t,i,e,o,s,n,a,r,h,c=this.all_constraints.length,l=0;for(s=0;c>s;s++)if(t=this.all_constraints[s],t.active!==!1)for(n=0;n<t.rows.length;n++)e=t.rows[n],o=e.multiplier_cached*this.warmstarting_factor,e.multiplier=o,t.object_a&&t.object_a._mass!==1/0&&(t.object_a.solver_impulse[0]+=o*e.B[0],t.object_a.solver_impulse[1]+=o*e.B[1],t.object_a.solver_impulse[2]+=o*e.B[2],t.object_a.solver_impulse[3]+=o*e.B[3],t.object_a.solver_impulse[4]+=o*e.B[4],t.object_a.solver_impulse[5]+=o*e.B[5]),t.object_b&&t.object_b._mass!==1/0&&(t.object_b.solver_impulse[0]+=o*e.B[6],t.object_b.solver_impulse[1]+=o*e.B[7],t.object_b.solver_impulse[2]+=o*e.B[8],t.object_b.solver_impulse[3]+=o*e.B[9],t.object_b.solver_impulse[4]+=o*e.B[10],t.object_b.solver_impulse[5]+=o*e.B[11]);for(a=0;a<this.max_iterations;a++){for(l=0,s=0;c>s;s++)if(t=this.all_constraints[s],t.active!==!1)for(i=t.rows.length,n=0;i>n;n++){e=t.rows[n],h=0,null!=t.object_a&&t.object_a._mass!==1/0&&(h+=e.jacobian[0]*t.object_a.linear_factor.x*t.object_a.solver_impulse[0]+e.jacobian[1]*t.object_a.linear_factor.y*t.object_a.solver_impulse[1]+e.jacobian[2]*t.object_a.linear_factor.z*t.object_a.solver_impulse[2]+e.jacobian[3]*t.object_a.angular_factor.x*t.object_a.solver_impulse[3]+e.jacobian[4]*t.object_a.angular_factor.y*t.object_a.solver_impulse[4]+e.jacobian[5]*t.object_a.angular_factor.z*t.object_a.solver_impulse[5]),null!=t.object_b&&t.object_b._mass!==1/0&&(h+=e.jacobian[6]*t.object_b.linear_factor.x*t.object_b.solver_impulse[0]+e.jacobian[7]*t.object_b.linear_factor.y*t.object_b.solver_impulse[1]+e.jacobian[8]*t.object_b.linear_factor.z*t.object_b.solver_impulse[2]+e.jacobian[9]*t.object_b.angular_factor.x*t.object_b.solver_impulse[3]+e.jacobian[10]*t.object_b.angular_factor.y*t.object_b.solver_impulse[4]+e.jacobian[11]*t.object_b.angular_factor.z*t.object_b.solver_impulse[5]),r=((e.eta-h)/e.D||0)*t.factor;var p=e.multiplier,_=p+r;_=this.sor_weight*_+(1-this.sor_weight)*p,e.multiplier=Math.max(e.lower_limit,Math.min(_,e.upper_limit)),r=e.multiplier-p;var b=(t.object_a&&t.object_a._mass!==1/0?t.object_a._mass:0)+(t.object_b&&t.object_b._mass!==1/0?t.object_b._mass:0);l=Math.max(l,Math.abs(r)/b),t.object_a&&t.object_a._mass!==1/0&&(t.object_a.solver_impulse[0]+=r*e.B[0],t.object_a.solver_impulse[1]+=r*e.B[1],t.object_a.solver_impulse[2]+=r*e.B[2],t.object_a.solver_impulse[3]+=r*e.B[3],t.object_a.solver_impulse[4]+=r*e.B[4],t.object_a.solver_impulse[5]+=r*e.B[5]),t.object_b&&t.object_b._mass!==1/0&&(t.object_b.solver_impulse[0]+=r*e.B[6],t.object_b.solver_impulse[1]+=r*e.B[7],t.object_b.solver_impulse[2]+=r*e.B[8],t.object_b.solver_impulse[3]+=r*e.B[9],t.object_b.solver_impulse[4]+=r*e.B[10],t.object_b.solver_impulse[5]+=r*e.B[11])}if(.1>=l)break}},e.IterativeSolver.prototype.applyConstraints=function(t){var i,e,n,a,r,h,c=this.all_constraints.length;for(a=0;c>a;a++)if(i=this.all_constraints[a],i.active!==!1){for(e=i.rows.length,i.last_impulse.x=i.last_impulse.y=i.last_impulse.z=0,r=0;e>r;r++)n=i.rows[r],n.multiplier_cached=n.multiplier,null!=i.object_a&&i.object_a._mass!==1/0&&(h=i.object_a._mass_inverted,s.x=h*t*n.jacobian[0]*i.object_a.linear_factor.x*n.multiplier,s.y=h*t*n.jacobian[1]*i.object_a.linear_factor.y*n.multiplier,s.z=h*t*n.jacobian[2]*i.object_a.linear_factor.z*n.multiplier,i.object_a.linear_velocity.add(s),i.last_impulse.add(s),o.x=t*n.jacobian[3]*i.object_a.angular_factor.x*n.multiplier,o.y=t*n.jacobian[4]*i.object_a.angular_factor.y*n.multiplier,o.z=t*n.jacobian[5]*i.object_a.angular_factor.z*n.multiplier,i.object_a.inverseInertiaTensorWorldFrame.transformVector3(o),i.object_a.angular_velocity.add(o),i.last_impulse.add(o)),null!=i.object_b&&i.object_b._mass!==1/0&&(h=i.object_b._mass_inverted,s.x=h*t*n.jacobian[6]*i.object_b.linear_factor.x*n.multiplier,s.y=h*t*n.jacobian[7]*i.object_b.linear_factor.y*n.multiplier,s.z=h*t*n.jacobian[8]*i.object_b.linear_factor.z*n.multiplier,i.object_b.linear_velocity.add(s),i.last_impulse.add(s),o.x=t*n.jacobian[9]*i.object_b.angular_factor.x*n.multiplier,o.y=t*n.jacobian[10]*i.object_b.angular_factor.y*n.multiplier,o.z=t*n.jacobian[11]*i.object_b.angular_factor.z*n.multiplier,i.object_b.inverseInertiaTensorWorldFrame.transformVector3(o),i.object_b.angular_velocity.add(o),i.last_impulse.add(o));i.breaking_threshold>0&&i.last_impulse.lengthSquared()>=i.breaking_threshold*i.breaking_threshold&&(i.active=!1)}},e.NarrowPhase=function(){this.contact_manifolds=new e.ContactManifoldList},e.NarrowPhase.prototype.updateContactManifolds=function(){for(var t=this.contact_manifolds.first,i=null;null!==t;)t.update(),0===t.points.length?(e.ObjectPool.freeObject("ContactManifold",t),null==i?this.contact_manifolds.first=t.next_manifold:i.next_manifold=t.next_manifold,t=t.next_manifold):(i=t,t=t.next_manifold)},e.NarrowPhase.prototype.midPhase=function(t,i){var o,s;t.shape instanceof e.CompoundShape?(o=t,s=i):(o=i,s=t);for(var n,a,r=e.ObjectPool.getObject("RigidBodyProxy"),h=0;h<o.shape.child_shapes.length;h++)if(n=o.shape.child_shapes[h],r.setFrom(o,n),r.shape instanceof e.CompoundShape||s.shape instanceof e.CompoundShape)this.midPhase(r,s);else if(a=this.getContact(r,s),null!=a){var c,l;if(a.object_a===r?(a.object_a=o,c=r,l=s):(a.object_b=o,c=s,l=r),c instanceof e.RigidBodyProxy)for(;c.parent;)c instanceof e.RigidBodyProxy&&c.shape_data.transform.transformVector3(a.contact_point_in_a),c=c.parent;if(l instanceof e.RigidBodyProxy)for(;l.parent;)l instanceof e.RigidBodyProxy&&l.shape_data.transform.transformVector3(a.contact_point_in_b),l=l.parent;a.object_a=c,a.object_b=l,this.addContact(c,l,a)}e.ObjectPool.freeObject("RigidBodyProxy",r)},e.NarrowPhase.prototype.meshCollision=function(){function t(t,i,l){n.copy(t.transform_inverse),n.multiply(i.transform);for(var p=[t.shape.hierarchy,i.shape.hierarchy];p.length;){var _=p.shift(),b=p.shift();if(_.isLeaf()&&b.isLeaf()){n.transformVector3Into(b.object.a,a.a),n.transformVector3Into(b.object.b,a.b),n.transformVector3Into(b.object.c,a.c),o.subtractVectors(a.b,a.a),s.subtractVectors(a.c,a.a),a.normal.crossVectors(o,s),a.normal.normalize();var u=e.TriangleTriangle(_.object,a);null!=u&&(t.transform.rotateVector3(u.contact_normal),t.transform.transformVector3(u.contact_point),t.transform.transformVector3(u.contact_point_in_b),i.transform_inverse.transformVector3(u.contact_point_in_b),u.object_a=t,u.object_b=i,u.restitution=(t.restitution+i.restitution)/2,u.friction=(t.friction+i.friction)/2,l(t,i,u))}else _.isLeaf()?(c.transform(b.left.aabb,n),_.aabb.intersects(c)&&p.push(_,b.left),h.transform(b.right.aabb,n),_.aabb.intersects(h)&&p.push(_,b.right)):b.isLeaf()?(r.transform(b.aabb,n),r.intersects(_.left.aabb)&&p.push(_.left,b),r.intersects(_.right.aabb)&&p.push(_.right,b)):(c.transform(b.left.aabb,n),h.transform(b.right.aabb,n),_.left.aabb.intersects(c)&&p.push(_.left,b.left),_.left.aabb.intersects(h)&&p.push(_.left,b.right),_.right.aabb.intersects(c)&&p.push(_.right,b.left),_.right.aabb.intersects(h)&&p.push(_.right,b.right))}}function i(t,i,o){var s=e.ObjectPool.getObject("RigidBodyProxy"),n=new e.CompoundShapeChild(t,new e.Vector3,new e.Quaternion);s.setFrom(i,n);var a,r=e.GjkEpa.GJK(s,o);return null!=e.GjkEpa.result?a=e.GjkEpa.result:null!=r&&(a=e.GjkEpa.EPA(r)),e.ObjectPool.freeObject("RigidBodyProxy",s),a}var n=new e.Matrix4,a=new e.TriangleShape(new e.Vector3,new e.Vector3,new e.Vector3),r=new e.AABB,h=new e.AABB,c=new e.AABB,l=function(){var t=new e.Matrix4,o=new e.AABB;return function(e,s,n){t.copy(s.transform),t.multiply(e.transform_inverse),o.transform(s.aabb,e.transform_inverse);for(var a,r=[e.shape.hierarchy];a=r.shift();)if(a.aabb.intersects(o))if(a.isLeaf()){var h=i(a.object,e,s);if(null!=h){for(var c=e;null!=c.parent;)c=c.parent;h.object_a=c,n(c,s,h)}}else r.push(a.left,a.right)}}();return function(i,o){var s=i.shape instanceof e.MeshShape,n=o.shape instanceof e.MeshShape;s&&n?t(i,o,this.addContact.bind(this)):s?l(i,o,this.addContact.bind(this)):l(o,i,this.addContact.bind(this))}}(),e.NarrowPhase.prototype.getContact=function(t,i){if(t.shape instanceof e.CompoundShape||i.shape instanceof e.CompoundShape)return void this.midPhase(t,i);if(t.shape instanceof e.MeshShape||i.shape instanceof e.MeshShape)return void this.meshCollision(t,i);var o;if(t.shape instanceof e.SphereShape&&i.shape instanceof e.SphereShape)o=e.SphereSphere(t,i);else if(t.shape instanceof e.SphereShape&&i.shape instanceof e.BoxShape||t.shape instanceof e.BoxShape&&i.shape instanceof e.SphereShape)o=e.BoxSphere(t,i);else{var s=e.GjkEpa.GJK(t,i);null!=e.GjkEpa.result?o=e.GjkEpa.result:null!=s&&(o=e.GjkEpa.EPA(s))}return o},e.NarrowPhase.prototype.addContact=function(t,i,e){this.contact_manifolds.getManifoldForObjects(t,i).addContact(e)},e.NarrowPhase.prototype.generateContacts=function(t){var i,e,o=t.length;for(this.updateContactManifolds(),i=0;o>i;i++)e=this.getContact(t[i][0],t[i][1]),null!=e&&this.addContact(t[i][0],t[i][1],e)},e.NarrowPhase.prototype.removeBody=function(t){for(var i=this.contact_manifolds.first;null!=i;){if(i.object_a===t||i.object_b===t){for(var e=0;e<i.points.length;e++)i.points[e].destroy();i.points.length=0}i=i.next}},e.ObjectPool={types:{},pools:{},registerType:function(t,i){this.types[t]=i,this.pools[t]=[]},getObject:function(t){var i=this.pools[t];return 0!==i.length?i.pop():this.types[t]()},freeObject:function(t,i){null!=i.removeAllListeners&&i.removeAllListeners(),this.pools[t].push(i)}},e.ObjectPool.registerType("ContactDetails",function(){return new e.ContactDetails}),e.ObjectPool.registerType("ContactManifold",function(){return new e.ContactManifold}),e.ObjectPool.registerType("GJK2SupportPoint",function(){return new e.GjkEpa.SupportPoint(new e.Vector3,new e.Vector3,new e.Vector3)}),e.ObjectPool.registerType("ConstraintRow",function(){return new e.ConstraintRow}),e.ObjectPool.registerType("ContactConstraint",function(){return new e.ContactConstraint}),e.ObjectPool.registerType("FrictionConstraint",function(){return new e.FrictionConstraint}),e.ObjectPool.registerType("RayIntersection",function(){return new e.RayIntersection}),e.ObjectPool.registerType("RigidBodyProxy",function(){return new e.RigidBodyProxy}),e.RigidBodyProxy=function(){this.parent=null,this.id=null,this.shape=null,this.aabb=new e.AABB,this._mass=null,this._mass_inverted=null,this.position=new e.Vector3,this.rotation=new e.Quaternion,this.transform=new e.Matrix4,this.transform_inverse=new e.Matrix4,this.restitution=null,this.friction=null},Object.defineProperty(e.RigidBodyProxy.prototype,"mass",{get:function(){return this._mass},set:function(t){this._mass=t,this._mass_inverted=1/t,this.inertiaTensor=this.shape.getInertiaTensor(t)}}),e.RigidBodyProxy.prototype.setFrom=function(t,i){this.parent=t,this.id=t.id,this.shape=i.shape,this.shape_data=i,this._mass=t._mass,t.transform.transformVector3Into(i.position,this.position),this.rotation.multiplyQuaternions(t.rotation,i.rotation),this.transform.makeTransform(this.rotation,this.position),this.transform.invertInto(this.transform_inverse),this.aabb.transform(this.shape.aabb,this.transform),this.restitution=t.restitution,this.friction=t.friction},e.RigidBodyProxy.prototype.findSupportPoint=e.RigidBody.prototype.findSupportPoint,e.RigidBodyProxy.prototype.getRigidBody=function(){for(var t=this.parent;t.parent;)t=this.parent;return t},e.World=function(t,i,o){this.ticks=0,this.broadphase=t,this.narrowphase=i,this.solver=o,o.world=this,this.rigid_bodies=[],this.ghost_bodies=[],this.gravity=new e.Vector3(0,-9.8,0),this.force_generators=[],this.listeners={}},e.EventEmitter.apply(e.World),e.World.prototype.step=function(t,i){i=i||t;var e,s,n,a,r,h;for(n=t/i,e=0;n>e;e++){for(this.ticks++,s=Math.min(i,t),t-=i,this.emit("stepStart",this.ticks,s),a=0,r=this.rigid_bodies.length;r>a;a++)h=this.rigid_bodies[a],h._mass!==1/0&&(o.scaleVector(h.gravity||this.gravity,h._mass*s),h.accumulated_force.add(o));for(a=0,r=this.force_generators.length;r>a;a++)this.force_generators[a].applyForce();for(a=0,r=this.rigid_bodies.length;r>a;a++)h=this.rigid_bodies[a],h.integrate(s);for(a=0,r=this.rigid_bodies.length;r>a;a++)this.rigid_bodies[a].updateDerived();for(this.broadphase.update(),this.narrowphase.generateContacts(this.broadphase.collision_pairs),this.solver.processContactManifolds(this.narrowphase.contact_manifolds),this.solver.prepareConstraints(s),this.solver.resolveContacts(),this.solver.solveConstraints(),this.solver.applyConstraints(s),a=0;a<this.ghost_bodies.length;a++)h=this.ghost_bodies[a],h.checkForEndedContacts();this.emit("stepEnd",this.ticks,s)}},e.World.prototype.addRigidBody=function(t){t.world=this,t.updateDerived(),this.rigid_bodies.push(t),this.broadphase.addBody(t)},e.World.prototype.removeRigidBody=function(t){var i;for(i=0;i<this.rigid_bodies.length;i++)if(this.rigid_bodies[i]===t){this.rigid_bodies.splice(i,1),this.broadphase.removeBody(t);break}this.narrowphase.removeBody(t)},e.World.prototype.addGhostBody=function(t){t.world=this,t.updateDerived(),this.ghost_bodies.push(t),this.broadphase.addBody(t)},e.World.prototype.removeGhostBody=function(t){for(var i=0;i<this.ghost_bodies.length;i++)if(this.ghost_bodies[i]===t){this.ghost_bodies.splice(i,1),this.broadphase.removeBody(t);break}},e.World.prototype.addForceGenerator=function(t){var i,e;for(i=0,e=this.force_generators.length;e>i;i++)if(this.force_generators[i]===t)return;this.force_generators.push(t)},e.World.prototype.removeForceGenerator=function(t){var i,e;for(i=0,e=this.force_generators.length;e>i;i++)if(this.force_generators[i]===t)return void this.force_generators.splice(i,1)},e.World.prototype.addConstraint=function(t){this.solver.addConstraint(t)},e.World.prototype.removeConstraint=function(t){this.solver.removeConstraint(t)},function(){var t=function(t,i){return t.t<i.t?-1:t.t>i.t?1:0};e.World.prototype.rayIntersect=function(i,e){var o=this.broadphase.rayIntersect(i,e);return o.sort(t),o},e.World.prototype.shapeIntersect=function(i,o,s){var n=new e.LineSweptShape(o,s,i),a=new e.RigidBody(n,0);a.updateDerived();for(var r=this.broadphase.intersectsWith(a),h=[],c=0;c<r.length;c++){var l=this.narrowphase.getContact(a,r[c]);if(null!=l){var p=e.ObjectPool.getObject("RayIntersection");p.object=l.object_b,p.normal.copy(l.contact_normal),p.point.scaleVector(l.contact_normal,-l.penetration_depth),p.point.add(l.contact_point),p.t=p.point.distanceTo(o),h.push(p)}}return h.sort(t),h}}(),"undefined"!=typeof window&&(window.Goblin=e),"undefined"!=typeof self&&(self.Goblin=e),"undefined"!=typeof module&&(module.exports=e)}(),Goblin.LineSweptShape=function(t,i,e){this.start=t,this.end=i,this.shape=e,this.direction=new Goblin.Vector3,this.direction.subtractVectors(i,t),this.length=this.direction.length(),this.direction.normalize(),this.aabb=new Goblin.AABB,this.calculateLocalAABB(this.aabb)},Goblin.LineSweptShape.prototype.calculateLocalAABB=function(t){this.shape.calculateLocalAABB(t),t.min.x=Math.min(t.min.x+this.start.x,t.min.x+this.end.x),t.min.y=Math.min(t.min.y+this.start.y,t.min.y+this.end.y),t.min.z=Math.min(t.min.z+this.start.z,t.min.z+this.end.z),t.max.x=Math.max(t.max.x+this.start.x,t.max.x+this.end.x),t.max.y=Math.max(t.max.y+this.start.y,t.max.y+this.end.y),t.max.z=Math.max(t.max.z+this.start.z,t.max.z+this.end.z)},Goblin.LineSweptShape.prototype.getInertiaTensor=function(t){return this.shape.getInertiaTensor(t)},Goblin.LineSweptShape.prototype.findSupportPoint=function(t,i){this.shape.findSupportPoint(t,i);var e=this.direction.dot(t);i.add(0>e?this.start:this.end)},Goblin.LineSweptShape.prototype.rayIntersect=function(){return null};
@@ -0,0 +1,90 @@
1
+ // actionengine/display/graphics/actioncamera.js
2
+ class ActionCamera {
3
+ constructor(position, target) {
4
+ this.position = position || new Vector3(0, 10, -20);
5
+ this.target = target || new Vector3();
6
+ this.up = new Vector3(0, 1, 0);
7
+ this.yaw = 0;
8
+ this.pitch = Math.PI / 6;
9
+ this.fov = Math.PI * 0.35;
10
+ this.near = 0;
11
+ this.far = 10000;
12
+ // Add new camera control properties
13
+ this.movementSpeed = 40;
14
+ this.pitchSpeed = Math.PI;
15
+ this.isDetached = false;
16
+ }
17
+
18
+ handleDetachedInput(input, deltaTime) {
19
+ const forward = this.target.sub(this.position).normalize();
20
+ const right = new Vector3(forward.z, 0, -forward.x).normalize();
21
+ const MAX_PITCH = (89.9 * Math.PI) / 180;
22
+ const speedMultiplier = 8;
23
+ const moveSpeed = this.movementSpeed * speedMultiplier * deltaTime;
24
+ const rotateSpeed = Math.PI * deltaTime;
25
+ const verticalSpeed = this.movementSpeed * speedMultiplier * deltaTime;
26
+
27
+ // Vertical movement
28
+ if (input.isKeyPressed("NumpadAdd")) {
29
+ const upMove = new Vector3(0, verticalSpeed, 0);
30
+ this.position = this.position.add(upMove);
31
+ this.target = this.target.add(upMove);
32
+ }
33
+ if (input.isKeyPressed("NumpadEnter")) {
34
+ const downMove = new Vector3(0, -verticalSpeed, 0);
35
+ this.position = this.position.add(downMove);
36
+ this.target = this.target.add(downMove);
37
+ }
38
+
39
+ // Forward/Backward & Strafe movement
40
+ let moveDir = new Vector3(0, 0, 0);
41
+ if (input.isKeyPressed("Numpad8")) moveDir = moveDir.add(forward);
42
+ if (input.isKeyPressed("Numpad2")) moveDir = moveDir.add(forward.mult(-1));
43
+ if (input.isKeyPressed("Numpad6")) moveDir = moveDir.add(right.mult(-1));
44
+ if (input.isKeyPressed("Numpad4")) moveDir = moveDir.add(right);
45
+
46
+ if (moveDir.length() > 0) {
47
+ const movement = moveDir.normalize().mult(moveSpeed);
48
+ this.position = this.position.add(movement);
49
+ this.target = this.target.add(movement);
50
+ }
51
+
52
+ // Yaw rotation
53
+ if (input.isKeyPressed("Numpad7") || input.isKeyPressed("Numpad9")) {
54
+ const targetToCamera = this.position.sub(this.target);
55
+ const rotationAngle = (input.isKeyPressed("Numpad7") ? 1 : -1) * rotateSpeed;
56
+ const rotated = targetToCamera.rotateY(rotationAngle);
57
+ this.position = this.target.add(rotated);
58
+ }
59
+
60
+ // Pitch control
61
+ if (input.isKeyPressed("Numpad1") || input.isKeyPressed("Numpad3")) {
62
+ const targetToCamera = this.position.sub(this.target);
63
+ const distance = targetToCamera.length();
64
+ const currentPitch = Math.asin(targetToCamera.y / distance);
65
+ const pitchDelta = this.pitchSpeed * deltaTime * (input.isKeyPressed("Numpad1") ? 1 : -1);
66
+ const newPitch = Math.max(-MAX_PITCH, Math.min(MAX_PITCH, currentPitch + pitchDelta));
67
+
68
+ const horizontalDistance = distance * Math.cos(newPitch);
69
+ const verticalDistance = distance * Math.sin(newPitch);
70
+ const horizontalDir = targetToCamera.horizontalNormalize();
71
+
72
+ this.position = this.target.add(
73
+ horizontalDir.mult(horizontalDistance).add(new Vector3(0, verticalDistance, 0))
74
+ );
75
+ }
76
+ }
77
+
78
+ getViewMatrix() {
79
+ const forward = this.target.sub(this.position).normalize();
80
+ const right = forward.cross(this.up).normalize();
81
+ const up = right.cross(forward);
82
+
83
+ return {
84
+ forward,
85
+ right,
86
+ up,
87
+ position: this.position
88
+ };
89
+ }
90
+ }
@@ -0,0 +1,69 @@
1
+ // actionengine/camera/cameracollisionhandler.js
2
+ // @import ../physics/actionraycast.js
3
+
4
+ class CameraCollisionHandler {
5
+ constructor(physicsWorld) {
6
+ this.physicsWorld = physicsWorld;
7
+ }
8
+
9
+ /**
10
+ * Adjust camera position to prevent clipping through objects
11
+ * @param {Vector3} characterPosition - The position of the character
12
+ * @param {Vector3} desiredCameraPosition - The desired camera position (without collision)
13
+ * @param {number} cameraRadius - Radius of the camera's collision sphere
14
+ * @returns {Vector3} The corrected camera position
15
+ */
16
+ adjustCameraPosition(characterPosition, desiredCameraPosition, cameraRadius = 1.0) {
17
+ try {
18
+ // Get eye level position (higher than feet position)
19
+ const eyePosition = {
20
+ x: characterPosition.x,
21
+ y: characterPosition.y + 3.0, // Add approximate eye height
22
+ z: characterPosition.z
23
+ };
24
+
25
+ // Calculate ray length
26
+ const rayLength = Math.sqrt(
27
+ Math.pow(desiredCameraPosition.x - eyePosition.x, 2) +
28
+ Math.pow(desiredCameraPosition.y - eyePosition.y, 2) +
29
+ Math.pow(desiredCameraPosition.z - eyePosition.z, 2)
30
+ );
31
+
32
+ // Don't perform collision check if camera is too close
33
+ if (rayLength < cameraRadius * 2) {
34
+ return desiredCameraPosition;
35
+ }
36
+
37
+ // Use our ActionRaycast utility to check for collisions
38
+ const hit = ActionRaycast.cast(
39
+ eyePosition,
40
+ desiredCameraPosition,
41
+ this.physicsWorld,
42
+ {
43
+ ignoreObjects: ['Character'],
44
+ minDistance: 0.1
45
+ }
46
+ );
47
+
48
+ // If we got a hit, adjust the camera position
49
+ if (hit) {
50
+ // Use the hit point and direction to calculate the new camera position
51
+ // Place camera at adjusted distance (hit point minus radius)
52
+ const adjustedDistance = Math.max(0, hit.distance - cameraRadius);
53
+
54
+ // Calculate the point along the ray using the utility method
55
+ return ActionRaycast.getPointOnRay(
56
+ eyePosition,
57
+ hit.rayDirection,
58
+ adjustedDistance
59
+ );
60
+ }
61
+
62
+ // No intersection, return original position
63
+ return desiredCameraPosition;
64
+ } catch (error) {
65
+ console.error("Error in camera collision detection:", error);
66
+ return desiredCameraPosition;
67
+ }
68
+ }
69
+ }