15 #include <QtCore/QUuid>
19 #include <shared/ReadWriteLockable.h>
20 #include <TransformNode.h>
21 #include <PickFilter.h>
39 enum IntersectionType {
50 PickResult(
const QVariantMap& pickVariant) : pickVariant(pickVariant) {}
51 virtual ~PickResult() =
default;
53 virtual QVariantMap toVariantMap()
const {
57 virtual bool doesIntersect()
const = 0;
62 virtual std::shared_ptr<PickResult> compareAndProcessNewResult(
const std::shared_ptr<PickResult>& newRes) = 0;
66 virtual bool checkOrFilterAgainstMaxDistance(
float maxDistance) = 0;
68 QVariantMap pickVariant;
71 using PickResultPointer = std::shared_ptr<PickResult>;
73 class PickQuery :
protected ReadWriteLockable {
76 PickQuery(
const PickFilter& filter,
const float maxDistance,
const bool enabled);
77 virtual ~PickQuery() =
default;
121 INVALID_PICK_TYPE = -1
126 JOINT_STATE_NONE = 0,
127 JOINT_STATE_LEFT_HAND,
128 JOINT_STATE_RIGHT_HAND,
132 void enable(
bool enabled =
true);
133 void disable() { enable(
false); }
135 PickFilter getFilter()
const;
136 float getMaxDistance()
const;
137 bool isEnabled()
const;
138 virtual PickType getType()
const = 0;
140 void setPrecisionPicking(
bool precisionPicking);
142 PickResultPointer getPrevPickResult()
const;
143 void setPickResult(
const PickResultPointer& pickResult);
145 QVector<QUuid> getIgnoreItems()
const;
146 QVector<QUuid> getIncludeItems()
const;
148 template <
typename S>
149 QVector<S> getIgnoreItemsAs()
const {
152 for (
const auto& uid : _ignoreItems) {
153 result.push_back(uid);
159 template <
typename S>
160 QVector<S> getIncludeItemsAs()
const {
163 for (
const auto& uid : _includeItems) {
164 result.push_back(uid);
170 void setIgnoreItems(
const QVector<QUuid>& items);
171 void setIncludeItems(
const QVector<QUuid>& items);
173 virtual void setDelay(
float delay) {}
175 virtual QVariantMap toVariantMap()
const {
176 QVariantMap properties;
178 properties[
"pickType"] = (int)getType();
179 properties[
"enabled"] = isEnabled();
180 properties[
"filter"] = (
unsigned int)getFilter()._flags.to_ulong();
181 properties[
"maxDistance"] = getMaxDistance();
183 if (parentTransform) {
184 auto transformNodeProperties = parentTransform->toVariantMap();
185 for (
auto it = transformNodeProperties.cbegin(); it != transformNodeProperties.cend(); ++it) {
186 properties[it.key()] = it.value();
193 void setScriptParameters(
const QVariantMap& parameters);
194 QVariantMap getScriptParameters()
const;
196 virtual bool isLeftHand()
const {
return _jointState == JOINT_STATE_LEFT_HAND; }
197 virtual bool isRightHand()
const {
return _jointState == JOINT_STATE_RIGHT_HAND; }
198 virtual bool isMouse()
const {
return _jointState == JOINT_STATE_MOUSE; }
200 void setJointState(JointState jointState) { _jointState = jointState; }
202 virtual Transform getResultTransform()
const = 0;
204 std::shared_ptr<TransformNode> parentTransform;
208 const float _maxDistance;
210 PickResultPointer _prevResult;
212 QVector<QUuid> _ignoreItems;
213 QVector<QUuid> _includeItems;
216 QVariantMap _scriptParameters;
218 JointState _jointState { JOINT_STATE_NONE };
220 Q_DECLARE_METATYPE(PickQuery::PickType)
223 class Pick :
public PickQuery {
225 Pick(
const T& mathPick,
const PickFilter& filter,
const float maxDistance,
const bool enabled) : PickQuery(filter, maxDistance, enabled), _mathPick(mathPick) {}
227 virtual T getMathematicalPick()
const = 0;
228 virtual PickResultPointer getDefaultResult(
const QVariantMap& pickVariant)
const = 0;
229 virtual PickResultPointer getEntityIntersection(
const T& pick) = 0;
230 virtual PickResultPointer getAvatarIntersection(
const T& pick) = 0;
231 virtual PickResultPointer getHUDIntersection(
const T& pick) = 0;
233 QVariantMap toVariantMap()
const override {
234 QVariantMap properties = PickQuery::toVariantMap();
236 const QVariantMap mathPickProperties = _mathPick.toVariantMap();
237 for (
auto it = mathPickProperties.cbegin(); it != mathPickProperties.cend(); ++it) {
238 properties[it.key()] = it.value();
250 struct hash<PickQuery::PickType> {
251 size_t operator()(
const PickQuery::PickType& a)
const {