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.
- package/body/README.md +3 -0
- package/body/index.d.ts +2 -0
- package/body/lib/body.d.ts +57 -0
- package/body/lib/types.d.ts +38 -0
- package/body/lib/utils.d.ts +50 -0
- package/constraint/README.md +3 -0
- package/constraint/index.d.ts +1 -0
- package/constraint/lib/constraint.d.ts +26 -0
- package/debug/lib/debug.d.ts +15 -14
- package/esm2022/body/angular-three-cannon-body.mjs +5 -0
- package/esm2022/body/index.mjs +2 -0
- package/esm2022/body/lib/body.mjs +83 -0
- package/esm2022/body/lib/types.mjs +2 -0
- package/esm2022/body/lib/utils.mjs +205 -0
- package/esm2022/constraint/angular-three-cannon-constraint.mjs +5 -0
- package/esm2022/constraint/index.mjs +2 -0
- package/esm2022/constraint/lib/constraint.mjs +50 -0
- package/esm2022/debug/lib/debug.mjs +34 -46
- package/esm2022/lib/physics.mjs +70 -153
- package/fesm2022/angular-three-cannon-body.mjs +292 -0
- package/fesm2022/angular-three-cannon-body.mjs.map +1 -0
- package/fesm2022/angular-three-cannon-constraint.mjs +57 -0
- package/fesm2022/angular-three-cannon-constraint.mjs.map +1 -0
- package/fesm2022/angular-three-cannon-debug.mjs +33 -45
- package/fesm2022/angular-three-cannon-debug.mjs.map +1 -1
- package/fesm2022/angular-three-cannon.mjs +70 -153
- package/fesm2022/angular-three-cannon.mjs.map +1 -1
- package/lib/physics.d.ts +50 -43
- package/package.json +19 -13
- package/esm2022/services/angular-three-cannon-services.mjs +0 -5
- package/esm2022/services/index.mjs +0 -7
- package/esm2022/services/lib/body.mjs +0 -293
- package/esm2022/services/lib/constraints.mjs +0 -59
- package/esm2022/services/lib/contact-material.mjs +0 -20
- package/esm2022/services/lib/ray.mjs +0 -30
- package/esm2022/services/lib/raycast-vehicle.mjs +0 -68
- package/esm2022/services/lib/spring.mjs +0 -31
- package/fesm2022/angular-three-cannon-services.mjs +0 -490
- package/fesm2022/angular-three-cannon-services.mjs.map +0 -1
- package/services/README.md +0 -3
- package/services/index.d.ts +0 -6
- package/services/lib/body.d.ts +0 -60
- package/services/lib/constraints.d.ts +0 -31
- package/services/lib/contact-material.d.ts +0 -9
- package/services/lib/ray.d.ts +0 -12
- package/services/lib/raycast-vehicle.d.ts +0 -30
- 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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"}
|