BsGizmoManager.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #pragma once
  2. #include "BsEditorPrerequisites.h"
  3. #include "BsModule.h"
  4. #include "BsColor.h"
  5. #include "BsVector2I.h"
  6. #include "BsMatrix4.h"
  7. #include "BsGpuParam.h"
  8. namespace BansheeEngine
  9. {
  10. class GizmoManagerCore;
  11. class BS_ED_EXPORT GizmoManager : public Module<GizmoManager>
  12. {
  13. public:
  14. GizmoManager();
  15. ~GizmoManager();
  16. void startGizmo(const HSceneObject& gizmoParent);
  17. void endGizmo();
  18. void setColor(const Color& color);
  19. void setTransform(const Matrix4& transform);
  20. void setPickable(bool pickable) { mPickable = pickable; }
  21. Color getColor() const { return mColor; }
  22. Matrix4 getTransform() const { return mTransform; }
  23. void drawCube(const Vector3& position, const Vector3& extents);
  24. void drawSphere(const Vector3& position, float radius);
  25. void drawWireCube(const Vector3& position, const Vector3& extents);
  26. void drawWireSphere(const Vector3& position, float radius);
  27. void drawLine(const Vector3& start, const Vector3& end);
  28. void drawFrustum(const Vector3& position, float aspect, Degree FOV, float near, float far);
  29. void drawIcon(Vector3 position, HSpriteTexture image, bool fixedScale);
  30. void update(const CameraHandlerPtr& camera);
  31. void renderForPicking(const CameraHandlerPtr& camera, std::function<Color(UINT32)> idxToColorCallback);
  32. void clearGizmos();
  33. void clearRenderData();
  34. HSceneObject getSceneObject(UINT32 gizmoIdx);
  35. private:
  36. friend class GizmoManagerCore;
  37. enum class GizmoMaterial
  38. {
  39. Solid, Wire, Picking
  40. };
  41. struct CommonData
  42. {
  43. UINT32 idx;
  44. Color color;
  45. Matrix4 transform;
  46. HSceneObject sceneObject;
  47. bool pickable;
  48. };
  49. struct CubeData : public CommonData
  50. {
  51. Vector3 position;
  52. Vector3 extents;
  53. };
  54. struct SphereData : public CommonData
  55. {
  56. Vector3 position;
  57. float radius;
  58. };
  59. struct LineData : public CommonData
  60. {
  61. Vector3 start;
  62. Vector3 end;
  63. };
  64. struct FrustumData : public CommonData
  65. {
  66. Vector3 position;
  67. float aspect;
  68. Degree FOV;
  69. float near;
  70. float far;
  71. };
  72. struct IconData : public CommonData
  73. {
  74. Vector3 position;
  75. bool fixedScale;
  76. HSpriteTexture texture;
  77. };
  78. struct IconRenderData
  79. {
  80. UINT32 count;
  81. SPtr<TextureCore> texture;
  82. };
  83. struct CoreInitData
  84. {
  85. SPtr<MaterialCore> solidMat;
  86. SPtr<MaterialCore> wireMat;
  87. SPtr<MaterialCore> iconMat;
  88. SPtr<MaterialCore> pickingMat;
  89. SPtr<MaterialCore> alphaPickingMat;
  90. };
  91. typedef Vector<IconRenderData> IconRenderDataVec;
  92. typedef std::shared_ptr<IconRenderDataVec> IconRenderDataVecPtr;
  93. TransientMeshPtr buildIconMesh(const CameraHandlerPtr& camera, const Vector<IconData>& iconData, bool forPicking, IconRenderDataVecPtr& renderData);
  94. void limitIconSize(UINT32& width, UINT32& height);
  95. void calculateIconColors(const Color& tint, const CameraHandlerPtr& camera, UINT32 iconHeight, bool fixedScale,
  96. Color& normalColor, Color& fadedColor);
  97. void initializeCore(const CoreInitData& initData);
  98. void destroyCore(GizmoManagerCore* core);
  99. static const UINT32 VERTEX_BUFFER_GROWTH;
  100. static const UINT32 INDEX_BUFFER_GROWTH;
  101. static const UINT32 SPHERE_QUALITY;
  102. static const UINT32 WIRE_SPHERE_QUALITY;
  103. static const float MAX_ICON_RANGE;
  104. static const UINT32 OPTIMAL_ICON_SIZE;
  105. static const float ICON_TEXEL_WORLD_SIZE;
  106. typedef Set<IconData, std::function<bool(const IconData&, const IconData&)>> IconSet;
  107. Color mColor;
  108. Matrix4 mTransform;
  109. HSceneObject mActiveSO;
  110. bool mPickable;
  111. UINT32 mCurrentIdx;
  112. DrawHelper* mDrawHelper;
  113. DrawHelper* mPickingDrawHelper;
  114. Vector<CubeData> mSolidCubeData;
  115. Vector<CubeData> mWireCubeData;
  116. Vector<SphereData> mSolidSphereData;
  117. Vector<SphereData> mWireSphereData;
  118. Vector<LineData> mLineData;
  119. Vector<FrustumData> mFrustumData;
  120. Vector<IconData> mIconData;
  121. Map<UINT32, HSceneObject> mIdxToSceneObjectMap;
  122. MeshHeapPtr mIconMeshHeap;
  123. TransientMeshPtr mIconMesh;
  124. GizmoManagerCore* mCore;
  125. // Immutable
  126. VertexDataDescPtr mIconVertexDesc;
  127. // Transient
  128. struct SortedIconData
  129. {
  130. float distance;
  131. Vector2I screenPosition;
  132. UINT32 iconIdx;
  133. };
  134. Vector<SortedIconData> mSortedIconData;
  135. };
  136. class GizmoManagerCore
  137. {
  138. friend class GizmoManager;
  139. struct SolidMaterialData
  140. {
  141. SPtr<MaterialCore> mat;
  142. GpuParamMat4Core mViewProj;
  143. };
  144. struct WireMaterialData
  145. {
  146. SPtr<MaterialCore> mat;
  147. GpuParamMat4Core mViewProj;
  148. };
  149. struct IconMaterialData
  150. {
  151. SPtr<MaterialCore> mat;
  152. SPtr<GpuParamsCore> mFragParams[2];
  153. GpuParamMat4Core mViewProj[2];
  154. GpuParamTextureCore mTexture[2];
  155. };
  156. struct PickingMaterialData
  157. {
  158. SPtr<MaterialCore> mat;
  159. GpuParamMat4Core mViewProj;
  160. };
  161. struct AlphaPickingMaterialData
  162. {
  163. SPtr<MaterialCore> mat;
  164. SPtr<GpuParamsCore> mFragParams;
  165. GpuParamMat4Core mViewProj;
  166. GpuParamTextureCore mTexture;
  167. };
  168. struct PrivatelyConstuct { };
  169. public:
  170. GizmoManagerCore(const PrivatelyConstuct& dummy);
  171. private:
  172. void initialize(const GizmoManager::CoreInitData& initData);
  173. void render(const CameraHandlerCore& camera);
  174. void renderGizmos(Matrix4 viewMatrix, Matrix4 projMatrix, SPtr<MeshCoreBase> mesh, GizmoManager::GizmoMaterial material);
  175. void renderIconGizmos(Rect2I screenArea, SPtr<MeshCoreBase> mesh, GizmoManager::IconRenderDataVecPtr renderData, bool usePickingMaterial);
  176. void updateData(const SPtr<RenderTargetCore>& rt, const SPtr<MeshCoreBase>& solidMesh, const SPtr<MeshCoreBase>& wireMesh,
  177. const SPtr<MeshCoreBase>& iconMesh, const GizmoManager::IconRenderDataVecPtr& iconRenderData);
  178. static const float PICKING_ALPHA_CUTOFF;
  179. SPtr<RenderTargetCore> mSceneRenderTarget;
  180. SPtr<MeshCoreBase> mSolidMesh;
  181. SPtr<MeshCoreBase> mWireMesh;
  182. SPtr<MeshCoreBase> mIconMesh;
  183. GizmoManager::IconRenderDataVecPtr mIconRenderData;
  184. // Immutable
  185. SolidMaterialData mSolidMaterial;
  186. WireMaterialData mWireMaterial;
  187. IconMaterialData mIconMaterial;
  188. PickingMaterialData mPickingMaterial;
  189. AlphaPickingMaterialData mAlphaPickingMaterial;
  190. };
  191. }