🔧 Pass initial pointer position to magic lamp shader

This commit is contained in:
Simon Schneegans
2023-08-02 19:25:31 +02:00
parent b53b856c3e
commit 21dc4eac3d
2 changed files with 39 additions and 24 deletions
+11 -7
View File
@@ -15,7 +15,8 @@
// The content from common.glsl is automatically prepended to each shader effect. // The content from common.glsl is automatically prepended to each shader effect.
uniform vec2 uActorScale; uniform vec2 uActorScale;
uniform vec2 uPointerPos; uniform vec2 uInitialPointerPos;
uniform vec2 uCurrentPointerPos;
uniform vec2 uControlPointA; uniform vec2 uControlPointA;
uniform vec2 uControlPointB; uniform vec2 uControlPointB;
@@ -25,22 +26,25 @@ void main() {
vec2 texcoord = iTexCoord.st; vec2 texcoord = iTexCoord.st;
texcoord = texcoord * uActorScale + 0.5 - uActorScale * 0.5; texcoord = texcoord * uActorScale + 0.5 - uActorScale * 0.5;
vec2 warp = (texcoord - uPointerPos) * progress / (1.0 - progress); vec2 warp = (texcoord - uInitialPointerPos) * progress / (1.0 - progress);
texcoord += warp * 0.5;
vec4 oColor = getInputColor(texcoord); vec4 oColor = getInputColor(texcoord + warp);
if (length(texcoord - uPointerPos) < 0.02) { if (length(texcoord - uInitialPointerPos) < 0.02) {
oColor = vec4(1.0); oColor = vec4(1.0);
} }
if (length(texcoord - uControlPointA) < 0.02) { if (length(texcoord - uCurrentPointerPos) < 0.02) {
oColor = vec4(1.0, 0.0, 0.0, 1.0); oColor = vec4(1.0, 0.0, 0.0, 1.0);
} }
if (length(texcoord - uControlPointB) < 0.02) { if (length(texcoord - uControlPointA) < 0.02) {
oColor = vec4(0.0, 1.0, 0.0, 1.0); 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); setOutputColor(oColor);
} }
+25 -14
View File
@@ -39,13 +39,18 @@ var MagicLamp = class {
this.shaderFactory = new ShaderFactory(this.getNick(), (shader) => { this.shaderFactory = new ShaderFactory(this.getNick(), (shader) => {
// Store uniform locations of newly created shaders. // Store uniform locations of newly created shaders.
shader._uActorScale = shader.get_uniform_location('uActorScale'); shader._uActorScale = shader.get_uniform_location('uActorScale');
shader._uPointerPos = shader.get_uniform_location('uPointerPos'); shader._uInitialPointerPos = shader.get_uniform_location('uInitialPointerPos');
shader._uCurrentPointerPos = shader.get_uniform_location('uCurrentPointerPos');
shader._uControlPointA = shader.get_uniform_location('uControlPointA'); shader._uControlPointA = shader.get_uniform_location('uControlPointA');
shader._uControlPointB = shader.get_uniform_location('uControlPointB'); shader._uControlPointB = shader.get_uniform_location('uControlPointB');
// Write all uniform values at the start of each animation. // Write all uniform values at the start of each animation.
shader.connect('begin-animation', shader.connect('begin-animation',
(shader, settings, forOpening, testMode, actor) => { (shader, settings, forOpening, testMode, actor) => {
this._initialPointerPos = null;
this._controlPointA = null;
this._controlPointB = null;
shader.set_uniform_float(shader._uActorScale, 2, [ shader.set_uniform_float(shader._uActorScale, 2, [
2.0 * Math.max(1.0, global.stage.width / actor.width), 2.0 * Math.max(1.0, global.stage.width / actor.width),
2.0 * Math.max(1.0, global.stage.height / actor.height) 2.0 * Math.max(1.0, global.stage.height / actor.height)
@@ -70,13 +75,19 @@ var MagicLamp = class {
localY / this._actor.height * scale[1] + 0.5 - scale[1] * 0.5, localY / this._actor.height * scale[1] + 0.5 - scale[1] * 0.5,
]; ];
}; };
const pointer = global.get_pointer(); const pointer = global.get_pointer();
{ {
const [ok, x, y] = convertCoords(pointer); const [ok, x, y] = convertCoords(pointer);
if (ok) { if (ok) {
shader.set_uniform_float(shader._uPointerPos, 2, [x, y]); if (!this._initialPointerPos) {
this._initialPointerPos = [x, y];
shader.set_uniform_float(shader._uInitialPointerPos, 2, [x, y]);
}
shader.set_uniform_float(shader._uCurrentPointerPos, 2, [x, y]);
} }
} }
@@ -86,16 +97,16 @@ var MagicLamp = class {
const controlPointA = const controlPointA =
[pointer[0] * 0.33 + 0.66 * center.x, pointer[1] * 0.33 + 0.66 * center.y]; [pointer[0] * 0.33 + 0.66 * center.x, pointer[1] * 0.33 + 0.66 * center.y];
if (!this._uControlPointA) { if (!this._controlPointA) {
this._uControlPointA = controlPointA; this._controlPointA = controlPointA;
} else { } else {
this._uControlPointA = [ this._controlPointA = [
this._uControlPointA[0] * 0.95 + controlPointA[0] * 0.05, this._controlPointA[0] * 0.95 + controlPointA[0] * 0.05,
this._uControlPointA[1] * 0.95 + controlPointA[1] * 0.05 this._controlPointA[1] * 0.95 + controlPointA[1] * 0.05
]; ];
} }
const [ok, x, y] = convertCoords(this._uControlPointA); const [ok, x, y] = convertCoords(this._controlPointA);
shader.set_uniform_float(shader._uControlPointA, 2, [x, y]); shader.set_uniform_float(shader._uControlPointA, 2, [x, y]);
} }
@@ -106,16 +117,16 @@ var MagicLamp = class {
const controlPointB = const controlPointB =
[pointer[0] * 0.66 + 0.33 * center.x, pointer[1] * 0.66 + 0.33 * center.y]; [pointer[0] * 0.66 + 0.33 * center.x, pointer[1] * 0.66 + 0.33 * center.y];
if (!this._uControlPointB) { if (!this._controlPointB) {
this._uControlPointB = controlPointB; this._controlPointB = controlPointB;
} else { } else {
this._uControlPointB = [ this._controlPointB = [
this._uControlPointB[0] * 0.9 + controlPointB[0] * 0.1, this._controlPointB[0] * 0.9 + controlPointB[0] * 0.1,
this._uControlPointB[1] * 0.9 + controlPointB[1] * 0.1 this._controlPointB[1] * 0.9 + controlPointB[1] * 0.1
]; ];
} }
const [ok, x, y] = convertCoords(this._uControlPointB); const [ok, x, y] = convertCoords(this._controlPointB);
shader.set_uniform_float(shader._uControlPointB, 2, [x, y]); shader.set_uniform_float(shader._uControlPointB, 2, [x, y]);
} }