/src/DecalShader.cpp
#include "DecalShader.h"
#include <GLES2/gl2.h>
#include "Texture.h"

DecalShader::DecalShader(void) {
	vertexShader = compileShader(
		"uniform mat4 Projection;\n"
		"uniform mat4 Transform;\n"
		"uniform sampler2D Texture;\n"
		"uniform ivec2 TextureSize;\n"
		"uniform ivec2 TextureOffset;\n"
		"attribute vec2 Position;\n"
		"varying mediump vec2 TexturePosition;\n"
		"void main() {\n"
		"  gl_Position = Projection * Transform * vec4(Position, 0.0, 1.0);\n"
		"  TexturePosition = Position + vec2(TextureOffset);\n"
		"  TexturePosition.x = TexturePosition.x / float(TextureSize.x);\n"
		"  TexturePosition.y = TexturePosition.y / float(TextureSize.y);\n"
		"}",
		GL_VERTEX_SHADER
	);
	fragmentShader = compileShader(
		"uniform sampler2D Texture;\n"
		"varying mediump vec2 TexturePosition;\n"
		"void main() {\n"
		"  gl_FragColor = texture2D(Texture, TexturePosition);\n"
		"}",
		GL_FRAGMENT_SHADER
	);
	linkProgram();

	glUseProgram(shaderProgram);

	basicInit();

	uTexture = glGetUniformLocation(shaderProgram, "Texture");
	uTextureSize = glGetUniformLocation(shaderProgram, "TextureSize");
	uTextureOffset = glGetUniformLocation(shaderProgram, "TextureOffset");
	setTextureOffset(0, 0);
}

DecalShader::~DecalShader(void) {
}

void DecalShader::setTexture(Texture* texture) {
	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, texture->getTextureUnit());
	glUniform1i(this->uTexture, 0);
	glUniform2i(this->uTextureSize, texture->getWidth(), texture->getHeight());
}

void DecalShader::setTextureOffset(int x, int y) {
	glUniform2i(uTextureOffset, x, y);
}