From c518bb2616c19e6116366749a8ee57777f1686fd Mon Sep 17 00:00:00 2001
From: DarkGod <darkgod@net-core.org>
Date: Thu, 15 Aug 2013 04:47:49 +0200
Subject: [PATCH] even better

---
 .../tome/data/gfx/particles/fireflash.lua     |   6 +-
 .../modules/tome/data/gfx/particles/flame.lua |   4 +-
 .../gfx/particles_images/arcaneshockwave.png  | Bin 0 -> 4236 bytes
 .../gfx/particles_images/flamesshockwave.png  | Bin 0 -> 4262 bytes
 .../tome/data/gfx/shaders/shockwave.frag      | 188 ++++++++++++++++++
 .../tome/data/gfx/shaders/shockwave.lua       |  37 ++++
 6 files changed, 230 insertions(+), 5 deletions(-)
 create mode 100644 game/modules/tome/data/gfx/particles_images/arcaneshockwave.png
 create mode 100644 game/modules/tome/data/gfx/particles_images/flamesshockwave.png
 create mode 100644 game/modules/tome/data/gfx/shaders/shockwave.frag
 create mode 100644 game/modules/tome/data/gfx/shaders/shockwave.lua

diff --git a/game/modules/tome/data/gfx/particles/fireflash.lua b/game/modules/tome/data/gfx/particles/fireflash.lua
index c9396dca79..c1a44039ee 100644
--- a/game/modules/tome/data/gfx/particles/fireflash.lua
+++ b/game/modules/tome/data/gfx/particles/fireflash.lua
@@ -21,7 +21,7 @@
 -- Advanced shaders
 --------------------------------------------------------------------------------------
 if core.shader.active(4) then
-use_shader = {type="fireboom"}
+use_shader = {type="shockwave"}
 base_size = 64
 
 local nb = 0
@@ -41,7 +41,7 @@ return {
 		r = 1, rv = 0, ra = 0,
 		g = 1, gv = 0, ga = 0,
 		b = 1, bv = 0, ba = 0,
-		a = 1, av = -1 / 16, aa = 0,
+		a = 0.7, av = 0, aa = 0,
 	}
 end, },
 function(self)
@@ -50,7 +50,7 @@ function(self)
 	end
 	nb = nb + 1
 end,
-1, "particles_images/fireboom"
+1, "particles_images/flamesshockwave"
 
 
 --------------------------------------------------------------------------------------
diff --git a/game/modules/tome/data/gfx/particles/flame.lua b/game/modules/tome/data/gfx/particles/flame.lua
index 8ae0ab9f70..f8acc6f9d9 100644
--- a/game/modules/tome/data/gfx/particles/flame.lua
+++ b/game/modules/tome/data/gfx/particles/flame.lua
@@ -21,7 +21,7 @@
 -- Advanced shaders
 --------------------------------------------------------------------------------------
 if core.shader.active(4) then
-use_shader = {type="fireball"}
+use_shader = {type="fireboom"}
 base_size = 64
 
 local nb = 0
@@ -50,7 +50,7 @@ function(self)
 	end
 	nb = nb + 1
 end,
-1
+1, "particles_images/fireball"
 
 --------------------------------------------------------------------------------------
 -- Default
diff --git a/game/modules/tome/data/gfx/particles_images/arcaneshockwave.png b/game/modules/tome/data/gfx/particles_images/arcaneshockwave.png
new file mode 100644
index 0000000000000000000000000000000000000000..634a0d25c7597d22eeb64387783cf59118bb9ac5
GIT binary patch
literal 4236
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
K>Q-tyNBs|($qOq0

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/particles_images/flamesshockwave.png b/game/modules/tome/data/gfx/particles_images/flamesshockwave.png
new file mode 100644
index 0000000000000000000000000000000000000000..c36da463868cfedc3f6c229334c3d7573b07cf16
GIT binary patch
literal 4262
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shaders/shockwave.frag b/game/modules/tome/data/gfx/shaders/shockwave.frag
new file mode 100644
index 0000000000..4180a9193b
--- /dev/null
+++ b/game/modules/tome/data/gfx/shaders/shockwave.frag
@@ -0,0 +1,188 @@
+uniform sampler2D tex;
+uniform float tick;
+uniform float tick_start;
+uniform float time_factor;
+
+uniform float shockwaveSpeed;
+uniform float shockwaveWidth;
+uniform float flameIntensity;
+
+uniform vec2 ellipsoidalFactor = vec2(1.0, 1.0); //(1.0, 1.0) is perfect circle, (2.0, 1.0) is vertical ellipse, (1.0, 2.0) is horizontal ellipse
+	
+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 ) ) );
+
+}  
+
+vec2 snoise2(vec3 pos)
+{
+	return vec2(snoise(pos), snoise(pos + vec3(0.0, 0.0, 1.0)));
+}
+
+float GetFireDelta(float currTime, vec2 pos, float freqMult, float stretchMult, float scrollSpeed, float evolutionSpeed)
+{
+	//firewall
+	float delta = 0;
+//	pos.y += (1.0 - pos.y) * 0.5;
+	//pos.y += 0.5;
+	pos.y /= stretchMult;
+	pos *= freqMult;
+	pos.y += currTime * scrollSpeed;
+//	pos.y -= currTime * 3.0;
+	
+	delta += snoise(vec3(pos * 1.0, currTime * 1.0 * evolutionSpeed)) * 1.5;
+	delta += snoise(vec3(pos * 2.0, currTime * 2.0 * evolutionSpeed)) * 1.5;
+	delta += snoise(vec3(pos * 4.0, currTime * 4.0 * evolutionSpeed)) * 1.5;	
+	delta += snoise(vec3(pos * 8.0, currTime * 8.0 * evolutionSpeed)) * 1.5;
+	delta += snoise(vec3(pos * 16.0, currTime * 16.0 * evolutionSpeed)) * 0.5;
+
+	return delta;
+}
+vec4 GetFireColor(float currTime, vec2 pos, float freqMult, float stretchMult, float ampMult)
+{
+	float delta = GetFireDelta(currTime, pos, freqMult, stretchMult, 3.0, 0.1);
+	delta *= min(1.0, max(0.0, 1.0 * (1.0 - pos.y)));
+	delta *= min(1.0, max(0.0, 1.0 * (0.0 + pos.y)));
+	vec2 displacedPoint = pos + vec2(0, delta * ampMult);
+	displacedPoint.y = min(0.99, displacedPoint.y);
+	displacedPoint.y = max(0.01, displacedPoint.y);
+	
+	return texture2D(tex, displacedPoint);
+}
+
+vec4 GetFireRingColor(float currTime, vec2 pos, float freqMult, float stretchMult, float ampMult, float power, float radius1, float radius2, float scrollSpeed, float paletteCoord)
+{
+	float pi = 3.141592;
+	float ang = atan(pos.y, pos.x) + pi;
+	
+	vec2 planarPos = vec2(ang / (2.0 * pi), 1.0 - (length(pos) - radius1) / (radius2 - radius1));
+	planarPos.y = pow(abs(planarPos.y), power);
+	
+	float delta =  
+		GetFireDelta(currTime, planarPos + vec2(currTime * scrollSpeed, 0.0), freqMult, stretchMult, 1.5, 0.5) * (1.0 - planarPos.x)	+ 
+		GetFireDelta(currTime, vec2(planarPos.x + currTime * scrollSpeed - 1.0, planarPos.y), freqMult, stretchMult, 1.5, 0.5) * planarPos.x;
+		
+	delta *= min(1.0, max(0.0, 1.0 * (1.0 - planarPos.y)));
+	delta *= min(1.0, max(0.0, 1.0 * (0.0 + planarPos.y)));
+
+	float verticalPos = planarPos.y + delta * ampMult;	
+	verticalPos = min(0.99, verticalPos);
+	verticalPos = max(0.01, verticalPos);
+	
+	return texture2D(tex, vec2(paletteCoord, verticalPos));
+}
+
+void main(void)
+{
+	vec2 radius = gl_TexCoord[0].xy - vec2(0.5, 0.5);
+
+	radius *= ellipsoidalFactor;
+	
+	float radiusLen = length(radius);
+		
+	
+	float ringRadius = 0.5 * max(0.0, min(1.0, ((tick - tick_start) / time_factor * shockwaveSpeed)));
+	float ringWidth = shockwaveWidth / 2.0;
+	
+	vec2 dir = radius / radiusLen;
+		
+	
+	vec4 c;
+	if(radiusLen > ringRadius - ringWidth && radiusLen < ringRadius)
+	{
+		c = GetFireRingColor(tick / time_factor +  0.0 , radius, 6.0, 15.0, flameIntensity, 1.0, ringRadius, ringRadius - ringWidth, 0.0, 0.5);
+	}else
+	{
+		c = vec4(0.0, 0.0, 0.0, 0.0);
+	}
+	c.a *= min(1.0, max(0.0, 20.0 * (1.0 - (radiusLen - (ringRadius - ringWidth)) / ringWidth)));
+	c.a *= gl_Color.a;
+	
+		
+	gl_FragColor = c;
+}
diff --git a/game/modules/tome/data/gfx/shaders/shockwave.lua b/game/modules/tome/data/gfx/shaders/shockwave.lua
new file mode 100644
index 0000000000..17a2d827a4
--- /dev/null
+++ b/game/modules/tome/data/gfx/shaders/shockwave.lua
@@ -0,0 +1,37 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012, 2013 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+return {
+	frag = "shockwave",
+	vert = nil,
+	args = {
+		tex = { texture = 0 },
+		time_factor = time_factor or 4000,
+		
+		shockwaveWidth = shockwaveWidth or 0.5, --0.1 is very thin wave, 0.9 is thick
+		shockwaveSpeed = shockwaveSpeed or 7.0,
+		flameIntensity = flameIntensity or 0.4, 
+
+		ellipsoidalFactor = {1.0, 1.0}, --1 is perfect circle, >1 is ellipsoidal
+	},
+	resetargs = {
+		tick_start = function() return core.game.getTime() end,
+	},	
+	clone = false,
+}
-- 
GitLab