Overte C++ Documentation
EntityItemProperties.h
1 //
2 // EntityItemProperties.h
3 // libraries/entities/src
4 //
5 // Created by Brad Hefta-Gaub on 12/4/13.
6 // Copyright 2013 High Fidelity, Inc.
7 // Copyright 2020 Vircadia contributors.
8 // Copyright 2023 Overte e.V.
9 //
10 // Distributed under the Apache License, Version 2.0.
11 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
12 // SPDX-License-Identifier: Apache-2.0
13 //
14 
15 #ifndef hifi_EntityItemProperties_h
16 #define hifi_EntityItemProperties_h
17 
18 #include <stdint.h>
19 
20 #include <limits>
21 #include <type_traits>
22 
23 #include <glm/glm.hpp>
24 #include <glm/gtx/component_wise.hpp>
25 
26 #include <QtCore/QObject>
27 #include <QVector>
28 #include <QString>
29 #include <QDateTime>
30 
31 #include <AACube.h>
32 #include <NumericalConstants.h>
33 #include <PropertyFlags.h>
34 #include <OctreeConstants.h>
35 #include <ShapeInfo.h>
36 #include <ColorUtils.h>
37 #include "FontFamilies.h"
38 #include <ScriptValue.h>
39 
40 #include <EntityItemID.h>
41 #include "EntityItemPropertiesDefaults.h"
42 #include "EntityItemPropertiesMacros.h"
43 #include "EntityTypes.h"
44 #include "EntityPropertyFlags.h"
45 #include "EntityPseudoPropertyFlags.h"
46 #include "SimulationOwner.h"
47 
48 #include "TextEntityItem.h"
49 #include "WebEntityItem.h"
50 #include "ParticleEffectEntityItem.h"
51 #include "LineEntityItem.h"
52 #include "PolyVoxEntityItem.h"
53 #include "GridEntityItem.h"
54 #include "GizmoEntityItem.h"
55 #include "LightEntityItem.h"
56 #include "ZoneEntityItem.h"
57 
58 #include "AnimationPropertyGroup.h"
59 #include "SkyboxPropertyGroup.h"
60 #include "HazePropertyGroup.h"
61 #include "BloomPropertyGroup.h"
62 #include "PulsePropertyGroup.h"
63 #include "RingGizmoPropertyGroup.h"
64 
65 #include "MaterialMappingMode.h"
66 #include "BillboardMode.h"
67 #include "RenderLayer.h"
68 #include "PrimitiveMode.h"
69 #include "WebInputMode.h"
70 #include "GizmoType.h"
71 #include "TextEffect.h"
72 #include "TextAlignment.h"
73 
74 class ScriptEngine;
75 
76 const quint64 UNKNOWN_CREATED_TIME = 0;
77 
78 using vec3Color = glm::vec3;
79 using u8vec3Color = glm::u8vec3;
80 
81 struct EntityPropertyInfo {
82  EntityPropertyInfo(EntityPropertyList propEnum) :
83  propertyEnums(propEnum) {}
84  EntityPropertyInfo(EntityPropertyList propEnum, QVariant min, QVariant max) :
85  propertyEnums(propEnum), minimum(min), maximum(max) {}
86  EntityPropertyInfo() = default;
87  EntityPropertyFlags propertyEnums;
88  QVariant minimum;
89  QVariant maximum;
90 };
91 
92 template <typename T>
93 EntityPropertyInfo makePropertyInfo(EntityPropertyList p, typename std::enable_if<!std::is_integral<T>::value>::type* = 0) {
94  return EntityPropertyInfo(p);
95 }
96 
97 template <typename T>
98 EntityPropertyInfo makePropertyInfo(EntityPropertyList p, typename std::enable_if<std::is_integral<T>::value>::type* = 0) {
99  return EntityPropertyInfo(p, std::numeric_limits<T>::min(), std::numeric_limits<T>::max());
100 }
101 
107  // TODO: consider removing these friend relationship and use public methods
108  friend class EntityItem;
109  friend class BoxEntityItem;
110  friend class SphereEntityItem;
111  friend class ShapeEntityItem;
112  friend class ModelEntityItem;
113  friend class TextEntityItem;
114  friend class ImageEntityItem;
115  friend class WebEntityItem;
116  friend class ParticleEffectEntityItem;
117  friend class LineEntityItem;
118  friend class PolyLineEntityItem;
119  friend class PolyVoxEntityItem;
120  friend class GridEntityItem;
121  friend class GizmoEntityItem;
122  friend class LightEntityItem;
123  friend class ZoneEntityItem;
124  friend class MaterialEntityItem;
125 public:
126  static bool blobToProperties(ScriptEngine& scriptEngine, const QByteArray& blob, EntityItemProperties& properties);
127  static void propertiesToBlob(ScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties,
128  QByteArray& blob, bool allProperties = false);
129 
130  EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags());
131  EntityItemProperties(const EntityItemProperties&) = default;
132 
133  virtual ~EntityItemProperties() = default;
134 
135  void merge(const EntityItemProperties& other);
136 
137  EntityTypes::EntityType getType() const { return _type; }
138  void setType(EntityTypes::EntityType type) { _type = type; }
139 
140  virtual ScriptValue copyToScriptValue(ScriptEngine* engine, bool skipDefaults, bool allowUnknownCreateTime = false,
141  bool strictSemantics = false, EntityPseudoPropertyFlags pseudoPropertyFlags = EntityPseudoPropertyFlags()) const;
142  virtual void copyFromScriptValue(const ScriptValue& object, bool honorReadOnly);
143  void copyFromJSONString(ScriptEngine& scriptEngine, const QString& jsonString);
144 
145  static ScriptValue entityPropertyFlagsToScriptValue(ScriptEngine* engine, const EntityPropertyFlags& flags);
146  static bool entityPropertyFlagsFromScriptValue(const ScriptValue& object, EntityPropertyFlags& flags);
147 
148  static bool getPropertyInfo(const QString& propertyName, EntityPropertyInfo& propertyInfo);
149 
150  // editing related features supported by all entities
151  quint64 getLastEdited() const { return _lastEdited; }
152  float getEditedAgo() const
153  { return (float)(usecTimestampNow() - getLastEdited()) / (float)USECS_PER_SECOND; }
154 
155  EntityPropertyFlags getChangedProperties() const;
156 
157  bool transformChanged() const;
158  bool getScalesWithParent() const;
159  bool parentRelatedPropertyChanged() const;
160  bool queryAACubeRelatedPropertyChanged() const;
161  bool grabbingRelatedPropertyChanged() const;
162 
163  AABox getAABox() const;
164 
165  void debugDump() const;
166  void setLastEdited(quint64 usecTime);
167  EntityPropertyFlags getDesiredProperties() { return _desiredProperties; }
168  void setDesiredProperties(EntityPropertyFlags properties) { _desiredProperties = properties; }
169 
170  bool constructFromBuffer(const unsigned char* data, int dataLength);
171 
172  // Note: DEFINE_PROPERTY(PROP_FOO, Foo, foo, type, value) creates the following methods and variables:
173  // type getFoo() const;
174  // void setFoo(type);
175  // bool fooChanged() const;
176  // type _foo { value };
177  // bool _fooChanged { false };
178 
179  // Core Properties
180  DEFINE_PROPERTY_REF(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner, SimulationOwner());
181  DEFINE_PROPERTY_REF(PROP_PARENT_ID, ParentID, parentID, QUuid, UNKNOWN_ENTITY_ID);
182  DEFINE_PROPERTY_REF(PROP_PARENT_JOINT_INDEX, ParentJointIndex, parentJointIndex, quint16, -1);
183  DEFINE_PROPERTY(PROP_VISIBLE, Visible, visible, bool, ENTITY_ITEM_DEFAULT_VISIBLE);
184  DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString, ENTITY_ITEM_DEFAULT_NAME);
185  DEFINE_PROPERTY(PROP_LOCKED, Locked, locked, bool, ENTITY_ITEM_DEFAULT_LOCKED);
186  DEFINE_PROPERTY_REF(PROP_USER_DATA, UserData, userData, QString, ENTITY_ITEM_DEFAULT_USER_DATA);
187  DEFINE_PROPERTY_REF(PROP_PRIVATE_USER_DATA, PrivateUserData, privateUserData, QString, ENTITY_ITEM_DEFAULT_PRIVATE_USER_DATA);
188  DEFINE_PROPERTY_REF(PROP_HREF, Href, href, QString, "");
189  DEFINE_PROPERTY_REF(PROP_DESCRIPTION, Description, description, QString, "");
190  DEFINE_PROPERTY_REF_WITH_SETTER(PROP_POSITION, Position, position, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
191  DEFINE_PROPERTY_REF(PROP_DIMENSIONS, Dimensions, dimensions, glm::vec3, ENTITY_ITEM_DEFAULT_DIMENSIONS);
192  DEFINE_PROPERTY_REF(PROP_ROTATION, Rotation, rotation, glm::quat, ENTITY_ITEM_DEFAULT_ROTATION);
193  DEFINE_PROPERTY_REF(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, glm::vec3, ENTITY_ITEM_DEFAULT_REGISTRATION_POINT);
194  DEFINE_PROPERTY(PROP_CREATED, Created, created, quint64, UNKNOWN_CREATED_TIME);
195  DEFINE_PROPERTY_REF(PROP_LAST_EDITED_BY, LastEditedBy, lastEditedBy, QUuid, ENTITY_ITEM_DEFAULT_LAST_EDITED_BY);
196  DEFINE_PROPERTY_REF_ENUM(PROP_ENTITY_HOST_TYPE, EntityHostType, entityHostType, entity::HostType, entity::HostType::DOMAIN);
197  DEFINE_PROPERTY_REF_WITH_SETTER(PROP_OWNING_AVATAR_ID, OwningAvatarID, owningAvatarID, QUuid, UNKNOWN_ENTITY_ID);
198  DEFINE_PROPERTY_REF(PROP_QUERY_AA_CUBE, QueryAACube, queryAACube, AACube, AACube());
199  DEFINE_PROPERTY(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool, ENTITY_ITEM_DEFAULT_CAN_CAST_SHADOW);
200  DEFINE_PROPERTY(PROP_VISIBLE_IN_SECONDARY_CAMERA, IsVisibleInSecondaryCamera, isVisibleInSecondaryCamera, bool, ENTITY_ITEM_DEFAULT_VISIBLE_IN_SECONDARY_CAMERA);
201  DEFINE_PROPERTY_REF_ENUM(PROP_RENDER_LAYER, RenderLayer, renderLayer, RenderLayer, RenderLayer::WORLD);
202  DEFINE_PROPERTY_REF_ENUM(PROP_PRIMITIVE_MODE, PrimitiveMode, primitiveMode, PrimitiveMode, PrimitiveMode::SOLID);
203  DEFINE_PROPERTY(PROP_IGNORE_PICK_INTERSECTION, IgnorePickIntersection, ignorePickIntersection, bool, false);
204  DEFINE_PROPERTY_REF(PROP_RENDER_WITH_ZONES, RenderWithZones, renderWithZones, QVector<QUuid>, QVector<QUuid>());
205  DEFINE_PROPERTY_REF_ENUM(PROP_BILLBOARD_MODE, BillboardMode, billboardMode, BillboardMode, BillboardMode::NONE);
206  DEFINE_PROPERTY_GROUP(Grab, grab, GrabPropertyGroup);
207 
208  // Physics
209  DEFINE_PROPERTY(PROP_DENSITY, Density, density, float, ENTITY_ITEM_DEFAULT_DENSITY);
210  DEFINE_PROPERTY_REF(PROP_VELOCITY, Velocity, velocity, glm::vec3, ENTITY_ITEM_DEFAULT_VELOCITY);
211  DEFINE_PROPERTY_REF(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, glm::vec3, ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY);
212  DEFINE_PROPERTY_REF(PROP_GRAVITY, Gravity, gravity, glm::vec3, ENTITY_ITEM_DEFAULT_GRAVITY);
213  DEFINE_PROPERTY_REF(PROP_ACCELERATION, Acceleration, acceleration, glm::vec3, ENTITY_ITEM_DEFAULT_ACCELERATION);
214  DEFINE_PROPERTY(PROP_DAMPING, Damping, damping, float, ENTITY_ITEM_DEFAULT_DAMPING);
215  DEFINE_PROPERTY(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float, ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING);
216  DEFINE_PROPERTY(PROP_RESTITUTION, Restitution, restitution, float, ENTITY_ITEM_DEFAULT_RESTITUTION);
217  DEFINE_PROPERTY(PROP_FRICTION, Friction, friction, float, ENTITY_ITEM_DEFAULT_FRICTION);
218  DEFINE_PROPERTY(PROP_LIFETIME, Lifetime, lifetime, float, ENTITY_ITEM_DEFAULT_LIFETIME);
219  DEFINE_PROPERTY(PROP_COLLISIONLESS, Collisionless, collisionless, bool, ENTITY_ITEM_DEFAULT_COLLISIONLESS);
220  DEFINE_PROPERTY(PROP_COLLISION_MASK, CollisionMask, collisionMask, uint16_t, ENTITY_COLLISION_MASK_DEFAULT);
221  DEFINE_PROPERTY(PROP_DYNAMIC, Dynamic, dynamic, bool, ENTITY_ITEM_DEFAULT_DYNAMIC);
222  DEFINE_PROPERTY_REF(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString, ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL);
223  DEFINE_PROPERTY_REF(PROP_ACTION_DATA, ActionData, actionData, QByteArray, QByteArray());
224 
225  // Cloning
226  DEFINE_PROPERTY(PROP_CLONEABLE, Cloneable, cloneable, bool, ENTITY_ITEM_DEFAULT_CLONEABLE);
227  DEFINE_PROPERTY(PROP_CLONE_LIFETIME, CloneLifetime, cloneLifetime, float, ENTITY_ITEM_DEFAULT_CLONE_LIFETIME);
228  DEFINE_PROPERTY(PROP_CLONE_LIMIT, CloneLimit, cloneLimit, float, ENTITY_ITEM_DEFAULT_CLONE_LIMIT);
229  DEFINE_PROPERTY(PROP_CLONE_DYNAMIC, CloneDynamic, cloneDynamic, bool, ENTITY_ITEM_DEFAULT_CLONE_DYNAMIC);
230  DEFINE_PROPERTY(PROP_CLONE_AVATAR_ENTITY, CloneAvatarEntity, cloneAvatarEntity, bool, ENTITY_ITEM_DEFAULT_CLONE_AVATAR_ENTITY);
231  DEFINE_PROPERTY_REF(PROP_CLONE_ORIGIN_ID, CloneOriginID, cloneOriginID, QUuid, ENTITY_ITEM_DEFAULT_CLONE_ORIGIN_ID);
232 
233  // Scripts
234  DEFINE_PROPERTY_REF(PROP_SCRIPT, Script, script, QString, ENTITY_ITEM_DEFAULT_SCRIPT);
235  DEFINE_PROPERTY(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64, ENTITY_ITEM_DEFAULT_SCRIPT_TIMESTAMP);
236  DEFINE_PROPERTY_REF(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString, ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS);
237 
238  // these are used when bouncing location data into and out of scripts
239  DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
240  DEFINE_PROPERTY_REF(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat, ENTITY_ITEM_DEFAULT_ROTATION);
241  DEFINE_PROPERTY_REF(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
242  DEFINE_PROPERTY_REF(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
243  DEFINE_PROPERTY_REF(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, glm::vec3, ENTITY_ITEM_ZERO_VEC3);
244 
245  // Common
246  DEFINE_PROPERTY_REF_ENUM(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType, SHAPE_TYPE_NONE);
247  DEFINE_PROPERTY_REF(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString, "");
248  DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, u8vec3Color, ENTITY_ITEM_DEFAULT_COLOR);
249  DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float, ENTITY_ITEM_DEFAULT_ALPHA);
250  DEFINE_PROPERTY_GROUP(Pulse, pulse, PulsePropertyGroup);
251  DEFINE_PROPERTY_REF(PROP_TEXTURES, Textures, textures, QString, "");
252 
253  // Particles
254  DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32, particle::DEFAULT_MAX_PARTICLES);
255  DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float, particle::DEFAULT_LIFESPAN);
256  DEFINE_PROPERTY(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool, true);
257  DEFINE_PROPERTY(PROP_EMIT_RATE, EmitRate, emitRate, float, particle::DEFAULT_EMIT_RATE);
258  DEFINE_PROPERTY(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, float, particle::DEFAULT_EMIT_SPEED);
259  DEFINE_PROPERTY(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, float, particle::DEFAULT_SPEED_SPREAD);
260  DEFINE_PROPERTY_REF(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, glm::quat, particle::DEFAULT_EMIT_ORIENTATION);
261  DEFINE_PROPERTY_REF(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, glm::vec3, particle::DEFAULT_EMIT_DIMENSIONS);
262  DEFINE_PROPERTY(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float, particle::DEFAULT_EMIT_RADIUS_START);
263  DEFINE_PROPERTY(PROP_POLAR_START, PolarStart, polarStart, float, particle::DEFAULT_POLAR_START);
264  DEFINE_PROPERTY(PROP_POLAR_FINISH, PolarFinish, polarFinish, float, particle::DEFAULT_POLAR_FINISH);
265  DEFINE_PROPERTY(PROP_AZIMUTH_START, AzimuthStart, azimuthStart, float, particle::DEFAULT_AZIMUTH_START);
266  DEFINE_PROPERTY(PROP_AZIMUTH_FINISH, AzimuthFinish, azimuthFinish, float, particle::DEFAULT_AZIMUTH_FINISH);
267  DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3, particle::DEFAULT_EMIT_ACCELERATION);
268  DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3, particle::DEFAULT_ACCELERATION_SPREAD);
269  DEFINE_PROPERTY(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float, particle::DEFAULT_PARTICLE_RADIUS);
270  DEFINE_PROPERTY(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float, particle::DEFAULT_RADIUS_SPREAD);
271  DEFINE_PROPERTY(PROP_RADIUS_START, RadiusStart, radiusStart, float, particle::DEFAULT_RADIUS_START);
272  DEFINE_PROPERTY(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float, particle::DEFAULT_RADIUS_FINISH);
273  DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3Color, particle::DEFAULT_COLOR_SPREAD);
274  DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, glm::vec3, particle::DEFAULT_COLOR_UNINITIALIZED);
275  DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, glm::vec3, particle::DEFAULT_COLOR_UNINITIALIZED);
276  DEFINE_PROPERTY(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float, particle::DEFAULT_ALPHA_SPREAD);
277  DEFINE_PROPERTY(PROP_ALPHA_START, AlphaStart, alphaStart, float, particle::DEFAULT_ALPHA_START);
278  DEFINE_PROPERTY(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float, particle::DEFAULT_ALPHA_FINISH);
279  DEFINE_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool, particle::DEFAULT_EMITTER_SHOULD_TRAIL);
280  DEFINE_PROPERTY(PROP_PARTICLE_SPIN, ParticleSpin, particleSpin, float, particle::DEFAULT_PARTICLE_SPIN);
281  DEFINE_PROPERTY(PROP_SPIN_SPREAD, SpinSpread, spinSpread, float, particle::DEFAULT_SPIN_SPREAD);
282  DEFINE_PROPERTY(PROP_SPIN_START, SpinStart, spinStart, float, particle::DEFAULT_SPIN_START);
283  DEFINE_PROPERTY(PROP_SPIN_FINISH, SpinFinish, spinFinish, float, particle::DEFAULT_SPIN_FINISH);
284  DEFINE_PROPERTY(PROP_PARTICLE_ROTATE_WITH_ENTITY, RotateWithEntity, rotateWithEntity, bool, particle::DEFAULT_ROTATE_WITH_ENTITY);
285 
286  // Model
287  DEFINE_PROPERTY_REF(PROP_MODEL_URL, ModelURL, modelURL, QString, "");
288  DEFINE_PROPERTY_REF(PROP_MODEL_SCALE, ModelScale, modelScale, glm::vec3, glm::vec3(1.0f));
289  DEFINE_PROPERTY_REF(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector<bool>, QVector<bool>());
290  DEFINE_PROPERTY_REF(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector<glm::quat>, QVector<glm::quat>());
291  DEFINE_PROPERTY_REF(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector<bool>, QVector<bool>());
292  DEFINE_PROPERTY_REF(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector<glm::vec3>, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC);
293  DEFINE_PROPERTY(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool, ENTITY_ITEM_DEFAULT_RELAY_PARENT_JOINTS);
294  DEFINE_PROPERTY_REF(PROP_GROUP_CULLED, GroupCulled, groupCulled, bool, false);
295  DEFINE_PROPERTY_REF(PROP_BLENDSHAPE_COEFFICIENTS, BlendshapeCoefficients, blendshapeCoefficients, QString, "");
296  DEFINE_PROPERTY_REF(PROP_USE_ORIGINAL_PIVOT, UseOriginalPivot, useOriginalPivot, bool, false);
297  DEFINE_PROPERTY_GROUP(Animation, animation, AnimationPropertyGroup);
298 
299  // Light
300  DEFINE_PROPERTY(PROP_IS_SPOTLIGHT, IsSpotlight, isSpotlight, bool, LightEntityItem::DEFAULT_IS_SPOTLIGHT);
301  DEFINE_PROPERTY(PROP_INTENSITY, Intensity, intensity, float, LightEntityItem::DEFAULT_INTENSITY);
302  DEFINE_PROPERTY(PROP_EXPONENT, Exponent, exponent, float, LightEntityItem::DEFAULT_EXPONENT);
303  DEFINE_PROPERTY(PROP_CUTOFF, Cutoff, cutoff, float, LightEntityItem::DEFAULT_CUTOFF);
304  DEFINE_PROPERTY(PROP_FALLOFF_RADIUS, FalloffRadius, falloffRadius, float, LightEntityItem::DEFAULT_FALLOFF_RADIUS);
305 
306  // Text
307  DEFINE_PROPERTY_REF(PROP_TEXT, Text, text, QString, TextEntityItem::DEFAULT_TEXT);
308  DEFINE_PROPERTY(PROP_LINE_HEIGHT, LineHeight, lineHeight, float, TextEntityItem::DEFAULT_LINE_HEIGHT);
309  DEFINE_PROPERTY_REF(PROP_TEXT_COLOR, TextColor, textColor, u8vec3Color, TextEntityItem::DEFAULT_TEXT_COLOR);
310  DEFINE_PROPERTY_REF(PROP_TEXT_ALPHA, TextAlpha, textAlpha, float, TextEntityItem::DEFAULT_TEXT_ALPHA);
311  DEFINE_PROPERTY_REF(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, u8vec3Color, TextEntityItem::DEFAULT_BACKGROUND_COLOR);
312  DEFINE_PROPERTY_REF(PROP_BACKGROUND_ALPHA, BackgroundAlpha, backgroundAlpha, float, TextEntityItem::DEFAULT_TEXT_ALPHA);
313  DEFINE_PROPERTY_REF(PROP_LEFT_MARGIN, LeftMargin, leftMargin, float, TextEntityItem::DEFAULT_MARGIN);
314  DEFINE_PROPERTY_REF(PROP_RIGHT_MARGIN, RightMargin, rightMargin, float, TextEntityItem::DEFAULT_MARGIN);
315  DEFINE_PROPERTY_REF(PROP_TOP_MARGIN, TopMargin, topMargin, float, TextEntityItem::DEFAULT_MARGIN);
316  DEFINE_PROPERTY_REF(PROP_BOTTOM_MARGIN, BottomMargin, bottomMargin, float, TextEntityItem::DEFAULT_MARGIN);
317  DEFINE_PROPERTY_REF(PROP_UNLIT, Unlit, unlit, bool, false);
318  DEFINE_PROPERTY_REF(PROP_FONT, Font, font, QString, ROBOTO_FONT_FAMILY);
319  DEFINE_PROPERTY_REF_ENUM(PROP_TEXT_EFFECT, TextEffect, textEffect, TextEffect, TextEffect::NO_EFFECT);
320  DEFINE_PROPERTY_REF(PROP_TEXT_EFFECT_COLOR, TextEffectColor, textEffectColor, u8vec3Color, TextEntityItem::DEFAULT_TEXT_COLOR);
321  DEFINE_PROPERTY(PROP_TEXT_EFFECT_THICKNESS, TextEffectThickness, textEffectThickness, float, TextEntityItem::DEFAULT_TEXT_EFFECT_THICKNESS);
322  DEFINE_PROPERTY_REF_ENUM(PROP_TEXT_ALIGNMENT, Alignment, alignment, TextAlignment, TextAlignment::LEFT);
323 
324  // Zone
325  DEFINE_PROPERTY_GROUP(KeyLight, keyLight, KeyLightPropertyGroup);
326  DEFINE_PROPERTY_GROUP(AmbientLight, ambientLight, AmbientLightPropertyGroup);
327  DEFINE_PROPERTY_GROUP(Skybox, skybox, SkyboxPropertyGroup);
328  DEFINE_PROPERTY_GROUP(Haze, haze, HazePropertyGroup);
329  DEFINE_PROPERTY_GROUP(Bloom, bloom, BloomPropertyGroup);
330  DEFINE_PROPERTY(PROP_FLYING_ALLOWED, FlyingAllowed, flyingAllowed, bool, ZoneEntityItem::DEFAULT_FLYING_ALLOWED);
331  DEFINE_PROPERTY(PROP_GHOSTING_ALLOWED, GhostingAllowed, ghostingAllowed, bool, ZoneEntityItem::DEFAULT_GHOSTING_ALLOWED);
332  DEFINE_PROPERTY(PROP_FILTER_URL, FilterURL, filterURL, QString, ZoneEntityItem::DEFAULT_FILTER_URL);
333  DEFINE_PROPERTY_REF_ENUM(PROP_KEY_LIGHT_MODE, KeyLightMode, keyLightMode, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT);
334  DEFINE_PROPERTY_REF_ENUM(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT);
335  DEFINE_PROPERTY_REF_ENUM(PROP_AMBIENT_LIGHT_MODE, AmbientLightMode, ambientLightMode, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT);
336  DEFINE_PROPERTY_REF_ENUM(PROP_HAZE_MODE, HazeMode, hazeMode, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT);
337  DEFINE_PROPERTY_REF_ENUM(PROP_BLOOM_MODE, BloomMode, bloomMode, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT);
338  DEFINE_PROPERTY_REF_ENUM(PROP_AVATAR_PRIORITY, AvatarPriority, avatarPriority, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT);
339  DEFINE_PROPERTY_REF_ENUM(PROP_SCREENSHARE, Screenshare, screenshare, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT);
340 
341  // Polyvox
342  DEFINE_PROPERTY_REF(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, glm::vec3, PolyVoxEntityItem::DEFAULT_VOXEL_VOLUME_SIZE);
343  DEFINE_PROPERTY_REF(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray, PolyVoxEntityItem::DEFAULT_VOXEL_DATA);
344  DEFINE_PROPERTY_REF(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t, PolyVoxEntityItem::DEFAULT_VOXEL_SURFACE_STYLE);
345  DEFINE_PROPERTY_REF(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString, "");
346  DEFINE_PROPERTY_REF(PROP_Y_TEXTURE_URL, YTextureURL, yTextureURL, QString, "");
347  DEFINE_PROPERTY_REF(PROP_Z_TEXTURE_URL, ZTextureURL, zTextureURL, QString, "");
348  DEFINE_PROPERTY_REF(PROP_X_N_NEIGHBOR_ID, XNNeighborID, xNNeighborID, EntityItemID, UNKNOWN_ENTITY_ID);
349  DEFINE_PROPERTY_REF(PROP_Y_N_NEIGHBOR_ID, YNNeighborID, yNNeighborID, EntityItemID, UNKNOWN_ENTITY_ID);
350  DEFINE_PROPERTY_REF(PROP_Z_N_NEIGHBOR_ID, ZNNeighborID, zNNeighborID, EntityItemID, UNKNOWN_ENTITY_ID);
351  DEFINE_PROPERTY_REF(PROP_X_P_NEIGHBOR_ID, XPNeighborID, xPNeighborID, EntityItemID, UNKNOWN_ENTITY_ID);
352  DEFINE_PROPERTY_REF(PROP_Y_P_NEIGHBOR_ID, YPNeighborID, yPNeighborID, EntityItemID, UNKNOWN_ENTITY_ID);
353  DEFINE_PROPERTY_REF(PROP_Z_P_NEIGHBOR_ID, ZPNeighborID, zPNeighborID, EntityItemID, UNKNOWN_ENTITY_ID);
354 
355  // Web
356  DEFINE_PROPERTY_REF(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString, WebEntityItem::DEFAULT_SOURCE_URL);
357  DEFINE_PROPERTY_REF(PROP_DPI, DPI, dpi, uint16_t, ENTITY_ITEM_DEFAULT_DPI);
358  DEFINE_PROPERTY_REF(PROP_SCRIPT_URL, ScriptURL, scriptURL, QString, "");
359  DEFINE_PROPERTY_REF(PROP_MAX_FPS, MaxFPS, maxFPS, uint8_t, WebEntityItem::DEFAULT_MAX_FPS);
360  DEFINE_PROPERTY_REF_ENUM(PROP_INPUT_MODE, InputMode, inputMode, WebInputMode, WebInputMode::TOUCH);
361  DEFINE_PROPERTY_REF(PROP_SHOW_KEYBOARD_FOCUS_HIGHLIGHT, ShowKeyboardFocusHighlight, showKeyboardFocusHighlight, bool, true);
362  DEFINE_PROPERTY_REF(PROP_WEB_USE_BACKGROUND, UseBackground, useBackground, bool, true);
363  DEFINE_PROPERTY_REF(PROP_USER_AGENT, UserAgent, userAgent, QString, WebEntityItem::DEFAULT_USER_AGENT);
364 
365  // Polyline
366  DEFINE_PROPERTY_REF(PROP_LINE_POINTS, LinePoints, linePoints, QVector<glm::vec3>, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC);
367  DEFINE_PROPERTY(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector<float>, QVector<float>());
368  DEFINE_PROPERTY(PROP_STROKE_NORMALS, Normals, normals, QVector<glm::vec3>, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC);
369  DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector<glm::vec3>, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC);
370  DEFINE_PROPERTY(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, bool, true);
371  DEFINE_PROPERTY(PROP_LINE_GLOW, Glow, glow, bool, false);
372  DEFINE_PROPERTY(PROP_LINE_FACE_CAMERA, FaceCamera, faceCamera, bool, false);
373 
374  // Shape
375  DEFINE_PROPERTY_REF(PROP_SHAPE, Shape, shape, QString, "Sphere");
376 
377  // Material
378  DEFINE_PROPERTY_REF(PROP_MATERIAL_URL, MaterialURL, materialURL, QString, "");
379  DEFINE_PROPERTY_REF_ENUM(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, materialMappingMode, MaterialMappingMode, UV);
380  DEFINE_PROPERTY_REF(PROP_MATERIAL_PRIORITY, Priority, priority, quint16, 0);
381  DEFINE_PROPERTY_REF(PROP_PARENT_MATERIAL_NAME, ParentMaterialName, parentMaterialName, QString, "0");
382  DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_POS, MaterialMappingPos, materialMappingPos, glm::vec2, glm::vec2(0.0f));
383  DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_SCALE, MaterialMappingScale, materialMappingScale, glm::vec2, glm::vec2(1.0f));
384  DEFINE_PROPERTY_REF(PROP_MATERIAL_MAPPING_ROT, MaterialMappingRot, materialMappingRot, float, 0);
385  DEFINE_PROPERTY_REF(PROP_MATERIAL_DATA, MaterialData, materialData, QString, "");
386  DEFINE_PROPERTY_REF(PROP_MATERIAL_REPEAT, MaterialRepeat, materialRepeat, bool, true);
387 
388  // Image
389  DEFINE_PROPERTY_REF(PROP_IMAGE_URL, ImageURL, imageURL, QString, "");
390  DEFINE_PROPERTY_REF(PROP_EMISSIVE, Emissive, emissive, bool, false);
391  DEFINE_PROPERTY_REF(PROP_KEEP_ASPECT_RATIO, KeepAspectRatio, keepAspectRatio, bool, true);
392  DEFINE_PROPERTY_REF(PROP_SUB_IMAGE, SubImage, subImage, QRect, QRect());
393 
394  // Grid
395  DEFINE_PROPERTY_REF(PROP_GRID_FOLLOW_CAMERA, FollowCamera, followCamera, bool, true);
396  DEFINE_PROPERTY(PROP_MAJOR_GRID_EVERY, MajorGridEvery, majorGridEvery, uint32_t, GridEntityItem::DEFAULT_MAJOR_GRID_EVERY);
397  DEFINE_PROPERTY(PROP_MINOR_GRID_EVERY, MinorGridEvery, minorGridEvery, float, GridEntityItem::DEFAULT_MINOR_GRID_EVERY);
398 
399  // Gizmo
400  DEFINE_PROPERTY_REF_ENUM(PROP_GIZMO_TYPE, GizmoType, gizmoType, GizmoType, GizmoType::RING);
401  DEFINE_PROPERTY_GROUP(Ring, ring, RingGizmoPropertyGroup);
402 
403  static QString getComponentModeAsString(uint32_t mode);
404 
405 public:
406  float getMaxDimension() const { return glm::compMax(_dimensions); }
407 
408  float getAge() const { return (float)(usecTimestampNow() - _created) / (float)USECS_PER_SECOND; }
409  bool hasCreatedTime() const { return (_created != UNKNOWN_CREATED_TIME); }
410 
411  bool containsBoundsProperties() const { return (_positionChanged || _dimensionsChanged); }
412  bool containsPositionChange() const { return _positionChanged; }
413  bool containsDimensionsChange() const { return _dimensionsChanged; }
414 
415  static OctreeElement::AppendState encodeEntityEditPacket(PacketType command, EntityItemID id, const EntityItemProperties& properties,
416  QByteArray& buffer, EntityPropertyFlags requestedProperties, EntityPropertyFlags& didntFitProperties);
417 
418  static bool encodeEraseEntityMessage(const EntityItemID& entityItemID, QByteArray& buffer);
419  static bool encodeCloneEntityMessage(const EntityItemID& entityIDToClone, const EntityItemID& newEntityID, QByteArray& buffer);
420  static bool decodeCloneEntityMessage(const QByteArray& buffer, int& processedBytes, EntityItemID& entityIDToClone, EntityItemID& newEntityID);
421 
422  static bool decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes,
423  EntityItemID& entityID, EntityItemProperties& properties);
424 
425  void clearID() { _id = UNKNOWN_ENTITY_ID; _idSet = false; }
426  void markAllChanged();
427 
428  const glm::vec3& getNaturalDimensions() const { return _naturalDimensions; }
429  void setNaturalDimensions(const glm::vec3& value) { _naturalDimensions = value; }
430 
431  const glm::vec3& getNaturalPosition() const { return _naturalPosition; }
432  void calculateNaturalPosition(const glm::vec3& min, const glm::vec3& max);
433 
434  const QVariantMap& getTextureNames() const { return _textureNames; }
435  void setTextureNames(const QVariantMap& value) { _textureNames = value; }
436 
437  QString getSimulatorIDAsString() const { return _simulationOwner.getID().toString().mid(1,36).toUpper(); }
438 
439  void setVoxelDataDirty() { _voxelDataChanged = true; }
440 
441  void setLinePointsDirty() {_linePointsChanged = true; }
442 
443  void setQueryAACubeDirty() { _queryAACubeChanged = true; }
444 
445  void setLocationDirty() { _positionChanged = true; _rotationChanged = true; }
446 
447  bool hasTransformOrVelocityChanges() const;
448  void clearTransformOrVelocityChanges();
449  bool hasMiscPhysicsChanges() const;
450 
451  bool hasSimulationRestrictedChanges() const;
452  void copySimulationRestrictedProperties(const EntityItemPointer& entity);
453  void clearSimulationRestrictedProperties();
454 
455  void clearSimulationOwner();
456  void setSimulationOwner(const QUuid& id, uint8_t priority);
457  void setSimulationOwner(const QByteArray& data);
458  void setSimulationPriority(uint8_t priority) { _simulationOwner.setPriority(priority); }
459  uint8_t computeSimulationBidPriority() const;
460 
461  void setActionDataDirty() { _actionDataChanged = true; }
462 
463  QList<QString> listChangedProperties();
464 
465  bool getDimensionsInitialized() const { return _dimensionsInitialized; }
466  void setDimensionsInitialized(bool dimensionsInitialized) { _dimensionsInitialized = dimensionsInitialized; }
467 
468  void setJointRotationsDirty() { _jointRotationsSetChanged = true; _jointRotationsChanged = true; }
469  void setJointTranslationsDirty() { _jointTranslationsSetChanged = true; _jointTranslationsChanged = true; }
470 
471  // render info related items
472  size_t getRenderInfoVertexCount() const { return _renderInfoVertexCount; }
473  void setRenderInfoVertexCount(size_t value) { _renderInfoVertexCount = value; }
474  int getRenderInfoTextureCount() const { return _renderInfoTextureCount; }
475  void setRenderInfoTextureCount(int value) { _renderInfoTextureCount = value; }
476  size_t getRenderInfoTextureSize() const { return _renderInfoTextureSize; }
477  void setRenderInfoTextureSize(size_t value) { _renderInfoTextureSize = value; }
478  int getRenderInfoDrawCalls() const { return _renderInfoDrawCalls; }
479  void setRenderInfoDrawCalls(int value) { _renderInfoDrawCalls = value; }
480  bool getRenderInfoHasTransparent() const { return _renderInfoHasTransparent; }
481  void setRenderInfoHasTransparent(bool value) { _renderInfoHasTransparent = value; }
482 
483  void setPackedNormals(const QByteArray& value);
484  QVector<glm::vec3> unpackNormals(const QByteArray& normals);
485 
486  void setPackedStrokeColors(const QByteArray& value);
487  QVector<glm::vec3> unpackStrokeColors(const QByteArray& strokeColors);
488 
489  QByteArray getPackedNormals() const;
490  QByteArray packNormals(const QVector<glm::vec3>& normals) const;
491 
492  QByteArray getPackedStrokeColors() const;
493  QByteArray packStrokeColors(const QVector<glm::vec3>& strokeColors) const;
494 
495  void convertToCloneProperties(const EntityItemID& entityIDToClone);
496 
497 protected:
498  QString getCollisionMaskAsString() const;
499  void setCollisionMaskFromString(const QString& maskString);
500 
501 private:
502  QUuid _id;
503  bool _idSet;
504  quint64 _lastEdited;
505  EntityTypes::EntityType _type;
506  void setType(const QString& typeName) { _type = EntityTypes::getEntityTypeFromName(typeName); }
507 
508  bool _defaultSettings;
509  bool _dimensionsInitialized = true; // Only false if creating an entity locally with no dimensions properties
510 
511  // NOTE: The following are pseudo client only properties. They are only used in clients which can access
512  // properties of model geometry. But these properties are not serialized like other properties.
513  QVariantMap _textureNames;
514  glm::vec3 _naturalDimensions;
515  glm::vec3 _naturalPosition;
516 
517  size_t _renderInfoVertexCount { 0 };
518  int _renderInfoTextureCount { 0 };
519  size_t _renderInfoTextureSize { 0 };
520  int _renderInfoDrawCalls { 0 };
521  bool _renderInfoHasTransparent { false };
522 
523  EntityPropertyFlags _desiredProperties; // if set will narrow scopes of copy/to/from to just these properties
524 };
525 
526 Q_DECLARE_METATYPE(EntityItemProperties);
527 ScriptValue EntityItemPropertiesToScriptValue(ScriptEngine* engine, const EntityItemProperties& properties);
528 ScriptValue EntityItemNonDefaultPropertiesToScriptValue(ScriptEngine* engine, const EntityItemProperties& properties);
529 bool EntityItemPropertiesFromScriptValueIgnoreReadOnly(const ScriptValue& object, EntityItemProperties& properties);
530 bool EntityItemPropertiesFromScriptValueHonorReadOnly(const ScriptValue& object, EntityItemProperties& properties);
531 
532 Q_DECLARE_METATYPE(EntityPropertyFlags);
533 ScriptValue EntityPropertyFlagsToScriptValue(ScriptEngine* engine, const EntityPropertyFlags& flags);
534 bool EntityPropertyFlagsFromScriptValue(const ScriptValue& object, EntityPropertyFlags& flags);
535 
536 Q_DECLARE_METATYPE(EntityPropertyInfo);
537 ScriptValue EntityPropertyInfoToScriptValue(ScriptEngine* engine, const EntityPropertyInfo& propertyInfo);
538 bool EntityPropertyInfoFromScriptValue(const ScriptValue& object, EntityPropertyInfo& propertyInfo);
539 
540 // define these inline here so the macros work
541 inline void EntityItemProperties::setPosition(const glm::vec3& value)
542  { _position = glm::clamp(value, (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); _positionChanged = true; }
543 
544 inline void EntityItemProperties::setOwningAvatarID(const QUuid& id) {
545  _owningAvatarID = id;
546  if (!_owningAvatarID.isNull()) {
547  // for AvatarEntities there's no entity-server to tell us we're the simulation owner,
548  // so always set the simulationOwner to the owningAvatarID and a high priority.
549  setSimulationOwner(_owningAvatarID, AVATAR_ENTITY_SIMULATION_PRIORITY);
550  }
551  _owningAvatarIDChanged = true;
552 }
553 
554 QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f);
555 
556 inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) {
557  debug << "EntityItemProperties[" << "\n";
558 
559  debug << " _type:" << properties.getType() << "\n";
560 
561  // TODO: figure out why position and animationSettings don't seem to like the macro approach
562  if (properties.containsPositionChange()) {
563  debug << " position:" << properties.getPosition() << "in meters" << "\n";
564  }
565 
566  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Dimensions, dimensions, "in meters");
567  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Velocity, velocity, "in meters");
568  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Name, name, "");
569  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Visible, visible, "");
570  DEBUG_PROPERTY_IF_CHANGED(debug, properties, CanCastShadow, canCastShadow, "");
571  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Rotation, rotation, "");
572  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Density, density, "");
573  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Gravity, gravity, "");
574  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Acceleration, acceleration, "in meters per second");
575  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Damping, damping, "");
576  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Restitution, restitution, "");
577  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Friction, friction, "");
578  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Created, created, "");
579  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Lifetime, lifetime, "");
580  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Script, script, "");
581  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ScriptTimestamp, scriptTimestamp, "");
582  DEBUG_PROPERTY_IF_CHANGED(debug, properties, CollisionSoundURL, collisionSoundURL, "");
583  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Color, color, "");
584  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ColorSpread, colorSpread, "");
585  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ColorStart, colorStart, "");
586  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ColorFinish, colorFinish, "");
587  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Alpha, alpha, "");
588  DEBUG_PROPERTY_IF_CHANGED(debug, properties, AlphaSpread, alphaSpread, "");
589  DEBUG_PROPERTY_IF_CHANGED(debug, properties, AlphaStart, alphaStart, "");
590  DEBUG_PROPERTY_IF_CHANGED(debug, properties, AlphaFinish, alphaFinish, "");
591  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ModelURL, modelURL, "");
592  DEBUG_PROPERTY_IF_CHANGED(debug, properties, CompoundShapeURL, compoundShapeURL, "");
593  DEBUG_PROPERTY_IF_CHANGED(debug, properties, RegistrationPoint, registrationPoint, "");
594  DEBUG_PROPERTY_IF_CHANGED(debug, properties, AngularVelocity, angularVelocity, "");
595  DEBUG_PROPERTY_IF_CHANGED(debug, properties, AngularDamping, angularDamping, "");
596  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Collisionless, collisionless, "");
597  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Dynamic, dynamic, "");
598  DEBUG_PROPERTY_IF_CHANGED(debug, properties, IsSpotlight, isSpotlight, "");
599  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Intensity, intensity, "");
600  DEBUG_PROPERTY_IF_CHANGED(debug, properties, FalloffRadius, falloffRadius, "");
601  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Exponent, exponent, "");
602  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Cutoff, cutoff, "");
603  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Locked, locked, "");
604  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Textures, textures, "");
605  DEBUG_PROPERTY_IF_CHANGED(debug, properties, UserData, userData, "");
606  DEBUG_PROPERTY_IF_CHANGED(debug, properties, PrivateUserData, privateUserData, "");
607  DEBUG_PROPERTY_IF_CHANGED(debug, properties, SimulationOwner, simulationOwner, SimulationOwner());
608  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Text, text, "");
609  DEBUG_PROPERTY_IF_CHANGED(debug, properties, LineHeight, lineHeight, "");
610  DEBUG_PROPERTY_IF_CHANGED(debug, properties, TextColor, textColor, "");
611  DEBUG_PROPERTY_IF_CHANGED(debug, properties, BackgroundColor, backgroundColor, "");
612  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ShapeType, shapeType, "");
613  DEBUG_PROPERTY_IF_CHANGED(debug, properties, MaxParticles, maxParticles, "");
614  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Lifespan, lifespan, "");
615  DEBUG_PROPERTY_IF_CHANGED(debug, properties, IsEmitting, isEmitting, "");
616  DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitRate, emitRate, "");
617  DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitSpeed, emitSpeed, "");
618  DEBUG_PROPERTY_IF_CHANGED(debug, properties, SpeedSpread, speedSpread, "");
619  DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitOrientation, emitOrientation, "");
620  DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitDimensions, emitDimensions, "");
621  DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitRadiusStart, emitRadiusStart, "");
622  DEBUG_PROPERTY_IF_CHANGED(debug, properties, PolarStart, polarStart, "");
623  DEBUG_PROPERTY_IF_CHANGED(debug, properties, PolarFinish, polarFinish, "");
624  DEBUG_PROPERTY_IF_CHANGED(debug, properties, AzimuthStart, azimuthStart, "");
625  DEBUG_PROPERTY_IF_CHANGED(debug, properties, AzimuthFinish, azimuthFinish, "");
626  DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitAcceleration, emitAcceleration, "");
627  DEBUG_PROPERTY_IF_CHANGED(debug, properties, AccelerationSpread, accelerationSpread, "");
628  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ParticleRadius, particleRadius, "");
629  DEBUG_PROPERTY_IF_CHANGED(debug, properties, RadiusSpread, radiusSpread, "");
630  DEBUG_PROPERTY_IF_CHANGED(debug, properties, RadiusStart, radiusStart, "");
631  DEBUG_PROPERTY_IF_CHANGED(debug, properties, RadiusFinish, radiusFinish, "");
632 
633  DEBUG_PROPERTY_IF_CHANGED(debug, properties, LocalPosition, localPosition, "");
634  DEBUG_PROPERTY_IF_CHANGED(debug, properties, LocalRotation, localRotation, "");
635  DEBUG_PROPERTY_IF_CHANGED(debug, properties, LocalVelocity, localVelocity, "");
636  DEBUG_PROPERTY_IF_CHANGED(debug, properties, LocalAngularVelocity, localAngularVelocity, "");
637  DEBUG_PROPERTY_IF_CHANGED(debug, properties, LocalDimensions, localDimensions, "");
638 
639  DEBUG_PROPERTY_IF_CHANGED(debug, properties, HazeMode, hazeMode, "");
640  DEBUG_PROPERTY_IF_CHANGED(debug, properties, KeyLightMode, keyLightMode, "");
641  DEBUG_PROPERTY_IF_CHANGED(debug, properties, AmbientLightMode, ambientLightMode, "");
642  DEBUG_PROPERTY_IF_CHANGED(debug, properties, SkyboxMode, skyboxMode, "");
643  DEBUG_PROPERTY_IF_CHANGED(debug, properties, BloomMode, bloomMode, "");
644 
645  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Cloneable, cloneable, "");
646  DEBUG_PROPERTY_IF_CHANGED(debug, properties, CloneLifetime, cloneLifetime, "");
647  DEBUG_PROPERTY_IF_CHANGED(debug, properties, CloneLimit, cloneLimit, "");
648  DEBUG_PROPERTY_IF_CHANGED(debug, properties, CloneDynamic, cloneDynamic, "");
649  DEBUG_PROPERTY_IF_CHANGED(debug, properties, CloneAvatarEntity, cloneAvatarEntity, "");
650  DEBUG_PROPERTY_IF_CHANGED(debug, properties, CloneOriginID, cloneOriginID, "");
651 
652  DEBUG_PROPERTY_IF_CHANGED(debug, properties, VoxelVolumeSize, voxelVolumeSize, "");
653  DEBUG_PROPERTY_IF_CHANGED(debug, properties, VoxelData, voxelData, "");
654  DEBUG_PROPERTY_IF_CHANGED(debug, properties, VoxelSurfaceStyle, voxelSurfaceStyle, "");
655  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Href, href, "");
656  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Description, description, "");
657  if (properties.actionDataChanged()) {
658  debug << " " << "actionData" << ":" << properties.getActionData().toHex() << "" << "\n";
659  }
660  DEBUG_PROPERTY_IF_CHANGED(debug, properties, XTextureURL, xTextureURL, "");
661  DEBUG_PROPERTY_IF_CHANGED(debug, properties, YTextureURL, yTextureURL, "");
662  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ZTextureURL, zTextureURL, "");
663  DEBUG_PROPERTY_IF_CHANGED(debug, properties, XNNeighborID, xNNeighborID, "");
664  DEBUG_PROPERTY_IF_CHANGED(debug, properties, YNNeighborID, yNNeighborID, "");
665  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ZNNeighborID, zNNeighborID, "");
666  DEBUG_PROPERTY_IF_CHANGED(debug, properties, XPNeighborID, xPNeighborID, "");
667  DEBUG_PROPERTY_IF_CHANGED(debug, properties, YPNeighborID, yPNeighborID, "");
668  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ZPNeighborID, zPNeighborID, "");
669 
670  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ParentID, parentID, "");
671  DEBUG_PROPERTY_IF_CHANGED(debug, properties, ParentJointIndex, parentJointIndex, "");
672  DEBUG_PROPERTY_IF_CHANGED(debug, properties, QueryAACube, queryAACube, "");
673 
674  DEBUG_PROPERTY_IF_CHANGED(debug, properties, JointRotationsSet, jointRotationsSet, "");
675  DEBUG_PROPERTY_IF_CHANGED(debug, properties, JointRotations, jointRotations, "");
676  DEBUG_PROPERTY_IF_CHANGED(debug, properties, JointTranslationsSet, jointTranslationsSet, "");
677  DEBUG_PROPERTY_IF_CHANGED(debug, properties, JointTranslations, jointTranslations, "");
678 
679  DEBUG_PROPERTY_IF_CHANGED(debug, properties, FlyingAllowed, flyingAllowed, "");
680  DEBUG_PROPERTY_IF_CHANGED(debug, properties, GhostingAllowed, ghostingAllowed, "");
681  DEBUG_PROPERTY_IF_CHANGED(debug, properties, FilterURL, filterURL, "");
682 
683  DEBUG_PROPERTY_IF_CHANGED(debug, properties, AvatarPriority, avatarPriority, "");
684 
685  DEBUG_PROPERTY_IF_CHANGED(debug, properties, Screenshare, screenshare, "");
686 
687  DEBUG_PROPERTY_IF_CHANGED(debug, properties, EntityHostTypeAsString, entityHostType, "");
688  DEBUG_PROPERTY_IF_CHANGED(debug, properties, OwningAvatarID, owningAvatarID, "");
689 
690  DEBUG_PROPERTY_IF_CHANGED(debug, properties, LastEditedBy, lastEditedBy, "");
691 
692  debug << " last edited:" << properties.getLastEdited() << "\n";
693  debug << " edited ago:" << properties.getEditedAgo() << "\n";
694  debug << "]";
695 
696  return debug;
697 }
698 
699 #endif // hifi_EntityItemProperties_h
Definition: EntityItem.h:82
Abstract ID for editing model items. Used in EntityItem JS API.
Definition: EntityItemID.h:28
Definition: EntityItemProperties.h:106
float getEditedAgo() const
Elapsed seconds since this entity was last edited.
Definition: EntityItemProperties.h:152
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40