PolyMesh.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. /*
  2. * PolyMesh.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 3/18/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolyMesh.h"
  10. namespace Polycode {
  11. Mesh::Mesh(String fileName) {
  12. for(int i=0; i < 16; i++) {
  13. arrayDirtyMap[i] = false;
  14. renderDataArrays[i] = NULL;
  15. }
  16. meshType = TRI_MESH;
  17. numUVs = 1;
  18. meshHasVertexBuffer = false;
  19. loadMesh(fileName);
  20. vertexBuffer = NULL;
  21. useVertexColors = false;
  22. }
  23. Mesh::Mesh(int meshType) {
  24. for(int i=0; i < 16; i++) {
  25. arrayDirtyMap[i] = false;
  26. renderDataArrays[i] = NULL;
  27. }
  28. this->meshType = meshType;
  29. meshHasVertexBuffer = false;
  30. numUVs = 1;
  31. vertexBuffer = NULL;
  32. useVertexColors = false;
  33. }
  34. Mesh::~Mesh() {
  35. for(int i=0; i < vertices.size(); i++) {
  36. delete vertices[i];
  37. }
  38. vertices.clear();
  39. for(int i=0; i < polygons.size(); i++) {
  40. delete polygons[i];
  41. }
  42. polygons.clear();
  43. if(vertexBuffer)
  44. delete vertexBuffer;
  45. for(int i=0; i < 16; i++) {
  46. if(renderDataArrays[i]) {
  47. free(renderDataArrays[i]->arrayPtr);
  48. delete renderDataArrays[i];
  49. }
  50. }
  51. }
  52. VertexBuffer *Mesh::getVertexBuffer() {
  53. return vertexBuffer;
  54. }
  55. void Mesh::setVertexBuffer(VertexBuffer *buffer) {
  56. vertexBuffer = buffer;
  57. meshHasVertexBuffer = true;
  58. }
  59. Number Mesh::getRadius() {
  60. Number hRad = 0;
  61. Number len;
  62. for(int i=0; i < vertices.size(); i++) {
  63. len = vertices[i]->length();
  64. if(len > hRad)
  65. hRad = len;
  66. }
  67. return hRad;
  68. }
  69. void Mesh::saveToFile(OSFILE *outFile) {
  70. unsigned int numFaces = polygons.size();
  71. OSBasics::write(&meshType, sizeof(unsigned int), 1, outFile);
  72. OSBasics::write(&numFaces, sizeof(unsigned int), 1, outFile);
  73. for(int i=0; i < polygons.size(); i++) {
  74. Vector3_struct pos;
  75. Vector3_struct nor;
  76. Vector4_struct col;
  77. Vector2_struct tex;
  78. for(int j=0; j < polygons[i]->getVertexCount(); j++) {
  79. pos.x = polygons[i]->getVertex(j)->x;
  80. pos.y = polygons[i]->getVertex(j)->y;
  81. pos.z = polygons[i]->getVertex(j)->z;
  82. nor.x = polygons[i]->getVertex(j)->normal.x;
  83. nor.y = polygons[i]->getVertex(j)->normal.y;
  84. nor.z = polygons[i]->getVertex(j)->normal.z;
  85. col.x = polygons[i]->getVertex(j)->vertexColor.r;
  86. col.y = polygons[i]->getVertex(j)->vertexColor.g;
  87. col.z = polygons[i]->getVertex(j)->vertexColor.b;
  88. col.w = polygons[i]->getVertex(j)->vertexColor.a;
  89. tex.x = polygons[i]->getVertex(j)->getTexCoord().x;
  90. tex.y = polygons[i]->getVertex(j)->getTexCoord().y;
  91. OSBasics::write(&pos, sizeof(Vector3_struct), 1, outFile);
  92. OSBasics::write(&nor, sizeof(Vector3_struct), 1, outFile);
  93. OSBasics::write(&col, sizeof(Vector4_struct), 1, outFile);
  94. OSBasics::write(&tex, sizeof(Vector2_struct), 1, outFile);
  95. unsigned int numBoneWeights = polygons[i]->getVertex(j)->getNumBoneAssignments();
  96. OSBasics::write(&numBoneWeights, sizeof(unsigned int), 1, outFile);
  97. for(int b=0; b < numBoneWeights; b++) {
  98. BoneAssignment *a = polygons[i]->getVertex(j)->getBoneAssignment(b);
  99. unsigned int boneID = a->boneID;
  100. float weight = a->weight;
  101. OSBasics::write(&boneID, sizeof(unsigned int), 1, outFile);
  102. OSBasics::write(&weight, sizeof(float), 1, outFile);
  103. }
  104. }
  105. }
  106. }
  107. int Mesh::getVertexIndex(Vertex *vertex) {
  108. for(int i=0; i < vertices.size(); i++) {
  109. if(vertex == vertices[i])
  110. return i;
  111. }
  112. return 0;
  113. }
  114. void Mesh::loadFromFile(OSFILE *inFile) {
  115. unsigned int meshType;
  116. OSBasics::read(&meshType, sizeof(unsigned int), 1, inFile);
  117. setMeshType(meshType);
  118. int verticesPerFace;
  119. switch(meshType) {
  120. case TRI_MESH:
  121. verticesPerFace = 3;
  122. break;
  123. case QUAD_MESH:
  124. verticesPerFace = 4;
  125. break;
  126. default:
  127. verticesPerFace = 1;
  128. break;
  129. }
  130. unsigned int numFaces;
  131. OSBasics::read(&numFaces, sizeof(unsigned int), 1, inFile);
  132. Vector3_struct pos;
  133. Vector3_struct nor;
  134. Vector4_struct col;
  135. Vector2_struct tex;
  136. for(int i=0; i < numFaces; i++) {
  137. Polygon *poly = new Polygon();
  138. for(int j=0; j < verticesPerFace; j++) {
  139. OSBasics::read(&pos, sizeof(Vector3_struct), 1, inFile);
  140. OSBasics::read(&nor, sizeof(Vector3_struct), 1, inFile);
  141. OSBasics::read(&col, sizeof(Vector4_struct), 1, inFile);
  142. OSBasics::read(&tex, sizeof(Vector2_struct), 1, inFile);
  143. Vertex *vertex = new Vertex(pos.x, pos.y, pos.z);
  144. vertex->setNormal(nor.x,nor.y, nor.z);
  145. vertex->restNormal.set(nor.x,nor.y, nor.z);
  146. vertex->vertexColor.setColor(col.x,col.y, col.z, col.w);
  147. vertex->setTexCoord(tex.x, tex.y);
  148. unsigned int numBoneWeights;
  149. OSBasics::read(&numBoneWeights, sizeof(unsigned int), 1, inFile);
  150. for(int b=0; b < numBoneWeights; b++) {
  151. float weight;
  152. unsigned int boneID;
  153. OSBasics::read(&boneID, sizeof(unsigned int), 1, inFile);
  154. OSBasics::read(&weight, sizeof(float), 1, inFile);
  155. vertex->addBoneAssignment(boneID, weight);
  156. }
  157. poly->addVertex(vertex);
  158. }
  159. addPolygon(poly);
  160. }
  161. arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
  162. arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;
  163. arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
  164. arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;
  165. // int i;
  166. //
  167. // Vertex *newVertex;
  168. // Polygon *polygon;
  169. // unsigned int numVertices, numFaces, hasWeights, numWeights, numUVs;
  170. //
  171. // unsigned int boneID;
  172. // Number boneWeight;
  173. //
  174. // OSBasics::read(&numUVs, sizeof(unsigned int), 1, inFile);
  175. // OSBasics::read(&numVertices, sizeof(unsigned int), 1, inFile);
  176. // Vector3_struct pos;
  177. // Vector3_struct nor;
  178. // Face_struct face;
  179. //
  180. // for(i=0; i<numVertices; i++) {
  181. // OSBasics::read(&pos, sizeof(Vector3_struct), 1, inFile);
  182. // OSBasics::read(&nor, sizeof(Vector3_struct), 1, inFile);
  183. //
  184. // newVertex = new Vertex(pos.x, pos.y, pos.z, nor.x, nor.y,nor.z);
  185. //
  186. // OSBasics::read(&hasWeights, sizeof(unsigned int), 1, inFile);
  187. // if(hasWeights == 1) {
  188. // OSBasics::read(&numWeights, sizeof(unsigned int), 1, inFile);
  189. // for(int j=0; j < numWeights; j++) {
  190. // OSBasics::read(&boneID, sizeof(unsigned int), 1, inFile);
  191. // OSBasics::read(&boneWeight, sizeof(Number), 1, inFile);
  192. // newVertex->addBoneAssignment(boneID, boneWeight);
  193. // }
  194. // newVertex->normalizeWeights();
  195. // }
  196. // vertices.push_back(newVertex);
  197. // }
  198. //
  199. // OSBasics::read(&numFaces, sizeof(unsigned int), 1, inFile);
  200. //
  201. // for(i=0; i<numFaces; i++) {
  202. // OSBasics::read(&face, sizeof(Face_struct), 1, inFile);
  203. // polygon = new Polygon();
  204. // polygon->setNormal(Vector3(face.nx,face.ny,face.nz));
  205. //
  206. // vertices[face.v1]->setTexCoord(face.uvs[0].x,face.uvs[0].y);
  207. // vertices[face.v2]->setTexCoord(face.uvs[1].x,face.uvs[1].y);
  208. // vertices[face.v3]->setTexCoord(face.uvs[2].x,face.uvs[2].y);
  209. //
  210. // polygon->addTexCoord(face.uvs[0].x,face.uvs[0].y);
  211. // polygon->addTexCoord(face.uvs[1].x,face.uvs[1].y);
  212. // polygon->addTexCoord(face.uvs[2].x,face.uvs[2].y);
  213. // polygon->setUseFaceUV(true);
  214. //
  215. // if(numUVs == 2) {
  216. // Vector2_struct uv2s[3];
  217. // OSBasics::read(uv2s, sizeof(Vector2_struct), 3, inFile);
  218. // polygon->addTexCoord2(uv2s[0].x,uv2s[0].y);
  219. // polygon->addTexCoord2(uv2s[1].x,uv2s[1].y);
  220. // polygon->addTexCoord2(uv2s[2].x,uv2s[2].y);
  221. // }
  222. //
  223. // polygons.push_back(polygon);
  224. // }
  225. // this->numUVs = numUVs;
  226. }
  227. void Mesh::loadMesh(String fileName) {
  228. OSFILE *inFile = OSBasics::open(fileName.c_str(), "rb");
  229. if(!inFile) {
  230. Logger::log("Error opening mesh file %s", fileName.c_str());
  231. }
  232. loadFromFile(inFile);
  233. OSBasics::close(inFile);
  234. arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
  235. arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;
  236. arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
  237. arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;
  238. }
  239. void Mesh::createPlane(Number w, Number h) {
  240. Polygon *imagePolygon = new Polygon();
  241. imagePolygon->addVertex(0,0,0,0,1);
  242. imagePolygon->addVertex(w,0,0, 1, 1);
  243. imagePolygon->addVertex(w,h,0, 1, 0);
  244. imagePolygon->addVertex(0,h,0,0,0);
  245. addPolygon(imagePolygon);
  246. for(int i=0; i < polygons.size(); i++) {
  247. for(int j=0; j < polygons[i]->getVertexCount(); j++) {
  248. polygons[i]->getVertex(j)->x = polygons[i]->getVertex(j)->x - (w/2.0f);
  249. polygons[i]->getVertex(j)->y = polygons[i]->getVertex(j)->y - (h/2.0f);
  250. }
  251. }
  252. calculateNormals();
  253. arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
  254. arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;
  255. arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
  256. arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;
  257. }
  258. void Mesh::addVertex(Vertex* vertex) {
  259. vertices.push_back(vertex);
  260. arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
  261. arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;
  262. arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
  263. arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;
  264. }
  265. unsigned int Mesh::getNumVertices() {
  266. return vertices.size();
  267. }
  268. Vertex *Mesh::getVertex(unsigned int index) {
  269. return vertices[index];
  270. }
  271. Vector3 Mesh::recenterMesh() {
  272. Vector3 positiveOffset;
  273. Vector3 negativeOffset;
  274. for(int i=0; i < polygons.size(); i++) {
  275. for(int j=0; j < polygons[i]->getVertexCount(); j++) {
  276. positiveOffset.x = max(positiveOffset.x,polygons[i]->getVertex(j)->x);
  277. positiveOffset.y = max(positiveOffset.y,polygons[i]->getVertex(j)->y);
  278. positiveOffset.z = max(positiveOffset.z,polygons[i]->getVertex(j)->z);
  279. }
  280. }
  281. for(int i=0; i < polygons.size(); i++) {
  282. for(int j=0; j < polygons[i]->getVertexCount(); j++) {
  283. negativeOffset.x = min(negativeOffset.x,polygons[i]->getVertex(j)->x);
  284. negativeOffset.y = min(negativeOffset.y,polygons[i]->getVertex(j)->y);
  285. negativeOffset.z = min(negativeOffset.z,polygons[i]->getVertex(j)->z);
  286. }
  287. }
  288. Vector3 finalOffset;
  289. finalOffset.x = (positiveOffset.x + negativeOffset.x)/2.0f;
  290. finalOffset.y = (positiveOffset.y + negativeOffset.y)/2.0f;
  291. finalOffset.z = (positiveOffset.z + negativeOffset.z)/2.0f;
  292. vector<Vertex*> done;
  293. for(int i=0; i < polygons.size(); i++) {
  294. for(int j=0; j < polygons[i]->getVertexCount(); j++) {
  295. bool alreadyDone = false;
  296. for(int k=0; k < done.size(); k++) {
  297. if(done[k] == polygons[i]->getVertex(j))
  298. alreadyDone = true;
  299. }
  300. if(!alreadyDone) {
  301. polygons[i]->getVertex(j)->x = polygons[i]->getVertex(j)->x - finalOffset.x;
  302. polygons[i]->getVertex(j)->y = polygons[i]->getVertex(j)->y - finalOffset.y;
  303. polygons[i]->getVertex(j)->z = polygons[i]->getVertex(j)->z - finalOffset.z;
  304. done.push_back(polygons[i]->getVertex(j));
  305. }
  306. }
  307. }
  308. arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
  309. return finalOffset;
  310. }
  311. Vector3 Mesh::calculateBBox() {
  312. Vector3 retVec;
  313. for(int i=0; i < polygons.size(); i++) {
  314. for(int j=0; j < polygons[i]->getVertexCount(); j++) {
  315. retVec.x = max(retVec.x,fabs(polygons[i]->getVertex(j)->x));
  316. retVec.y = max(retVec.y,fabs(polygons[i]->getVertex(j)->y));
  317. retVec.z = max(retVec.z,fabs(polygons[i]->getVertex(j)->z));
  318. }
  319. }
  320. return retVec*2;
  321. }
  322. void Mesh::createSphere(Number radius, Number numRings, Number numSegments) {
  323. Number fDeltaRingAngle = (PI / numRings);
  324. Number fDeltaSegAngle = (2 * PI / numSegments);
  325. for(int i=0; i < numRings; i++) {
  326. Number r0 = radius * sinf (i * fDeltaRingAngle);
  327. Number y0 = radius * cosf (i * fDeltaRingAngle);
  328. for(int j=0; j < numSegments; j++) {
  329. Number x0 = r0 * sinf(j * fDeltaSegAngle);
  330. Number z0 = r0 * cosf(j * fDeltaSegAngle);
  331. Number tx0 = (Number) j / (Number) numSegments;
  332. Number tx1 = (Number) i / (Number) numRings;
  333. Vector3 nor = Vector3(x0, y0, z0);
  334. nor.Normalize();
  335. }
  336. }
  337. useVertexNormals(true);
  338. arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
  339. arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;
  340. arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
  341. arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;
  342. }
  343. void Mesh::createBox(Number w, Number d, Number h) {
  344. Polygon *polygon = new Polygon();
  345. polygon->addVertex(w,0,h, 1, 1);
  346. polygon->addVertex(0,0,h, 1, 0);
  347. polygon->addVertex(0,0,0,0,0);
  348. polygon->addVertex(w,0,0,0,1);
  349. addPolygon(polygon);
  350. polygon = new Polygon();
  351. polygon->addVertex(w,d,h, 1, 1);
  352. polygon->addVertex(w,d,0, 1, 0);
  353. polygon->addVertex(0,d,0,0,0);
  354. polygon->addVertex(0,d,h,0,1);
  355. addPolygon(polygon);
  356. polygon = new Polygon();
  357. polygon->addVertex(0,d,0,0,1);
  358. polygon->addVertex(w,d,0, 1, 1);
  359. polygon->addVertex(w,0,0, 1, 0);
  360. polygon->addVertex(0,0,0,0,0);
  361. addPolygon(polygon);
  362. polygon = new Polygon();
  363. polygon->addVertex(0,0,h,0,0);
  364. polygon->addVertex(w,0,h, 1, 0);
  365. polygon->addVertex(w,d,h, 1, 1);
  366. polygon->addVertex(0,d,h,0,1);
  367. addPolygon(polygon);
  368. polygon = new Polygon();
  369. polygon->addVertex(0,0,h,0,1);
  370. polygon->addVertex(0,d,h, 1, 1);
  371. polygon->addVertex(0,d,0, 1, 0);
  372. polygon->addVertex(0,0,0,0,0);
  373. addPolygon(polygon);
  374. polygon = new Polygon();
  375. polygon->addVertex(w,0,h,0,1);
  376. polygon->addVertex(w,0,0, 1, 1);
  377. polygon->addVertex(w,d,0, 1, 0);
  378. polygon->addVertex(w,d,h,0,0);
  379. addPolygon(polygon);
  380. for(int i=0; i < polygons.size(); i++) {
  381. for(int j=0; j < polygons[i]->getVertexCount(); j++) {
  382. polygons[i]->getVertex(j)->x = polygons[i]->getVertex(j)->x - (w/2.0f);
  383. polygons[i]->getVertex(j)->y = polygons[i]->getVertex(j)->y - (d/2.0f);
  384. polygons[i]->getVertex(j)->z = polygons[i]->getVertex(j)->z - (h/2.0f);
  385. }
  386. }
  387. calculateNormals();
  388. arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
  389. arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;
  390. arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
  391. arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;
  392. }
  393. void Mesh::useVertexNormals(bool val) {
  394. for(int i =0; i < polygons.size(); i++) {
  395. polygons[i]->useVertexNormals = val;
  396. }
  397. arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;
  398. }
  399. void Mesh::calculateNormals() {
  400. for(int i =0; i < polygons.size(); i++) {
  401. polygons[i]->calculateNormal();
  402. }
  403. arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;
  404. }
  405. int Mesh::getMeshType() {
  406. return meshType;
  407. }
  408. void Mesh::setMeshType(int newType) {
  409. meshType = newType;
  410. }
  411. void Mesh::addPolygon(Polygon *newPolygon) {
  412. polygons.push_back(newPolygon);
  413. arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;
  414. arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;
  415. arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
  416. arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;
  417. }
  418. unsigned int Mesh::getPolygonCount() {
  419. return polygons.size();
  420. }
  421. Polygon *Mesh::getPolygon(unsigned int index) {
  422. return polygons[index];
  423. }
  424. }