feat: default projection mapping with shift + M

This commit is contained in:
2026-05-20 23:20:49 +02:00
parent 7db7f4b89e
commit bb84350591
3 changed files with 61 additions and 2 deletions
+2 -1
View File
@@ -235,10 +235,11 @@ GROUP_1_6_Y=19
GROUP_1_6_Z=
# Same for group 2
GROUP_2_ACTIVE_COUNT=3
GROUP_2_ACTIVE_COUNT=4
GROUP_2_ACTIVE_1=36
GROUP_2_ACTIVE_2=68
GROUP_2_ACTIVE_3=52
GROUP_2_ACTIVE_4=11077
GROUP_2_COUNT=7
GROUP_2_1_X=37
GROUP_2_1_Y=53
+33 -1
View File
@@ -6,8 +6,40 @@
in vec2 vUV;
out vec4 fragColor;
#include inc_map.glsl
uniform sampler2D iTex0;
uniform int iAutoRand;
uniform vec3 iGroup2_4[7];
void main() {
fragColor = texture(iTex0, vUV);
bool visible = iAutoRand < 1 && iGroup2_4[0].x > 0;
bool invert = iAutoRand < 1 && iGroup2_4[0].y > 0;
bool rect = iAutoRand < 1 && iGroup2_4[0].z > 0;
vec2 uv2 = vUV;
if (visible) {
vec2 p1 = iAutoRand < 1 ? vec2(iGroup2_4[6].xy) : vec2(0);
vec2 p2 = iAutoRand < 1 ? vec2(iGroup2_4[1].xy) : vec2(0);
vec2 p3 = iAutoRand < 1 ? vec2(iGroup2_4[3].xy) : vec2(0);
vec2 p4 = iAutoRand < 1 ? vec2(iGroup2_4[5].xy) : vec2(0);
p2.x = 1 - p2.x;
p3.y = 1 - p3.y;
p4.x = 1 - p4.x;
p4.y = 1 - p4.y;
uv2 = project_4p(vUV, p1, p2, p3, p4);
}
vec4 color = texture(iTex0, invert ? vUV : uv2);
if (visible) {
float mask = step(0, uv2.x) * step(-1, -uv2.x) * step(0, uv2.y) * step(-1, -uv2.y);
color *= mix(mask, 1 - mask, invert ? 1 : 0);
color = mix(color, mix(color, color + mask * vec4(1), step(uv2.x, 0.01) + step(uv2.y, 0.01) + step(1 - uv2.y, 0.01) + step(1 - uv2.x, 0.01)), rect ? 1 : 0);
}
fragColor = color;
}
+26
View File
@@ -0,0 +1,26 @@
#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