PulseCore

Chapter 8 · Section 12

The 2D Field

The BPT law

BPT Part 8.8's Pixel Quantization Principle, "One Pixel = One Zinf ⟹ Minimal boundary cell extent = ℓ_z", makes each boundary cell an indivisible pixel that "must undergo 1 → 0 recollapse each frame unless actively re-excited"; the book calls the universe "a recursive display". BPT Part 1.8 (The Zinf ℨ Quantum, Reality's Pixel) gives the pixel's clock, ℨ ≈ 2.283 × 10⁻¹⁰⁶ s. The game's field is that display: one canvas pixel a cell, and the same canvas is the torus's skin. Its states are Chapter 2's: a lit pulser, a dark pulser, a null cell with its exposure toward bifurcation, and a fold.

BPT Part 3.1 (From Binary Transition to Physical Energy) gives Data Energy: "Each binary transition generates energy: E⊶ = ℏ × ω₁ × n○ ... Energy is not imposed on data but arises from data." BPT Part 3.6 makes the data within the Pulsecore radiation with energy density u = n·k_B·T, each datum carrying "the Data Energy E = k_B·T of one substrate pulse", and its skin "as hot as the data it holds". The game reads the filling Pulsecore as a heating body on that ground (the code's comment, app.js:375: E = k_B·T); BPT does not give it a color, which is a game method.

The established physics

A body at temperature T glows with Planck's spectrum (Planck 1900). The game's color for T is the fitted approximation of Tanner Helland to the blackbody's sRGB color, which the code names (blackbody() app.js:423); its coefficients are that fit's.

The game's math

The texture (drawFieldTexture() app.js:310). Each cell is one pixel of the field canvas, which is the torus's skin in 3D. Its brightness comes from cellIntensity() app.js:3850: 1 for a fold or a lit pulser, 0.3 for a dark pulser, min(0.22, 0.22·exposure) for a null cell; under 0.01 a cell is drawn near black, (8, 7, 10). Its color is its lineage color, or its phase color (hue 180°·phase, getPhaseColor() app.js:3820, phase 1 lit, 0.5 dark, exposure for a null cell), or the matter's motion (hue its direction, lightness 0.12 + 0.5·speed/c) or density (hue 0.66 − 0.55·ρ). Then by epoch:

pinpoint:   p = min(1, data within / nova capacity)
            color = (1 − m)·data color + m·blackbody(1,200 + 8,800·p K),  m = 0.15 + 0.45·p
            k = min(1, intensity·(0.75 + 0.5·p))
physical:   with stars drawn:  k = intensity·(base + (0.8 − base)·glow),  base = 0.35, or 0.08 from the 4th harmonic
            without:            k = intensity·(0.32 + 0.68·matter.glow(r, c))
decay:      k ·= 1 − decayFade

The glow round clusters (app.js:334–347) brightens the data within each heavy body's swirl as w = √(1/max(1, d))·(1 − d/reach) at d cells, reach = max(2, min(24, floor(min(rows, cols)/4))), for the 24 heaviest bodies of mass at least 16; CLUSTER_GLOW = 0.8 is its brightest. In 3D the skin is painted in the data's moving frame (row R holds field row R + flow.offR) and the scene scrolls it (Part 8.9); without 3D a fast flow is smeared along its run with a two-pass exponential trail, q = e^(−2/streak). Without stars the strings, the bodies (dust grey, a body above matter.full pale blue, above three times it orange, one or two cells wide) and the crystals are painted into the pixels. Folds are white, or dim (90, or 24 from the 4th harmonic) behind the stars.

dataColour(r, c) app.js:1185 returns a cell's lineage color as RGB in 0 to 1, falling back to the first lit pulser of the middle row, so a star takes the color of the data it was (Part 8.7). tintHexColor(hex, phase) app.js:3790 scales a color toward black by phase in 0 to 1.

The flat view (drawGrid() app.js:4003). In 3D it paints no grid: it repaints the texture (every other step once stars carry the picture) and calls scene.render(). Without 3D it fills the canvas purple-black (#08070a, or #1a181e behind grid lines), draws each cell as a square of cellSize (less 0.5 px with grid lines) at alpha min(1, intensity) in white for a fold, its phase color, or its lineage color tinted by max(intensity, 0.6), with the throat's line at the middle row, the gravity rings (alpha max(0.05, 0.35 − R/max(rows, cols))), the strings, the crystals and the spin overlay (spin.js, Chapter 2).

In the game

The 2D field is the skin seen flat. The "View" control's "2D · the field" (index.php:141) shows it; in 3D the same picture is wrapped on the torus, and every view control here changes both. While the Pulsecore fills, the player watches it heat: the field is tinted from a dull red glow toward white-hot as the data within nears the nova's capacity, the Data Energy of every transition read as heat. Painted cells keep their color as the rule spreads them, because each new cell takes the color of the data that lit it; with "Flow colours (at Start)" checked, "At Start the Pulsecore's data is painted as a colour wheel round its centre, and every new cell takes the colour of the data that lit it, so the spin, the flow and the wells' swirl show as moving colour" (index.php:214). Once there is matter, "Colour by" (index.php:188) offers "Data lineage", "Motion" (hue the direction the matter moves, brightness its speed against light) and "Density".

The 2D view adds its own overlays: the throat as a line across the middle row, the wells' gravity rings ("Show the wells' rings"), the strings and nodes, and the spin overlay ("Show spin and axis"). "Grid lines" draws the cell grid, "Phase Colors" (index.php:215) colors each cell by its phase in the pulse, "Phase Mode" draws those phases in "Color" or "Grayscale", "Debug numbers (phase, exposure)" (index.php:213) writes each cell's numbers on it, "Center View" keeps the field centered, and "Zoom" sets the size of a cell. Every one of these is the field itself, one pixel a Zinf cell of the model level, drawn without a stand-in.

The scale model

One pixel is one cell of the model level Lm. What a cell stands for at the true level is shown in the readout (Part 8.13). The colors are the data's own lineage colors, so the picture is the data, not a rendering of it; only brightness is chosen.

Where the game and the theory differ

  • BPT Part 3.6 makes the Pulsecore's skin as hot as its data, u = n·k_B·T. The drawn glow is not computed from that temperature: it maps the share filled, p = data within / nova capacity, onto 1,200 K to 10,000 K at every level, then colors it by the blackbody fit.
  • drawGrid()'s last two lines repeat the 3D path and are never reached, since the 3D branch returns first.

Fixed numbers

Number Where What it is Kind
1, 0.3, 0.22 cellIntensity() app.js:3851–3853 lit, dark pulser, null cell brightness DISPLAY
0.5 getPhaseForCell() app.js:3845 a dark pulser's phase DISPLAY
180° getPhaseColor() app.js:3826 the phase hue range DISPLAY
0.01, (8, 7, 10) app.js:352 the dark floor DISPLAY
24, 90, 255 app.js:353 fold brightness under the stars DISPLAY
0.9, 0.12, 0.5, 0.66, 0.55, 0.1, 0.55 app.js:360–366 motion and density colors DISPLAY
(255, 0, 157) app.js:370 fallback color DISPLAY
1,200 K, 8,800 K app.js:378 the pinpoint's glow from red to white-hot DISPLAY
Helland fit coefficients (329.698727446, −0.1332047592, 99.4708025861, 161.1195681661, 288.1221695283, −0.0755148492, 138.5177312231, 305.0447927307, 66, 60, 19, 10) blackbody() app.js:425–427 blackbody color PHYSICS (fit to Planck's law, Tanner Helland's approximation)
0.15, 0.45, 0.75, 0.5 app.js:378–380 glow mix and brightening DISPLAY
0.35, 0.08, 0.32, 0.68 app.js:385 physical skin brightness DISPLAY
0.8 (CLUSTER_GLOW) app.js:308 brightest glow round a cluster DISPLAY
24 (reach top), 2, /4 app.js:338 glow reach round a cluster CAP
16 (mass), 24 (bodies) app.js:339 which bodies glow CAP
e^(−2/streak), two passes app.js:395–405 the 2D flow smear METHOD (motion blur)
2, 3, colors app.js:410–411 2D bodies' size and color by mass DISPLAY
every other step app.js:4013 texture repaint under the stars METHOD (it was 12 ms a step)
#08070a, #1a181e, 0.5, 8, 0.6, 1.5 cells, 2 px, 0.05, 0.35, rgba colors drawGrid() app.js:4022–4097 the flat view's look DISPLAY