CSC3223_Graphics_For_Games_OpenGL_Rasteriser / OpenGLGraphics / Renderer.cpp
Renderer.cpp
Raw
#include "Renderer.h"

Renderer::Renderer(Window &parent) : OGLRenderer(parent)	
	, positionAnimation(0.0f) //
	, calculateAnimation(0.00025) //
	, runningAnimiation(false)
	, time(0.0f) //
{
	glEnable(GL_DEPTH_TEST);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_BLEND);
}

Renderer::~Renderer(void)	{
	renderObjects.clear();
}

void	Renderer::RenderScene() {
	for(vector<RenderObject*>::iterator i = renderObjects.begin(); i != renderObjects.end(); ++i ) {
		Render(*(*i));
	}
}


void	Renderer::Render(const RenderObject &o) {
	modelMatrix = o.GetWorldTransform();

	if(o.GetShader() && o.GetMesh()) {
		GLuint program = o.GetShader()->GetShaderProgram();
		
		glUseProgram(program);
		UpdateShaderMatrices(program);
		ApplyShaderLight(program);

		/*if (o.GetShader() && o.GetMesh()) {
			GLuint program = o.GetShader()->GetShaderProgram();
			glUseProgram(program);

			glUniformMatrix4fv(glGetUniformLocation(program, " transforms[0]"),
				1, false, (float *)& Matrix4::Rotation(10.0f, Vector3(0, 1, 0)));

			glUniformMatrix4fv(glGetUniformLocation(program, " transforms[1]"),
				1, false, (float *)& Matrix4::Rotation(10.0f, Vector3(0, 1, 0)));
			glUniformMatrix4fv(glGetUniformLocation(program, " transforms[2]"),
				1, false, (float *)& Matrix4::Rotation(50.0f, Vector3(0, 1, 0)));
			glUniformMatrix4fv(glGetUniformLocation(program, " transforms[3]"),
				1, false, (float *)& Matrix4::Rotation(90.0f, Vector3(0, 1, 0)));
			glUniformMatrix4fv(glGetUniformLocation(program, " transforms[4]"),
				1, false, (float *)& Matrix4::Rotation(130.0f, Vector3(0, 1, 0)));

			UpdateShaderMatrices(program);
			ApplyShaderLight(program);

			o.GetMesh()->Draw();
		}*/

		/*tutorial 18*/
		/*glUniform1f(glGetUniformLocation(program, "particleSize"), 0.5f);
		glUniform1i(glGetUniformLocation(program, " texture "), 0);*/

		
		Vector3 cameraPositionInverted = viewMatrix.GetPositionVector();
		Matrix3 rotation = Matrix3(viewMatrix);
		Vector3 cameraPosition = rotation * -cameraPositionInverted;
		
		glUniform3fv(glGetUniformLocation(program, "cameraPos"), 1, (float *)&cameraPosition);
		glUniform1f(glGetUniformLocation(program, "animPosition"), positionAnimation);
		glUniform1i(glGetUniformLocation(program, "objectTextures[0]"), 0);
		glUniform1i(glGetUniformLocation(program, "objectTextures[1]"), 1);
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D, o.GetTexture(0));
		glActiveTexture(GL_TEXTURE1);
		glBindTexture(GL_TEXTURE_2D, o.GetTexture(1));
		
		o.Draw();
	}

	for(vector<RenderObject*>::const_iterator i = o.GetChildren().begin(); i != o.GetChildren().end(); ++i ) {
		Render(*(*i));
	}
}

void	Renderer::UpdateScene(float msec) {

	if (runningAnimiation) {
		if (positionAnimation < 1.0) {
			float animDelta = msec * calculateAnimation;
			positionAnimation += animDelta;
		}
		else {
			stopAnimation();
		}
	}
	time += msec;

	for(vector<RenderObject*>::iterator i = renderObjects.begin(); i != renderObjects.end(); ++i ) {
		(*i)->Update(msec);
	}
}

GLuint Renderer::LoadTexture(const string& filename) {
	GLuint texName = SOIL_load_OGL_texture(filename.c_str(), SOIL_LOAD_AUTO,SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);

	if (texName == 0) {
		cout << "Texture file " << filename << " failed to load!" << std::endl;
	}

	return texName;
}

void Renderer::startAnimation() {
	positionAnimation = 0.0f;
	runningAnimiation = true;
}

void Renderer::pauseAnimation() {
	if (positionAnimation < calculateAnimation || positionAnimation > 1.0 - calculateAnimation)
		return;
	runningAnimiation = !runningAnimiation;
}

void Renderer::stopAnimation() {
	runningAnimiation = false;
}