@guinetik/gcanvas 1.0.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CNAME +1 -0
- package/dist/aizawa.html +27 -0
- package/dist/animations.html +31 -0
- package/dist/basic.html +38 -0
- package/dist/baskara.html +31 -0
- package/dist/bezier.html +35 -0
- package/dist/beziersignature.html +29 -0
- package/dist/blackhole.html +28 -0
- package/dist/blob.html +35 -0
- package/dist/clifford.html +25 -0
- package/dist/cmb.html +24 -0
- package/dist/coordinates.html +698 -0
- package/dist/cube3d.html +23 -0
- package/dist/dadras.html +26 -0
- package/dist/dejong.html +25 -0
- package/dist/demos.css +303 -0
- package/dist/dino.html +42 -0
- package/dist/easing.html +28 -0
- package/dist/events.html +195 -0
- package/dist/fluent.html +647 -0
- package/dist/fluid-simple.html +22 -0
- package/dist/fluid.html +37 -0
- package/dist/fractals.html +36 -0
- package/dist/gameobjects.html +626 -0
- package/dist/gcanvas.es.js +14368 -9093
- package/dist/gcanvas.es.min.js +1 -1
- package/dist/gcanvas.umd.js +1 -1
- package/dist/gcanvas.umd.min.js +1 -1
- package/dist/genart.html +26 -0
- package/dist/gendream.html +26 -0
- package/dist/group.html +36 -0
- package/dist/halvorsen.html +27 -0
- package/dist/home.html +587 -0
- package/dist/hyperbolic001.html +23 -0
- package/dist/hyperbolic002.html +23 -0
- package/dist/hyperbolic003.html +23 -0
- package/dist/hyperbolic004.html +23 -0
- package/dist/hyperbolic005.html +22 -0
- package/dist/index.html +446 -0
- package/dist/isometric.html +34 -0
- package/dist/js/aizawa.js +425 -0
- package/dist/js/animations.js +452 -0
- package/dist/js/basic.js +204 -0
- package/dist/js/baskara.js +751 -0
- package/dist/js/bezier.js +692 -0
- package/dist/js/beziersignature.js +241 -0
- package/dist/js/blackhole/accretiondisk.obj.js +379 -0
- package/dist/js/blackhole/blackhole.obj.js +318 -0
- package/dist/js/blackhole/index.js +409 -0
- package/dist/js/blackhole/particle.js +56 -0
- package/dist/js/blackhole/starfield.obj.js +218 -0
- package/dist/js/blob.js +2276 -0
- package/dist/js/clifford.js +236 -0
- package/dist/js/cmb.js +594 -0
- package/dist/js/coordinates.js +840 -0
- package/dist/js/cube3d.js +789 -0
- package/dist/js/dadras.js +405 -0
- package/dist/js/dejong.js +257 -0
- package/dist/js/dino.js +1420 -0
- package/dist/js/easing.js +477 -0
- package/dist/js/fluent.js +183 -0
- package/dist/js/fluid-simple.js +253 -0
- package/dist/js/fluid.js +527 -0
- package/dist/js/fractals.js +932 -0
- package/dist/js/fractalworker.js +93 -0
- package/dist/js/gameobjects.js +176 -0
- package/dist/js/genart.js +268 -0
- package/dist/js/gendream.js +209 -0
- package/dist/js/group.js +140 -0
- package/dist/js/halvorsen.js +405 -0
- package/dist/js/hyperbolic001.js +310 -0
- package/dist/js/hyperbolic002.js +388 -0
- package/dist/js/hyperbolic003.js +319 -0
- package/dist/js/hyperbolic004.js +345 -0
- package/dist/js/hyperbolic005.js +340 -0
- package/dist/js/info-toggle.js +25 -0
- package/dist/js/isometric.js +851 -0
- package/dist/js/kerr.js +1547 -0
- package/dist/js/lavalamp.js +590 -0
- package/dist/js/layout.js +354 -0
- package/dist/js/lorenz.js +425 -0
- package/dist/js/mondrian.js +285 -0
- package/dist/js/opacity.js +275 -0
- package/dist/js/painter.js +484 -0
- package/dist/js/particles-showcase.js +514 -0
- package/dist/js/particles.js +299 -0
- package/dist/js/patterns.js +397 -0
- package/dist/js/penrose/artifact.js +69 -0
- package/dist/js/penrose/blackhole.js +121 -0
- package/dist/js/penrose/constants.js +73 -0
- package/dist/js/penrose/game.js +943 -0
- package/dist/js/penrose/lore.js +278 -0
- package/dist/js/penrose/penrosescene.js +892 -0
- package/dist/js/penrose/ship.js +216 -0
- package/dist/js/penrose/sounds.js +211 -0
- package/dist/js/penrose/voidparticle.js +55 -0
- package/dist/js/penrose/voidscene.js +258 -0
- package/dist/js/penrose/voidship.js +144 -0
- package/dist/js/penrose/wormhole.js +46 -0
- package/dist/js/pipeline.js +555 -0
- package/dist/js/plane3d.js +256 -0
- package/dist/js/platformer.js +1579 -0
- package/dist/js/rossler.js +480 -0
- package/dist/js/scene.js +304 -0
- package/dist/js/scenes.js +320 -0
- package/dist/js/schrodinger.js +706 -0
- package/dist/js/schwarzschild.js +1015 -0
- package/dist/js/shapes.js +628 -0
- package/dist/js/space/alien.js +171 -0
- package/dist/js/space/boom.js +98 -0
- package/dist/js/space/boss.js +353 -0
- package/dist/js/space/buff.js +73 -0
- package/dist/js/space/bullet.js +102 -0
- package/dist/js/space/constants.js +85 -0
- package/dist/js/space/game.js +1884 -0
- package/dist/js/space/hud.js +112 -0
- package/dist/js/space/laserbeam.js +179 -0
- package/dist/js/space/lightning.js +277 -0
- package/dist/js/space/minion.js +192 -0
- package/dist/js/space/missile.js +212 -0
- package/dist/js/space/player.js +430 -0
- package/dist/js/space/powerup.js +90 -0
- package/dist/js/space/starfield.js +58 -0
- package/dist/js/space/starpower.js +90 -0
- package/dist/js/spacetime.js +559 -0
- package/dist/js/sphere3d.js +229 -0
- package/dist/js/sprite.js +473 -0
- package/dist/js/starfaux/config.js +118 -0
- package/dist/js/starfaux/enemy.js +353 -0
- package/dist/js/starfaux/hud.js +78 -0
- package/dist/js/starfaux/index.js +482 -0
- package/dist/js/starfaux/laser.js +182 -0
- package/dist/js/starfaux/player.js +468 -0
- package/dist/js/starfaux/terrain.js +560 -0
- package/dist/js/study001.js +275 -0
- package/dist/js/study002.js +366 -0
- package/dist/js/study003.js +331 -0
- package/dist/js/study004.js +389 -0
- package/dist/js/study005.js +209 -0
- package/dist/js/study006.js +194 -0
- package/dist/js/study007.js +192 -0
- package/dist/js/study008.js +413 -0
- package/dist/js/svgtween.js +204 -0
- package/dist/js/tde/accretiondisk.js +471 -0
- package/dist/js/tde/blackhole.js +219 -0
- package/dist/js/tde/blackholescene.js +209 -0
- package/dist/js/tde/config.js +59 -0
- package/dist/js/tde/index.js +820 -0
- package/dist/js/tde/jets.js +290 -0
- package/dist/js/tde/lensedstarfield.js +154 -0
- package/dist/js/tde/tdestar.js +297 -0
- package/dist/js/tde/tidalstream.js +372 -0
- package/dist/js/tde_old/blackhole.obj.js +354 -0
- package/dist/js/tde_old/debris.obj.js +791 -0
- package/dist/js/tde_old/flare.obj.js +239 -0
- package/dist/js/tde_old/index.js +448 -0
- package/dist/js/tde_old/star.obj.js +812 -0
- package/dist/js/tetris/config.js +157 -0
- package/dist/js/tetris/grid.js +286 -0
- package/dist/js/tetris/index.js +1195 -0
- package/dist/js/tetris/renderer.js +634 -0
- package/dist/js/tetris/tetrominos.js +280 -0
- package/dist/js/thomas.js +394 -0
- package/dist/js/tiles.js +312 -0
- package/dist/js/tweendemo.js +79 -0
- package/dist/js/visibility.js +102 -0
- package/dist/kerr.html +28 -0
- package/dist/lavalamp.html +27 -0
- package/dist/layouts.html +37 -0
- package/dist/logo.svg +4 -0
- package/dist/loop.html +84 -0
- package/dist/lorenz.html +27 -0
- package/dist/mondrian.html +32 -0
- package/dist/og_image.png +0 -0
- package/dist/opacity.html +36 -0
- package/dist/painter.html +39 -0
- package/dist/particles-showcase.html +28 -0
- package/dist/particles.html +24 -0
- package/dist/patterns.html +33 -0
- package/dist/penrose-game.html +31 -0
- package/dist/pipeline.html +737 -0
- package/dist/plane3d.html +24 -0
- package/dist/platformer.html +43 -0
- package/dist/rossler.html +27 -0
- package/dist/scene-interactivity-test.html +220 -0
- package/dist/scene.html +33 -0
- package/dist/scenes.html +96 -0
- package/dist/schrodinger.html +27 -0
- package/dist/schwarzschild.html +27 -0
- package/dist/shapes.html +16 -0
- package/dist/space.html +85 -0
- package/dist/spacetime.html +27 -0
- package/dist/sphere3d.html +24 -0
- package/dist/sprite.html +18 -0
- package/dist/starfaux.html +22 -0
- package/dist/study001.html +23 -0
- package/dist/study002.html +23 -0
- package/dist/study003.html +23 -0
- package/dist/study004.html +23 -0
- package/dist/study005.html +22 -0
- package/dist/study006.html +24 -0
- package/dist/study007.html +24 -0
- package/dist/study008.html +22 -0
- package/dist/svgtween.html +29 -0
- package/dist/tde.html +28 -0
- package/dist/tetris3d.html +25 -0
- package/dist/thomas.html +27 -0
- package/dist/tiles.html +28 -0
- package/dist/transforms.html +400 -0
- package/dist/tween.html +45 -0
- package/dist/visibility.html +33 -0
- package/package.json +1 -1
- package/readme.md +30 -22
- package/src/game/objects/go.js +7 -0
- package/src/game/objects/index.js +2 -0
- package/src/game/objects/isometric-scene.js +53 -3
- package/src/game/objects/layoutscene.js +57 -0
- package/src/game/objects/mask.js +241 -0
- package/src/game/objects/scene.js +19 -0
- package/src/game/objects/wrapper.js +14 -2
- package/src/game/pipeline.js +17 -0
- package/src/game/ui/button.js +101 -16
- package/src/game/ui/theme.js +0 -6
- package/src/game/ui/togglebutton.js +25 -14
- package/src/game/ui/tooltip.js +12 -4
- package/src/index.js +3 -0
- package/src/io/gesture.js +409 -0
- package/src/io/index.js +4 -1
- package/src/io/keys.js +9 -1
- package/src/io/screen.js +476 -0
- package/src/math/attractors.js +664 -0
- package/src/math/heat.js +106 -0
- package/src/math/index.js +1 -0
- package/src/mixins/draggable.js +15 -19
- package/src/painter/painter.shapes.js +11 -5
- package/src/particle/particle-system.js +165 -1
- package/src/physics/index.js +26 -0
- package/src/physics/physics-updaters.js +333 -0
- package/src/physics/physics.js +375 -0
- package/src/shapes/image.js +5 -5
- package/src/shapes/index.js +2 -0
- package/src/shapes/parallelogram.js +147 -0
- package/src/shapes/righttriangle.js +115 -0
- package/src/shapes/svg.js +281 -100
- package/src/shapes/text.js +22 -6
- package/src/shapes/transformable.js +5 -0
- package/src/sound/effects.js +807 -0
- package/src/sound/index.js +13 -0
- package/src/webgl/index.js +7 -0
- package/src/webgl/shaders/clifford-point-shaders.js +131 -0
- package/src/webgl/shaders/dejong-point-shaders.js +131 -0
- package/src/webgl/shaders/point-sprite-shaders.js +152 -0
- package/src/webgl/webgl-clifford-renderer.js +477 -0
- package/src/webgl/webgl-dejong-renderer.js +472 -0
- package/src/webgl/webgl-line-renderer.js +391 -0
- package/src/webgl/webgl-particle-renderer.js +410 -0
- package/types/index.d.ts +30 -2
- package/types/io.d.ts +217 -0
- package/types/physics.d.ts +299 -0
- package/types/shapes.d.ts +8 -0
- package/types/webgl.d.ts +188 -109
package/src/sound/index.js
CHANGED
|
@@ -15,3 +15,16 @@ export { SynthEnvelope } from "./synth.envelope.js";
|
|
|
15
15
|
export { SynthNoise } from "./synth.noise.js";
|
|
16
16
|
export { SynthMusical } from "./synth.musical.js";
|
|
17
17
|
export { SynthAnalyzer } from "./synth.analyzer.js";
|
|
18
|
+
|
|
19
|
+
// Audio effect primitives
|
|
20
|
+
export {
|
|
21
|
+
Flanger,
|
|
22
|
+
DJFilter,
|
|
23
|
+
EQFilterBank,
|
|
24
|
+
HighShelf,
|
|
25
|
+
AdvancedDelay,
|
|
26
|
+
AdvancedDistortion,
|
|
27
|
+
AdvancedTremolo,
|
|
28
|
+
Limiter,
|
|
29
|
+
MasterGain,
|
|
30
|
+
} from "./effects.js";
|
package/src/webgl/index.js
CHANGED
|
@@ -6,4 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
export { WebGLRenderer } from "./webgl-renderer.js";
|
|
9
|
+
export { WebGLParticleRenderer } from "./webgl-particle-renderer.js";
|
|
10
|
+
export { WebGLLineRenderer } from "./webgl-line-renderer.js";
|
|
11
|
+
export { WebGLDeJongRenderer } from "./webgl-dejong-renderer.js";
|
|
12
|
+
export { WebGLCliffordRenderer } from "./webgl-clifford-renderer.js";
|
|
9
13
|
export { SPHERE_SHADERS } from "./shaders/sphere-shaders.js";
|
|
14
|
+
export * from "./shaders/point-sprite-shaders.js";
|
|
15
|
+
export * from "./shaders/dejong-point-shaders.js";
|
|
16
|
+
export * from "./shaders/clifford-point-shaders.js";
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module webgl/shaders/clifford-point-shaders
|
|
3
|
+
* @description Procedural Clifford attractor shaders (GL_POINTS).
|
|
4
|
+
*
|
|
5
|
+
* This shader iterates the Clifford map directly in the vertex shader.
|
|
6
|
+
* The attribute buffer contains random seeds in \([-1,1]\).
|
|
7
|
+
*
|
|
8
|
+
* Unlike `point-sprite-shaders.js` (which expects CPU-provided screen-space points),
|
|
9
|
+
* these shaders generate positions procedurally on the GPU.
|
|
10
|
+
*
|
|
11
|
+
* Clifford equations:
|
|
12
|
+
* x_{n+1} = sin(a·y_n) + c·cos(a·x_n)
|
|
13
|
+
* y_{n+1} = sin(b·x_n) + d·cos(b·y_n)
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import {
|
|
17
|
+
POINT_SPRITE_CIRCLE_FRAGMENT,
|
|
18
|
+
POINT_SPRITE_GLOW_FRAGMENT,
|
|
19
|
+
POINT_SPRITE_SOFT_SQUARE_FRAGMENT,
|
|
20
|
+
POINT_SPRITE_SQUARE_FRAGMENT,
|
|
21
|
+
} from "./point-sprite-shaders.js";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Maximum iterations supported by the vertex shader.
|
|
25
|
+
* Increase carefully: higher values cost GPU time.
|
|
26
|
+
* @type {number}
|
|
27
|
+
*/
|
|
28
|
+
export const CLIFFORD_MAX_ITERATIONS = 200;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Procedural Clifford vertex shader.
|
|
32
|
+
*
|
|
33
|
+
* Uniforms:
|
|
34
|
+
* - `uTime`: seconds
|
|
35
|
+
* - `uParams`: vec4(a,b,c,d)
|
|
36
|
+
* - `uIterations`: number of iterations to apply (0..CLIFFORD_MAX_ITERATIONS)
|
|
37
|
+
* - `uTransform`: 2D transform in clip space (mat3)
|
|
38
|
+
* - `uZoom`: zoom factor (multiplies the attractor)
|
|
39
|
+
* - `uPointScale`: base scale mapping attractor space to clip space
|
|
40
|
+
* - `uPointSize`: gl_PointSize (pixels)
|
|
41
|
+
* - `uColorMode`: 0 = flat `uColor`, 1 = Lorenz-style speed→hue ramp
|
|
42
|
+
* - `uColor`: RGBA (0..1) used when `uColorMode=0`
|
|
43
|
+
* - `uHueRange`: vec2(minHue, maxHue) degrees (fast→slow mapping like Lorenz)
|
|
44
|
+
* - `uMaxSpeed`: speed normalization threshold
|
|
45
|
+
* - `uSaturation`: 0..1
|
|
46
|
+
* - `uLightness`: 0..1
|
|
47
|
+
* - `uAlpha`: 0..1
|
|
48
|
+
* - `uHueOffset`: degrees (e.g. time*hueShiftSpeed)
|
|
49
|
+
*/
|
|
50
|
+
export const CLIFFORD_POINT_VERTEX = `
|
|
51
|
+
precision highp float;
|
|
52
|
+
|
|
53
|
+
attribute vec2 aPosition; // random seed in [-1, 1]
|
|
54
|
+
|
|
55
|
+
uniform float uTime;
|
|
56
|
+
uniform vec4 uParams; // (a, b, c, d)
|
|
57
|
+
uniform int uIterations; // 0..${CLIFFORD_MAX_ITERATIONS}
|
|
58
|
+
uniform mat3 uTransform; // clip-space transform
|
|
59
|
+
uniform float uZoom;
|
|
60
|
+
uniform float uPointScale;
|
|
61
|
+
uniform float uPointSize;
|
|
62
|
+
uniform int uColorMode;
|
|
63
|
+
uniform vec4 uColor; // non-premultiplied RGBA (0..1)
|
|
64
|
+
uniform vec2 uHueRange; // (minHue, maxHue)
|
|
65
|
+
uniform float uMaxSpeed;
|
|
66
|
+
uniform float uSaturation; // 0..1
|
|
67
|
+
uniform float uLightness; // 0..1
|
|
68
|
+
uniform float uAlpha; // 0..1
|
|
69
|
+
uniform float uHueOffset; // degrees
|
|
70
|
+
|
|
71
|
+
varying vec4 vColor;
|
|
72
|
+
|
|
73
|
+
// HSL to RGB (all 0..1). Based on a compact shader formulation.
|
|
74
|
+
vec3 hsl2rgb(vec3 hsl) {
|
|
75
|
+
vec3 rgb = clamp(abs(mod(hsl.x * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);
|
|
76
|
+
rgb = rgb * rgb * (3.0 - 2.0 * rgb);
|
|
77
|
+
float c = (1.0 - abs(2.0 * hsl.z - 1.0)) * hsl.y;
|
|
78
|
+
return (rgb - 0.5) * c + hsl.z;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
void main() {
|
|
82
|
+
vec2 p = aPosition;
|
|
83
|
+
vec2 lastDelta = vec2(0.0);
|
|
84
|
+
|
|
85
|
+
// Clifford iterative map
|
|
86
|
+
// x' = sin(a*y) + c*cos(a*x)
|
|
87
|
+
// y' = sin(b*x) + d*cos(b*y)
|
|
88
|
+
for (int i = 0; i < ${CLIFFORD_MAX_ITERATIONS}; i++) {
|
|
89
|
+
if (i >= uIterations) break;
|
|
90
|
+
vec2 prev = p;
|
|
91
|
+
float x = sin(uParams.x * p.y) + uParams.z * cos(uParams.x * p.x);
|
|
92
|
+
float y = sin(uParams.y * p.x) + uParams.w * cos(uParams.y * p.y);
|
|
93
|
+
p = vec2(x, y);
|
|
94
|
+
lastDelta = p - prev;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Map attractor space into clip space
|
|
98
|
+
vec3 transformed = uTransform * vec3(p * uPointScale * uZoom, 1.0);
|
|
99
|
+
gl_Position = vec4(transformed.xy, 0.0, 1.0);
|
|
100
|
+
gl_PointSize = uPointSize;
|
|
101
|
+
|
|
102
|
+
// Color
|
|
103
|
+
vec4 c;
|
|
104
|
+
if (uColorMode == 1) {
|
|
105
|
+
float speed = length(lastDelta);
|
|
106
|
+
float speedNorm = clamp(speed / max(uMaxSpeed, 0.0001), 0.0, 1.0);
|
|
107
|
+
float baseHue = uHueRange.y - speedNorm * (uHueRange.y - uHueRange.x);
|
|
108
|
+
float hue = mod(baseHue + uHueOffset, 360.0);
|
|
109
|
+
vec3 rgb = hsl2rgb(vec3(hue / 360.0, clamp(uSaturation, 0.0, 1.0), clamp(uLightness, 0.0, 1.0)));
|
|
110
|
+
c = vec4(rgb, clamp(uAlpha, 0.0, 1.0));
|
|
111
|
+
} else {
|
|
112
|
+
c = uColor;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Premultiply in shader (renderer uses premultipliedAlpha for compositing)
|
|
116
|
+
c.rgb *= c.a;
|
|
117
|
+
vColor = c;
|
|
118
|
+
}
|
|
119
|
+
`;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Fragment shaders for procedural points.
|
|
123
|
+
* Re-uses the point sprite shapes.
|
|
124
|
+
*/
|
|
125
|
+
export const CLIFFORD_POINT_FRAGMENTS = {
|
|
126
|
+
circle: POINT_SPRITE_CIRCLE_FRAGMENT,
|
|
127
|
+
glow: POINT_SPRITE_GLOW_FRAGMENT,
|
|
128
|
+
square: POINT_SPRITE_SQUARE_FRAGMENT,
|
|
129
|
+
softSquare: POINT_SPRITE_SOFT_SQUARE_FRAGMENT,
|
|
130
|
+
};
|
|
131
|
+
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module webgl/shaders/dejong-point-shaders
|
|
3
|
+
* @description Procedural De Jong attractor shaders (GL_POINTS).
|
|
4
|
+
*
|
|
5
|
+
* This shader iterates the De Jong map directly in the vertex shader.
|
|
6
|
+
* The attribute buffer contains random seeds in \([-1,1]\).
|
|
7
|
+
*
|
|
8
|
+
* Unlike `point-sprite-shaders.js` (which expects CPU-provided screen-space points),
|
|
9
|
+
* these shaders generate positions procedurally on the GPU.
|
|
10
|
+
*
|
|
11
|
+
* References:
|
|
12
|
+
* - `D:/Developer/studies/DeJong-Attractor` (GPU iteration workflow)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
POINT_SPRITE_CIRCLE_FRAGMENT,
|
|
17
|
+
POINT_SPRITE_GLOW_FRAGMENT,
|
|
18
|
+
POINT_SPRITE_SOFT_SQUARE_FRAGMENT,
|
|
19
|
+
POINT_SPRITE_SQUARE_FRAGMENT,
|
|
20
|
+
} from "./point-sprite-shaders.js";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Maximum iterations supported by the vertex shader.
|
|
24
|
+
* Increase carefully: higher values cost GPU time.
|
|
25
|
+
* @type {number}
|
|
26
|
+
*/
|
|
27
|
+
export const DEJONG_MAX_ITERATIONS = 200;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Procedural De Jong vertex shader.
|
|
31
|
+
*
|
|
32
|
+
* Uniforms:
|
|
33
|
+
* - `uTime`: seconds
|
|
34
|
+
* - `uParams`: vec4(a,b,c,d)
|
|
35
|
+
* - `uIterations`: number of iterations to apply (0..DEJONG_MAX_ITERATIONS)
|
|
36
|
+
* - `uTransform`: 2D transform in clip space (mat3)
|
|
37
|
+
* - `uZoom`: zoom factor (multiplies the attractor)
|
|
38
|
+
* - `uPointScale`: base scale mapping attractor space to clip space (like 0.5 in the reference)
|
|
39
|
+
* - `uPointSize`: gl_PointSize (pixels)
|
|
40
|
+
* - `uColorMode`: 0 = flat `uColor`, 1 = Lorenz-style speed→hue ramp
|
|
41
|
+
* - `uColor`: RGBA (0..1) used when `uColorMode=0`
|
|
42
|
+
* - `uHueRange`: vec2(minHue, maxHue) degrees (fast→slow mapping like Lorenz)
|
|
43
|
+
* - `uMaxSpeed`: speed normalization threshold
|
|
44
|
+
* - `uSaturation`: 0..1
|
|
45
|
+
* - `uLightness`: 0..1
|
|
46
|
+
* - `uAlpha`: 0..1
|
|
47
|
+
* - `uHueOffset`: degrees (e.g. time*hueShiftSpeed)
|
|
48
|
+
*/
|
|
49
|
+
export const DEJONG_POINT_VERTEX = `
|
|
50
|
+
precision highp float;
|
|
51
|
+
|
|
52
|
+
attribute vec2 aPosition; // random seed in [-1, 1]
|
|
53
|
+
|
|
54
|
+
uniform float uTime;
|
|
55
|
+
uniform vec4 uParams; // (a, b, c, d)
|
|
56
|
+
uniform int uIterations; // 0..${DEJONG_MAX_ITERATIONS}
|
|
57
|
+
uniform mat3 uTransform; // clip-space transform
|
|
58
|
+
uniform float uZoom;
|
|
59
|
+
uniform float uPointScale;
|
|
60
|
+
uniform float uPointSize;
|
|
61
|
+
uniform int uColorMode;
|
|
62
|
+
uniform vec4 uColor; // non-premultiplied RGBA (0..1)
|
|
63
|
+
uniform vec2 uHueRange; // (minHue, maxHue)
|
|
64
|
+
uniform float uMaxSpeed;
|
|
65
|
+
uniform float uSaturation; // 0..1
|
|
66
|
+
uniform float uLightness; // 0..1
|
|
67
|
+
uniform float uAlpha; // 0..1
|
|
68
|
+
uniform float uHueOffset; // degrees
|
|
69
|
+
|
|
70
|
+
varying vec4 vColor;
|
|
71
|
+
|
|
72
|
+
// HSL to RGB (all 0..1). Based on a compact shader formulation.
|
|
73
|
+
vec3 hsl2rgb(vec3 hsl) {
|
|
74
|
+
vec3 rgb = clamp(abs(mod(hsl.x * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);
|
|
75
|
+
rgb = rgb * rgb * (3.0 - 2.0 * rgb);
|
|
76
|
+
float c = (1.0 - abs(2.0 * hsl.z - 1.0)) * hsl.y;
|
|
77
|
+
return (rgb - 0.5) * c + hsl.z;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
void main() {
|
|
81
|
+
vec2 p = aPosition;
|
|
82
|
+
vec2 lastDelta = vec2(0.0);
|
|
83
|
+
|
|
84
|
+
// De Jong iterative map
|
|
85
|
+
// x' = sin(a*y) - cos(b*x)
|
|
86
|
+
// y' = sin(c*x) - cos(d*y)
|
|
87
|
+
for (int i = 0; i < ${DEJONG_MAX_ITERATIONS}; i++) {
|
|
88
|
+
if (i >= uIterations) break;
|
|
89
|
+
vec2 prev = p;
|
|
90
|
+
float x = sin(uParams.x * p.y) - cos(uParams.y * p.x);
|
|
91
|
+
float y = sin(uParams.z * p.x) - cos(uParams.w * p.y);
|
|
92
|
+
p = vec2(x, y);
|
|
93
|
+
lastDelta = p - prev;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Map attractor space into clip space
|
|
97
|
+
vec3 transformed = uTransform * vec3(p * uPointScale * uZoom, 1.0);
|
|
98
|
+
gl_Position = vec4(transformed.xy, 0.0, 1.0);
|
|
99
|
+
gl_PointSize = uPointSize;
|
|
100
|
+
|
|
101
|
+
// Color
|
|
102
|
+
vec4 c;
|
|
103
|
+
if (uColorMode == 1) {
|
|
104
|
+
// Lorenz-like mapping: slow → maxHue, fast → minHue
|
|
105
|
+
float speed = length(lastDelta);
|
|
106
|
+
float speedNorm = clamp(speed / max(uMaxSpeed, 0.0001), 0.0, 1.0);
|
|
107
|
+
float baseHue = uHueRange.y - speedNorm * (uHueRange.y - uHueRange.x);
|
|
108
|
+
float hue = mod(baseHue + uHueOffset, 360.0);
|
|
109
|
+
vec3 rgb = hsl2rgb(vec3(hue / 360.0, clamp(uSaturation, 0.0, 1.0), clamp(uLightness, 0.0, 1.0)));
|
|
110
|
+
c = vec4(rgb, clamp(uAlpha, 0.0, 1.0));
|
|
111
|
+
} else {
|
|
112
|
+
c = uColor;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Premultiply in shader (renderer uses premultipliedAlpha for compositing)
|
|
116
|
+
c.rgb *= c.a;
|
|
117
|
+
vColor = c;
|
|
118
|
+
}
|
|
119
|
+
`;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Fragment shaders for DeJong procedural points.
|
|
123
|
+
* Re-uses the point sprite shapes.
|
|
124
|
+
*/
|
|
125
|
+
export const DEJONG_POINT_FRAGMENTS = {
|
|
126
|
+
circle: POINT_SPRITE_CIRCLE_FRAGMENT,
|
|
127
|
+
glow: POINT_SPRITE_GLOW_FRAGMENT,
|
|
128
|
+
square: POINT_SPRITE_SQUARE_FRAGMENT,
|
|
129
|
+
softSquare: POINT_SPRITE_SOFT_SQUARE_FRAGMENT,
|
|
130
|
+
};
|
|
131
|
+
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Point Sprite Shaders for WebGL Particle Rendering
|
|
3
|
+
*
|
|
4
|
+
* These shaders render particles as GL_POINTS with gl_PointSize.
|
|
5
|
+
* Used by WebGLParticleRenderer for GPU-accelerated particle systems.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// VERTEX SHADER
|
|
10
|
+
// =============================================================================
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Point sprite vertex shader
|
|
14
|
+
* Takes screen-space positions (already projected by Camera3D on CPU)
|
|
15
|
+
* and converts to clip space for rendering.
|
|
16
|
+
*/
|
|
17
|
+
export const POINT_SPRITE_VERTEX = `
|
|
18
|
+
precision highp float;
|
|
19
|
+
|
|
20
|
+
attribute vec2 aPosition; // Screen position (pixels, already projected)
|
|
21
|
+
attribute float aSize; // Point size in pixels
|
|
22
|
+
attribute vec4 aColor; // RGBA color (0-1 range)
|
|
23
|
+
|
|
24
|
+
varying vec4 vColor;
|
|
25
|
+
|
|
26
|
+
uniform vec2 uResolution; // Canvas dimensions
|
|
27
|
+
|
|
28
|
+
void main() {
|
|
29
|
+
// Convert from pixel coords to clip space (-1 to 1)
|
|
30
|
+
vec2 clipPos = (aPosition / uResolution) * 2.0 - 1.0;
|
|
31
|
+
clipPos.y = -clipPos.y; // Flip Y (canvas Y is down, GL Y is up)
|
|
32
|
+
|
|
33
|
+
gl_Position = vec4(clipPos, 0.0, 1.0);
|
|
34
|
+
gl_PointSize = aSize;
|
|
35
|
+
vColor = aColor;
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
// =============================================================================
|
|
40
|
+
// FRAGMENT SHADERS
|
|
41
|
+
// =============================================================================
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Circle fragment shader with soft anti-aliased edge
|
|
45
|
+
* Most common particle shape - smooth circular particles
|
|
46
|
+
*/
|
|
47
|
+
export const POINT_SPRITE_CIRCLE_FRAGMENT = `
|
|
48
|
+
precision mediump float;
|
|
49
|
+
|
|
50
|
+
varying vec4 vColor;
|
|
51
|
+
|
|
52
|
+
void main() {
|
|
53
|
+
// gl_PointCoord is 0-1 UV within the point quad
|
|
54
|
+
vec2 coord = gl_PointCoord - vec2(0.5);
|
|
55
|
+
float dist = length(coord);
|
|
56
|
+
|
|
57
|
+
// Discard pixels outside circle
|
|
58
|
+
if (dist > 0.5) {
|
|
59
|
+
discard;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Soft edge for anti-aliasing
|
|
63
|
+
float alpha = vColor.a * (1.0 - smoothstep(0.4, 0.5, dist));
|
|
64
|
+
gl_FragColor = vec4(vColor.rgb, alpha);
|
|
65
|
+
}
|
|
66
|
+
`;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Circle fragment shader with glow effect
|
|
70
|
+
* Particles have a bright core that fades outward
|
|
71
|
+
*/
|
|
72
|
+
export const POINT_SPRITE_GLOW_FRAGMENT = `
|
|
73
|
+
precision mediump float;
|
|
74
|
+
|
|
75
|
+
varying vec4 vColor;
|
|
76
|
+
|
|
77
|
+
void main() {
|
|
78
|
+
vec2 coord = gl_PointCoord - vec2(0.5);
|
|
79
|
+
float dist = length(coord);
|
|
80
|
+
|
|
81
|
+
if (dist > 0.5) {
|
|
82
|
+
discard;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Radial falloff for glow effect
|
|
86
|
+
float glow = 1.0 - (dist * 2.0);
|
|
87
|
+
glow = glow * glow; // Quadratic falloff
|
|
88
|
+
|
|
89
|
+
float alpha = vColor.a * glow;
|
|
90
|
+
vec3 color = vColor.rgb * (0.5 + glow * 0.5); // Brighten center
|
|
91
|
+
|
|
92
|
+
gl_FragColor = vec4(color, alpha);
|
|
93
|
+
}
|
|
94
|
+
`;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Square fragment shader (no clipping)
|
|
98
|
+
* Fastest option - just outputs the color directly
|
|
99
|
+
*/
|
|
100
|
+
export const POINT_SPRITE_SQUARE_FRAGMENT = `
|
|
101
|
+
precision mediump float;
|
|
102
|
+
|
|
103
|
+
varying vec4 vColor;
|
|
104
|
+
|
|
105
|
+
void main() {
|
|
106
|
+
gl_FragColor = vColor;
|
|
107
|
+
}
|
|
108
|
+
`;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Soft square fragment shader with rounded corners
|
|
112
|
+
*/
|
|
113
|
+
export const POINT_SPRITE_SOFT_SQUARE_FRAGMENT = `
|
|
114
|
+
precision mediump float;
|
|
115
|
+
|
|
116
|
+
varying vec4 vColor;
|
|
117
|
+
|
|
118
|
+
void main() {
|
|
119
|
+
vec2 coord = abs(gl_PointCoord - vec2(0.5)) * 2.0; // 0 at center, 1 at edge
|
|
120
|
+
float d = max(coord.x, coord.y);
|
|
121
|
+
|
|
122
|
+
// Soft edge
|
|
123
|
+
float alpha = vColor.a * (1.0 - smoothstep(0.8, 1.0, d));
|
|
124
|
+
gl_FragColor = vec4(vColor.rgb, alpha);
|
|
125
|
+
}
|
|
126
|
+
`;
|
|
127
|
+
|
|
128
|
+
// =============================================================================
|
|
129
|
+
// SHADER PRESETS
|
|
130
|
+
// =============================================================================
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Pre-configured shader combinations for common use cases
|
|
134
|
+
*/
|
|
135
|
+
export const POINT_SPRITE_PRESETS = {
|
|
136
|
+
circle: {
|
|
137
|
+
vertex: POINT_SPRITE_VERTEX,
|
|
138
|
+
fragment: POINT_SPRITE_CIRCLE_FRAGMENT,
|
|
139
|
+
},
|
|
140
|
+
glow: {
|
|
141
|
+
vertex: POINT_SPRITE_VERTEX,
|
|
142
|
+
fragment: POINT_SPRITE_GLOW_FRAGMENT,
|
|
143
|
+
},
|
|
144
|
+
square: {
|
|
145
|
+
vertex: POINT_SPRITE_VERTEX,
|
|
146
|
+
fragment: POINT_SPRITE_SQUARE_FRAGMENT,
|
|
147
|
+
},
|
|
148
|
+
softSquare: {
|
|
149
|
+
vertex: POINT_SPRITE_VERTEX,
|
|
150
|
+
fragment: POINT_SPRITE_SOFT_SQUARE_FRAGMENT,
|
|
151
|
+
},
|
|
152
|
+
};
|