BsScenePicking.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #pragma once
  2. #include "BsEditorPrerequisites.h"
  3. #include "BsModule.h"
  4. #include "BsMatrix4.h"
  5. #include "BsGpuParam.h"
  6. namespace BansheeEngine
  7. {
  8. class PickResult
  9. {
  10. public:
  11. enum class Type
  12. {
  13. SceneObject,
  14. Gizmo,
  15. None
  16. };
  17. HSceneObject sceneObject;
  18. UINT32 gizmoId;
  19. Type type;
  20. };
  21. class ScenePicking : public Module<ScenePicking>
  22. {
  23. struct RenderablePickData
  24. {
  25. MeshProxyPtr mesh;
  26. UINT32 index;
  27. Matrix4 wvpTransform;
  28. bool alpha;
  29. CullingMode cullMode;
  30. HTexture mainTexture;
  31. };
  32. struct MaterialData
  33. {
  34. // Sim thread
  35. HMaterial mMatPicking;
  36. HMaterial mMatPickingAlpha;
  37. // Core thread
  38. MaterialProxyPtr mMatPickingProxy;
  39. MaterialProxyPtr mMatPickingAlphaProxy;
  40. GpuParamsPtr mParamPickingVertParams;
  41. GpuParamsPtr mParamPickingFragParams;
  42. GpuParamsPtr mParamPickingAlphaVertParams;
  43. GpuParamsPtr mParamPickingAlphaFragParams;
  44. GpuParamMat4 mParamPickingWVP;
  45. GpuParamMat4 mParamPickingAlphaWVP;
  46. GpuParamColor mParamPickingColor;
  47. GpuParamColor mParamPickingAlphaColor;
  48. GpuParamTexture mParamPickingAlphaTexture;
  49. };
  50. public:
  51. ScenePicking();
  52. HSceneObject pickClosestSceneObject(const HCamera& cam, const Vector2I& position, const Vector2I& area);
  53. PickResult pickClosestObject(const HCamera& cam, const Vector2I& position, const Vector2I& area);
  54. Vector<HSceneObject> pickSceneObjects(const HCamera& cam, const Vector2I& position, const Vector2I& area);
  55. Vector<PickResult> pickObjects(const HCamera& cam, const Vector2I& position, const Vector2I& area);
  56. private:
  57. typedef Set<RenderablePickData, std::function<bool(const RenderablePickData&, const RenderablePickData&)>> RenderableSet;
  58. void initializeCore();
  59. Color encodeIndex(UINT32 index);
  60. UINT32 decodeIndex(Color color);
  61. void corePickObjects(const Viewport& viewport, const RenderableSet& renderables, const Vector2I& position,
  62. const Vector2I& area, AsyncOp& asyncOp);
  63. static const float ALPHA_CUTOFF;
  64. MaterialData mMaterialData[3];
  65. };
  66. }