mesh.d 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. module three.mesh;
  2. public import derelict.assimp3.assimp;
  3. public import std.experimental.logger;
  4. import three.gl.draw;
  5. struct MeshData {
  6. VertexData[] vertexData;
  7. IndexData[] indexData;
  8. }
  9. struct ModelData {
  10. MeshData[] meshData;
  11. }
  12. ModelData loadModelData(string filePath) {
  13. import std.traits;
  14. import std.string : toStringz;
  15. auto scene = aiImportFile(filePath.toStringz(), aiProcess_Triangulate); scope(exit) aiReleaseImport(scene);
  16. ModelData modelData;
  17. modelData.meshData.length = scene.mNumMeshes;
  18. for(uint m = 0; m < scene.mNumMeshes; ++m) {
  19. const(aiMesh*) meshData = scene.mMeshes[m];
  20. assert(meshData !is null);
  21. size_t cntIndices = 0;
  22. foreach(f; 0..meshData.mNumFaces) {
  23. cntIndices += meshData.mFaces[f].mNumIndices;
  24. }
  25. modelData.meshData[m].vertexData.length = meshData.mNumVertices;
  26. modelData.meshData[m].indexData.length = cntIndices;
  27. foreach(v; 0..meshData.mNumVertices) {
  28. modelData.meshData[m].vertexData[v].position = Position(meshData.mVertices[v].x, meshData.mVertices[v].y, meshData.mVertices[v].z);
  29. modelData.meshData[m].vertexData[v].normal = Normal(meshData.mNormals[v].x, meshData.mNormals[v].y, meshData.mNormals[v].z);
  30. if(meshData.mColors[0] !is null) {
  31. modelData.meshData[m].vertexData[v].color = Color(meshData.mColors[0][v].r, meshData.mColors[0][v].g, meshData.mColors[0][v].b, meshData.mColors[0][v].a);
  32. }
  33. else {
  34. modelData.meshData[m].vertexData[v].color = Color(0, 0, 0, 1);
  35. }
  36. if(meshData.mTextureCoords[0] !is null) {
  37. modelData.meshData[m].vertexData[v].textureCoordinate = TextureCoordinate(meshData.mTextureCoords[0][v].x, meshData.mTextureCoords[0][v].y);
  38. }
  39. else {
  40. modelData.meshData[m].vertexData[v].textureCoordinate = TextureCoordinate(0, 0);
  41. }
  42. }
  43. size_t curIndexDataIdx = 0;
  44. foreach(f; 0..meshData.mNumFaces) {
  45. assert(meshData.mFaces !is null);
  46. foreach(i; 0..meshData.mFaces[f].mNumIndices) {
  47. assert(meshData.mFaces[f].mIndices !is null);
  48. modelData.meshData[m].indexData[curIndexDataIdx++] = meshData.mFaces[f].mIndices[i];
  49. }
  50. }
  51. }
  52. return modelData;
  53. }