Advertisement
Guest User

Untitled

a guest
Nov 25th, 2015
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.16 KB | None | 0 0
  1. zoox::unique_ptr<FRawMesh> ReadPly(ByteBuffer const & buffer)
  2. {
  3. // read the header
  4. constexpr auto header =
  5. "ply\n\n"
  6. "format binary_little_endian 1.0\n"
  7. "comment This contains a Splatted Point Cloud\n"
  8. "element vertex %d\n"
  9. "property float x\n"
  10. "property float y\n"
  11. "property float z\n"
  12. "property float nx\n"
  13. "property float ny\n"
  14. "property float nz\n"
  15. "property uchar red\n"
  16. "property uchar green\n"
  17. "property uchar blue\n"
  18. "property uchar alpha\n"
  19. "element face %d\n"
  20. "property list uchar int vertex_indices\n"
  21. "end_header\n%n";
  22.  
  23. int num_vertices, num_faces, header_bytes;
  24. int scanned = zoox::sscanf(reinterpret_cast<char const *>(buffer.data()), header, &num_vertices, &num_faces, &header_bytes);
  25. if (scanned != 2)
  26. {
  27. return nullptr;
  28. }
  29.  
  30. // map out the lists of vertices and faces
  31. #pragma pack(push, 1)
  32. struct Vertex
  33. {
  34. zoox::array<float, 3> position;
  35. zoox::array<float, 3> normal;
  36. zoox::array<zoox::uint8_t, 4> color;
  37. };
  38.  
  39. struct Face
  40. {
  41. zoox::uint8_t num_faces;
  42. zoox::array<zoox::int32_t, 3> indices;
  43. };
  44. #pragma pack(pop)
  45.  
  46. auto vertices_begin = reinterpret_cast<Vertex const *>(buffer.data() + header_bytes);
  47. auto vertices_end = vertices_begin + num_vertices;
  48.  
  49. auto faces_begin = reinterpret_cast<Face const *>(vertices_end);
  50. auto faces_end = faces_begin + num_faces;
  51.  
  52. // ensure that the file matches the lists
  53. if (reinterpret_cast<ByteBuffer::value_type const *>(faces_end) != buffer.data() + buffer.size())
  54. {
  55. return nullptr;
  56. }
  57.  
  58. // allocate a return object
  59. auto result = zoox::unique_ptr<FRawMesh>(new FRawMesh);
  60.  
  61. // read the vertex positions
  62. result->VertexPositions.Reserve(num_vertices);
  63. for (auto vertex_iterator = vertices_begin; vertex_iterator != vertices_end; ++vertex_iterator)
  64. {
  65. result->VertexPositions.Emplace(
  66. vertex_iterator->position[0],
  67. vertex_iterator->position[1],
  68. vertex_iterator->position[2]);
  69. }
  70.  
  71. auto num_wedges = num_faces * 3;
  72. result->WedgeColors.Reserve(num_wedges);
  73. result->WedgeIndices.Reserve(num_wedges);
  74. result->WedgeTangentX.Reserve(num_wedges);
  75. result->WedgeTangentY.Reserve(num_wedges);
  76. result->WedgeTangentZ.Reserve(num_wedges);
  77. //result->WedgeTexCoords.Reserve(num_wedges);
  78. for (auto face_iterator = faces_begin; face_iterator != faces_end; ++face_iterator)
  79. {
  80. if (face_iterator->num_faces != 3)
  81. {
  82. return nullptr;
  83. }
  84.  
  85. for (auto index : face_iterator->indices)
  86. {
  87. if (index < 0 || index >= num_vertices)
  88. {
  89. return nullptr;
  90. }
  91.  
  92. auto const & vertex = vertices_begin[index];
  93. result->WedgeColors.Emplace(
  94. vertex.color[0],
  95. vertex.color[1],
  96. vertex.color[2],
  97. vertex.color[3]);
  98. result->WedgeIndices.Emplace(index);
  99. result->WedgeTangentX.Emplace(FVector::ZeroVector);
  100. result->WedgeTangentY.Emplace(FVector::ZeroVector);
  101. result->WedgeTangentZ.Emplace(
  102. vertex.normal[0],
  103. vertex.normal[1],
  104. vertex.normal[2]);
  105. //result->WedgeTexCoords.Emplace(FVector2D::ZeroVector);
  106. }
  107. }
  108.  
  109. ensure(result->WedgeColors.Num() == num_wedges);
  110. ensure(result->WedgeIndices.Num() == num_wedges);
  111. ensure(result->WedgeTangentX.Num() == num_wedges);
  112. ensure(result->WedgeTangentY.Num() == num_wedges);
  113. ensure(result->WedgeTangentZ.Num() == num_wedges);
  114.  
  115. return result;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement