@react-three/rapier 0.7.7 → 0.8.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.
@@ -1,10 +1,10 @@
1
- import { EventQueue, RigidBodyDesc, ColliderDesc, ActiveEvents, ShapeType } from '@dimforge/rapier3d-compat';
1
+ import { EventQueue, RigidBodyDesc, ColliderDesc, ActiveEvents } from '@dimforge/rapier3d-compat';
2
2
  export { CoefficientCombineRule, Collider as RapierCollider, RigidBody as RapierRigidBody } from '@dimforge/rapier3d-compat';
3
- import React, { useRef, useState, useEffect, useMemo, createContext, useContext, memo, forwardRef, useImperativeHandle, useLayoutEffect } from 'react';
3
+ import React$1, { useRef, useState, useEffect, useMemo, createContext, useContext, memo, forwardRef, useImperativeHandle, useLayoutEffect } from 'react';
4
4
  import { useAsset } from 'use-asset';
5
5
  import { useFrame } from '@react-three/fiber';
6
- import { Quaternion, Euler, Vector3, Object3D, Matrix4, MathUtils, InstancedMesh, MeshBasicMaterial, Color, PlaneGeometry, ConeGeometry, CapsuleGeometry, CylinderGeometry, BufferGeometry, BufferAttribute, SphereGeometry, BoxGeometry, DynamicDrawUsage } from 'three';
7
- import { mergeVertices, RoundedBoxGeometry } from 'three-stdlib';
6
+ import { Quaternion, Euler, Vector3, Object3D, Matrix4, MathUtils, InstancedMesh, BufferAttribute, DynamicDrawUsage } from 'three';
7
+ import { mergeVertices } from 'three-stdlib';
8
8
 
9
9
  const _quaternion = new Quaternion();
10
10
  new Euler();
@@ -195,7 +195,8 @@ const createWorldApi = ref => {
195
195
  x,
196
196
  y,
197
197
  z
198
- }
198
+ },
199
+ debugRender: () => ref.current().debugRender()
199
200
  };
200
201
  }; // TODO: Broken currently, waiting for Rapier3D to fix
201
202
 
@@ -485,7 +486,7 @@ const Physics = ({
485
486
  colliderEvents,
486
487
  isPaused: _paused
487
488
  }), [_paused]);
488
- return /*#__PURE__*/React.createElement(RapierContext.Provider, {
489
+ return /*#__PURE__*/React$1.createElement(RapierContext.Provider, {
489
490
  value: context
490
491
  }, children);
491
492
  };
@@ -885,7 +886,8 @@ const createColliderPropsFromChildren = ({
885
886
  const colliderProps = [];
886
887
  object.updateWorldMatrix(true, false);
887
888
  const invertedParentMatrixWorld = object.matrixWorld.clone().invert();
888
- object.traverseVisible(child => {
889
+
890
+ const colliderFromChild = child => {
889
891
  if ("isMesh" in child) {
890
892
  if (_ignoreMeshColliders && isChildOfMeshCollider(child)) return;
891
893
  const worldScale = child.getWorldScale(_scale);
@@ -910,7 +912,14 @@ const createColliderPropsFromChildren = ({
910
912
  scale: [worldScale.x, worldScale.y, worldScale.z]
911
913
  }));
912
914
  }
913
- });
915
+ };
916
+
917
+ if (options.includeInvisible) {
918
+ object.traverse(colliderFromChild);
919
+ } else {
920
+ object.traverseVisible(colliderFromChild);
921
+ }
922
+
914
923
  return colliderProps;
915
924
  };
916
925
  const getColliderArgsFromGeometry = (geometry, colliders) => {
@@ -1155,7 +1164,7 @@ const usePrismaticJoint = (body1, body2, [body1Anchor, body2Anchor, axis]) => {
1155
1164
  };
1156
1165
 
1157
1166
  // Colliders
1158
- const AnyCollider = /*#__PURE__*/memo( /*#__PURE__*/React.forwardRef((props, forwardedRef) => {
1167
+ const AnyCollider = /*#__PURE__*/memo( /*#__PURE__*/React$1.forwardRef((props, forwardedRef) => {
1159
1168
  const {
1160
1169
  children,
1161
1170
  position,
@@ -1175,7 +1184,7 @@ const AnyCollider = /*#__PURE__*/memo( /*#__PURE__*/React.forwardRef((props, for
1175
1184
  return forwardedRef;
1176
1185
  }
1177
1186
 
1178
- const result = /*#__PURE__*/React.createRef();
1187
+ const result = /*#__PURE__*/React$1.createRef();
1179
1188
  result.current = [];
1180
1189
  return result;
1181
1190
  }, []);
@@ -1216,7 +1225,7 @@ const AnyCollider = /*#__PURE__*/memo( /*#__PURE__*/React.forwardRef((props, for
1216
1225
  }, [props, rigidBodyContext === null || rigidBodyContext === void 0 ? void 0 : rigidBodyContext.options]);
1217
1226
  useUpdateColliderOptions(collidersRef, mergedProps, colliderStates);
1218
1227
  useColliderEvents(collidersRef, mergedProps, colliderEvents);
1219
- return /*#__PURE__*/React.createElement("object3D", {
1228
+ return /*#__PURE__*/React$1.createElement("object3D", {
1220
1229
  position: position,
1221
1230
  rotation: rotation,
1222
1231
  quaternion: quaternion,
@@ -1224,56 +1233,56 @@ const AnyCollider = /*#__PURE__*/memo( /*#__PURE__*/React.forwardRef((props, for
1224
1233
  ref: ref
1225
1234
  }, children);
1226
1235
  }));
1227
- const CuboidCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
1228
- return /*#__PURE__*/React.createElement(AnyCollider, _extends({}, props, {
1236
+ const CuboidCollider = /*#__PURE__*/React$1.forwardRef((props, ref) => {
1237
+ return /*#__PURE__*/React$1.createElement(AnyCollider, _extends({}, props, {
1229
1238
  shape: "cuboid",
1230
1239
  ref: ref
1231
1240
  }));
1232
1241
  });
1233
- const RoundCuboidCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
1234
- return /*#__PURE__*/React.createElement(AnyCollider, _extends({}, props, {
1242
+ const RoundCuboidCollider = /*#__PURE__*/React$1.forwardRef((props, ref) => {
1243
+ return /*#__PURE__*/React$1.createElement(AnyCollider, _extends({}, props, {
1235
1244
  shape: "roundCuboid",
1236
1245
  ref: ref
1237
1246
  }));
1238
1247
  });
1239
- const BallCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
1240
- return /*#__PURE__*/React.createElement(AnyCollider, _extends({}, props, {
1248
+ const BallCollider = /*#__PURE__*/React$1.forwardRef((props, ref) => {
1249
+ return /*#__PURE__*/React$1.createElement(AnyCollider, _extends({}, props, {
1241
1250
  shape: "ball",
1242
1251
  ref: ref
1243
1252
  }));
1244
1253
  });
1245
- const CapsuleCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
1246
- return /*#__PURE__*/React.createElement(AnyCollider, _extends({}, props, {
1254
+ const CapsuleCollider = /*#__PURE__*/React$1.forwardRef((props, ref) => {
1255
+ return /*#__PURE__*/React$1.createElement(AnyCollider, _extends({}, props, {
1247
1256
  shape: "capsule",
1248
1257
  ref: ref
1249
1258
  }));
1250
1259
  });
1251
- const HeightfieldCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
1252
- return /*#__PURE__*/React.createElement(AnyCollider, _extends({}, props, {
1260
+ const HeightfieldCollider = /*#__PURE__*/React$1.forwardRef((props, ref) => {
1261
+ return /*#__PURE__*/React$1.createElement(AnyCollider, _extends({}, props, {
1253
1262
  shape: "heightfield",
1254
1263
  ref: ref
1255
1264
  }));
1256
1265
  });
1257
- const TrimeshCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
1258
- return /*#__PURE__*/React.createElement(AnyCollider, _extends({}, props, {
1266
+ const TrimeshCollider = /*#__PURE__*/React$1.forwardRef((props, ref) => {
1267
+ return /*#__PURE__*/React$1.createElement(AnyCollider, _extends({}, props, {
1259
1268
  shape: "trimesh",
1260
1269
  ref: ref
1261
1270
  }));
1262
1271
  });
1263
- const ConeCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
1264
- return /*#__PURE__*/React.createElement(AnyCollider, _extends({}, props, {
1272
+ const ConeCollider = /*#__PURE__*/React$1.forwardRef((props, ref) => {
1273
+ return /*#__PURE__*/React$1.createElement(AnyCollider, _extends({}, props, {
1265
1274
  shape: "cone",
1266
1275
  ref: ref
1267
1276
  }));
1268
1277
  });
1269
- const CylinderCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
1270
- return /*#__PURE__*/React.createElement(AnyCollider, _extends({}, props, {
1278
+ const CylinderCollider = /*#__PURE__*/React$1.forwardRef((props, ref) => {
1279
+ return /*#__PURE__*/React$1.createElement(AnyCollider, _extends({}, props, {
1271
1280
  shape: "cylinder",
1272
1281
  ref: ref
1273
1282
  }));
1274
1283
  });
1275
- const ConvexHullCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
1276
- return /*#__PURE__*/React.createElement(AnyCollider, _extends({}, props, {
1284
+ const ConvexHullCollider = /*#__PURE__*/React$1.forwardRef((props, ref) => {
1285
+ return /*#__PURE__*/React$1.createElement(AnyCollider, _extends({}, props, {
1277
1286
  shape: "convexHull",
1278
1287
  ref: ref
1279
1288
  }));
@@ -1300,16 +1309,16 @@ const RigidBody = /*#__PURE__*/memo( /*#__PURE__*/forwardRef((props, ref) => {
1300
1309
  api,
1301
1310
  options: props
1302
1311
  }), [object, api, props]);
1303
- return /*#__PURE__*/React.createElement(RigidBodyContext.Provider, {
1312
+ return /*#__PURE__*/React$1.createElement(RigidBodyContext.Provider, {
1304
1313
  value: contextValue
1305
- }, /*#__PURE__*/React.createElement("object3D", _extends({
1314
+ }, /*#__PURE__*/React$1.createElement("object3D", _extends({
1306
1315
  ref: object
1307
1316
  }, objectProps, {
1308
1317
  position: position,
1309
1318
  rotation: rotation,
1310
1319
  quaternion: quaternion,
1311
1320
  scale: scale
1312
- }), children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React.createElement(AnyCollider, _extends({
1321
+ }), children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React$1.createElement(AnyCollider, _extends({
1313
1322
  key: index
1314
1323
  }, colliderProps)))));
1315
1324
  }));
@@ -1334,188 +1343,34 @@ const MeshCollider = props => {
1334
1343
  });
1335
1344
  }, [physicsOptions, options]);
1336
1345
  const childColliderProps = useChildColliderProps(object, mergedOptions, false);
1337
- return /*#__PURE__*/React.createElement("object3D", {
1346
+ return /*#__PURE__*/React$1.createElement("object3D", {
1338
1347
  ref: object,
1339
1348
  userData: {
1340
1349
  r3RapierType: "MeshCollider"
1341
1350
  }
1342
- }, children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React.createElement(AnyCollider, _extends({
1351
+ }, children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React$1.createElement(AnyCollider, _extends({
1343
1352
  key: index
1344
1353
  }, colliderProps))));
1345
1354
  };
1346
1355
 
1347
- const geometryFromCollider = collider => {
1348
- switch (collider.shape.type) {
1349
- case ShapeType.Cuboid:
1350
- {
1351
- const {
1352
- x,
1353
- y,
1354
- z
1355
- } = collider.shape.halfExtents;
1356
- return new BoxGeometry(x * 2 + 0.01, y * 2 + 0.01, z * 2 + 0.01);
1357
- }
1358
-
1359
- case ShapeType.RoundCuboid:
1360
- {
1361
- const {
1362
- x,
1363
- y,
1364
- z
1365
- } = collider.shape.halfExtents;
1366
- const radius = collider.shape.borderRadius;
1367
- return new RoundedBoxGeometry(x * 2 + radius * 2, y * 2 + radius * 2, z * 2 + radius * 2, 8, radius);
1368
- }
1369
-
1370
- case ShapeType.Ball:
1371
- {
1372
- const r = collider.shape.radius;
1373
- return new SphereGeometry(r + +0.01, 8, 8);
1374
- }
1375
-
1376
- case ShapeType.TriMesh:
1377
- {
1378
- var _g$index;
1379
-
1380
- const v = collider.shape.vertices;
1381
- const i = collider.shape.indices;
1382
- const g = new BufferGeometry(); // Vertices are not always a float3darray (???), so we need to convert them
1383
-
1384
- const safeVerts = Float32Array.from(v);
1385
- g.setAttribute("position", new BufferAttribute(safeVerts, 3));
1386
- (_g$index = g.index) === null || _g$index === void 0 ? void 0 : _g$index.set(i);
1387
- g.setDrawRange(0, g.attributes.position.array.length / 3 - 1);
1388
- return g;
1389
- }
1390
-
1391
- case ShapeType.ConvexPolyhedron:
1392
- {
1393
- const cv = collider.shape.vertices; // Vertices are not always a float3darray (???), so we need to convert them
1394
-
1395
- const safeVerts = Float32Array.from(cv);
1396
- const cg = new BufferGeometry();
1397
- cg.setAttribute("position", new BufferAttribute(safeVerts, 3));
1398
- return cg;
1399
- }
1400
-
1401
- case ShapeType.Cylinder:
1402
- {
1403
- const r = collider.shape.radius;
1404
- const h = collider.shape.halfHeight;
1405
- const g = new CylinderGeometry(r, r, h * 2);
1406
- return g;
1407
- }
1408
-
1409
- case ShapeType.Capsule:
1410
- {
1411
- const r = collider.shape.radius;
1412
- const h = collider.shape.halfHeight;
1413
- const g = new CapsuleGeometry(r, h * 2, 4, 8);
1414
- return g;
1415
- }
1416
-
1417
- case ShapeType.Cone:
1418
- {
1419
- const r = collider.shape.radius;
1420
- const h = collider.shape.halfHeight;
1421
- const g = new ConeGeometry(r, h * 2, 16);
1422
- return g;
1423
- }
1424
-
1425
- case ShapeType.HeightField:
1426
- {
1427
- const rows = collider.shape.nrows;
1428
- const cols = collider.shape.ncols;
1429
- const heights = collider.shape.heights;
1430
- const scale = collider.shape.scale;
1431
- const g = new PlaneGeometry(scale.x, scale.z, cols, rows);
1432
- const verts = g.attributes.position.array;
1433
- verts.forEach((v, index) => verts[index * 3 + 2] = heights[index] * scale.y);
1434
- g.scale(1, -1, 1);
1435
- g.rotateX(-Math.PI / 2);
1436
- g.rotateY(-Math.PI / 2);
1437
- return g;
1438
- }
1439
- }
1440
-
1441
- return new BoxGeometry(1, 1, 1);
1442
- };
1443
-
1444
- const DebugShape = /*#__PURE__*/memo(({
1445
- colliderHandle,
1446
- color,
1447
- sleepColor
1448
- }) => {
1356
+ const Debug = () => {
1449
1357
  const {
1450
1358
  world
1451
1359
  } = useRapier();
1452
1360
  const ref = useRef(null);
1453
- const [material] = useState(new MeshBasicMaterial({
1454
- color,
1455
- wireframe: true
1456
- }));
1457
- useFrame(() => {
1458
- const collider = world.getCollider(colliderHandle);
1459
-
1460
- if (ref.current && collider) {
1461
- const {
1462
- x: rx,
1463
- y: ry,
1464
- z: rz,
1465
- w: rw
1466
- } = collider.rotation();
1467
- const {
1468
- x,
1469
- y,
1470
- z
1471
- } = collider.translation();
1472
- const parent = collider.parent();
1473
-
1474
- if (parent !== null && parent !== void 0 && parent.isSleeping() || parent !== null && parent !== void 0 && parent.isFixed() || parent !== null && parent !== void 0 && parent.isKinematic()) {
1475
- material.color = new Color(sleepColor);
1476
- } else {
1477
- material.color = new Color(color);
1478
- }
1479
-
1480
- ref.current.position.set(x, y, z);
1481
- ref.current.rotation.setFromQuaternion(new Quaternion(rx, ry, rz, rw));
1482
- }
1483
- });
1484
- const geometry = useMemo(() => {
1485
- const collider = world.getCollider(colliderHandle);
1486
- return geometryFromCollider(collider);
1487
- }, [colliderHandle]);
1488
- return /*#__PURE__*/React.createElement("mesh", {
1489
- ref: ref,
1490
- material: material
1491
- }, /*#__PURE__*/React.createElement("primitive", {
1492
- object: geometry,
1493
- attach: "geometry"
1494
- }));
1495
- });
1496
- const Debug = ({
1497
- color: _color = "red",
1498
- sleepColor: _sleepColor = "blue"
1499
- }) => {
1500
- const {
1501
- world
1502
- } = useRapier();
1503
- const [colliders, setColliders] = useState([]);
1504
- useRef({});
1505
-
1506
1361
  useFrame(() => {
1507
- const newColliders = [];
1508
- world.forEachCollider(collider => {
1509
- newColliders.push(collider.handle);
1510
- });
1511
- setColliders(newColliders);
1362
+ const mesh = ref.current;
1363
+ if (!mesh) return;
1364
+ const buffers = world.debugRender();
1365
+ mesh.geometry.setAttribute("position", new BufferAttribute(buffers.vertices, 3));
1366
+ mesh.geometry.setAttribute("color", new BufferAttribute(buffers.colors, 4));
1512
1367
  });
1513
- return /*#__PURE__*/React.createElement("group", null, colliders.map(handle => /*#__PURE__*/React.createElement(DebugShape, {
1514
- key: handle,
1515
- colliderHandle: handle,
1516
- color: _color,
1517
- sleepColor: _sleepColor
1518
- })));
1368
+ return /*#__PURE__*/React.createElement("lineSegments", {
1369
+ ref: ref
1370
+ }, /*#__PURE__*/React.createElement("lineBasicMaterial", {
1371
+ color: 0xffffff,
1372
+ vertexColors: true
1373
+ }), /*#__PURE__*/React.createElement("bufferGeometry", null));
1519
1374
  };
1520
1375
 
1521
1376
  const _excluded = ["positions", "rotations", "children"];
@@ -1620,11 +1475,11 @@ const InstancedRigidBodies = /*#__PURE__*/forwardRef((props, ref) => {
1620
1475
  options: mergedOptions
1621
1476
  };
1622
1477
  }, [api, mergedOptions]);
1623
- return /*#__PURE__*/React.createElement(RigidBodyContext.Provider, {
1478
+ return /*#__PURE__*/React$1.createElement(RigidBodyContext.Provider, {
1624
1479
  value: contextValue
1625
- }, /*#__PURE__*/React.createElement("object3D", {
1480
+ }, /*#__PURE__*/React$1.createElement("object3D", {
1626
1481
  ref: object
1627
- }, props.children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React.createElement(AnyCollider, _extends({
1482
+ }, props.children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React$1.createElement(AnyCollider, _extends({
1628
1483
  key: index
1629
1484
  }, colliderProps)))));
1630
1485
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/rapier",
3
- "version": "0.7.7",
3
+ "version": "0.8.0",
4
4
  "source": "src/index.ts",
5
5
  "main": "dist/react-three-rapier.cjs.js",
6
6
  "module": "dist/react-three-rapier.esm.js",
@@ -8,6 +8,9 @@
8
8
  "files": [
9
9
  "dist"
10
10
  ],
11
+ "scripts": {
12
+ "ts": "tsc -w"
13
+ },
11
14
  "devDependencies": {
12
15
  "@react-three/drei": "^9.34.1",
13
16
  "@react-three/fiber": "^8.8.9",
package/readme.md CHANGED
@@ -122,6 +122,16 @@ const Scene = () => (
122
122
  );
123
123
  ```
124
124
 
125
+ If part of our meshes are invisible and you want to include them in the collider creation, use the `includeInvisible` flag.
126
+
127
+ ```tsx
128
+ <RigidBody colliders="hull" includeInvisible>
129
+ <object3D>
130
+ <Suzanne visible={false} />
131
+ </object3D>
132
+ </RigidBody>
133
+ ```
134
+
125
135
  ## Instanced Meshes
126
136
 
127
137
  Instanced meshes can also be used and have automatic colliders generated from their mesh.
@@ -185,12 +195,7 @@ const Scene = () => {
185
195
 
186
196
  ## Debug
187
197
 
188
- Use the Debug component to see live representations of all colliders in a scene.
189
-
190
- - The `color` prop sets the color of awake colliders that are affected by forces.
191
- - The `sleepColor` prop set the color of a static (fixed, or kinematic) or sleeping collider.
192
-
193
- > Note: Experimental. Not all shapes are supported. Unsupported shapes are always represented by cubes.
198
+ Use the Debug component to see live representations of all colliders in a scene, using the live debug buffer from the physics engine.
194
199
 
195
200
  ```tsx
196
201
  import { Box, Sphere } from "@react-three/drei";
@@ -199,7 +204,7 @@ import { RigidBody, Debug } from "@react-three/rapier";
199
204
  const Scene = () => {
200
205
  return (
201
206
  <Physics>
202
- <Debug color="red" sleepColor="blue" />
207
+ <Debug />
203
208
 
204
209
  <RigidBody>
205
210
  <Box />