1
1

mesh.d 2.0 KB

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