feat(immersive): dramatically increase ambient animation
New effects added: - Layer rotation: each layer rotates slowly (1-2° range) - Scale breathing: zoom levels pulse in/out per layer - Pulsing vignette: edge darkening varies over time - Increased drift amplitudes: far ±0.20, mid ±0.14, near ±0.08 - Stronger brightness breathing: ±12% (was ±8%) All effects are decorrelated (different speeds/phases) for organic feel. Default intensity now 1.0 for maximum visibility.
This commit is contained in:
1 parent
cec7a799d5
commit
edca4d0bec
2 files changed
+49
-28
No files matched your search
@@ -20,11 +20,26 @@ uniform sampler2D u_texture;
|
|||||||
uniform float u_time;
|
uniform float u_time;
|
||||||
uniform float u_intensity;
|
uniform float u_intensity;
|
||||||
|
|
||||||
// Sample texture with UV offset and scale (zoom)
|
// Rotate UV around center by angle (radians)
|
||||||
vec3 sampleLayer(vec2 uv, vec2 offset, float scale) {
|
vec2 rotateUV(vec2 uv, float angle) {
|
||||||
vec2 center = vec2(0.5);
|
vec2 center = vec2(0.5);
|
||||||
|
vec2 centered = uv - center;
|
||||||
|
float c = cos(angle);
|
||||||
|
float s = sin(angle);
|
||||||
|
vec2 rotated = vec2(
|
||||||
|
centered.x * c - centered.y * s,
|
||||||
|
centered.x * s + centered.y * c
|
||||||
|
);
|
||||||
|
return rotated + center;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sample texture with offset, scale, and rotation
|
||||||
|
vec3 sampleLayer(vec2 uv, vec2 offset, float scale, float rotation) {
|
||||||
|
vec2 center = vec2(0.5);
|
||||||
|
// Apply rotation first
|
||||||
|
vec2 rotatedUV = rotateUV(uv, rotation);
|
||||||
// Apply scale (zoom) around center
|
// Apply scale (zoom) around center
|
||||||
vec2 scaledUV = center + (uv - center) * scale;
|
vec2 scaledUV = center + (rotatedUV - center) * scale;
|
||||||
// Apply offset
|
// Apply offset
|
||||||
scaledUV += offset;
|
scaledUV += offset;
|
||||||
// Clamp to valid range
|
// Clamp to valid range
|
||||||
@@ -40,39 +55,44 @@ float radialDist(vec2 uv) {
|
|||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vec2 uv = v_texCoord;
|
vec2 uv = v_texCoord;
|
||||||
float time = u_time; // Real-time seconds (no slowdown multiplier)
|
float time = u_time;
|
||||||
float intensity = u_intensity;
|
float intensity = u_intensity;
|
||||||
|
|
||||||
// ===========================================
|
// ===========================================
|
||||||
// 1. MULTI-SCALE TEXTURE SAMPLING WITH DRIFT
|
// 1. MULTI-SCALE SAMPLING WITH FULL ANIMATION
|
||||||
// ===========================================
|
// ===========================================
|
||||||
// Three depth layers with decorrelated motion
|
// Each layer has: drift, scale breathing, rotation
|
||||||
// Amplitudes increased for perceptible movement
|
// All parameters are decorrelated for organic feel
|
||||||
// Speeds kept slow but visible (~15-40 second cycles)
|
|
||||||
|
|
||||||
// Far layer: zoomed OUT, slowest drift (background)
|
// FAR LAYER: Background, slowest movement
|
||||||
float farScale = 0.7;
|
float farScaleBase = 0.7;
|
||||||
|
float farScaleBreath = farScaleBase + sin(time * 0.1) * 0.05 * intensity;
|
||||||
|
float farRotation = sin(time * 0.05) * 0.03 * intensity; // ~1.7° max
|
||||||
vec2 farOffset = vec2(
|
vec2 farOffset = vec2(
|
||||||
sin(time * 0.08) * 0.15,
|
sin(time * 0.08) * 0.20,
|
||||||
cos(time * 0.06) * 0.12
|
cos(time * 0.06) * 0.15
|
||||||
) * intensity;
|
) * intensity;
|
||||||
vec3 farLayer = sampleLayer(uv, farOffset, farScale);
|
vec3 farLayer = sampleLayer(uv, farOffset, farScaleBreath, farRotation);
|
||||||
|
|
||||||
// Mid layer: medium zoom, medium drift, different phase
|
// MID LAYER: Middle ground, medium movement
|
||||||
float midScale = 0.9;
|
float midScaleBase = 0.9;
|
||||||
|
float midScaleBreath = midScaleBase + sin(time * 0.15 + 1.0) * 0.04 * intensity;
|
||||||
|
float midRotation = sin(time * 0.08 + 2.0) * 0.025 * intensity; // ~1.4° max
|
||||||
vec2 midOffset = vec2(
|
vec2 midOffset = vec2(
|
||||||
cos(time * 0.12 + 2.0) * 0.10,
|
cos(time * 0.12 + 2.0) * 0.14,
|
||||||
sin(time * 0.10 + 1.0) * 0.08
|
sin(time * 0.10 + 1.0) * 0.12
|
||||||
) * intensity;
|
) * intensity;
|
||||||
vec3 midLayer = sampleLayer(uv, midOffset, midScale);
|
vec3 midLayer = sampleLayer(uv, midOffset, midScaleBreath, midRotation);
|
||||||
|
|
||||||
// Near layer: zoomed IN, faster drift (foreground)
|
// NEAR LAYER: Foreground, fastest movement
|
||||||
float nearScale = 1.3;
|
float nearScaleBase = 1.3;
|
||||||
|
float nearScaleBreath = nearScaleBase + sin(time * 0.2 + 2.5) * 0.06 * intensity;
|
||||||
|
float nearRotation = sin(time * 0.12 + 4.0) * 0.02 * intensity; // ~1.1° max
|
||||||
vec2 nearOffset = vec2(
|
vec2 nearOffset = vec2(
|
||||||
sin(time * 0.15 + 3.5) * 0.06,
|
sin(time * 0.18 + 3.5) * 0.08,
|
||||||
cos(time * 0.13 + 2.5) * 0.05
|
cos(time * 0.15 + 2.5) * 0.07
|
||||||
) * intensity;
|
) * intensity;
|
||||||
vec3 nearLayer = sampleLayer(uv, nearOffset, nearScale);
|
vec3 nearLayer = sampleLayer(uv, nearOffset, nearScaleBreath, nearRotation);
|
||||||
|
|
||||||
// ===========================================
|
// ===========================================
|
||||||
// 2. SCALE-DEPENDENT UV DRIFT (handled above)
|
// 2. SCALE-DEPENDENT UV DRIFT (handled above)
|
||||||
@@ -109,8 +129,9 @@ void main() {
|
|||||||
// ADDITIONAL DEPTH ENHANCEMENT
|
// ADDITIONAL DEPTH ENHANCEMENT
|
||||||
// ===========================================
|
// ===========================================
|
||||||
|
|
||||||
// Subtle vignette (darken edges for depth)
|
// Pulsing vignette (darken edges, intensity varies)
|
||||||
float vignette = 1.0 - radial * 0.35;
|
float vignetteStrength = 0.30 + sin(time * 0.18) * 0.08 * intensity;
|
||||||
|
float vignette = 1.0 - radial * vignetteStrength;
|
||||||
color *= vignette;
|
color *= vignette;
|
||||||
|
|
||||||
// Gentle luminance preservation (30% blend)
|
// Gentle luminance preservation (30% blend)
|
||||||
@@ -123,8 +144,8 @@ void main() {
|
|||||||
vec3 tintBottom = vec3(1.0, 0.96, 0.92);
|
vec3 tintBottom = vec3(1.0, 0.96, 0.92);
|
||||||
color *= mix(tintBottom, tintTop, v_texCoord.y);
|
color *= mix(tintBottom, tintTop, v_texCoord.y);
|
||||||
|
|
||||||
// Brightness breathing (slow pulse, more visible)
|
// Brightness breathing (pronounced pulse)
|
||||||
float breath = 1.0 + sin(time * 0.25) * 0.08 * intensity;
|
float breath = 1.0 + sin(time * 0.3) * 0.12 * intensity;
|
||||||
color *= breath;
|
color *= breath;
|
||||||
|
|
||||||
fragColor = vec4(color, 1.0);
|
fragColor = vec4(color, 1.0);
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ export interface ImmersiveConfig {
|
|||||||
/** Default configuration */
|
/** Default configuration */
|
||||||
export const DEFAULT_IMMERSIVE_CONFIG: ImmersiveConfig = {
|
export const DEFAULT_IMMERSIVE_CONFIG: ImmersiveConfig = {
|
||||||
targetFps: 30,
|
targetFps: 30,
|
||||||
ambientIntensity: 0.8, // Increased for visible ambient motion
|
ambientIntensity: 1.0, // Full intensity for maximum ambient motion
|
||||||
pauseWhenHidden: true,
|
pauseWhenHidden: true,
|
||||||
debugOverlay: false,
|
debugOverlay: false,
|
||||||
};
|
};
|
||||||
Reference in new issue
Block a user