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 13KB

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