feat: daybreak finale turns the contact arrival into a sunrise with a dawn chord

This commit is contained in:
2026-10-11 05:32:08 +03:00
parent c9e6ac0f29
commit b6e22a1299
37 changed files with 756 additions and 44 deletions

View File

@@ -9,6 +9,7 @@ export function createHorizonAir(resources: SceneResourceBag) {
const uniforms = {
uTime: { value: 0 },
uWarmth: { value: 0 },
uDawn: { value: 0 },
uColor: { value: new THREE.Color(0xc5646b) },
};
const material = resources.own(
@@ -22,6 +23,7 @@ export function createHorizonAir(resources: SceneResourceBag) {
fragmentShader: `
uniform float uTime;
uniform float uWarmth;
uniform float uDawn;
uniform vec3 uColor;
varying vec2 vUv;
void main(){
@@ -32,7 +34,7 @@ export function createHorizonAir(resources: SceneResourceBag) {
float colorWave=0.5+0.5*sin(vUv.x*7.0+uTime*0.035);
vec3 color=mix(uColor,vec3(0.27,0.045,0.75),colorWave*0.55);
color=mix(color,vec3(0.05,0.52,0.75),smoothstep(0.54,0.82,vUv.y)*0.3);
gl_FragColor=vec4(color,(ribbon*0.16+thin*0.032)*horizontal*(0.7+uWarmth*0.3));
gl_FragColor=vec4(color,(ribbon*0.16+thin*0.032)*horizontal*(0.7+uWarmth*0.3)*(1.0+uDawn));
#include <tonemapping_fragment>
#include <colorspace_fragment>
}
@@ -53,8 +55,10 @@ export function createHorizonAir(resources: SceneResourceBag) {
}
return {
group,
update(palette: Readonly<MutableChapterPalette>, time: number) {
/** dawn: END OF SHIFT, the air masses catch first light (gain up to 2x). */
update(palette: Readonly<MutableChapterPalette>, time: number, dawn = 0) {
uniforms.uTime.value = time;
uniforms.uDawn.value = Number.isFinite(dawn) ? Math.min(1, Math.max(0, dawn)) : 0;
uniforms.uWarmth.value = palette.warmth;
uniforms.uColor.value.copy(palette.sun);
},