@@ -18,21 +18,29 @@ float mx_schlick_gain(float x, float r)
1818
1919struct HextileData
2020{
21- vec2 coord1;
22- vec2 coord2;
23- vec2 coord3;
21+ vec2 coords[3 ];
2422 vec3 weights;
25- float rot_radian1;
26- float rot_radian2;
27- float rot_radian3;
28- vec2 ddx1;
29- vec2 ddx2;
30- vec2 ddx3;
31- vec2 ddy1;
32- vec2 ddy2;
33- vec2 ddy3;
23+ vec3 rotations;
24+ vec2 ddx[3 ];
25+ vec2 ddy[3 ];
3426};
3527
28+ // Helper function to compute blend weights with optional falloff
29+ vec3 mx_hextile_compute_blend_weights(vec3 luminance_weights, vec3 tile_weights, float falloff)
30+ {
31+ vec3 w = luminance_weights * pow (tile_weights, vec3 (7.0 ));
32+ w /= (w.x + w.y + w.z);
33+
34+ if (falloff != 0.5 )
35+ {
36+ w.x = mx_schlick_gain(w.x, falloff);
37+ w.y = mx_schlick_gain(w.y, falloff);
38+ w.z = mx_schlick_gain(w.z, falloff);
39+ w /= (w.x + w.y + w.z);
40+ }
41+ return w;
42+ }
43+
3644// Morten S. Mikkelsen, Practical Real-Time Hex-Tiling, Journal of Computer Graphics
3745// Techniques (JCGT), vol. 11, no. 2, 77-94, 2022
3846// http://jcgt.org/published/0011/03/05/
@@ -88,24 +96,20 @@ HextileData mx_hextile_coord(
8896
8997 // randomized rotation matrix
9098 vec2 rr = mx_radians(rotation_range);
91- float rv1 = mix (rr.x, rr.y, rand1.x * rotation);
92- float rv2 = mix (rr.x, rr.y, rand2.x * rotation);
93- float rv3 = mix (rr.x, rr.y, rand3.x * rotation);
94- float sin_r1 = sin (rv1);
95- float sin_r2 = sin (rv2);
96- float sin_r3 = sin (rv3);
97- float cos_r1 = cos (rv1);
98- float cos_r2 = cos (rv2);
99- float cos_r3 = cos (rv3);
100- mat2 rm1 = mat2 (cos_r1, - sin_r1, sin_r1, cos_r1);
101- mat2 rm2 = mat2 (cos_r2, - sin_r2, sin_r2, cos_r2);
102- mat2 rm3 = mat2 (cos_r3, - sin_r3, sin_r3, cos_r3);
99+ vec3 rand_x = vec3 (rand1.x, rand2.x, rand3.x);
100+ vec3 rotations = mix (vec3 (rr.x), vec3 (rr.y), rand_x * rotation);
101+ vec3 sin_r = sin (rotations);
102+ vec3 cos_r = cos (rotations);
103+ mat2 rm1 = mat2 (cos_r.x, - sin_r.x, sin_r.x, cos_r.x);
104+ mat2 rm2 = mat2 (cos_r.y, - sin_r.y, sin_r.y, cos_r.y);
105+ mat2 rm3 = mat2 (cos_r.z, - sin_r.z, sin_r.z, cos_r.z);
103106
104107 // randomized scale
105- vec2 sr = scale_range;
106- vec2 scale1 = vec2 (mix (1.0 , mix (sr.x, sr.y, rand1.y), scale));
107- vec2 scale2 = vec2 (mix (1.0 , mix (sr.x, sr.y, rand2.y), scale));
108- vec2 scale3 = vec2 (mix (1.0 , mix (sr.x, sr.y, rand3.y), scale));
108+ vec3 rand_y = vec3 (rand1.y, rand2.y, rand3.y);
109+ vec3 scales = mix (vec3 (1.0 ), mix (vec3 (scale_range.x), vec3 (scale_range.y), rand_y), scale);
110+ vec2 scale1 = vec2 (scales.x);
111+ vec2 scale2 = vec2 (scales.y);
112+ vec2 scale3 = vec2 (scales.z);
109113
110114 // randomized offset
111115 vec2 offset1 = mix (vec2 (offset_range.x), vec2 (offset_range.y), rand1 * offset);
@@ -114,24 +118,22 @@ HextileData mx_hextile_coord(
114118
115119 HextileData tile_data;
116120 tile_data.weights = vec3 (w1, w2, w3);
117- tile_data.rot_radian1 = rv1;
118- tile_data.rot_radian2 = rv2;
119- tile_data.rot_radian3 = rv3;
121+ tile_data.rotations = rotations;
120122
121123 // get coord
122- tile_data.coord1 = (mx_matrix_mul((coord - ctr1), rm1) / scale1) + ctr1 + offset1;
123- tile_data.coord2 = (mx_matrix_mul((coord - ctr2), rm2) / scale2) + ctr2 + offset2;
124- tile_data.coord3 = (mx_matrix_mul((coord - ctr3), rm3) / scale3) + ctr3 + offset3;
124+ tile_data.coords[ 0 ] = (mx_matrix_mul((coord - ctr1), rm1) / scale1) + ctr1 + offset1;
125+ tile_data.coords[ 1 ] = (mx_matrix_mul((coord - ctr2), rm2) / scale2) + ctr2 + offset2;
126+ tile_data.coords[ 2 ] = (mx_matrix_mul((coord - ctr3), rm3) / scale3) + ctr3 + offset3;
125127
126128 // derivatives
127129 vec2 ddx = dFdx (coord);
128130 vec2 ddy = dFdy (coord);
129- tile_data.ddx1 = mx_matrix_mul(ddx, rm1) / scale1;
130- tile_data.ddx2 = mx_matrix_mul(ddx, rm2) / scale2;
131- tile_data.ddx3 = mx_matrix_mul(ddx, rm3) / scale3;
132- tile_data.ddy1 = mx_matrix_mul(ddy, rm1) / scale1;
133- tile_data.ddy2 = mx_matrix_mul(ddy, rm2) / scale2;
134- tile_data.ddy3 = mx_matrix_mul(ddy, rm3) / scale3;
131+ tile_data.ddx[ 0 ] = mx_matrix_mul(ddx, rm1) / scale1;
132+ tile_data.ddx[ 1 ] = mx_matrix_mul(ddx, rm2) / scale2;
133+ tile_data.ddx[ 2 ] = mx_matrix_mul(ddx, rm3) / scale3;
134+ tile_data.ddy[ 0 ] = mx_matrix_mul(ddy, rm1) / scale1;
135+ tile_data.ddy[ 1 ] = mx_matrix_mul(ddy, rm2) / scale2;
136+ tile_data.ddy[ 2 ] = mx_matrix_mul(ddy, rm3) / scale3;
135137
136138 return tile_data;
137139}
0 commit comments