BsScenePicking.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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 ScenePicking : public Module<ScenePicking>
  9. {
  10. struct RenderablePickData
  11. {
  12. SPtr<MeshCore> mesh;
  13. UINT32 index;
  14. Matrix4 wvpTransform;
  15. bool alpha;
  16. CullingMode cullMode;
  17. HTexture mainTexture;
  18. };
  19. struct MaterialData
  20. {
  21. // Sim thread
  22. HMaterial mMatPicking;
  23. HMaterial mMatPickingAlpha;
  24. // Core thread
  25. MaterialProxyPtr mMatPickingProxy;
  26. MaterialProxyPtr mMatPickingAlphaProxy;
  27. SPtr<GpuParamsCore> mParamPickingVertParams;
  28. SPtr<GpuParamsCore> mParamPickingFragParams;
  29. SPtr<GpuParamsCore> mParamPickingAlphaVertParams;
  30. SPtr<GpuParamsCore> mParamPickingAlphaFragParams;
  31. GpuParamMat4Core mParamPickingWVP;
  32. GpuParamMat4Core mParamPickingAlphaWVP;
  33. GpuParamColorCore mParamPickingColor;
  34. GpuParamColorCore mParamPickingAlphaColor;
  35. GpuParamTextureCore mParamPickingAlphaTexture;
  36. };
  37. public:
  38. ScenePicking();
  39. HSceneObject pickClosestObject(const CameraHandlerPtr& cam, const Vector2I& position, const Vector2I& area);
  40. Vector<HSceneObject> pickObjects(const CameraHandlerPtr& cam, const Vector2I& position, const Vector2I& area);
  41. private:
  42. typedef Set<RenderablePickData, std::function<bool(const RenderablePickData&, const RenderablePickData&)>> RenderableSet;
  43. void initializeCore();
  44. Color encodeIndex(UINT32 index);
  45. UINT32 decodeIndex(Color color);
  46. void corePickingBegin(const SPtr<RenderTargetCore>& target, const Rect2& viewportArea, const RenderableSet& renderables,
  47. const Vector2I& position, const Vector2I& area);
  48. void corePickingEnd(const SPtr<RenderTargetCore>& target, const Rect2& viewportArea, const Vector2I& position,
  49. const Vector2I& area, AsyncOp& asyncOp);
  50. static const float ALPHA_CUTOFF;
  51. MaterialData mMaterialData[3];
  52. };
  53. }