mesh.d 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. string filePath;
  11. MeshData[] meshData;
  12. size_t vertexCount() const @safe {
  13. import std.algorithm : map, reduce;
  14. return meshData.length == 0 ? 0 : meshData.map!("a.vertexData.length").reduce!("a + b");
  15. }
  16. size_t indexCount() const @safe {
  17. import std.algorithm : map, reduce;
  18. return meshData.length == 0 ? 0 : meshData.map!("a.indexData.length").reduce!("a + b");
  19. }
  20. size_t meshCount() const @safe {
  21. return meshData.length;
  22. }
  23. }
  24. ModelData loadModelData(string filePath) {
  25. import std.traits;
  26. import std.string : toStringz;
  27. auto scene = aiImportFile(filePath.toStringz(), aiProcess_Triangulate); scope(exit) aiReleaseImport(scene);
  28. ModelData modelData;
  29. modelData.filePath = filePath;
  30. modelData.meshData.length = scene.mNumMeshes;
  31. for(uint m = 0; m < scene.mNumMeshes; ++m) {
  32. const(aiMesh*) meshData = scene.mMeshes[m];
  33. assert(meshData !is null);
  34. size_t cntIndices = 0;
  35. foreach(f; 0..meshData.mNumFaces) {
  36. cntIndices += meshData.mFaces[f].mNumIndices;
  37. }
  38. modelData.meshData[m].vertexData.length = meshData.mNumVertices;
  39. modelData.meshData[m].indexData.length = cntIndices;
  40. foreach(v; 0..meshData.mNumVertices) {
  41. modelData.meshData[m].vertexData[v].position = Position(meshData.mVertices[v].x, meshData.mVertices[v].y, meshData.mVertices[v].z);
  42. modelData.meshData[m].vertexData[v].normal = Normal(meshData.mNormals[v].x, meshData.mNormals[v].y, meshData.mNormals[v].z);
  43. if(meshData.mColors[0] !is null) {
  44. 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);
  45. }
  46. else {
  47. modelData.meshData[m].vertexData[v].color = Color(0, 0, 0, 1);
  48. }
  49. if(meshData.mTextureCoords[0] !is null) {
  50. modelData.meshData[m].vertexData[v].textureCoordinate = TextureCoordinate(meshData.mTextureCoords[0][v].x, meshData.mTextureCoords[0][v].y);
  51. }
  52. else {
  53. modelData.meshData[m].vertexData[v].textureCoordinate = TextureCoordinate(0, 0);
  54. }
  55. }
  56. size_t curIndexDataIdx = 0;
  57. foreach(f; 0..meshData.mNumFaces) {
  58. assert(meshData.mFaces !is null);
  59. foreach(i; 0..meshData.mFaces[f].mNumIndices) {
  60. assert(meshData.mFaces[f].mIndices !is null);
  61. modelData.meshData[m].indexData[curIndexDataIdx++] = meshData.mFaces[f].mIndices[i];
  62. }
  63. }
  64. }
  65. return modelData;
  66. }