OgreImporterUtils.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #pragma once
  4. #include <Urho3D/Base/Utils.h>
  5. #include <Urho3D/Graphics/Animation.h>
  6. #include <Urho3D/Graphics/Graphics.h>
  7. #include <Urho3D/GraphicsAPI/VertexBuffer.h>
  8. #include <Urho3D/IO/Serializer.h>
  9. #include <Urho3D/Math/BoundingBox.h>
  10. #include <Urho3D/Math/Matrix3x4.h>
  11. using namespace Urho3D;
  12. struct Triangle
  13. {
  14. // Fields are not initialized.
  15. Triangle() = default;
  16. Triangle(unsigned v0, unsigned v1, unsigned v2) :
  17. v0_{v0},
  18. v1_{v1},
  19. v2_{v2}
  20. {
  21. }
  22. unsigned v0_;
  23. unsigned v1_;
  24. unsigned v2_;
  25. };
  26. struct ModelBone
  27. {
  28. String name_;
  29. unsigned parentIndex_;
  30. Vector3 bindPosition_;
  31. Quaternion bindRotation_;
  32. Vector3 bindScale_;
  33. Vector3 derivedPosition_;
  34. Quaternion derivedRotation_;
  35. Vector3 derivedScale_;
  36. Matrix3x4 worldTransform_;
  37. Matrix3x4 inverseWorldTransform_;
  38. unsigned char collisionMask_;
  39. float radius_;
  40. BoundingBox boundingBox_;
  41. };
  42. struct ModelAnimation
  43. {
  44. String name_;
  45. float length_;
  46. Vector<AnimationTrack> tracks_;
  47. };
  48. struct BoneWeightAssignment
  49. {
  50. BoneWeightAssignment(unsigned char boneIndex, float weight) :
  51. boneIndex_{boneIndex},
  52. weight_{weight}
  53. {
  54. }
  55. unsigned char boneIndex_;
  56. float weight_;
  57. };
  58. bool CompareWeights(const BoneWeightAssignment& lhs, const BoneWeightAssignment& rhs)
  59. {
  60. return lhs.weight_ > rhs.weight_;
  61. }
  62. bool CompareKeyFrames(const AnimationKeyFrame& lhs, const AnimationKeyFrame& rhs)
  63. {
  64. return lhs.time_ < rhs.time_;
  65. }
  66. struct ModelVertex
  67. {
  68. Vector3 position_;
  69. Vector3 normal_;
  70. Color color_;
  71. Vector2 texCoord1_;
  72. Vector2 texCoord2_;
  73. Vector3 cubeTexCoord1_;
  74. Vector3 cubeTexCoord2_;
  75. Vector4 tangent_;
  76. float blendWeights_[4]{};
  77. unsigned char blendIndices_[4]{};
  78. bool hasBlendWeights_{};
  79. unsigned useCount_{};
  80. int cachePosition_{};
  81. float score_{};
  82. };
  83. struct ModelVertexBuffer
  84. {
  85. VertexElements elementMask_;
  86. unsigned morphStart_;
  87. unsigned morphCount_;
  88. Vector<ModelVertex> vertices_;
  89. ModelVertexBuffer() :
  90. elementMask_(VertexElements::None),
  91. morphStart_(0),
  92. morphCount_(0)
  93. {
  94. }
  95. void WriteData(Serializer& dest)
  96. {
  97. dest.WriteU32(vertices_.Size());
  98. Vector<VertexElement> elements = VertexBuffer::GetElements(elementMask_);
  99. dest.WriteU32(elements.Size());
  100. for (unsigned j = 0; j < elements.Size(); ++j)
  101. {
  102. unsigned elementDesc = ((unsigned)elements[j].type_) |
  103. (((unsigned)elements[j].semantic_) << 8u) |
  104. (((unsigned)elements[j].index_) << 16u);
  105. dest.WriteU32(elementDesc);
  106. }
  107. dest.WriteU32(morphStart_);
  108. dest.WriteU32(morphCount_);
  109. for (unsigned i = 0; i < vertices_.Size(); ++i)
  110. {
  111. if (!!(elementMask_ & VertexElements::Position))
  112. dest.WriteVector3(vertices_[i].position_);
  113. if (!!(elementMask_ & VertexElements::Normal))
  114. dest.WriteVector3(vertices_[i].normal_);
  115. if (!!(elementMask_ & VertexElements::Color))
  116. dest.WriteU32(vertices_[i].color_.ToU32());
  117. if (!!(elementMask_ & VertexElements::TexCoord1))
  118. dest.WriteVector2(vertices_[i].texCoord1_);
  119. if (!!(elementMask_ & VertexElements::TexCoord2))
  120. dest.WriteVector2(vertices_[i].texCoord2_);
  121. if (!!(elementMask_ & VertexElements::CubeTexCoord1))
  122. dest.WriteVector3(vertices_[i].cubeTexCoord1_);
  123. if (!!(elementMask_ & VertexElements::CubeTexCoord2))
  124. dest.WriteVector3(vertices_[i].cubeTexCoord2_);
  125. if (!!(elementMask_ & VertexElements::Tangent))
  126. dest.WriteVector4(vertices_[i].tangent_);
  127. if (!!(elementMask_ & VertexElements::BlendWeights))
  128. dest.Write(&vertices_[i].blendWeights_[0], 4 * sizeof(float));
  129. if (!!(elementMask_ & VertexElements::BlendIndices))
  130. dest.Write(&vertices_[i].blendIndices_[0], 4 * sizeof(unsigned char));
  131. }
  132. }
  133. };
  134. struct ModelMorphBuffer
  135. {
  136. unsigned vertexBuffer_;
  137. VertexElements elementMask_;
  138. Vector<Pair<unsigned, ModelVertex>> vertices_;
  139. };
  140. struct ModelMorph
  141. {
  142. String name_;
  143. Vector<ModelMorphBuffer> buffers_;
  144. void WriteData(Serializer& dest)
  145. {
  146. dest.WriteString(name_);
  147. dest.WriteU32(buffers_.Size());
  148. for (unsigned i = 0; i < buffers_.Size(); ++i)
  149. {
  150. dest.WriteU32(buffers_[i].vertexBuffer_);
  151. dest.WriteU32(ToU32(buffers_[i].elementMask_));
  152. dest.WriteU32(buffers_[i].vertices_.Size());
  153. VertexElements elementMask = buffers_[i].elementMask_;
  154. for (Vector<Pair<unsigned, ModelVertex>>::Iterator j = buffers_[i].vertices_.Begin();
  155. j != buffers_[i].vertices_.End(); ++j)
  156. {
  157. dest.WriteU32(j->first_);
  158. if (!!(elementMask & VertexElements::Position))
  159. dest.WriteVector3(j->second_.position_);
  160. if (!!(elementMask & VertexElements::Normal))
  161. dest.WriteVector3(j->second_.normal_);
  162. if (!!(elementMask & VertexElements::Tangent))
  163. dest.WriteVector3(Vector3(j->second_.tangent_.x_, j->second_.tangent_.y_, j->second_.tangent_.z_));
  164. }
  165. }
  166. }
  167. };
  168. struct ModelIndexBuffer
  169. {
  170. unsigned indexSize_;
  171. Vector<unsigned> indices_;
  172. ModelIndexBuffer() :
  173. indexSize_(sizeof(unsigned short))
  174. {
  175. }
  176. void WriteData(Serializer& dest)
  177. {
  178. dest.WriteU32(indices_.Size());
  179. dest.WriteU32(indexSize_);
  180. for (unsigned i = 0; i < indices_.Size(); ++i)
  181. {
  182. if (indexSize_ == sizeof(unsigned short))
  183. dest.WriteU16(indices_[i]);
  184. else
  185. dest.WriteU32(indices_[i]);
  186. }
  187. }
  188. };
  189. struct ModelSubGeometryLodLevel
  190. {
  191. float distance_{};
  192. PrimitiveType primitiveType_{TRIANGLE_LIST};
  193. unsigned vertexBuffer_{};
  194. unsigned indexBuffer_{};
  195. unsigned indexStart_{};
  196. unsigned indexCount_{};
  197. HashMap<unsigned, Vector<BoneWeightAssignment>> boneWeights_;
  198. Vector<unsigned> boneMapping_;
  199. };