@react-three/rapier 0.7.6 → 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.
- package/dist/declarations/src/Debug.d.ts +0 -8
- package/dist/declarations/src/api.d.ts +7 -6
- package/dist/declarations/src/bitmasks.d.ts +1 -1
- package/dist/declarations/src/types.d.ts +9 -5
- package/dist/declarations/src/utils-collider.d.ts +2 -2
- package/dist/react-three-rapier.cjs.dev.js +110 -249
- package/dist/react-three-rapier.cjs.prod.js +110 -249
- package/dist/react-three-rapier.esm.js +87 -226
- package/package.json +9 -6
- package/readme.md +12 -7
@@ -1,10 +1,10 @@
|
|
1
|
-
import { EventQueue, RigidBodyDesc, ColliderDesc, ActiveEvents
|
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, { useState, useEffect,
|
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,
|
7
|
-
import { mergeVertices
|
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();
|
@@ -173,10 +173,19 @@ const createWorldApi = ref => {
|
|
173
173
|
getRigidBody: handle => ref.current().getRigidBody(handle),
|
174
174
|
createRigidBody: desc => ref.current().createRigidBody(desc),
|
175
175
|
createCollider: (desc, rigidBody) => ref.current().createCollider(desc, rigidBody),
|
176
|
-
removeRigidBody: rigidBody =>
|
177
|
-
|
176
|
+
removeRigidBody: rigidBody => {
|
177
|
+
if (!ref.current().bodies.contains(rigidBody.handle)) return;
|
178
|
+
ref.current().removeRigidBody(rigidBody);
|
179
|
+
},
|
180
|
+
removeCollider: (collider, wakeUp = true) => {
|
181
|
+
if (!ref.current().colliders.contains(collider.handle)) return;
|
182
|
+
ref.current().removeCollider(collider, wakeUp);
|
183
|
+
},
|
178
184
|
createImpulseJoint: (params, rigidBodyA, rigidBodyB, wakeUp = true) => ref.current().createImpulseJoint(params, rigidBodyA, rigidBodyB, wakeUp),
|
179
|
-
removeImpulseJoint: (joint, wakeUp = true) =>
|
185
|
+
removeImpulseJoint: (joint, wakeUp = true) => {
|
186
|
+
if (!ref.current().impulseJoints.contains(joint.handle)) return;
|
187
|
+
ref.current().removeImpulseJoint(joint, wakeUp);
|
188
|
+
},
|
180
189
|
forEachCollider: callback => ref.current().forEachCollider(callback),
|
181
190
|
setGravity: ({
|
182
191
|
x,
|
@@ -186,7 +195,8 @@ const createWorldApi = ref => {
|
|
186
195
|
x,
|
187
196
|
y,
|
188
197
|
z
|
189
|
-
}
|
198
|
+
},
|
199
|
+
debugRender: () => ref.current().debugRender()
|
190
200
|
};
|
191
201
|
}; // TODO: Broken currently, waiting for Rapier3D to fix
|
192
202
|
|
@@ -220,10 +230,6 @@ const Physics = ({
|
|
220
230
|
updatePriority
|
221
231
|
}) => {
|
222
232
|
const rapier = useAsset(importRapier);
|
223
|
-
const [isPaused, setIsPaused] = useState(_paused);
|
224
|
-
useEffect(() => {
|
225
|
-
setIsPaused(_paused);
|
226
|
-
}, [_paused]);
|
227
233
|
const worldRef = useRef();
|
228
234
|
const getWorldRef = useRef(() => {
|
229
235
|
if (!worldRef.current) {
|
@@ -244,6 +250,7 @@ const Physics = ({
|
|
244
250
|
return () => {
|
245
251
|
if (world) {
|
246
252
|
world.free();
|
253
|
+
worldRef.current = undefined;
|
247
254
|
}
|
248
255
|
};
|
249
256
|
}, []); // Update gravity
|
@@ -477,15 +484,15 @@ const Physics = ({
|
|
477
484
|
colliderStates,
|
478
485
|
rigidBodyEvents,
|
479
486
|
colliderEvents,
|
480
|
-
isPaused
|
481
|
-
}), [
|
482
|
-
return /*#__PURE__*/React.createElement(RapierContext.Provider, {
|
487
|
+
isPaused: _paused
|
488
|
+
}), [_paused]);
|
489
|
+
return /*#__PURE__*/React$1.createElement(RapierContext.Provider, {
|
483
490
|
value: context
|
484
491
|
}, children);
|
485
492
|
};
|
486
493
|
|
487
494
|
function _extends() {
|
488
|
-
_extends = Object.assign
|
495
|
+
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
489
496
|
for (var i = 1; i < arguments.length; i++) {
|
490
497
|
var source = arguments[i];
|
491
498
|
|
@@ -498,7 +505,6 @@ function _extends() {
|
|
498
505
|
|
499
506
|
return target;
|
500
507
|
};
|
501
|
-
|
502
508
|
return _extends.apply(this, arguments);
|
503
509
|
}
|
504
510
|
|
@@ -672,11 +678,11 @@ const useUpdateRigidBodyOptions = (rigidBodyRef, props, states, updateTranslatio
|
|
672
678
|
return vectorToTuple(props[key]);
|
673
679
|
}), [props]);
|
674
680
|
useEffect(() => {
|
675
|
-
if (
|
676
|
-
rigidBodyRef.current
|
681
|
+
if (Array.isArray(rigidBodyRef.current)) {
|
682
|
+
for (const rigidBody of rigidBodyRef.current) {
|
677
683
|
setRigidBodyOptions(rigidBody, props, states, updateTranslations);
|
678
|
-
}
|
679
|
-
} else {
|
684
|
+
}
|
685
|
+
} else if (rigidBodyRef.current) {
|
680
686
|
setRigidBodyOptions(rigidBodyRef.current, props, states, updateTranslations);
|
681
687
|
}
|
682
688
|
}, mutablePropsAsFlatArray);
|
@@ -699,20 +705,20 @@ const useRigidBodyEvents = (rigidBodyRef, props, events) => {
|
|
699
705
|
onIntersectionExit
|
700
706
|
};
|
701
707
|
useEffect(() => {
|
702
|
-
if (
|
703
|
-
rigidBodyRef.current
|
708
|
+
if (Array.isArray(rigidBodyRef.current)) {
|
709
|
+
for (const rigidBody of rigidBodyRef.current) {
|
704
710
|
events.set(rigidBody.handle, eventHandlers);
|
705
|
-
}
|
706
|
-
} else {
|
711
|
+
}
|
712
|
+
} else if (rigidBodyRef.current) {
|
707
713
|
events.set(rigidBodyRef.current.handle, eventHandlers);
|
708
714
|
}
|
709
715
|
|
710
716
|
return () => {
|
711
|
-
if (
|
712
|
-
rigidBodyRef.current
|
717
|
+
if (Array.isArray(rigidBodyRef.current)) {
|
718
|
+
for (const rigidBody of rigidBodyRef.current) {
|
713
719
|
events.delete(rigidBody.handle);
|
714
|
-
}
|
715
|
-
} else {
|
720
|
+
}
|
721
|
+
} else if (rigidBodyRef.current) {
|
716
722
|
events.delete(rigidBodyRef.current.handle);
|
717
723
|
}
|
718
724
|
};
|
@@ -880,7 +886,8 @@ const createColliderPropsFromChildren = ({
|
|
880
886
|
const colliderProps = [];
|
881
887
|
object.updateWorldMatrix(true, false);
|
882
888
|
const invertedParentMatrixWorld = object.matrixWorld.clone().invert();
|
883
|
-
|
889
|
+
|
890
|
+
const colliderFromChild = child => {
|
884
891
|
if ("isMesh" in child) {
|
885
892
|
if (_ignoreMeshColliders && isChildOfMeshCollider(child)) return;
|
886
893
|
const worldScale = child.getWorldScale(_scale);
|
@@ -905,7 +912,14 @@ const createColliderPropsFromChildren = ({
|
|
905
912
|
scale: [worldScale.x, worldScale.y, worldScale.z]
|
906
913
|
}));
|
907
914
|
}
|
908
|
-
}
|
915
|
+
};
|
916
|
+
|
917
|
+
if (options.includeInvisible) {
|
918
|
+
object.traverse(colliderFromChild);
|
919
|
+
} else {
|
920
|
+
object.traverseVisible(colliderFromChild);
|
921
|
+
}
|
922
|
+
|
909
923
|
return colliderProps;
|
910
924
|
};
|
911
925
|
const getColliderArgsFromGeometry = (geometry, colliders) => {
|
@@ -1053,6 +1067,7 @@ const useRigidBody = (options = {}) => {
|
|
1053
1067
|
return () => {
|
1054
1068
|
world.removeRigidBody(rigidBody);
|
1055
1069
|
rigidBodyStates.delete(rigidBody.handle);
|
1070
|
+
rigidBodyRef.current = undefined;
|
1056
1071
|
};
|
1057
1072
|
}, []);
|
1058
1073
|
useUpdateRigidBodyOptions(rigidBodyRef, mergedOptions, rigidBodyStates);
|
@@ -1149,7 +1164,7 @@ const usePrismaticJoint = (body1, body2, [body1Anchor, body2Anchor, axis]) => {
|
|
1149
1164
|
};
|
1150
1165
|
|
1151
1166
|
// Colliders
|
1152
|
-
const AnyCollider = /*#__PURE__*/memo( /*#__PURE__*/React.forwardRef((props, forwardedRef) => {
|
1167
|
+
const AnyCollider = /*#__PURE__*/memo( /*#__PURE__*/React$1.forwardRef((props, forwardedRef) => {
|
1153
1168
|
const {
|
1154
1169
|
children,
|
1155
1170
|
position,
|
@@ -1169,7 +1184,7 @@ const AnyCollider = /*#__PURE__*/memo( /*#__PURE__*/React.forwardRef((props, for
|
|
1169
1184
|
return forwardedRef;
|
1170
1185
|
}
|
1171
1186
|
|
1172
|
-
const result = /*#__PURE__*/React.createRef();
|
1187
|
+
const result = /*#__PURE__*/React$1.createRef();
|
1173
1188
|
result.current = [];
|
1174
1189
|
return result;
|
1175
1190
|
}, []);
|
@@ -1210,7 +1225,7 @@ const AnyCollider = /*#__PURE__*/memo( /*#__PURE__*/React.forwardRef((props, for
|
|
1210
1225
|
}, [props, rigidBodyContext === null || rigidBodyContext === void 0 ? void 0 : rigidBodyContext.options]);
|
1211
1226
|
useUpdateColliderOptions(collidersRef, mergedProps, colliderStates);
|
1212
1227
|
useColliderEvents(collidersRef, mergedProps, colliderEvents);
|
1213
|
-
return /*#__PURE__*/React.createElement("object3D", {
|
1228
|
+
return /*#__PURE__*/React$1.createElement("object3D", {
|
1214
1229
|
position: position,
|
1215
1230
|
rotation: rotation,
|
1216
1231
|
quaternion: quaternion,
|
@@ -1218,56 +1233,56 @@ const AnyCollider = /*#__PURE__*/memo( /*#__PURE__*/React.forwardRef((props, for
|
|
1218
1233
|
ref: ref
|
1219
1234
|
}, children);
|
1220
1235
|
}));
|
1221
|
-
const CuboidCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
|
1222
|
-
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, {
|
1223
1238
|
shape: "cuboid",
|
1224
1239
|
ref: ref
|
1225
1240
|
}));
|
1226
1241
|
});
|
1227
|
-
const RoundCuboidCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
|
1228
|
-
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, {
|
1229
1244
|
shape: "roundCuboid",
|
1230
1245
|
ref: ref
|
1231
1246
|
}));
|
1232
1247
|
});
|
1233
|
-
const BallCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
|
1234
|
-
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, {
|
1235
1250
|
shape: "ball",
|
1236
1251
|
ref: ref
|
1237
1252
|
}));
|
1238
1253
|
});
|
1239
|
-
const CapsuleCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
|
1240
|
-
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, {
|
1241
1256
|
shape: "capsule",
|
1242
1257
|
ref: ref
|
1243
1258
|
}));
|
1244
1259
|
});
|
1245
|
-
const HeightfieldCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
|
1246
|
-
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, {
|
1247
1262
|
shape: "heightfield",
|
1248
1263
|
ref: ref
|
1249
1264
|
}));
|
1250
1265
|
});
|
1251
|
-
const TrimeshCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
|
1252
|
-
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, {
|
1253
1268
|
shape: "trimesh",
|
1254
1269
|
ref: ref
|
1255
1270
|
}));
|
1256
1271
|
});
|
1257
|
-
const ConeCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
|
1258
|
-
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, {
|
1259
1274
|
shape: "cone",
|
1260
1275
|
ref: ref
|
1261
1276
|
}));
|
1262
1277
|
});
|
1263
|
-
const CylinderCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
|
1264
|
-
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, {
|
1265
1280
|
shape: "cylinder",
|
1266
1281
|
ref: ref
|
1267
1282
|
}));
|
1268
1283
|
});
|
1269
|
-
const ConvexHullCollider = /*#__PURE__*/React.forwardRef((props, ref) => {
|
1270
|
-
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, {
|
1271
1286
|
shape: "convexHull",
|
1272
1287
|
ref: ref
|
1273
1288
|
}));
|
@@ -1294,16 +1309,16 @@ const RigidBody = /*#__PURE__*/memo( /*#__PURE__*/forwardRef((props, ref) => {
|
|
1294
1309
|
api,
|
1295
1310
|
options: props
|
1296
1311
|
}), [object, api, props]);
|
1297
|
-
return /*#__PURE__*/React.createElement(RigidBodyContext.Provider, {
|
1312
|
+
return /*#__PURE__*/React$1.createElement(RigidBodyContext.Provider, {
|
1298
1313
|
value: contextValue
|
1299
|
-
}, /*#__PURE__*/React.createElement("object3D", _extends({
|
1314
|
+
}, /*#__PURE__*/React$1.createElement("object3D", _extends({
|
1300
1315
|
ref: object
|
1301
1316
|
}, objectProps, {
|
1302
1317
|
position: position,
|
1303
1318
|
rotation: rotation,
|
1304
1319
|
quaternion: quaternion,
|
1305
1320
|
scale: scale
|
1306
|
-
}), children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React.createElement(AnyCollider, _extends({
|
1321
|
+
}), children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React$1.createElement(AnyCollider, _extends({
|
1307
1322
|
key: index
|
1308
1323
|
}, colliderProps)))));
|
1309
1324
|
}));
|
@@ -1328,188 +1343,34 @@ const MeshCollider = props => {
|
|
1328
1343
|
});
|
1329
1344
|
}, [physicsOptions, options]);
|
1330
1345
|
const childColliderProps = useChildColliderProps(object, mergedOptions, false);
|
1331
|
-
return /*#__PURE__*/React.createElement("object3D", {
|
1346
|
+
return /*#__PURE__*/React$1.createElement("object3D", {
|
1332
1347
|
ref: object,
|
1333
1348
|
userData: {
|
1334
1349
|
r3RapierType: "MeshCollider"
|
1335
1350
|
}
|
1336
|
-
}, children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React.createElement(AnyCollider, _extends({
|
1351
|
+
}, children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React$1.createElement(AnyCollider, _extends({
|
1337
1352
|
key: index
|
1338
1353
|
}, colliderProps))));
|
1339
1354
|
};
|
1340
1355
|
|
1341
|
-
const
|
1342
|
-
switch (collider.shape.type) {
|
1343
|
-
case ShapeType.Cuboid:
|
1344
|
-
{
|
1345
|
-
const {
|
1346
|
-
x,
|
1347
|
-
y,
|
1348
|
-
z
|
1349
|
-
} = collider.shape.halfExtents;
|
1350
|
-
return new BoxGeometry(x * 2 + 0.01, y * 2 + 0.01, z * 2 + 0.01);
|
1351
|
-
}
|
1352
|
-
|
1353
|
-
case ShapeType.RoundCuboid:
|
1354
|
-
{
|
1355
|
-
const {
|
1356
|
-
x,
|
1357
|
-
y,
|
1358
|
-
z
|
1359
|
-
} = collider.shape.halfExtents;
|
1360
|
-
const radius = collider.shape.borderRadius;
|
1361
|
-
return new RoundedBoxGeometry(x * 2 + radius * 2, y * 2 + radius * 2, z * 2 + radius * 2, 8, radius);
|
1362
|
-
}
|
1363
|
-
|
1364
|
-
case ShapeType.Ball:
|
1365
|
-
{
|
1366
|
-
const r = collider.shape.radius;
|
1367
|
-
return new SphereGeometry(r + +0.01, 8, 8);
|
1368
|
-
}
|
1369
|
-
|
1370
|
-
case ShapeType.TriMesh:
|
1371
|
-
{
|
1372
|
-
var _g$index;
|
1373
|
-
|
1374
|
-
const v = collider.shape.vertices;
|
1375
|
-
const i = collider.shape.indices;
|
1376
|
-
const g = new BufferGeometry(); // Vertices are not always a float3darray (???), so we need to convert them
|
1377
|
-
|
1378
|
-
const safeVerts = Float32Array.from(v);
|
1379
|
-
g.setAttribute("position", new BufferAttribute(safeVerts, 3));
|
1380
|
-
(_g$index = g.index) === null || _g$index === void 0 ? void 0 : _g$index.set(i);
|
1381
|
-
g.setDrawRange(0, g.attributes.position.array.length / 3 - 1);
|
1382
|
-
return g;
|
1383
|
-
}
|
1384
|
-
|
1385
|
-
case ShapeType.ConvexPolyhedron:
|
1386
|
-
{
|
1387
|
-
const cv = collider.shape.vertices; // Vertices are not always a float3darray (???), so we need to convert them
|
1388
|
-
|
1389
|
-
const safeVerts = Float32Array.from(cv);
|
1390
|
-
const cg = new BufferGeometry();
|
1391
|
-
cg.setAttribute("position", new BufferAttribute(safeVerts, 3));
|
1392
|
-
return cg;
|
1393
|
-
}
|
1394
|
-
|
1395
|
-
case ShapeType.Cylinder:
|
1396
|
-
{
|
1397
|
-
const r = collider.shape.radius;
|
1398
|
-
const h = collider.shape.halfHeight;
|
1399
|
-
const g = new CylinderGeometry(r, r, h * 2);
|
1400
|
-
return g;
|
1401
|
-
}
|
1402
|
-
|
1403
|
-
case ShapeType.Capsule:
|
1404
|
-
{
|
1405
|
-
const r = collider.shape.radius;
|
1406
|
-
const h = collider.shape.halfHeight;
|
1407
|
-
const g = new CapsuleGeometry(r, h * 2, 4, 8);
|
1408
|
-
return g;
|
1409
|
-
}
|
1410
|
-
|
1411
|
-
case ShapeType.Cone:
|
1412
|
-
{
|
1413
|
-
const r = collider.shape.radius;
|
1414
|
-
const h = collider.shape.halfHeight;
|
1415
|
-
const g = new ConeGeometry(r, h * 2, 16);
|
1416
|
-
return g;
|
1417
|
-
}
|
1418
|
-
|
1419
|
-
case ShapeType.HeightField:
|
1420
|
-
{
|
1421
|
-
const rows = collider.shape.nrows;
|
1422
|
-
const cols = collider.shape.ncols;
|
1423
|
-
const heights = collider.shape.heights;
|
1424
|
-
const scale = collider.shape.scale;
|
1425
|
-
const g = new PlaneGeometry(scale.x, scale.z, cols, rows);
|
1426
|
-
const verts = g.attributes.position.array;
|
1427
|
-
verts.forEach((v, index) => verts[index * 3 + 2] = heights[index] * scale.y);
|
1428
|
-
g.scale(1, -1, 1);
|
1429
|
-
g.rotateX(-Math.PI / 2);
|
1430
|
-
g.rotateY(-Math.PI / 2);
|
1431
|
-
return g;
|
1432
|
-
}
|
1433
|
-
}
|
1434
|
-
|
1435
|
-
return new BoxGeometry(1, 1, 1);
|
1436
|
-
};
|
1437
|
-
|
1438
|
-
const DebugShape = /*#__PURE__*/memo(({
|
1439
|
-
colliderHandle,
|
1440
|
-
color,
|
1441
|
-
sleepColor
|
1442
|
-
}) => {
|
1356
|
+
const Debug = () => {
|
1443
1357
|
const {
|
1444
1358
|
world
|
1445
1359
|
} = useRapier();
|
1446
1360
|
const ref = useRef(null);
|
1447
|
-
const [material] = useState(new MeshBasicMaterial({
|
1448
|
-
color,
|
1449
|
-
wireframe: true
|
1450
|
-
}));
|
1451
1361
|
useFrame(() => {
|
1452
|
-
const
|
1453
|
-
|
1454
|
-
|
1455
|
-
|
1456
|
-
|
1457
|
-
y: ry,
|
1458
|
-
z: rz,
|
1459
|
-
w: rw
|
1460
|
-
} = collider.rotation();
|
1461
|
-
const {
|
1462
|
-
x,
|
1463
|
-
y,
|
1464
|
-
z
|
1465
|
-
} = collider.translation();
|
1466
|
-
const parent = collider.parent();
|
1467
|
-
|
1468
|
-
if (parent !== null && parent !== void 0 && parent.isSleeping() || parent !== null && parent !== void 0 && parent.isFixed() || parent !== null && parent !== void 0 && parent.isKinematic()) {
|
1469
|
-
material.color = new Color(sleepColor);
|
1470
|
-
} else {
|
1471
|
-
material.color = new Color(color);
|
1472
|
-
}
|
1473
|
-
|
1474
|
-
ref.current.position.set(x, y, z);
|
1475
|
-
ref.current.rotation.setFromQuaternion(new Quaternion(rx, ry, rz, rw));
|
1476
|
-
}
|
1477
|
-
});
|
1478
|
-
const geometry = useMemo(() => {
|
1479
|
-
const collider = world.getCollider(colliderHandle);
|
1480
|
-
return geometryFromCollider(collider);
|
1481
|
-
}, [colliderHandle]);
|
1482
|
-
return /*#__PURE__*/React.createElement("mesh", {
|
1483
|
-
ref: ref,
|
1484
|
-
material: material
|
1485
|
-
}, /*#__PURE__*/React.createElement("primitive", {
|
1486
|
-
object: geometry,
|
1487
|
-
attach: "geometry"
|
1488
|
-
}));
|
1489
|
-
});
|
1490
|
-
const Debug = ({
|
1491
|
-
color: _color = "red",
|
1492
|
-
sleepColor: _sleepColor = "blue"
|
1493
|
-
}) => {
|
1494
|
-
const {
|
1495
|
-
world
|
1496
|
-
} = useRapier();
|
1497
|
-
const [colliders, setColliders] = useState([]);
|
1498
|
-
useRef({});
|
1499
|
-
|
1500
|
-
useFrame(() => {
|
1501
|
-
const newColliders = [];
|
1502
|
-
world.forEachCollider(collider => {
|
1503
|
-
newColliders.push(collider.handle);
|
1504
|
-
});
|
1505
|
-
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));
|
1506
1367
|
});
|
1507
|
-
return /*#__PURE__*/React.createElement("
|
1508
|
-
|
1509
|
-
|
1510
|
-
color:
|
1511
|
-
|
1512
|
-
})));
|
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));
|
1513
1374
|
};
|
1514
1375
|
|
1515
1376
|
const _excluded = ["positions", "rotations", "children"];
|
@@ -1614,11 +1475,11 @@ const InstancedRigidBodies = /*#__PURE__*/forwardRef((props, ref) => {
|
|
1614
1475
|
options: mergedOptions
|
1615
1476
|
};
|
1616
1477
|
}, [api, mergedOptions]);
|
1617
|
-
return /*#__PURE__*/React.createElement(RigidBodyContext.Provider, {
|
1478
|
+
return /*#__PURE__*/React$1.createElement(RigidBodyContext.Provider, {
|
1618
1479
|
value: contextValue
|
1619
|
-
}, /*#__PURE__*/React.createElement("object3D", {
|
1480
|
+
}, /*#__PURE__*/React$1.createElement("object3D", {
|
1620
1481
|
ref: object
|
1621
|
-
}, props.children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React.createElement(AnyCollider, _extends({
|
1482
|
+
}, props.children, childColliderProps.map((colliderProps, index) => /*#__PURE__*/React$1.createElement(AnyCollider, _extends({
|
1622
1483
|
key: index
|
1623
1484
|
}, colliderProps)))));
|
1624
1485
|
});
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@react-three/rapier",
|
3
|
-
"version": "0.
|
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,19 +8,22 @@
|
|
8
8
|
"files": [
|
9
9
|
"dist"
|
10
10
|
],
|
11
|
+
"scripts": {
|
12
|
+
"ts": "tsc -w"
|
13
|
+
},
|
11
14
|
"devDependencies": {
|
12
|
-
"@react-three/drei": "^9.
|
13
|
-
"@react-three/fiber": "^8.
|
15
|
+
"@react-three/drei": "^9.34.1",
|
16
|
+
"@react-three/fiber": "^8.8.9",
|
14
17
|
"@react-three/test-renderer": "^8.0.17",
|
15
18
|
"@types/react-dom": "^18.0.2",
|
16
19
|
"@types/three": "^0.139.0",
|
17
20
|
"@vitejs/plugin-react": "^2.1.0",
|
18
|
-
"@vitest/ui": "^0.
|
19
|
-
"happy-dom": "^
|
21
|
+
"@vitest/ui": "^0.24.1",
|
22
|
+
"happy-dom": "^7.5.5",
|
20
23
|
"react": "^18.1.0",
|
21
24
|
"react-dom": "^18.1.0",
|
22
25
|
"three": "^0.139.2",
|
23
|
-
"vitest": "^0.
|
26
|
+
"vitest": "^0.24.1"
|
24
27
|
},
|
25
28
|
"peerDependencies": {
|
26
29
|
"@react-three/fiber": "^8.0.12",
|
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
|
207
|
+
<Debug />
|
203
208
|
|
204
209
|
<RigidBody>
|
205
210
|
<Box />
|