Merge branch 'master' into ocio_node
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
// Input texture
|
||||
uniform sampler2D ove_maintex;
|
||||
uniform sampler2D tex_in;
|
||||
uniform bool perspective_in;
|
||||
|
||||
// Input texture coordinate
|
||||
varying vec2 ove_texcoord;
|
||||
|
||||
varying vec2 q;
|
||||
varying vec2 b1;
|
||||
varying vec2 b2;
|
||||
varying vec2 b3;
|
||||
|
||||
float Wedge2D(vec2 v, vec2 w) {
|
||||
return (v.x*w.y) - (v.y*w.x);
|
||||
}
|
||||
|
||||
void main() {
|
||||
if(perspective_in){
|
||||
gl_FragColor = texture2D(tex_in, ove_texcoord);
|
||||
} else {
|
||||
float A = Wedge2D(b2, b3);
|
||||
float B = Wedge2D(b3, q) - Wedge2D(b1, b2);
|
||||
float C = Wedge2D(b1, q);
|
||||
|
||||
vec2 uv;
|
||||
|
||||
// solve for v
|
||||
if (abs(A) < 0.001) {
|
||||
uv.y = -C/B;
|
||||
} else {
|
||||
float discrim = B*B - 4.0*A*C;
|
||||
uv.y = 0.5 * (-B + sqrt(discrim)) / A;
|
||||
}
|
||||
|
||||
// solve for u
|
||||
vec2 denom = b1 + uv.y * b3;
|
||||
if (abs(denom.x) > abs(denom.y)) {
|
||||
uv.x = (q.x - b2.x * uv.y) / denom.x;
|
||||
} else {
|
||||
uv.x = (q.y - b2.y * uv.y) / denom.y;
|
||||
}
|
||||
|
||||
uv.y = 1.0 - uv.y;
|
||||
|
||||
gl_FragColor = texture2D(tex_in, uv);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
uniform bool perspective_in;
|
||||
uniform vec2 top_left_in;
|
||||
uniform vec2 top_right_in;
|
||||
uniform vec2 bottom_left_in;
|
||||
uniform vec2 bottom_right_in;
|
||||
|
||||
uniform vec2 resolution_in;
|
||||
|
||||
uniform mat4 ove_mvpmat;
|
||||
|
||||
attribute vec4 a_position;
|
||||
attribute vec2 a_texcoord;
|
||||
|
||||
varying vec2 ove_texcoord;
|
||||
|
||||
varying vec2 q;
|
||||
varying vec2 b1;
|
||||
varying vec2 b2;
|
||||
varying vec2 b3;
|
||||
|
||||
void main() {
|
||||
// The slider inputs only contain the amount they have changed rather than
|
||||
// their pixel locations so we adjust them here.
|
||||
vec2 t_l = top_left_in;
|
||||
vec2 t_r = top_right_in + vec2(resolution_in.x, 0.0);
|
||||
vec2 b_r = bottom_right_in + resolution_in;
|
||||
vec2 b_l = bottom_left_in + vec2(0.0, resolution_in.y);
|
||||
|
||||
gl_Position = ove_mvpmat * a_position;
|
||||
|
||||
if (perspective_in){
|
||||
// Find the center of the quadrilateral by finding where the two diagonals intersect.
|
||||
// https://www.reedbeta.com/blog/quadrilateral-interpolation-part-1/
|
||||
|
||||
// Here we calculate the gradient and constant (y = mx + c) for each diagonal.
|
||||
float m1 = (t_r.y - b_l.y)/(t_r.x - b_l.x);
|
||||
float c1 = b_l.y - m1 * b_l.x;
|
||||
float m2 = (b_r.y - t_l.y)/(b_r.x - t_l.x);
|
||||
float c2 = t_l.y - m2 * t_l.x;
|
||||
|
||||
// Find the intersection by setting the two line equations equal and rearrange.
|
||||
float mid_x = (c2 - c1) / (m1 - m2);
|
||||
float mid_y = m1 * mid_x + c1;
|
||||
|
||||
// Find the distance from each corner to our center point
|
||||
float d0 = length(vec2(mid_x - b_l.x, mid_y - b_l.y));
|
||||
float d1 = length(vec2(b_r.x - mid_x, mid_y - b_r.y));
|
||||
float d2 = length(vec2(t_r.x - mid_x, t_r.y - mid_y));
|
||||
float d3 = length(vec2(mid_x - t_l.x, t_l.y - mid_y));
|
||||
|
||||
float q = 1.0;
|
||||
|
||||
/*
|
||||
Vertex IDs (aspect ratio irrelevant):
|
||||
0_____1
|
||||
3|\ |
|
||||
| \ |
|
||||
| \ |
|
||||
| \ |
|
||||
|____\|2
|
||||
4 5
|
||||
*/
|
||||
|
||||
if (gl_VertexID == 0 || gl_VertexID == 3) {
|
||||
q = (d1+d3)/d3;
|
||||
} else if (gl_VertexID == 1) {
|
||||
q = (d0+d2)/d2;
|
||||
} else if (gl_VertexID == 2 || gl_VertexID == 5) {
|
||||
q = (d3+d1)/d1;
|
||||
} else {
|
||||
q = (d2+d0)/d0;
|
||||
}
|
||||
|
||||
gl_Position[0] *= q;
|
||||
gl_Position[1] *= q;
|
||||
gl_Position[3] = q;
|
||||
} else{
|
||||
// https://www.reedbeta.com/blog/quadrilateral-interpolation-part-2/
|
||||
vec2 pos;
|
||||
|
||||
if (gl_VertexID == 0 || gl_VertexID == 3) { // top left
|
||||
pos = t_l;
|
||||
} else if (gl_VertexID == 1) { // top right
|
||||
pos = t_r;
|
||||
} else if (gl_VertexID == 2 || gl_VertexID == 5) { // bottom right
|
||||
pos = b_r;
|
||||
} else if (gl_VertexID == 4) { // bottom left
|
||||
pos = b_l;
|
||||
}
|
||||
|
||||
q = pos - b_l;
|
||||
b1 = b_r - b_l;
|
||||
b2 = t_l - b_l;
|
||||
b3 = b_l - b_r - t_l + t_r;
|
||||
}
|
||||
|
||||
|
||||
ove_texcoord = a_texcoord;
|
||||
}
|
||||
Reference in New Issue
Block a user