🔧 Pass initial pointer position to magic lamp shader
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
+28
-17
@@ -38,14 +38,19 @@ var MagicLamp = class {
|
|||||||
constructor() {
|
constructor() {
|
||||||
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._uControlPointA = shader.get_uniform_location('uControlPointA');
|
shader._uCurrentPointerPos = shader.get_uniform_location('uCurrentPointerPos');
|
||||||
shader._uControlPointB = shader.get_uniform_location('uControlPointB');
|
shader._uControlPointA = shader.get_uniform_location('uControlPointA');
|
||||||
|
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]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user