12 #ifndef hifi_EntityItem_h
13 #define hifi_EntityItem_h
18 #include <glm/glm.hpp>
20 #include <QtGui/QWindow>
24 #include <OctreeElement.h>
25 #include <OctreePacketData.h>
26 #include <PhysicsCollisionGroups.h>
27 #include <SimulationFlags.h>
28 #include <ShapeInfo.h>
29 #include <Transform.h>
30 #include <SpatiallyNestable.h>
31 #include <Interpolate.h>
33 #include "EntityItemID.h"
34 #include "EntityItemPropertiesDefaults.h"
35 #include "EntityPropertyFlags.h"
36 #include "EntityTypes.h"
37 #include "SimulationOwner.h"
38 #include "EntityDynamicInterface.h"
39 #include "GrabPropertyGroup.h"
41 class EntitySimulation;
42 using EntitySimulationPointer = std::shared_ptr<EntitySimulation>;
43 class EntityTreeElement;
44 class EntityTreeElementExtraEncodeData;
45 class EntityDynamicInterface;
48 class btCollisionShape;
49 typedef std::shared_ptr<EntityTree> EntityTreePointer;
50 typedef std::shared_ptr<EntityDynamicInterface> EntityDynamicPointer;
51 typedef std::shared_ptr<EntityTreeElement> EntityTreeElementPointer;
52 using EntityTreeElementExtraEncodeDataPointer = std::shared_ptr<EntityTreeElementExtraEncodeData>;
53 using SetOfEntities = QSet<EntityItemPointer>;
55 #define DONT_ALLOW_INSTANTIATION virtual void pureVirtualFunctionPlaceHolder() = 0;
56 #define ALLOW_INSTANTIATION virtual void pureVirtualFunctionPlaceHolder() override { };
58 #define debugTime(T, N) qPrintable(QString("%1 [ %2 ago]").arg(T, 16, 10).arg(formatUsecTime(N - T), 15))
59 #define debugTimeOnly(T) qPrintable(QString("%1").arg(T, 16, 10))
60 #define debugTreeVector(V) V << "[" << V << " in meters ]"
62 const uint64_t MAX_OUTGOING_SIMULATION_UPDATE_PERIOD = 9 * USECS_PER_SECOND;
63 const uint64_t MAX_INCOMING_SIMULATION_UPDATE_PERIOD = MAX_OUTGOING_SIMULATION_UPDATE_PERIOD + USECS_PER_SECOND;
82 class EntityItem :
public QObject,
public SpatiallyNestable,
public ReadWriteLockable {
88 friend class EntityTreeElement;
89 friend class EntitySimulation;
92 DONT_ALLOW_INSTANTIATION
97 inline EntityItemPointer getThisPointer()
const {
98 return std::static_pointer_cast<EntityItem>(std::const_pointer_cast<SpatiallyNestable>(shared_from_this()));
104 virtual EntityItemProperties getProperties(
const EntityPropertyFlags& desiredProperties = EntityPropertyFlags(),
bool allowEmptyDesiredProperties =
false)
const;
117 void globalizeProperties(
EntityItemProperties& properties,
const QString& messageTemplate = QString(),
const glm::vec3& offset = glm::vec3(0.0f))
const;
119 void recordCreationTime();
120 quint64 getLastSimulated()
const;
125 void setLastEdited(quint64 lastEdited);
127 {
return (
float)(usecTimestampNow() -
getLastEdited()) / (
float)USECS_PER_SECOND; }
131 void setLastBroadcast(quint64 lastBroadcast) { _lastBroadcast = lastBroadcast; }
133 void markAsChangedOnServer();
134 quint64 getLastChangedOnServer()
const;
136 virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params)
const;
138 virtual OctreeElement::AppendState appendEntityData(
OctreePacketData* packetData, EncodeBitstreamParams& params,
139 EntityTreeElementExtraEncodeDataPointer entityTreeElementExtraEncodeData,
140 const bool destinationNodeCanGetAndSetPrivateUserData =
false)
const;
142 virtual void appendSubclassData(
OctreePacketData* packetData, EncodeBitstreamParams& params,
143 EntityTreeElementExtraEncodeDataPointer entityTreeElementExtraEncodeData,
144 EntityPropertyFlags& requestedProperties,
145 EntityPropertyFlags& propertyFlags,
146 EntityPropertyFlags& propertiesDidntFit,
148 OctreeElement::AppendState& appendState)
const { };
150 static EntityItemID readEntityItemIDFromBuffer(
const unsigned char* data,
int bytesLeftToRead,
151 ReadBitstreamToTreeParams& args);
153 int readEntityDataFromBuffer(
const unsigned char* data,
int bytesLeftToRead, ReadBitstreamToTreeParams& args);
155 virtual int readEntitySubclassDataFromBuffer(
const unsigned char* data,
int bytesLeftToRead,
156 ReadBitstreamToTreeParams& args,
157 EntityPropertyFlags& propertyFlags,
bool overwriteLocalData,
158 bool& somethingChanged)
159 { somethingChanged =
false;
return 0; }
160 static int expectedBytes();
162 static void adjustEditPacketForClockSkew(QByteArray& buffer, qint64 clockSkew);
165 virtual void update(
const quint64& now);
166 quint64 getLastUpdated()
const;
169 void simulate(
const quint64& now);
170 bool stepKinematicMotion(
float timeElapsed);
172 virtual bool needsToCallUpdate()
const {
return false; }
174 virtual void debugDump()
const;
176 virtual bool supportsDetailedIntersection()
const {
return false; }
177 virtual bool findDetailedRayIntersection(
const glm::vec3& origin,
const glm::vec3& direction,
178 const glm::vec3& viewFrustumPos, OctreeElementPointer& element,
float& distance,
179 BoxFace& face, glm::vec3& surfaceNormal,
180 QVariantMap& extraInfo,
bool precisionPicking)
const {
return true; }
181 virtual bool findDetailedParabolaIntersection(
const glm::vec3& origin,
const glm::vec3& velocity,
182 const glm::vec3& acceleration,
const glm::vec3& viewFrustumPos, OctreeElementPointer& element,
183 float& parabolicDistance, BoxFace& face, glm::vec3& surfaceNormal,
184 QVariantMap& extraInfo,
bool precisionPicking)
const {
return true; }
187 EntityTypes::EntityType getType()
const {
return _type; }
189 inline glm::vec3 getCenterPosition(
bool& success)
const {
return getTransformToCenter(success).getTranslation(); }
190 void setCenterPosition(
const glm::vec3& position);
192 const Transform getTransformToCenter(
bool& success)
const;
193 const Transform getTransformToCenterWithOnlyLocalRotation(
bool& success)
const;
195 void requiresRecalcBoxes();
198 QString getHref()
const;
199 void setHref(QString value);
201 QString getDescription()
const;
202 void setDescription(
const QString& value);
206 virtual void setScaledDimensions(
const glm::vec3& value);
208 virtual glm::vec3 getPivot()
const {
return glm::vec3(0.0f); }
210 glm::vec3 getUnscaledDimensions()
const;
211 virtual void setUnscaledDimensions(
const glm::vec3& value);
213 void setDensity(
float density);
214 float computeMass()
const;
215 void setMass(
float mass);
217 float getDensity()
const;
219 bool hasVelocity()
const {
return getWorldVelocity() != ENTITY_ITEM_ZERO_VEC3; }
220 bool hasLocalVelocity()
const {
return getLocalVelocity() != ENTITY_ITEM_ZERO_VEC3; }
222 glm::vec3 getGravity()
const;
224 bool hasGravity()
const {
return getGravity() != ENTITY_ITEM_ZERO_VEC3; }
226 glm::vec3 getAcceleration()
const;
230 float getDamping()
const;
231 void setDamping(
float value);
233 float getRestitution()
const;
234 void setRestitution(
float value);
236 float getFriction()
const;
237 void setFriction(
float value);
240 float getLifetime()
const;
247 bool isImmortal()
const {
return getLifetime() == ENTITY_ITEM_IMMORTAL_LIFETIME; }
250 bool isMortal()
const {
return getLifetime() != ENTITY_ITEM_IMMORTAL_LIFETIME; }
253 float getAge()
const {
return (
float)(usecTimestampNow() -
getCreated()) / (
float)USECS_PER_SECOND; }
254 bool lifetimeHasExpired()
const;
255 quint64 getExpiry()
const;
260 virtual AABox getAABox(
bool& success)
const;
262 using SpatiallyNestable::getQueryAACube;
263 virtual AACube getQueryAACube(
bool& success)
const override;
264 virtual bool shouldPuffQueryAACube()
const override;
266 QString getScript()
const;
267 void setScript(
const QString& value);
269 quint64 getScriptTimestamp()
const;
270 void setScriptTimestamp(
const quint64 value);
272 QString getServerScripts()
const;
273 void setServerScripts(
const QString& serverScripts);
275 QString getCollisionSoundURL()
const;
276 void setCollisionSoundURL(
const QString& value);
278 glm::vec3 getRegistrationPoint()
const;
282 bool hasAngularVelocity()
const {
return getWorldAngularVelocity() != ENTITY_ITEM_ZERO_VEC3; }
283 bool hasLocalAngularVelocity()
const {
return getLocalAngularVelocity() != ENTITY_ITEM_ZERO_VEC3; }
285 virtual void setAngularVelocity(
const glm::vec3& angularVelocity);
287 float getAngularDamping()
const;
288 void setAngularDamping(
float value);
290 virtual QString getName()
const override;
291 void setName(
const QString& value);
292 QString getDebugName();
294 bool getVisible()
const;
295 void setVisible(
bool value);
297 bool isVisibleInSecondaryCamera()
const;
298 void setIsVisibleInSecondaryCamera(
bool value);
300 RenderLayer getRenderLayer()
const;
301 void setRenderLayer(RenderLayer value);
303 PrimitiveMode getPrimitiveMode()
const;
304 void setPrimitiveMode(PrimitiveMode value);
306 bool getIgnorePickIntersection()
const;
307 void setIgnorePickIntersection(
bool value);
309 bool getCanCastShadow()
const;
310 void setCanCastShadow(
bool value);
312 bool getCullWithParent()
const;
313 void setCullWithParent(
bool value);
315 void setCauterized(
bool value);
316 bool getCauterized()
const;
318 inline bool isVisible()
const {
return getVisible(); }
319 inline bool isInvisible()
const {
return !getVisible(); }
321 bool isChildOfMyAvatar()
const;
323 bool getCollisionless()
const;
324 void setCollisionless(
bool value);
326 uint16_t getCollisionMask()
const;
327 void setCollisionMask(uint16_t value);
329 void computeCollisionGroupAndFinalMask(int32_t& group, int32_t& mask)
const;
331 bool getDynamic()
const;
332 void setDynamic(
bool value);
334 virtual bool shouldBePhysical()
const {
return !isDead() &&
getShapeType() != SHAPE_TYPE_NONE && !isLocalEntity(); }
335 bool isVisuallyReady()
const {
return _visuallyReady; }
337 bool getLocked()
const;
338 void setLocked(
bool value);
340 QString getUserData()
const;
341 virtual void setUserData(
const QString& value);
343 QString getPrivateUserData()
const;
344 void setPrivateUserData(
const QString& value);
347 const SimulationOwner& getSimulationOwner()
const {
return _simulationOwner; }
348 void setSimulationOwner(
const QUuid&
id, uint8_t priority);
349 void setSimulationOwner(
const SimulationOwner& owner);
351 uint8_t getSimulationPriority()
const {
return _simulationOwner.getPriority(); }
352 QUuid getSimulatorID()
const {
return _simulationOwner.getID(); }
353 void clearSimulationOwnership();
358 void upgradeScriptSimulationPriority(uint8_t priority);
359 void clearScriptSimulationPriority();
360 uint8_t getScriptSimulationPriority()
const {
return _scriptSimulationPriority; }
361 void setPendingOwnershipPriority(uint8_t priority);
362 uint8_t getPendingOwnershipPriority()
const {
return _pendingOwnershipPriority; }
363 bool pendingRelease(uint64_t timestamp)
const;
364 bool stillWaitingToTakeOwnership(uint64_t timestamp)
const;
366 bool getCloneable()
const;
367 void setCloneable(
bool value);
368 float getCloneLifetime()
const;
369 void setCloneLifetime(
float value);
370 float getCloneLimit()
const;
371 void setCloneLimit(
float value);
372 bool getCloneDynamic()
const;
373 void setCloneDynamic(
bool value);
374 bool getCloneAvatarEntity()
const;
375 void setCloneAvatarEntity(
bool value);
376 const QUuid getCloneOriginID()
const;
377 void setCloneOriginID(
const QUuid& value);
380 float getRadius()
const;
382 virtual void adjustShapeInfoByRegistration(ShapeInfo& info,
bool includePivot =
true)
const;
383 virtual bool contains(
const glm::vec3& point)
const;
385 virtual bool isReadyToComputeShape()
const {
return !isDead(); }
386 virtual void computeShapeInfo(ShapeInfo& info);
387 virtual float getVolumeEstimate()
const;
392 void setPosition(
const glm::vec3& value);
393 virtual void setParentID(
const QUuid& parentID)
override;
394 virtual void setShapeType(ShapeType type) { }
396 void setRotation(glm::quat orientation);
397 void setVelocity(
const glm::vec3& velocity);
399 uint32_t getDirtyFlags()
const;
400 void markDirtyFlags(uint32_t mask);
401 void clearDirtyFlags(uint32_t mask = 0x0000ffff);
403 uint32_t getSpecialFlags()
const;
404 void markSpecialFlags(uint32_t mask);
405 void clearSpecialFlags(uint32_t mask = 0xffff0000);
407 bool isMoving()
const;
408 bool isMovingRelativeToParent()
const;
410 bool isSimulated()
const {
return _simulated; }
412 bool isInPhysicsSimulation()
const {
return (
bool)(_flags & Simulation::SPECIAL_FLAG_IN_PHYSICS_SIMULATION); }
414 void* getPhysicsInfo()
const {
return _physicsInfo; }
415 void setPhysicsInfo(
void* data) { _physicsInfo = data; }
417 EntityTreeElementPointer getElement()
const {
return _element; }
418 EntityTreePointer getTree()
const;
419 virtual SpatialParentTree* getParentTree()
const override;
420 bool wantTerseEditLogging()
const;
422 glm::mat4 getEntityToWorldMatrix()
const;
423 glm::mat4 getWorldToEntityMatrix()
const;
424 glm::vec3 worldToEntity(
const glm::vec3& point)
const;
425 glm::vec3 entityToWorld(
const glm::vec3& point)
const;
427 quint64 getLastEditedFromRemote()
const {
return _lastEditedFromRemote; }
428 void updateLastEditedFromRemote() { _lastEditedFromRemote = usecTimestampNow(); }
432 void flagForMotionStateChange() { _flags |= Simulation::DIRTY_MOTION_TYPE; }
434 QString actionsToDebugString();
435 bool addAction(EntitySimulationPointer simulation, EntityDynamicPointer action);
436 bool updateAction(EntitySimulationPointer simulation,
const QUuid& actionID,
const QVariantMap& arguments);
437 bool removeAction(EntitySimulationPointer simulation,
const QUuid& actionID);
438 bool clearActions(EntitySimulationPointer simulation);
439 void setDynamicData(QByteArray dynamicData);
440 const QByteArray getDynamicData()
const;
441 bool hasActions()
const {
return !_objectActions.empty() || !_grabActions.empty(); }
442 QList<QUuid> getActionIDs()
const {
return _objectActions.keys(); }
443 QVariantMap getActionArguments(
const QUuid& actionID)
const;
444 void deserializeActions();
446 void setDynamicDataDirty(
bool value)
const { _dynamicDataDirty = value; }
447 bool dynamicDataDirty()
const {
return _dynamicDataDirty; }
449 void setDynamicDataNeedsTransmit(
bool value)
const { _dynamicDataNeedsTransmit = value; }
450 bool dynamicDataNeedsTransmit()
const {
return _dynamicDataNeedsTransmit; }
451 void setTransitingWithAvatar(
bool value) { _transitingWithAvatar = value; }
452 bool getTransitingWithAvatar() {
return _transitingWithAvatar; }
454 bool shouldSuppressLocationEdits()
const;
456 void setSourceUUID(
const QUuid& sourceUUID) { _sourceUUID = sourceUUID; }
457 const QUuid& getSourceUUID()
const {
return _sourceUUID; }
458 bool matchesSourceUUID(
const QUuid& sourceUUID)
const {
return _sourceUUID == sourceUUID; }
460 QList<EntityDynamicPointer> getActionsOfType(EntityDynamicType typeToGet)
const;
463 virtual glm::quat getAbsoluteJointRotationInObjectFrame(
int index)
const override {
return glm::quat(); }
464 virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(
int index)
const override {
return glm::vec3(0.0f); }
465 virtual int getJointParent(
int index)
const override {
return -1; }
467 virtual bool setLocalJointRotation(
int index,
const glm::quat& rotation)
override {
return false; }
468 virtual bool setLocalJointTranslation(
int index,
const glm::vec3& translation)
override {
return false; }
470 virtual int getJointIndex(
const QString& name)
const {
return -1; }
471 virtual QStringList getJointNames()
const {
return QStringList(); }
473 virtual void loader() {}
484 void scriptHasPreloaded();
485 void scriptHasUnloaded();
486 void setScriptHasFinishedPreload(
bool value);
487 bool isScriptPreloadFinished();
488 virtual bool isWearable()
const;
489 bool isDomainEntity()
const {
return _hostType == entity::HostType::DOMAIN; }
490 bool isAvatarEntity()
const {
return _hostType == entity::HostType::AVATAR; }
491 bool isMyAvatarEntity()
const;
492 bool isLocalEntity()
const {
return _hostType == entity::HostType::LOCAL; }
493 entity::HostType getEntityHostType()
const {
return _hostType; }
494 virtual void setEntityHostType(entity::HostType hostType) {
_hostType = hostType; }
497 QUuid getOwningAvatarID()
const {
return _owningAvatarID; }
498 QUuid getOwningAvatarIDForProperties()
const;
499 void setOwningAvatarID(
const QUuid& owningAvatarID);
501 virtual bool wantsHandControllerPointerEvents()
const {
return false; }
502 virtual bool wantsKeyboardFocus()
const {
return false; }
503 virtual void setProxyWindow(QWindow* proxyWindow) {}
504 virtual QObject* getEventHandler() {
return nullptr; }
506 QUuid getLastEditedBy()
const {
return _lastEditedBy; }
507 void setLastEditedBy(QUuid value) { _lastEditedBy = value; }
509 virtual bool matchesJSONFilters(
const QJsonObject& jsonFilters)
const;
511 virtual bool getMeshes(MeshProxyList& result) {
return true; }
513 virtual void locationChanged(
bool tellPhysics =
true,
bool tellChildren =
true)
override;
515 virtual bool getScalesWithParent()
const override;
517 using ChangeHandlerCallback = std::function<void(
const EntityItemID&)>;
518 using ChangeHandlerId = QUuid;
519 ChangeHandlerId registerChangeHandler(
const ChangeHandlerCallback& handler);
520 void deregisterChangeHandler(
const ChangeHandlerId& changeHandlerId);
522 void collectChildrenForDelete(std::vector<EntityItemPointer>& entitiesToDelete,
const QUuid& sessionID)
const;
524 float getBoundingRadius()
const {
return _boundingRadius; }
525 void setSpaceIndex(int32_t index);
526 int32_t getSpaceIndex()
const {
return _spaceIndex; }
528 virtual void preDelete();
529 virtual void postParentFixup() {}
531 void setSimulationOwnershipExpiry(uint64_t expiry) { _simulationOwnershipExpiry = expiry; }
532 uint64_t getSimulationOwnershipExpiry()
const {
return _simulationOwnershipExpiry; }
534 void addCloneID(
const QUuid& cloneID);
535 void removeCloneID(
const QUuid& cloneID);
536 const QVector<QUuid> getCloneIDs()
const;
537 void setCloneIDs(
const QVector<QUuid>& cloneIDs);
538 void setVisuallyReady(
bool visuallyReady) { _visuallyReady = visuallyReady; }
540 const GrabPropertyGroup& getGrabProperties()
const {
return _grabProperties; }
542 void prepareForSimulationOwnershipBid(
EntityItemProperties& properties, uint64_t now, uint8_t priority);
544 virtual void addGrab(GrabPointer grab)
override;
545 virtual void removeGrab(GrabPointer grab)
override;
546 virtual void disableGrab(GrabPointer grab)
override;
548 bool stillHasMyGrab()
const;
550 bool needsRenderUpdate()
const {
return _needsRenderUpdate; }
551 void setNeedsRenderUpdate(
bool needsRenderUpdate) { _needsRenderUpdate = needsRenderUpdate; }
553 void setRenderWithZones(
const QVector<QUuid>& renderWithZones);
554 QVector<QUuid> getRenderWithZones()
const;
555 bool needsZoneOcclusionUpdate()
const {
return _needsZoneOcclusionUpdate; }
556 void resetNeedsZoneOcclusionUpdate() { withWriteLock([&] { _needsZoneOcclusionUpdate =
false; }); }
558 void setBillboardMode(BillboardMode value);
559 BillboardMode getBillboardMode()
const;
560 virtual bool getRotateForPicking()
const {
return false; }
563 void spaceUpdate(std::pair<int32_t, glm::vec4> data);
566 QHash<ChangeHandlerId, ChangeHandlerCallback> _changeHandlers;
568 void somethingChangedNotification();
570 void setSimulated(
bool simulated) { _simulated = simulated; }
572 const QByteArray getDynamicDataInternal()
const;
573 bool stillHasGrab()
const;
574 void setDynamicDataInternal(QByteArray dynamicData);
576 virtual void dimensionsChanged()
override;
578 glm::vec3 _unscaledDimensions { ENTITY_ITEM_DEFAULT_DIMENSIONS };
579 EntityTypes::EntityType _type { EntityTypes::Unknown };
580 quint64 _lastSimulated { 0 };
582 quint64 _lastUpdated { 0 };
583 quint64 _lastEdited { 0 };
584 QUuid _lastEditedBy { ENTITY_ITEM_DEFAULT_LAST_EDITED_BY };
585 quint64 _lastBroadcast;
587 quint64 _lastEditedFromRemote { 0 };
588 quint64 _lastEditedFromRemoteInRemoteTime { 0 };
589 quint64 _created { 0 };
590 quint64 _changedOnServer { 0 };
592 mutable AABox _cachedAABox;
593 mutable AACube _maxAACube;
594 mutable AACube _minAACube;
595 mutable bool _recalcAABox {
true };
596 mutable bool _recalcMinAACube {
true };
597 mutable bool _recalcMaxAACube {
true };
599 float _density { ENTITY_ITEM_DEFAULT_DENSITY };
603 float _volumeMultiplier { 1.0f };
604 glm::vec3 _gravity { ENTITY_ITEM_DEFAULT_GRAVITY };
605 glm::vec3 _acceleration { ENTITY_ITEM_DEFAULT_ACCELERATION };
606 float _damping { ENTITY_ITEM_DEFAULT_DAMPING };
607 float _restitution { ENTITY_ITEM_DEFAULT_RESTITUTION };
608 float _friction { ENTITY_ITEM_DEFAULT_FRICTION };
609 float _lifetime { ENTITY_ITEM_DEFAULT_LIFETIME };
611 QString _script { ENTITY_ITEM_DEFAULT_SCRIPT };
616 QString _serverScripts;
624 QString _collisionSoundURL { ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL };
625 glm::vec3 _registrationPoint { ENTITY_ITEM_DEFAULT_REGISTRATION_POINT };
626 float _angularDamping { ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING };
627 bool _visible { ENTITY_ITEM_DEFAULT_VISIBLE };
628 bool _isVisibleInSecondaryCamera { ENTITY_ITEM_DEFAULT_VISIBLE_IN_SECONDARY_CAMERA };
629 RenderLayer _renderLayer { RenderLayer::WORLD };
630 PrimitiveMode _primitiveMode { PrimitiveMode::SOLID };
631 bool _canCastShadow{ ENTITY_ITEM_DEFAULT_CAN_CAST_SHADOW };
632 bool _ignorePickIntersection {
false };
633 bool _collisionless { ENTITY_ITEM_DEFAULT_COLLISIONLESS };
634 uint16_t _collisionMask { ENTITY_COLLISION_MASK_DEFAULT };
635 bool _dynamic { ENTITY_ITEM_DEFAULT_DYNAMIC };
636 bool _locked { ENTITY_ITEM_DEFAULT_LOCKED };
637 QString _userData { ENTITY_ITEM_DEFAULT_USER_DATA };
638 QString _privateUserData{ ENTITY_ITEM_DEFAULT_PRIVATE_USER_DATA };
639 SimulationOwner _simulationOwner;
640 bool _shouldHighlight {
false };
641 QString _name { ENTITY_ITEM_DEFAULT_NAME };
643 QString _description;
657 std::atomic_uint _flags { 0 };
660 EntityTreeElementPointer _element;
661 void* _physicsInfo {
nullptr };
662 bool _simulated {
false };
663 bool _visuallyReady {
true };
665 void enableNoBootstrap();
666 void disableNoBootstrap();
668 bool addActionInternal(EntitySimulationPointer simulation, EntityDynamicPointer action);
669 bool removeActionInternal(
const QUuid& actionID, EntitySimulationPointer simulation =
nullptr);
670 void deserializeActionsInternal();
671 void serializeActions(
bool& success, QByteArray& result)
const;
672 QHash<QUuid, EntityDynamicPointer> _objectActions;
674 static int _maxActionsDataSize;
675 mutable QByteArray _allActionsDataCache;
680 void checkWaitingToRemove(EntitySimulationPointer simulation =
nullptr);
681 mutable QSet<QUuid> _actionsToRemove;
682 mutable bool _dynamicDataDirty {
false };
683 mutable bool _dynamicDataNeedsTransmit {
false };
685 static quint64 _rememberDeletedActionTime;
686 mutable QHash<QUuid, quint64> _previouslyDeletedActions;
690 entity::HostType
_hostType { entity::HostType::DOMAIN };
691 bool _transitingWithAvatar{
false };
692 QUuid _owningAvatarID;
696 glm::vec3 _lastUpdatedPositionValue;
697 glm::quat _lastUpdatedRotationValue;
698 glm::vec3 _lastUpdatedVelocityValue;
699 glm::vec3 _lastUpdatedAngularVelocityValue;
700 glm::vec3 _lastUpdatedAccelerationValue;
701 AACube _lastUpdatedQueryAACubeValue;
703 quint64 _lastUpdatedPositionTimestamp { 0 };
704 quint64 _lastUpdatedRotationTimestamp { 0 };
705 quint64 _lastUpdatedVelocityTimestamp { 0 };
706 quint64 _lastUpdatedAngularVelocityTimestamp { 0 };
707 quint64 _lastUpdatedAccelerationTimestamp { 0 };
708 quint64 _lastUpdatedQueryAACubeTimestamp { 0 };
709 uint64_t _simulationOwnershipExpiry { 0 };
711 float _boundingRadius { 0.0f };
712 int32_t _spaceIndex { -1 };
717 uint64_t _pendingOwnershipTimestamp { 0 };
718 uint8_t _pendingOwnershipPriority { 0 };
719 uint8_t _pendingOwnershipState { 0 };
720 uint8_t _scriptSimulationPriority { 0 };
722 bool _cauterized {
false };
724 bool _cloneable { ENTITY_ITEM_DEFAULT_CLONEABLE };
725 float _cloneLifetime { ENTITY_ITEM_DEFAULT_CLONE_LIFETIME };
726 float _cloneLimit { ENTITY_ITEM_DEFAULT_CLONE_LIMIT };
727 bool _cloneDynamic { ENTITY_ITEM_DEFAULT_CLONE_DYNAMIC };
728 bool _cloneAvatarEntity { ENTITY_ITEM_DEFAULT_CLONE_AVATAR_ENTITY };
729 QUuid _cloneOriginID;
730 QVector<QUuid> _cloneIDs;
732 GrabPropertyGroup _grabProperties;
734 QHash<QUuid, EntityDynamicPointer> _grabActions;
736 QVector<QUuid> _renderWithZones;
737 mutable bool _needsZoneOcclusionUpdate {
false };
739 BillboardMode _billboardMode { BillboardMode::NONE };
741 bool _cullWithParent {
false };
743 mutable bool _needsRenderUpdate {
false };
Definition: EntityItem.h:82
bool hasAcceleration() const
acceleration in meters/second/second
Definition: EntityItem.h:228
bool isMortal() const
is this entity mortal, in that it has a lifetime set, and will automatically be deleted when that lif...
Definition: EntityItem.h:250
quint64 getLastEdited() const
Last edited time of this entity universal usecs.
Definition: EntityItem.cpp:2717
bool isImmortal() const
set the created-time in useconds for the entity
Definition: EntityItem.h:247
virtual AACube getMaximumAACube(bool &success) const override
Definition: EntityItem.cpp:1610
void setLastSimulated(quint64 now)
Last simulated time of this entity universal usecs.
Definition: EntityItem.cpp:2711
void setCreated(quint64 value)
get the created-time in useconds for the entity
Definition: EntityItem.cpp:2096
entity::HostType _hostType
the server node UUID we came from
Definition: EntityItem.h:690
void setAcceleration(const glm::vec3 &value)
get acceleration in meters/second/second
Definition: EntityItem.cpp:2808
quint64 _serverScriptsChangedTimestamp
keep track of time when _serverScripts property was last changed
Definition: EntityItem.h:618
quint64 getCreated() const
set the lifetime in seconds for the entity
Definition: EntityItem.cpp:2847
quint64 _scriptTimestamp
the value of _script when the last preload signal was sent
Definition: EntityItem.h:613
quint64 _loadedScriptTimestamp
the value of _scriptTimestamp when the last preload signal was sent
Definition: EntityItem.h:622
virtual void setRegistrationPoint(const glm::vec3 &value)
registration point as ratio of entity
Definition: EntityItem.cpp:1806
virtual bool setProperties(const EntityItemProperties &properties)
returns true if something changed
Definition: EntityItem.cpp:1468
void setGravity(const glm::vec3 &value)
get gravity in meters
Definition: EntityItem.cpp:1983
QString _loadedScript
the value of the script property
Definition: EntityItem.h:612
AACube getMinimumAACube(bool &success) const
Definition: EntityItem.cpp:1638
virtual glm::vec3 getScaledDimensions() const
Dimensions in meters (0.0 - TREE_SCALE)
Definition: EntityItem.cpp:1910
void setLifetime(float value)
get the lifetime in seconds for the entity
Definition: EntityItem.cpp:2087
virtual ShapeType getShapeType() const
return preferred shape type (actual physical shape may differ)
Definition: EntityItem.h:390
bool _scriptPreloadFinished
the script loaded property used for forced reload
Definition: EntityItem.h:614
quint64 getLastBroadcast() const
Last time we sent out an edit packet for this entity.
Definition: EntityItem.h:130
bool shouldPreloadScript() const
Definition: EntityItem.cpp:3357
bool hasGravity() const
gravity in meters
Definition: EntityItem.h:224
float getAge() const
age of this entity in seconds
Definition: EntityItem.h:253
float getEditedAgo() const
Elapsed seconds since this entity was last edited.
Definition: EntityItem.h:126
Abstract ID for editing model items. Used in EntityItem JS API.
Definition: EntityItemID.h:28
Definition: EntityItemProperties.h:106
Handles packing of the data portion of PacketType_OCTREE_DATA messages.
Definition: OctreePacketData.h:93