angular-three-cannon 2.0.0-beta.21 → 2.0.0-beta.227

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 (47) hide show
  1. package/body/README.md +3 -0
  2. package/body/index.d.ts +2 -0
  3. package/body/lib/body.d.ts +57 -0
  4. package/body/lib/types.d.ts +38 -0
  5. package/body/lib/utils.d.ts +50 -0
  6. package/constraint/README.md +3 -0
  7. package/constraint/index.d.ts +1 -0
  8. package/constraint/lib/constraint.d.ts +26 -0
  9. package/debug/lib/debug.d.ts +15 -14
  10. package/esm2022/body/angular-three-cannon-body.mjs +5 -0
  11. package/esm2022/body/index.mjs +2 -0
  12. package/esm2022/body/lib/body.mjs +83 -0
  13. package/esm2022/body/lib/types.mjs +2 -0
  14. package/esm2022/body/lib/utils.mjs +205 -0
  15. package/esm2022/constraint/angular-three-cannon-constraint.mjs +5 -0
  16. package/esm2022/constraint/index.mjs +2 -0
  17. package/esm2022/constraint/lib/constraint.mjs +50 -0
  18. package/esm2022/debug/lib/debug.mjs +34 -46
  19. package/esm2022/lib/physics.mjs +70 -153
  20. package/fesm2022/angular-three-cannon-body.mjs +292 -0
  21. package/fesm2022/angular-three-cannon-body.mjs.map +1 -0
  22. package/fesm2022/angular-three-cannon-constraint.mjs +57 -0
  23. package/fesm2022/angular-three-cannon-constraint.mjs.map +1 -0
  24. package/fesm2022/angular-three-cannon-debug.mjs +33 -45
  25. package/fesm2022/angular-three-cannon-debug.mjs.map +1 -1
  26. package/fesm2022/angular-three-cannon.mjs +70 -153
  27. package/fesm2022/angular-three-cannon.mjs.map +1 -1
  28. package/lib/physics.d.ts +50 -43
  29. package/package.json +19 -13
  30. package/esm2022/services/angular-three-cannon-services.mjs +0 -5
  31. package/esm2022/services/index.mjs +0 -7
  32. package/esm2022/services/lib/body.mjs +0 -293
  33. package/esm2022/services/lib/constraints.mjs +0 -59
  34. package/esm2022/services/lib/contact-material.mjs +0 -20
  35. package/esm2022/services/lib/ray.mjs +0 -30
  36. package/esm2022/services/lib/raycast-vehicle.mjs +0 -68
  37. package/esm2022/services/lib/spring.mjs +0 -31
  38. package/fesm2022/angular-three-cannon-services.mjs +0 -490
  39. package/fesm2022/angular-three-cannon-services.mjs.map +0 -1
  40. package/services/README.md +0 -3
  41. package/services/index.d.ts +0 -6
  42. package/services/lib/body.d.ts +0 -60
  43. package/services/lib/constraints.d.ts +0 -31
  44. package/services/lib/contact-material.d.ts +0 -9
  45. package/services/lib/ray.d.ts +0 -12
  46. package/services/lib/raycast-vehicle.d.ts +0 -30
  47. package/services/lib/spring.d.ts +0 -19
@@ -1,31 +0,0 @@
1
- import { effect, runInInjectionContext, untracked } from '@angular/core';
2
- import { assertInjectionContext, injectNgtRef, is, makeId, } from 'angular-three';
3
- import { injectNgtcPhysicsApi } from 'angular-three-cannon';
4
- export function injectSpring(bodyA, bodyB, { injector, opts = () => ({}), deps = () => ({}), } = {}) {
5
- injector = assertInjectionContext(injectSpring, injector);
6
- return runInInjectionContext(injector, () => {
7
- const physicsApi = injectNgtcPhysicsApi();
8
- const worker = physicsApi.select('worker');
9
- const uuid = makeId();
10
- const bodyARef = is.ref(bodyA) ? bodyA : injectNgtRef(bodyA);
11
- const bodyBRef = is.ref(bodyB) ? bodyB : injectNgtRef(bodyB);
12
- effect((onCleanup) => {
13
- deps();
14
- if (bodyARef.nativeElement && bodyBRef.nativeElement) {
15
- worker().addSpring({
16
- props: [bodyARef.nativeElement.uuid, bodyBRef.nativeElement.uuid, untracked(opts)],
17
- uuid,
18
- });
19
- onCleanup(() => worker().removeSpring({ uuid }));
20
- }
21
- });
22
- const api = (() => ({
23
- setDamping: (value) => worker().setSpringDamping({ props: value, uuid }),
24
- setRestLength: (value) => worker().setSpringRestLength({ props: value, uuid }),
25
- setStiffness: (value) => worker().setSpringStiffness({ props: value, uuid }),
26
- remove: () => worker().removeSpring({ uuid }),
27
- }))();
28
- return { bodyA: bodyARef, bodyB: bodyBRef, api };
29
- });
30
- }
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jYW5ub24vc2VydmljZXMvc3JjL2xpYi9zcHJpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRXhGLE9BQU8sRUFDTixzQkFBc0IsRUFDdEIsWUFBWSxFQUNaLEVBQUUsRUFDRixNQUFNLEdBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFrQjVELE1BQU0sVUFBVSxZQUFZLENBQzNCLEtBQTRCLEVBQzVCLEtBQTRCLEVBQzVCLEVBQ0MsUUFBUSxFQUNSLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNqQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFDZ0UsRUFBRTtJQUVwRixRQUFRLEdBQUcsc0JBQXNCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFELE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFM0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFdEIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0QsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0QsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDcEIsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLFFBQVEsQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRTtnQkFDckQsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDO29CQUNsQixLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2xGLElBQUk7aUJBQ0osQ0FBQyxDQUFDO2dCQUNILFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDakQ7UUFDRixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNuQixVQUFVLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNoRixhQUFhLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN0RixZQUFZLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNwRixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDN0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVOLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZWZmZWN0LCBydW5JbkluamVjdGlvbkNvbnRleHQsIHVudHJhY2tlZCwgdHlwZSBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBTcHJpbmdPcHRucyB9IGZyb20gJ0BwbW5kcnMvY2Fubm9uLXdvcmtlci1hcGknO1xuaW1wb3J0IHtcblx0YXNzZXJ0SW5qZWN0aW9uQ29udGV4dCxcblx0aW5qZWN0Tmd0UmVmLFxuXHRpcyxcblx0bWFrZUlkLFxuXHR0eXBlIE5ndEFueVJlY29yZCxcblx0dHlwZSBOZ3RJbmplY3RlZFJlZixcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBpbmplY3ROZ3RjUGh5c2ljc0FwaSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtY2Fubm9uJztcblxuZXhwb3J0IHR5cGUgTmd0Y1NwcmluZ0FwaSA9IHtcblx0c2V0RGFtcGluZzogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQ7XG5cdHNldFJlc3RMZW5ndGg6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkO1xuXHRzZXRTdGlmZm5lc3M6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkO1xuXHRyZW1vdmU6ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RjU3ByaW5nUmV0dXJuPFxuXHRUT2JqZWN0QSBleHRlbmRzIFRIUkVFLk9iamVjdDNEID0gVEhSRUUuT2JqZWN0M0QsXG5cdFRPYmplY3RCIGV4dGVuZHMgVEhSRUUuT2JqZWN0M0QgPSBUSFJFRS5PYmplY3QzRCxcbj4gPSB7XG5cdGJvZHlBOiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0QT47XG5cdGJvZHlCOiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0Qj47XG5cdGFwaTogTmd0Y1NwcmluZ0FwaTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RTcHJpbmc8QSBleHRlbmRzIFRIUkVFLk9iamVjdDNELCBCIGV4dGVuZHMgVEhSRUUuT2JqZWN0M0Q+KFxuXHRib2R5QTogTmd0SW5qZWN0ZWRSZWY8QT4gfCBBLFxuXHRib2R5QjogTmd0SW5qZWN0ZWRSZWY8Qj4gfCBCLFxuXHR7XG5cdFx0aW5qZWN0b3IsXG5cdFx0b3B0cyA9ICgpID0+ICh7fSksXG5cdFx0ZGVwcyA9ICgpID0+ICh7fSksXG5cdH06IHsgaW5qZWN0b3I/OiBJbmplY3RvcjsgZGVwcz86ICgpID0+IE5ndEFueVJlY29yZDsgb3B0cz86ICgpID0+IFNwcmluZ09wdG5zIH0gPSB7fSxcbik6IE5ndGNTcHJpbmdSZXR1cm48QSwgQj4ge1xuXHRpbmplY3RvciA9IGFzc2VydEluamVjdGlvbkNvbnRleHQoaW5qZWN0U3ByaW5nLCBpbmplY3Rvcik7XG5cdHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IHtcblx0XHRjb25zdCBwaHlzaWNzQXBpID0gaW5qZWN0Tmd0Y1BoeXNpY3NBcGkoKTtcblx0XHRjb25zdCB3b3JrZXIgPSBwaHlzaWNzQXBpLnNlbGVjdCgnd29ya2VyJyk7XG5cblx0XHRjb25zdCB1dWlkID0gbWFrZUlkKCk7XG5cblx0XHRjb25zdCBib2R5QVJlZiA9IGlzLnJlZihib2R5QSkgPyBib2R5QSA6IGluamVjdE5ndFJlZihib2R5QSk7XG5cdFx0Y29uc3QgYm9keUJSZWYgPSBpcy5yZWYoYm9keUIpID8gYm9keUIgOiBpbmplY3ROZ3RSZWYoYm9keUIpO1xuXG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGRlcHMoKTtcblx0XHRcdGlmIChib2R5QVJlZi5uYXRpdmVFbGVtZW50ICYmIGJvZHlCUmVmLm5hdGl2ZUVsZW1lbnQpIHtcblx0XHRcdFx0d29ya2VyKCkuYWRkU3ByaW5nKHtcblx0XHRcdFx0XHRwcm9wczogW2JvZHlBUmVmLm5hdGl2ZUVsZW1lbnQudXVpZCwgYm9keUJSZWYubmF0aXZlRWxlbWVudC51dWlkLCB1bnRyYWNrZWQob3B0cyldLFxuXHRcdFx0XHRcdHV1aWQsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvbkNsZWFudXAoKCkgPT4gd29ya2VyKCkucmVtb3ZlU3ByaW5nKHsgdXVpZCB9KSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRjb25zdCBhcGkgPSAoKCkgPT4gKHtcblx0XHRcdHNldERhbXBpbmc6ICh2YWx1ZTogbnVtYmVyKSA9PiB3b3JrZXIoKS5zZXRTcHJpbmdEYW1waW5nKHsgcHJvcHM6IHZhbHVlLCB1dWlkIH0pLFxuXHRcdFx0c2V0UmVzdExlbmd0aDogKHZhbHVlOiBudW1iZXIpID0+IHdvcmtlcigpLnNldFNwcmluZ1Jlc3RMZW5ndGgoeyBwcm9wczogdmFsdWUsIHV1aWQgfSksXG5cdFx0XHRzZXRTdGlmZm5lc3M6ICh2YWx1ZTogbnVtYmVyKSA9PiB3b3JrZXIoKS5zZXRTcHJpbmdTdGlmZm5lc3MoeyBwcm9wczogdmFsdWUsIHV1aWQgfSksXG5cdFx0XHRyZW1vdmU6ICgpID0+IHdvcmtlcigpLnJlbW92ZVNwcmluZyh7IHV1aWQgfSksXG5cdFx0fSkpKCk7XG5cblx0XHRyZXR1cm4geyBib2R5QTogYm9keUFSZWYsIGJvZHlCOiBib2R5QlJlZiwgYXBpIH07XG5cdH0pO1xufVxuIl19
@@ -1,490 +0,0 @@
1
- import { runInInjectionContext, effect, untracked } from '@angular/core';
2
- import { assertInjectionContext, injectNgtRef, makeId, is } from 'angular-three';
3
- import { injectNgtcPhysicsApi } from 'angular-three-cannon';
4
- import { injectNgtcDebugApi } from 'angular-three-cannon/debug';
5
- import * as THREE from 'three';
6
-
7
- const temp = new THREE.Object3D();
8
- function capitalize(str) {
9
- return (str.charAt(0).toUpperCase() + str.slice(1));
10
- }
11
- function getUUID(ref, index) {
12
- const suffix = index === undefined ? '' : `/${index}`;
13
- if (typeof ref === 'function')
14
- return null;
15
- return ref && ref.nativeElement && `${ref.nativeElement.uuid}${suffix}`;
16
- }
17
- const e = new THREE.Euler();
18
- const q = new THREE.Quaternion();
19
- const quaternionToRotation = (callback) => {
20
- return (v) => callback(e.setFromQuaternion(q.fromArray(v)).toArray());
21
- };
22
- let incrementingId = 0;
23
- function subscribe(ref, worker, subscriptions, type, index, target = 'bodies') {
24
- return (callback) => {
25
- const id = incrementingId++;
26
- subscriptions[id] = { [type]: callback };
27
- const uuid = getUUID(ref, index);
28
- uuid && worker.subscribe({ props: { id, target, type }, uuid });
29
- return () => {
30
- delete subscriptions[id];
31
- worker.unsubscribe({ props: id });
32
- };
33
- };
34
- }
35
- function prepare(object, { position = [0, 0, 0], rotation = [0, 0, 0], userData = {} }) {
36
- object.userData = userData;
37
- object.position.set(...position);
38
- object.rotation.set(...rotation);
39
- object.updateMatrix();
40
- }
41
- function setupCollision(events, { onCollide, onCollideBegin, onCollideEnd }, uuid) {
42
- events[uuid] = {
43
- collide: onCollide,
44
- collideBegin: onCollideBegin,
45
- collideEnd: onCollideEnd,
46
- };
47
- }
48
- function makeTriplet(v) {
49
- return v instanceof THREE.Vector3 ? [v.x, v.y, v.z] : v;
50
- }
51
- function injectPlane(fn, opts) {
52
- return injectBody('Plane', fn, () => [], opts);
53
- }
54
- function injectBox(fn, opts) {
55
- const defaultBoxArgs = [1, 1, 1];
56
- return injectBody('Box', fn, (args = defaultBoxArgs) => args, opts);
57
- }
58
- function injectCylinder(fn, opts) {
59
- return injectBody('Cylinder', fn, (args = []) => args, opts);
60
- }
61
- function injectHeightfield(fn, opts) {
62
- return injectBody('Heightfield', fn, (args) => args, opts);
63
- }
64
- function injectParticle(fn, opts) {
65
- return injectBody('Particle', fn, () => [], opts);
66
- }
67
- function injectSphere(fn, opts) {
68
- return injectBody('Sphere', fn, (args = [1]) => {
69
- if (!Array.isArray(args))
70
- throw new Error('useSphere args must be an array');
71
- return [args[0]];
72
- }, opts);
73
- }
74
- function injectTrimesh(fn, opts) {
75
- return injectBody('Trimesh', fn, (args) => args, opts);
76
- }
77
- function injectConvexPolyhedron(fn, opts) {
78
- return injectBody('ConvexPolyhedron', fn, ([vertices, faces, normals, axes, boundingSphereRadius] = []) => [
79
- vertices && vertices.map(makeTriplet),
80
- faces,
81
- normals && normals.map(makeTriplet),
82
- axes && axes.map(makeTriplet),
83
- boundingSphereRadius,
84
- ], opts);
85
- }
86
- function injectCompoundBody(fn, opts) {
87
- return injectBody('Compound', fn, (args) => args, opts);
88
- }
89
- function injectBody(type, getPropsFn, argsFn, { ref, injector, deps = () => ({}) } = {}) {
90
- injector = assertInjectionContext(injectBody, injector);
91
- return runInInjectionContext(injector, () => {
92
- const bodyRef = ref || injectNgtRef();
93
- const physicsApi = injectNgtcPhysicsApi();
94
- const debugApi = injectNgtcDebugApi({ optional: true });
95
- const { add: debugAdd, remove: debugRemove } = debugApi || {};
96
- const { refs, subscriptions, scaleOverrides, events, bodies } = physicsApi.get();
97
- const worker = physicsApi.select('worker');
98
- effect((onCleanup) => {
99
- // register deps
100
- deps();
101
- const currentWorker = worker();
102
- if (!currentWorker)
103
- return;
104
- if (!bodyRef.nativeElement) {
105
- bodyRef.nativeElement = new THREE.Object3D();
106
- return;
107
- }
108
- const object = bodyRef.nativeElement;
109
- const objectCount = object instanceof THREE.InstancedMesh
110
- ? (object.instanceMatrix.setUsage(THREE.DynamicDrawUsage), object.count)
111
- : 1;
112
- const uuid = object instanceof THREE.InstancedMesh
113
- ? new Array(objectCount).fill(0).map((_, i) => `${object.uuid}/${i}`)
114
- : [object.uuid];
115
- const props = object instanceof THREE.InstancedMesh
116
- ? uuid.map((id, i) => {
117
- const props = getPropsFn(i);
118
- prepare(temp, props);
119
- object.setMatrixAt(i, temp.matrix);
120
- object.instanceMatrix.needsUpdate = true;
121
- refs[id] = object;
122
- debugAdd?.(id, props, type);
123
- setupCollision(events, props, id);
124
- return { ...props, args: argsFn(props.args) };
125
- })
126
- : uuid.map((id, i) => {
127
- const props = getPropsFn(i);
128
- prepare(object, props);
129
- refs[id] = object;
130
- debugAdd?.(id, props, type);
131
- setupCollision(events, props, id);
132
- return { ...props, args: argsFn(props.args) };
133
- });
134
- // Register on mount, unregister on unmount
135
- currentWorker.addBodies({
136
- props: props.map(({ onCollide, onCollideBegin, onCollideEnd, ...serializableProps }) => {
137
- return { onCollide: Boolean(onCollide), ...serializableProps };
138
- }),
139
- type,
140
- uuid,
141
- });
142
- onCleanup(() => {
143
- uuid.forEach((id) => {
144
- delete refs[id];
145
- debugRemove?.(id);
146
- delete events[id];
147
- });
148
- currentWorker.removeBodies({ uuid });
149
- });
150
- });
151
- const api = (() => {
152
- const makeAtomic = (type, index) => {
153
- const op = `set${capitalize(type)}`;
154
- return {
155
- set: (value) => {
156
- const uuid = getUUID(bodyRef, index);
157
- uuid &&
158
- worker()[op]({
159
- props: value,
160
- uuid,
161
- });
162
- },
163
- subscribe: subscribe(bodyRef, worker(), subscriptions, type, index),
164
- };
165
- };
166
- const makeQuaternion = (index) => {
167
- const type = 'quaternion';
168
- return {
169
- copy: ({ w, x, y, z }) => {
170
- const uuid = getUUID(bodyRef, index);
171
- uuid && bodies[uuid] != null && worker().setQuaternion({ props: [x, y, z, w], uuid });
172
- },
173
- set: (x, y, z, w) => {
174
- const uuid = getUUID(bodyRef, index);
175
- uuid && bodies[uuid] != null && worker().setQuaternion({ props: [x, y, z, w], uuid });
176
- },
177
- subscribe: subscribe(bodyRef, worker(), subscriptions, type, index),
178
- };
179
- };
180
- const makeRotation = (index) => {
181
- return {
182
- copy: ({ x, y, z }) => {
183
- const uuid = getUUID(bodyRef, index);
184
- uuid && bodies[uuid] != null && worker().setRotation({ props: [x, y, z], uuid });
185
- },
186
- set: (x, y, z) => {
187
- const uuid = getUUID(bodyRef, index);
188
- uuid && bodies[uuid] != null && worker().setRotation({ props: [x, y, z], uuid });
189
- },
190
- subscribe: (callback) => {
191
- const id = incrementingId++;
192
- const target = 'bodies';
193
- const type = 'quaternion';
194
- const uuid = getUUID(bodyRef, index);
195
- subscriptions[id] = { [type]: quaternionToRotation(callback) };
196
- uuid && bodies[uuid] != null && worker().subscribe({ props: { id, target, type }, uuid });
197
- return () => {
198
- delete subscriptions[id];
199
- worker().unsubscribe({ props: id });
200
- };
201
- },
202
- };
203
- };
204
- const makeVec = (type, index) => {
205
- const op = `set${capitalize(type)}`;
206
- return {
207
- copy: ({ x, y, z }) => {
208
- const uuid = getUUID(bodyRef, index);
209
- uuid && bodies[uuid] != null && worker()[op]({ props: [x, y, z], uuid });
210
- },
211
- set: (x, y, z) => {
212
- const uuid = getUUID(bodyRef, index);
213
- uuid && bodies[uuid] != null && worker()[op]({ props: [x, y, z], uuid });
214
- },
215
- subscribe: subscribe(bodyRef, worker(), subscriptions, type, index),
216
- };
217
- };
218
- const makeRemove = (index) => {
219
- const uuid = getUUID(bodyRef, index);
220
- return () => {
221
- if (uuid)
222
- worker().removeBodies({ uuid: [uuid] });
223
- };
224
- };
225
- function makeApi(index) {
226
- return {
227
- allowSleep: makeAtomic('allowSleep', index),
228
- angularDamping: makeAtomic('angularDamping', index),
229
- angularFactor: makeVec('angularFactor', index),
230
- angularVelocity: makeVec('angularVelocity', index),
231
- applyForce(force, worldPoint) {
232
- const uuid = getUUID(bodyRef, index);
233
- uuid && bodies[uuid] != null && worker().applyForce({ props: [force, worldPoint], uuid });
234
- },
235
- applyImpulse(impulse, worldPoint) {
236
- const uuid = getUUID(bodyRef, index);
237
- uuid && bodies[uuid] != null && worker().applyImpulse({ props: [impulse, worldPoint], uuid });
238
- },
239
- applyLocalForce(force, localPoint) {
240
- const uuid = getUUID(bodyRef, index);
241
- uuid && bodies[uuid] != null && worker().applyLocalForce({ props: [force, localPoint], uuid });
242
- },
243
- applyLocalImpulse(impulse, localPoint) {
244
- const uuid = getUUID(bodyRef, index);
245
- uuid &&
246
- bodies[uuid] != null &&
247
- worker().applyLocalImpulse({ props: [impulse, localPoint], uuid });
248
- },
249
- applyTorque(torque) {
250
- const uuid = getUUID(bodyRef, index);
251
- uuid && bodies[uuid] != null && worker().applyTorque({ props: [torque], uuid });
252
- },
253
- collisionFilterGroup: makeAtomic('collisionFilterGroup', index),
254
- collisionFilterMask: makeAtomic('collisionFilterMask', index),
255
- collisionResponse: makeAtomic('collisionResponse', index),
256
- fixedRotation: makeAtomic('fixedRotation', index),
257
- isTrigger: makeAtomic('isTrigger', index),
258
- linearDamping: makeAtomic('linearDamping', index),
259
- linearFactor: makeVec('linearFactor', index),
260
- mass: makeAtomic('mass', index),
261
- material: makeAtomic('material', index),
262
- position: makeVec('position', index),
263
- quaternion: makeQuaternion(index),
264
- rotation: makeRotation(index),
265
- scaleOverride(scale) {
266
- const uuid = getUUID(bodyRef, index);
267
- if (uuid)
268
- scaleOverrides[uuid] = new THREE.Vector3(...scale);
269
- },
270
- sleep() {
271
- const uuid = getUUID(bodyRef, index);
272
- uuid && bodies[uuid] != null && worker().sleep({ uuid });
273
- },
274
- sleepSpeedLimit: makeAtomic('sleepSpeedLimit', index),
275
- sleepTimeLimit: makeAtomic('sleepTimeLimit', index),
276
- userData: makeAtomic('userData', index),
277
- velocity: makeVec('velocity', index),
278
- remove: makeRemove(index),
279
- wakeUp() {
280
- const uuid = getUUID(bodyRef, index);
281
- uuid && bodies[uuid] != null && worker().wakeUp({ uuid });
282
- },
283
- };
284
- }
285
- const cache = {};
286
- return {
287
- ...makeApi(undefined),
288
- at: (index) => cache[index] || (cache[index] = makeApi(index)),
289
- };
290
- })();
291
- return { ref: bodyRef, api };
292
- });
293
- }
294
-
295
- function usePointToPointConstraint(bodyA, bodyB, opts) {
296
- return injectConstraint('PointToPoint', bodyA, bodyB, opts);
297
- }
298
- function useConeTwistConstraint(bodyA, bodyB, opts) {
299
- return injectConstraint('ConeTwist', bodyA, bodyB, opts);
300
- }
301
- function useDistanceConstraint(bodyA, bodyB, opts) {
302
- return injectConstraint('Distance', bodyA, bodyB, opts);
303
- }
304
- function useHingeConstraint(bodyA, bodyB, opts) {
305
- return injectConstraint('Hinge', bodyA, bodyB, opts);
306
- }
307
- function useLockConstraint(bodyA, bodyB, opts) {
308
- return injectConstraint('Lock', bodyA, bodyB, opts);
309
- }
310
- function injectConstraint(type, bodyA, bodyB, { injector, deps = () => ({}), opts = () => ({}), } = {}) {
311
- injector = assertInjectionContext(injectConstraint, injector);
312
- return runInInjectionContext(injector, () => {
313
- const physicsApi = injectNgtcPhysicsApi();
314
- const worker = physicsApi.select('worker');
315
- const uuid = makeId();
316
- const bodyARef = is.ref(bodyA) ? bodyA : injectNgtRef(bodyA);
317
- const bodyBRef = is.ref(bodyB) ? bodyB : injectNgtRef(bodyB);
318
- effect((onCleanup) => {
319
- deps();
320
- if (bodyARef.nativeElement && bodyBRef.nativeElement) {
321
- worker().addConstraint({
322
- props: [bodyARef.untracked.uuid, bodyBRef.untracked.uuid, untracked(opts)],
323
- type,
324
- uuid,
325
- });
326
- onCleanup(() => worker().removeConstraint({ uuid }));
327
- }
328
- });
329
- const api = (() => {
330
- const enableDisable = {
331
- disable: () => worker().disableConstraint({ uuid }),
332
- enable: () => worker().enableConstraint({ uuid }),
333
- remove: () => worker().removeConstraint({ uuid }),
334
- };
335
- if (type === 'Hinge') {
336
- return {
337
- ...enableDisable,
338
- disableMotor: () => worker().disableConstraintMotor({ uuid }),
339
- enableMotor: () => worker().enableConstraintMotor({ uuid }),
340
- setMotorMaxForce: (value) => worker().setConstraintMotorMaxForce({ props: value, uuid }),
341
- setMotorSpeed: (value) => worker().setConstraintMotorSpeed({ props: value, uuid }),
342
- };
343
- }
344
- return enableDisable;
345
- })();
346
- return { bodyA: bodyARef, bodyB: bodyBRef, api };
347
- });
348
- }
349
-
350
- function injectContactMaterial(materialB, materialA, { opts, deps = () => ({}), injector, }) {
351
- injector = assertInjectionContext(injectContactMaterial, injector);
352
- return runInInjectionContext(injector, () => {
353
- const physicsApi = injectNgtcPhysicsApi();
354
- const worker = physicsApi.select('worker');
355
- const uuid = makeId();
356
- effect((onCleanup) => {
357
- deps();
358
- worker().addContactMaterial({
359
- props: [materialA, materialB, untracked(opts)],
360
- uuid,
361
- });
362
- onCleanup(() => worker().removeContactMaterial({ uuid }));
363
- });
364
- });
365
- }
366
-
367
- function injectRaycastClosest(opts) {
368
- return injectRay('Closest', opts);
369
- }
370
- function injectRaycastAny(opts) {
371
- return injectRay('Any', opts);
372
- }
373
- function useRaycastAll(opts) {
374
- return injectRay('All', opts);
375
- }
376
- function injectRay(mode, { options, callback, deps = () => ({}), injector }) {
377
- injector = assertInjectionContext(injectRay, injector);
378
- return runInInjectionContext(injector, () => {
379
- const physicsApi = injectNgtcPhysicsApi();
380
- const [worker, events] = [physicsApi.select('worker'), physicsApi.get('events')];
381
- const uuid = makeId();
382
- effect((onCleanup) => {
383
- deps();
384
- events[uuid] = { rayhit: callback };
385
- worker().addRay({ props: { ...untracked(options), mode }, uuid });
386
- onCleanup(() => {
387
- worker().removeRay({ uuid });
388
- delete events[uuid];
389
- });
390
- });
391
- });
392
- }
393
-
394
- function isString(v) {
395
- return typeof v === 'string';
396
- }
397
- function injectRaycastVehicle(fn, { ref, injector, deps = () => ({}), } = {}) {
398
- injector = assertInjectionContext(injectRaycastVehicle, injector);
399
- return runInInjectionContext(injector, () => {
400
- const physicsApi = injectNgtcPhysicsApi();
401
- const [worker, subscriptions] = [physicsApi.select('worker'), physicsApi.get('subscriptions')];
402
- const instanceRef = ref || injectNgtRef();
403
- effect((onCleanup) => {
404
- deps();
405
- if (!instanceRef.nativeElement) {
406
- instanceRef.nativeElement = new THREE.Object3D();
407
- return;
408
- }
409
- const currentWorker = worker();
410
- const uuid = instanceRef.nativeElement.uuid;
411
- const { chassisBody, indexForwardAxis = 2, indexRightAxis = 0, indexUpAxis = 1, wheelInfos, wheels, } = untracked(fn);
412
- const chassisBodyUUID = getUUID(chassisBody);
413
- const wheelUUIDs = wheels.map((ref) => getUUID(ref));
414
- if (!chassisBodyUUID || !wheelUUIDs.every(isString))
415
- return;
416
- currentWorker.addRaycastVehicle({
417
- props: [chassisBodyUUID, wheelUUIDs, wheelInfos, indexForwardAxis, indexRightAxis, indexUpAxis],
418
- uuid,
419
- });
420
- onCleanup(() => {
421
- currentWorker.removeRaycastVehicle({ uuid });
422
- });
423
- });
424
- const api = (() => ({
425
- applyEngineForce(value, wheelIndex) {
426
- const uuid = getUUID(instanceRef);
427
- uuid &&
428
- worker().applyRaycastVehicleEngineForce({
429
- props: [value, wheelIndex],
430
- uuid,
431
- });
432
- },
433
- setBrake(brake, wheelIndex) {
434
- const uuid = getUUID(instanceRef);
435
- uuid && worker().setRaycastVehicleBrake({ props: [brake, wheelIndex], uuid });
436
- },
437
- setSteeringValue(value, wheelIndex) {
438
- const uuid = getUUID(instanceRef);
439
- uuid &&
440
- worker().setRaycastVehicleSteeringValue({
441
- props: [value, wheelIndex],
442
- uuid,
443
- });
444
- },
445
- sliding: {
446
- subscribe: subscribe(instanceRef, worker(), subscriptions, 'sliding', undefined, 'vehicles'),
447
- },
448
- remove: () => {
449
- const uuid = getUUID(instanceRef);
450
- uuid && worker().removeRaycastVehicle({ uuid });
451
- },
452
- }))();
453
- return { ref: instanceRef, api };
454
- });
455
- }
456
-
457
- function injectSpring(bodyA, bodyB, { injector, opts = () => ({}), deps = () => ({}), } = {}) {
458
- injector = assertInjectionContext(injectSpring, injector);
459
- return runInInjectionContext(injector, () => {
460
- const physicsApi = injectNgtcPhysicsApi();
461
- const worker = physicsApi.select('worker');
462
- const uuid = makeId();
463
- const bodyARef = is.ref(bodyA) ? bodyA : injectNgtRef(bodyA);
464
- const bodyBRef = is.ref(bodyB) ? bodyB : injectNgtRef(bodyB);
465
- effect((onCleanup) => {
466
- deps();
467
- if (bodyARef.nativeElement && bodyBRef.nativeElement) {
468
- worker().addSpring({
469
- props: [bodyARef.nativeElement.uuid, bodyBRef.nativeElement.uuid, untracked(opts)],
470
- uuid,
471
- });
472
- onCleanup(() => worker().removeSpring({ uuid }));
473
- }
474
- });
475
- const api = (() => ({
476
- setDamping: (value) => worker().setSpringDamping({ props: value, uuid }),
477
- setRestLength: (value) => worker().setSpringRestLength({ props: value, uuid }),
478
- setStiffness: (value) => worker().setSpringStiffness({ props: value, uuid }),
479
- remove: () => worker().removeSpring({ uuid }),
480
- }))();
481
- return { bodyA: bodyARef, bodyB: bodyBRef, api };
482
- });
483
- }
484
-
485
- /**
486
- * Generated bundle index. Do not edit.
487
- */
488
-
489
- export { getUUID, injectBox, injectCompoundBody, injectContactMaterial, injectConvexPolyhedron, injectCylinder, injectHeightfield, injectParticle, injectPlane, injectRaycastAny, injectRaycastClosest, injectRaycastVehicle, injectSphere, injectSpring, injectTrimesh, subscribe, useConeTwistConstraint, useDistanceConstraint, useHingeConstraint, useLockConstraint, usePointToPointConstraint, useRaycastAll };
490
- //# sourceMappingURL=angular-three-cannon-services.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"angular-three-cannon-services.mjs","sources":["../../../../libs/cannon/services/src/lib/body.ts","../../../../libs/cannon/services/src/lib/constraints.ts","../../../../libs/cannon/services/src/lib/contact-material.ts","../../../../libs/cannon/services/src/lib/ray.ts","../../../../libs/cannon/services/src/lib/raycast-vehicle.ts","../../../../libs/cannon/services/src/lib/spring.ts","../../../../libs/cannon/services/src/angular-three-cannon-services.ts"],"sourcesContent":["import { effect, runInInjectionContext, type ElementRef, type Injector } from '@angular/core';\nimport type {\n\tAtomicName,\n\tAtomicProps,\n\tBodyProps,\n\tBodyShapeType,\n\tBoxProps,\n\tCannonWorkerAPI,\n\tCompoundBodyProps,\n\tConvexPolyhedronArgs,\n\tConvexPolyhedronProps,\n\tCylinderProps,\n\tHeightfieldProps,\n\tParticleProps,\n\tPlaneProps,\n\tPropValue,\n\tQuad,\n\tSetOpName,\n\tSphereArgs,\n\tSphereProps,\n\tSubscriptionName,\n\tSubscriptionTarget,\n\tSubscriptions,\n\tTrimeshProps,\n\tTriplet,\n\tVectorName,\n} from '@pmndrs/cannon-worker-api';\nimport { assertInjectionContext, injectNgtRef, type NgtAnyRecord, type NgtInjectedRef } from 'angular-three';\nimport { injectNgtcPhysicsApi, type NgtcCannonEvents } from 'angular-three-cannon';\nimport { injectNgtcDebugApi } from 'angular-three-cannon/debug';\nimport * as THREE from 'three';\n\nexport type NgtcAtomicApi<K extends AtomicName> = {\n\tset: (value: AtomicProps[K]) => void;\n\tsubscribe: (callback: (value: AtomicProps[K]) => void) => () => void;\n};\n\nexport type NgtcQuaternionApi = {\n\tcopy: ({ w, x, y, z }: THREE.Quaternion) => void;\n\tset: (x: number, y: number, z: number, w: number) => void;\n\tsubscribe: (callback: (value: Quad) => void) => () => void;\n};\n\nexport type NgtcVectorApi = {\n\tcopy: ({ x, y, z }: THREE.Vector3 | THREE.Euler) => void;\n\tset: (x: number, y: number, z: number) => void;\n\tsubscribe: (callback: (value: Triplet) => void) => () => void;\n};\n\nexport type NgtcWorkerApi = {\n\t[K in AtomicName]: NgtcAtomicApi<K>;\n} & {\n\t[K in VectorName]: NgtcVectorApi;\n} & {\n\tapplyForce: (force: Triplet, worldPoint: Triplet) => void;\n\tapplyImpulse: (impulse: Triplet, worldPoint: Triplet) => void;\n\tapplyLocalForce: (force: Triplet, localPoint: Triplet) => void;\n\tapplyLocalImpulse: (impulse: Triplet, localPoint: Triplet) => void;\n\tapplyTorque: (torque: Triplet) => void;\n\tquaternion: NgtcQuaternionApi;\n\trotation: NgtcVectorApi;\n\tscaleOverride: (scale: Triplet) => void;\n\tsleep: () => void;\n\twakeUp: () => void;\n\tremove: () => void;\n};\n\nexport interface NgtcBodyPublicApi extends NgtcWorkerApi {\n\tat: (index: number) => NgtcWorkerApi;\n}\n\nexport interface NgtcBodyReturn<TObject extends THREE.Object3D> {\n\tref: NgtInjectedRef<TObject>;\n\tapi: NgtcBodyPublicApi;\n}\n\nexport type NgtcGetByIndex<T extends BodyProps> = (index: number) => T;\nexport type NgtcArgFn<T> = (args: T) => unknown[];\n\nconst temp = new THREE.Object3D();\n\nfunction capitalize<T extends string>(str: T): Capitalize<T> {\n\treturn (str.charAt(0).toUpperCase() + str.slice(1)) as Capitalize<T>;\n}\n\nexport function getUUID(ref: ElementRef<THREE.Object3D>, index?: number): string | null {\n\tconst suffix = index === undefined ? '' : `/${index}`;\n\tif (typeof ref === 'function') return null;\n\treturn ref && ref.nativeElement && `${ref.nativeElement.uuid}${suffix}`;\n}\n\nconst e = new THREE.Euler();\nconst q = new THREE.Quaternion();\n\nconst quaternionToRotation = (callback: (v: Triplet) => void) => {\n\treturn (v: Quad) => callback(e.setFromQuaternion(q.fromArray(v)).toArray() as Triplet);\n};\n\nlet incrementingId = 0;\n\nexport function subscribe<T extends SubscriptionName>(\n\tref: ElementRef<THREE.Object3D>,\n\tworker: CannonWorkerAPI,\n\tsubscriptions: Subscriptions,\n\ttype: T,\n\tindex?: number,\n\ttarget: SubscriptionTarget = 'bodies',\n) {\n\treturn (callback: (value: PropValue<T>) => void) => {\n\t\tconst id = incrementingId++;\n\t\tsubscriptions[id] = { [type]: callback };\n\t\tconst uuid = getUUID(ref, index);\n\t\tuuid && worker.subscribe({ props: { id, target, type }, uuid });\n\t\treturn () => {\n\t\t\tdelete subscriptions[id];\n\t\t\tworker.unsubscribe({ props: id });\n\t\t};\n\t};\n}\n\nfunction prepare(object: THREE.Object3D, { position = [0, 0, 0], rotation = [0, 0, 0], userData = {} }: BodyProps) {\n\tobject.userData = userData;\n\tobject.position.set(...position);\n\tobject.rotation.set(...rotation);\n\tobject.updateMatrix();\n}\n\nfunction setupCollision(\n\tevents: NgtcCannonEvents,\n\t{ onCollide, onCollideBegin, onCollideEnd }: Partial<BodyProps>,\n\tuuid: string,\n) {\n\tevents[uuid] = {\n\t\tcollide: onCollide,\n\t\tcollideBegin: onCollideBegin,\n\t\tcollideEnd: onCollideEnd,\n\t};\n}\n\nfunction makeTriplet(v: THREE.Vector3 | Triplet): Triplet {\n\treturn v instanceof THREE.Vector3 ? [v.x, v.y, v.z] : v;\n}\n\nexport interface NgtcBodyOptions<TObject extends THREE.Object3D> {\n\tref?: NgtInjectedRef<TObject>;\n\tdeps?: () => NgtAnyRecord;\n\tinjector?: Injector;\n}\n\nexport function injectPlane<TObject extends THREE.Object3D>(\n\tfn: NgtcGetByIndex<PlaneProps>,\n\topts?: NgtcBodyOptions<TObject>,\n) {\n\treturn injectBody('Plane', fn, () => [], opts);\n}\n\nexport function injectBox<TObject extends THREE.Object3D>(\n\tfn: NgtcGetByIndex<BoxProps>,\n\topts?: NgtcBodyOptions<TObject>,\n) {\n\tconst defaultBoxArgs: Triplet = [1, 1, 1];\n\treturn injectBody('Box', fn, (args = defaultBoxArgs): Triplet => args, opts);\n}\n\nexport function injectCylinder<TObject extends THREE.Object3D>(\n\tfn: NgtcGetByIndex<CylinderProps>,\n\topts?: NgtcBodyOptions<TObject>,\n) {\n\treturn injectBody('Cylinder', fn, (args = [] as []) => args, opts);\n}\n\nexport function injectHeightfield<TObject extends THREE.Object3D>(\n\tfn: NgtcGetByIndex<HeightfieldProps>,\n\topts?: NgtcBodyOptions<TObject>,\n) {\n\treturn injectBody('Heightfield', fn, (args) => args, opts);\n}\n\nexport function injectParticle<TObject extends THREE.Object3D>(\n\tfn: NgtcGetByIndex<ParticleProps>,\n\topts?: NgtcBodyOptions<TObject>,\n) {\n\treturn injectBody('Particle', fn, () => [], opts);\n}\nexport function injectSphere<TObject extends THREE.Object3D>(\n\tfn: NgtcGetByIndex<SphereProps>,\n\topts?: NgtcBodyOptions<TObject>,\n) {\n\treturn injectBody(\n\t\t'Sphere',\n\t\tfn,\n\t\t(args: SphereArgs = [1]): SphereArgs => {\n\t\t\tif (!Array.isArray(args)) throw new Error('useSphere args must be an array');\n\t\t\treturn [args[0]];\n\t\t},\n\t\topts,\n\t);\n}\nexport function injectTrimesh<TObject extends THREE.Object3D>(\n\tfn: NgtcGetByIndex<TrimeshProps>,\n\topts?: NgtcBodyOptions<TObject>,\n) {\n\treturn injectBody('Trimesh', fn, (args) => args, opts);\n}\n\nexport function injectConvexPolyhedron<TObject extends THREE.Object3D>(\n\tfn: NgtcGetByIndex<ConvexPolyhedronProps>,\n\topts?: NgtcBodyOptions<TObject>,\n) {\n\treturn injectBody(\n\t\t'ConvexPolyhedron',\n\t\tfn,\n\t\t([vertices, faces, normals, axes, boundingSphereRadius] = []): ConvexPolyhedronArgs<Triplet> => [\n\t\t\tvertices && vertices.map(makeTriplet),\n\t\t\tfaces,\n\t\t\tnormals && normals.map(makeTriplet),\n\t\t\taxes && axes.map(makeTriplet),\n\t\t\tboundingSphereRadius,\n\t\t],\n\t\topts,\n\t);\n}\nexport function injectCompoundBody<TObject extends THREE.Object3D>(\n\tfn: NgtcGetByIndex<CompoundBodyProps>,\n\topts?: NgtcBodyOptions<TObject>,\n) {\n\treturn injectBody('Compound', fn, (args) => args as unknown[], opts);\n}\n\nfunction injectBody<TBodyProps extends BodyProps, TObject extends THREE.Object3D>(\n\ttype: BodyShapeType,\n\tgetPropsFn: NgtcGetByIndex<TBodyProps>,\n\targsFn: NgtcArgFn<TBodyProps['args']>,\n\t{ ref, injector, deps = () => ({}) }: NgtcBodyOptions<TObject> = {},\n): NgtcBodyReturn<TObject> {\n\tinjector = assertInjectionContext(injectBody, injector);\n\treturn runInInjectionContext(injector, () => {\n\t\tconst bodyRef = ref || injectNgtRef<TObject>();\n\n\t\tconst physicsApi = injectNgtcPhysicsApi();\n\t\tconst debugApi = injectNgtcDebugApi({ optional: true });\n\n\t\tconst { add: debugAdd, remove: debugRemove } = debugApi || {};\n\t\tconst { refs, subscriptions, scaleOverrides, events, bodies } = physicsApi.get();\n\t\tconst worker = physicsApi.select('worker');\n\n\t\teffect((onCleanup) => {\n\t\t\t// register deps\n\t\t\tdeps();\n\n\t\t\tconst currentWorker = worker();\n\t\t\tif (!currentWorker) return;\n\n\t\t\tif (!bodyRef.nativeElement) {\n\t\t\t\tbodyRef.nativeElement = new THREE.Object3D() as TObject;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst object = bodyRef.nativeElement;\n\n\t\t\tconst objectCount =\n\t\t\t\tobject instanceof THREE.InstancedMesh\n\t\t\t\t\t? (object.instanceMatrix.setUsage(THREE.DynamicDrawUsage), object.count)\n\t\t\t\t\t: 1;\n\n\t\t\tconst uuid =\n\t\t\t\tobject instanceof THREE.InstancedMesh\n\t\t\t\t\t? new Array(objectCount).fill(0).map((_, i) => `${object.uuid}/${i}`)\n\t\t\t\t\t: [object.uuid];\n\n\t\t\tconst props: (TBodyProps & { args: unknown })[] =\n\t\t\t\tobject instanceof THREE.InstancedMesh\n\t\t\t\t\t? uuid.map((id, i) => {\n\t\t\t\t\t\t\tconst props = getPropsFn(i);\n\t\t\t\t\t\t\tprepare(temp, props);\n\t\t\t\t\t\t\tobject.setMatrixAt(i, temp.matrix);\n\t\t\t\t\t\t\tobject.instanceMatrix.needsUpdate = true;\n\t\t\t\t\t\t\trefs[id] = object;\n\t\t\t\t\t\t\tdebugAdd?.(id, props, type);\n\t\t\t\t\t\t\tsetupCollision(events, props, id);\n\t\t\t\t\t\t\treturn { ...props, args: argsFn(props.args) };\n\t\t\t\t\t })\n\t\t\t\t\t: uuid.map((id, i) => {\n\t\t\t\t\t\t\tconst props = getPropsFn(i);\n\t\t\t\t\t\t\tprepare(object, props);\n\t\t\t\t\t\t\trefs[id] = object;\n\t\t\t\t\t\t\tdebugAdd?.(id, props, type);\n\t\t\t\t\t\t\tsetupCollision(events, props, id);\n\t\t\t\t\t\t\treturn { ...props, args: argsFn(props.args) };\n\t\t\t\t\t });\n\n\t\t\t// Register on mount, unregister on unmount\n\t\t\tcurrentWorker.addBodies({\n\t\t\t\tprops: props.map(({ onCollide, onCollideBegin, onCollideEnd, ...serializableProps }) => {\n\t\t\t\t\treturn { onCollide: Boolean(onCollide), ...serializableProps };\n\t\t\t\t}),\n\t\t\t\ttype,\n\t\t\t\tuuid,\n\t\t\t});\n\n\t\t\tonCleanup(() => {\n\t\t\t\tuuid.forEach((id) => {\n\t\t\t\t\tdelete refs[id];\n\t\t\t\t\tdebugRemove?.(id);\n\t\t\t\t\tdelete events[id];\n\t\t\t\t});\n\t\t\t\tcurrentWorker.removeBodies({ uuid });\n\t\t\t});\n\t\t});\n\n\t\tconst api = (() => {\n\t\t\tconst makeAtomic = <T extends AtomicName>(type: T, index?: number) => {\n\t\t\t\tconst op: SetOpName<T> = `set${capitalize(type)}`;\n\n\t\t\t\treturn {\n\t\t\t\t\tset: (value: PropValue<T>) => {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid &&\n\t\t\t\t\t\t\tworker()[op]({\n\t\t\t\t\t\t\t\tprops: value,\n\t\t\t\t\t\t\t\tuuid,\n\t\t\t\t\t\t\t} as never);\n\t\t\t\t\t},\n\t\t\t\t\tsubscribe: subscribe(bodyRef, worker(), subscriptions, type, index),\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst makeQuaternion = (index?: number) => {\n\t\t\t\tconst type = 'quaternion';\n\t\t\t\treturn {\n\t\t\t\t\tcopy: ({ w, x, y, z }: THREE.Quaternion) => {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().setQuaternion({ props: [x, y, z, w], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tset: (x: number, y: number, z: number, w: number) => {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().setQuaternion({ props: [x, y, z, w], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tsubscribe: subscribe(bodyRef, worker(), subscriptions, type, index),\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst makeRotation = (index?: number) => {\n\t\t\t\treturn {\n\t\t\t\t\tcopy: ({ x, y, z }: THREE.Vector3 | THREE.Euler) => {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().setRotation({ props: [x, y, z], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tset: (x: number, y: number, z: number) => {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().setRotation({ props: [x, y, z], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tsubscribe: (callback: (value: Triplet) => void) => {\n\t\t\t\t\t\tconst id = incrementingId++;\n\t\t\t\t\t\tconst target = 'bodies';\n\t\t\t\t\t\tconst type = 'quaternion';\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\n\t\t\t\t\t\tsubscriptions[id] = { [type]: quaternionToRotation(callback) };\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().subscribe({ props: { id, target, type }, uuid });\n\t\t\t\t\t\treturn () => {\n\t\t\t\t\t\t\tdelete subscriptions[id];\n\t\t\t\t\t\t\tworker().unsubscribe({ props: id });\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst makeVec = (type: VectorName, index?: number) => {\n\t\t\t\tconst op: SetOpName<VectorName> = `set${capitalize(type)}`;\n\t\t\t\treturn {\n\t\t\t\t\tcopy: ({ x, y, z }: THREE.Vector3 | THREE.Euler) => {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker()[op]({ props: [x, y, z], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tset: (x: number, y: number, z: number) => {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker()[op]({ props: [x, y, z], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tsubscribe: subscribe(bodyRef, worker(), subscriptions, type, index),\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst makeRemove = (index?: number) => {\n\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\treturn () => {\n\t\t\t\t\tif (uuid) worker().removeBodies({ uuid: [uuid] });\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tfunction makeApi(index?: number): NgtcWorkerApi {\n\t\t\t\treturn {\n\t\t\t\t\tallowSleep: makeAtomic('allowSleep', index),\n\t\t\t\t\tangularDamping: makeAtomic('angularDamping', index),\n\t\t\t\t\tangularFactor: makeVec('angularFactor', index),\n\t\t\t\t\tangularVelocity: makeVec('angularVelocity', index),\n\t\t\t\t\tapplyForce(force: Triplet, worldPoint: Triplet) {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().applyForce({ props: [force, worldPoint], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tapplyImpulse(impulse: Triplet, worldPoint: Triplet) {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().applyImpulse({ props: [impulse, worldPoint], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tapplyLocalForce(force: Triplet, localPoint: Triplet) {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().applyLocalForce({ props: [force, localPoint], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tapplyLocalImpulse(impulse: Triplet, localPoint: Triplet) {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid &&\n\t\t\t\t\t\t\tbodies[uuid] != null &&\n\t\t\t\t\t\t\tworker().applyLocalImpulse({ props: [impulse, localPoint], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tapplyTorque(torque: Triplet) {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().applyTorque({ props: [torque], uuid });\n\t\t\t\t\t},\n\t\t\t\t\tcollisionFilterGroup: makeAtomic('collisionFilterGroup', index),\n\t\t\t\t\tcollisionFilterMask: makeAtomic('collisionFilterMask', index),\n\t\t\t\t\tcollisionResponse: makeAtomic('collisionResponse', index),\n\t\t\t\t\tfixedRotation: makeAtomic('fixedRotation', index),\n\t\t\t\t\tisTrigger: makeAtomic('isTrigger', index),\n\t\t\t\t\tlinearDamping: makeAtomic('linearDamping', index),\n\t\t\t\t\tlinearFactor: makeVec('linearFactor', index),\n\t\t\t\t\tmass: makeAtomic('mass', index),\n\t\t\t\t\tmaterial: makeAtomic('material', index),\n\t\t\t\t\tposition: makeVec('position', index),\n\t\t\t\t\tquaternion: makeQuaternion(index),\n\t\t\t\t\trotation: makeRotation(index),\n\t\t\t\t\tscaleOverride(scale) {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tif (uuid) scaleOverrides[uuid] = new THREE.Vector3(...scale);\n\t\t\t\t\t},\n\t\t\t\t\tsleep() {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().sleep({ uuid });\n\t\t\t\t\t},\n\t\t\t\t\tsleepSpeedLimit: makeAtomic('sleepSpeedLimit', index),\n\t\t\t\t\tsleepTimeLimit: makeAtomic('sleepTimeLimit', index),\n\t\t\t\t\tuserData: makeAtomic('userData', index),\n\t\t\t\t\tvelocity: makeVec('velocity', index),\n\t\t\t\t\tremove: makeRemove(index),\n\t\t\t\t\twakeUp() {\n\t\t\t\t\t\tconst uuid = getUUID(bodyRef, index);\n\t\t\t\t\t\tuuid && bodies[uuid] != null && worker().wakeUp({ uuid });\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst cache: { [index: number]: NgtcWorkerApi } = {};\n\t\t\treturn {\n\t\t\t\t...makeApi(undefined),\n\t\t\t\tat: (index: number) => cache[index] || (cache[index] = makeApi(index)),\n\t\t\t};\n\t\t})();\n\n\t\treturn { ref: bodyRef, api };\n\t});\n}\n","import { effect, runInInjectionContext, untracked, type Injector } from '@angular/core';\nimport type {\n\tConstraintOptns,\n\tConstraintTypes,\n\tHingeConstraintOpts,\n\tPointToPointConstraintOpts,\n} from '@pmndrs/cannon-worker-api';\nimport {\n\tassertInjectionContext,\n\tinjectNgtRef,\n\tis,\n\tmakeId,\n\ttype NgtAnyRecord,\n\ttype NgtInjectedRef,\n} from 'angular-three';\nimport { injectNgtcPhysicsApi } from 'angular-three-cannon';\nimport * as THREE from 'three';\n\nexport type NgtcConstraintApi = {\n\tdisable: () => void;\n\tenable: () => void;\n\tremove: () => void;\n};\n\nexport type NgtcHingeConstraintApi = NgtcConstraintApi & {\n\tdisableMotor: () => void;\n\tenableMotor: () => void;\n\tsetMotorMaxForce: (value: number) => void;\n\tsetMotorSpeed: (value: number) => void;\n};\n\nexport type NgtcConstraintORHingeApi<T extends 'Hinge' | ConstraintTypes> = T extends ConstraintTypes\n\t? NgtcConstraintApi\n\t: NgtcHingeConstraintApi;\n\nexport type NgtcConstraintReturn<\n\tT extends 'Hinge' | ConstraintTypes,\n\tTObjectA extends THREE.Object3D = THREE.Object3D,\n\tTObjectB extends THREE.Object3D = THREE.Object3D,\n> = {\n\tbodyA: NgtInjectedRef<TObjectA>;\n\tbodyB: NgtInjectedRef<TObjectB>;\n\tapi: NgtcConstraintORHingeApi<T>;\n};\n\nexport type NgtcConstraintOptions<\n\tTConstraintType extends 'Hinge' | ConstraintTypes,\n\tTOptions extends HingeConstraintOpts | ConstraintOptns = TConstraintType extends 'Hinge'\n\t\t? HingeConstraintOpts\n\t\t: ConstraintOptns,\n> = { injector?: Injector; deps?: () => NgtAnyRecord; opts?: () => TOptions };\n\nexport function usePointToPointConstraint<A extends THREE.Object3D, B extends THREE.Object3D>(\n\tbodyA: NgtInjectedRef<A> | A,\n\tbodyB: NgtInjectedRef<B> | B,\n\topts?: NgtcConstraintOptions<'PointToPoint', PointToPointConstraintOpts>,\n) {\n\treturn injectConstraint('PointToPoint', bodyA, bodyB, opts);\n}\nexport function useConeTwistConstraint<A extends THREE.Object3D, B extends THREE.Object3D>(\n\tbodyA: NgtInjectedRef<A> | A,\n\tbodyB: NgtInjectedRef<B> | B,\n\topts?: NgtcConstraintOptions<'ConeTwist', PointToPointConstraintOpts>,\n) {\n\treturn injectConstraint('ConeTwist', bodyA, bodyB, opts);\n}\nexport function useDistanceConstraint<A extends THREE.Object3D, B extends THREE.Object3D>(\n\tbodyA: NgtInjectedRef<A> | A,\n\tbodyB: NgtInjectedRef<B> | B,\n\topts?: NgtcConstraintOptions<'Distance', PointToPointConstraintOpts>,\n) {\n\treturn injectConstraint('Distance', bodyA, bodyB, opts);\n}\nexport function useHingeConstraint<A extends THREE.Object3D, B extends THREE.Object3D>(\n\tbodyA: NgtInjectedRef<A> | A,\n\tbodyB: NgtInjectedRef<B> | B,\n\topts?: NgtcConstraintOptions<'Hinge', PointToPointConstraintOpts>,\n) {\n\treturn injectConstraint('Hinge', bodyA, bodyB, opts);\n}\nexport function useLockConstraint<A extends THREE.Object3D, B extends THREE.Object3D>(\n\tbodyA: NgtInjectedRef<A> | A,\n\tbodyB: NgtInjectedRef<B> | B,\n\topts?: NgtcConstraintOptions<'Lock', PointToPointConstraintOpts>,\n) {\n\treturn injectConstraint('Lock', bodyA, bodyB, opts);\n}\n\nfunction injectConstraint<\n\tTConstraintType extends 'Hinge' | ConstraintTypes,\n\tA extends THREE.Object3D,\n\tB extends THREE.Object3D,\n\tTOptions extends HingeConstraintOpts | ConstraintOptns = TConstraintType extends 'Hinge'\n\t\t? HingeConstraintOpts\n\t\t: ConstraintOptns,\n>(\n\ttype: TConstraintType,\n\tbodyA: NgtInjectedRef<A> | A,\n\tbodyB: NgtInjectedRef<B> | B,\n\t{\n\t\tinjector,\n\t\tdeps = () => ({}),\n\t\topts = () => ({}) as TOptions,\n\t}: NgtcConstraintOptions<TConstraintType, TOptions> = {},\n): NgtcConstraintReturn<TConstraintType, A, B> {\n\tinjector = assertInjectionContext(injectConstraint, injector);\n\treturn runInInjectionContext(injector, () => {\n\t\tconst physicsApi = injectNgtcPhysicsApi();\n\t\tconst worker = physicsApi.select('worker');\n\n\t\tconst uuid = makeId();\n\n\t\tconst bodyARef = is.ref(bodyA) ? bodyA : injectNgtRef(bodyA);\n\t\tconst bodyBRef = is.ref(bodyB) ? bodyB : injectNgtRef(bodyB);\n\n\t\teffect((onCleanup) => {\n\t\t\tdeps();\n\t\t\tif (bodyARef.nativeElement && bodyBRef.nativeElement) {\n\t\t\t\tworker().addConstraint({\n\t\t\t\t\tprops: [bodyARef.untracked.uuid, bodyBRef.untracked.uuid, untracked(opts)],\n\t\t\t\t\ttype,\n\t\t\t\t\tuuid,\n\t\t\t\t});\n\t\t\t\tonCleanup(() => worker().removeConstraint({ uuid }));\n\t\t\t}\n\t\t});\n\n\t\tconst api = (() => {\n\t\t\tconst enableDisable = {\n\t\t\t\tdisable: () => worker().disableConstraint({ uuid }),\n\t\t\t\tenable: () => worker().enableConstraint({ uuid }),\n\t\t\t\tremove: () => worker().removeConstraint({ uuid }),\n\t\t\t};\n\n\t\t\tif (type === 'Hinge') {\n\t\t\t\treturn {\n\t\t\t\t\t...enableDisable,\n\t\t\t\t\tdisableMotor: () => worker().disableConstraintMotor({ uuid }),\n\t\t\t\t\tenableMotor: () => worker().enableConstraintMotor({ uuid }),\n\t\t\t\t\tsetMotorMaxForce: (value: number) => worker().setConstraintMotorMaxForce({ props: value, uuid }),\n\t\t\t\t\tsetMotorSpeed: (value: number) => worker().setConstraintMotorSpeed({ props: value, uuid }),\n\t\t\t\t} as NgtcConstraintORHingeApi<TConstraintType>;\n\t\t\t}\n\n\t\t\treturn enableDisable as NgtcConstraintORHingeApi<TConstraintType>;\n\t\t})();\n\n\t\treturn { bodyA: bodyARef, bodyB: bodyBRef, api };\n\t});\n}\n","import { effect, runInInjectionContext, untracked, type Injector } from '@angular/core';\nimport type { ContactMaterialOptions, MaterialOptions } from '@pmndrs/cannon-worker-api';\nimport { assertInjectionContext, makeId, type NgtAnyRecord } from 'angular-three';\nimport { injectNgtcPhysicsApi } from 'angular-three-cannon';\n\nexport function injectContactMaterial(\n\tmaterialB: MaterialOptions,\n\tmaterialA: MaterialOptions,\n\t{\n\t\topts,\n\t\tdeps = () => ({}),\n\t\tinjector,\n\t}: { opts: () => ContactMaterialOptions; deps?: () => NgtAnyRecord; injector?: Injector },\n): void {\n\tinjector = assertInjectionContext(injectContactMaterial, injector);\n\treturn runInInjectionContext(injector, () => {\n\t\tconst physicsApi = injectNgtcPhysicsApi();\n\t\tconst worker = physicsApi.select('worker');\n\t\tconst uuid = makeId();\n\t\teffect((onCleanup) => {\n\t\t\tdeps();\n\t\t\tworker().addContactMaterial({\n\t\t\t\tprops: [materialA, materialB, untracked(opts)],\n\t\t\t\tuuid,\n\t\t\t});\n\t\t\tonCleanup(() => worker().removeContactMaterial({ uuid }));\n\t\t});\n\t});\n}\n","import { effect, runInInjectionContext, untracked, type Injector } from '@angular/core';\nimport type { RayMode, RayOptions, RayhitEvent } from '@pmndrs/cannon-worker-api';\nimport { assertInjectionContext, makeId, type NgtAnyRecord } from 'angular-three';\nimport { injectNgtcPhysicsApi } from 'angular-three-cannon';\n\nexport type NgtcRayOptions = {\n\toptions: () => RayOptions;\n\tcallback: (e: RayhitEvent) => void;\n\tinjector?: Injector;\n\tdeps?: () => NgtAnyRecord;\n};\n\nexport function injectRaycastClosest(opts: NgtcRayOptions) {\n\treturn injectRay('Closest', opts);\n}\n\nexport function injectRaycastAny(opts: NgtcRayOptions) {\n\treturn injectRay('Any', opts);\n}\n\nexport function useRaycastAll(opts: NgtcRayOptions) {\n\treturn injectRay('All', opts);\n}\n\nfunction injectRay(mode: RayMode, { options, callback, deps = () => ({}), injector }: NgtcRayOptions) {\n\tinjector = assertInjectionContext(injectRay, injector);\n\treturn runInInjectionContext(injector, () => {\n\t\tconst physicsApi = injectNgtcPhysicsApi();\n\t\tconst [worker, events] = [physicsApi.select('worker'), physicsApi.get('events')];\n\t\tconst uuid = makeId();\n\n\t\teffect((onCleanup) => {\n\t\t\tdeps();\n\t\t\tevents[uuid] = { rayhit: callback };\n\t\t\tworker().addRay({ props: { ...untracked(options), mode }, uuid });\n\t\t\tonCleanup(() => {\n\t\t\t\tworker().removeRay({ uuid });\n\t\t\t\tdelete events[uuid];\n\t\t\t});\n\t\t});\n\t});\n}\n","import { effect, runInInjectionContext, untracked, type Injector } from '@angular/core';\nimport type { WheelInfoOptions } from '@pmndrs/cannon-worker-api';\nimport { assertInjectionContext, injectNgtRef, type NgtAnyRecord, type NgtInjectedRef } from 'angular-three';\nimport { injectNgtcPhysicsApi } from 'angular-three-cannon';\nimport * as THREE from 'three';\nimport { getUUID, subscribe } from './body';\n\nfunction isString(v: unknown): v is string {\n\treturn typeof v === 'string';\n}\n\nexport type NgtcRaycastVehicleState = {\n\tchassisBody: NgtInjectedRef<THREE.Object3D>;\n\twheelInfos: WheelInfoOptions[];\n\twheels: Array<NgtInjectedRef<THREE.Object3D>>;\n\tindexForwardAxis?: number;\n\tindexRightAxis?: number;\n\tindexUpAxis?: number;\n};\n\nexport type NgtcRaycastVehiclePublicApi = {\n\tapplyEngineForce: (value: number, wheelIndex: number) => void;\n\tsetBrake: (brake: number, wheelIndex: number) => void;\n\tsetSteeringValue: (value: number, wheelIndex: number) => void;\n\tsliding: { subscribe: (callback: (sliding: boolean) => void) => void };\n\tremove: () => void;\n};\n\nexport type NgtcRaycastVehicleReturn<TObject extends THREE.Object3D = THREE.Object3D> = {\n\tref: NgtInjectedRef<TObject>;\n\tapi: NgtcRaycastVehiclePublicApi;\n};\n\nexport function injectRaycastVehicle<TObject extends THREE.Object3D = THREE.Object3D>(\n\tfn: () => NgtcRaycastVehicleState,\n\t{\n\t\tref,\n\t\tinjector,\n\t\tdeps = () => ({}),\n\t}: { ref?: NgtInjectedRef<TObject>; injector?: Injector; deps?: () => NgtAnyRecord } = {},\n): NgtcRaycastVehicleReturn<TObject> {\n\tinjector = assertInjectionContext(injectRaycastVehicle, injector);\n\treturn runInInjectionContext(injector, () => {\n\t\tconst physicsApi = injectNgtcPhysicsApi();\n\t\tconst [worker, subscriptions] = [physicsApi.select('worker'), physicsApi.get('subscriptions')];\n\n\t\tconst instanceRef = ref || injectNgtRef<TObject>();\n\n\t\teffect((onCleanup) => {\n\t\t\tdeps();\n\t\t\tif (!instanceRef.nativeElement) {\n\t\t\t\tinstanceRef.nativeElement = new THREE.Object3D() as TObject;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentWorker = worker();\n\t\t\tconst uuid: string = instanceRef.nativeElement.uuid;\n\t\t\tconst {\n\t\t\t\tchassisBody,\n\t\t\t\tindexForwardAxis = 2,\n\t\t\t\tindexRightAxis = 0,\n\t\t\t\tindexUpAxis = 1,\n\t\t\t\twheelInfos,\n\t\t\t\twheels,\n\t\t\t} = untracked(fn);\n\n\t\t\tconst chassisBodyUUID = getUUID(chassisBody);\n\t\t\tconst wheelUUIDs = wheels.map((ref) => getUUID(ref));\n\n\t\t\tif (!chassisBodyUUID || !wheelUUIDs.every(isString)) return;\n\n\t\t\tcurrentWorker.addRaycastVehicle({\n\t\t\t\tprops: [chassisBodyUUID, wheelUUIDs, wheelInfos, indexForwardAxis, indexRightAxis, indexUpAxis],\n\t\t\t\tuuid,\n\t\t\t});\n\t\t\tonCleanup(() => {\n\t\t\t\tcurrentWorker.removeRaycastVehicle({ uuid });\n\t\t\t});\n\t\t});\n\n\t\tconst api = (() => ({\n\t\t\tapplyEngineForce(value: number, wheelIndex: number) {\n\t\t\t\tconst uuid = getUUID(instanceRef);\n\t\t\t\tuuid &&\n\t\t\t\t\tworker().applyRaycastVehicleEngineForce({\n\t\t\t\t\t\tprops: [value, wheelIndex],\n\t\t\t\t\t\tuuid,\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tsetBrake(brake: number, wheelIndex: number) {\n\t\t\t\tconst uuid = getUUID(instanceRef);\n\t\t\t\tuuid && worker().setRaycastVehicleBrake({ props: [brake, wheelIndex], uuid });\n\t\t\t},\n\t\t\tsetSteeringValue(value: number, wheelIndex: number) {\n\t\t\t\tconst uuid = getUUID(instanceRef);\n\t\t\t\tuuid &&\n\t\t\t\t\tworker().setRaycastVehicleSteeringValue({\n\t\t\t\t\t\tprops: [value, wheelIndex],\n\t\t\t\t\t\tuuid,\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tsliding: {\n\t\t\t\tsubscribe: subscribe(instanceRef, worker(), subscriptions, 'sliding', undefined, 'vehicles'),\n\t\t\t},\n\n\t\t\tremove: () => {\n\t\t\t\tconst uuid = getUUID(instanceRef);\n\t\t\t\tuuid && worker().removeRaycastVehicle({ uuid });\n\t\t\t},\n\t\t}))();\n\n\t\treturn { ref: instanceRef, api };\n\t});\n}\n","import { effect, runInInjectionContext, untracked, type Injector } from '@angular/core';\nimport type { SpringOptns } from '@pmndrs/cannon-worker-api';\nimport {\n\tassertInjectionContext,\n\tinjectNgtRef,\n\tis,\n\tmakeId,\n\ttype NgtAnyRecord,\n\ttype NgtInjectedRef,\n} from 'angular-three';\nimport { injectNgtcPhysicsApi } from 'angular-three-cannon';\n\nexport type NgtcSpringApi = {\n\tsetDamping: (value: number) => void;\n\tsetRestLength: (value: number) => void;\n\tsetStiffness: (value: number) => void;\n\tremove: () => void;\n};\n\nexport type NgtcSpringReturn<\n\tTObjectA extends THREE.Object3D = THREE.Object3D,\n\tTObjectB extends THREE.Object3D = THREE.Object3D,\n> = {\n\tbodyA: NgtInjectedRef<TObjectA>;\n\tbodyB: NgtInjectedRef<TObjectB>;\n\tapi: NgtcSpringApi;\n};\n\nexport function injectSpring<A extends THREE.Object3D, B extends THREE.Object3D>(\n\tbodyA: NgtInjectedRef<A> | A,\n\tbodyB: NgtInjectedRef<B> | B,\n\t{\n\t\tinjector,\n\t\topts = () => ({}),\n\t\tdeps = () => ({}),\n\t}: { injector?: Injector; deps?: () => NgtAnyRecord; opts?: () => SpringOptns } = {},\n): NgtcSpringReturn<A, B> {\n\tinjector = assertInjectionContext(injectSpring, injector);\n\treturn runInInjectionContext(injector, () => {\n\t\tconst physicsApi = injectNgtcPhysicsApi();\n\t\tconst worker = physicsApi.select('worker');\n\n\t\tconst uuid = makeId();\n\n\t\tconst bodyARef = is.ref(bodyA) ? bodyA : injectNgtRef(bodyA);\n\t\tconst bodyBRef = is.ref(bodyB) ? bodyB : injectNgtRef(bodyB);\n\n\t\teffect((onCleanup) => {\n\t\t\tdeps();\n\t\t\tif (bodyARef.nativeElement && bodyBRef.nativeElement) {\n\t\t\t\tworker().addSpring({\n\t\t\t\t\tprops: [bodyARef.nativeElement.uuid, bodyBRef.nativeElement.uuid, untracked(opts)],\n\t\t\t\t\tuuid,\n\t\t\t\t});\n\t\t\t\tonCleanup(() => worker().removeSpring({ uuid }));\n\t\t\t}\n\t\t});\n\n\t\tconst api = (() => ({\n\t\t\tsetDamping: (value: number) => worker().setSpringDamping({ props: value, uuid }),\n\t\t\tsetRestLength: (value: number) => worker().setSpringRestLength({ props: value, uuid }),\n\t\t\tsetStiffness: (value: number) => worker().setSpringStiffness({ props: value, uuid }),\n\t\t\tremove: () => worker().removeSpring({ uuid }),\n\t\t}))();\n\n\t\treturn { bodyA: bodyARef, bodyB: bodyBRef, api };\n\t});\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}