@threlte/rapier 3.0.0-next.1 → 3.0.0-next.10

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 (43) hide show
  1. package/dist/components/Attractor/Attractor.svelte +2 -2
  2. package/dist/components/Attractor/Attractor.svelte.d.ts +2 -10
  3. package/dist/components/Colliders/AutoColliders.svelte +23 -13
  4. package/dist/components/Colliders/AutoColliders.svelte.d.ts +16 -12
  5. package/dist/components/Colliders/Collider.svelte +23 -10
  6. package/dist/components/Colliders/Collider.svelte.d.ts +6 -9
  7. package/dist/components/CollisionGroups/CollisionGroups.svelte +2 -2
  8. package/dist/components/CollisionGroups/CollisionGroups.svelte.d.ts +5 -1
  9. package/dist/components/RigidBody/RigidBody.svelte +39 -9
  10. package/dist/components/RigidBody/RigidBody.svelte.d.ts +5 -15
  11. package/dist/components/RigidBody/overrideTeleportMethods.d.ts +14 -0
  12. package/dist/components/RigidBody/overrideTeleportMethods.js +31 -0
  13. package/dist/components/World/InnerWorld.svelte +27 -5
  14. package/dist/components/World/InnerWorld.svelte.d.ts +2 -8
  15. package/dist/components/World/World.svelte +9 -57
  16. package/dist/components/World/World.svelte.d.ts +13 -2
  17. package/dist/lib/applyColliderActiveEvents.d.ts +2 -1
  18. package/dist/lib/applyColliderActiveEvents.js +9 -9
  19. package/dist/lib/createPhysicsStages.d.ts +15 -0
  20. package/dist/lib/createPhysicsStages.js +43 -0
  21. package/dist/lib/createPhysicsTasks.d.ts +19 -0
  22. package/dist/{hooks/useFrameHandler.js → lib/createPhysicsTasks.js} +132 -65
  23. package/dist/lib/createRapierContext.d.ts +14 -20
  24. package/dist/lib/createRapierContext.js +37 -13
  25. package/dist/lib/initRapier.svelte.d.ts +1 -0
  26. package/dist/lib/initRapier.svelte.js +16 -0
  27. package/dist/lib/keys.d.ts +2 -0
  28. package/dist/lib/keys.js +2 -0
  29. package/dist/lib/rigidBodyObjectContext.d.ts +3 -2
  30. package/dist/lib/useCreateEvent.d.ts +2 -1
  31. package/dist/lib/useCreateEvent.js +3 -3
  32. package/dist/recipes/BasicPlayerController.svelte +6 -5
  33. package/dist/recipes/BasicPlayerController.svelte.d.ts +3 -3
  34. package/dist/types/types.d.ts +55 -28
  35. package/package.json +28 -9
  36. package/dist/hooks/useFixedJoint.d.ts +0 -8
  37. package/dist/hooks/useFrameHandler.d.ts +0 -3
  38. package/dist/hooks/useHasEventListener.d.ts +0 -3
  39. package/dist/hooks/useHasEventListener.js +0 -11
  40. package/dist/hooks/useJoint.d.ts +0 -8
  41. package/dist/hooks/usePrismaticJoint.d.ts +0 -8
  42. package/dist/hooks/useRevoluteJoint.d.ts +0 -8
  43. package/dist/hooks/useSphericalJoint.d.ts +0 -8
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { createRawEventDispatcher, T, useTask } from '@threlte/core';
1
+ <script lang="ts">import { T, useTask } from '@threlte/core';
2
2
  import { Vector2, Vector3 } from 'three';
3
3
  import Collider from '../components/Colliders/Collider.svelte';
4
4
  import CollisionGroups from '../components/CollisionGroups/CollisionGroups.svelte';
@@ -10,6 +10,8 @@ export let speed = 1;
10
10
  export let jumpStrength = 3;
11
11
  export let playerCollisionGroups = [0];
12
12
  export let groundCollisionGroups = [15];
13
+ export let ongroundenter = undefined;
14
+ export let ongroundexit = undefined;
13
15
  let rigidBody;
14
16
  const keys = {
15
17
  up: false,
@@ -19,7 +21,6 @@ const keys = {
19
21
  };
20
22
  const t = new Vector3();
21
23
  const t2 = new Vector2();
22
- const dispatch = createRawEventDispatcher();
23
24
  let grounded = false;
24
25
  let groundsSensored = 0;
25
26
  $: {
@@ -28,7 +29,7 @@ $: {
28
29
  else
29
30
  grounded = true;
30
31
  }
31
- $: grounded ? dispatch('groundenter') : dispatch('groundexit');
32
+ $: grounded ? ongroundenter?.() : ongroundexit?.();
32
33
  const { start } = useTask(() => {
33
34
  t.set(0, 0, 0);
34
35
  if (keys.down)
@@ -126,8 +127,8 @@ const onKeyUp = (e) => {
126
127
  <T.Group position={[0, -height / 2 + radius, 0]}>
127
128
  <Collider
128
129
  sensor
129
- on:sensorenter={() => (groundsSensored += 1)}
130
- on:sensorexit={() => (groundsSensored -= 1)}
130
+ onsensorenter={() => (groundsSensored += 1)}
131
+ onsensorexit={() => (groundsSensored -= 1)}
131
132
  shape={'ball'}
132
133
  args={[radius * 1.2]}
133
134
  />
@@ -10,9 +10,9 @@ declare const __propDef: {
10
10
  jumpStrength?: number | undefined;
11
11
  playerCollisionGroups?: CollisionGroupsBitMask | undefined;
12
12
  groundCollisionGroups?: CollisionGroupsBitMask | undefined;
13
- children?: ((this: void) => typeof import("svelte").SnippetReturn & {
14
- _: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
15
- }) | undefined;
13
+ ongroundenter?: (() => void) | undefined;
14
+ ongroundexit?: (() => void) | undefined;
15
+ children?: import("svelte").Snippet<[]> | undefined;
16
16
  };
17
17
  events: {
18
18
  [evt: string]: CustomEvent<any>;
@@ -1,56 +1,55 @@
1
1
  /// <reference types="svelte" />
2
- import type { Collider, ColliderHandle, RigidBody, RigidBodyHandle, TempContactManifold, Vector } from '@dimforge/rapier3d-compat';
3
- import type { Writable } from 'svelte/store';
4
- import type { createRapierContext } from '../lib/createRapierContext';
2
+ import { World, type Collider, type RigidBody, type TempContactManifold, type Vector } from '@dimforge/rapier3d-compat';
3
+ import RAPIER from '@dimforge/rapier3d-compat';
4
+ import type { CurrentWritable, Stage, Task } from '@threlte/core';
5
+ import type { Readable, Writable } from 'svelte/store';
6
+ import type { Object3D } from 'three';
5
7
  export type ColliderShapes = 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh';
6
8
  export type AutoCollidersShapes = 'cuboid' | 'ball' | 'trimesh' | 'convexHull' | 'capsule';
7
- export type ColliderEventMap = {
8
- create: {
9
+ export type ColliderEvents = {
10
+ oncreate?: (event: {
9
11
  ref: Collider;
10
12
  cleanup: (callback: () => void) => void;
11
- };
12
- collisionenter: {
13
+ }) => void;
14
+ oncollisionenter?: (event: {
13
15
  targetCollider: Collider;
14
16
  targetRigidBody: RigidBody | null;
15
17
  manifold: TempContactManifold;
16
18
  flipped: boolean;
17
- };
18
- collisionexit: {
19
+ }) => void;
20
+ oncollisionexit?: (event: {
19
21
  targetCollider: Collider;
20
22
  targetRigidBody: RigidBody | null;
21
- };
22
- sensorenter: {
23
+ }) => void;
24
+ onsensorenter?: (event: {
23
25
  targetCollider: Collider;
24
26
  targetRigidBody: RigidBody | null;
25
- };
26
- sensorexit: {
27
+ }) => void;
28
+ onsensorexit?: (event: {
27
29
  targetCollider: Collider;
28
30
  targetRigidBody: RigidBody | null;
29
- };
30
- contact: {
31
+ }) => void;
32
+ oncontact?: (event: {
31
33
  targetCollider: Collider;
32
34
  targetRigidBody: RigidBody | null;
33
35
  maxForceDirection: Vector;
34
36
  maxForceMagnitude: number;
35
37
  totalForce: Vector;
36
38
  totalForceMagnitude: number;
37
- };
39
+ }) => void;
38
40
  };
39
- export type CollisionEnterEvent = ColliderEventMap['collisionenter'];
40
- export type CollisionExitEvent = ColliderEventMap['collisionexit'];
41
- export type SensorEnterEvent = ColliderEventMap['sensorenter'];
42
- export type SensorExitEvent = ColliderEventMap['sensorexit'];
43
- export type ContactEvent = ColliderEventMap['contact'];
44
- export type RigidBodyEventMap = ColliderEventMap & {
45
- sleep: void;
46
- wake: void;
41
+ export type CollisionEnterEvent = ColliderEvents['oncollisionenter'];
42
+ export type CollisionExitEvent = ColliderEvents['oncollisionexit'];
43
+ export type SensorEnterEvent = ColliderEvents['onsensorenter'];
44
+ export type SensorExitEvent = ColliderEvents['onsensorexit'];
45
+ export type ContactEvent = ColliderEvents['oncontact'];
46
+ export type RigidBodyEvents = ColliderEvents & {
47
+ onsleep?: () => void;
48
+ onwake?: () => void;
47
49
  };
48
- export type RigidBodyEventDispatchers = Map<RigidBodyHandle, Record<string, (arg: unknown) => void>>;
49
- export type ColliderEventDispatchers = Map<ColliderHandle, Record<string, (arg: unknown) => void>>;
50
- export type RapierContext = ReturnType<typeof createRapierContext>;
51
50
  export type CollisionGroupsContext = Writable<number> | undefined;
52
51
  export type RigidBodyUserData = {
53
- events?: Record<string, (arg: unknown) => void>;
52
+ events?: RigidBodyEvents;
54
53
  };
55
54
  export type ThrelteRigidBody = RigidBody & {
56
55
  userData?: RigidBodyUserData;
@@ -61,3 +60,31 @@ export type CollisionGroupsBitMask = (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
61
60
  * Used in the <Attractor> component
62
61
  */
63
62
  export type GravityType = 'static' | 'linear' | 'newtonian';
63
+ export type Framerate = number | 'varying';
64
+ export type RapierContext = {
65
+ rapier: typeof RAPIER;
66
+ world: World;
67
+ colliderObjects: Map<number, Object3D>;
68
+ rigidBodyObjects: Map<number, Object3D>;
69
+ rigidBodyEventDispatchers: Map<number, RigidBodyEvents>;
70
+ colliderEventDispatchers: Map<number, ColliderEvents>;
71
+ addColliderToContext: (collider: Collider, object: Object3D, props: ColliderEvents) => void;
72
+ removeColliderFromContext: (collider: Collider) => void;
73
+ addRigidBodyToContext: (rigidBody: RigidBody, object: Object3D, events: RigidBodyEvents) => void;
74
+ removeRigidBodyFromContext: (rigidBody: RigidBody) => void;
75
+ debug: Writable<boolean>;
76
+ pause: () => void;
77
+ resume: () => void;
78
+ paused: Readable<boolean>;
79
+ framerate: CurrentWritable<Framerate>;
80
+ simulationStage: Stage;
81
+ simulationTask: Task;
82
+ synchronizationStage: Stage;
83
+ synchronizationTask: Task;
84
+ /**
85
+ * This number tells us how far we're off in the simulation stage as opposed
86
+ * to the render stage
87
+ */
88
+ simulationOffset: CurrentWritable<number>;
89
+ updateRigidBodySimulationData: CurrentWritable<boolean>;
90
+ };
package/package.json CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "@threlte/rapier",
3
- "version": "3.0.0-next.1",
3
+ "version": "3.0.0-next.10",
4
4
  "author": "Grischa Erbe <hello@legrisch.com> (https://legrisch.com)",
5
5
  "license": "MIT",
6
+ "description": "Components and hooks to use the Rapier physics engine in Threlte",
6
7
  "devDependencies": {
7
- "@dimforge/rapier3d-compat": "^0.12.0",
8
+ "@dimforge/rapier3d-compat": "^0.14.0",
8
9
  "@sveltejs/adapter-auto": "^3.2.0",
9
10
  "@sveltejs/kit": "^2.5.5",
10
11
  "@sveltejs/package": "^2.3.1",
11
12
  "@sveltejs/vite-plugin-svelte": "^3.1.0",
12
13
  "@types/node": "^20.12.7",
13
- "@types/three": "^0.163.0",
14
+ "@types/three": "^0.166.0",
14
15
  "@typescript-eslint/eslint-plugin": "^7.6.0",
15
16
  "@typescript-eslint/parser": "^7.6.0",
16
17
  "@yushijinhun/three-minifier-rollup": "^0.4.0",
@@ -21,23 +22,41 @@
21
22
  "prettier-plugin-svelte": "^3.2.2",
22
23
  "publint": "^0.2.7",
23
24
  "rimraf": "^5.0.5",
24
- "svelte": "5.0.0-next.97",
25
+ "svelte": "5.0.0-next.181",
25
26
  "svelte-check": "^3.6.9",
26
27
  "svelte-preprocess": "^5.1.3",
27
28
  "svelte2tsx": "^0.7.6",
28
- "three": "^0.163.0",
29
+ "three": "^0.166.1",
29
30
  "tslib": "^2.6.2",
30
31
  "type-fest": "^4.15.0",
31
32
  "typescript": "^5.4.5",
32
33
  "vite": "^5.2.8",
33
- "@threlte/core": "8.0.0-next.2"
34
+ "@threlte/core": "8.0.0-next.17"
34
35
  },
35
36
  "peerDependencies": {
36
- "@dimforge/rapier3d-compat": ">=0.12",
37
+ "@dimforge/rapier3d-compat": ">=0.14",
37
38
  "svelte": ">=5",
38
39
  "three": ">=0.152"
39
40
  },
40
41
  "type": "module",
42
+ "keywords": [
43
+ "threlte",
44
+ "rapier",
45
+ "svelte",
46
+ "three",
47
+ "three.js",
48
+ "3d",
49
+ "physics"
50
+ ],
51
+ "homepage": "https://threlte.xyz",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "https://github.com/threlte/threlte.git",
55
+ "directory": "packages/rapier"
56
+ },
57
+ "bugs": {
58
+ "url": "https://github.com/threlte/threlte/issues"
59
+ },
41
60
  "exports": {
42
61
  ".": {
43
62
  "types": "./dist/index.d.ts",
@@ -54,8 +73,8 @@
54
73
  "package": "svelte-kit sync && svelte-package && node ./scripts/cleanupPackage.js && publint",
55
74
  "check": "svelte-check --tsconfig ./tsconfig.json",
56
75
  "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch",
57
- "lint": "prettier --check --plugin-search-dir=. . && eslint .",
58
- "format": "prettier --write --plugin-search-dir=. .",
76
+ "lint": "prettier --check .",
77
+ "format": "prettier --write .",
59
78
  "cleanup": "rimraf node_modules .svelte-kit dist"
60
79
  }
61
80
  }
@@ -1,8 +0,0 @@
1
- /// <reference types="svelte" />
2
- import type { FixedImpulseJoint } from '@dimforge/rapier3d-compat';
3
- import { Euler } from 'three';
4
- export declare const useFixedJoint: (anchorA: [x: number, y: number, z: number], frameA: Parameters<Euler['set']> | Euler, anchorB: [x: number, y: number, z: number], frameB: Parameters<Euler['set']> | Euler) => {
5
- joint: import("svelte/store").Writable<FixedImpulseJoint>;
6
- rigidBodyA: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
7
- rigidBodyB: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
8
- };
@@ -1,3 +0,0 @@
1
- import { type Stage, type Key } from '@threlte/core';
2
- import type { RapierContext } from '../types/types';
3
- export declare const useFrameHandler: (ctx: RapierContext, stage?: Stage | Key) => void;
@@ -1,3 +0,0 @@
1
- export declare const useHasEventListeners: <T extends (type: any) => any = any>() => {
2
- hasEventListeners: (type: Parameters<T>[0]) => boolean;
3
- };
@@ -1,11 +0,0 @@
1
- export const useHasEventListeners = () => {
2
- // const component = get_current_component()
3
- const hasEventListeners = (type) => {
4
- // const callbacks = component.$$.callbacks
5
- return true;
6
- // return type in callbacks && (callbacks[type] as any[]).length > 0
7
- };
8
- return {
9
- hasEventListeners
10
- };
11
- };
@@ -1,8 +0,0 @@
1
- /// <reference types="svelte" />
2
- import { MultibodyJoint, type ImpulseJoint, type RigidBody } from '@dimforge/rapier3d-compat';
3
- import type { RapierContext } from '../types/types';
4
- export declare const useJoint: <T extends ImpulseJoint | MultibodyJoint>(initializeJoint: (rigidBodyA: RigidBody, rigidBodyB: RigidBody, ctx: RapierContext) => T) => {
5
- joint: import("svelte/store").Writable<T>;
6
- rigidBodyA: import("svelte/store").Writable<RigidBody | undefined>;
7
- rigidBodyB: import("svelte/store").Writable<RigidBody | undefined>;
8
- };
@@ -1,8 +0,0 @@
1
- /// <reference types="svelte" />
2
- import type { PrismaticImpulseJoint } from '@dimforge/rapier3d-compat';
3
- import { Vector3 } from 'three';
4
- export declare const usePrismaticJoint: (anchorA: Parameters<Vector3['set']> | Vector3, anchorB: Parameters<Vector3['set']> | Vector3, axis: Parameters<Vector3['set']> | Vector3, limits?: [min: number, max: number]) => {
5
- joint: import("svelte/store").Writable<PrismaticImpulseJoint>;
6
- rigidBodyA: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
7
- rigidBodyB: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
8
- };
@@ -1,8 +0,0 @@
1
- /// <reference types="svelte" />
2
- import type { RevoluteImpulseJoint } from '@dimforge/rapier3d-compat';
3
- import { Vector3 } from 'three';
4
- export declare const useRevoluteJoint: (anchorA: Parameters<Vector3['set']> | Vector3, anchorB: Parameters<Vector3['set']> | Vector3, axis: Parameters<Vector3['set']> | Vector3, limits?: [min: number, max: number]) => {
5
- joint: import("svelte/store").Writable<RevoluteImpulseJoint>;
6
- rigidBodyA: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
7
- rigidBodyB: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
8
- };
@@ -1,8 +0,0 @@
1
- /// <reference types="svelte" />
2
- import type { SphericalImpulseJoint } from '@dimforge/rapier3d-compat';
3
- import { Vector3 } from 'three';
4
- export declare const useSphericalJoint: (anchorA: Parameters<Vector3['set']> | Vector3, anchorB: Parameters<Vector3['set']> | Vector3) => {
5
- joint: import("svelte/store").Writable<SphericalImpulseJoint>;
6
- rigidBodyA: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
7
- rigidBodyB: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
8
- };