diff --git a/Effects/building.eff b/Effects/building.eff index 2f602b9ea..cb770434f 100644 --- a/Effects/building.eff +++ b/Effects/building.eff @@ -170,21 +170,13 @@ 11 - rotPitchWtexX0 + attrib1 12 - wtexY0FRtexx1FSRtexY1 + attrib2 13 - - rtexX0RtexY0StexX1 - 14 - - - rooftopscale - 15 - @@ -224,21 +216,13 @@ 11 - rotPitchWtexX0 + attrib1 12 - wtexY0FRtexx1FSRtexY1 + attrib2 13 - - rtexX0RtexY0StexX1 - 14 - - - rooftopscale - 15 - @@ -289,20 +273,12 @@ 11 - rotPitchWtexX0 + attrib1 12 - wtexY0FRtexx1FSRtexY1 + attrib2 13 - - - rtexX0RtexY0StexX1 - 14 - - - rooftopscale - 15 @@ -354,20 +330,12 @@ 11 - rotPitchWtexX0 + attrib1 12 - wtexY0FRtexx1FSRtexY1 + attrib2 13 - - - rtexX0RtexY0StexX1 - 14 - - - rooftopscale - 15 @@ -419,20 +387,12 @@ 11 - rotPitchWtexX0 + attrib1 12 - wtexY0FRtexx1FSRtexY1 + attrib2 13 - - - rtexX0RtexY0StexX1 - 14 - - - rooftopscale - 15 @@ -457,20 +417,12 @@ 11 - rotPitchWtexX0 + attrib1 12 - wtexY0FRtexx1FSRtexY1 + attrib2 13 - - - rtexX0RtexY0StexX1 - 14 - - - rooftopscale - 15 @@ -568,21 +520,13 @@ 11 - rotPitchWtexX0 + attrib1 12 - wtexY0FRtexx1FSRtexY1 + attrib2 13 - - rtexX0RtexY0StexX1 - 14 - - - rooftopscale - 15 - fogType diff --git a/Shaders/building-ALS.vert b/Shaders/building-ALS.vert index 150b090fc..813b2040c 100644 --- a/Shaders/building-ALS.vert +++ b/Shaders/building-ALS.vert @@ -18,10 +18,8 @@ attribute vec3 instancePosition; // (x,y,z) attribute vec3 instanceScale; // (width, depth, height) -attribute vec3 rotPitchWtexX0; // (rotation, pitch height, wall texture x0) -attribute vec3 wtexY0FRtexx1FSRtexY1; // (wall texture y0, front/roof texture x1, front/side/roof texture y1) -attribute vec3 rtexX0RtexY0StexX1; // (roof texture x0, roof texture y0, side texture x1) -attribute vec3 rooftopscale; // (rooftop x scale, rooftop y scale) +attribute vec3 attrib1; // Generic packed attributes +attribute vec3 attrib2; // The constant term of the lighting equation that doesn't depend on // the surface normal is passed in gl_{Front,Back}Color. The alpha @@ -68,6 +66,16 @@ if (x < -15.0) {return 0.0;} return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d)); } +const float c_precision = 128.0; +const float c_precisionp1 = c_precision + 1.0; + +vec3 float2vec(float value) { + vec3 val; + val.x = mod(value, c_precisionp1) / c_precision; + val.y = mod(floor(value / c_precisionp1), c_precisionp1) / c_precision; + val.z = floor(value / (c_precisionp1 * c_precisionp1)) / c_precision; + return val; +} void main() { @@ -82,20 +90,25 @@ void main() float scattering; vec3 shadedFogColor = vec3(0.55, 0.67, 0.88); + // Unpack generic attributes + vec3 attr1 = float2vec(attrib1.x); + vec3 attr2 = float2vec(attrib1.z); + vec3 attr3 = float2vec(attrib2.x); + // Determine the rotation for the building. - float sr = sin(6.28 * rotPitchWtexX0.x); - float cr = cos(6.28 * rotPitchWtexX0.x); + float sr = sin(6.28 * attr1.x); + float cr = cos(6.28 * attr1.x); vec3 position = gl_Vertex.xyz; // Adjust the very top of the roof to match the rooftop scaling. This shapes // the rooftop - gambled, gabled etc. These vertices are identified by gl_Color.z - position.x = (1.0 - gl_Color.z) * position.x + gl_Color.z * ((position.x + 0.5) * rooftopscale.x - 0.5); - position.y = (1.0 - gl_Color.z) * position.y + gl_Color.z * (position.y * rooftopscale.y); + position.x = (1.0 - gl_Color.z) * position.x + gl_Color.z * ((position.x + 0.5) * attr3.z - 0.5); + position.y = (1.0 - gl_Color.z) * position.y + gl_Color.z * (position.y * attrib2.y ); // Adjust pitch of roof to the correct height. These vertices are identified by gl_Color.z // Scale down by the building height (instanceScale.z) because // immediately afterwards we will scale UP the vertex to the correct scale. - position.z = position.z + gl_Color.z * rotPitchWtexX0.y / instanceScale.z; + position.z = position.z + gl_Color.z * attrib1.y / instanceScale.z; position = position * instanceScale.xyz; // Rotation of the building and movement into position @@ -115,13 +128,13 @@ void main() // gl_Color.z=1 indicates top roof vertexs (used above) // gl_Color.a=1 indicates sides // Finally, the roof texture is on the right of the texture sheet - float wtex0x = rotPitchWtexX0.z; // Front/Side texture X0 - float wtex0y = wtexY0FRtexx1FSRtexY1.x; // Front/Side texture Y0 - float rtex0x = rtexX0RtexY0StexX1.x; // Roof texture X0 - float rtex0y = rtexX0RtexY0StexX1.y; // Roof texture Y0 - float wtex1x = wtexY0FRtexx1FSRtexY1.y; // Front/Roof texture X1 - float stex1x = rtexX0RtexY0StexX1.z; // Side texture X1 - float wtex1y = wtexY0FRtexx1FSRtexY1.z; // Front/Roof/Side texture Y1 + float wtex0x = attr1.y; // Front/Side texture X0 + float wtex0y = attr1.z; // Front/Side texture Y0 + float rtex0x = attr2.z; // Roof texture X0 + float rtex0y = attr3.x; // Roof texture Y0 + float wtex1x = attr2.x; // Front/Roof texture X1 + float stex1x = attr3.y; // Side texture X1 + float wtex1y = attr2.y; // Front/Roof/Side texture Y1 vec2 tex0 = vec2(sign(gl_MultiTexCoord0.x) * (gl_Color.x*wtex0x + gl_Color.y*rtex0x + gl_Color.a*wtex0x), gl_Color.x*wtex0y + gl_Color.y*rtex0y + gl_Color.a*wtex0y); diff --git a/Shaders/building-default.vert b/Shaders/building-default.vert index 641400a88..0079abdce 100644 --- a/Shaders/building-default.vert +++ b/Shaders/building-default.vert @@ -14,11 +14,9 @@ #define MODE_AMBIENT_AND_DIFFUSE 2 attribute vec3 instancePosition; // (x,y,z) -attribute vec3 instanceScale ; // (width, depth, height) -attribute vec3 rotPitchWtexX0; // (rotation, pitch height, wall texture x0) -attribute vec3 wtexY0FRtexx1FSRtexY1; // (wall texture y0, front/roof texture x1, front/side/roof texture y1) -attribute vec3 rtexX0RtexY0StexX1; // (roof texture x0, roof texture y0, side texture x1) -attribute vec3 rooftopscale; // (rooftop x scale, rooftop y scale) +attribute vec3 instanceScale ; // (width, depth, height) +attribute vec3 attrib1; // Generic packed attributes +attribute vec3 attrib2; // The constant term of the lighting equation that doesn't depend on // the surface normal is passed in gl_{Front,Back}Color. The alpha @@ -35,22 +33,38 @@ uniform int colorMode; //void fog_Func(int type); ///////////////////////// +const float c_precision = 128.0; +const float c_precisionp1 = c_precision + 1.0; + +vec3 float2vec(float value) { + vec3 val; + val.x = mod(value, c_precisionp1) / c_precision; + val.y = mod(floor(value / c_precisionp1), c_precisionp1) / c_precision; + val.z = floor(value / (c_precisionp1 * c_precisionp1)) / c_precision; + return val; +} + void main() { - // Determine the rotation for the building. - float sr = sin(6.28 * rotPitchWtexX0.x); - float cr = cos(6.28 * rotPitchWtexX0.x); + // Unpack generic attributes + vec3 attr1 = float2vec(attrib1.x); + vec3 attr2 = float2vec(attrib1.z); + vec3 attr3 = float2vec(attrib2.x); + + // Determine the rotation for the building. + float sr = sin(6.28 * attr1.x); + float cr = cos(6.28 * attr1.x); vec3 position = gl_Vertex.xyz; // Adjust the very top of the roof to match the rooftop scaling. This shapes // the rooftop - gambled, gabled etc. These vertices are identified by gl_Color.z - position.x = (1.0 - gl_Color.z) * position.x + gl_Color.z * ((position.x + 0.5) * rooftopscale.x - 0.5); - position.y = (1.0 - gl_Color.z) * position.y + gl_Color.z * (position.y * rooftopscale.y); + position.x = (1.0 - gl_Color.z) * position.x + gl_Color.z * ((position.x + 0.5) * attr3.z - 0.5); + position.y = (1.0 - gl_Color.z) * position.y + gl_Color.z * (position.y * attrib2.y ); // Adjust pitch of roof to the correct height. These vertices are identified by gl_Color.z // Scale down by the building height (instanceScale.z) because // immediately afterwards we will scale UP the vertex to the correct scale. - position.z = position.z + gl_Color.z * rotPitchWtexX0.y / instanceScale.z; + position.z = position.z + gl_Color.z * attrib1.y / instanceScale.z; position = position * instanceScale.xyz; // Rotation of the building and movement into position @@ -70,13 +84,13 @@ void main() // gl_Color.z=1 indicates top roof vertexs (used above) // gl_Color.a=1 indicates sides // Finally, the roof texture is on the right of the texture sheet - float wtex0x = rotPitchWtexX0.z; // Front/Side texture X0 - float wtex0y = wtexY0FRtexx1FSRtexY1.x; // Front/Side texture Y0 - float rtex0x = rtexX0RtexY0StexX1.x; // Roof texture X0 - float rtex0y = rtexX0RtexY0StexX1.y; // Roof texture Y0 - float wtex1x = wtexY0FRtexx1FSRtexY1.y; // Front/Roof texture X1 - float stex1x = rtexX0RtexY0StexX1.z; // Side texture X1 - float wtex1y = wtexY0FRtexx1FSRtexY1.z; // Front/Roof/Side texture Y1 + float wtex0x = attr1.y; // Front/Side texture X0 + float wtex0y = attr1.z; // Front/Side texture Y0 + float rtex0x = attr2.z; // Roof texture X0 + float rtex0y = attr3.x; // Roof texture Y0 + float wtex1x = attr2.x; // Front/Roof texture X1 + float stex1x = attr3.y; // Side texture X1 + float wtex1y = attr2.y; // Front/Roof/Side texture Y1 vec2 tex0 = vec2(sign(gl_MultiTexCoord0.x) * (gl_Color.x*wtex0x + gl_Color.y*rtex0x + gl_Color.a*wtex0x), gl_Color.x*wtex0y + gl_Color.y*rtex0y + gl_Color.a*wtex0y); diff --git a/Shaders/building-deferred-gbuffer.vert b/Shaders/building-deferred-gbuffer.vert index c7ce5db7c..907a799d7 100644 --- a/Shaders/building-deferred-gbuffer.vert +++ b/Shaders/building-deferred-gbuffer.vert @@ -7,29 +7,43 @@ attribute vec3 instancePosition; // (x,y,z) attribute vec3 instanceScaleRotate; // (width, depth, height) -attribute vec3 rotPitchWtexX0; // (rotation, pitch height, wall texture x0) -attribute vec3 wtexY0FRtexx1FSRtexY1; // (wall texture y0, front/roof texture x1, front/side/roof texture y1) -attribute vec3 rtexX0RtexY0StexX1; // (roof texture x0, roof texture y0, side texture x1) -attribute vec3 rooftopscale; // (rooftop x scale, rooftop y scale) +attribute vec3 attrib1; // Generic packed attributes +attribute vec3 attrib2; varying vec3 ecNormal; varying float alpha; +const float c_precision = 128.0; +const float c_precisionp1 = c_precision + 1.0; + +vec3 float2vec(float value) { + vec3 val; + val.x = mod(value, c_precisionp1) / c_precision; + val.y = mod(floor(value / c_precisionp1), c_precisionp1) / c_precision; + val.z = floor(value / (c_precisionp1 * c_precisionp1)) / c_precision; + return val; +} + void main() { + // Unpack generic attributes + vec3 attr1 = float2vec(attrib1.x); + vec3 attr2 = float2vec(attrib1.z); + vec3 attr3 = float2vec(attrib2.x); + // Determine the rotation for the building. - float sr = sin(6.28 * rotPitchWtexX0.x); - float cr = cos(6.28 * rotPitchWtexX0.x); + float sr = sin(6.28 * attr1.x); + float cr = cos(6.28 * attr1.x); vec3 position = gl_Vertex.xyz; // Adjust the very top of the roof to match the rooftop scaling. This shapes // the rooftop - gambled, gabled etc. These vertices are identified by gl_Color.z - position.x = (1.0 - gl_Color.z) * position.x + gl_Color.z * ((position.x + 0.5) * rooftopscale.x - 0.5); - position.y = (1.0 - gl_Color.z) * position.y + gl_Color.z * (position.y * rooftopscale.y); + position.x = (1.0 - gl_Color.z) * position.x + gl_Color.z * ((position.x + 0.5) * attr3.z - 0.5); + position.y = (1.0 - gl_Color.z) * position.y + gl_Color.z * (position.y * attrib2.y ); // Adjust pitch of roof to the correct height. These vertices are identified by gl_Color.z // Scale down by the building height (instanceScaleRotate.z) because // immediately afterwards we will scale UP the vertex to the correct scale. - position.z = position.z + gl_Color.z * rotPitchWtexX0.y / instanceScaleRotate.z; + position.z = position.z + gl_Color.z * attrib1.y / instanceScale.z; position = position * instanceScaleRotate.xyz; // Rotation of the building and movement into position @@ -49,22 +63,22 @@ void main() { // gl_Color.z=1 indicates top roof vertexs (used above) // gl_Color.a=1 indicates sides // Finally, the roof texture is on the right of the texture sheet - float wtex0x = rotPitchWtexX0.z; // Front/Side texture X0 - float wtex0y = wtexY0FRtexx1FSRtexY1.x; // Front/Side texture Y0 - float rtex0x = rtexX0RtexY0StexX1.x; // Roof texture X0 - float rtex0y = rtexX0RtexY0StexX1.y; // Roof texture Y0 - float wtex1x = wtexY0FRtexx1FSRtexY1.y; // Front/Roof texture X1 - float stex1x = rtexX0RtexY0StexX1.z; // Side texture X1 - float wtex1y = wtexY0FRtexx1FSRtexY1.z; // Front/Roof/Side texture Y1 + float wtex0x = attr1.y; // Front/Side texture X0 + float wtex0y = attr1.z; // Front/Side texture Y0 + float rtex0x = attr2.z; // Roof texture X0 + float rtex0y = attr3.x; // Roof texture Y0 + float wtex1x = attr2.x; // Front/Roof texture X1 + float stex1x = attr3.y; // Side texture X1 + float wtex1y = attr2.y; // Front/Roof/Side texture Y1 vec2 tex0 = vec2(sign(gl_MultiTexCoord0.x) * (gl_Color.x*wtex0x + gl_Color.y*rtex0x + gl_Color.a*wtex0x), gl_Color.x*wtex0y + gl_Color.y*rtex0y + gl_Color.a*wtex0y); - vec2 tex1 = vec2(gl_Color.x*wtex1x + gl_Color.y*wtex1x + gl_Color.a*stex1x, - wtex1y); + vec2 tex1 = vec2(gl_Color.x*wtex1x + gl_Color.y*wtex1x + gl_Color.a*stex1x, + wtex1y); + + gl_TexCoord[0].x = tex0.x + gl_MultiTexCoord0.x * tex1.x; + gl_TexCoord[0].y = tex0.y + gl_MultiTexCoord0.y * tex1.y; - gl_TexCoord[0].x = tex0.x + gl_MultiTexCoord0.x * tex1.x; - gl_TexCoord[0].y = tex0.y + gl_MultiTexCoord0.y * tex1.y; - // Rotate the normal. ecNormal = gl_Normal; ecNormal.xy = vec2(dot(ecNormal.xy, vec2(cr, sr)), dot(ecNormal.xy, vec2(-sr, cr))); diff --git a/Shaders/building-model-ALS-ultra.vert b/Shaders/building-model-ALS-ultra.vert index 8afa0ea65..af1489c25 100644 --- a/Shaders/building-model-ALS-ultra.vert +++ b/Shaders/building-model-ALS-ultra.vert @@ -5,10 +5,8 @@ attribute vec3 instancePosition; // (x,y,z) attribute vec3 instanceScale ; // (width, depth, height) -attribute vec3 rotPitchWtexX0; // (rotation, pitch height, wall texture x0) -attribute vec3 wtexY0FRtexx1FSRtexY1; // (wall texture y0, front/roof texture x1, front/side/roof texture y1) -attribute vec3 rtexX0RtexY0StexX1; // (roof texture x0, roof texture y0, side texture x1) -attribute vec3 rooftopscale; // (rooftop x scale, rooftop y scale) +attribute vec3 attrib1; // Generic packed attributes +attribute vec3 attrib2; varying vec3 rawpos; varying vec3 VNormal; @@ -53,23 +51,38 @@ void rotationMatrixH(in float sinRz, in float cosRz, out mat4 rotmat) 0.0 , 0.0 , 0.0, 1.0 ); } +const float c_precision = 128.0; +const float c_precisionp1 = c_precision + 1.0; + +vec3 float2vec(float value) { + vec3 val; + val.x = mod(value, c_precisionp1) / c_precision; + val.y = mod(floor(value / c_precisionp1), c_precisionp1) / c_precision; + val.z = floor(value / (c_precisionp1 * c_precisionp1)) / c_precision; + return val; +} + void main(void) { - // Determine the rotation for the building. - float sr = sin(6.28 * rotPitchWtexX0.x); - float cr = cos(6.28 * rotPitchWtexX0.x); + // Unpack generic attributes + vec3 attr1 = float2vec(attrib1.x); + vec3 attr2 = float2vec(attrib1.z); + vec3 attr3 = float2vec(attrib2.x); + // Determine the rotation for the building. + float sr = sin(6.28 * attr1.x); + float cr = cos(6.28 * attr1.x); vec3 rawpos = gl_Vertex.xyz; // Adjust the very top of the roof to match the rooftop scaling. This shapes // the rooftop - gambled, gabled etc. These vertices are identified by gl_Color.z - rawpos.x = (1.0 - gl_Color.z) * rawpos.x + gl_Color.z * ((rawpos.x + 0.5) * rooftopscale.x - 0.5); - rawpos.y = (1.0 - gl_Color.z) * rawpos.y + gl_Color.z * (rawpos.y * rooftopscale.y); + rawpos.x = (1.0 - gl_Color.z) * rawpos.x + gl_Color.z * ((rawpos.x + 0.5) * attr3.z - 0.5); + rawpos.y = (1.0 - gl_Color.z) * rawpos.y + gl_Color.z * (rawpos.y * attrib2.y ); // Adjust pitch of roof to the correct height. These vertices are identified by gl_Color.z // Scale down by the building height (instanceScale.z) because // immediately afterwards we will scale UP the vertex to the correct scale. - rawpos.z = rawpos.z + gl_Color.z * rotPitchWtexX0.y / instanceScale.z; + rawpos.z = rawpos.z + gl_Color.z * attrib1.y / instanceScale.z; rawpos = rawpos * instanceScale.xyz; // Rotation of the building and movement into rawpos @@ -88,13 +101,13 @@ void main(void) // gl_Color.z=1 indicates top roof vertexs (used above) // gl_Color.a=1 indicates sides // Finally, the roof texture is on the right of the texture sheet - float wtex0x = rotPitchWtexX0.z; // Front/Side texture X0 - float wtex0y = wtexY0FRtexx1FSRtexY1.x; // Front/Side texture Y0 - float rtex0x = rtexX0RtexY0StexX1.x; // Roof texture X0 - float rtex0y = rtexX0RtexY0StexX1.y; // Roof texture Y0 - float wtex1x = wtexY0FRtexx1FSRtexY1.y; // Front/Roof texture X1 - float stex1x = rtexX0RtexY0StexX1.z; // Side texture X1 - float wtex1y = wtexY0FRtexx1FSRtexY1.z; // Front/Roof/Side texture Y1 + float wtex0x = attr1.y; // Front/Side texture X0 + float wtex0y = attr1.z; // Front/Side texture Y0 + float rtex0x = attr2.z; // Roof texture X0 + float rtex0y = attr3.x; // Roof texture Y0 + float wtex1x = attr2.x; // Front/Roof texture X1 + float stex1x = attr3.y; // Side texture X1 + float wtex1y = attr2.y; // Front/Roof/Side texture Y1 vec2 tex0 = vec2(sign(gl_MultiTexCoord0.x) * (gl_Color.x*wtex0x + gl_Color.y*rtex0x + gl_Color.a*wtex0x), gl_Color.x*wtex0y + gl_Color.y*rtex0y + gl_Color.a*wtex0y); diff --git a/Shaders/building-ubershader.vert b/Shaders/building-ubershader.vert index 88597ce94..6615dffef 100644 --- a/Shaders/building-ubershader.vert +++ b/Shaders/building-ubershader.vert @@ -19,27 +19,41 @@ uniform int rembrandt_enabled; attribute vec3 instancePosition; // (x,y,z) attribute vec3 instanceScale; // (width, depth, height) -attribute vec3 rotPitchWtexX0; // (rotation, pitch height, wall texture x0) -attribute vec3 wtexY0FRtexx1FSRtexY1; // (wall texture y0, front/roof texture x1, front/side/roof texture y1) -attribute vec3 rtexX0RtexY0StexX1; // (roof texture x0, roof texture y0, side texture x1) -attribute vec3 rooftopscale; // (rooftop x scale, rooftop y scale) +attribute vec3 attrib1; // Generic packed attributes +attribute vec3 attrib2; + +const float c_precision = 128.0; +const float c_precisionp1 = c_precision + 1.0; + +vec3 float2vec(float value) { + vec3 val; + val.x = mod(value, c_precisionp1) / c_precision; + val.y = mod(floor(value / c_precisionp1), c_precisionp1) / c_precision; + val.z = floor(value / (c_precisionp1 * c_precisionp1)) / c_precision; + return val; +} void main(void) { + // Unpack generic attributes + vec3 attr1 = float2vec(attrib1.x); + vec3 attr2 = float2vec(attrib1.z); + vec3 attr3 = float2vec(attrib2.x); + // Determine the rotation for the building. - float sr = sin(6.28 * rotPitchWtexX0.x); - float cr = cos(6.28 * rotPitchWtexX0.x); + float sr = sin(6.28 * attr1.x); + float cr = cos(6.28 * attr1.x); vec3 position = gl_Vertex.xyz; // Adjust the very top of the roof to match the rooftop scaling. This shapes // the rooftop - gambled, gabled etc. These vertices are identified by gl_Color.z - position.x = (1.0 - gl_Color.z) * position.x + gl_Color.z * ((position.x + 0.5) * rooftopscale.x - 0.5); - position.y = (1.0 - gl_Color.z) * position.y + gl_Color.z * (position.y * rooftopscale.y); + position.x = (1.0 - gl_Color.z) * position.x + gl_Color.z * ((position.x + 0.5) * attr3.z - 0.5); + position.y = (1.0 - gl_Color.z) * position.y + gl_Color.z * (position.y * attrib2.y ); // Adjust pitch of roof to the correct height. These vertices are identified by gl_Color.z // Scale down by the building height (instanceScale.z) because // immediately afterwards we will scale UP the vertex to the correct scale. - position.z = position.z + gl_Color.z * rotPitchWtexX0.y / instanceScale.z; + position.z = position.z + gl_Color.z * attrib1.y / instanceScale.z; position = position * instanceScale.xyz; // Rotation of the building and movement into position @@ -94,18 +108,19 @@ void main(void) // gl_Color.z=1 indicates top roof vertexs (used above) // gl_Color.a=1 indicates sides // Finally, the roof texture is on the right of the texture sheet - float wtex0x = rotPitchWtexX0.z; // Front/Side texture X0 - float wtex0y = wtexY0FRtexx1FSRtexY1.x; // Front/Side texture Y0 - float rtex0x = rtexX0RtexY0StexX1.x; // Roof texture X0 - float rtex0y = rtexX0RtexY0StexX1.y; // Roof texture Y0 - float wtex1x = wtexY0FRtexx1FSRtexY1.y; // Front/Roof texture X1 - float stex1x = rtexX0RtexY0StexX1.z; // Side texture X1 - float wtex1y = wtexY0FRtexx1FSRtexY1.z; // Front/Roof/Side texture Y1 + float wtex0x = attr1.y; // Front/Side texture X0 + float wtex0y = attr1.z; // Front/Side texture Y0 + float rtex0x = attr2.z; // Roof texture X0 + float rtex0y = attr3.x; // Roof texture Y0 + float wtex1x = attr2.x; // Front/Roof texture X1 + float stex1x = attr3.y; // Side texture X1 + float wtex1y = attr2.y; // Front/Roof/Side texture Y1 vec2 tex0 = vec2(sign(gl_MultiTexCoord0.x) * (gl_Color.x*wtex0x + gl_Color.y*rtex0x + gl_Color.a*wtex0x), gl_Color.x*wtex0y + gl_Color.y*rtex0y + gl_Color.a*wtex0y); - vec2 tex1 = vec2(gl_Color.x*wtex1x + gl_Color.y*wtex1x + gl_Color.a*stex1x, - wtex1y); + vec2 tex1 = vec2(gl_Color.x*wtex1x + gl_Color.y*wtex1x + gl_Color.a*stex1x, + wtex1y); - gl_TexCoord[0].x = tex0.x + gl_MultiTexCoord0.x * tex1.x; - gl_TexCoord[0].y = tex0.y + gl_MultiTexCoord0.y * tex1.y;} + gl_TexCoord[0].x = tex0.x + gl_MultiTexCoord0.x * tex1.x; + gl_TexCoord[0].y = tex0.y + gl_MultiTexCoord0.y * tex1.y; +}