#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::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::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::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; }