@@ -38,7 +38,7 @@ public static void transform(
38
38
39
39
if (parameters .inputs .hasTex ()) {
40
40
root .replaceReferenceExpressions (t , "gl_MultiTexCoord0" ,
41
- "vec4(_vert_tex_diffuse_coord, 0.0, 1.0)" );
41
+ "vec4((_vert_tex_diffuse_coord_bias * u_TexCoordShrink) + _vert_tex_diffuse_coord, 0.0, 1.0)" );
42
42
} else {
43
43
root .replaceReferenceExpressions (t , "gl_MultiTexCoord0" ,
44
44
"vec4(0.0, 0.0, 0.0, 1.0)" );
@@ -136,20 +136,49 @@ public static void injectVertInit(
136
136
// translated from sodium's chunk_vertex.glsl
137
137
"vec3 _vert_position;" ,
138
138
"vec2 _vert_tex_diffuse_coord;" ,
139
- "ivec2 _vert_tex_light_coord;" ,
139
+ "vec2 _vert_tex_diffuse_coord_bias;" ,
140
+ "vec2 _vert_tex_light_coord;" ,
141
+ "const uint POSITION_BITS = 20u;" ,
142
+ "const uint POSITION_MAX_COORD = 1u << POSITION_BITS;" ,
143
+ "const uint POSITION_MAX_VALUE = POSITION_MAX_COORD - 1u;" ,
144
+
145
+ "const uint TEXTURE_BITS = 15u;" ,
146
+ "const uint TEXTURE_MAX_COORD = 1u << TEXTURE_BITS;" ,
147
+ "const uint TEXTURE_MAX_VALUE = TEXTURE_MAX_COORD - 1u;" ,
148
+
149
+ "const float VERTEX_SCALE = 32.0 / float(POSITION_MAX_COORD);" ,
150
+ "const float VERTEX_OFFSET = -8.0;" ,
140
151
"vec4 _vert_color;" ,
141
152
"uint _draw_id;" ,
153
+ """
154
+ uvec3 _deinterleave_u20x3(uvec2 data) {
155
+ uvec3 hi = (uvec3(data.x) >> uvec3(0u, 10u, 20u)) & 0x3FFu;
156
+ uvec3 lo = (uvec3(data.y) >> uvec3(0u, 10u, 20u)) & 0x3FFu;
157
+
158
+ return (hi << 10u) | lo;
159
+ }
160
+ """ ,
161
+ """
162
+ vec2 _get_texcoord() {
163
+ return vec2(a_TexCoord & TEXTURE_MAX_VALUE) / float(TEXTURE_MAX_COORD);
164
+ }
165
+ """ ,
166
+ """
167
+ vec2 _get_texcoord_bias() {
168
+ return mix(vec2(-1.0), vec2(1.0), bvec2(a_TexCoord >> TEXTURE_BITS));
169
+ }
170
+ """ ,
142
171
"const uint MATERIAL_USE_MIP_OFFSET = 0u;" ,
143
172
"float _material_mip_bias(uint material) {\n " +
144
173
" return ((material >> MATERIAL_USE_MIP_OFFSET) & 1u) != 0u ? 0.0f : -4.0f;\n " +
145
174
"}" ,
146
175
"void _vert_init() {" +
147
- "_vert_position = (vec3(a_PosId.xyz ) * 0.00048828125 + -8.0"
148
- + " );" +
149
- "_vert_tex_diffuse_coord = (a_TexCoord * " + ( 1.0f / 32768.0f ) + " );" +
150
- "_vert_tex_light_coord = a_LightCoord ;" +
176
+ "_vert_position = (_deinterleave_u20x3(a_Position ) * VERTEX_SCALE) + VERTEX_OFFSET;" +
177
+ "_vert_tex_diffuse_coord = _get_texcoord( );" +
178
+ "_vert_tex_diffuse_coord_bias = _get_texcoord_bias( );" +
179
+ "_vert_tex_light_coord = vec2(a_LightAndData.xy) ;" +
151
180
"_vert_color = " + separateAo + ";" +
152
- "_draw_id = (a_PosId.w >> 8u) & 0xFFu ; }" ,
181
+ "_draw_id = a_LightAndData[3] ; }" ,
153
182
154
183
"uvec3 _get_relative_chunk_coord(uint pos) {\n " +
155
184
" // Packing scheme is defined by LocalSectionIndex\n " +
@@ -158,10 +187,11 @@ public static void injectVertInit(
158
187
"vec3 _get_draw_translation(uint pos) {\n " +
159
188
" return _get_relative_chunk_coord(pos) * vec3(16.0f);\n " +
160
189
"}\n " );
161
- addIfNotExists (root , t , tree , "a_PosId " , Type .U32VEC4 , StorageQualifier .StorageType .IN );
162
- addIfNotExists (root , t , tree , "a_TexCoord" , Type .F32VEC2 , StorageQualifier .StorageType .IN );
190
+ addIfNotExists (root , t , tree , "a_Position " , Type .U32VEC2 , StorageQualifier .StorageType .IN );
191
+ addIfNotExists (root , t , tree , "a_TexCoord" , Type .U32VEC2 , StorageQualifier .StorageType .IN );
163
192
addIfNotExists (root , t , tree , "a_Color" , Type .F32VEC4 , StorageQualifier .StorageType .IN );
164
- addIfNotExists (root , t , tree , "a_LightCoord" , Type .I32VEC2 , StorageQualifier .StorageType .IN );
193
+ addIfNotExists (root , t , tree , "a_LightAndData" , Type .I32VEC4 , StorageQualifier .StorageType .IN );
194
+ addIfNotExists (root , t , tree , "u_TexCoordShrink" , Type .F32VEC2 , StorageQualifier .StorageType .UNIFORM );
165
195
tree .prependMainFunctionBody (t , "_vert_init();" );
166
196
}
167
197
0 commit comments