@threlte/rapier 0.5.0 → 1.0.0-next.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.
Files changed (44) hide show
  1. package/dist/CHANGELOG.md +6 -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 +16 -10
  5. package/dist/components/Colliders/AutoColliders.svelte.d.ts +74 -0
  6. package/dist/components/Colliders/Collider.svelte +24 -15
  7. package/dist/components/Colliders/Collider.svelte.d.ts +105 -112
  8. package/dist/components/CollisionGroups/CollisionGroups.svelte.d.ts +29 -19
  9. package/dist/components/Debug/Debug.svelte +13 -10
  10. package/dist/components/Debug/Debug.svelte.d.ts +6 -60
  11. package/dist/components/RigidBody/RigidBody.svelte +14 -32
  12. package/dist/components/RigidBody/RigidBody.svelte.d.ts +93 -67
  13. package/dist/components/World/InnerWorld.svelte +9 -6
  14. package/dist/components/World/InnerWorld.svelte.d.ts +14 -15
  15. package/dist/components/World/World.svelte +6 -2
  16. package/dist/components/World/World.svelte.d.ts +35 -32
  17. package/dist/hooks/useFixedJoint.d.ts +2 -2
  18. package/dist/hooks/useFixedJoint.js +6 -3
  19. package/dist/hooks/usePrismaticJoint.d.ts +2 -2
  20. package/dist/hooks/usePrismaticJoint.js +5 -2
  21. package/dist/hooks/useRevoluteJoint.d.ts +2 -2
  22. package/dist/hooks/useRevoluteJoint.js +5 -2
  23. package/dist/hooks/useSphericalJoint.d.ts +2 -2
  24. package/dist/hooks/useSphericalJoint.js +4 -2
  25. package/dist/index.d.ts +1 -1
  26. package/dist/lib/applyTransforms.d.ts +2 -3
  27. package/dist/lib/applyTransforms.js +7 -16
  28. package/dist/lib/eulerToQuaternion.d.ts +7 -0
  29. package/dist/lib/eulerToQuaternion.js +12 -0
  30. package/dist/lib/scaleColliderArgs.js +2 -2
  31. package/dist/recipes/BasicPlayerController.svelte +12 -6
  32. package/dist/recipes/BasicPlayerController.svelte.d.ts +2 -2
  33. package/dist/types/components.d.ts +1 -88
  34. package/package.json +9 -8
  35. package/dist/components/Joints/RevoluteJoint.svelte +0 -5
  36. package/dist/components/Joints/RevoluteJoint.svelte.d.ts +0 -23
  37. package/dist/lib/positionToVector3.d.ts +0 -3
  38. package/dist/lib/positionToVector3.js +0 -8
  39. package/dist/lib/rotationToEuler.d.ts +0 -3
  40. package/dist/lib/rotationToEuler.js +0 -8
  41. package/dist/lib/rotationToQuaternion.d.ts +0 -3
  42. package/dist/lib/rotationToQuaternion.js +0 -10
  43. package/dist/lib/scaleToVector3.d.ts +0 -3
  44. package/dist/lib/scaleToVector3.js +0 -16
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @threlte/extras
2
2
 
3
+ ## 1.0.0-next.0
4
+
5
+ ### Major Changes
6
+
7
+ - d41cb6cf: Adapted rapier package to Threlte v6 syntax
8
+
3
9
  ## 0.5.0
4
10
 
5
11
  ### 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,4 +1,4 @@
1
- <script>import { ActiveCollisionTypes, ActiveEvents, CoefficientCombineRule } from '@dimforge/rapier3d-compat';
1
+ <script>import { ActiveCollisionTypes, CoefficientCombineRule } from '@dimforge/rapier3d-compat';
2
2
  import { SceneGraphObject } from '@threlte/core';
3
3
  import { createEventDispatcher, onDestroy, onMount } from 'svelte';
4
4
  import { Object3D } from 'three';
@@ -9,13 +9,11 @@ import { useRigidBody } from '../../hooks/useRigidBody';
9
9
  import { applyColliderActiveEvents } from '../../lib/applyColliderActiveEvents';
10
10
  import { applyTransforms } from '../../lib/applyTransforms';
11
11
  import { createCollidersFromChildren } from '../../lib/createCollidersFromChildren';
12
- import { positionToVector3 } from '../../lib/positionToVector3';
13
- import { rotationToQuaternion } from '../../lib/rotationToQuaternion';
12
+ import { eulerToQuaternion } from '../../lib/eulerToQuaternion';
14
13
  export let shape = 'convexHull';
15
14
  export let position = undefined;
16
15
  export let rotation = undefined;
17
16
  export let scale = undefined;
18
- export let lookAt = undefined;
19
17
  export let restitution = undefined;
20
18
  export let restitutionCombineRule = undefined;
21
19
  export let friction = undefined;
@@ -24,12 +22,14 @@ export let sensor = undefined;
24
22
  export let contactForceEventThreshold = undefined;
25
23
  export let density = undefined;
26
24
  export let mass = undefined;
27
- export let massProperties = undefined;
25
+ export let centerOfMass = undefined;
26
+ export let principalAngularInertia = undefined;
27
+ export let angularInertiaLocalFrame = undefined;
28
28
  const object = new Object3D();
29
29
  /**
30
30
  * Immediately apply transforms
31
31
  */
32
- applyTransforms(object, position, rotation, scale, lookAt);
32
+ applyTransforms(object, position, rotation, scale);
33
33
  object.updateWorldMatrix(true, false);
34
34
  const rigidBody = useRigidBody();
35
35
  const { world, addColliderToContext, removeColliderFromContext } = useRapier();
@@ -55,10 +55,16 @@ $: {
55
55
  collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
56
56
  if (density)
57
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));
58
+ if (mass) {
59
+ if (centerOfMass && principalAngularInertia && angularInertiaLocalFrame)
60
+ collider.setMassProperties(mass, { x: centerOfMass[0], y: centerOfMass[1], z: centerOfMass[2] }, {
61
+ x: principalAngularInertia[0],
62
+ y: principalAngularInertia[1],
63
+ z: principalAngularInertia[2]
64
+ }, eulerToQuaternion(angularInertiaLocalFrame));
65
+ else
66
+ collider.setMass(mass);
67
+ }
62
68
  });
63
69
  }
64
70
  }
@@ -0,0 +1,74 @@
1
+ import type { CoefficientCombineRule, Collider } from '@dimforge/rapier3d-compat'
2
+ import type { Position, Rotation } from '@threlte/core'
3
+ import { SvelteComponentTyped } from 'svelte'
4
+ import type { Euler, Vector3 } from 'three'
5
+ import type { AutoCollidersShapes } from '../../types/types'
6
+
7
+ // ------------------ BASE ------------------
8
+
9
+ type BaseProps = {
10
+ shape?: AutoCollidersShapes
11
+ position?: Parameters<Vector3['set']>
12
+ rotation?: Parameters<Euler['set']>
13
+ scale?: Parameters<Vector3['set']>
14
+ restitution?: number
15
+ restitutionCombineRule?: CoefficientCombineRule
16
+ friction?: number
17
+ frictionCombineRule?: CoefficientCombineRule
18
+ sensor?: boolean
19
+ colliders?: Collider[]
20
+ contactForceEventThreshold?: number
21
+ }
22
+
23
+ // ------------------ MASS ------------------
24
+
25
+ type Density = {
26
+ density: number
27
+
28
+ mass?: never
29
+ centerOfMass?: never
30
+ principalAngularInertia?: never
31
+ angularInertiaLocalFrame?: never
32
+ }
33
+ type Mass = {
34
+ mass: number
35
+
36
+ density?: never
37
+ centerOfMass?: never
38
+ principalAngularInertia?: never
39
+ angularInertiaLocalFrame?: never
40
+ }
41
+ type MassProperties = {
42
+ mass: number
43
+ centerOfMass: Parameters<Vector3['set']>
44
+ principalAngularInertia: Parameters<Vector3['set']>
45
+ angularInertiaLocalFrame: Parameters<Euler['set']>
46
+
47
+ density?: never
48
+ }
49
+
50
+ type NoMassProperties = {
51
+ density?: never
52
+ mass?: never
53
+ centerOfMass?: never
54
+ principalAngularInertia?: never
55
+ angularInertiaLocalFrame?: never
56
+ }
57
+
58
+ export type MassDef = Density | Mass | MassProperties | NoMassProperties
59
+
60
+ type MassProps<TMassDef extends MassDef> = TMassDef extends Density
61
+ ? Density
62
+ : TMassDef extends MassProperties
63
+ ? MassProperties
64
+ : TMassDef extends Mass
65
+ ? Mass
66
+ : NoMassProperties
67
+
68
+ // ------------------ COLLIDER ------------------
69
+
70
+ export type AutoCollidersProps<TMassDef extends MassDef> = BaseProps & MassProps<TMassDef>
71
+
72
+ export default class AutoColliders<TMassDef extends MassDef> extends SvelteComponentTyped<
73
+ AutoCollidersProps<TMassDef>
74
+ > {}
@@ -1,5 +1,5 @@
1
- <script>import { ActiveCollisionTypes, ActiveEvents, CoefficientCombineRule, Collider, ColliderDesc } from '@dimforge/rapier3d-compat';
2
- import { SceneGraphObject, TransformableObject, useFrame } from '@threlte/core';
1
+ <script>import { ActiveCollisionTypes, CoefficientCombineRule, Collider, ColliderDesc } from '@dimforge/rapier3d-compat';
2
+ import { SceneGraphObject, useFrame } from '@threlte/core';
3
3
  import { createEventDispatcher, onDestroy, onMount, tick } from 'svelte';
4
4
  import { Object3D, Quaternion, Vector3 } from 'three';
5
5
  import { useCollisionGroups } from '../../hooks/useCollisionGroups';
@@ -8,16 +8,14 @@ import { useRapier } from '../../hooks/useRapier';
8
8
  import { useRigidBody } from '../../hooks/useRigidBody';
9
9
  import { applyColliderActiveEvents } from '../../lib/applyColliderActiveEvents';
10
10
  import { applyTransforms } from '../../lib/applyTransforms';
11
+ import { eulerToQuaternion } from '../../lib/eulerToQuaternion';
11
12
  import { getWorldPosition, getWorldQuaternion } from '../../lib/getWorldTransforms';
12
- import { positionToVector3 } from '../../lib/positionToVector3';
13
- import { rotationToQuaternion } from '../../lib/rotationToQuaternion';
14
13
  import { scaleColliderArgs } from '../../lib/scaleColliderArgs';
15
14
  export let shape;
16
15
  export let args;
17
16
  export let position = undefined;
18
17
  export let rotation = undefined;
19
18
  export let scale = undefined;
20
- export let lookAt = undefined;
21
19
  export let restitution = undefined;
22
20
  export let restitutionCombineRule = undefined;
23
21
  export let friction = undefined;
@@ -26,12 +24,14 @@ export let sensor = undefined;
26
24
  export let contactForceEventThreshold = undefined;
27
25
  export let density = undefined;
28
26
  export let mass = undefined;
29
- export let massProperties = undefined;
27
+ export let centerOfMass = undefined;
28
+ export let principalAngularInertia = undefined;
29
+ export let angularInertiaLocalFrame = undefined;
30
30
  const object = new Object3D();
31
31
  /**
32
32
  * Immediately apply transforms
33
33
  */
34
- applyTransforms(object, position, rotation, scale, lookAt);
34
+ applyTransforms(object, position, rotation, scale);
35
35
  object.updateWorldMatrix(true, false);
36
36
  const rigidBody = useRigidBody();
37
37
  const isAttached = !!rigidBody;
@@ -95,15 +95,28 @@ $: {
95
95
  collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
96
96
  if (density)
97
97
  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));
98
+ if (mass) {
99
+ if (centerOfMass && principalAngularInertia && angularInertiaLocalFrame) {
100
+ collider.setMassProperties(mass, { x: centerOfMass[0], y: centerOfMass[1], z: centerOfMass[2] }, {
101
+ x: principalAngularInertia[0],
102
+ y: principalAngularInertia[1],
103
+ z: principalAngularInertia[2]
104
+ }, eulerToQuaternion(angularInertiaLocalFrame));
105
+ }
106
+ else {
107
+ collider.setMass(mass);
108
+ }
109
+ }
102
110
  }
103
111
  }
112
+ /**
113
+ * If the Collider isAttached (i.e. NOT child of a RigidBody), update the
114
+ * transforms on every frame.
115
+ */
104
116
  useFrame(() => {
105
117
  if (!collider)
106
118
  return;
119
+ applyTransforms(object, position, rotation, scale);
107
120
  collider.setTranslation(getWorldPosition(object));
108
121
  collider.setRotation(getWorldQuaternion(object));
109
122
  }, {
@@ -124,7 +137,3 @@ onDestroy(() => {
124
137
  <SceneGraphObject {object}>
125
138
  <slot />
126
139
  </SceneGraphObject>
127
-
128
- {#if !isAttached}
129
- <TransformableObject {object} {position} {rotation} {scale} />
130
- {/if}
@@ -1,114 +1,107 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- import { CoefficientCombineRule, Collider, ColliderDesc, type RigidBody } from '@dimforge/rapier3d-compat';
3
- import { type Position, type Rotation } from '@threlte/core';
4
- declare class __sveltets_Render<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
5
- mass: number;
6
- centerOfMass: Position;
7
- principalAngularInertia: Position;
8
- angularInertiaLocalFrame: Rotation;
9
- } : undefined : undefined> {
10
- props(): {
11
- shape: Shape;
12
- args: Args;
13
- position?: Position | undefined;
14
- rotation?: Rotation | undefined;
15
- scale?: import("@threlte/core").Scale | undefined;
16
- lookAt?: import("@threlte/core").LookAt | undefined;
17
- restitution?: number | undefined;
18
- restitutionCombineRule?: CoefficientCombineRule | undefined;
19
- friction?: number | undefined;
20
- frictionCombineRule?: CoefficientCombineRule | undefined;
21
- sensor?: boolean | undefined;
22
- collider?: Collider | undefined;
23
- contactForceEventThreshold?: number | undefined;
24
- density?: Density | undefined;
25
- } | {
26
- shape: Shape;
27
- args: Args;
28
- position?: Position | undefined;
29
- rotation?: Rotation | undefined;
30
- scale?: import("@threlte/core").Scale | undefined;
31
- lookAt?: import("@threlte/core").LookAt | undefined;
32
- restitution?: number | undefined;
33
- restitutionCombineRule?: CoefficientCombineRule | undefined;
34
- friction?: number | undefined;
35
- frictionCombineRule?: CoefficientCombineRule | undefined;
36
- sensor?: boolean | undefined;
37
- collider?: Collider | undefined;
38
- contactForceEventThreshold?: number | undefined;
39
- mass?: Mass | undefined;
40
- } | {
41
- shape: Shape;
42
- args: Args;
43
- position?: Position | undefined;
44
- rotation?: Rotation | undefined;
45
- scale?: import("@threlte/core").Scale | undefined;
46
- lookAt?: import("@threlte/core").LookAt | undefined;
47
- restitution?: number | undefined;
48
- restitutionCombineRule?: CoefficientCombineRule | undefined;
49
- friction?: number | undefined;
50
- frictionCombineRule?: CoefficientCombineRule | undefined;
51
- sensor?: boolean | undefined;
52
- collider?: Collider | undefined;
53
- contactForceEventThreshold?: number | undefined;
54
- mass?: Mass | undefined;
55
- massProperties?: MassProperties | undefined;
56
- };
57
- events(): {
58
- collisionenter: CustomEvent<{
59
- targetCollider: Collider;
60
- targetRigidBody: RigidBody | null;
61
- manifold: import("@dimforge/rapier3d-compat").TempContactManifold;
62
- flipped: boolean;
63
- }>;
64
- collisionexit: CustomEvent<{
65
- targetCollider: Collider;
66
- targetRigidBody: RigidBody | null;
67
- }>;
68
- sensorenter: CustomEvent<{
69
- targetCollider: Collider;
70
- targetRigidBody: RigidBody | null;
71
- }>;
72
- sensorexit: CustomEvent<{
73
- targetCollider: Collider;
74
- targetRigidBody: RigidBody | null;
75
- }>;
76
- contact: CustomEvent<{
77
- targetCollider: Collider;
78
- targetRigidBody: RigidBody | null;
79
- maxForceDirection: import("@dimforge/rapier3d-compat").Vector;
80
- maxForceMagnitude: number;
81
- totalForce: import("@dimforge/rapier3d-compat").Vector;
82
- totalForceMagnitude: number;
83
- }>;
84
- };
85
- slots(): {
86
- default: {};
87
- };
1
+ import type {
2
+ CoefficientCombineRule,
3
+ Collider as rapierCollider,
4
+ ColliderDesc
5
+ } from '@dimforge/rapier3d-compat'
6
+ import { SvelteComponentTyped } from 'svelte'
7
+ import type { Euler, Vector3 } from 'three'
8
+
9
+ // ------------------ BASE ------------------
10
+
11
+ type BaseProps = {
12
+ position?: Parameters<Vector3['set']>
13
+ rotation?: Parameters<Euler['set']>
14
+ scale?: Parameters<Vector3['set']>
15
+ restitution?: number
16
+ restitutionCombineRule?: CoefficientCombineRule
17
+ friction?: number
18
+ frictionCombineRule?: CoefficientCombineRule
19
+ sensor?: boolean
20
+ collider?: rapierCollider
21
+ contactForceEventThreshold?: number
88
22
  }
89
- export declare type ColliderProps<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
90
- mass: number;
91
- centerOfMass: Position;
92
- principalAngularInertia: Position;
93
- angularInertiaLocalFrame: Rotation;
94
- } : undefined : undefined> = ReturnType<__sveltets_Render<Shape, Args, Density, Mass, MassProperties>['props']>;
95
- export declare type ColliderEvents<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
96
- mass: number;
97
- centerOfMass: Position;
98
- principalAngularInertia: Position;
99
- angularInertiaLocalFrame: Rotation;
100
- } : undefined : undefined> = ReturnType<__sveltets_Render<Shape, Args, Density, Mass, MassProperties>['events']>;
101
- export declare type ColliderSlots<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
102
- mass: number;
103
- centerOfMass: Position;
104
- principalAngularInertia: Position;
105
- angularInertiaLocalFrame: Rotation;
106
- } : undefined : undefined> = ReturnType<__sveltets_Render<Shape, Args, Density, Mass, MassProperties>['slots']>;
107
- export default class Collider<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
108
- mass: number;
109
- centerOfMass: Position;
110
- principalAngularInertia: Position;
111
- angularInertiaLocalFrame: Rotation;
112
- } : undefined : undefined> extends SvelteComponentTyped<ColliderProps<Shape, Args, Density, Mass, MassProperties>, ColliderEvents<Shape, Args, Density, Mass, MassProperties>, ColliderSlots<Shape, Args, Density, Mass, MassProperties>> {
23
+
24
+ // ------------------ SHAPE ------------------
25
+
26
+ export type Shape =
27
+ | 'ball'
28
+ | 'capsule'
29
+ | 'segment'
30
+ | 'triangle'
31
+ | 'roundTriangle'
32
+ | 'polyline'
33
+ | 'trimesh'
34
+ | 'cuboid'
35
+ | 'roundCuboid'
36
+ | 'heightfield'
37
+ | 'cylinder'
38
+ | 'roundCylinder'
39
+ | 'cone'
40
+ | 'roundCone'
41
+ | 'convexHull'
42
+ | 'convexMesh'
43
+ | 'roundConvexHull'
44
+ | 'roundConvexMesh'
45
+
46
+ type Args<TShape extends Shape> = Parameters<typeof ColliderDesc[TShape]>
47
+
48
+ type ShapeProps<TShape extends Shape> = {
49
+ shape: TShape
50
+ args: Args<TShape>
113
51
  }
114
- export {};
52
+
53
+ // ------------------ MASS ------------------
54
+
55
+ type Density = {
56
+ density: number
57
+
58
+ mass?: never
59
+ centerOfMass?: never
60
+ principalAngularInertia?: never
61
+ angularInertiaLocalFrame?: never
62
+ }
63
+ type Mass = {
64
+ mass: number
65
+
66
+ density?: never
67
+ centerOfMass?: never
68
+ principalAngularInertia?: never
69
+ angularInertiaLocalFrame?: never
70
+ }
71
+ type MassProperties = {
72
+ mass: number
73
+ centerOfMass: Parameters<Vector3['set']>
74
+ principalAngularInertia: Parameters<Vector3['set']>
75
+ angularInertiaLocalFrame: Parameters<Euler['set']>
76
+
77
+ density?: never
78
+ }
79
+
80
+ type NoMassProperties = {
81
+ density?: never
82
+ mass?: never
83
+ centerOfMass?: never
84
+ principalAngularInertia?: never
85
+ angularInertiaLocalFrame?: never
86
+ }
87
+
88
+ export type MassDef = Density | Mass | MassProperties | NoMassProperties
89
+
90
+ type MassProps<TMassDef extends MassDef> = TMassDef extends Density
91
+ ? Density
92
+ : TMassDef extends MassProperties
93
+ ? MassProperties
94
+ : TMassDef extends Mass
95
+ ? Mass
96
+ : NoMassProperties
97
+
98
+ // ------------------ COLLIDER ------------------
99
+
100
+ export type ColliderProps<TShape extends Shape, TMassDef extends MassDef> = BaseProps &
101
+ ShapeProps<TShape> &
102
+ MassProps<TMassDef>
103
+
104
+ export default class Collider<
105
+ TShape extends Shape,
106
+ TMassDef extends MassDef
107
+ > extends SvelteComponentTyped<ColliderProps<TShape, TMassDef>> {}
@@ -1,21 +1,31 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare class __sveltets_Render<Groups extends (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[] | undefined, MembershipsAndFilter extends Groups extends undefined ? (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[] : undefined> {
3
- props(): {
4
- groups: Groups;
5
- } | {
6
- filter: MembershipsAndFilter;
7
- memberships: MembershipsAndFilter;
8
- };
9
- events(): {} & {
10
- [evt: string]: CustomEvent<any>;
11
- };
12
- slots(): {
13
- default: {};
14
- };
1
+ import { SvelteComponentTyped } from 'svelte'
2
+
3
+ type N = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15
4
+
5
+ export type Groups = N[]
6
+
7
+ export type MembershipsAndFilter = N[]
8
+
9
+ type GroupsProps = {
10
+ groups: N[]
11
+
12
+ filter?: never
13
+ memberships?: never
15
14
  }
16
- export declare type CollisionGroupsProps<Groups extends (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[] | undefined, MembershipsAndFilter extends Groups extends undefined ? (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[] : undefined> = ReturnType<__sveltets_Render<Groups, MembershipsAndFilter>['props']>;
17
- export declare type CollisionGroupsEvents<Groups extends (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[] | undefined, MembershipsAndFilter extends Groups extends undefined ? (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[] : undefined> = ReturnType<__sveltets_Render<Groups, MembershipsAndFilter>['events']>;
18
- export declare type CollisionGroupsSlots<Groups extends (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[] | undefined, MembershipsAndFilter extends Groups extends undefined ? (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[] : undefined> = ReturnType<__sveltets_Render<Groups, MembershipsAndFilter>['slots']>;
19
- export default class CollisionGroups<Groups extends (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[] | undefined, MembershipsAndFilter extends Groups extends undefined ? (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[] : undefined> extends SvelteComponentTyped<CollisionGroupsProps<Groups, MembershipsAndFilter>, CollisionGroupsEvents<Groups, MembershipsAndFilter>, CollisionGroupsSlots<Groups, MembershipsAndFilter>> {
15
+
16
+ type MembershipsAndFilterProps = {
17
+ filter: N[]
18
+ memberships: N[]
19
+
20
+ groups?: never
20
21
  }
21
- export {};
22
+
23
+ type GroupsDef = GroupsProps | MembershipsAndFilterProps
24
+
25
+ export type CollisionGroupsProps<TGroupsDef extends GroupsDef> = TGroupsDef extends GroupsProps
26
+ ? GroupsProps
27
+ : MembershipsAndFilterProps
28
+
29
+ export default class CollisionGroups<TGroupsDef extends GroupsDef> extends SvelteComponentTyped<
30
+ CollisionGroupsProps<TGroupsDef>
31
+ > {}
@@ -1,12 +1,7 @@
1
- <script>import { LineSegments, useFrame } from '@threlte/core';
2
- import { onDestroy, } from 'svelte';
3
- import { BufferAttribute, BufferGeometry, LineBasicMaterial } from 'three';
1
+ <script>import { T, useFrame } from '@threlte/core';
2
+ import { onDestroy } from 'svelte';
3
+ import { BufferAttribute, BufferGeometry } from 'three';
4
4
  import { useRapier } from '../../hooks/useRapier';
5
- export let vertexColors = true;
6
- const material = new LineBasicMaterial({
7
- vertexColors,
8
- ...$$props
9
- });
10
5
  const { world, debug } = useRapier();
11
6
  const buffers = world.debugRender();
12
7
  const vertices = new BufferAttribute(buffers.vertices, 3);
@@ -24,9 +19,17 @@ useFrame(() => {
24
19
  });
25
20
  onDestroy(() => {
26
21
  geometry.dispose();
27
- material.dispose();
28
22
  debug.set(false);
29
23
  });
30
24
  </script>
31
25
 
32
- <LineSegments renderOrder={Infinity} {geometry} {material} />
26
+ <T.LineSegments renderOrder={Infinity}>
27
+ <T
28
+ is={geometry}
29
+ attach="geometry"
30
+ />
31
+ <T.LineBasicMaterial
32
+ vertexColors
33
+ {...$$restProps}
34
+ />
35
+ </T.LineSegments>