@descix/frqtl-node 0.6.0-p0.1 → 0.6.0-p0.2
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/CLAUDE.md +1 -1
- package/LICENSE.md +664 -0
- package/README.md +1 -1
- package/dist/dist-manifest.json +125 -125
- package/dist/fat/pkg-node/egpt_wasm.js +7 -7
- package/dist/fat/pkg-node/egpt_wasm_bg.wasm +0 -0
- package/dist/fat/pkg-node/package.json +1 -1
- package/dist/frqtl/compat/providers/wasm-engine.js +29 -31
- package/dist/frqtl/compat/providers/wasm-load-browser.js +2 -2
- package/dist/frqtl/compat/renderer/RenderFamily.js +1 -2
- package/dist/frqtl/compat/renderer/RenderMesh.js +2 -3
- package/dist/frqtl/compat/renderer/RenderShape.js +1 -1
- package/dist/frqtl/compat/renderer/captureStill-common.js +1 -2
- package/dist/frqtl/compat/renderer/display-slot.js +1 -1
- package/dist/frqtl/compat/renderer/providers/p5-provider.js +5 -5
- package/dist/frqtl/compat/renderer/providers/three-camera-contract.js +1 -1
- package/dist/frqtl/compat/renderer/providers/three-camera-geometry.js +4 -4
- package/dist/frqtl/compat/renderer/providers/three-provider.js +23 -27
- package/dist/frqtl/compat/renderer/renderCapabilities-common.js +2 -2
- package/dist/frqtl/compat/renderer/renderer-provider-contract.js +1 -1
- package/dist/frqtl/compat/vendor.js +2 -2
- package/dist/frqtl/objects/FrqtlApp.js +22 -24
- package/dist/frqtl/objects/ObjectFactory.js +1 -2
- package/dist/frqtl/objects/constants/WallBehaviors.js +5 -5
- package/dist/frqtl/objects/geometry/SlabFace.js +6 -6
- package/dist/frqtl/objects/instruments/capture-host.js +2 -2
- package/dist/frqtl/objects/instruments/capture.js +4 -5
- package/dist/frqtl/objects/instruments/hosted-eyes.js +3 -4
- package/dist/frqtl/objects/objects/DirectedTunnel.js +10 -11
- package/dist/frqtl/objects/objects/LightSource.js +22 -25
- package/dist/frqtl/objects/objects/QuantumEmitter.js +14 -14
- package/dist/frqtl/objects/objects/Tube.js +14 -14
- package/dist/frqtl/objects/objects/absorbRadiation.js +12 -13
- package/dist/frqtl/objects/objects/actionCompiler.js +52 -52
- package/dist/frqtl/objects/objects/controlAction.js +2 -2
- package/dist/frqtl/objects/objects/controlBind.js +2 -2
- package/dist/frqtl/objects/objects/directedRedirectProgram.js +3 -3
- package/dist/frqtl/objects/objects/emitterProgram.js +9 -9
- package/dist/frqtl/objects/objects/frqtl-control-slider.js +3 -3
- package/dist/frqtl/objects/objects/frqtl-control-sync.js +9 -9
- package/dist/frqtl/objects/objects/frqtl-control-widgets.js +2 -2
- package/dist/frqtl/objects/objects/frqtl-control-write-queue.js +2 -2
- package/dist/frqtl/objects/objects/makeControlsForObject.js +25 -29
- package/dist/frqtl/objects/objects/makeControlsForRenderSurface.js +2 -2
- package/dist/frqtl/objects/objects/slitLinerScatter.js +8 -10
- package/dist/frqtl/objects/objects/sustainedSource.js +15 -16
- package/dist/frqtl/objects/objects/tagger.js +2 -2
- package/dist/frqtl/objects/schema/engine-scopes.js +11 -12
- package/dist/frqtl/objects/schema/index.js +6 -6
- package/dist/frqtl/objects/schema/scopes.js +10 -10
- package/dist/frqtl/objects/setup/_collisionMatrixLanes.js +1 -1
- package/dist/frqtl/objects/setup/setupBlackbodySubstrate.js +1 -1
- package/dist/frqtl/objects/setup/setupCollisionMatrix.js +3 -3
- package/dist/frqtl/objects/setup/setupConeEmitter3D.js +7 -8
- package/dist/frqtl/objects/setup/setupDoubleSlit.js +20 -21
- package/dist/frqtl/objects/setup/setupFxSmoke.js +1 -1
- package/dist/frqtl/objects/setup/setupLightSourceLab.js +23 -26
- package/dist/frqtl/objects/setup/setupSphereEmitter3D.js +39 -40
- package/dist/frqtl/objects/setup/setupTunnelLab.js +17 -19
- package/dist/frqtl/objects/setup/setupTunnelPointExit.js +1 -1
- package/dist/frqtl/objects/setup/setupWaveInterference.js +4 -5
- package/dist/frqtl/objects/v1-replacements.js +0 -1
- package/dist/frqtl/parts/CameraControls.js +5 -5
- package/dist/frqtl/parts/CameraPath.js +1 -1
- package/dist/frqtl/parts/CollisionActions.js +2 -3
- package/dist/frqtl/parts/CollisionTypes.js +1 -2
- package/dist/frqtl/parts/DetectorWall.js +10 -10
- package/dist/frqtl/parts/FrqtlControlsPanel.js +11 -11
- package/dist/frqtl/parts/FrqtlVision.js +1 -1
- package/dist/frqtl/parts/GraphingDetectorWall.js +3 -4
- package/dist/frqtl/parts/LargeObject.js +7 -8
- package/dist/frqtl/parts/LightColor.js +2 -2
- package/dist/frqtl/parts/LiveChart.js +1 -1
- package/dist/frqtl/parts/LogicGate.js +4 -7
- package/dist/frqtl/parts/OvenBox.js +1 -2
- package/dist/frqtl/parts/PointSource.js +10 -11
- package/dist/frqtl/parts/SlitLightSource.js +6 -6
- package/dist/frqtl/parts/SlitScreen.js +14 -14
- package/dist/frqtl/parts/SphereEmitter.js +24 -24
- package/dist/frqtl/parts/Tunnel.js +17 -17
- package/dist/frqtl/parts/Wall.js +17 -17
- package/dist/frqtl/scenes/dse-one-emitter.js +1 -1
- package/dist/frqtl/scenes/dse-one-slit.js +2 -2
- package/dist/frqtl/scenes/dse-photoelectric.js +3 -3
- package/dist/frqtl/scenes/dse-tunnel-rebuild.js +5 -6
- package/dist/frqtl/scenes/dse-two-emitters.js +1 -1
- package/dist/frqtl/scenes/dse-two-slits.js +2 -2
- package/dist/frqtl/scenes/laser-buildup.js +1 -1
- package/dist/frqtl/scenes/mirror-3d.js +4 -4
- package/dist/frqtl/scenes/mirror-route.js +9 -9
- package/dist/frqtl/scenes/mirror.js +1 -1
- package/dist/frqtl/scenes/self-interference.js +1 -1
- package/dist/frqtl/scenes/smoking-gun.js +1 -1
- package/dist/frqtl/scenes/sun.js +2 -2
- package/dist/shim/bundle/frqnb.js +3 -3
- package/dist/shim/bundle/index.js +1 -1
- package/dist/shim/bundle/manifest.js +2 -2
- package/dist/shim/bundle/zip.js +1 -1
- package/dist/shim/controls/index.js +14 -14
- package/dist/shim/controls/registry.js +3 -3
- package/dist/shim/engine/artifact-shell.js +1 -2
- package/dist/shim/engine/router.js +15 -17
- package/dist/shim/expr/ast-schema.js +5 -5
- package/dist/shim/field-descriptor/index.js +7 -8
- package/dist/shim/frame-data/index.js +3 -3
- package/dist/shim/index.js +4 -4
- package/dist/shim/notebook/canvas-guard.js +1 -1
- package/dist/shim/notebook/catalog.js +2 -2
- package/dist/shim/notebook/format.js +26 -26
- package/dist/shim/notebook/kernel.js +3 -4
- package/dist/shim/notebook/knob.js +0 -1
- package/dist/shim/notebook/module-resolver.js +6 -6
- package/dist/shim/notebook/produced-bindings.js +1 -1
- package/dist/shim/notebook/setup-builder.js +9 -12
- package/dist/shim/notebook/vendor-importmap.js +1 -1
- package/dist/shim/notebook/view-builder.js +1 -1
- package/dist/shim/notebook/view-ctx.js +1 -1
- package/dist/shim/notebook/warmup.js +2 -2
- package/dist/shim/page-params/index.js +8 -9
- package/dist/shim/registry/copy-gate.js +1 -1
- package/dist/shim/registry/exhibits.js +4 -4
- package/dist/shim/registry/experiments.js +3 -3
- package/dist/shim/registry/walkthrough.js +21 -24
- package/dist/shim/render/render-stages.js +2 -2
- package/dist/shim/render/sun-look.js +2 -2
- package/dist/shim/rpc/index.js +2 -2
- package/dist/shim/runtime/index.js +12 -12
- package/dist/shim/storage/modules.js +8 -8
- package/llms.txt +2 -2
- package/package.json +4 -3
|
@@ -98,11 +98,11 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
98
98
|
* @param {number} [wallWidth=20] - Wall thickness (physics px).
|
|
99
99
|
* @param {string} [wallName='detector_wall'] - Identifier used to key the
|
|
100
100
|
* collision histogram in the universe.
|
|
101
|
-
* @param {Object} [opts]
|
|
101
|
+
* @param {Object} [opts]
|
|
102
102
|
* @param {number} [opts.depth] - When provided, the detector LO is built as a
|
|
103
103
|
* 6-element `[left,top,z,w,h,d]` rect spanning the FULL z-extent
|
|
104
104
|
* `[-depth/2, +depth/2]` (Tube.js precedent) — without it, z-spread quanta
|
|
105
|
-
* (
|
|
105
|
+
* (the emitter z-spread) fly past a paper-thin (z=0,d=w)
|
|
106
106
|
* detector. OMITTED (default) → legacy 4-element rect, byte-identical.
|
|
107
107
|
*/
|
|
108
108
|
|
|
@@ -147,7 +147,7 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
147
147
|
// NOTE: collect_collided is passed in the spec object that LargeObject forwards
|
|
148
148
|
// to universe.registerLargeObject(). It is a spec field (not a post-registration
|
|
149
149
|
// setter), so it is set atomically at registration time and never changes.
|
|
150
|
-
//
|
|
150
|
+
// 6-element full-z-depth rect when opts.depth is set
|
|
151
151
|
// (Tube.js precedent); legacy 4-element rect otherwise (byte-identical).
|
|
152
152
|
var wallRect = (depth !== null)
|
|
153
153
|
? [wallX, wallY, -depth / 2, wallWidth, wallHeight, depth]
|
|
@@ -172,7 +172,7 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
172
172
|
this.detector_wall = this._innerWall.lo;
|
|
173
173
|
// THE ONE UP-LINK: the detector composed this Wall (which stamps its own LO).
|
|
174
174
|
this._innerWall._owner = this;
|
|
175
|
-
//
|
|
175
|
+
// Render: the Tube.js precedent — a 6-element
|
|
176
176
|
// rect gives the ENGINE a real z-slab, but _buildLoMesh (three-provider.js)
|
|
177
177
|
// only builds a 3D BoxGeometry when the LO ALSO carries the render-only
|
|
178
178
|
// `shape='box'` + `depth` hint (see SlitScreen.js for the identical fix).
|
|
@@ -193,7 +193,7 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
193
193
|
this._slit1Total = 0;
|
|
194
194
|
this._slit2Total = 0;
|
|
195
195
|
|
|
196
|
-
// ── Y×Z grid (
|
|
196
|
+
// ── Y×Z grid (§4.2) ───────────────────────────────────────────────
|
|
197
197
|
// Additive capture alongside the (untouched) Y-marginal above: Map<y, Map<z,count>>.
|
|
198
198
|
// In 2D (depth omitted), z is always 0 (fd.z defaults to 0 — see the loop below),
|
|
199
199
|
// so every grid entry has a single z=0 bucket and `DetectorWall.deriveMarginalY(grid)`
|
|
@@ -204,7 +204,7 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
204
204
|
this._gridSlit1 = new Map();
|
|
205
205
|
this._gridSlit2 = new Map();
|
|
206
206
|
|
|
207
|
-
//
|
|
207
|
+
// Throw-guard (THROW, never silent dedup) —
|
|
208
208
|
// the last TickData object consumed by getCollisionHistogram(). Applies in 2D too.
|
|
209
209
|
this._lastTickData = undefined;
|
|
210
210
|
}
|
|
@@ -256,7 +256,7 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
256
256
|
* The returned object holds RUNNING totals across all calls — each call adds
|
|
257
257
|
* the current tick's hits to the accumulators.
|
|
258
258
|
*
|
|
259
|
-
*
|
|
259
|
+
* Throw-guard: THROWS if called twice in a row
|
|
260
260
|
* with the SAME `tickData` object reference — each tick's data must be consumed
|
|
261
261
|
* exactly once, or collisions double-count silently. A correct caller (the CLI,
|
|
262
262
|
* FrqtlApp's onTick, the bench) calls this once per `universe.doTick()`
|
|
@@ -276,7 +276,7 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
276
276
|
* }}
|
|
277
277
|
*/
|
|
278
278
|
DetectorWall.prototype.getCollisionHistogram = function (tickData) {
|
|
279
|
-
//
|
|
279
|
+
// Throw-guard — top of function, before any read (THROW,
|
|
280
280
|
// never silent dedup). Reference equality only; two DIFFERENT tickData objects
|
|
281
281
|
// (even with identical content, e.g. the TICKS=0 `{objects:{}}` literal) never
|
|
282
282
|
// trip it — only the exact same object consumed twice in a row does.
|
|
@@ -313,7 +313,7 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
313
313
|
y = 0;
|
|
314
314
|
}
|
|
315
315
|
|
|
316
|
-
// Z bin
|
|
316
|
+
// Z bin: stays 0 in every 2D run (fd.z defaults to 0 when
|
|
317
317
|
// the engine never wrote it), so the grid degenerates to one z-bucket per y.
|
|
318
318
|
var z = (fd.z != null) ? Math.floor(fd.z) : 0;
|
|
319
319
|
|
|
@@ -375,7 +375,7 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
375
375
|
this._total = 0;
|
|
376
376
|
this._slit1Total = 0;
|
|
377
377
|
this._slit2Total = 0;
|
|
378
|
-
// Y×Z grid
|
|
378
|
+
// Y×Z grid — reset alongside the Y-marginal it derives from.
|
|
379
379
|
this._grid = new Map();
|
|
380
380
|
this._gridSlit1 = new Map();
|
|
381
381
|
this._gridSlit2 = new Map();
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* frqtl-controls-panel.js — a placeable host for control collections
|
|
5
|
-
* (
|
|
5
|
+
* (gym-controls-as-sugar, Layer A — the panel itself).
|
|
6
6
|
*
|
|
7
7
|
* ── Layer 1: API contract ────────────────────────────────────────────────────
|
|
8
8
|
*
|
|
9
9
|
* `exposeRegistry(registry, opts)` — REALM side. Call this on the experiment
|
|
10
10
|
* page, once, after registering the page's OWN control descriptors into a
|
|
11
|
-
* `makeControlRegistry()` instance (`lib/shim/controls/registry.js
|
|
11
|
+
* `makeControlRegistry()` instance (`lib/shim/controls/registry.js`).
|
|
12
12
|
* Makes that registry (a) the page's exposed registry (`exposedRegistry()`, read by a host through
|
|
13
13
|
* the page door `FrqtlPage.controls`) and (b) remotely drivable from a parent frame via `postMessage` (unless
|
|
14
14
|
* `opts.crossFrame === false`).
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* `onChange`), which is exactly how the channel discriminator is "respected"
|
|
40
40
|
* here — as authored metadata, never as a panel-side dispatch branch.
|
|
41
41
|
*
|
|
42
|
-
* ── Transport wiring (
|
|
42
|
+
* ── Transport wiring (§2, applied via lib/shim/rpc) ─────────────────────────
|
|
43
43
|
*
|
|
44
44
|
* Same-page (in-app) placement: `ShimRpc.makeInAppRpc(dispatch)` — direct
|
|
45
45
|
* scripting, no postMessage marshaling (both sides are the SAME window).
|
|
@@ -85,7 +85,7 @@ var RPC_TAG = 'frqtl-controls-panel';
|
|
|
85
85
|
* @param {object} registry — a makeControlRegistry() instance. Bind execution
|
|
86
86
|
* reads its bind context off `registry._controlBindCtx` (attached by
|
|
87
87
|
* `exposeRegistry`'s `opts.universe`/`opts.runner`/`opts.readSnapshot` —
|
|
88
|
-
*
|
|
88
|
+
* gym-controls-as-sugar FULL CONVERGENCE build) — attaching it to the
|
|
89
89
|
* registry itself (rather than threading a second parameter through here)
|
|
90
90
|
* means the in-app dispatch path (`_buildInAppHandle`, which is handed this
|
|
91
91
|
* SAME registry instance by `mount({mode:'in-app'})`) sees it for free,
|
|
@@ -108,7 +108,7 @@ function _dispatchControlsCall(registry, fn, args) {
|
|
|
108
108
|
return descs.map(function (d) {
|
|
109
109
|
// Bind-based descriptors refresh from LIVE state before serializing —
|
|
110
110
|
// this is what makes listControls a genuine PULL/reconciliation source
|
|
111
|
-
// (frqtl-control-sync.js,
|
|
111
|
+
// (frqtl-control-sync.js, gym-controls-as-sugar FULL CONVERGENCE
|
|
112
112
|
// Stage ii) rather than a stale cache of the last WRITE. Per the
|
|
113
113
|
// declared non-uniform get() contract (controlBind.js): Frame binds
|
|
114
114
|
// read live; LargeObject/backdrop binds read the last TickData
|
|
@@ -187,7 +187,7 @@ function _dispatchControlsCall(registry, fn, args) {
|
|
|
187
187
|
descs2.map(function (c) { return c.id; }).join(', ') + ']). (FAIL-LOUD.)');
|
|
188
188
|
}
|
|
189
189
|
match.value = value;
|
|
190
|
-
// Write-authority dispatch (§5 converged
|
|
190
|
+
// Write-authority dispatch (§5 converged — "at least one of
|
|
191
191
|
// {onChange, bind}", never neither): onChange wins if present (it may
|
|
192
192
|
// coexist with a READ-only bind); otherwise bind.set() executes via
|
|
193
193
|
// controlBind.js, routed through the universe/runner exposeRegistry
|
|
@@ -222,7 +222,7 @@ function _dispatchControlsCall(registry, fn, args) {
|
|
|
222
222
|
* @param {boolean} [opts.crossFrame=true] — install the RPC responder so a
|
|
223
223
|
* parent frame's panel (mode:'iframe') can drive this page. Set false to
|
|
224
224
|
* expose in-app access only (e.g. a page with no host frame expected).
|
|
225
|
-
* @param {object} [opts.universe] — the live EGPTUniverse (
|
|
225
|
+
* @param {object} [opts.universe] — the live EGPTUniverse (gym-controls-as-sugar
|
|
226
226
|
* FULL CONVERGENCE build, signature change): threaded into `controlBind.js`'s
|
|
227
227
|
* `resolveBind` ctx so a `bind`-only descriptor's `setControlValue` can route
|
|
228
228
|
* through `setFrameProperty`/`updateObjectProperty`. Required only if the
|
|
@@ -249,7 +249,7 @@ function exposeRegistry(registry, opts) {
|
|
|
249
249
|
// (FrqtlPage.controls). A same-window panel (mode:'in-app') is handed this SAME instance.
|
|
250
250
|
_exposedRegistry = registry;
|
|
251
251
|
|
|
252
|
-
// Bind-execution context (
|
|
252
|
+
// Bind-execution context (gym-controls-as-sugar FULL CONVERGENCE build):
|
|
253
253
|
// attached to the registry INSTANCE (not a fresh object, not a second
|
|
254
254
|
// parameter threaded through mount()/_buildInAppHandle) so BOTH dispatch
|
|
255
255
|
// paths — the in-app direct call (which is handed this SAME registry
|
|
@@ -356,8 +356,8 @@ function mount(hostEl, opts) {
|
|
|
356
356
|
var name = opts.name;
|
|
357
357
|
hostEl.classList.add('frqtl-controls-panel');
|
|
358
358
|
|
|
359
|
-
// Rendering is delegated ENTIRELY to frqtl-control-slider.js
|
|
360
|
-
//
|
|
359
|
+
// Rendering is delegated ENTIRELY to frqtl-control-slider.js
|
|
360
|
+
// (Layer B: "panel = collection host + transport plumbing;
|
|
361
361
|
// control lib = the widget") — this closure supplies ONLY the
|
|
362
362
|
// transport-aware onInput, reusing the SAME `handle.call(...)` this
|
|
363
363
|
// file already builds for either placement mode.
|
|
@@ -402,7 +402,7 @@ function mount(hostEl, opts) {
|
|
|
402
402
|
// ── Export ────────────────────────────────────────────────────────────────────
|
|
403
403
|
|
|
404
404
|
// `dispatch` publicly exposes the SAME single dispatch point the in-app path
|
|
405
|
-
// and the RPC responder already share (
|
|
405
|
+
// and the RPC responder already share (gym-controls-as-sugar FULL
|
|
406
406
|
// CONVERGENCE build) — its THIRD consumer is `frqtl-control-sync.js`'s in-app
|
|
407
407
|
// pull path (`registry` mode), which reuses `dispatch(registry, 'listControls',
|
|
408
408
|
// [name])` rather than re-deriving a parallel listing implementation, and its
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* FrqtlVision.js — the reusable "video camera that takes stills" sugar object, and the
|
|
5
|
-
* consumer-facing surface of the normalized capture format
|
|
5
|
+
* consumer-facing surface of the normalized capture format.
|
|
6
6
|
*
|
|
7
7
|
* Peer of `CameraControls.js` in this directory, and deliberately DISJOINT from it:
|
|
8
8
|
* `CameraControls` drives the VIEWPOINT (`runner.cameraControl` — where the camera looks);
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* GraphingDetectorWall — a Detector Screen that PAINTS ITS OWN HIT GRID onto its
|
|
5
|
-
* own faces (
|
|
6
|
-
* "the spatial hitmap IS the chart").
|
|
5
|
+
* own faces (presentation pass Item 1: the spatial hitmap IS the chart).
|
|
7
6
|
*
|
|
8
7
|
* var screen = new GraphingDetectorWall(universe, {
|
|
9
8
|
* rect: [236, 0, -77, 20, 600, 154], name: 'screen', binPx: 12
|
|
@@ -388,8 +387,8 @@ import { registerKind, kindOf } from '../objects/kinds.js';
|
|
|
388
387
|
|
|
389
388
|
/**
|
|
390
389
|
* GraphingDetectorWall — a Detector Screen that PAINTS ITS OWN HIT GRID onto
|
|
391
|
-
* its own faces (presentation pass Item 1
|
|
392
|
-
* the chart
|
|
390
|
+
* its own faces (presentation pass Item 1: the spatial hitmap IS
|
|
391
|
+
* the chart). A SUGAR kind that EXTENDS `Wall` (prototype chain): the
|
|
393
392
|
* physics authority — counting, `Wall.gridAdd`, the once-per-tick drain
|
|
394
393
|
* discipline — is Wall's, verbatim and untouched. What it adds is a
|
|
395
394
|
* sugar-side painter that reads the SAME grid and paints pure bin rectangles
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* - reposition: literal string including 'closest'
|
|
14
14
|
* All engine-specific wire-format translation lives in the shim providers
|
|
15
15
|
* (compat/providers/js-engine.js and compat/providers/wasm-engine.js).
|
|
16
|
-
* No engine-sniffing above the shim (
|
|
16
|
+
* No engine-sniffing above the shim (§2 invariant).
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import * as ct from './CollisionTypes.js';
|
|
@@ -108,8 +108,8 @@ import { SCOPE_DESCRIPTORS } from '../objects/schema/scopes.js';
|
|
|
108
108
|
* prefer passing a single layer number via the `layer` property after construction,
|
|
109
109
|
* or pass [layer] here). null = object is visible to all dimensions.
|
|
110
110
|
* @param {number} search_padding - RESERVED / UNUSED positional placeholder. The engine no
|
|
111
|
-
* longer reads it: the collision search rect expands by the dimension's `mb_w
|
|
112
|
-
*
|
|
111
|
+
* longer reads it: the collision search rect expands by the dimension's `mb_w`.
|
|
112
|
+
* Kept as positional arg #8 so `color` (#9) stays in place for the
|
|
113
113
|
* ~50 positional callers. Do not wire new behavior to it.
|
|
114
114
|
* @param {Array} color - RGB color [r, g, b]
|
|
115
115
|
* @param {boolean} [collectCollided=false] - G1: when true, the engine accumulates a
|
|
@@ -277,10 +277,9 @@ import { SCOPE_DESCRIPTORS } from '../objects/schema/scopes.js';
|
|
|
277
277
|
|
|
278
278
|
/**
|
|
279
279
|
* Recompile this LargeObject's collision op-program from a NEW
|
|
280
|
-
* collision_type/actions pair and PUSH it to the running engine (
|
|
281
|
-
* Controls Realignment S4, design §2.3.5
|
|
282
|
-
*
|
|
283
|
-
* wonder"). `collision_type`/`actions` are compile-ONCE sugar inputs
|
|
280
|
+
* collision_type/actions pair and PUSH it to the running engine (Studio
|
|
281
|
+
* Controls Realignment S4, design §2.3.5 — flipping a wall into a detector
|
|
282
|
+
* mid-run is exactly the live-drive wonder). `collision_type`/`actions` are compile-ONCE sugar inputs
|
|
284
283
|
* (actionCompiler.js lowers them to an op-program at REGISTRATION,
|
|
285
284
|
* `engineVisible:false` — see the schema field docs) — a bare
|
|
286
285
|
* `updateObjectProperty` mirror-write to either field updates ONLY this JS
|
|
@@ -331,7 +330,7 @@ import { SCOPE_DESCRIPTORS } from '../objects/schema/scopes.js';
|
|
|
331
330
|
};
|
|
332
331
|
|
|
333
332
|
/**
|
|
334
|
-
* Full teardown (
|
|
333
|
+
* Full teardown (Studio Controls Realignment S4, design item 1): unregister
|
|
335
334
|
* this LargeObject engine-side, removing its compiled collision op-program
|
|
336
335
|
* (actionCompiler.js's output) and its collision registration from the
|
|
337
336
|
* RUNNING engine — not just this JS wrapper's render-list membership.
|
|
@@ -112,7 +112,7 @@ import chroma from '../assets/vendor/chroma.mjs';
|
|
|
112
112
|
* not read as dim. The wider default range (0.35..1.0) lets sparse quanta in the
|
|
113
113
|
* LOW×LOW lane of the collision matrix visually signal their sparsity.
|
|
114
114
|
*
|
|
115
|
-
* FRQTL-MAINT (
|
|
115
|
+
* FRQTL-MAINT (the render-tier table): `floor` is now an OPTIONAL
|
|
116
116
|
* second parameter (default 0.35 — every existing call site that omits it is
|
|
117
117
|
* byte-identical). This is the "extend, don't bypass" answer to the render-tier
|
|
118
118
|
* table's need for a true-invisible-below-a-mass-gate tier (e.g. air, Dim 2, mass≤2):
|
|
@@ -149,7 +149,7 @@ import chroma from '../assets/vendor/chroma.mjs';
|
|
|
149
149
|
return _chromaRoygbiv(v01);
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
// ── greyscale ramp (FRQTL-MAINT
|
|
152
|
+
// ── greyscale ramp (FRQTL-MAINT, the render-tier table) ──────────────────────────
|
|
153
153
|
// §1 Dim→visual table: smoke/haze (the high-dim tiers) are "greyscale + alpha by
|
|
154
154
|
// density" — a neutral (no hue) ramp from dark (sparse) to near-white (dense), so
|
|
155
155
|
// density reads on BOTH channels (darker+more-transparent = sparse edges, brighter+
|
|
@@ -247,7 +247,7 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
247
247
|
// Orientation: explicit 0|90 wins; else DEFAULT a detectorHistogram chart to 90 (the
|
|
248
248
|
// GYM detector-aligned horizontal-bar presentation — a detector column-profile stacks
|
|
249
249
|
// along y beside the vertical detector wall), any other projector (e.g. absorberStats,
|
|
250
|
-
// a 3-bar ledger) to 0 (standard vertical bars).
|
|
250
|
+
// a 3-bar ledger) to 0 (standard vertical bars).
|
|
251
251
|
var orientation;
|
|
252
252
|
if (props.orientation === 90 || props.orientation === '90') { orientation = 90; }
|
|
253
253
|
else if (props.orientation === 0 || props.orientation === '0') { orientation = 0; }
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* (`INTERPRETER_ARCHITECTURE.md`), not a new engine concept.
|
|
24
24
|
*
|
|
25
25
|
* ── WHY A POWERED (VALVE) GATE AND NOT A CURRENT-SUMMING ONE ────────────────
|
|
26
|
-
* Both were measured
|
|
26
|
+
* Both were measured. Currents DO
|
|
27
27
|
* add at a directed junction, so a wired threshold gate is buildable — but its
|
|
28
28
|
* output level is a multiple of its INPUT level, so levels decay down a chain and
|
|
29
29
|
* a two-deep circuit needs re-tuned thresholds at every stage. The valve gate's
|
|
@@ -117,9 +117,7 @@
|
|
|
117
117
|
* ── Layer 2: physics behavior ────────────────────────────────────────────────
|
|
118
118
|
* ZERO physics of its own (SU1). Everything below is the emergent behaviour of the
|
|
119
119
|
* stock parts, MEASURED on this construction (WASM engine, 2D, fundamental dim 0,
|
|
120
|
-
* inter-quantum collisions OFF, 3 seeds; the
|
|
121
|
-
* `docs/internal/physics-lab/logic-gate-bench/characterize.cjs` and
|
|
122
|
-
* `gate-acceptance.cjs`, and the numbers are quoted from `LogicGate.MEASURED`):
|
|
120
|
+
* inter-quantum collisions OFF, 3 seeds; the numbers are quoted from `LogicGate.MEASURED`):
|
|
123
121
|
*
|
|
124
122
|
* THE INPUT IS AN AMMETER AND IT IS LINEAR. A `Wall{destroy,count}` terminal
|
|
125
123
|
* reads I = G·V with G = 1.01 ± 0.01 and no knee from V = 1 to V = 16, and reads
|
|
@@ -387,9 +385,8 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
387
385
|
/**
|
|
388
386
|
* The measured datasheet AS DATA, so a circuit (or a half-adder) can budget
|
|
389
387
|
* levels, margins and settling time without re-running the bench. Every figure
|
|
390
|
-
* is
|
|
391
|
-
*
|
|
392
|
-
* carries the prediction each one was measured against.
|
|
388
|
+
* is measured (pkg-node WASM, 2D, fundamental dim 0, inter-quantum collisions OFF,
|
|
389
|
+
* 3 seeds), each against a recorded prediction.
|
|
393
390
|
*/
|
|
394
391
|
LogicGate.MEASURED = {
|
|
395
392
|
/** Terminal current vs source voltage: I = inputGain * V, no knee, I(0)=0 exactly. */
|
|
@@ -76,7 +76,6 @@
|
|
|
76
76
|
*
|
|
77
77
|
* OBSERVED (seed 42, tick 600, engine=js): temperature 300–4000 transitions
|
|
78
78
|
* the cavity from sparse leaf dots to near-saturated compound-frame packing.
|
|
79
|
-
* See `docs/internal/records/physics-lab/2026-06-16-blackbody-temperature.md`.
|
|
80
79
|
*/
|
|
81
80
|
|
|
82
81
|
import { Box } from '../objects/objects/Box.js';
|
|
@@ -130,7 +129,7 @@ import { registerKind } from '../objects/kinds.js';
|
|
|
130
129
|
for (var ei = 0; ei < ejectOps.length; ei++) ops.push(ejectOps[ei]);
|
|
131
130
|
|
|
132
131
|
// ── L4: velocity-flip op ─────────────────────────────────────────
|
|
133
|
-
// Q-L1-4 DRY: shared authority (native BOUNCE flip formula
|
|
132
|
+
// Q-L1-4 DRY: shared authority (native BOUNCE flip formula).
|
|
134
133
|
if (withBounce) {
|
|
135
134
|
var flipOp = ejectFlip.buildVelocityFlipOp(wallName, HANDLE_FRAME, Lit, Ref, Bin);
|
|
136
135
|
if (flipOp) ops.push(flipOp);
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Engine-agnostic: works with both the JS reference engine and the Rust/WASM engine.
|
|
10
10
|
* Emits raw canonical charge; providers translate to engine wire-format.
|
|
11
|
-
* No engine-sniffing above the shim (
|
|
11
|
+
* No engine-sniffing above the shim (§2 invariant).
|
|
12
12
|
*
|
|
13
|
-
* chargeMode / random_direction (sugar-layer modes,
|
|
13
|
+
* chargeMode / random_direction (sugar-layer modes, emitter-modes-sugar):
|
|
14
14
|
* chargeMode ∈ 'random' | 'positive' | 'negative' | 'both'
|
|
15
15
|
* random_direction ∈ boolean
|
|
16
16
|
*
|
|
@@ -107,8 +107,7 @@ import { declaredCount } from '../objects/ObjectFactory.js';
|
|
|
107
107
|
* (`EGPTfrqtl` / `universe.init(...)`), NOT by this constructor:
|
|
108
108
|
* `wavelength = floor((capacity / mass) × WAVELENGTH_CONSTANT)`. OBSERVED
|
|
109
109
|
* (seed 42): raising it 2 → 32 widens the fringes from a near-uniform dense
|
|
110
|
-
* cloud to sparse, widely-separated radial spokes.
|
|
111
|
-
* `docs/internal/records/physics-lab/2026-06-16-wave-interference-wavelengthScale.md`.
|
|
110
|
+
* cloud to sparse, widely-separated radial spokes.
|
|
112
111
|
* - **`angle_increment`** sets the number of emission rays = `floor(360 / inc)`
|
|
113
112
|
* (5° → 72 rays). Smaller increment = denser angular coverage = a smoother
|
|
114
113
|
* radial field; larger = visible discrete spokes.
|
|
@@ -138,7 +137,7 @@ import { declaredCount } from '../objects/ObjectFactory.js';
|
|
|
138
137
|
* @param {Object} [opts] - `{ wavelength, color, minRadius, emergentPhysics, zMin, zDepth }`.
|
|
139
138
|
* @param {number} [opts.wavelength] - Per-emitter wavelength → particle mass
|
|
140
139
|
* (see Physics, above). Omitted → engine default leaf mass.
|
|
141
|
-
* @param {number} [opts.zMin] -
|
|
140
|
+
* @param {number} [opts.zMin] - when provided (with `opts.zDepth`), every
|
|
142
141
|
* emitted leaf's z is drawn UNIFORMLY from `[zMin, zMin+zDepth)` (one extra `random()` draw
|
|
143
142
|
* per leaf, opt-in only — see `emitterProgram.js`'s DRAW-ORDER CONTRACT). Omitted (default)
|
|
144
143
|
* → no z is ever written, byte-identical to pre-3D behavior. The caller (e.g.
|
|
@@ -165,7 +164,7 @@ import { declaredCount } from '../objects/ObjectFactory.js';
|
|
|
165
164
|
var color = opts.color || null;
|
|
166
165
|
// Optional wavelength for mass computation (affects wave behavior at dim > 0)
|
|
167
166
|
var wavelength = opts.wavelength || null;
|
|
168
|
-
//
|
|
167
|
+
// Optional uniform z-spread (opt-in; null = no z ever written).
|
|
169
168
|
var zMin = opts.zMin !== undefined ? opts.zMin : null;
|
|
170
169
|
var zDepth = opts.zDepth !== undefined ? opts.zDepth : null;
|
|
171
170
|
|
|
@@ -180,7 +179,7 @@ import { declaredCount } from '../objects/ObjectFactory.js';
|
|
|
180
179
|
// colorOverride: render-only attribute for emitted particle color.
|
|
181
180
|
// Set via updateObjectProperty(lo, 'colorOverride', [r,g,b]) from the IDE.
|
|
182
181
|
this.colorOverride = color || null;
|
|
183
|
-
// renderShape / renderOutline (
|
|
182
|
+
// renderShape / renderOutline (R3-1): render-only per-emitted-frame overrides,
|
|
184
183
|
// peers of colorOverride (same per-frame reach SphereEmitter3D has). null → no key stamped.
|
|
185
184
|
this.renderShape = null;
|
|
186
185
|
this.renderOutline = null;
|
|
@@ -283,11 +282,11 @@ import { declaredCount } from '../objects/ObjectFactory.js';
|
|
|
283
282
|
wrap: false,
|
|
284
283
|
wavelength: wavelength || null,
|
|
285
284
|
fundamentalDim: null, // null → engine uses the universe's fundamental-dim as the leaf level
|
|
286
|
-
zMin: zMin, //
|
|
285
|
+
zMin: zMin, // null (default) → no z draw/write at all
|
|
287
286
|
zDepth: zDepth,
|
|
288
287
|
};
|
|
289
288
|
var tickFn = buildEmitterTickFn(universe, em);
|
|
290
|
-
// Back-reference so dispose() (
|
|
289
|
+
// Back-reference so dispose() (Studio Controls Realignment S4) can
|
|
291
290
|
// find and splice OUT exactly the tick-fn(s) belonging to this
|
|
292
291
|
// PointSource, mirroring QuantumEmitter's own `_emState` convention.
|
|
293
292
|
tickFn._emState = em;
|
|
@@ -524,8 +523,8 @@ import { declaredCount } from '../objects/ObjectFactory.js';
|
|
|
524
523
|
};
|
|
525
524
|
|
|
526
525
|
/**
|
|
527
|
-
* Full teardown (
|
|
528
|
-
* SAME "delete leaves the tick-fn running" defect class
|
|
526
|
+
* Full teardown (Studio Controls Realignment S4, design item 1 — the
|
|
527
|
+
* SAME "delete leaves the tick-fn running" defect class found on
|
|
529
528
|
* QuantumEmitter, closed here too for the sibling composite emitter type).
|
|
530
529
|
* Tombstones + deactivates every emState across ALL registered (charge, rd)
|
|
531
530
|
* groups (active or not — a re-activated inactive group must not resurrect),
|
|
@@ -60,14 +60,14 @@ import { V1_REPLACEMENTS } from '../objects/v1-replacements.js';
|
|
|
60
60
|
* the emitter stops.
|
|
61
61
|
* @param {number} [delay=1] - Ticks between emission bursts per angle. 0 = every
|
|
62
62
|
* tick; 1 = every other tick.
|
|
63
|
-
* @param {Object} [opts]
|
|
63
|
+
* @param {Object} [opts]
|
|
64
64
|
* @param {number} [opts.depth] - When provided, threads `zMin=-depth/2,
|
|
65
65
|
* zDepth=depth` into the inner `PointSource`'s opts — the IDENTICAL shared
|
|
66
|
-
* z-spread mechanism
|
|
66
|
+
* z-spread mechanism built for `setupWaveInterference`
|
|
67
67
|
* (`emitterProgram.js`'s opt-in `em.zMin`/`em.zDepth`). REUSE, not a fork —
|
|
68
68
|
* SlitLightSource is a thin PointSource wrapper (see module docstring), so
|
|
69
69
|
* this is the only line needed to make the DSE light source illuminate the
|
|
70
|
-
* full z-depth of the SLOT-shaped 3D slits (
|
|
70
|
+
* full z-depth of the SLOT-shaped 3D slits (SlitScreen's `depth`).
|
|
71
71
|
* OMITTED (default) → `zMin`/`zDepth` stay `undefined` on the PointSource
|
|
72
72
|
* opts object, which PointSource itself treats as `null` (byte-identical
|
|
73
73
|
* 2D behavior — zero extra `random()` draws, per `emitterProgram.js`).
|
|
@@ -97,7 +97,7 @@ import { V1_REPLACEMENTS } from '../objects/v1-replacements.js';
|
|
|
97
97
|
var charge = null; // random +/- per particle
|
|
98
98
|
var speed = 1;
|
|
99
99
|
|
|
100
|
-
//
|
|
100
|
+
// Color OFF by default —
|
|
101
101
|
// this used to hardcode `color: [0, 255, 0]` (devsdk parity green),
|
|
102
102
|
// which OVERRIDES the render layer's colorScheme (LightColor ramp;
|
|
103
103
|
// "an explicit render.color OVERRIDES colorScheme, so ROYGBIV never
|
|
@@ -105,8 +105,8 @@ import { V1_REPLACEMENTS } from '../objects/v1-replacements.js';
|
|
|
105
105
|
// That override made every double-slit-family page render a fixed green
|
|
106
106
|
// regardless of physics, while setupWaveInterference's PointSources
|
|
107
107
|
// pass NO color at all (colorless -> colorScheme-driven, genuine
|
|
108
|
-
// fullness/frequency-driven presentation) — the exact asymmetry
|
|
109
|
-
//
|
|
108
|
+
// fullness/frequency-driven presentation) — the exact asymmetry
|
|
109
|
+
// flagged (WI shows real physics color; the Lab showed a flat
|
|
110
110
|
// override). `opts.color` is now an EXPLICIT opt-in (default `null` —
|
|
111
111
|
// colorless, PointSource's own `opts.color || null` already handles
|
|
112
112
|
// this correctly) so any caller that WANTS the old green back can
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* - 2 slit segments (slit1, slit2) with optional detection
|
|
9
9
|
* - 4 slit liners (top/bottom of each slit) for edge diffraction
|
|
10
10
|
*
|
|
11
|
-
* 3D (depth set —
|
|
11
|
+
* 3D (depth set — the geometry amendment, "floor to ceiling
|
|
12
12
|
* with cubic holes"): the screen spans the FULL universe cross-section — the SAME
|
|
13
13
|
* floor-to-ceiling y-extent as 2D (unchanged: wall1 starts at y=0, wall3 ends at
|
|
14
14
|
* canvasHeight) PLUS the full z-depth (the fix-loop item-1 render/collision fix) —
|
|
@@ -107,10 +107,10 @@ import { ObjectSchema } from '../objects/schema/index.js';
|
|
|
107
107
|
* (default: `floor(wavelength * 0.8)`).
|
|
108
108
|
* @param {number} [gapHeight] - Override inter-slit wall height
|
|
109
109
|
* (default: `floor(wavelength * 0.8)`).
|
|
110
|
-
* @param {number} [depth] -
|
|
110
|
+
* @param {number} [depth] - when provided, the screen becomes a 3D
|
|
111
111
|
* floor-to-ceiling wall (full z-depth `[-depth/2, +depth/2]`) tiled around two
|
|
112
|
-
* CUBIC HOLE apertures (
|
|
113
|
-
*
|
|
112
|
+
* CUBIC HOLE apertures (the geometry amendment — supersedes the earlier
|
|
113
|
+
* full-depth-SLOT construction). `wall1`/`wall2`/`wall3` (no hole in
|
|
114
114
|
* their y-band) become 6-element rects spanning the FULL z-depth; `slit1`/
|
|
115
115
|
* `slit2` (still the detection identity) become 6-element rects bounded in
|
|
116
116
|
* BOTH y (unchanged from 2D) AND z (`holeDepth`, centered on z=0) — plus two
|
|
@@ -122,7 +122,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
|
|
|
122
122
|
* (centered on z=0, i.e. `[-holeDepth/2, +holeDepth/2)`). Default: the
|
|
123
123
|
* EFFECTIVE `slit_height` (respects a `slitHeight` override), so the default
|
|
124
124
|
* aperture is square-ish in the y×z plane (e.g. wavelength=64 → slit_height=51
|
|
125
|
-
* → a 51×51 hole)
|
|
125
|
+
* → a 51×51 hole); pass an explicit
|
|
126
126
|
* value to decouple the hole's z-extent from its y-extent. Ignored when
|
|
127
127
|
* `depth` is omitted.
|
|
128
128
|
* @param {'current'|'noreset'|'symmetric'|'combined'|'bounce'|'ejectY'|'ejectYReflect'} [linerScatter='current']
|
|
@@ -130,7 +130,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
|
|
|
130
130
|
* `LEGACY_VARIANT_MAP` (the ONE authority for the behavior×resetLocalTime
|
|
131
131
|
* decomposition; see that module's docstring). `'current'` (default, OMIT to
|
|
132
132
|
* keep it) is the no-op sentinel — today's exact compiled `RANDOM_XY`,
|
|
133
|
-
* byte-identical, the
|
|
133
|
+
* byte-identical, the ratified 2D golden depends on it. The other
|
|
134
134
|
* variants push a composed replacement op-program LIVE via
|
|
135
135
|
* `universe.updateObjectProperty` — the SAME mechanism the `dse-lab` page's
|
|
136
136
|
* LIVE `behavior`/`resetLocalTime` controls use (DSE LAB, 2026-07-13).
|
|
@@ -145,7 +145,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
|
|
|
145
145
|
this.linerScatter = linerScatter || 'current';
|
|
146
146
|
|
|
147
147
|
// ── Geometry (y-axis) — UNCHANGED by the cubic-hole amendment in EITHER
|
|
148
|
-
// mode:
|
|
148
|
+
// mode: "floor to ceiling" was already satisfied here (wall1
|
|
149
149
|
// starts at y=0, wall3 ends at canvasHeight — confirmed by ground-truth,
|
|
150
150
|
// fix-loop item 1); only the APERTURE shape changes in 3D (§ below).
|
|
151
151
|
this.slit_height = (slitHeight !== undefined) ? slitHeight : Math.floor(wavelength * 0.8);
|
|
@@ -160,7 +160,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
|
|
|
160
160
|
this.slit_width = wallWidth;
|
|
161
161
|
this.bottom_wall_height = canvasHeight - this.slit2_bottom;
|
|
162
162
|
|
|
163
|
-
//
|
|
163
|
+
// The geometry amendment: cubic-hole z-extent, centered
|
|
164
164
|
// on z=0. Default = the EFFECTIVE slit_height (square-ish aperture at the
|
|
165
165
|
// default wavelength=64 -> slit_height=51 -> a 51x51 hole) — overridable to
|
|
166
166
|
// decouple the hole's z-extent from its y-extent. 2D-inert (unused).
|
|
@@ -285,7 +285,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
|
|
|
285
285
|
];
|
|
286
286
|
|
|
287
287
|
} else {
|
|
288
|
-
// ═══ 3D — CUBIC HOLES (
|
|
288
|
+
// ═══ 3D — CUBIC HOLES (the geometry amendment) ═══
|
|
289
289
|
// Tile the wall around each hole: wall1/wall2/wall3 (no hole in their
|
|
290
290
|
// y-band) span the FULL z-depth; each hole's own y-band splits into
|
|
291
291
|
// THREE z-tiles — a solid "_near" side (z < holeZmin), the hole itself
|
|
@@ -407,8 +407,8 @@ import { ObjectSchema } from '../objects/schema/index.js';
|
|
|
407
407
|
];
|
|
408
408
|
}
|
|
409
409
|
|
|
410
|
-
// ── Render shape (renderer-only hint; physics unaffected)
|
|
411
|
-
//
|
|
410
|
+
// ── Render shape (renderer-only hint; physics unaffected)
|
|
411
|
+
// The Tube.js precedent (FRQTL-MAINT 2026-07-01): a
|
|
412
412
|
// 6-element rect gives the ENGINE a real z-slab, but `_buildLoMesh`
|
|
413
413
|
// (three-provider.js) only wraps an LO in a 3D BoxGeometry when it
|
|
414
414
|
// ALSO carries the render-only `lo.shape='box'` + `lo.depth` hint —
|
|
@@ -438,7 +438,7 @@ import { ObjectSchema } from '../objects/schema/index.js';
|
|
|
438
438
|
};
|
|
439
439
|
|
|
440
440
|
/**
|
|
441
|
-
*
|
|
441
|
+
* LIVE slit-gap update — recomputes
|
|
442
442
|
* every affected 2D wall/slit/liner rect (mirroring the constructor's OWN 2D
|
|
443
443
|
* geometry formulas, one authority, no schema-mirror) and pushes each via
|
|
444
444
|
* `runner.updateObjectProperty(lo, 'rect', [left,top,w,h])` — the SAME S3/S4
|
|
@@ -455,9 +455,9 @@ import { ObjectSchema } from '../objects/schema/index.js';
|
|
|
455
455
|
* compute for that `gapHeight` from scratch.
|
|
456
456
|
*
|
|
457
457
|
* 3D (`this.depth !== null`) is NOT supported live — the cubic-hole z-tiling
|
|
458
|
-
* (
|
|
458
|
+
* (the geometry amendment) adds ~13 LOs (near/far z-tiles per hole, wall1-3
|
|
459
459
|
* z-spanning tiles) whose z-partition math would need the identical live-update
|
|
460
|
-
* treatment;
|
|
460
|
+
* treatment; not built. Returns `false` so the caller falls
|
|
461
461
|
* back to a reinit reload — name this explicitly rather than silently no-op.
|
|
462
462
|
*
|
|
463
463
|
* @param {number} newGapHeight - the new `slit_wall_gap_height` (px).
|