meshvbo.cpp
上传用户:qccn516
上传日期:2013-05-02
资源大小:3382k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* MeshVBO (vertex buffer object)
  2.  *
  3.  * Copyright (C) 2003-2004, Alexander Zaprjagaev <frustum@frustum.org>
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  */
  19. #include "engine.h"
  20. #include "meshvbo.h"
  21. MeshVBO::MeshVBO(const char *name) : Mesh(name) {
  22. for(int i = 0; i < getNumSurfaces(); i++) {
  23. GLuint id;
  24. glGenBuffersARB(1,&id);
  25. glBindBufferARB(GL_ARRAY_BUFFER_ARB,id);
  26. glBufferDataARB(GL_ARRAY_BUFFER_ARB,sizeof(Vertex) * getNumVertex(i),getVertex(i),GL_STATIC_DRAW_ARB);
  27. vbo_id.push_back(id);
  28. }
  29. glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
  30. }
  31. MeshVBO::MeshVBO(const Mesh *mesh) : Mesh(mesh) {
  32. for(int i = 0; i < getNumSurfaces(); i++) {
  33. GLuint id;
  34. glGenBuffersARB(1,&id);
  35. glBindBufferARB(GL_ARRAY_BUFFER_ARB,id);
  36. glBufferDataARB(GL_ARRAY_BUFFER_ARB,sizeof(Vertex) * getNumVertex(i),getVertex(i),GL_STATIC_DRAW_ARB);
  37. vbo_id.push_back(id);
  38. }
  39. glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
  40. }
  41. MeshVBO::~MeshVBO() {
  42. for(int i = 0; i < getNumSurfaces(); i++) glDeleteBuffersARB(1,&vbo_id[i]);
  43. vbo_id.clear();
  44. }
  45. /*
  46.  */
  47. int MeshVBO::render(int ppl,int s) {
  48. int num_triangles = 0;
  49. if(ppl) {
  50. glEnableVertexAttribArrayARB(0);
  51. glEnableVertexAttribArrayARB(1);
  52. glEnableVertexAttribArrayARB(2);
  53. glEnableVertexAttribArrayARB(3);
  54. glEnableVertexAttribArrayARB(4);
  55. if(s < 0) {
  56. for(int i = 0; i < num_surfaces; i++) {
  57. glBindBufferARB(GL_ARRAY_BUFFER_ARB,vbo_id[i]);
  58. glVertexAttribPointerARB(0,3,GL_FLOAT,0,sizeof(Vertex),0);
  59. glVertexAttribPointerARB(1,3,GL_FLOAT,0,sizeof(Vertex),(void*)(sizeof(vec3) * 1));
  60. glVertexAttribPointerARB(2,3,GL_FLOAT,0,sizeof(Vertex),(void*)(sizeof(vec3) * 2));
  61. glVertexAttribPointerARB(3,3,GL_FLOAT,0,sizeof(Vertex),(void*)(sizeof(vec3) * 3));
  62. glVertexAttribPointerARB(4,2,GL_FLOAT,0,sizeof(Vertex),(void*)(sizeof(vec3) * 4));
  63. int *indices = surfaces[i]->indices;
  64. for(int j = 0; j < surfaces[i]->num_strips; j++) {
  65. glDrawElements(GL_TRIANGLE_STRIP,indices[0],GL_UNSIGNED_INT,indices + 1);
  66. indices += indices[0] + 1;
  67. }
  68. num_triangles += surfaces[i]->num_triangles;
  69. }
  70. } else {
  71. glBindBufferARB(GL_ARRAY_BUFFER_ARB,vbo_id[s]);
  72. glVertexAttribPointerARB(0,3,GL_FLOAT,0,sizeof(Vertex),0);
  73. glVertexAttribPointerARB(1,3,GL_FLOAT,0,sizeof(Vertex),(void*)(sizeof(vec3) * 1));
  74. glVertexAttribPointerARB(2,3,GL_FLOAT,0,sizeof(Vertex),(void*)(sizeof(vec3) * 2));
  75. glVertexAttribPointerARB(3,3,GL_FLOAT,0,sizeof(Vertex),(void*)(sizeof(vec3) * 3));
  76. glVertexAttribPointerARB(4,2,GL_FLOAT,0,sizeof(Vertex),(void*)(sizeof(vec3) * 4));
  77. int *indices = surfaces[s]->indices;
  78. for(int i = 0; i < surfaces[s]->num_strips; i++) {
  79. glDrawElements(GL_TRIANGLE_STRIP,indices[0],GL_UNSIGNED_INT,indices + 1);
  80. indices += indices[0] + 1;
  81. }
  82. num_triangles += surfaces[s]->num_triangles;
  83. }
  84. glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
  85. glDisableVertexAttribArrayARB(4);
  86. glDisableVertexAttribArrayARB(3);
  87. glDisableVertexAttribArrayARB(2);
  88. glDisableVertexAttribArrayARB(1);
  89. glDisableVertexAttribArrayARB(0);
  90. } else {
  91. glEnableClientState(GL_VERTEX_ARRAY);
  92. glEnableClientState(GL_NORMAL_ARRAY);
  93. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  94. if(s < 0) {
  95. for(int i = 0; i < num_surfaces; i++) {
  96. glBindBufferARB(GL_ARRAY_BUFFER_ARB,vbo_id[i]);
  97. glVertexPointer(3,GL_FLOAT,sizeof(Vertex),0);
  98. glNormalPointer(GL_FLOAT,sizeof(Vertex),(void*)(sizeof(vec3) * 1));
  99. glTexCoordPointer(2,GL_FLOAT,sizeof(Vertex),(void*)(sizeof(vec3) * 4));
  100. int *indices = surfaces[i]->indices;
  101. for(int j = 0; j < surfaces[i]->num_strips; j++) {
  102. glDrawElements(GL_TRIANGLE_STRIP,indices[0],GL_UNSIGNED_INT,indices + 1);
  103. indices += indices[0] + 1;
  104. }
  105. num_triangles += getNumTriangles(i);
  106. }
  107. } else {
  108. glBindBufferARB(GL_ARRAY_BUFFER_ARB,vbo_id[s]);
  109. glVertexPointer(3,GL_FLOAT,sizeof(Vertex),0);
  110. glNormalPointer(GL_FLOAT,sizeof(Vertex),(void*)(sizeof(vec3) * 1));
  111. glTexCoordPointer(2,GL_FLOAT,sizeof(Vertex),(void*)(sizeof(vec3) * 4));
  112. int *indices = surfaces[s]->indices;
  113. for(int i = 0; i < surfaces[s]->num_strips; i++) {
  114. glDrawElements(GL_TRIANGLE_STRIP,indices[0],GL_UNSIGNED_INT,indices + 1);
  115. indices += indices[0] + 1;
  116. }
  117. num_triangles += getNumTriangles(s);
  118. }
  119. glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
  120. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  121. glDisableClientState(GL_NORMAL_ARRAY);
  122. glDisableClientState(GL_VERTEX_ARRAY);
  123. }
  124. return num_triangles;
  125. }
  126. /*
  127.  */
  128. int MeshVBO::renderShadowVolume(int s) {
  129. int num_triangles = 0;
  130. glEnableVertexAttribArrayARB(0);
  131. if(s < 0) {
  132. for(int i = 0; i < num_surfaces; i++) {
  133. Surface *s = surfaces[i];
  134. if(!s->silhouette) continue;
  135. glVertexAttribPointerARB(0,4,GL_FLOAT,0,sizeof(vec4),s->silhouette->vertex);
  136. glDrawArrays(GL_QUADS,0,s->silhouette->num_vertex);
  137. num_triangles += s->silhouette->num_vertex / 2;
  138. }
  139. } else {
  140. Surface *surface = surfaces[s];
  141. Surface *s = surface;
  142. if(!s->silhouette) return 0;
  143. glVertexAttribPointerARB(0,4,GL_FLOAT,0,sizeof(vec4),s->silhouette->vertex);
  144. glDrawArrays(GL_QUADS,0,s->silhouette->num_vertex);
  145. num_triangles += s->silhouette->num_vertex / 2;
  146. }
  147. glDisableVertexAttribArrayARB(0);
  148. return num_triangles;
  149. }