From 811cd3221b4d95b3aa225a4893c4480eb94bb988 Mon Sep 17 00:00:00 2001
From: DarkGod <darkgod@net-core.org>
Date: Fri, 23 May 2014 10:56:39 +0200
Subject: [PATCH] improve starfall

---
 .../tome/data/gfx/shaders/starfall.frag       | 115 ++----------------
 1 file changed, 10 insertions(+), 105 deletions(-)

diff --git a/game/modules/tome/data/gfx/shaders/starfall.frag b/game/modules/tome/data/gfx/shaders/starfall.frag
index 6ff10dc3bd..6d46520b3c 100644
--- a/game/modules/tome/data/gfx/shaders/starfall.frag
+++ b/game/modules/tome/data/gfx/shaders/starfall.frag
@@ -5,8 +5,6 @@ uniform float time_factor;
 
 float antialiasingRadius = 0.99; //1.0 is no antialiasing, 0.0 - fully smoothed(looks worse)
 
-float snoise( vec3 v );
-
 vec4 Uberblend(vec4 col0, vec4 col1)
 {
 //  return vec4((1.0 - col0.a) * (col1.rgb) + col0.a * (col1.rgb * col1.a + col0.rgb * (1.0 - col1.a)), min(1.0, col0.a + col1.a));
@@ -22,15 +20,14 @@ vec4 Uberblend(vec4 col0, vec4 col1)
 void main(void)
 {
 	vec2 radius = vec2(0.5, 0.5) - gl_TexCoord[0].xy;
-	float shieldIntensity = 0.1; //physically affects shield layer thickness
 	//radius.x *= ellispoidalFactor; //for simple ellipsoid
 	//comment next line for regular spherical shield
 	//radius.x *= (1.0 + ellipsoidalFactor) * 0.5 + (ellipsoidalFactor - 1.0) * 0.5 * pow(cos(tick / time_factor * oscillationSpeed), 2.0);
 	
 	//on-hit wobbling effect
-	float coreTime = 0.3;
-	float outerSphereTime = 0.42;
-	float debrisStartTime = 0.38;
+	float coreTime = 0.4;
+	float outerSphereTime = 0.55 + 0.1;
+	float debrisStartTime = 0.52;
 	/*float coreTime = 0.1;
 	float outerSphereTime = 0.9;*/
 
@@ -43,6 +40,7 @@ void main(void)
 	vec4 sphereColor = vec4(0.0, 0.0, 0.0, 0.0);
 
 	float phase = clamp((tick - tick_start) / time_factor, 0.0, 1.0);
+	//float phase = mod((tick - tick_start) / time_factor, 1.0);
 
 	float innerSpherePhase = clamp(phase / coreTime, 0.0, 1.0);
 	vec3 color = clamp(gl_Color.rgb * (1.0 + pow(innerSpherePhase, 2.0) * 10.0), 0.0, 1.0);
@@ -72,15 +70,15 @@ void main(void)
 		texCoord.y = mod(texCoord.y, 0.995) * 0.5;
 		vec4 fractureColor = texture2D(tex, texCoord);
 		float phaseSubstraction = (1.0 - fracturePhase) * 0.5;
-		float fractureShininess = 0.2 + clamp((fractureColor.a - phaseSubstraction) / (1.0 - phaseSubstraction + 0.1), 0.0, 1.0) * (0.5 + fracturePhase * 40.0);
+		float fractureShininess = 0.02 + clamp((fractureColor.a - phaseSubstraction) / (1.0 - phaseSubstraction + 0.1), 0.0, 1.0) * (0.05 + fracturePhase * 4.0);
 
-		float resultShininess = fractureShininess * shieldIntensity / cos(alpha);
+		float resultShininess = fractureShininess / cos(alpha);
 		sphereColor = blackColor + vec4(color * resultShininess, 0.0);
 		sphereColor.a *= min(1.0, sphereColor.a) * antialiasingCoef;
 		gl_FragColor = vec4(0.0, 0.0, texCoord.x, 1.0);
 	}
 
-	float rayPhase = clamp(innerSpherePhase * 1.1, 0.0, 1.0);
+	float rayPhase = clamp(innerSpherePhase * 0.9 + 0.1, 0.0, 1.0);
 	vec2 raysTexPos = (clamp(radius / (radiusScale + 1e-5) + vec2(0.5, 0.5), 0.01, 0.99)) * vec2(0.5, 0.5) + vec2(0.5, 0.0);
 	vec4 raysTexColor = texture2D(tex, raysTexPos);
 	float raysSubtraction = (1.0 - rayPhase) * 1.0;
@@ -112,9 +110,8 @@ void main(void)
 			texCoord.x = mod(texCoord.x, 0.995) * 0.5;// + 0.505;
 			texCoord.y = mod(texCoord.y, 0.995) * 0.5;// + 0.505;
 
-			outerSphereColor = vec4(color, 	1.0 - exp(-100.0 * texture2D(tex, texCoord).a * shieldIntensity / cos(alpha)));
+			outerSphereColor = vec4(color, 	1.0 - exp(-55.0 * (pow(1.0 - outerSpherePhase, 3.0)) * texture2D(tex, texCoord).a / cos(alpha)));
 			outerSphereColor.a *= antialiasingCoef;
-			outerSphereColor.a *= 1.0 - pow(outerSpherePhase, 5.0);
 		}
 
 		float coreTransperency = pow(1.0 - outerSpherePhase, 2.0);
@@ -126,103 +123,11 @@ void main(void)
 		vec2 debrisTexPos = (clamp(radius + vec2(0.5, 0.5), 0.01, 0.99)) * vec2(0.5, 0.5) + vec2(0.0, 0.5);
 		vec4 debrisColor = texture2D(tex, debrisTexPos);
 		debrisColor.rgb *= color;
-		float debrisIntensity = (1.0 - pow(debrisPhase, 2.0)) * 0.5;
-		float debrisSubtraction = debrisPhase;
+		float debrisIntensity = (1.0 - pow(debrisPhase, 1.0)) * 0.5 * (1.0 - pow(1.0 - debrisPhase, 12.0));
+		float debrisSubtraction = pow(debrisPhase, 5.0);
 
 		debrisColor.a = clamp((debrisColor.a - debrisSubtraction) / (1.0 - debrisSubtraction) * debrisIntensity * 5.0, 0.0, 1.0);
 		explosionColor = Uberblend(debrisColor, explosionColor);
 	}
 	gl_FragColor = explosionColor;
 }
-
-
-vec4 permute( vec4 x ) {
-
-	return mod( ( ( x * 34.0 ) + 1.0 ) * x, 289.0 );
-
-} 
-
-vec4 taylorInvSqrt( vec4 r ) {
-
-	return 1.79284291400159 - 0.85373472095314 * r;
-
-}
-
-float snoise( vec3 v ) {
-
-	const vec2 C = vec2( 1.0 / 6.0, 1.0 / 3.0 );
-	const vec4 D = vec4( 0.0, 0.5, 1.0, 2.0 );
-
-	// First corner
-
-	vec3 i  = floor( v + dot( v, C.yyy ) );
-	vec3 x0 = v - i + dot( i, C.xxx );
-
-	// Other corners
-
-	vec3 g = step( x0.yzx, x0.xyz );
-	vec3 l = 1.0 - g;
-	vec3 i1 = min( g.xyz, l.zxy );
-	vec3 i2 = max( g.xyz, l.zxy );
-
-	vec3 x1 = x0 - i1 + 1.0 * C.xxx;
-	vec3 x2 = x0 - i2 + 2.0 * C.xxx;
-	vec3 x3 = x0 - 1. + 3.0 * C.xxx;
-
-	// Permutations
-
-	i = mod( i, 289.0 );
-	vec4 p = permute( permute( permute(
-		i.z + vec4( 0.0, i1.z, i2.z, 1.0 ) )
-		+ i.y + vec4( 0.0, i1.y, i2.y, 1.0 ) )
-		+ i.x + vec4( 0.0, i1.x, i2.x, 1.0 ) );
-
-	// Gradients
-	// ( N*N points uniformly over a square, mapped onto an octahedron.)
-
-	float n_ = 1.0 / 7.0; // N=7
-
-	vec3 ns = n_ * D.wyz - D.xzx;
-
-	vec4 j = p - 49.0 * floor( p * ns.z *ns.z );  //  mod(p,N*N)
-
-	vec4 x_ = floor( j * ns.z );
-	vec4 y_ = floor( j - 7.0 * x_ );    // mod(j,N)
-
-	vec4 x = x_ *ns.x + ns.yyyy;
-	vec4 y = y_ *ns.x + ns.yyyy;
-	vec4 h = 1.0 - abs( x ) - abs( y );
-
-	vec4 b0 = vec4( x.xy, y.xy );
-	vec4 b1 = vec4( x.zw, y.zw );
-
-
-	vec4 s0 = floor( b0 ) * 2.0 + 1.0;
-	vec4 s1 = floor( b1 ) * 2.0 + 1.0;
-	vec4 sh = -step( h, vec4( 0.0 ) );
-
-	vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
-	vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
-
-	vec3 p0 = vec3( a0.xy, h.x );
-	vec3 p1 = vec3( a0.zw, h.y );
-	vec3 p2 = vec3( a1.xy, h.z );
-	vec3 p3 = vec3( a1.zw, h.w );
-
-	// Normalise gradients
-
-	vec4 norm = taylorInvSqrt( vec4( dot( p0, p0 ), dot( p1, p1 ), dot( p2, p2 ), dot( p3, p3 ) ) );
-	p0 *= norm.x;
-	p1 *= norm.y;
-	p2 *= norm.z;
-	p3 *= norm.w;
-
-	// Mix final noise value
-
-	vec4 m = max( 0.6 - vec4( dot( x0, x0 ), dot( x1, x1 ), dot( x2, x2 ), dot( x3, x3 ) ), 0.0 );
-	m = m * m;
-	return 42.0 * dot( m*m, vec4( dot( p0, x0 ), dot( p1, x1 ),
-		dot( p2, x2 ), dot( p3, x3 ) ) );
-
-}  
-
-- 
GitLab