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.

Mesh.cpp 13KB

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