diff --git a/default/forge_project.cfg b/default/forge_project.cfg index 27059ce..c0e1c70 100644 --- a/default/forge_project.cfg +++ b/default/forge_project.cfg @@ -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 diff --git a/default/frag9.glsl b/default/frag9.glsl index a7a1e61..08cb4f3 100644 --- a/default/frag9.glsl +++ b/default/frag9.glsl @@ -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; } diff --git a/default/inc_map.glsl b/default/inc_map.glsl new file mode 100644 index 0000000..b7f2434 --- /dev/null +++ b/default/inc_map.glsl @@ -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