#include <GL/glew.h>

#include <glm/mat4x4.hpp>
#include <glm/gtc/type_ptr.hpp>

#include <graphics.hpp>
#include <modelpart.hpp>

#include <iostream>

ModelPart::ModelPart() {
}

ModelPart::ModelPart(const char* texPath, GLuint transUniformNum) {
	//create vbo, ebo, vao
	initBuffers(&vao);
	//create texture
	initTexture(&tex[0], texPath);

	transUniform = transUniformNum;

	empty = false;
}

void ModelPart::bindAndDraw() {
	if (empty) { return; }
	glBindVertexArray(vao);
	glBindTexture(GL_TEXTURE_2D, tex[texSelection]);
	glUniformMatrix4fv(transUniform, 1, GL_FALSE, glm::value_ptr(transMatrix));
	glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}

void ModelPart::setTransform(glm::vec2 position, float rotation, float scale) {
	transMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(position.x, -position.y, 0.0f));
	transMatrix = glm::rotate(transMatrix, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
	transMatrix = glm::scale(transMatrix, glm::vec3(scale, scale, scale));
}

void ModelPart::addTexture(const char* texPath, size_t slot) {
	initTexture(&tex[slot], texPath);
}

void ModelPart::selectTexture(size_t slot) {
	texSelection = slot;
}
