12 #ifndef hifi_SpatiallyNestable_h
13 #define hifi_SpatiallyNestable_h
17 #include "Transform.h"
19 #include "SpatialParentFinder.h"
20 #include "shared/ReadWriteLockable.h"
23 class SpatiallyNestable;
24 using SpatiallyNestableWeakPointer = std::weak_ptr<SpatiallyNestable>;
25 using SpatiallyNestableWeakConstPointer = std::weak_ptr<const SpatiallyNestable>;
26 using SpatiallyNestablePointer = std::shared_ptr<SpatiallyNestable>;
27 using SpatiallyNestableConstPointer = std::shared_ptr<const SpatiallyNestable>;
29 static const uint16_t INVALID_JOINT_INDEX = -1;
31 enum class NestableType {
36 class SpatiallyNestable :
public std::enable_shared_from_this<SpatiallyNestable> {
38 SpatiallyNestable(NestableType nestableType, QUuid
id);
39 virtual ~SpatiallyNestable();
41 virtual const QUuid getID()
const;
42 virtual void setID(
const QUuid&
id);
44 virtual QString getName()
const {
return "SpatiallyNestable"; }
46 virtual const QUuid getParentID()
const;
47 virtual void setParentID(
const QUuid& parentID);
49 virtual bool isMyAvatar()
const {
return false; }
51 virtual quint16 getParentJointIndex()
const {
return _parentJointIndex; }
52 virtual void setParentJointIndex(quint16 parentJointIndex);
54 static glm::vec3 worldToLocal(
const glm::vec3& position,
const QUuid& parentID,
int parentJointIndex,
55 bool scalesWithParent,
bool& success);
56 static glm::quat worldToLocal(
const glm::quat& orientation,
const QUuid& parentID,
int parentJointIndex,
57 bool scalesWithParent,
bool& success);
58 static glm::vec3 worldToLocalVelocity(
const glm::vec3& velocity,
const QUuid& parentID,
59 int parentJointIndex,
bool scalesWithParent,
bool& success);
60 static glm::vec3 worldToLocalAngularVelocity(
const glm::vec3& angularVelocity,
const QUuid& parentID,
61 int parentJointIndex,
bool scalesWithParent,
bool& success);
62 static glm::vec3 worldToLocalDimensions(
const glm::vec3& dimensions,
const QUuid& parentID,
63 int parentJointIndex,
bool scalesWithParent,
bool& success);
65 static glm::vec3 localToWorld(
const glm::vec3& position,
const QUuid& parentID,
int parentJointIndex,
66 bool scalesWithParent,
bool& success);
67 static glm::quat localToWorld(
const glm::quat& orientation,
const QUuid& parentID,
int parentJointIndex,
68 bool scalesWithParent,
bool& success);
69 static glm::vec3 localToWorldVelocity(
const glm::vec3& velocity,
70 const QUuid& parentID,
int parentJointIndex,
bool scalesWithParent,
bool& success);
71 static glm::vec3 localToWorldAngularVelocity(
const glm::vec3& angularVelocity,
72 const QUuid& parentID,
int parentJointIndex,
73 bool scalesWithParent,
bool& success);
74 static glm::vec3 localToWorldDimensions(
const glm::vec3& dimensions,
const QUuid& parentID,
75 int parentJointIndex,
bool scalesWithParent,
bool& success);
77 static QString nestableTypeToString(NestableType nestableType);
80 virtual bool isParentPathComplete(
int depth = 0)
const;
84 virtual const Transform getTransform(
bool& success,
int depth = 0)
const;
85 virtual const Transform getTransformWithOnlyLocalRotation(
bool& success,
int depth = 0)
const;
86 virtual const Transform getTransform()
const;
87 virtual void setTransform(
const Transform& transform,
bool& success);
88 virtual bool setTransform(
const Transform& transform);
90 virtual Transform getParentTransform(
bool& success,
int depth = 0)
const;
92 void setWorldTransform(
const glm::vec3& position,
const glm::quat& orientation);
93 virtual glm::vec3 getWorldPosition(
bool& success)
const;
94 virtual glm::vec3 getWorldPosition()
const;
95 virtual void setWorldPosition(
const glm::vec3& position,
bool& success,
bool tellPhysics =
true);
96 virtual void setWorldPosition(
const glm::vec3& position);
98 virtual glm::quat getWorldOrientation(
bool& success)
const;
99 virtual glm::quat getWorldOrientation()
const;
100 virtual glm::quat getWorldOrientation(
int jointIndex,
bool& success)
const;
101 virtual void setWorldOrientation(
const glm::quat& orientation,
bool& success,
bool tellPhysics =
true);
102 virtual void setWorldOrientation(
const glm::quat& orientation);
104 virtual glm::vec3 getWorldVelocity(
bool& success)
const;
105 virtual glm::vec3 getWorldVelocity()
const;
106 virtual void setWorldVelocity(
const glm::vec3& velocity,
bool& success);
107 virtual void setWorldVelocity(
const glm::vec3& velocity);
108 virtual glm::vec3 getParentVelocity(
bool& success)
const;
110 virtual glm::vec3 getWorldAngularVelocity(
bool& success)
const;
111 virtual glm::vec3 getWorldAngularVelocity()
const;
112 virtual void setWorldAngularVelocity(
const glm::vec3& angularVelocity,
bool& success);
113 virtual void setWorldAngularVelocity(
const glm::vec3& angularVelocity);
114 virtual glm::vec3 getParentAngularVelocity(
bool& success)
const;
116 virtual AACube getMaximumAACube(
bool& success)
const;
117 virtual AACube calculateInitialQueryAACube(
bool& success);
119 virtual void setQueryAACube(
const AACube& queryAACube);
120 virtual bool queryAACubeNeedsUpdate()
const;
121 virtual bool queryAACubeNeedsUpdateWithDescendantAACube(
const AACube& descendantAACube)
const;
122 virtual bool shouldPuffQueryAACube()
const {
return false; }
123 bool updateQueryAACube(
bool updateParent =
true);
124 bool updateQueryAACubeWithDescendantAACube(
const AACube& descendentAACube,
bool updateParent =
true);
125 void forceQueryAACubeUpdate() { _queryAACubeSet =
false; }
126 virtual AACube getQueryAACube(
bool& success)
const;
127 virtual AACube getQueryAACube()
const;
129 virtual glm::vec3 getSNScale()
const;
130 virtual glm::vec3 getSNScale(
bool& success)
const;
131 virtual void setSNScale(
const glm::vec3& scale);
132 virtual void setSNScale(
const glm::vec3& scale,
bool& success);
135 virtual const Transform getJointTransform(
int jointIndex,
bool& success,
int depth = 0)
const;
136 virtual glm::vec3 getJointWorldPosition(
int jointIndex,
bool& success)
const;
137 virtual glm::vec3 getJointSNScale(
int jointIndex,
bool& success)
const;
140 virtual Transform getLocalTransform()
const;
141 virtual void setLocalTransform(
const Transform& transform);
143 virtual glm::vec3 getLocalPosition()
const;
144 virtual void setLocalPosition(
const glm::vec3& position,
bool tellPhysics =
true);
146 virtual glm::quat getLocalOrientation()
const;
147 virtual void setLocalOrientation(
const glm::quat& orientation);
149 virtual glm::vec3 getLocalVelocity()
const;
150 virtual void setLocalVelocity(
const glm::vec3& velocity);
152 virtual glm::vec3 getLocalAngularVelocity()
const;
153 virtual void setLocalAngularVelocity(
const glm::vec3& angularVelocity);
155 virtual glm::vec3 getLocalSNScale()
const;
156 virtual void setLocalSNScale(
const glm::vec3& scale);
158 virtual bool getScalesWithParent()
const {
return false; }
159 virtual glm::vec3 scaleForChildren()
const {
return glm::vec3(1.0f); }
161 QList<SpatiallyNestablePointer> getChildren()
const;
162 bool hasChildren()
const;
164 NestableType getNestableType()
const {
return _nestableType; }
167 virtual const Transform getAbsoluteJointTransformInObjectFrame(
int jointIndex)
const;
168 virtual glm::vec3 getAbsoluteJointScaleInObjectFrame(
int index)
const {
return glm::vec3(1.0f); }
169 virtual glm::quat getAbsoluteJointRotationInObjectFrame(
int index)
const {
return glm::quat(); }
170 virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(
int index)
const {
return glm::vec3(); }
171 virtual int getJointParent(
int index)
const {
return -1; }
173 virtual bool setAbsoluteJointRotationInObjectFrame(
int index,
const glm::quat& rotation) {
return false; }
174 virtual bool setAbsoluteJointTranslationInObjectFrame(
int index,
const glm::vec3& translation) {
return false; }
176 virtual glm::quat getLocalJointRotation(
int index)
const {
return glm::quat(); }
177 virtual glm::vec3 getLocalJointTranslation(
int index)
const {
return glm::vec3(); }
178 virtual bool setLocalJointRotation(
int index,
const glm::quat& rotation) {
return false; }
179 virtual bool setLocalJointTranslation(
int index,
const glm::vec3& translation) {
return false; }
181 SpatiallyNestablePointer getThisPointer()
const;
183 using ChildLambda = std::function<void(
const SpatiallyNestablePointer&)>;
184 using ChildLambdaTest = std::function<bool(
const SpatiallyNestablePointer&)>;
186 void forEachChild(
const ChildLambda& actor)
const;
187 void forEachDescendant(
const ChildLambda& actor)
const;
188 void forEachChildTest(
const ChildLambdaTest& actor)
const;
189 void forEachDescendantTest(
const ChildLambdaTest& actor)
const;
191 void die() { _isDead =
true; }
192 bool isDead()
const {
return _isDead; }
194 bool isParentIDValid()
const {
bool success =
false; getParentPointer(success);
return success; }
195 virtual SpatialParentTree* getParentTree()
const {
return nullptr; }
197 bool hasAncestorOfType(NestableType nestableType,
int depth = 0)
const;
198 const QUuid findAncestorOfType(NestableType nestableType,
int depth = 0)
const;
199 SpatiallyNestablePointer getParentPointer(
bool& success)
const;
200 static SpatiallyNestablePointer findByID(QUuid
id,
bool& success);
202 void getLocalTransformAndVelocities(Transform& localTransform,
203 glm::vec3& localVelocity,
204 glm::vec3& localAngularVelocity)
const;
206 void setLocalTransformAndVelocities(
207 const Transform& localTransform,
208 const glm::vec3& localVelocity,
209 const glm::vec3& localAngularVelocity);
211 bool scaleChangedSince(quint64 time)
const {
return _scaleChanged > time; }
212 bool tranlationChangedSince(quint64 time)
const {
return _translationChanged > time; }
213 bool rotationChangedSince(quint64 time)
const {
return _rotationChanged > time; }
215 void dump(
const QString& prefix =
"")
const;
217 virtual void locationChanged(
bool tellPhysics =
true,
bool tellChildren =
true);
218 virtual void dimensionsChanged() { _queryAACubeSet =
false; }
219 virtual void parentDeleted() { }
221 virtual void addGrab(GrabPointer grab);
222 virtual void removeGrab(GrabPointer grab);
223 virtual void disableGrab(GrabPointer grab) {};
225 virtual QUuid getEditSenderID();
227 void bumpAncestorChainRenderableVersion(
int depth = 0)
const;
231 mutable SpatiallyNestableWeakPointer _parent;
233 virtual void beParentOfChild(SpatiallyNestablePointer newChild)
const;
234 virtual void forgetChild(SpatiallyNestablePointer newChild)
const;
235 virtual void recalculateChildCauterization()
const { }
237 mutable ReadWriteLockable _childrenLock;
238 mutable QHash<QUuid, SpatiallyNestableWeakPointer> _children;
241 mutable AACube _queryAACube;
242 mutable bool _queryAACubeSet {
false };
244 quint64 _scaleChanged { 0 };
245 quint64 _translationChanged { 0 };
246 quint64 _rotationChanged { 0 };
248 mutable ReadWriteLockable _grabsLock;
249 QSet<GrabPointer> _grabs;
251 mutable std::atomic<uint32_t> _ancestorChainRenderableVersion { 0 };
254 SpatiallyNestable() =
delete;
255 const NestableType _nestableType;
257 quint16 _parentJointIndex { INVALID_JOINT_INDEX };
259 mutable ReadWriteLockable _transformLock;
260 mutable ReadWriteLockable _idLock;
261 mutable ReadWriteLockable _velocityLock;
262 mutable ReadWriteLockable _angularVelocityLock;
263 Transform _transform;
265 glm::vec3 _angularVelocity;
266 mutable bool _parentKnowsMe {
false };
267 bool _isDead {
false };
268 bool _queryAACubeIsPuffed {
false };
270 void breakParentingLoop()
const;