@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
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* SphereEmitter — a p5/three-familiar OBJECT-CONSTRUCTOR facing over the
|
|
5
|
-
* existing `setupSphereEmitter3D` setup factory (
|
|
6
|
-
*
|
|
5
|
+
* existing `setupSphereEmitter3D` setup factory ("Option B"). It exists so a
|
|
6
|
+
* programmer can write the object idiom
|
|
7
7
|
*
|
|
8
8
|
* var sun = new SphereEmitter([x, y], opts).addTo(universe);
|
|
9
9
|
* sun.setCenter([x2, y2]); // reposition live
|
|
@@ -174,8 +174,8 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
174
174
|
this.universe = null;
|
|
175
175
|
this._active = true; // mirror of control state (control exposes no getActive)
|
|
176
176
|
|
|
177
|
-
// ── Declared EMISSION GATE (emissionCap/gateCounter —
|
|
178
|
-
//
|
|
177
|
+
// ── Declared EMISSION GATE (emissionCap/gateCounter —
|
|
178
|
+
// circulation-emission-gate-contract §2) ──────────────────────────────────
|
|
179
179
|
// The Blackbody-thermostat pattern as DECLARED DATA: `emissionCap` is a
|
|
180
180
|
// self-throttle target — the emitter deactivates when the live population
|
|
181
181
|
// measured by the counting Wall NAMED by `gateCounter` reaches the cap, and
|
|
@@ -269,7 +269,7 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
269
269
|
};
|
|
270
270
|
|
|
271
271
|
/**
|
|
272
|
-
* ── The compiled EMISSION-GATE host tick-fn (
|
|
272
|
+
* ── The compiled EMISSION-GATE host tick-fn (contract §3/§4) ──────────────────
|
|
273
273
|
*
|
|
274
274
|
* Layer 1 (API): registered on `universe.experimentTickFunctions` (the Phase-A
|
|
275
275
|
* `fn(universe)` seam — the SAME seam as the emit tick-fn, the blackbody
|
|
@@ -443,7 +443,7 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
443
443
|
get: function () { return this._control ? this._control.controls : null; }
|
|
444
444
|
});
|
|
445
445
|
|
|
446
|
-
// ── Descriptor-field GETTERS (
|
|
446
|
+
// ── Descriptor-field GETTERS (captureProps read surface) ─────────────────
|
|
447
447
|
// captureProps(sphereObj, SphereEmitterDescriptor) reads `sphereObj[field.name]`
|
|
448
448
|
// DIRECTLY for every descriptor field (a getter satisfies it). These expose the
|
|
449
449
|
// LIVE resolved value (from the factory's control) so a dragged/edited emitter
|
|
@@ -499,7 +499,7 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
499
499
|
Object.defineProperty(SphereEmitter.prototype, 'fundamentalWaveLength', {
|
|
500
500
|
get: function () { return (this._opts && this._opts.fundamentalWaveLength !== undefined) ? this._opts.fundamentalWaveLength : 64; }
|
|
501
501
|
});
|
|
502
|
-
// ── Live-edit WRITE ROUTER (
|
|
502
|
+
// ── Live-edit WRITE ROUTER (FrqtlApp.updateObjectProperty) ───────────
|
|
503
503
|
/**
|
|
504
504
|
* Route ONE schema-prop write to the matching factory-control setter (the
|
|
505
505
|
* mechanism-A write path — the Inspector / coupled-move calls this via
|
|
@@ -535,7 +535,7 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
535
535
|
case 'innerR': c.setInnerR(value); break;
|
|
536
536
|
case 'renderColor': c.setRenderColor(value); break;
|
|
537
537
|
case 'renderShape': c.setRenderShape(value); break;
|
|
538
|
-
// LIVE "Emit Dimension"
|
|
538
|
+
// LIVE "Emit Dimension" — host-side addDimension + closure flip;
|
|
539
539
|
// next emitted leaf is born at the new per-emitter dimension (M5). See
|
|
540
540
|
// setupSphereEmitter3D.setLeafDimension for the ratchet side effect (S1).
|
|
541
541
|
case 'leafDimension': c.setLeafDimension(value); break;
|
|
@@ -580,7 +580,7 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
580
580
|
|
|
581
581
|
/**
|
|
582
582
|
* SphereEmitter — the manipulable palette face over the setupSphereEmitter3D
|
|
583
|
-
* setup factory
|
|
583
|
+
* setup factory. A SUGAR kind (peer of
|
|
584
584
|
* QuantumEmitter/PointSource — NOT a new engine kind): the ObjectFactory
|
|
585
585
|
* builder composes a LargeObject-visual marker + the factory's host emit
|
|
586
586
|
* tick-fn (SU1 — the visual LO is NONE-collision, non-leaf, zero physics).
|
|
@@ -589,14 +589,14 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
589
589
|
* makeControlsForObject (the Inspector), and FrqtlApp.updateObjectProperty
|
|
590
590
|
* (the live-edit write path) ALL drive off it — no hand-list anywhere.
|
|
591
591
|
*
|
|
592
|
-
* Per-field `live` attribute (
|
|
592
|
+
* Per-field `live` attribute (consumed by makeControlsForObject):
|
|
593
593
|
* live:true → a LIVE Inspector control; the write goes through
|
|
594
594
|
* updateObjectProperty(sphereObj, prop, v) → the control setter
|
|
595
595
|
* (mechanism A — NOT resolveBind; the SphereEmitter kind is
|
|
596
596
|
* deliberately outside controlBind's bind-executable allowlist).
|
|
597
597
|
* live:false → a read-only DISPLAY row (boot-level / derived fields that
|
|
598
598
|
* need a reload to change — same class as the renderer-swap
|
|
599
|
-
* reload
|
|
599
|
+
* reload rule). captureProps STILL captures its VALUE for
|
|
600
600
|
* round-trip; the Inspector just renders it read-only.
|
|
601
601
|
*
|
|
602
602
|
* FIELD SET is COMPLETE w.r.t. every scene-affecting setupSphereEmitter3D opt
|
|
@@ -611,15 +611,15 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
611
611
|
'setupSphereEmitter3D setup factory: pure sugar (a NONE-collision visual marker + a host ' +
|
|
612
612
|
'emit tick-fn), zero physics of its own. Drag the marker to move the emission center live; ' +
|
|
613
613
|
'edit burst/rate/wavelength/charge/preset/shell live; dimension/is2D are boot-level (reload).',
|
|
614
|
-
// ── STUDIO UX presentation contract
|
|
615
|
-
// A sugar object DECLARES its own STUDIO UX
|
|
614
|
+
// ── STUDIO UX presentation contract ───────────────────────────────────
|
|
615
|
+
// A sugar object DECLARES its own STUDIO UX.
|
|
616
616
|
// The vocab is owned once at lib/shim/field-descriptor (UX_HANDLE_ZONES /
|
|
617
617
|
// UX_DRAGGABLE_MODES / UX_SHELL_RENDER); this block is read via
|
|
618
618
|
// ObjectSchema.ux('SphereEmitter'). resizable:false — a SphereEmitter has
|
|
619
|
-
// TWO radii (inner+outer); a single-box resize gesture is ambiguous, so
|
|
620
|
-
//
|
|
619
|
+
// TWO radii (inner+outer); a single-box resize gesture is ambiguous, so
|
|
620
|
+
// it is NOT resizable (individually, per object). draggable 2D (a 3D
|
|
621
621
|
// scene never cursor-drags). handles: ['move'] — it only moves, never scales.
|
|
622
|
-
// shellRender:'design' — the marker paints only while authoring (
|
|
622
|
+
// shellRender:'design' — the marker paints only while authoring (the
|
|
623
623
|
// default; the "red light bulb" flips a per-instance shellRender override).
|
|
624
624
|
ux: {
|
|
625
625
|
resizable: false,
|
|
@@ -694,8 +694,8 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
694
694
|
description: 'Ticks between bursts (sustained-emission cadence). LIVE (affects the next burst).'
|
|
695
695
|
},
|
|
696
696
|
{
|
|
697
|
-
// ── Declared EMISSION GATE (
|
|
698
|
-
// pattern;
|
|
697
|
+
// ── Declared EMISSION GATE (the Blackbody-thermostat
|
|
698
|
+
// pattern; circulation-emission-gate-contract §2 field shapes).
|
|
699
699
|
// Sensor = a placeable counting Wall (name in gateCounter); regulation =
|
|
700
700
|
// emitter-side sugar compiled at CONSTRUCTION into a host tick-fn (the
|
|
701
701
|
// Restart-safe host-tick-fn rule — codegen captures these two fields and
|
|
@@ -812,11 +812,11 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
812
812
|
engineVisible: false,
|
|
813
813
|
live: true,
|
|
814
814
|
// Field NAME stays `leafDimension` (codegen/capture key; a rename = round-trip
|
|
815
|
-
// break + a second name = schema mirror —
|
|
815
|
+
// break + a second name = schema mirror — Q-A2). The Inspector shows
|
|
816
816
|
// the display LABEL "Emit Dimension"; the write routes through applyProp →
|
|
817
817
|
// control.setLeafDimension (host-side addDimension + closure var flip; the NEXT
|
|
818
|
-
// emitted leaf is born at the new dimension).
|
|
819
|
-
//
|
|
818
|
+
// emitted leaf is born at the new dimension). Mid-run addDimension is
|
|
819
|
+
// SAFE (cleared 2026-07-22). SIDE EFFECT (S1): a value BELOW the current
|
|
820
820
|
// fundamental floor self-lowers the floor UNIVERSE-GLOBALLY and is a ONE-WAY
|
|
821
821
|
// RATCHET (no removeDimension) — the Inspector surfaces a hint when crossing below
|
|
822
822
|
// floor. fundamentalDimension stays display-only (universe base = reinit-class).
|
|
@@ -853,7 +853,7 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
853
853
|
};
|
|
854
854
|
|
|
855
855
|
//
|
|
856
|
-
// The manipulable palette face over setupSphereEmitter3D
|
|
856
|
+
// The manipulable palette face over setupSphereEmitter3D. Mirrors the
|
|
857
857
|
// QuantumEmitter/PointSource pattern: build the emitter, then a NONE-collision
|
|
858
858
|
// circle LargeObject "marker" the emitter OWNS (attachMarker), and return the
|
|
859
859
|
// emitter — the declared object STUDIO picks, drags and carries. SU1:
|
|
@@ -926,9 +926,9 @@ import { CollisionTypes } from './CollisionTypes.js';
|
|
|
926
926
|
'closest', null, 1,
|
|
927
927
|
[240, 200, 80]);
|
|
928
928
|
vis.drawAsCircle = true;
|
|
929
|
-
// Shell render defaults (
|
|
929
|
+
// Shell render defaults (R2-3) so the Inspector's Shell section seeds live
|
|
930
930
|
// controls (render-only; no visual change — alpha 255 = opaque, shellRender 'design'
|
|
931
|
-
// = the
|
|
931
|
+
// = the marker default, shellShape 'circle' = the current drawAsCircle look).
|
|
932
932
|
vis.alpha = 255;
|
|
933
933
|
vis.shellRender = 'design';
|
|
934
934
|
vis.shellShape = 'circle';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/* Copyright 2023-2026 by Essam Abadir */
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Tunnel — TWO parallel MIRROR Walls forming a corridor (
|
|
5
|
-
*
|
|
4
|
+
* Tunnel — TWO parallel MIRROR Walls forming a corridor (a tunnel is implemented
|
|
5
|
+
* with two mirrors). The waveguide /
|
|
6
6
|
* light-pipe primitive: a beam travelling down the bore bounces off the two facing
|
|
7
7
|
* mirror walls (the guarded reflection law), staying collimated inside the channel.
|
|
8
8
|
*
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
* (`<name>_A` = the first mirror, `<name>_B` = the second).
|
|
50
50
|
* @param {'mirror'|'directed'} [opts.mode='mirror'] — the corridor's COLLISION MODE.
|
|
51
51
|
* `'mirror'` (DEFAULT) is the pre-existing guarded-bounce waveguide, unchanged and
|
|
52
|
-
* byte-identical. `'directed'` is the DIRECTED TUNNEL
|
|
52
|
+
* byte-identical. `'directed'` is the DIRECTED TUNNEL: a wall hit
|
|
53
53
|
* re-emits the quantum in a random FORWARD direction within a 180° fan about the
|
|
54
54
|
* corridor's own axis — the tunnel behaves as a semi-circular emitter rather than a
|
|
55
55
|
* mirror. See `opts.directedAngle` / `opts.redirectSpread` and the Layer-2 note.
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
* axis-aligned (a Tunnel is two AABB walls); this angle drives the redirect only —
|
|
64
64
|
* the same v1 split `DirectedTunnel.orientation` documents.
|
|
65
65
|
* @param {number} [opts.redirectSpread=90] — `'directed'` mode fan HALF-WIDTH, DEGREES.
|
|
66
|
-
* The default `90`
|
|
66
|
+
* The default `90` is a full 180° forward fan (`directedAngle ± 90°`).
|
|
67
67
|
* `0` collapses to a perfectly collimated re-emission along `directedAngle`.
|
|
68
68
|
* @param {boolean} [opts.exitCollapse=false] — THE POINT-EXIT GATE (D3). Adds a THIRD
|
|
69
69
|
* LargeObject spanning the last 2 columns of the bore at the corridor's OUTPUT mouth,
|
|
@@ -103,10 +103,10 @@
|
|
|
103
103
|
* mirror is reflected back into the bore (vy flipped for a horizontal tunnel, vx
|
|
104
104
|
* for a vertical one) by the compiled bounce op-program — no random scatter, no
|
|
105
105
|
* leak through the wall (the guarded reflect law), so the beam stays collimated
|
|
106
|
-
* down the channel. This is the physical difference the
|
|
106
|
+
* down the channel. This is the physical difference the rebuild targets vs
|
|
107
107
|
* the legacy RANDOM_XY slit liners (which scatter randomly and can leak).
|
|
108
108
|
*
|
|
109
|
-
* `mode:'directed'` swaps that ONE emergent effect for the other one
|
|
109
|
+
* `mode:'directed'` swaps that ONE emergent effect for the other one:
|
|
110
110
|
* instead of reflecting the incidence axis, each wall hit RE-EMITS the quantum into a
|
|
111
111
|
* uniformly-drawn direction inside the forward 180°, so the corridor reads as a
|
|
112
112
|
* semi-circular (semi-spherical) emitter rather than a mirror. It is still ZERO new
|
|
@@ -254,7 +254,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
|
|
|
254
254
|
var color = opts.color || [90, 120, 200];
|
|
255
255
|
var name = opts.name || 'tunnel';
|
|
256
256
|
|
|
257
|
-
// ── Collision MODE (D2
|
|
257
|
+
// ── Collision MODE (D2) ──────────────────────────────────────────────
|
|
258
258
|
// 'mirror' (default) = the pre-existing guarded-bounce waveguide, untouched.
|
|
259
259
|
// 'directed' = eject-only walls + the host 180° forward re-emission.
|
|
260
260
|
// FAIL-LOUD on anything else (never a silent fallback to mirror).
|
|
@@ -267,13 +267,13 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
|
|
|
267
267
|
// derived from `axis` — never a hand-typed default per call site.
|
|
268
268
|
var directedAngleDeg = (typeof opts.directedAngle === 'number')
|
|
269
269
|
? opts.directedAngle : (axis === 'y' ? 90 : 0);
|
|
270
|
-
// FAN HALF-WIDTH: 90° ⇒ the full 180° forward fan
|
|
270
|
+
// FAN HALF-WIDTH: 90° ⇒ the full 180° forward fan.
|
|
271
271
|
var redirectSpreadDeg = (typeof opts.redirectSpread === 'number') ? opts.redirectSpread : 90;
|
|
272
272
|
// POLAR half-width: 0 even on a 3D corridor — a non-zero value is polar-uniform,
|
|
273
273
|
// NOT solid-angle-uniform (see the module docstring). Opt in deliberately.
|
|
274
274
|
var polarSpreadDeg = (typeof opts.polarSpread === 'number') ? opts.polarSpread : 0;
|
|
275
275
|
|
|
276
|
-
// ── EXIT-GATE COLLAPSE (D3
|
|
276
|
+
// ── EXIT-GATE COLLAPSE (D3) ──────────────────────────────────────────
|
|
277
277
|
// A third LargeObject at the corridor's OUTPUT mouth that pins every crossing
|
|
278
278
|
// quantum to the bore's mid-line, turning the mouth into a one-pixel POINT SOURCE.
|
|
279
279
|
// Orthogonal to `mode` (it composes with either), default OFF.
|
|
@@ -312,7 +312,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
|
|
|
312
312
|
this.left = left; this.top = top; this.length = length; this.bore = bore;
|
|
313
313
|
this.wallThickness = wallThickness; this.axis = axis; this.color = color;
|
|
314
314
|
this.name = name;
|
|
315
|
-
// `mode` is ALWAYS stashed (unlike the optional z/depth pair): it is the
|
|
315
|
+
// `mode` is ALWAYS stashed (unlike the optional z/depth pair): it is the user-facing
|
|
316
316
|
// knob, so the Inspector must render its selector on every tunnel, which needs a
|
|
317
317
|
// defined value to read. The three directed-only tunables follow the z/depth
|
|
318
318
|
// OPT-IN precedent instead — left undefined in mirror mode so captureProps skips
|
|
@@ -439,7 +439,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
|
|
|
439
439
|
SlitLinerScatter.applyLinerScatter(this.wallB.lo, universe, intoBoreB,
|
|
440
440
|
{ behavior: 'ejectY', resetLocalTime: false });
|
|
441
441
|
// resetLocalTime stays FALSE: bundling the `local_time=0` phase reset into a
|
|
442
|
-
// scatter phase-locks the ensemble (the measured spurious
|
|
442
|
+
// scatter phase-locks the ensemble (the measured spurious coherent drift).
|
|
443
443
|
// Decoherence is a separable op set and is deliberately not armed here.
|
|
444
444
|
|
|
445
445
|
// (2) BETWEEN TICKS: ONE host applier over BOTH walls. speed:null ⇒ direction-only.
|
|
@@ -529,7 +529,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
|
|
|
529
529
|
// PHASE ONLY — the single op. NEVER `_buildDecoherenceOps`: that bundle is TWO ops
|
|
530
530
|
// and its second redraws CHARGE with an RNG draw, which is a rider nobody asked for
|
|
531
531
|
// AND shifts every downstream seeded stream. The corridor WALLS keep
|
|
532
|
-
// resetLocalTime:false regardless
|
|
532
|
+
// resetLocalTime:false regardless — this reset lives at the exit
|
|
533
533
|
// gate and nowhere else.
|
|
534
534
|
ops.push({ set: HF + '.local_time', to: ast.Lit(0) });
|
|
535
535
|
}
|
|
@@ -893,7 +893,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
|
|
|
893
893
|
'out to both mirrors (the `_owner` fan-out in updateObjectProperty).'
|
|
894
894
|
},
|
|
895
895
|
{
|
|
896
|
-
// D2
|
|
896
|
+
// D2 — the corridor's collision MODE. Enum values are
|
|
897
897
|
// ferried from Tunnel.MODES (the object's own authority), never re-listed.
|
|
898
898
|
name: 'mode',
|
|
899
899
|
type: 'enum',
|
|
@@ -937,7 +937,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
|
|
|
937
937
|
'perfectly collimated re-emission along directedAngle.'
|
|
938
938
|
},
|
|
939
939
|
{
|
|
940
|
-
// D3
|
|
940
|
+
// D3 — the point-exit gate.
|
|
941
941
|
name: 'exitCollapse',
|
|
942
942
|
type: 'boolean',
|
|
943
943
|
engineVisible: true,
|
|
@@ -951,7 +951,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
|
|
|
951
951
|
'otherwise, because with collisions ON the collapse pixel serializes and kills quanta.'
|
|
952
952
|
},
|
|
953
953
|
{
|
|
954
|
-
// D4
|
|
954
|
+
// D4 — recentering becomes optional so the two exit effects
|
|
955
955
|
// can be driven independently.
|
|
956
956
|
name: 'exitRecenter',
|
|
957
957
|
type: 'boolean',
|
|
@@ -960,7 +960,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
|
|
|
960
960
|
// op-program and pushes it — it never reaches setFrameProperty or a LargeObject
|
|
961
961
|
// bool ABI. Declared engineVisible:true it was DEMOTED to a read-only Inspector
|
|
962
962
|
// row by the documented safety rule for engine-visible booleans (whose bind-only
|
|
963
|
-
// write path would send a bare 0/1 where serde wants a JSON bool), so
|
|
963
|
+
// write path would send a bare 0/1 where serde wants a JSON bool), so a user
|
|
964
964
|
// could see the flag and not flip it. `Wall.collisionBehavior` is the precedent:
|
|
965
965
|
// also op-program-compiled, also live, correctly engineVisible:false.
|
|
966
966
|
engineVisible: false,
|
|
@@ -981,7 +981,7 @@ import { setupTunnelPointExit } from '../objects/setup/setupTunnelPointExit.js';
|
|
|
981
981
|
// op-program and pushes it — it never reaches setFrameProperty or a LargeObject
|
|
982
982
|
// bool ABI. Declared engineVisible:true it was DEMOTED to a read-only Inspector
|
|
983
983
|
// row by the documented safety rule for engine-visible booleans (whose bind-only
|
|
984
|
-
// write path would send a bare 0/1 where serde wants a JSON bool), so
|
|
984
|
+
// write path would send a bare 0/1 where serde wants a JSON bool), so a user
|
|
985
985
|
// could see the flag and not flip it. `Wall.collisionBehavior` is the precedent:
|
|
986
986
|
// also op-program-compiled, also live, correctly engineVisible:false.
|
|
987
987
|
engineVisible: false,
|
package/dist/frqtl/parts/Wall.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Wall — the first-class, palette-exposed WALL primitive
|
|
5
|
-
* (
|
|
5
|
+
* (W1). It stands to the wall family
|
|
6
6
|
* exactly as `SphereEmitter` stands to the emitter family: a THIN, named, UX-
|
|
7
7
|
* declaring FACADE over the ONE engine-facing primitive that already exists — a
|
|
8
8
|
* single `LargeObject` whose collision behavior is the Collision LEXICON v2
|
|
@@ -140,7 +140,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
140
140
|
var slab = SlabFace.resolveSlabFace({
|
|
141
141
|
w: wh.w, h: wh.h, orientationDeg: orientationDeg, d: depth, pitchDeg: pitchDeg
|
|
142
142
|
});
|
|
143
|
-
// R2AX — a PITCHED plate (two-axis mirror
|
|
143
|
+
// R2AX — a PITCHED plate (two-axis mirror) has NO engine
|
|
144
144
|
// region (the ObbRegion contract is z-theta-only): the broad phase is the plate's
|
|
145
145
|
// full 3D AABB (SlabFace plate3.aabb — the one derivation) and the compiled guard
|
|
146
146
|
// trigger is the narrow phase. Engine two-angle OBB = flagged Gate-1 follow-up.
|
|
@@ -249,7 +249,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
249
249
|
// when the caller does not state one, so the ONE default lives in absorbRadiation.js.
|
|
250
250
|
self.emissivity = (typeof opts.emissivity === 'number') ? opts.emissivity : undefined;
|
|
251
251
|
self.orientationDeg = (typeof opts.orientationDeg === 'number') ? opts.orientationDeg : 0;
|
|
252
|
-
// R2AX (
|
|
252
|
+
// R2AX (two-axis mirror) — up/down tilt about the plate's own long
|
|
253
253
|
// axis. 0/absent ⇒ byte-identical un-pitched wall. Requires a 3D wall (validated
|
|
254
254
|
// below once the rect is resolved; SlabFace + compileWallV2 double-guard).
|
|
255
255
|
self.pitchDeg = (typeof opts.pitchDeg === 'number') ? opts.pitchDeg : 0;
|
|
@@ -298,7 +298,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
298
298
|
self._collectCollided = collectCollided;
|
|
299
299
|
self._radiation = v2.radiation;
|
|
300
300
|
|
|
301
|
-
// SWEPT-OBB geometry (circulation §2 + MIRROR broad-phase-superset
|
|
301
|
+
// SWEPT-OBB geometry (circulation §2 + MIRROR broad-phase-superset rule): resolve
|
|
302
302
|
// BOTH the narrow-phase region AND the broad-phase rect from the ONE SlabFace authority.
|
|
303
303
|
// The JS wrapper LO keeps the TRUE slab rect (render draws the thin rotated face + the
|
|
304
304
|
// renderer/eject stay byte-identical); the ENGINE's registered rect is EXPANDED to the
|
|
@@ -467,7 +467,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
467
467
|
/**
|
|
468
468
|
* setOrientation(deg) — live re-aim (B7). Normalizes to [0,360) and routes through
|
|
469
469
|
* the SAME setV2Prop recompile path the Inspector slider uses (explicit re-bake of the
|
|
470
|
-
* directional cone — the
|
|
470
|
+
* directional cone — the "a wall that should re-aim must recompile"
|
|
471
471
|
* path; NOT a per-tick re-capture). SU1 at deg=0. THROWS on a wall-shaped object with no
|
|
472
472
|
* collisionBehavior: the constructor requires one, so such an object was not built by Wall
|
|
473
473
|
* and has no op-program to re-aim — turning it silently would show a turn that never happened.
|
|
@@ -538,7 +538,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
538
538
|
};
|
|
539
539
|
|
|
540
540
|
/**
|
|
541
|
-
* R2AX — live PITCH (up/down, two-axis mirror
|
|
541
|
+
* R2AX — live PITCH (up/down, two-axis mirror). Degrees in
|
|
542
542
|
* [-90, 90], rotation about the plate's own long axis; routes through the SAME
|
|
543
543
|
* setV2Prop recompile path as orientation (re-bakes the 3-space reflection about the
|
|
544
544
|
* SlabFace plate normal + the n-dot guard + the 3D-AABB broad rect). Requires a 3D
|
|
@@ -616,7 +616,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
616
616
|
hooks: nextHooks, markTag: (prop === 'markTag') ? value : this.markTag,
|
|
617
617
|
capacity: (prop === 'capacity') ? value : this.capacity,
|
|
618
618
|
// B7: a live orientation edit re-bakes the directional cone (explicit recompile —
|
|
619
|
-
// the
|
|
619
|
+
// the sanctioned re-aim path). Use the NEW value for the probe (the
|
|
620
620
|
// generic commit below sets this.orientationDeg AFTER the probe is built).
|
|
621
621
|
orientationDeg: (prop === 'orientationDeg') ? value : this.orientationDeg,
|
|
622
622
|
// R2AX — a live pitch edit re-bakes the 3-space reflection + guard the same way
|
|
@@ -627,7 +627,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
627
627
|
// Z1 — preserve the wall's 3D-ness across a live recompile (else an orientation
|
|
628
628
|
// edit on a 3D wall would drop the z-incidence reflect + the closest3d eject).
|
|
629
629
|
is3D: this.is3D === true,
|
|
630
|
-
// MIRROR
|
|
630
|
+
// MIRROR rule — the TRUE slab dims (from _trueRect) so a live orientation edit
|
|
631
631
|
// re-bakes the OBB-normal eject for the new angle (cardinal → AABB eject, SU1).
|
|
632
632
|
slabW: _trueWH.w, slabH: _trueWH.h
|
|
633
633
|
});
|
|
@@ -765,7 +765,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
765
765
|
};
|
|
766
766
|
|
|
767
767
|
/**
|
|
768
|
-
* LIVE-POPULATION readout (loop-polish B
|
|
768
|
+
* LIVE-POPULATION readout (loop-polish B): the number of frames
|
|
769
769
|
* that collided with THIS wall on the sampled tick. For a FULL-AREA background
|
|
770
770
|
* wall (collisionBehavior 'nothing' + the count hook, intersects trigger) every
|
|
771
771
|
* live leaf inside the rect collides every tick, so this per-tick collided-frame
|
|
@@ -848,8 +848,8 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
848
848
|
// ── The kind (objects/kinds.js): descriptor, construction defaults, palette, builder ──────────
|
|
849
849
|
|
|
850
850
|
/**
|
|
851
|
-
* Wall — the first-class WALL primitive (
|
|
852
|
-
*
|
|
851
|
+
* Wall — the first-class WALL primitive (W1). A SUGAR kind (peer of
|
|
852
|
+
* SphereEmitter — NOT a new engine kind):
|
|
853
853
|
* a thin facade over ONE LargeObject whose collision behavior is a friendly
|
|
854
854
|
* Collision LEXICON v2 (`collisionBehavior`: nothing | block | bounce | absorb |
|
|
855
855
|
* destroy, + bounceDirection + hooks) compiled to op-programs
|
|
@@ -898,20 +898,20 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
898
898
|
// ── Rotation (Collision Lab; R1 UX-pass upgrade) — a live orientation the
|
|
899
899
|
// sugar owns. Layer 1: number, degrees, [0,360), live, render+op-owned
|
|
900
900
|
// (engineVisible:false — the engine LO search region stays AXIS-ALIGNED,
|
|
901
|
-
// the honest AABB catch zone; nothing in lo_to_scope_bag —
|
|
901
|
+
// the honest AABB catch zone; nothing in lo_to_scope_bag — v2 §1b).
|
|
902
902
|
// A live edit EXPLICITLY recompiles (setV2Prop → compileWallV2) AND the
|
|
903
903
|
// renderer draws the shell rotated (no outline of the un-rotated rect).
|
|
904
904
|
//
|
|
905
905
|
// Layer 2 (what the knob DOES): orientationDeg is the mirror SURFACE angle.
|
|
906
906
|
// For a bounce/reflect mirror the compiled reflection law is now
|
|
907
|
-
// ORIENTATION-AWARE (R1,
|
|
907
|
+
// ORIENTATION-AWARE (R1, proven exact):
|
|
908
908
|
// • 0/90/180/270 → the axis-aligned incidence BOX reflector (both faces;
|
|
909
909
|
// byte-identical at 0 — SU1).
|
|
910
910
|
// • 45/135/225/315 → the exact swap / swap+negate (+x → +y / +x → −y).
|
|
911
911
|
// • any α → the fixed tilted-plane reflection R=[cos2α,sin2α;sin2α,−cos2α].
|
|
912
912
|
// STANDARD OPTICS 2θ LAW: a mirror surface at angle θ DEFLECTS the beam by
|
|
913
913
|
// 2θ, so a +x beam exits at angle 2θ (slope tan2θ). Rotate the mirror to 45°
|
|
914
|
-
// and a +x beam exits +y (the
|
|
914
|
+
// and a +x beam exits +y (the routing landmark); 15° → slope tan30°;
|
|
915
915
|
// 67.5° → (−0.7071, 0.7071). For a constrained-random ("laser-gate") wall,
|
|
916
916
|
// orientation instead re-bakes the scatter CONE endpoints
|
|
917
917
|
// (cos/sin(orientation ± angleConstraint)) — the scatter axis follows the spin.
|
|
@@ -930,7 +930,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
930
930
|
'rotation target.'
|
|
931
931
|
},
|
|
932
932
|
{
|
|
933
|
-
// ── R2AX — two-axis mirror
|
|
933
|
+
// ── R2AX — two-axis mirror:
|
|
934
934
|
// Layer 1 (API): up/down tilt in degrees [-90, 90] about the plate's OWN
|
|
935
935
|
// long axis (the drawn face line). 3D walls only (needs a real z/depth —
|
|
936
936
|
// visible in the Inspector only when depth > 0); a 2D wall THROWS. Live:
|
|
@@ -957,7 +957,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
957
957
|
'z-component and always leaves on the incident side (never through the mirror). ' +
|
|
958
958
|
'0 = the flat in-plane mirror (vz passes through).'
|
|
959
959
|
},
|
|
960
|
-
// ── Z-slab (Z1
|
|
960
|
+
// ── Z-slab (Z1) — a wall's 3D depth/placement. A
|
|
961
961
|
// 6-element rect (RECT_TUPLE[6]) gives the wall a real z-slab: the
|
|
962
962
|
// engine's collision region covers the depth, the wall reflects/ejects on all
|
|
963
963
|
// SIX faces (the 3-axis incidence lift, WASM), and the three renderer draws it
|
|
@@ -983,7 +983,7 @@ import { wallBehaviorV2ValuesMap as _wallBehaviorV2ValuesMap, bounceDirectionVal
|
|
|
983
983
|
description: 'The wall\'s z placement (near-face … far-face CENTER) in physics pixels ' +
|
|
984
984
|
'(0 for a 2D wall). Derived from the 6-element rect. Edit via the rect field.'
|
|
985
985
|
},
|
|
986
|
-
// ── Collision LEXICON v2
|
|
986
|
+
// ── Collision LEXICON v2 — the nested behavior/direction/
|
|
987
987
|
// modifier/hook surface. Enum values are FERRIED from WallBehaviors.js
|
|
988
988
|
// (never hand-listed). `visibleWhen` (evaluated live at Inspector render
|
|
989
989
|
// against the captured props) reveals the dependent fields only when
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* (rung dse-one-emitter).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
// ── H1 AT THE CANONICAL DETECTOR LEG
|
|
13
|
+
// ── H1 AT THE CANONICAL DETECTOR LEG ─────────────────────────────────────────
|
|
14
14
|
//
|
|
15
15
|
// The competence baseline: the most basic thing, done right, seen with eyes. One
|
|
16
16
|
// emitter, then two, with the plate PRE-COMPUTED at the leg the ring formula was
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* (rung dse-one-slit).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
// ── ONE SLIT AT THE CANONICAL LEG
|
|
13
|
+
// ── ONE SLIT AT THE CANONICAL LEG ────────────────────────────────────────────
|
|
14
14
|
//
|
|
15
15
|
// The companion arm to `dse-two-slits`: the IDENTICAL apparatus (same emitter, same
|
|
16
16
|
// barrier x-position, same slit-1 aperture at y=120, same leg D, same plate, same
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
// (120-240=-120) falls off the 400px canvas and does not exist.
|
|
30
30
|
// PREDICTED: three bands at y=40, y=200, y=360; a dip/minimum on either side of
|
|
31
31
|
// each; NO claim about height relative to `dse-two-slits` — degree of
|
|
32
|
-
// reinforcement is a different question this
|
|
32
|
+
// reinforcement is a different question this scene does not ask. The claim under
|
|
33
33
|
// test is PRESENCE AND POSITION: does structure appear at all with one aperture,
|
|
34
34
|
// and does it land on this specific off-centre ladder rather than smearing into
|
|
35
35
|
// a single broad structureless lobe centred on y=120 (the naive "single-slit
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
* (rung dse-photoelectric).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
// ── DSE Lab
|
|
13
|
+
// ── DSE Lab
|
|
14
14
|
// — the photoelectric experiment + THE double-slit, built on the full new
|
|
15
15
|
// component set (SphereEmitter chargeMode random, v2 Walls + presets, in-scene
|
|
16
16
|
// LiveChart). The single canonical double-slit is 2C (on the Tunnel object); the
|
|
17
17
|
// old Light-Lab r9 and DSE 2A double-slit rungs were retired.
|
|
18
|
-
// 2B — the photoelectric effect on the new component set (
|
|
19
|
-
//
|
|
18
|
+
// 2B — the photoelectric effect on the new component set (the CURRENT absorb/radiate
|
|
19
|
+
// drip, NO workFunction threshold).
|
|
20
20
|
// An incoming light stream charges an ABSORBING Wall (ABSORB v2 real backing-frame mass:
|
|
21
21
|
// fills to capacity, then per-tick radiates lower-dimension leaves out its back with
|
|
22
22
|
// p=1/capacity, mass conserved). A LiveChart on the absorber's absorb-stats series shows
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
// stochastic near-field walk; the ray-optics λL/d Fraunhofer regime needs L >> d²/λ ≈ 580px,
|
|
20
20
|
// larger than a 600px canvas allows).
|
|
21
21
|
//
|
|
22
|
-
// ONE MODE-AWARE SOURCE (S3/W2
|
|
22
|
+
// ONE MODE-AWARE SOURCE (S3/W2). The mode strip
|
|
23
23
|
// selects the RENDERER the host boots (renderState.renderer), and this scene reads it ONCE,
|
|
24
24
|
// before its world: `three` ⇒ exp.createScene (a 3D world), else exp.createCanvas (2D). `IS3D`
|
|
25
25
|
// then guards the dimensional deltas — there is NO second (`-3d`) source file:
|
|
@@ -70,8 +70,7 @@ export default function buildExperiment(exp) {
|
|
|
70
70
|
var L = wl * 1.5, W = wl; // slit-group left 96, width 64 (wall front..back = [96,160])
|
|
71
71
|
// THE DETECTOR LEG, DERIVED FROM THE RING LADDER (zero free parameters).
|
|
72
72
|
// A phase-locked POINT source lays down density rings at r_m = (lambda/4)*sqrt((2m+1)^2+1)
|
|
73
|
-
// measured from the emission point (guide row r3-radius-stall-shells
|
|
74
|
-
// docs/internal/records/2026-07-30-dse-ring-campaign.md). Each slit exit below
|
|
73
|
+
// measured from the emission point (guide row r3-radius-stall-shells). Each slit exit below
|
|
75
74
|
// IS such a source, so the plate should be placed where
|
|
76
75
|
// a NAMED ring crosses it rather than at a symmetric figure. Put the MIDLINE on ring m=2
|
|
77
76
|
// of BOTH slits: with the exits at +/-halfSep from the midline, that needs a leg of
|
|
@@ -155,7 +154,7 @@ export default function buildExperiment(exp) {
|
|
|
155
154
|
// only ever project two beams. Re-emission is what gives each slit its own angular
|
|
156
155
|
// spread to interfere with. Mirror mode stays available on the object (mode:'mirror',
|
|
157
156
|
// still the default) for the waveguide/light-pipe case it was built for.
|
|
158
|
-
// THE TUNNEL IS A CONFIGURED EMITTER
|
|
157
|
+
// THE TUNNEL IS A CONFIGURED EMITTER. The exit gate's flags are not
|
|
159
158
|
// plumbing details — they ARE the emitter vocabulary, one-to-one:
|
|
160
159
|
// exitRecenter ON + exitPhaseReset ON -> a POINT SOURCE (every quantum leaves the
|
|
161
160
|
// same pixel with the same phase) — what this rung uses, and what makes the ring
|
|
@@ -167,7 +166,7 @@ export default function buildExperiment(exp) {
|
|
|
167
166
|
// In 3D the recenter pins the TRANSVERSE axis only, so the slot stays extended in z:
|
|
168
167
|
// each slit is a LINE source and the bands extrude along z — the plate picture.
|
|
169
168
|
// Unifying this with the SphereEmitter preset vocabulary (one owner, ferried — never a
|
|
170
|
-
// second preset list) is
|
|
169
|
+
// second preset list) is an open contract design;
|
|
171
170
|
// this rung uses the existing flags and documents the mapping.
|
|
172
171
|
exp.addObject('Tunnel', Object.assign({ left: L, top: s1Top + linerH, length: W, bore: bore, wallThickness: linerH, axis: 'x' }, Z3, { mode: 'directed', exitCollapse: true, exitRecenter: true, exitPhaseReset: true, name: 'slit1_channel', color: [80, 140, 220] }));
|
|
173
172
|
exp.addObject('Tunnel', Object.assign({ left: L, top: s2Top + linerH, length: W, bore: bore, wallThickness: linerH, axis: 'x' }, Z3, { mode: 'directed', exitCollapse: true, exitRecenter: true, exitPhaseReset: true, name: 'slit2_channel', color: [80, 140, 220] }));
|
|
@@ -200,7 +199,7 @@ export default function buildExperiment(exp) {
|
|
|
200
199
|
collisionBehavior: 'destroy', name: 'zClipFar', visible: false });
|
|
201
200
|
exp.addObject('Wall', { rect: [0, 0, CW, H], z: -zHalf - 40, depth: 40,
|
|
202
201
|
collisionBehavior: 'destroy', name: 'zClipNear', visible: false });
|
|
203
|
-
// THE SWITCH
|
|
202
|
+
// THE SWITCH: god-rays computed from the light particles only (godraySource
|
|
204
203
|
// 'leaf'), at the sun's settings — the ONE owner of those numbers is lib/shim/render/sun-look.js
|
|
205
204
|
// (SunLook); this file types none of them. Default OFF (the first-contact picture is
|
|
206
205
|
// unchanged). OFF restores EXACTLY what was live before the last ON (a host row, a STUDIO
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* (rung dse-two-emitters).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
// ── H1 AT THE CANONICAL DETECTOR LEG
|
|
13
|
+
// ── H1 AT THE CANONICAL DETECTOR LEG ─────────────────────────────────────────
|
|
14
14
|
//
|
|
15
15
|
// The competence baseline: the most basic thing, done right, seen with eyes. One
|
|
16
16
|
// emitter, then two, with the plate PRE-COMPUTED at the leg the ring formula was
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* (rung dse-two-slits).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
// ── TWO SLITS AT THE CANONICAL LEG
|
|
13
|
+
// ── TWO SLITS AT THE CANONICAL LEG ───────────────────────────────────────────
|
|
14
14
|
//
|
|
15
15
|
// The SAME apparatus as `dse-two-emitters` — same λ, same separation, same leg,
|
|
16
16
|
// same detector, same chart — but the two point sources are now SLIT EXITS in
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
// barrier and feeds BOTH slit channels; each channel is a `directed` Tunnel
|
|
19
19
|
// with the exit gate COLLAPSED + PHASE-RESET, exactly the composition
|
|
20
20
|
// `dse-tunnel-rebuild` already uses to make a slit's own mouth stand in for a
|
|
21
|
-
// point source ("THE TUNNEL IS A CONFIGURED EMITTER",
|
|
21
|
+
// point source ("THE TUNNEL IS A CONFIGURED EMITTER", see that
|
|
22
22
|
// rung's source comment for the flag-by-flag mapping). Composed only: Wall +
|
|
23
23
|
// Tunnel, zero new parts, zero engine code.
|
|
24
24
|
//
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* (rung r4b-laser-buildup).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
// LASER BUILD-UP (D4
|
|
13
|
+
// LASER BUILD-UP (D4) — the three
|
|
14
14
|
// components of a laser assembled one at a time on top of the earlier Light Lab rungs:
|
|
15
15
|
// 1. a GAIN SOURCE — the hemisphere emitter (rung 3's omni source, restricted forward)
|
|
16
16
|
// 2. a RESONANT BORE — the directed corridor, which re-aims every wall hit forward
|
|
@@ -15,9 +15,9 @@ import { SphereEmitter } from '@descix/frqtl-web/parts';
|
|
|
15
15
|
export default function buildExperiment(exp) {
|
|
16
16
|
// Collision Lab 1A · 3D — a collimated LASER (particle-walk pins PURE +x in 2D AND
|
|
17
17
|
// 3D) into a 3D mirror SLAB (depth → z-slab containing z=0), rendered as a box;
|
|
18
|
-
// orbit to view. Same LASER tuning as the 2D 1A
|
|
18
|
+
// orbit to view. Same LASER tuning as the 2D 1A: single positive
|
|
19
19
|
// charge, wavelength 1, wavelengthScale 1 (fundamentalWaveLength 4), tiny burst.
|
|
20
|
-
// FACE-ON default
|
|
20
|
+
// FACE-ON default: orientation 0 presents the full
|
|
21
21
|
// drawn face to the beam → retro-reflection (beam straight back, recolored) — the
|
|
22
22
|
// one mirror visual that reads correctly from EVERY camera azimuth. (A tilted
|
|
23
23
|
// default's L-shaped 2th exit is correct optics but its mirror-flipped projection
|
|
@@ -39,8 +39,8 @@ export default function buildExperiment(exp) {
|
|
|
39
39
|
collisionBehavior: 'bounce', bounceDirection: 'reflect', orientationDeg: 0,
|
|
40
40
|
name: 'mirror', color: [255, 120, 0], hooks: ['recolor']
|
|
41
41
|
});
|
|
42
|
-
// SCENE Z-COLLIMATOR (
|
|
43
|
-
//
|
|
42
|
+
// SCENE Z-COLLIMATOR (without it the z lets things pass through instead of
|
|
43
|
+
// reflecting): the beam's z-tail DIFFUSES over time (measured:
|
|
44
44
|
// |z| at the wall trending 68 of the 80 rim within seconds), and any quantum
|
|
45
45
|
// beyond the plate's z-band would sail BESIDE the plate — reading as pass-
|
|
46
46
|
// through from rooftop. Two INVISIBLE full-canvas destroy boundaries flush with
|