BsGizmoManager.h 5.7 KB

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