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.

Mesh.cpp 12KB

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