From 4d4235dd4067055c2c15636e7b1c47e1700dd841 Mon Sep 17 00:00:00 2001 From: Ivan Safrin Date: Mon, 23 Jan 2012 14:55:57 -0500 Subject: [PATCH] Tangent support in VBOs --- Core/Contents/Include/PolyGLVertexBuffer.h | 6 +++-- Core/Contents/Source/PolyGLRenderer.cpp | 5 ++++ Core/Contents/Source/PolyGLVertexBuffer.cpp | 26 +++++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Core/Contents/Include/PolyGLVertexBuffer.h b/Core/Contents/Include/PolyGLVertexBuffer.h index 312bc1cf4..9ddd7b4fb 100644 --- a/Core/Contents/Include/PolyGLVertexBuffer.h +++ b/Core/Contents/Include/PolyGLVertexBuffer.h @@ -49,13 +49,15 @@ namespace Polycode { GLuint getTextCoordBufferID(); GLuint getNormalBufferID(); GLuint getColorBufferID(); - + GLuint getTangentBufferID(); + protected: GLuint vertexBufferID; GLuint texCoordBufferID; GLuint normalBufferID; - GLuint colorBufferID; + GLuint colorBufferID; + GLuint tangentBufferID; }; } diff --git a/Core/Contents/Source/PolyGLRenderer.cpp b/Core/Contents/Source/PolyGLRenderer.cpp index 1287455e5..fe8db5a40 100755 --- a/Core/Contents/Source/PolyGLRenderer.cpp +++ b/Core/Contents/Source/PolyGLRenderer.cpp @@ -356,6 +356,11 @@ void OpenGLRenderer::drawVertexBuffer(VertexBuffer *buffer) { glNormalPointer(GL_FLOAT, 0, (char *) NULL ); glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getTextCoordBufferID()); glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL ); + + glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getTangentBufferID()); + glEnableVertexAttribArrayARB(6); + glVertexAttribPointer(6, 3, GL_FLOAT, 0, 0, (char *)NULL); + GLenum mode = GL_TRIANGLES; diff --git a/Core/Contents/Source/PolyGLVertexBuffer.cpp b/Core/Contents/Source/PolyGLVertexBuffer.cpp index 84d31c931..177d05315 100644 --- a/Core/Contents/Source/PolyGLVertexBuffer.cpp +++ b/Core/Contents/Source/PolyGLVertexBuffer.cpp @@ -125,6 +125,28 @@ OpenGLVertexBuffer::OpenGLVertexBuffer(Mesh *mesh) : VertexBuffer() { glBufferDataARB(GL_ARRAY_BUFFER_ARB, bufferSize*sizeof(GLfloat), buffer, GL_STATIC_DRAW_ARB); free(buffer); + + + glGenBuffersARB(1, &tangentBufferID); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, tangentBufferID); + + bufferSize = 0; + newBufferSize = 0; + buffer = (GLfloat*)malloc(1); + + for(int i=0; i < mesh->getPolygonCount(); i++) { + for(int j=0; j < mesh->getPolygon(i)->getVertexCount(); j++) { + newBufferSize = bufferSize + 3; + buffer = (GLfloat*)realloc(buffer, newBufferSize * sizeof(GLfloat)); + buffer[bufferSize+0] = mesh->getPolygon(i)->getVertex(j)->tangent.x; + buffer[bufferSize+1] = mesh->getPolygon(i)->getVertex(j)->tangent.y; + buffer[bufferSize+2] = mesh->getPolygon(i)->getVertex(j)->tangent.z; + bufferSize = newBufferSize; + } + } + + glBufferDataARB(GL_ARRAY_BUFFER_ARB, bufferSize*sizeof(GLfloat), buffer, GL_STATIC_DRAW_ARB); + free(buffer); glGenBuffersARB(1, &colorBufferID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, colorBufferID); @@ -172,3 +194,7 @@ GLuint OpenGLVertexBuffer::getTextCoordBufferID() { GLuint OpenGLVertexBuffer::getVertexBufferID() { return vertexBufferID; } + +GLuint OpenGLVertexBuffer::getTangentBufferID() { + return tangentBufferID; +}