#pragma once

static const char* things2D_vs = R"(
	in vec3 AttrPosition;
	in vec4 AttrColor;
	in vec2 AttrUV;

	out vec4 Color;
	out vec2 UV;

	uniform mat4 transformsettings;

	void main()
	{
		gl_Position = transformsettings * vec4(AttrPosition, 1.0f);
		Color = AttrColor;
		UV = AttrUV;
	}
)";

static const char* things2D_ps_sprite = R"(
	in vec4 Color;
	in vec2 UV;

	out vec4 FragColor;

	// Render settings
	// w = transparency
	uniform vec4 rendersettings;
	uniform float desaturation;

	uniform sampler2D texture1;
	uniform vec4 texturefactor;

	vec3 desaturate(vec3 texel)
	{
		float gray = (texel.r * 0.3 + texel.g * 0.56 + texel.b * 0.14);	
		return mix(texel, vec3(gray), desaturation);
	}

	void main()
	{
		// Take this pixel's color
		vec4 c = texture(texture1, UV);
	
		// Modulate it by selection color
		if (Color.a > 0.0)
		{
			vec3 cr = desaturate(c.rgb);
			FragColor = vec4((cr.r + Color.r) / 2.0f, (cr.g + Color.g) / 2.0f, (cr.b + Color.b) / 2.0f, c.a * rendersettings.w * Color.a);
		}
		else
		{
			// Or leave it as it is
			FragColor = vec4(desaturate(c.rgb), c.a * rendersettings.w);
		}

		FragColor *= texturefactor;

		#if defined(ALPHA_TEST)
		if (FragColor.a < 0.5) discard;
		#endif
	}
)";

static const char* things2D_ps_thing = R"(
	in vec4 Color;
	in vec2 UV;

	out vec4 FragColor;

	// Render settings
	// w = transparency
	uniform vec4 rendersettings;
	uniform float desaturation;

	uniform sampler2D texture1;
	uniform vec4 texturefactor;

	vec3 desaturate(vec3 texel)
	{
		float gray = (texel.r * 0.3 + texel.g * 0.56 + texel.b * 0.14);	
		return mix(texel, vec3(gray), desaturation);
	}

	void main()
	{
		vec4 c = texture(texture1, UV);
		FragColor = vec4(desaturate(c.rgb), c.a * rendersettings.w) * Color;

		FragColor *= texturefactor;

		#if defined(ALPHA_TEST)
		if (FragColor.a < 0.5) discard;
		#endif
	}
)";

static const char* things2D_ps_fill = R"(
	in vec4 Color;
	in vec2 UV;

	out vec4 FragColor;

	uniform vec4 fillColor;

	void main()
	{
		FragColor = fillColor;

		#if defined(ALPHA_TEST)
		if (FragColor.a < 0.5) discard;
		#endif
	}
)";