Fork: Signal Restored (Extended)
Fork with extended controls
Adjustable Variables
randomMode
1.00
seed
penOpacity
0.90
debugText
1.00
globalScale
0.25
maxDepth
14.0
tileExtent
1.00
xSpacing
3.00
ySpacing
1.50
zSpacing
3.10
ambient
0.15
diffuse
0.90
contrast
1.40
useBright
1.00
edgeBreakup
0.00
Min
size
0.00
complexity
50.0
Bright
lo
0.50
hi
1.00
Light
dirX
0.50
dirY
1.00
dirZ
0.40
threshold
0.75
Hatch
minSpacing
0.10
minArea
20.0
minHatchArea
60.0
Spacing
darkFactor
0.25
lightFactor
3.50
Wobble
on
0.00
amp
0.00
freq
0.02
steps
2.00
Curve
on
0.00
amount
0.00
steps
2.00
Cam
auto
0.00
fov
120
yawBase
-90.0
yawJitter
180
radius
10.0
heightBase
-3.00
heightJitter
9.00
rollBase
-3.00
rollJitter
6.00
Log in to post a comment.
// Forked from "Signal Restored" by ge1doot// https://turtletoy.net/turtle/782a9f5329// "Signal Restored" by ge1doot// 30 Nov 2025// After months of silence, the channel cracked open and her voice returned.// Only three words: I am here.//// ########## Tiny module helpers ##########function module(bodyFn) {return bodyFn();}function expose(obj) {return obj;}// --- User controls (Turtletoy sliders) ------------------// --- User controls (Turtletoy sliders) ------------------// RNG / reproducibilityconst randomMode = 1; // min=0, max=1, step=1, (Deterministic, Random)const Seed = "123"; // type=string, Enter your seed!// Pen / drawingconst PenOpacity = 0.90; // min=0, max=1, step=0.01const DebugText = 1; // min=0, max=1, step=1, (Off, On)// CFDG / recursionconst GlobalScale = 0.25; // min=0.05, max=1.0, step=0.01const MaxDepth = 14; // min=1, max=30, step=1const MinSize = 0.00; // min=0, max=0.20, step=0.005const MinComplexity = 50; // min=0, max=500, step=10// Grid / structureconst TileExtent = 1; // min=0, max=3, step=1 (controls start() grid size)const XSpacing = 3.00; // min=0.5, max=8, step=0.1const YSpacing = 1.50; // min=0.5, max=8, step=0.1const ZSpacing = 3.10; // min=0.5, max=8, step=0.1const BrightLo = 0.50; // min=0, max=1, step=0.01const BrightHi = 1.00; // min=0, max=2, step=0.01// Lighting / shadingconst LightDirX = 0.50; // min=-1, max=1, step=0.05const LightDirY = 1.00; // min=-1, max=1, step=0.05const LightDirZ = 0.40; // min=-1, max=1, step=0.05const Ambient = 0.15; // min=0, max=1, step=0.01const Diffuse = 0.90; // min=0, max=2, step=0.01const Contrast = 1.40; // min=0, max=3, step=0.05const LightThreshold = 0.75; // min=0, max=1, step=0.01const UseBright = 1; // min=0, max=1, step=1, (Off, On)// Hatchingconst HatchMinSpacing = 0.10; // min=0.02, max=1.0, step=0.01const HatchMinArea = 20; // min=0, max=400, step=5const HatchMinHatchArea = 60; // min=0, max=800, step=10const SpacingDarkFactor = 0.25; // min=0.05, max=2, step=0.05const SpacingLightFactor = 3.50; // min=0.5, max=10, step=0.25// Line stylizationconst WobbleOn = 0; // min=0, max=1, step=1const WobbleAmp = 0; // min=0, max=5, step=0.1 (screen units)const WobbleFreq = 0; // min=0.02, max=2, step=0.01 (cycles per segment)const WobbleSteps = 0; // min=2, max=60, step=1 (polyline resolution)const CurveOn = 0; // min=0, max=1, step=1const CurveAmount = 0; // min=0, max=1, step=0.01 (how “bent” edges are)const CurveSteps = 0; // min=2, max=80, step=1 (bezier approx resolution)const EdgeBreakup = 0.0; // min=0, max=1, step=0.01 (optional: randomize per-edge)// Cameraconst CamAuto = 0; // min=0, max=1, step=1, (Manual, AutoFit)const CamFov = 120; // min=10, max=170, step=1const CamYawBase = -90; // min=-180, max=180, step=1const CamYawJitter = 180; // min=0, max=360, step=1const CamRadius = 10; // min=1, max=60, step=0.5const CamHeightBase = -3; // min=-30, max=30, step=0.5const CamHeightJitter= 9; // min=0, max=60, step=0.5const CamRollBase = -3; // min=-45, max=45, step=0.5const CamRollJitter = 6; // min=0, max=45, step=0.5Canvas.setpenopacity(PenOpacity);const turtle = new Turtle();turtle.pendown();// ########## CFDG rules ##########const cfdgRules = {setup: {start: "start",transform: { s: GlobalScale },maxDepth: MaxDepth,minSize: MinSize,minComplexity: MinComplexity,hatching: {minSpacing: HatchMinSpacing,minArea: HatchMinArea,minHatchArea: HatchMinHatchArea},shading: {dir: [LightDirX, LightDirY, LightDirZ],ambient: Ambient,diffuse: Diffuse,contrast: Contrast,lightThreshold: LightThreshold,spacingDarkFactor: SpacingDarkFactor,spacingLightFactor: SpacingLightFactor,mode: "directional",useBright: (UseBright === 1)},camera: {auto: (CamAuto === 1),fov: CamFov,yaw: CamYawBase + Math.random() * CamYawJitter,radius: CamRadius,height: CamHeightBase + Math.random() * CamHeightJitter,roll: CamRollBase + Math.random() * CamRollJitter}},start(s) {const t = TileExtent;for (let x = -t; x <= t; x++) {for (let y = -t; y <= t; y++) {for (let z = -t; z <= t; z++) {if (x === 0 || y === 0 || z === 0) continue;const br = BrightLo + (BrightHi - BrightLo) * rnd();rule.R1(s, { x: XSpacing * x, y: YSpacing * y, z: ZSpacing * z, s: 1, l: br });}}}},R1: [100,(s) => {rule.grid(s, { l: rnd() > 0.5 ? -1 : 1 });rule.R1(s, { z: 0.4, rx: 90 });},100,(s) => {CUBE(s, { s: [0.15, 0.15, 4] });rule.R1(s, { z: 0.395, rx: 90, ry: -90, s: 0.998 });},60,(s) => {TUBE(s);rule.R1(s, { z: 0.401, rx: 90, ry: 90, s: 0.998 });},20,(s) => {CUBE(s, { s: 1.1 });rule.R1(s, { z: 0.402, rx: 90, ry: -90 });},20,(s) => {PLANE(s, { s: 0.9 });rule.R1(s, { z: 0.403, rx: -90, ry: 90 });},30,(s) => {rule.R1(s, { rx: 90, s: [4, 1.3, 1] });rule.R1(s, { rz: 180, s: [0.99, 1, 1.7] });},40,(s) => {rule.R1(s, { rx: 90, s: [0.6, 4.5, 1.5] });rule.R1(s, { rz: -90, s: [1.01, 1.01, 0.7] });}],grid(s) {CUBE(s, { x: 0, s: [0.11, 1.1, 1.1] });CUBE(s, { x: 0.2, s: [0.11, 1.1, 1.1] });CUBE(s, { x: 0.4, s: [0.11, 1.1, 1.1] });CUBE(s, { x: 0.6, s: [0.11, 1.1, 1.1] });CUBE(s, { x: 0.8, s: [0.11, 1.1, 1.1] });CUBE(s, { x: 1, s: [0.11, 1.1, 1.1] });}};// ########## math3d module ##########const math3d = module(() => {const v0 = [0, 0, 0];const v1 = [0, 0, 0];const v2 = [0, 0, 0];const v3 = [0, 0, 0];const v4 = [0, 0, 0];const v5 = [0, 0, 0];const v6 = [0, 0, 0];const v7 = [0, 0, 0];function vec3(x = 0, y = 0, z = 0) {return [x, y, z];}