@fundamental-engine/three 0.4.0 → 0.5.1
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 +40 -2
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +34 -5
- package/dist/backend.js.map +1 -1
- package/dist/bodies.d.ts +18 -1
- package/dist/bodies.d.ts.map +1 -1
- package/dist/bodies.js +29 -1
- package/dist/bodies.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/layer.d.ts +60 -2
- package/dist/layer.d.ts.map +1 -1
- package/dist/layer.js +85 -10
- package/dist/layer.js.map +1 -1
- package/dist/samplers.d.ts.map +1 -1
- package/dist/samplers.js +31 -31
- package/dist/samplers.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -47,7 +47,7 @@ onto your page's global `THREE`:
|
|
|
47
47
|
```sh
|
|
48
48
|
echo "module.exports = window.THREE" > three-shim.cjs
|
|
49
49
|
npx esbuild node_modules/@fundamental-engine/three/dist/index.js --bundle --format=iife \
|
|
50
|
-
--global-name=FieldUI --alias:three=./three-shim.cjs --outfile=vendor/
|
|
50
|
+
--global-name=FieldUI --alias:three=./three-shim.cjs --outfile=vendor/Fundamental-three.js
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
## The particle bridge
|
|
@@ -120,11 +120,49 @@ const field = createThreeField({
|
|
|
120
120
|
|
|
121
121
|
The line overlays render fully; numeric label sprites (the `data` reading) are a tracked follow-up.
|
|
122
122
|
|
|
123
|
+
## Bodies — meshes that bend the field
|
|
124
|
+
|
|
125
|
+
A scene object can *be* a body (a force source). `layer.addBody(object3d, spec)` registers it: it
|
|
126
|
+
bends the field and the swarm responds, while `density`/`load`/`lit` feedback flows back to the mesh
|
|
127
|
+
(drive a uniform from `onFeedback`). A body **carries a `data` record** (a genome, an inventory), so a
|
|
128
|
+
mesh can be a meaningful agent, not just a force — and it can be **tagged** (`species`) and **selective**
|
|
129
|
+
(`affects`) so several ecologies share one field.
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
const bloom = layer.addBody(blossomMesh, {
|
|
133
|
+
tokens: 'attract', strength: 0.8, range: 260, // field px
|
|
134
|
+
species: 1, // this is "pollen-1" matter…
|
|
135
|
+
data: genome, // …carrying its genome
|
|
136
|
+
onFeedback: (ch) => glow.material.opacity = ch.density ?? 0,
|
|
137
|
+
});
|
|
138
|
+
bloom.set({ strength: 0.3 }); // live — no re-create
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Agents — creatures the engine moves
|
|
142
|
+
|
|
143
|
+
`layer.addAgent(object3d, opts)` makes a mesh a **field agent**: the engine *steps it* (it lives in the
|
|
144
|
+
particle pool, so it feels every force the swarm feels — body forces and the particle-level
|
|
145
|
+
`hunt`/`align`/`cohesion`) and drives the object's position each frame. This is the engine-stepped
|
|
146
|
+
successor to `FieldAgent` (which samples + integrates itself).
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
const bee = layer.addAgent(beeMesh, {
|
|
150
|
+
maxSpeed: 95, // field px/frame
|
|
151
|
+
species: 1, // tagged bodies (affects) steer it selectively
|
|
152
|
+
faceVelocity: true,
|
|
153
|
+
hover: { amp: 0.12, freq: 3 },
|
|
154
|
+
});
|
|
155
|
+
// layer.tick() now also advances the engine that moves the bee — no hand-rolled motion loop.
|
|
156
|
+
bee.remove();
|
|
157
|
+
```
|
|
158
|
+
|
|
123
159
|
## Building your own field visuals
|
|
124
160
|
|
|
125
161
|
The package re-exports the engine's field samplers — `forceAt` and `netField` — so you can drive
|
|
126
162
|
your own 3D visuals (streamline tubes, vector grids, density volumes) from the live field without a
|
|
127
|
-
second import.
|
|
163
|
+
second import. For **forage-by-gradient**, `layer.sampleScalar(x, y)` returns the smooth diffused
|
|
164
|
+
density ∈ [0,1] (enable it with `createFieldLayer({ heatmap: true })`); its gradient — unlike a
|
|
165
|
+
nearest-body readout — stays meaningful right at a source.
|
|
128
166
|
|
|
129
167
|
## License
|
|
130
168
|
|
package/dist/backend.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAKL,KAAK,EAMN,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,aAAa,EAAU,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,MAAM,WAAW,mBAAmB;IAClC,2FAA2F;IAC3F,UAAU,EAAE,eAAe,CAAC;IAC5B,kGAAkG;IAClG,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,6BAA6B;IAC7B,OAAO,IAAI,IAAI,CAAC;CACjB;AAQD,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CA2IpE"}
|
package/dist/backend.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* labels (the `data` reading's numeric chips) are not yet drawn; `measureText` is honored so the
|
|
15
15
|
* plates size correctly, and label sprites are a tracked follow-up. The line overlays need no text.
|
|
16
16
|
*/
|
|
17
|
-
import { AdditiveBlending, BufferGeometry, Float32BufferAttribute, Group, LineBasicMaterial, LineSegments, Mesh, MeshBasicMaterial, Vector3, } from 'three';
|
|
17
|
+
import { AdditiveBlending, BufferGeometry, DynamicDrawUsage, Float32BufferAttribute, Group, LineBasicMaterial, LineSegments, Mesh, MeshBasicMaterial, Vector3, } from 'three';
|
|
18
18
|
const _v = new Vector3();
|
|
19
19
|
/** A lazily-created 2D context purely for text metrics — never rendered to. */
|
|
20
20
|
function metricsContext() {
|
|
@@ -38,6 +38,35 @@ export function threeBackend(opts) {
|
|
|
38
38
|
const object = new Group();
|
|
39
39
|
object.add(lines, rects);
|
|
40
40
|
const metrics = metricsContext();
|
|
41
|
+
// persistent, growable GPU buffers — written in place each frame (DynamicDrawUsage) rather than
|
|
42
|
+
// reallocating four Float32Arrays + four Float32BufferAttributes per overlay frame, which orphaned
|
|
43
|
+
// the prior GPU buffers for the GC and forced a fresh upload every frame. Mirrors ParticlePool's
|
|
44
|
+
// growth model: grow with headroom only when a frame needs more room, reuse otherwise.
|
|
45
|
+
let linePosData = new Float32Array(0);
|
|
46
|
+
let lineColData = new Float32Array(0);
|
|
47
|
+
let rectPosData = new Float32Array(0);
|
|
48
|
+
let rectColData = new Float32Array(0);
|
|
49
|
+
function dynAttr(data) {
|
|
50
|
+
const attr = new Float32BufferAttribute(data, 3);
|
|
51
|
+
attr.setUsage(DynamicDrawUsage);
|
|
52
|
+
return attr;
|
|
53
|
+
}
|
|
54
|
+
lineGeom.setAttribute('position', dynAttr(linePosData));
|
|
55
|
+
lineGeom.setAttribute('color', dynAttr(lineColData));
|
|
56
|
+
rectGeom.setAttribute('position', dynAttr(rectPosData));
|
|
57
|
+
rectGeom.setAttribute('color', dynAttr(rectColData));
|
|
58
|
+
/** copy a frame's accumulator into its persistent GPU buffer, growing (with headroom) only when
|
|
59
|
+
* the frame needs more room than the buffer holds. Returns the buffer to keep (the same one in
|
|
60
|
+
* steady state). The stale tail beyond `src.length` is never drawn — setDrawRange bounds it. */
|
|
61
|
+
function sync(geom, name, src, data) {
|
|
62
|
+
if (src.length > data.length) {
|
|
63
|
+
data = new Float32Array(Math.ceil(src.length * 1.5)); // amortized grow; rare after warm-up
|
|
64
|
+
geom.setAttribute(name, dynAttr(data));
|
|
65
|
+
}
|
|
66
|
+
data.set(src);
|
|
67
|
+
geom.getAttribute(name).needsUpdate = true;
|
|
68
|
+
return data;
|
|
69
|
+
}
|
|
41
70
|
/** map a CSS-pixel point to the overlay plane and push xyz onto `arr` (overlay owns its own z). */
|
|
42
71
|
function pushPoint(arr, x, y) {
|
|
43
72
|
projection.toWorld(x, y, 0, 0, 0, _v); // z/heat/size irrelevant — the overlay draws at a fixed plane
|
|
@@ -48,11 +77,11 @@ export function threeBackend(opts) {
|
|
|
48
77
|
arr.push((r / 255) * a, (g / 255) * a, (b / 255) * a);
|
|
49
78
|
}
|
|
50
79
|
function flush() {
|
|
51
|
-
lineGeom
|
|
52
|
-
lineGeom
|
|
80
|
+
linePosData = sync(lineGeom, 'position', linePos, linePosData);
|
|
81
|
+
lineColData = sync(lineGeom, 'color', lineCol, lineColData);
|
|
53
82
|
lineGeom.setDrawRange(0, linePos.length / 3);
|
|
54
|
-
rectGeom
|
|
55
|
-
rectGeom
|
|
83
|
+
rectPosData = sync(rectGeom, 'position', rectPos, rectPosData);
|
|
84
|
+
rectColData = sync(rectGeom, 'color', rectCol, rectColData);
|
|
56
85
|
rectGeom.setDrawRange(0, rectPos.length / 3);
|
|
57
86
|
}
|
|
58
87
|
return {
|
package/dist/backend.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,KAAK,EACL,iBAAiB,EACjB,YAAY,EACZ,IAAI,EACJ,iBAAiB,EACjB,OAAO,GACR,MAAM,OAAO,CAAC;AAIf,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;AAgBzB,+EAA+E;AAC/E,SAAS,cAAc;IACrB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAyB;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;IAEzB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,YAAY,CAC5B,QAAQ,EACR,IAAI,iBAAiB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAChH,CAAC;IACF,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;IAE5B,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,IAAI,CACpB,QAAQ,EACR,IAAI,iBAAiB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAChH,CAAC;IACF,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;IAE5B,MAAM,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IAEjC,mGAAmG;IACnG,
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/bodies.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Meshes as bodies — the 3D form of
|
|
2
|
+
* Meshes as bodies — the 3D form of Fundamental's core idea ("every element is a body"). A
|
|
3
3
|
* `THREE.Object3D` registers as a field body: it bends the field (bodies are force sources), the
|
|
4
4
|
* swarm responds to it, and the field's local density bends *it* back through feedback. And because
|
|
5
5
|
* a body **carries a data record**, a mesh can be a meaningful agent — a bloom carrying its genome,
|
|
@@ -28,6 +28,10 @@ export interface FieldBodySpec {
|
|
|
28
28
|
/** the body's tint (`data-color`) — the `pigment` force dyes passing matter with it, so the
|
|
29
29
|
* swarm visibly carries this body's color to wherever it drifts next (conserved color transport). */
|
|
30
30
|
color?: string;
|
|
31
|
+
/** species tag this body stamps on matter it emits (a `spawn` source) — for multi-ecology fields. */
|
|
32
|
+
species?: number;
|
|
33
|
+
/** restrict this body's forces to these species (a selective body); omit to act on all matter. */
|
|
34
|
+
affects?: readonly number[];
|
|
31
35
|
/** opt into density/load feedback back onto the mesh (default `true`). */
|
|
32
36
|
feedback?: boolean;
|
|
33
37
|
/** the body's box half-size in field pixels — its footprint, not its range (default 20). */
|
|
@@ -46,6 +50,14 @@ export interface FieldBody {
|
|
|
46
50
|
data: unknown;
|
|
47
51
|
/** the body's most recent feedback (density/load/lit/…); `{}` until the field writes. */
|
|
48
52
|
readonly channels: Readonly<FeedbackChannels>;
|
|
53
|
+
/** update force params live — applied within a frame on the measure cadence, no re-scan
|
|
54
|
+
* (a fox getting hungrier, a lure fading). `angle` in degrees, for directional forces. */
|
|
55
|
+
set(params: {
|
|
56
|
+
strength?: number;
|
|
57
|
+
range?: number;
|
|
58
|
+
angle?: number;
|
|
59
|
+
spin?: number;
|
|
60
|
+
}): void;
|
|
49
61
|
/** unregister this body from the field. */
|
|
50
62
|
remove(): void;
|
|
51
63
|
}
|
|
@@ -75,5 +87,10 @@ export declare class FieldBodyRegistry {
|
|
|
75
87
|
remove(body: FieldBody): void;
|
|
76
88
|
/** every registered body (read-only). */
|
|
77
89
|
all(): readonly FieldBody[];
|
|
90
|
+
/** Drop every body and break the body↔element reference cycle (`el.__body`). Without this a
|
|
91
|
+
* retained `FieldBody` handle keeps the whole registry — and every body's `Object3D` — alive
|
|
92
|
+
* after the layer is destroyed. Also silences `onChange` so a late `remove()` can't re-scan a
|
|
93
|
+
* torn-down field. Called from `FieldLayer.destroy()`. */
|
|
94
|
+
clear(): void;
|
|
78
95
|
}
|
|
79
96
|
//# sourceMappingURL=bodies.d.ts.map
|
package/dist/bodies.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bodies.d.ts","sourceRoot":"","sources":["../src/bodies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,MAAM,WAAW,aAAa;IAC5B,+FAA+F;IAC/F,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACnC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;0GACsG;IACtG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,mGAAmG;IACnG,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACpE;AAED,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,2FAA2F;IAC3F,IAAI,EAAE,OAAO,CAAC;IACd,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC9C,2CAA2C;IAC3C,MAAM,IAAI,IAAI,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"bodies.d.ts","sourceRoot":"","sources":["../src/bodies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,MAAM,WAAW,aAAa;IAC5B,+FAA+F;IAC/F,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACnC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;0GACsG;IACtG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kGAAkG;IAClG,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,mGAAmG;IACnG,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACpE;AAED,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,2FAA2F;IAC3F,IAAI,EAAE,OAAO,CAAC;IACd,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC9C;+FAC2F;IAC3F,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACxF,2CAA2C;IAC3C,MAAM,IAAI,IAAI,CAAC;CAChB;AAmGD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,QAAQ,CAAwB;gBAE5B,UAAU,EAAE,eAAe;IAIvC,mFAAmF;IACnF,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAK1D,0EAA0E;IAC1E,aAAa,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAIhD,0FAA0F;IAC1F,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAIjC,kGAAkG;IAClG,IAAI,IAAI,IAAI,UAAU,CAMrB;IAED,8FAA8F;IAC9F,IAAI,IAAI,IAAI,YAAY,CAIvB;IAED,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,GAAG,SAAS;IAOrD,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAQ7B,yCAAyC;IACzC,GAAG,IAAI,SAAS,SAAS,EAAE;IAI3B;;;+DAG2D;IAC3D,KAAK,IAAI,IAAI;CAKd"}
|
package/dist/bodies.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Meshes as bodies — the 3D form of
|
|
2
|
+
* Meshes as bodies — the 3D form of Fundamental's core idea ("every element is a body"). A
|
|
3
3
|
* `THREE.Object3D` registers as a field body: it bends the field (bodies are force sources), the
|
|
4
4
|
* swarm responds to it, and the field's local density bends *it* back through feedback. And because
|
|
5
5
|
* a body **carries a data record**, a mesh can be a meaningful agent — a bloom carrying its genome,
|
|
@@ -18,6 +18,8 @@ class BodyImpl {
|
|
|
18
18
|
data;
|
|
19
19
|
channels = {};
|
|
20
20
|
el;
|
|
21
|
+
/** the live attr map the virtual element reads — mutating it makes params reactive (see set). */
|
|
22
|
+
attrs;
|
|
21
23
|
onFeedback;
|
|
22
24
|
registry;
|
|
23
25
|
constructor(registry, object, spec) {
|
|
@@ -35,8 +37,13 @@ class BodyImpl {
|
|
|
35
37
|
attrs['data-spin'] = String(spec.spin);
|
|
36
38
|
if (spec.angle != null)
|
|
37
39
|
attrs['data-angle'] = String(spec.angle);
|
|
40
|
+
if (spec.species != null)
|
|
41
|
+
attrs['data-species'] = String(spec.species);
|
|
42
|
+
if (spec.affects != null && spec.affects.length)
|
|
43
|
+
attrs['data-affects'] = spec.affects.join(',');
|
|
38
44
|
if (spec.feedback ?? true)
|
|
39
45
|
attrs['data-feedback'] = '';
|
|
46
|
+
this.attrs = attrs; // the virtual element's getAttribute closes over this same object
|
|
40
47
|
const half = (spec.sizePx ?? 20) / 2;
|
|
41
48
|
const self = this;
|
|
42
49
|
this.el = {
|
|
@@ -66,6 +73,17 @@ class BodyImpl {
|
|
|
66
73
|
this.channels = channels;
|
|
67
74
|
this.onFeedback?.(channels, this);
|
|
68
75
|
}
|
|
76
|
+
set(params) {
|
|
77
|
+
if (params.strength != null)
|
|
78
|
+
this.attrs['data-strength'] = String(params.strength);
|
|
79
|
+
if (params.range != null)
|
|
80
|
+
this.attrs['data-range'] = String(params.range);
|
|
81
|
+
if (params.angle != null)
|
|
82
|
+
this.attrs['data-angle'] = String(params.angle);
|
|
83
|
+
if (params.spin != null)
|
|
84
|
+
this.attrs['data-spin'] = String(params.spin);
|
|
85
|
+
// no re-scan: the engine re-reads these on the next measure cycle (reactive params)
|
|
86
|
+
}
|
|
69
87
|
remove() {
|
|
70
88
|
this.registry.remove(this);
|
|
71
89
|
}
|
|
@@ -133,5 +151,15 @@ export class FieldBodyRegistry {
|
|
|
133
151
|
all() {
|
|
134
152
|
return this.bodies;
|
|
135
153
|
}
|
|
154
|
+
/** Drop every body and break the body↔element reference cycle (`el.__body`). Without this a
|
|
155
|
+
* retained `FieldBody` handle keeps the whole registry — and every body's `Object3D` — alive
|
|
156
|
+
* after the layer is destroyed. Also silences `onChange` so a late `remove()` can't re-scan a
|
|
157
|
+
* torn-down field. Called from `FieldLayer.destroy()`. */
|
|
158
|
+
clear() {
|
|
159
|
+
for (const b of this.bodies)
|
|
160
|
+
b.el.__body = undefined;
|
|
161
|
+
this.bodies.length = 0;
|
|
162
|
+
this.onChange = () => { };
|
|
163
|
+
}
|
|
136
164
|
}
|
|
137
165
|
//# sourceMappingURL=bodies.js.map
|
package/dist/bodies.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bodies.js","sourceRoot":"","sources":["../src/bodies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAKhC,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"bodies.js","sourceRoot":"","sources":["../src/bodies.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
* ```
|
|
22
22
|
*/
|
|
23
23
|
export { FieldLayer, createFieldLayer, createThreeField } from './layer.ts';
|
|
24
|
-
export type { FieldLayerOptions, ThreeFieldOptions } from './layer.ts';
|
|
24
|
+
export type { FieldLayerOptions, ThreeFieldOptions, MeshAgentOptions, MeshAgentHandle } from './layer.ts';
|
|
25
|
+
export type { AgentSpec, AgentHandle } from '@fundamental-engine/core';
|
|
25
26
|
export { threeHost } from './host.ts';
|
|
26
27
|
export type { ThreeHostOptions } from './host.ts';
|
|
27
28
|
export { threeBackend } from './backend.ts';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAErG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE3G,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE1G,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAErG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE3G,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI5E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjE,kFAAkF;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,uFAAuF;AACvF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE9E,+FAA+F;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,+FAA+F;AAC/F,iFAAiF;AACjF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/layer.d.ts
CHANGED
|
@@ -16,12 +16,37 @@
|
|
|
16
16
|
* The engine self-advances on the host's animation frame; `tick()` only reads the current state into
|
|
17
17
|
* the geometry, so it is safe to call from any render loop at any cadence.
|
|
18
18
|
*/
|
|
19
|
-
import type { AtomPayload, FieldHandle, FieldOptions, FlowOptions, HostViewport, ThreadLink } from '@fundamental-engine/core';
|
|
19
|
+
import type { AgentHandle, AgentSpec, AtomPayload, FieldHandle, FieldOptions, FlowOptions, HostViewport, ScalarGrid, ThreadLink, FieldEventType, FieldEventMap, BodySpec, BodyHandle, FieldChannelHandle } from '@fundamental-engine/core';
|
|
20
20
|
import { Group } from 'three';
|
|
21
21
|
import type { Object3D, WebGLRenderer } from 'three';
|
|
22
22
|
import { type FieldProjection } from './project.ts';
|
|
23
23
|
import { ParticlePool, type ParticleStyle } from './particles.ts';
|
|
24
24
|
import { FieldBodyRegistry, type FieldBody, type FieldBodySpec } from './bodies.ts';
|
|
25
|
+
/** Options for `FieldLayer.addAgent(object3d, opts)` — an engine-stepped, mesh-bound agent. */
|
|
26
|
+
export interface MeshAgentOptions {
|
|
27
|
+
/** top speed in field px/frame (default 80). */
|
|
28
|
+
maxSpeed?: number;
|
|
29
|
+
/** inertial mass — heavier agents accelerate less (default 1). */
|
|
30
|
+
mass?: number;
|
|
31
|
+
/** species tag, so tagged bodies (`affects`) and `hunt` act on it selectively. */
|
|
32
|
+
species?: number;
|
|
33
|
+
/** aim the object along its travel direction each frame (default true). */
|
|
34
|
+
faceVelocity?: boolean;
|
|
35
|
+
/** an optional world-y hover bob layered on the projected position. */
|
|
36
|
+
hover?: {
|
|
37
|
+
amp: number;
|
|
38
|
+
freq: number;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Handle for a mesh agent added via `FieldLayer.addAgent(object3d, …)`. */
|
|
42
|
+
export interface MeshAgentHandle {
|
|
43
|
+
/** the scene object the engine drives. */
|
|
44
|
+
readonly object: Object3D;
|
|
45
|
+
/** the underlying core agent (`particle`, `remove()`). */
|
|
46
|
+
readonly agent: AgentHandle;
|
|
47
|
+
/** retire the agent and stop driving the object. */
|
|
48
|
+
remove(): void;
|
|
49
|
+
}
|
|
25
50
|
export interface FieldLayerOptions extends Omit<FieldOptions, 'host' | 'render'> {
|
|
26
51
|
/** the 2D↔3D mapping; defaults to a centered `PlaneProjection`. */
|
|
27
52
|
projection?: FieldProjection;
|
|
@@ -45,6 +70,8 @@ export declare class FieldLayer implements FieldHandle {
|
|
|
45
70
|
readonly pool: ParticlePool;
|
|
46
71
|
/** the active 2D↔3D mapping. */
|
|
47
72
|
readonly projection: FieldProjection;
|
|
73
|
+
/** the engine-stepped mesh agents — `layer.addAgent(...)`; all retired on `destroy()`. */
|
|
74
|
+
private readonly agents;
|
|
48
75
|
/** the mesh-bodies registered on this field — `layer.addBody(...)` is the ergonomic entry. */
|
|
49
76
|
readonly bodies: FieldBodyRegistry;
|
|
50
77
|
private readonly field;
|
|
@@ -56,6 +83,18 @@ export declare class FieldLayer implements FieldHandle {
|
|
|
56
83
|
* `.data`, `.channels`, and `.remove()` you use; the body tracks the mesh as it moves.
|
|
57
84
|
*/
|
|
58
85
|
addBody(object: Object3D, spec: FieldBodySpec): FieldBody;
|
|
86
|
+
addBody(spec: BodySpec): BodyHandle;
|
|
87
|
+
/**
|
|
88
|
+
* Add an **agent**: a scene object the engine *moves*. The integrator steps it (it feels every
|
|
89
|
+
* force the swarm feels — body forces and the particle-level `hunt`/`align`/`cohesion`) and drives
|
|
90
|
+
* the object's position through the projection each frame; `maxSpeed` caps it, `faceVelocity` aims
|
|
91
|
+
* it, `hover` adds a bob. Returns a handle (`object`, the core `agent`, `remove()`). The aligned,
|
|
92
|
+
* engine-stepped successor to the self-integrating `FieldAgent` — the creatures primitive.
|
|
93
|
+
*
|
|
94
|
+
* The raw `addAgent(spec)` (the `FieldHandle` form) is also accepted for full-control callers.
|
|
95
|
+
*/
|
|
96
|
+
addAgent(object: Object3D, opts?: MeshAgentOptions): MeshAgentHandle;
|
|
97
|
+
addAgent(spec: AgentSpec): AgentHandle;
|
|
59
98
|
/** sync the swarm geometry from the engine's current particle state; returns the live count. */
|
|
60
99
|
tick(): number;
|
|
61
100
|
scan(): void;
|
|
@@ -66,6 +105,8 @@ export declare class FieldLayer implements FieldHandle {
|
|
|
66
105
|
setAttention(on: boolean): void;
|
|
67
106
|
setCausality(on: boolean): void;
|
|
68
107
|
setHeatmap(on: boolean): void;
|
|
108
|
+
/** lower/raise the backing-store DPR ceiling at runtime (the dominant fill-rate lever). */
|
|
109
|
+
setDprCap(cap: number): void;
|
|
69
110
|
setRender(mode: Parameters<FieldHandle['setRender']>[0]): void;
|
|
70
111
|
setOverlay(mode: Parameters<FieldHandle['setOverlay']>[0]): void;
|
|
71
112
|
setVisible(on: boolean): void;
|
|
@@ -79,6 +120,8 @@ export declare class FieldLayer implements FieldHandle {
|
|
|
79
120
|
clearFocus(): void;
|
|
80
121
|
particleCount(): number;
|
|
81
122
|
readParticles(out: Float32Array): number;
|
|
123
|
+
/** copy each live particle's stable id into a Uint32Array, parallel to readParticles. */
|
|
124
|
+
readParticleIds(out: Uint32Array): number;
|
|
82
125
|
energy(): {
|
|
83
126
|
kinetic: number;
|
|
84
127
|
thermal: number;
|
|
@@ -89,9 +132,24 @@ export declare class FieldLayer implements FieldHandle {
|
|
|
89
132
|
x: number;
|
|
90
133
|
y: number;
|
|
91
134
|
};
|
|
135
|
+
/** smooth density scalar ∈ [0,1] at `(x, y)` — pass `createFieldLayer({ heatmap: true })` to enable. */
|
|
136
|
+
sampleScalar(x: number, y: number): number;
|
|
137
|
+
/** density gradient ∇ at `(x, y)` — up-density direction in field px; needs `{ heatmap: true }`, `{0,0}` when off. */
|
|
138
|
+
sampleGradient(x: number, y: number): {
|
|
139
|
+
x: number;
|
|
140
|
+
y: number;
|
|
141
|
+
};
|
|
142
|
+
/** register a named external scalar field channel (terrain height, soil moisture) the engine samples. */
|
|
143
|
+
addField(name: string, sampler: (x: number, y: number) => number): FieldChannelHandle;
|
|
144
|
+
/** sample a registered field channel at (x, y); 0 for an unknown channel. */
|
|
145
|
+
sampleField(name: string, x: number, y: number): number;
|
|
146
|
+
/** open a named host-authorable scalar grid (deposit/sample/gradient/decay) in field px — a scent/wear/goal field. */
|
|
147
|
+
grid(name: string): ScalarGrid;
|
|
148
|
+
/** subscribe to a discrete field event (absorb/release/settle); returns an unsubscribe fn. */
|
|
149
|
+
on<K extends FieldEventType>(type: K, cb: (e: FieldEventMap[K]) => void): () => void;
|
|
92
150
|
scrollV(): number;
|
|
93
151
|
setBackground(mode: Parameters<FieldHandle['setBackground']>[0]): void;
|
|
94
|
-
/** stop the engine, release host listeners, and free the swarm's GPU resources. */
|
|
152
|
+
/** stop the engine, release host listeners, retire agents, and free the swarm's GPU resources. */
|
|
95
153
|
destroy(): void;
|
|
96
154
|
}
|
|
97
155
|
/** Construct a `FieldLayer`. The ergonomic entry point — mirrors `mountField()` for Three.js. */
|
package/dist/layer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer.d.ts","sourceRoot":"","sources":["../src/layer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"layer.d.ts","sourceRoot":"","sources":["../src/layer.ts"],"names":[],"mappings":"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"}
|
package/dist/layer.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* the geometry, so it is safe to call from any render loop at any cadence.
|
|
18
18
|
*/
|
|
19
19
|
import { createField } from '@fundamental-engine/core';
|
|
20
|
-
import { Group } from 'three';
|
|
20
|
+
import { Group, Vector3 } from 'three';
|
|
21
21
|
import { threeHost } from "./host.js";
|
|
22
22
|
import { PlaneProjection, VolumeProjection } from "./project.js";
|
|
23
23
|
import { ParticlePool } from "./particles.js";
|
|
@@ -27,6 +27,7 @@ import { FieldBodyRegistry } from "./bodies.js";
|
|
|
27
27
|
function stubCanvas() {
|
|
28
28
|
return typeof document !== 'undefined' ? document.createElement('canvas') : {};
|
|
29
29
|
}
|
|
30
|
+
const _v = new Vector3();
|
|
30
31
|
export class FieldLayer {
|
|
31
32
|
/** add this to your scene; it holds the swarm `Points` (and future overlay objects). */
|
|
32
33
|
object;
|
|
@@ -34,6 +35,8 @@ export class FieldLayer {
|
|
|
34
35
|
pool;
|
|
35
36
|
/** the active 2D↔3D mapping. */
|
|
36
37
|
projection;
|
|
38
|
+
/** the engine-stepped mesh agents — `layer.addAgent(...)`; all retired on `destroy()`. */
|
|
39
|
+
agents = [];
|
|
37
40
|
/** the mesh-bodies registered on this field — `layer.addBody(...)` is the ergonomic entry. */
|
|
38
41
|
bodies;
|
|
39
42
|
field;
|
|
@@ -59,14 +62,51 @@ export class FieldLayer {
|
|
|
59
62
|
this.object = new Group();
|
|
60
63
|
this.object.add(this.pool.points);
|
|
61
64
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
addBody(a, spec) {
|
|
66
|
+
// the core FieldHandle form (a plain spec, no mesh): delegate straight to the engine.
|
|
67
|
+
if (spec === undefined)
|
|
68
|
+
return this.field.addBody(a);
|
|
69
|
+
return this.bodies.add(a, spec);
|
|
70
|
+
}
|
|
71
|
+
addAgent(a, opts = {}) {
|
|
72
|
+
if (!a.isObject3D)
|
|
73
|
+
return this.field.addAgent(a);
|
|
74
|
+
const object = a;
|
|
75
|
+
object.getWorldPosition(_v);
|
|
76
|
+
const start = this.projection.toField(_v);
|
|
77
|
+
const face = opts.faceVelocity ?? true;
|
|
78
|
+
const hover = opts.hover;
|
|
79
|
+
const look = new Vector3();
|
|
80
|
+
let n = 0;
|
|
81
|
+
const agent = this.field.addAgent({
|
|
82
|
+
x: start.x,
|
|
83
|
+
y: start.y,
|
|
84
|
+
species: opts.species,
|
|
85
|
+
mass: opts.mass,
|
|
86
|
+
maxSpeed: opts.maxSpeed ?? 80,
|
|
87
|
+
report: (p) => {
|
|
88
|
+
this.projection.toWorld(p.x, p.y, p.z ?? 0, 0, 0, object.position);
|
|
89
|
+
if (hover)
|
|
90
|
+
object.position.y += Math.sin(n++ * 0.1 * hover.freq) * hover.amp;
|
|
91
|
+
if (face && p.vx * p.vx + p.vy * p.vy > 1e-3) {
|
|
92
|
+
this.projection.toWorld(p.x + p.vx * 0.1, p.y + p.vy * 0.1, p.z ?? 0, 0, 0, look);
|
|
93
|
+
look.y = object.position.y;
|
|
94
|
+
object.lookAt(look);
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
const handle = {
|
|
99
|
+
object,
|
|
100
|
+
agent,
|
|
101
|
+
remove: () => {
|
|
102
|
+
agent.remove();
|
|
103
|
+
const i = this.agents.indexOf(handle);
|
|
104
|
+
if (i >= 0)
|
|
105
|
+
this.agents.splice(i, 1);
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
this.agents.push(handle);
|
|
109
|
+
return handle;
|
|
70
110
|
}
|
|
71
111
|
/** sync the swarm geometry from the engine's current particle state; returns the live count. */
|
|
72
112
|
tick() {
|
|
@@ -97,6 +137,10 @@ export class FieldLayer {
|
|
|
97
137
|
setHeatmap(on) {
|
|
98
138
|
this.field.setHeatmap(on);
|
|
99
139
|
}
|
|
140
|
+
/** lower/raise the backing-store DPR ceiling at runtime (the dominant fill-rate lever). */
|
|
141
|
+
setDprCap(cap) {
|
|
142
|
+
this.field.setDprCap(cap);
|
|
143
|
+
}
|
|
100
144
|
setRender(mode) {
|
|
101
145
|
this.field.setRender(mode);
|
|
102
146
|
}
|
|
@@ -136,22 +180,53 @@ export class FieldLayer {
|
|
|
136
180
|
readParticles(out) {
|
|
137
181
|
return this.field.readParticles(out);
|
|
138
182
|
}
|
|
183
|
+
/** copy each live particle's stable id into a Uint32Array, parallel to readParticles. */
|
|
184
|
+
readParticleIds(out) {
|
|
185
|
+
return this.field.readParticleIds(out);
|
|
186
|
+
}
|
|
139
187
|
energy() {
|
|
140
188
|
return this.field.energy();
|
|
141
189
|
}
|
|
142
190
|
sample(x, y) {
|
|
143
191
|
return this.field.sample(x, y);
|
|
144
192
|
}
|
|
193
|
+
/** smooth density scalar ∈ [0,1] at `(x, y)` — pass `createFieldLayer({ heatmap: true })` to enable. */
|
|
194
|
+
sampleScalar(x, y) {
|
|
195
|
+
return this.field.sampleScalar(x, y);
|
|
196
|
+
}
|
|
197
|
+
/** density gradient ∇ at `(x, y)` — up-density direction in field px; needs `{ heatmap: true }`, `{0,0}` when off. */
|
|
198
|
+
sampleGradient(x, y) {
|
|
199
|
+
return this.field.sampleGradient(x, y);
|
|
200
|
+
}
|
|
201
|
+
/** register a named external scalar field channel (terrain height, soil moisture) the engine samples. */
|
|
202
|
+
addField(name, sampler) {
|
|
203
|
+
return this.field.addField(name, sampler);
|
|
204
|
+
}
|
|
205
|
+
/** sample a registered field channel at (x, y); 0 for an unknown channel. */
|
|
206
|
+
sampleField(name, x, y) {
|
|
207
|
+
return this.field.sampleField(name, x, y);
|
|
208
|
+
}
|
|
209
|
+
/** open a named host-authorable scalar grid (deposit/sample/gradient/decay) in field px — a scent/wear/goal field. */
|
|
210
|
+
grid(name) {
|
|
211
|
+
return this.field.grid(name);
|
|
212
|
+
}
|
|
213
|
+
/** subscribe to a discrete field event (absorb/release/settle); returns an unsubscribe fn. */
|
|
214
|
+
on(type, cb) {
|
|
215
|
+
return this.field.on(type, cb);
|
|
216
|
+
}
|
|
145
217
|
scrollV() {
|
|
146
218
|
return this.field.scrollV();
|
|
147
219
|
}
|
|
148
220
|
setBackground(mode) {
|
|
149
221
|
this.field.setBackground(mode);
|
|
150
222
|
}
|
|
151
|
-
/** stop the engine, release host listeners, and free the swarm's GPU resources. */
|
|
223
|
+
/** stop the engine, release host listeners, retire agents, and free the swarm's GPU resources. */
|
|
152
224
|
destroy() {
|
|
225
|
+
for (const a of this.agents.slice())
|
|
226
|
+
a.remove();
|
|
153
227
|
this.field.destroy();
|
|
154
228
|
this.pool.dispose();
|
|
229
|
+
this.bodies.clear(); // drop body↔mesh refs so a retained handle can't pin the registry
|
|
155
230
|
}
|
|
156
231
|
}
|
|
157
232
|
/** Construct a `FieldLayer`. The ergonomic entry point — mirrors `mountField()` for Three.js. */
|
package/dist/layer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer.js","sourceRoot":"","sources":["../src/layer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"layer.js","sourceRoot":"","sources":["../src/layer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAwB,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,YAAY,EAAsB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAsC,MAAM,aAAa,CAAC;AAEpF;uDACuD;AACvD,SAAS,UAAU;IACjB,OAAO,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,EAAwB,CAAC;AACxG,CAAC;AAED,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;AA2CzB,MAAM,OAAO,UAAU;IACrB,wFAAwF;IAC/E,MAAM,CAAQ;IACvB,qEAAqE;IAC5D,IAAI,CAAe;IAC5B,gCAAgC;IACvB,UAAU,CAAkB;IACrC,0FAA0F;IACzE,MAAM,GAAsB,EAAE,CAAC;IAChD,8FAA8F;IACrF,MAAM,CAAoB;IAClB,KAAK,CAAc;IAEpC,YAAY,OAA0B,EAAE;QACtC,+FAA+F;QAC/F,IAAI,CAAC,UAAU;YACb,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;QAC1H,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,GAAW,EAAE,CAC9B,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,gBAAgB,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjH,MAAM,QAAQ,GAAG,GAAiB,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QACxF,iFAAiF;QACjF,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAE7D,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC;QACxF,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ,CAAC;QACd,KAAK,GAAG,CAAC;QACT,KAAK,IAAI,CAAC;QACV,wFAAwF;QACxF,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,IAAI,UAAU,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzH,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,IAAI,GAAG,IAAI,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAUD,OAAO,CAAC,CAAsB,EAAE,IAAoB;QAClD,sFAAsF;QACtF,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAa,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAa,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAaD,QAAQ,CAAC,CAAuB,EAAE,OAAyB,EAAE;QAC3D,IAAI,CAAE,CAA8B,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAc,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,CAAa,CAAC;QAC7B,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAChC,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;YAC7B,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;gBACZ,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACnE,IAAI,KAAK;oBAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;gBAC7E,IAAI,IAAI,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;oBAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;oBAClF,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QACH,MAAM,MAAM,GAAoB;YAC9B,MAAM;YACN,KAAK;YACL,MAAM,EAAE,GAAG,EAAE;gBACX,KAAK,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;SACF,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gGAAgG;IAChG,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,+FAA+F;IAC/F,IAAI;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,MAAM;QACJ,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC;IACD,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,UAAU,CAAC,OAAmC;QAC5C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,YAAY,CAAC,IAAY;QACvB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,YAAY,CAAC,EAAW;QACtB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,YAAY,CAAC,EAAW;QACtB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,UAAU,CAAC,EAAW;QACpB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,2FAA2F;IAC3F,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,SAAS,CAAC,IAA6C;QACrD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,UAAU,CAAC,IAA8C;QACvD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,UAAU,CAAC,EAAW;QACpB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,IAAyB;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,CAAS,EAAE,CAAS,EAAE,GAAY;QACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,CAAC,CAAS,EAAE,CAAS,EAAE,QAAsB;QACjD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,SAAS;QACP,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,KAA6B;QAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,CAAC,CAAS,EAAE,CAAS;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,CAAS,EAAE,CAAS;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IACD,aAAa;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC;IACD,aAAa,CAAC,GAAiB;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IACD,yFAAyF;IACzF,eAAe,CAAC,GAAgB;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IACD,MAAM,CAAC,CAAS,EAAE,CAAS;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,wGAAwG;IACxG,YAAY,CAAC,CAAS,EAAE,CAAS;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,sHAAsH;IACtH,cAAc,CAAC,CAAS,EAAE,CAAS;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,yGAAyG;IACzG,QAAQ,CAAC,IAAY,EAAE,OAAyC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,6EAA6E;IAC7E,WAAW,CAAC,IAAY,EAAE,CAAS,EAAE,CAAS;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,sHAAsH;IACtH,IAAI,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,8FAA8F;IAC9F,EAAE,CAA2B,IAAO,EAAE,EAAiC;QACrE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IACD,aAAa,CAAC,IAAiD;QAC7D,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,kGAAkG;IAClG,OAAO;QACL,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,CAAC,CAAC,MAAM,EAAE,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,kEAAkE;IACzF,CAAC;CACF;AAED,iGAAiG;AACjG,MAAM,UAAU,gBAAgB,CAAC,OAA0B,EAAE;IAC3D,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAuB;IACtD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC;IACtD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,OAAO,WAAW,CAAC,MAAM,IAAI,UAAU,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACrE,CAAC"}
|
package/dist/samplers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"samplers.d.ts","sourceRoot":"","sources":["../src/samplers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,EAQN,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"samplers.d.ts","sourceRoot":"","sources":["../src/samplers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,EAQN,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAQD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9B,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5F;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAU5B;AAED,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,UAAU,EAAE,eAAe,CAAC;IAC5B,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,uFAAuF;IACvF,MAAM,IAAI,IAAI,CAAC;IACf,6BAA6B;IAC7B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,WAAW,CAoEtF;AAED,MAAM,WAAW,sBAAsB;IACrC,6CAA6C;IAC7C,UAAU,EAAE,eAAe,CAAC;IAC5B,4EAA4E;IAC5E,KAAK,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnC,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,kGAAkG;AAClG,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,sBAAsB,GAAG,WAAW,CAuC9F"}
|
package/dist/samplers.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* The tracing/sampling core is pure (no WebGL) and unit-tested; only the geometry needs a renderer.
|
|
9
9
|
*/
|
|
10
10
|
import { CatmullRomCurve3, Color, ConeGeometry, Group, InstancedMesh, Matrix4, Mesh, MeshBasicMaterial, Quaternion, TubeGeometry, Vector3, } from 'three';
|
|
11
|
+
import { traceFieldLine } from '@fundamental-engine/core';
|
|
11
12
|
const _pos = new Vector3();
|
|
12
13
|
const _quat = new Quaternion();
|
|
13
14
|
const _scl = new Vector3();
|
|
@@ -19,22 +20,15 @@ const _zAxis = new Vector3(0, 0, 1);
|
|
|
19
20
|
* field), or `maxSteps`.
|
|
20
21
|
*/
|
|
21
22
|
export function traceStreamline(field, seed, opts) {
|
|
22
|
-
const { width, height, maxSteps = 80, stepLen = 8
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
x += (v.x / m) * stepLen;
|
|
32
|
-
y += (v.y / m) * stepLen;
|
|
33
|
-
if (x < 0 || y < 0 || x > width || y > height)
|
|
34
|
-
break;
|
|
35
|
-
pts.push({ x, y });
|
|
36
|
-
}
|
|
37
|
-
return pts;
|
|
23
|
+
const { width, height, maxSteps = 80, stepLen = 8 } = opts;
|
|
24
|
+
// Delegate to the core tracer rather than re-walking the field forward-only: traceFieldLine is
|
|
25
|
+
// bidirectional (the seed sits mid-line), closes loops, and carries a turn budget so a vortex
|
|
26
|
+
// can't wind the whole step budget into one circle — the qualities the old local walk lacked.
|
|
27
|
+
return traceFieldLine((x, y) => field.sample(x, y), seed.x, seed.y, {
|
|
28
|
+
step: stepLen,
|
|
29
|
+
maxSteps,
|
|
30
|
+
bounds: { w: width, h: height },
|
|
31
|
+
});
|
|
38
32
|
}
|
|
39
33
|
/** An instanced grid of arrows showing the field direction + magnitude across the plane. */
|
|
40
34
|
export function vectorField(field, opts) {
|
|
@@ -52,28 +46,34 @@ export function vectorField(field, opts) {
|
|
|
52
46
|
mesh.frustumCulled = false;
|
|
53
47
|
const group = new Group();
|
|
54
48
|
group.add(mesh);
|
|
49
|
+
// persistent per-cell sample scratch (reused every update — no per-call array allocation).
|
|
50
|
+
// The grid position is recomputed from the flat index, so only the sampled vector is stored.
|
|
51
|
+
const vx = new Float64Array(count);
|
|
52
|
+
const vy = new Float64Array(count);
|
|
53
|
+
// EMA-smoothed peak (the core "pulsing lesson", field.ts §streamlines): normalizing by the raw
|
|
54
|
+
// per-frame max makes every arrow jitter as a transient (a dragged body, an animated strength)
|
|
55
|
+
// shifts the peak frame to frame. Ease the peak up fast so a real spike normalizes promptly, and
|
|
56
|
+
// down slowly so the field reads as a calm pulse rather than a flicker.
|
|
57
|
+
let peak = 1e-6;
|
|
55
58
|
const update = () => {
|
|
56
|
-
let
|
|
57
|
-
const fx = [];
|
|
58
|
-
const fy = [];
|
|
59
|
-
const vx = [];
|
|
60
|
-
const vy = [];
|
|
59
|
+
let frameMax = 1e-6;
|
|
61
60
|
for (let r = 0; r < rows; r++) {
|
|
62
61
|
for (let c = 0; c < cols; c++) {
|
|
63
|
-
const
|
|
64
|
-
const py = (r + 0.5) * step;
|
|
65
|
-
const v = field.sample(px, py);
|
|
62
|
+
const v = field.sample((c + 0.5) * step, (r + 0.5) * step);
|
|
66
63
|
const m = Math.hypot(v.x, v.y);
|
|
67
|
-
if (m >
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
vy.push(v.y);
|
|
64
|
+
if (m > frameMax)
|
|
65
|
+
frameMax = m;
|
|
66
|
+
const i = r * cols + c;
|
|
67
|
+
vx[i] = v.x;
|
|
68
|
+
vy[i] = v.y;
|
|
73
69
|
}
|
|
74
70
|
}
|
|
71
|
+
peak += (frameMax - peak) * (frameMax > peak ? 0.5 : 0.05);
|
|
72
|
+
const max = peak;
|
|
75
73
|
for (let i = 0; i < count; i++) {
|
|
76
|
-
|
|
74
|
+
const px = ((i % cols) + 0.5) * step;
|
|
75
|
+
const py = (Math.floor(i / cols) + 0.5) * step;
|
|
76
|
+
projection.toWorld(px, py, 0, 0, 0, _pos);
|
|
77
77
|
_pos.z = z;
|
|
78
78
|
const rel = Math.sqrt(Math.hypot(vx[i], vy[i]) / max); // sqrt compression so weak arrows read
|
|
79
79
|
// field-y is down → world-y up, so the world direction is (vx, -vy)
|
package/dist/samplers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"samplers.js","sourceRoot":"","sources":["../src/samplers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,KAAK,EACL,aAAa,EACb,OAAO,EACP,IAAI,EACJ,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,OAAO,GACR,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"samplers.js","sourceRoot":"","sources":["../src/samplers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,KAAK,EACL,aAAa,EACb,OAAO,EACP,IAAI,EACJ,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,OAAO,GACR,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQ1D,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;AAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;AAC/B,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;AAC3B,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;AAC3B,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEpC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAmB,EACnB,IAA8B,EAC9B,IAA6F;IAE7F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAC3D,+FAA+F;IAC/F,8FAA8F;IAC9F,8FAA8F;IAC9F,OAAO,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE;QAClE,IAAI,EAAE,OAAO;QACb,QAAQ;QACR,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE;KAChC,CAAC,CAAC;AACL,CAAC;AAwBD,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,KAAmB,EAAE,IAAwB;IACvE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,KAAK,GAAG,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IACrF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IAE1B,kFAAkF;IAClF,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAE3B,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEhB,2FAA2F;IAC3F,6FAA6F;IAC7F,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,+FAA+F;IAC/F,+FAA+F;IAC/F,iGAAiG;IACjG,wEAAwE;IACxE,IAAI,IAAI,GAAG,IAAI,CAAC;IAEhB,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,GAAG,QAAQ;oBAAE,QAAQ,GAAG,CAAC,CAAC;gBAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;gBACvB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACZ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACd,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;YACrC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;YAC/C,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,uCAAuC;YAChG,oEAAoE;YACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC;YAC1C,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC;IACzC,CAAC,CAAC;IACF,MAAM,EAAE,CAAC;IAET,OAAO;QACL,MAAM,EAAE,KAAK;QACb,MAAM;QACN,OAAO,EAAE,GAAG,EAAE;YACZ,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC;AAoBD,kGAAkG;AAClG,MAAM,UAAU,eAAe,CAAC,KAAmB,EAAE,IAA4B;IAC/E,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,GAAG,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,GAAG,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAChH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACrG,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAE1B,MAAM,UAAU,GAAG,GAA+B,EAAE;QAClD,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QAClC,MAAM,GAAG,GAA+B,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,IAAI;YAAE,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9G,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ;YAAG,KAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACvE,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/E,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACzB,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACR,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1G,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC;IACF,MAAM,EAAE,CAAC;IAET,OAAO;QACL,MAAM,EAAE,KAAK;QACb,MAAM;QACN,OAAO,EAAE,GAAG,EAAE;YACZ,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ;gBAAG,KAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACvE,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fundamental-engine/three",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Three.js authoring surface for Fundamental — run the reciprocal field engine headless and render its swarm as a THREE.Points layer (the particle bridge), plus threeHost() and threeBackend() (a RenderBackend) for binding the engine to a WebGL scene.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"three": ">=0.147.0"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@fundamental-engine/core": "0.
|
|
52
|
+
"@fundamental-engine/core": "0.5.1"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"three": "^0.169.0",
|