/* * Renderer.cpp * * Copyright (C) 2009 Matthias Schiffer * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along * with this program. If not, see . */ #include "Renderer.h" #include "Shader.h" namespace Zoom { Renderer::Renderer() : activeTexture(0), renderVisitor(this) { nullShader = boost::shared_ptr(Shader::load("null.vert", "null.frag")); ambientShader = boost::shared_ptr(Shader::load("ambient.vert", "ambient.frag")); lightShader = boost::shared_ptr(Shader::load("light.vert", "light.frag")); } /*void Renderer::render(const BSPTree &tree) { vmml::mat4f transform, inverseTransform; glGetFloatv(GL_MODELVIEW_MATRIX, transform.array); transform.inverse(inverseTransform); vmml::vec3f viewPoint = inverseTransform*vmml::vec3f::ZERO; glBegin(GL_TRIANGLES); tree.visit(renderVisitor, viewPoint); glEnd(); }*/ void Renderer::renderTriangle(const Triangle &t) { glColor4fv(t.getColor().array); if(t.getTexture() != activeTexture) { glEnd(); useTexture(t.getTexture()); glBegin(GL_TRIANGLES); } for(int i = 0; i < 3; ++i) { glTexCoord2fv(t.getTexCoords(i).array); glNormal3fv(t.getVertexNormal(i).array); glVertex3fv(t.getVertex(i).array); } } void Renderer::renderShadowVolume(const ShadowVolume &v) { if(!v.isVisible()) return; glVertex3fv(v.getRay(2).getVertex().array); glVertex3fv(v.getRay(1).getVertex().array); glVertex3fv(v.getRay(0).getVertex().array); for(int i = 0; i < 3; ++i) { const vmml::vec3f &p1 = v.getRay(i).getVertex(), &p2 = v.getRay((i+1)%3).getVertex(); vmml::vec4f dir1 = vmml::vec4f(v.getRay(i).getDirection(), 0); vmml::vec4f dir2 = vmml::vec4f(v.getRay((i+1)%3).getDirection(), 0); glVertex3fv(p1.array); glVertex3fv(p2.array); glVertex4fv(dir1.array); glVertex4fv(dir1.array); glVertex3fv(p2.array); glVertex4fv(dir2.array); } glVertex4fv(vmml::vec4f(v.getRay(0).getDirection(), 0).array); glVertex4fv(vmml::vec4f(v.getRay(1).getDirection(), 0).array); glVertex4fv(vmml::vec4f(v.getRay(2).getDirection(), 0).array); } void Renderer::useTexture(unsigned texture) { if(texture) { glBindTexture(GL_TEXTURE_2D, texture); if(activeTexture) { glEnable(GL_TEXTURE_2D); } } else { glDisable(GL_TEXTURE_2D); } activeTexture = texture; } }