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

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. ////////////////////////////////////////////////////////////