Open Source Tomb Raider Engine
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

OpenGLMesh.cpp 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. /* -*- Mode: C++; tab-width: 3; indent-tabs-mode: t; c-basic-offset: 3 -*- */
  2. /*================================================================
  3. *
  4. * Project : OpenRaider
  5. * Author : Terry 'Mongoose' Hendrix II
  6. * Website : http://www.westga.edu/~stu7440/
  7. * Email : stu7440@westga.edu
  8. * Object : OpenGLMesh
  9. * License : No use w/o permission (C) 2002 Mongoose
  10. * Comments:
  11. *
  12. *
  13. * This file was generated using Mongoose's C++
  14. * template generator script. <stu7440@westga.edu>
  15. *
  16. *-- History -------------------------------------------------
  17. *
  18. * 2002.08.23:
  19. * Mongoose - Created
  20. =================================================================*/
  21. #ifdef __APPLE__
  22. #include <OpenGL/gl.h>
  23. #else
  24. #include <GL/gl.h>
  25. #endif
  26. #include "OpenGLMesh.h"
  27. ////////////////////////////////////////////////////////////
  28. // Constructors
  29. ////////////////////////////////////////////////////////////
  30. OpenGLMesh::OpenGLMesh()
  31. {
  32. mNumVertices = 0;
  33. mVertices = 0x0;
  34. mNumNormals = 0;
  35. mNormals = 0x0;
  36. mNumColors = 0;
  37. mColors = 0x0;
  38. mNumTris = 0;
  39. mTris = 0x0;
  40. mNumQuads = 0;
  41. mQuads = 0x0;
  42. mVertexArray = 0x0;
  43. mNormalArray = 0x0;
  44. mColorArray = 0x0;
  45. mTriangleCount = 0;
  46. mTriangleTextures = 0x0;
  47. mTriangleIndices = 0x0;
  48. mTriangleFlags = 0x0;
  49. mTriangleTexCoordArray = 0x0;
  50. mFlags = 0;
  51. mMode = OpenGLMeshModeTexture;
  52. }
  53. OpenGLMesh::~OpenGLMesh()
  54. {
  55. unsigned int i;
  56. if (mVertices)
  57. {
  58. delete [] mVertices;
  59. }
  60. if (mNormals)
  61. {
  62. delete [] mNormals;
  63. }
  64. if (mColors)
  65. {
  66. delete [] mColors;
  67. }
  68. if (mTris)
  69. {
  70. for (i = 0; i < mNumTris; ++i)
  71. {
  72. if (mTris[i].triangles)
  73. delete [] mTris[i].triangles;
  74. if (mTris[i].alpha_triangles)
  75. delete [] mTris[i].alpha_triangles;
  76. if (mTris[i].texcoors)
  77. delete [] mTris[i].texcoors;
  78. if (mTris[i].texcoors2)
  79. delete [] mTris[i].texcoors2;
  80. }
  81. delete [] mTris;
  82. }
  83. if (mQuads)
  84. {
  85. for (i = 0; i < mNumQuads; ++i)
  86. {
  87. if (mQuads[i].quads)
  88. delete [] mQuads[i].quads;
  89. if (mQuads[i].alpha_quads)
  90. delete [] mQuads[i].alpha_quads;
  91. if (mQuads[i].texcoors)
  92. delete [] mQuads[i].texcoors;
  93. if (mQuads[i].texcoors2)
  94. delete [] mQuads[i].texcoors2;
  95. }
  96. delete [] mQuads;
  97. }
  98. if (mVertexArray)
  99. {
  100. delete [] mVertexArray;
  101. }
  102. if (mNormalArray)
  103. {
  104. delete [] mNormalArray;
  105. }
  106. if (mColorArray)
  107. {
  108. delete [] mColorArray;
  109. }
  110. if (mTriangleTextures)
  111. {
  112. delete [] mTriangleTextures;
  113. }
  114. if (mTriangleIndices)
  115. {
  116. delete [] mTriangleIndices;
  117. }
  118. if (mTriangleFlags)
  119. {
  120. delete [] mTriangleFlags;
  121. }
  122. if (mTriangleTexCoordArray)
  123. {
  124. delete [] mTriangleTexCoordArray;
  125. }
  126. }
  127. ////////////////////////////////////////////////////////////
  128. // Public Accessors
  129. ////////////////////////////////////////////////////////////
  130. void OpenGLMesh::drawAlpha()
  131. {
  132. unsigned int i, j, k, index;
  133. // Render quadralaterals
  134. for (mQuads ? i = 0 : i = mNumQuads; i < mNumQuads; ++i)
  135. {
  136. switch (mMode)
  137. {
  138. case OpenGLMeshModeWireframe:
  139. glColor3f(0.0, 0.0, 1.0);
  140. case OpenGLMeshModeSolid:
  141. // Bind WHITE texture for solid colors
  142. glBindTexture(GL_TEXTURE_2D, 0);
  143. break;
  144. default:
  145. // Bind texture id for textures
  146. glBindTexture(GL_TEXTURE_2D, mQuads[i].texture+1);
  147. }
  148. glBegin(GL_QUADS);
  149. for (j = 0; j < mQuads[i].num_alpha_quads; ++j)
  150. {
  151. for (k = 0; k < 4; ++k)
  152. {
  153. index = mQuads[i].alpha_quads[j*4+k];
  154. glTexCoord2fv(mQuads[i].texcoors2[j*4+k]);
  155. glColor4fv(mColors[index]);
  156. glVertex3fv(mVertices[index]);
  157. }
  158. }
  159. glEnd();
  160. }
  161. // Render triangles
  162. for (mTris ? i = 0 : i = mNumTris; i < mNumTris; ++i)
  163. {
  164. switch (mMode)
  165. {
  166. case OpenGLMeshModeWireframe:
  167. glColor3f(0.0, 1.0, 0.0);
  168. case OpenGLMeshModeSolid:
  169. // Bind WHITE texture for solid colors
  170. glBindTexture(GL_TEXTURE_2D, 0);
  171. break;
  172. default:
  173. // Bind texture id for textures
  174. glBindTexture(GL_TEXTURE_2D, mTris[i].texture+1);
  175. }
  176. glBegin(GL_TRIANGLES);
  177. for (j = 0; j < mTris[i].num_alpha_triangles; ++j)
  178. {
  179. for (k = 0; k < 3; ++k)
  180. {
  181. index = mTris[i].alpha_triangles[j*3+k];
  182. glTexCoord2fv(mTris[i].texcoors2[j*3+k]);
  183. glColor4fv(mColors[index]);
  184. glVertex3fv(mVertices[index]);
  185. }
  186. }
  187. glEnd();
  188. }
  189. }
  190. void OpenGLMesh::drawSolid()
  191. {
  192. unsigned int i, j, k, index;
  193. if (mFlags & fOpenGLMesh_UseVertexArray)
  194. {
  195. //glEnableClientState(GL_VERTEX_ARRAY);
  196. //glVertexPointer(3, GL_FLOAT, 0, mVertexArray);
  197. glPointSize(2.0f);
  198. glColor3f(1.0f, 1.0f, 1.0f);
  199. glBegin(GL_TRIANGLES);
  200. for (i = 0; i < mTriangleCount*3; ++i)
  201. {
  202. //glArrayElement(mTriangleIndices[i]);
  203. glVertex3fv(mVertexArray+mTriangleIndices[i]);
  204. }
  205. glEnd();
  206. glPointSize(1.0f);
  207. return; // FIXME
  208. for (j = 0; j < mQuads[i].num_quads; ++j)
  209. {
  210. for (k = 0; k < 4; ++k)
  211. {
  212. index = mQuads[i].quads[j*4+k];
  213. glTexCoord2fv(mQuads[i].texcoors[j*4+k]);
  214. glArrayElement(mQuads[i].quads[j*4+k]);
  215. }
  216. }
  217. return;
  218. }
  219. // Render quadralaterals
  220. for (mQuads ? i = 0 : i = mNumQuads; i < mNumQuads; ++i)
  221. {
  222. switch (mMode)
  223. {
  224. case OpenGLMeshModeSolid:
  225. glColor3f(0.0, 0.0, 0.0);
  226. break;
  227. case OpenGLMeshModeWireframe:
  228. // Bind WHITE texture for solid colors
  229. glBindTexture(GL_TEXTURE_2D, 0);
  230. break;
  231. #ifdef MULTITEXTURE
  232. case OpenGLMeshModeMultiTexture:
  233. glActiveTextureARB(GL_TEXTURE0_ARB);
  234. glEnable(GL_TEXTURE_2D);
  235. glBindTexture(GL_TEXTURE_2D, mQuads[i].texture+1);
  236. glActiveTextureARB(GL_TEXTURE1_ARB);
  237. glEnable(GL_TEXTURE_2D);
  238. glBindTexture(GL_TEXTURE_2D, mQuads[i].bumpmap+1);
  239. break;
  240. #endif
  241. default:
  242. // Bind texture id for textures
  243. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  244. glBindTexture(GL_TEXTURE_2D, mQuads[i].texture+1);
  245. }
  246. glBegin(GL_QUADS);
  247. for (j = 0; j < mQuads[i].num_quads; ++j)
  248. {
  249. for (k = 0; k < 4; ++k)
  250. {
  251. index = mQuads[i].quads[j*4+k];
  252. glColor4fv(mColors[index]);
  253. #ifdef MULTITEXTURE
  254. if (mMode == OpenGLMeshModeMultiTexture)
  255. {
  256. glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,
  257. mQuads[i].texcoors[j*4+k]);
  258. glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,
  259. mQuads[i].texcoors[j*4+k]);
  260. }
  261. else
  262. #endif
  263. glTexCoord2fv(mQuads[i].texcoors[j*4+k]);
  264. glVertex3fv(mVertices[index]);
  265. }
  266. }
  267. glEnd();
  268. }
  269. // Render triangles
  270. for (mTris ? i = 0 : i = mNumTris; i < mNumTris; ++i)
  271. {
  272. switch (mMode)
  273. {
  274. case OpenGLMeshModeSolid:
  275. glColor3f(1.0, 0.0, 0.0);
  276. break;
  277. case OpenGLMeshModeWireframe:
  278. // Bind WHITE texture for solid colors
  279. glBindTexture(GL_TEXTURE_2D, 0);
  280. break;
  281. #ifdef MULTITEXTURE
  282. case OpenGLMeshModeMultiTexture:
  283. glActiveTextureARB(GL_TEXTURE0_ARB);
  284. glEnable(GL_TEXTURE_2D);
  285. glBindTexture(GL_TEXTURE_2D, mTris[i].texture+1);
  286. glActiveTextureARB(GL_TEXTURE1_ARB);
  287. glEnable(GL_TEXTURE_2D);
  288. glBindTexture(GL_TEXTURE_2D, mTris[i].bumpmap+1);
  289. break;
  290. #endif
  291. default:
  292. // Bind texture id for textures
  293. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  294. glBindTexture(GL_TEXTURE_2D, mTris[i].texture+1);
  295. }
  296. glBegin(GL_TRIANGLES);
  297. for (j = 0; j < mTris[i].num_triangles; ++j)
  298. {
  299. for (k = 0; k < 3; ++k)
  300. {
  301. index = mTris[i].triangles[j*3+k];
  302. #ifdef MULTITEXTURE
  303. if (mMode == OpenGLMeshModeMultiTexture)
  304. {
  305. glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,
  306. mTris[i].texcoors[j*3+k]);
  307. glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,
  308. mTris[i].texcoors[j*3+k]);
  309. }
  310. else
  311. #endif
  312. glTexCoord2fv(mTris[i].texcoors[j*3+k]);
  313. glColor4fv(mColors[index]);
  314. glVertex3fv(mVertices[index]);
  315. }
  316. }
  317. glEnd();
  318. }
  319. #ifdef MULTITEXTURE
  320. if (mMode == OpenGLMeshModeMultiTexture)
  321. {
  322. glDisable(GL_TEXTURE_2D);
  323. glActiveTextureARB(GL_TEXTURE0_ARB);
  324. }
  325. #endif
  326. }
  327. ////////////////////////////////////////////////////////////
  328. // Public Mutators
  329. ////////////////////////////////////////////////////////////
  330. void OpenGLMesh::allocateColors(unsigned int n)
  331. {
  332. if (mColors)
  333. {
  334. mNumColors = 0;
  335. delete [] mColors;
  336. }
  337. if (!n)
  338. {
  339. return;
  340. }
  341. mNumColors = n;
  342. mColors = new vec4_t[mNumColors];
  343. }
  344. void OpenGLMesh::allocateNormals(unsigned int n)
  345. {
  346. if (mNormals)
  347. {
  348. mNumNormals = 0;
  349. delete [] mNormals;
  350. }
  351. if (!n)
  352. {
  353. return;
  354. }
  355. mNumNormals = n;
  356. mNormals = new vec3_t[mNumNormals];
  357. }
  358. void OpenGLMesh::allocateRectangles(unsigned int n)
  359. {
  360. if (mQuads)
  361. {
  362. mNumQuads = 0;
  363. delete [] mQuads;
  364. }
  365. if (!n)
  366. {
  367. return;
  368. }
  369. mNumQuads = n;
  370. mQuads = new rect_t[mNumQuads];
  371. }
  372. void OpenGLMesh::allocateTriangles(unsigned int n)
  373. {
  374. if (mTris)
  375. {
  376. mNumTris = 0;
  377. delete [] mTris;
  378. }
  379. if (!n)
  380. {
  381. return;
  382. }
  383. mNumTris = n;
  384. mTris = new tris_t[mNumTris];
  385. }
  386. void OpenGLMesh::allocateVertices(unsigned int n)
  387. {
  388. if (mVertices)
  389. {
  390. mNumVertices = 0;
  391. delete [] mVertices;
  392. }
  393. if (!n)
  394. {
  395. return;
  396. }
  397. mNumVertices = n;
  398. mVertices = new vec3_t[mNumVertices];
  399. }
  400. void OpenGLMesh::bufferColorArray(unsigned int colorCount, vec_t *colors,
  401. unsigned int colorWidth)
  402. {
  403. if (mColors)
  404. {
  405. mNumColors = 0;
  406. delete [] mColors;
  407. }
  408. if (!colorCount)
  409. {
  410. return;
  411. }
  412. //mColorWidth = colorWidth; // for now assume 4 always
  413. mNumColors = colorCount;
  414. mColorArray = colors;
  415. }
  416. void OpenGLMesh::bufferNormalArray(unsigned int normalCount, vec_t *normals)
  417. {
  418. if (mNormals)
  419. {
  420. mNumNormals = 0;
  421. delete [] mNormals;
  422. }
  423. if (!normalCount)
  424. {
  425. return;
  426. }
  427. mNumNormals = normalCount;
  428. mNormalArray = normals;
  429. }
  430. void OpenGLMesh::bufferTriangles(unsigned int count,
  431. unsigned int *indices, vec_t *texCoords,
  432. int *textures, unsigned int *flags)
  433. {
  434. mTriangleCount = count;
  435. mTriangleTextures = textures;
  436. mTriangleIndices = indices;
  437. mTriangleFlags = flags;
  438. mTriangleTexCoordArray = texCoords;
  439. // FIXME: sortTrianglesByTexture();
  440. }
  441. void OpenGLMesh::bufferVertexArray(unsigned int vertexCount, vec_t *vertices)
  442. {
  443. if (mVertices)
  444. {
  445. mNumVertices = 0;
  446. delete [] mVertices;
  447. }
  448. if (!vertexCount)
  449. {
  450. return;
  451. }
  452. mNumVertices = vertexCount;
  453. mVertexArray = vertices;
  454. mFlags |= fOpenGLMesh_UseVertexArray;
  455. }
  456. void OpenGLMesh::setColor(unsigned int index,
  457. float r, float g, float b, float a)
  458. {
  459. if (index > mNumColors)
  460. {
  461. return;
  462. }
  463. mColors[index][0] = r;
  464. mColors[index][1] = g;
  465. mColors[index][2] = b;
  466. mColors[index][3] = a;
  467. }
  468. void OpenGLMesh::setColor(unsigned int index, float rgba[4])
  469. {
  470. if (index > mNumColors)
  471. {
  472. return;
  473. }
  474. mColors[index][0] = rgba[0];
  475. mColors[index][1] = rgba[1];
  476. mColors[index][2] = rgba[2];
  477. mColors[index][3] = rgba[3];
  478. }
  479. void OpenGLMesh::setNormal(unsigned int index, float i, float j, float k)
  480. {
  481. if (index > mNumNormals)
  482. {
  483. return;
  484. }
  485. mNormals[index][0] = i;
  486. mNormals[index][1] = j;
  487. mNormals[index][2] = k;
  488. }
  489. void OpenGLMesh::setVertex(unsigned int index, float x, float y, float z)
  490. {
  491. if (index > mNumVertices)
  492. {
  493. return;
  494. }
  495. mVertices[index][0] = x;
  496. mVertices[index][1] = y;
  497. mVertices[index][2] = z;
  498. }
  499. ////////////////////////////////////////////////////////////
  500. // Private Accessors
  501. ////////////////////////////////////////////////////////////
  502. ////////////////////////////////////////////////////////////
  503. // Private Mutators
  504. ////////////////////////////////////////////////////////////
  505. ////////////////////////////////////////////////////////////
  506. // Unit Test code
  507. ////////////////////////////////////////////////////////////
  508. #ifdef UNIT_TEST_OPENGLMESH
  509. int runOpenGLMeshUnitTest(int argc, char *argv[])
  510. {
  511. return 0;
  512. }
  513. int main(int argc, char *argv[])
  514. {
  515. OpenGLMesh test;
  516. printf("[OpenGLMesh class test]\n");
  517. return runOpenGLMeshUnitTest(argc, argv);
  518. }
  519. #endif