angular-three-cannon 2.0.0-beta.9 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -4
- package/body/README.md +49 -0
- package/body/index.d.ts +2 -0
- package/body/lib/body.d.ts +17 -0
- package/body/lib/types.d.ts +49 -0
- package/body/lib/utils.d.ts +50 -0
- package/constraint/README.md +47 -0
- package/constraint/index.d.ts +1 -0
- package/constraint/lib/constraint.d.ts +32 -0
- package/debug/README.md +48 -2
- package/debug/lib/debug.d.ts +15 -33
- package/esm2022/body/angular-three-cannon-body.mjs +5 -0
- package/esm2022/body/index.mjs +2 -0
- package/esm2022/body/lib/body.mjs +108 -0
- package/esm2022/body/lib/types.mjs +2 -0
- package/esm2022/body/lib/utils.mjs +193 -0
- package/esm2022/constraint/angular-three-cannon-constraint.mjs +5 -0
- package/esm2022/constraint/index.mjs +2 -0
- package/esm2022/constraint/lib/constraint.mjs +67 -0
- package/esm2022/debug/lib/debug.mjs +56 -71
- package/esm2022/lib/physics.mjs +79 -176
- package/fesm2022/angular-three-cannon-body.mjs +306 -0
- package/fesm2022/angular-three-cannon-body.mjs.map +1 -0
- package/fesm2022/angular-three-cannon-constraint.mjs +74 -0
- package/fesm2022/angular-three-cannon-constraint.mjs.map +1 -0
- package/fesm2022/angular-three-cannon-debug.mjs +56 -71
- package/fesm2022/angular-three-cannon-debug.mjs.map +1 -1
- package/fesm2022/angular-three-cannon.mjs +79 -176
- package/fesm2022/angular-three-cannon.mjs.map +1 -1
- package/lib/physics.d.ts +31 -49
- package/package.json +25 -15
- 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 -58
- 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,68 +0,0 @@
|
|
|
1
|
-
import { effect, runInInjectionContext, untracked } from '@angular/core';
|
|
2
|
-
import { assertInjectionContext, injectNgtRef } from 'angular-three';
|
|
3
|
-
import { injectNgtcPhysicsApi } from 'angular-three-cannon';
|
|
4
|
-
import * as THREE from 'three';
|
|
5
|
-
import { getUUID, subscribe } from './body';
|
|
6
|
-
function isString(v) {
|
|
7
|
-
return typeof v === 'string';
|
|
8
|
-
}
|
|
9
|
-
export function injectRaycastVehicle(fn, { ref, injector, deps = () => ({}), } = {}) {
|
|
10
|
-
injector = assertInjectionContext(injectRaycastVehicle, injector);
|
|
11
|
-
return runInInjectionContext(injector, () => {
|
|
12
|
-
const physicsApi = injectNgtcPhysicsApi();
|
|
13
|
-
const [worker, subscriptions] = [physicsApi.select('worker'), physicsApi.get('subscriptions')];
|
|
14
|
-
const instanceRef = ref || injectNgtRef();
|
|
15
|
-
effect((onCleanup) => {
|
|
16
|
-
deps();
|
|
17
|
-
if (!instanceRef.nativeElement) {
|
|
18
|
-
instanceRef.nativeElement = new THREE.Object3D();
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
const currentWorker = worker();
|
|
22
|
-
const uuid = instanceRef.nativeElement.uuid;
|
|
23
|
-
const { chassisBody, indexForwardAxis = 2, indexRightAxis = 0, indexUpAxis = 1, wheelInfos, wheels, } = untracked(fn);
|
|
24
|
-
const chassisBodyUUID = getUUID(chassisBody);
|
|
25
|
-
const wheelUUIDs = wheels.map((ref) => getUUID(ref));
|
|
26
|
-
if (!chassisBodyUUID || !wheelUUIDs.every(isString))
|
|
27
|
-
return;
|
|
28
|
-
currentWorker.addRaycastVehicle({
|
|
29
|
-
props: [chassisBodyUUID, wheelUUIDs, wheelInfos, indexForwardAxis, indexRightAxis, indexUpAxis],
|
|
30
|
-
uuid,
|
|
31
|
-
});
|
|
32
|
-
onCleanup(() => {
|
|
33
|
-
currentWorker.removeRaycastVehicle({ uuid });
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
const api = (() => ({
|
|
37
|
-
applyEngineForce(value, wheelIndex) {
|
|
38
|
-
const uuid = getUUID(instanceRef);
|
|
39
|
-
uuid &&
|
|
40
|
-
worker().applyRaycastVehicleEngineForce({
|
|
41
|
-
props: [value, wheelIndex],
|
|
42
|
-
uuid,
|
|
43
|
-
});
|
|
44
|
-
},
|
|
45
|
-
setBrake(brake, wheelIndex) {
|
|
46
|
-
const uuid = getUUID(instanceRef);
|
|
47
|
-
uuid && worker().setRaycastVehicleBrake({ props: [brake, wheelIndex], uuid });
|
|
48
|
-
},
|
|
49
|
-
setSteeringValue(value, wheelIndex) {
|
|
50
|
-
const uuid = getUUID(instanceRef);
|
|
51
|
-
uuid &&
|
|
52
|
-
worker().setRaycastVehicleSteeringValue({
|
|
53
|
-
props: [value, wheelIndex],
|
|
54
|
-
uuid,
|
|
55
|
-
});
|
|
56
|
-
},
|
|
57
|
-
sliding: {
|
|
58
|
-
subscribe: subscribe(instanceRef, worker(), subscriptions, 'sliding', undefined, 'vehicles'),
|
|
59
|
-
},
|
|
60
|
-
remove: () => {
|
|
61
|
-
const uuid = getUUID(instanceRef);
|
|
62
|
-
uuid && worker().removeRaycastVehicle({ uuid });
|
|
63
|
-
},
|
|
64
|
-
}))();
|
|
65
|
-
return { ref: instanceRef, api };
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF5Y2FzdC12ZWhpY2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jYW5ub24vc2VydmljZXMvc3JjL2xpYi9yYXljYXN0LXZlaGljbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRXhGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxZQUFZLEVBQTBDLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRTVDLFNBQVMsUUFBUSxDQUFDLENBQVU7SUFDM0IsT0FBTyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUM7QUFDOUIsQ0FBQztBQXdCRCxNQUFNLFVBQVUsb0JBQW9CLENBQ25DLEVBQWlDLEVBQ2pDLEVBQ0MsR0FBRyxFQUNILFFBQVEsRUFDUixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFDcUUsRUFBRTtJQUV6RixRQUFRLEdBQUcsc0JBQXNCLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEUsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQzNDLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixFQUFFLENBQUM7UUFDMUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBRS9GLE1BQU0sV0FBVyxHQUFHLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FB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QUUsQ0FBQztRQUVOLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVmZmVjdCwgcnVuSW5JbmplY3Rpb25Db250ZXh0LCB1bnRyYWNrZWQsIHR5cGUgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgV2hlZWxJbmZvT3B0aW9ucyB9IGZyb20gJ0BwbW5kcnMvY2Fubm9uLXdvcmtlci1hcGknO1xuaW1wb3J0IHsgYXNzZXJ0SW5qZWN0aW9uQ29udGV4dCwgaW5qZWN0Tmd0UmVmLCB0eXBlIE5ndEFueVJlY29yZCwgdHlwZSBOZ3RJbmplY3RlZFJlZiB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0Y1BoeXNpY3NBcGkgfSBmcm9tICdhbmd1bGFyLXRocmVlLWNhbm5vbic7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBnZXRVVUlELCBzdWJzY3JpYmUgfSBmcm9tICcuL2JvZHknO1xuXG5mdW5jdGlvbiBpc1N0cmluZyh2OiB1bmtub3duKTogdiBpcyBzdHJpbmcge1xuXHRyZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnO1xufVxuXG5leHBvcnQgdHlwZSBOZ3RjUmF5Y2FzdFZlaGljbGVTdGF0ZSA9IHtcblx0Y2hhc3Npc0JvZHk6IE5ndEluamVjdGVkUmVmPFRIUkVFLk9iamVjdDNEPjtcblx0d2hlZWxJbmZvczogV2hlZWxJbmZvT3B0aW9uc1tdO1xuXHR3aGVlbHM6IEFycmF5PE5ndEluamVjdGVkUmVmPFRIUkVFLk9iamVjdDNEPj47XG5cdGluZGV4Rm9yd2FyZEF4aXM/OiBudW1iZXI7XG5cdGluZGV4UmlnaHRBeGlzPzogbnVtYmVyO1xuXHRpbmRleFVwQXhpcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndGNSYXljYXN0VmVoaWNsZVB1YmxpY0FwaSA9IHtcblx0YXBwbHlFbmdpbmVGb3JjZTogKHZhbHVlOiBudW1iZXIsIHdoZWVsSW5kZXg6IG51bWJlcikgPT4gdm9pZDtcblx0c2V0QnJha2U6IChicmFrZTogbnVtYmVyLCB3aGVlbEluZGV4OiBudW1iZXIpID0+IHZvaWQ7XG5cdHNldFN0ZWVyaW5nVmFsdWU6ICh2YWx1ZTogbnVtYmVyLCB3aGVlbEluZGV4OiBudW1iZXIpID0+IHZvaWQ7XG5cdHNsaWRpbmc6IHsgc3Vic2NyaWJlOiAoY2FsbGJhY2s6IChzbGlkaW5nOiBib29sZWFuKSA9PiB2b2lkKSA9PiB2b2lkIH07XG5cdHJlbW92ZTogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndGNSYXljYXN0VmVoaWNsZVJldHVybjxUT2JqZWN0IGV4dGVuZHMgVEhSRUUuT2JqZWN0M0QgPSBUSFJFRS5PYmplY3QzRD4gPSB7XG5cdHJlZjogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdD47XG5cdGFwaTogTmd0Y1JheWNhc3RWZWhpY2xlUHVibGljQXBpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFJheWNhc3RWZWhpY2xlPFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRCA9IFRIUkVFLk9iamVjdDNEPihcblx0Zm46ICgpID0+IE5ndGNSYXljYXN0VmVoaWNsZVN0YXRlLFxuXHR7XG5cdFx0cmVmLFxuXHRcdGluamVjdG9yLFxuXHRcdGRlcHMgPSAoKSA9PiAoe30pLFxuXHR9OiB7IHJlZj86IE5ndEluamVjdGVkUmVmPFRPYmplY3Q+OyBpbmplY3Rvcj86IEluamVjdG9yOyBkZXBzPzogKCkgPT4gTmd0QW55UmVjb3JkIH0gPSB7fSxcbik6IE5ndGNSYXljYXN0VmVoaWNsZVJldHVybjxUT2JqZWN0PiB7XG5cdGluamVjdG9yID0gYXNzZXJ0SW5qZWN0aW9uQ29udGV4dChpbmplY3RSYXljYXN0VmVoaWNsZSwgaW5qZWN0b3IpO1xuXHRyZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgcGh5c2ljc0FwaSA9IGluamVjdE5ndGNQaHlzaWNzQXBpKCk7XG5cdFx0Y29uc3QgW3dvcmtlciwgc3Vic2NyaXB0aW9uc10gPSBbcGh5c2ljc0FwaS5zZWxlY3QoJ3dvcmtlcicpLCBwaHlzaWNzQXBpLmdldCgnc3Vic2NyaXB0aW9ucycpXTtcblxuXHRcdGNvbnN0IGluc3RhbmNlUmVmID0gcmVmIHx8IGluamVjdE5ndFJlZjxUT2JqZWN0PigpO1xuXG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGRlcHMoKTtcblx0XHRcdGlmICghaW5zdGFuY2VSZWYubmF0aXZlRWxlbWVudCkge1xuXHRcdFx0XHRpbnN0YW5jZVJlZi5uYXRpdmVFbGVtZW50ID0gbmV3IFRIUkVFLk9iamVjdDNEKCkgYXMgVE9iamVjdDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjdXJyZW50V29ya2VyID0gd29ya2VyKCk7XG5cdFx0XHRjb25zdCB1dWlkOiBzdHJpbmcgPSBpbnN0YW5jZVJlZi5uYXRpdmVFbGVtZW50LnV1aWQ7XG5cdFx0XHRjb25zdCB7XG5cdFx0XHRcdGNoYXNzaXNCb2R5LFxuXHRcdFx0XHRpbmRleEZvcndhcmRBeGlzID0gMixcblx0XHRcdFx0aW5kZXhSaWdodEF4aXMgPSAwLFxuXHRcdFx0XHRpbmRleFVwQXhpcyA9IDEsXG5cdFx0XHRcdHdoZWVsSW5mb3MsXG5cdFx0XHRcdHdoZWVscyxcblx0XHRcdH0gPSB1bnRyYWNrZWQoZm4pO1xuXG5cdFx0XHRjb25zdCBjaGFzc2lzQm9keVVVSUQgPSBnZXRVVUlEKGNoYXNzaXNCb2R5KTtcblx0XHRcdGNvbnN0IHdoZWVsVVVJRHMgPSB3aGVlbHMubWFwKChyZWYpID0+IGdldFVVSUQocmVmKSk7XG5cblx0XHRcdGlmICghY2hhc3Npc0JvZHlVVUlEIHx8ICF3aGVlbFVVSURzLmV2ZXJ5KGlzU3RyaW5nKSkgcmV0dXJuO1xuXG5cdFx0XHRjdXJyZW50V29ya2VyLmFkZFJheWNhc3RWZWhpY2xlKHtcblx0XHRcdFx0cHJvcHM6IFtjaGFzc2lzQm9keVVVSUQsIHdoZWVsVVVJRHMsIHdoZWVsSW5mb3MsIGluZGV4Rm9yd2FyZEF4aXMsIGluZGV4UmlnaHRBeGlzLCBpbmRleFVwQXhpc10sXG5cdFx0XHRcdHV1aWQsXG5cdFx0XHR9KTtcblx0XHRcdG9uQ2xlYW51cCgoKSA9PiB7XG5cdFx0XHRcdGN1cnJlbnRXb3JrZXIucmVtb3ZlUmF5Y2FzdFZlaGljbGUoeyB1dWlkIH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBhcGkgPSAoKCkgPT4gKHtcblx0XHRcdGFwcGx5RW5naW5lRm9yY2UodmFsdWU6IG51bWJlciwgd2hlZWxJbmRleDogbnVtYmVyKSB7XG5cdFx0XHRcdGNvbnN0IHV1aWQgPSBnZXRVVUlEKGluc3RhbmNlUmVmKTtcblx0XHRcdFx0dXVpZCAmJlxuXHRcdFx0XHRcdHdvcmtlcigpLmFwcGx5UmF5Y2FzdFZlaGljbGVFbmdpbmVGb3JjZSh7XG5cdFx0XHRcdFx0XHRwcm9wczogW3ZhbHVlLCB3aGVlbEluZGV4XSxcblx0XHRcdFx0XHRcdHV1aWQsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0c2V0QnJha2UoYnJha2U6IG51bWJlciwgd2hlZWxJbmRleDogbnVtYmVyKSB7XG5cdFx0XHRcdGNvbnN0IHV1aWQgPSBnZXRVVUlEKGluc3RhbmNlUmVmKTtcblx0XHRcdFx0dXVpZCAmJiB3b3JrZXIoKS5zZXRSYXljYXN0VmVoaWNsZUJyYWtlKHsgcHJvcHM6IFticmFrZSwgd2hlZWxJbmRleF0sIHV1aWQgfSk7XG5cdFx0XHR9LFxuXHRcdFx0c2V0U3RlZXJpbmdWYWx1ZSh2YWx1ZTogbnVtYmVyLCB3aGVlbEluZGV4OiBudW1iZXIpIHtcblx0XHRcdFx0Y29uc3QgdXVpZCA9IGdldFVVSUQoaW5zdGFuY2VSZWYpO1xuXHRcdFx0XHR1dWlkICYmXG5cdFx0XHRcdFx0d29ya2VyKCkuc2V0UmF5Y2FzdFZlaGljbGVTdGVlcmluZ1ZhbHVlKHtcblx0XHRcdFx0XHRcdHByb3BzOiBbdmFsdWUsIHdoZWVsSW5kZXhdLFxuXHRcdFx0XHRcdFx0dXVpZCxcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRzbGlkaW5nOiB7XG5cdFx0XHRcdHN1YnNjcmliZTogc3Vic2NyaWJlKGluc3RhbmNlUmVmLCB3b3JrZXIoKSwgc3Vic2NyaXB0aW9ucywgJ3NsaWRpbmcnLCB1bmRlZmluZWQsICd2ZWhpY2xlcycpLFxuXHRcdFx0fSxcblxuXHRcdFx0cmVtb3ZlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHV1aWQgPSBnZXRVVUlEKGluc3RhbmNlUmVmKTtcblx0XHRcdFx0dXVpZCAmJiB3b3JrZXIoKS5yZW1vdmVSYXljYXN0VmVoaWNsZSh7IHV1aWQgfSk7XG5cdFx0XHR9LFxuXHRcdH0pKSgpO1xuXG5cdFx0cmV0dXJuIHsgcmVmOiBpbnN0YW5jZVJlZiwgYXBpIH07XG5cdH0pO1xufVxuIl19
|
|
@@ -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
|
-
if (!bodyRef.nativeElement) {
|
|
102
|
-
bodyRef.nativeElement = new THREE.Object3D();
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
const object = bodyRef.nativeElement;
|
|
106
|
-
const currentWorker = worker();
|
|
107
|
-
if (!currentWorker)
|
|
108
|
-
return;
|
|
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
|