/*************************************************************************** File: Renderer.cpp Created: 03/01/2001 Author: Maxim Garber Computer Science Department University of North Carolina - Chapel Hill garber@cs.unc.edu Description: ----------------------------------------------------------------------------. Copyright 2001 Maxim Garber UNC Motion Planning Research Group *****************************************************************************/ #include "Renderer.hpp" void Renderer:: Initialize(const char* renderFile){ ifstream rsrc; rsrc.open( renderFile ); rsrc >> _numRenderStates; for(int i = 0; i < _numRenderStates; i++){ // initialize triangle bucket TriBucket TB; _triangles.push_back(TB); // initialize render state RenderState* state = new RenderState; _pRenderStates.push_back(state); // load render state texture char textureFile[FILE_NAME_LENGTH]; rsrc >> textureFile; AddTexture(textureFile, i); // set some default parameters SetParameter(GL_TEXTURE_WRAP_S, GL_REPEAT, i); SetParameter(GL_TEXTURE_WRAP_T, GL_REPEAT, i); SetParameter(GL_TEXTURE_MAG_FILTER, GL_NEAREST, i); SetParameter(GL_TEXTURE_MIN_FILTER, GL_NEAREST, i); } CompileRenderStates(); } void Renderer:: AddTexture(GLubyte* texture, GLuint Width, GLuint Height, GLuint Channels, int renderState) { _pRenderStates[renderState]->_texture = texture; _pRenderStates[renderState]->_texWidth = Width; _pRenderStates[renderState]->_texHeight = Height; _pRenderStates[renderState]->_texChannels = Channels; } void Renderer:: AddTexture(const char* textureFile, int renderState) { _pRenderStates[renderState]->_texture = NULL; LoadTGA(textureFile, _pRenderStates[renderState]->_texture, _pRenderStates[renderState]->_texWidth, _pRenderStates[renderState]->_texHeight, _pRenderStates[renderState]->_texChannels); } void Renderer:: SetParameter(GLenum paramName, GLuint paramValue, int renderState) { _pRenderStates[renderState]->_paramNames.push_back(paramName); _pRenderStates[renderState]->_paramValues.push_back(paramValue); } void Renderer:: CompileRenderStates() { // initialize GLstate glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); glEnable (GL_DEPTH_TEST); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); for(int i = 0; i < _numRenderStates; i++) { // generate name; static GLuint texName; glGenTextures(1, &texName); // bind the texture glBindTexture(GL_TEXTURE_2D, texName); _pRenderStates[i]->_texName = texName; // set texture state parameters for(int j = 0; j < _pRenderStates[i]->_paramNames.size(); j++) { glTexParameteri(GL_TEXTURE_2D, _pRenderStates[i]->_paramNames[j], _pRenderStates[i]->_paramValues[j]); } // load texture image glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _pRenderStates[i]->_texWidth, _pRenderStates[i]->_texHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, _pRenderStates[i]->_texture); } //delete(texNames); } void Renderer:: SetRenderState(int renderState) { glBindTexture(GL_TEXTURE_2D, _pRenderStates[renderState]->_texName); } /*--------------------------------------------------------------------------- Lights and Camera ----------------------------------------------------------------------------*/ void Renderer:: SetLightPosition(float lightPosition[4]) { for(int i = 0; i < 4; i++) _lightPosition[i] = lightPosition[i]; } void Renderer:: SetCameraPosition(float cameraPosition[3]) { for(int i = 0; i < 3; i++) _cameraPosition[i] = cameraPosition[i]; } /*--------------------------------------------------------------------------- Rendering ----------------------------------------------------------------------------*/ void Renderer:: Begin() { for(int i = 0; i < _numRenderStates; i++) _triangles[i].clear(); } void Renderer:: RenderTriangle(Tri tri) { int renderState = _SelectRenderState(tri); _triangles[renderState].push_back(tri); } void Renderer:: End() { glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); for(int i = 0; i < _numRenderStates; i++) { SetRenderState(i); glBegin(GL_TRIANGLES); int k = _triangles[i].size(); for(int t = 0; t < _triangles[i].size(); t++) { glColor3ubv(_triangles[i][t].Color); glNormal3fv(_triangles[i][t].N); glTexCoord2f(0.0, 0.0); glVertex3fv(_triangles[i][t].A); glTexCoord2f(0.0, 1.0); glVertex3fv(_triangles[i][t].B); glTexCoord2f(1.0, 1.0); glVertex3fv(_triangles[i][t].C); } glEnd(); } glDisable(GL_TEXTURE_2D); }