Overte C++ Documentation
CollisionPick.h
1 //
2 // Created by Sabrina Shanman 2018/07/11
3 // Copyright 2018 High Fidelity, Inc.
4 //
5 // Distributed under the Apache License, Version 2.0.
6 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
7 //
8 #ifndef hifi_CollisionPick_h
9 #define hifi_CollisionPick_h
10 
11 #include <QtCore/QSharedPointer>
12 
13 #include <PhysicsEngine.h>
14 #include <model-networking/ModelCache.h>
15 #include <RegisteredMetaTypes.h>
16 #include <TransformNode.h>
17 #include <Pick.h>
18 
19 class CollisionPickResult : public PickResult {
20 public:
21  CollisionPickResult() {}
22  CollisionPickResult(const QVariantMap& pickVariant) : PickResult(pickVariant) {}
23 
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)
29  {
30  }
31 
32  CollisionPickResult(const CollisionPickResult& collisionPickResult) : PickResult(collisionPickResult.pickVariant) {
33  avatarIntersections = collisionPickResult.avatarIntersections;
34  entityIntersections = collisionPickResult.entityIntersections;
35  intersects = collisionPickResult.intersects;
36  }
37 
38  bool intersects { false };
39  std::vector<ContactTestResult> entityIntersections;
40  std::vector<ContactTestResult> avatarIntersections;
41 
42  QVariantMap toVariantMap() const override;
43 
44  bool doesIntersect() const override { return intersects; }
45  bool checkOrFilterAgainstMaxDistance(float maxDistance) override { return true; }
46 
47  PickResultPointer compareAndProcessNewResult(const PickResultPointer& newRes) override;
48 };
49 
50 class CollisionPick : public Pick<CollisionRegion> {
51 public:
52  CollisionPick(const PickFilter& filter, float maxDistance, bool enabled, bool scaleWithParent, CollisionRegion collisionRegion, PhysicsEnginePointer physicsEngine);
53 
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>());
58  }
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;
63 protected:
64  // Returns true if the resource for _mathPick.shapeInfo is loaded or if a resource is not needed.
65  bool isLoaded() const;
66  // Returns true if _mathPick.shapeInfo is valid. Otherwise, attempts to get the _mathPick ready for use.
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;
71 
72  bool _scaleWithParent;
73 
74  PhysicsEnginePointer _physicsEngine;
75  QSharedPointer<GeometryResource> _cachedResource;
76 
77  // Options for what information to get from collision results
78  bool _includeNormals;
79 };
80 
81 #endif // hifi_CollisionPick_h