Open Source Tomb Raider Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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