11 #include <RegisteredMetaTypes.h>
16 class RayPickResult :
public PickResult {
19 RayPickResult(
const QVariantMap& pickVariant) : PickResult(pickVariant) {}
20 RayPickResult(
const IntersectionType type,
const QUuid& objectID,
float distance,
const glm::vec3& intersection,
const PickRay& searchRay,
const glm::vec3& surfaceNormal = glm::vec3(NAN),
const QVariantMap& extraInfo = QVariantMap()) :
21 PickResult(searchRay.toVariantMap()), extraInfo(extraInfo), objectID(objectID), intersection(intersection), surfaceNormal(surfaceNormal), type(type), distance(distance), intersects(type != NONE) {
24 RayPickResult(
const RayPickResult& rayPickResult) : PickResult(rayPickResult.pickVariant) {
25 type = rayPickResult.type;
26 intersects = rayPickResult.intersects;
27 objectID = rayPickResult.objectID;
28 distance = rayPickResult.distance;
29 intersection = rayPickResult.intersection;
30 surfaceNormal = rayPickResult.surfaceNormal;
31 extraInfo = rayPickResult.extraInfo;
34 QVariantMap extraInfo;
36 glm::vec3 intersection { NAN };
37 glm::vec3 surfaceNormal { NAN };
38 IntersectionType type { NONE };
39 float distance { FLT_MAX };
40 bool intersects {
false };
57 virtual QVariantMap toVariantMap()
const override {
59 toReturn[
"type"] = type;
60 toReturn[
"intersects"] = intersects;
61 toReturn[
"objectID"] = objectID;
62 toReturn[
"distance"] = distance;
63 toReturn[
"intersection"] = vec3toVariant(intersection);
64 toReturn[
"surfaceNormal"] = vec3toVariant(surfaceNormal);
65 toReturn[
"searchRay"] = PickResult::toVariantMap();
66 toReturn[
"extraInfo"] = extraInfo;
70 bool doesIntersect()
const override {
return intersects; }
71 bool checkOrFilterAgainstMaxDistance(
float maxDistance)
override {
return distance < maxDistance; }
73 PickResultPointer compareAndProcessNewResult(
const PickResultPointer& newRes)
override {
74 auto newRayRes = std::static_pointer_cast<RayPickResult>(newRes);
75 if (newRayRes->distance < distance) {
76 return std::make_shared<RayPickResult>(*newRayRes);
78 return std::make_shared<RayPickResult>(*
this);
84 class RayPick :
public Pick<PickRay> {
87 RayPick(glm::vec3 position, glm::vec3 direction,
const PickFilter& filter,
float maxDistance,
bool enabled) :
88 Pick(PickRay(position, direction), filter, maxDistance, enabled) {
91 PickType getType()
const override {
return PickType::Ray; }
93 PickRay getMathematicalPick()
const override;
95 PickResultPointer getDefaultResult(
const QVariantMap& pickVariant)
const override {
return std::make_shared<RayPickResult>(pickVariant); }
96 PickResultPointer getEntityIntersection(
const PickRay& pick)
override;
97 PickResultPointer getAvatarIntersection(
const PickRay& pick)
override;
98 PickResultPointer getHUDIntersection(
const PickRay& pick)
override;
99 Transform getResultTransform()
const override;
102 static glm::vec3 intersectRayWithEntityXYPlane(
const QUuid& entityID,
const glm::vec3& origin,
const glm::vec3& direction);
103 static glm::vec2 projectOntoEntityXYPlane(
const QUuid& entityID,
const glm::vec3& worldPos,
bool unNormalized =
true);
105 static glm::vec2 projectOntoXYPlane(
const glm::vec3& worldPos,
const glm::vec3& position,
const glm::quat& rotation,
const glm::vec3& dimensions,
const glm::vec3& registrationPoint,
bool unNormalized);
106 static glm::vec2 projectOntoXZPlane(
const glm::vec3& worldPos,
const glm::vec3& position,
const glm::quat& rotation,
const glm::vec3& dimensions,
const glm::vec3& registrationPoint,
bool unNoemalized);
109 static glm::vec3 intersectRayWithXYPlane(
const glm::vec3& origin,
const glm::vec3& direction,
const glm::vec3& point,
const glm::quat& rotation,
const glm::vec3& registration);
Abstract ID for editing model items. Used in EntityItem JS API.
Definition: EntityItemID.h:28