Main Page | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Globals

/Users/blackie/Documents/myRepository/phobosengine-vc2005/phobosengine/phobosengine/VBO.h

Go to the documentation of this file.
00001 
00002 
00003 #ifndef VBO_H
00004 #define VBO_H
00005 
00006 
00007 #include "Renderer.h"
00008 
00009 #include "Vector2f.h"
00010 #include "Vector3f.h"
00011 
00012 
00013 namespace pge {
00014 
00015         class VBO {
00016 
00017         public:
00018 
00019                 //
00020                 //
00021                 //
00022                 VBO(int vertexNum) {
00023                         m_vertexArrayBuffer = new Vector3f[vertexNum];
00024                         m_texCoordArrayBuffer = new Vector2f[vertexNum];
00025                         m_normalArrayBuffer = new Vector3f[vertexNum];
00026 
00027                         m_vboVertexDescriptor = 0;
00028                         m_vboTexCoordDescriptor = 0;
00029                         m_vboNormalDescriptor = 0;
00030 
00031                         m_vertexBufferSize = 0;
00032                         m_texCoordBufferSize = 0;
00033                         m_normalBufferSize = 0;
00034 
00035                         m_vertexNum = vertexNum;
00036                         m_vertexBufferIndex = 0;
00037                 }
00038 
00039 
00040                 //
00041                 //
00042                 //
00043                 virtual ~VBO(void) {
00044                         unsigned int buffer[3] = {m_vboVertexDescriptor, m_vboTexCoordDescriptor, m_vboNormalDescriptor};
00045                         glDeleteBuffers(3, buffer);
00046                 }
00047 
00048 
00049                 //
00050                 //
00051                 //
00052                 int addVertex(Vector3f vertex, Vector3f normal, Vector2f texCoord) {
00053                         int result = m_vertexBufferIndex;
00054 
00055                         // Put vertex.
00056                         m_vertexArrayBuffer[m_vertexBufferIndex] = vertex;
00057 
00058                         // Put normal.
00059                         m_normalArrayBuffer[m_vertexBufferIndex] = normal;
00060 
00061                         // Put texCoord.
00062                         m_texCoordArrayBuffer[m_vertexBufferIndex] = texCoord;
00063 
00064                         // Increment vertexBuferIndex but return old value.
00065                         m_vertexBufferIndex += 1;
00066                         return result;
00067                 }
00068 
00069 
00070                 //
00071                 //
00072                 //
00073                 void addTriangle(Triangle *triangle) {
00074                         if(triangle->m_plane == NULL) {
00075                                 printf("WARNING [%s]: Triangle without valid plane.", __FILE__);
00076                                 return;
00077                         }
00078                         addVertex(triangle->m_vertices[0], triangle->m_plane->m_normal, triangle->m_texCoords[0]);
00079                         addVertex(triangle->m_vertices[1], triangle->m_plane->m_normal, triangle->m_texCoords[1]);
00080                         addVertex(triangle->m_vertices[2], triangle->m_plane->m_normal, triangle->m_texCoords[2]);
00081                 }
00082 
00083 
00084                 //
00085                 //
00086                 //
00087                 void buildVBO(void) {
00088                         // Vertex array.
00089                         glGenBuffers(1, &m_vboVertexDescriptor);
00090                         glBindBuffer(GL_ARRAY_BUFFER, m_vboVertexDescriptor);
00091                         glBufferData(GL_ARRAY_BUFFER, m_vertexBufferIndex * 3 * sizeof(float), m_vertexArrayBuffer, GL_STATIC_DRAW);
00092 
00093                         // TexCoord array.
00094                         glGenBuffers(1, &m_vboTexCoordDescriptor);
00095                         glBindBuffer(GL_ARRAY_BUFFER, m_vboTexCoordDescriptor);
00096                         glBufferData(GL_ARRAY_BUFFER, m_vertexBufferIndex * 2 * sizeof(float), m_texCoordArrayBuffer, GL_STATIC_DRAW);
00097 
00098                         // Normal array.
00099                         glGenBuffers(1, &m_vboNormalDescriptor);
00100                         glBindBuffer(GL_ARRAY_BUFFER, m_vboNormalDescriptor);
00101                         glBufferData(GL_ARRAY_BUFFER, m_vertexBufferIndex * 3 * sizeof(float), m_normalArrayBuffer, GL_STATIC_DRAW);
00102 
00103                         delete [] m_vertexArrayBuffer;
00104                         m_vertexArrayBuffer = NULL;
00105 
00106                         delete [] m_texCoordArrayBuffer;
00107                         m_texCoordArrayBuffer = NULL;
00108 
00109                         delete [] m_normalArrayBuffer;
00110                         m_normalArrayBuffer = NULL;
00111                 }
00112 
00113 
00114                 //
00115                 //
00116                 //
00117                 void renderVBO(int start, int length) {
00118                         glBindBuffer(GL_ARRAY_BUFFER, m_vboVertexDescriptor);
00119                         glVertexPointer(3, GL_FLOAT, 0, (char*)NULL);
00120 
00121                         glBindBuffer(GL_ARRAY_BUFFER, m_vboTexCoordDescriptor);
00122                         glTexCoordPointer(2, GL_FLOAT, 0, (char*)NULL);
00123 
00124                         glBindBuffer(GL_ARRAY_BUFFER, m_vboNormalDescriptor);
00125                         glNormalPointer(GL_FLOAT, 0, (char*)NULL);
00126 
00127                         glEnableClientState(GL_VERTEX_ARRAY);
00128                         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00129                         glEnableClientState(GL_NORMAL_ARRAY);
00130                         glDrawArrays(GL_TRIANGLES, start, length);
00131                         glDisableClientState(GL_NORMAL_ARRAY);
00132                         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00133                         glDisableClientState(GL_VERTEX_ARRAY);
00134                 }
00135 
00136 
00137         private:
00138                 Vector3f *m_vertexArrayBuffer;
00139                 Vector2f *m_texCoordArrayBuffer;
00140                 Vector3f *m_normalArrayBuffer;
00141 
00142                 unsigned int m_vboVertexDescriptor;
00143                 unsigned int m_vboTexCoordDescriptor;
00144                 unsigned int m_vboNormalDescriptor;
00145 
00146                 unsigned int m_vertexBufferSize;
00147                 unsigned int m_texCoordBufferSize;
00148                 unsigned int m_normalBufferSize;
00149 
00150                 unsigned int m_vertexNum;
00151                 unsigned int m_vertexBufferIndex;
00152         };
00153 };
00154 
00155 #endif

Generated on Mon Oct 16 12:08:11 2006 for Phobosengine by doxygen 1.3.4