#version 330
in vec3 normal;
in vec3 color;
in vec3 position;

uniform vec3 difLightDirection;
uniform vec3 difLightColor;
uniform vec3 ambLightColor;


uniform int colorOverride;
uniform int renderType;
uniform int renderVertColor;
uniform mat4 modelview;

out vec4 FragColor;

//inspired by blender checker texture node
float checker(vec3 p)
{
	p.x = (p.x + 0.000001) * 0.999999;
	p.y = (p.y + 0.000001) * 0.999999;
	p.z = (p.z + 0.000001) * 0.999999;
	
	int xi = int(round(abs(p.x)));
	int yi = int(round(abs(p.y)));
	int zi = int(round(abs(p.z)));

	if (mod(yi,2)==0) {
		if(mod(xi,2) != mod(zi,2))
			return 1;
		else
			return 0.5;
	}
	else {
		if (mod(xi,2) == mod(zi,2))
			return 1;
		else
			return 0.5;
	}
}

void main()
{

    if (colorOverride == 1)
    {
        // Wireframe color.

		if (renderVertColor == 1)
		{
            FragColor = vec4(color, 1);
		}
		else
		{
            FragColor = vec4(1);
		}
        return;
    }

    vec3 displayNormal = (normal.xyz * 0.5) + 0.5;
	
	if(renderType == 0){ //default
		float shading = max(displayNormal.y,0.5);
		FragColor = vec4(vec3(1,1,1)*shading*checker(position*0.015625), 1);
	}
	else if (renderType == 1) // normals color
        FragColor = vec4(displayNormal.rgb,1);
	else if (renderType == 2) // shading
        FragColor = vec4(vec3(1,1,1) * max(displayNormal.y,0.5), 1);
	else if (renderType == 3) // diffuse
		FragColor = vec4(vec3(1,1,1)*checker(position*0.015625), 1);
	else
		FragColor = vec4 (0,0,0,1);
}
