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 QVariantMap toVariantMap()
const {
174 QVariantMap properties;
176 properties[
"pickType"] = (int)getType();
177 properties[
"enabled"] = isEnabled();
178 properties[
"filter"] = (
unsigned int)getFilter()._flags.to_ulong();
179 properties[
"maxDistance"] = getMaxDistance();
181 if (parentTransform) {
182 auto transformNodeProperties = parentTransform->toVariantMap();
183 for (
auto it = transformNodeProperties.cbegin(); it != transformNodeProperties.cend(); ++it) {
184 properties[it.key()] = it.value();
191 void setScriptParameters(
const QVariantMap& parameters);
192 QVariantMap getScriptParameters()
const;
194 virtual bool isLeftHand()
const {
return _jointState == JOINT_STATE_LEFT_HAND; }
195 virtual bool isRightHand()
const {
return _jointState == JOINT_STATE_RIGHT_HAND; }
196 virtual bool isMouse()
const {
return _jointState == JOINT_STATE_MOUSE; }
198 void setJointState(JointState jointState) { _jointState = jointState; }
200 virtual Transform getResultTransform()
const = 0;
202 std::shared_ptr<TransformNode> parentTransform;
206 const float _maxDistance;
208 PickResultPointer _prevResult;
210 QVector<QUuid> _ignoreItems;
211 QVector<QUuid> _includeItems;
214 QVariantMap _scriptParameters;
216 JointState _jointState { JOINT_STATE_NONE };
218 Q_DECLARE_METATYPE(PickQuery::PickType)
221 class Pick :
public PickQuery {
223 Pick(
const T& mathPick,
const PickFilter& filter,
const float maxDistance,
const bool enabled) : PickQuery(filter, maxDistance, enabled), _mathPick(mathPick) {}
225 virtual T getMathematicalPick()
const = 0;
226 virtual PickResultPointer getDefaultResult(
const QVariantMap& pickVariant)
const = 0;
227 virtual PickResultPointer getEntityIntersection(
const T& pick) = 0;
228 virtual PickResultPointer getAvatarIntersection(
const T& pick) = 0;
229 virtual PickResultPointer getHUDIntersection(
const T& pick) = 0;
231 QVariantMap toVariantMap()
const override {
232 QVariantMap properties = PickQuery::toVariantMap();
234 const QVariantMap mathPickProperties = _mathPick.toVariantMap();
235 for (
auto it = mathPickProperties.cbegin(); it != mathPickProperties.cend(); ++it) {
236 properties[it.key()] = it.value();
248 struct hash<PickQuery::PickType> {
249 size_t operator()(
const PickQuery::PickType& a)
const {