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.
Files changed (157) hide show
  1. package/README.md +36 -286
  2. package/dist/bundle.js +13 -3
  3. package/dist/bundle.js.map +1 -1
  4. package/dist/style.css +1 -0
  5. package/package.json +43 -44
  6. package/src/components/WebGLView.jsx +318 -0
  7. package/src/css/pixos.css +372 -0
  8. package/src/engine/actions/animate.js +41 -0
  9. package/src/engine/actions/changezone.js +135 -0
  10. package/src/engine/actions/chat.js +109 -0
  11. package/src/engine/actions/dialogue.js +90 -0
  12. package/src/engine/actions/face.js +22 -0
  13. package/src/engine/actions/greeting.js +28 -0
  14. package/src/engine/actions/interact.js +86 -0
  15. package/src/engine/actions/move.js +67 -0
  16. package/src/engine/actions/patrol.js +109 -0
  17. package/src/engine/actions/prompt.js +185 -0
  18. package/src/engine/actions/script.js +42 -0
  19. package/src/engine/core/audio/AudioSystem.js +543 -0
  20. package/src/engine/core/cutscene/PxcPlayer.js +956 -0
  21. package/src/engine/core/cutscene/manager.js +243 -0
  22. package/src/engine/core/database/index.js +75 -0
  23. package/src/engine/core/debug/index.js +371 -0
  24. package/src/engine/core/hud/index.js +765 -0
  25. package/src/engine/core/index.js +540 -0
  26. package/src/engine/core/input/gamepad/Controller.js +71 -0
  27. package/src/engine/core/input/gamepad/ControllerButtons.js +231 -0
  28. package/src/engine/core/input/gamepad/ControllerStick.js +173 -0
  29. package/src/engine/core/input/gamepad/index.js +592 -0
  30. package/src/engine/core/input/keyboard.js +196 -0
  31. package/src/engine/core/input/manager.js +485 -0
  32. package/src/engine/core/input/mouse.js +203 -0
  33. package/src/engine/core/input/touch.js +175 -0
  34. package/src/engine/core/mode/manager.js +199 -0
  35. package/src/engine/core/net/manager.js +535 -0
  36. package/src/engine/core/queue/action.js +83 -0
  37. package/src/engine/core/queue/event.js +82 -0
  38. package/src/engine/core/queue/index.js +44 -0
  39. package/src/engine/core/queue/loadable.js +33 -0
  40. package/src/engine/core/render/CameraEffects.js +494 -0
  41. package/src/engine/core/render/FrustumCuller.js +417 -0
  42. package/src/engine/core/render/LODManager.js +285 -0
  43. package/src/engine/core/render/ParticleManager.js +529 -0
  44. package/src/engine/core/render/TextureAtlas.js +465 -0
  45. package/src/engine/core/render/camera.js +338 -0
  46. package/src/engine/core/render/light.js +197 -0
  47. package/src/engine/core/render/manager.js +1079 -0
  48. package/src/engine/core/render/shaders.js +110 -0
  49. package/src/engine/core/render/skybox.js +342 -0
  50. package/src/engine/core/resource/manager.js +133 -0
  51. package/src/engine/core/resource/object.js +611 -0
  52. package/src/engine/core/resource/texture.js +103 -0
  53. package/src/engine/core/resource/tileset.js +177 -0
  54. package/src/engine/core/scene/avatar.js +215 -0
  55. package/src/engine/core/scene/speech.js +138 -0
  56. package/src/engine/core/scene/sprite.js +702 -0
  57. package/src/engine/core/scene/spritz.js +189 -0
  58. package/src/engine/core/scene/world.js +681 -0
  59. package/src/engine/core/scene/zone.js +1167 -0
  60. package/src/engine/core/store/index.js +110 -0
  61. package/src/engine/dynamic/animatedSprite.js +64 -0
  62. package/src/engine/dynamic/animatedTile.js +98 -0
  63. package/src/engine/dynamic/avatar.js +110 -0
  64. package/src/engine/dynamic/map.js +174 -0
  65. package/src/engine/dynamic/sprite.js +255 -0
  66. package/src/engine/dynamic/spritz.js +119 -0
  67. package/src/engine/events/EventSystem.js +609 -0
  68. package/src/engine/events/camera.js +142 -0
  69. package/src/engine/events/chat.js +75 -0
  70. package/src/engine/events/menu.js +186 -0
  71. package/src/engine/scripting/CallbackManager.js +514 -0
  72. package/src/engine/scripting/PixoScriptInterpreter.js +81 -0
  73. package/src/engine/scripting/PixoScriptLibrary.js +704 -0
  74. package/src/engine/shaders/effects/index.js +450 -0
  75. package/src/engine/shaders/fs.js +222 -0
  76. package/src/engine/shaders/particles/fs.js +41 -0
  77. package/src/engine/shaders/particles/vs.js +61 -0
  78. package/src/engine/shaders/picker/fs.js +34 -0
  79. package/src/engine/shaders/picker/init.js +62 -0
  80. package/src/engine/shaders/picker/vs.js +42 -0
  81. package/src/engine/shaders/pxsl/README.md +250 -0
  82. package/src/engine/shaders/pxsl/index.js +25 -0
  83. package/src/engine/shaders/pxsl/library.js +608 -0
  84. package/src/engine/shaders/pxsl/manager.js +338 -0
  85. package/src/engine/shaders/pxsl/specification.js +363 -0
  86. package/src/engine/shaders/pxsl/transpiler.js +753 -0
  87. package/src/engine/shaders/skybox/cosmic/fs.js +147 -0
  88. package/src/engine/shaders/skybox/cosmic/vs.js +23 -0
  89. package/src/engine/shaders/skybox/matrix/fs.js +127 -0
  90. package/src/engine/shaders/skybox/matrix/vs.js +23 -0
  91. package/src/engine/shaders/skybox/morning/fs.js +109 -0
  92. package/src/engine/shaders/skybox/morning/vs.js +23 -0
  93. package/src/engine/shaders/skybox/neon/fs.js +119 -0
  94. package/src/engine/shaders/skybox/neon/vs.js +23 -0
  95. package/src/engine/shaders/skybox/sky/fs.js +114 -0
  96. package/src/engine/shaders/skybox/sky/vs.js +23 -0
  97. package/src/engine/shaders/skybox/sunset/fs.js +101 -0
  98. package/src/engine/shaders/skybox/sunset/vs.js +23 -0
  99. package/src/engine/shaders/transition/blur/fs.js +42 -0
  100. package/src/engine/shaders/transition/blur/vs.js +26 -0
  101. package/src/engine/shaders/transition/cross/fs.js +36 -0
  102. package/src/engine/shaders/transition/cross/vs.js +26 -0
  103. package/src/engine/shaders/transition/crossBlur/fs.js +41 -0
  104. package/src/engine/shaders/transition/crossBlur/vs.js +25 -0
  105. package/src/engine/shaders/transition/dissolve/fs.js +78 -0
  106. package/src/engine/shaders/transition/dissolve/vs.js +24 -0
  107. package/src/engine/shaders/transition/fade/fs.js +31 -0
  108. package/src/engine/shaders/transition/fade/vs.js +27 -0
  109. package/src/engine/shaders/transition/iris/fs.js +52 -0
  110. package/src/engine/shaders/transition/iris/vs.js +24 -0
  111. package/src/engine/shaders/transition/pixelate/fs.js +44 -0
  112. package/src/engine/shaders/transition/pixelate/vs.js +24 -0
  113. package/src/engine/shaders/transition/slide/fs.js +53 -0
  114. package/src/engine/shaders/transition/slide/vs.js +24 -0
  115. package/src/engine/shaders/transition/swirl/fs.js +39 -0
  116. package/src/engine/shaders/transition/swirl/vs.js +26 -0
  117. package/src/engine/shaders/transition/wipe/fs.js +50 -0
  118. package/src/engine/shaders/transition/wipe/vs.js +24 -0
  119. package/src/engine/shaders/vs.js +60 -0
  120. package/src/engine/utils/CameraController.js +506 -0
  121. package/src/engine/utils/ObjHelper.js +551 -0
  122. package/src/engine/utils/debug-logger.js +110 -0
  123. package/src/engine/utils/enums.js +305 -0
  124. package/src/engine/utils/generator.js +156 -0
  125. package/src/engine/utils/index.js +21 -0
  126. package/src/engine/utils/loaders/ActionLoader.js +77 -0
  127. package/src/engine/utils/loaders/AudioLoader.js +157 -0
  128. package/src/engine/utils/loaders/EventLoader.js +66 -0
  129. package/src/engine/utils/loaders/ObjectLoader.js +67 -0
  130. package/src/engine/utils/loaders/SpriteLoader.js +77 -0
  131. package/src/engine/utils/loaders/TilesetLoader.js +103 -0
  132. package/src/engine/utils/loaders/index.js +21 -0
  133. package/src/engine/utils/math/matrix4.js +367 -0
  134. package/src/engine/utils/math/vector.js +458 -0
  135. package/src/engine/utils/obj/_old_js/index.js +46 -0
  136. package/src/engine/utils/obj/_old_js/layout.js +308 -0
  137. package/src/engine/utils/obj/_old_js/material.js +711 -0
  138. package/src/engine/utils/obj/_old_js/mesh.js +761 -0
  139. package/src/engine/utils/obj/_old_js/utils.js +647 -0
  140. package/src/engine/utils/obj/index.js +24 -0
  141. package/src/engine/utils/obj/js/index.js +277 -0
  142. package/src/engine/utils/obj/js/loader.js +232 -0
  143. package/src/engine/utils/obj/layout.js +246 -0
  144. package/src/engine/utils/obj/material.js +665 -0
  145. package/src/engine/utils/obj/mesh.js +657 -0
  146. package/src/engine/utils/obj/ts/index.ts +72 -0
  147. package/src/engine/utils/obj/ts/layout.ts +265 -0
  148. package/src/engine/utils/obj/ts/material.ts +760 -0
  149. package/src/engine/utils/obj/ts/mesh.ts +785 -0
  150. package/src/engine/utils/obj/ts/utils.ts +501 -0
  151. package/src/engine/utils/obj/utils.js +428 -0
  152. package/src/engine/utils/resources.js +18 -0
  153. package/src/index.jsx +55 -0
  154. package/src/spritz/player.js +18 -0
  155. package/src/spritz/readme.md +18 -0
  156. package/LICENSE +0 -437
  157. 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
+ }