mesh.d 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. void loadModelData(out ModelData modelData, 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.meshData.length = scene.mNumMeshes;
  37. for(uint m = 0; m < scene.mNumMeshes; ++m) {
  38. const(aiMesh*) meshData = scene.mMeshes[m];
  39. assert(meshData !is null);
  40. size_t cntIndices = 0;
  41. foreach(f; 0..meshData.mNumFaces) {
  42. cntIndices += meshData.mFaces[f].mNumIndices;
  43. }
  44. modelData.meshData[m].vertexData.length = meshData.mNumVertices;
  45. modelData.meshData[m].indexData.length = cntIndices;
  46. foreach(v; 0..meshData.mNumVertices) {
  47. modelData.meshData[m].vertexData[v].position = Position(meshData.mVertices[v].x, meshData.mVertices[v].y, meshData.mVertices[v].z);
  48. modelData.meshData[m].vertexData[v].normal = Normal(meshData.mNormals[v].x, meshData.mNormals[v].y, meshData.mNormals[v].z);
  49. if(meshData.mColors[0] !is null) {
  50. 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);
  51. }
  52. else {
  53. modelData.meshData[m].vertexData[v].color = Color(0, 0, 0, 1);
  54. }
  55. if(meshData.mTextureCoords[0] !is null) {
  56. modelData.meshData[m].vertexData[v].textureCoordinate = TextureCoordinate(meshData.mTextureCoords[0][v].x, meshData.mTextureCoords[0][v].y);
  57. }
  58. else {
  59. modelData.meshData[m].vertexData[v].textureCoordinate = TextureCoordinate(0, 0);
  60. }
  61. }
  62. size_t curIndexDataIdx = 0;
  63. foreach(f; 0..meshData.mNumFaces) {
  64. assert(meshData.mFaces !is null);
  65. foreach(i; 0..meshData.mFaces[f].mNumIndices) {
  66. assert(meshData.mFaces[f].mIndices !is null);
  67. modelData.meshData[m].indexData[curIndexDataIdx++] = meshData.mFaces[f].mIndices[i];
  68. }
  69. }
  70. }
  71. }