27 lines
874 B
GLSL
27 lines
874 B
GLSL
#ifndef INC_MAP
|
|
#define INC_MAP
|
|
|
|
vec2 project_4p(vec2 uv, vec2 p1, vec2 p2, vec2 p3, vec2 p4) {
|
|
float k1 = (p4.y - p3.y) / (p2.y - p3.y);
|
|
float k2 = (p3.y - p1.y) / (p2.y - p3.y);
|
|
float a = (p4.x - p3.x + k1 * p3.x - k1 * p2.x) / (p1.x - p3.x - k2 * p3.x + k2 * p2.x);
|
|
float b = k1 + a * k2;
|
|
float c = 1 - a - b;
|
|
// https://math.stackexchange.com/questions/296794/finding-the-transform-matrix-from-4-projected-points-with-javascript/339033#339033
|
|
mat3 projection_a = mat3(
|
|
a * p1.x, a * p1.y, a,
|
|
b * p2.x, b * p2.y, b,
|
|
c * p3.x, c * p3.y, c
|
|
);
|
|
mat3 projection_a_prime = inverse(projection_a);
|
|
mat3 projection_b = mat3(
|
|
0, 0, -1,
|
|
1, 0, 1,
|
|
0, 1, 1
|
|
);
|
|
vec3 tmp = projection_b * projection_a_prime * vec3(uv, 1);
|
|
return tmp.xy / tmp.z;
|
|
}
|
|
|
|
#endif
|