@triforge/physics-core 0.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 (45) hide show
  1. package/dist/cloth/ClothSimulator.d.ts +127 -0
  2. package/dist/cloth/ClothSimulator.d.ts.map +1 -0
  3. package/dist/cloth/ClothSimulator.js +355 -0
  4. package/dist/cloth/ClothSimulator.js.map +1 -0
  5. package/dist/collision/BaseCollider.d.ts +19 -0
  6. package/dist/collision/BaseCollider.d.ts.map +1 -0
  7. package/dist/collision/BaseCollider.js +14 -0
  8. package/dist/collision/BaseCollider.js.map +1 -0
  9. package/dist/collision/CapsuleCollider.d.ts +29 -0
  10. package/dist/collision/CapsuleCollider.d.ts.map +1 -0
  11. package/dist/collision/CapsuleCollider.js +41 -0
  12. package/dist/collision/CapsuleCollider.js.map +1 -0
  13. package/dist/collision/PlaneCollider.d.ts +30 -0
  14. package/dist/collision/PlaneCollider.d.ts.map +1 -0
  15. package/dist/collision/PlaneCollider.js +38 -0
  16. package/dist/collision/PlaneCollider.js.map +1 -0
  17. package/dist/collision/SphereCollider.d.ts +25 -0
  18. package/dist/collision/SphereCollider.d.ts.map +1 -0
  19. package/dist/collision/SphereCollider.js +36 -0
  20. package/dist/collision/SphereCollider.js.map +1 -0
  21. package/dist/forces/WindForce.d.ts +39 -0
  22. package/dist/forces/WindForce.d.ts.map +1 -0
  23. package/dist/forces/WindForce.js +40 -0
  24. package/dist/forces/WindForce.js.map +1 -0
  25. package/dist/index.d.ts +14 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +10 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/rigidbody/RigidBodyConstraints.d.ts +179 -0
  30. package/dist/rigidbody/RigidBodyConstraints.d.ts.map +1 -0
  31. package/dist/rigidbody/RigidBodyConstraints.js +480 -0
  32. package/dist/rigidbody/RigidBodyConstraints.js.map +1 -0
  33. package/dist/rigidbody/RigidBodyWorld.d.ts +136 -0
  34. package/dist/rigidbody/RigidBodyWorld.d.ts.map +1 -0
  35. package/dist/rigidbody/RigidBodyWorld.js +319 -0
  36. package/dist/rigidbody/RigidBodyWorld.js.map +1 -0
  37. package/dist/softbody/SoftBodySimulator.d.ts +103 -0
  38. package/dist/softbody/SoftBodySimulator.d.ts.map +1 -0
  39. package/dist/softbody/SoftBodySimulator.js +311 -0
  40. package/dist/softbody/SoftBodySimulator.js.map +1 -0
  41. package/dist/utils/noise.d.ts +3 -0
  42. package/dist/utils/noise.d.ts.map +1 -0
  43. package/dist/utils/noise.js +20 -0
  44. package/dist/utils/noise.js.map +1 -0
  45. package/package.json +45 -0
@@ -0,0 +1,127 @@
1
+ import { BufferGeometry } from 'three';
2
+ import type { BaseCollider } from '../collision/BaseCollider.js';
3
+ import type { WindForce } from '../forces/WindForce.js';
4
+ export interface ClothSimulatorOptions {
5
+ /** Width vertex count (columns). Default 20. Blender: Quality > Steps U. */
6
+ segmentsX?: number;
7
+ /** Height vertex count (rows). Default 20. Blender: Quality > Steps V. */
8
+ segmentsY?: number;
9
+ /** Gravity acceleration (m/s²). Blender: Field Weights > Gravity. Default 9.8. */
10
+ gravity?: number;
11
+ /** Spring stiffness [0, 1]. Blender: Cloth > Stiffness > Tension. Default 0.8. */
12
+ stiffness?: number;
13
+ /** Bending stiffness [0, 1]. Blender: Cloth > Stiffness > Bending. Default 0.2. */
14
+ bending?: number;
15
+ /** Velocity damping [0, 1]. Blender: Cloth > Damping > Spring. Default 0.01. */
16
+ damping?: number;
17
+ /** Constraint solver iterations per step. Blender: Quality > Steps. Default 8. */
18
+ iterations?: number;
19
+ /** Simulation substeps per frame. Higher = more stable. Default 4. */
20
+ substeps?: number;
21
+ /** Particle mass. Blender: Cloth > Mass. Default 0.3. */
22
+ mass?: number;
23
+ /** Enable self-collision. Blender: Cloth > Self Collision. Default false. */
24
+ selfCollision?: boolean;
25
+ /** Minimum distance for self-collision. Default 0.05. */
26
+ selfCollisionDist?: number;
27
+ /** Enable pressure/inflation. Blender: Cloth > Pressure. Default false. */
28
+ pressure?: boolean;
29
+ /** Pressure factor (outward force along normal). Blender: Cloth > Pressure > Factor. Default 1.0. */
30
+ pressureFactor?: number;
31
+ }
32
+ /**
33
+ * ClothSimulator — Blender-matched cloth physics using Verlet integration.
34
+ * Blender: Cloth modifier.
35
+ *
36
+ * Workflow:
37
+ * 1. Create with segmentsX × segmentsY resolution
38
+ * 2. Pin vertices with `pin(index)` or `pinRow(0)` for a hanging flag
39
+ * 3. Add colliders and wind forces
40
+ * 4. Call `step(dt)` every frame
41
+ * 5. Call `apply()` to write simulated positions to the geometry
42
+ *
43
+ * All simulation parameters live in `parameters` for st-keyframe / GSAP:
44
+ * new KeyframeTrack(cloth.parameters, 'stiffness', [...])
45
+ */
46
+ export declare class ClothSimulator {
47
+ /** All scalar simulation parameters — GSAP/st-keyframe compatible. */
48
+ parameters: {
49
+ gravity: number;
50
+ stiffness: number;
51
+ bending: number;
52
+ damping: number;
53
+ iterations: number;
54
+ substeps: number;
55
+ mass: number;
56
+ selfCollision: boolean;
57
+ selfCollisionDist: number;
58
+ pressure: boolean;
59
+ pressureFactor: number;
60
+ };
61
+ readonly segmentsX: number;
62
+ readonly segmentsY: number;
63
+ /** Vertex count = (segmentsX+1) × (segmentsY+1). */
64
+ readonly vertexCount: number;
65
+ /** Current positions [x0,y0,z0, x1,y1,z1, ...] */
66
+ private _pos;
67
+ /** Previous positions (Verlet). */
68
+ private _prev;
69
+ /** Pinned vertices do not move. */
70
+ private _pinned;
71
+ /** Spring constraints: [i, j, restLength] */
72
+ private _springs;
73
+ /** Triangle index list for pressure, [i0, i1, i2, ...] */
74
+ private _triangles;
75
+ /** Accumulated wind force pointer (optional). */
76
+ private _wind;
77
+ private _colliders;
78
+ /** Current simulation time. */
79
+ time: number;
80
+ constructor(segmentsX: number, segmentsY: number, opts?: ClothSimulatorOptions);
81
+ /**
82
+ * Seed particle positions from a BufferGeometry.
83
+ * Call this once after construction to place the cloth in 3D space.
84
+ */
85
+ setFromGeometry(geometry: BufferGeometry): void;
86
+ /**
87
+ * Seed positions from a flat array [x0,y0,z0, x1,y1,z1, ...].
88
+ */
89
+ setFromArray(positions: ArrayLike<number>): void;
90
+ /** Pin a single vertex by index. Pinned vertices don't move. */
91
+ pin(index: number): void;
92
+ /** Unpin a vertex. */
93
+ unpin(index: number): void;
94
+ /** Pin an entire row (0 = bottom row in grid, segmentsY = top row). */
95
+ pinRow(row: number): void;
96
+ /** Pin an entire column. */
97
+ pinColumn(col: number): void;
98
+ isPinned(index: number): boolean;
99
+ setWind(wind: WindForce | null): void;
100
+ addCollider(c: BaseCollider): void;
101
+ removeCollider(c: BaseCollider): void;
102
+ clearColliders(): void;
103
+ /**
104
+ * Advance the simulation by `dt` seconds.
105
+ * Blender runs at 1/24 s per frame with multiple substeps.
106
+ * Recommended: pass `clock.getDelta()` clamped to 0.05 s max.
107
+ */
108
+ step(dt: number): void;
109
+ /**
110
+ * Write current particle positions to a BufferGeometry's position attribute.
111
+ * Call after step() each frame.
112
+ */
113
+ apply(geometry: BufferGeometry): void;
114
+ /** Read-only access to current positions (flat Float64Array). */
115
+ getPositions(): Readonly<Float64Array>;
116
+ /** Teleport a single particle. Use to move pinned vertices. */
117
+ setPosition(index: number, x: number, y: number, z: number): void;
118
+ private _integrate;
119
+ private _solveConstraints;
120
+ private _resolveCollisions;
121
+ private _buildSprings;
122
+ private _resolveSelfCollision;
123
+ private _applyPressure;
124
+ private _buildTriangles;
125
+ private _rebuildRestLengths;
126
+ }
127
+ //# sourceMappingURL=ClothSimulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClothSimulator.d.ts","sourceRoot":"","sources":["../../src/cloth/ClothSimulator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,355 @@
1
+ /**
2
+ * ClothSimulator — Blender-matched cloth physics using Verlet integration.
3
+ * Blender: Cloth modifier.
4
+ *
5
+ * Workflow:
6
+ * 1. Create with segmentsX × segmentsY resolution
7
+ * 2. Pin vertices with `pin(index)` or `pinRow(0)` for a hanging flag
8
+ * 3. Add colliders and wind forces
9
+ * 4. Call `step(dt)` every frame
10
+ * 5. Call `apply()` to write simulated positions to the geometry
11
+ *
12
+ * All simulation parameters live in `parameters` for st-keyframe / GSAP:
13
+ * new KeyframeTrack(cloth.parameters, 'stiffness', [...])
14
+ */
15
+ export class ClothSimulator {
16
+ constructor(segmentsX, segmentsY, opts = {}) {
17
+ /** Accumulated wind force pointer (optional). */
18
+ this._wind = null;
19
+ this._colliders = [];
20
+ /** Current simulation time. */
21
+ this.time = 0;
22
+ this.segmentsX = segmentsX;
23
+ this.segmentsY = segmentsY;
24
+ this.vertexCount = (segmentsX + 1) * (segmentsY + 1);
25
+ this.parameters = {
26
+ gravity: opts.gravity ?? 9.8,
27
+ stiffness: opts.stiffness ?? 0.8,
28
+ bending: opts.bending ?? 0.2,
29
+ damping: opts.damping ?? 0.01,
30
+ iterations: opts.iterations ?? 8,
31
+ substeps: opts.substeps ?? 4,
32
+ mass: opts.mass ?? 0.3,
33
+ selfCollision: opts.selfCollision ?? false,
34
+ selfCollisionDist: opts.selfCollisionDist ?? 0.05,
35
+ pressure: opts.pressure ?? false,
36
+ pressureFactor: opts.pressureFactor ?? 1.0,
37
+ };
38
+ // Triangle index list for pressure computation (built from grid quads)
39
+ this._triangles = this._buildTriangles();
40
+ this._pos = new Float64Array(this.vertexCount * 3);
41
+ this._prev = new Float64Array(this.vertexCount * 3);
42
+ this._pinned = new Uint8Array(this.vertexCount);
43
+ this._buildSprings();
44
+ }
45
+ // ── Initialisation ────────────────────────────────────────────────────────
46
+ /**
47
+ * Seed particle positions from a BufferGeometry.
48
+ * Call this once after construction to place the cloth in 3D space.
49
+ */
50
+ setFromGeometry(geometry) {
51
+ const pos = geometry.getAttribute('position');
52
+ const n = Math.min(pos.count, this.vertexCount);
53
+ for (let i = 0; i < n; i++) {
54
+ this._pos[i * 3] = pos.getX(i);
55
+ this._pos[i * 3 + 1] = pos.getY(i);
56
+ this._pos[i * 3 + 2] = pos.getZ(i);
57
+ }
58
+ this._prev.set(this._pos);
59
+ this._rebuildRestLengths();
60
+ }
61
+ /**
62
+ * Seed positions from a flat array [x0,y0,z0, x1,y1,z1, ...].
63
+ */
64
+ setFromArray(positions) {
65
+ const n = Math.min(positions.length, this._pos.length);
66
+ for (let i = 0; i < n; i++)
67
+ this._pos[i] = positions[i];
68
+ this._prev.set(this._pos);
69
+ this._rebuildRestLengths();
70
+ }
71
+ // ── Pinning ───────────────────────────────────────────────────────────────
72
+ /** Pin a single vertex by index. Pinned vertices don't move. */
73
+ pin(index) {
74
+ if (index >= 0 && index < this.vertexCount)
75
+ this._pinned[index] = 1;
76
+ }
77
+ /** Unpin a vertex. */
78
+ unpin(index) {
79
+ if (index >= 0 && index < this.vertexCount)
80
+ this._pinned[index] = 0;
81
+ }
82
+ /** Pin an entire row (0 = bottom row in grid, segmentsY = top row). */
83
+ pinRow(row) {
84
+ for (let x = 0; x <= this.segmentsX; x++) {
85
+ this.pin(row * (this.segmentsX + 1) + x);
86
+ }
87
+ }
88
+ /** Pin an entire column. */
89
+ pinColumn(col) {
90
+ for (let y = 0; y <= this.segmentsY; y++) {
91
+ this.pin(y * (this.segmentsX + 1) + col);
92
+ }
93
+ }
94
+ isPinned(index) { return this._pinned[index] === 1; }
95
+ // ── Forces & Colliders ────────────────────────────────────────────────────
96
+ setWind(wind) { this._wind = wind; }
97
+ addCollider(c) { this._colliders.push(c); }
98
+ removeCollider(c) { this._colliders = this._colliders.filter(x => x !== c); }
99
+ clearColliders() { this._colliders = []; }
100
+ // ── Simulation ────────────────────────────────────────────────────────────
101
+ /**
102
+ * Advance the simulation by `dt` seconds.
103
+ * Blender runs at 1/24 s per frame with multiple substeps.
104
+ * Recommended: pass `clock.getDelta()` clamped to 0.05 s max.
105
+ */
106
+ step(dt) {
107
+ const { substeps } = this.parameters;
108
+ const subDt = dt / substeps;
109
+ for (let s = 0; s < substeps; s++) {
110
+ this._integrate(subDt);
111
+ this._solveConstraints();
112
+ this._resolveCollisions();
113
+ if (this.parameters.selfCollision)
114
+ this._resolveSelfCollision();
115
+ if (this.parameters.pressure)
116
+ this._applyPressure(subDt);
117
+ }
118
+ this.time += dt;
119
+ this._wind?.advance(dt);
120
+ }
121
+ /**
122
+ * Write current particle positions to a BufferGeometry's position attribute.
123
+ * Call after step() each frame.
124
+ */
125
+ apply(geometry) {
126
+ const attr = geometry.getAttribute('position');
127
+ const n = Math.min(attr.count, this.vertexCount);
128
+ for (let i = 0; i < n; i++) {
129
+ attr.setXYZ(i, this._pos[i * 3], this._pos[i * 3 + 1], this._pos[i * 3 + 2]);
130
+ }
131
+ attr.needsUpdate = true;
132
+ geometry.computeVertexNormals();
133
+ }
134
+ /** Read-only access to current positions (flat Float64Array). */
135
+ getPositions() { return this._pos; }
136
+ /** Teleport a single particle. Use to move pinned vertices. */
137
+ setPosition(index, x, y, z) {
138
+ this._pos[index * 3] = x;
139
+ this._pos[index * 3 + 1] = y;
140
+ this._pos[index * 3 + 2] = z;
141
+ this._prev[index * 3] = x;
142
+ this._prev[index * 3 + 1] = y;
143
+ this._prev[index * 3 + 2] = z;
144
+ }
145
+ // ── Internals ─────────────────────────────────────────────────────────────
146
+ _integrate(dt) {
147
+ const { gravity, damping } = this.parameters;
148
+ const dt2 = dt * dt;
149
+ for (let i = 0; i < this.vertexCount; i++) {
150
+ if (this._pinned[i])
151
+ continue;
152
+ const base = i * 3;
153
+ const px = this._pos[base], py = this._pos[base + 1], pz = this._pos[base + 2];
154
+ const ox = this._prev[base], oy = this._prev[base + 1], oz = this._prev[base + 2];
155
+ // Velocity estimate (Verlet: v ≈ pos - prev)
156
+ const vx = (px - ox) * (1 - damping);
157
+ const vy = (py - oy) * (1 - damping);
158
+ const vz = (pz - oz) * (1 - damping);
159
+ // External acceleration
160
+ let ax = 0, ay = -gravity, az = 0;
161
+ if (this._wind) {
162
+ const [wx, wy, wz] = this._wind.getAcceleration(px, py, pz, this.time);
163
+ ax += wx;
164
+ ay += wy;
165
+ az += wz;
166
+ }
167
+ // Save current as previous
168
+ this._prev[base] = px;
169
+ this._prev[base + 1] = py;
170
+ this._prev[base + 2] = pz;
171
+ // Verlet step
172
+ this._pos[base] = px + vx + ax * dt2;
173
+ this._pos[base + 1] = py + vy + ay * dt2;
174
+ this._pos[base + 2] = pz + vz + az * dt2;
175
+ }
176
+ }
177
+ _solveConstraints() {
178
+ const { iterations, stiffness, bending } = this.parameters;
179
+ const springs = this._springs;
180
+ for (let iter = 0; iter < iterations; iter++) {
181
+ // Process springs in pairs of 4 floats: [i_base, j_base, restLen, isBend]
182
+ for (let s = 0; s < springs.length; s += 4) {
183
+ const ib = springs[s] | 0;
184
+ const jb = springs[s + 1] | 0;
185
+ const restLen = springs[s + 2];
186
+ const isBend = springs[s + 3] > 0.5;
187
+ const k = isBend ? stiffness * bending : stiffness;
188
+ const px = this._pos[ib], py = this._pos[ib + 1], pz = this._pos[ib + 2];
189
+ const qx = this._pos[jb], qy = this._pos[jb + 1], qz = this._pos[jb + 2];
190
+ const dx = qx - px, dy = qy - py, dz = qz - pz;
191
+ const d2 = dx * dx + dy * dy + dz * dz;
192
+ if (d2 < 1e-12)
193
+ continue;
194
+ const d = Math.sqrt(d2);
195
+ const delta = (d - restLen) / d * 0.5 * k;
196
+ const cx = dx * delta, cy = dy * delta, cz = dz * delta;
197
+ const pinnedI = this._pinned[ib / 3 | 0];
198
+ const pinnedJ = this._pinned[jb / 3 | 0];
199
+ if (!pinnedI && !pinnedJ) {
200
+ this._pos[ib] += cx;
201
+ this._pos[ib + 1] += cy;
202
+ this._pos[ib + 2] += cz;
203
+ this._pos[jb] -= cx;
204
+ this._pos[jb + 1] -= cy;
205
+ this._pos[jb + 2] -= cz;
206
+ }
207
+ else if (!pinnedI) {
208
+ this._pos[ib] += cx * 2;
209
+ this._pos[ib + 1] += cy * 2;
210
+ this._pos[ib + 2] += cz * 2;
211
+ }
212
+ else if (!pinnedJ) {
213
+ this._pos[jb] -= cx * 2;
214
+ this._pos[jb + 1] -= cy * 2;
215
+ this._pos[jb + 2] -= cz * 2;
216
+ }
217
+ }
218
+ }
219
+ }
220
+ _resolveCollisions() {
221
+ for (const collider of this._colliders) {
222
+ if (!collider.enabled)
223
+ continue;
224
+ for (let i = 0; i < this.vertexCount; i++) {
225
+ if (this._pinned[i])
226
+ continue;
227
+ const b = i * 3;
228
+ const res = collider.resolve(this._pos[b], this._pos[b + 1], this._pos[b + 2]);
229
+ if (res) {
230
+ this._pos[b] = res[0];
231
+ this._pos[b + 1] = res[1];
232
+ this._pos[b + 2] = res[2];
233
+ }
234
+ }
235
+ }
236
+ }
237
+ _buildSprings() {
238
+ const W = this.segmentsX + 1;
239
+ const H = this.segmentsY + 1;
240
+ const springs = [];
241
+ const addSpring = (i, j, bend) => {
242
+ // Rest length will be filled in after positions are set
243
+ springs.push(i * 3, j * 3, 0, bend ? 1 : 0);
244
+ };
245
+ for (let y = 0; y < H; y++) {
246
+ for (let x = 0; x < W; x++) {
247
+ const idx = y * W + x;
248
+ // Structural: right and up
249
+ if (x + 1 < W)
250
+ addSpring(idx, idx + 1, false);
251
+ if (y + 1 < H)
252
+ addSpring(idx, idx + W, false);
253
+ // Shear: diagonal
254
+ if (x + 1 < W && y + 1 < H) {
255
+ addSpring(idx, idx + W + 1, false);
256
+ addSpring(idx + 1, idx + W, false);
257
+ }
258
+ // Bend: skip-one (prevents folding)
259
+ if (x + 2 < W)
260
+ addSpring(idx, idx + 2, true);
261
+ if (y + 2 < H)
262
+ addSpring(idx, idx + W * 2, true);
263
+ }
264
+ }
265
+ this._springs = new Float64Array(springs);
266
+ }
267
+ _resolveSelfCollision() {
268
+ const minDist = this.parameters.selfCollisionDist;
269
+ const minDist2 = minDist * minDist;
270
+ // O(n²) — acceptable for cloth meshes (≤ ~600 verts at default resolution)
271
+ for (let i = 0; i < this.vertexCount - 1; i++) {
272
+ if (this._pinned[i])
273
+ continue;
274
+ const ib = i * 3;
275
+ for (let j = i + 1; j < this.vertexCount; j++) {
276
+ if (this._pinned[j])
277
+ continue;
278
+ const jb = j * 3;
279
+ const dx = this._pos[jb] - this._pos[ib];
280
+ const dy = this._pos[jb + 1] - this._pos[ib + 1];
281
+ const dz = this._pos[jb + 2] - this._pos[ib + 2];
282
+ const d2 = dx * dx + dy * dy + dz * dz;
283
+ if (d2 < minDist2 && d2 > 1e-12) {
284
+ const d = Math.sqrt(d2);
285
+ const corr = (minDist - d) * 0.5 / d;
286
+ const cx = dx * corr, cy = dy * corr, cz = dz * corr;
287
+ this._pos[ib] -= cx;
288
+ this._pos[ib + 1] -= cy;
289
+ this._pos[ib + 2] -= cz;
290
+ this._pos[jb] += cx;
291
+ this._pos[jb + 1] += cy;
292
+ this._pos[jb + 2] += cz;
293
+ }
294
+ }
295
+ }
296
+ }
297
+ _applyPressure(dt) {
298
+ const pf = this.parameters.pressureFactor;
299
+ // Compute enclosed volume estimate; apply outward force to each triangle
300
+ const tris = this._triangles;
301
+ for (let t = 0; t < tris.length; t += 3) {
302
+ const ai = tris[t] * 3, bi = tris[t + 1] * 3, ci = tris[t + 2] * 3;
303
+ // Face normal (unnormalized) — cross product gives 2× area
304
+ const abx = this._pos[bi] - this._pos[ai];
305
+ const aby = this._pos[bi + 1] - this._pos[ai + 1];
306
+ const abz = this._pos[bi + 2] - this._pos[ai + 2];
307
+ const acx = this._pos[ci] - this._pos[ai];
308
+ const acy = this._pos[ci + 1] - this._pos[ai + 1];
309
+ const acz = this._pos[ci + 2] - this._pos[ai + 2];
310
+ const nx = aby * acz - abz * acy;
311
+ const ny = abz * acx - abx * acz;
312
+ const nz = abx * acy - aby * acx;
313
+ // Impulse = pressure * face area * dt / 3 verts
314
+ const frac = pf * dt / 3;
315
+ if (!this._pinned[tris[t]]) {
316
+ this._pos[ai] += nx * frac;
317
+ this._pos[ai + 1] += ny * frac;
318
+ this._pos[ai + 2] += nz * frac;
319
+ }
320
+ if (!this._pinned[tris[t + 1]]) {
321
+ this._pos[bi] += nx * frac;
322
+ this._pos[bi + 1] += ny * frac;
323
+ this._pos[bi + 2] += nz * frac;
324
+ }
325
+ if (!this._pinned[tris[t + 2]]) {
326
+ this._pos[ci] += nx * frac;
327
+ this._pos[ci + 1] += ny * frac;
328
+ this._pos[ci + 2] += nz * frac;
329
+ }
330
+ }
331
+ }
332
+ _buildTriangles() {
333
+ const W = this.segmentsX + 1;
334
+ const H = this.segmentsY + 1;
335
+ const tris = [];
336
+ for (let y = 0; y < H - 1; y++) {
337
+ for (let x = 0; x < W - 1; x++) {
338
+ const i = y * W + x;
339
+ tris.push(i, i + 1, i + W, i + 1, i + W + 1, i + W);
340
+ }
341
+ }
342
+ return new Uint32Array(tris);
343
+ }
344
+ _rebuildRestLengths() {
345
+ for (let s = 0; s < this._springs.length; s += 4) {
346
+ const ib = this._springs[s] | 0;
347
+ const jb = this._springs[s + 1] | 0;
348
+ const dx = this._pos[jb] - this._pos[ib];
349
+ const dy = this._pos[jb + 1] - this._pos[ib + 1];
350
+ const dz = this._pos[jb + 2] - this._pos[ib + 2];
351
+ this._springs[s + 2] = Math.sqrt(dx * dx + dy * dy + dz * dz);
352
+ }
353
+ }
354
+ }
355
+ //# sourceMappingURL=ClothSimulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClothSimulator.js","sourceRoot":"","sources":["../../src/cloth/ClothSimulator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * BaseCollider — abstract collision shape.
3
+ * Blender: Collision modifier on a mesh object.
4
+ *
5
+ * `resolve(px, py, pz)` returns the corrected position if the point
6
+ * is inside the collider, or null if no collision.
7
+ */
8
+ export declare abstract class BaseCollider {
9
+ abstract readonly colliderType: string;
10
+ /** When false, collider is skipped. */
11
+ enabled: boolean;
12
+ /**
13
+ * If the point (px, py, pz) penetrates this collider, return the
14
+ * corrected position that places it on the surface.
15
+ * Returns null when no collision.
16
+ */
17
+ abstract resolve(px: number, py: number, pz: number): [number, number, number] | null;
18
+ }
19
+ //# sourceMappingURL=BaseCollider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseCollider.d.ts","sourceRoot":"","sources":["../../src/collision/BaseCollider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,8BAAsB,YAAY;IAChC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IACtC,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAO;IAEvB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;CACtF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * BaseCollider — abstract collision shape.
3
+ * Blender: Collision modifier on a mesh object.
4
+ *
5
+ * `resolve(px, py, pz)` returns the corrected position if the point
6
+ * is inside the collider, or null if no collision.
7
+ */
8
+ export class BaseCollider {
9
+ constructor() {
10
+ /** When false, collider is skipped. */
11
+ this.enabled = true;
12
+ }
13
+ }
14
+ //# sourceMappingURL=BaseCollider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseCollider.js","sourceRoot":"","sources":["../../src/collision/BaseCollider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,OAAgB,YAAY;IAAlC;QAEE,uCAAuC;QACvC,YAAO,GAAY,IAAI,CAAA;IAQzB,CAAC;CAAA"}
@@ -0,0 +1,29 @@
1
+ import { BaseCollider } from './BaseCollider.js';
2
+ /**
3
+ * CapsuleCollider — a cylinder with hemispherical caps.
4
+ * Blender: Collision modifier on a capsule mesh.
5
+ *
6
+ * Good for character bodies, limbs, and pillars.
7
+ * Defined by two endpoint centers and a radius.
8
+ */
9
+ export declare class CapsuleCollider extends BaseCollider {
10
+ readonly colliderType = "CapsuleCollider";
11
+ parameters: {
12
+ ax: number;
13
+ ay: number;
14
+ az: number;
15
+ bx: number;
16
+ by: number;
17
+ bz: number;
18
+ radius: number;
19
+ friction: number;
20
+ };
21
+ constructor(opts?: {
22
+ a?: [number, number, number];
23
+ b?: [number, number, number];
24
+ radius?: number;
25
+ friction?: number;
26
+ });
27
+ resolve(px: number, py: number, pz: number): [number, number, number] | null;
28
+ }
29
+ //# sourceMappingURL=CapsuleCollider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CapsuleCollider.d.ts","sourceRoot":"","sources":["../../src/collision/CapsuleCollider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;;GAMG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,QAAQ,CAAC,YAAY,qBAAoB;IAEzC,UAAU,EAAE;QACV,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;QAClC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;QAClC,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;gBAEW,IAAI,GAAE;QAChB,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAC5B,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;KACb;IAYN,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;CAoB7E"}
@@ -0,0 +1,41 @@
1
+ import { BaseCollider } from './BaseCollider.js';
2
+ /**
3
+ * CapsuleCollider — a cylinder with hemispherical caps.
4
+ * Blender: Collision modifier on a capsule mesh.
5
+ *
6
+ * Good for character bodies, limbs, and pillars.
7
+ * Defined by two endpoint centers and a radius.
8
+ */
9
+ export class CapsuleCollider extends BaseCollider {
10
+ constructor(opts = {}) {
11
+ super();
12
+ this.colliderType = 'CapsuleCollider';
13
+ const a = opts.a ?? [0, -1, 0];
14
+ const b = opts.b ?? [0, 1, 0];
15
+ this.parameters = {
16
+ ax: a[0], ay: a[1], az: a[2],
17
+ bx: b[0], by: b[1], bz: b[2],
18
+ radius: opts.radius ?? 0.5,
19
+ friction: opts.friction ?? 0.1,
20
+ };
21
+ }
22
+ resolve(px, py, pz) {
23
+ if (!this.enabled)
24
+ return null;
25
+ const { ax, ay, az, bx, by, bz, radius } = this.parameters;
26
+ // Closest point on segment AB to point P
27
+ const abx = bx - ax, aby = by - ay, abz = bz - az;
28
+ const apx = px - ax, apy = py - ay, apz = pz - az;
29
+ const ab2 = abx * abx + aby * aby + abz * abz;
30
+ const t = ab2 > 0 ? Math.max(0, Math.min(1, (apx * abx + apy * aby + apz * abz) / ab2)) : 0;
31
+ const cx = ax + abx * t, cy = ay + aby * t, cz = az + abz * t;
32
+ const dx = px - cx, dy = py - cy, dz = pz - cz;
33
+ const d2 = dx * dx + dy * dy + dz * dz;
34
+ if (d2 >= radius * radius)
35
+ return null;
36
+ const d = Math.sqrt(d2) || 1e-6;
37
+ const inv = radius / d;
38
+ return [cx + dx * inv, cy + dy * inv, cz + dz * inv];
39
+ }
40
+ }
41
+ //# sourceMappingURL=CapsuleCollider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CapsuleCollider.js","sourceRoot":"","sources":["../../src/collision/CapsuleCollider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;;GAMG;AACH,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAU/C,YAAY,OAKR,EAAE;QACJ,KAAK,EAAE,CAAA;QAfA,iBAAY,GAAG,iBAAiB,CAAA;QAgBvC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9B,IAAI,CAAC,UAAU,GAAG;YAChB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5B,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,EAAG,IAAI,CAAC,MAAM,IAAK,GAAG;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,GAAG;SAC/B,CAAA;IACH,CAAC;IAED,OAAO,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU;QACxC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QAC9B,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAA;QAE1D,yCAAyC;QACzC,MAAM,GAAG,GAAG,EAAE,GAAC,EAAE,EAAE,GAAG,GAAG,EAAE,GAAC,EAAE,EAAE,GAAG,GAAG,EAAE,GAAC,EAAE,CAAA;QAC3C,MAAM,GAAG,GAAG,EAAE,GAAC,EAAE,EAAE,GAAG,GAAG,EAAE,GAAC,EAAE,EAAE,GAAG,GAAG,EAAE,GAAC,EAAE,CAAA;QAC3C,MAAM,GAAG,GAAG,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAA;QACvC,MAAM,CAAC,GAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAEvF,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,GAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAC,CAAC,CAAA;QACvD,MAAM,EAAE,GAAG,EAAE,GAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAC,EAAE,CAAA;QACxC,MAAM,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAA;QAEhC,IAAI,EAAE,IAAI,MAAM,GAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAEpC,MAAM,CAAC,GAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAA;QACjC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAA;QACtB,OAAO,CAAC,EAAE,GAAG,EAAE,GAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAC,GAAG,CAAC,CAAA;IAChD,CAAC;CACF"}