ModelDef.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #pragma once
  2. #include "Common.h"
  3. #include "util/Quaternion.h"
  4. #include "util/Vector.h"
  5. #include "util/Array.h"
  6. #include "gfx/Texture.h"
  7. #include "util/Sphere.h"
  8. #include "util/MathUtils.h"
  9. #include <vector>
  10. NS_BF_BEGIN;
  11. class ModelJointTranslation
  12. {
  13. public:
  14. Quaternion mQuat;
  15. Vector3 mScale;
  16. Vector3 mTrans;
  17. };
  18. class ModelAnimationFrame
  19. {
  20. public:
  21. Array<ModelJointTranslation> mJointTranslations;
  22. };
  23. class ModelAnimation
  24. {
  25. public:
  26. String mName;
  27. Array<ModelAnimationFrame> mFrames;
  28. public:
  29. void GetJointTranslation(int jointIdx, float frameNum, ModelJointTranslation* outJointTranslation);
  30. };
  31. #define MODEL_MAX_BONE_WEIGHTS 8
  32. class ModelVertex
  33. {
  34. public:
  35. Vector3 mPosition;
  36. uint32 mColor;
  37. TexCoords mTexCoords;
  38. TexCoords mBumpTexCoords;
  39. Vector3 mNormal;
  40. Vector3 mTangent;
  41. int mNumBoneWeights;
  42. int mBoneIndices[MODEL_MAX_BONE_WEIGHTS];
  43. float mBoneWeights[MODEL_MAX_BONE_WEIGHTS];
  44. };
  45. class ModelJoint
  46. {
  47. public:
  48. String mName;
  49. int mParentIdx;
  50. Matrix4 mPoseInvMatrix;
  51. };
  52. class ModelMetalicRoughness
  53. {
  54. public:
  55. Vector3 mBaseColorFactor;
  56. float mMetallicFactor;
  57. float mRoughnessFactor;
  58. public:
  59. ModelMetalicRoughness()
  60. {
  61. mMetallicFactor = 0;
  62. mRoughnessFactor = 0;
  63. }
  64. };
  65. class ModelMaterialDef
  66. {
  67. public:
  68. class TextureParameterValue
  69. {
  70. public:
  71. String mName;
  72. String mTexturePath;
  73. public:
  74. TextureParameterValue()
  75. {
  76. }
  77. ~TextureParameterValue()
  78. {
  79. }
  80. };
  81. public:
  82. String mName;
  83. int mRefCount;
  84. bool mInitialized;
  85. OwnedArray<TextureParameterValue> mTextureParameterValues;
  86. public:
  87. ModelMaterialDef()
  88. {
  89. mRefCount = 0;
  90. mInitialized = false;
  91. }
  92. static ModelMaterialDef* CreateOrGet(const StringImpl& prefix, const StringImpl& path);
  93. };
  94. class ModelMaterialInstance
  95. {
  96. public:
  97. ModelMaterialDef* mDef;
  98. String mName;
  99. ModelMetalicRoughness mModelMetalicRoughness;
  100. };
  101. class ModelPrimitives
  102. {
  103. public:
  104. enum Flags
  105. {
  106. Flags_None = 0,
  107. Flags_Vertex_Position = 1,
  108. Flags_Vertex_Tex0 = 2,
  109. Flags_Vertex_Tex1 = 4,
  110. Flags_Vertex_Tex2 = 8,
  111. Flags_Vertex_Color = 0x10,
  112. Flags_Vertex_Normal = 0x20,
  113. Flags_Vertex_Tangent = 0x40,
  114. };
  115. public:
  116. Array<ModelVertex> mVertices;
  117. Array<uint16> mIndices;
  118. ModelMaterialInstance* mMaterial;
  119. Array<String> mTexPaths;
  120. Flags mFlags;
  121. public:
  122. ModelPrimitives()
  123. {
  124. mMaterial = NULL;
  125. mFlags = Flags_None;
  126. }
  127. };
  128. class ModelMesh
  129. {
  130. public:
  131. String mName;
  132. Array<ModelPrimitives> mPrimitives;
  133. };
  134. class ModelNode
  135. {
  136. public:
  137. String mName;
  138. Vector3 mTranslation;
  139. Vector4 mRotation;
  140. ModelMesh* mMesh;
  141. Array<ModelNode*> mChildren;
  142. };
  143. class ModelBVNode
  144. {
  145. public:
  146. enum Kind
  147. {
  148. Kind_None,
  149. Kind_Branch,
  150. Kind_Leaf
  151. };
  152. public:
  153. Sphere mBoundSphere;
  154. AABB mBoundAABB;
  155. union
  156. {
  157. struct
  158. {
  159. int mLeft;
  160. int mRight;
  161. };
  162. struct
  163. {
  164. int mTriStartIdx;
  165. int mTriCount;
  166. };
  167. };
  168. Kind mKind;
  169. public:
  170. ModelBVNode()
  171. {
  172. mKind = Kind_None;
  173. }
  174. };
  175. class ModelDef
  176. {
  177. public:
  178. enum Flags
  179. {
  180. Flags_None,
  181. Flags_HasBounds,
  182. Flags_HasBVH,
  183. };
  184. public:
  185. String mLoadDir;
  186. float mFrameRate;
  187. Array<ModelMesh> mMeshes;
  188. Array<ModelJoint> mJoints;
  189. Array<ModelAnimation> mAnims;
  190. Array<ModelNode> mNodes;
  191. Array<ModelMaterialInstance> mMaterials;
  192. Flags mFlags;
  193. AABB mBounds;
  194. Array<ModelBVNode> mBVNodes;
  195. Array<uint16> mBVIndices;
  196. Array<Vector3> mBVVertices;
  197. Array<int32> mBVTris;
  198. protected:
  199. void CalcBounds();
  200. void RayIntersect(ModelBVNode* bvNode, const Matrix4& worldMtx, const Vector3& origin, const Vector3& vec, Vector3& outIntersect, float& outDistance);
  201. public:
  202. ModelDef();
  203. ~ModelDef();
  204. void Compact();
  205. void GetBounds(Vector3& min, Vector3& max);
  206. void GenerateCollisionData();
  207. bool RayIntersect(const Matrix4& worldMtx, const Vector3& origin, const Vector3& vec, Vector3& outIntersect, float& outDistance);
  208. };
  209. NS_BF_END;