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.
Files changed (49) hide show
  1. package/README.md +71 -4
  2. package/body/README.md +49 -0
  3. package/body/index.d.ts +2 -0
  4. package/body/lib/body.d.ts +17 -0
  5. package/body/lib/types.d.ts +49 -0
  6. package/body/lib/utils.d.ts +50 -0
  7. package/constraint/README.md +47 -0
  8. package/constraint/index.d.ts +1 -0
  9. package/constraint/lib/constraint.d.ts +32 -0
  10. package/debug/README.md +48 -2
  11. package/debug/lib/debug.d.ts +15 -33
  12. package/esm2022/body/angular-three-cannon-body.mjs +5 -0
  13. package/esm2022/body/index.mjs +2 -0
  14. package/esm2022/body/lib/body.mjs +108 -0
  15. package/esm2022/body/lib/types.mjs +2 -0
  16. package/esm2022/body/lib/utils.mjs +193 -0
  17. package/esm2022/constraint/angular-three-cannon-constraint.mjs +5 -0
  18. package/esm2022/constraint/index.mjs +2 -0
  19. package/esm2022/constraint/lib/constraint.mjs +67 -0
  20. package/esm2022/debug/lib/debug.mjs +56 -71
  21. package/esm2022/lib/physics.mjs +79 -176
  22. package/fesm2022/angular-three-cannon-body.mjs +306 -0
  23. package/fesm2022/angular-three-cannon-body.mjs.map +1 -0
  24. package/fesm2022/angular-three-cannon-constraint.mjs +74 -0
  25. package/fesm2022/angular-three-cannon-constraint.mjs.map +1 -0
  26. package/fesm2022/angular-three-cannon-debug.mjs +56 -71
  27. package/fesm2022/angular-three-cannon-debug.mjs.map +1 -1
  28. package/fesm2022/angular-three-cannon.mjs +79 -176
  29. package/fesm2022/angular-three-cannon.mjs.map +1 -1
  30. package/lib/physics.d.ts +31 -49
  31. package/package.json +25 -15
  32. package/esm2022/services/angular-three-cannon-services.mjs +0 -5
  33. package/esm2022/services/index.mjs +0 -7
  34. package/esm2022/services/lib/body.mjs +0 -293
  35. package/esm2022/services/lib/constraints.mjs +0 -58
  36. package/esm2022/services/lib/contact-material.mjs +0 -20
  37. package/esm2022/services/lib/ray.mjs +0 -30
  38. package/esm2022/services/lib/raycast-vehicle.mjs +0 -68
  39. package/esm2022/services/lib/spring.mjs +0 -31
  40. package/fesm2022/angular-three-cannon-services.mjs +0 -490
  41. package/fesm2022/angular-three-cannon-services.mjs.map +0 -1
  42. package/services/README.md +0 -3
  43. package/services/index.d.ts +0 -6
  44. package/services/lib/body.d.ts +0 -60
  45. package/services/lib/constraints.d.ts +0 -31
  46. package/services/lib/contact-material.d.ts +0 -9
  47. package/services/lib/ray.d.ts +0 -12
  48. package/services/lib/raycast-vehicle.d.ts +0 -30
  49. 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