#pragma once #include "../nclgl/OGLRenderer.h" #include "../nclgl/Vector3.h" #include "../nclgl/Matrix3.h" #include "RenderObject.h" #include 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 renderObjects; RenderObject root; Light currentLight; Light m_light[NUM_LIGHTS]; float positionAnimation; float calculateAnimation; bool runningAnimiation; float time; };