IsodiModel.fragmentShader
struct IsodiModel
static immutable 
auto fragmentShader = 
`
            #version 330
        ` ~ q{
            in vec2 fragTexCoord;
            in vec4 fragVariantUV;
            in vec2 fragAnchor;
            flat in int angle;
            uniform sampler2D texture0;
            uniform vec4 colDiffuse;
            uniform mat4 transform;
            uniform mat4 modelview;
            uniform mat4 projection;
            uniform int performFold;
            out vec4 finalColor;
            void setColor() {
                // Get texture coordinates in the atlas
                vec2 coords = vec2(fragVariantUV.x, fragVariantUV.y);
                // Get size of the texture
                vec2 size = vec2(fragVariantUV.z, fragVariantUV.w);
                vec2 offset;
                // No folding, render like normal
                if (performFold == 0) {
                    // Set the offset in the region with no special overrides
                    offset = fragTexCoord * size;
                }
                // Perform fold
                else {
                    // Get texture ratio
                    vec2 ratio = vec2(1, size.y / size.x);
                    // Get segment where the texture starts to repeat
                    vec2 fold = vec2(0, size.y - size.x);
                    // Get offset 1. until the fold
                    offset = min(fold, fragTexCoord * size / ratio)
                        // 2. repeat after the fold
                        + fract(max(vec2(0), fragTexCoord - ratio + 1))*size.x;
                }
                // Apply angle offset
                offset.x += angle * size.x;
                // Fetch the data from the texture
                vec4 texelColor = texture(texture0, coords + offset);
                if (texelColor.w == 0) discard;
                // Set the color
                finalColor = texelColor * colDiffuse;
            }
            void setDepth() {
                // Change Y axis in the modelview matrix to (0, 1, 0, 0) so camera height doesn't affect depth
                // calculations
                mat4 flatview = modelview;
                flatview[0].y = 0;
                flatview[1].y = 1;
                flatview[2].y = 0;
                flatview[3].y = 0;
                mat4 flatform = transform;
                flatform[0].y = 0;
                flatform[1].y = 1;
                flatform[2].y = 0;
                flatform[3].y = 0;
                // Transform the anchor in the world
                vec4 anchor = flatview * flatform * vec4(fragAnchor.x, 0, fragAnchor.y, 1);
                // Get the clip space coordinates
                vec4 clip = projection * anchor * vec4(1, 0, 1, 1);
                // Convert to OpenGL's value range
                float depth = (clip.z / clip.w + 1) / 2.0;
                gl_FragDepth = gl_DepthRange.diff * depth + gl_DepthRange.near;
            }
            void main() {
                setDepth();
                setColor();
            }
        } ~ '\0';
 
		isodi isodi_model IsodiModel 
		functionsstatic functionsstatic variablesvariables 
	 
	
Default fragment shader used to render the model.
The data is null-terminated for C compatibility.