Codrops 원본
Garden Anomaly: A Tiny WebGPU and TSL Experiment
배경 · MIT
갤러리 안에서는 화면을 벗어나거나 움직임을 멈추면 예제도 닫힙니다. 다시 재생할 때는 처음부터 시작해요.
SOURCE FILES
원본 코드 읽기
수집한 원본 소스와 실행 안내를 함께 제공합니다.
garden-anomaly/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Garden Anomaly.</title>
<link rel="stylesheet" href="styles/style.css"/>
</head>
<body>
<div id="pane-container"></div>
<div id="vignette"></div>
<div id="title-block">
<span id="title-eyebrow">Tinker Day #41</span>
<span id="title-headline">Garden anomaly.</span>
<p style="font-size: 14px;">
Move mouse over the bubbles in the<br>glass to interact. Mousedown & move<br>
to rotate the scene.<br><br>You might enable sound for<br>the full experience.<br />
</p>
</div>
<footer><a id="nav-prev-all" href="https://dasprinzip.com/tinker/index.html">↑ Checkout all days</a><a id="nav-prev" href="https://dasprinzip.com/tinker/day40/"><br>← The Day Before.</a></footer>
<div id="loader"><div class="spinner"></div><div class="loading-text">loading<span class="dot">.</span><span class="dot">.</span><span class="dot">.</span></div></div>
<script type="importmap">
{
"imports": {
"three": "https://cdn.jsdelivr.net/npm/three@0.184.0/build/three.webgpu.js",
"three/webgpu": "https://cdn.jsdelivr.net/npm/three@0.184.0/build/three.webgpu.js",
"three/tsl": "https://cdn.jsdelivr.net/npm/three@0.184.0/build/three.tsl.js",
"three/addons/": "https://cdn.jsdelivr.net/npm/three@0.184.0/examples/jsm/",
"tweakpane": "https://cdn.jsdelivr.net/npm/tweakpane@4.0.5/dist/tweakpane.min.js"
}
}
</script>
<script type="module">
import * as THREE from 'three';
import { uv, vec3, vec4, smoothstep, pow, uniform, pass, color, uniformArray, positionGeometry, normalize, max, float, exp, transformNormalToView, texture, vec2, cross } from 'three/tsl';
import { bloom } from 'three/addons/tsl/display/BloomNode.js';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js';
import { Pane } from 'tweakpane';
// ═══════════════════════════════════════════════════════════════════
// housekeeping git mostly image free ...that´s why base64
// ═══════════════════════════════════════════════════════════════════
const ROUGH_B64 = 'data:image/jpeg;base64,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';
const NORMAL_B64 = 'data:image/webp;base64,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';
// ═══════════════════════════════════════════════════════════════════
// tweakable param(s)
// ═══════════════════════════════════════════════════════════════════
const prm = {
// physics
simSpeed: 0.37,
gravity: 1.65, // downward pull
throwPow: 1.04, // hover-fling impulse strength
friction: 3.91, // contact damping (settles the pile, slides on glass)
damp: 0.9, // air drag (1/s)
// shell
ior: 1.30,
thickness: 1.42,
roughness: 0.36,
nrmScale: 1.0, // ice normal-map strength
irid: 0.90,
iridIor: 1.55,
envInt: 2.12,
bgInt: 1.0, // background (incl. through-glass) intensity
bulgeAmt: 0.15, // impact → bulge amplitude scale
bulgeSharp: 43.30, // bump localization (higher = tighter)
bulgeRel: 2.77, // bulge relax-back rate (1/s)
attColor: '#0033ff', // attenuation (glass depth) tint
attDist: 8.40, // attenuation distance
dentAO: 3.20, // AO-style darkening inside the dent
dentNrm: 1.96, // analytic normal perturbation strength
scanInt: 0.45, // scanline emissive intensity
scanSpeed: 0.18, // scanline wander speed (uv/s)
rotY: 0.12, // constant glass spin around Y (rad/s)
rotX: 0.05, // slower tumble around X (rad/s)
// blobs
blobRough: 0.34,
blobCoat: 0.35,
colorDeep: '#1f7cff',
colorLight: '#082b4f',
blowPow: 5.22, // invisible up-blast strength
blowDelay: 0.2, // seconds of rest before the blast (200ms)
// sound
sndOn: true,
sndVol: 0.12,
// glow / post
bgTop: '#faf5ea', // background gradient top
bgBot: '#d6c9b4', // background gradient bottom
shadowColor: '#4d6096',
shadowScale: 0.0,
glowColor: '#93b4f2',
glowAlpha: 0.62,
shadowAlpha: 1.00,
bloomStrength: 0.02,
bloomRadius: 0.00,
bloomThreshold: 0.76,
exposure: 0.80,
};
const SHELL_R = 1.3;
const N_BLOBS = 64;
// ═══════════════════════════════════════════════════════════════════
// setup renderer
// ═══════════════════════════════════════════════════════════════════
if (!navigator.gpu) document.getElementById('ver').textContent = 'WebGPU not available in this browser';
const renderer = new THREE.WebGPURenderer({ antialias: true });
renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
renderer.setSize(innerWidth, innerHeight);
renderer.toneMapping = THREE.ACESFilmicToneMapping;
renderer.toneMappingExposure = prm.exposure;
document.body.appendChild(renderer.domElement);
await renderer.init();
const scene = new THREE.Scene();
// vertical gradient backdrop, rebuildable from the pane
const bgCanvas = document.createElement('canvas');
bgCanvas.width = 4; bgCanvas.height = 512;
const bgTex = new THREE.CanvasTexture(bgCanvas);
bgTex.colorSpace = THREE.SRGBColorSpace;
function rebuildBg() {
const g = bgCanvas.getContext('2d');
const grad = g.createLinearGradient(0, 0, 0, 512);
grad.addColorStop(0, prm.bgTop);
grad.addColorStop(1, prm.bgBot);
g.fillStyle = grad; g.fillRect(0, 0, 4, 512);
bgTex.needsUpdate = true;
document.body.style.background = `linear-gradient(${prm.bgTop}, ${prm.bgBot})`;
}
rebuildBg();
scene.background = bgTex;
// ═══════════════════════════════════════════════════════════════════
// external envmap
// ═══════════════════════════════════════════════════════════════════
const ENV_URL = './equiRectGarden.jpg'; // set to '' to always keep the gradient
function useEnvmap(t) {
t.mapping = THREE.EquirectangularReflectionMapping;
scene.background = t;
scene.environment = t;
}
if (ENV_URL) {
try {
if (/\.hdr$/i.test(ENV_URL)) {
const { HDRLoader } = await import('three/addons/loaders/HDRLoader.js');
new HDRLoader().load(ENV_URL, useEnvmap, undefined, () => {});
} else {
new THREE.TextureLoader().load(ENV_URL, t => { t.colorSpace = THREE.SRGBColorSpace; useEnvmap(t); }, undefined, () => {});
}
} catch (e) { /* keep gradient */ }
}
const camera = new THREE.PerspectiveCamera(38, innerWidth / innerHeight, 0.1, 60);
camera.position.set(0, 0.08, 7.6);
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.06;
controls.target.set(0, 0, 0);
// ═══════════════════════════════════════════════════════════════════
// environment
// ═══════════════════════════════════════════════════════════════════
const pmrem = new THREE.PMREMGenerator(renderer);
const roomEnv = pmrem.fromScene(new RoomEnvironment(), 0.04).texture;
scene.environment = roomEnv;
scene.environmentIntensity = prm.envInt;
const key = new THREE.DirectionalLight(0xffffff, 1.2);
key.position.set(2.5, 4, 3);
scene.add(key);
scene.add(new THREE.AmbientLight(0xffffff, 0.55));
// ═══════════════════════════════════════════════════════════════════
// halo + shadow (billboards)
// ═══════════════════════════════════════════════════════════════════
const uGlowCol = uniform(new THREE.Color(prm.glowColor));
const uGlowA = uniform(prm.glowAlpha);
const uShadA = uniform(prm.shadowAlpha);
const gd = uv().sub(0.5).length().mul(2); // 0 center → 1 edge
const radialA = smoothstep(1.0, 0.15, gd).mul(pow(smoothstep(1.0, 0.0, gd), 1.5));
const glowMat = new THREE.MeshBasicNodeMaterial();
glowMat.transparent = true;
glowMat.depthWrite = false;
glowMat.colorNode = vec4(vec3(uGlowCol), radialA.mul(uGlowA));
const glow = new THREE.Mesh(new THREE.PlaneGeometry(4.6, 4.6), glowMat);
glow.position.set(0, -0.35, -1.2);
glow.renderOrder = -2;
scene.add(glow);
const shadMat = new THREE.MeshBasicNodeMaterial();
shadMat.transparent = true;
shadMat.depthWrite = false;
shadMat.depthTest = false;
const uShadCol = uniform(new THREE.Color(prm.shadowColor));
shadMat.colorNode = vec4(vec3(uShadCol), radialA.mul(uShadA));
const shadow = new THREE.Mesh(new THREE.PlaneGeometry(3.7, 1.5), shadMat);
shadow.position.set(0, -1.42, 0);
shadow.renderOrder = 20;
shadow.scale.set(Math.max(prm.shadowScale, 1e-4), Math.max(prm.shadowScale, 1e-4), 1);
scene.add(shadow);
// ═══════════════════════════════════════════════════════════════════
// glass shell
// ═══════════════════════════════════════════════════════════════════
const N_BULGE = 8;
const bulgeVecs = Array.from({ length: N_BULGE }, () => new THREE.Vector4(0, 1, 0, 0)); // xyz dir, w amp
const uBulges = uniformArray(bulgeVecs);
const uBulgeSharp = uniform(prm.bulgeSharp);
const shellMat = new THREE.MeshPhysicalNodeMaterial({
transmission: 1.0,
thickness: prm.thickness,
ior: prm.ior,
roughness: prm.roughness,
metalness: 0,
iridescence: prm.irid,
iridescenceIOR: prm.iridIor,
iridescenceThicknessRange: [140, 380],
clearcoat: 1.0,
clearcoatRoughness: 0.10,
specularIntensity: 1.0,
envMapIntensity: prm.envInt,
attenuationColor: new THREE.Color(prm.attColor),
attenuationDistance: prm.attDist,
});
{
const uDentAO = uniform(prm.dentAO);
const uDentNrm = uniform(prm.dentNrm);
window.__dentU = { uDentAO, uDentNrm }; // pane hookup below
// bump field B(n̂) = Σ A·max(n̂·d,0)^s and its tangential gradient
// ∇(u^s) = s·u^(s-1)·(d − n̂·u)/R — evaluated per-stage from positionGeometry
const buildBump = () => {
const nrm = normalize(positionGeometry);
let bump = float(0);
let grad = vec3(0, 0, 0);
for (let k = 0; k < N_BULGE; k++) {
const b = uBulges.element(k);
const u = max(nrm.dot(b.xyz), 0.0);
bump = bump.add(b.w.mul(pow(u, uBulgeSharp)));
grad = grad.add(
b.xyz.sub(nrm.mul(u))
.mul(b.w.mul(uBulgeSharp).mul(pow(u, uBulgeSharp.sub(1))))
);
}
return { nrm, bump, grad: grad.div(SHELL_R) };
};
// vertex: displace outward
const v = buildBump();
shellMat.positionNode = positionGeometry.add(v.nrm.mul(v.bump));
// fragment: per-pixel perturbed normal — highlights and refraction bend
// across the dent — plus AO-style darkening scaled by bump height
const f = buildBump();
// ice normal map in a sphere tangent frame, combined with the dent gradient
const normalTex = new THREE.TextureLoader().load(NORMAL_B64);
normalTex.wrapS = normalTex.wrapT = THREE.RepeatWrapping;
const uNrmScale = uniform(prm.nrmScale);
window.__nrmU = { uNrmScale };
const tN = texture(normalTex, uv().mul(2)).xyz.mul(2).sub(1); // tiled 2x
const T = normalize(cross(vec3(0, 1, 0), f.nrm).add(vec3(1e-4, 0, 0)));
const B = cross(f.nrm, T);
shellMat.normalNode = transformNormalToView(normalize(
f.nrm.mul(tN.z)
.add(T.mul(tN.x.mul(uNrmScale)))
.add(B.mul(tN.y.mul(uNrmScale)))
.sub(f.grad.mul(uDentNrm))
));
const ao = exp(f.bump.mul(uDentAO).negate());
shellMat.colorNode = vec3(ao);
shellMat.aoNode = ao;
// wandering white scanlines — canvas-generated strip in the emissive channel
const c = document.createElement('canvas');
c.width = 4; c.height = 1024;
const g = c.getContext('2d');
g.fillStyle = '#000'; g.fillRect(0, 0, 4, 1024);
const drawLine = (y, h, a) => {
g.fillStyle = `rgba(255,255,255,${a})`;
g.fillRect(0, y, 4, h); // hard-edged; texture filtering supplies the AA
};
for (let i = 0; i < 22; i++) {
const y = Math.random() * 1024;
const h = 1 + Math.random() * 3; // thin: 1–4px of 1024
const a = 0.35 + Math.random() * 0.65;
drawLine(y, h, a);
drawLine(y - 1024, h, a); // seamless wrap
drawLine(y + 1024, h, a);
}
const scanTex = new THREE.CanvasTexture(c);
scanTex.wrapS = scanTex.wrapT = THREE.RepeatWrapping;
scanTex.colorSpace = THREE.SRGBColorSpace;
const uScan = uniform(0);
const uScanInt = uniform(prm.scanInt);
window.__scanU = { uScan, uScanInt };
shellMat.emissiveNode = vec3(texture(scanTex, uv().add(vec2(0, uScan))).r).mul(uScanInt);
// chunky-ice roughness map (embedded), modulated by the roughness slider
const roughTex = new THREE.TextureLoader().load(ROUGH_B64);
roughTex.wrapS = roughTex.wrapT = THREE.RepeatWrapping;
const uRoughMul = uniform(prm.roughness);
window.__roughU = { uRoughMul };
shellMat.roughnessNode = texture(roughTex, uv()).r.mul(uRoughMul).mul(2);
}
const shell = new THREE.Mesh(new THREE.SphereGeometry(SHELL_R, 96, 96), shellMat);
scene.add(shell);
// ═══════════════════════════════════════════════════════════════════
// blob(s)
// !!! must be opaque — the transmission pass only
// captures opaque geometry !!!
// ═══════════════════════════════════════════════════════════════════
const blobMat = new THREE.MeshPhysicalMaterial({
roughness: prm.blobRough,
metalness: 0,
clearcoat: prm.blobCoat,
clearcoatRoughness: 0.25,
envMapIntensity: 0.55,
});
blobMat.transparent = false;
const blobGeo = new THREE.SphereGeometry(1, 32, 32);
const blobs = new THREE.InstancedMesh(blobGeo, blobMat, N_BLOBS);
blobs.instanceMatrix.setUsage(THREE.DynamicDrawUsage);
scene.add(blobs);
// ═══════════════════════════════════════════════════════════════════
// sim state
// ═══════════════════════════════════════════════════════════════════
const P = new Float32Array(N_BLOBS * 3); // position
const Pp = new Float32Array(N_BLOBS * 3); // previous position (PBD)
const V = new Float32Array(N_BLOBS * 3); // velocity
const R = new Float32Array(N_BLOBS); // radius
const touch = new Uint8Array(N_BLOBS); // in-contact flag (this frame)
const wallPrev = new Uint8Array(N_BLOBS); // was touching the glass last frame
const rushCd = new Float32Array(N_BLOBS); // collision-rescatter cooldown
const rushPow = new Float32Array(N_BLOBS); // pending rescatter impact power
// ═══════════════════════════════════════════════════════════════════
// bulge slots: A = impact amplitude,
// age drives an attack/release envelope
// ═══════════════════════════════════════════════════════════════════
const bulgeA = new Float32Array(N_BULGE);
const bulgeAge = new Float32Array(N_BULGE);
const _bq = new THREE.Quaternion();
const _bv = new THREE.Vector3();
function spawnBulge(nx, ny, nz, amp) {
// the shell rotates: store the dent in its LOCAL frame so it rides the
// glass like real material deformation instead of drifting across it
_bv.set(nx, ny, nz).applyQuaternion(_bq.copy(shell.quaternion).invert());
nx = _bv.x; ny = _bv.y; nz = _bv.z;
let k = 0, best = Infinity; // reuse the most faded slot
for (let s = 0; s < N_BULGE; s++) {
const cur = bulgeA[s] * Math.exp(-bulgeAge[s] * prm.bulgeRel);
if (cur < best) { best = cur; k = s; }
}
bulgeVecs[k].set(nx, ny, nz, 0);
bulgeA[k] = amp;
bulgeAge[k] = 0;
}
function updateBulges(dt) {
for (let k = 0; k < N_BULGE; k++) {
bulgeAge[k] += dt;
// smooth ease-in (attack 18/s ≈ 0.1s) and exponential relax-back
const amp = bulgeA[k]
* (1 - Math.exp(-bulgeAge[k] * 18))
* Math.exp(-bulgeAge[k] * prm.bulgeRel);
bulgeVecs[k].w = amp;
}
}
const colDeep = new THREE.Color(prm.colorDeep);
const colLight = new THREE.Color(prm.colorLight);
const tint = new Float32Array(N_BLOBS); // per-blob deep light mix
const restT = new Float32Array(N_BLOBS); // time spent at rest
const _c = new THREE.Color();
const _m = new THREE.Matrix4();
function applyColors() {
colDeep.set(prm.colorDeep);
colLight.set(prm.colorLight);
for (let i = 0; i < N_BLOBS; i++) {
_c.copy(colDeep).lerp(colLight, tint[i]);
blobs.setColorAt(i, _c);
}
blobs.instanceColor.needsUpdate = true;
}
function seed() {
for (let i = 0; i < N_BLOBS; i++) {
// mostly tiny, a few large
R[i] = 0.045 + Math.pow(Math.random(), 2.4) * 0.20;
// rain in from the upper half, staggered so they land one after another
const a = Math.random() * Math.PI * 2;
const rr = Math.sqrt(Math.random()) * 0.7;
P[i * 3 + 0] = Math.cos(a) * rr;
P[i * 3 + 1] = 0.2 + Math.random() * 0.95;
P[i * 3 + 2] = Math.sin(a) * rr;
V[i * 3] = V[i * 3 + 1] = V[i * 3 + 2] = 0;
tint[i] = Math.pow(Math.random(), 0.8);
restT[i] = 0;
_m.makeScale(R[i], R[i], R[i]);
_m.setPosition(P[i * 3], P[i * 3 + 1], P[i * 3 + 2]);
blobs.setMatrixAt(i, _m); // all matrices valid before first render
}
blobs.instanceMatrix.needsUpdate = true;
applyColors();
}
seed();
// ═══════════════════════════════════════════════════════════════════
// sim step (PBD, 64 blobs)
// ═══════════════════════════════════════════════════════════════════
function step(dt) {
const inner = SHELL_R - 0.04;
const damp = Math.exp(-prm.damp * dt);
const invDt = 1 / dt;
// predict
for (let i = 0; i < N_BLOBS; i++) {
const ix = i * 3;
Pp[ix] = P[ix]; Pp[ix + 1] = P[ix + 1]; Pp[ix + 2] = P[ix + 2];
V[ix + 1] -= prm.gravity * dt;
V[ix] *= damp; V[ix + 1] *= damp; V[ix + 2] *= damp;
P[ix] += V[ix] * dt;
P[ix + 1] += V[ix + 1] * dt;
P[ix + 2] += V[ix + 2] * dt;
touch[i] = 0;
if (rushCd[i] > 0) rushCd[i] -= dt;
}
// wall-impact detection (before constraints eat the velocity):
// a blob newly reaching the glass with real outward speed dents it outward
for (let i = 0; i < N_BLOBS; i++) {
const ix = i * 3;
const pr = Math.hypot(P[ix], P[ix + 1], P[ix + 2]);
const maxR = SHELL_R - 0.04 - R[i];
const atWall = pr > maxR ? 1 : 0;
if (atWall && !wallPrev[i] && pr > 1e-5) {
const nx = P[ix] / pr, ny = P[ix + 1] / pr, nz = P[ix + 2] / pr;
const vn = V[ix] * nx + V[ix + 1] * ny + V[ix + 2] * nz;
if (vn > 0.45) {
const amp = Math.min(vn, 3.5) * prm.bulgeAmt * (0.4 + R[i] * 2.5);
spawnBulge(nx, ny, nz, amp);
playHit((R[i] - 0.045) / 0.20, vn, P[ix]);
}
}
wallPrev[i] = atWall;
}
// project constraints: blob-blob separation (mass-weighted) + glass wall
for (let it = 0; it < 3; it++) {
for (let i = 0; i < N_BLOBS; i++) {
const ix = i * 3;
for (let j = i + 1; j < N_BLOBS; j++) {
const jx = j * 3;
const dx = P[ix] - P[jx], dy = P[ix + 1] - P[jx + 1], dz = P[ix + 2] - P[jx + 2];
const d = Math.hypot(dx, dy, dz);
const minD = R[i] + R[j];
if (d < minD && d > 1e-5) {
touch[i] = touch[j] = 1;
const mi = R[i] ** 3, mj = R[j] ** 3;
const wi = mj / (mi + mj), wj = mi / (mi + mj);
const ov = (minD - d) / d;
P[ix] += dx * ov * wi; P[ix + 1] += dy * ov * wi; P[ix + 2] += dz * ov * wi;
P[jx] -= dx * ov * wj; P[jx + 1] -= dy * ov * wj; P[jx + 2] -= dz * ov * wj;
if (it === 0) {
// energetic impact? queue a random rescatter for both balls
// (applied AFTER velocity derivation — PBD would overwrite it here)
const vn = ((V[ix] - V[jx]) * dx + (V[ix + 1] - V[jx + 1]) * dy + (V[ix + 2] - V[jx + 2]) * dz) / d;
if (vn < -1.1) {
const pow_ = Math.min(-vn, 4);
if (rushCd[i] <= 0) { rushPow[i] = Math.max(rushPow[i], pow_); rushCd[i] = 0.18; }
if (rushCd[j] <= 0) { rushPow[j] = Math.max(rushPow[j], pow_); rushCd[j] = 0.18; }
}
}
}
}
}
for (let i = 0; i < N_BLOBS; i++) {
const ix = i * 3;
const pr = Math.hypot(P[ix], P[ix + 1], P[ix + 2]);
const maxR = SHELL_R - 0.04 - R[i];
if (pr > maxR) {
touch[i] = 1;
const f = maxR / pr;
P[ix] *= f; P[ix + 1] *= f; P[ix + 2] *= f;
}
}
}
// derive velocity from what actually happened; contact damping settles
// the pile and doubles as glass friction
const cd = Math.exp(-prm.friction * dt);
for (let i = 0; i < N_BLOBS; i++) {
const ix = i * 3;
V[ix] = (P[ix] - Pp[ix]) * invDt;
V[ix + 1] = (P[ix + 1] - Pp[ix + 1]) * invDt;
V[ix + 2] = (P[ix + 2] - Pp[ix + 2]) * invDt;
if (touch[i]) { V[ix] *= cd; V[ix + 1] *= cd; V[ix + 2] *= cd; }
// collision rescatter: force a direction change + repowered random rush
if (rushPow[i] > 0) {
const own = Math.hypot(V[ix], V[ix + 1], V[ix + 2]);
const spd = Math.min(Math.max(own * 0.6 + rushPow[i] * 0.55, 0.6), 4.5);
const ra = Math.random() * Math.PI * 2;
const ry = Math.random() * 1.3 - 0.3; // mostly up, a little down allowed
const rh = Math.sqrt(Math.max(1 - ry * ry, 0.05));
V[ix] = Math.cos(ra) * rh * spd;
V[ix + 1] = ry * spd;
V[ix + 2] = Math.sin(ra) * rh * spd;
rushPow[i] = 0;
}
// invisible force: resting longer than blowDelay gets blown back up
const spd = Math.hypot(V[ix], V[ix + 1], V[ix + 2]);
if (spd < 0.15) restT[i] += dt; else restT[i] = 0;
if (restT[i] > prm.blowDelay) {
restT[i] = 0;
const bp = prm.blowPow * (0.7 + Math.random() * 0.8);
const ba = Math.random() * Math.PI * 2;
const bh = 0.2 + Math.random() * 0.55; // some sideways drift
V[ix] += Math.cos(ba) * bh * bp;
V[ix + 1] += bp * (0.8 + Math.random() * 0.5); // dominant up-blast
V[ix + 2] += Math.sin(ba) * bh * bp;
}
_m.makeScale(R[i], R[i], R[i]);
_m.setPosition(P[ix], P[ix + 1], P[ix + 2]);
blobs.setMatrixAt(i, _m);
}
blobs.instanceMatrix.needsUpdate = true;
}
// ═══════════════════════════════════════════════════════════════════
// sound(s)
// ═══════════════════════════════════════════════════════════════════
const SND = { ctx: null, master: null, last: 0, voices: 0 };
function ensureAudio() {
if (SND.ctx) { if (SND.ctx.state === 'suspended') SND.ctx.resume(); return; }
const C = window.AudioContext || window.webkitAudioContext;
if (!C) return;
SND.ctx = new C();
const ctx = SND.ctx;
const comp = ctx.createDynamicsCompressor();
comp.threshold.value = -18; comp.ratio.value = 6;
comp.connect(ctx.destination);
SND.master = ctx.createGain();
SND.master.gain.value = prm.sndVol;
// flanger bus: dry + LFO-modulated short delay with gentle feedback
const dry = ctx.createGain(); dry.gain.value = 0.75;
const wet = ctx.createGain(); wet.gain.value = 0.55;
const dl = ctx.createDelay(0.03); dl.delayTime.value = 0.0045;
const fb = ctx.createGain(); fb.gain.value = 0.35;
const lfo = ctx.createOscillator(); lfo.frequency.value = 0.45;
const lfoAmt = ctx.createGain(); lfoAmt.gain.value = 0.0018;
lfo.connect(lfoAmt); lfoAmt.connect(dl.delayTime); lfo.start();
SND.master.connect(dry); dry.connect(comp);
SND.master.connect(dl); dl.connect(fb); fb.connect(dl);
dl.connect(wet); wet.connect(comp);
}
const PENTA = [261.63, 293.66, 329.63, 392.00, 440.00, 523.25, 587.33, 659.25, 784.00, 880.00];
function playHit(size01, vel, x) {
if (!prm.sndOn || !SND.ctx || SND.ctx.state !== 'running') return;
const t = SND.ctx.currentTime;
if (t - SND.last < 0.05 || SND.voices > 8) return; // rate limit
SND.last = t; SND.voices++;
const f = PENTA[Math.max(0, Math.min(9, Math.floor((1 - size01) * 9.99)))];
const vol = Math.min(vel / 3, 1) * 0.7;
const p = SND.ctx.createStereoPanner();
p.pan.value = Math.max(-1, Math.min(1, x / 1.3)) * 0.8;
p.connect(SND.master);
// consonant partial stack: fundamental, fifth, octave, twelfth
const partials = [
[1.0, 1.0, 0.60], [1.5, 0.32, 0.45], [2.0, 0.28, 0.40], [3.0, 0.10, 0.25],
];
let ended = 0;
for (const [ratio, amp, dur] of partials) {
const o = SND.ctx.createOscillator();
const g = SND.ctx.createGain();
o.type = 'sine';
if (ratio === 1.0) {
o.frequency.setValueAtTime(f * 1.05, t); // soft droop = boing
o.frequency.exponentialRampToValueAtTime(f, t + 0.10);
} else o.frequency.value = f * ratio;
g.gain.setValueAtTime(0.0001, t);
g.gain.exponentialRampToValueAtTime(Math.max(vol * amp, 0.001), t + 0.012);
g.gain.exponentialRampToValueAtTime(0.0001, t + dur);
o.connect(g); g.connect(p);
o.start(t); o.stop(t + dur + 0.05);
o.onended = () => { if (++ended === partials.length) SND.voices--; };
}
}
// ═══════════════════════════════════════════════════════════════════
// pointer fling
// ═══════════════════════════════════════════════════════════════════
const ray = new THREE.Raycaster();
const ndc = new THREE.Vector2();
const ndcPrev = new THREE.Vector2();
const camRight = new THREE.Vector3();
const camUp = new THREE.Vector3();
const _w = new THREE.Vector3();
let havePrev = false;
let flingDrag = false;
function toNdc(e) {
ndc.set((e.clientX / innerWidth) * 2 - 1, -(e.clientY / innerHeight) * 2 + 1);
}
function rayDist(i, o, dir) {
const ix = i * 3;
const px = P[ix] - o.x, py = P[ix + 1] - o.y, pz = P[ix + 2] - o.z;
const t = px * dir.x + py * dir.y + pz * dir.z;
const cx = px - dir.x * t, cy = py - dir.y * t, cz = pz - dir.z * t;
return Math.hypot(cx, cy, cz);
}
function fling(dxN, dyN) {
const speed = Math.hypot(dxN, dyN);
if (speed < 0.0005) return;
ray.setFromCamera(ndc, camera);
camera.matrixWorld.extractBasis(camRight, camUp, _w);
const o = ray.ray.origin, dir = ray.ray.direction;
for (let i = 0; i < N_BLOBS; i++) {
// generous pad — airborne balls stay easy to hit again mid-flight
if (rayDist(i, o, dir) < R[i] + 0.14) {
const ix = i * 3;
const k = prm.throwPow * Math.min(speed * 30, 3) / Math.max(R[i] / 0.09, 0.6);
// each ball rushes off in its own random direction; the swipe only
// steers lightly. Vertical is always upward — down is the rest state.
const ra = Math.random() * Math.PI * 2;
const rmag = k * (3 + Math.random() * 10);
V[ix] += Math.cos(ra) * rmag + (camRight.x * dxN + camUp.x * dyN) * k * 4;
V[ix + 1] += k * (0.8 + Math.random() * 2.7);
V[ix + 2] += Math.sin(ra) * rmag + (camRight.z * dxN + camUp.z * dyN) * k * 4;
}
}
}
addEventListener('pointerdown', (e) => {
ensureAudio();
toNdc(e);
ndcPrev.copy(ndc);
havePrev = true;
// touching a bubble claims the gesture for flinging instead of orbiting
ray.setFromCamera(ndc, camera);
const o = ray.ray.origin, dir = ray.ray.direction;
for (let i = 0; i < N_BLOBS; i++) {
if (rayDist(i, o, dir) < R[i] + 0.14) { flingDrag = true; break; }
}
controls.enabled = !flingDrag;
});
addEventListener('pointermove', (e) => {
toNdc(e);
if (!havePrev) { ndcPrev.copy(ndc); havePrev = true; return; }
const dxN = ndc.x - ndcPrev.x, dyN = ndc.y - ndcPrev.y;
ndcPrev.copy(ndc);
if (e.buttons === 0 || flingDrag) fling(dxN, dyN);
});
const endGesture = () => { flingDrag = false; controls.enabled = true; };
addEventListener('pointerup', endGesture);
addEventListener('pointercancel', endGesture);
// ═══════════════════════════════════════════════════════════════════
// postpro
// ═══════════════════════════════════════════════════════════════════
const pipeline = new THREE.RenderPipeline(renderer);
const scenePass = pass(scene, camera);
const sceneColor = scenePass.getTextureNode();
const bloomPass = bloom(sceneColor, prm.bloomStrength, prm.bloomRadius, prm.bloomThreshold);
pipeline.outputNode = sceneColor.add(bloomPass);
// ═══════════════════════════════════════════════════════════════════
// setup: tweakpane
// ═══════════════════════════════════════════════════════════════════
const pane = new Pane({ title: 'Controls', expanded: false });
function addColor(folder, key, onChange) {
const b = folder.addBinding(prm, key, { view: 'text' });
const input = b.element.querySelector('input');
input.type = 'color';
input.value = prm[key];
input.addEventListener('input', () => { prm[key] = input.value; onChange(input.value); });
}
const fSim = pane.addFolder({ title: 'motion' });
fSim.addBinding(prm, 'simSpeed', { min: 0, max: 2 });
fSim.addBinding(prm, 'gravity', { min: 0.2, max: 6 });
fSim.addBinding(prm, 'throwPow', { min: 0, max: 8 });
fSim.addBinding(prm, 'friction', { min: 0, max: 8 });
fSim.addBinding(prm, 'damp', { min: 0, max: 3 });
fSim.addBinding(prm, 'blowPow', { min: 0, max: 6 });
fSim.addBinding(prm, 'blowDelay', { min: 0.05, max: 3 });
fSim.addButton({ title: 'rain again' }).on('click', seed);
const fSnd = pane.addFolder({ title: 'sound' });
fSnd.addBinding(prm, 'sndOn');
fSnd.addBinding(prm, 'sndVol', { min: 0, max: 1 }).on('change', e => { if (SND.master) SND.master.gain.value = e.value; });
const fShell = pane.addFolder({ title: 'shell' });
fShell.addBinding(prm, 'ior', { min: 1.0, max: 1.6 }).on('change', e => shellMat.ior = e.value);
fShell.addBinding(prm, 'thickness', { min: 0.02, max: 2 }).on('change', e => shellMat.thickness = e.value);
fShell.addBinding(prm, 'roughness', { min: 0, max: 0.6 }).on('change', e => window.__roughU.uRoughMul.value = e.value);
fShell.addBinding(prm, 'nrmScale', { min: 0, max: 3 }).on('change', e => window.__nrmU.uNrmScale.value = e.value);
fShell.addBinding(prm, 'irid', { min: 0, max: 1 }).on('change', e => shellMat.iridescence = e.value);
fShell.addBinding(prm, 'iridIor', { min: 1, max: 2 }).on('change', e => shellMat.iridescenceIOR = e.value);
fShell.addBinding(prm, 'envInt', { min: 0, max: 3 }).on('change', e => {
shellMat.envMapIntensity = e.value;
scene.environmentIntensity = e.value; // global IBL — visible with HDRI reflections
});
fShell.addBinding(prm, 'bgInt', { min: 0, max: 3 }).on('change', e => scene.backgroundIntensity = e.value);
addColor(fShell, 'attColor', v => shellMat.attenuationColor.set(v));
fShell.addBinding(prm, 'attDist', { min: 0.2, max: 10 }).on('change', e => shellMat.attenuationDistance = e.value);
fShell.addBinding(prm, 'bulgeAmt', { min: 0, max: 0.35 });
fShell.addBinding(prm, 'bulgeSharp', { min: 8, max: 120 }).on('change', e => uBulgeSharp.value = e.value);
fShell.addBinding(prm, 'bulgeRel', { min: 0.5, max: 10 });
fShell.addBinding(prm, 'dentAO', { min: 0, max: 14 }).on('change', e => window.__dentU.uDentAO.value = e.value);
fShell.addBinding(prm, 'dentNrm', { min: 0, max: 2.5 }).on('change', e => window.__dentU.uDentNrm.value = e.value);
fShell.addBinding(prm, 'scanInt', { min: 0, max: 2 }).on('change', e => window.__scanU.uScanInt.value = e.value);
fShell.addBinding(prm, 'scanSpeed', { min: -0.3, max: 0.3 });
fShell.addBinding(prm, 'rotY', { min: -0.6, max: 0.6 });
fShell.addBinding(prm, 'rotX', { min: -0.6, max: 0.6 });
const fBlob = pane.addFolder({ title: 'blobs' });
fBlob.addBinding(prm, 'blobRough', { min: 0, max: 1 }).on('change', e => blobMat.roughness = e.value);
fBlob.addBinding(prm, 'blobCoat', { min: 0, max: 1 }).on('change', e => blobMat.clearcoat = e.value);
addColor(fBlob, 'colorDeep', applyColors);
addColor(fBlob, 'colorLight', applyColors);
const fLook = pane.addFolder({ title: 'glow / post' });
addColor(fLook, 'bgTop', rebuildBg);
addColor(fLook, 'bgBot', rebuildBg);
addColor(fLook, 'shadowColor', v => uShadCol.value.set(v));
fLook.addBinding(prm, 'shadowScale', { min: 0, max: 2 }).on('change', e => shadow.scale.set(Math.max(e.value, 1e-4), Math.max(e.value, 1e-4), 1));
addColor(fLook, 'glowColor', v => uGlowCol.value.set(v));
fLook.addBinding(prm, 'glowAlpha', { min: 0, max: 1 }).on('change', e => uGlowA.value = e.value);
fLook.addBinding(prm, 'shadowAlpha', { min: 0, max: 1 }).on('change', e => uShadA.value = e.value);
fLook.addBinding(prm, 'bloomStrength', { min: 0, max: 2 }).on('change', e => bloomPass.strength.value = e.value);
fLook.addBinding(prm, 'bloomRadius', { min: 0, max: 1.5 }).on('change', e => bloomPass.radius.value = e.value);
fLook.addBinding(prm, 'bloomThreshold', { min: 0, max: 1.2 }).on('change', e => bloomPass.threshold.value = e.value);
fLook.addBinding(prm, 'exposure', { min: 0.2, max: 2.5 }).on('change', e => renderer.toneMappingExposure = e.value);
// ═══════════════════════════════════════════════════════════════════
// resize
// ═══════════════════════════════════════════════════════════════════
addEventListener('resize', () => {
camera.aspect = innerWidth / innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(innerWidth, innerHeight);
});
// ═══════════════════════════════════════════════════════════════════
// render-loop
// ═══════════════════════════════════════════════════════════════════
const timer = new THREE.Timer();
const _back = new THREE.Vector3();
const _bx = new THREE.Vector3(), _by = new THREE.Vector3(), _bz = new THREE.Vector3();
let firstFrame = true;
renderer.setAnimationLoop(() => {
timer.update();
const rdt = Math.min(timer.getDelta(), 1 / 30);
const dt = rdt * prm.simSpeed;
if (dt > 0) { step(dt); updateBulges(dt); }
shell.rotation.y += prm.rotY * rdt; // constant spin, independent of simSpeed
shell.rotation.x += prm.rotX * rdt;
window.__scanU.uScan.value = (window.__scanU.uScan.value + prm.scanSpeed * dt) % 1;
// halo behind the sphere along the view direction; the shadow is anchored
// in SCREEN space: positioned along the camera's screen-down axis from the
// sphere center and screen-aligned — same spot just below the glass from
// every camera angle, never tilting, never drifting onto the sphere
camera.getWorldDirection(_back);
glow.position.set(0, -0.35, 0).addScaledVector(_back, 1.2);
glow.quaternion.copy(camera.quaternion);
camera.matrixWorld.extractBasis(_bx, _by, _bz);
shadow.position.copy(_by).multiplyScalar(-1.42); // screen-down from center
shadow.quaternion.copy(camera.quaternion);
controls.update();
pipeline.render();
if(firstFrame){ firstFrame=false; document.getElementById('loader').classList.add('hidden'); }
});
</script>
</body>
</html>
garden-anomaly/styles/style.css
@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@800&display=swap');
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body { margin: 0px; padding: 0px; line-height: 1.1; font-family: 'Cinzel', sans-serif; width: 100%; height: 100%; overflow: hidden; background: #000; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
* { margin:0; padding:0; box-sizing:border-box; }
html, body {
width:100%; height:100vh;
background: #2A7B9B;
background-image: linear-gradient(to bottom right, #FD8451, #FFBD6F);
display:flex; align-items:center; justify-content:center;
overflow:hidden; color:white;§
}
canvas { display:block; cursor:grab; touch-action:none;position:fixed; top:0; left:0; width:100%; height:100%; }
canvas:active { cursor:grabbing; }
#loader {
position:fixed; top:0; left:0; width:100%; height:100%;
display:flex; flex-direction:column; align-items:center; justify-content:center; gap:14px;
z-index:900; pointer-events:none;
transition: opacity 0.5s ease;
}
#loader.hidden { opacity:0; }
.spinner {
width:36px; height:36px;
border: 3px solid rgba(255,255,255,0.25);
border-top-color: rgba(255,255,255,0.7);
border-radius:50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform:rotate(360deg); } }
.loading-text {
font: 400 13px 'Helvetica Neue', Arial, sans-serif;
color: rgba(255,255,255,0.7);
letter-spacing: 0.08em;
}
.loading-text .dot {
animation: dotFade 1.4s ease-in-out infinite;
opacity:0;
}
.loading-text .dot:nth-child(1) { animation-delay: 0.0s; }
.loading-text .dot:nth-child(2) { animation-delay: 0.2s; }
.loading-text .dot:nth-child(3) { animation-delay: 0.4s; }
@keyframes dotFade {
0%, 80%, 100% { opacity:0; }
40% { opacity:1; }
}
#fps {font-size:30px;font-family:monospace;color:black;}
/* ── Tweakpane host ── */
#pane-container {
position: fixed;
top: 16px;
right: 16px;
z-index: 100;
display:block;
}
a {
color: #D0D0D0;
text-decoration: none;
}
/* ── Tweakpane dark theme ── */
:root {
--tp-base-background-color: hsl(222,22%,7%);
--tp-base-shadow-color: hsla(0,0%,0%,0.35);
--tp-button-background-color: hsl(222,18%,15%);
--tp-button-background-color-active: hsl(222,18%,22%);
--tp-button-background-color-focus: hsl(222,18%,20%);
--tp-button-background-color-hover: hsl(222,18%,19%);
--tp-button-foreground-color: hsl(155,90%,62%);
--tp-container-background-color: hsl(222,18%,11%);
--tp-container-background-color-active: hsl(222,18%,15%);
--tp-container-background-color-focus: hsl(222,18%,14%);
--tp-container-background-color-hover: hsl(222,18%,13%);
--tp-container-foreground-color: hsla(155,90%,62%,0.65);
--tp-groove-foreground-color: hsl(222,18%,22%);
--tp-input-background-color: hsl(222,18%,13%);
--tp-input-background-color-active: hsl(222,18%,20%);
--tp-input-background-color-focus: hsl(222,18%,17%);
--tp-input-background-color-hover: hsl(222,18%,16%);
--tp-input-foreground-color: hsl(155,90%,74%);
--tp-label-foreground-color: hsl(220,16%,52%);
--tp-monitor-background-color: hsl(222,18%,10%);
--tp-monitor-foreground-color: hsla(155,90%,62%,0.85);
}
/* ── Vignette ── */
#vignette {
pointer-events: none;
background: transparent;
height: 100vh;
width: 100%;
box-shadow: inset 0 0 50px rgba(0,0,0,0.23);
position: fixed;
z-index: 98;
}
/* ── FPS counter ── */
#fps {
position: fixed;
bottom: 16px;
right: 16px;
font: 500 10px/1 'Cinzel', monospace;
color: rgba(61,255,160,0.0);
letter-spacing: .08em;
pointer-events: none;
z-index: 1200;
}
#title-text {
position: fixed;
max-width:250px;
overflow-wrap: break-word;
top: 118px;
left: 28px;
max-width: 250px;
z-index: 201;
color:white;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
/* ── Title block (top-left) ── */
#title-block {
position: fixed;
top: 28px;
left: 28px;
z-index: 200;
pointer-events: auto;
display: flex;
flex-direction: column;
gap: 16px;
}
#title-eyebrow {
font: 400 16px/1 'Cinzel', monospace;
text-transform: uppercase;
color: #ffffff;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
#title-headline {
font: 600 28px/1 'Cinzel', system-ui, sans-serif;
color: #ffffff;
text-shadow: 3px 3px 10px rgba(0,0,0,0.8);
}
p {
font: 400 12px/1 'Cinzel', monospace;
text-transform: uppercase;
color: #ffffff;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
line-height: 1.5;
}
/* ── Nav link (bottom-left) ── */
#nav-prev-all {
position: fixed;
bottom: 56px;
left: 28px;
z-index: 200;
font: 400 14px/1 'Cinzel', monospace;
letter-spacing: .02em;
text-transform: uppercase;
color: #ffffff;
text-decoration: none;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
#nav-prev-all:hover {
text-shadow: 3px 3px 10px rgba(0,0,0,0.9);
}
/* ── Nav link (bottom-left) ── */
#nav-prev {
position: fixed;
bottom: 28px;
left: 28px;
z-index: 200;
font: 400 14px/1 'Cinzel', monospace;
letter-spacing: .02em;
text-transform: uppercase;
color: #ffffff;
text-decoration: none;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
#nav-prev:hover {
text-shadow: 3px 3px 10px rgba(0,0,0,0.9);
}
@media (max-width: 968px) {
#pane-container {
position: fixed;
top: 16px;
right: 6px;
z-index: 100;
width: 190px;
}
#pane-container .tp-dfwv {
width: 190px;
border-radius: 10px;
border: 1px solid rgba(255,255,255,0.07);
box-shadow: 0 8px 48px rgba(0,0,0,0.55);
overflow: hidden;
}
#title-eyebrow {
font: 400 11px/1 'Cinzel', monospace;
text-transform: uppercase;
color: #ffffff;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
#title-headline {
font: 600 23px/1 'Cinzel', system-ui, sans-serif;
color: #ffffff;
text-shadow: 3px 3px 10px rgba(0,0,0,0.8);
}
#title-text {
font: 400 11px/1 'Cinzel', monospace;
position: fixed;
max-width:200px;
width:200px;
overflow-wrap: break-word;
top: 98px;
left: 28px;
z-index: 201;
color:white;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
}
함께 쓰는 파일 9개 보기
volatile-nexus/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Volatile Nexus.</title>
<link rel="stylesheet" href="styles/style.css"/>
<script type="importmap">
{
"imports": {
"three": "https://cdnjs.cloudflare.com/ajax/libs/three.js/0.178.0/three.webgpu.min.js",
"three/webgpu": "https://cdnjs.cloudflare.com/ajax/libs/three.js/0.178.0/three.webgpu.min.js",
"three/tsl": "https://cdnjs.cloudflare.com/ajax/libs/three.js/0.178.0/three.tsl.min.js"
}
}
</script>
</head>
<body>
<div id="pane-container"></div>
<div id="vignette"></div>
<div id="title-block">
<span id="title-eyebrow">Tinker Day #42</span>
<span id="title-headline">Volatile Nexus.</span>
<p style="font-size: 14px;">
Move mouse over glass ring to make<br>it wobble. Hover the cubes
to part it.<br>Mousedown & move rotates the scene.<br><br>
Sound starts playing with your first<br>interaction.<br />
</p>
</div>
<footer><a id="nav-prev-all" href="https://dasprinzip.com/tinker/index.html">↑ Checkout all days</a><a id="nav-prev" href="https://dasprinzip.com/tinker/day41/"><br>← The Day Before.</a></footer>
<div id="loader"><div class="spinner"></div><div class="loading-text">loading<span class="dot">.</span><span class="dot">.</span><span class="dot">.</span></div></div>
<div id="tag"></div>
<script>
const __fail = (msg) => {
const l = document.getElementById('loader');
if (!l) return;
l.classList.remove('hidden');
const sp = l.querySelector('.spinner'); if (sp) sp.style.display = 'none';
const t = l.querySelector('.loading-text');
if (t) t.textContent = 'error — ' + msg;
};
window.addEventListener('error', e => __fail(e.message || 'script error'));
window.addEventListener('unhandledrejection', e =>
__fail(e.reason && e.reason.message ? e.reason.message : String(e.reason)));
</script>
<script type="module">
import * as THREE from 'three';
import {
screenUV, uniform, vec2, vec3, vec4, color, mix, smoothstep,
length, abs, pow, oneMinus, dot, cos, sin, time, normalView,
positionViewDirection, refract, div, Fn, float, uv,
reflector, positionWorld, mx_noise_float,
mx_worley_noise_float, texture, uniformArray, Loop, int, exp,
normalize, positionGeometry, positionLocal, normalLocal,
transformNormalToView
} from 'three/tsl';
// ═══════════════════════════════════════════════════════════════════
// setup renderer
// ═══════════════════════════════════════════════════════════════════
const renderer = new THREE.WebGPURenderer({ antialias: true });
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.toneMapping = THREE.ACESFilmicToneMapping;
renderer.toneMappingExposure = 0.60;
renderer.setClearColor(0x000000, 0);
renderer.shadowMap.enabled = true;
renderer.shadowMap.transmitted = true;
document.body.appendChild(renderer.domElement);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(38, innerWidth / innerHeight, 0.1, 60);
camera.position.set(0, 0.35, 5.0);
// ═══════════════════════════════════════════════════════════════════
// background (pure TSL)
// ═══════════════════════════════════════════════════════════════════
const aspect = uniform(innerWidth / innerHeight);
const p = screenUV.sub(vec2(0.5, 0.5)).mul(vec2(aspect, 1.0));
const d = length(p);
const bgBase = mix(color(0x76909f), color(0x3d5566), smoothstep(0.02, 0.85, d));
const pool = smoothstep(0.62, 0.0, length(p.mul(vec2(0.75, 1.45)).sub(vec2(0.0, -0.16)))).mul(0.12);
const upper = smoothstep(0.5, 0.0, length(p.sub(vec2(0.06, 0.16)))).mul(0.10);
const halo = smoothstep(0.14, 0.0, abs(d.sub(0.47))).mul(0.035);
scene.backgroundNode = vec4(bgBase.add(pool).add(upper).add(halo), 1.0);
// ═══════════════════════════════════════════════════════════════════
// procedural environment
// ═══════════════════════════════════════════════════════════════════
const envColorA = new THREE.Color(0x2b6bff); // deep blue
const envColorB = new THREE.Color(0xff3c8a); // magenta
const envColorC = new THREE.Color(0x18e0d8); // cyan
const envState = { sat: 1.0, bright: 1.0, bands: 5.0,
causticAmt: 2.99, causticScale: 13.73, causticChroma: 0.02,
causticIntensity: 6.09, causticOcclusion: 14.13,
causticColor: new THREE.Color(0xeaf6ff) };
// ═══════════════════════════════════════════════════════════════════
// CPU worley noise
// ═══════════════════════════════════════════════════════════════════
function hash2(i, j) {
let n = Math.sin(i * 127.1 + j * 311.7) * 43758.5453;
const a = n - Math.floor(n);
n = Math.sin(i * 269.5 + j * 183.3) * 43758.5453;
const b = n - Math.floor(n);
return [a, b];
}
function worley(x, y) {
const xi = Math.floor(x), yi = Math.floor(y);
let best = 1e9;
for (let dj = -1; dj <= 1; dj++) {
for (let di = -1; di <= 1; di++) {
const ci = xi + di, cj = yi + dj;
const [ox, oy] = hash2(ci, cj);
const px = ci + ox, py = cj + oy;
const d = (px - x) * (px - x) + (py - y) * (py - y);
if (d < best) best = d;
}
}
return Math.sqrt(best);
}
function causticCell(x, y) {
const w = 1.0 - Math.min(1.0, worley(x, y));
return w * w * w;
}
function buildEnvTexture() {
const W = 512, H = 256;
const data = new Float32Array(W * H * 4);
const blob = (u, v, cu, cv, su, sv) => {
let du = Math.abs(u - cu); du = Math.min(du, 1 - du);
const dv = v - cv;
return Math.exp(-((du * du) / (su * su) + (dv * dv) / (sv * sv)));
};
for (let y = 0; y < H; y++) {
const v = y / (H - 1);
for (let x = 0; x < W; x++) {
const u = x / (W - 1);
// base: cool vertical gradient
let r = 0.06 + 0.22 * v, g = 0.09 + 0.28 * v, b = 0.14 + 0.38 * v;
// big soft key light overhead — gives the bright core the glass needs
const key = 6.0 * blob(u, v, 0.50, 0.90, 0.18, 0.11);
r += key; g += key * 1.02; b += key * 1.06;
// SATURATED COLOUR BANDS — the actual source of the colour in the ring.
// Angular bands around the sphere, so refraction sweeps through them
// and dispersion splits each band edge into a spectrum.
const phase = u * Math.PI * 2.0 * envState.bands;
const w1 = Math.pow(Math.max(0, Math.sin(phase)), 3.0);
const w2 = Math.pow(Math.max(0, Math.sin(phase + 2.1)), 3.0);
const w3 = Math.pow(Math.max(0, Math.sin(phase + 4.2)), 3.0);
// concentrate the bands around the horizon, where the ring looks
const beltMask = Math.exp(-Math.pow((v - 0.52) / 0.30, 2.0));
const bandAmp = 2.6 * beltMask * envState.sat;
r += (envColorA.r * w1 + envColorB.r * w2 + envColorC.r * w3) * bandAmp;
g += (envColorA.g * w1 + envColorB.g * w2 + envColorC.g * w3) * bandAmp;
b += (envColorA.b * w1 + envColorB.b * w2 + envColorC.b * w3) * bandAmp;
// CAUSTIC LAYER — same pattern and same parameters as the floor
// projection (scale, chroma, intensity, occlusion, colour), baked
// into the environment so the ring refracts it with nothing on
// the ground. Changing the caustics folder re-bakes this.
const cs = envState.causticScale;
const ch = envState.causticChroma;
const cx = u * cs * 2.0, cy = v * cs;
let cr = causticCell(cx - ch * cs, cy);
let cg = causticCell(cx, cy - ch * cs);
let cb = causticCell(cx + ch * cs, cy + ch * cs);
// occlusion sharpens the cells the way the shadow-pass term does
const occP = Math.max(0.05, envState.causticOcclusion) * 0.16;
cr = Math.pow(cr, occP); cg = Math.pow(cg, occP); cb = Math.pow(cb, occP);
// intensity scaling mirrors the castShadowNode multiplier
const cAmp = envState.causticAmt * beltMask *
(envState.causticIntensity / 22.0) * 3.2;
const cc = envState.causticColor;
r += cr * cAmp * cc.r; g += cg * cAmp * cc.g; b += cb * cAmp * cc.b;
// two bright vertical strips — the long streak reflections
const s1 = 1.5 * blob(u, v, 0.16, 0.55, 0.030, 0.28);
const s2 = 1.2 * blob(u, v, 0.80, 0.50, 0.028, 0.30);
r += s1 + s2; g += (s1 + s2) * 1.02; b += (s1 + s2) * 1.08;
// cool floor bounce
const fb = 0.45 * blob(u, v, 0.5, 0.05, 0.5, 0.10);
r += fb * 0.55; g += fb * 0.65; b += fb * 0.85;
const i = (y * W + x) * 4;
data[i] = r * envState.bright;
data[i + 1] = g * envState.bright;
data[i + 2] = b * envState.bright;
data[i + 3] = 1;
}
}
const tex = new THREE.DataTexture(data, W, H, THREE.RGBAFormat, THREE.FloatType);
tex.mapping = THREE.EquirectangularReflectionMapping;
tex.magFilter = THREE.LinearFilter;
tex.minFilter = THREE.LinearFilter;
tex.needsUpdate = true;
return tex;
}
let pmrem = null;
let envSeq = 0;
let rendererReady = false;
async function refreshEnv() {
const raw = buildEnvTexture();
const seq = ++envSeq;
if (!rendererReady) {
const old = scene.environment;
scene.environment = raw;
if (old && old !== raw) old.dispose();
return;
}
try {
if (!pmrem) pmrem = new THREE.PMREMGenerator(renderer);
const result = await pmrem.fromEquirectangularAsync(raw);
if (seq !== envSeq) {
result.texture.dispose();
raw.dispose();
return;
}
const old = scene.environment;
scene.environment = result.texture;
raw.dispose();
if (old && old !== result.texture) old.dispose();
} catch (err) {
console.warn('PMREM unavailable, using raw environment:', err);
if (seq !== envSeq) { raw.dispose(); return; }
const old = scene.environment;
scene.environment = raw;
if (old && old !== raw) old.dispose();
}
}
refreshEnv().catch(e => console.warn("env bake failed:", e));
// ═══════════════════════════════════════════════════════════════════
// ring geometry
// ═══════════════════════════════════════════════════════════════════
function roundedRingGeometry(rIn, rOut, halfH, cr, cornerSeg = 14, latheSeg = 200) {
const pts = [];
const arc = (cx, cy, a0, a1) => {
for (let i = 0; i <= cornerSeg; i++) {
const a = a0 + (a1 - a0) * (i / cornerSeg);
pts.push(new THREE.Vector2(cx + Math.cos(a) * cr, cy + Math.sin(a) * cr));
}
};
pts.push(new THREE.Vector2(rIn + cr, -halfH));
pts.push(new THREE.Vector2(rOut - cr, -halfH));
arc(rOut - cr, -halfH + cr, -Math.PI / 2, 0);
pts.push(new THREE.Vector2(rOut, halfH - cr));
arc(rOut - cr, halfH - cr, 0, Math.PI / 2);
pts.push(new THREE.Vector2(rIn + cr, halfH));
arc(rIn + cr, halfH - cr, Math.PI / 2, Math.PI);
pts.push(new THREE.Vector2(rIn, -halfH + cr));
arc(rIn + cr, -halfH + cr, Math.PI, Math.PI * 1.5);
pts.push(pts[0].clone());
const geo = new THREE.LatheGeometry(pts, latheSeg);
geo.computeVertexNormals();
return geo;
}
const ringGeo = roundedRingGeometry(0.56, 1.0, 0.44, 0.17);
// ═══════════════════════════════════════════════════════════════════
// glass material
// ═══════════════════════════════════════════════════════════════════
const glass = new THREE.MeshPhysicalNodeMaterial({
color: 0xffffff,
transmission: 1.0,
thickness: 1.5,
roughness: 0.035,
metalness: 0.0,
ior: 1.5,
dispersion: 14.0,
iridescence: 0.35,
iridescenceIOR: 1.3,
iridescenceThicknessRange: [120, 480],
clearcoat: 0.0,
clearcoatRoughness: 0.05,
specularIntensity: 1.0,
envMapIntensity: 2.1,
attenuationColor: new THREE.Color(0xdff2ff),
attenuationDistance: 4.0
});
glass.transparent = true;
const uFresnelStrength = uniform(0.87);
const uFresnelPower = uniform(4.25);
const uRainbowSpeed = uniform(0.04);
// ═══════════════════════════════════════════════════════════════════
// refracted cube buffer
// ═══════════════════════════════════════════════════════════════════
const cubeRT = new THREE.RenderTarget(
Math.floor(innerWidth * 0.5), Math.floor(innerHeight * 0.5)
);
const uCubeIor = uniform(1.5); // kept in sync with the glass IOR
const uCubeRefrAmt = uniform(2.0); // brightness of the refracted cubes
const uCubeRefrShift = uniform(0.22); // thickness-like refraction shift
const uCubeRefrChroma = uniform(0.32); // per-channel IOR spread — strong CA
const uCubeSpectral = uniform(0.25); // iridescent tinting of the refraction
const uCubeRefrBlur = uniform(0.15); // frosted-glass blur of the refraction
const uCubeRefrSat = uniform(1.4); // saturation boost of the refraction
const uCubeFlip = uniform(0); // 1 if the backend flips RT Y
{
const facing = abs(dot(normalView, positionViewDirection));
const fres = pow(oneMinus(facing), uFresnelPower);
const t = normalView.x.mul(1.4).add(normalView.y.mul(0.9)).add(time.mul(uRainbowSpeed));
const rainbow = cos(t.mul(6.2831).add(vec3(0.0, 2.094, 4.188))).mul(0.5).add(0.5);
// ═══════════════════════════════════════════════════════════════════
// refracted swarm: sample cube buffer along the refracted eye ray
// ═══════════════════════════════════════════════════════════════════
const jx = mx_noise_float(vec3(screenUV.mul(140.0), time.mul(0.5)));
const jy = mx_noise_float(vec3(screenUV.yx.mul(140.0).add(7.3), time.mul(0.5)));
const blurJit = vec2(jx, jy).mul(uCubeRefrBlur.mul(0.06));
const sampleAt = (dIor) => {
const rr = refract(
positionViewDirection.negate(), normalView, div(1.0, uCubeIor.add(dIor))
);
const s = screenUV.add(rr.xy.mul(uCubeRefrShift)).add(blurJit);
return texture(cubeRT.texture,
vec2(s.x, mix(s.y, oneMinus(s.y), uCubeFlip)));
};
const cR = sampleAt(uCubeRefrChroma.negate()).r;
const cG = sampleAt(float(0.0)).g;
const cB = sampleAt(uCubeRefrChroma).b;
const rawCol = vec3(cR, cG, cB);
const luma = dot(rawCol, vec3(0.299, 0.587, 0.114));
const satCol = mix(vec3(luma), rawCol, uCubeRefrSat).clamp(0.0, 8.0);
const spectralTint = mix(vec3(1.0), rainbow.mul(1.6), uCubeSpectral);
const swarmGlow = satCol.mul(spectralTint).mul(uCubeRefrAmt)
.mul(pow(facing, float(1.2)));
glass.emissiveNode = rainbow.mul(fres).mul(uFresnelStrength).add(swarmGlow);
}
// ═══════════════════════════════════════════════════════════════════
// mouse ripple on the glass
// ═══════════════════════════════════════════════════════════════════
const RIPPLE_MAX = 12;
const ripPosArr = []; for (let i = 0; i < RIPPLE_MAX; i++) ripPosArr.push(new THREE.Vector3());
const ripAgeArr = new Array(RIPPLE_MAX).fill(99);
const ripStrArr = new Array(RIPPLE_MAX).fill(0);
const uRipPos = uniformArray(ripPosArr);
const uRipAge = uniformArray(ripAgeArr);
const uRipStr = uniformArray(ripStrArr);
const uRingWobble = uniform(0.05);
const ringRippleFn = Fn(([p]) => {
const total = float(0).toVar();
Loop({ start: int(0), end: int(RIPPLE_MAX), type: 'int' }, ({ i }) => {
const age = uRipAge.element(i);
const str = uRipStr.element(i);
const ctr = uRipPos.element(i);
const dist = length(p.sub(ctr));
const shell = dist.sub(age.mul(1.4));
const ringW = exp(shell.mul(shell).mul(-6.0));
const osc = cos(dist.mul(9.0).sub(age.mul(11.0)));
const decay = exp(age.mul(-2.6));
total.addAssign(osc.mul(ringW).mul(decay).mul(str));
});
return total;
});
{
const pg = positionGeometry;
const cDir = normalize(pg.xz);
const tubeCtr = vec3(cDir.x.mul(0.78), 0.0, cDir.y.mul(0.78));
const rippleDir = normalize(pg.sub(tubeCtr));
const dispAt = (p) => ringRippleFn(p).mul(uRingWobble);
glass.positionNode = positionLocal.add(rippleDir.mul(dispAt(pg)));
const REPS = 0.04;
glass.normalNode = Fn(() => {
const dx = dispAt(pg.add(vec3(REPS, 0, 0))).sub(dispAt(pg.add(vec3(-REPS, 0, 0))));
const dy = dispAt(pg.add(vec3(0, REPS, 0))).sub(dispAt(pg.add(vec3(0, -REPS, 0))));
const dz = dispAt(pg.add(vec3(0, 0, REPS))).sub(dispAt(pg.add(vec3(0, 0, -REPS))));
const grad = vec3(dx, dy, dz).mul(float(1.0 / (2.0 * REPS)));
const n = normalize(normalLocal.sub(grad.mul(0.7)));
return transformNormalToView(n);
})();
}
// ═══════════════════════════════════════════════════════════════════
// caustics (castShadowNode)
// ═══════════════════════════════════════════════════════════════════
const uCausticOcclusion = uniform(14.13);
const uCausticIntensity = uniform(6.09);
const uCausticScale = uniform(5.97);
const uCausticSpeed = uniform(0.06);
const uChroma = uniform(0.02);
const uCausticColor = uniform(new THREE.Color(0xeaf6ff));
const uIorShadow = uniform(1.5);
glass.castShadowNode = Fn(() => {
const refr = refract(
positionViewDirection.negate(), normalView, div(1.0, uIorShadow)
).normalize();
const occ = pow(abs(normalView.z), uCausticOcclusion);
const baseUV = refr.xy.mul(uCausticScale);
const tt = time.mul(uCausticSpeed);
const cell = (o) =>
pow(oneMinus(mx_worley_noise_float(vec3(baseUV.add(o), tt))), float(3.0));
const caustic = vec3(
cell(vec2(uChroma.negate(), 0.0)),
cell(vec2(0.0, uChroma.negate())),
cell(vec2(uChroma, uChroma))
);
return caustic.mul(occ.mul(uCausticIntensity)).add(occ).mul(uCausticColor);
})();
const ring = new THREE.Mesh(ringGeo, glass);
ring.castShadow = true;
const rig = new THREE.Group();
rig.add(ring);
scene.add(rig);
ring.rotation.set(1.22, 0.0, 0.0);
rig.rotation.set(0.06, -0.55, -0.10);
rig.position.y = -0.12;
const ripRaycaster = new THREE.Raycaster();
const ripNDC = new THREE.Vector2();
const _ripLocal = new THREE.Vector3();
let ripPrev = null, ripLastSpawn = 0, ripLastCast = 0;
function spawnRipple(local, strength) {
let slot = 0, oldest = -1;
for (let i = 0; i < RIPPLE_MAX; i++) {
if (ripAgeArr[i] > oldest) { oldest = ripAgeArr[i]; slot = i; }
}
ripPosArr[slot].copy(local);
ripAgeArr[slot] = 0;
ripStrArr[slot] = strength;
}
function rippleJS(p) {
let total = 0;
for (let i = 0; i < RIPPLE_MAX; i++) {
const age = ripAgeArr[i];
if (age > 5) continue;
const dx = p.x - ripPosArr[i].x;
const dy = p.y - ripPosArr[i].y;
const dz = p.z - ripPosArr[i].z;
const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);
const shell = dist - age * 1.4;
total += Math.cos(dist * 9.0 - age * 11.0) *
Math.exp(-6.0 * shell * shell) *
Math.exp(-2.6 * age) * ripStrArr[i];
}
return total;
}
const _flrLocal = new THREE.Vector3(), _flrDir = new THREE.Vector3(),
_flrInv = new THREE.Matrix4();
renderer.domElement.addEventListener('pointermove', (e) => {
const now = performance.now();
if (now - ripLastCast < 25) return; // brute-force lathe raycast: throttle
ripLastCast = now;
ripNDC.set((e.clientX / innerWidth) * 2 - 1,
-(e.clientY / innerHeight) * 2 + 1);
ripRaycaster.setFromCamera(ripNDC, camera);
const hit = ripRaycaster.intersectObject(ring, false);
if (hit.length) {
_ripLocal.copy(hit[0].point);
ring.worldToLocal(_ripLocal);
if (now - ripLastSpawn > 30) {
let str = 1.0;
if (ripPrev) {
str = THREE.MathUtils.clamp(0.5 + _ripLocal.distanceTo(ripPrev) * 16, 0.4, 1.8);
}
spawnRipple(_ripLocal, str);
ripLastSpawn = now;
ripPrev = _ripLocal.clone();
}
} else {
ripPrev = null;
}
});
// ═══════════════════════════════════════════════════════════════════
// golden cube swarm
// ═══════════════════════════════════════════════════════════════════
const CUBE_COUNT = 2000;
// procedural brushed-gold texture — no external asset needed
function goldTexture() {
const s = 128;
const c = document.createElement('canvas');
c.width = c.height = s;
const ctx = c.getContext('2d');
ctx.fillStyle = '#c9962f';
ctx.fillRect(0, 0, s, s);
// horizontal brushed streaks, light and dark
for (let i = 0; i < 280; i++) {
const y = Math.random() * s;
const w = 8 + Math.random() * 72;
const x = Math.random() * s - w / 2;
ctx.fillStyle = Math.random() > 0.5
? `rgba(255,222,150,${0.05 + Math.random() * 0.16})`
: `rgba(115,70,12,${0.04 + Math.random() * 0.12})`;
ctx.fillRect(x, y, w, 1 + Math.random() * 1.6);
}
// fine speckle for a hammered-metal grain
for (let i = 0; i < 170; i++) {
ctx.fillStyle = Math.random() > 0.5
? 'rgba(255,240,195,0.35)' : 'rgba(92,56,8,0.30)';
ctx.fillRect(Math.random() * s, Math.random() * s, 1.4, 1.4);
}
const t = new THREE.CanvasTexture(c);
t.colorSpace = THREE.SRGBColorSpace;
t.wrapS = t.wrapT = THREE.RepeatWrapping;
return t;
}
const SwarmMat = THREE.MeshStandardNodeMaterial || THREE.MeshStandardMaterial;
const cubeMat = new SwarmMat({
map: goldTexture(),
color: 0xffe9b0,
metalness: 1.0,
roughness: 0.28,
envMapIntensity: 1.6,
opacity: 1.0
});
const swarmHolder = new THREE.Group();
swarmHolder.rotation.copy(ring.rotation);
rig.add(swarmHolder);
const swarm = new THREE.InstancedMesh(
new THREE.BoxGeometry(1, 1, 1), cubeMat, CUBE_COUNT
);
swarm.instanceMatrix.setUsage(THREE.DynamicDrawUsage);
swarm.frustumCulled = false; // instances move every frame; skip stale bounds
swarm.renderOrder = 6; // after glass (0) and after the ghost pass (5)
swarmHolder.add(swarm);
// ═══════════════════════════════════════════════════════════════════
// x-ray pass: shows behind-glass cubes in true sync
// ═══════════════════════════════════════════════════════════════════
const ghostMat = new SwarmMat({
map: cubeMat.map,
color: 0xd99a35,
metalness: 1.0,
roughness: 0.5,
envMapIntensity: 0.9,
emissive: 0x8a5a12,
emissiveIntensity: 0.35,
transparent: true,
opacity: 0.85,
depthWrite: false,
depthTest: true
});
ghostMat.depthFunc = THREE.GreaterDepth;
const swarmGhost = new THREE.InstancedMesh(
swarm.geometry, ghostMat, CUBE_COUNT
);
swarmGhost.instanceMatrix = swarm.instanceMatrix; // share the live buffer
swarmGhost.frustumCulled = false;
swarmGhost.renderOrder = 5; // after the glass, BEFORE the main swarm
swarmHolder.add(swarmGhost);
// ═══════════════════════════════════════════════════════════════════
// cube-only mirror scene for the refraction buffer
// ═══════════════════════════════════════════════════════════════════
const rtScene = new THREE.Scene();
const rtHolder = new THREE.Group();
rtHolder.matrixAutoUpdate = false; // copied from swarmHolder every frame
rtScene.add(rtHolder);
const rtMat = new SwarmMat({
map: cubeMat.map,
color: 0xffe9b0,
metalness: 1.0,
roughness: 0.28,
envMapIntensity: 1.6
});
const rtSwarm = new THREE.InstancedMesh(swarm.geometry, rtMat, CUBE_COUNT);
rtSwarm.instanceMatrix = swarm.instanceMatrix; // share the live buffer
rtSwarm.frustumCulled = false;
rtHolder.add(rtSwarm);
const swarmPath = new THREE.CatmullRomCurve3([
new THREE.Vector3(0.00, -2.10, 0.0), // behind, lining up on the hole
new THREE.Vector3(0.00, -1.10, 0.0),
new THREE.Vector3(0.00, 0.00, 0.0), // dead centre of the hole
new THREE.Vector3(0.00, 1.10, 0.0),
new THREE.Vector3(0.35, 1.90, 0.0), // exit, banking to the side
new THREE.Vector3(1.35, 1.65, 0.0),
new THREE.Vector3(2.05, 0.85, 0.0),
new THREE.Vector3(2.30, 0.00, 0.0), // widest point beside the ring
new THREE.Vector3(2.05, -0.85, 0.0),
new THREE.Vector3(1.35, -1.65, 0.0),
new THREE.Vector3(0.35, -1.90, 0.0) // sweeping back behind the ring
], true, 'catmullrom', 0.5);
const PATH_SAMPLES = 2048;
const pathPos = new Float32Array((PATH_SAMPLES + 1) * 3);
const pathTan = new Float32Array((PATH_SAMPLES + 1) * 3);
{
const p = new THREE.Vector3(), tg = new THREE.Vector3();
for (let i = 0; i <= PATH_SAMPLES; i++) {
const u = (i % PATH_SAMPLES) / PATH_SAMPLES; // wrap: last entry = first
swarmPath.getPointAt(u, p);
swarmPath.getTangentAt(u, tg);
pathPos[i * 3] = p.x; pathPos[i * 3 + 1] = p.y; pathPos[i * 3 + 2] = p.z;
pathTan[i * 3] = tg.x; pathTan[i * 3 + 1] = tg.y; pathTan[i * 3 + 2] = tg.z;
}
}
let holeU0 = 0, holeU1 = 0;
{
let first = -1, last = -1;
for (let i = 0; i <= PATH_SAMPLES; i++) {
const j = i * 3;
const d = Math.hypot(pathPos[j], pathPos[j + 1], pathPos[j + 2]);
if (d < 0.75) { if (first < 0) first = i; last = i; }
}
holeU0 = first / PATH_SAMPLES;
holeU1 = last / PATH_SAMPLES;
}
function samplePath(u, outP, outT) {
const f = u * PATH_SAMPLES;
const i0 = Math.floor(f), a = f - i0;
const j0 = i0 * 3, j1 = (i0 + 1) * 3;
outP.set(
pathPos[j0] + (pathPos[j1] - pathPos[j0]) * a,
pathPos[j0 + 1] + (pathPos[j1 + 1] - pathPos[j0 + 1]) * a,
pathPos[j0 + 2] + (pathPos[j1 + 2] - pathPos[j0 + 2]) * a
);
outT.set(
pathTan[j0] + (pathTan[j1] - pathTan[j0]) * a,
pathTan[j0 + 1] + (pathTan[j1 + 1] - pathTan[j0 + 1]) * a,
pathTan[j0 + 2] + (pathTan[j1 + 2] - pathTan[j0 + 2]) * a
).normalize();
}
const cubes = [];
{
const rand = (a, b) => a + Math.random() * (b - a);
for (let i = 0; i < CUBE_COUNT; i++) {
// offsets in a unit disc across the path
const a = Math.random() * Math.PI * 2;
const r = Math.sqrt(Math.random());
cubes.push({
phase: (i + rand(0, 0.8)) / CUBE_COUNT * 0.5, // half-loop stream
ox: Math.cos(a) * r, // across-path offset (in-plane)
oy: Math.sin(a) * r, // across-path offset (out-of-plane)
wobSpeed: rand(0.7, 1.8),
wobPhase: rand(0, Math.PI * 2),
axis: new THREE.Vector3(rand(-1, 1), rand(-1, 1), rand(-1, 1)).normalize(),
spin: rand(0.8, 2.6) * (Math.random() < 0.5 ? -1 : 1),
spin0: rand(0, Math.PI * 2),
size: rand(0.024, 0.050),
lap: -1, ang: 0, angPrev: 0, // per-lap branch state
dx: 0, dy: 0, dz: 0, // spring displacement (mouse)
vx: 0, vy: 0, vz: 0 // spring velocity
});
}
}
// ═══════════════════════════════════════════════════════════════════
// mouse proximity: cubes near the cursor's pick ray get pushed away
// ═══════════════════════════════════════════════════════════════════
const swarmState = { speed: 0.1, scatter: 0.21, size: 0.64,
mouse: true, mouseRadius: 0.55, mouseForce: 45 };
const lapAngles = [0]; // first lap: right-hand side
function lapAngle(k) {
if (k < 0) return lapAngles[0];
while (lapAngles.length <= k) {
const prev = lapAngles[lapAngles.length - 1];
const opts = [0, Math.PI, Math.PI / 2] // no bottom branch
.filter(a => a !== prev); // never the same branch twice in a row
lapAngles.push(opts[(Math.random() * opts.length) | 0]);
}
return lapAngles[k];
}
const mouseNDC = new THREE.Vector2(10, 10);
let mouseActive = false;
renderer.domElement.addEventListener('pointermove', (e) => {
mouseNDC.set((e.clientX / innerWidth) * 2 - 1,
-(e.clientY / innerHeight) * 2 + 1);
mouseActive = true;
});
renderer.domElement.addEventListener('pointerleave', () => {
mouseActive = false;
});
const swarmRaycaster = new THREE.Raycaster();
const _sp = new THREE.Vector3(), _st = new THREE.Vector3(),
_sn1 = new THREE.Vector3(), _sn2 = new THREE.Vector3(),
_sq = new THREE.Quaternion(), _ss = new THREE.Vector3(),
_sm = new THREE.Matrix4(), _sup = new THREE.Vector3(0, 0, 1),
_sinv = new THREE.Matrix4(),
_sro = new THREE.Vector3(), _srd = new THREE.Vector3();
function updateSwarm(t, dt) {
const head = t * swarmState.speed;
// mouse pick ray in holder-local space, once per frame
let rayOK = false;
if (mouseActive && swarmState.mouse) {
swarmRaycaster.setFromCamera(mouseNDC, camera);
swarmHolder.updateMatrixWorld();
_sinv.copy(swarmHolder.matrixWorld).invert();
_sro.copy(swarmRaycaster.ray.origin).applyMatrix4(_sinv);
_srd.copy(swarmRaycaster.ray.direction).transformDirection(_sinv).normalize();
rayOK = true;
}
const R = swarmState.mouseRadius;
const kSpring = 26.0, kDamp = 7.5; // settle back in about half a second
let distAcc = 0; // summed repel displacement -> audio disturbance
for (let i = 0; i < CUBE_COUNT; i++) {
const c = cubes[i];
const g = head + c.phase;
const lap = Math.floor(g);
const u = g - lap;
if (c.lap !== lap) {
c.lap = lap;
c.ang = lapAngle(lap);
c.angPrev = lapAngle(lap - 1);
}
samplePath(u, _sp, _st);
// blend from last lap's branch just after the wrap — position there is
// on the rotation axis (x=0), so only the cross-path offsets swing,
// and easing them over the first stretch keeps that swing smooth
let ang = c.ang;
if (u < 0.08) {
let d = c.ang - c.angPrev;
d = ((d + Math.PI) % (Math.PI * 2) + Math.PI * 2) % (Math.PI * 2) - Math.PI;
const w = u / 0.08;
ang = c.angPrev + d * (w * w * (3 - 2 * w));
}
// rotate path point + tangent around the hole axis (local Y)
const caB = Math.cos(ang), saB = Math.sin(ang);
let rxB = _sp.x * caB + _sp.z * saB;
_sp.z = -_sp.x * saB + _sp.z * caB; _sp.x = rxB;
rxB = _st.x * caB + _st.z * saB;
_st.z = -_st.x * saB + _st.z * caB; _st.x = rxB;
// cross-path basis: the curve lies in the XY plane, so its tangent is
// never parallel to +Z and this frame stays stable along the loop
_sn1.crossVectors(_st, _sup).normalize();
_sn2.crossVectors(_st, _sn1).normalize();
// the swarm pinches tight to thread the hole, relaxes out on the arc
const pinch = 0.45 + 0.55 * Math.min(1, _sp.length() / 1.1);
const ox = (c.ox + Math.sin(t * c.wobSpeed + c.wobPhase) * 0.16)
* swarmState.scatter * pinch;
const oy = (c.oy + Math.cos(t * c.wobSpeed * 0.8 + c.wobPhase) * 0.16)
* swarmState.scatter * pinch;
_sp.addScaledVector(_sn1, ox).addScaledVector(_sn2, oy);
// ═══════════════════════════════════════════════════════════════════
// mouse spring physics
// ═══════════════════════════════════════════════════════════════════
// spring pulls the displacement back to zero; damping stops jitter
let fx = -kSpring * c.dx - kDamp * c.vx;
let fy = -kSpring * c.dy - kDamp * c.vy;
let fz = -kSpring * c.dz - kDamp * c.vz;
if (rayOK) {
// closest point on the pick ray to this cube's current position
const cx = _sp.x + c.dx, cy = _sp.y + c.dy, cz = _sp.z + c.dz;
const px = cx - _sro.x, py = cy - _sro.y, pz = cz - _sro.z;
const tp = px * _srd.x + py * _srd.y + pz * _srd.z;
if (tp > 0) {
let rx = cx - (_sro.x + _srd.x * tp);
let ry = cy - (_sro.y + _srd.y * tp);
let rz = cz - (_sro.z + _srd.z * tp);
const d = Math.sqrt(rx * rx + ry * ry + rz * rz);
if (d < R) {
// degenerate: cube dead on the ray — pick a stable side to flee
if (d < 1e-4) { rx = c.ox || 0.3; ry = 0.2; rz = c.oy || 0.3; }
const inv = 1 / (d < 1e-4 ? Math.hypot(rx, ry, rz) : d);
const fall = 1 - d / R; // 1 at the ray, 0 at the rim
const s = fall * fall * swarmState.mouseForce;
fx += rx * inv * s; fy += ry * inv * s; fz += rz * inv * s;
}
}
}
// semi-implicit euler; displacement capped so nothing can fly away
c.vx += fx * dt; c.vy += fy * dt; c.vz += fz * dt;
c.dx += c.vx * dt; c.dy += c.vy * dt; c.dz += c.vz * dt;
const dm = Math.sqrt(c.dx * c.dx + c.dy * c.dy + c.dz * c.dz);
if (dm > 1.2) {
const sc = 1.2 / dm;
c.dx *= sc; c.dy *= sc; c.dz *= sc;
}
distAcc += Math.min(dm, 1.2);
_sp.x += c.dx; _sp.y += c.dy; _sp.z += c.dz;
// ---------------------------------------------------------------
// self-rotation about each cube's own random axis
_sq.setFromAxisAngle(c.axis, c.spin0 + t * c.spin);
const sz = c.size * swarmState.size;
_ss.set(sz, sz, sz);
_sm.compose(_sp, _sq, _ss);
swarm.setMatrixAt(i, _sm);
}
swarmState.disturb = distAcc / CUBE_COUNT;
swarm.instanceMatrix.needsUpdate = true;
}
updateSwarm(0, 0.016); // valid matrices before the first frame / warm-up
// ------------------------------------------------- ambient sound
// Fully synthesized (no assets), wired to the same data the visuals use:
// - pad whose lowpass opens with the ripple field's live energy
// - water-plops fired by ripple impulses (pitch/level from stroke speed)
// - shimmer bed that swells with the fraction of the stream currently
// inside the ring's hole (head phase vs the path's hole window)
// - each lap's branch decision re-tunes the pad chord slightly
// Browsers require a user gesture before audio: starts on first click.
let actx = null, masterGain = null, padFilter = null, shimmerGain = null,
shimmerBP = null, noiseBuf = null,
glassGain = null, glassBP = null, audioReady = false, audioLap = -1;
const padOscs = [];
const PAD_ROOT = 110; // A2
function ensureAudio() {
if (actx) { if (actx.state === 'suspended') actx.resume(); return; }
const AC = window.AudioContext || window.webkitAudioContext;
if (!AC) return;
actx = new AC();
masterGain = actx.createGain();
masterGain.gain.value = 0;
masterGain.connect(actx.destination);
// ---- pad: four soft partials through a slow-breathing lowpass
padFilter = actx.createBiquadFilter();
padFilter.type = 'lowpass';
padFilter.frequency.value = 520;
padFilter.Q.value = 0.7;
const padGain = actx.createGain();
padGain.gain.value = 0.16;
padFilter.connect(padGain);
padGain.connect(masterGain);
const ratios = [1, 1.5, 2.0, 2.52];
ratios.forEach((r, i) => {
const o = actx.createOscillator();
o.type = i < 2 ? 'sine' : 'triangle';
o.frequency.value = PAD_ROOT * r;
const g = actx.createGain();
g.gain.value = i < 2 ? 0.5 : 0.16;
o.connect(g); g.connect(padFilter); o.start();
padOscs.push({ o, r });
const lfo = actx.createOscillator();
lfo.frequency.value = 0.06 + i * 0.031;
const lg = actx.createGain();
lg.gain.value = 1.4 + i;
lfo.connect(lg); lg.connect(o.detune); lfo.start();
});
// ---- airy noise bed
noiseBuf = actx.createBuffer(1, actx.sampleRate * 2, actx.sampleRate);
const nd = noiseBuf.getChannelData(0);
for (let i = 0; i < nd.length; i++) nd[i] = Math.random() * 2 - 1;
const mkNoise = () => {
const src = actx.createBufferSource();
src.buffer = noiseBuf; src.loop = true; src.start();
return src;
};
const nbp = actx.createBiquadFilter();
nbp.type = 'bandpass'; nbp.frequency.value = 420; nbp.Q.value = 0.5;
const ng = actx.createGain(); ng.gain.value = 0.025;
mkNoise().connect(nbp); nbp.connect(ng); ng.connect(masterGain);
// ---- shimmer: beating triangles + bright noise, gated by hole coverage
shimmerGain = actx.createGain();
shimmerGain.gain.value = 0;
shimmerGain.connect(masterGain);
[660, 663, 990].forEach((fz) => {
const o = actx.createOscillator();
o.type = 'triangle'; o.frequency.value = fz;
const g = actx.createGain(); g.gain.value = 0.3;
o.connect(g); g.connect(shimmerGain); o.start();
});
shimmerBP = actx.createBiquadFilter();
shimmerBP.type = 'bandpass';
shimmerBP.frequency.value = 1500;
shimmerBP.Q.value = 1.1;
const sng = actx.createGain(); sng.gain.value = 0.45;
mkNoise().connect(shimmerBP); shimmerBP.connect(sng);
sng.connect(shimmerGain);
// ---- singing glass: the wobble sound. No discrete triggers — a
// high-Q resonant noise tone (the wine-glass-rim hum) whose LEVEL is
// driven every frame by the ripple field's energy: it swells while you
// stroke the glass and fades as the waves decay. Two resonances plus a
// slow vibrato keep it alive rather than sterile.
glassGain = actx.createGain();
glassGain.gain.value = 0;
glassGain.connect(masterGain);
glassBP = actx.createBiquadFilter();
glassBP.type = 'bandpass';
glassBP.frequency.value = 640;
glassBP.Q.value = 18;
const glassBP2 = actx.createBiquadFilter();
glassBP2.type = 'bandpass';
glassBP2.frequency.value = 963;
glassBP2.Q.value = 14;
const glassBP2g = actx.createGain();
glassBP2g.gain.value = 0.5;
mkNoise().connect(glassBP); glassBP.connect(glassGain);
mkNoise().connect(glassBP2); glassBP2.connect(glassBP2g);
glassBP2g.connect(glassGain);
const glassVib = actx.createOscillator();
glassVib.frequency.value = 0.8;
const glassVibG = actx.createGain();
glassVibG.gain.value = 6;
glassVib.connect(glassVibG); glassVibG.connect(glassBP.frequency);
glassVib.start();
audioReady = true;
}
// ═══════════════════════════════════════════════════════════════════
// cross-device audio unlock.
// ═══════════════════════════════════════════════════════════════════
for (const ev of ['pointerdown', 'pointermove', 'touchstart', 'touchend',
'mousedown', 'click', 'wheel', 'keydown']) {
window.addEventListener(ev, ensureAudio, { passive: true });
}
function circOverlap(a0, len, b0, b1) {
let ov = 0;
for (const off of [0, 1, -1]) {
const s0 = a0 + off, e0 = s0 + len;
ov += Math.max(0, Math.min(e0, b1) - Math.max(s0, b0));
}
return ov;
}
// ═══════════════════════════════════════════════════════════════════
// floor (receives caustics).
// ═══════════════════════════════════════════════════════════════════
const floorMat = new THREE.MeshStandardNodeMaterial({
color: 0x63808f,
roughness: 0.95,
metalness: 0.0
});
floorMat.transparent = true;
// fade the disc into the painted backdrop so the horizon stays invisible
floorMat.opacityNode = smoothstep(1.0, 0.35, length(uv().sub(0.5).mul(2.0)));
// ═══════════════════════════════════════════════════════════════════
// wet floor reflection.
// ═══════════════════════════════════════════════════════════════════
const uWetAmount = uniform(0.95); // how mirrored the floor is
const uWetBlur = uniform(0.15); // softness of the reflection
const uWetDistort = uniform(0.22); // ripple/puddle distortion
const uWetScale = uniform(2.2); // ripple size
const uWetSpeed = uniform(0.12); // ripple movement
const uWetFresnel = uniform(2.4); // how strongly angle affects it
const uWetTint = uniform(new THREE.Color(0xbcd6e6));
const uWetRough = uniform(0.12); // v37 value — strong mirror. Raise it if the ring dims.
const MIRROR_Y = -1.141;
const _mirDBS = new THREE.Vector2();
renderer.getDrawingBufferSize(_mirDBS);
const mirrorRT = new THREE.RenderTarget(
_mirDBS.x, _mirDBS.y, { type: THREE.HalfFloatType }
);
const mirrorCam = new THREE.PerspectiveCamera();
const uMirrorTexMat = uniform(new THREE.Matrix4());
const _mirTM = new THREE.Matrix4();
const _mirPos = new THREE.Vector3(), _mirDir = new THREE.Vector3(),
_mirUp = new THREE.Vector3(), _mirTgt = new THREE.Vector3();
function renderMirror() {
camera.updateMatrixWorld();
// reflect the camera across the floor plane (proper rotation — no
// negative scale, so winding and culling stay correct)
_mirPos.setFromMatrixPosition(camera.matrixWorld);
_mirPos.y = 2 * MIRROR_Y - _mirPos.y;
camera.getWorldDirection(_mirDir);
_mirDir.y *= -1;
_mirUp.set(0, 1, 0).applyQuaternion(camera.quaternion);
_mirUp.y *= -1;
mirrorCam.position.copy(_mirPos);
mirrorCam.up.copy(_mirUp);
_mirTgt.copy(_mirPos).add(_mirDir);
mirrorCam.lookAt(_mirTgt);
mirrorCam.projectionMatrix.copy(camera.projectionMatrix);
mirrorCam.projectionMatrixInverse.copy(camera.projectionMatrixInverse);
mirrorCam.updateMatrixWorld(true);
mirrorCam.matrixWorldInverse.copy(mirrorCam.matrixWorld).invert();
// reflector texture matrix: world position -> mirror-view UV.
// NOTE the NEGATED Y row: WebGPU samples render-target textures with V
// pointing DOWN, so the classic WebGL bias (+0.5 Y) lands every lookup
// at the vertically mirrored spot — the reflection then appears
// displaced to the wrong region of the floor, seemingly "behind" the
// scene. Flipping V in the bias puts it exactly under the objects.
_mirTM.set(
0.5, 0, 0, 0.5,
0, -0.5, 0, 0.5,
0, 0, 0.5, 0.5,
0, 0, 0, 1
).multiply(mirrorCam.projectionMatrix)
.multiply(mirrorCam.matrixWorldInverse);
uMirrorTexMat.value.copy(_mirTM);
// the floor must not sample itself while being drawn into the mirror
floor.visible = false;
renderer.setRenderTarget(mirrorRT);
renderer.render(scene, mirrorCam);
renderer.setRenderTarget(null);
floor.visible = true;
}
const wetOK = true;
if (wetOK) {
// Distort the reflection lookup with drifting noise — this is what makes
// it read as a wet, uneven surface instead of polished glass.
const rippleUV = positionWorld.xz.mul(uWetScale);
const n1 = mx_noise_float(vec3(rippleUV, time.mul(uWetSpeed)));
const n2 = mx_noise_float(vec3(rippleUV.yx.mul(1.7), time.mul(uWetSpeed).add(11.0)));
// Blur: scatter the mirror lookup with high-frequency noise. Larger
// scatter reads as a softer reflection.
const jitter = mx_noise_float(
vec3(positionWorld.xz.mul(90.0), time.mul(0.5))
);
const jitter2 = mx_noise_float(
vec3(positionWorld.zx.mul(90.0).add(31.7), time.mul(0.5))
);
const mirClip = uMirrorTexMat.mul(vec4(positionWorld, 1.0));
const mirUV = mirClip.xy.div(mirClip.w)
.add(vec2(n1, n2).mul(uWetDistort.mul(0.06)))
.add(vec2(jitter, jitter2).mul(uWetBlur.mul(0.045)));
const rBase = texture(mirrorRT.texture, mirUV);
// fresnel: reflections strengthen at grazing angles, like real wet ground
const facing = abs(dot(normalView, positionViewDirection));
const fres = pow(oneMinus(facing), uWetFresnel);
// fade the mirror out toward the disc edge so it blends into the backdrop
const radial = smoothstep(1.0, 0.25, length(uv().sub(0.5).mul(2.0)));
// Add the reflection ON TOP of the floor colour rather than blending
// toward it.
floorMat.colorNode = mix(
color(0x63808f),
rBase.rgb.mul(uWetTint),
fres.mul(uWetAmount).mul(radial).clamp(0, 1)
);
// wet ground is smoother than dry
floorMat.roughnessNode = mix(float(0.95), uWetRough,
uWetAmount.mul(radial).clamp(0, 1));
}
const floor = new THREE.Mesh(new THREE.CircleGeometry(9, 64), floorMat);
floor.rotation.x = -Math.PI / 2;
floor.position.y = -1.14;
floor.receiveShadow = true;
scene.add(floor);
// ═══════════════════════════════════════════════════════════════════
// light(s).
// ═══════════════════════════════════════════════════════════════════
const spot = new THREE.SpotLight(0xffffff, 182.61);
spot.position.set(1.4, 4.2, 1.8);
spot.angle = 0.10;
spot.penumbra = 1.0;
spot.decay = 2;
spot.distance = 0;
spot.castShadow = true;
spot.shadow.mapType = THREE.HalfFloatType; // HDR caustics
spot.shadow.mapSize.set(2048, 2048);
spot.shadow.camera.near = 0.5;
spot.shadow.camera.far = 15;
spot.shadow.intensity = 0.98;
spot.shadow.bias = -0.0002;
spot.target.position.set(0, -1, 0);
scene.add(spot, spot.target);
const fill = new THREE.DirectionalLight(0xbcd6e6, 0.45);
fill.position.set(-3, 1, 2);
scene.add(fill);
// ═══════════════════════════════════════════════════════════════════
// lens flare(s).
// ═══════════════════════════════════════════════════════════════════
const flareScene = new THREE.Scene();
const flareCam = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
function radialTex(size, stops) {
const c = document.createElement('canvas');
c.width = c.height = size;
const ctx = c.getContext('2d');
const g = ctx.createRadialGradient(size/2, size/2, 0, size/2, size/2, size/2);
for (const [p, col] of stops) g.addColorStop(p, col);
ctx.fillStyle = g;
ctx.fillRect(0, 0, size, size);
const t = new THREE.CanvasTexture(c);
t.colorSpace = THREE.SRGBColorSpace;
return t;
}
const texGlow = radialTex(256, [
[0, 'rgba(255,255,255,1)'], [0.25, 'rgba(226,240,255,0.5)'],
[0.6, 'rgba(180,214,255,0.12)'], [1, 'rgba(150,190,255,0)']
]);
function hexTex(size, rgba, ring) {
const c = document.createElement('canvas');
c.width = c.height = size;
const ctx = c.getContext('2d');
const r = size * 0.42, cx = size / 2;
ctx.beginPath();
for (let i = 0; i < 6; i++) {
const a = (i / 6) * Math.PI * 2 + Math.PI / 6;
const x = cx + Math.cos(a) * r, y = cx + Math.sin(a) * r;
i ? ctx.lineTo(x, y) : ctx.moveTo(x, y);
}
ctx.closePath();
if (ring) { ctx.strokeStyle = rgba; ctx.lineWidth = size * 0.05; ctx.stroke(); }
else { ctx.fillStyle = rgba; ctx.fill(); }
const t = new THREE.CanvasTexture(c);
t.colorSpace = THREE.SRGBColorSpace;
return t;
}
function streakTex(w, h) {
const c = document.createElement('canvas');
c.width = w; c.height = h;
const ctx = c.getContext('2d');
const g = ctx.createLinearGradient(0, 0, w, 0);
g.addColorStop(0, 'rgba(90,150,255,0)');
g.addColorStop(0.35, 'rgba(150,200,255,0.35)');
g.addColorStop(0.5, 'rgba(235,248,255,0.95)');
g.addColorStop(0.65, 'rgba(150,200,255,0.35)');
g.addColorStop(1, 'rgba(90,150,255,0)');
ctx.fillStyle = g;
ctx.fillRect(0, 0, w, h);
const t = new THREE.CanvasTexture(c);
t.colorSpace = THREE.SRGBColorSpace;
return t;
}
function burstTex(size) {
const c = document.createElement('canvas');
c.width = c.height = size;
const ctx = c.getContext('2d');
const cx = size / 2;
const ray = (ang, len, wid, a) => {
ctx.save(); ctx.translate(cx, cx); ctx.rotate(ang);
const g = ctx.createLinearGradient(-len, 0, len, 0);
g.addColorStop(0, 'rgba(255,255,255,0)');
g.addColorStop(0.5, `rgba(255,255,255,${a})`);
g.addColorStop(1, 'rgba(255,255,255,0)');
ctx.fillStyle = g;
ctx.fillRect(-len, -wid / 2, len * 2, wid);
ctx.restore();
};
ray(0, size * 0.48, 2.5, 0.9);
ray(Math.PI / 2, size * 0.48, 2.5, 0.9);
ray(Math.PI / 4, size * 0.26, 1.6, 0.35);
ray(-Math.PI / 4, size * 0.26, 1.6, 0.35);
ray(Math.PI / 8, size * 0.34, 1.2, 0.22);
ray(-Math.PI / 8, size * 0.34, 1.2, 0.22);
const t = new THREE.CanvasTexture(c);
t.colorSpace = THREE.SRGBColorSpace;
return t;
}
function flareQuad(tex, w, h, color, opacity) {
const Basic = THREE.MeshBasicNodeMaterial || THREE.MeshBasicMaterial;
const m = new THREE.Mesh(
new THREE.PlaneGeometry(1, 1),
new Basic({
map: tex, color: new THREE.Color(color),
transparent: true, opacity,
blending: THREE.AdditiveBlending,
depthTest: false, depthWrite: false
})
);
m.scale.set(w, h, 1);
m.userData.baseScale = [w, h];
m.userData.baseOpacity = opacity;
flareScene.add(m);
return m;
}
const texHexA = hexTex(128, 'rgba(255,180,120,0.55)', false);
const texHexB = hexTex(128, 'rgba(120,200,255,0.5)', false);
const texRing = hexTex(128, 'rgba(190,230,255,0.6)', true);
const texStreak = streakTex(512, 8);
const texBurst = burstTex(256);
const elGlow = flareQuad(texGlow, 0.55, 0.55, 0xdcefff, 0.85);
const elBurst = flareQuad(texBurst, 0.75, 0.75, 0xffffff, 0.75);
const elStreak = flareQuad(texStreak, 1.70, 0.05, 0x9fc8ff, 0.55);
const ghosts = [
{ el: flareQuad(texHexA, 0.11, 0.11, 0xffb478, 0.30), k: 0.32 },
{ el: flareQuad(texGlow, 0.07, 0.07, 0xff9a6a, 0.22), k: 0.55 },
{ el: flareQuad(texHexB, 0.19, 0.19, 0x7ec8ff, 0.24), k: 0.85 },
{ el: flareQuad(texRing, 0.34, 0.34, 0xbfe4ff, 0.30), k: 1.18 },
{ el: flareQuad(texHexA, 0.13, 0.13, 0xffd0a0, 0.20), k: 1.45 },
{ el: flareQuad(texGlow, 0.26, 0.26, 0x8fd8ff, 0.16), k: 1.75 }
];
const flareAnchor = new THREE.Vector3();
const flareOffset = new THREE.Vector3(0.34, 0.86, 0.30);
const flareNDC = new THREE.Vector3();
const flareSmooth = { x: 0, y: 0, vis: 0, init: false };
const camDir = new THREE.Vector3();
const toLight = new THREE.Vector3();
// ═══════════════════════════════════════════════════════════════════
// smoothstep easing — no hard clamping edges
// ═══════════════════════════════════════════════════════════════════
const ease = (e0, e1, x) => {
const t = Math.min(1, Math.max(0, (x - e0) / (e1 - e0)));
return t * t * (3 - 2 * t);
};
function updateFlare(t, dt) {
rig.updateMatrixWorld();
flareAnchor.setFromMatrixPosition(rig.matrixWorld).add(flareOffset);
if (uRingWobble.value > 0) {
ring.updateMatrixWorld();
_flrInv.copy(ring.matrixWorld).invert();
_flrLocal.copy(flareAnchor).applyMatrix4(_flrInv);
const d = rippleJS(_flrLocal) * uRingWobble.value;
if (d !== 0) {
const cl = Math.hypot(_flrLocal.x, _flrLocal.z) || 1;
_flrDir.set(
_flrLocal.x - (_flrLocal.x / cl) * 0.78,
_flrLocal.y,
_flrLocal.z - (_flrLocal.z / cl) * 0.78
).normalize();
_flrLocal.addScaledVector(_flrDir, d);
flareAnchor.copy(_flrLocal).applyMatrix4(ring.matrixWorld);
}
}
flareNDC.copy(flareAnchor).project(camera);
const aspectR = innerWidth / innerHeight;
const tx = flareNDC.x * aspectR, ty = flareNDC.y;
// is the light in front of the camera at all?
camera.getWorldDirection(camDir);
toLight.copy(flareAnchor).sub(camera.position).normalize();
const facing = camDir.dot(toLight); // 1 = dead ahead
// Eased visibility. Ranges are generous: the flare only fades once the
// source is genuinely leaving the frame or swinging behind the camera.
const edgeX = ease(2.2, 1.0, Math.abs(flareNDC.x));
const edgeY = ease(2.2, 1.0, Math.abs(flareNDC.y));
const front = ease(-0.1, 0.25, facing);
const targetVis = edgeX * edgeY * front * params.flareStrength;
// temporal smoothing — framerate independent, kills the per-frame jitter
if (!flareSmooth.init) {
flareSmooth.x = tx; flareSmooth.y = ty; flareSmooth.vis = targetVis;
flareSmooth.init = true;
}
const posLag = 1 - Math.pow(0.0001, dt); // fast but smoothed
const visLag = 1 - Math.pow(0.00005, dt); // slightly softer for opacity
flareSmooth.x += (tx - flareSmooth.x) * posLag;
flareSmooth.y += (ty - flareSmooth.y) * posLag;
flareSmooth.vis += (targetVis - flareSmooth.vis) * visLag;
const x = flareSmooth.x, y = flareSmooth.y, vis = flareSmooth.vis;
const twinkle = 0.94 + Math.sin(t * 2.6) * 0.04 + Math.sin(t * 6.1) * 0.02;
const place = (el, px, py, sc, op) => {
el.position.set(px, py, 0);
const [bw, bh] = el.userData.baseScale;
el.scale.set(bw * sc, bh * sc, 1);
el.material.opacity = el.userData.baseOpacity * op;
el.visible = op > 0.002;
};
place(elGlow, x, y, 1 + Math.sin(t * 1.9) * 0.03, vis * twinkle);
place(elBurst, x, y, 1 + Math.sin(t * 1.4) * 0.04, vis * twinkle * 0.9);
place(elStreak, x, y, 1, vis * twinkle * 0.8);
elBurst.rotation.z = Math.sin(t * 0.1) * 0.03;
for (const g of ghosts) {
// ghosts ride the axis from the light through screen centre
place(g.el, -x * g.k, -y * g.k, 1, vis);
}
}
// ═══════════════════════════════════════════════════════════════════
// orbit camera
// ═══════════════════════════════════════════════════════════════════
const target = new THREE.Vector3(0, -0.06, 0);
const sph = new THREE.Spherical().setFromVector3(
camera.position.clone().sub(target)
);
let lastFraming = null;
let paramsReady = false; // true once the params object exists
let pane = null;
const PHI_MAX = 1.229 + 0.4521739130; // orbit ceiling: rotate V <= 0.4521739130
const applyCamera = () => {
sph.phi = Math.max(0.05, Math.min(PHI_MAX, sph.phi));
sph.radius = Math.max(2.0, Math.min(14.0, sph.radius));
camera.position.setFromSpherical(sph).add(target);
camera.lookAt(target);
camera.updateMatrixWorld(true);
syncCameraParams();
};
let syncingCamera = false;
function syncCameraParams() {
if (!paramsReady || syncingCamera) return;
syncingCamera = true;
params.startTheta = sph.theta - (-0.522);
params.startPhi = sph.phi - 1.229;
params.startShiftX = target.x;
params.startShiftY = target.y - (-0.06);
const fovY = camera.fov * Math.PI / 180;
const fovX = 2 * Math.atan(Math.tan(fovY / 2) * (innerWidth / innerHeight));
const visW = 2 * sph.radius * Math.tan(fovX / 2);
const visH = 2 * sph.radius * Math.tan(fovY / 2);
params.startFill = 2.0 / Math.min(visW, visH);
lastFraming = [params.startFill, params.startTheta, params.startPhi,
params.startShiftX, params.startShiftY].join();
if (pane) pane.refresh();
syncingCamera = false;
}
// ═══════════════════════════════════════════════════════════════════
// startup framing.
// ═══════════════════════════════════════════════════════════════════
function frameStart() {
// Guard the write-back: applyCamera() below calls syncCameraParams(),
// which would immediately recompute the params from the camera we are
// in the middle of setting — rounding the saved values back at us.
syncingCamera = true;
const P = paramsReady ? params : null;
// Square onto the hole by default (theta -29.9deg, phi 70.4deg is the
// exact hole axis), with offsets so the view can be nudged precisely.
sph.theta = -0.522 + (P ? P.startTheta : 0);
sph.phi = 1.229 + (P ? P.startPhi : 0);
// vertical framing: shifts the ring up/down in frame
target.y = -0.06 + (P ? P.startShiftY : 0);
target.x = P ? P.startShiftX : 0;
// Distance is derived from the viewport so the ring keeps the same
// on-screen size regardless of window shape, rather than being a fixed
// number tuned to one aspect ratio.
const aspect = innerWidth / innerHeight;
const fovY = camera.fov * Math.PI / 180;
const fovX = 2 * Math.atan(Math.tan(fovY / 2) * aspect);
const D = 2.0; // ring diameter (outer radius 1.0)
const fillW = paramsReady ? params.startFill : 0.3688989901;
// distance so the ring spans fillW of the width...
const dW = D / (2 * fillW * Math.tan(fovX / 2));
// ...and never more than fillW of the height either (matters on wide
// windows, where fitting purely by width would overflow vertically)
const dH = D / (2 * fillW * Math.tan(fovY / 2));
sph.radius = Math.max(2.0, Math.min(14.0, Math.max(dW, dH)));
applyCamera();
syncingCamera = false;
// keep the change-detector aligned with the values we just applied, so
// the next unrelated slider tweak doesn't see a stale key and re-frame
if (paramsReady) {
lastFraming = [params.startFill, params.startTheta, params.startPhi,
params.startShiftX, params.startShiftY].join();
}
}
applyCamera();
const pointers = new Map();
let lastPinch = 0;
const el = renderer.domElement;
el.addEventListener('pointerdown', e => {
el.setPointerCapture(e.pointerId);
pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });
if (pointers.size === 2) {
const [a, b] = [...pointers.values()];
lastPinch = Math.hypot(a.x - b.x, a.y - b.y);
}
});
el.addEventListener('pointermove', e => {
if (!pointers.has(e.pointerId)) return;
const prev = pointers.get(e.pointerId);
const dx = e.clientX - prev.x, dy = e.clientY - prev.y;
pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });
if (pointers.size === 1) {
sph.theta -= dx * 0.005;
sph.phi -= dy * 0.005;
cameraDirty = true; // committed once per frame, in the render loop
} else if (pointers.size === 2) {
const [a, b] = [...pointers.values()];
const pinch = Math.hypot(a.x - b.x, a.y - b.y);
if (lastPinch > 0) {
sph.radius *= lastPinch / pinch;
cameraDirty = true;
}
lastPinch = pinch;
}
});
const endPointer = e => { pointers.delete(e.pointerId); lastPinch = 0; };
el.addEventListener('pointerup', endPointer);
el.addEventListener('pointercancel', endPointer);
el.addEventListener('wheel', e => {
e.preventDefault();
sph.radius *= 1 + e.deltaY * 0.001;
cameraDirty = true;
}, { passive: false });
// ═══════════════════════════════════════════════════════════════════
// param(s)
// ═══════════════════════════════════════════════════════════════════
const params = {
color: '#ffffff',
transmission: glass.transmission,
thickness: glass.thickness,
roughness: glass.roughness,
metalness: glass.metalness,
ior: glass.ior,
dispersion: glass.dispersion,
iridescence: glass.iridescence,
iridescenceIOR: glass.iridescenceIOR,
iridThicknessMin: 120,
iridThicknessMax: 480,
clearcoat: glass.clearcoat,
clearcoatRoughness: glass.clearcoatRoughness,
sheen: 0,
sheenRoughness: 1,
sheenColor: '#ffffff',
specularIntensity: glass.specularIntensity,
specularColor: '#ffffff',
attenuationColor: '#dff2ff',
attenuationDistance: glass.attenuationDistance,
envMapIntensity: glass.envMapIntensity,
exposure: renderer.toneMappingExposure,
edgeStrength: uFresnelStrength.value,
edgePower: uFresnelPower.value,
edgeSpeed: uRainbowSpeed.value,
// caustics
caustics: true,
showRing: true,
floorCaustics: true,
envSat: 1.0,
envBright: 1.0,
envBands: 5.0,
envColorA: '#2b6bff',
envColorB: '#ff3c8a',
envColorC: '#18e0d8',
envCausticAmt: 2.99,
causticOcclusion: uCausticOcclusion.value,
causticIntensity: uCausticIntensity.value,
causticScale: uCausticScale.value,
causticSpeed: uCausticSpeed.value,
causticChroma: uChroma.value,
causticColor: '#eaf6ff',
spotIntensity: spot.intensity,
spotAngle: spot.angle,
// scene
wetFloor: true,
wetAmount: 0.95,
wetBlur: 0.15,
wetDistort: 0.22,
wetScale: 2.2,
wetSpeed: 0.12,
wetFresnel: 2.4,
wetRough: 0.12,
wetTint: '#d6c7f9',
startFill: 0.3688989901,
startTheta: 0.626,
startPhi: 0.3799793782,
startShiftX: 0.0,
startShiftY: 0.0,
lockFraming: false,
fov: 38,
autoSway: true,
lensFlare: true,
flareStrength: 1.0,
floorColor: '#63808f',
// golden cube swarm
swarmEnabled: true,
soundEnabled: true,
soundVolume: 0.5,
ringRipple: true,
ringWobble: 0.05,
swarmSpeed: 0.1,
swarmScatter: 0.21,
swarmSize: 0.64,
swarmMouse: true,
swarmMouseRadius: 0.55,
swarmMouseForce: 45,
swarmGlassMode: 'custom',
swarmXray: false,
swarmXrayAmt: 0.25,
swarmXrayColor: '#d99a35',
swarmRefract: true,
swarmRefractAmt: 2.0,
swarmRefractShift: 0.22,
swarmRefractChroma: 0.32,
swarmRefractSpectral: 0.25,
swarmRefractBlur: 0.15,
swarmRefractSat: 1.4,
swarmRefractFlip: false
};
paramsReady = true;
frameStart();
let lastEnvKey = null;
let lastGlassKey = null;
let camReadoutFn = null;
let envTimer = null;
let envPrimed = false; // first env bake runs immediately, not debounced
function applyParams() {
if (syncingCamera) return;
glass.color.set(params.color);
glass.transmission = params.transmission;
glass.thickness = params.thickness;
glass.roughness = params.roughness;
glass.metalness = params.metalness;
glass.ior = params.ior;
glass.dispersion = params.dispersion;
glass.iridescence = params.iridescence;
glass.iridescenceIOR = params.iridescenceIOR;
glass.iridescenceThicknessRange = [params.iridThicknessMin, params.iridThicknessMax];
glass.clearcoat = params.clearcoat;
glass.clearcoatRoughness = params.clearcoatRoughness;
glass.sheen = params.sheen;
glass.sheenRoughness = params.sheenRoughness;
glass.sheenColor.set(params.sheenColor);
glass.specularIntensity = params.specularIntensity;
glass.specularColor.set(params.specularColor);
glass.attenuationColor.set(params.attenuationColor);
glass.attenuationDistance = params.attenuationDistance;
glass.envMapIntensity = params.envMapIntensity;
const glassKey = [params.color, params.transmission, params.thickness,
params.roughness, params.metalness, params.ior, params.dispersion,
params.iridescence, params.iridescenceIOR, params.iridThicknessMin,
params.iridThicknessMax, params.clearcoat, params.clearcoatRoughness,
params.sheen, params.sheenRoughness, params.sheenColor,
params.specularIntensity, params.specularColor, params.attenuationColor,
params.attenuationDistance, params.envMapIntensity].join();
if (glassKey !== lastGlassKey) {
lastGlassKey = glassKey;
glass.needsUpdate = true;
}
renderer.toneMappingExposure = params.exposure;
uFresnelStrength.value = params.edgeStrength;
uFresnelPower.value = params.edgePower;
uRainbowSpeed.value = params.edgeSpeed;
ring.castShadow = params.caustics;
// ghost mode: keep the caster in the shadow pass, hide it from the camera
const wantGhost = !params.showRing;
const isGhost = glass.outputNode !== null;
if (wantGhost !== isGhost) {
glass.outputNode = wantGhost ? vec4(0.0) : null;
glass.depthWrite = !wantGhost;
glass.needsUpdate = true;
}
const envKey = [params.envSat, params.envBright, params.envBands,
params.envColorA, params.envColorB, params.envColorC,
params.envCausticAmt, params.causticScale,
params.causticChroma, params.causticIntensity,
params.causticOcclusion, params.causticColor].join();
if (envKey !== lastEnvKey) {
lastEnvKey = envKey;
envState.sat = params.envSat;
envState.bright = params.envBright;
envState.bands = params.envBands;
envState.causticAmt = params.envCausticAmt;
// shared with the floor projection — one source of truth
envState.causticScale = params.causticScale * 2.3;
envState.causticChroma = params.causticChroma;
envState.causticIntensity = params.causticIntensity;
envState.causticOcclusion = params.causticOcclusion;
envState.causticColor.set(params.causticColor);
envColorA.set(params.envColorA);
envColorB.set(params.envColorB);
envColorC.set(params.envColorC);
// The 120ms debounce keeps slider drags smooth, but on the FIRST apply
// it would leave the scene showing a stale environment. Bake at once.
clearTimeout(envTimer);
if (envPrimed) {
envTimer = setTimeout(() => refreshEnv().catch(e => console.warn("env bake failed:", e)), 120);
} else {
envPrimed = true;
refreshEnv().catch(e => console.warn("env bake failed:", e));
}
}
if (floor.receiveShadow !== params.floorCaustics) {
floor.receiveShadow = params.floorCaustics;
floorMat.needsUpdate = true;
}
uCausticOcclusion.value = params.causticOcclusion;
uCausticIntensity.value = params.causticIntensity;
uCausticScale.value = params.causticScale;
uCausticSpeed.value = params.causticSpeed;
uChroma.value = params.causticChroma;
uCausticColor.value.set(params.causticColor);
uIorShadow.value = params.ior; // keep shadow refraction in sync with IOR
spot.intensity = params.spotIntensity;
spot.angle = params.spotAngle;
floorMat.color.set(params.floorColor);
const framingKey = [params.startFill, params.startTheta, params.startPhi,
params.startShiftX, params.startShiftY].join();
if (framingKey !== lastFraming) {
lastFraming = framingKey;
frameStart();
}
if (camera.fov !== params.fov) {
camera.fov = params.fov;
camera.updateProjectionMatrix();
}
uWetAmount.value = params.wetFloor ? params.wetAmount : 0;
uWetBlur.value = params.wetBlur;
uWetDistort.value = params.wetDistort;
uWetScale.value = params.wetScale;
uWetSpeed.value = params.wetSpeed;
uWetFresnel.value = params.wetFresnel;
uWetRough.value = params.wetRough;
uWetTint.value.set(params.wetTint);
flareScene.visible = params.lensFlare;
uRingWobble.value = params.ringRipple ? params.ringWobble : 0;
swarm.visible = params.swarmEnabled;
swarmState.speed = params.swarmSpeed;
swarmState.scatter = params.swarmScatter;
swarmState.size = params.swarmSize;
swarmState.mouse = params.swarmMouse;
swarmState.mouseRadius = params.swarmMouseRadius;
swarmState.mouseForce = params.swarmMouseForce;
// glass mode: physical (v54 backdrop dispersion) vs custom (synced)
const physGlass = params.swarmGlassMode === 'physical';
if (cubeMat.transparent !== !physGlass) {
cubeMat.transparent = !physGlass;
cubeMat.needsUpdate = true;
}
swarm.renderOrder = physGlass ? 0 : 6;
swarmGhost.visible = params.swarmEnabled && params.swarmXray && !physGlass;
ghostMat.opacity = params.swarmXrayAmt;
ghostMat.color.set(params.swarmXrayColor);
uCubeIor.value = params.ior; // refracted cubes bend with the glass IOR
// 'refract in glass' now works in BOTH modes: stacked on physical it
// reaches cubes the backdrop can't see, softening the dead angles
uCubeRefrAmt.value = params.swarmRefract ? params.swarmRefractAmt : 0;
uCubeRefrShift.value = params.swarmRefractShift;
uCubeRefrChroma.value = params.swarmRefractChroma;
uCubeSpectral.value = params.swarmRefractSpectral;
uCubeRefrBlur.value = params.swarmRefractBlur;
uCubeRefrSat.value = params.swarmRefractSat;
uCubeFlip.value = params.swarmRefractFlip ? 1 : 0;
}
async function loadPane() {
const urls = [
'https://cdn.jsdelivr.net/npm/tweakpane@4.0.5/dist/tweakpane.min.js',
'https://unpkg.com/tweakpane@4.0.5/dist/tweakpane.min.js',
'https://esm.sh/tweakpane@4.0.5'
];
let Pane = null;
for (const url of urls) {
try {
({ Pane } = await import(/* @vite-ignore */ url));
if (Pane) break;
} catch (_) { /* try next CDN */ }
}
if (!Pane) {
document.getElementById('tag').textContent +=
' · tweakpane CDN unreachable — scene runs without panel';
return;
}
pane = new Pane({
container: document.getElementById('pane-container'),
title: 'MeshPhysicalNodeMaterial · v102'
});
pane.on('change', applyParams);
const failed = [];
const bind = (folder, key, opts) => {
try {
const b = folder.addBinding(params, key, opts);
b.on('change', applyParams);
} catch (err) {
failed.push(key);
console.error('pane binding failed:', key, err);
}
};
const fGlass = pane.addFolder({ title: 'glass' });
bind(fGlass, 'color');
bind(fGlass, 'transmission', { min: 0, max: 1 });
bind(fGlass, 'thickness', { min: 0, max: 5 });
bind(fGlass, 'roughness', { min: 0, max: 1 });
bind(fGlass, 'metalness', { min: 0, max: 1 });
bind(fGlass, 'ior', { min: 1, max: 2.333 });
bind(fGlass, 'dispersion', { min: 0, max: 20 });
const fCaustics = pane.addFolder({ title: 'caustics (floor + baked into glass)' });
bind(fCaustics, 'caustics');
bind(fCaustics, 'showRing', { label: 'show ring' });
bind(fCaustics, 'floorCaustics', { label: 'floor caustics' });
bind(fCaustics, 'envCausticAmt', { label: 'caustics in glass', min: 0, max: 5 });
const fEnv = pane.addFolder({ title: 'refracted environment (invisible)' });
bind(fEnv, 'envSat', { label: 'colour amount', min: 0, max: 3 });
bind(fEnv, 'envBright', { label: 'brightness', min: 0.2, max: 3 });
bind(fEnv, 'envBands', { label: 'bands', min: 1, max: 12, step: 1 });
bind(fEnv, 'envColorA', { label: 'colour A' });
bind(fEnv, 'envColorB', { label: 'colour B' });
bind(fEnv, 'envColorC', { label: 'colour C' });
bind(fCaustics, 'causticOcclusion', { min: 0, max: 20 });
bind(fCaustics, 'causticIntensity', { min: 0, max: 80 });
bind(fCaustics, 'causticScale', { min: 0.5, max: 10 });
bind(fCaustics, 'causticSpeed', { min: 0, max: 0.5 });
bind(fCaustics, 'causticChroma', { min: 0, max: 0.08 });
bind(fCaustics, 'causticColor');
bind(fCaustics, 'spotIntensity', { min: 0, max: 200 });
bind(fCaustics, 'spotAngle', { min: 0.1, max: 1.2 });
const fIrid = pane.addFolder({ title: 'iridescence', expanded: false });
bind(fIrid, 'iridescence', { min: 0, max: 1 });
bind(fIrid, 'iridescenceIOR', { min: 1, max: 2.5 });
bind(fIrid, 'iridThicknessMin', { min: 0, max: 1200, step: 1 });
bind(fIrid, 'iridThicknessMax', { min: 0, max: 1200, step: 1 });
const fCoat = pane.addFolder({ title: 'clearcoat / sheen / specular', expanded: false });
bind(fCoat, 'clearcoat', { min: 0, max: 1 });
bind(fCoat, 'clearcoatRoughness', { min: 0, max: 1 });
bind(fCoat, 'sheen', { min: 0, max: 1 });
bind(fCoat, 'sheenRoughness', { min: 0, max: 1 });
bind(fCoat, 'sheenColor');
bind(fCoat, 'specularIntensity', { min: 0, max: 2 });
bind(fCoat, 'specularColor');
const fVol = pane.addFolder({ title: 'volume', expanded: false });
bind(fVol, 'attenuationColor');
bind(fVol, 'attenuationDistance', { min: 0.1, max: 10 });
const fEdge = pane.addFolder({ title: 'rainbow edge (tsl)', expanded: false });
bind(fEdge, 'edgeStrength', { min: 0, max: 1 });
bind(fEdge, 'edgePower', { min: 0.5, max: 8 });
bind(fEdge, 'edgeSpeed', { min: 0, max: 0.5 });
const fWet = pane.addFolder({ title: 'wet floor' });
bind(fWet, 'wetFloor', { label: 'enabled' });
bind(fWet, 'wetAmount', { label: 'reflectivity', min: 0, max: 1 });
bind(fWet, 'wetBlur', { label: 'blurriness', min: 0, max: 1.5 });
bind(fWet, 'wetDistort', { label: 'ripple distort', min: 0, max: 1.5 });
bind(fWet, 'wetScale', { label: 'ripple scale', min: 0.3, max: 8 });
bind(fWet, 'wetSpeed', { label: 'ripple speed', min: 0, max: 0.6 });
bind(fWet, 'wetFresnel', { label: 'fresnel', min: 0.5, max: 6 });
bind(fWet, 'wetRough', { label: 'surface roughness', min: 0.05, max: 0.95 });
bind(fWet, 'wetTint', { label: 'tint' });
const fCam = pane.addFolder({ title: 'camera framing' });
bind(fCam, 'fov', { label: 'field of view', min: 15, max: 75 });
bind(fCam, 'startFill', { label: 'ring fills', min: 0.25, max: 0.95 });
bind(fCam, 'startTheta', { label: 'rotate H', min: -0.8, max: 0.8 });
bind(fCam, 'startPhi', { label: 'rotate V', min: -0.8, max: 0.4521739130 });
bind(fCam, 'startShiftX', { label: 'shift X', min: -1.5, max: 1.5 });
bind(fCam, 'startShiftY', { label: 'shift Y', min: -1.5, max: 1.5 });
bind(fCam, 'lockFraming', { label: 'refit on resize' });
fCam.addButton({ title: 'reset to start view' }).on('click', () => {
frameStart();
});
// Live readout of the current view. Updated every frame from the render
// loop (see camReadoutFn), so dragging to orbit and scrolling to zoom
// both update it immediately — read the numbers off and pass them on.
try {
const camReadout = fCam.addBlade({ view: 'text', label: 'current view',
parse: v => v, value: '', disabled: true });
camReadoutFn = () => {
camReadout.value =
'th ' + (sph.theta + 0.522).toFixed(3) +
' ph ' + (sph.phi - 1.229).toFixed(3) +
' fill ' + (2.0 / (2 * sph.radius *
Math.tan(2 * Math.atan(Math.tan(camera.fov * Math.PI / 360) *
(innerWidth / innerHeight)) / 2))).toFixed(3);
};
} catch (err) {
camReadoutFn = () => {
const tg = document.getElementById('tag');
if (tg) tg.textContent = 'v35 — view: th ' +
(sph.theta + 0.522).toFixed(3) + ' ph ' + (sph.phi - 1.229).toFixed(3) +
' r ' + sph.radius.toFixed(2);
};
}
const fSwarm = pane.addFolder({ title: 'golden cube swarm' });
bind(fSwarm, 'swarmEnabled', { label: 'enabled' });
bind(fSwarm, 'swarmGlassMode', { label: 'glass mode',
options: { 'custom (synced)': 'custom', 'physical (v54)': 'physical' } });
bind(fSwarm, 'swarmSpeed', { label: 'speed', min: 0, max: 0.2 });
bind(fSwarm, 'swarmScatter', { label: 'spread', min: 0, max: 0.6 });
bind(fSwarm, 'swarmSize', { label: 'cube size', min: 0.05, max: 2.5 });
bind(fSwarm, 'swarmMouse', { label: 'mouse repel' });
bind(fSwarm, 'swarmMouseRadius', { label: 'repel radius', min: 0.1, max: 1.5 });
bind(fSwarm, 'swarmMouseForce', { label: 'repel force', min: 0, max: 150 });
bind(fSwarm, 'swarmXray', { label: 'x-ray through glass' });
bind(fSwarm, 'swarmXrayAmt', { label: 'x-ray strength', min: 0, max: 1 });
bind(fSwarm, 'swarmXrayColor', { label: 'x-ray gold tint' });
bind(fSwarm, 'swarmRefract', { label: 'refract in glass' });
bind(fSwarm, 'swarmRefractAmt', { label: 'refraction amount', min: 0, max: 5 });
bind(fSwarm, 'swarmRefractShift', { label: 'refraction shift', min: 0, max: 0.5 });
bind(fSwarm, 'swarmRefractChroma', { label: 'refr. dispersion', min: 0, max: 0.6 });
bind(fSwarm, 'swarmRefractSpectral', { label: 'refr. iridescence', min: 0, max: 1 });
bind(fSwarm, 'swarmRefractBlur', { label: 'refr. blur', min: 0, max: 1.5 });
bind(fSwarm, 'swarmRefractSat', { label: 'refr. saturation', min: 0, max: 3 });
bind(fSwarm, 'swarmRefractFlip', { label: 'flip refr. Y' });
const fSound = pane.addFolder({ title: 'ambient sound (click once to start)' });
bind(fSound, 'soundEnabled', { label: 'enabled' });
bind(fSound, 'soundVolume', { label: 'volume', min: 0, max: 1 });
const fRipple = pane.addFolder({ title: 'ring ripple (hover the glass)' });
bind(fRipple, 'ringRipple', { label: 'enabled' });
bind(fRipple, 'ringWobble', { label: 'wobble height', min: 0, max: 0.2 });
const fScene = pane.addFolder({ title: 'scene', expanded: false });
bind(fScene, 'envMapIntensity', { min: 0, max: 4 });
bind(fScene, 'exposure', { min: 0.2, max: 3 });
bind(fScene, 'floorColor');
bind(fScene, 'autoSway');
bind(fScene, 'lensFlare', { label: 'lens flare' });
bind(fScene, 'flareStrength', { label: 'flare strength', min: 0, max: 2 });
if (failed.length) {
document.getElementById('tag').textContent +=
' · pane bindings failed: ' + failed.join(', ');
}
applyParams();
}
// ═══════════════════════════════════════════════════════════════════
// resize + loop
// ═══════════════════════════════════════════════════════════════════
addEventListener('resize', () => {
camera.aspect = innerWidth / innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(innerWidth, innerHeight);
cubeRT.setSize(Math.floor(innerWidth * 0.5), Math.floor(innerHeight * 0.5));
renderer.getDrawingBufferSize(_mirDBS);
mirrorRT.setSize(_mirDBS.x, _mirDBS.y);
aspect.value = innerWidth / innerHeight;
if (params && params.lockFraming) frameStart();
});
const clock = new THREE.Clock();
let lastT = 0;
let cameraDirty = false; // orbit input pending, applied at render time
const baseY = rig.rotation.y, baseX = rig.rotation.x;
async function start() {
await renderer.init();
rendererReady = true;
await refreshEnv();
applyParams();
frameStart();
scene.updateMatrixWorld(true);
camera.updateMatrixWorld(true);
syncingCamera = true;
const warmRadius = sph.radius;
for (let i = 0; i < 4; i++) {
sph.radius = warmRadius * (i % 2 === 0 ? 1.0005 : 1.0);
applyCamera();
scene.updateMatrixWorld(true);
renderer.render(scene, camera);
await new Promise(r => requestAnimationFrame(r));
}
sph.radius = warmRadius;
applyCamera();
syncingCamera = false;
renderer.render(scene, camera);
document.getElementById('loader').classList.add('hidden');
renderer.setAnimationLoop(() => {
const t = clock.getElapsedTime();
const dt = Math.min(0.1, Math.max(0.0001, t - lastT));
lastT = t;
if (params.autoSway) {
rig.rotation.y = baseY + Math.sin(t * 0.21) * 0.10;
rig.rotation.x = baseX + Math.sin(t * 0.15 + 1.3) * 0.03;
}
if (params.lensFlare) updateFlare(t, dt);
if (params.swarmEnabled) updateSwarm(t, dt);
for (let i = 0; i < RIPPLE_MAX; i++) ripAgeArr[i] += dt;
if (audioReady) {
const an = actx.currentTime;
let en = 0;
for (let i = 0; i < RIPPLE_MAX; i++) {
if (ripAgeArr[i] < 4) en += ripStrArr[i] * Math.exp(-2.6 * ripAgeArr[i]);
}
padFilter.frequency.setTargetAtTime(520 + Math.min(en, 3) * 450, an, 0.1);
if (glassGain) {
glassGain.gain.setTargetAtTime(
params.soundEnabled ? Math.min(en, 2.5) * 0.095 : 0, an, 0.12);
glassBP.frequency.setTargetAtTime(
640 + Math.min(en, 2.5) * 90, an, 0.2);
}
const headF = (t * swarmState.speed) % 1;
const cover = circOverlap(headF, 0.5, holeU0, holeU1) /
Math.max(1e-4, holeU1 - holeU0);
const disturb = swarmState.disturb || 0;
shimmerGain.gain.setTargetAtTime(
params.soundEnabled
? cover * 0.10 + Math.min(disturb * 0.18, 0.05) : 0, an, 0.4);
masterGain.gain.setTargetAtTime(
params.soundEnabled ? params.soundVolume * 0.6 : 0, an, 0.3);
const lapNow = Math.floor(t * swarmState.speed);
if (lapNow !== audioLap) {
audioLap = lapNow;
const ang = lapAngle(lapNow);
const semis = ang === 0 ? 0 : (ang === Math.PI ? -2 : 3);
const mulF = Math.pow(2, semis / 12);
for (const { o, r } of padOscs) {
o.frequency.setTargetAtTime(PAD_ROOT * r * mulF, an, 0.8);
}
}
}
if (params.swarmEnabled && params.swarmRefract) {
rtHolder.matrix.copy(swarmHolder.matrixWorld);
rtScene.environment = scene.environment; // IBL for the lit gold
renderer.setRenderTarget(cubeRT);
renderer.render(rtScene, camera);
renderer.setRenderTarget(null);
}
if (cameraDirty) { cameraDirty = false; applyCamera(); }
if (camReadoutFn) camReadoutFn();
if (params.wetFloor) renderMirror();
renderer.render(scene, camera);
if (params.lensFlare) {
renderer.autoClear = false;
flareCam.left = -innerWidth / innerHeight;
flareCam.right = innerWidth / innerHeight;
flareCam.updateProjectionMatrix();
renderer.render(flareScene, flareCam);
renderer.autoClear = true;
}
});
loadPane();
}
start().catch(err => __fail(err.message || String(err)));
</script>
</body>
</html>
volatile-nexus/styles/style.css
@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@800&display=swap');
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body { margin: 0px; padding: 0px; line-height: 1.1; font-family: 'Cinzel', sans-serif; width: 100%; height: 100%; overflow: hidden; background: #000; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
* { margin:0; padding:0; box-sizing:border-box; }
html, body {
width:100%; height:100vh;
background: #004680; /* fallback for old browsers */
background: -webkit-linear-gradient(to right, #4484ba, #004680); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to right, #4484ba, #004680);
display:flex; align-items:center; justify-content:center;
overflow:hidden; color:white;§
}
canvas { display:block; cursor:grab; touch-action:none;position:fixed; top:0; left:0; width:100%; height:100%; }
canvas:active { cursor:grabbing; }
#loader {
position:fixed; top:0; left:0; width:100%; height:100%;
display:flex; flex-direction:column; align-items:center; justify-content:center; gap:14px;
z-index:900; pointer-events:none;
transition: opacity 0.5s ease;
}
#loader.hidden { opacity:0; }
.spinner {
width:36px; height:36px;
border: 3px solid rgba(255,255,255,0.25);
border-top-color: rgba(255,255,255,0.7);
border-radius:50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform:rotate(360deg); } }
.loading-text {
font: 400 13px 'Helvetica Neue', Arial, sans-serif;
color: rgba(255,255,255,0.7);
letter-spacing: 0.08em;
}
.loading-text .dot {
animation: dotFade 1.4s ease-in-out infinite;
opacity:0;
}
.loading-text .dot:nth-child(1) { animation-delay: 0.0s; }
.loading-text .dot:nth-child(2) { animation-delay: 0.2s; }
.loading-text .dot:nth-child(3) { animation-delay: 0.4s; }
@keyframes dotFade {
0%, 80%, 100% { opacity:0; }
40% { opacity:1; }
}
#fps {font-size:30px;font-family:monospace;color:black;}
/* ── Tweakpane host ── */
#pane-container {
position: fixed;
top: 16px;
right: 16px;
z-index: 100;
display:none;
}
a {
color: #D0D0D0;
text-decoration: none;
}
/* ── Tweakpane dark theme ── */
:root {
--tp-base-background-color: hsl(222,22%,7%);
--tp-base-shadow-color: hsla(0,0%,0%,0.35);
--tp-button-background-color: hsl(222,18%,15%);
--tp-button-background-color-active: hsl(222,18%,22%);
--tp-button-background-color-focus: hsl(222,18%,20%);
--tp-button-background-color-hover: hsl(222,18%,19%);
--tp-button-foreground-color: hsl(155,90%,62%);
--tp-container-background-color: hsl(222,18%,11%);
--tp-container-background-color-active: hsl(222,18%,15%);
--tp-container-background-color-focus: hsl(222,18%,14%);
--tp-container-background-color-hover: hsl(222,18%,13%);
--tp-container-foreground-color: hsla(155,90%,62%,0.65);
--tp-groove-foreground-color: hsl(222,18%,22%);
--tp-input-background-color: hsl(222,18%,13%);
--tp-input-background-color-active: hsl(222,18%,20%);
--tp-input-background-color-focus: hsl(222,18%,17%);
--tp-input-background-color-hover: hsl(222,18%,16%);
--tp-input-foreground-color: hsl(155,90%,74%);
--tp-label-foreground-color: hsl(220,16%,52%);
--tp-monitor-background-color: hsl(222,18%,10%);
--tp-monitor-foreground-color: hsla(155,90%,62%,0.85);
}
/* ── Vignette ── */
#vignette {
pointer-events: none;
background: transparent;
height: 100vh;
width: 100%;
box-shadow: inset 0 0 50px rgba(0,0,0,0.23);
position: fixed;
z-index: 98;
}
/* ── FPS counter ── */
#fps {
position: fixed;
bottom: 16px;
right: 16px;
font: 500 10px/1 'Cinzel', monospace;
color: rgba(61,255,160,0.0);
letter-spacing: .08em;
pointer-events: none;
z-index: 1200;
}
#title-text {
position: fixed;
max-width:250px;
overflow-wrap: break-word;
top: 118px;
left: 28px;
max-width: 250px;
z-index: 201;
color:white;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
/* ── Title block (top-left) ── */
#title-block {
position: fixed;
top: 28px;
left: 28px;
z-index: 200;
pointer-events: none;
display: flex;
flex-direction: column;
gap: 16px;
}
#title-eyebrow {
font: 400 16px/1 'Cinzel', monospace;
text-transform: uppercase;
color: #ffffff;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
#title-headline {
font: 600 28px/1 'Cinzel', system-ui, sans-serif;
color: #ffffff;
text-shadow: 3px 3px 10px rgba(0,0,0,0.8);
}
p {
font: 400 12px/1 'Cinzel', monospace;
text-transform: uppercase;
color: #ffffff;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
line-height: 1.5;
}
/* ── Nav link (bottom-left) ── */
#nav-prev-all {
position: fixed;
bottom: 56px;
left: 28px;
z-index: 200;
font: 400 14px/1 'Cinzel', monospace;
letter-spacing: .02em;
text-transform: uppercase;
color: #ffffff;
text-decoration: none;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
#nav-prev-all:hover {
text-shadow: 3px 3px 10px rgba(0,0,0,0.9);
}
/* ── Nav link (bottom-left) ── */
#nav-prev {
position: fixed;
bottom: 28px;
left: 28px;
z-index: 200;
font: 400 14px/1 'Cinzel', monospace;
letter-spacing: .02em;
text-transform: uppercase;
color: #ffffff;
text-decoration: none;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
#nav-prev:hover {
text-shadow: 3px 3px 10px rgba(0,0,0,0.9);
}
@media (max-width: 968px) {
#pane-container {
position: fixed;
top: 16px;
right: 6px;
z-index: 100;
width: 190px;
}
#pane-container .tp-dfwv {
width: 190px;
border-radius: 10px;
border: 1px solid rgba(255,255,255,0.07);
box-shadow: 0 8px 48px rgba(0,0,0,0.55);
overflow: hidden;
}
#title-eyebrow {
font: 400 11px/1 'Cinzel', monospace;
text-transform: uppercase;
color: #ffffff;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
#title-headline {
font: 600 23px/1 'Cinzel', system-ui, sans-serif;
color: #ffffff;
text-shadow: 3px 3px 10px rgba(0,0,0,0.8);
}
#title-text {
font: 400 11px/1 'Cinzel', monospace;
position: fixed;
max-width:200px;
width:200px;
overflow-wrap: break-word;
top: 98px;
left: 28px;
z-index: 201;
color:white;
text-shadow: 2px 2px 6px rgba(0,0,0,0.8);
}
}
Original author attribution실행 안내·자료
Garden Anomaly: A Tiny WebGPU and TSL Experiment
Original author: Frank Reitberger
Published by Codrops. Copyright (c) 2026 Codrops.
License: MIT, pursuant to the publisher's downloadable-demo grant.
Keep CODROPS-MIT-2026.txt and the original project notices with copies.
Third-party media exceptions and credits are recorded separately in the source inventory.
Media credits and license evidence실행 안내·자료
garden-anomaly/styles/font/Open_Sans/LICENSE.txt
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
garden-anomaly/styles/font/Open_Sans/README.txt
Open Sans Variable Font
=======================
This download contains Open Sans as both variable fonts and static fonts.
Open Sans is a variable font with these axes:
wdth
wght
This means all the styles are contained in these files:
OpenSans-VariableFont_wdth,wght.ttf
OpenSans-Italic-VariableFont_wdth,wght.ttf
If your app fully supports variable fonts, you can now pick intermediate styles
that aren’t available as static fonts. Not all apps support variable fonts, and
in those cases you can use the static font files for Open Sans:
static/OpenSans_Condensed/OpenSans_Condensed-Light.ttf
static/OpenSans_Condensed/OpenSans_Condensed-Regular.ttf
static/OpenSans_Condensed/OpenSans_Condensed-Medium.ttf
static/OpenSans_Condensed/OpenSans_Condensed-SemiBold.ttf
static/OpenSans_Condensed/OpenSans_Condensed-Bold.ttf
static/OpenSans_Condensed/OpenSans_Condensed-ExtraBold.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-Light.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-Regular.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-Medium.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-SemiBold.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-Bold.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-ExtraBold.ttf
static/OpenSans/OpenSans-Light.ttf
static/OpenSans/OpenSans-Regular.ttf
static/OpenSans/OpenSans-Medium.ttf
static/OpenSans/OpenSans-SemiBold.ttf
static/OpenSans/OpenSans-Bold.ttf
static/OpenSans/OpenSans-ExtraBold.ttf
static/OpenSans_Condensed/OpenSans_Condensed-LightItalic.ttf
static/OpenSans_Condensed/OpenSans_Condensed-Italic.ttf
static/OpenSans_Condensed/OpenSans_Condensed-MediumItalic.ttf
static/OpenSans_Condensed/OpenSans_Condensed-SemiBoldItalic.ttf
static/OpenSans_Condensed/OpenSans_Condensed-BoldItalic.ttf
static/OpenSans_Condensed/OpenSans_Condensed-ExtraBoldItalic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-LightItalic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-Italic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-MediumItalic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-SemiBoldItalic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-BoldItalic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-ExtraBoldItalic.ttf
static/OpenSans/OpenSans-LightItalic.ttf
static/OpenSans/OpenSans-Italic.ttf
static/OpenSans/OpenSans-MediumItalic.ttf
static/OpenSans/OpenSans-SemiBoldItalic.ttf
static/OpenSans/OpenSans-BoldItalic.ttf
static/OpenSans/OpenSans-ExtraBoldItalic.ttf
Get started
-----------
1. Install the font files you want to use
2. Use your app's font picker to view the font family and all the
available styles
Learn more about variable fonts
-------------------------------
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts
In desktop apps
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
Online
https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
Installing fonts
MacOS: https://support.apple.com/en-us/HT201749
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
Android Apps
https://developers.google.com/fonts/docs/android
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
License
-------
Please read the full license text (LICENSE.txt) to understand the permissions,
restrictions and requirements for usage, redistribution, and modification.
You can use them in your products & projects – print or digital,
commercial or otherwise.
This isn't legal advice, please consider consulting a lawyer and see the full
license for all details.
garden-anomaly/styles/font/Space_Grotesk/OFL.txt
Copyright 2020 The Space Grotesk Project Authors (https://github.com/floriankarsten/space-grotesk)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
garden-anomaly/styles/font/Space_Grotesk/README.txt
Space Grotesk Variable Font
===========================
This download contains Space Grotesk as both a variable font and static fonts.
Space Grotesk is a variable font with this axis:
wght
This means all the styles are contained in a single file:
SpaceGrotesk-VariableFont_wght.ttf
If your app fully supports variable fonts, you can now pick intermediate styles
that aren’t available as static fonts. Not all apps support variable fonts, and
in those cases you can use the static font files for Space Grotesk:
static/SpaceGrotesk-Light.ttf
static/SpaceGrotesk-Regular.ttf
static/SpaceGrotesk-Medium.ttf
static/SpaceGrotesk-SemiBold.ttf
static/SpaceGrotesk-Bold.ttf
Get started
-----------
1. Install the font files you want to use
2. Use your app's font picker to view the font family and all the
available styles
Learn more about variable fonts
-------------------------------
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts
In desktop apps
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
Online
https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
Installing fonts
MacOS: https://support.apple.com/en-us/HT201749
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
Android Apps
https://developers.google.com/fonts/docs/android
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
License
-------
Please read the full license text (OFL.txt) to understand the permissions,
restrictions and requirements for usage, redistribution, and modification.
You can use them in your products & projects – print or digital,
commercial or otherwise.
This isn't legal advice, please consider consulting a lawyer and see the full
license for all details.
volatile-nexus/styles/font/Open_Sans/LICENSE.txt
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
volatile-nexus/styles/font/Open_Sans/README.txt
Open Sans Variable Font
=======================
This download contains Open Sans as both variable fonts and static fonts.
Open Sans is a variable font with these axes:
wdth
wght
This means all the styles are contained in these files:
OpenSans-VariableFont_wdth,wght.ttf
OpenSans-Italic-VariableFont_wdth,wght.ttf
If your app fully supports variable fonts, you can now pick intermediate styles
that aren’t available as static fonts. Not all apps support variable fonts, and
in those cases you can use the static font files for Open Sans:
static/OpenSans_Condensed/OpenSans_Condensed-Light.ttf
static/OpenSans_Condensed/OpenSans_Condensed-Regular.ttf
static/OpenSans_Condensed/OpenSans_Condensed-Medium.ttf
static/OpenSans_Condensed/OpenSans_Condensed-SemiBold.ttf
static/OpenSans_Condensed/OpenSans_Condensed-Bold.ttf
static/OpenSans_Condensed/OpenSans_Condensed-ExtraBold.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-Light.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-Regular.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-Medium.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-SemiBold.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-Bold.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-ExtraBold.ttf
static/OpenSans/OpenSans-Light.ttf
static/OpenSans/OpenSans-Regular.ttf
static/OpenSans/OpenSans-Medium.ttf
static/OpenSans/OpenSans-SemiBold.ttf
static/OpenSans/OpenSans-Bold.ttf
static/OpenSans/OpenSans-ExtraBold.ttf
static/OpenSans_Condensed/OpenSans_Condensed-LightItalic.ttf
static/OpenSans_Condensed/OpenSans_Condensed-Italic.ttf
static/OpenSans_Condensed/OpenSans_Condensed-MediumItalic.ttf
static/OpenSans_Condensed/OpenSans_Condensed-SemiBoldItalic.ttf
static/OpenSans_Condensed/OpenSans_Condensed-BoldItalic.ttf
static/OpenSans_Condensed/OpenSans_Condensed-ExtraBoldItalic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-LightItalic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-Italic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-MediumItalic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-SemiBoldItalic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-BoldItalic.ttf
static/OpenSans_SemiCondensed/OpenSans_SemiCondensed-ExtraBoldItalic.ttf
static/OpenSans/OpenSans-LightItalic.ttf
static/OpenSans/OpenSans-Italic.ttf
static/OpenSans/OpenSans-MediumItalic.ttf
static/OpenSans/OpenSans-SemiBoldItalic.ttf
static/OpenSans/OpenSans-BoldItalic.ttf
static/OpenSans/OpenSans-ExtraBoldItalic.ttf
Get started
-----------
1. Install the font files you want to use
2. Use your app's font picker to view the font family and all the
available styles
Learn more about variable fonts
-------------------------------
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts
In desktop apps
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
Online
https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
Installing fonts
MacOS: https://support.apple.com/en-us/HT201749
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
Android Apps
https://developers.google.com/fonts/docs/android
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
License
-------
Please read the full license text (LICENSE.txt) to understand the permissions,
restrictions and requirements for usage, redistribution, and modification.
You can use them in your products & projects – print or digital,
commercial or otherwise.
This isn't legal advice, please consider consulting a lawyer and see the full
license for all details.
volatile-nexus/styles/font/Space_Grotesk/OFL.txt
Copyright 2020 The Space Grotesk Project Authors (https://github.com/floriankarsten/space-grotesk)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
volatile-nexus/styles/font/Space_Grotesk/README.txt
Space Grotesk Variable Font
===========================
This download contains Space Grotesk as both a variable font and static fonts.
Space Grotesk is a variable font with this axis:
wght
This means all the styles are contained in a single file:
SpaceGrotesk-VariableFont_wght.ttf
If your app fully supports variable fonts, you can now pick intermediate styles
that aren’t available as static fonts. Not all apps support variable fonts, and
in those cases you can use the static font files for Space Grotesk:
static/SpaceGrotesk-Light.ttf
static/SpaceGrotesk-Regular.ttf
static/SpaceGrotesk-Medium.ttf
static/SpaceGrotesk-SemiBold.ttf
static/SpaceGrotesk-Bold.ttf
Get started
-----------
1. Install the font files you want to use
2. Use your app's font picker to view the font family and all the
available styles
Learn more about variable fonts
-------------------------------
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts
In desktop apps
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
Online
https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
Installing fonts
MacOS: https://support.apple.com/en-us/HT201749
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
Android Apps
https://developers.google.com/fonts/docs/android
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
License
-------
Please read the full license text (OFL.txt) to understand the permissions,
restrictions and requirements for usage, redistribution, and modification.
You can use them in your products & projects – print or digital,
commercial or otherwise.
This isn't legal advice, please consider consulting a lawyer and see the full
license for all details.
garden-anomaly/styles/font/Open_Sans/LICENSE.txt실행 안내·자료
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
garden-anomaly/styles/font/Open_Sans/LICENSE.txt.http.json실행 안내·자료
{
"url": "https://raw.githubusercontent.com/prinzipiell/tsl/c70b125d035a48105ca1e67933ebb0f7fcb7a34e/garden-anomaly/styles/font/Open_Sans/LICENSE.txt",
"attempts": [
{
"startedAt": "2026-09-22T02:23:34.616Z",
"status": 200,
"finalUrl": "https://raw.githubusercontent.com/prinzipiell/tsl/c70b125d035a48105ca1e67933ebb0f7fcb7a34e/garden-anomaly/styles/font/Open_Sans/LICENSE.txt",
"contentType": "text/plain; charset=utf-8",
"bytes": 11358,
"sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
"finishedAt": "2026-09-22T02:23:34.829Z"
}
],
"ok": true,
"finalUrl": "https://raw.githubusercontent.com/prinzipiell/tsl/c70b125d035a48105ca1e67933ebb0f7fcb7a34e/garden-anomaly/styles/font/Open_Sans/LICENSE.txt",
"fetchedAt": "2026-09-22T02:23:34.829Z",
"sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
"bytes": 11358
}
volatile-nexus/styles/font/Open_Sans/LICENSE.txt실행 안내·자료
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
volatile-nexus/styles/font/Open_Sans/LICENSE.txt.http.json실행 안내·자료
{
"url": "https://raw.githubusercontent.com/prinzipiell/tsl/c70b125d035a48105ca1e67933ebb0f7fcb7a34e/volatile-nexus/styles/font/Open_Sans/LICENSE.txt",
"attempts": [
{
"startedAt": "2026-09-22T02:23:36.106Z",
"status": 200,
"finalUrl": "https://raw.githubusercontent.com/prinzipiell/tsl/c70b125d035a48105ca1e67933ebb0f7fcb7a34e/volatile-nexus/styles/font/Open_Sans/LICENSE.txt",
"contentType": "text/plain; charset=utf-8",
"bytes": 11358,
"sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
"finishedAt": "2026-09-22T02:23:36.394Z"
}
],
"ok": true,
"finalUrl": "https://raw.githubusercontent.com/prinzipiell/tsl/c70b125d035a48105ca1e67933ebb0f7fcb7a34e/volatile-nexus/styles/font/Open_Sans/LICENSE.txt",
"fetchedAt": "2026-09-22T02:23:36.394Z",
"sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
"bytes": 11358
}
Bundled dependency licenses실행 안내·자료
https://cdn.jsdelivr.net/npm/three@0.184.0/LICENSE
The MIT License
Copyright © 2010-2026 three.js authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
https://cdn.jsdelivr.net/gh/cocopon/tweakpane@4.0.5/LICENSE.txt
Copyright (c) 2016 cocopon <cocopon@me.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
https://cdn.jsdelivr.net/npm/three@0.178.0/LICENSE
The MIT License
Copyright © 2010-2025 three.js authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
BEHIND THE EXAMPLE
이 장면을 만드는 원리
충돌 제약 후 실제 이동으로 속도 재계산
입력·상태·출력·수명과 실제 결과를 명시합니다.
- 이 예제에서는
- step은 중력·감쇠로 위치를 예측한 뒤 세 차례 입자 간 겹침과 유리벽 제약을 적용합니다. 그 결과와 이전 위치의 차이로 속도를 다시 계산한 후 충돌 재분산과 휴식 후 상승 힘을 더합니다.
코드와 함께 확인하기
코드에서 찾기
function step(dt)index.html예측·위치 보정·속도 복원·추가 힘의 순서가 분리되어 있습니다.
직접 해보기
충돌 직후와 오래 정지한 입자에 작은 dt·긴 프레임 간격을 넣어 경계와 에너지를 관찰합니다.
살펴볼 변화유리벽 밖으로 이탈하지 않는지와 추가 힘이 의도적으로 움직임을 지속시키는지 확인해야 합니다. 정지 기능은 이 추가 힘도 제어해야 합니다.
