BsGizmoManager.h 5.7 KB

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