1
1

mesh.d 2.3 KB

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