Cogs.Core
RayPick.h
1#pragma once
2
3#include "Base.h"
4#include "PickingFlags.h"
5#include "Components/Core/RenderComponent.h" // RenderLayers
6
7#include "Rendering/DataFormat.h"
8
9
10#include <glm/glm.hpp>
11#include <glm/gtx/quaternion.hpp>
12
13#include <cmath>
14#include <limits>
15#include <vector>
16
17namespace Cogs::Core
18{
19
20 class CameraComponent;
21 class Context;
22 class IRayPickable;
23 struct Mesh;
24 struct ClipShapeData;
25 struct RayIntersectionHit;
26
27
29 {
30 public:
32 static constexpr glm::vec2 NoPickTextureCoords = { std::numeric_limits<float>::quiet_NaN(), std::numeric_limits<float>::quiet_NaN() };
33 static constexpr size_t NoPickEntityType = static_cast<size_t>(-1);
34
36 struct COGSCORE_DLL_API RayPickHit {
38 EntityId entity = NoEntity;
39
42 EntityId root = NoEntity;
43
45 glm::vec3 position;
46
49 glm::vec2 textureCoords = NoPickTextureCoords;
50
53 float distance = std::numeric_limits<float>::max();
54
55 RayPickHit() = default;
57 RayPickHit(const ComponentModel::Component& comp, bool returnChildEntity, const glm::vec3& pos, float dist, const glm::vec2& texCoords = NoPickTextureCoords);
58
59 // Needed to std::sort results without custom compare
60 bool operator<(const RayPickHit& rhs) const
61 {
62 return distance < rhs.distance;
63 }
64 };
65
67 struct COGSCORE_DLL_API RayPickFilter
68 {
70 RenderLayers layerMask = RenderLayers::All;
72 size_t entityTypeHash = RayPicking::NoPickEntityType;
74 [[nodiscard]] bool isUnwantedType(const ComponentModel::Component& comp) const;
75 };
76
92 COGSCORE_DLL_API bool pickCamera(Context* context,
93 const CameraComponent& camera,
94 const glm::vec2& cameraPosition,
95 float rayLength,
96 float radius,
97 PickingFlags pickingFlags,
98 PicksReturned returnFlag,
99 const RayPicking::RayPickFilter& filter,
100 std::vector<RayPicking::RayPickHit>& hits);
101
117 COGSCORE_DLL_API bool pickRay(Context* context,
118 const glm::vec3& position,
119 const glm::quat& rotation,
120 float rayLength,
121 float radius,
122 PickingFlags pickingFlags,
123 PicksReturned returnFlag,
124 const RayPicking::RayPickFilter& filter,
125 std::vector<RayPicking::RayPickHit>& hits);
126
128 COGSCORE_DLL_API void addPickable(IRayPickable * pickable);
129
131 COGSCORE_DLL_API void removePickable(IRayPickable * pickable);
132
133 private:
135 std::vector<IRayPickable *> pickables;
136 };
137
140 {
141 public:
143 enum struct Order : int32_t {
144 Default = 0,
145 Last = std::numeric_limits<int32_t>::max()
146 };
147 Order order = Order::Default;
148
149 IRayPickable(Order order = Order::Default) : order(order) {}
150
151 virtual ~IRayPickable() = default;
152
156 COGSCORE_DLL_API virtual bool pickCamera(Context* context,
157 const CameraComponent& camera,
158 const glm::vec2& queryClip,
159 float rayLength,
160 float rayRadius,
161 PickingFlags pickingFlags,
162 PicksReturned returnFlag,
163 const RayPicking::RayPickFilter& filter,
164 std::vector<RayPicking::RayPickHit>& hits) = 0;
168 COGSCORE_DLL_API virtual bool pickRay(Context* /*context*/,
169 const glm::vec3& /*startPos*/,
170 const glm::quat& /*rot*/,
171 float /*rayLength*/,
172 float /*radius*/,
173 PickingFlags /*pickingFlags*/,
174 PicksReturned /*returnFlag*/,
175 const RayPicking::RayPickFilter& /*filter*/,
176 std::vector<RayPicking::RayPickHit>& /*hits*/) { return{}; }
177 };
178
181 {
182 public:
183 bool pickCamera(Context* context,
184 const CameraComponent& camera,
185 const glm::vec2& normPosition,
186 float /*rayLength*/,
187 float radius,
188 PickingFlags pickingFlags,
189 PicksReturned returnFlag,
190 const RayPicking::RayPickFilter& filter,
191 std::vector<RayPicking::RayPickHit>& hits) override;
192
193 bool pickRay(Context* context,
194 const glm::vec3& startPos,
195 const glm::quat& rot,
196 float rayLength,
197 float radius,
198 PickingFlags pickingFlags,
199 PicksReturned returnFlag,
200 const RayPicking::RayPickFilter& filter,
201 std::vector<RayPicking::RayPickHit>& hits) override;
202
203 protected:
205 virtual bool pickImpl(Context* context,
206 const glm::mat4& worldPickMatrix,
207 const glm::mat4& rawViewProjection,
208 const glm::mat4& viewMatrix,
209 const RayPicking::RayPickFilter& filter,
210 PickingFlags pickingFlags,
211 PicksReturned returnFlag,
212 std::vector<RayPicking::RayPickHit>& hits) = 0;
213
214
215 // Helpers for picking meshes
217 const uint8_t* ptr = nullptr;
218 Cogs::DataFormat format = Cogs::DataFormat::Unknown;
219 uint32_t idOffset = 0;
220 uint32_t stride = 0;
221 uint32_t count = 0;
222 bool hasIdOffset = false;
223 };
224 [[nodiscard]] static TextureCoordinateInfo getTextureCoordinateInfo(const Cogs::Core::Mesh& mesh);
225 [[nodiscard]] static bool clippedByClipComp(const ClipShapeData& clipData, const glm::vec4& position);
226 [[nodiscard]] static glm::vec2 getTextureCoords(const TextureCoordinateInfo& textureInfo, const RayIntersectionHit& hit, const PickingFlags pickingFlags);
227 };
228}
Base class for Component instances.
Definition: Component.h:143
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Definition: Context.h:83
Interface for modules implementing custom picking.
Definition: RayPick.h:140
virtual COGSCORE_DLL_API bool pickCamera(Context *context, const CameraComponent &camera, const glm::vec2 &queryClip, float rayLength, float rayRadius, PickingFlags pickingFlags, PicksReturned returnFlag, const RayPicking::RayPickFilter &filter, std::vector< RayPicking::RayPickHit > &hits)=0
Do a ray pick from a normalized screen space position in the camera direction and return all hits.
virtual COGSCORE_DLL_API bool pickRay(Context *, const glm::vec3 &, const glm::quat &, float, float, PickingFlags, PicksReturned, const RayPicking::RayPickFilter &, std::vector< RayPicking::RayPickHit > &)
Do a ray pick from a position and orientation in world space and return all hits.
Definition: RayPick.h:168
Order
Specifies run-order of picking extensions when that is needed.
Definition: RayPick.h:143
Base class for picking meshes.
Definition: RayPick.h:181
bool pickCamera(Context *context, const CameraComponent &camera, const glm::vec2 &normPosition, float, float radius, PickingFlags pickingFlags, PicksReturned returnFlag, const RayPicking::RayPickFilter &filter, std::vector< RayPicking::RayPickHit > &hits) override
Do a ray pick from a normalized screen space position in the camera direction and return all hits.
Definition: RayPick.cpp:195
bool pickRay(Context *context, const glm::vec3 &startPos, const glm::quat &rot, float rayLength, float radius, PickingFlags pickingFlags, PicksReturned returnFlag, const RayPicking::RayPickFilter &filter, std::vector< RayPicking::RayPickHit > &hits) override
Do a ray pick from a position and orientation in world space and return all hits.
Definition: RayPick.cpp:222
virtual bool pickImpl(Context *context, const glm::mat4 &worldPickMatrix, const glm::mat4 &rawViewProjection, const glm::mat4 &viewMatrix, const RayPicking::RayPickFilter &filter, PickingFlags pickingFlags, PicksReturned returnFlag, std::vector< RayPicking::RayPickHit > &hits)=0
Each mesh rendering system should implement this function that goes through all components and calls ...
COGSCORE_DLL_API bool pickRay(Context *context, const glm::vec3 &position, const glm::quat &rotation, float rayLength, float radius, PickingFlags pickingFlags, PicksReturned returnFlag, const RayPicking::RayPickFilter &filter, std::vector< RayPicking::RayPickHit > &hits)
RayPicking using defined ray starting from pos.
Definition: RayPick.cpp:129
COGSCORE_DLL_API void addPickable(IRayPickable *pickable)
Add Component / System for custom picking.
Definition: RayPick.cpp:160
COGSCORE_DLL_API bool pickCamera(Context *context, const CameraComponent &camera, const glm::vec2 &cameraPosition, float rayLength, float radius, PickingFlags pickingFlags, PicksReturned returnFlag, const RayPicking::RayPickFilter &filter, std::vector< RayPicking::RayPickHit > &hits)
RayPicking using ray from camera position along camera viewing direction.
Definition: RayPick.cpp:89
COGSCORE_DLL_API void removePickable(IRayPickable *pickable)
Remove Component / System from custom picking.
Definition: RayPick.cpp:166
std::vector< IRayPickable * > pickables
Storage for registered pick extensions (addPickable)
Definition: RayPick.h:135
static constexpr glm::vec2 NoPickTextureCoords
Marks no match in texture.
Definition: RayPick.h:32
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
PicksReturned
  * Options for returning picking hits.
Definition: PickingFlags.h:40
PickingFlags
Options for COGS picking.
Definition: PickingFlags.h:12
RenderLayers
Contains common render layers.
Meshes contain streams of vertex data in addition to index data and options defining geometry used fo...
Definition: Mesh.h:265
glm::vec3 position
The picked position.
Definition: RayPick.h:45