CSC3223_Graphics_For_Games_OpenGL_Rasteriser / OpenGLGraphics / Renderer.h
Renderer.h
Raw
#pragma once
#include "../nclgl/OGLRenderer.h"
#include "../nclgl/Vector3.h"
#include "../nclgl/Matrix3.h"

#include "RenderObject.h"

#include <vector>

using std::vector;

class Renderer : public OGLRenderer	{
struct Light {
	Vector3 position;
	float radius;
	Vector3 colour;
};

public:
	Renderer(Window &parent);
	~Renderer(void);

	virtual void RenderScene();

	virtual void Render(const RenderObject &o);

	virtual void UpdateScene(float msec);

	void AddRenderObject(RenderObject &r) {
		renderObjects.push_back(&r);
	}

	GLuint LoadTexture(const string& filename);

	static const int NUM_TEXTURES = 5;
	static const int NUM_LIGHTS = 2;

	void startAnimation();
	void pauseAnimation();
	void stopAnimation();
	float getAnimPosition()	{ return positionAnimation; }

	void Renderer::SetShaderLight(int i, const Vector3 &position, const Vector3 &colour, float radius) {
		m_light[i].position = position;
		m_light[i].colour = colour;
		m_light[i].radius = radius;
	}
protected:
	void Renderer::ApplyShaderLight(GLuint program) {
		glUniform3fv(glGetUniformLocation(program, "lightPos[0]"), 1, (float *) & (m_light[0].position));
		glUniform1f(glGetUniformLocation(program, "lightRadius[0]"), m_light[0].radius);
		glUniform3fv(glGetUniformLocation(program, "lightColour[0]"), 1, (float *) & (m_light[0].colour));

		glUniform3fv(glGetUniformLocation(program, "lightPos[1]"), 1, (float *) & (m_light[1].position));
		glUniform1f(glGetUniformLocation(program, "lightRadius[1]"), m_light[1].radius);
		glUniform3fv(glGetUniformLocation(program, "lightColour[1]"), 1, (float *) & (m_light[1].colour));
	}

	vector<RenderObject*> renderObjects;

	RenderObject root;
	Light currentLight;
	Light m_light[NUM_LIGHTS];

	float positionAnimation;
	float calculateAnimation;
	bool runningAnimiation;	
	float time;
};