angular-three-rapier 4.0.0-next.115 → 4.0.0-next.118

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 CHANGED
@@ -1,7 +1,133 @@
1
- # rapier
1
+ # `angular-three-rapier`
2
2
 
3
- This library was generated with [Nx](https://nx.dev).
3
+ This library provides Rapier physics integration for Angular Three. [Rapier](https://rapier.rs/) is a fast, cross-platform physics engine written in Rust with JavaScript bindings.
4
4
 
5
- ## Running unit tests
5
+ ## Documentation
6
6
 
7
- Run `nx test rapier` to execute the unit tests.
7
+ All public APIs are documented with JSDoc comments. Your IDE will provide inline documentation, parameter hints, and examples as you code.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install angular-three-rapier @dimforge/rapier3d-compat
13
+ # yarn add angular-three-rapier @dimforge/rapier3d-compat
14
+ # pnpm add angular-three-rapier @dimforge/rapier3d-compat
15
+ ```
16
+
17
+ > Make sure to already have `angular-three` installed
18
+
19
+ ## Usage
20
+
21
+ ```typescript
22
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, viewChild, ElementRef } from '@angular/core';
23
+ import { NgtrPhysics, NgtrRigidBody, NgtrCuboidCollider } from 'angular-three-rapier';
24
+ import { Mesh } from 'three';
25
+
26
+ @Component({
27
+ selector: 'app-box',
28
+ template: `
29
+ <ngt-mesh ngtrRigidBody="dynamic" [position]="[0, 5, 0]">
30
+ <ngt-box-geometry />
31
+ <ngt-mesh-standard-material color="hotpink" />
32
+ </ngt-mesh>
33
+ `,
34
+ imports: [NgtrRigidBody],
35
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
36
+ })
37
+ export class Box {}
38
+
39
+ @Component({
40
+ selector: 'app-ground',
41
+ template: `
42
+ <ngt-mesh ngtrRigidBody="fixed" [position]="[0, -1, 0]">
43
+ <ngt-box-geometry [args]="[20, 1, 20]" />
44
+ <ngt-mesh-standard-material color="gray" />
45
+ </ngt-mesh>
46
+ `,
47
+ imports: [NgtrRigidBody],
48
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
49
+ })
50
+ export class Ground {}
51
+
52
+ @Component({
53
+ template: `
54
+ <ngtr-physics [options]="{ gravity: [0, -9.81, 0] }">
55
+ <app-box />
56
+ <app-ground />
57
+ </ngtr-physics>
58
+ `,
59
+ imports: [NgtrPhysics, Box, Ground],
60
+ })
61
+ export class SceneGraph {}
62
+ ```
63
+
64
+ ## Physics Options
65
+
66
+ | Property | Description | Default |
67
+ | ------------- | ----------------------------------------------- | --------------- |
68
+ | `gravity` | Gravity vector `[x, y, z]` | `[0, -9.81, 0]` |
69
+ | `colliders` | Default collider type for rigid bodies | `'cuboid'` |
70
+ | `paused` | Whether physics simulation is paused | `false` |
71
+ | `timeStep` | Fixed timestep for physics simulation | `1/60` |
72
+ | `debug` | Enable debug visualization | `false` |
73
+ | `interpolate` | Enable transform interpolation | `true` |
74
+ | `updateLoop` | Update loop type: `'follow'` or `'independent'` | `'follow'` |
75
+
76
+ ## Rigid Body Types
77
+
78
+ - `'dynamic'` - Affected by forces and collisions
79
+ - `'fixed'` - Static, immovable body
80
+ - `'kinematicPosition'` - Controlled by position, affects dynamic bodies
81
+ - `'kinematicVelocity'` - Controlled by velocity, affects dynamic bodies
82
+
83
+ ## Collider Types
84
+
85
+ Built-in collider directives:
86
+
87
+ - `NgtrCuboidCollider` - Box shape
88
+ - `NgtrBallCollider` - Sphere shape
89
+ - `NgtrCapsuleCollider` - Capsule shape
90
+ - `NgtrCylinderCollider` - Cylinder shape
91
+ - `NgtrConeCollider` - Cone shape
92
+ - `NgtrTrimeshCollider` - Triangle mesh (static only)
93
+ - `NgtrConvexHullCollider` - Convex hull
94
+ - `NgtrHeightfieldCollider` - Terrain heightfield
95
+
96
+ ## Joints
97
+
98
+ Create joints between rigid bodies:
99
+
100
+ ```typescript
101
+ import { fixedJoint, sphericalJoint, revoluteJoint, prismaticJoint } from 'angular-three-rapier';
102
+
103
+ // In your component
104
+ fixedJoint(bodyA, bodyB, {
105
+ body1Anchor: [0, 0, 0],
106
+ body2Anchor: [0, 1, 0],
107
+ });
108
+ ```
109
+
110
+ ## Debug Visualization
111
+
112
+ ```html
113
+ <ngtr-physics>
114
+ <ngtr-debug />
115
+ <!-- your physics objects -->
116
+ </ngtr-physics>
117
+ ```
118
+
119
+ ## Addons
120
+
121
+ ### Attractor
122
+
123
+ Apply gravitational or magnetic forces:
124
+
125
+ ```typescript
126
+ import { NgtrAttractor } from 'angular-three-rapier/addons';
127
+ ```
128
+
129
+ ```html
130
+ <ngt-mesh ngtrAttractor [options]="{ strength: 10, range: 20, type: 'linear' }">
131
+ <!-- attractor geometry -->
132
+ </ngt-mesh>
133
+ ```
@@ -8,6 +8,19 @@ import { assertInjector } from 'ngxtension/assert-injector';
8
8
  import { VertexNormalsHelper } from 'three-stdlib';
9
9
 
10
10
  const _v3 = new THREE.Vector3();
11
+ /**
12
+ * Creates debug visualization for an attractor.
13
+ * Shows a sphere at the attractor position with normals indicating the range.
14
+ * Blue indicates attraction, red indicates repulsion.
15
+ *
16
+ * This is automatically called by NgtrAttractor when physics debug mode is enabled.
17
+ *
18
+ * @param object - The Object3D representing the attractor position
19
+ * @param options - Getter function for attractor options
20
+ * @param injector - Optional injector for dependency injection context
21
+ *
22
+ * @internal
23
+ */
11
24
  function attractorDebug(object, options, injector) {
12
25
  return assertInjector(attractorDebug, injector, () => {
13
26
  const physics = inject(NgtrPhysics);
@@ -46,6 +59,12 @@ function attractorDebug(object, options, injector) {
46
59
  });
47
60
  }
48
61
 
62
+ /**
63
+ * Force calculation functions for different gravity types.
64
+ * - static: Constant force regardless of distance
65
+ * - linear: Force increases linearly as distance decreases
66
+ * - newtonian: Force follows Newton's law of universal gravitation
67
+ */
49
68
  const calcForceByType = {
50
69
  static: (s, m2, r, d, G) => s,
51
70
  linear: (s, m2, r, d, G) => s * (d / r),
@@ -53,6 +72,30 @@ const calcForceByType = {
53
72
  };
54
73
  const _position = new THREE.Vector3();
55
74
  const _vector3 = new THREE.Vector3();
75
+ /**
76
+ * Applies attractor force to a rigid body based on its distance from the attractor.
77
+ * Used internally by NgtrAttractor but can be called manually for custom behavior.
78
+ *
79
+ * @param rigidBody - The rigid body to apply the force to
80
+ * @param options - The attractor configuration including position, strength, and type
81
+ *
82
+ * @example
83
+ * ```typescript
84
+ * beforePhysicsStep((world) => {
85
+ * world.bodies.forEach((body) => {
86
+ * if (body.isDynamic()) {
87
+ * applyAttractorForceOnRigidBody(body, {
88
+ * object: attractorMesh,
89
+ * strength: 10,
90
+ * range: 20,
91
+ * type: 'newtonian',
92
+ * gravitationalConstant: 6.673e-11
93
+ * });
94
+ * }
95
+ * });
96
+ * });
97
+ * ```
98
+ */
56
99
  function applyAttractorForceOnRigidBody(rigidBody, { object, strength, range, gravitationalConstant, collisionGroups, type, }) {
57
100
  const rbPosition = rigidBody.translation();
58
101
  _position.set(rbPosition.x, rbPosition.y, rbPosition.z);
@@ -87,12 +130,38 @@ const defaultOptions = {
87
130
  type: 'static',
88
131
  gravitationalConstant: 6.673e-11,
89
132
  };
133
+ /**
134
+ * Directive that creates a gravitational attractor point in the physics world.
135
+ * All dynamic rigid bodies within range will be attracted (or repelled) towards this point.
136
+ *
137
+ * The attractor can use different gravity models:
138
+ * - Static: constant force
139
+ * - Linear: force increases as objects get closer
140
+ * - Newtonian: realistic inverse-square law
141
+ *
142
+ * @example
143
+ * ```html
144
+ * <!-- Simple attractor at origin -->
145
+ * <ngt-object3D attractor [options]="{ strength: 5, range: 20 }" />
146
+ *
147
+ * <!-- Repeller (negative strength) -->
148
+ * <ngt-object3D attractor [options]="{ strength: -10, range: 15 }" [position]="[5, 0, 0]" />
149
+ *
150
+ * <!-- Newtonian gravity -->
151
+ * <ngt-object3D attractor [options]="{
152
+ * strength: 1000,
153
+ * range: 50,
154
+ * type: 'newtonian',
155
+ * gravitationalConstant: 0.01
156
+ * }" />
157
+ * ```
158
+ */
90
159
  class NgtrAttractor {
91
160
  position = input([0, 0, 0], ...(ngDevMode ? [{ debugName: "position" }] : []));
92
- options = input(defaultOptions, ...(ngDevMode ? [{ debugName: "options", transform: mergeInputs(defaultOptions) }] : [{ transform: mergeInputs(defaultOptions) }]));
161
+ options = input(defaultOptions, { ...(ngDevMode ? { debugName: "options" } : {}), transform: mergeInputs(defaultOptions) });
93
162
  objectRef = inject(ElementRef);
94
163
  collisionGroups = pick(this.options, 'collisionGroups');
95
- linkedCollisionGroups = linkedSignal(this.collisionGroups);
164
+ linkedCollisionGroups = linkedSignal(this.collisionGroups, ...(ngDevMode ? [{ debugName: "linkedCollisionGroups" }] : []));
96
165
  constructor() {
97
166
  effect(() => {
98
167
  applyProps(this.objectRef.nativeElement, { position: this.position() });
@@ -115,8 +184,8 @@ class NgtrAttractor {
115
184
  });
116
185
  attractorDebug(this.objectRef.nativeElement, this.options);
117
186
  }
118
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: NgtrAttractor, deps: [], target: i0.ɵɵFactoryTarget.Directive });
119
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.1.7", type: NgtrAttractor, isStandalone: true, selector: "ngt-object3D[attractor]", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
187
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgtrAttractor, deps: [], target: i0.ɵɵFactoryTarget.Directive });
188
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.6", type: NgtrAttractor, isStandalone: true, selector: "ngt-object3D[attractor]", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
120
189
  {
121
190
  provide: COLLISION_GROUPS_HANDLER,
122
191
  useFactory: (attractor) => {
@@ -128,7 +197,7 @@ class NgtrAttractor {
128
197
  },
129
198
  ], ngImport: i0 });
130
199
  }
131
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: NgtrAttractor, decorators: [{
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgtrAttractor, decorators: [{
132
201
  type: Directive,
133
202
  args: [{
134
203
  selector: 'ngt-object3D[attractor]',
@@ -144,7 +213,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
144
213
  },
145
214
  ],
146
215
  }]
147
- }], ctorParameters: () => [] });
216
+ }], ctorParameters: () => [], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }] } });
148
217
 
149
218
  /**
150
219
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"angular-three-rapier-addons.mjs","sources":["../tmp-esm2022/addons/lib/attractor-debug.js","../tmp-esm2022/addons/lib/attractor.js","../tmp-esm2022/addons/angular-three-rapier-addons.js"],"sourcesContent":["import { computed, effect, inject } from '@angular/core';\nimport { beforeRender, injectStore, pick } from 'angular-three';\nimport { NgtrPhysics } from 'angular-three-rapier';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport * as THREE from 'three';\nimport { VertexNormalsHelper } from 'three-stdlib';\nconst _v3 = new THREE.Vector3();\nexport function attractorDebug(object, options, injector) {\n return assertInjector(attractorDebug, injector, () => {\n const physics = inject(NgtrPhysics);\n const store = injectStore();\n const strength = pick(options, 'strength');\n const range = pick(options, 'range');\n const color = computed(() => (strength() > 0 ? 0x0000ff : 0xff0000), ...(ngDevMode ? [{ debugName: \"color\" }] : []));\n let mesh;\n let normalsHelper;\n effect((onCleanup) => {\n if (!physics['debug']())\n return;\n mesh = new THREE.Mesh(new THREE.SphereGeometry(0.2, 6, 6), new THREE.MeshBasicMaterial({ color: color(), wireframe: true }));\n normalsHelper = new VertexNormalsHelper(mesh, range(), color());\n normalsHelper.frustumCulled = false;\n store.snapshot.scene.add(mesh);\n store.snapshot.scene.add(normalsHelper);\n onCleanup(() => {\n if (mesh) {\n store.snapshot.scene.remove(mesh);\n }\n if (normalsHelper) {\n store.snapshot.scene.remove(normalsHelper);\n }\n });\n });\n beforeRender(() => {\n if (!physics['debug']())\n return;\n if (mesh) {\n const worldPosition = object.getWorldPosition(_v3);\n mesh.position.copy(worldPosition);\n normalsHelper?.update();\n }\n });\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmFjdG9yLWRlYnVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9yYXBpZXIvYWRkb25zL3NyYy9saWIvYXR0cmFjdG9yLWRlYnVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7QUFFaEMsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUFzQixFQUFFLE9BQWtDLEVBQUUsUUFBbUI7SUFDN0csT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDcEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBRTVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGlEQUFDLENBQUM7UUFFckUsSUFBSSxJQUFnQixDQUFDO1FBQ3JCLElBQUksYUFBa0MsQ0FBQztRQUV2QyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUFFLE9BQU87WUFFaEMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FDcEIsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ25DLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUNoRSxDQUFDO1lBRUYsYUFBYSxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEUsYUFBYSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFFcEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUV4QyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ1YsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO2dCQUVELElBQUksYUFBYSxFQUFFLENBQUM7b0JBQ25CLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztZQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxZQUFZLENBQUMsR0FBRyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQUUsT0FBTztZQUVoQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNWLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN6QixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBiZWZvcmVSZW5kZXIsIGluamVjdFN0b3JlLCBwaWNrIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBOZ3RyUGh5c2ljcyB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtcmFwaWVyJztcbmltcG9ydCB7IGFzc2VydEluamVjdG9yIH0gZnJvbSAnbmd4dGVuc2lvbi9hc3NlcnQtaW5qZWN0b3InO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgVmVydGV4Tm9ybWFsc0hlbHBlciB9IGZyb20gJ3RocmVlLXN0ZGxpYic7XG5pbXBvcnQgeyBOZ3RyQXR0YWN0b3JPcHRpb25zIH0gZnJvbSAnLi9hdHRyYWN0b3InO1xuXG5jb25zdCBfdjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG5leHBvcnQgZnVuY3Rpb24gYXR0cmFjdG9yRGVidWcob2JqZWN0OiBUSFJFRS5PYmplY3QzRCwgb3B0aW9uczogKCkgPT4gTmd0ckF0dGFjdG9yT3B0aW9ucywgaW5qZWN0b3I/OiBJbmplY3Rvcikge1xuXHRyZXR1cm4gYXNzZXJ0SW5qZWN0b3IoYXR0cmFjdG9yRGVidWcsIGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgcGh5c2ljcyA9IGluamVjdChOZ3RyUGh5c2ljcyk7XG5cdFx0Y29uc3Qgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXG5cdFx0Y29uc3Qgc3RyZW5ndGggPSBwaWNrKG9wdGlvbnMsICdzdHJlbmd0aCcpO1xuXHRcdGNvbnN0IHJhbmdlID0gcGljayhvcHRpb25zLCAncmFuZ2UnKTtcblx0XHRjb25zdCBjb2xvciA9IGNvbXB1dGVkKCgpID0+IChzdHJlbmd0aCgpID4gMCA/IDB4MDAwMGZmIDogMHhmZjAwMDApKTtcblxuXHRcdGxldCBtZXNoOiBUSFJFRS5NZXNoO1xuXHRcdGxldCBub3JtYWxzSGVscGVyOiBWZXJ0ZXhOb3JtYWxzSGVscGVyO1xuXG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGlmICghcGh5c2ljc1snZGVidWcnXSgpKSByZXR1cm47XG5cblx0XHRcdG1lc2ggPSBuZXcgVEhSRUUuTWVzaChcblx0XHRcdFx0bmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDAuMiwgNiwgNiksXG5cdFx0XHRcdG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiBjb2xvcigpLCB3aXJlZnJhbWU6IHRydWUgfSksXG5cdFx0XHQpO1xuXG5cdFx0XHRub3JtYWxzSGVscGVyID0gbmV3IFZlcnRleE5vcm1hbHNIZWxwZXIobWVzaCwgcmFuZ2UoKSwgY29sb3IoKSk7XG5cdFx0XHRub3JtYWxzSGVscGVyLmZydXN0dW1DdWxsZWQgPSBmYWxzZTtcblxuXHRcdFx0c3RvcmUuc25hcHNob3Quc2NlbmUuYWRkKG1lc2gpO1xuXHRcdFx0c3RvcmUuc25hcHNob3Quc2NlbmUuYWRkKG5vcm1hbHNIZWxwZXIpO1xuXG5cdFx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0XHRpZiAobWVzaCkge1xuXHRcdFx0XHRcdHN0b3JlLnNuYXBzaG90LnNjZW5lLnJlbW92ZShtZXNoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChub3JtYWxzSGVscGVyKSB7XG5cdFx0XHRcdFx0c3RvcmUuc25hcHNob3Quc2NlbmUucmVtb3ZlKG5vcm1hbHNIZWxwZXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGJlZm9yZVJlbmRlcigoKSA9PiB7XG5cdFx0XHRpZiAoIXBoeXNpY3NbJ2RlYnVnJ10oKSkgcmV0dXJuO1xuXG5cdFx0XHRpZiAobWVzaCkge1xuXHRcdFx0XHRjb25zdCB3b3JsZFBvc2l0aW9uID0gb2JqZWN0LmdldFdvcmxkUG9zaXRpb24oX3YzKTtcblx0XHRcdFx0bWVzaC5wb3NpdGlvbi5jb3B5KHdvcmxkUG9zaXRpb24pO1xuXHRcdFx0XHRub3JtYWxzSGVscGVyPy51cGRhdGUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG4iXX0=","import { Directive, effect, ElementRef, inject, input, linkedSignal, untracked } from '@angular/core';\nimport { applyProps, pick } from 'angular-three';\nimport { beforePhysicsStep, COLLISION_GROUPS_HANDLER } from 'angular-three-rapier';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport * as THREE from 'three';\nimport { attractorDebug } from './attractor-debug';\nimport * as i0 from \"@angular/core\";\nconst calcForceByType = {\n static: (s, m2, r, d, G) => s,\n linear: (s, m2, r, d, G) => s * (d / r),\n newtonian: (s, m2, r, d, G) => (G * s * m2) / Math.pow(d, 2),\n};\nconst _position = new THREE.Vector3();\nconst _vector3 = new THREE.Vector3();\nexport function applyAttractorForceOnRigidBody(rigidBody, { object, strength, range, gravitationalConstant, collisionGroups, type, }) {\n const rbPosition = rigidBody.translation();\n _position.set(rbPosition.x, rbPosition.y, rbPosition.z);\n const worldPosition = object.getWorldPosition(new THREE.Vector3());\n const distance = worldPosition.distanceTo(_position);\n if (distance < range) {\n let force = calcForceByType[type](strength, rigidBody.mass(), range, distance, gravitationalConstant);\n // Prevent wild forces when Attractors collide\n force = force === Infinity ? strength : force;\n // Naively test if the rigidBody contains a collider in one of the collision groups\n let isRigidBodyInCollisionGroup = collisionGroups === undefined;\n if (collisionGroups !== undefined) {\n for (let i = 0; i < rigidBody.numColliders(); i++) {\n const collider = rigidBody.collider(i);\n const colliderCollisionGroups = collider.collisionGroups();\n if (((collisionGroups >> 16) & colliderCollisionGroups) != 0 &&\n ((colliderCollisionGroups >> 16) & collisionGroups) != 0) {\n isRigidBodyInCollisionGroup = true;\n break;\n }\n }\n }\n if (isRigidBodyInCollisionGroup) {\n _vector3.set(0, 0, 0).subVectors(worldPosition, _position).normalize().multiplyScalar(force);\n rigidBody.applyImpulse(_vector3, true);\n }\n }\n}\nconst defaultOptions = {\n strength: 1,\n range: 10,\n type: 'static',\n gravitationalConstant: 6.673e-11,\n};\nexport class NgtrAttractor {\n position = input([0, 0, 0], ...(ngDevMode ? [{ debugName: \"position\" }] : []));\n options = input(defaultOptions, ...(ngDevMode ? [{ debugName: \"options\", transform: mergeInputs(defaultOptions) }] : [{ transform: mergeInputs(defaultOptions) }]));\n objectRef = inject(ElementRef);\n collisionGroups = pick(this.options, 'collisionGroups');\n linkedCollisionGroups = linkedSignal(this.collisionGroups);\n constructor() {\n effect(() => {\n applyProps(this.objectRef.nativeElement, { position: this.position() });\n });\n beforePhysicsStep((world) => {\n const { strength, range, type, gravitationalConstant } = untracked(this.options);\n const collisionGroups = untracked(this.linkedCollisionGroups);\n world.bodies.forEach((body) => {\n if (body.isDynamic()) {\n applyAttractorForceOnRigidBody(body, {\n object: this.objectRef.nativeElement,\n strength,\n range,\n type,\n gravitationalConstant,\n collisionGroups,\n });\n }\n });\n });\n attractorDebug(this.objectRef.nativeElement, this.options);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: NgtrAttractor, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"17.1.0\", version: \"20.1.7\", type: NgtrAttractor, isStandalone: true, selector: \"ngt-object3D[attractor]\", inputs: { position: { classPropertyName: \"position\", publicName: \"position\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, providers: [\n {\n provide: COLLISION_GROUPS_HANDLER,\n useFactory: (attractor) => {\n return () => (interactionGroups) => {\n attractor.linkedCollisionGroups.set(interactionGroups);\n };\n },\n deps: [NgtrAttractor],\n },\n ], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: NgtrAttractor, decorators: [{\n type: Directive,\n args: [{\n selector: 'ngt-object3D[attractor]',\n providers: [\n {\n provide: COLLISION_GROUPS_HANDLER,\n useFactory: (attractor) => {\n return () => (interactionGroups) => {\n attractor.linkedCollisionGroups.set(interactionGroups);\n };\n },\n deps: [NgtrAttractor],\n },\n ],\n }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9yYXBpZXIvYWRkb25zL3NyYy9saWIvYXR0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEcsT0FBTyxFQUFFLFVBQVUsRUFBYyxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFbkQsTUFBTSxlQUFlLEdBQUc7SUFDdkIsTUFBTSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQVUsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRSxNQUFNLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBVSxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9FLFNBQVMsRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDcEcsQ0FBQztBQUVGLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBRXJDLE1BQU0sVUFBVSw4QkFBOEIsQ0FDN0MsU0FBb0IsRUFDcEIsRUFDQyxNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxxQkFBcUIsRUFDckIsZUFBZSxFQUNmLElBQUksR0FDOEM7SUFFbkQsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzNDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV4RCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUVuRSxNQUFNLFFBQVEsR0FBVyxhQUFhLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTdELElBQUksUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQ3RCLElBQUksS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUV0Ryw4Q0FBOEM7UUFDOUMsS0FBSyxHQUFHLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBRTlDLG1GQUFtRjtRQUNuRixJQUFJLDJCQUEyQixHQUFHLGVBQWUsS0FBSyxTQUFTLENBQUM7UUFDaEUsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNuRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDM0QsSUFDQyxDQUFDLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQztvQkFDeEQsQ0FBQyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFDdkQsQ0FBQztvQkFDRiwyQkFBMkIsR0FBRyxJQUFJLENBQUM7b0JBQ25DLE1BQU07Z0JBQ1AsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO1FBRUQsSUFBSSwyQkFBMkIsRUFBRSxDQUFDO1lBQ2pDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU3RixTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0YsQ0FBQztBQUNGLENBQUM7QUEwQ0QsTUFBTSxjQUFjLEdBQXdCO0lBQzNDLFFBQVEsRUFBRSxDQUFDO0lBQ1gsS0FBSyxFQUFFLEVBQUU7SUFDVCxJQUFJLEVBQUUsUUFBUTtJQUNkLHFCQUFxQixFQUFFLFNBQVM7Q0FDaEMsQ0FBQztBQWdCRixNQUFNLE9BQU8sYUFBYTtJQUN6QixRQUFRLEdBQUcsS0FBSyxDQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsb0RBQUMsQ0FBQztJQUN4QyxPQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsMkNBQUksU0FBUyxFQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUMsT0FBeEMsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEdBQUMsQ0FBQztJQUVwRSxTQUFTLEdBQUcsTUFBTSxDQUE2QixVQUFVLENBQUMsQ0FBQztJQUMzRCxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNoRSxxQkFBcUIsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRTNEO1FBQ0MsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNYLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMzQixNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUM5RCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM3QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO29CQUN0Qiw4QkFBOEIsQ0FBQyxJQUFJLEVBQUU7d0JBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWE7d0JBQ3BDLFFBQVE7d0JBQ1IsS0FBSzt3QkFDTCxJQUFJO3dCQUNKLHFCQUFxQjt3QkFDckIsZUFBZTtxQkFDZixDQUFDLENBQUM7Z0JBQ0osQ0FBQztZQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVELENBQUM7dUdBL0JXLGFBQWE7MkZBQWIsYUFBYSxpVkFaZDtZQUNWO2dCQUNDLE9BQU8sRUFBRSx3QkFBd0I7Z0JBQ2pDLFVBQVUsRUFBRSxDQUFDLFNBQXdCLEVBQUUsRUFBRTtvQkFDeEMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGlCQUFvQyxFQUFFLEVBQUU7d0JBQ3JELFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDeEQsQ0FBQyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDO2FBQ3JCO1NBQ0Q7OzJGQUVXLGFBQWE7a0JBZHpCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsU0FBUyxFQUFFO3dCQUNWOzRCQUNDLE9BQU8sRUFBRSx3QkFBd0I7NEJBQ2pDLFVBQVUsRUFBRSxDQUFDLFNBQXdCLEVBQUUsRUFBRTtnQ0FDeEMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGlCQUFvQyxFQUFFLEVBQUU7b0NBQ3JELFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQ0FDeEQsQ0FBQyxDQUFDOzRCQUNILENBQUM7NEJBQ0QsSUFBSSxFQUFFLGVBQWU7eUJBQ3JCO3FCQUNEO2lCQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIGxpbmtlZFNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbkdyb3VwcywgUmlnaWRCb2R5IH0gZnJvbSAnQGRpbWZvcmdlL3JhcGllcjNkLWNvbXBhdCc7XG5pbXBvcnQgeyBhcHBseVByb3BzLCBOZ3RWZWN0b3IzLCBwaWNrIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBiZWZvcmVQaHlzaWNzU3RlcCwgQ09MTElTSU9OX0dST1VQU19IQU5ETEVSIH0gZnJvbSAnYW5ndWxhci10aHJlZS1yYXBpZXInO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgYXR0cmFjdG9yRGVidWcgfSBmcm9tICcuL2F0dHJhY3Rvci1kZWJ1Zyc7XG5cbmNvbnN0IGNhbGNGb3JjZUJ5VHlwZSA9IHtcblx0c3RhdGljOiAoczogbnVtYmVyLCBtMjogbnVtYmVyLCByOiBudW1iZXIsIGQ6IG51bWJlciwgRzogbnVtYmVyKSA9PiBzLFxuXHRsaW5lYXI6IChzOiBudW1iZXIsIG0yOiBudW1iZXIsIHI6IG51bWJlciwgZDogbnVtYmVyLCBHOiBudW1iZXIpID0+IHMgKiAoZCAvIHIpLFxuXHRuZXd0b25pYW46IChzOiBudW1iZXIsIG0yOiBudW1iZXIsIHI6IG51bWJlciwgZDogbnVtYmVyLCBHOiBudW1iZXIpID0+IChHICogcyAqIG0yKSAvIE1hdGgucG93KGQsIDIpLFxufTtcblxuY29uc3QgX3Bvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbmNvbnN0IF92ZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXR0cmFjdG9yRm9yY2VPblJpZ2lkQm9keShcblx0cmlnaWRCb2R5OiBSaWdpZEJvZHksXG5cdHtcblx0XHRvYmplY3QsXG5cdFx0c3RyZW5ndGgsXG5cdFx0cmFuZ2UsXG5cdFx0Z3Jhdml0YXRpb25hbENvbnN0YW50LFxuXHRcdGNvbGxpc2lvbkdyb3Vwcyxcblx0XHR0eXBlLFxuXHR9OiBOZ3RyQXR0YWN0b3JPcHRpb25zICYgeyBvYmplY3Q6IFRIUkVFLk9iamVjdDNEIH0sXG4pIHtcblx0Y29uc3QgcmJQb3NpdGlvbiA9IHJpZ2lkQm9keS50cmFuc2xhdGlvbigpO1xuXHRfcG9zaXRpb24uc2V0KHJiUG9zaXRpb24ueCwgcmJQb3NpdGlvbi55LCByYlBvc2l0aW9uLnopO1xuXG5cdGNvbnN0IHdvcmxkUG9zaXRpb24gPSBvYmplY3QuZ2V0V29ybGRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKTtcblxuXHRjb25zdCBkaXN0YW5jZTogbnVtYmVyID0gd29ybGRQb3NpdGlvbi5kaXN0YW5jZVRvKF9wb3NpdGlvbik7XG5cblx0aWYgKGRpc3RhbmNlIDwgcmFuZ2UpIHtcblx0XHRsZXQgZm9yY2UgPSBjYWxjRm9yY2VCeVR5cGVbdHlwZV0oc3RyZW5ndGgsIHJpZ2lkQm9keS5tYXNzKCksIHJhbmdlLCBkaXN0YW5jZSwgZ3Jhdml0YXRpb25hbENvbnN0YW50KTtcblxuXHRcdC8vIFByZXZlbnQgd2lsZCBmb3JjZXMgd2hlbiBBdHRyYWN0b3JzIGNvbGxpZGVcblx0XHRmb3JjZSA9IGZvcmNlID09PSBJbmZpbml0eSA/IHN0cmVuZ3RoIDogZm9yY2U7XG5cblx0XHQvLyBOYWl2ZWx5IHRlc3QgaWYgdGhlIHJpZ2lkQm9keSBjb250YWlucyBhIGNvbGxpZGVyIGluIG9uZSBvZiB0aGUgY29sbGlzaW9uIGdyb3Vwc1xuXHRcdGxldCBpc1JpZ2lkQm9keUluQ29sbGlzaW9uR3JvdXAgPSBjb2xsaXNpb25Hcm91cHMgPT09IHVuZGVmaW5lZDtcblx0XHRpZiAoY29sbGlzaW9uR3JvdXBzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmlnaWRCb2R5Lm51bUNvbGxpZGVycygpOyBpKyspIHtcblx0XHRcdFx0Y29uc3QgY29sbGlkZXIgPSByaWdpZEJvZHkuY29sbGlkZXIoaSk7XG5cdFx0XHRcdGNvbnN0IGNvbGxpZGVyQ29sbGlzaW9uR3JvdXBzID0gY29sbGlkZXIuY29sbGlzaW9uR3JvdXBzKCk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQoKGNvbGxpc2lvbkdyb3VwcyA+PiAxNikgJiBjb2xsaWRlckNvbGxpc2lvbkdyb3VwcykgIT0gMCAmJlxuXHRcdFx0XHRcdCgoY29sbGlkZXJDb2xsaXNpb25Hcm91cHMgPj4gMTYpICYgY29sbGlzaW9uR3JvdXBzKSAhPSAwXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGlzUmlnaWRCb2R5SW5Db2xsaXNpb25Hcm91cCA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNSaWdpZEJvZHlJbkNvbGxpc2lvbkdyb3VwKSB7XG5cdFx0XHRfdmVjdG9yMy5zZXQoMCwgMCwgMCkuc3ViVmVjdG9ycyh3b3JsZFBvc2l0aW9uLCBfcG9zaXRpb24pLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGZvcmNlKTtcblxuXHRcdFx0cmlnaWRCb2R5LmFwcGx5SW1wdWxzZShfdmVjdG9yMywgdHJ1ZSk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCB0eXBlIE5ndHJBdHRyYWN0b3JHcmF2aXR5VHlwZSA9ICdzdGF0aWMnIHwgJ2xpbmVhcicgfCAnbmV3dG9uaWFuJztcbmV4cG9ydCBpbnRlcmZhY2UgTmd0ckF0dGFjdG9yT3B0aW9ucyB7XG5cdC8qKlxuXHQgKiBUaGUgc3RyZW5ndGggb2YgdGhlIGF0dHJhY3Rvci5cblx0ICogUG9zaXRpdmUgdmFsdWVzIGF0dHJhY3QsIG5lZ2F0aXZlIHZhbHVlcyByZXBlbC5cblx0ICpcblx0ICogQGRlZmF1bHRWYWx1ZSAxXG5cdCAqL1xuXHRzdHJlbmd0aDogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgcmFuZ2Ugb2YgdGhlIGF0dHJhY3Rvci4gV2lsbCBub3QgYWZmZWN0IG9iamVjdHMgb3V0c2lkZSBvZiB0aGlzIHJhbmdlLlxuXHQgKlxuXHQgKiBAZGVmYXVsdFZhbHVlIDEwXG5cdCAqIEBtaW4gMFxuXHQgKi9cblx0cmFuZ2U6IG51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgZ3Jhdml0eSB0byB1c2UuXG5cdCAqIC0gc3RhdGljOiBUaGUgZ3Jhdml0eSBpcyBjb25zdGFudCBhbmQgZG9lcyBub3QgY2hhbmdlIG92ZXIgdGltZS5cblx0ICogLSBsaW5lYXI6IFRoZSBncmF2aXR5IGlzIGxpbmVhcmx5IGludGVycG9sYXRlZCB0aGUgY2xvc2VyIHRoZSBvYmplY3QgaXMgdG8gdGhlIGF0dHJhY3Rvci5cblx0ICogLSBuZXd0b25pYW46IFRoZSBncmF2aXR5IGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIG5ld3RvbmlhbiBncmF2aXR5IGZvcm11bGEuXG5cdCAqIEBkZWZhdWx0VmFsdWUgXCJzdGF0aWNcIlxuXHQgKi9cblx0dHlwZTogTmd0ckF0dHJhY3RvckdyYXZpdHlUeXBlO1xuXG5cdC8qKlxuXHQgKiBUaGUgbWFzcyBvZiB0aGUgYXR0cmFjdG9yLiBVc2VkIHdoZW4gdHlwZSBpcyBgbmV3dG9uaWFuYC5cblx0ICogQGRlZmF1bHRWYWx1ZSA2LjY3M2UtMTFcblx0ICovXG5cdGdyYXZpdGF0aW9uYWxDb25zdGFudDogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgY29sbGlzaW9uIGdyb3VwcyB0aGF0IHRoaXMgYXR0cmFjdG9yIHdpbGwgYXBwbHkgZWZmZWN0cyB0by4gSWYgYSBSaWdpZEJvZHkgY29udGFpbnMgb25lIG9yIG1vcmUgY29sbGlkZXJzIHRoYXQgYXJlIGluIG9uZSBvZiB0aGUgbWFzayBncm91cCwgaXQgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGlzIGF0dHJhY3Rvci5cblx0ICogSWYgbm90IHNwZWNpZmllZCwgdGhlIGF0dHJhY3RvciB3aWxsIGFwcGx5IGVmZmVjdHMgdG8gYWxsIFJpZ2lkQm9kaWVzLlxuXHQgKi9cblx0Y29sbGlzaW9uR3JvdXBzPzogSW50ZXJhY3Rpb25Hcm91cHM7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBOZ3RyQXR0YWN0b3JPcHRpb25zID0ge1xuXHRzdHJlbmd0aDogMSxcblx0cmFuZ2U6IDEwLFxuXHR0eXBlOiAnc3RhdGljJyxcblx0Z3Jhdml0YXRpb25hbENvbnN0YW50OiA2LjY3M2UtMTEsXG59O1xuXG5ARGlyZWN0aXZlKHtcblx0c2VsZWN0b3I6ICduZ3Qtb2JqZWN0M0RbYXR0cmFjdG9yXScsXG5cdHByb3ZpZGVyczogW1xuXHRcdHtcblx0XHRcdHByb3ZpZGU6IENPTExJU0lPTl9HUk9VUFNfSEFORExFUixcblx0XHRcdHVzZUZhY3Rvcnk6IChhdHRyYWN0b3I6IE5ndHJBdHRyYWN0b3IpID0+IHtcblx0XHRcdFx0cmV0dXJuICgpID0+IChpbnRlcmFjdGlvbkdyb3VwczogSW50ZXJhY3Rpb25Hcm91cHMpID0+IHtcblx0XHRcdFx0XHRhdHRyYWN0b3IubGlua2VkQ29sbGlzaW9uR3JvdXBzLnNldChpbnRlcmFjdGlvbkdyb3Vwcyk7XG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXHRcdFx0ZGVwczogW05ndHJBdHRyYWN0b3JdLFxuXHRcdH0sXG5cdF0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHJBdHRyYWN0b3Ige1xuXHRwb3NpdGlvbiA9IGlucHV0PE5ndFZlY3RvcjM+KFswLCAwLCAwXSk7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblxuXHRwcml2YXRlIG9iamVjdFJlZiA9IGluamVjdDxFbGVtZW50UmVmPFRIUkVFLk9iamVjdDNEPj4oRWxlbWVudFJlZik7XG5cdHByaXZhdGUgY29sbGlzaW9uR3JvdXBzID0gcGljayh0aGlzLm9wdGlvbnMsICdjb2xsaXNpb25Hcm91cHMnKTtcblx0bGlua2VkQ29sbGlzaW9uR3JvdXBzID0gbGlua2VkU2lnbmFsKHRoaXMuY29sbGlzaW9uR3JvdXBzKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0YXBwbHlQcm9wcyh0aGlzLm9iamVjdFJlZi5uYXRpdmVFbGVtZW50LCB7IHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uKCkgfSk7XG5cdFx0fSk7XG5cblx0XHRiZWZvcmVQaHlzaWNzU3RlcCgod29ybGQpID0+IHtcblx0XHRcdGNvbnN0IHsgc3RyZW5ndGgsIHJhbmdlLCB0eXBlLCBncmF2aXRhdGlvbmFsQ29uc3RhbnQgfSA9IHVudHJhY2tlZCh0aGlzLm9wdGlvbnMpO1xuXHRcdFx0Y29uc3QgY29sbGlzaW9uR3JvdXBzID0gdW50cmFja2VkKHRoaXMubGlua2VkQ29sbGlzaW9uR3JvdXBzKTtcblx0XHRcdHdvcmxkLmJvZGllcy5mb3JFYWNoKChib2R5KSA9PiB7XG5cdFx0XHRcdGlmIChib2R5LmlzRHluYW1pYygpKSB7XG5cdFx0XHRcdFx0YXBwbHlBdHRyYWN0b3JGb3JjZU9uUmlnaWRCb2R5KGJvZHksIHtcblx0XHRcdFx0XHRcdG9iamVjdDogdGhpcy5vYmplY3RSZWYubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0XHRcdHN0cmVuZ3RoLFxuXHRcdFx0XHRcdFx0cmFuZ2UsXG5cdFx0XHRcdFx0XHR0eXBlLFxuXHRcdFx0XHRcdFx0Z3Jhdml0YXRpb25hbENvbnN0YW50LFxuXHRcdFx0XHRcdFx0Y29sbGlzaW9uR3JvdXBzLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGF0dHJhY3RvckRlYnVnKHRoaXMub2JqZWN0UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMub3B0aW9ucyk7XG5cdH1cbn1cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS1yYXBpZXItYWRkb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9yYXBpZXIvYWRkb25zL3NyYy9hbmd1bGFyLXRocmVlLXJhcGllci1hZGRvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"angular-three-rapier-addons.mjs","sources":["../../../../libs/rapier/addons/src/lib/attractor-debug.ts","../../../../libs/rapier/addons/src/lib/attractor.ts","../../../../libs/rapier/addons/src/angular-three-rapier-addons.ts"],"sourcesContent":["import { computed, effect, inject, Injector } from '@angular/core';\nimport { beforeRender, injectStore, pick } from 'angular-three';\nimport { NgtrPhysics } from 'angular-three-rapier';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport * as THREE from 'three';\nimport { VertexNormalsHelper } from 'three-stdlib';\nimport { NgtrAttactorOptions } from './attractor';\n\nconst _v3 = new THREE.Vector3();\n\n/**\n * Creates debug visualization for an attractor.\n * Shows a sphere at the attractor position with normals indicating the range.\n * Blue indicates attraction, red indicates repulsion.\n *\n * This is automatically called by NgtrAttractor when physics debug mode is enabled.\n *\n * @param object - The Object3D representing the attractor position\n * @param options - Getter function for attractor options\n * @param injector - Optional injector for dependency injection context\n *\n * @internal\n */\nexport function attractorDebug(object: THREE.Object3D, options: () => NgtrAttactorOptions, injector?: Injector) {\n\treturn assertInjector(attractorDebug, injector, () => {\n\t\tconst physics = inject(NgtrPhysics);\n\t\tconst store = injectStore();\n\n\t\tconst strength = pick(options, 'strength');\n\t\tconst range = pick(options, 'range');\n\t\tconst color = computed(() => (strength() > 0 ? 0x0000ff : 0xff0000));\n\n\t\tlet mesh: THREE.Mesh;\n\t\tlet normalsHelper: VertexNormalsHelper;\n\n\t\teffect((onCleanup) => {\n\t\t\tif (!physics['debug']()) return;\n\n\t\t\tmesh = new THREE.Mesh(\n\t\t\t\tnew THREE.SphereGeometry(0.2, 6, 6),\n\t\t\t\tnew THREE.MeshBasicMaterial({ color: color(), wireframe: true }),\n\t\t\t);\n\n\t\t\tnormalsHelper = new VertexNormalsHelper(mesh, range(), color());\n\t\t\tnormalsHelper.frustumCulled = false;\n\n\t\t\tstore.snapshot.scene.add(mesh);\n\t\t\tstore.snapshot.scene.add(normalsHelper);\n\n\t\t\tonCleanup(() => {\n\t\t\t\tif (mesh) {\n\t\t\t\t\tstore.snapshot.scene.remove(mesh);\n\t\t\t\t}\n\n\t\t\t\tif (normalsHelper) {\n\t\t\t\t\tstore.snapshot.scene.remove(normalsHelper);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tbeforeRender(() => {\n\t\t\tif (!physics['debug']()) return;\n\n\t\t\tif (mesh) {\n\t\t\t\tconst worldPosition = object.getWorldPosition(_v3);\n\t\t\t\tmesh.position.copy(worldPosition);\n\t\t\t\tnormalsHelper?.update();\n\t\t\t}\n\t\t});\n\t});\n}\n","import { Directive, effect, ElementRef, inject, input, linkedSignal, untracked } from '@angular/core';\nimport { InteractionGroups, RigidBody } from '@dimforge/rapier3d-compat';\nimport { applyProps, NgtVector3, pick } from 'angular-three';\nimport { beforePhysicsStep, COLLISION_GROUPS_HANDLER } from 'angular-three-rapier';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport * as THREE from 'three';\nimport { attractorDebug } from './attractor-debug';\n\n/**\n * Force calculation functions for different gravity types.\n * - static: Constant force regardless of distance\n * - linear: Force increases linearly as distance decreases\n * - newtonian: Force follows Newton's law of universal gravitation\n */\nconst calcForceByType = {\n\tstatic: (s: number, m2: number, r: number, d: number, G: number) => s,\n\tlinear: (s: number, m2: number, r: number, d: number, G: number) => s * (d / r),\n\tnewtonian: (s: number, m2: number, r: number, d: number, G: number) => (G * s * m2) / Math.pow(d, 2),\n};\n\nconst _position = new THREE.Vector3();\nconst _vector3 = new THREE.Vector3();\n\n/**\n * Applies attractor force to a rigid body based on its distance from the attractor.\n * Used internally by NgtrAttractor but can be called manually for custom behavior.\n *\n * @param rigidBody - The rigid body to apply the force to\n * @param options - The attractor configuration including position, strength, and type\n *\n * @example\n * ```typescript\n * beforePhysicsStep((world) => {\n * world.bodies.forEach((body) => {\n * if (body.isDynamic()) {\n * applyAttractorForceOnRigidBody(body, {\n * object: attractorMesh,\n * strength: 10,\n * range: 20,\n * type: 'newtonian',\n * gravitationalConstant: 6.673e-11\n * });\n * }\n * });\n * });\n * ```\n */\nexport function applyAttractorForceOnRigidBody(\n\trigidBody: RigidBody,\n\t{\n\t\tobject,\n\t\tstrength,\n\t\trange,\n\t\tgravitationalConstant,\n\t\tcollisionGroups,\n\t\ttype,\n\t}: NgtrAttactorOptions & { object: THREE.Object3D },\n) {\n\tconst rbPosition = rigidBody.translation();\n\t_position.set(rbPosition.x, rbPosition.y, rbPosition.z);\n\n\tconst worldPosition = object.getWorldPosition(new THREE.Vector3());\n\n\tconst distance: number = worldPosition.distanceTo(_position);\n\n\tif (distance < range) {\n\t\tlet force = calcForceByType[type](strength, rigidBody.mass(), range, distance, gravitationalConstant);\n\n\t\t// Prevent wild forces when Attractors collide\n\t\tforce = force === Infinity ? strength : force;\n\n\t\t// Naively test if the rigidBody contains a collider in one of the collision groups\n\t\tlet isRigidBodyInCollisionGroup = collisionGroups === undefined;\n\t\tif (collisionGroups !== undefined) {\n\t\t\tfor (let i = 0; i < rigidBody.numColliders(); i++) {\n\t\t\t\tconst collider = rigidBody.collider(i);\n\t\t\t\tconst colliderCollisionGroups = collider.collisionGroups();\n\t\t\t\tif (\n\t\t\t\t\t((collisionGroups >> 16) & colliderCollisionGroups) != 0 &&\n\t\t\t\t\t((colliderCollisionGroups >> 16) & collisionGroups) != 0\n\t\t\t\t) {\n\t\t\t\t\tisRigidBodyInCollisionGroup = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isRigidBodyInCollisionGroup) {\n\t\t\t_vector3.set(0, 0, 0).subVectors(worldPosition, _position).normalize().multiplyScalar(force);\n\n\t\t\trigidBody.applyImpulse(_vector3, true);\n\t\t}\n\t}\n}\n\n/**\n * Type of gravity calculation for attractors.\n * - `'static'` - Constant force regardless of distance\n * - `'linear'` - Force scales linearly with distance (closer = stronger)\n * - `'newtonian'` - Force follows Newton's law of universal gravitation (inverse square)\n */\nexport type NgtrAttractorGravityType = 'static' | 'linear' | 'newtonian';\n\n/**\n * Configuration options for the attractor directive.\n */\nexport interface NgtrAttactorOptions {\n\t/**\n\t * The strength of the attractor.\n\t * Positive values attract, negative values repel.\n\t *\n\t * @defaultValue 1\n\t */\n\tstrength: number;\n\n\t/**\n\t * The range of the attractor. Will not affect objects outside of this range.\n\t *\n\t * @defaultValue 10\n\t * @min 0\n\t */\n\trange: number;\n\n\t/**\n\t * The type of gravity to use.\n\t * - static: The gravity is constant and does not change over time.\n\t * - linear: The gravity is linearly interpolated the closer the object is to the attractor.\n\t * - newtonian: The gravity is calculated using the newtonian gravity formula.\n\t * @defaultValue \"static\"\n\t */\n\ttype: NgtrAttractorGravityType;\n\n\t/**\n\t * The mass of the attractor. Used when type is `newtonian`.\n\t * @defaultValue 6.673e-11\n\t */\n\tgravitationalConstant: number;\n\n\t/**\n\t * The collision groups that this attractor will apply effects to. If a RigidBody contains one or more colliders that are in one of the mask group, it will be affected by this attractor.\n\t * If not specified, the attractor will apply effects to all RigidBodies.\n\t */\n\tcollisionGroups?: InteractionGroups;\n}\n\nconst defaultOptions: NgtrAttactorOptions = {\n\tstrength: 1,\n\trange: 10,\n\ttype: 'static',\n\tgravitationalConstant: 6.673e-11,\n};\n\n/**\n * Directive that creates a gravitational attractor point in the physics world.\n * All dynamic rigid bodies within range will be attracted (or repelled) towards this point.\n *\n * The attractor can use different gravity models:\n * - Static: constant force\n * - Linear: force increases as objects get closer\n * - Newtonian: realistic inverse-square law\n *\n * @example\n * ```html\n * <!-- Simple attractor at origin -->\n * <ngt-object3D attractor [options]=\"{ strength: 5, range: 20 }\" />\n *\n * <!-- Repeller (negative strength) -->\n * <ngt-object3D attractor [options]=\"{ strength: -10, range: 15 }\" [position]=\"[5, 0, 0]\" />\n *\n * <!-- Newtonian gravity -->\n * <ngt-object3D attractor [options]=\"{\n * strength: 1000,\n * range: 50,\n * type: 'newtonian',\n * gravitationalConstant: 0.01\n * }\" />\n * ```\n */\n@Directive({\n\tselector: 'ngt-object3D[attractor]',\n\tproviders: [\n\t\t{\n\t\t\tprovide: COLLISION_GROUPS_HANDLER,\n\t\t\tuseFactory: (attractor: NgtrAttractor) => {\n\t\t\t\treturn () => (interactionGroups: InteractionGroups) => {\n\t\t\t\t\tattractor.linkedCollisionGroups.set(interactionGroups);\n\t\t\t\t};\n\t\t\t},\n\t\t\tdeps: [NgtrAttractor],\n\t\t},\n\t],\n})\nexport class NgtrAttractor {\n\tposition = input<NgtVector3>([0, 0, 0]);\n\toptions = input(defaultOptions, { transform: mergeInputs(defaultOptions) });\n\n\tprivate objectRef = inject<ElementRef<THREE.Object3D>>(ElementRef);\n\tprivate collisionGroups = pick(this.options, 'collisionGroups');\n\tlinkedCollisionGroups = linkedSignal(this.collisionGroups);\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tapplyProps(this.objectRef.nativeElement, { position: this.position() });\n\t\t});\n\n\t\tbeforePhysicsStep((world) => {\n\t\t\tconst { strength, range, type, gravitationalConstant } = untracked(this.options);\n\t\t\tconst collisionGroups = untracked(this.linkedCollisionGroups);\n\t\t\tworld.bodies.forEach((body) => {\n\t\t\t\tif (body.isDynamic()) {\n\t\t\t\t\tapplyAttractorForceOnRigidBody(body, {\n\t\t\t\t\t\tobject: this.objectRef.nativeElement,\n\t\t\t\t\t\tstrength,\n\t\t\t\t\t\trange,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tgravitationalConstant,\n\t\t\t\t\t\tcollisionGroups,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tattractorDebug(this.objectRef.nativeElement, this.options);\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAQA,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;AAE/B;;;;;;;;;;;;AAYG;SACa,cAAc,CAAC,MAAsB,EAAE,OAAkC,EAAE,QAAmB,EAAA;AAC7G,IAAA,OAAO,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAK;AACpD,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;AACnC,QAAA,MAAM,KAAK,GAAG,WAAW,EAAE;QAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,QAAQ,EAAE,GAAG,CAAC,GAAG,QAAQ,GAAG,QAAQ,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEpE,QAAA,IAAI,IAAgB;AACpB,QAAA,IAAI,aAAkC;AAEtC,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAAE;AAEzB,YAAA,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CACpB,IAAI,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EACnC,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAChE;AAED,YAAA,aAAa,GAAG,IAAI,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC;AAC/D,YAAA,aAAa,CAAC,aAAa,GAAG,KAAK;YAEnC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC;YAEvC,SAAS,CAAC,MAAK;gBACd,IAAI,IAAI,EAAE;oBACT,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;gBAClC;gBAEA,IAAI,aAAa,EAAE;oBAClB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC;gBAC3C;AACD,YAAA,CAAC,CAAC;AACH,QAAA,CAAC,CAAC;QAEF,YAAY,CAAC,MAAK;AACjB,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAAE;YAEzB,IAAI,IAAI,EAAE;gBACT,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAClD,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;gBACjC,aAAa,EAAE,MAAM,EAAE;YACxB;AACD,QAAA,CAAC,CAAC;AACH,IAAA,CAAC,CAAC;AACH;;AC9DA;;;;;AAKG;AACH,MAAM,eAAe,GAAG;AACvB,IAAA,MAAM,EAAE,CAAC,CAAS,EAAE,EAAU,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,KAAK,CAAC;IACrE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAU,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/E,IAAA,SAAS,EAAE,CAAC,CAAS,EAAE,EAAU,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;CACpG;AAED,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;AACrC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;AAEpC;;;;;;;;;;;;;;;;;;;;;;;AAuBG;SACa,8BAA8B,CAC7C,SAAoB,EACpB,EACC,MAAM,EACN,QAAQ,EACR,KAAK,EACL,qBAAqB,EACrB,eAAe,EACf,IAAI,GAC8C,EAAA;AAEnD,IAAA,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,EAAE;AAC1C,IAAA,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;AAEvD,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;IAElE,MAAM,QAAQ,GAAW,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC;AAE5D,IAAA,IAAI,QAAQ,GAAG,KAAK,EAAE;QACrB,IAAI,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,qBAAqB,CAAC;;AAGrG,QAAA,KAAK,GAAG,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAG,KAAK;;AAG7C,QAAA,IAAI,2BAA2B,GAAG,eAAe,KAAK,SAAS;AAC/D,QAAA,IAAI,eAAe,KAAK,SAAS,EAAE;AAClC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;gBAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtC,gBAAA,MAAM,uBAAuB,GAAG,QAAQ,CAAC,eAAe,EAAE;gBAC1D,IACC,CAAC,CAAC,eAAe,IAAI,EAAE,IAAI,uBAAuB,KAAK,CAAC;oBACxD,CAAC,CAAC,uBAAuB,IAAI,EAAE,IAAI,eAAe,KAAK,CAAC,EACvD;oBACD,2BAA2B,GAAG,IAAI;oBAClC;gBACD;YACD;QACD;QAEA,IAAI,2BAA2B,EAAE;YAChC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC;AAE5F,YAAA,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC;QACvC;IACD;AACD;AAoDA,MAAM,cAAc,GAAwB;AAC3C,IAAA,QAAQ,EAAE,CAAC;AACX,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,qBAAqB,EAAE,SAAS;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MAeU,aAAa,CAAA;IACzB,QAAQ,GAAG,KAAK,CAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACvC,IAAA,OAAO,GAAG,KAAK,CAAC,cAAc,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,SAAA,EAAA,GAAA,EAAA,CAAA,EAAI,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,EAAA,CAAG;AAEnE,IAAA,SAAS,GAAG,MAAM,CAA6B,UAAU,CAAC;IAC1D,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC;AAC/D,IAAA,qBAAqB,GAAG,YAAY,CAAC,IAAI,CAAC,eAAe,iEAAC;AAE1D,IAAA,WAAA,GAAA;QACC,MAAM,CAAC,MAAK;AACX,YAAA,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;AACxE,QAAA,CAAC,CAAC;AAEF,QAAA,iBAAiB,CAAC,CAAC,KAAK,KAAI;AAC3B,YAAA,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;YAChF,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,qBAAqB,CAAC;YAC7D,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC7B,gBAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;oBACrB,8BAA8B,CAAC,IAAI,EAAE;AACpC,wBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa;wBACpC,QAAQ;wBACR,KAAK;wBACL,IAAI;wBACJ,qBAAqB;wBACrB,eAAe;AACf,qBAAA,CAAC;gBACH;AACD,YAAA,CAAC,CAAC;AACH,QAAA,CAAC,CAAC;QAEF,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC;IAC3D;uGA/BY,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAZd;AACV,YAAA;AACC,gBAAA,OAAO,EAAE,wBAAwB;AACjC,gBAAA,UAAU,EAAE,CAAC,SAAwB,KAAI;AACxC,oBAAA,OAAO,MAAM,CAAC,iBAAoC,KAAI;AACrD,wBAAA,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC;AACvD,oBAAA,CAAC;gBACF,CAAC;gBACD,IAAI,EAAE,CAAC,aAAa,CAAC;AACrB,aAAA;AACD,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEW,aAAa,EAAA,UAAA,EAAA,CAAA;kBAdzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,SAAS,EAAE;AACV,wBAAA;AACC,4BAAA,OAAO,EAAE,wBAAwB;AACjC,4BAAA,UAAU,EAAE,CAAC,SAAwB,KAAI;AACxC,gCAAA,OAAO,MAAM,CAAC,iBAAoC,KAAI;AACrD,oCAAA,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC;AACvD,gCAAA,CAAC;4BACF,CAAC;AACD,4BAAA,IAAI,EAAE,CAAA,aAAA,CAAe;AACrB,yBAAA;AACD,qBAAA;AACD,iBAAA;;;AC/LD;;AAEG;;;;"}