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;
35 inline static const glm::vec2
NoPickTextureCoords = { std::numeric_limits<float>::quiet_NaN(), std::numeric_limits<float>::quiet_NaN() };
36 static constexpr size_t NoPickEntityType =
static_cast<size_t>(-1);
41 uint32_t value = std::numeric_limits<uint32_t>::max();
53 for (
size_t i = 0; i < std::size(ordering); i++) {
54 if ((comp.
layer & ordering[i]) != RenderLayers::None) {
55 return Ordinal {
static_cast<uint32_t
>(i) };
58 return Ordinal { std::numeric_limits<uint32_t>::max() };
61 RenderLayers ordering[4] = { RenderLayers::Overlay, RenderLayers::All };
66 size_t entityTypeHash = RayPicking::NoPickEntityType;
74 EntityId entity = NoEntity;
78 EntityId root = NoEntity;
85 glm::vec2 textureCoords = NoPickTextureCoords;
90 float distance = std::numeric_limits<float>::max();
94 Ordinal ordinal = { std::numeric_limits<uint32_t>::max() };
98 RayPickHit(
const RenderComponent& comp,
bool returnChildEntity,
const glm::vec3& pos,
Ordinal ordinal,
float dist,
const glm::vec2& texCoords = NoPickTextureCoords);
101 bool isInfront(
Ordinal otherOrdinal,
float otherDistance)
const
104 if (ordinal.value == otherOrdinal.value)
return distance < otherDistance;
105 return ordinal.value < otherOrdinal.value;
109 bool isBehind(Ordinal otherOrdinal,
float otherDistance)
const
112 if (otherOrdinal.value == ordinal.value)
return otherDistance < distance;
113 return otherOrdinal.value < ordinal.value;
117 bool operator<(
const RayPickHit& rhs)
const
120 if (ordinal.value == rhs.ordinal.value)
return distance < rhs.distance;
121 return ordinal.value < rhs.ordinal.value;
140 COGSCORE_DLL_API
bool pickCamera(Context* context,
141 const CameraComponent& camera,
142 const glm::vec2& cameraPosition,
147 const RayPicking::RayPickFilter& filter,
148 std::vector<RayPicking::RayPickHit>& hits);
165 COGSCORE_DLL_API
bool pickRay(Context* context,
166 const glm::vec3& position,
167 const glm::quat& rotation,
172 const RayPicking::RayPickFilter& filter,
173 std::vector<RayPicking::RayPickHit>& hits);
176 COGSCORE_DLL_API
void addPickable(IRayPickable * pickable);
193 Last = std::numeric_limits<int32_t>::max()
195 Order order = Order::Default;
199 virtual ~IRayPickable() =
default;
206 const glm::vec2& queryClip,
212 std::vector<RayPicking::RayPickHit>& hits) = 0;
224 std::vector<RayPicking::RayPickHit>& ) {
return{}; }
233 const glm::vec2& normPosition,
239 std::vector<RayPicking::RayPickHit>& hits)
override;
242 const glm::vec3& startPos,
243 const glm::quat& rot,
249 std::vector<RayPicking::RayPickHit>& hits)
override;
254 const glm::mat4& worldPickMatrix,
255 const glm::mat4& rawViewProjection,
256 const glm::mat4& viewMatrix,
260 std::vector<RayPicking::RayPickHit>& hits) = 0;
265 const uint8_t* ptr =
nullptr;
266 Cogs::DataFormat format = Cogs::DataFormat::Unknown;
267 uint32_t idOffset = 0;
270 bool hasIdOffset =
false;
273 [[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 const 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.