feat(of): boing ball + 5 models + enrich demos 0-9

Nouveaux fx demoscene classiques :
- boing.frag : BOING BALL Amiga 1984 (RJ Mical/Dale Luck), sphere
  damier rouge/blanc 8x8, lambert + spec, ombre allongee, bounce
  vertical sync BPM. Premiere demo Amiga jamais ecrite.
- mode7.frag : sol perspective SNES/outrun + sky retro + soleil
- plasma_c64.frag : sin layers + palette indexee 8 couleurs
  authentique C64 1985
- dot_tunnel.frag : grille de dots scrollant en perspective,
  tunnel demoscene classique

5 nouveaux modeles 3D parametriques :
- supershape.ply : Gielis super formula (forme vivante)
- lorenz.ply : attracteur de Lorenz tessellation tube (chaos)
- hopf.ply : sphere avec Hopf fibration twist
- enneper.ply : surface minimale d'Enneper
- hopf_link.ply : 2 anneaux entrelaces (link Hopf)

29 BgKind au total maintenant (29 backgrounds différents).

Demos 0-9 enrichies (tous a 5-7 actes maintenant) :
- AMIGA TRIBUTE : ajout BOING BALL + VECTOR DEMO
- C64 LOWLIFE : ajout PLASMA C64 + DOT TUNNEL
- ACID JOURNEY : ajout SUPERSHAPE + VORTEX + CAUSTICS
- FREQUENCIES : ajout LORENZ attractor + HOPF fibration
- GLITCH WORLD : ajout HOPF LINK
- AMBIENT VOID : ajout OCTAHEDRON + CAUSTICS + ENNEPER
- RAVE : ajout MODE7 + INFERNO fire
- GREETINGS : 11 actes parcourant tous les classiques
  (BOING/PLASMA/DOT/TWISTER/COPPER/FRACTAL/MOBIUS/etc)
This commit is contained in:
L'électron rare
2026-05-07 21:57:25 +02:00
parent 2213223e37
commit 6467ec5e86
15 changed files with 103149 additions and 43 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+82
View File
@@ -0,0 +1,82 @@
#version 150
// Boing Ball — Amiga 1984 RJ Mical & Dale Luck demo. Sphere checker
// rouge/blanc qui rebondit en damier 8 méridiens × 8 parallèles.
// Audio-reactive : shadow/light + bounce vertical sur kick.
out vec4 fragColor;
uniform vec2 uRes;
uniform float uTime;
uniform float uBass;
uniform float uMid;
uniform float uTreble;
uniform float uKick;
uniform float uBpm;
void main() {
vec2 uv = (gl_FragCoord.xy - 0.5 * uRes) / uRes.y;
// Bounce vertical : la boule tape le sol au tempo du kick.
float bouncePhase = uTime * (1.6 + uBpm * 0.005);
float bounce = abs(sin(bouncePhase)); // 0..1, 0 quand au sol
bounce = pow(bounce, 0.6); // accentue le rebond
vec2 ballC = vec2(0.0, -0.18 + bounce * 0.45);
// Sphere SDF 2D : distance au centre
float ballR = 0.40 + uKick * 0.06;
float d = length(uv - ballC);
// Sol horizontal
float floorY = -0.6;
float floorD = uv.y - floorY;
// Background grille type 1984 Amiga
vec3 bg = vec3(0.85, 0.78, 0.70); // crème vintage
float gridX = abs(fract(uv.x * 6.0 + 0.5) - 0.5);
float gridY = abs(fract(uv.y * 6.0 + 0.5) - 0.5);
float grid = smoothstep(0.04, 0.0, min(gridX, gridY));
bg = mix(bg, vec3(0.55, 0.20, 0.20), grid * 0.6);
// Sol gradient (perspective)
if (uv.y < floorY) {
float fade = smoothstep(floorY, floorY - 0.6, uv.y);
bg = mix(bg, vec3(0.30, 0.10, 0.12), fade);
}
vec3 col = bg;
if (d < ballR) {
// Sur la sphère — calcule normale 3D pour checker pattern
float z = sqrt(ballR*ballR - d*d) / ballR;
// Coords sphériques
vec2 p = (uv - ballC) / ballR;
float lon = atan(p.x, z) + uTime * (1.5 + uMid * 1.2); // rotation
float lat = asin(p.y);
// Damier 8x8
float mer = floor(lon / 3.14159 * 4.0);
float par = floor(lat / 3.14159 * 8.0);
bool checkBlack = mod(mer + par, 2.0) > 0.5;
vec3 ballCol = checkBlack ? vec3(0.95, 0.95, 0.95)
: vec3(0.85, 0.10, 0.10);
// Lambert lumière en haut-gauche
float lambert = max(0.2, dot(normalize(vec3(p.x, p.y, z)),
normalize(vec3(-0.4, 0.5, 0.7))));
ballCol *= 0.4 + 0.7 * lambert;
// Spéculaire blanc
float spec = pow(max(0.0,
dot(reflect(vec3(0,0,-1), normalize(vec3(p.x, p.y, z))),
normalize(vec3(-0.4, 0.5, 0.7)))), 16.0);
ballCol += vec3(1.0) * spec * 0.6;
col = ballCol;
}
// Ombre au sol — disque allongé qui suit la boule
float shadowD = length(vec2(uv.x - ballC.x, (uv.y - floorY) * 4.0));
float shadowR = ballR * (1.2 - bounce * 0.4);
float shadow = smoothstep(shadowR, shadowR * 0.5, shadowD);
if (uv.y < floorY + 0.05 && uv.y > floorY - 0.15) {
col *= mix(1.0, 0.4, shadow * (1.0 - bounce));
}
fragColor = vec4(col, 1.0);
}
+4
View File
@@ -0,0 +1,4 @@
#version 150
uniform mat4 modelViewProjectionMatrix;
in vec4 position;
void main() { gl_Position = modelViewProjectionMatrix * position; }
@@ -0,0 +1,49 @@
#version 150
// Dot tunnel : grille de points en perspective défilant vers la caméra.
// Classique demoscene C64/Amiga.
out vec4 fragColor;
uniform vec2 uRes;
uniform float uTime;
uniform float uBass;
uniform float uMid;
uniform float uTreble;
uniform float uKick;
uniform float uBpm;
void main() {
vec2 uv = (gl_FragCoord.xy - 0.5 * uRes) / uRes.y;
float r = length(uv);
float a = atan(uv.y, uv.x);
float speed = 0.5 + uBpm * 0.005 + uKick * 1.0;
float depth = 1.0 / max(r, 0.05);
float z = depth + uTime * speed;
// Tile depth (8 levels par cycle)
float zi = floor(z * 4.0);
float zf = fract(z * 4.0);
// Dots : autour de chaque (slice z, angle), un point
float arms = 12.0;
float ang = floor(a / 6.28318 * arms);
float angF = fract(a / 6.28318 * arms);
// Distance au centre du dot dans la cellule (zf, angF)
vec2 cellCoord = vec2(angF, zf) - 0.5;
float dotDist = length(cellCoord) * 4.0;
float dot = smoothstep(0.5, 0.0, dotDist);
// Faraway dots become fainter
dot *= smoothstep(0.0, 1.5, depth) * smoothstep(8.0, 0.5, depth);
// Couleur cycle hue par tile z
float hue = zi * 0.13 + ang * 0.05 + uMid * 0.3;
vec3 col = 0.5 + 0.5 * cos(6.28318 *
(vec3(1.0, 0.7, 0.4) * hue + vec3(0.0, 0.4, 0.7)));
col *= dot * (1.0 + uKick * 0.6);
fragColor = vec4(col, 1.0);
}
@@ -0,0 +1,4 @@
#version 150
uniform mat4 modelViewProjectionMatrix;
in vec4 position;
void main() { gl_Position = modelViewProjectionMatrix * position; }
+62
View File
@@ -0,0 +1,62 @@
#version 150
// Mode 7 (SNES) : sol texturé en perspective, scrollant.
// Inverse perspective mapping de uv → ground plane.
out vec4 fragColor;
uniform vec2 uRes;
uniform float uTime;
uniform float uBass;
uniform float uMid;
uniform float uTreble;
uniform float uKick;
uniform float uBpm;
vec3 palette(float t) {
return 0.5 + 0.5 * cos(6.28318 * (vec3(1.0, 0.6, 0.4) * t + vec3(0.0, 0.4, 0.7)));
}
void main() {
vec2 uv = (gl_FragCoord.xy / uRes) - 0.5;
uv.x *= uRes.x / uRes.y;
// Sky : top-half, gradient
if (uv.y > 0.0) {
float k = clamp(uv.y * 2.0, 0.0, 1.0);
vec3 sky = mix(vec3(0.95, 0.4, 0.6), vec3(0.05, 0.05, 0.2), k);
// Soleil
float sd = length(uv - vec2(0.0, 0.15));
sky += vec3(1.0, 0.95, 0.6) * smoothstep(0.18, 0.0, sd);
fragColor = vec4(sky, 1.0);
return;
}
// Ground inverse perspective
float t = uTime * (0.6 + uBpm * 0.003 + uKick * 1.0);
float fz = -1.0 / uv.y; // depth
float fx = uv.x * fz; // x in ground
float fy = fz - t; // depth scrolling
// Camera roll + audio modulation
float ang = sin(uTime * 0.3) * 0.2 * uMid;
float c = cos(ang), s = sin(ang);
vec2 g = mat2(c, -s, s, c) * vec2(fx, fy);
// Texture : damier psyché coloré
float gx = abs(fract(g.x * 1.5 + 0.5) - 0.5);
float gy = abs(fract(g.y * 1.0 + 0.5) - 0.5);
float check = step(0.0, sin(g.x * 3.14159) * sin(g.y * 3.14159));
vec3 colA = palette(g.x * 0.05 + uTime * 0.1);
vec3 colB = palette(g.y * 0.05 + uTime * 0.15 + 0.5);
vec3 col = mix(colA, colB, check);
// Bordures cellules
float edge = smoothstep(0.05, 0.0, min(gx, gy));
col = mix(col, vec3(1.0, 0.9, 0.7), edge * 0.5);
// Fade horizon
col *= smoothstep(0.0, -0.5, uv.y) * 1.3 + 0.2;
col *= 1.0 + uKick * 0.3;
fragColor = vec4(col, 1.0);
}
+4
View File
@@ -0,0 +1,4 @@
#version 150
uniform mat4 modelViewProjectionMatrix;
in vec4 position;
void main() { gl_Position = modelViewProjectionMatrix * position; }
@@ -0,0 +1,42 @@
#version 150
// Plasma C64-style : sin layers + palette indexed.
// Look 1985, pas trop riche mais authentique.
out vec4 fragColor;
uniform vec2 uRes;
uniform float uTime;
uniform float uBass;
uniform float uMid;
uniform float uTreble;
uniform float uKick;
void main() {
vec2 p = (gl_FragCoord.xy / uRes) * 2.0 - 1.0;
p.x *= uRes.x / uRes.y;
float t = uTime * (0.5 + uMid * 0.4);
float v = 0.0;
v += sin(p.x * 6.0 + t * 2.0);
v += sin(p.y * 8.0 - t * 1.5);
v += sin((p.x + p.y) * 5.0 + t * 1.7);
v += sin(length(p) * 8.0 - t * 2.5);
v *= 0.25;
// Palette indexée 8 couleurs C64-style
int idx = int(floor((v + 1.0) * 4.0));
vec3 pal[8];
pal[0] = vec3(0.0, 0.0, 0.0);
pal[1] = vec3(0.55, 0.20, 0.20);
pal[2] = vec3(0.85, 0.60, 0.35);
pal[3] = vec3(0.95, 0.95, 0.65);
pal[4] = vec3(0.45, 0.85, 0.45);
pal[5] = vec3(0.30, 0.65, 0.95);
pal[6] = vec3(0.65, 0.35, 0.85);
pal[7] = vec3(0.95, 0.40, 0.65);
int i = clamp(idx, 0, 7);
vec3 col = pal[i];
col *= 1.0 + uKick * 0.4;
fragColor = vec4(col, 1.0);
}
@@ -0,0 +1,4 @@
#version 150
uniform mat4 modelViewProjectionMatrix;
in vec4 position;
void main() { gl_Position = modelViewProjectionMatrix * position; }
+135 -42
View File
@@ -114,6 +114,15 @@ void ofApp::setup() {
modelIco_ = mp("icosahedron.ply");
modelDod_ = mp("dodecahedron.ply");
modelTorus_ = mp("torus.ply");
modelSupershape_ = mp("supershape.ply");
modelLorenz_ = mp("lorenz.ply");
modelHopf_ = mp("hopf.ply");
modelEnneper_ = mp("enneper.ply");
modelHopfLink_ = mp("hopf_link.ply");
boing_ = std::make_unique<oscope::ShaderVis>("shaders/boing");
mode7_ = std::make_unique<oscope::ShaderVis>("shaders/mode7");
plasmaC64_ = std::make_unique<oscope::ShaderVis>("shaders/plasma_c64");
dotTunnel_ = std::make_unique<oscope::ShaderVis>("shaders/dot_tunnel");
lissajous_->setup(W, H);
spectro_->setup(W, H / 4);
reactive_->setup(W, H);
@@ -154,6 +163,15 @@ void ofApp::setup() {
modelIco_->setup(W, H);
modelDod_->setup(W, H);
modelTorus_->setup(W, H);
modelSupershape_->setup(W, H);
modelLorenz_->setup(W, H);
modelHopf_->setup(W, H);
modelEnneper_->setup(W, H);
modelHopfLink_->setup(W, H);
boing_->setup(W, H);
mode7_->setup(W, H);
plasmaC64_->setup(W, H);
dotTunnel_->setup(W, H);
postfx_.setup(W, H);
@@ -353,6 +371,15 @@ void ofApp::update() {
modelIco_->update(frame);
modelDod_->update(frame);
modelTorus_->update(frame);
modelSupershape_->update(frame);
modelLorenz_->update(frame);
modelHopf_->update(frame);
modelEnneper_->update(frame);
modelHopfLink_->update(frame);
boing_->update(frame);
mode7_->update(frame);
plasmaC64_->update(frame);
dotTunnel_->update(frame);
applyOscFx();
@@ -504,34 +531,46 @@ void ofApp::initDemos() {
// ─── 1 · AMIGA TRIBUTE ───────────────────────────────────
demos_[0] = {"AMIGA TRIBUTE", {
{"INSERT DISK", 18.0f, stars(), SS::Neon,
{"INSERT DISK", 15.0f, stars(), SS::Neon,
" *** AMIGA 500 RELOADED *** KICKSTART 1.3 "
" INSERT WORKBENCH DISK ", "M", BgKind::Starfield},
{"SCROLLZ", 35.0f, all(), SS::Classic,
{"BOING BALL", 30.0f, all(), SS::Bouncy,
" *** BOING BALL *** JULY 1984 RJ MICAL DALE LUCK "
" THE FIRST AMIGA DEMO 8 MERIDIANS RED AND WHITE "
" GREETINGS TO COMMODORE-AMIGA INC ", "M",
BgKind::BoingBall},
{"SCROLLZ", 30.0f, all(), SS::Classic,
" GREETINGS FROM 1989 COPPER BARS AND BOBS FOREVER "
" AMIGA NEVER DIES HELLO TO ALL DEMOSCENE VETERANS ", "M",
BgKind::Twister},
{"COPPER STORM", 30.0f, all(), SS::Rainbow,
" COPPER LIST IS POETRY EVERY SCANLINE A NEW COLOR ", "G",
{"COPPER STORM", 25.0f, all(), SS::Rainbow,
" COPPER LIST IS POETRY EVERY SCANLINE A NEW COLOR "
" GREETINGS TO SPACEBALLS AND ANARCHY ", "G",
BgKind::Twister},
{"VECTOR DEMO", 25.0f, all(), SS::Chrome,
" VECTOR GRAPHICS BEFORE TEXTURES THERE WAS GEOMETRY ",
"G", BgKind::VectorCubes},
}};
// ─── 2 · C64 LOWLIFE ─────────────────────────────────────
demos_[1] = {"C64 LOWLIFE", {
{"BOOT", 15.0f, stars(), SS::Glitch,
{"BOOT", 15.0f, stars(), SS::Glitch,
" **** COMMODORE 64 BASIC V2 **** "
" 64K RAM SYSTEM 38911 BASIC BYTES FREE "
" READY. LOAD \"DEMO\",8,1 SEARCHING FOR DEMO ", "M",
BgKind::Starfield},
{"PIXEL", 35.0f, all(), SS::Wavy3D,
" 8 BIT FOREVER SID CHIP 6581 SCREAMING "
" THE FUTURE WAS LOFI ALL ALONG "
{"PLASMA", 25.0f, all(), SS::Wavy3D,
" *** PLASMA EFFECT *** SID CHIP 6581 SCREAMING "
" 8 COULEURS INDEXEES PALETTE FIXE "
" GREETINGS TO BOOZE DESIGN AND HOKUTO FORCE ", "M",
BgKind::Rotozoom},
{"FREEZE", 25.0f, all(), SS::Mirror,
BgKind::PlasmaC64},
{"DOT TUNNEL",25.0f, all(), SS::Bouncy,
" DOT TUNNEL CLASSIC PRECOMPUTED TABLES IN ZP "
" 1MHZ NEVER FELT SO FAST ", "M", BgKind::DotTunnel},
{"FREEZE", 20.0f, all(), SS::Mirror,
" HARDWARE SCROLLER LOCKED IN VIC-II "
" GROOVE THAT DEFIED 1MHZ ", "M", BgKind::Rotozoom},
{"CLIMAX", 30.0f, all(), SS::Glitch,
{"CLIMAX", 25.0f, all(), SS::Glitch,
" BREADBIN STILL ALIVE NTSC COLORS DRIFTING "
" LOAD\"$\",8 LIST NEVER STOP ", "V", BgKind::Voronoi},
}};
@@ -541,20 +580,23 @@ void ofApp::initDemos() {
{"DROP IN", 20.0f, stars(), SS::Neon,
" THE ACID IS KICKING IN 303 STARTING TO CRY "
" BREATHE SLOW LET IT TAKE YOU ", "A", BgKind::PlasmaFbm},
{"303 LOOP", 45.0f, all(), SS::Wavy3D,
{"303 LOOP", 35.0f, all(), SS::Wavy3D,
" SQUELCH OF THE 303 FOREVER ASCENDING "
" THE PATTERN NEVER REPEATS HUE CYCLES IN OUR EYES "
" EVERY KNOB TURN A NEW UNIVERSE ", "A", BgKind::Truchet},
{"PEAK", 40.0f, all(), SS::Rainbow,
{"SUPERSHAPE", 25.0f, polSpe(), SS::Wavy3D,
" GEOMETRIC PSYCHEDELIA GIELIS SUPER FORMULA "
" LIVING SHAPE BREATHING ", "A", BgKind::Supershape},
{"PEAK", 30.0f, all(), SS::Rainbow,
" FULL ACID NEURONS DANCING REALITY MELTING "
" THE FILTER OPENS THE FILTER CLOSES "
" AND THE HEAVENS SQUELCH BACK ", "H", BgKind::Metaballs},
{"FRACTAL", 30.0f, all(), SS::Rainbow,
" THE BEAT FRACTALS SELF SIMILAR INFINITE "
" GREETINGS TO MERCURY AND TBL ", "H", BgKind::Truchet},
{"VORTEX", 25.0f, all(), SS::Rainbow,
" DOWN THE SPIRAL YOUR EGO DISSOLVES "
" GREETINGS TO MERCURY AND TBL ", "H", BgKind::Vortex},
{"COMEDOWN", 25.0f, starsWave(), SS::Mirror,
" AND SOFTLY BACK TO EARTH "
" THE 303 SLEEPS IN ITS CIRCUIT ", "J", BgKind::Starfield},
" THE 303 SLEEPS IN ITS CIRCUIT ", "J", BgKind::Caustics},
}};
// ─── 4 · TUNNEL VISION ───────────────────────────────────
@@ -579,18 +621,24 @@ void ofApp::initDemos() {
// ─── 5 · FREQUENCIES ─────────────────────────────────────
demos_[4] = {"FREQUENCIES", {
{"SILENCE", 12.0f, polSpe(), SS::Neon,
{"SILENCE", 12.0f, polSpe(), SS::Neon,
" LISTEN THE SPECTRUM IS LOADING "
" FFT 1024 BINS WAITING ", "I", BgKind::PlasmaFbm},
{"BANDS", 45.0f, polSpe(), SS::Wavy3D,
{"BANDS", 30.0f, polSpe(), SS::Wavy3D,
" 20HZ TO 200HZ : BASS "
" 200 TO 800 : LOW MID 800 TO 3200 : MID "
" 3200+ : TREBLE EVERY HZ HAS A COLOR "
" NYQUIST IS WATCHING ", "I", BgKind::PlasmaFbm},
{"HARMONICS", 35.0f, polSpe(), SS::Mirror,
{"HARMONICS", 30.0f, polSpe(), SS::Mirror,
" EVERY NOTE A SERIES FUNDAMENTAL PLUS OVERTONES "
" THE HARMONIC LADDER NEVER ENDS ", "I", BgKind::Truchet},
{"FULL", 35.0f, all(), SS::Rainbow,
{"LORENZ", 25.0f, polSpe(), SS::Cascade,
" THE STRANGE ATTRACTOR CHAOS IN ORDER "
" EVERY SIGNAL TENDS HERE ", "Q", BgKind::Lorenz},
{"HOPF", 25.0f, polSpe(), SS::Wavy3D,
" HOPF FIBRATION SPHERES INSIDE SPHERES "
" HARMONIC DECOMPOSITION VISUAL ", "Q", BgKind::Hopf},
{"FULL", 25.0f, all(), SS::Rainbow,
" EVERY BAND ALIVE NOW THE SPECTRUM IS COMPLETE "
" FROM SUBSONIC TO ULTRASONIC ", "Q", BgKind::Voronoi},
}};
@@ -599,44 +647,63 @@ void ofApp::initDemos() {
demos_[5] = {"GLITCH WORLD", {
{"PROBE", 15.0f, stars(), SS::Neon,
" SCANNING ANOMALY REALITY UNSTABLE ", "V", BgKind::Voronoi},
{"CORRUPT", 40.0f, all(), SS::Glitch,
{"HOPF LINK", 25.0f, polSpe(), SS::Glitch,
" TWO RINGS LINKED IMPOSSIBLY "
" TOPOLOGY CORRUPT ", "V", BgKind::HopfLink},
{"CORRUPT", 30.0f, all(), SS::Glitch,
" BUFFER OVERFLOW SIGNAL CORRUPTED "
" THE GHOSTS IN THE WIRES ARE WAKING UP ", "V", BgKind::Voronoi},
{"CRASH", 30.0f, all(), SS::Glitch,
" KERNEL PANIC BUT THE BEAT GOES ON ", "Q", BgKind::Voronoi},
{"GLITCH FX", 25.0f, all(), SS::Glitch,
" EVERY PIXEL CONTAINS AN ERROR "
" ERROR IS THE NEW NORMAL ", "V", BgKind::TunnelCubes},
{"CRASH", 20.0f, all(), SS::Glitch,
" KERNEL PANIC BUT THE BEAT GOES ON "
" GREETINGS TO HACKERS EVERYWHERE ", "Q", BgKind::Voronoi},
}};
// ─── 7 · AMBIENT VOID ────────────────────────────────────
demos_[6] = {"AMBIENT VOID", {
{"DRIFT", 40.0f, stars(), SS::Neon,
{"DRIFT", 30.0f, stars(), SS::Neon,
" NO BEAT JUST THE DRIFT SLOW STARS PASSING "
" SOMEWHERE BEYOND THE OORT CLOUD ", "J", BgKind::Starfield},
{"DEEPNESS", 45.0f, polSpe(), SS::Mirror,
{"OCTAHEDRON", 25.0f, polSpe(), SS::Chrome,
" A CHROME OCTAHEDRON IN THE VOID "
" REFLECTING NO ONE ", "J", BgKind::Octahedron},
{"CAUSTICS", 30.0f, polSpe(), SS::Mirror,
" LIGHT THROUGH WATER "
" THE SURFACE OF DEEP TIME ", "S", BgKind::Caustics},
{"DEEPNESS", 30.0f, polSpe(), SS::Mirror,
" THE SPECTRUM BREATHES SLOW AND BLUE "
" 20HZ DRONES UNDER THE SKIN ", "S", BgKind::PlasmaFbm},
{"DREAM", 35.0f, polSpe(), SS::Mirror,
" THE FREQUENCIES BECOME LANDSCAPE "
" A FOG OF HARMONICS GREETINGS TO ASD ", "S",
BgKind::PlasmaFbm},
{"RETURN", 30.0f, starsWave(), SS::Mirror,
{"ENNEPER", 25.0f, polSpe(), SS::Mirror,
" A MINIMAL SURFACE LEAST AREA POSSIBLE "
" GREETINGS TO ASD AND CONSPIRACY ", "S", BgKind::Enneper},
{"RETURN", 25.0f, starsWave(), SS::Mirror,
" AND BACK TO THE STARS REMEMBER THIS QUIET "
" YOU WERE HERE YOU LISTENED ", "J", BgKind::Starfield},
}};
// ─── 8 · RAVE ────────────────────────────────────────────
demos_[7] = {"RAVE", {
{"BUILD", 20.0f, all(), SS::Wavy3D,
{"BUILD", 20.0f, all(), SS::Wavy3D,
" 180 BPM HOLD ON "
" THE WAREHOUSE IS WAITING "
" SECURITY GUARD ALREADY GIVE UP ", "T", BgKind::Twister},
{"DROP", 25.0f, all(), SS::Glitch,
{"DROP", 20.0f, all(), SS::Glitch,
" HERE WE GO KICK PUNCH MAXIMUM "
" GABBA GABBA HEY ", "T", BgKind::Voronoi},
{"FULL POWER",55.0f, all(), SS::Rainbow,
{"MODE7", 25.0f, all(), SS::Bouncy,
" LASER FLOOR CARS ZOOMING ON THE NEON GRID "
" SUPER SCALER NEVER FORGOTTEN ", "T", BgKind::Mode7},
{"FULL POWER", 35.0f, all(), SS::Rainbow,
" NO SLEEP TIL DAWN KICK BIAS MAXIMUM "
" HARDCORE NEVER DIES GREETINGS TO ALL RAVERS "
" ALSO TO RAZOR 1911 AND FAIRLIGHT ", "T", BgKind::Truchet},
{"AFTER", 30.0f, polSpe(), SS::Mirror,
{"INFERNO", 25.0f, all(), SS::Glitch,
" BURN THIS PLACE DOWN 180 BPM ETERNAL FLAME "
" GREETINGS TO HARDCODE TITAN ANARCHY ", "T",
BgKind::Fire},
{"AFTER", 25.0f, polSpe(), SS::Mirror,
" THE BEAT IS GONE THE WALLS STILL SHAKE "
" YOUR HEART STILL THINKS IT IS RAVING ", "Q",
BgKind::PlasmaFbm},
@@ -667,23 +734,40 @@ void ofApp::initDemos() {
" UNTIL THE NEXT REWIND ", "U", BgKind::PlasmaFbm},
}};
// ─── 10 · GREETINGS FROM SAILLANS ────────────────────────
// ─── 10 · GREETINGS FROM SAILLANS (megamix demoscene) ────
demos_[9] = {"GREETINGS", {
{"OPENING", 20.0f, stars(), SS::Neon,
{"OPENING", 15.0f, stars(), SS::Neon,
" *** GREETINGS FROM SAILLANS 2026 *** "
" *** AV-LIVE / L-ELECTRON RARE *** ", "J",
BgKind::Starfield},
{"ROLL CALL", 60.0f, all(), SS::Rainbow,
{"BOING BALL", 18.0f, all(), SS::Bouncy,
" AMIGA SECTION 1984 BOING BALL "
" THE FIRST DEMO EVER ", "M", BgKind::BoingBall},
{"PLASMA", 18.0f, all(), SS::Wavy3D,
" C64 SECTION PLASMA EFFECT 8 COLORS ", "M",
BgKind::PlasmaC64},
{"DOT TUNNEL", 18.0f, all(), SS::Cascade,
" DOT TUNNEL CLASSIC 1MHZ POWER ", "M",
BgKind::DotTunnel},
{"TWISTER", 18.0f, all(), SS::Classic,
" TWISTER BARS SPACEBALLS STYLE ", "G", BgKind::Twister},
{"COPPER", 15.0f, all(), SS::Rainbow,
" COPPER LIST POETRY ", "G", BgKind::Twister},
{"FRACTAL", 18.0f, all(), SS::Wavy3D,
" FRACTAL ITERATIONS ", "L", BgKind::Kifs},
{"MOBIUS", 18.0f, all(), SS::Mirror,
" IMPOSSIBLE TOPOLOGY ", "L", BgKind::Mobius},
{"ROLL CALL", 35.0f, all(), SS::Rainbow,
" GREETINGS TO :: KXKM CREW :: HYPNEUM LAB :: SUPERCOLLIDER ::"
" OPENFRAMEWORKS HACKERS :: COOKIE COLLECTIVE :: ALL LIVE CODERS "
" FAIRLIGHT :: RAZOR 1911 :: ANDROMEDA :: ASD :: CONSPIRACY ::"
" FARBRAUSCH :: MERCURY :: TPOLM :: TBL :: LOONIES ::"
" THIS SCROLLER IS FOR YOU ", "L", BgKind::Twister},
{"DEMOSCENE", 45.0f, all(), SS::Wavy3D,
" THIS SCROLLER IS FOR YOU ", "L", BgKind::Truchet},
{"DEMOSCENE", 25.0f, all(), SS::Wavy3D,
" THE SCENE IS NOT DEAD THE SCENE IS EVERYWHERE "
" EVERY LIVE CODER A NEW MEMBER "
" 1985 - 2026 - INFINITY ", "L", BgKind::Truchet},
{"FINALE", 35.0f, all(), SS::Mirror,
" 1985 - 2026 - INFINITY ", "L", BgKind::TunnelCubes},
{"FINALE", 25.0f, all(), SS::Mirror,
" SEE YOU NEXT TIME KEEP THE PHOSPHOR ALIVE "
" AV-LIVE / L-ELECTRON RARE "
" *** WRAP *** PRESS 1-9 0 TO RESTART *** ", "U",
@@ -1054,6 +1138,15 @@ void ofApp::drawScope4(int W, int H) {
case BgKind::IcoMesh: modelIco_->draw(0, 0, W, H); break;
case BgKind::DodMesh: modelDod_->draw(0, 0, W, H); break;
case BgKind::TorusMesh: modelTorus_->draw(0, 0, W, H); break;
case BgKind::Supershape: modelSupershape_->draw(0, 0, W, H); break;
case BgKind::Lorenz: modelLorenz_->draw(0, 0, W, H); break;
case BgKind::Hopf: modelHopf_->draw(0, 0, W, H); break;
case BgKind::Enneper: modelEnneper_->draw(0, 0, W, H); break;
case BgKind::HopfLink: modelHopfLink_->draw(0, 0, W, H); break;
case BgKind::BoingBall: boing_->draw(0, 0, W, H); break;
case BgKind::Mode7: mode7_->draw(0, 0, W, H); break;
case BgKind::PlasmaC64: plasmaC64_->draw(0, 0, W, H); break;
case BgKind::DotTunnel: dotTunnel_->draw(0, 0, W, H); break;
}
// 1bis) HUD pseudo-aléatoire de valeurs sub-10 Hz.
+12 -1
View File
@@ -98,7 +98,9 @@ private:
Caustics, Vortex, Octahedron, VectorCubes,
Mobius, Klein, TrefoilTube, TwistedTorus, Lucy,
Helix, Catenoid, Hyperboloid, Boys, Lemniscate,
Penrose, Sphere3D, IcoMesh, DodMesh, TorusMesh };
Penrose, Sphere3D, IcoMesh, DodMesh, TorusMesh,
Supershape, Lorenz, Hopf, Enneper, HopfLink,
BoingBall, Mode7, PlasmaC64, DotTunnel };
struct DemoScene {
const char* name;
float durSec;
@@ -186,6 +188,15 @@ private:
std::unique_ptr<oscope::ModelVis> modelIco_;
std::unique_ptr<oscope::ModelVis> modelDod_;
std::unique_ptr<oscope::ModelVis> modelTorus_;
std::unique_ptr<oscope::ModelVis> modelSupershape_;
std::unique_ptr<oscope::ModelVis> modelLorenz_;
std::unique_ptr<oscope::ModelVis> modelHopf_;
std::unique_ptr<oscope::ModelVis> modelEnneper_;
std::unique_ptr<oscope::ModelVis> modelHopfLink_;
std::unique_ptr<oscope::ShaderVis> boing_;
std::unique_ptr<oscope::ShaderVis> mode7_;
std::unique_ptr<oscope::ShaderVis> plasmaC64_;
std::unique_ptr<oscope::ShaderVis> dotTunnel_;
std::vector<float> ch1_, ch2_;
Mode mode_ = Mode::Scope4;