diff --git a/resources/shaders/magic-lamp.frag b/resources/shaders/magic-lamp.frag index 9510d44..bab2794 100644 --- a/resources/shaders/magic-lamp.frag +++ b/resources/shaders/magic-lamp.frag @@ -20,31 +20,50 @@ uniform vec2 uCurrentPointerPos; uniform vec2 uControlPointA; uniform vec2 uControlPointB; +vec2 threeWayMix(float fac, vec2 a, vec2 b, vec2 c) { + if (fac < 0.5) { + return mix(a, b, smoothstep(0.0, 1.0, fac * 2.0)); + } + + return mix(b, c, smoothstep(0.0, 1.0, fac * 2.0 - 1.0)); +} + void main() { - float progress = uForOpening ? 1.0 - uProgress : uProgress; vec2 texcoord = iTexCoord.st; texcoord = texcoord * uActorScale + 0.5 - uActorScale * 0.5; - vec2 warp = (texcoord - uInitialPointerPos) * progress / (1.0 - progress); + float circle = length((texcoord - uCurrentPointerPos) / uActorScale * 2.0); + float progress = uForOpening ? 1.0 - uProgress : uProgress; + progress = clamp(mix(max(0.0, uProgress*2.0 - circle), 2.0 * uProgress, uProgress), 0.0, 1.0); + // progress = smoothstep(0.0, 1.0, pow(2.0 * progress - circle, 0.5)); + + vec2 warpA = (texcoord - uControlPointA) * uProgress * progress / (1.0 - uProgress); + vec2 warpB = (texcoord - uControlPointB) * uProgress * progress / (1.0 - uProgress); + vec2 warpC = (texcoord - uCurrentPointerPos) * uProgress * progress / (1.0 - uProgress); + + vec2 warp = threeWayMix(progress, warpA, warpB, warpC); + // vec2 warp = (warpA + warpB + warpC) / (progressA + progressB + progressC); vec4 oColor = getInputColor(texcoord + warp); - if (length(texcoord - uInitialPointerPos) < 0.02) { - oColor = vec4(1.0); - } + // oColor = vec4(tritone(progress, vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0)), 1.0); - if (length(texcoord - uCurrentPointerPos) < 0.02) { - oColor = vec4(1.0, 0.0, 0.0, 1.0); - } + // if (length(texcoord - uInitialPointerPos) < 0.02) { + // oColor = vec4(1.0); + // } - if (length(texcoord - uControlPointA) < 0.02) { - oColor = vec4(0.0, 1.0, 0.0, 1.0); - } + // if (length(texcoord - uCurrentPointerPos) < 0.02) { + // oColor = vec4(1.0, 0.0, 0.0, 1.0); + // } - if (length(texcoord - uControlPointB) < 0.02) { - oColor = vec4(0.0, 0.0, 1.0, 1.0); - } + // if (length(texcoord - uControlPointA) < 0.02) { + // oColor = vec4(0.0, 1.0, 0.0, 1.0); + // } + + // if (length(texcoord - uControlPointB) < 0.02) { + // oColor = vec4(0.0, 0.0, 1.0, 1.0); + // } setOutputColor(oColor); } \ No newline at end of file diff --git a/src/effects/MagicLamp.js b/src/effects/MagicLamp.js index a4f73f7..c7d0f5f 100644 --- a/src/effects/MagicLamp.js +++ b/src/effects/MagicLamp.js @@ -101,8 +101,8 @@ var MagicLamp = class { this._controlPointA = controlPointA; } else { this._controlPointA = [ - this._controlPointA[0] * 0.95 + controlPointA[0] * 0.05, - this._controlPointA[1] * 0.95 + controlPointA[1] * 0.05 + this._controlPointA[0] * 0.99 + controlPointA[0] * 0.01, + this._controlPointA[1] * 0.99 + controlPointA[1] * 0.01 ]; } @@ -121,8 +121,8 @@ var MagicLamp = class { this._controlPointB = controlPointB; } else { this._controlPointB = [ - this._controlPointB[0] * 0.9 + controlPointB[0] * 0.1, - this._controlPointB[1] * 0.9 + controlPointB[1] * 0.1 + this._controlPointB[0] * 0.95 + controlPointB[0] * 0.05, + this._controlPointB[1] * 0.95 + controlPointB[1] * 0.05 ]; }