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