@threlte/rapier 0.5.0 → 1.0.0-next.1

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.
Files changed (53) hide show
  1. package/dist/CHANGELOG.md +12 -0
  2. package/dist/components/Attractor/Attractor.svelte +17 -13
  3. package/dist/components/Attractor/Attractor.svelte.d.ts +20 -22
  4. package/dist/components/Colliders/AutoColliders.svelte +52 -50
  5. package/dist/components/Colliders/AutoColliders.svelte.d.ts +80 -0
  6. package/dist/components/Colliders/Collider.svelte +40 -30
  7. package/dist/components/Colliders/Collider.svelte.d.ts +110 -112
  8. package/dist/components/CollisionGroups/CollisionGroups.svelte +1 -20
  9. package/dist/components/CollisionGroups/CollisionGroups.svelte.d.ts +29 -19
  10. package/dist/components/Debug/Debug.svelte +13 -10
  11. package/dist/components/Debug/Debug.svelte.d.ts +6 -60
  12. package/dist/components/RigidBody/RigidBody.svelte +23 -58
  13. package/dist/components/RigidBody/RigidBody.svelte.d.ts +94 -67
  14. package/dist/components/World/InnerWorld.svelte +11 -7
  15. package/dist/components/World/InnerWorld.svelte.d.ts +15 -15
  16. package/dist/components/World/World.svelte +13 -2
  17. package/dist/components/World/World.svelte.d.ts +36 -32
  18. package/dist/hooks/useFixedJoint.d.ts +2 -2
  19. package/dist/hooks/useFixedJoint.js +6 -3
  20. package/dist/hooks/useFrameHandler.d.ts +1 -1
  21. package/dist/hooks/useFrameHandler.js +9 -8
  22. package/dist/hooks/usePrismaticJoint.d.ts +2 -2
  23. package/dist/hooks/usePrismaticJoint.js +5 -2
  24. package/dist/hooks/useRevoluteJoint.d.ts +2 -2
  25. package/dist/hooks/useRevoluteJoint.js +5 -2
  26. package/dist/hooks/useSphericalJoint.d.ts +2 -2
  27. package/dist/hooks/useSphericalJoint.js +4 -2
  28. package/dist/index.d.ts +2 -1
  29. package/dist/index.js +2 -0
  30. package/dist/lib/applyTransforms.d.ts +2 -3
  31. package/dist/lib/applyTransforms.js +7 -16
  32. package/dist/lib/computeBitMask.d.ts +5 -0
  33. package/dist/lib/computeBitMask.js +20 -0
  34. package/dist/lib/createRapierContext.d.ts +3 -0
  35. package/dist/lib/createRapierContext.js +10 -1
  36. package/dist/lib/eulerToQuaternion.d.ts +7 -0
  37. package/dist/lib/eulerToQuaternion.js +12 -0
  38. package/dist/lib/scaleColliderArgs.js +3 -3
  39. package/dist/recipes/BasicPlayerController.svelte +28 -27
  40. package/dist/recipes/BasicPlayerController.svelte.d.ts +2 -5
  41. package/dist/types/components.d.ts +1 -88
  42. package/dist/types/types.d.ts +5 -5
  43. package/package.json +10 -9
  44. package/dist/components/Joints/RevoluteJoint.svelte +0 -5
  45. package/dist/components/Joints/RevoluteJoint.svelte.d.ts +0 -23
  46. package/dist/lib/positionToVector3.d.ts +0 -3
  47. package/dist/lib/positionToVector3.js +0 -8
  48. package/dist/lib/rotationToEuler.d.ts +0 -3
  49. package/dist/lib/rotationToEuler.js +0 -8
  50. package/dist/lib/rotationToQuaternion.d.ts +0 -3
  51. package/dist/lib/rotationToQuaternion.js +0 -10
  52. package/dist/lib/scaleToVector3.d.ts +0 -3
  53. package/dist/lib/scaleToVector3.js +0 -16
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @threlte/extras
2
2
 
3
+ ## 1.0.0-next.1
4
+
5
+ ### Major Changes
6
+
7
+ - 4b67b473: Removed transform properties on rapier components Collider, AutoColliders and RigidBody
8
+
9
+ ## 1.0.0-next.0
10
+
11
+ ### Major Changes
12
+
13
+ - d41cb6cf: Adapted rapier package to Threlte v6 syntax
14
+
3
15
  ## 0.5.0
4
16
 
5
17
  ### Minor Changes
@@ -1,14 +1,13 @@
1
- <script>import { Mesh, useFrame, Object3DInstance } from '@threlte/core';
2
- import { SphereBufferGeometry, MeshBasicMaterial, Vector3, Object3D } from 'three';
1
+ <script>import { T, useFrame } from '@threlte/core';
2
+ import { Group, Vector3 } from 'three';
3
3
  import { useRapier } from '../../hooks/useRapier';
4
- export let position = undefined;
5
4
  export let strength = 1;
6
5
  export let range = 50;
7
6
  export let gravityType = 'static';
8
7
  export let gravitationalConstant = 6.673e-11;
9
8
  const { world, debug } = useRapier();
10
9
  const gravitySource = new Vector3();
11
- let obj = new Object3D();
10
+ let obj = new Group();
12
11
  const calcForceByType = {
13
12
  static: (s, m2, r, d, G) => s,
14
13
  linear: (s, m2, r, d, G) => s * (d / r),
@@ -35,16 +34,21 @@ useFrame(() => {
35
34
  });
36
35
  </script>
37
36
 
38
- <Object3DInstance
39
- bind:object={obj}
40
- {position}
37
+ <T
38
+ let:ref
39
+ is={obj}
40
+ {...$$restProps}
41
41
  >
42
- <slot />
42
+ <slot {ref} />
43
43
 
44
44
  {#if $debug}
45
- <Mesh
46
- geometry={new SphereBufferGeometry(range)}
47
- material={new MeshBasicMaterial({ wireframe: true, transparent: true, opacity: 0.25 })}
48
- />
45
+ <T.Mesh>
46
+ <T.SphereGeometry args={[range]} />
47
+ <T.MeshBasicMaterial
48
+ wireframe
49
+ transparent
50
+ opacity={0.25}
51
+ />
52
+ </T.Mesh>
49
53
  {/if}
50
- </Object3DInstance>
54
+ </T>
@@ -1,23 +1,21 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- import type { AttractorProperties } from '../../types/components';
3
- declare const __propDef: {
4
- props: {
5
- position?: AttractorProperties['position'];
6
- strength?: number | undefined;
7
- range?: number | undefined;
8
- gravityType?: import("../../types/components").GravityType | undefined;
9
- gravitationalConstant?: number | undefined;
10
- };
11
- events: {
12
- [evt: string]: CustomEvent<any>;
13
- };
14
- slots: {
15
- default: {};
16
- };
17
- };
18
- export declare type AttractorProps = typeof __propDef.props;
19
- export declare type AttractorEvents = typeof __propDef.events;
20
- export declare type AttractorSlots = typeof __propDef.slots;
21
- export default class Attractor extends SvelteComponentTyped<AttractorProps, AttractorEvents, AttractorSlots> {
1
+ import { SvelteComponentTyped } from 'svelte'
2
+ import type { AttractorProperties } from '../../types/components'
3
+ import { Props, type Events, type Slots } from '@threlte/core'
4
+ import type { Group } from 'three'
5
+
6
+ type AttractorProps = Props<Group> & {
7
+ strength?: NonNullable<AttractorProperties['strength']>
8
+ range?: NonNullable<AttractorProperties['range']>
9
+ gravityType?: NonNullable<AttractorProperties['gravityType']>
10
+ gravitationalConstant?: NonNullable<AttractorProperties['gravitationalConstant']>
22
11
  }
23
- export {};
12
+
13
+ type AttractorEvents = Events<Group>
14
+
15
+ type AttractorSlots = Slots<Group>
16
+
17
+ export default class Attractor extends SvelteComponentTyped<
18
+ AttractorProps,
19
+ AttractorEvents,
20
+ AttractorSlots
21
+ > {}
@@ -1,21 +1,15 @@
1
- <script>import { ActiveCollisionTypes, ActiveEvents, CoefficientCombineRule } from '@dimforge/rapier3d-compat';
2
- import { SceneGraphObject } from '@threlte/core';
3
- import { createEventDispatcher, onDestroy, onMount } from 'svelte';
4
- import { Object3D } from 'three';
1
+ <script>import { ActiveCollisionTypes, CoefficientCombineRule } from '@dimforge/rapier3d-compat';
2
+ import { createRawEventDispatcher, SceneGraphObject } from '@threlte/core';
3
+ import { onDestroy, onMount } from 'svelte';
4
+ import { Group } from 'three';
5
5
  import { useCollisionGroups } from '../../hooks/useCollisionGroups';
6
6
  import { useHasEventListeners } from '../../hooks/useHasEventListener';
7
7
  import { useRapier } from '../../hooks/useRapier';
8
8
  import { useRigidBody } from '../../hooks/useRigidBody';
9
9
  import { applyColliderActiveEvents } from '../../lib/applyColliderActiveEvents';
10
- import { applyTransforms } from '../../lib/applyTransforms';
11
10
  import { createCollidersFromChildren } from '../../lib/createCollidersFromChildren';
12
- import { positionToVector3 } from '../../lib/positionToVector3';
13
- import { rotationToQuaternion } from '../../lib/rotationToQuaternion';
11
+ import { eulerToQuaternion } from '../../lib/eulerToQuaternion';
14
12
  export let shape = 'convexHull';
15
- export let position = undefined;
16
- export let rotation = undefined;
17
- export let scale = undefined;
18
- export let lookAt = undefined;
19
13
  export let restitution = undefined;
20
14
  export let restitutionCombineRule = undefined;
21
15
  export let friction = undefined;
@@ -24,56 +18,64 @@ export let sensor = undefined;
24
18
  export let contactForceEventThreshold = undefined;
25
19
  export let density = undefined;
26
20
  export let mass = undefined;
27
- export let massProperties = undefined;
28
- const object = new Object3D();
29
- /**
30
- * Immediately apply transforms
31
- */
32
- applyTransforms(object, position, rotation, scale, lookAt);
33
- object.updateWorldMatrix(true, false);
21
+ export let centerOfMass = undefined;
22
+ export let principalAngularInertia = undefined;
23
+ export let angularInertiaLocalFrame = undefined;
24
+ const group = new Group();
34
25
  const rigidBody = useRigidBody();
35
26
  const { world, addColliderToContext, removeColliderFromContext } = useRapier();
36
27
  export let colliders = [];
37
28
  const collisionGroups = useCollisionGroups();
38
- const dispatcher = createEventDispatcher();
29
+ const dispatcher = createRawEventDispatcher();
39
30
  const { hasEventListeners: colliderHasEventListeners } = useHasEventListeners();
40
- onMount(() => {
41
- colliders = createCollidersFromChildren(object, shape ?? 'convexHull', world, rigidBody);
42
- colliders.forEach((c) => addColliderToContext(c, object, dispatcher));
43
- collisionGroups.registerColliders(colliders);
44
- });
45
- $: {
46
- if (colliders.length > 0) {
47
- colliders.forEach((collider) => {
48
- applyColliderActiveEvents(collider, colliderHasEventListeners, rigidBody?.userData?.hasEventListeners);
49
- collider.setActiveCollisionTypes(ActiveCollisionTypes.ALL);
50
- collider.setRestitution(restitution ?? 0);
51
- collider.setRestitutionCombineRule(restitutionCombineRule ?? CoefficientCombineRule.Average);
52
- collider.setFriction(friction ?? 0.7);
53
- collider.setFrictionCombineRule(frictionCombineRule ?? CoefficientCombineRule.Average);
54
- collider.setSensor(sensor ?? false);
55
- collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
56
- if (density)
57
- collider.setDensity(density);
58
- if (mass)
59
- collider.setMass(mass);
60
- if (massProperties)
61
- collider.setMassProperties(massProperties.mass, positionToVector3(massProperties.centerOfMass), positionToVector3(massProperties.principalAngularInertia), rotationToQuaternion(massProperties.angularInertiaLocalFrame));
62
- });
63
- }
64
- }
65
- /**
66
- * Cleanup
67
- */
68
- onDestroy(() => {
31
+ const cleanup = () => {
69
32
  collisionGroups.removeColliders(colliders);
70
33
  colliders.forEach((c) => {
71
34
  removeColliderFromContext(c);
72
35
  world.removeCollider(c, true);
73
36
  });
37
+ colliders.length = 0;
38
+ };
39
+ export const create = () => {
40
+ cleanup();
41
+ colliders = createCollidersFromChildren(group, shape ?? 'convexHull', world, rigidBody);
42
+ colliders.forEach((c) => addColliderToContext(c, group, dispatcher));
43
+ collisionGroups.registerColliders(colliders);
44
+ colliders.forEach((collider) => {
45
+ applyColliderActiveEvents(collider, colliderHasEventListeners, rigidBody?.userData?.hasEventListeners);
46
+ collider.setActiveCollisionTypes(ActiveCollisionTypes.ALL);
47
+ collider.setRestitution(restitution ?? 0);
48
+ collider.setRestitutionCombineRule(restitutionCombineRule ?? CoefficientCombineRule.Average);
49
+ collider.setFriction(friction ?? 0.7);
50
+ collider.setFrictionCombineRule(frictionCombineRule ?? CoefficientCombineRule.Average);
51
+ collider.setSensor(sensor ?? false);
52
+ collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
53
+ if (density)
54
+ collider.setDensity(density);
55
+ if (mass) {
56
+ if (centerOfMass && principalAngularInertia && angularInertiaLocalFrame)
57
+ collider.setMassProperties(mass, { x: centerOfMass[0], y: centerOfMass[1], z: centerOfMass[2] }, {
58
+ x: principalAngularInertia[0],
59
+ y: principalAngularInertia[1],
60
+ z: principalAngularInertia[2]
61
+ }, eulerToQuaternion(angularInertiaLocalFrame));
62
+ else
63
+ collider.setMass(mass);
64
+ }
65
+ });
66
+ };
67
+ onMount(() => {
68
+ create();
74
69
  });
70
+ export const refresh = () => {
71
+ create();
72
+ };
73
+ /**
74
+ * Cleanup
75
+ */
76
+ onDestroy(cleanup);
75
77
  </script>
76
78
 
77
- <SceneGraphObject {object}>
78
- <slot />
79
+ <SceneGraphObject object={group}>
80
+ <slot {colliders} {refresh} />
79
81
  </SceneGraphObject>
@@ -0,0 +1,80 @@
1
+ import type { CoefficientCombineRule, Collider } from '@dimforge/rapier3d-compat'
2
+ import { SvelteComponentTyped } from 'svelte'
3
+ import type { Euler, Vector3 } from 'three'
4
+ import type { AutoCollidersShapes, ColliderEventMap } from '../../types/types'
5
+
6
+ // ------------------ BASE ------------------
7
+
8
+ type BaseProps = {
9
+ shape?: AutoCollidersShapes
10
+ restitution?: number
11
+ restitutionCombineRule?: CoefficientCombineRule
12
+ friction?: number
13
+ frictionCombineRule?: CoefficientCombineRule
14
+ sensor?: boolean
15
+ colliders?: Collider[]
16
+ contactForceEventThreshold?: number
17
+ refresh?: () => void
18
+ }
19
+
20
+ // ------------------ MASS ------------------
21
+
22
+ type Density = {
23
+ density: number
24
+
25
+ mass?: never
26
+ centerOfMass?: never
27
+ principalAngularInertia?: never
28
+ angularInertiaLocalFrame?: never
29
+ }
30
+
31
+ type Mass = {
32
+ mass: number
33
+ density?: never
34
+ centerOfMass?: never
35
+ principalAngularInertia?: never
36
+ angularInertiaLocalFrame?: never
37
+ }
38
+
39
+ type MassProperties = {
40
+ mass: number
41
+ centerOfMass: Parameters<Vector3['set']>
42
+ principalAngularInertia: Parameters<Vector3['set']>
43
+ angularInertiaLocalFrame: Parameters<Euler['set']>
44
+ density?: never
45
+ }
46
+
47
+ type NoMassProperties = {
48
+ density?: never
49
+ mass?: never
50
+ centerOfMass?: never
51
+ principalAngularInertia?: never
52
+ angularInertiaLocalFrame?: never
53
+ }
54
+
55
+ export type MassDef = Density | Mass | MassProperties | NoMassProperties
56
+
57
+ type MassProps<TMassDef extends MassDef> = TMassDef extends Density
58
+ ? Density
59
+ : TMassDef extends MassProperties
60
+ ? MassProperties
61
+ : TMassDef extends Mass
62
+ ? Mass
63
+ : NoMassProperties
64
+
65
+ // ------------------ COLLIDER ------------------
66
+
67
+ export type AutoCollidersProps<TMassDef extends MassDef> = BaseProps & MassProps<TMassDef>
68
+
69
+ type AutoCollidersSlots = {
70
+ default: {
71
+ colliders: Collider[]
72
+ refresh: () => void
73
+ }
74
+ }
75
+
76
+ export default class AutoColliders<TMassDef extends MassDef> extends SvelteComponentTyped<
77
+ AutoCollidersProps<TMassDef>,
78
+ ColliderEventMap,
79
+ AutoCollidersSlots
80
+ > {}
@@ -1,23 +1,18 @@
1
- <script>import { ActiveCollisionTypes, ActiveEvents, CoefficientCombineRule, Collider, ColliderDesc } from '@dimforge/rapier3d-compat';
2
- import { SceneGraphObject, TransformableObject, useFrame } from '@threlte/core';
3
- import { createEventDispatcher, onDestroy, onMount, tick } from 'svelte';
1
+ <script>import { ActiveCollisionTypes, CoefficientCombineRule, Collider, ColliderDesc } from '@dimforge/rapier3d-compat';
2
+ import { createRawEventDispatcher, SceneGraphObject, useFrame } from '@threlte/core';
3
+ import { onDestroy, onMount, tick } from 'svelte';
4
4
  import { Object3D, Quaternion, Vector3 } from 'three';
5
5
  import { useCollisionGroups } from '../../hooks/useCollisionGroups';
6
6
  import { useHasEventListeners } from '../../hooks/useHasEventListener';
7
7
  import { useRapier } from '../../hooks/useRapier';
8
8
  import { useRigidBody } from '../../hooks/useRigidBody';
9
9
  import { applyColliderActiveEvents } from '../../lib/applyColliderActiveEvents';
10
- import { applyTransforms } from '../../lib/applyTransforms';
10
+ import { eulerToQuaternion } from '../../lib/eulerToQuaternion';
11
11
  import { getWorldPosition, getWorldQuaternion } from '../../lib/getWorldTransforms';
12
- import { positionToVector3 } from '../../lib/positionToVector3';
13
- import { rotationToQuaternion } from '../../lib/rotationToQuaternion';
14
12
  import { scaleColliderArgs } from '../../lib/scaleColliderArgs';
15
13
  export let shape;
16
14
  export let args;
17
- export let position = undefined;
18
- export let rotation = undefined;
19
- export let scale = undefined;
20
- export let lookAt = undefined;
15
+ export let type = undefined;
21
16
  export let restitution = undefined;
22
17
  export let restitutionCombineRule = undefined;
23
18
  export let friction = undefined;
@@ -26,20 +21,17 @@ export let sensor = undefined;
26
21
  export let contactForceEventThreshold = undefined;
27
22
  export let density = undefined;
28
23
  export let mass = undefined;
29
- export let massProperties = undefined;
24
+ export let centerOfMass = undefined;
25
+ export let principalAngularInertia = undefined;
26
+ export let angularInertiaLocalFrame = undefined;
30
27
  const object = new Object3D();
31
- /**
32
- * Immediately apply transforms
33
- */
34
- applyTransforms(object, position, rotation, scale, lookAt);
35
- object.updateWorldMatrix(true, false);
36
28
  const rigidBody = useRigidBody();
37
- const isAttached = !!rigidBody;
29
+ const hasRigidBodyParent = !!rigidBody;
38
30
  const rapierContext = useRapier();
39
31
  const { world } = rapierContext;
40
32
  export let collider = undefined;
41
33
  const collisionGroups = useCollisionGroups();
42
- const dispatcher = createEventDispatcher();
34
+ const dispatcher = createRawEventDispatcher();
43
35
  /**
44
36
  * Actual collider setup happens onMount as only then
45
37
  * the transforms are finished.
@@ -59,7 +51,7 @@ onMount(async () => {
59
51
  * For use in conjunction with component <CollisionGroups>
60
52
  */
61
53
  collisionGroups.registerColliders([collider]);
62
- if (isAttached) {
54
+ if (hasRigidBodyParent) {
63
55
  const rigidBodyWorldPos = new Vector3();
64
56
  const rigidBodyWorldQuatInversed = new Quaternion();
65
57
  object.traverseAncestors((child) => {
@@ -95,20 +87,41 @@ $: {
95
87
  collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
96
88
  if (density)
97
89
  collider.setDensity(density);
98
- if (mass)
99
- collider.setMass(mass);
100
- if (massProperties)
101
- collider.setMassProperties(massProperties.mass, positionToVector3(massProperties.centerOfMass), positionToVector3(massProperties.principalAngularInertia), rotationToQuaternion(massProperties.angularInertiaLocalFrame));
90
+ if (mass) {
91
+ if (centerOfMass && principalAngularInertia && angularInertiaLocalFrame) {
92
+ collider.setMassProperties(mass, { x: centerOfMass[0], y: centerOfMass[1], z: centerOfMass[2] }, {
93
+ x: principalAngularInertia[0],
94
+ y: principalAngularInertia[1],
95
+ z: principalAngularInertia[2]
96
+ }, eulerToQuaternion(angularInertiaLocalFrame));
97
+ }
98
+ else {
99
+ collider.setMass(mass);
100
+ }
101
+ }
102
102
  }
103
103
  }
104
- useFrame(() => {
104
+ export const refresh = () => {
105
105
  if (!collider)
106
106
  return;
107
107
  collider.setTranslation(getWorldPosition(object));
108
108
  collider.setRotation(getWorldQuaternion(object));
109
+ };
110
+ /**
111
+ * If the Collider isAttached (i.e. NOT child of a RigidBody), update the
112
+ * transforms on every frame.
113
+ */
114
+ const { start, stop } = useFrame(() => {
115
+ refresh();
109
116
  }, {
110
- autostart: !isAttached
117
+ autostart: !hasRigidBodyParent && type === 'dynamic'
111
118
  });
119
+ $: {
120
+ if (!hasRigidBodyParent && type === 'dynamic')
121
+ start();
122
+ else
123
+ stop();
124
+ }
112
125
  /**
113
126
  * Cleanup
114
127
  */
@@ -118,13 +131,10 @@ onDestroy(() => {
118
131
  rapierContext.removeColliderFromContext(collider);
119
132
  collisionGroups.removeColliders([collider]);
120
133
  world.removeCollider(collider, true);
134
+ collider = undefined;
121
135
  });
122
136
  </script>
123
137
 
124
138
  <SceneGraphObject {object}>
125
- <slot />
139
+ <slot {collider} />
126
140
  </SceneGraphObject>
127
-
128
- {#if !isAttached}
129
- <TransformableObject {object} {position} {rotation} {scale} />
130
- {/if}