BsGizmoManager.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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();
  29. void renderForPicking(const HCamera& camera, std::function<Color(UINT32)> idxToColorCallback);
  30. void clearGizmos();
  31. private:
  32. friend class GizmoManagerCore;
  33. struct CommonData
  34. {
  35. Color color;
  36. Matrix4 transform;
  37. HSceneObject sceneObject;
  38. bool pickable;
  39. };
  40. struct CubeData : public CommonData
  41. {
  42. Vector3 position;
  43. Vector3 extents;
  44. };
  45. struct SphereData : public CommonData
  46. {
  47. Vector3 position;
  48. float radius;
  49. };
  50. struct LineData : public CommonData
  51. {
  52. Vector3 start;
  53. Vector3 end;
  54. };
  55. struct FrustumData : public CommonData
  56. {
  57. Vector3 position;
  58. float aspect;
  59. Degree FOV;
  60. float near;
  61. float far;
  62. };
  63. struct IconData : public CommonData
  64. {
  65. Vector3 position;
  66. bool fixedScale;
  67. HSpriteTexture texture;
  68. };
  69. struct IconRenderData
  70. {
  71. UINT32 count;
  72. HTexture texture;
  73. };
  74. struct CoreInitData
  75. {
  76. MaterialProxyPtr solidMatProxy;
  77. MaterialProxyPtr wireMatProxy;
  78. MaterialProxyPtr iconMatProxy;
  79. MaterialProxyPtr pickingMatProxy;
  80. MaterialProxyPtr alphaPickingMatProxy;
  81. };
  82. typedef Vector<IconRenderData> IconRenderDataVec;
  83. typedef std::shared_ptr<IconRenderDataVec> IconRenderDataVecPtr;
  84. TransientMeshPtr buildIconMesh(const HCamera& camera, const Vector<IconData>& iconData, bool pickingOnly, IconRenderDataVecPtr& renderData);
  85. void limitIconSize(UINT32& width, UINT32& height);
  86. void calculateIconColors(const Color& tint, const Camera& camera, UINT32 iconHeight, bool fixedScale,
  87. Color& normalColor, Color& fadedColor);
  88. void initializeCore(const CoreInitData& initData);
  89. void destroyCore(GizmoManagerCore* core);
  90. static const UINT32 VERTEX_BUFFER_GROWTH;
  91. static const UINT32 INDEX_BUFFER_GROWTH;
  92. static const UINT32 SPHERE_QUALITY;
  93. static const UINT32 WIRE_SPHERE_QUALITY;
  94. static const float MAX_ICON_RANGE;
  95. static const UINT32 OPTIMAL_ICON_SIZE;
  96. static const float ICON_TEXEL_WORLD_SIZE;
  97. typedef Set<IconData, std::function<bool(const IconData&, const IconData&)>> IconSet;
  98. Color mColor;
  99. Matrix4 mTransform;
  100. HSceneObject mActiveSO;
  101. bool mPickable;
  102. DrawHelper* mDrawHelper;
  103. DrawHelper* mPickingDrawHelper;
  104. Vector<CubeData> mSolidCubeData;
  105. Vector<CubeData> mWireCubeData;
  106. Vector<SphereData> mSolidSphereData;
  107. Vector<SphereData> mWireSphereData;
  108. Vector<LineData> mLineData;
  109. Vector<FrustumData> mFrustumData;
  110. Vector<IconData> mIconData;
  111. MeshHeapPtr mIconMeshHeap;
  112. TransientMeshPtr mSolidMesh;
  113. TransientMeshPtr mWireMesh;
  114. TransientMeshPtr mIconMesh;
  115. GizmoManagerCore* mCore;
  116. // Immutable
  117. VertexDataDescPtr mIconVertexDesc;
  118. // Transient
  119. struct SortedIconData
  120. {
  121. float distance;
  122. Vector2I screenPosition;
  123. UINT32 iconIdx;
  124. };
  125. Vector<SortedIconData> mSortedIconData;
  126. };
  127. class GizmoManagerCore
  128. {
  129. friend class GizmoManager;
  130. struct SolidMaterialData
  131. {
  132. MaterialProxyPtr proxy;
  133. GpuParamMat4 mViewProj;
  134. };
  135. struct WireMaterialData
  136. {
  137. MaterialProxyPtr proxy;
  138. GpuParamMat4 mViewProj;
  139. };
  140. struct IconMaterialData
  141. {
  142. MaterialProxyPtr proxy;
  143. GpuParamsPtr mFragParams;
  144. GpuParamMat4 mViewProj;
  145. GpuParamTexture mTexture;
  146. };
  147. struct PickingMaterialData
  148. {
  149. MaterialProxyPtr proxy;
  150. GpuParamMat4 mViewProj;
  151. };
  152. struct AlphaPickingMaterialData
  153. {
  154. MaterialProxyPtr proxy;
  155. GpuParamsPtr mFragParams;
  156. GpuParamMat4 mViewProj;
  157. GpuParamTexture mTexture;
  158. };
  159. struct PrivatelyConstuct { };
  160. public:
  161. GizmoManagerCore(const PrivatelyConstuct& dummy);
  162. private:
  163. void initialize(const GizmoManager::CoreInitData& initData);
  164. void render(const CameraProxy& camera);
  165. void renderSolidGizmos(Matrix4 viewMatrix, Matrix4 projMatrix, MeshProxyPtr mesh);
  166. void renderWireGizmos(Matrix4 viewMatrix, Matrix4 projMatrix, MeshProxyPtr mesh);
  167. void renderIconGizmos(Rect2I screenArea, MeshProxyPtr mesh, GizmoManager::IconRenderDataVecPtr renderData);
  168. void renderGizmosForPicking(Matrix4 viewMatrix, Matrix4 projMatrix, MeshProxyPtr mesh);
  169. void renderIconGizmosForPicking(Rect2I screenArea, MeshProxyPtr mesh, GizmoManager::IconRenderDataVecPtr renderData);
  170. void updateData(const RenderTargetPtr& rt, const MeshProxyPtr& solidMeshProxy, const MeshProxyPtr& wireMeshProxy,
  171. const MeshProxyPtr& iconMeshProxy, const GizmoManager::IconRenderDataVecPtr& iconRenderData);
  172. static const float PICKING_ALPHA_CUTOFF;
  173. RenderTargetPtr mSceneRenderTarget;
  174. MeshProxyPtr mSolidMeshProxy;
  175. MeshProxyPtr mWireMeshProxy;
  176. MeshProxyPtr mIconMeshProxy;
  177. GizmoManager::IconRenderDataVecPtr mIconRenderData;
  178. // Immutable
  179. SolidMaterialData mSolidMaterial;
  180. WireMaterialData mWireMaterial;
  181. IconMaterialData mIconMaterial;
  182. PickingMaterialData mPickingMaterial;
  183. AlphaPickingMaterialData mAlphaPickingMaterial;
  184. };
  185. }