1
1

mesh.d 2.3 KB

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