@react-three/rapier 0.15.0 → 0.16.0-canary.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/components/AnyCollider.d.ts +28 -9
- package/dist/declarations/src/components/Physics.d.ts +2 -2
- package/dist/declarations/src/hooks/use-imperative-instance.d.ts +2 -1
- package/dist/declarations/src/types.d.ts +33 -21
- package/dist/declarations/src/utils/api.d.ts +1 -2
- package/dist/declarations/src/utils/utils-collider.d.ts +5 -5
- package/dist/declarations/src/utils/utils-rigidbody.d.ts +4 -0
- package/dist/declarations/src/utils/utils.d.ts +2 -2
- package/dist/react-three-rapier.cjs.dev.js +162 -164
- package/dist/react-three-rapier.cjs.prod.js +162 -164
- package/dist/react-three-rapier.esm.js +162 -166
- package/package.json +4 -4
- package/readme.md +29 -22
@@ -72,37 +72,37 @@ function _objectSpread2(target) {
|
|
72
72
|
return target;
|
73
73
|
}
|
74
74
|
|
75
|
-
const createWorldApi =
|
75
|
+
const createWorldApi = getWorld => {
|
76
76
|
return {
|
77
|
-
raw: () =>
|
78
|
-
getCollider: handle =>
|
79
|
-
getRigidBody: handle =>
|
80
|
-
createRigidBody: desc =>
|
81
|
-
createCollider: (desc, rigidBody) =>
|
77
|
+
raw: () => getWorld(),
|
78
|
+
getCollider: handle => getWorld().getCollider(handle),
|
79
|
+
getRigidBody: handle => getWorld().getRigidBody(handle),
|
80
|
+
createRigidBody: desc => getWorld().createRigidBody(desc),
|
81
|
+
createCollider: (desc, rigidBody) => getWorld().createCollider(desc, rigidBody),
|
82
82
|
removeRigidBody: rigidBody => {
|
83
|
-
if (!
|
84
|
-
|
83
|
+
if (!getWorld().bodies.contains(rigidBody.handle)) return;
|
84
|
+
getWorld().removeRigidBody(rigidBody);
|
85
85
|
},
|
86
86
|
removeCollider: (collider, wakeUp = true) => {
|
87
|
-
if (!
|
88
|
-
|
87
|
+
if (!getWorld().colliders.contains(collider.handle)) return;
|
88
|
+
getWorld().removeCollider(collider, wakeUp);
|
89
89
|
},
|
90
|
-
createImpulseJoint: (params, rigidBodyA, rigidBodyB, wakeUp = true) =>
|
90
|
+
createImpulseJoint: (params, rigidBodyA, rigidBodyB, wakeUp = true) => getWorld().createImpulseJoint(params, rigidBodyA, rigidBodyB, wakeUp),
|
91
91
|
removeImpulseJoint: (joint, wakeUp = true) => {
|
92
|
-
if (!
|
93
|
-
|
92
|
+
if (!getWorld().impulseJoints.contains(joint.handle)) return;
|
93
|
+
getWorld().removeImpulseJoint(joint, wakeUp);
|
94
94
|
},
|
95
|
-
forEachCollider: callback =>
|
95
|
+
forEachCollider: callback => getWorld().forEachCollider(callback),
|
96
96
|
setGravity: ({
|
97
97
|
x,
|
98
98
|
y,
|
99
99
|
z
|
100
|
-
}) =>
|
100
|
+
}) => getWorld().gravity = {
|
101
101
|
x,
|
102
102
|
y,
|
103
103
|
z
|
104
104
|
},
|
105
|
-
debugRender: () =>
|
105
|
+
debugRender: () => getWorld().debugRender()
|
106
106
|
};
|
107
107
|
};
|
108
108
|
|
@@ -295,6 +295,7 @@ const createColliderFromOptions = (options, world, scale, getRigidBody) => {
|
|
295
295
|
const desc = rapier3dCompat.ColliderDesc[options.shape](...scaledArgs);
|
296
296
|
return world.createCollider(desc, getRigidBody === null || getRigidBody === void 0 ? void 0 : getRigidBody());
|
297
297
|
};
|
298
|
+
const immutableColliderOptions = ["shape", "args"];
|
298
299
|
const massPropertiesConflictError = "Please pick ONLY ONE of the `density`, `mass` and `massProperties` options.";
|
299
300
|
|
300
301
|
const setColliderMassOptions = (collider, options) => {
|
@@ -343,7 +344,7 @@ const mutableColliderOptions = {
|
|
343
344
|
restitutionCombineRule: (collider, value) => {
|
344
345
|
collider.setRestitutionCombineRule(value);
|
345
346
|
},
|
346
|
-
// To make sure the options all
|
347
|
+
// To make sure the options all mutable options are listed
|
347
348
|
quaternion: () => {},
|
348
349
|
position: () => {},
|
349
350
|
rotation: () => {},
|
@@ -405,7 +406,7 @@ const useUpdateColliderOptions = (getCollider, props, states) => {
|
|
405
406
|
React.useEffect(() => {
|
406
407
|
const collider = getCollider();
|
407
408
|
setColliderOptions(collider, props, states);
|
408
|
-
}, mutablePropsAsFlatArray);
|
409
|
+
}, [...mutablePropsAsFlatArray, getCollider]);
|
409
410
|
};
|
410
411
|
|
411
412
|
const isChildOfMeshCollider = child => {
|
@@ -682,6 +683,33 @@ const Debug = /*#__PURE__*/React.memo(() => {
|
|
682
683
|
}), /*#__PURE__*/React__default["default"].createElement("bufferGeometry", null)));
|
683
684
|
});
|
684
685
|
|
686
|
+
/**
|
687
|
+
* Initiate an instance and return a safe getter
|
688
|
+
*/
|
689
|
+
|
690
|
+
const useImperativeInstance = (createFn, destroyFn, dependencyList) => {
|
691
|
+
const ref = React.useRef();
|
692
|
+
const getInstance = React.useCallback(() => {
|
693
|
+
if (!ref.current) {
|
694
|
+
ref.current = createFn();
|
695
|
+
}
|
696
|
+
|
697
|
+
return ref.current;
|
698
|
+
}, dependencyList);
|
699
|
+
React.useEffect(() => {
|
700
|
+
// Save the destroy function and instance
|
701
|
+
const instance = getInstance();
|
702
|
+
|
703
|
+
const destroy = () => destroyFn(instance);
|
704
|
+
|
705
|
+
return () => {
|
706
|
+
destroy();
|
707
|
+
ref.current = undefined;
|
708
|
+
};
|
709
|
+
}, [getInstance]);
|
710
|
+
return getInstance;
|
711
|
+
};
|
712
|
+
|
685
713
|
const rapierContext = /*#__PURE__*/React.createContext(undefined);
|
686
714
|
|
687
715
|
const getCollisionPayloadFromSource = (target, other) => {
|
@@ -731,77 +759,60 @@ const Physics = ({
|
|
731
759
|
const rapier = useAsset.useAsset(importRapier);
|
732
760
|
const {
|
733
761
|
invalidate
|
734
|
-
} = fiber.useThree();
|
735
|
-
const worldRef = React.useRef();
|
736
|
-
const getWorldRef = React.useRef(() => {
|
737
|
-
if (!worldRef.current) {
|
738
|
-
const world = new rapier.World(vectorArrayToVector3(_gravity));
|
739
|
-
worldRef.current = world;
|
740
|
-
}
|
762
|
+
} = fiber.useThree(); // Init World
|
741
763
|
|
742
|
-
|
743
|
-
|
764
|
+
const getWorld = useImperativeInstance(() => {
|
765
|
+
return new rapier.World(vectorArrayToVector3(_gravity));
|
766
|
+
}, world => {
|
767
|
+
world.free();
|
768
|
+
}, []);
|
744
769
|
const rigidBodyStates = useConst(() => new Map());
|
745
770
|
const colliderStates = useConst(() => new Map());
|
746
771
|
const rigidBodyEvents = useConst(() => new Map());
|
747
772
|
const colliderEvents = useConst(() => new Map());
|
748
773
|
const eventQueue = useConst(() => new rapier3dCompat.EventQueue(false));
|
749
774
|
const beforeStepCallbacks = useConst(() => new Set());
|
750
|
-
const afterStepCallbacks = useConst(() => new Set()); //
|
775
|
+
const afterStepCallbacks = useConst(() => new Set()); // Update gravity
|
751
776
|
|
752
777
|
React.useEffect(() => {
|
753
|
-
const world =
|
754
|
-
return () => {
|
755
|
-
if (world) {
|
756
|
-
world.free();
|
757
|
-
worldRef.current = undefined;
|
758
|
-
}
|
759
|
-
};
|
760
|
-
}, []); // Update gravity
|
761
|
-
|
762
|
-
React.useEffect(() => {
|
763
|
-
const world = worldRef.current;
|
778
|
+
const world = getWorld();
|
764
779
|
|
765
780
|
if (world) {
|
766
781
|
world.gravity = vectorArrayToVector3(_gravity);
|
767
782
|
}
|
768
783
|
}, [_gravity]);
|
769
|
-
const api = React.useMemo(() => createWorldApi(
|
784
|
+
const api = React.useMemo(() => createWorldApi(getWorld), []);
|
770
785
|
const getSourceFromColliderHandle = React.useCallback(handle => {
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
};
|
795
|
-
return source;
|
796
|
-
}
|
786
|
+
var _collider$parent;
|
787
|
+
|
788
|
+
const world = getWorld();
|
789
|
+
const collider = world.getCollider(handle);
|
790
|
+
const colEvents = colliderEvents.get(handle);
|
791
|
+
const colliderState = colliderStates.get(handle);
|
792
|
+
const rigidBodyHandle = collider === null || collider === void 0 ? void 0 : (_collider$parent = collider.parent()) === null || _collider$parent === void 0 ? void 0 : _collider$parent.handle;
|
793
|
+
const rigidBody = rigidBodyHandle !== undefined ? world.getRigidBody(rigidBodyHandle) : undefined;
|
794
|
+
const rbEvents = rigidBody && rigidBodyHandle !== undefined ? rigidBodyEvents.get(rigidBodyHandle) : undefined;
|
795
|
+
const rigidBodyState = rigidBodyHandle !== undefined ? rigidBodyStates.get(rigidBodyHandle) : undefined;
|
796
|
+
const source = {
|
797
|
+
collider: {
|
798
|
+
object: collider,
|
799
|
+
events: colEvents,
|
800
|
+
state: colliderState
|
801
|
+
},
|
802
|
+
rigidBody: {
|
803
|
+
object: rigidBody,
|
804
|
+
events: rbEvents,
|
805
|
+
state: rigidBodyState
|
806
|
+
}
|
807
|
+
};
|
808
|
+
return source;
|
797
809
|
}, []);
|
798
810
|
const [steppingState] = React.useState({
|
799
811
|
previousState: {},
|
800
812
|
accumulator: 0
|
801
813
|
});
|
802
814
|
const step = React.useCallback(dt => {
|
803
|
-
const world =
|
804
|
-
if (!world) return;
|
815
|
+
const world = getWorld();
|
805
816
|
/* Check if the timestep is supposed to be variable. We'll do this here
|
806
817
|
once so we don't have to string-check every frame. */
|
807
818
|
|
@@ -1057,29 +1068,6 @@ function _extends() {
|
|
1057
1068
|
return _extends.apply(this, arguments);
|
1058
1069
|
}
|
1059
1070
|
|
1060
|
-
/**
|
1061
|
-
* Initiate an instance and return a safe getter
|
1062
|
-
*/
|
1063
|
-
|
1064
|
-
const useImperativeInstance = (createFn, destroyFn) => {
|
1065
|
-
const ref = React.useRef();
|
1066
|
-
const refGetter = React.useMemo(() => () => {
|
1067
|
-
if (!ref.current) {
|
1068
|
-
ref.current = createFn();
|
1069
|
-
}
|
1070
|
-
|
1071
|
-
return ref.current;
|
1072
|
-
}, []);
|
1073
|
-
React.useEffect(() => {
|
1074
|
-
const instance = refGetter();
|
1075
|
-
return () => {
|
1076
|
-
destroyFn(instance);
|
1077
|
-
ref.current = undefined;
|
1078
|
-
};
|
1079
|
-
}, []);
|
1080
|
-
return refGetter;
|
1081
|
-
};
|
1082
|
-
|
1083
1071
|
/**
|
1084
1072
|
* Takes an object resembling a Vector3 and returs a Three.Vector3
|
1085
1073
|
* @category Math helpers
|
@@ -1131,8 +1119,6 @@ const euler = ({
|
|
1131
1119
|
return new three.Euler(x, y, z);
|
1132
1120
|
};
|
1133
1121
|
|
1134
|
-
// Colliders
|
1135
|
-
|
1136
1122
|
/**
|
1137
1123
|
* A collider is a shape that can be attached to a rigid body to define its physical properties.
|
1138
1124
|
* @internal
|
@@ -1152,22 +1138,24 @@ const AnyCollider = /*#__PURE__*/React.memo( /*#__PURE__*/React.forwardRef((prop
|
|
1152
1138
|
colliderStates
|
1153
1139
|
} = useRapier();
|
1154
1140
|
const rigidBodyContext = useRigidBodyContext();
|
1155
|
-
const ref = React.useRef(null);
|
1141
|
+
const ref = React.useRef(null); // We spread the props out here to make sure that the ref is updated when the props change.
|
1142
|
+
|
1143
|
+
const immutablePropArray = immutableColliderOptions.flatMap(key => Array.isArray(props[key]) ? [...props[key]] : props[key]);
|
1156
1144
|
const getInstance = useImperativeInstance(() => {
|
1157
1145
|
const worldScale = ref.current.getWorldScale(vec3());
|
1158
1146
|
const collider = createColliderFromOptions(props, world, worldScale, rigidBodyContext === null || rigidBodyContext === void 0 ? void 0 : rigidBodyContext.getRigidBody);
|
1159
1147
|
return collider;
|
1160
1148
|
}, collider => {
|
1161
1149
|
world.removeCollider(collider);
|
1162
|
-
});
|
1150
|
+
}, [...immutablePropArray, rigidBodyContext]);
|
1163
1151
|
React.useEffect(() => {
|
1164
1152
|
const collider = getInstance();
|
1165
1153
|
colliderStates.set(collider.handle, createColliderState(collider, ref.current, rigidBodyContext === null || rigidBodyContext === void 0 ? void 0 : rigidBodyContext.ref.current));
|
1166
1154
|
return () => {
|
1167
1155
|
colliderStates.delete(collider.handle);
|
1168
1156
|
};
|
1169
|
-
}, []);
|
1170
|
-
React.useImperativeHandle(forwardedRef, () => getInstance());
|
1157
|
+
}, [getInstance]);
|
1158
|
+
React.useImperativeHandle(forwardedRef, () => getInstance(), [getInstance]);
|
1171
1159
|
const mergedProps = React.useMemo(() => {
|
1172
1160
|
return _objectSpread2(_objectSpread2({}, cleanRigidBodyPropsForCollider(rigidBodyContext === null || rigidBodyContext === void 0 ? void 0 : rigidBodyContext.options)), props);
|
1173
1161
|
}, [props, rigidBodyContext === null || rigidBodyContext === void 0 ? void 0 : rigidBodyContext.options]);
|
@@ -1193,102 +1181,106 @@ const CuboidCollider = /*#__PURE__*/React__default["default"].forwardRef((props,
|
|
1193
1181
|
ref: ref
|
1194
1182
|
}));
|
1195
1183
|
});
|
1184
|
+
CuboidCollider.displayName = "CuboidCollider";
|
1185
|
+
|
1196
1186
|
/**
|
1197
1187
|
* A round cuboid collider shape
|
1198
1188
|
* @category Colliders
|
1199
1189
|
*/
|
1190
|
+
const RoundCuboidCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1191
|
+
shape: "roundCuboid",
|
1192
|
+
ref: ref
|
1193
|
+
})));
|
1194
|
+
RoundCuboidCollider.displayName = "RoundCuboidCollider";
|
1200
1195
|
|
1201
|
-
const RoundCuboidCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
|
1202
|
-
return /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1203
|
-
shape: "roundCuboid",
|
1204
|
-
ref: ref
|
1205
|
-
}));
|
1206
|
-
});
|
1207
1196
|
/**
|
1208
1197
|
* A ball collider shape
|
1209
1198
|
* @category Colliders
|
1210
1199
|
*/
|
1200
|
+
const BallCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1201
|
+
shape: "ball",
|
1202
|
+
ref: ref
|
1203
|
+
})));
|
1204
|
+
BallCollider.displayName = "BallCollider";
|
1211
1205
|
|
1212
|
-
const BallCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
|
1213
|
-
return /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1214
|
-
shape: "ball",
|
1215
|
-
ref: ref
|
1216
|
-
}));
|
1217
|
-
});
|
1218
1206
|
/**
|
1219
1207
|
* A capsule collider shape
|
1220
1208
|
* @category Colliders
|
1221
1209
|
*/
|
1210
|
+
const CapsuleCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1211
|
+
shape: "capsule",
|
1212
|
+
ref: ref
|
1213
|
+
})));
|
1214
|
+
CapsuleCollider.displayName = "CapsuleCollider";
|
1222
1215
|
|
1223
|
-
const CapsuleCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
|
1224
|
-
return /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1225
|
-
shape: "capsule",
|
1226
|
-
ref: ref
|
1227
|
-
}));
|
1228
|
-
});
|
1229
1216
|
/**
|
1230
1217
|
* A heightfield collider shape
|
1231
1218
|
* @category Colliders
|
1232
1219
|
*/
|
1220
|
+
const HeightfieldCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1221
|
+
shape: "heightfield",
|
1222
|
+
ref: ref
|
1223
|
+
})));
|
1224
|
+
HeightfieldCollider.displayName = "HeightfieldCollider";
|
1233
1225
|
|
1234
|
-
const HeightfieldCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
|
1235
|
-
return /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1236
|
-
shape: "heightfield",
|
1237
|
-
ref: ref
|
1238
|
-
}));
|
1239
|
-
});
|
1240
1226
|
/**
|
1241
1227
|
* A trimesh collider shape
|
1242
1228
|
* @category Colliders
|
1243
1229
|
*/
|
1230
|
+
const TrimeshCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1231
|
+
shape: "trimesh",
|
1232
|
+
ref: ref
|
1233
|
+
})));
|
1234
|
+
TrimeshCollider.displayName = "TrimeshCollider";
|
1244
1235
|
|
1245
|
-
const TrimeshCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
|
1246
|
-
return /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1247
|
-
shape: "trimesh",
|
1248
|
-
ref: ref
|
1249
|
-
}));
|
1250
|
-
});
|
1251
1236
|
/**
|
1252
1237
|
* A cone collider shape
|
1253
1238
|
* @category Colliders
|
1254
1239
|
*/
|
1240
|
+
const ConeCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1241
|
+
shape: "cone",
|
1242
|
+
ref: ref
|
1243
|
+
})));
|
1244
|
+
ConeCollider.displayName = "ConeCollider";
|
1245
|
+
|
1246
|
+
/**
|
1247
|
+
* A round cylinder collider shape
|
1248
|
+
* @category Colliders
|
1249
|
+
*/
|
1250
|
+
const RoundConeCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1251
|
+
shape: "roundCone",
|
1252
|
+
ref: ref
|
1253
|
+
})));
|
1254
|
+
RoundConeCollider.displayName = "RoundConeCollider";
|
1255
1255
|
|
1256
|
-
const ConeCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
|
1257
|
-
return /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1258
|
-
shape: "cone",
|
1259
|
-
ref: ref
|
1260
|
-
}));
|
1261
|
-
});
|
1262
1256
|
/**
|
1263
1257
|
* A cylinder collider shape
|
1264
1258
|
* @category Colliders
|
1265
1259
|
*/
|
1260
|
+
const CylinderCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1261
|
+
shape: "cylinder",
|
1262
|
+
ref: ref
|
1263
|
+
})));
|
1264
|
+
CylinderCollider.displayName = "CylinderCollider";
|
1266
1265
|
|
1267
|
-
const CylinderCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
|
1268
|
-
return /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1269
|
-
shape: "cylinder",
|
1270
|
-
ref: ref
|
1271
|
-
}));
|
1272
|
-
});
|
1273
1266
|
/**
|
1274
|
-
* A
|
1267
|
+
* A round cylinder collider shape
|
1275
1268
|
* @category Colliders
|
1276
1269
|
*/
|
1270
|
+
const RoundCylinderCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1271
|
+
shape: "roundCylinder",
|
1272
|
+
ref: ref
|
1273
|
+
})));
|
1274
|
+
CylinderCollider.displayName = "RoundCylinderCollider";
|
1277
1275
|
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
BallCollider.displayName = "BallCollider";
|
1287
|
-
CapsuleCollider.displayName = "CapsuleCollider";
|
1288
|
-
HeightfieldCollider.displayName = "HeightfieldCollider";
|
1289
|
-
TrimeshCollider.displayName = "TrimeshCollider";
|
1290
|
-
ConeCollider.displayName = "ConeCollider";
|
1291
|
-
CylinderCollider.displayName = "CylinderCollider";
|
1276
|
+
/**
|
1277
|
+
* A convex hull collider shape
|
1278
|
+
* @category Colliders
|
1279
|
+
*/
|
1280
|
+
const ConvexHullCollider = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => /*#__PURE__*/React__default["default"].createElement(AnyCollider, _extends({}, props, {
|
1281
|
+
shape: "convexHull",
|
1282
|
+
ref: ref
|
1283
|
+
})));
|
1292
1284
|
ConvexHullCollider.displayName = "ConvexHullCollider";
|
1293
1285
|
|
1294
1286
|
const rigidBodyDescFromOptions = options => {
|
@@ -1323,6 +1315,7 @@ const createRigidBodyState = ({
|
|
1323
1315
|
meshType: _meshType
|
1324
1316
|
};
|
1325
1317
|
};
|
1318
|
+
const immutableRigidBodyOptions = ["args", "colliders", "canSleep"];
|
1326
1319
|
const mutableRigidBodyOptions = {
|
1327
1320
|
gravityScale: (rb, value) => {
|
1328
1321
|
rb.setGravityScale(value, true);
|
@@ -1473,18 +1466,21 @@ const RigidBody = /*#__PURE__*/React.memo( /*#__PURE__*/React.forwardRef((props,
|
|
1473
1466
|
children: undefined
|
1474
1467
|
});
|
1475
1468
|
}, [physicsOptions, props]);
|
1469
|
+
const immutablePropArray = immutableRigidBodyOptions.flatMap(key => {
|
1470
|
+
return Array.isArray(mergedOptions[key]) ? [...mergedOptions[key]] : mergedOptions[key];
|
1471
|
+
});
|
1476
1472
|
const childColliderProps = useChildColliderProps(ref, mergedOptions); // Provide a way to eagerly create rigidbody
|
1477
1473
|
|
1478
|
-
const
|
1474
|
+
const getRigidBody = useImperativeInstance(() => {
|
1479
1475
|
const desc = rigidBodyDescFromOptions(mergedOptions);
|
1480
1476
|
const rigidBody = world.createRigidBody(desc);
|
1481
1477
|
return rigidBody;
|
1482
1478
|
}, rigidBody => {
|
1483
1479
|
world.removeRigidBody(rigidBody);
|
1484
|
-
}); // Only provide a object state after the ref has been set
|
1480
|
+
}, immutablePropArray); // Only provide a object state after the ref has been set
|
1485
1481
|
|
1486
1482
|
React.useEffect(() => {
|
1487
|
-
const rigidBody =
|
1483
|
+
const rigidBody = getRigidBody();
|
1488
1484
|
const state = createRigidBodyState({
|
1489
1485
|
rigidBody,
|
1490
1486
|
object: ref.current
|
@@ -1493,17 +1489,17 @@ const RigidBody = /*#__PURE__*/React.memo( /*#__PURE__*/React.forwardRef((props,
|
|
1493
1489
|
return () => {
|
1494
1490
|
rigidBodyStates.delete(rigidBody.handle);
|
1495
1491
|
};
|
1496
|
-
}, []);
|
1497
|
-
useUpdateRigidBodyOptions(
|
1498
|
-
useRigidBodyEvents(
|
1499
|
-
React.useImperativeHandle(forwardedRef, () =>
|
1492
|
+
}, [getRigidBody]);
|
1493
|
+
useUpdateRigidBodyOptions(getRigidBody, mergedOptions, rigidBodyStates);
|
1494
|
+
useRigidBodyEvents(getRigidBody, mergedOptions, rigidBodyEvents);
|
1495
|
+
React.useImperativeHandle(forwardedRef, () => getRigidBody(), [getRigidBody]);
|
1500
1496
|
const contextValue = React.useMemo(() => {
|
1501
1497
|
return {
|
1502
1498
|
ref,
|
1503
|
-
getRigidBody:
|
1499
|
+
getRigidBody: getRigidBody,
|
1504
1500
|
options: mergedOptions
|
1505
1501
|
};
|
1506
|
-
}, [
|
1502
|
+
}, [getRigidBody]);
|
1507
1503
|
return /*#__PURE__*/React__default["default"].createElement(RigidBodyContext.Provider, {
|
1508
1504
|
value: contextValue
|
1509
1505
|
}, /*#__PURE__*/React__default["default"].createElement("object3D", _extends({
|
@@ -1657,7 +1653,7 @@ const useImpulseJoint = (body1, body2, params) => {
|
|
1657
1653
|
jointRef.current = undefined;
|
1658
1654
|
world.removeImpulseJoint(joint);
|
1659
1655
|
}
|
1660
|
-
});
|
1656
|
+
}, []);
|
1661
1657
|
return jointRef;
|
1662
1658
|
};
|
1663
1659
|
/**
|
@@ -1792,7 +1788,9 @@ exports.InstancedRigidBodies = InstancedRigidBodies;
|
|
1792
1788
|
exports.MeshCollider = MeshCollider;
|
1793
1789
|
exports.Physics = Physics;
|
1794
1790
|
exports.RigidBody = RigidBody;
|
1791
|
+
exports.RoundConeCollider = RoundConeCollider;
|
1795
1792
|
exports.RoundCuboidCollider = RoundCuboidCollider;
|
1793
|
+
exports.RoundCylinderCollider = RoundCylinderCollider;
|
1796
1794
|
exports.TrimeshCollider = TrimeshCollider;
|
1797
1795
|
exports.euler = euler;
|
1798
1796
|
exports.interactionGroups = interactionGroups;
|