|
|
@@ -132,18 +132,19 @@ async function RapierPhysics() {
|
|
|
shape.setMass( mass );
|
|
|
shape.setRestitution( restitution );
|
|
|
|
|
|
- const body = mesh.isInstancedMesh
|
|
|
+ const { body, collider } = mesh.isInstancedMesh
|
|
|
? createInstancedBody( mesh, mass, shape )
|
|
|
: createBody( mesh.position, mesh.quaternion, mass, shape );
|
|
|
|
|
|
if ( ! mesh.userData.physics ) mesh.userData.physics = {};
|
|
|
|
|
|
mesh.userData.physics.body = body;
|
|
|
+ mesh.userData.physics.collider = collider;
|
|
|
|
|
|
if ( mass > 0 ) {
|
|
|
|
|
|
meshes.push( mesh );
|
|
|
- meshMap.set( mesh, body );
|
|
|
+ meshMap.set( mesh, { body, collider } );
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -161,22 +162,10 @@ async function RapierPhysics() {
|
|
|
if ( ! mesh.userData.physics ) return;
|
|
|
|
|
|
const body = mesh.userData.physics.body;
|
|
|
+ const collider = mesh.userData.physics.collider;
|
|
|
|
|
|
- if ( ! body ) return;
|
|
|
-
|
|
|
- if ( Array.isArray( body ) ) {
|
|
|
-
|
|
|
- for ( let i = 0; i < body.length; i ++ ) {
|
|
|
-
|
|
|
- world.removeRigidBody( body[ i ] );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- world.removeRigidBody( body );
|
|
|
-
|
|
|
- }
|
|
|
+ if ( body ) removeBody( body );
|
|
|
+ if ( collider ) removeCollider( collider );
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -187,15 +176,18 @@ async function RapierPhysics() {
|
|
|
const array = mesh.instanceMatrix.array;
|
|
|
|
|
|
const bodies = [];
|
|
|
+ const colliders = [];
|
|
|
|
|
|
for ( let i = 0; i < mesh.count; i ++ ) {
|
|
|
|
|
|
const position = _vector.fromArray( array, i * 16 + 12 );
|
|
|
- bodies.push( createBody( position, null, mass, shape ) );
|
|
|
+ const { body, collider } = createBody( position, null, mass, shape );
|
|
|
+ bodies.push( body );
|
|
|
+ colliders.push( collider );
|
|
|
|
|
|
}
|
|
|
|
|
|
- return bodies;
|
|
|
+ return { body: bodies, collider: colliders };
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -206,15 +198,51 @@ async function RapierPhysics() {
|
|
|
if ( quaternion !== null ) desc.setRotation( quaternion );
|
|
|
|
|
|
const body = world.createRigidBody( desc );
|
|
|
- world.createCollider( shape, body );
|
|
|
+ const collider = world.createCollider( shape, body );
|
|
|
|
|
|
- return body;
|
|
|
+ return { body, collider };
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function removeBody( body ) {
|
|
|
+
|
|
|
+ if ( Array.isArray( body ) ) {
|
|
|
+
|
|
|
+ for ( let i = 0; i < body.length; i ++ ) {
|
|
|
+
|
|
|
+ world.removeRigidBody( body[ i ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ world.removeRigidBody( body );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function removeCollider( collider ) {
|
|
|
+
|
|
|
+ if ( Array.isArray( collider ) ) {
|
|
|
+
|
|
|
+ for ( let i = 0; i < collider.length; i ++ ) {
|
|
|
+
|
|
|
+ world.removeCollider( collider[ i ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ world.removeCollider( collider );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
function setMeshPosition( mesh, position, index = 0 ) {
|
|
|
|
|
|
- let body = meshMap.get( mesh );
|
|
|
+ let { body } = meshMap.get( mesh );
|
|
|
|
|
|
if ( mesh.isInstancedMesh ) {
|
|
|
|
|
|
@@ -230,7 +258,7 @@ async function RapierPhysics() {
|
|
|
|
|
|
function setMeshVelocity( mesh, velocity, index = 0 ) {
|
|
|
|
|
|
- let body = meshMap.get( mesh );
|
|
|
+ let { body } = meshMap.get( mesh );
|
|
|
|
|
|
if ( mesh.isInstancedMesh ) {
|
|
|
|
|
|
@@ -278,7 +306,7 @@ async function RapierPhysics() {
|
|
|
if ( mesh.isInstancedMesh ) {
|
|
|
|
|
|
const array = mesh.instanceMatrix.array;
|
|
|
- const bodies = meshMap.get( mesh );
|
|
|
+ const { body: bodies } = meshMap.get( mesh );
|
|
|
|
|
|
for ( let j = 0; j < bodies.length; j ++ ) {
|
|
|
|
|
|
@@ -296,7 +324,7 @@ async function RapierPhysics() {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- const body = meshMap.get( mesh );
|
|
|
+ const { body } = meshMap.get( mesh );
|
|
|
|
|
|
mesh.position.copy( body.translation() );
|
|
|
mesh.quaternion.copy( body.rotation() );
|