@react-three/rapier 0.8.2 → 0.9.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.
@@ -3,10 +3,10 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var rapier3dCompat = require('@dimforge/rapier3d-compat');
6
- var React = require('react');
7
- var useAsset = require('use-asset');
8
6
  var fiber = require('@react-three/fiber');
7
+ var React = require('react');
9
8
  var three = require('three');
9
+ var useAsset = require('use-asset');
10
10
  var threeStdlib = require('three-stdlib');
11
11
 
12
12
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
@@ -252,7 +252,8 @@ const Physics = ({
252
252
  children,
253
253
  timeStep: _timeStep = 1 / 60,
254
254
  paused: _paused = false,
255
- updatePriority
255
+ updatePriority,
256
+ interpolate: _interpolate = true
256
257
  }) => {
257
258
  const rapier = useAsset.useAsset(importRapier);
258
259
  const worldRef = React.useRef();
@@ -288,12 +289,40 @@ const Physics = ({
288
289
  }
289
290
  }, [_gravity]);
290
291
  const [steppingState] = React.useState({
292
+ previousState: {},
291
293
  accumulator: 0
292
294
  });
293
295
  /* Check if the timestep is supposed to be variable. We'll do this here
294
296
  once so we don't have to string-check every frame. */
295
297
 
296
298
  const timeStepVariable = _timeStep === "vary";
299
+ const getSourceFromColliderHandle = React.useCallback(handle => {
300
+ const world = worldRef.current;
301
+
302
+ if (world) {
303
+ var _collider$parent;
304
+
305
+ const collider = world.getCollider(handle);
306
+ const colEvents = colliderEvents.get(handle);
307
+ const colliderState = colliderStates.get(handle);
308
+ const rigidBodyHandle = collider === null || collider === void 0 ? void 0 : (_collider$parent = collider.parent()) === null || _collider$parent === void 0 ? void 0 : _collider$parent.handle;
309
+ const rigidBody = rigidBodyHandle ? world.getRigidBody(rigidBodyHandle) : undefined;
310
+ const rbEvents = rigidBody && rigidBodyHandle ? rigidBodyEvents.get(rigidBodyHandle) : undefined;
311
+ const rigidBodyState = rigidBodyHandle ? rigidBodyStates.get(rigidBodyHandle) : undefined;
312
+ return {
313
+ collider: {
314
+ object: collider,
315
+ events: colEvents,
316
+ state: colliderState
317
+ },
318
+ rigidBody: {
319
+ object: rigidBody,
320
+ events: rbEvents,
321
+ state: rigidBodyState
322
+ }
323
+ };
324
+ }
325
+ }, []);
297
326
  fiber.useFrame((_, dt) => {
298
327
  const world = worldRef.current;
299
328
  if (!world) return;
@@ -315,13 +344,25 @@ const Physics = ({
315
344
 
316
345
  if (!_paused) {
317
346
  while (steppingState.accumulator >= _timeStep) {
347
+ if (_interpolate) {
348
+ // Set up previous state
349
+ // needed for accurate interpolations if the world steps more than once
350
+ steppingState.previousState = {};
351
+ world.forEachRigidBody(body => {
352
+ steppingState.previousState[body.handle] = {
353
+ position: body.translation(),
354
+ rotation: body.rotation()
355
+ };
356
+ });
357
+ }
358
+
318
359
  world.step(eventQueue);
319
360
  steppingState.accumulator -= _timeStep;
320
361
  }
321
362
  }
322
363
  }
323
364
 
324
- const interpolationAlpha = timeStepVariable ? 1 : steppingState.accumulator % _timeStep / _timeStep; // Update meshes
365
+ const interpolationAlpha = timeStepVariable || !_interpolate ? 1 : steppingState.accumulator / _timeStep; // Update meshes
325
366
 
326
367
  rigidBodyStates.forEach((state, handle) => {
327
368
  const rigidBody = world.getRigidBody(handle);
@@ -348,7 +389,20 @@ const Physics = ({
348
389
  }
349
390
 
350
391
  let t = rigidBody.translation();
351
- let r = rigidBody.rotation(); // Get new position
392
+ let r = rigidBody.rotation();
393
+ let previousState = steppingState.previousState[handle];
394
+
395
+ if (previousState) {
396
+ // Get previous simulated world position
397
+ _matrix4.compose(previousState.position, rapierQuaternionToQuaternion(previousState.rotation), state.scale).premultiply(state.invertedWorldMatrix).decompose(_position, _rotation, _scale); // Apply previous tick position
398
+
399
+
400
+ if (!(state.object instanceof three.InstancedMesh)) {
401
+ state.object.position.copy(_position);
402
+ state.object.quaternion.copy(_rotation);
403
+ }
404
+ } // Get new position
405
+
352
406
 
353
407
  _matrix4.compose(t, rapierQuaternionToQuaternion(r), state.scale).premultiply(state.invertedWorldMatrix).decompose(_position, _rotation, _scale);
354
408
 
@@ -356,146 +410,182 @@ const Physics = ({
356
410
  state.setMatrix(_matrix4);
357
411
  state.object.instanceMatrix.needsUpdate = true;
358
412
  } else {
359
- // Interpolate from last position
413
+ // Interpolate to new position
360
414
  state.object.position.lerp(_position, interpolationAlpha);
361
415
  state.object.quaternion.slerp(_rotation, interpolationAlpha);
362
416
  }
363
417
  });
364
418
  eventQueue.drainCollisionEvents((handle1, handle2, started) => {
365
- var _collider1$parent, _collider2$parent;
366
-
367
- const collider1 = world.getCollider(handle1);
368
- const collider2 = world.getCollider(handle2);
369
- const rigidBodyHandle1 = (_collider1$parent = collider1.parent()) === null || _collider1$parent === void 0 ? void 0 : _collider1$parent.handle;
370
- const rigidBodyHandle2 = (_collider2$parent = collider2.parent()) === null || _collider2$parent === void 0 ? void 0 : _collider2$parent.handle; // Collision Events
419
+ const source1 = getSourceFromColliderHandle(handle1);
420
+ const source2 = getSourceFromColliderHandle(handle2); // Collision Events
371
421
 
372
- if (!collider1 || !collider2) {
422
+ if (!(source1 !== null && source1 !== void 0 && source1.collider.object) || !(source2 !== null && source2 !== void 0 && source2.collider.object)) {
373
423
  return;
374
424
  }
375
425
 
376
- const collider1Events = colliderEvents.get(collider1.handle);
377
- const collider2Events = colliderEvents.get(collider2.handle);
378
- const rigidBody1 = rigidBodyHandle1 ? world.getRigidBody(rigidBodyHandle1) : undefined;
379
- const rigidBody2 = rigidBodyHandle2 ? world.getRigidBody(rigidBodyHandle2) : undefined;
380
- const rigidBody1Events = rigidBodyHandle1 ? rigidBodyEvents.get(rigidBodyHandle1) : undefined;
381
- const rigidBody2Events = rigidBodyHandle2 ? rigidBodyEvents.get(rigidBodyHandle2) : undefined;
382
- const collider1State = colliderStates.get(collider1.handle);
383
- const collider2State = colliderStates.get(collider2.handle);
384
- const rigidBody1State = rigidBodyHandle1 ? rigidBodyStates.get(rigidBodyHandle1) : undefined;
385
- const rigidBody2State = rigidBodyHandle2 ? rigidBodyStates.get(rigidBodyHandle2) : undefined;
386
-
387
426
  if (started) {
388
- world.contactPair(collider1, collider2, (manifold, flipped) => {
389
- var _rigidBody1Events$onC, _rigidBody2Events$onC, _collider1Events$onCo, _collider2Events$onCo;
427
+ world.contactPair(source1.collider.object, source2.collider.object, (manifold, flipped) => {
428
+ var _source1$rigidBody$ev, _source1$rigidBody$ev2, _source2$collider$sta, _source2$rigidBody$st, _source2$rigidBody$ev, _source2$rigidBody$ev2, _source1$collider$sta, _source1$rigidBody$st, _source1$collider$eve, _source1$collider$eve2, _source2$collider$sta2, _source2$rigidBody$st2, _source2$collider$eve, _source2$collider$eve2, _source1$collider$sta2, _source1$rigidBody$st2;
390
429
 
391
430
  /* RigidBody events */
392
- rigidBody1Events === null || rigidBody1Events === void 0 ? void 0 : (_rigidBody1Events$onC = rigidBody1Events.onCollisionEnter) === null || _rigidBody1Events$onC === void 0 ? void 0 : _rigidBody1Events$onC.call(rigidBody1Events, {
393
- rigidBody: rigidBody2,
394
- collider: collider2,
395
- colliderObject: collider2State === null || collider2State === void 0 ? void 0 : collider2State.object,
396
- rigidBodyObject: rigidBody2State === null || rigidBody2State === void 0 ? void 0 : rigidBody2State.object,
431
+ (_source1$rigidBody$ev = source1.rigidBody.events) === null || _source1$rigidBody$ev === void 0 ? void 0 : (_source1$rigidBody$ev2 = _source1$rigidBody$ev.onCollisionEnter) === null || _source1$rigidBody$ev2 === void 0 ? void 0 : _source1$rigidBody$ev2.call(_source1$rigidBody$ev, {
432
+ rigidBody: source2.rigidBody.object,
433
+ collider: source2.collider.object,
434
+ colliderObject: (_source2$collider$sta = source2.collider.state) === null || _source2$collider$sta === void 0 ? void 0 : _source2$collider$sta.object,
435
+ rigidBodyObject: (_source2$rigidBody$st = source2.rigidBody.state) === null || _source2$rigidBody$st === void 0 ? void 0 : _source2$rigidBody$st.object,
397
436
  manifold,
398
437
  flipped
399
438
  });
400
- rigidBody2Events === null || rigidBody2Events === void 0 ? void 0 : (_rigidBody2Events$onC = rigidBody2Events.onCollisionEnter) === null || _rigidBody2Events$onC === void 0 ? void 0 : _rigidBody2Events$onC.call(rigidBody2Events, {
401
- rigidBody: rigidBody1,
402
- collider: collider1,
403
- colliderObject: collider1State === null || collider1State === void 0 ? void 0 : collider1State.object,
404
- rigidBodyObject: rigidBody1State === null || rigidBody1State === void 0 ? void 0 : rigidBody1State.object,
439
+ (_source2$rigidBody$ev = source2.rigidBody.events) === null || _source2$rigidBody$ev === void 0 ? void 0 : (_source2$rigidBody$ev2 = _source2$rigidBody$ev.onCollisionEnter) === null || _source2$rigidBody$ev2 === void 0 ? void 0 : _source2$rigidBody$ev2.call(_source2$rigidBody$ev, {
440
+ rigidBody: source1.rigidBody.object,
441
+ collider: source1.collider.object,
442
+ colliderObject: (_source1$collider$sta = source1.collider.state) === null || _source1$collider$sta === void 0 ? void 0 : _source1$collider$sta.object,
443
+ rigidBodyObject: (_source1$rigidBody$st = source1.rigidBody.state) === null || _source1$rigidBody$st === void 0 ? void 0 : _source1$rigidBody$st.object,
405
444
  manifold,
406
445
  flipped
407
446
  });
408
447
  /* Collider events */
409
448
 
410
- collider1Events === null || collider1Events === void 0 ? void 0 : (_collider1Events$onCo = collider1Events.onCollisionEnter) === null || _collider1Events$onCo === void 0 ? void 0 : _collider1Events$onCo.call(collider1Events, {
411
- rigidBody: rigidBody2,
412
- collider: collider2,
413
- colliderObject: collider2State === null || collider2State === void 0 ? void 0 : collider2State.object,
414
- rigidBodyObject: rigidBody2State === null || rigidBody2State === void 0 ? void 0 : rigidBody2State.object,
449
+ (_source1$collider$eve = source1.collider.events) === null || _source1$collider$eve === void 0 ? void 0 : (_source1$collider$eve2 = _source1$collider$eve.onCollisionEnter) === null || _source1$collider$eve2 === void 0 ? void 0 : _source1$collider$eve2.call(_source1$collider$eve, {
450
+ rigidBody: source2.rigidBody.object,
451
+ collider: source2.collider.object,
452
+ colliderObject: (_source2$collider$sta2 = source2.collider.state) === null || _source2$collider$sta2 === void 0 ? void 0 : _source2$collider$sta2.object,
453
+ rigidBodyObject: (_source2$rigidBody$st2 = source2.rigidBody.state) === null || _source2$rigidBody$st2 === void 0 ? void 0 : _source2$rigidBody$st2.object,
415
454
  manifold,
416
455
  flipped
417
456
  });
418
- collider2Events === null || collider2Events === void 0 ? void 0 : (_collider2Events$onCo = collider2Events.onCollisionEnter) === null || _collider2Events$onCo === void 0 ? void 0 : _collider2Events$onCo.call(collider2Events, {
419
- rigidBody: rigidBody1,
420
- collider: collider1,
421
- colliderObject: collider1State === null || collider1State === void 0 ? void 0 : collider1State.object,
422
- rigidBodyObject: rigidBody1State === null || rigidBody1State === void 0 ? void 0 : rigidBody1State.object,
457
+ (_source2$collider$eve = source2.collider.events) === null || _source2$collider$eve === void 0 ? void 0 : (_source2$collider$eve2 = _source2$collider$eve.onCollisionEnter) === null || _source2$collider$eve2 === void 0 ? void 0 : _source2$collider$eve2.call(_source2$collider$eve, {
458
+ rigidBody: source1.rigidBody.object,
459
+ collider: source1.collider.object,
460
+ colliderObject: (_source1$collider$sta2 = source1.collider.state) === null || _source1$collider$sta2 === void 0 ? void 0 : _source1$collider$sta2.object,
461
+ rigidBodyObject: (_source1$rigidBody$st2 = source1.rigidBody.state) === null || _source1$rigidBody$st2 === void 0 ? void 0 : _source1$rigidBody$st2.object,
423
462
  manifold,
424
463
  flipped
425
464
  });
426
465
  });
427
466
  } else {
428
- var _rigidBody1Events$onC2, _rigidBody2Events$onC2, _collider1Events$onCo2, _collider2Events$onCo2;
467
+ var _source1$rigidBody$ev3, _source1$rigidBody$ev4, _source2$rigidBody$ev3, _source2$rigidBody$ev4, _source1$collider$eve3, _source1$collider$eve4, _source2$collider$eve3, _source2$collider$eve4;
429
468
 
430
- rigidBody1Events === null || rigidBody1Events === void 0 ? void 0 : (_rigidBody1Events$onC2 = rigidBody1Events.onCollisionExit) === null || _rigidBody1Events$onC2 === void 0 ? void 0 : _rigidBody1Events$onC2.call(rigidBody1Events, {
431
- rigidBody: rigidBody2,
432
- collider: collider2
469
+ (_source1$rigidBody$ev3 = source1.rigidBody.events) === null || _source1$rigidBody$ev3 === void 0 ? void 0 : (_source1$rigidBody$ev4 = _source1$rigidBody$ev3.onCollisionExit) === null || _source1$rigidBody$ev4 === void 0 ? void 0 : _source1$rigidBody$ev4.call(_source1$rigidBody$ev3, {
470
+ rigidBody: source2.rigidBody.object,
471
+ collider: source2.collider.object
433
472
  });
434
- rigidBody2Events === null || rigidBody2Events === void 0 ? void 0 : (_rigidBody2Events$onC2 = rigidBody2Events.onCollisionExit) === null || _rigidBody2Events$onC2 === void 0 ? void 0 : _rigidBody2Events$onC2.call(rigidBody2Events, {
435
- rigidBody: rigidBody1,
436
- collider: collider1
473
+ (_source2$rigidBody$ev3 = source2.rigidBody.events) === null || _source2$rigidBody$ev3 === void 0 ? void 0 : (_source2$rigidBody$ev4 = _source2$rigidBody$ev3.onCollisionExit) === null || _source2$rigidBody$ev4 === void 0 ? void 0 : _source2$rigidBody$ev4.call(_source2$rigidBody$ev3, {
474
+ rigidBody: source1.rigidBody.object,
475
+ collider: source1.collider.object
437
476
  });
438
- collider1Events === null || collider1Events === void 0 ? void 0 : (_collider1Events$onCo2 = collider1Events.onCollisionExit) === null || _collider1Events$onCo2 === void 0 ? void 0 : _collider1Events$onCo2.call(collider1Events, {
439
- rigidBody: rigidBody2,
440
- collider: collider2
477
+ (_source1$collider$eve3 = source1.collider.events) === null || _source1$collider$eve3 === void 0 ? void 0 : (_source1$collider$eve4 = _source1$collider$eve3.onCollisionExit) === null || _source1$collider$eve4 === void 0 ? void 0 : _source1$collider$eve4.call(_source1$collider$eve3, {
478
+ rigidBody: source2.rigidBody.object,
479
+ collider: source2.collider.object
441
480
  });
442
- collider2Events === null || collider2Events === void 0 ? void 0 : (_collider2Events$onCo2 = collider2Events.onCollisionExit) === null || _collider2Events$onCo2 === void 0 ? void 0 : _collider2Events$onCo2.call(collider2Events, {
443
- rigidBody: rigidBody1,
444
- collider: collider1
481
+ (_source2$collider$eve3 = source2.collider.events) === null || _source2$collider$eve3 === void 0 ? void 0 : (_source2$collider$eve4 = _source2$collider$eve3.onCollisionExit) === null || _source2$collider$eve4 === void 0 ? void 0 : _source2$collider$eve4.call(_source2$collider$eve3, {
482
+ rigidBody: source1.rigidBody.object,
483
+ collider: source1.collider.object
445
484
  });
446
485
  } // Sensor Intersections
447
486
 
448
487
 
449
488
  if (started) {
450
- if (world.intersectionPair(collider1, collider2)) {
451
- var _rigidBody1Events$onI, _rigidBody2Events$onI, _collider1Events$onIn, _collider2Events$onIn;
452
-
453
- rigidBody1Events === null || rigidBody1Events === void 0 ? void 0 : (_rigidBody1Events$onI = rigidBody1Events.onIntersectionEnter) === null || _rigidBody1Events$onI === void 0 ? void 0 : _rigidBody1Events$onI.call(rigidBody1Events, {
454
- rigidBody: rigidBody2,
455
- collider: collider2,
456
- colliderObject: collider2State === null || collider2State === void 0 ? void 0 : collider2State.object,
457
- rigidBodyObject: rigidBody2State === null || rigidBody2State === void 0 ? void 0 : rigidBody2State.object
489
+ if (world.intersectionPair(source1.collider.object, source2.collider.object)) {
490
+ var _source1$rigidBody$ev5, _source1$rigidBody$ev6, _source2$collider$sta3, _source2$rigidBody$st3, _source2$rigidBody$ev5, _source2$rigidBody$ev6, _source1$collider$sta3, _source1$rigidBody$st3, _source1$collider$eve5, _source1$collider$eve6, _source2$collider$sta4, _source2$rigidBody$st4, _source2$collider$eve5, _source2$collider$eve6, _source1$collider$sta4, _source1$rigidBody$st4;
491
+
492
+ (_source1$rigidBody$ev5 = source1.rigidBody.events) === null || _source1$rigidBody$ev5 === void 0 ? void 0 : (_source1$rigidBody$ev6 = _source1$rigidBody$ev5.onIntersectionEnter) === null || _source1$rigidBody$ev6 === void 0 ? void 0 : _source1$rigidBody$ev6.call(_source1$rigidBody$ev5, {
493
+ rigidBody: source2.rigidBody.object,
494
+ collider: source2.collider.object,
495
+ colliderObject: (_source2$collider$sta3 = source2.collider.state) === null || _source2$collider$sta3 === void 0 ? void 0 : _source2$collider$sta3.object,
496
+ rigidBodyObject: (_source2$rigidBody$st3 = source2.rigidBody.state) === null || _source2$rigidBody$st3 === void 0 ? void 0 : _source2$rigidBody$st3.object
458
497
  });
459
- rigidBody2Events === null || rigidBody2Events === void 0 ? void 0 : (_rigidBody2Events$onI = rigidBody2Events.onIntersectionEnter) === null || _rigidBody2Events$onI === void 0 ? void 0 : _rigidBody2Events$onI.call(rigidBody2Events, {
460
- rigidBody: rigidBody1,
461
- collider: collider1,
462
- colliderObject: collider1State === null || collider1State === void 0 ? void 0 : collider1State.object,
463
- rigidBodyObject: rigidBody1State === null || rigidBody1State === void 0 ? void 0 : rigidBody1State.object
498
+ (_source2$rigidBody$ev5 = source2.rigidBody.events) === null || _source2$rigidBody$ev5 === void 0 ? void 0 : (_source2$rigidBody$ev6 = _source2$rigidBody$ev5.onIntersectionEnter) === null || _source2$rigidBody$ev6 === void 0 ? void 0 : _source2$rigidBody$ev6.call(_source2$rigidBody$ev5, {
499
+ rigidBody: source1.rigidBody.object,
500
+ collider: source1.collider.object,
501
+ colliderObject: (_source1$collider$sta3 = source1.collider.state) === null || _source1$collider$sta3 === void 0 ? void 0 : _source1$collider$sta3.object,
502
+ rigidBodyObject: (_source1$rigidBody$st3 = source1.rigidBody.state) === null || _source1$rigidBody$st3 === void 0 ? void 0 : _source1$rigidBody$st3.object
464
503
  });
465
- collider1Events === null || collider1Events === void 0 ? void 0 : (_collider1Events$onIn = collider1Events.onIntersectionEnter) === null || _collider1Events$onIn === void 0 ? void 0 : _collider1Events$onIn.call(collider1Events, {
466
- rigidBody: rigidBody2,
467
- collider: collider2,
468
- colliderObject: collider2State === null || collider2State === void 0 ? void 0 : collider2State.object,
469
- rigidBodyObject: rigidBody2State === null || rigidBody2State === void 0 ? void 0 : rigidBody2State.object
504
+ (_source1$collider$eve5 = source1.collider.events) === null || _source1$collider$eve5 === void 0 ? void 0 : (_source1$collider$eve6 = _source1$collider$eve5.onIntersectionEnter) === null || _source1$collider$eve6 === void 0 ? void 0 : _source1$collider$eve6.call(_source1$collider$eve5, {
505
+ rigidBody: source2.rigidBody.object,
506
+ collider: source2.collider.object,
507
+ colliderObject: (_source2$collider$sta4 = source2.collider.state) === null || _source2$collider$sta4 === void 0 ? void 0 : _source2$collider$sta4.object,
508
+ rigidBodyObject: (_source2$rigidBody$st4 = source2.rigidBody.state) === null || _source2$rigidBody$st4 === void 0 ? void 0 : _source2$rigidBody$st4.object
470
509
  });
471
- collider2Events === null || collider2Events === void 0 ? void 0 : (_collider2Events$onIn = collider2Events.onIntersectionEnter) === null || _collider2Events$onIn === void 0 ? void 0 : _collider2Events$onIn.call(collider2Events, {
472
- rigidBody: rigidBody1,
473
- collider: collider1,
474
- colliderObject: collider1State === null || collider1State === void 0 ? void 0 : collider1State.object,
475
- rigidBodyObject: rigidBody1State === null || rigidBody1State === void 0 ? void 0 : rigidBody1State.object
510
+ (_source2$collider$eve5 = source2.collider.events) === null || _source2$collider$eve5 === void 0 ? void 0 : (_source2$collider$eve6 = _source2$collider$eve5.onIntersectionEnter) === null || _source2$collider$eve6 === void 0 ? void 0 : _source2$collider$eve6.call(_source2$collider$eve5, {
511
+ rigidBody: source1.rigidBody.object,
512
+ collider: source1.collider.object,
513
+ colliderObject: (_source1$collider$sta4 = source1.collider.state) === null || _source1$collider$sta4 === void 0 ? void 0 : _source1$collider$sta4.object,
514
+ rigidBodyObject: (_source1$rigidBody$st4 = source1.rigidBody.state) === null || _source1$rigidBody$st4 === void 0 ? void 0 : _source1$rigidBody$st4.object
476
515
  });
477
516
  }
478
517
  } else {
479
- var _rigidBody1Events$onI2, _rigidBody2Events$onI2, _collider1Events$onIn2, _collider2Events$onIn2;
518
+ var _source1$rigidBody$ev7, _source1$rigidBody$ev8, _source2$rigidBody$ev7, _source2$rigidBody$ev8, _source1$collider$eve7, _source1$collider$eve8, _source2$collider$eve7, _source2$collider$eve8;
480
519
 
481
- rigidBody1Events === null || rigidBody1Events === void 0 ? void 0 : (_rigidBody1Events$onI2 = rigidBody1Events.onIntersectionExit) === null || _rigidBody1Events$onI2 === void 0 ? void 0 : _rigidBody1Events$onI2.call(rigidBody1Events, {
482
- rigidBody: rigidBody2,
483
- collider: collider2
520
+ (_source1$rigidBody$ev7 = source1.rigidBody.events) === null || _source1$rigidBody$ev7 === void 0 ? void 0 : (_source1$rigidBody$ev8 = _source1$rigidBody$ev7.onIntersectionExit) === null || _source1$rigidBody$ev8 === void 0 ? void 0 : _source1$rigidBody$ev8.call(_source1$rigidBody$ev7, {
521
+ rigidBody: source2.rigidBody.object,
522
+ collider: source2.collider.object
484
523
  });
485
- rigidBody2Events === null || rigidBody2Events === void 0 ? void 0 : (_rigidBody2Events$onI2 = rigidBody2Events.onIntersectionExit) === null || _rigidBody2Events$onI2 === void 0 ? void 0 : _rigidBody2Events$onI2.call(rigidBody2Events, {
486
- rigidBody: rigidBody1,
487
- collider: collider1
524
+ (_source2$rigidBody$ev7 = source2.rigidBody.events) === null || _source2$rigidBody$ev7 === void 0 ? void 0 : (_source2$rigidBody$ev8 = _source2$rigidBody$ev7.onIntersectionExit) === null || _source2$rigidBody$ev8 === void 0 ? void 0 : _source2$rigidBody$ev8.call(_source2$rigidBody$ev7, {
525
+ rigidBody: source1.rigidBody.object,
526
+ collider: source1.collider.object
488
527
  });
489
- collider1Events === null || collider1Events === void 0 ? void 0 : (_collider1Events$onIn2 = collider1Events.onIntersectionExit) === null || _collider1Events$onIn2 === void 0 ? void 0 : _collider1Events$onIn2.call(collider1Events, {
490
- rigidBody: rigidBody2,
491
- collider: collider2
528
+ (_source1$collider$eve7 = source1.collider.events) === null || _source1$collider$eve7 === void 0 ? void 0 : (_source1$collider$eve8 = _source1$collider$eve7.onIntersectionExit) === null || _source1$collider$eve8 === void 0 ? void 0 : _source1$collider$eve8.call(_source1$collider$eve7, {
529
+ rigidBody: source2.rigidBody.object,
530
+ collider: source2.collider.object
492
531
  });
493
- collider2Events === null || collider2Events === void 0 ? void 0 : (_collider2Events$onIn2 = collider2Events.onIntersectionExit) === null || _collider2Events$onIn2 === void 0 ? void 0 : _collider2Events$onIn2.call(collider2Events, {
494
- rigidBody: rigidBody1,
495
- collider: collider1
532
+ (_source2$collider$eve7 = source2.collider.events) === null || _source2$collider$eve7 === void 0 ? void 0 : (_source2$collider$eve8 = _source2$collider$eve7.onIntersectionExit) === null || _source2$collider$eve8 === void 0 ? void 0 : _source2$collider$eve8.call(_source2$collider$eve7, {
533
+ rigidBody: source1.rigidBody.object,
534
+ collider: source1.collider.object
496
535
  });
497
536
  }
498
537
  });
538
+ eventQueue.drainContactForceEvents(event => {
539
+ var _source1$rigidBody$ev9, _source1$rigidBody$ev10, _source2$collider$sta5, _source2$rigidBody$st5, _source2$rigidBody$ev9, _source2$rigidBody$ev10, _source1$collider$sta5, _source1$rigidBody$st5, _source1$collider$eve9, _source1$collider$eve10, _source2$collider$sta6, _source2$rigidBody$st6, _source2$collider$eve9, _source2$collider$eve10, _source1$collider$sta6, _source1$rigidBody$st6;
540
+
541
+ const source1 = getSourceFromColliderHandle(event.collider1());
542
+ const source2 = getSourceFromColliderHandle(event.collider2()); // Collision Events
543
+
544
+ if (!(source1 !== null && source1 !== void 0 && source1.collider.object) || !(source2 !== null && source2 !== void 0 && source2.collider.object)) {
545
+ return;
546
+ }
547
+
548
+ (_source1$rigidBody$ev9 = source1.rigidBody.events) === null || _source1$rigidBody$ev9 === void 0 ? void 0 : (_source1$rigidBody$ev10 = _source1$rigidBody$ev9.onContactForce) === null || _source1$rigidBody$ev10 === void 0 ? void 0 : _source1$rigidBody$ev10.call(_source1$rigidBody$ev9, {
549
+ rigidBody: source2.rigidBody.object,
550
+ collider: source2.collider.object,
551
+ colliderObject: (_source2$collider$sta5 = source2.collider.state) === null || _source2$collider$sta5 === void 0 ? void 0 : _source2$collider$sta5.object,
552
+ rigidBodyObject: (_source2$rigidBody$st5 = source2.rigidBody.state) === null || _source2$rigidBody$st5 === void 0 ? void 0 : _source2$rigidBody$st5.object,
553
+ totalForce: event.totalForce(),
554
+ totalForceMagnitude: event.totalForceMagnitude(),
555
+ maxForceDirection: event.maxForceDirection(),
556
+ maxForceMagnitude: event.maxForceMagnitude()
557
+ });
558
+ (_source2$rigidBody$ev9 = source2.rigidBody.events) === null || _source2$rigidBody$ev9 === void 0 ? void 0 : (_source2$rigidBody$ev10 = _source2$rigidBody$ev9.onContactForce) === null || _source2$rigidBody$ev10 === void 0 ? void 0 : _source2$rigidBody$ev10.call(_source2$rigidBody$ev9, {
559
+ rigidBody: source1.rigidBody.object,
560
+ collider: source1.collider.object,
561
+ colliderObject: (_source1$collider$sta5 = source1.collider.state) === null || _source1$collider$sta5 === void 0 ? void 0 : _source1$collider$sta5.object,
562
+ rigidBodyObject: (_source1$rigidBody$st5 = source1.rigidBody.state) === null || _source1$rigidBody$st5 === void 0 ? void 0 : _source1$rigidBody$st5.object,
563
+ totalForce: event.totalForce(),
564
+ totalForceMagnitude: event.totalForceMagnitude(),
565
+ maxForceDirection: event.maxForceDirection(),
566
+ maxForceMagnitude: event.maxForceMagnitude()
567
+ });
568
+ (_source1$collider$eve9 = source1.collider.events) === null || _source1$collider$eve9 === void 0 ? void 0 : (_source1$collider$eve10 = _source1$collider$eve9.onContactForce) === null || _source1$collider$eve10 === void 0 ? void 0 : _source1$collider$eve10.call(_source1$collider$eve9, {
569
+ rigidBody: source2.rigidBody.object,
570
+ collider: source2.collider.object,
571
+ colliderObject: (_source2$collider$sta6 = source2.collider.state) === null || _source2$collider$sta6 === void 0 ? void 0 : _source2$collider$sta6.object,
572
+ rigidBodyObject: (_source2$rigidBody$st6 = source2.rigidBody.state) === null || _source2$rigidBody$st6 === void 0 ? void 0 : _source2$rigidBody$st6.object,
573
+ totalForce: event.totalForce(),
574
+ totalForceMagnitude: event.totalForceMagnitude(),
575
+ maxForceDirection: event.maxForceDirection(),
576
+ maxForceMagnitude: event.maxForceMagnitude()
577
+ });
578
+ (_source2$collider$eve9 = source2.collider.events) === null || _source2$collider$eve9 === void 0 ? void 0 : (_source2$collider$eve10 = _source2$collider$eve9.onContactForce) === null || _source2$collider$eve10 === void 0 ? void 0 : _source2$collider$eve10.call(_source2$collider$eve9, {
579
+ rigidBody: source1.rigidBody.object,
580
+ collider: source1.collider.object,
581
+ colliderObject: (_source1$collider$sta6 = source1.collider.state) === null || _source1$collider$sta6 === void 0 ? void 0 : _source1$collider$sta6.object,
582
+ rigidBodyObject: (_source1$rigidBody$st6 = source1.rigidBody.state) === null || _source1$rigidBody$st6 === void 0 ? void 0 : _source1$rigidBody$st6.object,
583
+ totalForce: event.totalForce(),
584
+ totalForceMagnitude: event.totalForceMagnitude(),
585
+ maxForceDirection: event.maxForceDirection(),
586
+ maxForceMagnitude: event.maxForceMagnitude()
587
+ });
588
+ });
499
589
  }, updatePriority);
500
590
  const api = React.useMemo(() => createWorldApi(getWorldRef), []);
501
591
  const context = React.useMemo(() => ({
@@ -608,148 +698,6 @@ function _objectSpread2(target) {
608
698
  return target;
609
699
  }
610
700
 
611
- const rigidBodyDescFromOptions = options => {
612
- const type = rigidBodyTypeFromString((options === null || options === void 0 ? void 0 : options.type) || "dynamic");
613
- const desc = new rapier3dCompat.RigidBodyDesc(type);
614
- return desc;
615
- };
616
- const createRigidBodyState = ({
617
- rigidBody,
618
- object,
619
- setMatrix,
620
- getMatrix,
621
- worldScale
622
- }) => {
623
- object.updateWorldMatrix(true, false);
624
- const invertedWorldMatrix = object.parent.matrixWorld.clone().invert();
625
- return {
626
- object,
627
- rigidBody,
628
- invertedWorldMatrix,
629
- setMatrix: setMatrix ? setMatrix : matrix => {
630
- object.matrix.copy(matrix);
631
- },
632
- getMatrix: getMatrix ? getMatrix : matrix => matrix.copy(object.matrix),
633
- scale: worldScale || object.getWorldScale(_scale).clone(),
634
- isSleeping: false
635
- };
636
- };
637
- const mutableRigidBodyOptions = {
638
- gravityScale: (rb, value) => {
639
- rb.setGravityScale(value, true);
640
- },
641
- linearDamping: (rb, value) => {
642
- rb.setLinearDamping(value);
643
- },
644
- angularDamping: (rb, value) => {
645
- rb.setAngularDamping(value);
646
- },
647
- enabledRotations: (rb, [x, y, z]) => {
648
- rb.setEnabledRotations(x, y, z, true);
649
- },
650
- enabledTranslations: (rb, [x, y, z]) => {
651
- rb.setEnabledTranslations(x, y, z, true);
652
- },
653
- angularVelocity: (rb, [x, y, z]) => {
654
- rb.setAngvel({
655
- x,
656
- y,
657
- z
658
- }, true);
659
- },
660
- linearVelocity: (rb, [x, y, z]) => {
661
- rb.setLinvel({
662
- x,
663
- y,
664
- z
665
- }, true);
666
- },
667
- ccd: (rb, value) => {
668
- rb.enableCcd(value);
669
- },
670
- position: () => {},
671
- rotation: () => {},
672
- quaternion: () => {},
673
- scale: () => {}
674
- };
675
- const mutableRigidBodyOptionKeys = Object.keys(mutableRigidBodyOptions);
676
- const setRigidBodyOptions = (rigidBody, options, states, updateTranslations = true) => {
677
- if (!rigidBody) {
678
- return;
679
- }
680
-
681
- const state = states.get(rigidBody.handle);
682
-
683
- if (state) {
684
- if (updateTranslations) {
685
- state.object.updateWorldMatrix(true, false);
686
-
687
- _matrix4.copy(state.object.matrixWorld).decompose(_position, _rotation, _scale);
688
-
689
- rigidBody.setTranslation(_position, false);
690
- rigidBody.setRotation(_rotation, false);
691
- }
692
-
693
- mutableRigidBodyOptionKeys.forEach(key => {
694
- if (key in options) {
695
- mutableRigidBodyOptions[key](rigidBody, options[key]);
696
- }
697
- });
698
- }
699
- };
700
- const useUpdateRigidBodyOptions = (rigidBodyRef, props, states, updateTranslations = true) => {
701
- // TODO: Improve this, split each prop into its own effect
702
- const mutablePropsAsFlatArray = React.useMemo(() => mutableRigidBodyOptionKeys.flatMap(key => {
703
- return vectorToTuple(props[key]);
704
- }), [props]);
705
- React.useEffect(() => {
706
- if (Array.isArray(rigidBodyRef.current)) {
707
- for (const rigidBody of rigidBodyRef.current) {
708
- setRigidBodyOptions(rigidBody, props, states, updateTranslations);
709
- }
710
- } else if (rigidBodyRef.current) {
711
- setRigidBodyOptions(rigidBodyRef.current, props, states, updateTranslations);
712
- }
713
- }, mutablePropsAsFlatArray);
714
- };
715
- const useRigidBodyEvents = (rigidBodyRef, props, events) => {
716
- const {
717
- onWake,
718
- onSleep,
719
- onCollisionEnter,
720
- onCollisionExit,
721
- onIntersectionEnter,
722
- onIntersectionExit
723
- } = props;
724
- const eventHandlers = {
725
- onWake,
726
- onSleep,
727
- onCollisionEnter,
728
- onCollisionExit,
729
- onIntersectionEnter,
730
- onIntersectionExit
731
- };
732
- React.useEffect(() => {
733
- if (Array.isArray(rigidBodyRef.current)) {
734
- for (const rigidBody of rigidBodyRef.current) {
735
- events.set(rigidBody.handle, eventHandlers);
736
- }
737
- } else if (rigidBodyRef.current) {
738
- events.set(rigidBodyRef.current.handle, eventHandlers);
739
- }
740
-
741
- return () => {
742
- if (Array.isArray(rigidBodyRef.current)) {
743
- for (const rigidBody of rigidBodyRef.current) {
744
- events.delete(rigidBody.handle);
745
- }
746
- } else if (rigidBodyRef.current) {
747
- events.delete(rigidBodyRef.current.handle);
748
- }
749
- };
750
- }, [onWake, onSleep, onCollisionEnter, onCollisionExit, onIntersectionEnter, onIntersectionExit]);
751
- };
752
-
753
701
  const scaleColliderArgs = (shape, args, scale) => {
754
702
  const newArgs = args.slice(); // Heightfield uses a vector
755
703
 
@@ -1006,21 +954,30 @@ const useColliderEvents = (collidersRef, props, events) => {
1006
954
  onCollisionEnter,
1007
955
  onCollisionExit,
1008
956
  onIntersectionEnter,
1009
- onIntersectionExit
957
+ onIntersectionExit,
958
+ onContactForce
1010
959
  } = props;
1011
960
  React.useEffect(() => {
1012
961
  var _collidersRef$current;
1013
962
 
1014
963
  (_collidersRef$current = collidersRef.current) === null || _collidersRef$current === void 0 ? void 0 : _collidersRef$current.forEach(collider => {
1015
- if (onCollisionEnter || onCollisionExit || onIntersectionEnter || onIntersectionExit) {
964
+ const hasCollisionEvent = !!(onCollisionEnter || onCollisionExit || onIntersectionEnter || onIntersectionExit);
965
+ const hasContactForceEvent = !!onContactForce;
966
+
967
+ if (hasCollisionEvent && hasContactForceEvent) {
968
+ collider.setActiveEvents(rapier3dCompat.ActiveEvents.COLLISION_EVENTS | rapier3dCompat.ActiveEvents.CONTACT_FORCE_EVENTS);
969
+ } else if (hasCollisionEvent) {
1016
970
  collider.setActiveEvents(rapier3dCompat.ActiveEvents.COLLISION_EVENTS);
971
+ } else if (hasContactForceEvent) {
972
+ collider.setActiveEvents(rapier3dCompat.ActiveEvents.CONTACT_FORCE_EVENTS);
1017
973
  }
1018
974
 
1019
975
  events.set(collider.handle, {
1020
976
  onCollisionEnter,
1021
977
  onCollisionExit,
1022
978
  onIntersectionEnter,
1023
- onIntersectionExit
979
+ onIntersectionExit,
980
+ onContactForce
1024
981
  });
1025
982
  });
1026
983
  return () => {
@@ -1028,7 +985,152 @@ const useColliderEvents = (collidersRef, props, events) => {
1028
985
 
1029
986
  (_collidersRef$current2 = collidersRef.current) === null || _collidersRef$current2 === void 0 ? void 0 : _collidersRef$current2.forEach(collider => events.delete(collider.handle));
1030
987
  };
1031
- }, [onCollisionEnter, onCollisionExit, onIntersectionEnter, onIntersectionExit]);
988
+ }, [onCollisionEnter, onCollisionExit, onIntersectionEnter, onIntersectionExit, onContactForce]);
989
+ };
990
+
991
+ const rigidBodyDescFromOptions = options => {
992
+ const type = rigidBodyTypeFromString((options === null || options === void 0 ? void 0 : options.type) || "dynamic");
993
+ const desc = new rapier3dCompat.RigidBodyDesc(type);
994
+ return desc;
995
+ };
996
+ const createRigidBodyState = ({
997
+ rigidBody,
998
+ object,
999
+ setMatrix,
1000
+ getMatrix,
1001
+ worldScale
1002
+ }) => {
1003
+ object.updateWorldMatrix(true, false);
1004
+ const invertedWorldMatrix = object.parent.matrixWorld.clone().invert();
1005
+ return {
1006
+ object,
1007
+ rigidBody,
1008
+ invertedWorldMatrix,
1009
+ setMatrix: setMatrix ? setMatrix : matrix => {
1010
+ object.matrix.copy(matrix);
1011
+ },
1012
+ getMatrix: getMatrix ? getMatrix : matrix => matrix.copy(object.matrix),
1013
+ scale: worldScale || object.getWorldScale(_scale).clone(),
1014
+ isSleeping: false
1015
+ };
1016
+ };
1017
+ const mutableRigidBodyOptions = {
1018
+ gravityScale: (rb, value) => {
1019
+ rb.setGravityScale(value, true);
1020
+ },
1021
+ linearDamping: (rb, value) => {
1022
+ rb.setLinearDamping(value);
1023
+ },
1024
+ angularDamping: (rb, value) => {
1025
+ rb.setAngularDamping(value);
1026
+ },
1027
+ enabledRotations: (rb, [x, y, z]) => {
1028
+ rb.setEnabledRotations(x, y, z, true);
1029
+ },
1030
+ enabledTranslations: (rb, [x, y, z]) => {
1031
+ rb.setEnabledTranslations(x, y, z, true);
1032
+ },
1033
+ angularVelocity: (rb, [x, y, z]) => {
1034
+ rb.setAngvel({
1035
+ x,
1036
+ y,
1037
+ z
1038
+ }, true);
1039
+ },
1040
+ linearVelocity: (rb, [x, y, z]) => {
1041
+ rb.setLinvel({
1042
+ x,
1043
+ y,
1044
+ z
1045
+ }, true);
1046
+ },
1047
+ ccd: (rb, value) => {
1048
+ rb.enableCcd(value);
1049
+ },
1050
+ userData: (rb, value) => {
1051
+ rb.userData = value;
1052
+ },
1053
+ position: () => {},
1054
+ rotation: () => {},
1055
+ quaternion: () => {},
1056
+ scale: () => {}
1057
+ };
1058
+ const mutableRigidBodyOptionKeys = Object.keys(mutableRigidBodyOptions);
1059
+ const setRigidBodyOptions = (rigidBody, options, states, updateTranslations = true) => {
1060
+ if (!rigidBody) {
1061
+ return;
1062
+ }
1063
+
1064
+ const state = states.get(rigidBody.handle);
1065
+
1066
+ if (state) {
1067
+ if (updateTranslations) {
1068
+ state.object.updateWorldMatrix(true, false);
1069
+
1070
+ _matrix4.copy(state.object.matrixWorld).decompose(_position, _rotation, _scale);
1071
+
1072
+ rigidBody.setTranslation(_position, false);
1073
+ rigidBody.setRotation(_rotation, false);
1074
+ }
1075
+
1076
+ mutableRigidBodyOptionKeys.forEach(key => {
1077
+ if (key in options) {
1078
+ mutableRigidBodyOptions[key](rigidBody, options[key]);
1079
+ }
1080
+ });
1081
+ }
1082
+ };
1083
+ const useUpdateRigidBodyOptions = (rigidBodyRef, props, states, updateTranslations = true) => {
1084
+ // TODO: Improve this, split each prop into its own effect
1085
+ const mutablePropsAsFlatArray = React.useMemo(() => mutableRigidBodyOptionKeys.flatMap(key => {
1086
+ return vectorToTuple(props[key]);
1087
+ }), [props]);
1088
+ React.useEffect(() => {
1089
+ if (Array.isArray(rigidBodyRef.current)) {
1090
+ for (const rigidBody of rigidBodyRef.current) {
1091
+ setRigidBodyOptions(rigidBody, props, states, updateTranslations);
1092
+ }
1093
+ } else if (rigidBodyRef.current) {
1094
+ setRigidBodyOptions(rigidBodyRef.current, props, states, updateTranslations);
1095
+ }
1096
+ }, mutablePropsAsFlatArray);
1097
+ };
1098
+ const useRigidBodyEvents = (rigidBodyRef, props, events) => {
1099
+ const {
1100
+ onWake,
1101
+ onSleep,
1102
+ onCollisionEnter,
1103
+ onCollisionExit,
1104
+ onIntersectionEnter,
1105
+ onIntersectionExit
1106
+ } = props;
1107
+ const eventHandlers = {
1108
+ onWake,
1109
+ onSleep,
1110
+ onCollisionEnter,
1111
+ onCollisionExit,
1112
+ onIntersectionEnter,
1113
+ onIntersectionExit
1114
+ };
1115
+ React.useEffect(() => {
1116
+ if (Array.isArray(rigidBodyRef.current)) {
1117
+ for (const rigidBody of rigidBodyRef.current) {
1118
+ events.set(rigidBody.handle, eventHandlers);
1119
+ }
1120
+ } else if (rigidBodyRef.current) {
1121
+ events.set(rigidBodyRef.current.handle, eventHandlers);
1122
+ }
1123
+
1124
+ return () => {
1125
+ if (Array.isArray(rigidBodyRef.current)) {
1126
+ for (const rigidBody of rigidBodyRef.current) {
1127
+ events.delete(rigidBody.handle);
1128
+ }
1129
+ } else if (rigidBodyRef.current) {
1130
+ events.delete(rigidBodyRef.current.handle);
1131
+ }
1132
+ };
1133
+ }, [onWake, onSleep, onCollisionEnter, onCollisionExit, onIntersectionEnter, onIntersectionExit]);
1032
1134
  };
1033
1135
 
1034
1136
  const useRapier = () => {
@@ -1081,10 +1183,8 @@ const useRigidBody = (options = {}) => {
1081
1183
 
1082
1184
  if (!ref.current) {
1083
1185
  ref.current = new three.Object3D();
1084
- } // isSleeping used for onSleep and onWake events
1085
-
1186
+ }
1086
1187
 
1087
- ref.current.userData.isSleeping = false;
1088
1188
  rigidBodyStates.set(rigidBody.handle, createRigidBodyState({
1089
1189
  rigidBody,
1090
1190
  object: ref.current
@@ -1195,7 +1295,8 @@ const AnyCollider = /*#__PURE__*/React.memo( /*#__PURE__*/React__default["defaul
1195
1295
  position,
1196
1296
  rotation,
1197
1297
  quaternion,
1198
- scale
1298
+ scale,
1299
+ name
1199
1300
  } = props;
1200
1301
  const {
1201
1302
  world,
@@ -1255,7 +1356,8 @@ const AnyCollider = /*#__PURE__*/React.memo( /*#__PURE__*/React__default["defaul
1255
1356
  rotation: rotation,
1256
1357
  quaternion: quaternion,
1257
1358
  scale: scale,
1258
- ref: ref
1359
+ ref: ref,
1360
+ name: name
1259
1361
  }, children);
1260
1362
  }));
1261
1363
  const CuboidCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {