From 05ab61818d2b3a21c9fb52bd889a6197895a9d99 Mon Sep 17 00:00:00 2001
From: DarkGod <darkgod@net-core.org>
Date: Mon, 22 Jul 2013 10:06:31 +0200
Subject: [PATCH] fix resetargs on shaders

---
 game/engines/default/engine/Shader.lua        |   8 +++
 game/modules/tome/class/Actor.lua             |   3 +-
 .../data/gfx/particles_images/shadowfire.png  | Bin 2826 -> 14468 bytes
 .../tome/data/gfx/shaders/flamewings.frag     |  57 +++++++++---------
 .../tome/data/gfx/shaders/flamewings.lua      |   4 +-
 .../tome/data/gfx/shaders/shadowfire.frag     |  56 ++++++++---------
 6 files changed, 66 insertions(+), 62 deletions(-)

diff --git a/game/engines/default/engine/Shader.lua b/game/engines/default/engine/Shader.lua
index 60d64c6bf5..f3520d73ed 100644
--- a/game/engines/default/engine/Shader.lua
+++ b/game/engines/default/engine/Shader.lua
@@ -26,6 +26,7 @@ module(..., package.seeall, class.make)
 _M.verts = {}
 _M.frags = {}
 _M.progs = {}
+_M.progsreset = {}
 
 loadNoDelay = true
 
@@ -153,6 +154,7 @@ function _M:loaded()
 		end
 
 		_M.progs[self.totalname] = self:createProgram(def)
+		_M.progsreset[self.totalname] = def.resetargs
 
 		self.shad = _M.progs[self.totalname]
 		if self.shad then
@@ -161,6 +163,12 @@ function _M:loaded()
 			end
 		end
 	end
+
+	if self.shad and _M.progsreset[self.totalname] then
+		for k, v in pairs(_M.progsreset[self.totalname]) do
+			self:setUniform(k, v(self))
+		end
+	end
 end
 
 function _M:setUniform(k, v)
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 19dc652a32..aeb20221d1 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -838,10 +838,9 @@ end
 
 function _M:makeMapObject(tiles, idx)
 	local mo, z, lastmo = Actor.makeMapObject(self, tiles, idx)
+	if mo and mo:isValid() then return mo, z, lasmo end
 
 	if idx == 1 and mo then
-		if mo and mo:isValid() then return mo, z, lasmo end
-
 		local submo = core.map.newObject(self.uid, 1, self:check("display_on_seen"), self:check("display_on_remember"), self:check("display_on_unknown"), self:check("display_x") or 0, self:check("display_y") or 0, self:check("display_w") or 1, self:check("display_h") or 1, self:check("display_scale") or 1)
 		local tex, texx, texy, pos_x, pos_y = tiles:get("", 0, 0, 0, 0, 0, 0, "invis.png", false, false, true)
 		submo:texture(0, tex, false, texx, texy, pos_x, pos_y)
diff --git a/game/modules/tome/data/gfx/particles_images/shadowfire.png b/game/modules/tome/data/gfx/particles_images/shadowfire.png
index c064c0240a8fcd7db2706231f3b01a0988df99fd..498e5be7e975633390336a9417ec126bc392ef6f 100644
GIT binary patch
literal 14468
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
WnDszyt(txS0000<MNUMnLSTa0vfz;b

literal 2826
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
G6aE9WxCJu+

diff --git a/game/modules/tome/data/gfx/shaders/flamewings.frag b/game/modules/tome/data/gfx/shaders/flamewings.frag
index f767b0333a..ab9448c151 100644
--- a/game/modules/tome/data/gfx/shaders/flamewings.frag
+++ b/game/modules/tome/data/gfx/shaders/flamewings.frag
@@ -101,41 +101,45 @@ vec2 snoise2(vec3 pos)
 	return vec2(snoise(pos), snoise(pos + vec3(0.0, 0.0, 1.0)));
 }
 
-vec2 GetFireDelta(float currTime, vec2 pos, float freqMult, float stretchMult)
+float GetFireDelta(float currTime, vec2 pos, float freqMult, float stretchMult, float scrollSpeed, float evolutionSpeed)
 {
 	//firewall
-	vec2 delta = vec2(0.0, 0.0);
+	float delta = 0.0;
 //	pos.y += (1.0 - pos.y) * 0.5;
 	//pos.y += 0.5;
 	pos.y /= stretchMult;
 	pos *= freqMult;
-	pos.y += currTime * 3.0;
+	pos.y += currTime * scrollSpeed;
+
 //	pos.y -= currTime * 3.0;
-	delta += vec2(0.0, snoise(vec3(pos * 1.0, currTime * 0.5)) * 1.5);
-	delta += vec2(0.0, snoise(vec3(pos * 2.0, currTime * 1.0)) * 1.5);
-	delta += vec2(0.0, snoise(vec3(pos * 4.0, currTime * 2.0)) * 1.5);
-	delta += vec2(0.0, snoise(vec3(pos * 8.0, currTime * 4.0)) * 1.5);
-	delta += vec2(0.0, snoise(vec3(pos * 16.0, currTime * 8.0)) * 0.5);
-	/*delta += vec2(0.0, snoise(vec3(pos * 2.0, 1*currTime * 4.0)) * 0.4);
-	delta += vec2(0.0, snoise(vec3(pos * 8.0, 1*currTime * 16.0)) * 0.8);
-	delta += vec2(0.0, snoise(vec3(pos * 16.0, 1*currTime * 32.0)) * 0.4);*/
+	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)
 {
-	if(pos.x < 0.0 || pos.x > 1.0 || pos.y < 0.0 || pos.y > 1.0) return vec4(0.0, 0.0, 0.0, 0.0);
-	/*if(mod(pos.x, 0.1) < 0.05 ^ mod(pos.y, 0.1) < 0.05)
-		return vec4(pos.x, pos.y, 0, 1);
-	else
-		return vec4(0, 0, 0, 1);*/
-	vec2 delta = GetFireDelta(currTime, pos, freqMult, stretchMult);
-	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 + delta * ampMult;
-	displacedPoint.y = min(0.99, displacedPoint.y);
-	displacedPoint.y = max(0.01, displacedPoint.y);
-	return texture2D(tex, displacedPoint);
+	vec4 fireColor = vec4(0.0, 0.0, 0.0, 0.0);
+	if(pos.x > 0.0 && pos.x < 1.0 && pos.y > 0.0 && pos.y < 1.0)
+	{
+		/*if(mod(pos.x, 0.1) < 0.05 ^ mod(pos.y, 0.1) < 0.05)
+			return vec4(pos.x, pos.y, 0, 1);
+		else
+			return vec4(0, 0, 0, 1);*/
+		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);
+		
+		fireColor = texture2D(tex, displacedPoint);
+	}
+	return fireColor;
 }
 
 void main(void)
@@ -144,16 +148,15 @@ void main(void)
 	pos.x = 0.5 + (pos.x - 0.5) * ellipsoidalFactor;
 	pos = vec2(0.5, 0.5) + (pos - vec2(0.5, 0.5)) * 1.1;
 	
-	float foldRatio = 1.0;
-//	float foldRatio = max(0.0, min(1.0, (tick - tick_start) / time_factor * 0.5));
-//	foldRatio = (1.0 + sin(tick / time_factor * 20.0)) * 0.5;
+	float foldRatio = max(0.0, min(1.0, (tick - tick_start) / time_factor * 5.0));
+	//foldRatio = (1.0 + sin(tick / time_factor * 20.0)) * 0.5;
 	foldRatio *= 0.95 + 0.05 * sin(tick / time_factor * 15.0);
 	
 	float radius = 0.25 * (foldRatio * 0.5 + 0.5);
 	vec2 center = vec2(0.5, 0.85 - radius);
 	float timeShift = 0.0;
 	if(pos.x > 0.5)
-		timeShift = 100;
+		timeShift = 100.0;
 		
 	
 	if(length(pos - center) < radius)
diff --git a/game/modules/tome/data/gfx/shaders/flamewings.lua b/game/modules/tome/data/gfx/shaders/flamewings.lua
index 5114faecfe..377de4ebdf 100644
--- a/game/modules/tome/data/gfx/shaders/flamewings.lua
+++ b/game/modules/tome/data/gfx/shaders/flamewings.lua
@@ -22,11 +22,13 @@ return {
 	vert = nil,
 	args = {
 		tex = { texture = 0 },
-		tick_start = core.game.getTime(),
 		time_factor = 6000,
 		ellipsoidalFactor = 1.7, --1 is perfect circle, >1 is ellipsoidal
 		oscillationSpeed = 0.0, --oscillation between ellipsoidal and spherical form
 		growRatio = 1.0,
 	},
+	resetargs = {
+		tick_start = function() return core.game.getTime() end,
+	},
 	clone = false,
 }
diff --git a/game/modules/tome/data/gfx/shaders/shadowfire.frag b/game/modules/tome/data/gfx/shaders/shadowfire.frag
index ef7a2cc638..335e33cd77 100644
--- a/game/modules/tome/data/gfx/shaders/shadowfire.frag
+++ b/game/modules/tome/data/gfx/shaders/shadowfire.frag
@@ -1,19 +1,17 @@
 uniform sampler2D tex;
 uniform float tick;
 uniform float aadjust;
-uniform float time_factor = 25000.0;
+uniform vec3 color;
+uniform float time_factor;
 
-uniform float ellipsoidalFactor = 1.5; //1 is perfect circle, >1 is ellipsoidal
-uniform float oscillationSpeed = 20.0; //oscillation between ellipsoidal and spherical form
+uniform float ellipsoidalFactor = 1.4; //1 is perfect circle, >1 is ellipsoidal
+uniform float oscillationSpeed = 10.0; //oscillation between ellipsoidal and spherical form
 
 uniform float antialiasingRadius = 0.6; //1.0 is no antialiasing, 0.0 - fully smoothed(looks worse)
-uniform float shieldIntensity = 0.15; //physically affects shield layer thickness
+uniform float shieldIntensity = 0.2; //physically affects shield layer thickness
 
-uniform vec4 leftColor1 = vec4(11.0  / 255.0, 8.0 / 255.0, 10.0 / 255.0, 1.0);
-uniform vec4 leftColor2 = vec4(171.0 / 255.0, 4.0 / 255.0, 10.0 / 255.0, 1.0);
-
-uniform vec4 rightColor1 = vec4(171.0 / 255.0, 4.0 / 255.0, 10.0 / 255.0, 1.0);
-uniform vec4 rightColor2 = vec4(11.0  / 255.0, 8.0 / 255.0, 10.0 / 255.0, 1.0);
+uniform vec4 color1 = vec4(11.0  / 255.0, 8.0 / 255.0, 10.0 / 255.0, 1.0);
+uniform vec4 color2 = vec4(171.0 / 255.0, 4.0 / 255.0, 10.0 / 255.0, 1.0);
 	
 vec4 permute( vec4 x ) {
 
@@ -112,37 +110,40 @@ vec2 snoise2(vec3 pos)
 
 
 
-vec2 GetFireDelta(float currTime, vec2 pos, float freqMult, float stretchMult)
+float GetFireDelta(float currTime, vec2 pos, float freqMult, float stretchMult, float scrollSpeed, float evolutionSpeed)
 {
 	//firewall
-	vec2 delta = vec2(0.0, 0.0);
+	float delta = 0;
 //	pos.y += (1.0 - pos.y) * 0.5;
 	//pos.y += 0.5;
 	pos.y /= stretchMult;
 	pos *= freqMult;
-	pos.y -= currTime * 3.0;
-//	pos.y -= currTime * 3.0;
-	delta += vec2(0.0, snoise(vec3(pos * 1.0, currTime * 2.0)) * 0.8);
-	delta += vec2(0.0, snoise(vec3(pos * 2.0, currTime * 4.0)) * 0.4);
-	delta += vec2(0.0, snoise(vec3(pos * 8.0, currTime * 16.0)) * 0.8);
-	delta += vec2(0.0, snoise(vec3(pos * 16.0, currTime * 32.0)) * 0.4);
+	pos.y += currTime * scrollSpeed;
+
+	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)
+vec4 GetFireColor(float currTime, vec2 pos, float freqMult, float stretchMult, float ampMult, float textureCoord)
 {
-	vec2 delta = GetFireDelta(currTime, pos, freqMult, stretchMult);
+	float delta = GetFireDelta(currTime, pos, freqMult, stretchMult, 3.0, 0.5);
 	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 + delta * ampMult;
+	vec2 displacedPoint = pos + vec2(0, delta * ampMult);
 	displacedPoint.y = min(0.99, displacedPoint.y);
 	displacedPoint.y = max(0.01, displacedPoint.y);
+	displacedPoint.x = textureCoord;
+	
 	return texture2D(tex, displacedPoint);
 }
 
 void main(void)
 {
-	shieldIntensity = 0.2;
 	vec2 radius = vec2(0.5, 0.5) - gl_TexCoord[0].xy;
 	//radius.x *= ellispoidalFactor; //for simple ellipsoid
 	//comment next line for regular spherical shield
@@ -169,18 +170,9 @@ void main(void)
 	}
 	
 	vec2 sphericalProjectedCoord = vec2(0.5, 0.5) + radius * (alpha / (3.141592 / 2.0)) / radiusLen;
-
-	float verticalRatio = gl_TexCoord[0].y;
-	if(verticalRatio < 0.5)
-		verticalRatio = pow(verticalRatio * 2.0, 1.0) / 2.0;
-	else
-		verticalRatio = 1.0 - pow((1.0 - verticalRatio) * 2.0, 1.0) / 2.0;
-	
-	vec4 leftColor = leftColor1 * verticalRatio + leftColor2 * (1.0 - verticalRatio);
-	vec4 rightColor = rightColor1 * verticalRatio + rightColor2 * (1.0 - verticalRatio);
 	
-	vec4 c1 = GetFireColor(tick / time_factor + 0.0 , vec2(sphericalProjectedCoord.y, (-0.3 + 0.0 + sphericalProjectedCoord.x) * 0.7), 1.0, 2.0, 1.0) * leftColor;
-	vec4 c2 = GetFireColor(tick / time_factor + 10.0, vec2(sphericalProjectedCoord.y, (-0.3 + 1.0 - sphericalProjectedCoord.x) * 0.7), 1.0, 2.0, 1.0) * rightColor;
+	vec4 c1 = GetFireColor(tick / time_factor + 0.0 , vec2(sphericalProjectedCoord.y, (-0.2 + 0.0 + sphericalProjectedCoord.x) * 0.8), 1.0, 2.0, 1.0, 0.25);
+	vec4 c2 = GetFireColor(tick / time_factor + 10.0, vec2(sphericalProjectedCoord.y, (-0.2 + 1.0 - sphericalProjectedCoord.x) * 0.8), 1.0, 2.0, 1.0, 0.75);
 	vec4 c = c1 * c1.a + c2 * (1.0 - c1.a);
 	
 	c.a = 1.0 - exp(-c.a * shieldIntensity / cos(alpha));
-- 
GitLab