8 #ifndef hifi_CollisionPick_h
9 #define hifi_CollisionPick_h
11 #include <QtCore/QSharedPointer>
13 #include <PhysicsEngine.h>
14 #include <model-networking/ModelCache.h>
15 #include <RegisteredMetaTypes.h>
16 #include <TransformNode.h>
19 class CollisionPickResult :
public PickResult {
21 CollisionPickResult() {}
22 CollisionPickResult(
const QVariantMap& pickVariant) : PickResult(pickVariant) {}
24 CollisionPickResult(
const CollisionRegion& searchRegion,
const std::vector<ContactTestResult>& entityIntersections,
const std::vector<ContactTestResult>& avatarIntersections) :
25 PickResult(searchRegion.toVariantMap()),
26 intersects(entityIntersections.size() || avatarIntersections.size()),
27 entityIntersections(entityIntersections),
28 avatarIntersections(avatarIntersections)
32 CollisionPickResult(
const CollisionPickResult& collisionPickResult) : PickResult(collisionPickResult.pickVariant) {
33 avatarIntersections = collisionPickResult.avatarIntersections;
34 entityIntersections = collisionPickResult.entityIntersections;
35 intersects = collisionPickResult.intersects;
38 bool intersects {
false };
39 std::vector<ContactTestResult> entityIntersections;
40 std::vector<ContactTestResult> avatarIntersections;
42 QVariantMap toVariantMap()
const override;
44 bool doesIntersect()
const override {
return intersects; }
45 bool checkOrFilterAgainstMaxDistance(
float maxDistance)
override {
return true; }
47 PickResultPointer compareAndProcessNewResult(
const PickResultPointer& newRes)
override;
50 class CollisionPick :
public Pick<CollisionRegion> {
52 CollisionPick(
const PickFilter& filter,
float maxDistance,
bool enabled,
bool scaleWithParent, CollisionRegion collisionRegion, PhysicsEnginePointer physicsEngine);
54 PickType getType()
const override {
return PickType::Collision; }
55 CollisionRegion getMathematicalPick()
const override;
56 PickResultPointer getDefaultResult(
const QVariantMap& pickVariant)
const override {
57 return std::make_shared<CollisionPickResult>(pickVariant, std::vector<ContactTestResult>(), std::vector<ContactTestResult>());
59 PickResultPointer getEntityIntersection(
const CollisionRegion& pick)
override;
60 PickResultPointer getAvatarIntersection(
const CollisionRegion& pick)
override;
61 PickResultPointer getHUDIntersection(
const CollisionRegion& pick)
override;
62 Transform getResultTransform()
const override;
65 bool isLoaded()
const;
67 bool getShapeInfoReady(
const CollisionRegion& pick);
68 void computeShapeInfo(
const CollisionRegion& pick, ShapeInfo& shapeInfo, QSharedPointer<GeometryResource> resource);
69 void computeShapeInfoDimensionsOnly(
const CollisionRegion& pick, ShapeInfo& shapeInfo, QSharedPointer<GeometryResource> resource);
70 void filterIntersections(std::vector<ContactTestResult>& intersections)
const;
72 bool _scaleWithParent;
74 PhysicsEnginePointer _physicsEngine;
75 QSharedPointer<GeometryResource> _cachedResource;