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
00056 m_vertexArrayBuffer[m_vertexBufferIndex] = vertex;
00057
00058
00059 m_normalArrayBuffer[m_vertexBufferIndex] = normal;
00060
00061
00062 m_texCoordArrayBuffer[m_vertexBufferIndex] = texCoord;
00063
00064
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
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
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
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