@react-three/rapier 0.4.1 → 0.5.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.
@@ -113,7 +113,8 @@ const createColliderFromOptions = (options, world, rigidBody, scale = {
113
113
  const collider = world.createCollider(colliderDesc, rigidBody);
114
114
  return collider;
115
115
  };
116
- const createCollidersFromChildren = (object, rigidBody, type, world, hasCollisionEvents = false) => {
116
+ const createCollidersFromChildren = (object, rigidBody, options, world) => {
117
+ const hasCollisionEvents = !!(options.onCollisionEnter || options.onCollisionExit);
117
118
  const colliders = [];
118
119
  let desc;
119
120
  let offset = new three.Vector3();
@@ -135,7 +136,7 @@ const createCollidersFromChildren = (object, rigidBody, type, world, hasCollisio
135
136
  } = new three.Quaternion().setFromEuler(child.rotation);
136
137
  const scale = child.getWorldScale(new three.Vector3());
137
138
 
138
- switch (type) {
139
+ switch (options.colliders) {
139
140
  case "cuboid":
140
141
  {
141
142
  geometry.computeBoundingBox();
@@ -186,11 +187,9 @@ const createCollidersFromChildren = (object, rigidBody, type, world, hasCollisio
186
187
  z: rz,
187
188
  w: rw
188
189
  });
189
-
190
- if (hasCollisionEvents) {
191
- desc.setActiveEvents(rapier3dCompat.ActiveEvents.COLLISION_EVENTS);
192
- }
193
-
190
+ if (hasCollisionEvents) desc.setActiveEvents(rapier3dCompat.ActiveEvents.COLLISION_EVENTS);
191
+ if (Number.isFinite(options.friction)) desc.setFriction(options.friction);
192
+ if (Number.isFinite(options.restitution)) desc.setRestitution(options.restitution);
194
193
  const collider = world.createCollider(desc, rigidBody);
195
194
  colliders.push(collider);
196
195
  }
@@ -208,6 +207,11 @@ const scaleVertices = (vertices, scale) => {
208
207
 
209
208
  return scaledVerts;
210
209
  };
210
+ const quaternion = new three.Quaternion();
211
+ const euler = new three.Euler();
212
+ const vector3ToQuaternion = v => {
213
+ return quaternion.setFromEuler(euler.setFromVector3(v));
214
+ };
211
215
 
212
216
  function _defineProperty(obj, key, value) {
213
217
  if (key in obj) {
@@ -319,12 +323,26 @@ const createRigidBodyApi = ref => {
319
323
  },
320
324
 
321
325
  setAngvel: velocity => ref.current().setAngvel(velocity, true),
322
- setNextKinematicRotation: rotation => ref.current().setNextKinematicRotation(_objectSpread2(_objectSpread2({}, rotation), {}, {
323
- w: 1
324
- })),
326
+ setNextKinematicRotation: ({
327
+ x,
328
+ y,
329
+ z
330
+ }) => {
331
+ const q = vector3ToQuaternion(new three.Vector3(x, y, z));
332
+ ref.current().setNextKinematicRotation({
333
+ x: q.x,
334
+ y: q.y,
335
+ z: q.z,
336
+ w: q.w
337
+ });
338
+ },
325
339
  setNextKinematicTranslation: translation => ref.current().setNextKinematicTranslation(translation),
326
340
  resetForces: () => ref.current().resetForces(true),
327
- resetTorques: () => ref.current().resetTorques(true)
341
+ resetTorques: () => ref.current().resetTorques(true),
342
+ lockRotations: locked => ref.current().lockRotations(locked, true),
343
+ lockTranslations: locked => ref.current().lockTranslations(locked, true),
344
+ setEnabledRotations: (x, y, z) => ref.current().setEnabledRotations(x, y, z, true),
345
+ setEnabledTranslations: (x, y, z) => ref.current().setEnabledTranslations(x, y, z, true)
328
346
  };
329
347
  }; // TODO: Flesh this out
330
348
 
@@ -349,7 +367,16 @@ const createWorldApi = ref => {
349
367
  removeCollider: collider => ref.current().removeCollider(collider, true),
350
368
  createImpulseJoint: (params, rigidBodyA, rigidBodyB) => ref.current().createImpulseJoint(params, rigidBodyA, rigidBodyB, true),
351
369
  removeImpulseJoint: joint => ref.current().removeImpulseJoint(joint, true),
352
- forEachCollider: callback => ref.current().forEachCollider(callback)
370
+ forEachCollider: callback => ref.current().forEachCollider(callback),
371
+ setGravity: ({
372
+ x,
373
+ y,
374
+ z
375
+ }) => ref.current().gravity = {
376
+ x,
377
+ y,
378
+ z
379
+ }
353
380
  };
354
381
  }; // TODO: Broken currently, waiting for Rapier3D to fix
355
382
 
@@ -377,7 +404,8 @@ const importRapier = async () => {
377
404
  const Physics = ({
378
405
  colliders: _colliders = 'cuboid',
379
406
  gravity: _gravity = [0, -9.81, 0],
380
- children
407
+ children,
408
+ timeStep: _timeStep = 'vary'
381
409
  }) => {
382
410
  const rapier = useAsset.useAsset(importRapier);
383
411
  const worldRef = React.useRef();
@@ -402,7 +430,15 @@ const Physics = ({
402
430
  worldRef.current = undefined;
403
431
  }
404
432
  };
405
- }, []);
433
+ }, []); // Update gravity
434
+
435
+ React.useEffect(() => {
436
+ const world = worldRef.current;
437
+
438
+ if (world) {
439
+ world.gravity = vectorArrayToObject(_gravity);
440
+ }
441
+ }, [_gravity]);
406
442
  const time = React.useRef(performance.now());
407
443
  fiber.useFrame(context => {
408
444
  const world = worldRef.current;
@@ -411,7 +447,13 @@ const Physics = ({
411
447
 
412
448
  const now = performance.now();
413
449
  const delta = Math.min(100, now - time.current);
414
- world.timestep = delta / 1000;
450
+
451
+ if (_timeStep === 'vary') {
452
+ world.timestep = delta / 1000;
453
+ } else {
454
+ world.timestep = _timeStep;
455
+ }
456
+
415
457
  world.step(eventQueue); // Update meshes
416
458
 
417
459
  rigidBodyMeshes.forEach((mesh, handle) => {
@@ -540,7 +582,7 @@ const useRigidBody = (options = {}) => {
540
582
  const rigidBodyRef = React.useRef();
541
583
  const getRigidBodyRef = React.useRef(() => {
542
584
  if (!rigidBodyRef.current) {
543
- var _options$linearVeloci, _options$angularVeloc, _options$gravityScale, _options$canSleep, _options$ccd;
585
+ var _options$linearVeloci, _options$angularVeloc, _options$gravityScale, _options$canSleep, _options$ccd, _options$enabledRotat, _options$enabledTrans;
544
586
 
545
587
  const type = rigidBodyTypeFromString((options === null || options === void 0 ? void 0 : options.type) || "dynamic");
546
588
  const [lvx, lvy, lvz] = (_options$linearVeloci = options === null || options === void 0 ? void 0 : options.linearVelocity) !== null && _options$linearVeloci !== void 0 ? _options$linearVeloci : [0, 0, 0];
@@ -548,11 +590,15 @@ const useRigidBody = (options = {}) => {
548
590
  const gravityScale = (_options$gravityScale = options === null || options === void 0 ? void 0 : options.gravityScale) !== null && _options$gravityScale !== void 0 ? _options$gravityScale : 1;
549
591
  const canSleep = (_options$canSleep = options === null || options === void 0 ? void 0 : options.canSleep) !== null && _options$canSleep !== void 0 ? _options$canSleep : true;
550
592
  const ccdEnabled = (_options$ccd = options === null || options === void 0 ? void 0 : options.ccd) !== null && _options$ccd !== void 0 ? _options$ccd : false;
593
+ const [erx, ery, erz] = (_options$enabledRotat = options === null || options === void 0 ? void 0 : options.enabledRotations) !== null && _options$enabledRotat !== void 0 ? _options$enabledRotat : [true, true, true];
594
+ const [etx, ety, etz] = (_options$enabledTrans = options === null || options === void 0 ? void 0 : options.enabledTranslations) !== null && _options$enabledTrans !== void 0 ? _options$enabledTrans : [true, true, true];
551
595
  const desc = new rapier.RigidBodyDesc(type).setLinvel(lvx, lvy, lvz).setAngvel({
552
596
  x: avx,
553
597
  y: avy,
554
598
  z: avz
555
- }).setGravityScale(gravityScale).setCanSleep(canSleep).setCcdEnabled(ccdEnabled);
599
+ }).setGravityScale(gravityScale).setCanSleep(canSleep).setCcdEnabled(ccdEnabled).enabledRotations(erx, ery, erz).enabledTranslations(etx, ety, etz);
600
+ if (options.lockRotations) desc.lockRotations();
601
+ if (options.lockTranslations) desc.lockTranslations();
556
602
  const rigidBody = world.createRigidBody(desc);
557
603
  rigidBodyRef.current = world.getRigidBody(rigidBody.handle);
558
604
  }
@@ -600,9 +646,9 @@ const useRigidBody = (options = {}) => {
600
646
  rigidBody.resetForces(false);
601
647
  rigidBody.resetTorques(false);
602
648
  const colliderSetting = (_ref = (_options$colliders = options === null || options === void 0 ? void 0 : options.colliders) !== null && _options$colliders !== void 0 ? _options$colliders : physicsOptions.colliders) !== null && _ref !== void 0 ? _ref : false;
603
- const hasCollisionEvents = !!(options.onCollisionEnter || options.onCollisionExit);
604
- const autoColliders = colliderSetting !== false ? createCollidersFromChildren(ref.current, rigidBody, colliderSetting, world, hasCollisionEvents) : [];
605
- rigidBody.wakeUp();
649
+ const autoColliders = colliderSetting !== false ? createCollidersFromChildren(ref.current, rigidBody, _objectSpread2(_objectSpread2({}, options), {}, {
650
+ colliders: colliderSetting
651
+ }), world) : [];
606
652
  rigidBodyMeshes.set(rigidBody.handle, ref.current);
607
653
  return () => {
608
654
  world.removeRigidBody(rigidBody);
@@ -649,142 +695,6 @@ const useCollider = (body, options = {}) => {
649
695
  }, []);
650
696
  const api = React.useMemo(() => createColliderApi(getColliderRef), []);
651
697
  return [objectRef, api];
652
- };
653
- const useRigidBodyWithCollider = (rigidBodyOptions, colliderOptions) => {
654
- const {
655
- world
656
- } = useRapier();
657
- const [ref, rigidBody] = useRigidBody(rigidBodyOptions);
658
- React.useEffect(() => {
659
- if (!colliderOptions) {
660
- return;
661
- }
662
-
663
- const scale = ref.current.getWorldScale(new three.Vector3());
664
- const collider = createColliderFromOptions(colliderOptions, world, world.getRigidBody(rigidBody.handle), scale);
665
- return () => {
666
- world.removeCollider(collider);
667
- };
668
- }, []);
669
- return [ref, rigidBody];
670
- };
671
- const useCuboid = (rigidBodyOptions = {}, colliderOptions = {}) => {
672
- var _colliderOptions$args;
673
-
674
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
675
- shape: "cuboid",
676
- args: (_colliderOptions$args = colliderOptions.args) !== null && _colliderOptions$args !== void 0 ? _colliderOptions$args : [0.5, 0.5, 0.5]
677
- }, colliderOptions));
678
- };
679
- const useBall = (rigidBodyOptions = {}, colliderOptions = {}) => {
680
- var _colliderOptions$args2;
681
-
682
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
683
- shape: "ball",
684
- args: (_colliderOptions$args2 = colliderOptions.args) !== null && _colliderOptions$args2 !== void 0 ? _colliderOptions$args2 : [0.5]
685
- }, colliderOptions));
686
- };
687
- const useCapsule = (rigidBodyOptions = {}, colliderOptions = {}) => {
688
- var _colliderOptions$args3;
689
-
690
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
691
- shape: "capsule",
692
- args: (_colliderOptions$args3 = colliderOptions.args) !== null && _colliderOptions$args3 !== void 0 ? _colliderOptions$args3 : [0.5, 0.5]
693
- }, colliderOptions));
694
- };
695
- const useHeightfield = (rigidBodyOptions = {}, colliderOptions = {}) => {
696
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
697
- shape: "heightfield"
698
- }, colliderOptions));
699
- };
700
- /**
701
- * Create a trimesh collider and rigid body.
702
- * Note that Trimeshes don't have mass unless provided.
703
- * See https://rapier.rs/docs/user_guides/javascript/rigid_bodies#mass-properties
704
- * for available properties.
705
- */
706
-
707
- const useTrimesh = (rigidBodyOptions = {}, colliderOptions = {}) => {
708
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
709
- shape: "trimesh"
710
- }, colliderOptions));
711
- };
712
-
713
- useTrimesh.fromMesh = (mesh, rigidBodyOptions = {}, colliderOptions = {}) => {
714
- var _mesh$geometry, _mesh$geometry$index;
715
-
716
- return useTrimesh(rigidBodyOptions, _objectSpread2({
717
- args: [mesh.geometry.attributes.position.array, ((_mesh$geometry = mesh.geometry) === null || _mesh$geometry === void 0 ? void 0 : (_mesh$geometry$index = _mesh$geometry.index) === null || _mesh$geometry$index === void 0 ? void 0 : _mesh$geometry$index.array) || []]
718
- }, colliderOptions));
719
- };
720
-
721
- const usePolyline = (rigidBodyOptions = {}, colliderOptions = {}) => {
722
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
723
- shape: "polyline"
724
- }, colliderOptions));
725
- };
726
- const useRoundCuboid = (rigidBodyOptions = {}, colliderOptions = {}) => {
727
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
728
- shape: "roundCuboid"
729
- }, colliderOptions));
730
- };
731
- const useCylinder = (rigidBodyOptions = {}, colliderOptions = {}) => {
732
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
733
- shape: "cylinder"
734
- }, colliderOptions));
735
- };
736
- const useRoundCylinder = (rigidBodyOptions = {}, colliderOptions = {}) => {
737
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
738
- shape: "roundCylinder"
739
- }, colliderOptions));
740
- };
741
- const useCone = (rigidBodyOptions = {}, colliderOptions = {}) => {
742
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
743
- shape: "cone"
744
- }, colliderOptions));
745
- };
746
- const useRoundCone = (rigidBodyOptions = {}, colliderOptions = {}) => {
747
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
748
- shape: "roundCone"
749
- }, colliderOptions));
750
- };
751
- const useConvexHull = (rigidBodyOptions = {}, colliderOptions = {}) => {
752
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
753
- shape: "convexHull"
754
- }, colliderOptions));
755
- };
756
-
757
- useConvexHull.fromMesh = (mesh, rigidBodyOptions = {}, colliderOptions = {}) => {
758
- var _mesh$geometry2, _mesh$geometry2$attri, _mesh$geometry2$attri2;
759
-
760
- return useConvexHull(rigidBodyOptions, _objectSpread2({
761
- args: [(mesh === null || mesh === void 0 ? void 0 : (_mesh$geometry2 = mesh.geometry) === null || _mesh$geometry2 === void 0 ? void 0 : (_mesh$geometry2$attri = _mesh$geometry2.attributes) === null || _mesh$geometry2$attri === void 0 ? void 0 : (_mesh$geometry2$attri2 = _mesh$geometry2$attri.position) === null || _mesh$geometry2$attri2 === void 0 ? void 0 : _mesh$geometry2$attri2.array) || []]
762
- }, colliderOptions));
763
- };
764
-
765
- const useRoundConvexHull = (rigidBodyOptions = {}, colliderOptions = {}) => {
766
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
767
- shape: "roundConvexHull"
768
- }, colliderOptions));
769
- };
770
- const useConvexMesh = (rigidBodyOptions = {}, colliderOptions = {}) => {
771
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
772
- shape: "convexMesh"
773
- }, colliderOptions));
774
- };
775
-
776
- useConvexMesh.fromMesh = (mesh, rigidBodyOptions = {}, colliderOptions = {}) => {
777
- var _mesh$geometry3, _mesh$geometry3$attri, _mesh$geometry3$attri2, _mesh$geometry4, _mesh$geometry4$index;
778
-
779
- return useConvexMesh(rigidBodyOptions, _objectSpread2({
780
- args: [mesh === null || mesh === void 0 ? void 0 : (_mesh$geometry3 = mesh.geometry) === null || _mesh$geometry3 === void 0 ? void 0 : (_mesh$geometry3$attri = _mesh$geometry3.attributes) === null || _mesh$geometry3$attri === void 0 ? void 0 : (_mesh$geometry3$attri2 = _mesh$geometry3$attri.position) === null || _mesh$geometry3$attri2 === void 0 ? void 0 : _mesh$geometry3$attri2.array, ((_mesh$geometry4 = mesh.geometry) === null || _mesh$geometry4 === void 0 ? void 0 : (_mesh$geometry4$index = _mesh$geometry4.index) === null || _mesh$geometry4$index === void 0 ? void 0 : _mesh$geometry4$index.array) || []]
781
- }, colliderOptions));
782
- };
783
-
784
- const useRoundConvexMesh = (rigidBodyOptions = {}, colliderOptions = {}) => {
785
- return useRigidBodyWithCollider(rigidBodyOptions, _objectSpread2({
786
- shape: "convexMesh"
787
- }, colliderOptions));
788
698
  }; // Joints
789
699
 
790
700
  const useImpulseJoint = (body1, body2, params) => {
@@ -797,12 +707,6 @@ const useImpulseJoint = (body1, body2, params) => {
797
707
  let rb1;
798
708
  let rb2;
799
709
 
800
- if ('handle' in body1 && 'handle' in body2) {
801
- rb1 = world.getRigidBody(body1.handle);
802
- rb2 = world.getRigidBody(body2.handle);
803
- jointRef.current = world.createImpulseJoint(params, rb1, rb2);
804
- }
805
-
806
710
  if ('current' in body1 && body1.current && 'current' in body2 && body2.current) {
807
711
  rb1 = world.getRigidBody(body1.current.handle);
808
712
  rb2 = world.getRigidBody(body2.current.handle);
@@ -1162,27 +1066,11 @@ exports.Physics = Physics;
1162
1066
  exports.RigidBody = RigidBody;
1163
1067
  exports.RoundCuboidCollider = RoundCuboidCollider;
1164
1068
  exports.TrimeshCollider = TrimeshCollider;
1165
- exports.useBall = useBall;
1166
- exports.useCapsule = useCapsule;
1167
1069
  exports.useCollider = useCollider;
1168
- exports.useCone = useCone;
1169
- exports.useConvexHull = useConvexHull;
1170
- exports.useConvexMesh = useConvexMesh;
1171
- exports.useCuboid = useCuboid;
1172
- exports.useCylinder = useCylinder;
1173
1070
  exports.useFixedJoint = useFixedJoint;
1174
- exports.useHeightfield = useHeightfield;
1175
1071
  exports.useImpulseJoint = useImpulseJoint;
1176
- exports.usePolyline = usePolyline;
1177
1072
  exports.usePrismaticJoint = usePrismaticJoint;
1178
1073
  exports.useRapier = useRapier;
1179
1074
  exports.useRevoluteJoint = useRevoluteJoint;
1180
1075
  exports.useRigidBody = useRigidBody;
1181
- exports.useRigidBodyWithCollider = useRigidBodyWithCollider;
1182
- exports.useRoundCone = useRoundCone;
1183
- exports.useRoundConvexHull = useRoundConvexHull;
1184
- exports.useRoundConvexMesh = useRoundConvexMesh;
1185
- exports.useRoundCuboid = useRoundCuboid;
1186
- exports.useRoundCylinder = useRoundCylinder;
1187
1076
  exports.useSphericalJoint = useSphericalJoint;
1188
- exports.useTrimesh = useTrimesh;