4#include "PickingFlags.h"
5#include "Components/Core/RenderComponent.h"
7#include "Rendering/DataFormat.h"
11#include <glm/gtx/quaternion.hpp>
21 class CameraComponent;
26 struct RayIntersectionHit;
33 static constexpr glm::vec2
NoPickTextureCoords = { std::numeric_limits<float>::quiet_NaN(), std::numeric_limits<float>::quiet_NaN() };
34 static constexpr size_t NoPickEntityType =
static_cast<size_t>(-1);
39 uint32_t value = std::numeric_limits<uint32_t>::max();
51 for (
size_t i = 0; i < std::size(ordering); i++) {
52 if ((comp.
layer & ordering[i]) != RenderLayers::None) {
53 return Ordinal {
static_cast<uint32_t
>(i) };
56 return Ordinal { std::numeric_limits<uint32_t>::max() };
59 RenderLayers ordering[4] = { RenderLayers::Overlay, RenderLayers::All };
64 size_t entityTypeHash = RayPicking::NoPickEntityType;
72 EntityId entity = NoEntity;
76 EntityId root = NoEntity;
83 glm::vec2 textureCoords = NoPickTextureCoords;
88 float distance = std::numeric_limits<float>::max();
92 Ordinal ordinal = { std::numeric_limits<uint32_t>::max() };
96 RayPickHit(
const RenderComponent& comp,
bool returnChildEntity,
const glm::vec3& pos,
Ordinal ordinal,
float dist,
const glm::vec2& texCoords = NoPickTextureCoords);
99 bool isInfront(
Ordinal otherOrdinal,
float otherDistance)
const
102 if (ordinal.value == otherOrdinal.value)
return distance < otherDistance;
103 return ordinal.value < otherOrdinal.value;
107 bool isBehind(Ordinal otherOrdinal,
float otherDistance)
const
110 if (otherOrdinal.value == ordinal.value)
return otherDistance < distance;
111 return otherOrdinal.value < ordinal.value;
115 bool operator<(
const RayPickHit& rhs)
const
118 if (ordinal.value == rhs.ordinal.value)
return distance < rhs.distance;
119 return ordinal.value < rhs.ordinal.value;
138 COGSCORE_DLL_API
bool pickCamera(Context* context,
139 const CameraComponent& camera,
140 const glm::vec2& cameraPosition,
145 const RayPicking::RayPickFilter& filter,
146 std::vector<RayPicking::RayPickHit>& hits);
163 COGSCORE_DLL_API
bool pickRay(Context* context,
164 const glm::vec3& position,
165 const glm::quat& rotation,
170 const RayPicking::RayPickFilter& filter,
171 std::vector<RayPicking::RayPickHit>& hits);
174 COGSCORE_DLL_API
void addPickable(IRayPickable * pickable);
191 Last = std::numeric_limits<int32_t>::max()
193 Order order = Order::Default;
197 virtual ~IRayPickable() =
default;
204 const glm::vec2& queryClip,
210 std::vector<RayPicking::RayPickHit>& hits) = 0;
222 std::vector<RayPicking::RayPickHit>& ) {
return{}; }
231 const glm::vec2& normPosition,
237 std::vector<RayPicking::RayPickHit>& hits)
override;
240 const glm::vec3& startPos,
241 const glm::quat& rot,
247 std::vector<RayPicking::RayPickHit>& hits)
override;
252 const glm::mat4& worldPickMatrix,
253 const glm::mat4& rawViewProjection,
254 const glm::mat4& viewMatrix,
258 std::vector<RayPicking::RayPickHit>& hits) = 0;
263 const uint8_t* ptr =
nullptr;
264 Cogs::DataFormat format = Cogs::DataFormat::Unknown;
265 uint32_t idOffset = 0;
268 bool hasIdOffset =
false;
271 [[nodiscard]] COGSCORE_DLL_API
static bool clippedByClipComp(
const ClipShapeData& clipData,
const glm::vec4& position);
Base class for Component instances.
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Interface for modules implementing custom picking.
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.
Order
Specifies run-order of picking extensions when that is needed.
Base class for picking meshes.
COGSCORE_DLL_API 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.
virtual COGSCORE_DLL_API 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 &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.
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.
COGSCORE_DLL_API void addPickable(IRayPickable *pickable)
Add Component / System for custom picking.
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.
COGSCORE_DLL_API void removePickable(IRayPickable *pickable)
Remove Component / System from custom picking.
std::vector< IRayPickable * > pickables
Storage for registered pick extensions (addPickable)
static constexpr glm::vec2 NoPickTextureCoords
Marks no match in texture.
Base component for all rendering content.
RenderLayers layer
Layer mask used to determine visibility for a given camera viewport.
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
PicksReturned
* Options for returning picking hits.
PickingFlags
Options for COGS picking.
RenderLayers
Contains common render layers.
Meshes contain streams of vertex data in addition to index data and options defining geometry used fo...
glm::vec3 position
The picked position.