pixospritz-core 0.10.1 → 1.0.1
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/README.md +36 -286
- package/dist/bundle.js +13 -3
- package/dist/bundle.js.map +1 -1
- package/dist/style.css +1 -0
- package/package.json +43 -44
- package/src/components/WebGLView.jsx +318 -0
- package/src/css/pixos.css +372 -0
- package/src/engine/actions/animate.js +41 -0
- package/src/engine/actions/changezone.js +135 -0
- package/src/engine/actions/chat.js +109 -0
- package/src/engine/actions/dialogue.js +90 -0
- package/src/engine/actions/face.js +22 -0
- package/src/engine/actions/greeting.js +28 -0
- package/src/engine/actions/interact.js +86 -0
- package/src/engine/actions/move.js +67 -0
- package/src/engine/actions/patrol.js +109 -0
- package/src/engine/actions/prompt.js +185 -0
- package/src/engine/actions/script.js +42 -0
- package/src/engine/core/audio/AudioSystem.js +543 -0
- package/src/engine/core/cutscene/PxcPlayer.js +956 -0
- package/src/engine/core/cutscene/manager.js +243 -0
- package/src/engine/core/database/index.js +75 -0
- package/src/engine/core/debug/index.js +371 -0
- package/src/engine/core/hud/index.js +765 -0
- package/src/engine/core/index.js +540 -0
- package/src/engine/core/input/gamepad/Controller.js +71 -0
- package/src/engine/core/input/gamepad/ControllerButtons.js +231 -0
- package/src/engine/core/input/gamepad/ControllerStick.js +173 -0
- package/src/engine/core/input/gamepad/index.js +592 -0
- package/src/engine/core/input/keyboard.js +196 -0
- package/src/engine/core/input/manager.js +485 -0
- package/src/engine/core/input/mouse.js +203 -0
- package/src/engine/core/input/touch.js +175 -0
- package/src/engine/core/mode/manager.js +199 -0
- package/src/engine/core/net/manager.js +535 -0
- package/src/engine/core/queue/action.js +83 -0
- package/src/engine/core/queue/event.js +82 -0
- package/src/engine/core/queue/index.js +44 -0
- package/src/engine/core/queue/loadable.js +33 -0
- package/src/engine/core/render/CameraEffects.js +494 -0
- package/src/engine/core/render/FrustumCuller.js +417 -0
- package/src/engine/core/render/LODManager.js +285 -0
- package/src/engine/core/render/ParticleManager.js +529 -0
- package/src/engine/core/render/TextureAtlas.js +465 -0
- package/src/engine/core/render/camera.js +338 -0
- package/src/engine/core/render/light.js +197 -0
- package/src/engine/core/render/manager.js +1079 -0
- package/src/engine/core/render/shaders.js +110 -0
- package/src/engine/core/render/skybox.js +342 -0
- package/src/engine/core/resource/manager.js +133 -0
- package/src/engine/core/resource/object.js +611 -0
- package/src/engine/core/resource/texture.js +103 -0
- package/src/engine/core/resource/tileset.js +177 -0
- package/src/engine/core/scene/avatar.js +215 -0
- package/src/engine/core/scene/speech.js +138 -0
- package/src/engine/core/scene/sprite.js +702 -0
- package/src/engine/core/scene/spritz.js +189 -0
- package/src/engine/core/scene/world.js +681 -0
- package/src/engine/core/scene/zone.js +1167 -0
- package/src/engine/core/store/index.js +110 -0
- package/src/engine/dynamic/animatedSprite.js +64 -0
- package/src/engine/dynamic/animatedTile.js +98 -0
- package/src/engine/dynamic/avatar.js +110 -0
- package/src/engine/dynamic/map.js +174 -0
- package/src/engine/dynamic/sprite.js +255 -0
- package/src/engine/dynamic/spritz.js +119 -0
- package/src/engine/events/EventSystem.js +609 -0
- package/src/engine/events/camera.js +142 -0
- package/src/engine/events/chat.js +75 -0
- package/src/engine/events/menu.js +186 -0
- package/src/engine/scripting/CallbackManager.js +514 -0
- package/src/engine/scripting/PixoScriptInterpreter.js +81 -0
- package/src/engine/scripting/PixoScriptLibrary.js +704 -0
- package/src/engine/shaders/effects/index.js +450 -0
- package/src/engine/shaders/fs.js +222 -0
- package/src/engine/shaders/particles/fs.js +41 -0
- package/src/engine/shaders/particles/vs.js +61 -0
- package/src/engine/shaders/picker/fs.js +34 -0
- package/src/engine/shaders/picker/init.js +62 -0
- package/src/engine/shaders/picker/vs.js +42 -0
- package/src/engine/shaders/pxsl/README.md +250 -0
- package/src/engine/shaders/pxsl/index.js +25 -0
- package/src/engine/shaders/pxsl/library.js +608 -0
- package/src/engine/shaders/pxsl/manager.js +338 -0
- package/src/engine/shaders/pxsl/specification.js +363 -0
- package/src/engine/shaders/pxsl/transpiler.js +753 -0
- package/src/engine/shaders/skybox/cosmic/fs.js +147 -0
- package/src/engine/shaders/skybox/cosmic/vs.js +23 -0
- package/src/engine/shaders/skybox/matrix/fs.js +127 -0
- package/src/engine/shaders/skybox/matrix/vs.js +23 -0
- package/src/engine/shaders/skybox/morning/fs.js +109 -0
- package/src/engine/shaders/skybox/morning/vs.js +23 -0
- package/src/engine/shaders/skybox/neon/fs.js +119 -0
- package/src/engine/shaders/skybox/neon/vs.js +23 -0
- package/src/engine/shaders/skybox/sky/fs.js +114 -0
- package/src/engine/shaders/skybox/sky/vs.js +23 -0
- package/src/engine/shaders/skybox/sunset/fs.js +101 -0
- package/src/engine/shaders/skybox/sunset/vs.js +23 -0
- package/src/engine/shaders/transition/blur/fs.js +42 -0
- package/src/engine/shaders/transition/blur/vs.js +26 -0
- package/src/engine/shaders/transition/cross/fs.js +36 -0
- package/src/engine/shaders/transition/cross/vs.js +26 -0
- package/src/engine/shaders/transition/crossBlur/fs.js +41 -0
- package/src/engine/shaders/transition/crossBlur/vs.js +25 -0
- package/src/engine/shaders/transition/dissolve/fs.js +78 -0
- package/src/engine/shaders/transition/dissolve/vs.js +24 -0
- package/src/engine/shaders/transition/fade/fs.js +31 -0
- package/src/engine/shaders/transition/fade/vs.js +27 -0
- package/src/engine/shaders/transition/iris/fs.js +52 -0
- package/src/engine/shaders/transition/iris/vs.js +24 -0
- package/src/engine/shaders/transition/pixelate/fs.js +44 -0
- package/src/engine/shaders/transition/pixelate/vs.js +24 -0
- package/src/engine/shaders/transition/slide/fs.js +53 -0
- package/src/engine/shaders/transition/slide/vs.js +24 -0
- package/src/engine/shaders/transition/swirl/fs.js +39 -0
- package/src/engine/shaders/transition/swirl/vs.js +26 -0
- package/src/engine/shaders/transition/wipe/fs.js +50 -0
- package/src/engine/shaders/transition/wipe/vs.js +24 -0
- package/src/engine/shaders/vs.js +60 -0
- package/src/engine/utils/CameraController.js +506 -0
- package/src/engine/utils/ObjHelper.js +551 -0
- package/src/engine/utils/debug-logger.js +110 -0
- package/src/engine/utils/enums.js +305 -0
- package/src/engine/utils/generator.js +156 -0
- package/src/engine/utils/index.js +21 -0
- package/src/engine/utils/loaders/ActionLoader.js +77 -0
- package/src/engine/utils/loaders/AudioLoader.js +157 -0
- package/src/engine/utils/loaders/EventLoader.js +66 -0
- package/src/engine/utils/loaders/ObjectLoader.js +67 -0
- package/src/engine/utils/loaders/SpriteLoader.js +77 -0
- package/src/engine/utils/loaders/TilesetLoader.js +103 -0
- package/src/engine/utils/loaders/index.js +21 -0
- package/src/engine/utils/math/matrix4.js +367 -0
- package/src/engine/utils/math/vector.js +458 -0
- package/src/engine/utils/obj/_old_js/index.js +46 -0
- package/src/engine/utils/obj/_old_js/layout.js +308 -0
- package/src/engine/utils/obj/_old_js/material.js +711 -0
- package/src/engine/utils/obj/_old_js/mesh.js +761 -0
- package/src/engine/utils/obj/_old_js/utils.js +647 -0
- package/src/engine/utils/obj/index.js +24 -0
- package/src/engine/utils/obj/js/index.js +277 -0
- package/src/engine/utils/obj/js/loader.js +232 -0
- package/src/engine/utils/obj/layout.js +246 -0
- package/src/engine/utils/obj/material.js +665 -0
- package/src/engine/utils/obj/mesh.js +657 -0
- package/src/engine/utils/obj/ts/index.ts +72 -0
- package/src/engine/utils/obj/ts/layout.ts +265 -0
- package/src/engine/utils/obj/ts/material.ts +760 -0
- package/src/engine/utils/obj/ts/mesh.ts +785 -0
- package/src/engine/utils/obj/ts/utils.ts +501 -0
- package/src/engine/utils/obj/utils.js +428 -0
- package/src/engine/utils/resources.js +18 -0
- package/src/index.jsx +55 -0
- package/src/spritz/player.js +18 -0
- package/src/spritz/readme.md +18 -0
- package/LICENSE +0 -437
- package/dist/bundle.js.LICENSE.txt +0 -31
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/* *\
|
|
2
|
+
** ----------------------------------------------- **
|
|
3
|
+
** Calliope - Pixos Game Engine **
|
|
4
|
+
** ----------------------------------------------- **
|
|
5
|
+
** Copyright (c) 2020-2025 - Kyle Derby MacInnis **
|
|
6
|
+
** **
|
|
7
|
+
** Any unauthorized distribution or transfer **
|
|
8
|
+
** of this work is strictly prohibited. **
|
|
9
|
+
** **
|
|
10
|
+
** All Rights Reserved. **
|
|
11
|
+
** ----------------------------------------------- **
|
|
12
|
+
\* */
|
|
13
|
+
|
|
14
|
+
export default function fs() {
|
|
15
|
+
return `
|
|
16
|
+
precision mediump float;
|
|
17
|
+
uniform samplerCube uSkybox;
|
|
18
|
+
uniform mat4 uViewDirectionProjectionInverse;
|
|
19
|
+
uniform float uTime;
|
|
20
|
+
varying vec4 vPosition;
|
|
21
|
+
|
|
22
|
+
// Hash functions
|
|
23
|
+
float hash(vec3 p) {
|
|
24
|
+
return fract(sin(dot(p, vec3(12.9898, 78.233, 45.164))) * 43758.5453);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
float hash2(vec2 p) {
|
|
28
|
+
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Value noise
|
|
32
|
+
float noise(vec2 p) {
|
|
33
|
+
vec2 i = floor(p);
|
|
34
|
+
vec2 f = fract(p);
|
|
35
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
36
|
+
|
|
37
|
+
float a = hash2(i);
|
|
38
|
+
float b = hash2(i + vec2(1.0, 0.0));
|
|
39
|
+
float c = hash2(i + vec2(0.0, 1.0));
|
|
40
|
+
float d = hash2(i + vec2(1.0, 1.0));
|
|
41
|
+
|
|
42
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Fractal brownian motion for nebulae
|
|
46
|
+
float fbm(vec2 p) {
|
|
47
|
+
float value = 0.0;
|
|
48
|
+
float amplitude = 0.5;
|
|
49
|
+
for (int i = 0; i < 6; i++) {
|
|
50
|
+
value += amplitude * noise(p);
|
|
51
|
+
amplitude *= 0.5;
|
|
52
|
+
p *= 2.0;
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
void main() {
|
|
58
|
+
vec4 t = uViewDirectionProjectionInverse * vPosition;
|
|
59
|
+
vec3 dir = normalize(t.xyz / t.w);
|
|
60
|
+
float time = uTime * 0.05;
|
|
61
|
+
|
|
62
|
+
// Deep space black base
|
|
63
|
+
vec3 color = vec3(0.01, 0.01, 0.02);
|
|
64
|
+
|
|
65
|
+
// Multiple star layers with different densities
|
|
66
|
+
// Close bright stars
|
|
67
|
+
float starDensity1 = 0.0015;
|
|
68
|
+
vec3 starPos1 = dir * 80.0;
|
|
69
|
+
float star1 = step(1.0 - starDensity1, hash(floor(starPos1)));
|
|
70
|
+
if (star1 > 0.0) {
|
|
71
|
+
float twinkle = sin(time * 20.0 + hash(floor(starPos1)) * 6.28) * 0.2 + 0.8;
|
|
72
|
+
float brightness = (0.7 + 0.3 * hash(floor(starPos1) + 1.0)) * twinkle;
|
|
73
|
+
vec3 starColor = mix(vec3(1.0, 0.9, 0.8), vec3(0.8, 0.9, 1.0), hash(floor(starPos1) + 2.0));
|
|
74
|
+
color += starColor * brightness;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Medium distant stars
|
|
78
|
+
float starDensity2 = 0.003;
|
|
79
|
+
vec3 starPos2 = dir * 150.0;
|
|
80
|
+
float star2 = step(1.0 - starDensity2, hash(floor(starPos2)));
|
|
81
|
+
if (star2 > 0.0) {
|
|
82
|
+
float brightness = 0.4 + 0.3 * hash(floor(starPos2) + 1.0);
|
|
83
|
+
color += vec3(brightness);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Far dim stars (star dust)
|
|
87
|
+
float starDensity3 = 0.008;
|
|
88
|
+
vec3 starPos3 = dir * 300.0;
|
|
89
|
+
float star3 = step(1.0 - starDensity3, hash(floor(starPos3)));
|
|
90
|
+
if (star3 > 0.0) {
|
|
91
|
+
color += vec3(0.15 + 0.1 * hash(floor(starPos3)));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Nebula layer 1 - Blue/purple
|
|
95
|
+
vec2 nebulaUV1 = dir.xy + dir.z * 0.5;
|
|
96
|
+
float nebula1 = fbm(nebulaUV1 * 2.0 + time * 0.1);
|
|
97
|
+
nebula1 = smoothstep(0.3, 0.8, nebula1);
|
|
98
|
+
vec3 nebulaColor1 = mix(vec3(0.1, 0.05, 0.2), vec3(0.2, 0.1, 0.4), nebula1);
|
|
99
|
+
color += nebulaColor1 * nebula1 * 0.4;
|
|
100
|
+
|
|
101
|
+
// Nebula layer 2 - Pink/red (different orientation)
|
|
102
|
+
vec2 nebulaUV2 = dir.xz + dir.y * 0.5 + vec2(100.0);
|
|
103
|
+
float nebula2 = fbm(nebulaUV2 * 1.5 + time * 0.08);
|
|
104
|
+
nebula2 = smoothstep(0.4, 0.85, nebula2);
|
|
105
|
+
vec3 nebulaColor2 = mix(vec3(0.15, 0.02, 0.05), vec3(0.3, 0.05, 0.15), nebula2);
|
|
106
|
+
color += nebulaColor2 * nebula2 * 0.3;
|
|
107
|
+
|
|
108
|
+
// Nebula layer 3 - Teal emission nebula
|
|
109
|
+
vec2 nebulaUV3 = dir.yz + dir.x * 0.5 + vec2(50.0, 200.0);
|
|
110
|
+
float nebula3 = fbm(nebulaUV3 * 2.5 + time * 0.12);
|
|
111
|
+
nebula3 = smoothstep(0.5, 0.9, nebula3);
|
|
112
|
+
vec3 nebulaColor3 = vec3(0.05, 0.15, 0.2) * nebula3;
|
|
113
|
+
color += nebulaColor3 * 0.25;
|
|
114
|
+
|
|
115
|
+
// Milky Way band (follows a curved path)
|
|
116
|
+
float milkyWay = abs(dir.y - sin(dir.x * 0.5) * 0.3);
|
|
117
|
+
milkyWay = 1.0 - smoothstep(0.0, 0.4, milkyWay);
|
|
118
|
+
float milkyNoise = fbm(dir.xz * 8.0 + time * 0.05);
|
|
119
|
+
color += vec3(0.1, 0.1, 0.12) * milkyWay * milkyNoise;
|
|
120
|
+
|
|
121
|
+
// Add some extra star density in milky way
|
|
122
|
+
float milkyStars = step(0.97, noise(dir.xz * 500.0)) * milkyWay;
|
|
123
|
+
color += vec3(0.5, 0.5, 0.6) * milkyStars;
|
|
124
|
+
|
|
125
|
+
// Distant galaxies (rare, bright spots)
|
|
126
|
+
float galaxyDensity = 0.0002;
|
|
127
|
+
vec3 galaxyPos = dir * 20.0;
|
|
128
|
+
float galaxy = step(1.0 - galaxyDensity, hash(floor(galaxyPos)));
|
|
129
|
+
if (galaxy > 0.0) {
|
|
130
|
+
vec2 galaxyUV = fract(galaxyPos.xy) - 0.5;
|
|
131
|
+
float galaxyDist = length(galaxyUV);
|
|
132
|
+
float galaxyBright = exp(-galaxyDist * 15.0);
|
|
133
|
+
// Spiral arm effect
|
|
134
|
+
float angle = atan(galaxyUV.y, galaxyUV.x);
|
|
135
|
+
float spiral = sin(angle * 2.0 + galaxyDist * 10.0 + time) * 0.3 + 0.7;
|
|
136
|
+
vec3 galaxyColor = mix(vec3(1.0, 0.9, 0.7), vec3(0.7, 0.8, 1.0), hash(floor(galaxyPos) + 3.0));
|
|
137
|
+
color += galaxyColor * galaxyBright * spiral * 0.5;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Subtle animated shimmer
|
|
141
|
+
float shimmer = noise(dir.xy * 100.0 + time * 2.0) * 0.02;
|
|
142
|
+
color += vec3(shimmer);
|
|
143
|
+
|
|
144
|
+
gl_FragColor = vec4(color, 1.0);
|
|
145
|
+
}
|
|
146
|
+
`;
|
|
147
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* *\
|
|
2
|
+
** ----------------------------------------------- **
|
|
3
|
+
** Calliope - Pixos Game Engine **
|
|
4
|
+
** ----------------------------------------------- **
|
|
5
|
+
** Copyright (c) 2020-2025 - Kyle Derby MacInnis **
|
|
6
|
+
** **
|
|
7
|
+
** Any unauthorized distribution or transfer **
|
|
8
|
+
** of this work is strictly prohibited. **
|
|
9
|
+
** **
|
|
10
|
+
** All Rights Reserved. **
|
|
11
|
+
** ----------------------------------------------- **
|
|
12
|
+
\* */
|
|
13
|
+
|
|
14
|
+
export default function vs() {
|
|
15
|
+
return `
|
|
16
|
+
attribute vec4 aPosition;
|
|
17
|
+
varying vec4 vPosition;
|
|
18
|
+
void main() {
|
|
19
|
+
vPosition = aPosition;
|
|
20
|
+
gl_Position = aPosition;
|
|
21
|
+
}
|
|
22
|
+
`;
|
|
23
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/* *\
|
|
2
|
+
** ----------------------------------------------- **
|
|
3
|
+
** Calliope - Pixos Game Engine **
|
|
4
|
+
** ----------------------------------------------- **
|
|
5
|
+
** Copyright (c) 2020-2025 - Kyle Derby MacInnis **
|
|
6
|
+
** **
|
|
7
|
+
** Any unauthorized distribution or transfer **
|
|
8
|
+
** of this work is strictly prohibited. **
|
|
9
|
+
** **
|
|
10
|
+
** All Rights Reserved. **
|
|
11
|
+
** ----------------------------------------------- **
|
|
12
|
+
\* */
|
|
13
|
+
|
|
14
|
+
export default function fs() {
|
|
15
|
+
return `
|
|
16
|
+
precision highp float;
|
|
17
|
+
uniform mat4 uViewDirectionProjectionInverse;
|
|
18
|
+
varying vec4 vPosition;
|
|
19
|
+
uniform float uTime;
|
|
20
|
+
uniform vec2 uResolution;
|
|
21
|
+
|
|
22
|
+
const float PI = 3.141592653589793;
|
|
23
|
+
|
|
24
|
+
// simple float hash from vec2
|
|
25
|
+
float hash12(vec2 p) {
|
|
26
|
+
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// value noise (cheap)
|
|
30
|
+
float noise2(vec2 p) {
|
|
31
|
+
vec2 i = floor(p);
|
|
32
|
+
vec2 f = fract(p);
|
|
33
|
+
float a = hash12(i + vec2(0.0, 0.0));
|
|
34
|
+
float b = hash12(i + vec2(1.0, 0.0));
|
|
35
|
+
float c = hash12(i + vec2(0.0, 1.0));
|
|
36
|
+
float d = hash12(i + vec2(1.0, 1.0));
|
|
37
|
+
vec2 u = f * f * (3.0 - 2.0 * f);
|
|
38
|
+
return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// smooth pulse shape
|
|
42
|
+
float pulse(float x, float wid) {
|
|
43
|
+
return smoothstep(0.0, wid, x) * (1.0 - smoothstep(1.0 - wid, 1.0, x));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
void main() {
|
|
47
|
+
// Reconstruct view direction from interpolated clip-space position
|
|
48
|
+
vec4 t = uViewDirectionProjectionInverse * vPosition;
|
|
49
|
+
vec3 dir = normalize(t.xyz / t.w);
|
|
50
|
+
|
|
51
|
+
// convert direction -> equirectangular-like UV so "columns" wrap horizontally
|
|
52
|
+
float u = atan(dir.z, dir.x) / (2.0 * PI) + 0.5;
|
|
53
|
+
float v = asin(clamp(dir.y, -1.0, 1.0)) / PI + 0.5;
|
|
54
|
+
vec2 uv = vec2(u, v);
|
|
55
|
+
|
|
56
|
+
// Column layout
|
|
57
|
+
float colsBase = mix(120.0, 240.0, clamp(uResolution.x / 1600.0, 0.0, 1.0));
|
|
58
|
+
float horizonBias = 1.0 - abs(v - 0.5) * 2.0;
|
|
59
|
+
float cols = max(32.0, colsBase * (0.6 + 0.8 * horizonBias));
|
|
60
|
+
|
|
61
|
+
float colIndexF = floor(uv.x * cols);
|
|
62
|
+
float colX = (colIndexF + 0.5) / cols;
|
|
63
|
+
|
|
64
|
+
// per-column seed & speed variety
|
|
65
|
+
float seed = hash12(vec2(colIndexF, floor(uTime * 10.0)));
|
|
66
|
+
float speed = 0.8 + hash12(vec2(colIndexF, 9.0)) * 2.2;
|
|
67
|
+
|
|
68
|
+
// vertical tiling for character cells
|
|
69
|
+
float charSize = mix(0.018, 0.035, clamp(uResolution.y/900.0, 0.0, 1.0));
|
|
70
|
+
float rows = 1.0 / charSize;
|
|
71
|
+
|
|
72
|
+
float yScaled = uv.y * rows;
|
|
73
|
+
float yCell = floor(yScaled);
|
|
74
|
+
float yFrac = fract(yScaled);
|
|
75
|
+
|
|
76
|
+
// falling offset based on time and column seed
|
|
77
|
+
float fall = fract((uTime * speed * 0.25) + seed * 10.0);
|
|
78
|
+
|
|
79
|
+
float dropPos = fract(seed * 7.3 + uTime * 0.25 * speed);
|
|
80
|
+
float drop2 = fract(seed * 3.1 + uTime * 0.57 * speed * 0.7);
|
|
81
|
+
|
|
82
|
+
float d1 = abs(yCell / rows - dropPos);
|
|
83
|
+
float d2 = abs(yCell / rows - drop2);
|
|
84
|
+
|
|
85
|
+
float head = exp(-pow((yFrac + fract(yCell*0.9183) * 0.35), 2.0) * 40.0);
|
|
86
|
+
float tail = exp(-d1 * 8.0) + 0.5 * exp(-d2 * 12.0);
|
|
87
|
+
|
|
88
|
+
float glyphSeed = hash12(vec2(colIndexF, yCell));
|
|
89
|
+
float glyphPulse = pulse(fract(yScaled - (seed*3.0 + uTime*0.9*speed)), 0.12);
|
|
90
|
+
float glyph = smoothstep(0.35, 0.55, glyphSeed + 0.2 * noise2(vec2(colIndexF * 0.13, yCell * 0.07 + uTime * 0.1)));
|
|
91
|
+
|
|
92
|
+
float brightness = clamp( 1.6 * head + 0.9 * tail * glyph + 0.35 * glyph * glyphPulse, 0.0, 1.6);
|
|
93
|
+
|
|
94
|
+
float colWidth = 1.0 / cols * 0.9;
|
|
95
|
+
float colMask = smoothstep(0.0, 1.0, 1.0 - abs(uv.x - colX) / (colWidth * 0.6));
|
|
96
|
+
|
|
97
|
+
float jitter = noise2(vec2(colIndexF * 0.7, yCell * 0.9 + uTime * 0.2)) * 0.5;
|
|
98
|
+
float charV = smoothstep(0.0, 1.0, 1.0 - abs(yFrac - (0.5 + jitter*0.2)) * 2.0);
|
|
99
|
+
|
|
100
|
+
float intensity = brightness * colMask * charV;
|
|
101
|
+
|
|
102
|
+
vec3 baseGreen = vec3(0.1, 0.95, 0.15);
|
|
103
|
+
vec3 headColor = mix(baseGreen * 0.6, vec3(1.0, 1.0, 0.9), clamp(head * 2.0, 0.0, 1.0));
|
|
104
|
+
vec3 tailColor = baseGreen * (0.6 + 0.8 * glyph);
|
|
105
|
+
|
|
106
|
+
float headFactor = clamp(head * 2.0, 0.0, 1.0);
|
|
107
|
+
vec3 col = mix(tailColor, headColor, headFactor) * intensity;
|
|
108
|
+
|
|
109
|
+
float bgNoise = 0.04 * (noise2(uv * 400.0 + uTime * 0.03));
|
|
110
|
+
float verticalVignette = pow(1.0 - abs(v - 0.5) * 1.6, 1.8);
|
|
111
|
+
vec3 bg = vec3(0.01, 0.03, 0.01) * verticalVignette + bgNoise;
|
|
112
|
+
|
|
113
|
+
float stars = smoothstep(0.9996, 1.0, noise2(uv * 2000.0 + uTime * 0.1));
|
|
114
|
+
vec3 starCol = vec3(0.6, 1.0, 0.6) * stars * 1.2;
|
|
115
|
+
|
|
116
|
+
vec3 final = col + bg + starCol;
|
|
117
|
+
|
|
118
|
+
float glow = pow(intensity, 1.6) * 0.9;
|
|
119
|
+
final += vec3(glow * 0.14, glow * 0.22, glow * 0.06);
|
|
120
|
+
|
|
121
|
+
final = 1.0 - exp(-final * 1.6);
|
|
122
|
+
final = pow(final, vec3(0.9));
|
|
123
|
+
|
|
124
|
+
gl_FragColor = vec4(final, 1.0);
|
|
125
|
+
}
|
|
126
|
+
`;
|
|
127
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* *\
|
|
2
|
+
** ----------------------------------------------- **
|
|
3
|
+
** Calliope - Pixos Game Engine **
|
|
4
|
+
** ----------------------------------------------- **
|
|
5
|
+
** Copyright (c) 2020-2025 - Kyle Derby MacInnis **
|
|
6
|
+
** **
|
|
7
|
+
** Any unauthorized distribution or transfer **
|
|
8
|
+
** of this work is strictly prohibited. **
|
|
9
|
+
** **
|
|
10
|
+
** All Rights Reserved. **
|
|
11
|
+
** ----------------------------------------------- **
|
|
12
|
+
\* */
|
|
13
|
+
|
|
14
|
+
export default function vs() {
|
|
15
|
+
return `
|
|
16
|
+
attribute vec4 aPosition;
|
|
17
|
+
varying vec4 vPosition;
|
|
18
|
+
void main() {
|
|
19
|
+
vPosition = aPosition;
|
|
20
|
+
gl_Position = aPosition;
|
|
21
|
+
}
|
|
22
|
+
`;
|
|
23
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/* *\
|
|
2
|
+
** ----------------------------------------------- **
|
|
3
|
+
** Calliope - Pixos Game Engine **
|
|
4
|
+
** ----------------------------------------------- **
|
|
5
|
+
** Copyright (c) 2020-2025 - Kyle Derby MacInnis **
|
|
6
|
+
** **
|
|
7
|
+
** Any unauthorized distribution or transfer **
|
|
8
|
+
** of this work is strictly prohibited. **
|
|
9
|
+
** **
|
|
10
|
+
** All Rights Reserved. **
|
|
11
|
+
** ----------------------------------------------- **
|
|
12
|
+
\* */
|
|
13
|
+
|
|
14
|
+
export default function fs() {
|
|
15
|
+
return `
|
|
16
|
+
precision mediump float;
|
|
17
|
+
|
|
18
|
+
uniform samplerCube uSkybox;
|
|
19
|
+
uniform mat4 uViewDirectionProjectionInverse;
|
|
20
|
+
uniform float uTime;
|
|
21
|
+
|
|
22
|
+
varying vec4 vPosition;
|
|
23
|
+
|
|
24
|
+
// Hash function for clouds
|
|
25
|
+
float hash(vec2 p) {
|
|
26
|
+
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Value noise
|
|
30
|
+
float noise(vec2 p) {
|
|
31
|
+
vec2 i = floor(p);
|
|
32
|
+
vec2 f = fract(p);
|
|
33
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
34
|
+
|
|
35
|
+
float a = hash(i);
|
|
36
|
+
float b = hash(i + vec2(1.0, 0.0));
|
|
37
|
+
float c = hash(i + vec2(0.0, 1.0));
|
|
38
|
+
float d = hash(i + vec2(1.0, 1.0));
|
|
39
|
+
|
|
40
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Fractal brownian motion for fluffy clouds
|
|
44
|
+
float fbm(vec2 p) {
|
|
45
|
+
float value = 0.0;
|
|
46
|
+
float amplitude = 0.5;
|
|
47
|
+
for (int i = 0; i < 5; i++) {
|
|
48
|
+
value += amplitude * noise(p);
|
|
49
|
+
amplitude *= 0.5;
|
|
50
|
+
p *= 2.0;
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
void main() {
|
|
56
|
+
vec4 t = uViewDirectionProjectionInverse * vPosition;
|
|
57
|
+
vec3 dir = normalize(t.xyz / t.w);
|
|
58
|
+
|
|
59
|
+
// Height-based gradient
|
|
60
|
+
float y = dir.y * 0.5 + 0.5;
|
|
61
|
+
|
|
62
|
+
// Sun position (rising from the east)
|
|
63
|
+
vec3 sunDir = normalize(vec3(1.0, 0.3, 0.0));
|
|
64
|
+
float sunDot = dot(dir, sunDir);
|
|
65
|
+
|
|
66
|
+
// Morning color palette - soft and fresh
|
|
67
|
+
vec3 horizonColor = vec3(1.0, 0.85, 0.7); // Warm peachy horizon
|
|
68
|
+
vec3 skyColor = vec3(0.5, 0.7, 0.95); // Soft blue sky
|
|
69
|
+
vec3 sunColor = vec3(1.0, 1.0, 0.9); // Bright morning sun
|
|
70
|
+
vec3 glowColor = vec3(1.0, 0.9, 0.7); // Warm glow
|
|
71
|
+
|
|
72
|
+
// Base sky gradient - softer transition
|
|
73
|
+
vec3 color = mix(horizonColor, skyColor, pow(y, 0.6));
|
|
74
|
+
|
|
75
|
+
// Morning sun glow
|
|
76
|
+
float glow = pow(max(0.0, sunDot), 8.0);
|
|
77
|
+
color = mix(color, glowColor, glow * 0.6);
|
|
78
|
+
|
|
79
|
+
// Bright sun disc
|
|
80
|
+
float sun = pow(max(0.0, sunDot), 512.0) * 2.0;
|
|
81
|
+
color = mix(color, sunColor, min(1.0, sun));
|
|
82
|
+
|
|
83
|
+
// Fluffy morning clouds
|
|
84
|
+
float time = uTime * 0.015;
|
|
85
|
+
vec2 cloudUV = dir.xz / (abs(dir.y) + 0.3) * 1.5 + vec2(time, 0.0);
|
|
86
|
+
float clouds = fbm(cloudUV * 2.0);
|
|
87
|
+
|
|
88
|
+
// Shape clouds nicely
|
|
89
|
+
clouds = smoothstep(0.35, 0.65, clouds);
|
|
90
|
+
|
|
91
|
+
// Clouds are bright white in morning light
|
|
92
|
+
vec3 cloudColor = mix(vec3(0.95, 0.95, 1.0), vec3(1.0, 0.98, 0.9), glow);
|
|
93
|
+
|
|
94
|
+
// Apply clouds more in the upper sky
|
|
95
|
+
float cloudMask = smoothstep(0.1, 0.6, y) * (1.0 - smoothstep(0.7, 1.0, y));
|
|
96
|
+
color = mix(color, cloudColor, clouds * cloudMask * 0.7);
|
|
97
|
+
|
|
98
|
+
// Soft atmospheric haze near horizon
|
|
99
|
+
float haze = exp(-y * 4.0);
|
|
100
|
+
color = mix(color, horizonColor * 1.1, haze * 0.25);
|
|
101
|
+
|
|
102
|
+
// Add subtle light rays
|
|
103
|
+
float rays = pow(max(0.0, sunDot), 2.0) * noise(dir.xz * 10.0 + time * 0.5) * 0.15;
|
|
104
|
+
color += vec3(rays) * (1.0 - y);
|
|
105
|
+
|
|
106
|
+
gl_FragColor = vec4(color, 1.0);
|
|
107
|
+
}
|
|
108
|
+
`;
|
|
109
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* *\
|
|
2
|
+
** ----------------------------------------------- **
|
|
3
|
+
** Calliope - Pixos Game Engine **
|
|
4
|
+
** ----------------------------------------------- **
|
|
5
|
+
** Copyright (c) 2020-2025 - Kyle Derby MacInnis **
|
|
6
|
+
** **
|
|
7
|
+
** Any unauthorized distribution or transfer **
|
|
8
|
+
** of this work is strictly prohibited. **
|
|
9
|
+
** **
|
|
10
|
+
** All Rights Reserved. **
|
|
11
|
+
** ----------------------------------------------- **
|
|
12
|
+
\* */
|
|
13
|
+
|
|
14
|
+
export default function vs() {
|
|
15
|
+
return `
|
|
16
|
+
attribute vec4 aPosition;
|
|
17
|
+
varying vec4 vPosition;
|
|
18
|
+
void main() {
|
|
19
|
+
vPosition = aPosition;
|
|
20
|
+
gl_Position = aPosition;
|
|
21
|
+
}
|
|
22
|
+
`;
|
|
23
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/* *\
|
|
2
|
+
** ----------------------------------------------- **
|
|
3
|
+
** Calliope - Pixos Game Engine **
|
|
4
|
+
** ----------------------------------------------- **
|
|
5
|
+
** Copyright (c) 2020-2025 - Kyle Derby MacInnis **
|
|
6
|
+
** **
|
|
7
|
+
** Any unauthorized distribution or transfer **
|
|
8
|
+
** of this work is strictly prohibited. **
|
|
9
|
+
** **
|
|
10
|
+
** All Rights Reserved. **
|
|
11
|
+
** ----------------------------------------------- **
|
|
12
|
+
\* */
|
|
13
|
+
|
|
14
|
+
export default function fs() {
|
|
15
|
+
return `
|
|
16
|
+
precision mediump float;
|
|
17
|
+
uniform samplerCube uSkybox;
|
|
18
|
+
varying vec4 vPosition;
|
|
19
|
+
uniform mat4 uViewDirectionProjectionInverse;
|
|
20
|
+
uniform float uTime;
|
|
21
|
+
|
|
22
|
+
// Hash function
|
|
23
|
+
float hash(vec2 p) {
|
|
24
|
+
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
float hash3(vec3 p) {
|
|
28
|
+
return fract(sin(dot(p, vec3(12.9898, 78.233, 45.164))) * 43758.5453);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Value noise
|
|
32
|
+
float noise(vec2 p) {
|
|
33
|
+
vec2 i = floor(p);
|
|
34
|
+
vec2 f = fract(p);
|
|
35
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
36
|
+
|
|
37
|
+
float a = hash(i);
|
|
38
|
+
float b = hash(i + vec2(1.0, 0.0));
|
|
39
|
+
float c = hash(i + vec2(0.0, 1.0));
|
|
40
|
+
float d = hash(i + vec2(1.0, 1.0));
|
|
41
|
+
|
|
42
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
void main() {
|
|
46
|
+
vec4 t = uViewDirectionProjectionInverse * vPosition;
|
|
47
|
+
vec3 dir = normalize(t.xyz / t.w);
|
|
48
|
+
float time = uTime;
|
|
49
|
+
|
|
50
|
+
// Dark base with subtle color
|
|
51
|
+
vec3 color = vec3(0.02, 0.01, 0.05);
|
|
52
|
+
|
|
53
|
+
// Animated grid lines (synthwave style)
|
|
54
|
+
vec2 gridUV = dir.xz / (dir.y + 0.3);
|
|
55
|
+
|
|
56
|
+
// Perspective grid
|
|
57
|
+
float gridX = abs(sin(gridUV.x * 8.0 + time * 0.5));
|
|
58
|
+
float gridZ = abs(sin(gridUV.y * 4.0 - time * 2.0));
|
|
59
|
+
|
|
60
|
+
// Grid lines with glow
|
|
61
|
+
float lineX = pow(gridX, 20.0);
|
|
62
|
+
float lineZ = pow(gridZ, 20.0);
|
|
63
|
+
float grid = max(lineX, lineZ);
|
|
64
|
+
|
|
65
|
+
// Only show grid below horizon
|
|
66
|
+
float belowHorizon = smoothstep(0.1, -0.3, dir.y);
|
|
67
|
+
grid *= belowHorizon;
|
|
68
|
+
|
|
69
|
+
// Neon pink/cyan colors
|
|
70
|
+
vec3 neonPink = vec3(1.0, 0.1, 0.5);
|
|
71
|
+
vec3 neonCyan = vec3(0.1, 1.0, 0.8);
|
|
72
|
+
vec3 neonPurple = vec3(0.6, 0.1, 1.0);
|
|
73
|
+
|
|
74
|
+
// Alternate line colors
|
|
75
|
+
vec3 gridColor = mix(neonPink, neonCyan, sin(time * 0.3) * 0.5 + 0.5);
|
|
76
|
+
color += gridColor * grid * 0.8;
|
|
77
|
+
|
|
78
|
+
// Add horizon glow
|
|
79
|
+
float horizonGlow = exp(-abs(dir.y) * 5.0);
|
|
80
|
+
vec3 horizonColor = mix(neonPink, neonPurple, sin(time * 0.2) * 0.5 + 0.5);
|
|
81
|
+
color += horizonColor * horizonGlow * 0.6;
|
|
82
|
+
|
|
83
|
+
// Animated neon sun
|
|
84
|
+
vec3 sunDir = normalize(vec3(sin(time * 0.1), 0.1, -1.0));
|
|
85
|
+
float sunDot = dot(dir, sunDir);
|
|
86
|
+
|
|
87
|
+
// Segmented retro sun
|
|
88
|
+
float sunMask = step(0.9, sunDot);
|
|
89
|
+
float sunStripes = step(0.5, sin(dir.y * 40.0 - time * 2.0));
|
|
90
|
+
vec3 sunColor = mix(neonPink, vec3(1.0, 0.5, 0.0), (1.0 - dir.y) * 2.0);
|
|
91
|
+
color = mix(color, sunColor * (0.5 + sunStripes * 0.5), sunMask);
|
|
92
|
+
|
|
93
|
+
// Sun glow
|
|
94
|
+
float sunGlow = pow(max(0.0, sunDot), 4.0) * (1.0 - sunMask);
|
|
95
|
+
color += sunColor * sunGlow * 0.5;
|
|
96
|
+
|
|
97
|
+
// Scattered stars with chromatic aberration
|
|
98
|
+
float starDensity = 0.003;
|
|
99
|
+
vec3 starPos = dir * 50.0;
|
|
100
|
+
float star = step(1.0 - starDensity, hash3(floor(starPos)));
|
|
101
|
+
if (star > 0.0 && dir.y > 0.0) {
|
|
102
|
+
float twinkle = sin(time * 5.0 + hash3(floor(starPos)) * 6.28) * 0.3 + 0.7;
|
|
103
|
+
vec3 starColor = mix(neonCyan, neonPink, hash3(floor(starPos) + 1.0));
|
|
104
|
+
color += starColor * twinkle * 0.8;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Scanlines effect
|
|
108
|
+
float scanline = sin(gl_FragCoord.y * 2.0) * 0.03;
|
|
109
|
+
color *= 1.0 - scanline;
|
|
110
|
+
|
|
111
|
+
// Vignette
|
|
112
|
+
vec2 uv = gl_FragCoord.xy / vec2(800.0, 600.0); // Approximate
|
|
113
|
+
float vignette = 1.0 - length(uv - 0.5) * 0.5;
|
|
114
|
+
color *= vignette;
|
|
115
|
+
|
|
116
|
+
gl_FragColor = vec4(color, 1.0);
|
|
117
|
+
}
|
|
118
|
+
`;
|
|
119
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* *\
|
|
2
|
+
** ----------------------------------------------- **
|
|
3
|
+
** Calliope - Pixos Game Engine **
|
|
4
|
+
** ----------------------------------------------- **
|
|
5
|
+
** Copyright (c) 2020-2025 - Kyle Derby MacInnis **
|
|
6
|
+
** **
|
|
7
|
+
** Any unauthorized distribution or transfer **
|
|
8
|
+
** of this work is strictly prohibited. **
|
|
9
|
+
** **
|
|
10
|
+
** All Rights Reserved. **
|
|
11
|
+
** ----------------------------------------------- **
|
|
12
|
+
\* */
|
|
13
|
+
|
|
14
|
+
export default function vs() {
|
|
15
|
+
return `
|
|
16
|
+
attribute vec4 aPosition;
|
|
17
|
+
varying vec4 vPosition;
|
|
18
|
+
void main() {
|
|
19
|
+
vPosition = aPosition;
|
|
20
|
+
gl_Position = aPosition;
|
|
21
|
+
}
|
|
22
|
+
`;
|
|
23
|
+
}
|