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 / reproducibility
const randomMode = 1; // min=0, max=1, step=1, (Deterministic, Random)
const Seed = "123"; // type=string, Enter your seed!
// Pen / drawing
const PenOpacity = 0.90; // min=0, max=1, step=0.01
const DebugText = 1; // min=0, max=1, step=1, (Off, On)
// CFDG / recursion
const GlobalScale = 0.25; // min=0.05, max=1.0, step=0.01
const MaxDepth = 14; // min=1, max=30, step=1
const MinSize = 0.00; // min=0, max=0.20, step=0.005
const MinComplexity = 50; // min=0, max=500, step=10
// Grid / structure
const TileExtent = 1; // min=0, max=3, step=1 (controls start() grid size)
const XSpacing = 3.00; // min=0.5, max=8, step=0.1
const YSpacing = 1.50; // min=0.5, max=8, step=0.1
const ZSpacing = 3.10; // min=0.5, max=8, step=0.1
const BrightLo = 0.50; // min=0, max=1, step=0.01
const BrightHi = 1.00; // min=0, max=2, step=0.01
// Lighting / shading
const LightDirX = 0.50; // min=-1, max=1, step=0.05
const LightDirY = 1.00; // min=-1, max=1, step=0.05
const LightDirZ = 0.40; // min=-1, max=1, step=0.05
const Ambient = 0.15; // min=0, max=1, step=0.01
const Diffuse = 0.90; // min=0, max=2, step=0.01
const Contrast = 1.40; // min=0, max=3, step=0.05
const LightThreshold = 0.75; // min=0, max=1, step=0.01
const UseBright = 1; // min=0, max=1, step=1, (Off, On)
// Hatching
const HatchMinSpacing = 0.10; // min=0.02, max=1.0, step=0.01
const HatchMinArea = 20; // min=0, max=400, step=5
const HatchMinHatchArea = 60; // min=0, max=800, step=10
const SpacingDarkFactor = 0.25; // min=0.05, max=2, step=0.05
const SpacingLightFactor = 3.50; // min=0.5, max=10, step=0.25
// Line stylization
const WobbleOn = 0; // min=0, max=1, step=1
const 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=1
const 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)
// Camera
const CamAuto = 0; // min=0, max=1, step=1, (Manual, AutoFit)
const CamFov = 120; // min=10, max=170, step=1
const CamYawBase = -90; // min=-180, max=180, step=1
const CamYawJitter = 180; // min=0, max=360, step=1
const CamRadius = 10; // min=1, max=60, step=0.5
const CamHeightBase = -3; // min=-30, max=30, step=0.5
const CamHeightJitter= 9; // min=0, max=60, step=0.5
const CamRollBase = -3; // min=-45, max=45, step=0.5
const CamRollJitter = 6; // min=0, max=45, step=0.5
Canvas.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];
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX