| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- #pragma once
- #include "BsEditorPrerequisites.h"
- #include "BsModule.h"
- #include "BsMatrix4.h"
- #include "BsGpuParam.h"
- namespace BansheeEngine
- {
- class ScenePickingCore;
- /**
- * @brief Handles picking of scene objects with a pointer in scene view.
- */
- class BS_ED_EXPORT ScenePicking : public Module<ScenePicking>
- {
- /**
- * @brief Contains information about a single pickable item (mesh).
- */
- struct RenderablePickData
- {
- SPtr<MeshCore> mesh;
- UINT32 index;
- Matrix4 wvpTransform;
- bool alpha;
- CullingMode cullMode;
- HTexture mainTexture;
- };
- public:
- ScenePicking();
- ~ScenePicking();
- /**
- * @brief Attempts to find a single nearest scene object under the provided position and area.
- *
- * @param cam Camera to perform the picking from.
- * @param position Pointer position relative to the camera viewport, in pixels.
- * @param area Width/height of the checked area in pixels. Use (1, 1) if you want the
- * exact position under the pointer.
- *
- * @return Nearest SceneObject under the provided area, or an empty handle if no object is found.
- */
- HSceneObject pickClosestObject(const CameraPtr& cam, const Vector2I& position, const Vector2I& area);
- /**
- * @brief Attempts to find all scene objects under the provided position and area. This does not mean
- * objects occluded by other objects.
- *
- * @param cam Camera to perform the picking from.
- * @param position Pointer position relative to the camera viewport, in pixels.
- * @param area Width/height of the checked area in pixels. Use (1, 1) if you want the
- * exact position under the pointer.
- *
- * @return A list of SceneObject%s under the provided area.
- */
- Vector<HSceneObject> pickObjects(const CameraPtr& cam, const Vector2I& position, const Vector2I& area);
- private:
- friend class ScenePickingCore;
- typedef Set<RenderablePickData, std::function<bool(const RenderablePickData&, const RenderablePickData&)>> RenderableSet;
- /**
- * @brief Encodes a pickable object identifier to a unique color.
- */
- static Color encodeIndex(UINT32 index);
- /**
- * @brief Decodes a color into a unique object identifier. Color should
- * have initially been encoded with ::encodeIndex.
- */
- static UINT32 decodeIndex(Color color);
- ScenePickingCore* mCore;
- };
- /**
- * @brief Core thread version of the ScenePicking manager. Handles
- * actual rendering.
- */
- class ScenePickingCore
- {
- /**
- * @brief A list of materials and their parameters to be used for rendering
- * of pickable objects.
- */
- struct MaterialData
- {
- SPtr<MaterialCore> mMatPickingCore;
- SPtr<MaterialCore> mMatPickingAlphaCore;
- SPtr<GpuParamsCore> mParamPickingVertParams;
- SPtr<GpuParamsCore> mParamPickingFragParams;
- SPtr<GpuParamsCore> mParamPickingAlphaVertParams;
- SPtr<GpuParamsCore> mParamPickingAlphaFragParams;
- GpuParamMat4Core mParamPickingWVP;
- GpuParamMat4Core mParamPickingAlphaWVP;
- GpuParamColorCore mParamPickingColor;
- GpuParamColorCore mParamPickingAlphaColor;
- GpuParamTextureCore mParamPickingAlphaTexture;
- };
- public:
- /**
- * @brief Initializes the manager. Must be called right after construction.
- */
- void initialize();
- /**
- * @brief Destroys the manager. Must be called right before destruction.
- */
- void destroy();
- /**
- * @brief Sets up the viewport, materials and their parameters as needed for picking. Also renders
- * all the provided renderable objects. Must be followed by ::corePickingEnd. You may call other methods
- * after this one, but you must ensure they render proper unique pickable colors that can be resolved
- * to SceneObject%s later.
- *
- * @param target Render target to render to.
- * @param viewportArea Normalized area of the render target to render in.
- * @param renderables A set of pickable Renderable objects to render.
- * @param position Position of the pointer where to pick objects, in pixels relative to viewport.
- * @param area Width/height of the area to pick objects, in pixels.
- */
- void corePickingBegin(const SPtr<RenderTargetCore>& target, const Rect2& viewportArea, const ScenePicking::RenderableSet& renderables,
- const Vector2I& position, const Vector2I& area);
-
- /**
- * @brief Ends picking operation started by ::corePickingBegin. Render target is resolved and objects in the picked area
- * are returned.
- *
- * @param target Render target we're rendering to.
- * @param viewportArea Normalized area of the render target we're rendering in.
- * @param position Position of the pointer where to pick objects, in pixels relative to viewport.
- * @param area Width/height of the area to pick objects, in pixels.
- * @param asyncOp Async operation handle that when complete will contain the results of the picking
- * operation in the form of Vector<SelectedObject>.
- */
- void corePickingEnd(const SPtr<RenderTargetCore>& target, const Rect2& viewportArea, const Vector2I& position,
- const Vector2I& area, AsyncOp& asyncOp);
- private:
- friend class ScenePicking;
- static const float ALPHA_CUTOFF;
- MaterialData mMaterialData[3];
- };
- }
|