PolyGLVertexBuffer.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * GLVertexBuffer.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 9/13/09.
  6. * Copyright 2009 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolyGLVertexBuffer.h"
  10. using namespace Polycode;
  11. OpenGLVertexBuffer::OpenGLVertexBuffer(Mesh *mesh) : VertexBuffer() {
  12. glGenBuffersARB(1, &vertexBufferID);
  13. glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBufferID);
  14. long bufferSize = 0;
  15. long newBufferSize = 0;
  16. GLfloat *buffer = (GLfloat*)malloc(1);
  17. vertexCount = 0;
  18. for(int i=0; i < mesh->getPolygonCount(); i++) {
  19. for(int j=0; j < mesh->getPolygon(i)->getVertexCount(); j++) {
  20. vertexCount++;
  21. newBufferSize = bufferSize + 3;
  22. buffer = (GLfloat*)realloc(buffer, newBufferSize * sizeof(GLfloat));
  23. buffer[bufferSize+0] = mesh->getPolygon(i)->getVertex(j)->x;
  24. buffer[bufferSize+1] = mesh->getPolygon(i)->getVertex(j)->y;
  25. buffer[bufferSize+2] = mesh->getPolygon(i)->getVertex(j)->z;
  26. bufferSize = newBufferSize;
  27. }
  28. }
  29. glBufferDataARB(GL_ARRAY_BUFFER_ARB, bufferSize*sizeof(GLfloat), buffer, GL_STATIC_DRAW_ARB);
  30. free(buffer);
  31. glGenBuffersARB(1, &texCoordBufferID);
  32. glBindBufferARB(GL_ARRAY_BUFFER_ARB, texCoordBufferID);
  33. bufferSize = 0;
  34. newBufferSize = 0;
  35. buffer = (GLfloat*)malloc(1);
  36. for(int i=0; i < mesh->getPolygonCount(); i++) {
  37. for(int j=0; j < mesh->getPolygon(i)->getVertexCount(); j++) {
  38. newBufferSize = bufferSize + 2;
  39. buffer = (GLfloat*)realloc(buffer, newBufferSize * sizeof(GLfloat));
  40. if(mesh->getPolygon(i)->usesFaceUV()) {
  41. buffer[bufferSize+0] = mesh->getPolygon(i)->getTexCoord(j)->x;
  42. buffer[bufferSize+1] = mesh->getPolygon(i)->getTexCoord(j)->y;
  43. } else {
  44. buffer[bufferSize+0] = mesh->getPolygon(i)->getVertex(j)->getTexCoord()->x;
  45. buffer[bufferSize+1] = mesh->getPolygon(i)->getVertex(j)->getTexCoord()->y;
  46. }
  47. bufferSize = newBufferSize;
  48. }
  49. }
  50. glBufferDataARB(GL_ARRAY_BUFFER_ARB, bufferSize*sizeof(GLfloat), buffer, GL_STATIC_DRAW_ARB);
  51. free(buffer);
  52. glGenBuffersARB(1, &normalBufferID);
  53. glBindBufferARB(GL_ARRAY_BUFFER_ARB, normalBufferID);
  54. bufferSize = 0;
  55. newBufferSize = 0;
  56. buffer = (GLfloat*)malloc(1);
  57. for(int i=0; i < mesh->getPolygonCount(); i++) {
  58. for(int j=0; j < mesh->getPolygon(i)->getVertexCount(); j++) {
  59. newBufferSize = bufferSize + 3;
  60. buffer = (GLfloat*)realloc(buffer, newBufferSize * sizeof(GLfloat));
  61. if(mesh->getPolygon(i)->useVertexNormals) {
  62. buffer[bufferSize+0] = mesh->getPolygon(i)->getVertex(j)->normal->x;
  63. buffer[bufferSize+1] = mesh->getPolygon(i)->getVertex(j)->normal->y;
  64. buffer[bufferSize+2] = mesh->getPolygon(i)->getVertex(j)->normal->z;
  65. } else {
  66. buffer[bufferSize+0] = mesh->getPolygon(i)->getFaceNormal().x;
  67. buffer[bufferSize+1] = mesh->getPolygon(i)->getFaceNormal().y;
  68. buffer[bufferSize+2] = mesh->getPolygon(i)->getFaceNormal().z;
  69. }
  70. bufferSize = newBufferSize;
  71. }
  72. }
  73. glBufferDataARB(GL_ARRAY_BUFFER_ARB, bufferSize*sizeof(GLfloat), buffer, GL_STATIC_DRAW_ARB);
  74. free(buffer);
  75. glGenBuffersARB(1, &colorBufferID);
  76. glBindBufferARB(GL_ARRAY_BUFFER_ARB, colorBufferID);
  77. bufferSize = 0;
  78. newBufferSize = 0;
  79. buffer = (GLfloat*)malloc(1);
  80. for(int i=0; i < mesh->getPolygonCount(); i++) {
  81. for(int j=0; j < mesh->getPolygon(i)->getVertexCount(); j++) {
  82. newBufferSize = bufferSize + 4;
  83. buffer = (GLfloat*)realloc(buffer, newBufferSize * sizeof(GLfloat));
  84. buffer[bufferSize+0] = mesh->getPolygon(i)->getVertex(j)->vertexColor.r;
  85. buffer[bufferSize+1] = mesh->getPolygon(i)->getVertex(j)->vertexColor.g;
  86. buffer[bufferSize+2] = mesh->getPolygon(i)->getVertex(j)->vertexColor.b;
  87. buffer[bufferSize+3] = mesh->getPolygon(i)->getVertex(j)->vertexColor.a;
  88. bufferSize = newBufferSize;
  89. }
  90. }
  91. glBufferDataARB(GL_ARRAY_BUFFER_ARB, bufferSize*sizeof(GLfloat), buffer, GL_STATIC_DRAW_ARB);
  92. free(buffer);
  93. }
  94. OpenGLVertexBuffer::~OpenGLVertexBuffer() {
  95. glDeleteBuffersARB(1, &vertexBufferID);
  96. glDeleteBuffersARB(1, &texCoordBufferID);
  97. glDeleteBuffersARB(1, &normalBufferID);
  98. glDeleteBuffersARB(1, &colorBufferID);
  99. }
  100. GLuint OpenGLVertexBuffer::getColorBufferID() {
  101. return colorBufferID;
  102. }
  103. GLuint OpenGLVertexBuffer::getNormalBufferID() {
  104. return normalBufferID;
  105. }
  106. GLuint OpenGLVertexBuffer::getTextCoordBufferID() {
  107. return texCoordBufferID;
  108. }
  109. GLuint OpenGLVertexBuffer::getVertexBufferID() {
  110. return vertexBufferID;
  111. }