From b261665072bdabc43f5de2a0748a5d5d1cd0d45d Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 12 Dec 2018 09:39:01 -0800 Subject: [PATCH 1/4] working on lines --- .../src/RenderableLineEntityItem.cpp | 59 ++++++++++++++----- .../src/RenderableLineEntityItem.h | 12 +++- libraries/entities/src/EntityItem.cpp | 16 ----- libraries/entities/src/EntityItem.h | 4 -- .../entities/src/EntityItemProperties.cpp | 10 ---- libraries/entities/src/EntityItemProperties.h | 7 --- .../src/EntityItemPropertiesDefaults.h | 1 - libraries/entities/src/LineEntityItem.cpp | 12 ++-- .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 3 +- 10 files changed, 61 insertions(+), 65 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp index 6a472cab1e..884f8a2566 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp @@ -17,38 +17,67 @@ using namespace render; using namespace render::entities; -void LineEntityRenderer::onRemoveFromSceneTyped(const TypedEntityPointer& entity) { - if (_lineVerticesID != GeometryCache::UNKNOWN_ID) { - auto geometryCache = DependencyManager::get(); - if (geometryCache) { - geometryCache->releaseID(_lineVerticesID); +LineEntityRenderer::LineEntityRenderer(const EntityItemPointer& entity) : + Parent(entity) { + _lineVerticesID = DependencyManager::get()->allocateID(); +} + +LineEntityRenderer::~LineEntityRenderer() { + auto geometryCache = DependencyManager::get(); + if (geometryCache) { + geometryCache->releaseID(_lineVerticesID); + for (auto id : _glowGeometryIDs) { + geometryCache->releaseID(id); } } } +bool LineEntityRenderer::isTransparent() const { + return Parent::isTransparent() || _glow > 0.0f || _alpha < 1.0f; +} + bool LineEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const { - return entity->pointsChanged(); + if (entity->pointsChanged()) { + return true; + } + + if (_color != entity->getColor()) { + return true; + } + + if (_alpha != entity->getAlpha()) { + return true; + } + + if (_lineWidth != entity->getLineWidth()) { + return true; + } + + if (_glow != entity->getGlow()) { + return true; + } + + return false; } void LineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) { entity->resetPointsChanged(); _linePoints = entity->getLinePoints(); - auto geometryCache = DependencyManager::get(); - if (_lineVerticesID == GeometryCache::UNKNOWN_ID) { - _lineVerticesID = geometryCache->allocateID(); - } - glm::vec4 lineColor(toGlm(entity->getColor()), entity->getLocalRenderAlpha()); + _color = entity->getColor(); + _alpha = entity->getAlpha(); + _lineWidth = entity->getLineWidth(); + _glow = entity->getGlow(); + + // TODO: take into account _lineWidth geometryCache->updateVertices(_lineVerticesID, _linePoints, lineColor); } void LineEntityRenderer::doRender(RenderArgs* args) { - if (_lineVerticesID == GeometryCache::UNKNOWN_ID) { - return; - } - PerformanceTimer perfTimer("RenderableLineEntityItem::render"); + Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; + const auto& modelTransform = getModelTransform(); Transform transform = Transform(); transform.setTranslation(modelTransform.getTranslation()); diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.h b/libraries/entities-renderer/src/RenderableLineEntityItem.h index 799ba5b78c..50b40309fd 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.h @@ -24,17 +24,25 @@ class LineEntityRenderer : public TypedEntityRenderer { friend class EntityRenderer; public: - LineEntityRenderer(const EntityItemPointer& entity) : Parent(entity) { } + LineEntityRenderer(const EntityItemPointer& entity); + ~LineEntityRenderer(); + + bool isTransparent() const override; protected: - virtual void onRemoveFromSceneTyped(const TypedEntityPointer& entity) override; virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override; virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override; virtual void doRender(RenderArgs* args) override; private: int _lineVerticesID { GeometryCache::UNKNOWN_ID }; + std::vector _glowGeometryIDs; + QVector _linePoints; + glm::u8vec3 _color; + float _alpha; + float _lineWidth; + float _glow; }; } } // namespace diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 94d0024fd5..8b790f162e 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1302,7 +1302,6 @@ EntityItemProperties EntityItem::getProperties(const EntityPropertyFlags& desire COPY_ENTITY_PROPERTY_TO_PROPERTIES(registrationPoint, getRegistrationPoint); COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularVelocity, getLocalAngularVelocity); COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularDamping, getAngularDamping); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(localRenderAlpha, getLocalRenderAlpha); COPY_ENTITY_PROPERTY_TO_PROPERTIES(visible, getVisible); COPY_ENTITY_PROPERTY_TO_PROPERTIES(canCastShadow, getCanCastShadow); COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionless, getCollisionless); @@ -1449,7 +1448,6 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(scriptTimestamp, setScriptTimestamp); SET_ENTITY_PROPERTY_FROM_PROPERTIES(serverScripts, setServerScripts); SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionSoundURL, setCollisionSoundURL); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(localRenderAlpha, setLocalRenderAlpha); SET_ENTITY_PROPERTY_FROM_PROPERTIES(visible, setVisible); SET_ENTITY_PROPERTY_FROM_PROPERTIES(canCastShadow, setCanCastShadow); SET_ENTITY_PROPERTY_FROM_PROPERTIES(userData, setUserData); @@ -2652,20 +2650,6 @@ void EntityItem::setDescription(const QString& value) { }); } -float EntityItem::getLocalRenderAlpha() const { - float result; - withReadLock([&] { - result = _localRenderAlpha; - }); - return result; -} - -void EntityItem::setLocalRenderAlpha(float localRenderAlpha) { - withWriteLock([&] { - _localRenderAlpha = localRenderAlpha; - }); -} - glm::vec3 EntityItem::getGravity() const { glm::vec3 result; withReadLock([&] { diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 5c45c96702..69ab271438 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -207,9 +207,6 @@ public: glm::vec3 getUnscaledDimensions() const; virtual void setUnscaledDimensions(const glm::vec3& value); - float getLocalRenderAlpha() const; - void setLocalRenderAlpha(float localRenderAlpha); - void setDensity(float density); float computeMass() const; void setMass(float mass); @@ -592,7 +589,6 @@ protected: mutable bool _recalcMinAACube { true }; mutable bool _recalcMaxAACube { true }; - float _localRenderAlpha { ENTITY_ITEM_DEFAULT_LOCAL_RENDER_ALPHA }; float _density { ENTITY_ITEM_DEFAULT_DENSITY }; // kg/m^3 // NOTE: _volumeMultiplier is used to allow some mass properties code exist in the EntityItem base class // rather than in all of the derived classes. If we ever collapse these classes to one we could do it a diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 826d180539..790d8dcb90 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -50,10 +50,6 @@ EntityItemProperties::EntityItemProperties(EntityPropertyFlags desiredProperties _lastEdited(0), _type(EntityTypes::Unknown), - _localRenderAlpha(1.0f), - - _localRenderAlphaChanged(false), - _defaultSettings(true), _naturalDimensions(1.0f, 1.0f, 1.0f), _naturalPosition(0.0f, 0.0f, 0.0f), @@ -1732,9 +1728,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool properties.setProperty("isFacingAvatar", convertScriptValue(engine, getBillboardMode() == BillboardMode::FULL)); } - // FIXME - I don't think these properties are supported any more - //COPY_PROPERTY_TO_QSCRIPTVALUE(localRenderAlpha); - return properties; } @@ -1775,7 +1768,6 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(emitterShouldTrail, bool, setEmitterShouldTrail); COPY_PROPERTY_FROM_QSCRIPTVALUE(modelURL, QString, setModelURL); COPY_PROPERTY_FROM_QSCRIPTVALUE(compoundShapeURL, QString, setCompoundShapeURL); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localRenderAlpha, float, setLocalRenderAlpha); COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionless, bool, setCollisionless); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(ignoreForCollisions, bool, setCollisionless, getCollisionless); // legacy support COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionMask, uint16_t, setCollisionMask); @@ -2021,7 +2013,6 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(emitterShouldTrail); COPY_PROPERTY_IF_CHANGED(modelURL); COPY_PROPERTY_IF_CHANGED(compoundShapeURL); - COPY_PROPERTY_IF_CHANGED(localRenderAlpha); COPY_PROPERTY_IF_CHANGED(collisionless); COPY_PROPERTY_IF_CHANGED(collisionMask); COPY_PROPERTY_IF_CHANGED(dynamic); @@ -3401,7 +3392,6 @@ void EntityItemProperties::markAllChanged() { _alphaChanged = true; _modelURLChanged = true; _compoundShapeURLChanged = true; - _localRenderAlphaChanged = true; _isSpotlightChanged = true; _collisionlessChanged = true; _collisionMaskChanged = true; diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index e2f483d5b8..f9ec0b9605 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -350,9 +350,6 @@ public: bool containsPositionChange() const { return _positionChanged; } bool containsDimensionsChange() const { return _dimensionsChanged; } - float getLocalRenderAlpha() const { return _localRenderAlpha; } - void setLocalRenderAlpha(float value) { _localRenderAlpha = value; _localRenderAlphaChanged = true; } - static OctreeElement::AppendState encodeEntityEditPacket(PacketType command, EntityItemID id, const EntityItemProperties& properties, QByteArray& buffer, EntityPropertyFlags requestedProperties, EntityPropertyFlags& didntFitProperties); @@ -363,8 +360,6 @@ public: static bool decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes, EntityItemID& entityID, EntityItemProperties& properties); - bool localRenderAlphaChanged() const { return _localRenderAlphaChanged; } - void clearID() { _id = UNKNOWN_ENTITY_ID; _idSet = false; } void markAllChanged(); @@ -452,8 +447,6 @@ private: EntityTypes::EntityType _type; void setType(const QString& typeName) { _type = EntityTypes::getEntityTypeFromName(typeName); } - float _localRenderAlpha; - bool _localRenderAlphaChanged; bool _defaultSettings; bool _dimensionsInitialized = true; // Only false if creating an entity locally with no dimensions properties diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index 6c39e90c91..3c4577ba2f 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -44,7 +44,6 @@ const QString ENTITY_ITEM_DEFAULT_CERTIFICATE_ID = QString(""); const quint32 ENTITY_ITEM_DEFAULT_STATIC_CERTIFICATE_VERSION = 0; const float ENTITY_ITEM_DEFAULT_ALPHA = 1.0f; -const float ENTITY_ITEM_DEFAULT_LOCAL_RENDER_ALPHA = 1.0f; const bool ENTITY_ITEM_DEFAULT_VISIBLE = true; const bool ENTITY_ITEM_DEFAULT_VISIBLE_IN_SECONDARY_CAMERA = true; const bool ENTITY_ITEM_DEFAULT_CAN_CAST_SHADOW { true }; diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp index 4957c30112..766fd12bbb 100644 --- a/libraries/entities/src/LineEntityItem.cpp +++ b/libraries/entities/src/LineEntityItem.cpp @@ -173,19 +173,15 @@ void LineEntityItem::setLineWidth(float lineWidth) { } float LineEntityItem::getLineWidth() const { - float result; - withReadLock([&] { - result = _lineWidth; + return resultWithReadLock([&] { + return _lineWidth; }); - return result; } QVector LineEntityItem::getLinePoints() const { - QVector result; - withReadLock([&] { - result = _points; + return resultWithReadLock>([&] { + return _points; }); - return result; } void LineEntityItem::resetPointsChanged() { diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index f2db155dca..ebd747fd39 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -33,7 +33,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::EntityEdit: case PacketType::EntityData: case PacketType::EntityPhysics: - return static_cast(EntityVersion::MissingTextProperties); + return static_cast(EntityVersion::MissingLineProperties); case PacketType::EntityQuery: return static_cast(EntityQueryPacketVersion::ConicalFrustums); case PacketType::AvatarIdentity: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 0d4d065f5b..1ed2dd83ff 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -250,7 +250,8 @@ enum class EntityVersion : PacketVersion { CleanupProperties, ImageEntities, GridEntities, - MissingTextProperties + MissingTextProperties, + MissingLineProperties }; enum class EntityScriptCallMethodVersion : PacketVersion { From 770da220d785d0124f81824565a668d837615a35 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 12 Dec 2018 16:47:35 -0800 Subject: [PATCH 2/4] cleanup entity properties more and start polyline work, remove lines --- .../src/RenderableLineEntityItem.cpp | 90 - .../src/RenderableLineEntityItem.h | 50 - .../entities/src/EntityItemProperties.cpp | 2623 +++++++++-------- libraries/entities/src/EntityItemProperties.h | 25 +- .../entities/src/EntityPropertyFlags.cpp | 2 - libraries/entities/src/EntityPropertyFlags.h | 542 ++-- .../entities/src/EntityScriptingInterface.cpp | 83 - .../entities/src/EntityScriptingInterface.h | 65 - libraries/entities/src/EntityTypes.cpp | 2 - libraries/entities/src/EntityTypes.h | 3 - libraries/entities/src/LineEntityItem.cpp | 191 -- libraries/entities/src/LineEntityItem.h | 82 - libraries/entities/src/PolyLineEntityItem.cpp | 13 +- scripts/developer/tests/avatarToWorldTests.js | 46 - scripts/developer/tests/worldToAvatarTests.js | 47 - 15 files changed, 1665 insertions(+), 2199 deletions(-) delete mode 100644 libraries/entities-renderer/src/RenderableLineEntityItem.cpp delete mode 100644 libraries/entities-renderer/src/RenderableLineEntityItem.h delete mode 100644 libraries/entities/src/LineEntityItem.cpp delete mode 100644 libraries/entities/src/LineEntityItem.h diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp deleted file mode 100644 index 884f8a2566..0000000000 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// -// RenderableLineEntityItem.cpp -// libraries/entities-renderer/src/ -// -// Created by Seth Alves on 5/11/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "RenderableLineEntityItem.h" - -#include -#include - -using namespace render; -using namespace render::entities; - -LineEntityRenderer::LineEntityRenderer(const EntityItemPointer& entity) : - Parent(entity) { - _lineVerticesID = DependencyManager::get()->allocateID(); -} - -LineEntityRenderer::~LineEntityRenderer() { - auto geometryCache = DependencyManager::get(); - if (geometryCache) { - geometryCache->releaseID(_lineVerticesID); - for (auto id : _glowGeometryIDs) { - geometryCache->releaseID(id); - } - } -} - -bool LineEntityRenderer::isTransparent() const { - return Parent::isTransparent() || _glow > 0.0f || _alpha < 1.0f; -} - -bool LineEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const { - if (entity->pointsChanged()) { - return true; - } - - if (_color != entity->getColor()) { - return true; - } - - if (_alpha != entity->getAlpha()) { - return true; - } - - if (_lineWidth != entity->getLineWidth()) { - return true; - } - - if (_glow != entity->getGlow()) { - return true; - } - - return false; -} - -void LineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) { - entity->resetPointsChanged(); - _linePoints = entity->getLinePoints(); - _color = entity->getColor(); - _alpha = entity->getAlpha(); - _lineWidth = entity->getLineWidth(); - _glow = entity->getGlow(); - - // TODO: take into account _lineWidth - geometryCache->updateVertices(_lineVerticesID, _linePoints, lineColor); -} - -void LineEntityRenderer::doRender(RenderArgs* args) { - PerformanceTimer perfTimer("RenderableLineEntityItem::render"); - - Q_ASSERT(args->_batch); - gpu::Batch& batch = *args->_batch; - - const auto& modelTransform = getModelTransform(); - Transform transform = Transform(); - transform.setTranslation(modelTransform.getTranslation()); - transform.setRotation(modelTransform.getRotation()); - batch.setModelTransform(transform); - if (_linePoints.size() > 1) { - DependencyManager::get()->bindSimpleProgram(batch); - DependencyManager::get()->renderVertices(batch, gpu::LINE_STRIP, _lineVerticesID); - } -} diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.h b/libraries/entities-renderer/src/RenderableLineEntityItem.h deleted file mode 100644 index 50b40309fd..0000000000 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// RenderableLineEntityItem.h -// libraries/entities-renderer/src/ -// -// Created by Seth Alves on 5/11/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_RenderableLineEntityItem_h -#define hifi_RenderableLineEntityItem_h - -#include "RenderableEntityItem.h" -#include -#include - - -namespace render { namespace entities { - -class LineEntityRenderer : public TypedEntityRenderer { - using Parent = TypedEntityRenderer; - friend class EntityRenderer; - -public: - LineEntityRenderer(const EntityItemPointer& entity); - ~LineEntityRenderer(); - - bool isTransparent() const override; - -protected: - virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override; - virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override; - virtual void doRender(RenderArgs* args) override; - -private: - int _lineVerticesID { GeometryCache::UNKNOWN_ID }; - std::vector _glowGeometryIDs; - - QVector _linePoints; - glm::u8vec3 _color; - float _alpha; - float _lineWidth; - float _glow; -}; - -} } // namespace - -#endif // hifi_RenderableLineEntityItem_h diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 790d8dcb90..2a7fe1ef77 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -346,74 +346,174 @@ void EntityItemProperties::setBillboardModeFromString(const QString& materialMap EntityPropertyFlags EntityItemProperties::getChangedProperties() const { EntityPropertyFlags changedProperties; - CHECK_PROPERTY_CHANGE(PROP_LAST_EDITED_BY, lastEditedBy); + // Core + CHECK_PROPERTY_CHANGE(PROP_VISIBLE, visible); + CHECK_PROPERTY_CHANGE(PROP_NAME, name); + CHECK_PROPERTY_CHANGE(PROP_LOCKED, locked); + CHECK_PROPERTY_CHANGE(PROP_USER_DATA, userData); + CHECK_PROPERTY_CHANGE(PROP_HREF, href); + CHECK_PROPERTY_CHANGE(PROP_DESCRIPTION, description); CHECK_PROPERTY_CHANGE(PROP_POSITION, position); CHECK_PROPERTY_CHANGE(PROP_DIMENSIONS, dimensions); CHECK_PROPERTY_CHANGE(PROP_ROTATION, rotation); + CHECK_PROPERTY_CHANGE(PROP_REGISTRATION_POINT, registrationPoint); + //CHECK_PROPERTY_CHANGE(PROP_CREATED, created); // can't change + CHECK_PROPERTY_CHANGE(PROP_LAST_EDITED_BY, lastEditedBy); + CHECK_PROPERTY_CHANGE(PROP_ENTITY_HOST_TYPE, entityHostType); + CHECK_PROPERTY_CHANGE(PROP_OWNING_AVATAR_ID, owningAvatarID); + CHECK_PROPERTY_CHANGE(PROP_PARENT_ID, parentID); + CHECK_PROPERTY_CHANGE(PROP_PARENT_JOINT_INDEX, parentJointIndex); + CHECK_PROPERTY_CHANGE(PROP_QUERY_AA_CUBE, queryAACube); + CHECK_PROPERTY_CHANGE(PROP_CAN_CAST_SHADOW, canCastShadow); + CHECK_PROPERTY_CHANGE(PROP_VISIBLE_IN_SECONDARY_CAMERA, isVisibleInSecondaryCamera); + changedProperties += _grab.getChangedProperties(); + + // Physics CHECK_PROPERTY_CHANGE(PROP_DENSITY, density); CHECK_PROPERTY_CHANGE(PROP_VELOCITY, velocity); + CHECK_PROPERTY_CHANGE(PROP_ANGULAR_VELOCITY, angularVelocity); CHECK_PROPERTY_CHANGE(PROP_GRAVITY, gravity); CHECK_PROPERTY_CHANGE(PROP_ACCELERATION, acceleration); CHECK_PROPERTY_CHANGE(PROP_DAMPING, damping); + CHECK_PROPERTY_CHANGE(PROP_ANGULAR_DAMPING, angularDamping); CHECK_PROPERTY_CHANGE(PROP_RESTITUTION, restitution); CHECK_PROPERTY_CHANGE(PROP_FRICTION, friction); CHECK_PROPERTY_CHANGE(PROP_LIFETIME, lifetime); - CHECK_PROPERTY_CHANGE(PROP_SCRIPT, script); - CHECK_PROPERTY_CHANGE(PROP_SCRIPT_TIMESTAMP, scriptTimestamp); - CHECK_PROPERTY_CHANGE(PROP_SERVER_SCRIPTS, serverScripts); - CHECK_PROPERTY_CHANGE(PROP_COLLISION_SOUND_URL, collisionSoundURL); - CHECK_PROPERTY_CHANGE(PROP_COLOR, color); - CHECK_PROPERTY_CHANGE(PROP_COLOR_SPREAD, colorSpread); - CHECK_PROPERTY_CHANGE(PROP_COLOR_START, colorStart); - CHECK_PROPERTY_CHANGE(PROP_COLOR_FINISH, colorFinish); - CHECK_PROPERTY_CHANGE(PROP_ALPHA, alpha); - CHECK_PROPERTY_CHANGE(PROP_ALPHA_SPREAD, alphaSpread); - CHECK_PROPERTY_CHANGE(PROP_ALPHA_START, alphaStart); - CHECK_PROPERTY_CHANGE(PROP_ALPHA_FINISH, alphaFinish); - CHECK_PROPERTY_CHANGE(PROP_EMITTER_SHOULD_TRAIL, emitterShouldTrail); - CHECK_PROPERTY_CHANGE(PROP_MODEL_URL, modelURL); - CHECK_PROPERTY_CHANGE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); - CHECK_PROPERTY_CHANGE(PROP_VISIBLE, visible); - CHECK_PROPERTY_CHANGE(PROP_CAN_CAST_SHADOW, canCastShadow); - CHECK_PROPERTY_CHANGE(PROP_REGISTRATION_POINT, registrationPoint); - CHECK_PROPERTY_CHANGE(PROP_ANGULAR_VELOCITY, angularVelocity); - CHECK_PROPERTY_CHANGE(PROP_ANGULAR_DAMPING, angularDamping); CHECK_PROPERTY_CHANGE(PROP_COLLISIONLESS, collisionless); CHECK_PROPERTY_CHANGE(PROP_COLLISION_MASK, collisionMask); CHECK_PROPERTY_CHANGE(PROP_DYNAMIC, dynamic); - CHECK_PROPERTY_CHANGE(PROP_IS_SPOTLIGHT, isSpotlight); - CHECK_PROPERTY_CHANGE(PROP_INTENSITY, intensity); - CHECK_PROPERTY_CHANGE(PROP_FALLOFF_RADIUS, falloffRadius); - CHECK_PROPERTY_CHANGE(PROP_EXPONENT, exponent); - CHECK_PROPERTY_CHANGE(PROP_CUTOFF, cutoff); - CHECK_PROPERTY_CHANGE(PROP_LOCKED, locked); - CHECK_PROPERTY_CHANGE(PROP_TEXTURES, textures); - CHECK_PROPERTY_CHANGE(PROP_USER_DATA, userData); CHECK_PROPERTY_CHANGE(PROP_SIMULATION_OWNER, simulationOwner); - CHECK_PROPERTY_CHANGE(PROP_TEXT, text); - CHECK_PROPERTY_CHANGE(PROP_LINE_HEIGHT, lineHeight); - CHECK_PROPERTY_CHANGE(PROP_TEXT_COLOR, textColor); - CHECK_PROPERTY_CHANGE(PROP_BACKGROUND_COLOR, backgroundColor); + CHECK_PROPERTY_CHANGE(PROP_COLLISION_SOUND_URL, collisionSoundURL); + CHECK_PROPERTY_CHANGE(PROP_ACTION_DATA, actionData); + + // Cloning + CHECK_PROPERTY_CHANGE(PROP_CLONEABLE, cloneable); + CHECK_PROPERTY_CHANGE(PROP_CLONE_LIFETIME, cloneLifetime); + CHECK_PROPERTY_CHANGE(PROP_CLONE_LIMIT, cloneLimit); + CHECK_PROPERTY_CHANGE(PROP_CLONE_DYNAMIC, cloneDynamic); + CHECK_PROPERTY_CHANGE(PROP_CLONE_AVATAR_ENTITY, cloneAvatarEntity); + CHECK_PROPERTY_CHANGE(PROP_CLONE_ORIGIN_ID, cloneOriginID); + + // Scripts + CHECK_PROPERTY_CHANGE(PROP_SCRIPT, script); + CHECK_PROPERTY_CHANGE(PROP_SCRIPT_TIMESTAMP, scriptTimestamp); + CHECK_PROPERTY_CHANGE(PROP_SERVER_SCRIPTS, serverScripts); + + // Common CHECK_PROPERTY_CHANGE(PROP_SHAPE_TYPE, shapeType); - CHECK_PROPERTY_CHANGE(PROP_EMITTING_PARTICLES, isEmitting); + CHECK_PROPERTY_CHANGE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); + CHECK_PROPERTY_CHANGE(PROP_COLOR, color); + CHECK_PROPERTY_CHANGE(PROP_ALPHA, alpha); + CHECK_PROPERTY_CHANGE(PROP_TEXTURES, textures); + + // Particles CHECK_PROPERTY_CHANGE(PROP_MAX_PARTICLES, maxParticles); CHECK_PROPERTY_CHANGE(PROP_LIFESPAN, lifespan); + CHECK_PROPERTY_CHANGE(PROP_EMITTING_PARTICLES, isEmitting); CHECK_PROPERTY_CHANGE(PROP_EMIT_RATE, emitRate); CHECK_PROPERTY_CHANGE(PROP_EMIT_SPEED, emitSpeed); CHECK_PROPERTY_CHANGE(PROP_SPEED_SPREAD, speedSpread); CHECK_PROPERTY_CHANGE(PROP_EMIT_ORIENTATION, emitOrientation); CHECK_PROPERTY_CHANGE(PROP_EMIT_DIMENSIONS, emitDimensions); CHECK_PROPERTY_CHANGE(PROP_EMIT_RADIUS_START, emitRadiusStart); + CHECK_PROPERTY_CHANGE(PROP_EMIT_ACCELERATION, emitAcceleration); + CHECK_PROPERTY_CHANGE(PROP_ACCELERATION_SPREAD, accelerationSpread); CHECK_PROPERTY_CHANGE(PROP_POLAR_START, polarStart); CHECK_PROPERTY_CHANGE(PROP_POLAR_FINISH, polarFinish); CHECK_PROPERTY_CHANGE(PROP_AZIMUTH_START, azimuthStart); CHECK_PROPERTY_CHANGE(PROP_AZIMUTH_FINISH, azimuthFinish); - CHECK_PROPERTY_CHANGE(PROP_EMIT_ACCELERATION, emitAcceleration); - CHECK_PROPERTY_CHANGE(PROP_ACCELERATION_SPREAD, accelerationSpread); CHECK_PROPERTY_CHANGE(PROP_PARTICLE_RADIUS, particleRadius); CHECK_PROPERTY_CHANGE(PROP_RADIUS_SPREAD, radiusSpread); CHECK_PROPERTY_CHANGE(PROP_RADIUS_START, radiusStart); CHECK_PROPERTY_CHANGE(PROP_RADIUS_FINISH, radiusFinish); + CHECK_PROPERTY_CHANGE(PROP_COLOR_SPREAD, colorSpread); + CHECK_PROPERTY_CHANGE(PROP_COLOR_START, colorStart); + CHECK_PROPERTY_CHANGE(PROP_COLOR_FINISH, colorFinish); + CHECK_PROPERTY_CHANGE(PROP_ALPHA_SPREAD, alphaSpread); + CHECK_PROPERTY_CHANGE(PROP_ALPHA_START, alphaStart); + CHECK_PROPERTY_CHANGE(PROP_ALPHA_FINISH, alphaFinish); + CHECK_PROPERTY_CHANGE(PROP_EMITTER_SHOULD_TRAIL, emitterShouldTrail); + CHECK_PROPERTY_CHANGE(PROP_PARTICLE_SPIN, particleSpin); + CHECK_PROPERTY_CHANGE(PROP_SPIN_SPREAD, spinSpread); + CHECK_PROPERTY_CHANGE(PROP_SPIN_START, spinStart); + CHECK_PROPERTY_CHANGE(PROP_SPIN_FINISH, spinFinish); + CHECK_PROPERTY_CHANGE(PROP_PARTICLE_ROTATE_WITH_ENTITY, rotateWithEntity); + + // Model + CHECK_PROPERTY_CHANGE(PROP_MODEL_URL, modelURL); + CHECK_PROPERTY_CHANGE(PROP_JOINT_ROTATIONS_SET, jointRotationsSet); + CHECK_PROPERTY_CHANGE(PROP_JOINT_ROTATIONS, jointRotations); + CHECK_PROPERTY_CHANGE(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet); + CHECK_PROPERTY_CHANGE(PROP_JOINT_TRANSLATIONS, jointTranslations); + CHECK_PROPERTY_CHANGE(PROP_RELAY_PARENT_JOINTS, relayParentJoints); + changedProperties += _animation.getChangedProperties(); + + // Light + CHECK_PROPERTY_CHANGE(PROP_IS_SPOTLIGHT, isSpotlight); + CHECK_PROPERTY_CHANGE(PROP_INTENSITY, intensity); + CHECK_PROPERTY_CHANGE(PROP_EXPONENT, exponent); + CHECK_PROPERTY_CHANGE(PROP_CUTOFF, cutoff); + CHECK_PROPERTY_CHANGE(PROP_FALLOFF_RADIUS, falloffRadius); + + // Text + CHECK_PROPERTY_CHANGE(PROP_TEXT, text); + CHECK_PROPERTY_CHANGE(PROP_LINE_HEIGHT, lineHeight); + CHECK_PROPERTY_CHANGE(PROP_TEXT_COLOR, textColor); + CHECK_PROPERTY_CHANGE(PROP_TEXT_ALPHA, textAlpha); + CHECK_PROPERTY_CHANGE(PROP_BACKGROUND_COLOR, backgroundColor); + CHECK_PROPERTY_CHANGE(PROP_BACKGROUND_ALPHA, backgroundAlpha); + CHECK_PROPERTY_CHANGE(PROP_BILLBOARD_MODE, billboardMode); + CHECK_PROPERTY_CHANGE(PROP_LEFT_MARGIN, leftMargin); + CHECK_PROPERTY_CHANGE(PROP_RIGHT_MARGIN, rightMargin); + CHECK_PROPERTY_CHANGE(PROP_TOP_MARGIN, topMargin); + CHECK_PROPERTY_CHANGE(PROP_BOTTOM_MARGIN, bottomMargin); + + // Zone + changedProperties += _keyLight.getChangedProperties(); + changedProperties += _ambientLight.getChangedProperties(); + changedProperties += _skybox.getChangedProperties(); + changedProperties += _haze.getChangedProperties(); + changedProperties += _bloom.getChangedProperties(); + CHECK_PROPERTY_CHANGE(PROP_FLYING_ALLOWED, flyingAllowed); + CHECK_PROPERTY_CHANGE(PROP_GHOSTING_ALLOWED, ghostingAllowed); + CHECK_PROPERTY_CHANGE(PROP_FILTER_URL, filterURL); + CHECK_PROPERTY_CHANGE(PROP_KEY_LIGHT_MODE, keyLightMode); + CHECK_PROPERTY_CHANGE(PROP_AMBIENT_LIGHT_MODE, ambientLightMode); + CHECK_PROPERTY_CHANGE(PROP_SKYBOX_MODE, skyboxMode); + CHECK_PROPERTY_CHANGE(PROP_HAZE_MODE, hazeMode); + CHECK_PROPERTY_CHANGE(PROP_BLOOM_MODE, bloomMode); + + // Polyvox + CHECK_PROPERTY_CHANGE(PROP_VOXEL_VOLUME_SIZE, voxelVolumeSize); + CHECK_PROPERTY_CHANGE(PROP_VOXEL_DATA, voxelData); + CHECK_PROPERTY_CHANGE(PROP_VOXEL_SURFACE_STYLE, voxelSurfaceStyle); + CHECK_PROPERTY_CHANGE(PROP_X_TEXTURE_URL, xTextureURL); + CHECK_PROPERTY_CHANGE(PROP_Y_TEXTURE_URL, yTextureURL); + CHECK_PROPERTY_CHANGE(PROP_Z_TEXTURE_URL, zTextureURL); + CHECK_PROPERTY_CHANGE(PROP_X_N_NEIGHBOR_ID, xNNeighborID); + CHECK_PROPERTY_CHANGE(PROP_Y_N_NEIGHBOR_ID, yNNeighborID); + CHECK_PROPERTY_CHANGE(PROP_Z_N_NEIGHBOR_ID, zNNeighborID); + CHECK_PROPERTY_CHANGE(PROP_X_P_NEIGHBOR_ID, xPNeighborID); + CHECK_PROPERTY_CHANGE(PROP_Y_P_NEIGHBOR_ID, yPNeighborID); + CHECK_PROPERTY_CHANGE(PROP_Z_P_NEIGHBOR_ID, zPNeighborID); + + // Web + CHECK_PROPERTY_CHANGE(PROP_SOURCE_URL, sourceUrl); + CHECK_PROPERTY_CHANGE(PROP_DPI, dpi); + + // Polyline + CHECK_PROPERTY_CHANGE(PROP_LINE_POINTS, linePoints); + CHECK_PROPERTY_CHANGE(PROP_STROKE_WIDTHS, strokeWidths); + CHECK_PROPERTY_CHANGE(PROP_STROKE_NORMALS, normals); + CHECK_PROPERTY_CHANGE(PROP_STROKE_COLORS, strokeColors); + CHECK_PROPERTY_CHANGE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); + CHECK_PROPERTY_CHANGE(PROP_LINE_GLOW, glow); + CHECK_PROPERTY_CHANGE(PROP_LINE_FACE_CAMERA, faceCamera); + + // Shape + CHECK_PROPERTY_CHANGE(PROP_SHAPE, shape); + + // Material CHECK_PROPERTY_CHANGE(PROP_MATERIAL_URL, materialURL); CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_MODE, materialMappingMode); CHECK_PROPERTY_CHANGE(PROP_MATERIAL_PRIORITY, priority); @@ -423,29 +523,18 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_MATERIAL_MAPPING_ROT, materialMappingRot); CHECK_PROPERTY_CHANGE(PROP_MATERIAL_DATA, materialData); CHECK_PROPERTY_CHANGE(PROP_MATERIAL_REPEAT, materialRepeat); - CHECK_PROPERTY_CHANGE(PROP_VISIBLE_IN_SECONDARY_CAMERA, isVisibleInSecondaryCamera); - CHECK_PROPERTY_CHANGE(PROP_PARTICLE_SPIN, particleSpin); - CHECK_PROPERTY_CHANGE(PROP_SPIN_SPREAD, spinSpread); - CHECK_PROPERTY_CHANGE(PROP_SPIN_START, spinStart); - CHECK_PROPERTY_CHANGE(PROP_SPIN_FINISH, spinFinish); - CHECK_PROPERTY_CHANGE(PROP_PARTICLE_ROTATE_WITH_ENTITY, rotateWithEntity); + // Image CHECK_PROPERTY_CHANGE(PROP_IMAGE_URL, imageURL); CHECK_PROPERTY_CHANGE(PROP_EMISSIVE, emissive); CHECK_PROPERTY_CHANGE(PROP_KEEP_ASPECT_RATIO, keepAspectRatio); CHECK_PROPERTY_CHANGE(PROP_SUB_IMAGE, subImage); + // Grid CHECK_PROPERTY_CHANGE(PROP_GRID_FOLLOW_CAMERA, followCamera); CHECK_PROPERTY_CHANGE(PROP_MAJOR_GRID_EVERY, majorGridEvery); CHECK_PROPERTY_CHANGE(PROP_MINOR_GRID_EVERY, minorGridEvery); - CHECK_PROPERTY_CHANGE(PROP_TEXT_ALPHA, textAlpha); - CHECK_PROPERTY_CHANGE(PROP_BACKGROUND_ALPHA, backgroundAlpha); - CHECK_PROPERTY_CHANGE(PROP_LEFT_MARGIN, leftMargin); - CHECK_PROPERTY_CHANGE(PROP_RIGHT_MARGIN, rightMargin); - CHECK_PROPERTY_CHANGE(PROP_TOP_MARGIN, topMargin); - CHECK_PROPERTY_CHANGE(PROP_BOTTOM_MARGIN, bottomMargin); - // Certifiable Properties CHECK_PROPERTY_CHANGE(PROP_ITEM_NAME, itemName); CHECK_PROPERTY_CHANGE(PROP_ITEM_DESCRIPTION, itemDescription); @@ -459,76 +548,13 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_CERTIFICATE_ID, certificateID); CHECK_PROPERTY_CHANGE(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion); - CHECK_PROPERTY_CHANGE(PROP_NAME, name); - - CHECK_PROPERTY_CHANGE(PROP_HAZE_MODE, hazeMode); - CHECK_PROPERTY_CHANGE(PROP_KEY_LIGHT_MODE, keyLightMode); - CHECK_PROPERTY_CHANGE(PROP_AMBIENT_LIGHT_MODE, ambientLightMode); - CHECK_PROPERTY_CHANGE(PROP_SKYBOX_MODE, skyboxMode); - CHECK_PROPERTY_CHANGE(PROP_BLOOM_MODE, bloomMode); - - CHECK_PROPERTY_CHANGE(PROP_SOURCE_URL, sourceUrl); - CHECK_PROPERTY_CHANGE(PROP_VOXEL_VOLUME_SIZE, voxelVolumeSize); - CHECK_PROPERTY_CHANGE(PROP_VOXEL_DATA, voxelData); - CHECK_PROPERTY_CHANGE(PROP_VOXEL_SURFACE_STYLE, voxelSurfaceStyle); - CHECK_PROPERTY_CHANGE(PROP_LINE_WIDTH, lineWidth); - CHECK_PROPERTY_CHANGE(PROP_LINE_POINTS, linePoints); - CHECK_PROPERTY_CHANGE(PROP_HREF, href); - CHECK_PROPERTY_CHANGE(PROP_DESCRIPTION, description); - CHECK_PROPERTY_CHANGE(PROP_BILLBOARD_MODE, billboardMode); - CHECK_PROPERTY_CHANGE(PROP_ACTION_DATA, actionData); - CHECK_PROPERTY_CHANGE(PROP_NORMALS, normals); - CHECK_PROPERTY_CHANGE(PROP_STROKE_COLORS, strokeColors); - CHECK_PROPERTY_CHANGE(PROP_STROKE_WIDTHS, strokeWidths); - CHECK_PROPERTY_CHANGE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); - CHECK_PROPERTY_CHANGE(PROP_X_TEXTURE_URL, xTextureURL); - CHECK_PROPERTY_CHANGE(PROP_Y_TEXTURE_URL, yTextureURL); - CHECK_PROPERTY_CHANGE(PROP_Z_TEXTURE_URL, zTextureURL); - CHECK_PROPERTY_CHANGE(PROP_X_N_NEIGHBOR_ID, xNNeighborID); - CHECK_PROPERTY_CHANGE(PROP_Y_N_NEIGHBOR_ID, yNNeighborID); - CHECK_PROPERTY_CHANGE(PROP_Z_N_NEIGHBOR_ID, zNNeighborID); - CHECK_PROPERTY_CHANGE(PROP_X_P_NEIGHBOR_ID, xPNeighborID); - CHECK_PROPERTY_CHANGE(PROP_Y_P_NEIGHBOR_ID, yPNeighborID); - CHECK_PROPERTY_CHANGE(PROP_Z_P_NEIGHBOR_ID, zPNeighborID); - CHECK_PROPERTY_CHANGE(PROP_PARENT_ID, parentID); - CHECK_PROPERTY_CHANGE(PROP_PARENT_JOINT_INDEX, parentJointIndex); - CHECK_PROPERTY_CHANGE(PROP_JOINT_ROTATIONS_SET, jointRotationsSet); - CHECK_PROPERTY_CHANGE(PROP_JOINT_ROTATIONS, jointRotations); - CHECK_PROPERTY_CHANGE(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet); - CHECK_PROPERTY_CHANGE(PROP_JOINT_TRANSLATIONS, jointTranslations); - CHECK_PROPERTY_CHANGE(PROP_QUERY_AA_CUBE, queryAACube); + // Location data for scripts CHECK_PROPERTY_CHANGE(PROP_LOCAL_POSITION, localPosition); CHECK_PROPERTY_CHANGE(PROP_LOCAL_ROTATION, localRotation); CHECK_PROPERTY_CHANGE(PROP_LOCAL_VELOCITY, localVelocity); CHECK_PROPERTY_CHANGE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity); CHECK_PROPERTY_CHANGE(PROP_LOCAL_DIMENSIONS, localDimensions); - CHECK_PROPERTY_CHANGE(PROP_FLYING_ALLOWED, flyingAllowed); - CHECK_PROPERTY_CHANGE(PROP_GHOSTING_ALLOWED, ghostingAllowed); - CHECK_PROPERTY_CHANGE(PROP_FILTER_URL, filterURL); - - CHECK_PROPERTY_CHANGE(PROP_ENTITY_HOST_TYPE, entityHostType); - CHECK_PROPERTY_CHANGE(PROP_OWNING_AVATAR_ID, owningAvatarID); - - CHECK_PROPERTY_CHANGE(PROP_SHAPE, shape); - CHECK_PROPERTY_CHANGE(PROP_DPI, dpi); - CHECK_PROPERTY_CHANGE(PROP_RELAY_PARENT_JOINTS, relayParentJoints); - - CHECK_PROPERTY_CHANGE(PROP_CLONEABLE, cloneable); - CHECK_PROPERTY_CHANGE(PROP_CLONE_LIFETIME, cloneLifetime); - CHECK_PROPERTY_CHANGE(PROP_CLONE_LIMIT, cloneLimit); - CHECK_PROPERTY_CHANGE(PROP_CLONE_DYNAMIC, cloneDynamic); - CHECK_PROPERTY_CHANGE(PROP_CLONE_AVATAR_ENTITY, cloneAvatarEntity); - CHECK_PROPERTY_CHANGE(PROP_CLONE_ORIGIN_ID, cloneOriginID); - - changedProperties += _animation.getChangedProperties(); - changedProperties += _keyLight.getChangedProperties(); - changedProperties += _ambientLight.getChangedProperties(); - changedProperties += _skybox.getChangedProperties(); - changedProperties += _haze.getChangedProperties(); - changedProperties += _bloom.getChangedProperties(); - changedProperties += _grab.getChangedProperties(); - return changedProperties; } @@ -622,16 +648,14 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * mass in the application of physics. * * @property {boolean} collisionless=false - Whether or not the entity should collide with items per its - * collisionMask property. If true then the entity does not collide. - * @property {boolean} ignoreForCollisions=false - Synonym for collisionless. + * collisionMask property. If true then the entity does not collide. A synonym is ignoreForCollisions. * @property {Entities.CollisionMask} collisionMask=31 - What types of items the entity should collide with. * @property {string} collidesWith="static,dynamic,kinematic,myAvatar,otherAvatar," - Synonym for collisionMask, * in text format. * @property {string} collisionSoundURL="" - The sound to play when the entity experiences a collision. Valid file formats are * as per the {@link SoundCache} object. * @property {boolean} dynamic=false - Whether or not the entity should be affected by collisions. If true then - * the entity's movement is affected by collisions. - * @property {boolean} collisionsWillMove=false - Synonym for dynamic. + * the entity's movement is affected by collisions. A synonym is collisionsWillMove. * * @property {string} href="" - A "hifi://" metaverse address that a user is taken to when they click on the entity. * @property {string} description="" - A description of the href property value. @@ -677,8 +701,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * is typically not used in scripts directly; rather, functions that manipulate an entity's actions update it. * The size of this property increases with the number of actions. Because this property value has to fit within a High * Fidelity datagram packet there is a limit to the number of actions that an entity can have, and edits which would result - * in overflow are rejected. - * Read-only. + * in overflow are rejected. Read-only. * @property {Entities.RenderInfo} renderInfo - Information on the cost of rendering the entity. Currently information is only * provided for Model entities. Read-only. * @@ -718,7 +741,6 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @see {@link Entities.EntityProperties-Image|EntityProperties-Image} * @see {@link Entities.EntityProperties-Web|EntityProperties-Web} * @see {@link Entities.EntityProperties-ParticleEffect|EntityProperties-ParticleEffect} - * @see {@link Entities.EntityProperties-Line|EntityProperties-Line} * @see {@link Entities.EntityProperties-PolyLine|EntityProperties-PolyLine} * @see {@link Entities.EntityProperties-PolyVox|EntityProperties-PolyVox} * @see {@link Entities.EntityProperties-Grid|EntityProperties-Grid} @@ -764,34 +786,6 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * }); */ -/**jsdoc - * The "Line" {@link Entities.EntityType|EntityType} draws thin, straight lines between a sequence of two or more - * points. - * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. - * @typedef {object} Entities.EntityProperties-Line - * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. Must be sufficient to contain all the - * linePoints. - * @property {Vec3[]} linePoints=[]] - The sequence of points to draw lines between. The values are relative to the entity's - * position. A maximum of 70 points can be specified. The property's value is set only if all the linePoints - * lie within the entity's dimensions. - * @property {number} lineWidth=2 - Currently not used. - * @property {Color} color=255,255,255 - The color of the line. - * @example Draw lines in a "V". - * var entity = Entities.addEntity({ - * type: "Line", - * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), - * rotation: MyAvatar.orientation, - * dimensions: { x: 2, y: 2, z: 1 }, - * linePoints: [ - * { x: -1, y: 1, z: 0 }, - * { x: 0, y: -1, z: 0 }, - * { x: 1, y: 1, z: 0 }, - * ], - * color: { red: 255, green: 0, blue: 0 }, - * lifetime: 300 // Delete after 5 minutes. - * }); - */ - /**jsdoc * The "Material" {@link Entities.EntityType|EntityType} modifies the existing materials on * {@link Entities.EntityType|Model} entities, {@link Entities.EntityType|Shape} entities (albedo only), @@ -875,22 +869,22 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * * @property {Entities.AnimationProperties} animation - An animation to play on the model. * - * @property {Quat[]} jointRotations=[]] - Joint rotations applied to the model; [] if none are applied or the + * @property {Quat[]} jointRotations=[] - Joint rotations applied to the model; [] if none are applied or the * model hasn't loaded. The array indexes are per {@link Entities.getJointIndex|getJointIndex}. Rotations are relative to * each joint's parent.
* Joint rotations can be set by {@link Entities.setLocalJointRotation|setLocalJointRotation} and similar functions, or by * setting the value of this property. If you set a joint rotation using this property you also need to set the * corresponding jointRotationsSet value to true. - * @property {boolean[]} jointRotationsSet=[]] - true values for joints that have had rotations applied, + * @property {boolean[]} jointRotationsSet=[] - true values for joints that have had rotations applied, * false otherwise; [] if none are applied or the model hasn't loaded. The array indexes are per * {@link Entities.getJointIndex|getJointIndex}. - * @property {Vec3[]} jointTranslations=[]] - Joint translations applied to the model; [] if none are applied or + * @property {Vec3[]} jointTranslations=[] - Joint translations applied to the model; [] if none are applied or * the model hasn't loaded. The array indexes are per {@link Entities.getJointIndex|getJointIndex}. Rotations are relative * to each joint's parent.
* Joint translations can be set by {@link Entities.setLocalJointTranslation|setLocalJointTranslation} and similar * functions, or by setting the value of this property. If you set a joint translation using this property you also need to * set the corresponding jointTranslationsSet value to true. - * @property {boolean[]} jointTranslationsSet=[]] - true values for joints that have had translations applied, + * @property {boolean[]} jointTranslationsSet=[] - true values for joints that have had translations applied, * false otherwise; [] if none are applied or the model hasn't loaded. The array indexes are per * {@link Entities.getJointIndex|getJointIndex}. * @property {boolean} relayParentJoints=false - If true and the entity is parented to an avatar, then the @@ -1018,20 +1012,21 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @typedef {object} Entities.EntityProperties-PolyLine * @property {Vec3} dimensions=1,1,1 - The dimensions of the entity, i.e., the size of the bounding box that contains the * lines drawn. - * @property {Vec3[]} linePoints=[]] - The sequence of points to draw lines between. The values are relative to the entity's + * @property {Vec3[]} linePoints=[] - The sequence of points to draw lines between. The values are relative to the entity's * position. A maximum of 70 points can be specified. Must be specified in order for the entity to render. - * @property {Vec3[]} normals=[]] - The normal vectors for the line's surface at the linePoints. The values are + * @property {Vec3[]} normals=[] - The normal vectors for the line's surface at the linePoints. The values are * relative to the entity's orientation. Must be specified in order for the entity to render. - * @property {number[]} strokeWidths=[]] - The widths, in m, of the line at the linePoints. Must be specified in + * @property {number[]} strokeWidths=[] - The widths, in m, of the line at the linePoints. Must be specified in * order for the entity to render. - * @property {number} lineWidth=2 - Currently not used.
- * @property {Vec3[]} strokeColors=[]] - Currently not used. + * @property {Vec3[]} strokeColors=[] - Currently not used. * @property {Color} color=255,255,255 - The base color of the line, which is multiplied with the color of the texture for * rendering. * @property {string} textures="" - The URL of a JPG or PNG texture to use for the lines. If you want transparency, use PNG * format. * @property {boolean} isUVModeStretch=true - If true, the texture is stretched to fill the whole line, otherwise * the texture repeats along the line. + * @property {bool} glow=false - If true, the alpha of the strokes will drop off farther from the center. + * @property {bool} faceCamera=false - If true, each line segment will rotate to face the camera. * @example Draw a textured "V". * var entity = Entities.addEntity({ * type: "PolyLine", @@ -1353,7 +1348,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool created.setTimeSpec(Qt::OffsetFromUTC); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_ALWAYS(created, created.toString(Qt::ISODate)); } - if ((!skipDefaults || _lifetime != defaultEntityProperties._lifetime) && !strictSemantics) { if (!psuedoPropertyFlagsActive || psueudoPropertyFlags.test(EntityPsuedoPropertyFlag::Age)) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(age, getAge()); // gettable, but not settable @@ -1362,62 +1356,68 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(ageAsText, formatSecondsElapsed(getAge())); // gettable, but not settable } } - if (!psuedoPropertyFlagsActive || psueudoPropertyFlags.test(EntityPsuedoPropertyFlag::LastEdited)) { properties.setProperty("lastEdited", convertScriptValue(engine, _lastEdited)); } - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LAST_EDITED_BY, lastEditedBy); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_POSITION, position); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DIMENSIONS, dimensions); if (!skipDefaults) { COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DIMENSIONS, naturalDimensions); // gettable, but not settable COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_POSITION, naturalPosition); } + + // Core properties + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE, visible); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NAME, name); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCKED, locked); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_USER_DATA, userData); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_HREF, href); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DESCRIPTION, description); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_POSITION, position); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DIMENSIONS, dimensions); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ROTATION, rotation); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_REGISTRATION_POINT, registrationPoint); + //COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CREATED, created); // handled above + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LAST_EDITED_BY, lastEditedBy); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ENTITY_HOST_TYPE, entityHostType, getEntityHostTypeAsString()); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_OWNING_AVATAR_ID, owningAvatarID); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_ID, parentID); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_JOINT_INDEX, parentJointIndex); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_QUERY_AA_CUBE, queryAACube); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CAN_CAST_SHADOW, canCastShadow); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE_IN_SECONDARY_CAMERA, isVisibleInSecondaryCamera); + _grab.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); + + // Physics + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DENSITY, density); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VELOCITY, velocity); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_VELOCITY, angularVelocity); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_GRAVITY, gravity); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ACCELERATION, acceleration); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DAMPING, damping); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_DAMPING, angularDamping); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RESTITUTION, restitution); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FRICTION, friction); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DENSITY, density); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LIFETIME, lifetime); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SCRIPT, script); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SCRIPT_TIMESTAMP, scriptTimestamp); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SERVER_SCRIPTS, serverScripts); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_REGISTRATION_POINT, registrationPoint); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_VELOCITY, angularVelocity); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_DAMPING, angularDamping); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE, visible); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CAN_CAST_SHADOW, canCastShadow); // Relevant to Shape and Model entities only. COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISIONLESS, collisionless); COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_COLLISIONLESS, collisionless, ignoreForCollisions, getCollisionless()); // legacy support COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_MASK, collisionMask); COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_COLLISION_MASK, collisionMask, collidesWith, getCollisionMaskAsString()); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DYNAMIC, dynamic); COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_DYNAMIC, dynamic, collisionsWillMove, getDynamic()); // legacy support - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_HREF, href); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DESCRIPTION, description); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ACTION_DATA, actionData); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCKED, locked); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_USER_DATA, userData); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE_IN_SECONDARY_CAMERA, isVisibleInSecondaryCamera); - - // Certifiable Properties - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_NAME, itemName); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_DESCRIPTION, itemDescription); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_CATEGORIES, itemCategories); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_ARTIST, itemArtist); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_LICENSE, itemLicense); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LIMITED_RUN, limitedRun); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MARKETPLACE_ID, marketplaceID); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EDITION_NUMBER, editionNumber); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CERTIFICATE_ID, certificateID); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion); - - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NAME, name); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_SOUND_URL, collisionSoundURL); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ACTION_DATA, actionData); + + // Cloning + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONEABLE, cloneable); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_LIFETIME, cloneLifetime); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_LIMIT, cloneLimit); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_DYNAMIC, cloneDynamic); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_AVATAR_ENTITY, cloneAvatarEntity); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_ORIGIN_ID, cloneOriginID); + + // Scripts + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SCRIPT, script); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SCRIPT_TIMESTAMP, scriptTimestamp); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SERVER_SCRIPTS, serverScripts); // Particles only if (_type == EntityTypes::ParticleEffect) { @@ -1569,23 +1569,17 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_Z_P_NEIGHBOR_ID, zPNeighborID); } - // Lines & PolyLines - if (_type == EntityTypes::Line) { - COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_WIDTH, lineWidth); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_POINTS, linePoints); - } - + // Polylines if (_type == EntityTypes::PolyLine) { COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_WIDTH, lineWidth); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_POINTS, linePoints); - - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NORMALS, normals); - COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_STROKE_COLORS, strokeColors, qVectorVec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_WIDTHS, strokeWidths); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_NORMALS, normals); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_STROKE_COLORS, strokeColors, qVectorVec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_GLOW, glow); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_FACE_CAMERA, faceCamera); } // Materials @@ -1631,6 +1625,26 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MINOR_GRID_EVERY, minorGridEvery); } + // Certifiable Properties + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_NAME, itemName); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_DESCRIPTION, itemDescription); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_CATEGORIES, itemCategories); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_ARTIST, itemArtist); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_LICENSE, itemLicense); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LIMITED_RUN, limitedRun); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MARKETPLACE_ID, marketplaceID); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EDITION_NUMBER, editionNumber); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CERTIFICATE_ID, certificateID); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion); + + // Local props for scripts + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_POSITION, localPosition); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ROTATION, localRotation); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_VELOCITY, localVelocity); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_DIMENSIONS, localDimensions); + /**jsdoc * The axis-aligned bounding box of an entity. * @typedef {object} Entities.BoundingBox @@ -1660,29 +1674,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(originalTextures, textureNamesStr); // gettable, but not settable } - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_ID, parentID); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_JOINT_INDEX, parentJointIndex); - - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_QUERY_AA_CUBE, queryAACube); - - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_POSITION, localPosition); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ROTATION, localRotation); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_VELOCITY, localVelocity); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_DIMENSIONS, localDimensions); - - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ENTITY_HOST_TYPE, entityHostType, getEntityHostTypeAsString()); // Gettable but not settable except at entity creation - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_OWNING_AVATAR_ID, owningAvatarID); // Gettable but not settable - - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONEABLE, cloneable); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_LIFETIME, cloneLifetime); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_LIMIT, cloneLimit); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_DYNAMIC, cloneDynamic); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_AVATAR_ENTITY, cloneAvatarEntity); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CLONE_ORIGIN_ID, cloneOriginID); - - _grab.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); - // Rendering info if (!skipDefaults && !strictSemantics && (!psuedoPropertyFlagsActive || psueudoPropertyFlags.test(EntityPsuedoPropertyFlag::RenderInfo))) { @@ -1737,56 +1728,80 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool setType(typeScriptValue.toVariant().toString()); } - COPY_PROPERTY_FROM_QSCRIPTVALUE(lastEditedBy, QUuid, setLastEditedBy); + if (!honorReadOnly) { + // this is used by the json reader to set things that we don't want javascript to able to affect. + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(created, QDateTime, setCreated, [this]() { + auto result = QDateTime::fromMSecsSinceEpoch(_created / 1000, Qt::UTC); // usec per msec + return result; + }); + // TODO: expose this to QScriptValue for JSON saves? + //COPY_PROPERTY_FROM_QSCRIPTVALUE(simulationOwner, ???, setSimulatorPriority); + } + + // Core + COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible); + COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName); + COPY_PROPERTY_FROM_QSCRIPTVALUE(locked, bool, setLocked); + COPY_PROPERTY_FROM_QSCRIPTVALUE(userData, QString, setUserData); + COPY_PROPERTY_FROM_QSCRIPTVALUE(href, QString, setHref); + COPY_PROPERTY_FROM_QSCRIPTVALUE(description, QString, setDescription); COPY_PROPERTY_FROM_QSCRIPTVALUE(position, vec3, setPosition); COPY_PROPERTY_FROM_QSCRIPTVALUE(dimensions, vec3, setDimensions); COPY_PROPERTY_FROM_QSCRIPTVALUE(rotation, quat, setRotation); + COPY_PROPERTY_FROM_QSCRIPTVALUE(registrationPoint, vec3, setRegistrationPoint); + // created is read only + COPY_PROPERTY_FROM_QSCRIPTVALUE(lastEditedBy, QUuid, setLastEditedBy); + COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(entityHostType, EntityHostType); + COPY_PROPERTY_FROM_QSCRIPTVALUE(owningAvatarID, QUuid, setOwningAvatarID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(parentID, QUuid, setParentID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(parentJointIndex, quint16, setParentJointIndex); + COPY_PROPERTY_FROM_QSCRIPTVALUE(queryAACube, AACube, setQueryAACube); // TODO: should scripts be able to set this? + COPY_PROPERTY_FROM_QSCRIPTVALUE(canCastShadow, bool, setCanCastShadow); + COPY_PROPERTY_FROM_QSCRIPTVALUE(isVisibleInSecondaryCamera, bool, setIsVisibleInSecondaryCamera); + _grab.copyFromScriptValue(object, _defaultSettings); + + // Physics COPY_PROPERTY_FROM_QSCRIPTVALUE(density, float, setDensity); COPY_PROPERTY_FROM_QSCRIPTVALUE(velocity, vec3, setVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(angularVelocity, vec3, setAngularVelocity); COPY_PROPERTY_FROM_QSCRIPTVALUE(gravity, vec3, setGravity); COPY_PROPERTY_FROM_QSCRIPTVALUE(acceleration, vec3, setAcceleration); COPY_PROPERTY_FROM_QSCRIPTVALUE(damping, float, setDamping); + COPY_PROPERTY_FROM_QSCRIPTVALUE(angularDamping, float, setAngularDamping); COPY_PROPERTY_FROM_QSCRIPTVALUE(restitution, float, setRestitution); COPY_PROPERTY_FROM_QSCRIPTVALUE(friction, float, setFriction); COPY_PROPERTY_FROM_QSCRIPTVALUE(lifetime, float, setLifetime); - COPY_PROPERTY_FROM_QSCRIPTVALUE(script, QString, setScript); - COPY_PROPERTY_FROM_QSCRIPTVALUE(scriptTimestamp, quint64, setScriptTimestamp); - COPY_PROPERTY_FROM_QSCRIPTVALUE(serverScripts, QString, setServerScripts); - COPY_PROPERTY_FROM_QSCRIPTVALUE(registrationPoint, vec3, setRegistrationPoint); - COPY_PROPERTY_FROM_QSCRIPTVALUE(angularVelocity, vec3, setAngularVelocity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(angularDamping, float, setAngularDamping); - COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible); - COPY_PROPERTY_FROM_QSCRIPTVALUE(canCastShadow, bool, setCanCastShadow); - COPY_PROPERTY_FROM_QSCRIPTVALUE(color, u8vec3Color, setColor); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, u8vec3Color, setColorSpread); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, vec3Color, setColorStart); - COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, vec3Color, setColorFinish); - COPY_PROPERTY_FROM_QSCRIPTVALUE(alpha, float, setAlpha); - COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaSpread, float, setAlphaSpread); - COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaStart, float, setAlphaStart); - COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaFinish, float, setAlphaFinish); - COPY_PROPERTY_FROM_QSCRIPTVALUE(emitterShouldTrail, bool, setEmitterShouldTrail); - COPY_PROPERTY_FROM_QSCRIPTVALUE(modelURL, QString, setModelURL); - COPY_PROPERTY_FROM_QSCRIPTVALUE(compoundShapeURL, QString, setCompoundShapeURL); COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionless, bool, setCollisionless); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(ignoreForCollisions, bool, setCollisionless, getCollisionless); // legacy support COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionMask, uint16_t, setCollisionMask); COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(collidesWith, CollisionMask); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(collisionsWillMove, bool, setDynamic, getDynamic); // legacy support COPY_PROPERTY_FROM_QSCRIPTVALUE(dynamic, bool, setDynamic); - COPY_PROPERTY_FROM_QSCRIPTVALUE(isSpotlight, bool, setIsSpotlight); - COPY_PROPERTY_FROM_QSCRIPTVALUE(intensity, float, setIntensity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(falloffRadius, float, setFalloffRadius); - COPY_PROPERTY_FROM_QSCRIPTVALUE(exponent, float, setExponent); - COPY_PROPERTY_FROM_QSCRIPTVALUE(cutoff, float, setCutoff); - COPY_PROPERTY_FROM_QSCRIPTVALUE(locked, bool, setLocked); - COPY_PROPERTY_FROM_QSCRIPTVALUE(textures, QString, setTextures); - COPY_PROPERTY_FROM_QSCRIPTVALUE(userData, QString, setUserData); - COPY_PROPERTY_FROM_QSCRIPTVALUE(text, QString, setText); - COPY_PROPERTY_FROM_QSCRIPTVALUE(lineHeight, float, setLineHeight); - COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, u8vec3Color, setTextColor); - COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, u8vec3Color, setBackgroundColor); + // simulationOwner is read only + COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionSoundURL, QString, setCollisionSoundURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE(actionData, QByteArray, setActionData); // TODO: should scripts be able to set this? + + // Cloning + COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneable, bool, setCloneable); + COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneLifetime, float, setCloneLifetime); + COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneLimit, float, setCloneLimit); + COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneDynamic, bool, setCloneDynamic); + COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneAvatarEntity, bool, setCloneAvatarEntity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneOriginID, QUuid, setCloneOriginID); + + // Scripts + COPY_PROPERTY_FROM_QSCRIPTVALUE(script, QString, setScript); + COPY_PROPERTY_FROM_QSCRIPTVALUE(scriptTimestamp, quint64, setScriptTimestamp); + COPY_PROPERTY_FROM_QSCRIPTVALUE(serverScripts, QString, setServerScripts); + + // Common COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(shapeType, ShapeType); + COPY_PROPERTY_FROM_QSCRIPTVALUE(compoundShapeURL, QString, setCompoundShapeURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE(color, u8vec3Color, setColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(alpha, float, setAlpha); + COPY_PROPERTY_FROM_QSCRIPTVALUE(textures, QString, setTextures); + + // Particles COPY_PROPERTY_FROM_QSCRIPTVALUE(maxParticles, quint32, setMaxParticles); COPY_PROPERTY_FROM_QSCRIPTVALUE(lifespan, float, setLifespan); COPY_PROPERTY_FROM_QSCRIPTVALUE(isEmitting, bool, setIsEmitting); @@ -1796,17 +1811,104 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(emitOrientation, quat, setEmitOrientation); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitDimensions, vec3, setEmitDimensions); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitRadiusStart, float, setEmitRadiusStart); + COPY_PROPERTY_FROM_QSCRIPTVALUE(emitAcceleration, vec3, setEmitAcceleration); + COPY_PROPERTY_FROM_QSCRIPTVALUE(accelerationSpread, vec3, setAccelerationSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(polarStart, float, setPolarStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(polarFinish, float, setPolarFinish); COPY_PROPERTY_FROM_QSCRIPTVALUE(azimuthStart, float, setAzimuthStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(azimuthFinish, float, setAzimuthFinish); - COPY_PROPERTY_FROM_QSCRIPTVALUE(emitAcceleration, vec3, setEmitAcceleration); - COPY_PROPERTY_FROM_QSCRIPTVALUE(accelerationSpread, vec3, setAccelerationSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(particleRadius, float, setParticleRadius); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusSpread, float, setRadiusSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusStart, float, setRadiusStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusFinish, float, setRadiusFinish); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorSpread, u8vec3Color, setColorSpread); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorStart, vec3Color, setColorStart); + COPY_PROPERTY_FROM_QSCRIPTVALUE(colorFinish, vec3Color, setColorFinish); + COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaSpread, float, setAlphaSpread); + COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaStart, float, setAlphaStart); + COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaFinish, float, setAlphaFinish); + COPY_PROPERTY_FROM_QSCRIPTVALUE(emitterShouldTrail, bool, setEmitterShouldTrail); + COPY_PROPERTY_FROM_QSCRIPTVALUE(particleSpin, float, setParticleSpin); + COPY_PROPERTY_FROM_QSCRIPTVALUE(spinSpread, float, setSpinSpread); + COPY_PROPERTY_FROM_QSCRIPTVALUE(spinStart, float, setSpinStart); + COPY_PROPERTY_FROM_QSCRIPTVALUE(spinFinish, float, setSpinFinish); + COPY_PROPERTY_FROM_QSCRIPTVALUE(rotateWithEntity, bool, setRotateWithEntity); + + // Model + COPY_PROPERTY_FROM_QSCRIPTVALUE(modelURL, QString, setModelURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotationsSet, qVectorBool, setJointRotationsSet); + COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotations, qVectorQuat, setJointRotations); + COPY_PROPERTY_FROM_QSCRIPTVALUE(jointTranslationsSet, qVectorBool, setJointTranslationsSet); + COPY_PROPERTY_FROM_QSCRIPTVALUE(jointTranslations, qVectorVec3, setJointTranslations); COPY_PROPERTY_FROM_QSCRIPTVALUE(relayParentJoints, bool, setRelayParentJoints); + _animation.copyFromScriptValue(object, _defaultSettings); + + // Light + COPY_PROPERTY_FROM_QSCRIPTVALUE(isSpotlight, bool, setIsSpotlight); + COPY_PROPERTY_FROM_QSCRIPTVALUE(intensity, float, setIntensity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(exponent, float, setExponent); + COPY_PROPERTY_FROM_QSCRIPTVALUE(cutoff, float, setCutoff); + COPY_PROPERTY_FROM_QSCRIPTVALUE(falloffRadius, float, setFalloffRadius); + + // Text + COPY_PROPERTY_FROM_QSCRIPTVALUE(text, QString, setText); + COPY_PROPERTY_FROM_QSCRIPTVALUE(lineHeight, float, setLineHeight); + COPY_PROPERTY_FROM_QSCRIPTVALUE(textColor, u8vec3Color, setTextColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(textAlpha, float, setTextAlpha); + COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundColor, u8vec3Color, setBackgroundColor); + COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundAlpha, float, setBackgroundAlpha); + COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(billboardMode, BillboardMode); + COPY_PROPERTY_FROM_QSCRIPTVALUE(leftMargin, float, setLeftMargin); + COPY_PROPERTY_FROM_QSCRIPTVALUE(rightMargin, float, setRightMargin); + COPY_PROPERTY_FROM_QSCRIPTVALUE(topMargin, float, setTopMargin); + COPY_PROPERTY_FROM_QSCRIPTVALUE(bottomMargin, float, setBottomMargin); + + // Zone + _keyLight.copyFromScriptValue(object, _defaultSettings); + _ambientLight.copyFromScriptValue(object, _defaultSettings); + _skybox.copyFromScriptValue(object, _defaultSettings); + _haze.copyFromScriptValue(object, _defaultSettings); + _bloom.copyFromScriptValue(object, _defaultSettings); + COPY_PROPERTY_FROM_QSCRIPTVALUE(flyingAllowed, bool, setFlyingAllowed); + COPY_PROPERTY_FROM_QSCRIPTVALUE(ghostingAllowed, bool, setGhostingAllowed); + COPY_PROPERTY_FROM_QSCRIPTVALUE(filterURL, QString, setFilterURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(keyLightMode, KeyLightMode); + COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(ambientLightMode, AmbientLightMode); + COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(skyboxMode, SkyboxMode); + COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(hazeMode, HazeMode); + COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(bloomMode, BloomMode); + + // Polyvox + COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelVolumeSize, vec3, setVoxelVolumeSize); + COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelData, QByteArray, setVoxelData); + COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelSurfaceStyle, uint16_t, setVoxelSurfaceStyle); + COPY_PROPERTY_FROM_QSCRIPTVALUE(xTextureURL, QString, setXTextureURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE(yTextureURL, QString, setYTextureURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE(zTextureURL, QString, setZTextureURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE(xNNeighborID, EntityItemID, setXNNeighborID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(yNNeighborID, EntityItemID, setYNNeighborID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(zNNeighborID, EntityItemID, setZNNeighborID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(xPNeighborID, EntityItemID, setXPNeighborID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(yPNeighborID, EntityItemID, setYPNeighborID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(zPNeighborID, EntityItemID, setZPNeighborID); + + // Web + COPY_PROPERTY_FROM_QSCRIPTVALUE(sourceUrl, QString, setSourceUrl); + COPY_PROPERTY_FROM_QSCRIPTVALUE(dpi, uint16_t, setDPI); + + // Polyline + COPY_PROPERTY_FROM_QSCRIPTVALUE(linePoints, qVectorVec3, setLinePoints); + COPY_PROPERTY_FROM_QSCRIPTVALUE(strokeWidths, qVectorFloat, setStrokeWidths); + COPY_PROPERTY_FROM_QSCRIPTVALUE(normals, qVectorVec3, setNormals); + COPY_PROPERTY_FROM_QSCRIPTVALUE(strokeColors, qVectorVec3, setStrokeColors); + COPY_PROPERTY_FROM_QSCRIPTVALUE(isUVModeStretch, bool, setIsUVModeStretch); + COPY_PROPERTY_FROM_QSCRIPTVALUE(glow, bool, setGlow); + COPY_PROPERTY_FROM_QSCRIPTVALUE(faceCamera, bool, setFaceCamera); + + // Shape + COPY_PROPERTY_FROM_QSCRIPTVALUE(shape, QString, setShape); + + // Material COPY_PROPERTY_FROM_QSCRIPTVALUE(materialURL, QString, setMaterialURL); COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(materialMappingMode, MaterialMappingMode); COPY_PROPERTY_FROM_QSCRIPTVALUE(priority, quint16, setPriority); @@ -1816,12 +1918,17 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMappingRot, float, setMaterialMappingRot); COPY_PROPERTY_FROM_QSCRIPTVALUE(materialData, QString, setMaterialData); COPY_PROPERTY_FROM_QSCRIPTVALUE(materialRepeat, bool, setMaterialRepeat); - COPY_PROPERTY_FROM_QSCRIPTVALUE(isVisibleInSecondaryCamera, bool, setIsVisibleInSecondaryCamera); - COPY_PROPERTY_FROM_QSCRIPTVALUE(particleSpin, float, setParticleSpin); - COPY_PROPERTY_FROM_QSCRIPTVALUE(spinSpread, float, setSpinSpread); - COPY_PROPERTY_FROM_QSCRIPTVALUE(spinStart, float, setSpinStart); - COPY_PROPERTY_FROM_QSCRIPTVALUE(spinFinish, float, setSpinFinish); - COPY_PROPERTY_FROM_QSCRIPTVALUE(rotateWithEntity, bool, setRotateWithEntity); + + // Image + COPY_PROPERTY_FROM_QSCRIPTVALUE(imageURL, QString, setImageURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE(emissive, bool, setEmissive); + COPY_PROPERTY_FROM_QSCRIPTVALUE(keepAspectRatio, bool, setKeepAspectRatio); + COPY_PROPERTY_FROM_QSCRIPTVALUE(subImage, QRect, setSubImage); + + // Grid + COPY_PROPERTY_FROM_QSCRIPTVALUE(followCamera, bool, setFollowCamera); + COPY_PROPERTY_FROM_QSCRIPTVALUE(majorGridEvery, uint32_t, setMajorGridEvery); + COPY_PROPERTY_FROM_QSCRIPTVALUE(minorGridEvery, float, setMinorGridEvery); // Certifiable Properties COPY_PROPERTY_FROM_QSCRIPTVALUE(itemName, QString, setItemName); @@ -1836,108 +1943,13 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(certificateID, QString, setCertificateID); COPY_PROPERTY_FROM_QSCRIPTVALUE(staticCertificateVersion, quint32, setStaticCertificateVersion); - COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName); - COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionSoundURL, QString, setCollisionSoundURL); - - COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(hazeMode, HazeMode); - COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(keyLightMode, KeyLightMode); - COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(ambientLightMode, AmbientLightMode); - COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(skyboxMode, SkyboxMode); - COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(bloomMode, BloomMode); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(sourceUrl, QString, setSourceUrl); - COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelVolumeSize, vec3, setVoxelVolumeSize); - COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelData, QByteArray, setVoxelData); - COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelSurfaceStyle, uint16_t, setVoxelSurfaceStyle); - COPY_PROPERTY_FROM_QSCRIPTVALUE(lineWidth, float, setLineWidth); - COPY_PROPERTY_FROM_QSCRIPTVALUE(linePoints, qVectorVec3, setLinePoints); - COPY_PROPERTY_FROM_QSCRIPTVALUE(href, QString, setHref); - COPY_PROPERTY_FROM_QSCRIPTVALUE(description, QString, setDescription); - COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(billboardMode, BillboardMode); - COPY_PROPERTY_FROM_QSCRIPTVALUE(actionData, QByteArray, setActionData); - COPY_PROPERTY_FROM_QSCRIPTVALUE(normals, qVectorVec3, setNormals); - COPY_PROPERTY_FROM_QSCRIPTVALUE(strokeColors, qVectorVec3, setStrokeColors); - COPY_PROPERTY_FROM_QSCRIPTVALUE(strokeWidths, qVectorFloat, setStrokeWidths); - COPY_PROPERTY_FROM_QSCRIPTVALUE(isUVModeStretch, bool, setIsUVModeStretch); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(imageURL, QString, setImageURL); - COPY_PROPERTY_FROM_QSCRIPTVALUE(emissive, bool, setEmissive); - COPY_PROPERTY_FROM_QSCRIPTVALUE(keepAspectRatio, bool, setKeepAspectRatio); - COPY_PROPERTY_FROM_QSCRIPTVALUE(subImage, QRect, setSubImage); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(followCamera, bool, setFollowCamera); - COPY_PROPERTY_FROM_QSCRIPTVALUE(majorGridEvery, uint32_t, setMajorGridEvery); - COPY_PROPERTY_FROM_QSCRIPTVALUE(minorGridEvery, float, setMinorGridEvery); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(textAlpha, float, setTextAlpha); - COPY_PROPERTY_FROM_QSCRIPTVALUE(backgroundAlpha, float, setBackgroundAlpha); - COPY_PROPERTY_FROM_QSCRIPTVALUE(leftMargin, float, setLeftMargin); - COPY_PROPERTY_FROM_QSCRIPTVALUE(rightMargin, float, setRightMargin); - COPY_PROPERTY_FROM_QSCRIPTVALUE(topMargin, float, setTopMargin); - COPY_PROPERTY_FROM_QSCRIPTVALUE(bottomMargin, float, setBottomMargin); - - if (!honorReadOnly) { - // this is used by the json reader to set things that we don't want javascript to able to affect. - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(created, QDateTime, setCreated, [this]() { - auto result = QDateTime::fromMSecsSinceEpoch(_created / 1000, Qt::UTC); // usec per msec - return result; - }); - // TODO: expose this to QScriptValue for JSON saves? - //COPY_PROPERTY_FROM_QSCRIPTVALUE(simulationOwner, ???, setSimulatorPriority); - } - - _animation.copyFromScriptValue(object, _defaultSettings); - _keyLight.copyFromScriptValue(object, _defaultSettings); - _ambientLight.copyFromScriptValue(object, _defaultSettings); - _skybox.copyFromScriptValue(object, _defaultSettings); - _haze.copyFromScriptValue(object, _defaultSettings); - _bloom.copyFromScriptValue(object, _defaultSettings); - _grab.copyFromScriptValue(object, _defaultSettings); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(xTextureURL, QString, setXTextureURL); - COPY_PROPERTY_FROM_QSCRIPTVALUE(yTextureURL, QString, setYTextureURL); - COPY_PROPERTY_FROM_QSCRIPTVALUE(zTextureURL, QString, setZTextureURL); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(xNNeighborID, EntityItemID, setXNNeighborID); - COPY_PROPERTY_FROM_QSCRIPTVALUE(yNNeighborID, EntityItemID, setYNNeighborID); - COPY_PROPERTY_FROM_QSCRIPTVALUE(zNNeighborID, EntityItemID, setZNNeighborID); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(xPNeighborID, EntityItemID, setXPNeighborID); - COPY_PROPERTY_FROM_QSCRIPTVALUE(yPNeighborID, EntityItemID, setYPNeighborID); - COPY_PROPERTY_FROM_QSCRIPTVALUE(zPNeighborID, EntityItemID, setZPNeighborID); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(parentID, QUuid, setParentID); - COPY_PROPERTY_FROM_QSCRIPTVALUE(parentJointIndex, quint16, setParentJointIndex); - COPY_PROPERTY_FROM_QSCRIPTVALUE(queryAACube, AACube, setQueryAACube); - + // Script location data COPY_PROPERTY_FROM_QSCRIPTVALUE(localPosition, vec3, setLocalPosition); COPY_PROPERTY_FROM_QSCRIPTVALUE(localRotation, quat, setLocalRotation); COPY_PROPERTY_FROM_QSCRIPTVALUE(localVelocity, vec3, setLocalVelocity); COPY_PROPERTY_FROM_QSCRIPTVALUE(localAngularVelocity, vec3, setLocalAngularVelocity); COPY_PROPERTY_FROM_QSCRIPTVALUE(localDimensions, vec3, setLocalDimensions); - COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotationsSet, qVectorBool, setJointRotationsSet); - COPY_PROPERTY_FROM_QSCRIPTVALUE(jointRotations, qVectorQuat, setJointRotations); - COPY_PROPERTY_FROM_QSCRIPTVALUE(jointTranslationsSet, qVectorBool, setJointTranslationsSet); - COPY_PROPERTY_FROM_QSCRIPTVALUE(jointTranslations, qVectorVec3, setJointTranslations); - COPY_PROPERTY_FROM_QSCRIPTVALUE(shape, QString, setShape); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(flyingAllowed, bool, setFlyingAllowed); - COPY_PROPERTY_FROM_QSCRIPTVALUE(ghostingAllowed, bool, setGhostingAllowed); - COPY_PROPERTY_FROM_QSCRIPTVALUE(filterURL, QString, setFilterURL); - - COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(entityHostType, EntityHostType); - COPY_PROPERTY_FROM_QSCRIPTVALUE(owningAvatarID, QUuid, setOwningAvatarID); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(dpi, uint16_t, setDPI); - - COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneable, bool, setCloneable); - COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneLifetime, float, setCloneLifetime); - COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneLimit, float, setCloneLimit); - COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneDynamic, bool, setCloneDynamic); - COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneAvatarEntity, bool, setCloneAvatarEntity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(cloneOriginID, QUuid, setCloneOriginID); - // Handle conversions from old 'textures' property to "imageURL" { QScriptValue V = object.property("textures"); @@ -1983,52 +1995,67 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool } void EntityItemProperties::merge(const EntityItemProperties& other) { - COPY_PROPERTY_IF_CHANGED(lastEditedBy); + // Core + COPY_PROPERTY_IF_CHANGED(visible); + COPY_PROPERTY_IF_CHANGED(name); + COPY_PROPERTY_IF_CHANGED(locked); + COPY_PROPERTY_IF_CHANGED(userData); + COPY_PROPERTY_IF_CHANGED(href); + COPY_PROPERTY_IF_CHANGED(description); COPY_PROPERTY_IF_CHANGED(position); COPY_PROPERTY_IF_CHANGED(dimensions); COPY_PROPERTY_IF_CHANGED(rotation); + COPY_PROPERTY_IF_CHANGED(registrationPoint); + COPY_PROPERTY_IF_CHANGED(created); + COPY_PROPERTY_IF_CHANGED(lastEditedBy); + COPY_PROPERTY_IF_CHANGED(entityHostType); + COPY_PROPERTY_IF_CHANGED(owningAvatarID); + COPY_PROPERTY_IF_CHANGED(parentID); + COPY_PROPERTY_IF_CHANGED(parentJointIndex); + COPY_PROPERTY_IF_CHANGED(queryAACube); + COPY_PROPERTY_IF_CHANGED(canCastShadow); + COPY_PROPERTY_IF_CHANGED(isVisibleInSecondaryCamera); + _grab.merge(other._grab); + + // Physics COPY_PROPERTY_IF_CHANGED(density); COPY_PROPERTY_IF_CHANGED(velocity); + COPY_PROPERTY_IF_CHANGED(angularVelocity); COPY_PROPERTY_IF_CHANGED(gravity); COPY_PROPERTY_IF_CHANGED(acceleration); COPY_PROPERTY_IF_CHANGED(damping); + COPY_PROPERTY_IF_CHANGED(angularDamping); COPY_PROPERTY_IF_CHANGED(restitution); COPY_PROPERTY_IF_CHANGED(friction); COPY_PROPERTY_IF_CHANGED(lifetime); - COPY_PROPERTY_IF_CHANGED(script); - COPY_PROPERTY_IF_CHANGED(scriptTimestamp); - COPY_PROPERTY_IF_CHANGED(registrationPoint); - COPY_PROPERTY_IF_CHANGED(angularVelocity); - COPY_PROPERTY_IF_CHANGED(angularDamping); - COPY_PROPERTY_IF_CHANGED(visible); - COPY_PROPERTY_IF_CHANGED(canCastShadow); - COPY_PROPERTY_IF_CHANGED(color); - COPY_PROPERTY_IF_CHANGED(colorSpread); - COPY_PROPERTY_IF_CHANGED(colorStart); - COPY_PROPERTY_IF_CHANGED(colorFinish); - COPY_PROPERTY_IF_CHANGED(alpha); - COPY_PROPERTY_IF_CHANGED(alphaSpread); - COPY_PROPERTY_IF_CHANGED(alphaStart); - COPY_PROPERTY_IF_CHANGED(alphaFinish); - COPY_PROPERTY_IF_CHANGED(emitterShouldTrail); - COPY_PROPERTY_IF_CHANGED(modelURL); - COPY_PROPERTY_IF_CHANGED(compoundShapeURL); COPY_PROPERTY_IF_CHANGED(collisionless); COPY_PROPERTY_IF_CHANGED(collisionMask); COPY_PROPERTY_IF_CHANGED(dynamic); - COPY_PROPERTY_IF_CHANGED(isSpotlight); - COPY_PROPERTY_IF_CHANGED(intensity); - COPY_PROPERTY_IF_CHANGED(falloffRadius); - COPY_PROPERTY_IF_CHANGED(exponent); - COPY_PROPERTY_IF_CHANGED(cutoff); - COPY_PROPERTY_IF_CHANGED(locked); - COPY_PROPERTY_IF_CHANGED(textures); - COPY_PROPERTY_IF_CHANGED(userData); - COPY_PROPERTY_IF_CHANGED(text); - COPY_PROPERTY_IF_CHANGED(lineHeight); - COPY_PROPERTY_IF_CHANGED(textColor); - COPY_PROPERTY_IF_CHANGED(backgroundColor); + COPY_PROPERTY_IF_CHANGED(simulationOwner); + COPY_PROPERTY_IF_CHANGED(collisionSoundURL); + COPY_PROPERTY_IF_CHANGED(actionData); + + // Cloning + COPY_PROPERTY_IF_CHANGED(cloneable); + COPY_PROPERTY_IF_CHANGED(cloneLifetime); + COPY_PROPERTY_IF_CHANGED(cloneLimit); + COPY_PROPERTY_IF_CHANGED(cloneDynamic); + COPY_PROPERTY_IF_CHANGED(cloneAvatarEntity); + COPY_PROPERTY_IF_CHANGED(cloneOriginID); + + // Scripts + COPY_PROPERTY_IF_CHANGED(script); + COPY_PROPERTY_IF_CHANGED(scriptTimestamp); + COPY_PROPERTY_IF_CHANGED(serverScripts); + + // Common COPY_PROPERTY_IF_CHANGED(shapeType); + COPY_PROPERTY_IF_CHANGED(compoundShapeURL); + COPY_PROPERTY_IF_CHANGED(color); + COPY_PROPERTY_IF_CHANGED(alpha); + COPY_PROPERTY_IF_CHANGED(textures); + + // Particles COPY_PROPERTY_IF_CHANGED(maxParticles); COPY_PROPERTY_IF_CHANGED(lifespan); COPY_PROPERTY_IF_CHANGED(isEmitting); @@ -2038,38 +2065,125 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(emitOrientation); COPY_PROPERTY_IF_CHANGED(emitDimensions); COPY_PROPERTY_IF_CHANGED(emitRadiusStart); + COPY_PROPERTY_IF_CHANGED(emitAcceleration); + COPY_PROPERTY_IF_CHANGED(accelerationSpread); COPY_PROPERTY_IF_CHANGED(polarStart); COPY_PROPERTY_IF_CHANGED(polarFinish); COPY_PROPERTY_IF_CHANGED(azimuthStart); COPY_PROPERTY_IF_CHANGED(azimuthFinish); - COPY_PROPERTY_IF_CHANGED(emitAcceleration); - COPY_PROPERTY_IF_CHANGED(accelerationSpread); COPY_PROPERTY_IF_CHANGED(particleRadius); COPY_PROPERTY_IF_CHANGED(radiusSpread); COPY_PROPERTY_IF_CHANGED(radiusStart); COPY_PROPERTY_IF_CHANGED(radiusFinish); + COPY_PROPERTY_IF_CHANGED(colorSpread); + COPY_PROPERTY_IF_CHANGED(colorStart); + COPY_PROPERTY_IF_CHANGED(colorFinish); + COPY_PROPERTY_IF_CHANGED(alphaSpread); + COPY_PROPERTY_IF_CHANGED(alphaStart); + COPY_PROPERTY_IF_CHANGED(alphaFinish); + COPY_PROPERTY_IF_CHANGED(emitterShouldTrail); COPY_PROPERTY_IF_CHANGED(particleSpin); COPY_PROPERTY_IF_CHANGED(spinSpread); COPY_PROPERTY_IF_CHANGED(spinStart); COPY_PROPERTY_IF_CHANGED(spinFinish); COPY_PROPERTY_IF_CHANGED(rotateWithEntity); + // Model + COPY_PROPERTY_IF_CHANGED(modelURL); + COPY_PROPERTY_IF_CHANGED(jointRotationsSet); + COPY_PROPERTY_IF_CHANGED(jointRotations); + COPY_PROPERTY_IF_CHANGED(jointTranslationsSet); + COPY_PROPERTY_IF_CHANGED(jointTranslations); + COPY_PROPERTY_IF_CHANGED(relayParentJoints); + _animation.merge(other._animation); + + // Light + COPY_PROPERTY_IF_CHANGED(isSpotlight); + COPY_PROPERTY_IF_CHANGED(intensity); + COPY_PROPERTY_IF_CHANGED(exponent); + COPY_PROPERTY_IF_CHANGED(cutoff); + COPY_PROPERTY_IF_CHANGED(falloffRadius); + + // Text + COPY_PROPERTY_IF_CHANGED(text); + COPY_PROPERTY_IF_CHANGED(lineHeight); + COPY_PROPERTY_IF_CHANGED(textColor); + COPY_PROPERTY_IF_CHANGED(textAlpha); + COPY_PROPERTY_IF_CHANGED(backgroundColor); + COPY_PROPERTY_IF_CHANGED(backgroundAlpha); + COPY_PROPERTY_IF_CHANGED(billboardMode); + COPY_PROPERTY_IF_CHANGED(leftMargin); + COPY_PROPERTY_IF_CHANGED(rightMargin); + COPY_PROPERTY_IF_CHANGED(topMargin); + COPY_PROPERTY_IF_CHANGED(bottomMargin); + + // Zone + _keyLight.merge(other._keyLight); + _ambientLight.merge(other._ambientLight); + _skybox.merge(other._skybox); + _haze.merge(other._haze); + _bloom.merge(other._bloom); + COPY_PROPERTY_IF_CHANGED(flyingAllowed); + COPY_PROPERTY_IF_CHANGED(ghostingAllowed); + COPY_PROPERTY_IF_CHANGED(filterURL); + COPY_PROPERTY_IF_CHANGED(keyLightMode); + COPY_PROPERTY_IF_CHANGED(ambientLightMode); + COPY_PROPERTY_IF_CHANGED(skyboxMode); + COPY_PROPERTY_IF_CHANGED(hazeMode); + COPY_PROPERTY_IF_CHANGED(bloomMode); + + // Polyvox + COPY_PROPERTY_IF_CHANGED(voxelVolumeSize); + COPY_PROPERTY_IF_CHANGED(voxelData); + COPY_PROPERTY_IF_CHANGED(voxelSurfaceStyle); + COPY_PROPERTY_IF_CHANGED(xTextureURL); + COPY_PROPERTY_IF_CHANGED(yTextureURL); + COPY_PROPERTY_IF_CHANGED(zTextureURL); + COPY_PROPERTY_IF_CHANGED(xNNeighborID); + COPY_PROPERTY_IF_CHANGED(yNNeighborID); + COPY_PROPERTY_IF_CHANGED(zNNeighborID); + COPY_PROPERTY_IF_CHANGED(xPNeighborID); + COPY_PROPERTY_IF_CHANGED(yPNeighborID); + COPY_PROPERTY_IF_CHANGED(zPNeighborID); + + // Web + COPY_PROPERTY_IF_CHANGED(sourceUrl); + COPY_PROPERTY_IF_CHANGED(dpi); + + // Polyline + COPY_PROPERTY_IF_CHANGED(linePoints); + COPY_PROPERTY_IF_CHANGED(strokeWidths); + COPY_PROPERTY_IF_CHANGED(normals); + COPY_PROPERTY_IF_CHANGED(strokeColors); + COPY_PROPERTY_IF_CHANGED(isUVModeStretch); + COPY_PROPERTY_IF_CHANGED(glow); + COPY_PROPERTY_IF_CHANGED(faceCamera); + + // Shape + COPY_PROPERTY_IF_CHANGED(shape); + + // Material + COPY_PROPERTY_IF_CHANGED(materialURL); + COPY_PROPERTY_IF_CHANGED(materialMappingMode); + COPY_PROPERTY_IF_CHANGED(priority); + COPY_PROPERTY_IF_CHANGED(parentMaterialName); + COPY_PROPERTY_IF_CHANGED(materialMappingPos); + COPY_PROPERTY_IF_CHANGED(materialMappingScale); + COPY_PROPERTY_IF_CHANGED(materialMappingRot); + COPY_PROPERTY_IF_CHANGED(materialData); + COPY_PROPERTY_IF_CHANGED(materialRepeat); + + // Image COPY_PROPERTY_IF_CHANGED(imageURL); COPY_PROPERTY_IF_CHANGED(emissive); COPY_PROPERTY_IF_CHANGED(keepAspectRatio); COPY_PROPERTY_IF_CHANGED(subImage); + // Grid COPY_PROPERTY_IF_CHANGED(followCamera); COPY_PROPERTY_IF_CHANGED(majorGridEvery); COPY_PROPERTY_IF_CHANGED(minorGridEvery); - COPY_PROPERTY_IF_CHANGED(textAlpha); - COPY_PROPERTY_IF_CHANGED(backgroundAlpha); - COPY_PROPERTY_IF_CHANGED(leftMargin); - COPY_PROPERTY_IF_CHANGED(rightMargin); - COPY_PROPERTY_IF_CHANGED(topMargin); - COPY_PROPERTY_IF_CHANGED(bottomMargin); - // Certifiable Properties COPY_PROPERTY_IF_CHANGED(itemName); COPY_PROPERTY_IF_CHANGED(itemDescription); @@ -2083,83 +2197,13 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(certificateID); COPY_PROPERTY_IF_CHANGED(staticCertificateVersion); - COPY_PROPERTY_IF_CHANGED(name); - COPY_PROPERTY_IF_CHANGED(collisionSoundURL); - - COPY_PROPERTY_IF_CHANGED(hazeMode); - COPY_PROPERTY_IF_CHANGED(keyLightMode); - COPY_PROPERTY_IF_CHANGED(ambientLightMode); - COPY_PROPERTY_IF_CHANGED(skyboxMode); - COPY_PROPERTY_IF_CHANGED(bloomMode); - - COPY_PROPERTY_IF_CHANGED(sourceUrl); - COPY_PROPERTY_IF_CHANGED(voxelVolumeSize); - COPY_PROPERTY_IF_CHANGED(voxelData); - COPY_PROPERTY_IF_CHANGED(voxelSurfaceStyle); - COPY_PROPERTY_IF_CHANGED(lineWidth); - COPY_PROPERTY_IF_CHANGED(linePoints); - COPY_PROPERTY_IF_CHANGED(href); - COPY_PROPERTY_IF_CHANGED(description); - COPY_PROPERTY_IF_CHANGED(billboardMode); - COPY_PROPERTY_IF_CHANGED(actionData); - COPY_PROPERTY_IF_CHANGED(normals); - COPY_PROPERTY_IF_CHANGED(strokeColors); - COPY_PROPERTY_IF_CHANGED(strokeWidths); - COPY_PROPERTY_IF_CHANGED(isUVModeStretch); - COPY_PROPERTY_IF_CHANGED(created); - - _animation.merge(other._animation); - _keyLight.merge(other._keyLight); - _ambientLight.merge(other._ambientLight); - _skybox.merge(other._skybox); - _haze.merge(other._haze); - _bloom.merge(other._bloom); - _grab.merge(other._grab); - - COPY_PROPERTY_IF_CHANGED(xTextureURL); - COPY_PROPERTY_IF_CHANGED(yTextureURL); - COPY_PROPERTY_IF_CHANGED(zTextureURL); - - COPY_PROPERTY_IF_CHANGED(xNNeighborID); - COPY_PROPERTY_IF_CHANGED(yNNeighborID); - COPY_PROPERTY_IF_CHANGED(zNNeighborID); - - COPY_PROPERTY_IF_CHANGED(xPNeighborID); - COPY_PROPERTY_IF_CHANGED(yPNeighborID); - COPY_PROPERTY_IF_CHANGED(zPNeighborID); - - COPY_PROPERTY_IF_CHANGED(parentID); - COPY_PROPERTY_IF_CHANGED(parentJointIndex); - COPY_PROPERTY_IF_CHANGED(queryAACube); - + // Local props for scripts COPY_PROPERTY_IF_CHANGED(localPosition); COPY_PROPERTY_IF_CHANGED(localRotation); COPY_PROPERTY_IF_CHANGED(localVelocity); COPY_PROPERTY_IF_CHANGED(localAngularVelocity); COPY_PROPERTY_IF_CHANGED(localDimensions); - COPY_PROPERTY_IF_CHANGED(jointRotationsSet); - COPY_PROPERTY_IF_CHANGED(jointRotations); - COPY_PROPERTY_IF_CHANGED(jointTranslationsSet); - COPY_PROPERTY_IF_CHANGED(jointTranslations); - COPY_PROPERTY_IF_CHANGED(shape); - - COPY_PROPERTY_IF_CHANGED(flyingAllowed); - COPY_PROPERTY_IF_CHANGED(ghostingAllowed); - COPY_PROPERTY_IF_CHANGED(filterURL); - - COPY_PROPERTY_IF_CHANGED(entityHostType); - COPY_PROPERTY_IF_CHANGED(owningAvatarID); - - COPY_PROPERTY_IF_CHANGED(dpi); - - COPY_PROPERTY_IF_CHANGED(cloneable); - COPY_PROPERTY_IF_CHANGED(cloneLifetime); - COPY_PROPERTY_IF_CHANGED(cloneLimit); - COPY_PROPERTY_IF_CHANGED(cloneDynamic); - COPY_PROPERTY_IF_CHANGED(cloneAvatarEntity); - COPY_PROPERTY_IF_CHANGED(cloneOriginID); - _lastEdited = usecTimestampNow(); } @@ -2203,57 +2247,90 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue static std::once_flag initMap; std::call_once(initMap, []() { + // Core ADD_PROPERTY_TO_MAP(PROP_VISIBLE, Visible, visible, bool); - ADD_PROPERTY_TO_MAP(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool); + ADD_PROPERTY_TO_MAP(PROP_NAME, Name, name, QString); + ADD_PROPERTY_TO_MAP(PROP_LOCKED, Locked, locked, bool); + ADD_PROPERTY_TO_MAP(PROP_USER_DATA, UserData, userData, QString); + ADD_PROPERTY_TO_MAP(PROP_HREF, Href, href, QString); + ADD_PROPERTY_TO_MAP(PROP_DESCRIPTION, Description, description, QString); ADD_PROPERTY_TO_MAP(PROP_POSITION, Position, position, vec3); ADD_PROPERTY_TO_MAP(PROP_DIMENSIONS, Dimensions, dimensions, vec3); ADD_PROPERTY_TO_MAP(PROP_ROTATION, Rotation, rotation, quat); + ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, vec3); + //ADD_PROPERTY_TO_MAP(PROP_CREATED, Created, created, quint64); // not yet handled + //ADD_PROPERTY_TO_MAP(PROP_LAST_EDITED_BY, LastEditedBy, lastEditedBy, QUuid); // not yet handled + ADD_PROPERTY_TO_MAP(PROP_ENTITY_HOST_TYPE, EntityHostType, entityHostType, entity::HostType); + //ADD_PROPERTY_TO_MAP(PROP_OWNING_AVATAR_ID, OwningAvatarID, owningAvatarID, QUuid); // not yet handled + ADD_PROPERTY_TO_MAP(PROP_PARENT_ID, ParentID, parentID, QUuid); + ADD_PROPERTY_TO_MAP(PROP_PARENT_JOINT_INDEX, ParentJointIndex, parentJointIndex, uint16_t); + //ADD_PROPERTY_TO_MAP(PROP_QUERY_AA_CUBE, QueryAACube, queryAACube, AACube); // not yet handled + ADD_PROPERTY_TO_MAP(PROP_CAN_CAST_SHADOW, CanCastShadow, canCastShadow, bool); + ADD_PROPERTY_TO_MAP(PROP_VISIBLE_IN_SECONDARY_CAMERA, IsVisibleInSecondaryCamera, isVisibleInSecondaryCamera, bool); + { // Grab + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_GRABBABLE, Grab, grab, Grabbable, grabbable); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_KINEMATIC, Grab, grab, GrabKinematic, grabKinematic); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_FOLLOWS_CONTROLLER, Grab, grab, GrabFollowsController, grabFollowsController); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_TRIGGERABLE, Grab, grab, Triggerable, triggerable); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE, Grab, grab, Equippable, equippable); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_LEFT_EQUIPPABLE_POSITION_OFFSET, Grab, grab, + EquippableLeftPosition, equippableLeftPosition); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_LEFT_EQUIPPABLE_ROTATION_OFFSET, Grab, grab, + EquippableLeftRotation, equippableLeftRotation); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_RIGHT_EQUIPPABLE_POSITION_OFFSET, Grab, grab, + EquippableRightPosition, equippableRightPosition); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_RIGHT_EQUIPPABLE_ROTATION_OFFSET, Grab, grab, + EquippableRightRotation, equippableRightRotation); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_URL, Grab, grab, + EquippableIndicatorURL, equippableIndicatorURL); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_SCALE, Grab, grab, + EquippableIndicatorScale, equippableIndicatorScale); + ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_OFFSET, Grab, grab, + EquippableIndicatorOffset, equippableIndicatorOffset); + } + + // Physics ADD_PROPERTY_TO_MAP(PROP_DENSITY, Density, density, float); ADD_PROPERTY_TO_MAP(PROP_VELOCITY, Velocity, velocity, vec3); + ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, vec3); ADD_PROPERTY_TO_MAP(PROP_GRAVITY, Gravity, gravity, vec3); ADD_PROPERTY_TO_MAP(PROP_ACCELERATION, Acceleration, acceleration, vec3); ADD_PROPERTY_TO_MAP(PROP_DAMPING, Damping, damping, float); + ADD_PROPERTY_TO_MAP(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float); ADD_PROPERTY_TO_MAP(PROP_RESTITUTION, Restitution, restitution, float); ADD_PROPERTY_TO_MAP(PROP_FRICTION, Friction, friction, float); ADD_PROPERTY_TO_MAP(PROP_LIFETIME, Lifetime, lifetime, float); - ADD_PROPERTY_TO_MAP(PROP_SCRIPT, Script, script, QString); - ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64); - ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString); - ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString); - ADD_PROPERTY_TO_MAP(PROP_COLOR, Color, color, u8vec3Color); - ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3Color); - ADD_PROPERTY_TO_MAP(PROP_COLOR_START, ColorStart, colorStart, vec3Color); - ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, ColorFinish, colorFinish, vec3Color); - ADD_PROPERTY_TO_MAP(PROP_ALPHA, Alpha, alpha, float); - ADD_PROPERTY_TO_MAP(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float); - ADD_PROPERTY_TO_MAP(PROP_ALPHA_START, AlphaStart, alphaStart, float); - ADD_PROPERTY_TO_MAP(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float); - ADD_PROPERTY_TO_MAP(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool); - ADD_PROPERTY_TO_MAP(PROP_MODEL_URL, ModelURL, modelURL, QString); - ADD_PROPERTY_TO_MAP(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString); - ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, vec3); - ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, vec3); - ADD_PROPERTY_TO_MAP(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float); ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, Collisionless, collisionless, bool); ADD_PROPERTY_TO_MAP(PROP_COLLISIONLESS, unused, ignoreForCollisions, unused); // legacy support ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, unused, collisionMask, unused); ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, unused, collidesWith, unused); ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, unused, collisionsWillMove, unused); // legacy support ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, unused, dynamic, unused); - ADD_PROPERTY_TO_MAP(PROP_IS_SPOTLIGHT, IsSpotlight, isSpotlight, bool); - ADD_PROPERTY_TO_MAP(PROP_INTENSITY, Intensity, intensity, float); - ADD_PROPERTY_TO_MAP(PROP_FALLOFF_RADIUS, FalloffRadius, falloffRadius, float); - ADD_PROPERTY_TO_MAP(PROP_EXPONENT, Exponent, exponent, float); - ADD_PROPERTY_TO_MAP(PROP_CUTOFF, Cutoff, cutoff, float); - ADD_PROPERTY_TO_MAP(PROP_LOCKED, Locked, locked, bool); - ADD_PROPERTY_TO_MAP(PROP_TEXTURES, Textures, textures, QString); - ADD_PROPERTY_TO_MAP(PROP_USER_DATA, UserData, userData, QString); ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner); - ADD_PROPERTY_TO_MAP(PROP_TEXT, Text, text, QString); - ADD_PROPERTY_TO_MAP(PROP_LINE_HEIGHT, LineHeight, lineHeight, float); - ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, TextColor, textColor, u8vec3Color); - ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, u8vec3Color); + ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString); + ADD_PROPERTY_TO_MAP(PROP_ACTION_DATA, ActionData, actionData, QByteArray); + + // Cloning + ADD_PROPERTY_TO_MAP(PROP_CLONEABLE, Cloneable, cloneable, bool); + ADD_PROPERTY_TO_MAP(PROP_CLONE_LIFETIME, CloneLifetime, cloneLifetime, float); + ADD_PROPERTY_TO_MAP(PROP_CLONE_LIMIT, CloneLimit, cloneLimit, float); + ADD_PROPERTY_TO_MAP(PROP_CLONE_DYNAMIC, CloneDynamic, cloneDynamic, bool); + ADD_PROPERTY_TO_MAP(PROP_CLONE_AVATAR_ENTITY, CloneAvatarEntity, cloneAvatarEntity, bool); + ADD_PROPERTY_TO_MAP(PROP_CLONE_ORIGIN_ID, CloneOriginID, cloneOriginID, QUuid); + + // Scripts + ADD_PROPERTY_TO_MAP(PROP_SCRIPT, Script, script, QString); + ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64); + ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString); + + // Common ADD_PROPERTY_TO_MAP(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType); + ADD_PROPERTY_TO_MAP(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString); + ADD_PROPERTY_TO_MAP(PROP_COLOR, Color, color, u8vec3Color); + ADD_PROPERTY_TO_MAP(PROP_ALPHA, Alpha, alpha, float); + ADD_PROPERTY_TO_MAP(PROP_TEXTURES, Textures, textures, QString); + + // Particles ADD_PROPERTY_TO_MAP(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32); ADD_PROPERTY_TO_MAP(PROP_LIFESPAN, Lifespan, lifespan, float); ADD_PROPERTY_TO_MAP(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool); @@ -2263,17 +2340,145 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, quat); ADD_PROPERTY_TO_MAP(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, vec3); ADD_PROPERTY_TO_MAP(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float); + ADD_PROPERTY_TO_MAP(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, vec3); + ADD_PROPERTY_TO_MAP(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, vec3); ADD_PROPERTY_TO_MAP(PROP_POLAR_START, EmitPolarStart, polarStart, float); ADD_PROPERTY_TO_MAP(PROP_POLAR_FINISH, EmitPolarFinish, polarFinish, float); ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_START, EmitAzimuthStart, azimuthStart, float); ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_FINISH, EmitAzimuthFinish, azimuthFinish, float); - ADD_PROPERTY_TO_MAP(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, vec3); - ADD_PROPERTY_TO_MAP(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, vec3); ADD_PROPERTY_TO_MAP(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float); ADD_PROPERTY_TO_MAP(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float); ADD_PROPERTY_TO_MAP(PROP_RADIUS_START, RadiusStart, radiusStart, float); ADD_PROPERTY_TO_MAP(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float); + ADD_PROPERTY_TO_MAP(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3Color); + ADD_PROPERTY_TO_MAP(PROP_COLOR_START, ColorStart, colorStart, vec3Color); + ADD_PROPERTY_TO_MAP(PROP_COLOR_FINISH, ColorFinish, colorFinish, vec3Color); + ADD_PROPERTY_TO_MAP(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float); + ADD_PROPERTY_TO_MAP(PROP_ALPHA_START, AlphaStart, alphaStart, float); + ADD_PROPERTY_TO_MAP(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float); + ADD_PROPERTY_TO_MAP(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool); + ADD_PROPERTY_TO_MAP(PROP_PARTICLE_SPIN, ParticleSpin, particleSpin, float); + ADD_PROPERTY_TO_MAP(PROP_SPIN_SPREAD, SpinSpread, spinSpread, float); + ADD_PROPERTY_TO_MAP(PROP_SPIN_START, SpinStart, spinStart, float); + ADD_PROPERTY_TO_MAP(PROP_SPIN_FINISH, SpinFinish, spinFinish, float); + ADD_PROPERTY_TO_MAP(PROP_PARTICLE_ROTATE_WITH_ENTITY, RotateWithEntity, rotateWithEntity, float); + // Model + ADD_PROPERTY_TO_MAP(PROP_MODEL_URL, ModelURL, modelURL, QString); + ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector); + ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector); + ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector); + ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector); + ADD_PROPERTY_TO_MAP(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool); + { // Animation + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_URL, Animation, animation, URL, url); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_ALLOW_TRANSLATION, Animation, animation, AllowTranslation, allowTranslation); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FPS, Animation, animation, FPS, fps); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FRAME_INDEX, Animation, animation, CurrentFrame, currentFrame); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_PLAYING, Animation, animation, Running, running); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame); + ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold); + } + + // Light + ADD_PROPERTY_TO_MAP(PROP_IS_SPOTLIGHT, IsSpotlight, isSpotlight, bool); + ADD_PROPERTY_TO_MAP(PROP_INTENSITY, Intensity, intensity, float); + ADD_PROPERTY_TO_MAP(PROP_EXPONENT, Exponent, exponent, float); + ADD_PROPERTY_TO_MAP(PROP_CUTOFF, Cutoff, cutoff, float); + ADD_PROPERTY_TO_MAP(PROP_FALLOFF_RADIUS, FalloffRadius, falloffRadius, float); + + // Text + ADD_PROPERTY_TO_MAP(PROP_TEXT, Text, text, QString); + ADD_PROPERTY_TO_MAP(PROP_LINE_HEIGHT, LineHeight, lineHeight, float); + ADD_PROPERTY_TO_MAP(PROP_TEXT_COLOR, TextColor, textColor, u8vec3Color); + ADD_PROPERTY_TO_MAP(PROP_TEXT_ALPHA, TextAlpha, textAlpha, float); + ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_COLOR, BackgroundColor, backgroundColor, u8vec3Color); + ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_ALPHA, BackgroundAlpha, backgroundAlpha, float); + ADD_PROPERTY_TO_MAP(PROP_BILLBOARD_MODE, BillboardMode, billboardMode, BillboardMode); + ADD_PROPERTY_TO_MAP(PROP_LEFT_MARGIN, LeftMargin, leftMargin, float); + ADD_PROPERTY_TO_MAP(PROP_RIGHT_MARGIN, RightMargin, rightMargin, float); + ADD_PROPERTY_TO_MAP(PROP_TOP_MARGIN, TopMargin, topMargin, float); + ADD_PROPERTY_TO_MAP(PROP_BOTTOM_MARGIN, BottomMargin, bottomMargin, float); + + // Zone + { // Keylight + ADD_GROUP_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLight, keyLight, Color, color); + ADD_GROUP_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, KeyLight, keyLight, Intensity, intensity); + ADD_GROUP_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, KeyLight, keylight, Direction, direction); + ADD_GROUP_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, KeyLight, keyLight, CastShadows, castShadows); + } + { // Ambient light + ADD_GROUP_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_INTENSITY, AmbientLight, ambientLight, Intensity, intensity); + ADD_GROUP_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_URL, AmbientLight, ambientLight, URL, url); + } + { // Skybox + ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color); + ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_URL, Skybox, skybox, URL, url); + } + { // Haze + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_RANGE, Haze, haze, HazeRange, hazeRange); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_COLOR, Haze, haze, HazeColor, hazeColor); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_COLOR, Haze, haze, HazeGlareColor, hazeGlareColor); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ENABLE_GLARE, Haze, haze, HazeEnableGlare, hazeEnableGlare); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_ANGLE, Haze, haze, HazeGlareAngle, hazeGlareAngle); + + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ALTITUDE_EFFECT, Haze, haze, HazeAltitudeEffect, hazeAltitudeEfect); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_CEILING, Haze, haze, HazeCeiling, hazeCeiling); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BASE_REF, Haze, haze, HazeBaseRef, hazeBaseRef); + + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BACKGROUND_BLEND, Haze, haze, HazeBackgroundBlend, hazeBackgroundBlend); + + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ATTENUATE_KEYLIGHT, Haze, haze, HazeAttenuateKeyLight, hazeAttenuateKeyLight); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_RANGE, Haze, haze, HazeKeyLightRange, hazeKeyLightRange); + ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_ALTITUDE, Haze, haze, HazeKeyLightAltitude, hazeKeyLightAltitude); + } + { // Bloom + ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_INTENSITY, Bloom, bloom, BloomIntensity, bloomIntensity); + ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_THRESHOLD, Bloom, bloom, BloomThreshold, bloomThreshold); + ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_SIZE, Bloom, bloom, BloomSize, bloomSize); + } + ADD_PROPERTY_TO_MAP(PROP_FLYING_ALLOWED, FlyingAllowed, flyingAllowed, bool); + ADD_PROPERTY_TO_MAP(PROP_GHOSTING_ALLOWED, GhostingAllowed, ghostingAllowed, bool); + ADD_PROPERTY_TO_MAP(PROP_FILTER_URL, FilterURL, filterURL, QString); + ADD_PROPERTY_TO_MAP(PROP_KEY_LIGHT_MODE, KeyLightMode, keyLightMode, uint32_t); + ADD_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_MODE, AmbientLightMode, ambientLightMode, uint32_t); + ADD_PROPERTY_TO_MAP(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, uint32_t); + ADD_PROPERTY_TO_MAP(PROP_HAZE_MODE, HazeMode, hazeMode, uint32_t); + ADD_PROPERTY_TO_MAP(PROP_BLOOM_MODE, BloomMode, bloomMode, uint32_t); + + // Polyvox + ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, vec3); + ADD_PROPERTY_TO_MAP(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray); + ADD_PROPERTY_TO_MAP(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t); + ADD_PROPERTY_TO_MAP(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString); + ADD_PROPERTY_TO_MAP(PROP_Y_TEXTURE_URL, YTextureURL, yTextureURL, QString); + ADD_PROPERTY_TO_MAP(PROP_Z_TEXTURE_URL, ZTextureURL, zTextureURL, QString); + ADD_PROPERTY_TO_MAP(PROP_X_N_NEIGHBOR_ID, XNNeighborID, xNNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_Y_N_NEIGHBOR_ID, YNNeighborID, yNNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_Z_N_NEIGHBOR_ID, ZNNeighborID, zNNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_X_P_NEIGHBOR_ID, XPNeighborID, xPNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_Y_P_NEIGHBOR_ID, YPNeighborID, yPNeighborID, EntityItemID); + ADD_PROPERTY_TO_MAP(PROP_Z_P_NEIGHBOR_ID, ZPNeighborID, zPNeighborID, EntityItemID); + + // Web + ADD_PROPERTY_TO_MAP(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString); + ADD_PROPERTY_TO_MAP(PROP_DPI, DPI, dpi, uint16_t); + + // Polyline + ADD_PROPERTY_TO_MAP(PROP_LINE_POINTS, LinePoints, linePoints, QVector); + ADD_PROPERTY_TO_MAP(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector); + ADD_PROPERTY_TO_MAP(PROP_STROKE_NORMALS, Normals, normals, QVector); + ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector); + ADD_PROPERTY_TO_MAP(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, QVector); + ADD_PROPERTY_TO_MAP(PROP_LINE_GLOW, Glow, glow); + ADD_PROPERTY_TO_MAP(PROP_LINE_FACE_CAMERA, FaceCamera, faceCamera, bool); + + // Shape + ADD_PROPERTY_TO_MAP(PROP_SHAPE, Shape, shape, QString); + + // Material ADD_PROPERTY_TO_MAP(PROP_MATERIAL_URL, MaterialURL, materialURL, QString); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_MAPPING_MODE, MaterialMappingMode, materialMappingMode, MaterialMappingMode); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_PRIORITY, Priority, priority, quint16); @@ -2284,13 +2489,16 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_MATERIAL_DATA, MaterialData, materialData, QString); ADD_PROPERTY_TO_MAP(PROP_MATERIAL_REPEAT, MaterialRepeat, materialRepeat, bool); - ADD_PROPERTY_TO_MAP(PROP_VISIBLE_IN_SECONDARY_CAMERA, IsVisibleInSecondaryCamera, isVisibleInSecondaryCamera, bool); + // Image + ADD_PROPERTY_TO_MAP(PROP_IMAGE_URL, ImageURL, imageURL, QString); + ADD_PROPERTY_TO_MAP(PROP_EMISSIVE, Emissive, emissive, bool); + ADD_PROPERTY_TO_MAP(PROP_KEEP_ASPECT_RATIO, KeepAspectRatio, keepAspectRatio, bool); + ADD_PROPERTY_TO_MAP(PROP_SUB_IMAGE, SubImage, subImage, QRect); - ADD_PROPERTY_TO_MAP(PROP_PARTICLE_SPIN, ParticleSpin, particleSpin, float); - ADD_PROPERTY_TO_MAP(PROP_SPIN_SPREAD, SpinSpread, spinSpread, float); - ADD_PROPERTY_TO_MAP(PROP_SPIN_START, SpinStart, spinStart, float); - ADD_PROPERTY_TO_MAP(PROP_SPIN_FINISH, SpinFinish, spinFinish, float); - ADD_PROPERTY_TO_MAP(PROP_PARTICLE_ROTATE_WITH_ENTITY, RotateWithEntity, rotateWithEntity, float); + // Grid + ADD_PROPERTY_TO_MAP(PROP_GRID_FOLLOW_CAMERA, FollowCamera, followCamera, bool); + ADD_PROPERTY_TO_MAP(PROP_MAJOR_GRID_EVERY, MajorGridEvery, majorGridEvery, uint32_t); + ADD_PROPERTY_TO_MAP(PROP_MINOR_GRID_EVERY, MinorGridEvery, minorGridEvery, float); // Certifiable Properties ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString); @@ -2305,159 +2513,25 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString); ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, u8vec3Color); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, vec3); - ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_CAST_SHADOW, KeyLightCastShadows, keyLightCastShadows, bool); - - ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, vec3); - ADD_PROPERTY_TO_MAP(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray); - ADD_PROPERTY_TO_MAP(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t); - ADD_PROPERTY_TO_MAP(PROP_NAME, Name, name, QString); - ADD_PROPERTY_TO_MAP(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString); - ADD_PROPERTY_TO_MAP(PROP_LINE_WIDTH, LineWidth, lineWidth, float); - ADD_PROPERTY_TO_MAP(PROP_LINE_POINTS, LinePoints, linePoints, QVector); - ADD_PROPERTY_TO_MAP(PROP_HREF, Href, href, QString); - ADD_PROPERTY_TO_MAP(PROP_DESCRIPTION, Description, description, QString); - ADD_PROPERTY_TO_MAP(PROP_BILLBOARD_MODE, BillboardMode, billboardMode, BillboardMode); - ADD_PROPERTY_TO_MAP(PROP_ACTION_DATA, ActionData, actionData, QByteArray); - ADD_PROPERTY_TO_MAP(PROP_NORMALS, Normals, normals, QVector); - ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector); - ADD_PROPERTY_TO_MAP(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector); - ADD_PROPERTY_TO_MAP(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, QVector); - ADD_PROPERTY_TO_MAP(PROP_X_TEXTURE_URL, XTextureURL, xTextureURL, QString); - ADD_PROPERTY_TO_MAP(PROP_Y_TEXTURE_URL, YTextureURL, yTextureURL, QString); - ADD_PROPERTY_TO_MAP(PROP_Z_TEXTURE_URL, ZTextureURL, zTextureURL, QString); - ADD_PROPERTY_TO_MAP(PROP_X_N_NEIGHBOR_ID, XNNeighborID, xNNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_Y_N_NEIGHBOR_ID, YNNeighborID, yNNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_Z_N_NEIGHBOR_ID, ZNNeighborID, zNNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_X_P_NEIGHBOR_ID, XPNeighborID, xPNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_Y_P_NEIGHBOR_ID, YPNeighborID, yPNeighborID, EntityItemID); - ADD_PROPERTY_TO_MAP(PROP_Z_P_NEIGHBOR_ID, ZPNeighborID, zPNeighborID, EntityItemID); - - ADD_PROPERTY_TO_MAP(PROP_PARENT_ID, ParentID, parentID, QUuid); - ADD_PROPERTY_TO_MAP(PROP_PARENT_JOINT_INDEX, ParentJointIndex, parentJointIndex, uint16_t); - + // Local script props ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, LocalPosition, localPosition, vec3); ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat); ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, vec3); ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, vec3); ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, vec3); - - ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector); - ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector); - ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector); - ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector); - ADD_PROPERTY_TO_MAP(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool); - - ADD_PROPERTY_TO_MAP(PROP_SHAPE, Shape, shape, QString); - - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_URL, Animation, animation, URL, url); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FPS, Animation, animation, FPS, fps); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FRAME_INDEX, Animation, animation, CurrentFrame, currentFrame); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_PLAYING, Animation, animation, Running, running); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold); - ADD_GROUP_PROPERTY_TO_MAP(PROP_ANIMATION_ALLOW_TRANSLATION, Animation, animation, AllowTranslation, allowTranslation); - - ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color); - ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_URL, Skybox, skybox, URL, url); - - ADD_PROPERTY_TO_MAP(PROP_FLYING_ALLOWED, FlyingAllowed, flyingAllowed, bool); - ADD_PROPERTY_TO_MAP(PROP_GHOSTING_ALLOWED, GhostingAllowed, ghostingAllowed, bool); - ADD_PROPERTY_TO_MAP(PROP_FILTER_URL, FilterURL, filterURL, QString); - - ADD_PROPERTY_TO_MAP(PROP_HAZE_MODE, HazeMode, hazeMode, uint32_t); - - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_RANGE, Haze, haze, HazeRange, hazeRange); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_COLOR, Haze, haze, HazeColor, hazeColor); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_COLOR, Haze, haze, HazeGlareColor, hazeGlareColor); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ENABLE_GLARE, Haze, haze, HazeEnableGlare, hazeEnableGlare); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_GLARE_ANGLE, Haze, haze, HazeGlareAngle, hazeGlareAngle); - - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ALTITUDE_EFFECT, Haze, haze, HazeAltitudeEffect, hazeAltitudeEfect); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_CEILING, Haze, haze, HazeCeiling, hazeCeiling); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BASE_REF, Haze, haze, HazeBaseRef, hazeBaseRef); - - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_BACKGROUND_BLEND, Haze, haze, HazeBackgroundBlend, hazeBackgroundBlend); - - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_ATTENUATE_KEYLIGHT, Haze, haze, HazeAttenuateKeyLight, hazeAttenuateKeyLight); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_RANGE, Haze, haze, HazeKeyLightRange, hazeKeyLightRange); - ADD_GROUP_PROPERTY_TO_MAP(PROP_HAZE_KEYLIGHT_ALTITUDE, Haze, haze, HazeKeyLightAltitude, hazeKeyLightAltitude); - - ADD_PROPERTY_TO_MAP(PROP_BLOOM_MODE, BloomMode, bloomMode, uint32_t); - ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_INTENSITY, Bloom, bloom, BloomIntensity, bloomIntensity); - ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_THRESHOLD, Bloom, bloom, BloomThreshold, bloomThreshold); - ADD_GROUP_PROPERTY_TO_MAP(PROP_BLOOM_SIZE, Bloom, bloom, BloomSize, bloomSize); - - ADD_PROPERTY_TO_MAP(PROP_KEY_LIGHT_MODE, KeyLightMode, keyLightMode, uint32_t); - ADD_PROPERTY_TO_MAP(PROP_AMBIENT_LIGHT_MODE, AmbientLightMode, ambientLightMode, uint32_t); - ADD_PROPERTY_TO_MAP(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, uint32_t); - - ADD_PROPERTY_TO_MAP(PROP_DPI, DPI, dpi, uint16_t); - - ADD_PROPERTY_TO_MAP(PROP_CLONEABLE, Cloneable, cloneable, bool); - ADD_PROPERTY_TO_MAP(PROP_CLONE_LIFETIME, CloneLifetime, cloneLifetime, float); - ADD_PROPERTY_TO_MAP(PROP_CLONE_LIMIT, CloneLimit, cloneLimit, float); - ADD_PROPERTY_TO_MAP(PROP_CLONE_DYNAMIC, CloneDynamic, cloneDynamic, bool); - ADD_PROPERTY_TO_MAP(PROP_CLONE_AVATAR_ENTITY, CloneAvatarEntity, cloneAvatarEntity, bool); - ADD_PROPERTY_TO_MAP(PROP_CLONE_ORIGIN_ID, CloneOriginID, cloneOriginID, QUuid); - - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_GRABBABLE, Grab, grab, Grabbable, grabbable); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_KINEMATIC, Grab, grab, GrabKinematic, grabKinematic); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_FOLLOWS_CONTROLLER, Grab, grab, GrabFollowsController, grabFollowsController); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_TRIGGERABLE, Grab, grab, Triggerable, triggerable); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE, Grab, grab, Equippable, equippable); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_LEFT_EQUIPPABLE_POSITION_OFFSET, Grab, grab, - EquippableLeftPosition, equippableLeftPosition); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_LEFT_EQUIPPABLE_ROTATION_OFFSET, Grab, grab, - EquippableLeftRotation, equippableLeftRotation); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_RIGHT_EQUIPPABLE_POSITION_OFFSET, Grab, grab, - EquippableRightPosition, equippableRightPosition); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_RIGHT_EQUIPPABLE_ROTATION_OFFSET, Grab, grab, - EquippableRightRotation, equippableRightRotation); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_URL, Grab, grab, - EquippableIndicatorURL, equippableIndicatorURL); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_SCALE, Grab, grab, - EquippableIndicatorScale, equippableIndicatorScale); - ADD_GROUP_PROPERTY_TO_MAP(PROP_GRAB_EQUIPPABLE_INDICATOR_OFFSET, Grab, grab, - EquippableIndicatorOffset, equippableIndicatorOffset); - - ADD_PROPERTY_TO_MAP(PROP_IMAGE_URL, ImageURL, imageURL, QString); - ADD_PROPERTY_TO_MAP(PROP_EMISSIVE, Emissive, emissive, bool); - ADD_PROPERTY_TO_MAP(PROP_KEEP_ASPECT_RATIO, KeepAspectRatio, keepAspectRatio, bool); - ADD_PROPERTY_TO_MAP(PROP_SUB_IMAGE, SubImage, subImage, QRect); - - ADD_PROPERTY_TO_MAP(PROP_GRID_FOLLOW_CAMERA, FollowCamera, followCamera, bool); - ADD_PROPERTY_TO_MAP(PROP_MAJOR_GRID_EVERY, MajorGridEvery, majorGridEvery, uint32_t); - ADD_PROPERTY_TO_MAP(PROP_MINOR_GRID_EVERY, MinorGridEvery, minorGridEvery, float); - - ADD_PROPERTY_TO_MAP(PROP_TEXT_ALPHA, TextAlpha, textAlpha, float); - ADD_PROPERTY_TO_MAP(PROP_BACKGROUND_ALPHA, BackgroundAlpha, backgroundAlpha, float); - ADD_PROPERTY_TO_MAP(PROP_LEFT_MARGIN, LeftMargin, leftMargin, float); - ADD_PROPERTY_TO_MAP(PROP_RIGHT_MARGIN, RightMargin, rightMargin, float); - ADD_PROPERTY_TO_MAP(PROP_TOP_MARGIN, TopMargin, topMargin, float); - ADD_PROPERTY_TO_MAP(PROP_BOTTOM_MARGIN, BottomMargin, bottomMargin, float); - - // FIXME - these are not yet handled - //ADD_PROPERTY_TO_MAP(PROP_CREATED, Created, created, quint64); - }); if (object.isString()) { - // TODO: figure out how to do this without a double lookup in the map - if (_propertyStringsToEnums.contains(object.toString())) { - flags << _propertyStringsToEnums[object.toString()]; + auto enumIter = _propertyStringsToEnums.find(object.toString()); + if (enumIter != _propertyStringsToEnums.end()) { + flags << enumIter.value; } } else if (object.isArray()) { quint32 length = object.property("length").toInt32(); for (quint32 i = 0; i < length; i++) { - QString propertyName = object.property(i).toString(); - // TODO: figure out how to do this without a double lookup in the map - if (_propertyStringsToEnums.contains(propertyName)) { - flags << _propertyStringsToEnums[propertyName]; + auto enumIter = _propertyStringsToEnums.find(object.property(i).toString()); + if (enumIter != _propertyStringsToEnums.end()) { + flags << enumIter.value; } } } @@ -2563,81 +2637,61 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy // PROP_PAGED_PROPERTY, // PROP_CUSTOM_PROPERTIES_INCLUDED, - APPEND_ENTITY_PROPERTY(PROP_SIMULATION_OWNER, properties._simulationOwner.toByteArray()); - APPEND_ENTITY_PROPERTY(PROP_POSITION, properties.getPosition()); - APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, properties.getDimensions()); - APPEND_ENTITY_PROPERTY(PROP_ROTATION, properties.getRotation()); - APPEND_ENTITY_PROPERTY(PROP_DENSITY, properties.getDensity()); - APPEND_ENTITY_PROPERTY(PROP_VELOCITY, properties.getVelocity()); - APPEND_ENTITY_PROPERTY(PROP_GRAVITY, properties.getGravity()); - APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, properties.getAcceleration()); - APPEND_ENTITY_PROPERTY(PROP_DAMPING, properties.getDamping()); - APPEND_ENTITY_PROPERTY(PROP_RESTITUTION, properties.getRestitution()); - APPEND_ENTITY_PROPERTY(PROP_FRICTION, properties.getFriction()); - APPEND_ENTITY_PROPERTY(PROP_LIFETIME, properties.getLifetime()); - APPEND_ENTITY_PROPERTY(PROP_SCRIPT, properties.getScript()); - APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, properties.getScriptTimestamp()); - APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, properties.getServerScripts()); - APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, properties.getRegistrationPoint()); - APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, properties.getAngularVelocity()); - APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, properties.getAngularDamping()); + APPEND_ENTITY_PROPERTY(PROP_VISIBLE, properties.getVisible()); - APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, properties.getCanCastShadow()); - APPEND_ENTITY_PROPERTY(PROP_COLLISIONLESS, properties.getCollisionless()); - APPEND_ENTITY_PROPERTY(PROP_COLLISION_MASK, properties.getCollisionMask()); - APPEND_ENTITY_PROPERTY(PROP_DYNAMIC, properties.getDynamic()); + APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName()); APPEND_ENTITY_PROPERTY(PROP_LOCKED, properties.getLocked()); APPEND_ENTITY_PROPERTY(PROP_USER_DATA, properties.getUserData()); APPEND_ENTITY_PROPERTY(PROP_HREF, properties.getHref()); APPEND_ENTITY_PROPERTY(PROP_DESCRIPTION, properties.getDescription()); + APPEND_ENTITY_PROPERTY(PROP_POSITION, properties.getPosition()); + APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, properties.getDimensions()); + APPEND_ENTITY_PROPERTY(PROP_ROTATION, properties.getRotation()); + APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, properties.getRegistrationPoint()); + // FIXME: deal with these + // APPEND_ENTITY_PROPERTY(PROP_CREATED, properties.getCreated()); + // APPEND_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, properties.getLastEditedBy()); + // APPEND_ENTITY_PROPERTY(PROP_ENTITY_HOST_TYPE, (uint32_t)properties.getEntityHostType()); + // APPEND_ENTITY_PROPERTY(PROP_OWNING_AVATAR_ID, properties.getOwningAvatarID()); APPEND_ENTITY_PROPERTY(PROP_PARENT_ID, properties.getParentID()); APPEND_ENTITY_PROPERTY(PROP_PARENT_JOINT_INDEX, properties.getParentJointIndex()); APPEND_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, properties.getQueryAACube()); + APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, properties.getCanCastShadow()); + // APPEND_ENTITY_PROPERTY(PROP_VISIBLE_IN_SECONDARY_CAMERA, properties.getIsVisibleInSecondaryCamera()); // Not sent over the wire + _staticGrab.setProperties(properties); + _staticGrab.appendToEditPacket(packetData, requestedProperties, propertyFlags, + propertiesDidntFit, propertyCount, appendState); - if (properties.getType() == EntityTypes::Web) { - APPEND_ENTITY_PROPERTY(PROP_SOURCE_URL, properties.getSourceUrl()); - APPEND_ENTITY_PROPERTY(PROP_DPI, properties.getDPI()); - } + // Physics + APPEND_ENTITY_PROPERTY(PROP_DENSITY, properties.getDensity()); + APPEND_ENTITY_PROPERTY(PROP_VELOCITY, properties.getVelocity()); + APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, properties.getAngularVelocity()); + APPEND_ENTITY_PROPERTY(PROP_GRAVITY, properties.getGravity()); + APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, properties.getAcceleration()); + APPEND_ENTITY_PROPERTY(PROP_DAMPING, properties.getDamping()); + APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, properties.getAngularDamping()); + APPEND_ENTITY_PROPERTY(PROP_RESTITUTION, properties.getRestitution()); + APPEND_ENTITY_PROPERTY(PROP_FRICTION, properties.getFriction()); + APPEND_ENTITY_PROPERTY(PROP_LIFETIME, properties.getLifetime()); + APPEND_ENTITY_PROPERTY(PROP_COLLISIONLESS, properties.getCollisionless()); + APPEND_ENTITY_PROPERTY(PROP_COLLISION_MASK, properties.getCollisionMask()); + APPEND_ENTITY_PROPERTY(PROP_DYNAMIC, properties.getDynamic()); + APPEND_ENTITY_PROPERTY(PROP_SIMULATION_OWNER, properties._simulationOwner.toByteArray()); + APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, properties.getCollisionSoundURL()); + APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, properties.getActionData()); - if (properties.getType() == EntityTypes::Text) { - APPEND_ENTITY_PROPERTY(PROP_TEXT, properties.getText()); - APPEND_ENTITY_PROPERTY(PROP_LINE_HEIGHT, properties.getLineHeight()); - APPEND_ENTITY_PROPERTY(PROP_TEXT_COLOR, properties.getTextColor()); - APPEND_ENTITY_PROPERTY(PROP_TEXT_ALPHA, properties.getTextAlpha()); - APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_COLOR, properties.getBackgroundColor()); - APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_ALPHA, properties.getBackgroundAlpha()); - APPEND_ENTITY_PROPERTY(PROP_BILLBOARD_MODE, (uint32_t)properties.getBillboardMode()); - APPEND_ENTITY_PROPERTY(PROP_LEFT_MARGIN, properties.getLeftMargin()); - APPEND_ENTITY_PROPERTY(PROP_RIGHT_MARGIN, properties.getRightMargin()); - APPEND_ENTITY_PROPERTY(PROP_TOP_MARGIN, properties.getTopMargin()); - APPEND_ENTITY_PROPERTY(PROP_BOTTOM_MARGIN, properties.getBottomMargin()); - } + // Cloning + APPEND_ENTITY_PROPERTY(PROP_CLONEABLE, properties.getCloneable()); + APPEND_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, properties.getCloneLifetime()); + APPEND_ENTITY_PROPERTY(PROP_CLONE_LIMIT, properties.getCloneLimit()); + APPEND_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, properties.getCloneDynamic()); + APPEND_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, properties.getCloneAvatarEntity()); + APPEND_ENTITY_PROPERTY(PROP_CLONE_ORIGIN_ID, properties.getCloneOriginID()); - if (properties.getType() == EntityTypes::Model) { - APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); - APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, properties.getModelURL()); - APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); - APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); - APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); - - APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, properties.getJointRotationsSet()); - APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, properties.getJointRotations()); - APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, properties.getJointTranslationsSet()); - APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, properties.getJointTranslations()); - APPEND_ENTITY_PROPERTY(PROP_RELAY_PARENT_JOINTS, properties.getRelayParentJoints()); - - _staticAnimation.setProperties(properties); - _staticAnimation.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); - } - - if (properties.getType() == EntityTypes::Light) { - APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, properties.getIsSpotlight()); - APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); - APPEND_ENTITY_PROPERTY(PROP_INTENSITY, properties.getIntensity()); - APPEND_ENTITY_PROPERTY(PROP_EXPONENT, properties.getExponent()); - APPEND_ENTITY_PROPERTY(PROP_CUTOFF, properties.getCutoff()); - APPEND_ENTITY_PROPERTY(PROP_FALLOFF_RADIUS, properties.getFalloffRadius()); - } + // Scripts + APPEND_ENTITY_PROPERTY(PROP_SCRIPT, properties.getScript()); + APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, properties.getScriptTimestamp()); + APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, properties.getServerScripts()); if (properties.getType() == EntityTypes::ParticleEffect) { APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); @@ -2685,6 +2739,46 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_PARTICLE_ROTATE_WITH_ENTITY, properties.getRotateWithEntity()) } + if (properties.getType() == EntityTypes::Light) { + APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, properties.getIsSpotlight()); + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); + APPEND_ENTITY_PROPERTY(PROP_INTENSITY, properties.getIntensity()); + APPEND_ENTITY_PROPERTY(PROP_EXPONENT, properties.getExponent()); + APPEND_ENTITY_PROPERTY(PROP_CUTOFF, properties.getCutoff()); + APPEND_ENTITY_PROPERTY(PROP_FALLOFF_RADIUS, properties.getFalloffRadius()); + } + + if (properties.getType() == EntityTypes::Text) { + APPEND_ENTITY_PROPERTY(PROP_TEXT, properties.getText()); + APPEND_ENTITY_PROPERTY(PROP_LINE_HEIGHT, properties.getLineHeight()); + APPEND_ENTITY_PROPERTY(PROP_TEXT_COLOR, properties.getTextColor()); + APPEND_ENTITY_PROPERTY(PROP_TEXT_ALPHA, properties.getTextAlpha()); + APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_COLOR, properties.getBackgroundColor()); + APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_ALPHA, properties.getBackgroundAlpha()); + APPEND_ENTITY_PROPERTY(PROP_BILLBOARD_MODE, (uint32_t)properties.getBillboardMode()); + APPEND_ENTITY_PROPERTY(PROP_LEFT_MARGIN, properties.getLeftMargin()); + APPEND_ENTITY_PROPERTY(PROP_RIGHT_MARGIN, properties.getRightMargin()); + APPEND_ENTITY_PROPERTY(PROP_TOP_MARGIN, properties.getTopMargin()); + APPEND_ENTITY_PROPERTY(PROP_BOTTOM_MARGIN, properties.getBottomMargin()); + } + + if (properties.getType() == EntityTypes::Model) { + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); + APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, properties.getModelURL()); + APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); + APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); + APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); + + APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, properties.getJointRotationsSet()); + APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, properties.getJointRotations()); + APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, properties.getJointTranslationsSet()); + APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, properties.getJointTranslations()); + APPEND_ENTITY_PROPERTY(PROP_RELAY_PARENT_JOINTS, properties.getRelayParentJoints()); + + _staticAnimation.setProperties(properties); + _staticAnimation.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); + } + if (properties.getType() == EntityTypes::Zone) { _staticKeyLight.setProperties(properties); _staticKeyLight.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); @@ -2730,22 +2824,23 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_Z_P_NEIGHBOR_ID, properties.getZPNeighborID()); } - if (properties.getType() == EntityTypes::Line) { - APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); - APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth()); - APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); + if (properties.getType() == EntityTypes::Web) { + APPEND_ENTITY_PROPERTY(PROP_SOURCE_URL, properties.getSourceUrl()); + APPEND_ENTITY_PROPERTY(PROP_DPI, properties.getDPI()); } if (properties.getType() == EntityTypes::PolyLine) { APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); - APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth()); APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); - APPEND_ENTITY_PROPERTY(PROP_NORMALS, properties.getPackedNormals()); - APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, properties.getPackedStrokeColors()); APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, properties.getStrokeWidths()); + APPEND_ENTITY_PROPERTY(PROP_STROKE_NORMALS, properties.getPackedNormals()); + APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, properties.getPackedStrokeColors()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, properties.getIsUVModeStretch()); + APPEND_ENTITY_PROPERTY(PROP_LINE_GLOW, properties.getGlow()); + APPEND_ENTITY_PROPERTY(PROP_LINE_FACE_CAMERA, properties.getFaceCamera()); } + // NOTE: Spheres and Boxes are just special cases of Shape, and they need to include their PROP_SHAPE // when encoding/decoding edits because otherwise they can't polymorph to other shape types if (properties.getType() == EntityTypes::Shape || @@ -2791,10 +2886,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_MINOR_GRID_EVERY, properties.getMinorGridEvery()); } - APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName()); - APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, properties.getCollisionSoundURL()); - APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, properties.getActionData()); - // Certifiable Properties APPEND_ENTITY_PROPERTY(PROP_ITEM_NAME, properties.getItemName()); APPEND_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, properties.getItemDescription()); @@ -2807,16 +2898,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_ENTITY_INSTANCE_NUMBER, properties.getEntityInstanceNumber()); APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, properties.getCertificateID()); APPEND_ENTITY_PROPERTY(PROP_STATIC_CERTIFICATE_VERSION, properties.getStaticCertificateVersion()); - - APPEND_ENTITY_PROPERTY(PROP_CLONEABLE, properties.getCloneable()); - APPEND_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, properties.getCloneLifetime()); - APPEND_ENTITY_PROPERTY(PROP_CLONE_LIMIT, properties.getCloneLimit()); - APPEND_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, properties.getCloneDynamic()); - APPEND_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, properties.getCloneAvatarEntity()); - - _staticGrab.setProperties(properties); - _staticGrab.appendToEditPacket(packetData, requestedProperties, propertyFlags, - propertiesDidntFit, propertyCount, appendState); } if (propertyCount > 0) { @@ -2995,80 +3076,58 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int dataAt += propertyFlags.getEncodedLength(); processedBytes += propertyFlags.getEncodedLength(); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SIMULATION_OWNER, QByteArray, setSimulationOwner); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POSITION, vec3, setPosition); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DIMENSIONS, vec3, setDimensions); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ROTATION, quat, setRotation); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DENSITY, float, setDensity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VELOCITY, vec3, setVelocity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GRAVITY, vec3, setGravity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION, vec3, setAcceleration); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DAMPING, float, setDamping); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RESTITUTION, float, setRestitution); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FRICTION, float, setFriction); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFETIME, float, setLifetime); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT, QString, setScript); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SERVER_SCRIPTS, QString, setServerScripts); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_REGISTRATION_POINT, vec3, setRegistrationPoint); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, vec3, setAngularVelocity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_DAMPING, float, setAngularDamping); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VISIBLE, bool, setVisible); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISIONLESS, bool, setCollisionless); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_MASK, uint16_t, setCollisionMask); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DYNAMIC, bool, setDynamic); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LOCKED, bool, setLocked); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_USER_DATA, QString, setUserData); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_HREF, QString, setHref); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DESCRIPTION, QString, setDescription); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_POSITION, vec3, setPosition); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DIMENSIONS, vec3, setDimensions); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ROTATION, quat, setRotation); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_REGISTRATION_POINT, vec3, setRegistrationPoint); + // FIXME: deal with these + // READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CREATED, quint64, setCreated); + // READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LAST_EDITED_BY, QUuid, setLastEditedBy); + // READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ENTITY_HOST_TYPE, entity::HostType, setEntityHostType); + // READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_OWNING_AVATAR_ID, QUuid, setOwningAvatarID); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARENT_ID, QUuid, setParentID); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARENT_JOINT_INDEX, quint16, setParentJointIndex); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_QUERY_AA_CUBE, AACube, setQueryAACube); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow); + // READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VISIBLE_IN_SECONDARY_CAMERA, bool, setIsVisibleInSecondaryCamera); // Not sent over the wire + properties.getGrab().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); - if (properties.getType() == EntityTypes::Web) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SOURCE_URL, QString, setSourceUrl); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DPI, uint16_t, setDPI); - } + // Physics + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DENSITY, float, setDensity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VELOCITY, vec3, setVelocity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_VELOCITY, vec3, setAngularVelocity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GRAVITY, vec3, setGravity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACCELERATION, vec3, setAcceleration); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DAMPING, float, setDamping); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANGULAR_DAMPING, float, setAngularDamping); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RESTITUTION, float, setRestitution); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FRICTION, float, setFriction); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFETIME, float, setLifetime); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISIONLESS, bool, setCollisionless); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_MASK, uint16_t, setCollisionMask); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DYNAMIC, bool, setDynamic); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SIMULATION_OWNER, QByteArray, setSimulationOwner); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACTION_DATA, QByteArray, setActionData); - if (properties.getType() == EntityTypes::Text) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT, QString, setText); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_HEIGHT, float, setLineHeight); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_COLOR, u8vec3Color, setTextColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_ALPHA, float, setTextAlpha); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, u8vec3Color, setBackgroundColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_ALPHA, float, setBackgroundAlpha); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BILLBOARD_MODE, BillboardMode, setBillboardMode); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LEFT_MARGIN, float, setLeftMargin); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RIGHT_MARGIN, float, setRightMargin); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TOP_MARGIN, float, setTopMargin); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BOTTOM_MARGIN, float, setBottomMargin); - } + // Cloning + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONEABLE, bool, setCloneable); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_LIFETIME, float, setCloneLifetime); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_LIMIT, float, setCloneLimit); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_DYNAMIC, bool, setCloneDynamic); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_AVATAR_ENTITY, bool, setCloneAvatarEntity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_ORIGIN_ID, QUuid, setCloneOriginID); - if (properties.getType() == EntityTypes::Model) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MODEL_URL, QString, setModelURL); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); - - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS_SET, QVector, setJointRotationsSet); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS, QVector, setJointRotations); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS_SET, QVector, setJointTranslationsSet); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS, QVector, setJointTranslations); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RELAY_PARENT_JOINTS, bool, setRelayParentJoints); - - properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); - } - - if (properties.getType() == EntityTypes::Light) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_INTENSITY, float, setIntensity); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EXPONENT, float, setExponent); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CUTOFF, float, setCutoff); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FALLOFF_RADIUS, float, setFalloffRadius); - } + // Scripts + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT, QString, setScript); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SERVER_SCRIPTS, QString, setServerScripts); if (properties.getType() == EntityTypes::ParticleEffect) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); @@ -3116,6 +3175,45 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARTICLE_ROTATE_WITH_ENTITY, bool, setRotateWithEntity); } + if (properties.getType() == EntityTypes::Model) { + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MODEL_URL, QString, setModelURL); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); + + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS_SET, QVector, setJointRotationsSet); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS, QVector, setJointRotations); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS_SET, QVector, setJointTranslationsSet); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS, QVector, setJointTranslations); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RELAY_PARENT_JOINTS, bool, setRelayParentJoints); + + properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); + } + + if (properties.getType() == EntityTypes::Light) { + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_INTENSITY, float, setIntensity); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EXPONENT, float, setExponent); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CUTOFF, float, setCutoff); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FALLOFF_RADIUS, float, setFalloffRadius); + } + + if (properties.getType() == EntityTypes::Text) { + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT, QString, setText); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_HEIGHT, float, setLineHeight); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_COLOR, u8vec3Color, setTextColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT_ALPHA, float, setTextAlpha); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, u8vec3Color, setBackgroundColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_ALPHA, float, setBackgroundAlpha); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BILLBOARD_MODE, BillboardMode, setBillboardMode); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LEFT_MARGIN, float, setLeftMargin); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RIGHT_MARGIN, float, setRightMargin); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TOP_MARGIN, float, setTopMargin); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BOTTOM_MARGIN, float, setBottomMargin); + } + if (properties.getType() == EntityTypes::Zone) { properties.getKeyLight().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); properties.getAmbientLight().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); @@ -3152,22 +3250,21 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_Z_P_NEIGHBOR_ID, EntityItemID, setZPNeighborID); } - if (properties.getType() == EntityTypes::Line) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); + if (properties.getType() == EntityTypes::Web) { + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SOURCE_URL, QString, setSourceUrl); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DPI, uint16_t, setDPI); } - if (properties.getType() == EntityTypes::PolyLine) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NORMALS, QByteArray, setPackedNormals); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_COLORS, QByteArray, setPackedStrokeColors); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_NORMALS, QByteArray, setPackedNormals); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_COLORS, QByteArray, setPackedStrokeColors); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_UV_MODE_STRETCH, bool, setIsUVModeStretch); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_GLOW, bool, setGlow); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_FACE_CAMERA, bool, setFaceCamera); } // NOTE: Spheres and Boxes are just special cases of Shape, and they need to include their PROP_SHAPE @@ -3215,10 +3312,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MINOR_GRID_EVERY, float, setMinorGridEvery); } - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACTION_DATA, QByteArray, setActionData); - // Certifiable Properties READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_NAME, QString, setItemName); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_DESCRIPTION, QString, setItemDescription); @@ -3232,14 +3325,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CERTIFICATE_ID, QString, setCertificateID); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STATIC_CERTIFICATE_VERSION, quint32, setStaticCertificateVersion); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONEABLE, bool, setCloneable); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_LIFETIME, float, setCloneLifetime); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_LIMIT, float, setCloneLimit); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_DYNAMIC, bool, setCloneDynamic); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CLONE_AVATAR_ENTITY, bool, setCloneAvatarEntity); - - properties.getGrab().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); - return valid; } @@ -3364,84 +3449,174 @@ bool EntityItemProperties::decodeCloneEntityMessage(const QByteArray& buffer, in } void EntityItemProperties::markAllChanged() { - _lastEditedByChanged = true; - _simulationOwnerChanged = true; + // Core + _visibleChanged = true; + _nameChanged = true; + _lockedChanged = true; + _userDataChanged = true; + _hrefChanged = true; + _descriptionChanged = true; _positionChanged = true; _dimensionsChanged = true; _rotationChanged = true; + _registrationPointChanged = true; + _createdChanged = true; + _lastEditedByChanged = true; + _entityHostTypeChanged = true; + _owningAvatarIDChanged = true; + _parentIDChanged = true; + _parentJointIndexChanged = true; + _queryAACubeChanged = true; + _canCastShadowChanged = true; + _isVisibleInSecondaryCameraChanged = true; + _grab.markAllChanged(); + + // Physics _densityChanged = true; _velocityChanged = true; + _angularVelocityChanged = true; _gravityChanged = true; _accelerationChanged = true; _dampingChanged = true; + _angularDampingChanged = true; _restitutionChanged = true; _frictionChanged = true; _lifetimeChanged = true; - _userDataChanged = true; - _scriptChanged = true; - _scriptTimestampChanged = true; - _serverScriptsChanged = true; - _collisionSoundURLChanged = true; - _registrationPointChanged = true; - _angularVelocityChanged = true; - _angularDampingChanged = true; - _nameChanged = true; - _visibleChanged = true; - _canCastShadowChanged = true; - _colorChanged = true; - _alphaChanged = true; - _modelURLChanged = true; - _compoundShapeURLChanged = true; - _isSpotlightChanged = true; _collisionlessChanged = true; _collisionMaskChanged = true; _dynamicChanged = true; + _simulationOwnerChanged = true; + _collisionSoundURLChanged = true; + _actionDataChanged = true; - _intensityChanged = true; - _falloffRadiusChanged = true; - _exponentChanged = true; - _cutoffChanged = true; - _lockedChanged = true; - _texturesChanged = true; + // Cloning + _cloneableChanged = true; + _cloneLifetimeChanged = true; + _cloneLimitChanged = true; + _cloneDynamicChanged = true; + _cloneAvatarEntityChanged = true; + _cloneOriginIDChanged = true; - _textChanged = true; - _lineHeightChanged = true; - _textColorChanged = true; - _backgroundColorChanged = true; + // Scripts + _scriptChanged = true; + _scriptTimestampChanged = true; + _serverScriptsChanged = true; + + // Common _shapeTypeChanged = true; + _colorChanged = true; + _alphaChanged = true; + _texturesChanged = true; + _compoundShapeURLChanged = true; - _isEmittingChanged = true; - _emitterShouldTrailChanged = true; + // Particles _maxParticlesChanged = true; _lifespanChanged = true; + _isEmittingChanged = true; _emitRateChanged = true; _emitSpeedChanged = true; _speedSpreadChanged = true; _emitOrientationChanged = true; _emitDimensionsChanged = true; _emitRadiusStartChanged = true; + _emitAccelerationChanged = true; + _accelerationSpreadChanged = true; _polarStartChanged = true; _polarFinishChanged = true; _azimuthStartChanged = true; _azimuthFinishChanged = true; - _emitAccelerationChanged = true; - _accelerationSpreadChanged = true; _particleRadiusChanged = true; _radiusSpreadChanged = true; - _colorSpreadChanged = true; - _alphaSpreadChanged = true; _radiusStartChanged = true; _radiusFinishChanged = true; + _colorSpreadChanged = true; _colorStartChanged = true; _colorFinishChanged = true; + _alphaSpreadChanged = true; _alphaStartChanged = true; _alphaFinishChanged = true; + _emitterShouldTrailChanged = true; _particleSpinChanged = true; _spinStartChanged = true; _spinFinishChanged = true; _spinSpreadChanged = true; _rotateWithEntityChanged = true; + // Model + _modelURLChanged = true; + _jointRotationsSetChanged = true; + _jointRotationsChanged = true; + _jointTranslationsSetChanged = true; + _jointTranslationsChanged = true; + _relayParentJointsChanged = true; + _animation.markAllChanged(); + + // Light + _isSpotlightChanged = true; + _intensityChanged = true; + _exponentChanged = true; + _cutoffChanged = true; + _falloffRadiusChanged = true; + + // Text + _textChanged = true; + _lineHeightChanged = true; + _textColorChanged = true; + _textAlphaChanged = true; + _backgroundColorChanged = true; + _backgroundAlphaChanged = true; + _billboardModeChanged = true; + _leftMarginChanged = true; + _rightMarginChanged = true; + _topMarginChanged = true; + _bottomMarginChanged = true; + + // Zone + _keyLight.markAllChanged(); + _ambientLight.markAllChanged(); + _skybox.markAllChanged(); + _haze.markAllChanged(); + _bloom.markAllChanged(); + _flyingAllowedChanged = true; + _ghostingAllowedChanged = true; + _filterURLChanged = true; + _keyLightModeChanged = true; + _ambientLightModeChanged = true; + _skyboxModeChanged = true; + _hazeModeChanged = true; + _bloomModeChanged = true; + + // Polyvox + _voxelVolumeSizeChanged = true; + _voxelDataChanged = true; + _voxelSurfaceStyleChanged = true; + _xTextureURLChanged = true; + _yTextureURLChanged = true; + _zTextureURLChanged = true; + _xNNeighborIDChanged = true; + _yNNeighborIDChanged = true; + _zNNeighborIDChanged = true; + _xPNeighborIDChanged = true; + _yPNeighborIDChanged = true; + _zPNeighborIDChanged = true; + + // Web + _sourceUrlChanged = true; + _dpiChanged = true; + + // Polyline + _linePointsChanged = true; + _strokeWidthsChanged = true; + _normalsChanged = true; + _strokeColorsChanged = true; + _isUVModeStretchChanged = true; + _glowChanged = true; + _faceCameraChanged = true; + + // Shape + _shapeChanged = true; + + // Material _materialURLChanged = true; _materialMappingModeChanged = true; _priorityChanged = true; @@ -3452,6 +3627,17 @@ void EntityItemProperties::markAllChanged() { _materialDataChanged = true; _materialRepeatChanged = true; + // Image + _imageURLChanged = true; + _emissiveChanged = true; + _keepAspectRatioChanged = true; + _subImageChanged = true; + + // Grid + _followCameraChanged = true; + _majorGridEveryChanged = true; + _minorGridEveryChanged = true; + // Certifiable Properties _itemNameChanged = true; _itemDescriptionChanged = true; @@ -3464,99 +3650,6 @@ void EntityItemProperties::markAllChanged() { _entityInstanceNumberChanged = true; _certificateIDChanged = true; _staticCertificateVersionChanged = true; - - _keyLight.markAllChanged(); - _ambientLight.markAllChanged(); - _skybox.markAllChanged(); - - _keyLightModeChanged = true; - _skyboxModeChanged = true; - _ambientLightModeChanged = true; - _hazeModeChanged = true; - _bloomModeChanged = true; - - _animation.markAllChanged(); - _skybox.markAllChanged(); - _haze.markAllChanged(); - _bloom.markAllChanged(); - _grab.markAllChanged(); - - _sourceUrlChanged = true; - _voxelVolumeSizeChanged = true; - _voxelDataChanged = true; - _voxelSurfaceStyleChanged = true; - - _lineWidthChanged = true; - _linePointsChanged = true; - - _hrefChanged = true; - _descriptionChanged = true; - _billboardModeChanged = true; - _actionDataChanged = true; - - _normalsChanged = true; - _strokeColorsChanged = true; - _strokeWidthsChanged = true; - _isUVModeStretchChanged = true; - - _xTextureURLChanged = true; - _yTextureURLChanged = true; - _zTextureURLChanged = true; - - _xNNeighborIDChanged = true; - _yNNeighborIDChanged = true; - _zNNeighborIDChanged = true; - - _xPNeighborIDChanged = true; - _yPNeighborIDChanged = true; - _zPNeighborIDChanged = true; - - _parentIDChanged = true; - _parentJointIndexChanged = true; - - _jointRotationsSetChanged = true; - _jointRotationsChanged = true; - _jointTranslationsSetChanged = true; - _jointTranslationsChanged = true; - - _queryAACubeChanged = true; - - _shapeChanged = true; - - _flyingAllowedChanged = true; - _ghostingAllowedChanged = true; - _filterURLChanged = true; - - _entityHostTypeChanged = true; - _owningAvatarIDChanged = true; - - _dpiChanged = true; - _relayParentJointsChanged = true; - - _cloneableChanged = true; - _cloneLifetimeChanged = true; - _cloneLimitChanged = true; - _cloneDynamicChanged = true; - _cloneAvatarEntityChanged = true; - _cloneOriginIDChanged = true; - - _isVisibleInSecondaryCameraChanged = true; - - _imageURLChanged = true; - _emissiveChanged = true; - _keepAspectRatioChanged = true; - _subImageChanged = true; - - _followCameraChanged = true; - _majorGridEveryChanged = true; - _minorGridEveryChanged = true; - - _textAlphaChanged = true; - _backgroundAlphaChanged = true; - _leftMarginChanged = true; - _rightMarginChanged = true; - _topMarginChanged = true; - _bottomMarginChanged = true; } // The minimum bounding box for the entity. @@ -3674,30 +3767,78 @@ uint8_t EntityItemProperties::computeSimulationBidPriority() const { QList EntityItemProperties::listChangedProperties() { QList out; + + // Core + if (visibleChanged()) { + out += "visible"; + } + if (nameChanged()) { + out += "name"; + } + if (lockedChanged()) { + out += "locked"; + } + if (userDataChanged()) { + out += "userData"; + } + if (hrefChanged()) { + out += "href"; + } + if (descriptionChanged()) { + out += "description"; + } if (containsPositionChange()) { out += "position"; } if (dimensionsChanged()) { out += "dimensions"; } - if (velocityChanged()) { - out += "velocity"; + if (rotationChanged()) { + out += "rotation"; } - if (nameChanged()) { - out += "name"; + if (registrationPointChanged()) { + out += "registrationPoint"; } - if (visibleChanged()) { - out += "visible"; + // FIXME: handle these + //if (createdChanged()) { + // out += "created"; + //} + //if (lastEditedByChanged()) { + // out += "lastEditedBy"; + //} + if (entityHostTypeChanged()) { + out += "entityHostType"; + } + if (owningAvatarIDChanged()) { + out += "owningAvatarID"; + } + if (parentIDChanged()) { + out += "parentID"; + } + if (parentJointIndexChanged()) { + out += "parentJointIndex"; + } + if (queryAACubeChanged()) { + out += "queryAACube"; } if (canCastShadowChanged()) { out += "canCastShadow"; } - if (rotationChanged()) { - out += "rotation"; + if (isVisibleInSecondaryCameraChanged()) { + out += "isVisibleInSecondaryCamera"; } + getGrab().listChangedProperties(out); + + // Physics if (densityChanged()) { out += "density"; } + if (velocityChanged()) { + out += "velocity"; + } + if (angularVelocityChanged()) { + out += "angularVelocity"; + } if (gravityChanged()) { out += "gravity"; } @@ -3707,6 +3848,9 @@ QList EntityItemProperties::listChangedProperties() { if (dampingChanged()) { out += "damping"; } + if (angularDampingChanged()) { + out += "angularDamping"; + } if (restitutionChanged()) { out += "restitution"; } @@ -3716,60 +3860,6 @@ QList EntityItemProperties::listChangedProperties() { if (lifetimeChanged()) { out += "lifetime"; } - if (scriptChanged()) { - out += "script"; - } - if (scriptTimestampChanged()) { - out += "scriptTimestamp"; - } - if (serverScriptsChanged()) { - out += "serverScripts"; - } - if (collisionSoundURLChanged()) { - out += "collisionSoundURL"; - } - if (colorChanged()) { - out += "color"; - } - if (colorSpreadChanged()) { - out += "colorSpread"; - } - if (colorStartChanged()) { - out += "colorStart"; - } - if (colorFinishChanged()) { - out += "colorFinish"; - } - if (alphaChanged()) { - out += "alpha"; - } - if (alphaSpreadChanged()) { - out += "alphaSpread"; - } - if (alphaStartChanged()) { - out += "alphaStart"; - } - if (alphaFinishChanged()) { - out += "alphaFinish"; - } - if (emitterShouldTrailChanged()) { - out += "emitterShouldTrail"; - } - if (modelURLChanged()) { - out += "modelURL"; - } - if (compoundShapeURLChanged()) { - out += "compoundShapeURL"; - } - if (registrationPointChanged()) { - out += "registrationPoint"; - } - if (angularVelocityChanged()) { - out += "angularVelocity"; - } - if (angularDampingChanged()) { - out += "angularDamping"; - } if (collisionlessChanged()) { out += "collisionless"; } @@ -3779,48 +3869,65 @@ QList EntityItemProperties::listChangedProperties() { if (dynamicChanged()) { out += "dynamic"; } - if (isSpotlightChanged()) { - out += "isSpotlight"; + if (simulationOwnerChanged()) { + out += "simulationOwner"; } - if (intensityChanged()) { - out += "intensity"; + if (collisionSoundURLChanged()) { + out += "collisionSoundURL"; } - if (falloffRadiusChanged()) { - out += "falloffRadius"; + if (actionDataChanged()) { + out += "actionData"; } - if (exponentChanged()) { - out += "exponent"; + + // Cloning + if (cloneableChanged()) { + out += "cloneable"; } - if (cutoffChanged()) { - out += "cutoff"; + if (cloneLifetimeChanged()) { + out += "cloneLifetime"; } - if (lockedChanged()) { - out += "locked"; + if (cloneLimitChanged()) { + out += "cloneLimit"; + } + if (cloneDynamicChanged()) { + out += "cloneDynamic"; + } + if (cloneAvatarEntityChanged()) { + out += "cloneAvatarEntity"; + } + if (cloneOriginIDChanged()) { + out += "cloneOriginID"; + } + + // Scripts + if (scriptChanged()) { + out += "script"; + } + if (scriptTimestampChanged()) { + out += "scriptTimestamp"; + } + if (serverScriptsChanged()) { + out += "serverScripts"; + } + + // Common + if (shapeTypeChanged()) { + out += "shapeType"; + } + if (compoundShapeURLChanged()) { + out += "compoundShapeURL"; + } + if (colorChanged()) { + out += "color"; + } + if (alphaChanged()) { + out += "alpha"; } if (texturesChanged()) { out += "textures"; } - if (userDataChanged()) { - out += "userData"; - } - if (simulationOwnerChanged()) { - out += "simulationOwner"; - } - if (textChanged()) { - out += "text"; - } - if (lineHeightChanged()) { - out += "lineHeight"; - } - if (textColorChanged()) { - out += "textColor"; - } - if (backgroundColorChanged()) { - out += "backgroundColor"; - } - if (shapeTypeChanged()) { - out += "shapeType"; - } + + // Particles if (maxParticlesChanged()) { out += "maxParticles"; } @@ -3848,6 +3955,12 @@ QList EntityItemProperties::listChangedProperties() { if (emitRadiusStartChanged()) { out += "emitRadiusStart"; } + if (emitAccelerationChanged()) { + out += "emitAcceleration"; + } + if (accelerationSpreadChanged()) { + out += "accelerationSpread"; + } if (polarStartChanged()) { out += "polarStart"; } @@ -3860,12 +3973,6 @@ QList EntityItemProperties::listChangedProperties() { if (azimuthFinishChanged()) { out += "azimuthFinish"; } - if (emitAccelerationChanged()) { - out += "emitAcceleration"; - } - if (accelerationSpreadChanged()) { - out += "accelerationSpread"; - } if (particleRadiusChanged()) { out += "particleRadius"; } @@ -3878,6 +3985,27 @@ QList EntityItemProperties::listChangedProperties() { if (radiusFinishChanged()) { out += "radiusFinish"; } + if (colorSpreadChanged()) { + out += "colorSpread"; + } + if (colorStartChanged()) { + out += "colorStart"; + } + if (colorFinishChanged()) { + out += "colorFinish"; + } + if (alphaSpreadChanged()) { + out += "alphaSpread"; + } + if (alphaStartChanged()) { + out += "alphaStart"; + } + if (alphaFinishChanged()) { + out += "alphaFinish"; + } + if (emitterShouldTrailChanged()) { + out += "emitterShouldTrail"; + } if (particleSpinChanged()) { out += "particleSpin"; } @@ -3893,6 +4021,186 @@ QList EntityItemProperties::listChangedProperties() { if (rotateWithEntityChanged()) { out += "rotateWithEntity"; } + + // Model + if (modelURLChanged()) { + out += "modelURL"; + } + if (jointRotationsSetChanged()) { + out += "jointRotationsSet"; + } + if (jointRotationsChanged()) { + out += "jointRotations"; + } + if (jointTranslationsSetChanged()) { + out += "jointTranslationsSet"; + } + if (jointTranslationsChanged()) { + out += "jointTranslations"; + } + if (relayParentJointsChanged()) { + out += "relayParentJoints"; + } + getAnimation().listChangedProperties(out); + + // Light + if (isSpotlightChanged()) { + out += "isSpotlight"; + } + if (intensityChanged()) { + out += "intensity"; + } + if (exponentChanged()) { + out += "exponent"; + } + if (cutoffChanged()) { + out += "cutoff"; + } + if (falloffRadiusChanged()) { + out += "falloffRadius"; + } + + // Text + if (textChanged()) { + out += "text"; + } + if (lineHeightChanged()) { + out += "lineHeight"; + } + if (textColorChanged()) { + out += "textColor"; + } + if (textAlphaChanged()) { + out += "textAlpha"; + } + if (backgroundColorChanged()) { + out += "backgroundColor"; + } + if (backgroundAlphaChanged()) { + out += "backgroundAlpha"; + } + if (billboardModeChanged()) { + out += "billboardMode"; + } + if (leftMarginChanged()) { + out += "leftMargin"; + } + if (rightMarginChanged()) { + out += "rightMargin"; + } + if (topMarginChanged()) { + out += "topMargin"; + } + if (bottomMarginChanged()) { + out += "bottomMargin"; + } + + // Zone + getKeyLight().listChangedProperties(out); + getAmbientLight().listChangedProperties(out); + getSkybox().listChangedProperties(out); + getHaze().listChangedProperties(out); + getBloom().listChangedProperties(out); + if (flyingAllowedChanged()) { + out += "flyingAllowed"; + } + if (ghostingAllowedChanged()) { + out += "ghostingAllowed"; + } + if (filterURLChanged()) { + out += "filterURL"; + } + if (keyLightModeChanged()) { + out += "keyLightMode"; + } + if (ambientLightModeChanged()) { + out += "ambientLightMode"; + } + if (skyboxModeChanged()) { + out += "skyboxMode"; + } + if (hazeModeChanged()) { + out += "hazeMode"; + } + if (bloomModeChanged()) { + out += "bloomMode"; + } + + // Polyvox + if (voxelVolumeSizeChanged()) { + out += "voxelVolumeSize"; + } + if (voxelDataChanged()) { + out += "voxelData"; + } + if (voxelSurfaceStyleChanged()) { + out += "voxelSurfaceStyle"; + } + if (xTextureURLChanged()) { + out += "xTextureURL"; + } + if (yTextureURLChanged()) { + out += "yTextureURL"; + } + if (zTextureURLChanged()) { + out += "zTextureURL"; + } + if (xNNeighborIDChanged()) { + out += "xNNeighborID"; + } + if (yNNeighborIDChanged()) { + out += "yNNeighborID"; + } + if (zNNeighborIDChanged()) { + out += "zNNeighborID"; + } + if (xPNeighborIDChanged()) { + out += "xPNeighborID"; + } + if (yPNeighborIDChanged()) { + out += "yPNeighborID"; + } + if (zPNeighborIDChanged()) { + out += "zPNeighborID"; + } + + // Web + if (sourceUrlChanged()) { + out += "sourceUrl"; + } + if (dpiChanged()) { + out += "dpi"; + } + + // Polyline + if (linePointsChanged()) { + out += "linePoints"; + } + if (strokeWidthsChanged()) { + out += "strokeWidths"; + } + if (normalsChanged()) { + out += "normals"; + } + if (strokeColorsChanged()) { + out += "strokeColors"; + } + if (isUVModeStretchChanged()) { + out += "isUVModeStretch"; + } + if (glowChanged()) { + out += "glow"; + } + if (faceCameraChanged()) { + out += "faceCamera"; + } + + // Shape + if (shapeChanged()) { + out += "shape"; + } + + // Material if (materialURLChanged()) { out += "materialURL"; } @@ -3920,8 +4228,30 @@ QList EntityItemProperties::listChangedProperties() { if (materialRepeatChanged()) { out += "materialRepeat"; } - if (isVisibleInSecondaryCameraChanged()) { - out += "isVisibleInSecondaryCamera"; + + // Image + if (imageURLChanged()) { + out += "imageURL"; + } + if (emissiveChanged()) { + out += "emissive"; + } + if (keepAspectRatioChanged()) { + out += "keepAspectRatio"; + } + if (subImageChanged()) { + out += "subImage"; + } + + // Grid + if (followCameraChanged()) { + out += "followCamera"; + } + if (majorGridEveryChanged()) { + out += "majorGridEvery"; + } + if (minorGridEveryChanged()) { + out += "minorGridEvery"; } // Certifiable Properties @@ -3959,197 +4289,6 @@ QList EntityItemProperties::listChangedProperties() { out += "staticCertificateVersion"; } - if (hazeModeChanged()) { - out += "hazeMode"; - } - if (bloomModeChanged()) { - out += "bloomMode"; - } - if (keyLightModeChanged()) { - out += "keyLightMode"; - } - if (ambientLightModeChanged()) { - out += "ambientLightMode"; - } - if (skyboxModeChanged()) { - out += "skyboxMode"; - } - - if (voxelVolumeSizeChanged()) { - out += "voxelVolumeSize"; - } - if (voxelDataChanged()) { - out += "voxelData"; - } - if (voxelSurfaceStyleChanged()) { - out += "voxelSurfaceStyle"; - } - if (hrefChanged()) { - out += "href"; - } - if (descriptionChanged()) { - out += "description"; - } - if (actionDataChanged()) { - out += "actionData"; - } - if (xTextureURLChanged()) { - out += "xTextureURL"; - } - if (yTextureURLChanged()) { - out += "yTextureURL"; - } - if (zTextureURLChanged()) { - out += "zTextureURL"; - } - if (xNNeighborIDChanged()) { - out += "xNNeighborID"; - } - if (yNNeighborIDChanged()) { - out += "yNNeighborID"; - } - if (zNNeighborIDChanged()) { - out += "zNNeighborID"; - } - if (xPNeighborIDChanged()) { - out += "xPNeighborID"; - } - if (yPNeighborIDChanged()) { - out += "yPNeighborID"; - } - if (zPNeighborIDChanged()) { - out += "zPNeighborID"; - } - if (parentIDChanged()) { - out += "parentID"; - } - if (parentJointIndexChanged()) { - out += "parentJointIndex"; - } - if (jointRotationsSetChanged()) { - out += "jointRotationsSet"; - } - if (jointRotationsChanged()) { - out += "jointRotations"; - } - if (jointTranslationsSetChanged()) { - out += "jointTranslationsSet"; - } - if (jointTranslationsChanged()) { - out += "jointTranslations"; - } - if (relayParentJointsChanged()) { - out += "relayParentJoints"; - } - if (queryAACubeChanged()) { - out += "queryAACube"; - } - - if (entityHostTypeChanged()) { - out += "entityHostType"; - } - if (owningAvatarIDChanged()) { - out += "owningAvatarID"; - } - - if (flyingAllowedChanged()) { - out += "flyingAllowed"; - } - if (ghostingAllowedChanged()) { - out += "ghostingAllowed"; - } - if (filterURLChanged()) { - out += "filterURL"; - } - if (dpiChanged()) { - out += "dpi"; - } - - if (shapeChanged()) { - out += "shape"; - } - - if (strokeColorsChanged()) { - out += "strokeColors"; - } - - if (isUVModeStretchChanged()) { - out += "isUVModeStretch"; - } - - if (cloneableChanged()) { - out += "cloneable"; - } - if (cloneLifetimeChanged()) { - out += "cloneLifetime"; - } - if (cloneLimitChanged()) { - out += "cloneLimit"; - } - if (cloneDynamicChanged()) { - out += "cloneDynamic"; - } - if (cloneAvatarEntityChanged()) { - out += "cloneAvatarEntity"; - } - if (cloneOriginIDChanged()) { - out += "cloneOriginID"; - } - - if (imageURLChanged()) { - out += "imageURL"; - } - if (emissiveChanged()) { - out += "emissive"; - } - if (keepAspectRatioChanged()) { - out += "keepAspectRatio"; - } - if (subImageChanged()) { - out += "subImage"; - } - - if (billboardModeChanged()) { - out += "billboardMode"; - } - - if (followCameraChanged()) { - out += "followCamera"; - } - if (majorGridEveryChanged()) { - out += "majorGridEvery"; - } - if (minorGridEveryChanged()) { - out += "minorGridEvery"; - } - - if (textAlphaChanged()) { - out += "textAlpha"; - } - if (backgroundAlphaChanged()) { - out += "backgroundAlpha"; - } - if (leftMarginChanged()) { - out += "leftMargin"; - } - if (rightMarginChanged()) { - out += "rightMargin"; - } - if (topMarginChanged()) { - out += "topMargin"; - } - if (bottomMarginChanged()) { - out += "bottomMargin"; - } - - getAnimation().listChangedProperties(out); - getKeyLight().listChangedProperties(out); - getAmbientLight().listChangedProperties(out); - getSkybox().listChangedProperties(out); - getHaze().listChangedProperties(out); - getBloom().listChangedProperties(out); - getGrab().listChangedProperties(out); - return out; } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index f9ec0b9605..7cc2429e17 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -37,7 +37,6 @@ #include "EntityPropertyFlags.h" #include "EntityPsuedoPropertyFlags.h" #include "LightEntityItem.h" -#include "LineEntityItem.h" #include "ParticleEffectEntityItem.h" #include "PolyVoxEntityItem.h" #include "SimulationOwner.h" @@ -78,7 +77,6 @@ class EntityItemProperties { friend class ImageEntityItem; friend class WebEntityItem; friend class ParticleEffectEntityItem; - friend class LineEntityItem; friend class PolyLineEntityItem; friend class PolyVoxEntityItem; friend class GridEntityItem; @@ -181,8 +179,14 @@ public: DEFINE_PROPERTY(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64, ENTITY_ITEM_DEFAULT_SCRIPT_TIMESTAMP); DEFINE_PROPERTY_REF(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString, ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS); - // Particles + // Common DEFINE_PROPERTY_REF_ENUM(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType, SHAPE_TYPE_NONE); + DEFINE_PROPERTY_REF(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString, ""); + DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, u8vec3Color, particle::DEFAULT_COLOR); + DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float, particle::DEFAULT_ALPHA); + DEFINE_PROPERTY_REF(PROP_TEXTURES, Textures, textures, QString, ""); + + // Particles DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32, particle::DEFAULT_MAX_PARTICLES); DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float, particle::DEFAULT_LIFESPAN); DEFINE_PROPERTY(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool, true); @@ -202,15 +206,12 @@ public: DEFINE_PROPERTY(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float, particle::DEFAULT_RADIUS_SPREAD); DEFINE_PROPERTY(PROP_RADIUS_START, RadiusStart, radiusStart, float, particle::DEFAULT_RADIUS_START); DEFINE_PROPERTY(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float, particle::DEFAULT_RADIUS_FINISH); - DEFINE_PROPERTY_REF(PROP_COLOR, Color, color, u8vec3Color, particle::DEFAULT_COLOR); DEFINE_PROPERTY_REF(PROP_COLOR_SPREAD, ColorSpread, colorSpread, u8vec3Color, particle::DEFAULT_COLOR_SPREAD); DEFINE_PROPERTY_REF(PROP_COLOR_START, ColorStart, colorStart, glm::vec3, particle::DEFAULT_COLOR_UNINITIALIZED); DEFINE_PROPERTY_REF(PROP_COLOR_FINISH, ColorFinish, colorFinish, glm::vec3, particle::DEFAULT_COLOR_UNINITIALIZED); - DEFINE_PROPERTY(PROP_ALPHA, Alpha, alpha, float, particle::DEFAULT_ALPHA); DEFINE_PROPERTY(PROP_ALPHA_SPREAD, AlphaSpread, alphaSpread, float, particle::DEFAULT_ALPHA_SPREAD); DEFINE_PROPERTY(PROP_ALPHA_START, AlphaStart, alphaStart, float, particle::DEFAULT_ALPHA_START); DEFINE_PROPERTY(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float, particle::DEFAULT_ALPHA_FINISH); - DEFINE_PROPERTY_REF(PROP_TEXTURES, Textures, textures, QString, ""); DEFINE_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool, particle::DEFAULT_EMITTER_SHOULD_TRAIL); DEFINE_PROPERTY(PROP_PARTICLE_SPIN, ParticleSpin, particleSpin, float, particle::DEFAULT_PARTICLE_SPIN); DEFINE_PROPERTY(PROP_SPIN_SPREAD, SpinSpread, spinSpread, float, particle::DEFAULT_SPIN_SPREAD); @@ -220,7 +221,6 @@ public: // Model DEFINE_PROPERTY_REF(PROP_MODEL_URL, ModelURL, modelURL, QString, ""); - DEFINE_PROPERTY_REF(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString, ""); DEFINE_PROPERTY_REF(PROP_JOINT_ROTATIONS_SET, JointRotationsSet, jointRotationsSet, QVector, QVector()); DEFINE_PROPERTY_REF(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector, QVector()); DEFINE_PROPERTY_REF(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector, QVector()); @@ -281,15 +281,14 @@ public: DEFINE_PROPERTY_REF(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString, ""); DEFINE_PROPERTY_REF(PROP_DPI, DPI, dpi, uint16_t, ENTITY_ITEM_DEFAULT_DPI); - // Line - DEFINE_PROPERTY(PROP_LINE_WIDTH, LineWidth, lineWidth, float, LineEntityItem::DEFAULT_LINE_WIDTH); - DEFINE_PROPERTY_REF(LINE_POINTS, LinePoints, linePoints, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); - // Polyline - DEFINE_PROPERTY(PROP_NORMALS, Normals, normals, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); - DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); + DEFINE_PROPERTY_REF(PROP_LINE_POINTS, LinePoints, linePoints, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector, QVector()); + DEFINE_PROPERTY(PROP_STROKE_NORMALS, Normals, normals, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); + DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, bool, true); + DEFINE_PROPERTY(PROP_LINE_GLOW, Glow, glow, bool, false); + DEFINE_PROPERTY(PROP_LINE_FACE_CAMERA, FaceCamera, faceCamera, bool, false); // Shape DEFINE_PROPERTY_REF(PROP_SHAPE, Shape, shape, QString, "Sphere"); diff --git a/libraries/entities/src/EntityPropertyFlags.cpp b/libraries/entities/src/EntityPropertyFlags.cpp index dbb8463141..4cc44e8318 100644 --- a/libraries/entities/src/EntityPropertyFlags.cpp +++ b/libraries/entities/src/EntityPropertyFlags.cpp @@ -49,7 +49,6 @@ QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f) { result = f.getHasProperty(PROP_LIFESPAN) ? result + "lifespan " : result; result = f.getHasProperty(PROP_EMIT_RATE) ? result + "emitRate " : result; result = f.getHasProperty(PROP_EMIT_SPEED) ? result + "emitSpeed " : result; - result = f.getHasProperty(PROP_EMIT_STRENGTH) ? result + "emitStrength " : result; result = f.getHasProperty(PROP_EMIT_ACCELERATION) ? result + "emitAcceleration " : result; result = f.getHasProperty(PROP_PARTICLE_RADIUS) ? result + "particleRadius " : result; result = f.getHasProperty(PROP_COMPOUND_SHAPE_URL) ? result + "compoundShapeUrl " : result; @@ -63,7 +62,6 @@ QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f) { result = f.getHasProperty(PROP_VOXEL_VOLUME_SIZE) ? result + "voxelVolumeSize " : result; result = f.getHasProperty(PROP_VOXEL_DATA) ? result + "voxelData " : result; result = f.getHasProperty(PROP_VOXEL_SURFACE_STYLE) ? result + "voxelSurfaceStyle " : result; - result = f.getHasProperty(PROP_LINE_WIDTH) ? result + "lineWidth " : result; result = f.getHasProperty(PROP_LINE_POINTS) ? result + "linePoints " : result; result = f.getHasProperty(PROP_HREF) ? result + "href " : result; result = f.getHasProperty(PROP_DESCRIPTION) ? result + "description " : result; diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 864d5efa10..78a15d259a 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -18,250 +18,27 @@ enum EntityPropertyList { PROP_PAGED_PROPERTY, PROP_CUSTOM_PROPERTIES_INCLUDED, - // these properties are supported by the EntityItem base class + // Core properties PROP_VISIBLE, - PROP_CAN_CAST_SHADOW, + PROP_NAME, + PROP_LOCKED, + PROP_USER_DATA, + PROP_HREF, + PROP_DESCRIPTION, PROP_POSITION, PROP_DIMENSIONS, PROP_ROTATION, - PROP_DENSITY, - PROP_VELOCITY, - PROP_GRAVITY, - PROP_DAMPING, - PROP_LIFETIME, - PROP_SCRIPT, - - // these properties are supported by some derived classes - PROP_COLOR, - - // these are used by models only - PROP_MODEL_URL, - PROP_ANIMATION_URL, - PROP_ANIMATION_FPS, - PROP_ANIMATION_FRAME_INDEX, - PROP_ANIMATION_PLAYING, - PROP_ANIMATION_ALLOW_TRANSLATION, - PROP_RELAY_PARENT_JOINTS, - - // these properties are supported by the EntityItem base class PROP_REGISTRATION_POINT, - PROP_ANGULAR_VELOCITY, - PROP_ANGULAR_DAMPING, - PROP_COLLISIONLESS, - PROP_DYNAMIC, // 24 - - // property used by Light entity - PROP_IS_SPOTLIGHT, - PROP_DIFFUSE_COLOR, - PROP_AMBIENT_COLOR_UNUSED, // FIXME - No longer used, can remove and bump protocol - PROP_SPECULAR_COLOR_UNUSED, // FIXME - No longer used, can remove and bump protocol - PROP_INTENSITY, // Previously PROP_CONSTANT_ATTENUATION - PROP_LINEAR_ATTENUATION_UNUSED, - PROP_QUADRATIC_ATTENUATION_UNUSED, - PROP_EXPONENT, - PROP_CUTOFF, - - // available to all entities - PROP_LOCKED, // 34 - - PROP_TEXTURES, // used by Model entities - PROP_ANIMATION_SETTINGS_UNUSED, // FIXME - No longer used, can remove and bump protocol - PROP_USER_DATA, // all entities -- 37 - PROP_SHAPE_TYPE, // used by Model + zones entities - - // used by ParticleEffect entities - PROP_MAX_PARTICLES, // 39 - PROP_LIFESPAN, // 40 -- used by all entities - PROP_EMIT_RATE, - PROP_EMIT_SPEED, - PROP_EMIT_STRENGTH, - PROP_EMIT_ACCELERATION, // FIXME - doesn't seem to get set in mark all changed???? - PROP_PARTICLE_RADIUS, // 45!! - - PROP_COMPOUND_SHAPE_URL, // used by Model + zones entities - PROP_MARKETPLACE_ID, // all entities - PROP_ACCELERATION, // all entities - PROP_SIMULATION_OWNER, // formerly known as PROP_SIMULATOR_ID - PROP_NAME, // all entities -- 50 - PROP_COLLISION_SOUND_URL, - PROP_RESTITUTION, - PROP_FRICTION, // 53 - - PROP_VOXEL_VOLUME_SIZE, - PROP_VOXEL_DATA, - PROP_VOXEL_SURFACE_STYLE, - - //for lines - PROP_LINE_WIDTH, - PROP_LINE_POINTS, - - // used by hyperlinks - PROP_HREF, - PROP_DESCRIPTION, // 61 - - PROP_BILLBOARD_MODE, - PROP_SCRIPT_TIMESTAMP, - - PROP_ACTION_DATA, - - PROP_X_TEXTURE_URL, // used by PolyVox - PROP_Y_TEXTURE_URL, // used by PolyVox - PROP_Z_TEXTURE_URL, // used by PolyVox - - // Used by PolyLine entity - PROP_NORMALS, - PROP_STROKE_COLORS, - PROP_STROKE_WIDTHS, - PROP_IS_UV_MODE_STRETCH, - - // used by particles - PROP_SPEED_SPREAD, - PROP_ACCELERATION_SPREAD, - - PROP_X_N_NEIGHBOR_ID, // used by PolyVox - PROP_Y_N_NEIGHBOR_ID, // used by PolyVox - PROP_Z_N_NEIGHBOR_ID, // used by PolyVox - PROP_X_P_NEIGHBOR_ID, // used by PolyVox - PROP_Y_P_NEIGHBOR_ID, // used by PolyVox - PROP_Z_P_NEIGHBOR_ID, // used by PolyVox - - // Used by particles - PROP_RADIUS_SPREAD, - PROP_RADIUS_START, - PROP_RADIUS_FINISH, - - PROP_ALPHA, // Supported by some derived classes - - //Used by particles - PROP_COLOR_SPREAD, - PROP_COLOR_START, - PROP_COLOR_FINISH, - PROP_ALPHA_SPREAD, - PROP_ALPHA_START, - PROP_ALPHA_FINISH, - PROP_EMIT_ORIENTATION, - PROP_EMIT_DIMENSIONS, - PROP_EMIT_RADIUS_START, - PROP_POLAR_START, - PROP_POLAR_FINISH, - PROP_AZIMUTH_START, - PROP_AZIMUTH_FINISH, - - PROP_ANIMATION_LOOP, - PROP_ANIMATION_FIRST_FRAME, - PROP_ANIMATION_LAST_FRAME, - PROP_ANIMATION_HOLD, - PROP_ANIMATION_START_AUTOMATICALLY, - - PROP_EMITTER_SHOULD_TRAIL, - + PROP_CREATED, + PROP_LAST_EDITED_BY, + PROP_ENTITY_HOST_TYPE, // not sent over wire + PROP_OWNING_AVATAR_ID, // not sent over wire PROP_PARENT_ID, PROP_PARENT_JOINT_INDEX, - - PROP_LOCAL_POSITION, // only used to convert values to and from scripts - PROP_LOCAL_ROTATION, // only used to convert values to and from scripts - - PROP_QUERY_AA_CUBE, // how the EntityTree considers the size and position on an entity - - // ModelEntity joint state - PROP_JOINT_ROTATIONS_SET, - PROP_JOINT_ROTATIONS, - PROP_JOINT_TRANSLATIONS_SET, - PROP_JOINT_TRANSLATIONS, - - PROP_COLLISION_MASK, // one byte of collision group flags - - PROP_FALLOFF_RADIUS, // for Light entity - - PROP_FLYING_ALLOWED, // can avatars in a zone fly? - PROP_GHOSTING_ALLOWED, // can avatars in a zone turn off physics? - - PROP_ENTITY_HOST_TYPE, // doesn't go over wire - PROP_OWNING_AVATAR_ID, // doesn't go over wire - - PROP_SHAPE, - PROP_DPI, - - PROP_LOCAL_VELOCITY, // only used to convert values to and from scripts - PROP_LOCAL_ANGULAR_VELOCITY, // only used to convert values to and from scripts - - PROP_LAST_EDITED_BY, - - PROP_SERVER_SCRIPTS, - - PROP_FILTER_URL, - - // Certificable Properties - PROP_ITEM_NAME, - PROP_ITEM_DESCRIPTION, - PROP_ITEM_CATEGORIES, - PROP_ITEM_ARTIST, - PROP_ITEM_LICENSE, - PROP_LIMITED_RUN, - // PROP_MARKETPLACE_ID is above - PROP_EDITION_NUMBER, - PROP_ENTITY_INSTANCE_NUMBER, - PROP_CERTIFICATE_ID, - PROP_STATIC_CERTIFICATE_VERSION, - - PROP_CLONEABLE, - PROP_CLONE_LIFETIME, - PROP_CLONE_LIMIT, - PROP_CLONE_DYNAMIC, - PROP_CLONE_AVATAR_ENTITY, - PROP_CLONE_ORIGIN_ID, - - PROP_HAZE_MODE, - - PROP_KEYLIGHT_COLOR, - PROP_KEYLIGHT_INTENSITY, - PROP_KEYLIGHT_DIRECTION, - PROP_KEYLIGHT_CAST_SHADOW, - - PROP_HAZE_RANGE, - PROP_HAZE_COLOR, - PROP_HAZE_GLARE_COLOR, - PROP_HAZE_ENABLE_GLARE, - PROP_HAZE_GLARE_ANGLE, - - PROP_HAZE_ALTITUDE_EFFECT, - PROP_HAZE_CEILING, - PROP_HAZE_BASE_REF, - - PROP_HAZE_BACKGROUND_BLEND, - - PROP_HAZE_ATTENUATE_KEYLIGHT, - PROP_HAZE_KEYLIGHT_RANGE, - PROP_HAZE_KEYLIGHT_ALTITUDE, - - PROP_KEY_LIGHT_MODE, - PROP_AMBIENT_LIGHT_MODE, - PROP_SKYBOX_MODE, - - PROP_LOCAL_DIMENSIONS, // only used to convert values to and from scripts - - PROP_MATERIAL_URL, - PROP_MATERIAL_MAPPING_MODE, - PROP_MATERIAL_PRIORITY, - PROP_PARENT_MATERIAL_NAME, - PROP_MATERIAL_MAPPING_POS, - PROP_MATERIAL_MAPPING_SCALE, - PROP_MATERIAL_MAPPING_ROT, - PROP_MATERIAL_DATA, - - PROP_VISIBLE_IN_SECONDARY_CAMERA, // not sent over the wire, only used locally - - PROP_PARTICLE_SPIN, - PROP_SPIN_START, - PROP_SPIN_FINISH, - PROP_SPIN_SPREAD, - PROP_PARTICLE_ROTATE_WITH_ENTITY, - - PROP_BLOOM_MODE, - PROP_BLOOM_INTENSITY, - PROP_BLOOM_THRESHOLD, - PROP_BLOOM_SIZE, - + PROP_QUERY_AA_CUBE, + PROP_CAN_CAST_SHADOW, + PROP_VISIBLE_IN_SECONDARY_CAMERA, // not sent over wire + // Grab PROP_GRAB_GRABBABLE, PROP_GRAB_KINEMATIC, PROP_GRAB_FOLLOWS_CONTROLLER, @@ -275,60 +52,271 @@ enum EntityPropertyList { PROP_GRAB_EQUIPPABLE_INDICATOR_SCALE, PROP_GRAB_EQUIPPABLE_INDICATOR_OFFSET, - PROP_MATERIAL_REPEAT, + // Physics + PROP_DENSITY, + PROP_VELOCITY, + PROP_ANGULAR_VELOCITY, + PROP_GRAVITY, + PROP_ACCELERATION, + PROP_DAMPING, + PROP_ANGULAR_DAMPING, + PROP_RESTITUTION, + PROP_FRICTION, + PROP_LIFETIME, + PROP_COLLISIONLESS, + PROP_COLLISION_MASK, + PROP_DYNAMIC, + PROP_SIMULATION_OWNER, + PROP_COLLISION_SOUND_URL, + PROP_ACTION_DATA, - PROP_EMISSIVE, - PROP_SUB_IMAGE, + // Cloning + PROP_CLONEABLE, + PROP_CLONE_LIFETIME, + PROP_CLONE_LIMIT, + PROP_CLONE_DYNAMIC, + PROP_CLONE_AVATAR_ENTITY, + PROP_CLONE_ORIGIN_ID, - PROP_LEFT_MARGIN, - PROP_RIGHT_MARGIN, - PROP_TOP_MARGIN, - PROP_BOTTOM_MARGIN, + // Scripts + PROP_SCRIPT, + PROP_SCRIPT_TIMESTAMP, + PROP_SERVER_SCRIPTS, + + // Certifiable Properties + PROP_ITEM_NAME, + PROP_ITEM_DESCRIPTION, + PROP_ITEM_CATEGORIES, + PROP_ITEM_ARTIST, + PROP_ITEM_LICENSE, + PROP_LIMITED_RUN, + PROP_MARKETPLACE_ID, + PROP_EDITION_NUMBER, + PROP_ENTITY_INSTANCE_NUMBER, + PROP_CERTIFICATE_ID, + PROP_STATIC_CERTIFICATE_VERSION, + + // Used to convert values to and from scripts + PROP_LOCAL_POSITION, + PROP_LOCAL_ROTATION, + PROP_LOCAL_VELOCITY, + PROP_LOCAL_ANGULAR_VELOCITY, + PROP_LOCAL_DIMENSIONS, + + // These properties are used by multiple subtypes but aren't in the base EntityItem + PROP_SHAPE_TYPE, + PROP_COMPOUND_SHAPE_URL, + PROP_COLOR, + PROP_ALPHA, + PROP_TEXTURES, //////////////////////////////////////////////////////////////////////////////////////////////////// - // ATTENTION: add new properties to end of list just ABOVE this line + // ATTENTION: add new shared EntityItem properties to the list ABOVE this line + //////////////////////////////////////////////////////////////////////////////////////////////////// + + // We need as many of these as the number of unique properties of a derived EntityItem class + PROP_DERIVED_0, + PROP_DERIVED_1, + PROP_DERIVED_2, + PROP_DERIVED_3, + PROP_DERIVED_4, + PROP_DERIVED_5, + PROP_DERIVED_6, + PROP_DERIVED_7, + PROP_DERIVED_8, + PROP_DERIVED_9, + PROP_DERIVED_10, + PROP_DERIVED_11, + PROP_DERIVED_12, + PROP_DERIVED_13, + PROP_DERIVED_14, + PROP_DERIVED_15, + PROP_DERIVED_16, + PROP_DERIVED_17, + PROP_DERIVED_18, + PROP_DERIVED_19, + PROP_DERIVED_20, + PROP_DERIVED_21, + PROP_DERIVED_22, + PROP_DERIVED_23, + PROP_DERIVED_24, + PROP_DERIVED_25, + PROP_DERIVED_26, + PROP_DERIVED_27, + PROP_DERIVED_28, + PROP_DERIVED_29, + PROP_DERIVED_30, + PROP_AFTER_LAST_ITEM, - //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// - // WARNING! Do not add props here unless you intentionally mean to reuse PROP_ indexes + // WARNING! Do not add props here unless you intentionally mean to reuse PROP_DERIVED_X indexes // - // These properties of TextEntity piggy back off of properties of ModelEntities, the type doesn't matter - // since the derived class knows how to interpret it's own properties and knows the types it expects - PROP_TEXT_COLOR = PROP_COLOR, - PROP_TEXT_ALPHA = PROP_ALPHA, - PROP_TEXT = PROP_MODEL_URL, - PROP_LINE_HEIGHT = PROP_ANIMATION_URL, - PROP_BACKGROUND_COLOR = PROP_ANIMATION_FPS, - PROP_BACKGROUND_ALPHA = PROP_ALPHA_START, - - // Aliases/Piggyback properties for Zones. These properties intentionally reuse the enum values for - // other properties which will never overlap with each other. We do this so that we don't have to expand + // These properties intentionally reuse the enum values for other properties which will never overlap with each other. We do this so that we don't have to expand // the size of the properties bitflags mask - PROP_SKYBOX_COLOR = PROP_ANIMATION_URL, - PROP_SKYBOX_URL = PROP_ANIMATION_FPS, + // + // Only add properties here that are only used by one subclass. Otherwise, they should go above to prevent collisions - PROP_AMBIENT_LIGHT_INTENSITY = PROP_CUTOFF, - PROP_AMBIENT_LIGHT_URL = PROP_ANIMATION_PLAYING, + // Particles + PROP_MAX_PARTICLES = PROP_DERIVED_0, + PROP_LIFESPAN = PROP_DERIVED_1, + PROP_EMITTING_PARTICLES = PROP_DERIVED_2, + PROP_EMIT_RATE = PROP_DERIVED_3, + PROP_EMIT_SPEED = PROP_DERIVED_4, + PROP_SPEED_SPREAD = PROP_DERIVED_5, + PROP_EMIT_ORIENTATION = PROP_DERIVED_6, + PROP_EMIT_DIMENSIONS = PROP_DERIVED_7, + PROP_EMIT_RADIUS_START = PROP_DERIVED_8, + PROP_EMIT_ACCELERATION = PROP_DERIVED_9, + PROP_ACCELERATION_SPREAD = PROP_DERIVED_10, + PROP_POLAR_START = PROP_DERIVED_11, + PROP_POLAR_FINISH = PROP_DERIVED_12, + PROP_AZIMUTH_START = PROP_DERIVED_13, + PROP_AZIMUTH_FINISH = PROP_DERIVED_14, + PROP_PARTICLE_RADIUS = PROP_DERIVED_15, + PROP_RADIUS_SPREAD = PROP_DERIVED_16, + PROP_RADIUS_START = PROP_DERIVED_17, + PROP_RADIUS_FINISH = PROP_DERIVED_18, + PROP_COLOR_SPREAD = PROP_DERIVED_19, + PROP_COLOR_START = PROP_DERIVED_20, + PROP_COLOR_FINISH = PROP_DERIVED_21, + PROP_ALPHA_SPREAD = PROP_DERIVED_22, + PROP_ALPHA_START = PROP_DERIVED_23, + PROP_ALPHA_FINISH = PROP_DERIVED_24, + PROP_EMITTER_SHOULD_TRAIL = PROP_DERIVED_25, + PROP_PARTICLE_SPIN = PROP_DERIVED_26, + PROP_SPIN_START = PROP_DERIVED_27, + PROP_SPIN_FINISH = PROP_DERIVED_28, + PROP_SPIN_SPREAD = PROP_DERIVED_29, + PROP_PARTICLE_ROTATE_WITH_ENTITY = PROP_DERIVED_30, - // Aliases/Piggyback properties for Web. These properties intentionally reuse the enum values for - // other properties which will never overlap with each other. - PROP_SOURCE_URL = PROP_MODEL_URL, + // Model + PROP_MODEL_URL = PROP_DERIVED_0, + PROP_JOINT_ROTATIONS_SET = PROP_DERIVED_1, + PROP_JOINT_ROTATIONS = PROP_DERIVED_2, + PROP_JOINT_TRANSLATIONS_SET = PROP_DERIVED_3, + PROP_JOINT_TRANSLATIONS = PROP_DERIVED_4, + PROP_RELAY_PARENT_JOINTS = PROP_DERIVED_5, + // Animation + PROP_ANIMATION_URL = PROP_DERIVED_6, + PROP_ANIMATION_ALLOW_TRANSLATION = PROP_DERIVED_7, + PROP_ANIMATION_FPS = PROP_DERIVED_8, + PROP_ANIMATION_FRAME_INDEX = PROP_DERIVED_9, + PROP_ANIMATION_PLAYING = PROP_DERIVED_10, + PROP_ANIMATION_LOOP = PROP_DERIVED_11, + PROP_ANIMATION_FIRST_FRAME = PROP_DERIVED_12, + PROP_ANIMATION_LAST_FRAME = PROP_DERIVED_13, + PROP_ANIMATION_HOLD = PROP_DERIVED_14, - // Aliases/Piggyback properties for Particle Emmitter. These properties intentionally reuse the enum values for - // other properties which will never overlap with each other. - PROP_EMITTING_PARTICLES = PROP_ANIMATION_PLAYING, + // Light + PROP_IS_SPOTLIGHT = PROP_DERIVED_0, + PROP_INTENSITY = PROP_DERIVED_1, + PROP_EXPONENT = PROP_DERIVED_2, + PROP_CUTOFF = PROP_DERIVED_3, + PROP_FALLOFF_RADIUS = PROP_DERIVED_4, - // Aliases/Piggyback properties for Image. These properties intentionally reuse the enum values for - // other properties which will never overlap with each other. - PROP_IMAGE_URL = PROP_MODEL_URL, - PROP_KEEP_ASPECT_RATIO = PROP_ANIMATION_PLAYING, + // Text + PROP_TEXT = PROP_DERIVED_0, + PROP_LINE_HEIGHT = PROP_DERIVED_1, + PROP_TEXT_COLOR = PROP_DERIVED_2, + PROP_TEXT_ALPHA = PROP_DERIVED_3, + PROP_BACKGROUND_COLOR = PROP_DERIVED_4, + PROP_BACKGROUND_ALPHA = PROP_DERIVED_5, + PROP_BILLBOARD_MODE = PROP_DERIVED_6, + PROP_LEFT_MARGIN = PROP_DERIVED_7, + PROP_RIGHT_MARGIN = PROP_DERIVED_8, + PROP_TOP_MARGIN = PROP_DERIVED_9, + PROP_BOTTOM_MARGIN = PROP_DERIVED_10, - // Aliases/Piggyback properties for Grid. These properties intentionally reuse the enum values for - // other properties which will never overlap with each other. - PROP_GRID_FOLLOW_CAMERA = PROP_ANIMATION_PLAYING, - PROP_MAJOR_GRID_EVERY = PROP_ANIMATION_URL, - PROP_MINOR_GRID_EVERY = PROP_ANIMATION_FPS, + // Zone + // Keylight + PROP_KEYLIGHT_COLOR = PROP_DERIVED_0, + PROP_KEYLIGHT_INTENSITY = PROP_DERIVED_1, + PROP_KEYLIGHT_DIRECTION = PROP_DERIVED_2, + PROP_KEYLIGHT_CAST_SHADOW = PROP_DERIVED_3, + // Ambient light + PROP_AMBIENT_LIGHT_INTENSITY = PROP_DERIVED_4, + PROP_AMBIENT_LIGHT_URL = PROP_DERIVED_5, + // Skybox + PROP_SKYBOX_COLOR = PROP_DERIVED_6, + PROP_SKYBOX_URL = PROP_DERIVED_7, + // Haze + PROP_HAZE_RANGE = PROP_DERIVED_8, + PROP_HAZE_COLOR = PROP_DERIVED_9, + PROP_HAZE_GLARE_COLOR = PROP_DERIVED_10, + PROP_HAZE_ENABLE_GLARE = PROP_DERIVED_11, + PROP_HAZE_GLARE_ANGLE = PROP_DERIVED_12, + PROP_HAZE_ALTITUDE_EFFECT = PROP_DERIVED_13, + PROP_HAZE_CEILING = PROP_DERIVED_14, + PROP_HAZE_BASE_REF = PROP_DERIVED_15, + PROP_HAZE_BACKGROUND_BLEND = PROP_DERIVED_16, + PROP_HAZE_ATTENUATE_KEYLIGHT = PROP_DERIVED_17, + PROP_HAZE_KEYLIGHT_RANGE = PROP_DERIVED_18, + PROP_HAZE_KEYLIGHT_ALTITUDE = PROP_DERIVED_19, + // Bloom + PROP_BLOOM_INTENSITY = PROP_DERIVED_20, + PROP_BLOOM_THRESHOLD = PROP_DERIVED_21, + PROP_BLOOM_SIZE = PROP_DERIVED_22, + PROP_FLYING_ALLOWED = PROP_DERIVED_23, + PROP_GHOSTING_ALLOWED = PROP_DERIVED_24, + PROP_FILTER_URL = PROP_DERIVED_25, + PROP_KEY_LIGHT_MODE = PROP_DERIVED_26, + PROP_AMBIENT_LIGHT_MODE = PROP_DERIVED_27, + PROP_SKYBOX_MODE = PROP_DERIVED_28, + PROP_HAZE_MODE = PROP_DERIVED_29, + PROP_BLOOM_MODE = PROP_DERIVED_30, + + // Polyvox + PROP_VOXEL_VOLUME_SIZE = PROP_DERIVED_0, + PROP_VOXEL_DATA = PROP_DERIVED_1, + PROP_VOXEL_SURFACE_STYLE = PROP_DERIVED_2, + PROP_X_TEXTURE_URL = PROP_DERIVED_3, + PROP_Y_TEXTURE_URL = PROP_DERIVED_4, + PROP_Z_TEXTURE_URL = PROP_DERIVED_5, + PROP_X_N_NEIGHBOR_ID = PROP_DERIVED_6, + PROP_Y_N_NEIGHBOR_ID = PROP_DERIVED_7, + PROP_Z_N_NEIGHBOR_ID = PROP_DERIVED_8, + PROP_X_P_NEIGHBOR_ID = PROP_DERIVED_9, + PROP_Y_P_NEIGHBOR_ID = PROP_DERIVED_10, + PROP_Z_P_NEIGHBOR_ID = PROP_DERIVED_11, + + // Web + PROP_SOURCE_URL = PROP_DERIVED_0, + PROP_DPI = PROP_DERIVED_1, + + // Polyline + PROP_LINE_POINTS = PROP_DERIVED_0, + PROP_STROKE_WIDTHS = PROP_DERIVED_1, + PROP_STROKE_NORMALS = PROP_DERIVED_2, + PROP_STROKE_COLORS = PROP_DERIVED_3, + PROP_IS_UV_MODE_STRETCH = PROP_DERIVED_4, + PROP_LINE_GLOW = PROP_DERIVED_5, + PROP_LINE_FACE_CAMERA = PROP_DERIVED_6, + + // Shape + PROP_SHAPE = PROP_DERIVED_0, + + // Material + PROP_MATERIAL_URL = PROP_DERIVED_0, + PROP_MATERIAL_MAPPING_MODE = PROP_DERIVED_1, + PROP_MATERIAL_PRIORITY = PROP_DERIVED_2, + PROP_PARENT_MATERIAL_NAME = PROP_DERIVED_3, + PROP_MATERIAL_MAPPING_POS = PROP_DERIVED_4, + PROP_MATERIAL_MAPPING_SCALE = PROP_DERIVED_5, + PROP_MATERIAL_MAPPING_ROT = PROP_DERIVED_6, + PROP_MATERIAL_DATA = PROP_DERIVED_7, + PROP_MATERIAL_REPEAT = PROP_DERIVED_8, + + // Image + PROP_IMAGE_URL = PROP_DERIVED_0, + PROP_EMISSIVE = PROP_DERIVED_1, + PROP_KEEP_ASPECT_RATIO = PROP_DERIVED_2, + PROP_SUB_IMAGE = PROP_DERIVED_3, + + // Grid + PROP_GRID_FOLLOW_CAMERA = PROP_DERIVED_0, + PROP_MAJOR_GRID_EVERY = PROP_DERIVED_1, + PROP_MINOR_GRID_EVERY = PROP_DERIVED_2, // WARNING!!! DO NOT ADD PROPS_xxx here unless you really really meant to.... Add them UP above }; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 33ec92b8de..02e8682264 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1519,46 +1519,6 @@ bool EntityScriptingInterface::polyVoxWorker(QUuid entityID, std::function actor) { - PROFILE_RANGE(script_entities, __FUNCTION__); - - if (!_entityTree) { - return false; - } - - EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); - if (!entity) { - qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; - } - - EntityTypes::EntityType entityType = entity->getType(); - - if (entityType != EntityTypes::Line) { - return false; - } - - auto now = usecTimestampNow(); - - auto lineEntity = std::static_pointer_cast(entity); - bool success; - _entityTree->withWriteLock([&] { - success = actor(*lineEntity); - entity->setLastEdited(now); - entity->setLastBroadcast(now); - }); - - EntityItemProperties properties; - _entityTree->withReadLock([&] { - properties = entity->getProperties(); - }); - - properties.setLinePointsDirty(); - properties.setLastEdited(now); - - queueEntityMessage(PacketType::EntityEdit, entityID, properties); - return success; -} - bool EntityScriptingInterface::setVoxelSphere(QUuid entityID, const glm::vec3& center, float radius, int value) { PROFILE_RANGE(script_entities, __FUNCTION__); return polyVoxWorker(entityID, [center, radius, value](PolyVoxEntityItem& polyVoxEntity) { @@ -1601,49 +1561,6 @@ bool EntityScriptingInterface::setVoxelsInCuboid(QUuid entityID, const glm::vec3 }); } -bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector& points) { - PROFILE_RANGE(script_entities, __FUNCTION__); - - EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); - if (!entity) { - qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; - } - - EntityTypes::EntityType entityType = entity->getType(); - - if (entityType == EntityTypes::Line) { - return setPoints(entityID, [points](LineEntityItem& lineEntity) -> bool - { - return (LineEntityItem*)lineEntity.setLinePoints(points); - }); - } - - return false; -} - -bool EntityScriptingInterface::appendPoint(QUuid entityID, const glm::vec3& point) { - PROFILE_RANGE(script_entities, __FUNCTION__); - - EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); - if (!entity) { - qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; - // There is no entity - return false; - } - - EntityTypes::EntityType entityType = entity->getType(); - - if (entityType == EntityTypes::Line) { - return setPoints(entityID, [point](LineEntityItem& lineEntity) -> bool - { - return (LineEntityItem*)lineEntity.appendPoint(point); - }); - } - - return false; -} - - bool EntityScriptingInterface::actionWorker(const QUuid& entityID, std::function actor) { if (!_entityTree) { diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 890c666010..512e88c8e1 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -26,7 +26,6 @@ #include #include "PolyVoxEntityItem.h" -#include "LineEntityItem.h" #include "PolyLineEntityItem.h" #include "EntityTree.h" @@ -861,75 +860,12 @@ public slots: // FIXME move to a renderable entity interface Q_INVOKABLE glm::vec3 localCoordsToVoxelCoords(const QUuid& entityID, glm::vec3 localCoords); - /**jsdoc - * Set the linePoints property of a {@link Entities.EntityType|Line} entity. - * @function Entities.setAllPoints - * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Line} entity. - * @param {Vec3[]} points - The array of points to set the entity's linePoints property to. - * @returns {boolean} true if the entity's property was updated, otherwise false. The property - * may fail to be updated if the entity does not exist, the entity is not a {@link Entities.EntityType|Line} entity, - * one of the points is outside the entity's dimensions, or the number of points is greater than the maximum allowed. - * @example Change the shape of a Line entity. - * // Draw a horizontal line between two points. - * var entity = Entities.addEntity({ - * type: "Line", - * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), - * rotation: MyAvatar.orientation, - * dimensions: { x: 2, y: 2, z: 1 }, - * linePoints: [ - * { x: -1, y: 0, z: 0 }, - * { x:1, y: -0, z: 0 } - * ], - * color: { red: 255, green: 0, blue: 0 }, - * lifetime: 300 // Delete after 5 minutes. - * }); - * - * // Change the line to be a "V". - * Script.setTimeout(function () { - * Entities.setAllPoints(entity, [ - * { x: -1, y: 1, z: 0 }, - * { x: 0, y: -1, z: 0 }, - * { x: 1, y: 1, z: 0 }, - * ]); - * }, 2000); - */ - Q_INVOKABLE bool setAllPoints(QUuid entityID, const QVector& points); - - /**jsdoc - * Append a point to a {@link Entities.EntityType|Line} entity. - * @function Entities.appendPoint - * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Line} entity. - * @param {Vec3} point - The point to add to the line. The coordinates are relative to the entity's position. - * @returns {boolean} true if the point was added to the line, otherwise false. The point may - * fail to be added if the entity does not exist, the entity is not a {@link Entities.EntityType|Line} entity, the - * point is outside the entity's dimensions, or the maximum number of points has been reached. - * @example Append a point to a Line entity. - * // Draw a line between two points. - * var entity = Entities.addEntity({ - * type: "Line", - * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), - * rotation: MyAvatar.orientation, - * dimensions: { x: 2, y: 2, z: 1 }, - * linePoints: [ - * { x: -1, y: 1, z: 0 }, - * { x: 0, y: -1, z: 0 } - * ], - * color: { red: 255, green: 0, blue: 0 }, - * lifetime: 300 // Delete after 5 minutes. - * }); - * - * // Add a third point to create a "V". - * Entities.appendPoint(entity, { x: 1, y: 1, z: 0 }); - */ - Q_INVOKABLE bool appendPoint(QUuid entityID, const glm::vec3& point); - /**jsdoc * Dumps debug information about all entities in Interface's local in-memory tree of entities it knows about to the program log. * @function Entities.dumpTree */ Q_INVOKABLE void dumpTree() const; - /**jsdoc * Add an action to an entity. An action is registered with the physics engine and is applied every physics simulation * step. Any entity may have more than one action associated with it, but only as many as will fit in an entity's @@ -1978,7 +1914,6 @@ private slots: private: bool actionWorker(const QUuid& entityID, std::function actor); bool polyVoxWorker(QUuid entityID, std::function actor); - bool setPoints(QUuid entityID, std::function actor); void queueEntityMessage(PacketType packetType, EntityItemID entityID, const EntityItemProperties& properties); bool addLocalEntityCopy(EntityItemProperties& propertiesWithSimID, EntityItemID& id, bool isClone = false); diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index e511af83b0..45a1e92073 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -26,7 +26,6 @@ #include "TextEntityItem.h" #include "ImageEntityItem.h" #include "WebEntityItem.h" -#include "LineEntityItem.h" #include "PolyLineEntityItem.h" #include "PolyVoxEntityItem.h" #include "GridEntityItem.h" @@ -50,7 +49,6 @@ REGISTER_ENTITY_TYPE(Text) REGISTER_ENTITY_TYPE(Image) REGISTER_ENTITY_TYPE(Web) REGISTER_ENTITY_TYPE(ParticleEffect) -REGISTER_ENTITY_TYPE(Line) REGISTER_ENTITY_TYPE(PolyLine) REGISTER_ENTITY_TYPE(PolyVox) REGISTER_ENTITY_TYPE(Grid) diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index 29a695718e..c9b9558265 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -70,8 +70,6 @@ public: * "ParticleEffect"A particle system that can be used to simulate things such as fire, * smoke, snow, magic spells, etc. * {@link Entities.EntityProperties-ParticleEffect|EntityProperties-ParticleEffect} - * "Line"A sequence of one or more simple straight lines. - * {@link Entities.EntityProperties-Line|EntityProperties-Line} * "PolyLine"A sequence of one or more textured straight lines. * {@link Entities.EntityProperties-PolyLine|EntityProperties-PolyLine} * "PolyVox"A set of textured voxels. @@ -99,7 +97,6 @@ public: Image, Web, ParticleEffect, - Line, PolyLine, PolyVox, Grid, diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp deleted file mode 100644 index 766fd12bbb..0000000000 --- a/libraries/entities/src/LineEntityItem.cpp +++ /dev/null @@ -1,191 +0,0 @@ -// -// LineEntityItem.cpp -// libraries/entities/src -// -// Created by Seth Alves on 5/11/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "LineEntityItem.h" - -#include - -#include - -#include "EntitiesLogging.h" -#include "EntityItemProperties.h" -#include "EntityTree.h" -#include "EntityTreeElement.h" -#include "OctreeConstants.h" - -const float LineEntityItem::DEFAULT_LINE_WIDTH = 2.0f; -const int LineEntityItem::MAX_POINTS_PER_LINE = 70; - - -EntityItemPointer LineEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { - EntityItemPointer entity(new LineEntityItem(entityID), [](EntityItem* ptr) { ptr->deleteLater(); }); - entity->setProperties(properties); - return entity; -} - -LineEntityItem::LineEntityItem(const EntityItemID& entityItemID) : - EntityItem(entityItemID) -{ - _type = EntityTypes::Line; -} - -EntityItemProperties LineEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const { - - EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class - - COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineWidth, getLineWidth); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints); - - return properties; -} - -bool LineEntityItem::setProperties(const EntityItemProperties& properties) { - bool somethingChanged = false; - somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class - - SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(lineWidth, setLineWidth); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints); - - if (somethingChanged) { - bool wantDebug = false; - if (wantDebug) { - uint64_t now = usecTimestampNow(); - int elapsed = now - getLastEdited(); - qCDebug(entities) << "LineEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << - "now=" << now << " getLastEdited()=" << getLastEdited(); - } - setLastEdited(properties._lastEdited); - } - return somethingChanged; -} - -bool LineEntityItem::appendPoint(const glm::vec3& point) { - if (_points.size() > MAX_POINTS_PER_LINE - 1) { - qCDebug(entities) << "MAX POINTS REACHED!"; - return false; - } - glm::vec3 halfBox = getScaledDimensions() * 0.5f; - if ( (point.x < - halfBox.x || point.x > halfBox.x) || (point.y < -halfBox.y || point.y > halfBox.y) || (point.z < - halfBox.z || point.z > halfBox.z) ) { - qCDebug(entities) << "Point is outside entity's bounding box"; - return false; - } - withWriteLock([&] { - _points << point; - _pointsChanged = true; - }); - return true; -} - -bool LineEntityItem::setLinePoints(const QVector& points) { - if (points.size() > MAX_POINTS_PER_LINE) { - return false; - } - glm::vec3 halfBox = getScaledDimensions() * 0.5f; - for (int i = 0; i < points.size(); i++) { - glm::vec3 point = points.at(i); - if ( (point.x < - halfBox.x || point.x > halfBox.x) || (point.y < -halfBox.y || point.y > halfBox.y) || (point.z < - halfBox.z || point.z > halfBox.z) ) { - qCDebug(entities) << "Point is outside entity's bounding box"; - return false; - } - } - - withWriteLock([&] { - _points = points; - _pointsChanged = true; - }); - return true; -} - -int LineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, - ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData, - bool& somethingChanged) { - - int bytesRead = 0; - const unsigned char* dataAt = data; - - READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); - READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); - - return bytesRead; -} - - -EntityPropertyFlags LineEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { - EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); - requestedProperties += PROP_COLOR; - requestedProperties += PROP_LINE_WIDTH; - requestedProperties += PROP_LINE_POINTS; - return requestedProperties; -} - -void LineEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, - EntityTreeElementExtraEncodeDataPointer modelTreeElementExtraEncodeData, - EntityPropertyFlags& requestedProperties, - EntityPropertyFlags& propertyFlags, - EntityPropertyFlags& propertiesDidntFit, - int& propertyCount, - OctreeElement::AppendState& appendState) const { - - bool successPropertyFits = true; - - APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); - APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, getLineWidth()); - APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, getLinePoints()); -} - -void LineEntityItem::debugDump() const { - quint64 now = usecTimestampNow(); - qCDebug(entities) << " LINE EntityItem id:" << getEntityItemID() << "---------------------------------------------"; - qCDebug(entities) << " color:" << _color; - qCDebug(entities) << " position:" << debugTreeVector(getWorldPosition()); - qCDebug(entities) << " dimensions:" << debugTreeVector(getScaledDimensions()); - qCDebug(entities) << " getLastEdited:" << debugTime(getLastEdited(), now); -} - -glm::u8vec3 LineEntityItem::getColor() const { - return resultWithReadLock([&] { - return _color; - }); -} - -void LineEntityItem::setColor(const glm::u8vec3& value) { - withWriteLock([&] { - _color = value; - }); -} - -void LineEntityItem::setLineWidth(float lineWidth) { - withWriteLock([&] { - _lineWidth = lineWidth; - }); -} - -float LineEntityItem::getLineWidth() const { - return resultWithReadLock([&] { - return _lineWidth; - }); -} - -QVector LineEntityItem::getLinePoints() const { - return resultWithReadLock>([&] { - return _points; - }); -} - -void LineEntityItem::resetPointsChanged() { - withWriteLock([&] { - _pointsChanged = false; - }); -} diff --git a/libraries/entities/src/LineEntityItem.h b/libraries/entities/src/LineEntityItem.h deleted file mode 100644 index 1ebb248d23..0000000000 --- a/libraries/entities/src/LineEntityItem.h +++ /dev/null @@ -1,82 +0,0 @@ -// -// LineEntityItem.h -// libraries/entities/src -// -// Created by Seth Alves on 5/11/15. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_LineEntityItem_h -#define hifi_LineEntityItem_h - -#include "EntityItem.h" - -class LineEntityItem : public EntityItem { - public: - static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); - - LineEntityItem(const EntityItemID& entityItemID); - - ALLOW_INSTANTIATION // This class can be instantiated - - // methods for getting/setting all properties of an entity - virtual EntityItemProperties getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const override; - virtual bool setProperties(const EntityItemProperties& properties) override; - - virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const override; - - virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, - EntityTreeElementExtraEncodeDataPointer modelTreeElementExtraEncodeData, - EntityPropertyFlags& requestedProperties, - EntityPropertyFlags& propertyFlags, - EntityPropertyFlags& propertiesDidntFit, - int& propertyCount, - OctreeElement::AppendState& appendState) const override; - - virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, - ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData, - bool& somethingChanged) override; - - glm::u8vec3 getColor() const; - void setColor(const glm::u8vec3& value); - - void setLineWidth(float lineWidth); - float getLineWidth() const; - - bool setLinePoints(const QVector& points); - bool appendPoint(const glm::vec3& point); - - QVector getLinePoints() const; - - virtual ShapeType getShapeType() const override { return SHAPE_TYPE_NONE; } - - // never have a ray intersection pick a LineEntityItem. - virtual bool supportsDetailedIntersection() const override { return true; } - virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - OctreeElementPointer& element, float& distance, - BoxFace& face, glm::vec3& surfaceNormal, - QVariantMap& extraInfo, - bool precisionPicking) const override { return false; } - virtual bool findDetailedParabolaIntersection(const glm::vec3& origin, const glm::vec3& velocity, - const glm::vec3& acceleration, OctreeElementPointer& element, float& parabolicDistance, - BoxFace& face, glm::vec3& surfaceNormal, - QVariantMap& extraInfo, - bool precisionPicking) const override { return false; } - bool pointsChanged() const { return _pointsChanged; } - void resetPointsChanged(); - virtual void debugDump() const override; - static const float DEFAULT_LINE_WIDTH; - static const int MAX_POINTS_PER_LINE; - - private: - glm::u8vec3 _color; - float _lineWidth { DEFAULT_LINE_WIDTH }; - QVector _points; - bool _pointsChanged { true }; -}; - -#endif // hifi_LineEntityItem_h diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index d16a2f93d4..93206165da 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -41,14 +41,15 @@ EntityItemProperties PolyLineEntityItem::getProperties(const EntityPropertyFlags EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineWidth, getLineWidth); COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints); - + COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeWidths, getStrokeWidths); COPY_ENTITY_PROPERTY_TO_PROPERTIES(normals, getNormals); COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeColors, getStrokeColors); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeWidths, getStrokeWidths); COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); COPY_ENTITY_PROPERTY_TO_PROPERTIES(isUVModeStretch, getIsUVModeStretch); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(glow, getGlow); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(faceCamera, getFaceCamera); + return properties; } @@ -58,14 +59,14 @@ bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(lineWidth, setLineWidth); SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints); - + SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeWidths, setStrokeWidths); SET_ENTITY_PROPERTY_FROM_PROPERTIES(normals, setNormals); SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeColors, setStrokeColors); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeWidths, setStrokeWidths); SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); SET_ENTITY_PROPERTY_FROM_PROPERTIES(isUVModeStretch, setIsUVModeStretch); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(glow, setGlow); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(faceCamera, setFaceCamera); if (somethingChanged) { bool wantDebug = false; diff --git a/scripts/developer/tests/avatarToWorldTests.js b/scripts/developer/tests/avatarToWorldTests.js index c2da49cbd4..e27c3c4b5b 100644 --- a/scripts/developer/tests/avatarToWorldTests.js +++ b/scripts/developer/tests/avatarToWorldTests.js @@ -42,52 +42,6 @@ function jointToWorldPointTest_update(deltaTime) { Entities.editEntity(jointToWorldPointTest_sphereEntity, newProperties); } -//jointToWorldDirection -// create line in world space -// each frame calculate world space direction of players head z axis -// update line to match -var jointToWorldDirectionTest_lineEntity; -function jointToWorldDirectionTest() { - var jointIndex = MyAvatar.getJointIndex("Head"); - var avatarPos = MyAvatar.getJointPosition(jointIndex); - - var jointDir = { x: 1, y: 0, z: 1 }; - var worldDir = MyAvatar.jointToWorldDirection(jointDir, jointIndex); - print(worldDir.x); - print(worldDir.y); - print(worldDir.z); - jointToWorldDirectionTest_lineEntity = Entities.addEntity({ - type: "Line", - color: {red: 250, green: 0, blue: 0}, - dimensions: {x: 5, y: 5, z: 5}, - lifetime: 10.0, - linePoints: [{ - x: 0, - y: 0, - z: 0 - }, worldDir - ], - position : avatarPos, - }); -} -function jointToWorldDirection_update(deltaTime) { - var jointIndex = MyAvatar.getJointIndex("Head"); - var avatarPos = MyAvatar.getJointPosition(jointIndex); - var jointDir = { x: 1, y: 0, z: 0 }; - var worldDir = MyAvatar.jointToWorldDirection(jointDir, jointIndex); - var newProperties = { - linePoints: [{ - x: 0, - y: 0, - z: 0 - }, worldDir - ], - position : avatarPos - }; - - Entities.editEntity(jointToWorldDirectionTest_lineEntity, newProperties); -} - //jointToWorldRotation // create box in world space // each frame calculate world space rotation of players head diff --git a/scripts/developer/tests/worldToAvatarTests.js b/scripts/developer/tests/worldToAvatarTests.js index 6f0b19dc2d..e368a5e455 100644 --- a/scripts/developer/tests/worldToAvatarTests.js +++ b/scripts/developer/tests/worldToAvatarTests.js @@ -49,53 +49,6 @@ function worldToJointPointTest() { Entities.addEntity(worldSphereProps); } -//worldToJointDirection -// create line and attach to avatars head -// each frame calculate direction of world x axis in joint space of players head -// update arrow orientation to match -var worldToJointDirectionTest_lineEntity; -function worldToJointDirectionTest() { - var jointIndex = MyAvatar.getJointIndex("Head"); - - var jointPosition_WorldSpace = MyAvatar.getJointPosition(jointIndex); - var jointOffset_WorldSpace = { x: 0, y: 0, z: 0 }; - var jointPosition_WorldSpaceOffset = Vec3.sum(jointPosition_WorldSpace, jointOffset_WorldSpace); - var jointPosition_JointSpaceOffset = MyAvatar.worldToJointPoint(jointPosition_WorldSpaceOffset, jointIndex); - - var worldDir = { x: 1, y: 0, z: 0 }; - var avatarDir = MyAvatar.worldToJointDirection(worldDir, jointIndex); - - worldToJointDirectionTest_lineEntity = Entities.addEntity({ - type: "Line", - color: {red: 200, green: 250, blue: 0}, - dimensions: {x: 5, y: 5, z: 5}, - lifetime: 10.0, - linePoints: [{ - x: 0, - y: 0, - z: 0 - }, avatarDir - ], - localPosition : jointOffset_WorldSpace, - parentID : AVATAR_SELF_ID, - parentJointIndex : jointIndex - }); -} - -function worldToJointDirectionTest_update(deltaTime) { - var jointIndex = MyAvatar.getJointIndex("Head"); - var worldDir = { x: 1, y: 0, z: 0 }; - var avatarDir = MyAvatar.worldToJointDirection(worldDir, jointIndex); - var newProperties = { linePoints: [{ - x: 0, - y: 0, - z: 0 - }, avatarDir - ]}; - - Entities.editEntity(worldToJointDirectionTest_lineEntity, newProperties); -} - //worldToJointRotation // create box and parent to some player joint // convert world identity rotation to joint space rotation From 5dd00bed1d4ba7356f9004f3264c5cd68f0dc6d2 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 12 Dec 2018 17:41:32 -0800 Subject: [PATCH 3/4] new improved polylines --- .../src/RenderableEntityItem.cpp | 5 - .../src/RenderablePolyLineEntityItem.cpp | 344 +++++------ .../src/RenderablePolyLineEntityItem.h | 54 +- .../entities-renderer/src/paintStroke.slf | 32 +- .../entities-renderer/src/paintStroke.slh | 48 ++ .../entities-renderer/src/paintStroke.slv | 46 +- .../src/paintStroke_Shared.slh | 25 + .../src/paintStroke_fade.slf | 52 -- .../src/paintStroke_fade.slv | 43 -- libraries/entities/src/EntityItem.cpp | 489 +++++++-------- .../entities/src/EntityItemProperties.cpp | 560 +++++++++--------- libraries/entities/src/EntityItemProperties.h | 48 +- .../entities/src/EntityItemPropertiesMacros.h | 6 +- .../entities/src/EntityPropertyFlags.cpp | 206 ------- libraries/entities/src/EntityPropertyFlags.h | 22 +- libraries/entities/src/ImageEntityItem.cpp | 30 +- libraries/entities/src/LightEntityItem.cpp | 10 +- libraries/entities/src/ModelEntityItem.cpp | 46 +- .../entities/src/ParticleEffectEntityItem.cpp | 37 +- libraries/entities/src/PolyLineEntityItem.cpp | 219 +++---- libraries/entities/src/PolyLineEntityItem.h | 63 +- libraries/entities/src/ShapeEntityItem.cpp | 12 +- libraries/entities/src/ZoneEntityItem.cpp | 30 +- libraries/render-utils/src/glowLine.slv | 2 +- libraries/shared/src/AABox.cpp | 2 +- 25 files changed, 1079 insertions(+), 1352 deletions(-) create mode 100644 libraries/entities-renderer/src/paintStroke.slh create mode 100644 libraries/entities-renderer/src/paintStroke_Shared.slh delete mode 100644 libraries/entities-renderer/src/paintStroke_fade.slf delete mode 100644 libraries/entities-renderer/src/paintStroke_fade.slv delete mode 100644 libraries/entities/src/EntityPropertyFlags.cpp diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index 5fb5a15d2c..dec4af2d93 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -15,7 +15,6 @@ #include #include "RenderableLightEntityItem.h" -#include "RenderableLineEntityItem.h" #include "RenderableModelEntityItem.h" #include "RenderableParticleEffectEntityItem.h" #include "RenderablePolyVoxEntityItem.h" @@ -248,10 +247,6 @@ EntityRenderer::Pointer EntityRenderer::addToScene(EntityTreeRenderer& renderer, result = make_renderer(entity); break; - case Type::Line: - result = make_renderer(entity); - break; - case Type::PolyLine: result = make_renderer(entity); break; diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 0d9e948db8..4a665bf666 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -19,66 +19,35 @@ #include #include -//#define POLYLINE_ENTITY_USE_FADE_EFFECT -#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT -# include -#endif +#include "paintStroke_shared.slh" using namespace render; using namespace render::entities; -static uint8_t CUSTOM_PIPELINE_NUMBER { 0 }; -static const int32_t PAINTSTROKE_TEXTURE_SLOT { 0 }; -static gpu::Stream::FormatPointer polylineFormat; -static gpu::PipelinePointer polylinePipeline; -#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT -static gpu::PipelinePointer polylineFadePipeline; -#endif +gpu::PipelinePointer PolyLineEntityRenderer::_pipeline = nullptr; -static render::ShapePipelinePointer shapePipelineFactory(const render::ShapePlumber& plumber, const render::ShapeKey& key, gpu::Batch& batch) { - if (!polylinePipeline) { - gpu::ShaderPointer program = gpu::Shader::createProgram(shader::entities_renderer::program::paintStroke); -#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT - auto fadeVS = gpu::Shader::createVertex(std::string(paintStroke_fade_vert)); - auto fadePS = gpu::Shader::createPixel(std::string(paintStroke_fade_frag)); - gpu::ShaderPointer fadeProgram = gpu::Shader::createProgram(fadeVS, fadePS); -#endif - gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - state->setDepthTest(true, true, gpu::LESS_EQUAL); - PrepareStencil::testMask(*state); - state->setBlendFunction(true, - gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, - gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); - polylinePipeline = gpu::Pipeline::create(program, state); -#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT - _fadePipeline = gpu::Pipeline::create(fadeProgram, state); -#endif - } - -#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT - if (key.isFaded()) { - auto fadeEffect = DependencyManager::get(); - return std::make_shared(_fadePipeline, nullptr, fadeEffect->getBatchSetter(), fadeEffect->getItemUniformSetter()); - } else { -#endif - return std::make_shared(polylinePipeline, nullptr, nullptr, nullptr); -#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT - } -#endif -} +static const QUrl DEFAULT_POLYLINE_TEXTURE = QUrl(PathUtils::resourcesPath() + "images/paintStroke.png"); PolyLineEntityRenderer::PolyLineEntityRenderer(const EntityItemPointer& entity) : Parent(entity) { - static std::once_flag once; - std::call_once(once, [&] { - CUSTOM_PIPELINE_NUMBER = render::ShapePipeline::registerCustomShapePipelineFactory(shapePipelineFactory); - polylineFormat.reset(new gpu::Stream::Format()); - polylineFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), offsetof(Vertex, position)); - polylineFormat->setAttribute(gpu::Stream::NORMAL, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), offsetof(Vertex, normal)); - polylineFormat->setAttribute(gpu::Stream::TEXCOORD, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV), offsetof(Vertex, uv)); - polylineFormat->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RGB), offsetof(Vertex, color)); - }); + _texture = DependencyManager::get()->getTexture(DEFAULT_POLYLINE_TEXTURE); - _verticesBuffer = std::make_shared(); + _polylineGeometryBuffer = std::make_shared(); + + _polylineDataBuffer = std::make_shared(); + _polylineDataBuffer->resize(sizeof(PolylineData)); +} + +void PolyLineEntityRenderer::buildPipeline() { + // FIXME: opaque pipeline + gpu::ShaderPointer program = gpu::Shader::createProgram(shader::entities_renderer::program::paintStroke); + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + state->setCullMode(gpu::State::CullMode::CULL_NONE); + state->setDepthTest(true, true, gpu::LESS_EQUAL); + PrepareStencil::testMask(*state); + state->setBlendFunction(true, + gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); + _pipeline = gpu::Pipeline::create(program, state); } ItemKey PolyLineEntityRenderer::getKey() { @@ -86,152 +55,165 @@ ItemKey PolyLineEntityRenderer::getKey() { } ShapeKey PolyLineEntityRenderer::getShapeKey() { - return ShapeKey::Builder().withCustom(CUSTOM_PIPELINE_NUMBER).build(); + return ShapeKey::Builder().withOwnPipeline().withTranslucent().withoutCullFace(); +} + +bool PolyLineEntityRenderer::needsRenderUpdate() const { + bool textureLoadedChanged = resultWithReadLock([&] { + return (!_textureLoaded && _texture && _texture->isLoaded()); + }); + + if (textureLoadedChanged) { + return true; + } + + return Parent::needsRenderUpdate(); } bool PolyLineEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const { return ( entity->pointsChanged() || - entity->strokeWidthsChanged() || + entity->widthsChanged() || entity->normalsChanged() || entity->texturesChanged() || - entity->strokeColorsChanged() + entity->colorsChanged() || + _isUVModeStretch != entity->getIsUVModeStretch() || + _glow != entity->getGlow() || + _faceCamera != entity->getFaceCamera() ); } -void PolyLineEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) { - static const QUrl DEFAULT_POLYLINE_TEXTURE = QUrl(PathUtils::resourcesPath() + "images/paintStroke.png"); - QUrl entityTextures = DEFAULT_POLYLINE_TEXTURE; +void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) { + auto pointsChanged = entity->pointsChanged(); + auto widthsChanged = entity->widthsChanged(); + auto normalsChanged = entity->normalsChanged(); + auto colorsChanged = entity->colorsChanged(); + + bool isUVModeStretch = entity->getIsUVModeStretch(); + bool glow = entity->getGlow(); + bool faceCamera = entity->getFaceCamera(); + + entity->resetPolyLineChanged(); + + // Transform + _renderTransform = Transform(); + _renderTransform.setTranslation(entity->getWorldPosition() - entity->getPolylineCenter()); + _renderTransform.setRotation(entity->getWorldOrientation()); + + // Textures if (entity->texturesChanged()) { entity->resetTexturesChanged(); + QUrl entityTextures = DEFAULT_POLYLINE_TEXTURE; auto textures = entity->getTextures(); if (!textures.isEmpty()) { entityTextures = QUrl(textures); } _texture = DependencyManager::get()->getTexture(entityTextures); + _textureAspectRatio = 1.0f; + _textureLoaded = false; } - - - if (!_texture) { - _texture = DependencyManager::get()->getTexture(entityTextures); + + bool textureChanged = false; + if (!_textureLoaded && _texture && _texture->isLoaded()) { + textureChanged = true; + _textureAspectRatio = (float)_texture->getOriginalHeight() / (float)_texture->getOriginalWidth(); + _textureLoaded = true; } -} - -void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) { - auto pointsChanged = entity->pointsChanged(); - auto strokeWidthsChanged = entity->strokeWidthsChanged(); - auto normalsChanged = entity->normalsChanged(); - auto strokeColorsChanged = entity->strokeColorsChanged(); - - - bool isUVModeStretch = entity->getIsUVModeStretch(); - entity->resetPolyLineChanged(); - - _polylineTransform = Transform(); - _polylineTransform.setTranslation(entity->getWorldPosition()); - _polylineTransform.setRotation(entity->getWorldOrientation()); + // Geometry if (pointsChanged) { - _lastPoints = entity->getLinePoints(); + _points = entity->getLinePoints(); } - if (strokeWidthsChanged) { - _lastStrokeWidths = entity->getStrokeWidths(); + if (widthsChanged) { + _widths = entity->getStrokeWidths(); } if (normalsChanged) { - _lastNormals = entity->getNormals(); + _normals = entity->getNormals(); } - if (strokeColorsChanged) { - _lastStrokeColors = entity->getStrokeColors(); - _lastStrokeColors = _lastNormals.size() == _lastStrokeColors.size() ? _lastStrokeColors : QVector({ toGlm(entity->getColor()) }); + if (colorsChanged) { + _colors = entity->getStrokeColors(); + _color = toGlm(entity->getColor()); } - if (pointsChanged || strokeWidthsChanged || normalsChanged || strokeColorsChanged) { - _empty = std::min(_lastPoints.size(), std::min(_lastNormals.size(), _lastStrokeWidths.size())) < 2; - if (!_empty) { - updateGeometry(updateVertices(_lastPoints, _lastNormals, _lastStrokeWidths, _lastStrokeColors, isUVModeStretch, _textureAspectRatio)); - } + if (_isUVModeStretch != isUVModeStretch || pointsChanged || widthsChanged || normalsChanged || colorsChanged || textureChanged) { + _isUVModeStretch = isUVModeStretch; + updateGeometry(); + } + + // Data + if (faceCamera != _faceCamera || glow != _glow) { + _faceCamera = faceCamera; + _glow = glow; + updateData(); } } -void PolyLineEntityRenderer::updateGeometry(const std::vector& vertices) { - _numVertices = (uint32_t)vertices.size(); - auto bufferSize = _numVertices * sizeof(Vertex); - if (bufferSize > _verticesBuffer->getSize()) { - _verticesBuffer->resize(bufferSize); - } - _verticesBuffer->setSubData(0, vertices); -} +void PolyLineEntityRenderer::updateGeometry() { + int maxNumVertices = std::min(_points.length(), _normals.length()); -std::vector PolyLineEntityRenderer::updateVertices(const QVector& points, - const QVector& normals, - const QVector& strokeWidths, - const QVector& strokeColors, - const bool isUVModeStretch, - const float textureAspectRatio) { - // Calculate the minimum vector size out of normals, points, and stroke widths - int size = std::min(points.size(), std::min(normals.size(), strokeWidths.size())); - - std::vector vertices; - - // Guard against an empty polyline - if (size <= 0) { - return vertices; - } - - float uCoordInc = 1.0f / size; - float uCoord = 0.0f; - int finalIndex = size - 1; - glm::vec3 binormal; - float accumulatedDistance = 0.0f; - float distanceToLastPoint = 0.0f; - float accumulatedStrokeWidth = 0.0f; - float strokeWidth = 0.0f; bool doesStrokeWidthVary = false; - - - for (int i = 1; i < strokeWidths.size(); i++) { - if (strokeWidths[i] != strokeWidths[i - 1]) { - doesStrokeWidthVary = true; - break; + if (_widths.size() >= 0) { + for (int i = 1; i < maxNumVertices; i++) { + float width = PolyLineEntityItem::DEFAULT_LINE_WIDTH; + if (i < _widths.length()) { + width = _widths[i]; + } + if (width != _widths[i - 1]) { + doesStrokeWidthVary = true; + break; + } } } - for (int i = 0; i <= finalIndex; i++) { - const float& width = strokeWidths.at(i); - const auto& point = points.at(i); - const auto& normal = normals.at(i); - const auto& color = strokeColors.size() == normals.size() ? strokeColors.at(i) : strokeColors.at(0); - int vertexIndex = i * 2; - + float uCoordInc = 1.0f / maxNumVertices; + float uCoord = 0.0f; + float accumulatedDistance = 0.0f; + float accumulatedStrokeWidth = 0.0f; + glm::vec3 binormal; - if (!isUVModeStretch && i >= 1) { - distanceToLastPoint = glm::distance(points.at(i), points.at(i - 1)); - accumulatedDistance += distanceToLastPoint; - strokeWidth = 2 * strokeWidths[i]; + std::vector vertices; + vertices.reserve(maxNumVertices); + for (int i = 0; i < maxNumVertices; i++) { + // Position + glm::vec3 point = _points[i]; - if (doesStrokeWidthVary) { - //If the stroke varies along the line the texture will stretch more or less depending on the speed - //because it looks better than using the same method as below - accumulatedStrokeWidth += strokeWidth; - float increaseValue = 1; - if (accumulatedStrokeWidth != 0) { - float newUcoord = glm::ceil(((1.0f / textureAspectRatio) * accumulatedDistance) / (accumulatedStrokeWidth / i)); - increaseValue = newUcoord - uCoord; + // uCoord + float width = i < _widths.size() ? _widths[i] : PolyLineEntityItem::DEFAULT_LINE_WIDTH; + if (i > 0) { // First uCoord is 0.0f + if (!_isUVModeStretch) { + accumulatedDistance += glm::distance(point, _points[i - 1]); + + if (doesStrokeWidthVary) { + //If the stroke varies along the line the texture will stretch more or less depending on the speed + //because it looks better than using the same method as below + accumulatedStrokeWidth += width; + float increaseValue = 1; + if (accumulatedStrokeWidth != 0) { + float newUcoord = glm::ceil((_textureAspectRatio * accumulatedDistance) / (accumulatedStrokeWidth / i)); + increaseValue = newUcoord - uCoord; + } + + increaseValue = increaseValue > 0 ? increaseValue : 1; + uCoord += increaseValue; + } else { + // If the stroke width is constant then the textures should keep the aspect ratio along the line + uCoord = (_textureAspectRatio * accumulatedDistance) / width; } - - increaseValue = increaseValue > 0 ? increaseValue : 1; - uCoord += increaseValue; } else { - //If the stroke width is constant then the textures should keep the aspect ratio along the line - uCoord = ((1.0f / textureAspectRatio) * accumulatedDistance) / strokeWidth; + uCoord += uCoordInc; } - } else if (vertexIndex >= 2) { - uCoord += uCoordInc; } + // Color + glm::vec3 color = i < _colors.length() ? _colors[i] : _color; + + // Normal + glm::vec3 normal = _normals[i]; + + // Binormal // For last point we can assume binormals are the same since it represents the last two vertices of quad - if (i < finalIndex) { - const auto tangent = points.at(i + 1) - point; - binormal = glm::normalize(glm::cross(tangent, normal)) * width; + if (i < maxNumVertices - 1) { + glm::vec3 tangent = _points[i + 1] - point; + binormal = glm::normalize(glm::cross(tangent, normal)); // Check to make sure binormal is not a NAN. If it is, don't add to vertices vector if (binormal.x != binormal.x) { @@ -239,54 +221,36 @@ std::vector PolyLineEntityRenderer::updateVertic } } - const auto v1 = points.at(i) + binormal; - const auto v2 = points.at(i) - binormal; - vertices.emplace_back(v1, normal, vec2(uCoord, 0.0f), color); - vertices.emplace_back(v2, normal, vec2(uCoord, 1.0f), color); + PolylineVertex vertex = { glm::vec4(point, uCoord), glm::vec4(color, 1.0f), glm::vec4(normal, 0.0f), glm::vec4(binormal, 0.5f * width) }; + vertices.push_back(vertex); } - return vertices; + _numVertices = vertices.size(); + _polylineGeometryBuffer->setData(vertices.size() * sizeof(PolylineVertex), (const gpu::Byte*) vertices.data()); } -scriptable::ScriptableModelBase PolyLineEntityRenderer::getScriptableModel() { - // TODO: adapt polyline into a triangles mesh... - return EntityRenderer::getScriptableModel(); +void PolyLineEntityRenderer::updateData() { + PolylineData data { glm::vec2(_faceCamera, _glow), glm::vec2(0.0f) }; + _polylineDataBuffer->setSubData(0, data); } void PolyLineEntityRenderer::doRender(RenderArgs* args) { - if (_empty) { + if (_numVertices < 2) { return; } PerformanceTimer perfTimer("RenderablePolyLineEntityItem::render"); Q_ASSERT(args->_batch); - gpu::Batch& batch = *args->_batch; - batch.setModelTransform(_polylineTransform); - if (_texture && _texture->isLoaded()) { - batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, _texture->getGPUTexture()); - } else { - batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, DependencyManager::get()->getWhiteTexture()); + if (!_pipeline) { + buildPipeline(); } - float textureWidth = (float)_texture->getOriginalWidth(); - float textureHeight = (float)_texture->getOriginalHeight(); - if (textureWidth != 0 && textureHeight != 0) { - _textureAspectRatio = textureWidth / textureHeight; - } - - batch.setInputFormat(polylineFormat); - batch.setInputBuffer(0, _verticesBuffer, 0, sizeof(Vertex)); - -#ifndef POLYLINE_ENTITY_USE_FADE_EFFECT - // glColor4f must be called after setInputFormat if it must be taken into account - if (_isFading) { - batch._glColor4f(1.0f, 1.0f, 1.0f, Interpolate::calculateFadeRatio(_fadeStartTime)); - } else { - batch._glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - } -#endif - - batch.draw(gpu::TRIANGLE_STRIP, _numVertices, 0); + batch.setPipeline(_pipeline); + batch.setModelTransform(_renderTransform); + batch.setResourceTexture(0, _textureLoaded ? _texture->getGPUTexture() : DependencyManager::get()->getWhiteTexture()); + batch.setResourceBuffer(0, _polylineGeometryBuffer); + batch.setUniformBuffer(0, _polylineDataBuffer); + batch.draw(gpu::TRIANGLE_STRIP, 2 * _numVertices, 0); } diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index 8130171da8..635a456ac9 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -25,52 +25,40 @@ class PolyLineEntityRenderer : public TypedEntityRenderer { public: PolyLineEntityRenderer(const EntityItemPointer& entity); - virtual scriptable::ScriptableModelBase getScriptableModel() override; + // FIXME: shouldn't always be transparent: take into account texture and glow + virtual bool isTransparent() const override { return true; } + protected: + virtual bool needsRenderUpdate() const override; virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override; - virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, - Transaction& transaction, - const TypedEntityPointer& entity) override; virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override; virtual ItemKey getKey() override; virtual ShapeKey getShapeKey() override; virtual void doRender(RenderArgs* args) override; - virtual bool isTransparent() const override { return true; } + void buildPipeline(); + void updateGeometry(); + void updateData(); - struct Vertex { - Vertex() {} - Vertex(const vec3& position, const vec3& normal, const vec2& uv, const vec3& color) : position(position), - normal(normal), - uv(uv), - color(color) {} - vec3 position; - vec3 normal; - vec2 uv; - vec3 color; - }; + QVector _points; + QVector _normals; + QVector _colors; + glm::vec3 _color; + QVector _widths; - void updateGeometry(const std::vector& vertices); - static std::vector updateVertices(const QVector& points, - const QVector& normals, - const QVector& strokeWidths, - const QVector& strokeColors, - const bool isUVModeStretch, - const float textureAspectRatio); - - Transform _polylineTransform; - QVector _lastPoints; - QVector _lastNormals; - QVector _lastStrokeColors; - QVector _lastStrokeWidths; - gpu::BufferPointer _verticesBuffer; - - uint32_t _numVertices { 0 }; - bool _empty{ true }; NetworkTexturePointer _texture; float _textureAspectRatio { 1.0f }; + bool _textureLoaded { false }; + bool _isUVModeStretch; + bool _faceCamera; + bool _glow; + + int _numVertices; + gpu::BufferPointer _polylineDataBuffer; + gpu::BufferPointer _polylineGeometryBuffer; + static gpu::PipelinePointer _pipeline; }; } } // namespace diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index f2c0d5572d..6ea088751f 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -14,21 +14,27 @@ <@include DeferredBufferWrite.slh@> -// the albedo texture -LAYOUT(binding=0) uniform sampler2D originalTexture; +<@include paintStroke.slh@> +<$declarePolyLineBuffers()$> -// the interpolated normal -layout(location=0) in vec3 interpolatedNormal; -layout(location=1) in vec2 varTexcoord; -layout(location=2) in vec4 varColor; +LAYOUT(binding=0) uniform sampler2D _texture; + +layout(location=0) in vec3 _normalWS; +layout(location=1) in vec2 _texCoord; +layout(location=2) in vec4 _color; +layout(location=3) in float _distanceFromCenter; void main(void) { - vec4 texel = texture(originalTexture, varTexcoord); - int frontCondition = 1 -int(gl_FrontFacing) * 2; - vec3 color = varColor.rgb; + vec4 texel = texture(_texture, _texCoord); + int frontCondition = 1 - 2 * int(gl_FrontFacing); + vec3 color = _color.rgb * texel.rgb; + float alpha = texel.a * _color.a; + + alpha *= mix(1.0, pow(1.0 - abs(_distanceFromCenter), 10.0), _polylineData.faceCameraGlow.y); + packDeferredFragmentTranslucent( - float(frontCondition) * interpolatedNormal, - texel.a * varColor.a, - color * texel.rgb, - 10.0); + float(frontCondition) * _normalWS, + alpha, + color, + DEFAULT_ROUGHNESS); } diff --git a/libraries/entities-renderer/src/paintStroke.slh b/libraries/entities-renderer/src/paintStroke.slh new file mode 100644 index 0000000000..6189ac461b --- /dev/null +++ b/libraries/entities-renderer/src/paintStroke.slh @@ -0,0 +1,48 @@ + + +<@if not PAINTSTROKE_SLH@> +<@def PAINTSTROKE_SLH@> + +<@include paintStroke_Shared.slh@> +<@include gpu/ShaderConstants.h@> + +<@func declarePolyLineBuffers() @> + +// Hack comment to absorb the extra '//' scribe prepends + +#if !defined(GPU_SSBO_TRANSFORM_OBJECT) +LAYOUT(binding=GPU_RESOURCE_BUFFER_SLOT0_TEXTURE) uniform samplerBuffer polylineVerticesBuffer; +PolylineVertex getPolylineVertex(int i) { + int offset = 4 * i; + PolylineVertex vertex; + vertex.positionAndUCoord = texelFetch(polylineVerticesBuffer, offset); + vertex.color = texelFetch(polylineVerticesBuffer, offset + 1); + vertex.normal = texelFetch(polylineVerticesBuffer, offset + 2); + vertex.binormalAndHalfWidth = texelFetch(polylineVerticesBuffer, offset + 3); + return vertex; +} +#else +LAYOUT_STD140(binding=GPU_RESOURCE_BUFFER_SLOT0_STORAGE) buffer polylineVerticesBuffer { + PolylineVertex _vertices[]; +}; +PolylineVertex getPolylineVertex(int i) { + PolylineVertex vertex = _vertices[i]; + return vertex; +} +#endif + +LAYOUT_STD140(binding=0) uniform polylineDataBuffer { + PolylineData _polylineData; +}; + +<@endfunc@> + +<@endif@> diff --git a/libraries/entities-renderer/src/paintStroke.slv b/libraries/entities-renderer/src/paintStroke.slv index ecf52d61cf..c033d2c247 100644 --- a/libraries/entities-renderer/src/paintStroke.slv +++ b/libraries/entities-renderer/src/paintStroke.slv @@ -17,23 +17,45 @@ <@include gpu/Transform.slh@> <$declareStandardTransform()$> -// the interpolated normal -layout(location=0) out vec3 interpolatedNormal; +<@include paintStroke.slh@> +<$declarePolyLineBuffers()$> -//the diffuse texture -layout(location=1) out vec2 varTexcoord; - -layout(location=2) out vec4 varColor; +layout(location=0) out vec3 _normalWS; +layout(location=1) out vec2 _texCoord; +layout(location=2) out vec4 _color; +layout(location=3) out float _distanceFromCenter; void main(void) { - varTexcoord = inTexCoord0.st; + PolylineVertex vertex = getPolylineVertex(gl_VertexID / 2); + float evenVertex = float(gl_VertexID % 2 == 0); - // pass along the diffuse color - varColor = color_sRGBAToLinear(inColor); + _texCoord = vec2(vertex.positionAndUCoord.w, mix(1.0, 0.0, evenVertex)); + _color = color_sRGBAToLinear(vertex.color); - // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToClipPos(cam, obj, inPosition, gl_Position)$> - <$transformModelToEyeDir(cam, obj, inNormal.xyz, interpolatedNormal)$> + _distanceFromCenter = -1.0 + 2.0 * evenVertex; + vec4 position = vec4(vertex.positionAndUCoord.xyz, 1.0); + vec3 normal = vertex.normal.xyz; + vec3 binormal = vertex.binormalAndHalfWidth.xyz; + if (_polylineData.faceCameraGlow.x != 0.0) { + vec4 posEye; + vec3 normalEye; + vec3 binormalEye; + <$transformModelToEyePos(cam, obj, position, posEye)$> + <$transformModelToEyeDir(cam, obj, normal, normalEye)$> + <$transformModelToEyeDir(cam, obj, binormal, binormalEye)$> + + vec3 tangentEye = cross(binormalEye, normalEye); + // new normal faces the camera + normalEye = normalize(posEye.xyz); + binormalEye = normalize(cross(normalEye, tangentEye)); + posEye.xyz += _distanceFromCenter * vertex.binormalAndHalfWidth.w * binormalEye; + <$transformEyeToClipPos(cam, posEye, gl_Position)$> + <$transformEyeToWorldDir(cam, normalEye, _normalWS)$> + } else { + position.xyz += _distanceFromCenter * vertex.binormalAndHalfWidth.w * binormal; + <$transformModelToClipPos(cam, obj, position, gl_Position)$> + <$transformModelToWorldDir(cam, obj, normal, _normalWS)$> + } } \ No newline at end of file diff --git a/libraries/entities-renderer/src/paintStroke_Shared.slh b/libraries/entities-renderer/src/paintStroke_Shared.slh new file mode 100644 index 0000000000..460f6c6042 --- /dev/null +++ b/libraries/entities-renderer/src/paintStroke_Shared.slh @@ -0,0 +1,25 @@ +// glsl / C++ compatible source as interface for FadeEffect +#ifdef __cplusplus +# define _VEC4 glm::vec4 +# define _VEC2 glm::vec2 +#else +# define _VEC4 vec4 +# define _VEC2 vec2 +#endif + +struct PolylineVertex { + _VEC4 positionAndUCoord; + _VEC4 color; + _VEC4 normal; + _VEC4 binormalAndHalfWidth; +}; + +struct PolylineData { + _VEC2 faceCameraGlow; + _VEC2 spare; +}; + +// <@if 1@> +// Trigger Scribe include +// <@endif@> +// \ No newline at end of file diff --git a/libraries/entities-renderer/src/paintStroke_fade.slf b/libraries/entities-renderer/src/paintStroke_fade.slf deleted file mode 100644 index fa6d0aab75..0000000000 --- a/libraries/entities-renderer/src/paintStroke_fade.slf +++ /dev/null @@ -1,52 +0,0 @@ -<@include gpu/Config.slh@> -<$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// paintStroke_fade.frag -// fragment shader -// -// Created by Olivier Prat on 19/07/17. -// Copyright 2017 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -<@include DeferredBufferWrite.slh@> - -<@include Fade.slh@> -<$declareFadeFragment()$> - -// the albedo texture -LAYOUT(binding=0) uniform sampler2D originalTexture; - -// the interpolated normal -layout(location=0) in vec3 interpolatedNormal; -layout(location=1) in vec2 varTexcoord; -layout(location=2) in vec4 varColor; -layout(location=3) in vec4 _worldPosition; - -struct PolyLineUniforms { - vec3 color; -}; - -LAYOUT(binding=0) uniform polyLineBuffer { - PolyLineUniforms polyline; -}; - -void main(void) { - vec3 fadeEmissive; - FadeObjectParams fadeParams; - - <$fetchFadeObjectParams(fadeParams)$> - applyFade(fadeParams, _worldPosition.xyz, fadeEmissive); - - vec4 texel = texture(originalTexture, varTexcoord); - int frontCondition = 1 -int(gl_FrontFacing) * 2; - vec3 color = varColor.rgb; - packDeferredFragmentTranslucent( - interpolatedNormal * float(frontCondition), - texel.a * varColor.a, - polyline.color * texel.rgb + fadeEmissive, - 10.0); -} diff --git a/libraries/entities-renderer/src/paintStroke_fade.slv b/libraries/entities-renderer/src/paintStroke_fade.slv deleted file mode 100644 index f6fcb18c98..0000000000 --- a/libraries/entities-renderer/src/paintStroke_fade.slv +++ /dev/null @@ -1,43 +0,0 @@ -<@include gpu/Config.slh@> -<$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// paintStroke_fade.vert -// vertex shader -// -// Created by Olivier Prat on 19/07/17. -// Copyright 2017 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -<@include gpu/Inputs.slh@> -<@include gpu/Color.slh@> -<@include gpu/Transform.slh@> -<$declareStandardTransform()$> - -// the interpolated normal -layout(location=0) out vec3 interpolatedNormal; - -//the diffuse texture -layout(location=1) out vec2 varTexcoord; - -layout(location=2) out vec4 varColor; -layout(location=3) out vec4 _worldPosition; - -void main(void) { - - varTexcoord = inTexCoord0.st; - - // pass along the diffuse color - varColor = color_sRGBAToLinear(inColor); - - - // standard transform - TransformCamera cam = getTransformCamera(); - TransformObject obj = getTransformObject(); - <$transformModelToClipPos(cam, obj, inPosition, gl_Position)$> - <$transformModelToEyeDir(cam, obj, inNormal.xyz, interpolatedNormal)$> - <$transformModelToWorldPos(obj, inPosition, _worldPosition)$> -} \ No newline at end of file diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 8b790f162e..4e6520fca3 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -70,33 +70,60 @@ EntityItem::~EntityItem() { EntityPropertyFlags EntityItem::getEntityProperties(EncodeBitstreamParams& params) const { EntityPropertyFlags requestedProperties; + // Core requestedProperties += PROP_SIMULATION_OWNER; + requestedProperties += PROP_VISIBLE; + requestedProperties += PROP_NAME; + requestedProperties += PROP_LOCKED; + requestedProperties += PROP_USER_DATA; + requestedProperties += PROP_HREF; + requestedProperties += PROP_DESCRIPTION; requestedProperties += PROP_POSITION; + requestedProperties += PROP_DIMENSIONS; requestedProperties += PROP_ROTATION; + requestedProperties += PROP_REGISTRATION_POINT; + // TODO: handle PROP_CREATED? + requestedProperties += PROP_LAST_EDITED_BY; + requestedProperties += PROP_ENTITY_HOST_TYPE; + requestedProperties += PROP_OWNING_AVATAR_ID; + requestedProperties += PROP_PARENT_ID; + requestedProperties += PROP_PARENT_JOINT_INDEX; + requestedProperties += PROP_QUERY_AA_CUBE; + requestedProperties += PROP_CAN_CAST_SHADOW; + // requestedProperties += PROP_VISIBLE_IN_SECONDARY_CAMERA; // not sent over wire + withReadLock([&] { + requestedProperties += _grabProperties.getEntityProperties(params); + }); + + // Physics + requestedProperties += PROP_DENSITY; requestedProperties += PROP_VELOCITY; requestedProperties += PROP_ANGULAR_VELOCITY; - requestedProperties += PROP_ACCELERATION; - - requestedProperties += PROP_DIMENSIONS; - requestedProperties += PROP_DENSITY; requestedProperties += PROP_GRAVITY; + requestedProperties += PROP_ACCELERATION; requestedProperties += PROP_DAMPING; + requestedProperties += PROP_ANGULAR_DAMPING; requestedProperties += PROP_RESTITUTION; requestedProperties += PROP_FRICTION; requestedProperties += PROP_LIFETIME; - requestedProperties += PROP_SCRIPT; - requestedProperties += PROP_SCRIPT_TIMESTAMP; - requestedProperties += PROP_SERVER_SCRIPTS; - requestedProperties += PROP_COLLISION_SOUND_URL; - requestedProperties += PROP_REGISTRATION_POINT; - requestedProperties += PROP_ANGULAR_DAMPING; - requestedProperties += PROP_VISIBLE; - requestedProperties += PROP_CAN_CAST_SHADOW; requestedProperties += PROP_COLLISIONLESS; requestedProperties += PROP_COLLISION_MASK; requestedProperties += PROP_DYNAMIC; - requestedProperties += PROP_LOCKED; - requestedProperties += PROP_USER_DATA; + requestedProperties += PROP_COLLISION_SOUND_URL; + requestedProperties += PROP_ACTION_DATA; + + // Cloning + requestedProperties += PROP_CLONEABLE; + requestedProperties += PROP_CLONE_LIFETIME; + requestedProperties += PROP_CLONE_LIMIT; + requestedProperties += PROP_CLONE_DYNAMIC; + requestedProperties += PROP_CLONE_AVATAR_ENTITY; + requestedProperties += PROP_CLONE_ORIGIN_ID; + + // Scripts + requestedProperties += PROP_SCRIPT; + requestedProperties += PROP_SCRIPT_TIMESTAMP; + requestedProperties += PROP_SERVER_SCRIPTS; // Certifiable properties requestedProperties += PROP_ITEM_NAME; @@ -111,30 +138,6 @@ EntityPropertyFlags EntityItem::getEntityProperties(EncodeBitstreamParams& param requestedProperties += PROP_CERTIFICATE_ID; requestedProperties += PROP_STATIC_CERTIFICATE_VERSION; - requestedProperties += PROP_NAME; - requestedProperties += PROP_HREF; - requestedProperties += PROP_DESCRIPTION; - requestedProperties += PROP_ACTION_DATA; - requestedProperties += PROP_PARENT_ID; - requestedProperties += PROP_PARENT_JOINT_INDEX; - requestedProperties += PROP_QUERY_AA_CUBE; - - requestedProperties += PROP_ENTITY_HOST_TYPE; - requestedProperties += PROP_OWNING_AVATAR_ID; - - requestedProperties += PROP_LAST_EDITED_BY; - - requestedProperties += PROP_CLONEABLE; - requestedProperties += PROP_CLONE_LIFETIME; - requestedProperties += PROP_CLONE_LIMIT; - requestedProperties += PROP_CLONE_DYNAMIC; - requestedProperties += PROP_CLONE_AVATAR_ENTITY; - requestedProperties += PROP_CLONE_ORIGIN_ID; - - withReadLock([&] { - requestedProperties += _grabProperties.getEntityProperties(params); - }); - return requestedProperties; } @@ -245,31 +248,65 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet // PROP_CUSTOM_PROPERTIES_INCLUDED, APPEND_ENTITY_PROPERTY(PROP_SIMULATION_OWNER, _simulationOwner.toByteArray()); + APPEND_ENTITY_PROPERTY(PROP_VISIBLE, getVisible()); + APPEND_ENTITY_PROPERTY(PROP_NAME, getName()); + APPEND_ENTITY_PROPERTY(PROP_LOCKED, getLocked()); + APPEND_ENTITY_PROPERTY(PROP_USER_DATA, getUserData()); + APPEND_ENTITY_PROPERTY(PROP_HREF, getHref()); + APPEND_ENTITY_PROPERTY(PROP_DESCRIPTION, getDescription()); APPEND_ENTITY_PROPERTY(PROP_POSITION, getLocalPosition()); + APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, getUnscaledDimensions()); APPEND_ENTITY_PROPERTY(PROP_ROTATION, getLocalOrientation()); + APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, getRegistrationPoint()); + // TODO: handle created? + APPEND_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, getLastEditedBy()); + // APPEND_ENTITY_PROPERTY(PROP_ENTITY_HOST_TYPE, getEntityHostType()); // not sent over wire + // APPEND_ENTITY_PROPERTY(PROP_OWNING_AVATAR_ID, getOwningAvatarID()); // not sent over wire + // convert AVATAR_SELF_ID to actual sessionUUID. + QUuid actualParentID = getParentID(); + if (actualParentID == AVATAR_SELF_ID) { + auto nodeList = DependencyManager::get(); + actualParentID = nodeList->getSessionUUID(); + } + APPEND_ENTITY_PROPERTY(PROP_PARENT_ID, actualParentID); + APPEND_ENTITY_PROPERTY(PROP_PARENT_JOINT_INDEX, getParentJointIndex()); + APPEND_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, getQueryAACube()); + APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, getCanCastShadow()); + // APPEND_ENTITY_PROPERTY(PROP_VISIBLE_IN_SECONDARY_CAMERA, getIsVisibleInSecondaryCamera()); // not sent over wire + withReadLock([&] { + _grabProperties.appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties, + propertyFlags, propertiesDidntFit, propertyCount, appendState); + }); + + // Physics + APPEND_ENTITY_PROPERTY(PROP_DENSITY, getDensity()); APPEND_ENTITY_PROPERTY(PROP_VELOCITY, getLocalVelocity()); APPEND_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, getLocalAngularVelocity()); - APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, getAcceleration()); - - APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, getUnscaledDimensions()); - APPEND_ENTITY_PROPERTY(PROP_DENSITY, getDensity()); APPEND_ENTITY_PROPERTY(PROP_GRAVITY, getGravity()); + APPEND_ENTITY_PROPERTY(PROP_ACCELERATION, getAcceleration()); APPEND_ENTITY_PROPERTY(PROP_DAMPING, getDamping()); + APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, getAngularDamping()); APPEND_ENTITY_PROPERTY(PROP_RESTITUTION, getRestitution()); APPEND_ENTITY_PROPERTY(PROP_FRICTION, getFriction()); APPEND_ENTITY_PROPERTY(PROP_LIFETIME, getLifetime()); - APPEND_ENTITY_PROPERTY(PROP_SCRIPT, getScript()); - APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, getScriptTimestamp()); - APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, getServerScripts()); - APPEND_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, getRegistrationPoint()); - APPEND_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, getAngularDamping()); - APPEND_ENTITY_PROPERTY(PROP_VISIBLE, getVisible()); - APPEND_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, getCanCastShadow()); APPEND_ENTITY_PROPERTY(PROP_COLLISIONLESS, getCollisionless()); APPEND_ENTITY_PROPERTY(PROP_COLLISION_MASK, getCollisionMask()); APPEND_ENTITY_PROPERTY(PROP_DYNAMIC, getDynamic()); - APPEND_ENTITY_PROPERTY(PROP_LOCKED, getLocked()); - APPEND_ENTITY_PROPERTY(PROP_USER_DATA, getUserData()); + APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, getCollisionSoundURL()); + APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, getDynamicData()); + + // Cloning + APPEND_ENTITY_PROPERTY(PROP_CLONEABLE, getCloneable()); + APPEND_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, getCloneLifetime()); + APPEND_ENTITY_PROPERTY(PROP_CLONE_LIMIT, getCloneLimit()); + APPEND_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, getCloneDynamic()); + APPEND_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, getCloneAvatarEntity()); + APPEND_ENTITY_PROPERTY(PROP_CLONE_ORIGIN_ID, getCloneOriginID()); + + // Scripts + APPEND_ENTITY_PROPERTY(PROP_SCRIPT, getScript()); + APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, getScriptTimestamp()); + APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, getServerScripts()); // Certifiable Properties APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, getMarketplaceID()); @@ -284,36 +321,6 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, getCertificateID()); APPEND_ENTITY_PROPERTY(PROP_STATIC_CERTIFICATE_VERSION, getStaticCertificateVersion()); - APPEND_ENTITY_PROPERTY(PROP_NAME, getName()); - APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, getCollisionSoundURL()); - APPEND_ENTITY_PROPERTY(PROP_HREF, getHref()); - APPEND_ENTITY_PROPERTY(PROP_DESCRIPTION, getDescription()); - APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, getDynamicData()); - - // convert AVATAR_SELF_ID to actual sessionUUID. - QUuid actualParentID = getParentID(); - if (actualParentID == AVATAR_SELF_ID) { - auto nodeList = DependencyManager::get(); - actualParentID = nodeList->getSessionUUID(); - } - APPEND_ENTITY_PROPERTY(PROP_PARENT_ID, actualParentID); - - APPEND_ENTITY_PROPERTY(PROP_PARENT_JOINT_INDEX, getParentJointIndex()); - APPEND_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, getQueryAACube()); - APPEND_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, getLastEditedBy()); - - APPEND_ENTITY_PROPERTY(PROP_CLONEABLE, getCloneable()); - APPEND_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, getCloneLifetime()); - APPEND_ENTITY_PROPERTY(PROP_CLONE_LIMIT, getCloneLimit()); - APPEND_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, getCloneDynamic()); - APPEND_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, getCloneAvatarEntity()); - APPEND_ENTITY_PROPERTY(PROP_CLONE_ORIGIN_ID, getCloneOriginID()); - - withReadLock([&] { - _grabProperties.appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties, - propertyFlags, propertiesDidntFit, propertyCount, appendState); - }); - appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties, propertyFlags, @@ -766,6 +773,14 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef return otherOverwrites && simulationChanged && (valueChanged || filterRejection); }; + // Core + // PROP_SIMULATION_OWNER handled above + READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, setVisible); + READ_ENTITY_PROPERTY(PROP_NAME, QString, setName); + READ_ENTITY_PROPERTY(PROP_LOCKED, bool, setLocked); + READ_ENTITY_PROPERTY(PROP_USER_DATA, QString, setUserData); + READ_ENTITY_PROPERTY(PROP_HREF, QString, setHref); + READ_ENTITY_PROPERTY(PROP_DESCRIPTION, QString, setDescription); { // When we own the simulation we don't accept updates to the entity's transform/velocities // we also want to ignore any duplicate packets that have the same "recently updated" values // as a packet we've already recieved. This is because we want multiple edits of the same @@ -778,30 +793,68 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef // Note: duplicate packets are expected and not wrong. They may be sent for any number of // reasons and the contract is that the client handles them in an idempotent manner. - auto customUpdatePositionFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ + auto customUpdatePositionFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value) { if (shouldUpdate(_lastUpdatedPositionTimestamp, value != _lastUpdatedPositionValue)) { setPosition(value); _lastUpdatedPositionTimestamp = lastEdited; _lastUpdatedPositionValue = value; } }; - - auto customUpdateRotationFromNetwork = [this, shouldUpdate, lastEdited](glm::quat value){ + READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, customUpdatePositionFromNetwork); + } + READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, setUnscaledDimensions); + { // See comment above + auto customUpdateRotationFromNetwork = [this, shouldUpdate, lastEdited](glm::quat value) { if (shouldUpdate(_lastUpdatedRotationTimestamp, value != _lastUpdatedRotationValue)) { setRotation(value); _lastUpdatedRotationTimestamp = lastEdited; _lastUpdatedRotationValue = value; } }; + READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, customUpdateRotationFromNetwork); + } + READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, setRegistrationPoint); + // READ_ENTITY_PROPERTY(PROP_CREATED, quint64, setCreated); // not sent over wire + READ_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, QUuid, setLastEditedBy); + // READ_ENTITY_PROPERTY(PROP_ENTITY_HOST_TYPE, entity::HostType, setEntityHostType); // not sent over wire + // READ_ENTITY_PROPERTY(PROP_OWNING_AVATAR_ID, QUuuid, setOwningAvatarID); // not sent over wire + { // parentID and parentJointIndex are protected by simulation ownership + bool oldOverwrite = overwriteLocalData; + overwriteLocalData = overwriteLocalData && !weOwnSimulation; + READ_ENTITY_PROPERTY(PROP_PARENT_ID, QUuid, setParentID); + READ_ENTITY_PROPERTY(PROP_PARENT_JOINT_INDEX, quint16, setParentJointIndex); + overwriteLocalData = oldOverwrite; + } + { // See comment above + auto customUpdateQueryAACubeFromNetwork = [this, shouldUpdate, lastEdited](AACube value) { + if (shouldUpdate(_lastUpdatedQueryAACubeTimestamp, value != _lastUpdatedQueryAACubeValue)) { + setQueryAACube(value); + _lastUpdatedQueryAACubeTimestamp = lastEdited; + _lastUpdatedQueryAACubeValue = value; + } + }; + READ_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, AACube, customUpdateQueryAACubeFromNetwork); + } + READ_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow); + // READ_ENTITY_PROPERTY(PROP_VISIBLE_IN_SECONDARY_CAMERA, bool, setIsVisibleInSecondaryCamera); // not sent over wire + withWriteLock([&] { + int bytesFromGrab = _grabProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, + propertyFlags, overwriteLocalData, + somethingChanged); + bytesRead += bytesFromGrab; + dataAt += bytesFromGrab; + }); - auto customUpdateVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ - if (shouldUpdate(_lastUpdatedVelocityTimestamp, value != _lastUpdatedVelocityValue)) { + READ_ENTITY_PROPERTY(PROP_DENSITY, float, setDensity); + { + auto customUpdateVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value) { + if (shouldUpdate(_lastUpdatedVelocityTimestamp, value != _lastUpdatedVelocityValue)) { setVelocity(value); _lastUpdatedVelocityTimestamp = lastEdited; _lastUpdatedVelocityValue = value; } }; - + READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, customUpdateVelocityFromNetwork); auto customUpdateAngularVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ if (shouldUpdate(_lastUpdatedAngularVelocityTimestamp, value != _lastUpdatedAngularVelocityValue)) { setAngularVelocity(value); @@ -809,7 +862,8 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef _lastUpdatedAngularVelocityValue = value; } }; - + READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, customUpdateAngularVelocityFromNetwork); + READ_ENTITY_PROPERTY(PROP_GRAVITY, glm::vec3, setGravity); auto customSetAcceleration = [this, shouldUpdate, lastEdited](glm::vec3 value){ if (shouldUpdate(_lastUpdatedAccelerationTimestamp, value != _lastUpdatedAccelerationValue)) { setAcceleration(value); @@ -817,48 +871,40 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef _lastUpdatedAccelerationValue = value; } }; - - READ_ENTITY_PROPERTY(PROP_POSITION, glm::vec3, customUpdatePositionFromNetwork); - READ_ENTITY_PROPERTY(PROP_ROTATION, glm::quat, customUpdateRotationFromNetwork); - READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, customUpdateVelocityFromNetwork); - READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, customUpdateAngularVelocityFromNetwork); READ_ENTITY_PROPERTY(PROP_ACCELERATION, glm::vec3, customSetAcceleration); } - - READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, setUnscaledDimensions); - READ_ENTITY_PROPERTY(PROP_DENSITY, float, setDensity); - READ_ENTITY_PROPERTY(PROP_GRAVITY, glm::vec3, setGravity); - READ_ENTITY_PROPERTY(PROP_DAMPING, float, setDamping); + READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, setAngularDamping); READ_ENTITY_PROPERTY(PROP_RESTITUTION, float, setRestitution); READ_ENTITY_PROPERTY(PROP_FRICTION, float, setFriction); READ_ENTITY_PROPERTY(PROP_LIFETIME, float, setLifetime); - READ_ENTITY_PROPERTY(PROP_SCRIPT, QString, setScript); - READ_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp); - - { - // We use this scope to work around an issue stopping server script changes - // from being received by an entity script server running a script that continously updates an entity. - - // Basically, we'll allow recent changes to the server scripts even if there are local changes to other properties - // that have been made more recently. - - bool overwriteLocalData = !ignoreServerPacket || (lastEditedFromBufferAdjusted > _serverScriptsChangedTimestamp); - - READ_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, QString, setServerScripts); - } - - READ_ENTITY_PROPERTY(PROP_REGISTRATION_POINT, glm::vec3, setRegistrationPoint); - - READ_ENTITY_PROPERTY(PROP_ANGULAR_DAMPING, float, setAngularDamping); - READ_ENTITY_PROPERTY(PROP_VISIBLE, bool, setVisible); - READ_ENTITY_PROPERTY(PROP_CAN_CAST_SHADOW, bool, setCanCastShadow); READ_ENTITY_PROPERTY(PROP_COLLISIONLESS, bool, setCollisionless); READ_ENTITY_PROPERTY(PROP_COLLISION_MASK, uint16_t, setCollisionMask); READ_ENTITY_PROPERTY(PROP_DYNAMIC, bool, setDynamic); - READ_ENTITY_PROPERTY(PROP_LOCKED, bool, setLocked); - READ_ENTITY_PROPERTY(PROP_USER_DATA, QString, setUserData); + READ_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); + READ_ENTITY_PROPERTY(PROP_ACTION_DATA, QByteArray, setDynamicData); + // Cloning + READ_ENTITY_PROPERTY(PROP_CLONEABLE, bool, setCloneable); + READ_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, float, setCloneLifetime); + READ_ENTITY_PROPERTY(PROP_CLONE_LIMIT, float, setCloneLimit); + READ_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, bool, setCloneDynamic); + READ_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, bool, setCloneAvatarEntity); + READ_ENTITY_PROPERTY(PROP_CLONE_ORIGIN_ID, QUuid, setCloneOriginID); + + // Scripts + READ_ENTITY_PROPERTY(PROP_SCRIPT, QString, setScript); + READ_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp); + { + // We use this scope to work around an issue stopping server script changes + // from being received by an entity script server running a script that continously updates an entity. + // Basically, we'll allow recent changes to the server scripts even if there are local changes to other properties + // that have been made more recently. + bool overwriteLocalData = !ignoreServerPacket || (lastEditedFromBufferAdjusted > _serverScriptsChangedTimestamp); + READ_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, QString, setServerScripts); + } + + // Certifiable props READ_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, QString, setMarketplaceID); READ_ENTITY_PROPERTY(PROP_ITEM_NAME, QString, setItemName); READ_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, QString, setItemDescription); @@ -871,49 +917,6 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, QString, setCertificateID); READ_ENTITY_PROPERTY(PROP_STATIC_CERTIFICATE_VERSION, quint32, setStaticCertificateVersion); - READ_ENTITY_PROPERTY(PROP_NAME, QString, setName); - READ_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); - READ_ENTITY_PROPERTY(PROP_HREF, QString, setHref); - READ_ENTITY_PROPERTY(PROP_DESCRIPTION, QString, setDescription); - READ_ENTITY_PROPERTY(PROP_ACTION_DATA, QByteArray, setDynamicData); - - { // parentID and parentJointIndex are also protected by simulation ownership - bool oldOverwrite = overwriteLocalData; - overwriteLocalData = overwriteLocalData && !weOwnSimulation; - READ_ENTITY_PROPERTY(PROP_PARENT_ID, QUuid, setParentID); - READ_ENTITY_PROPERTY(PROP_PARENT_JOINT_INDEX, quint16, setParentJointIndex); - overwriteLocalData = oldOverwrite; - } - - - { - auto customUpdateQueryAACubeFromNetwork = [this, shouldUpdate, lastEdited](AACube value){ - if (shouldUpdate(_lastUpdatedQueryAACubeTimestamp, value != _lastUpdatedQueryAACubeValue)) { - setQueryAACube(value); - _lastUpdatedQueryAACubeTimestamp = lastEdited; - _lastUpdatedQueryAACubeValue = value; - } - }; - READ_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, AACube, customUpdateQueryAACubeFromNetwork); - } - - READ_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, QUuid, setLastEditedBy); - - READ_ENTITY_PROPERTY(PROP_CLONEABLE, bool, setCloneable); - READ_ENTITY_PROPERTY(PROP_CLONE_LIFETIME, float, setCloneLifetime); - READ_ENTITY_PROPERTY(PROP_CLONE_LIMIT, float, setCloneLimit); - READ_ENTITY_PROPERTY(PROP_CLONE_DYNAMIC, bool, setCloneDynamic); - READ_ENTITY_PROPERTY(PROP_CLONE_AVATAR_ENTITY, bool, setCloneAvatarEntity); - READ_ENTITY_PROPERTY(PROP_CLONE_ORIGIN_ID, QUuid, setCloneOriginID); - - withWriteLock([&] { - int bytesFromGrab = _grabProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, - propertyFlags, overwriteLocalData, - somethingChanged); - bytesRead += bytesFromGrab; - dataAt += bytesFromGrab; - }); - bytesRead += readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, propertyFlags, overwriteLocalData, somethingChanged); @@ -1282,33 +1285,60 @@ EntityItemProperties EntityItem::getProperties(const EntityPropertyFlags& desire properties._type = getType(); + // Core COPY_ENTITY_PROPERTY_TO_PROPERTIES(simulationOwner, getSimulationOwner); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(visible, getVisible); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(name, getName); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(locked, getLocked); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(userData, getUserData); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(href, getHref); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(description, getDescription); COPY_ENTITY_PROPERTY_TO_PROPERTIES(position, getLocalPosition); COPY_ENTITY_PROPERTY_TO_PROPERTIES(dimensions, getUnscaledDimensions); COPY_ENTITY_PROPERTY_TO_PROPERTIES(rotation, getLocalOrientation); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(registrationPoint, getRegistrationPoint); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(created, getCreated); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(lastEditedBy, getLastEditedBy); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(entityHostType, getEntityHostType); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(owningAvatarID, getOwningAvatarID); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(parentID, getParentID); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(parentJointIndex, getParentJointIndex); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(queryAACube, getQueryAACube); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(canCastShadow, getCanCastShadow); + // COPY_ENTITY_PROPERTY_TO_PROPERTIES(isVisibleInSecondaryCamera, getIsVisibleInSecondaryCamera); // not sent over wire + withReadLock([&] { + _grabProperties.getProperties(properties); + }); + + // Physics COPY_ENTITY_PROPERTY_TO_PROPERTIES(density, getDensity); COPY_ENTITY_PROPERTY_TO_PROPERTIES(velocity, getLocalVelocity); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularVelocity, getLocalAngularVelocity); COPY_ENTITY_PROPERTY_TO_PROPERTIES(gravity, getGravity); COPY_ENTITY_PROPERTY_TO_PROPERTIES(acceleration, getAcceleration); COPY_ENTITY_PROPERTY_TO_PROPERTIES(damping, getDamping); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularDamping, getAngularDamping); COPY_ENTITY_PROPERTY_TO_PROPERTIES(restitution, getRestitution); COPY_ENTITY_PROPERTY_TO_PROPERTIES(friction, getFriction); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(created, getCreated); COPY_ENTITY_PROPERTY_TO_PROPERTIES(lifetime, getLifetime); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(script, getScript); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(scriptTimestamp, getScriptTimestamp); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(serverScripts, getServerScripts); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionSoundURL, getCollisionSoundURL); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(registrationPoint, getRegistrationPoint); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularVelocity, getLocalAngularVelocity); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(angularDamping, getAngularDamping); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(visible, getVisible); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(canCastShadow, getCanCastShadow); COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionless, getCollisionless); COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionMask, getCollisionMask); COPY_ENTITY_PROPERTY_TO_PROPERTIES(dynamic, getDynamic); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(locked, getLocked); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(userData, getUserData); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(collisionSoundURL, getCollisionSoundURL); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(actionData, getDynamicData); + + // Cloning + COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneable, getCloneable); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneLifetime, getCloneLifetime); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneLimit, getCloneLimit); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneDynamic, getCloneDynamic); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneAvatarEntity, getCloneAvatarEntity); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneOriginID, getCloneOriginID); + + // Scripts + COPY_ENTITY_PROPERTY_TO_PROPERTIES(script, getScript); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(scriptTimestamp, getScriptTimestamp); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(serverScripts, getServerScripts); // Certifiable Properties COPY_ENTITY_PROPERTY_TO_PROPERTIES(itemName, getItemName); @@ -1323,31 +1353,13 @@ EntityItemProperties EntityItem::getProperties(const EntityPropertyFlags& desire COPY_ENTITY_PROPERTY_TO_PROPERTIES(certificateID, getCertificateID); COPY_ENTITY_PROPERTY_TO_PROPERTIES(staticCertificateVersion, getStaticCertificateVersion); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(name, getName); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(href, getHref); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(description, getDescription); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(actionData, getDynamicData); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(parentID, getParentID); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(parentJointIndex, getParentJointIndex); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(queryAACube, getQueryAACube); + // Script local data COPY_ENTITY_PROPERTY_TO_PROPERTIES(localPosition, getLocalPosition); COPY_ENTITY_PROPERTY_TO_PROPERTIES(localRotation, getLocalOrientation); - - COPY_ENTITY_PROPERTY_TO_PROPERTIES(entityHostType, getEntityHostType); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(owningAvatarID, getOwningAvatarID); - - COPY_ENTITY_PROPERTY_TO_PROPERTIES(lastEditedBy, getLastEditedBy); - - COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneable, getCloneable); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneLifetime, getCloneLifetime); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneLimit, getCloneLimit); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneDynamic, getCloneDynamic); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneAvatarEntity, getCloneAvatarEntity); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(cloneOriginID, getCloneOriginID); - - withReadLock([&] { - _grabProperties.getProperties(properties); - }); + // FIXME: are these needed? + //COPY_ENTITY_PROPERTY_TO_PROPERTIES(localVelocity, getLocalVelocity); + //COPY_ENTITY_PROPERTY_TO_PROPERTIES(localAngularVelocity, getLocalAngularVelocity); + //COPY_ENTITY_PROPERTY_TO_PROPERTIES(localDimensions, getLocalDimensions); properties._defaultSettings = false; @@ -1417,41 +1429,61 @@ bool EntityItem::stillWaitingToTakeOwnership(uint64_t timestamp) const { bool EntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; - // these affect transform and velocity properties + // Core SET_ENTITY_PROPERTY_FROM_PROPERTIES(simulationOwner, setSimulationOwner); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(visible, setVisible); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(name, setName); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(locked, setLocked); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(userData, setUserData); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(href, setHref); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(description, setDescription); SET_ENTITY_PROPERTY_FROM_PROPERTIES(position, setPosition); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(dimensions, setUnscaledDimensions); SET_ENTITY_PROPERTY_FROM_PROPERTIES(rotation, setRotation); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(registrationPoint, setRegistrationPoint); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(created, setCreated); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(lastEditedBy, setLastEditedBy); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(entityHostType, setEntityHostType); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(owningAvatarID, setOwningAvatarID); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(parentID, setParentID); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(parentJointIndex, setParentJointIndex); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(queryAACube, setQueryAACube); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(canCastShadow, setCanCastShadow); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(isVisibleInSecondaryCamera, setIsVisibleInSecondaryCamera); + withWriteLock([&] { + bool grabPropertiesChanged = _grabProperties.setProperties(properties); + somethingChanged |= grabPropertiesChanged; + }); + + // Physics + SET_ENTITY_PROPERTY_FROM_PROPERTIES(density, setDensity); SET_ENTITY_PROPERTY_FROM_PROPERTIES(velocity, setVelocity); SET_ENTITY_PROPERTY_FROM_PROPERTIES(angularVelocity, setAngularVelocity); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(acceleration, setAcceleration); - - // these (along with "position" above) affect tree structure - SET_ENTITY_PROPERTY_FROM_PROPERTIES(dimensions, setUnscaledDimensions); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(registrationPoint, setRegistrationPoint); - - // these (along with all properties above) affect the simulation - SET_ENTITY_PROPERTY_FROM_PROPERTIES(density, setDensity); SET_ENTITY_PROPERTY_FROM_PROPERTIES(gravity, setGravity); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(acceleration, setAcceleration); SET_ENTITY_PROPERTY_FROM_PROPERTIES(damping, setDamping); SET_ENTITY_PROPERTY_FROM_PROPERTIES(angularDamping, setAngularDamping); SET_ENTITY_PROPERTY_FROM_PROPERTIES(restitution, setRestitution); SET_ENTITY_PROPERTY_FROM_PROPERTIES(friction, setFriction); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifetime, setLifetime); SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionless, setCollisionless); SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionMask, setCollisionMask); SET_ENTITY_PROPERTY_FROM_PROPERTIES(dynamic, setDynamic); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(created, setCreated); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifetime, setLifetime); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(locked, setLocked); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionSoundURL, setCollisionSoundURL); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(actionData, setDynamicData); - // non-simulation properties below + // Cloning + SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneable, setCloneable); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneLifetime, setCloneLifetime); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneLimit, setCloneLimit); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneDynamic, setCloneDynamic); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneAvatarEntity, setCloneAvatarEntity); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneOriginID, setCloneOriginID); + + // Scripts SET_ENTITY_PROPERTY_FROM_PROPERTIES(script, setScript); SET_ENTITY_PROPERTY_FROM_PROPERTIES(scriptTimestamp, setScriptTimestamp); SET_ENTITY_PROPERTY_FROM_PROPERTIES(serverScripts, setServerScripts); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(collisionSoundURL, setCollisionSoundURL); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(visible, setVisible); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(canCastShadow, setCanCastShadow); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(userData, setUserData); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(isVisibleInSecondaryCamera, setIsVisibleInSecondaryCamera); // Certifiable Properties SET_ENTITY_PROPERTY_FROM_PROPERTIES(itemName, setItemName); @@ -1466,31 +1498,6 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(certificateID, setCertificateID); SET_ENTITY_PROPERTY_FROM_PROPERTIES(staticCertificateVersion, setStaticCertificateVersion); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(name, setName); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(href, setHref); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(description, setDescription); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(actionData, setDynamicData); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(parentID, setParentID); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(parentJointIndex, setParentJointIndex); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(queryAACube, setQueryAACube); - - SET_ENTITY_PROPERTY_FROM_PROPERTIES(entityHostType, setEntityHostType); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(owningAvatarID, setOwningAvatarID); - - SET_ENTITY_PROPERTY_FROM_PROPERTIES(lastEditedBy, setLastEditedBy); - - SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneable, setCloneable); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneLifetime, setCloneLifetime); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneLimit, setCloneLimit); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneDynamic, setCloneDynamic); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneAvatarEntity, setCloneAvatarEntity); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(cloneOriginID, setCloneOriginID); - - withWriteLock([&] { - bool grabPropertiesChanged = _grabProperties.setProperties(properties); - somethingChanged |= grabPropertiesChanged; - }); - if (updateQueryAACube()) { somethingChanged = true; } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 2a7fe1ef77..17dc0cdaba 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -347,6 +347,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { EntityPropertyFlags changedProperties; // Core + CHECK_PROPERTY_CHANGE(PROP_SIMULATION_OWNER, simulationOwner); CHECK_PROPERTY_CHANGE(PROP_VISIBLE, visible); CHECK_PROPERTY_CHANGE(PROP_NAME, name); CHECK_PROPERTY_CHANGE(PROP_LOCKED, locked); @@ -382,7 +383,6 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_COLLISIONLESS, collisionless); CHECK_PROPERTY_CHANGE(PROP_COLLISION_MASK, collisionMask); CHECK_PROPERTY_CHANGE(PROP_DYNAMIC, dynamic); - CHECK_PROPERTY_CHANGE(PROP_SIMULATION_OWNER, simulationOwner); CHECK_PROPERTY_CHANGE(PROP_COLLISION_SOUND_URL, collisionSoundURL); CHECK_PROPERTY_CHANGE(PROP_ACTION_DATA, actionData); @@ -399,6 +399,26 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_SCRIPT_TIMESTAMP, scriptTimestamp); CHECK_PROPERTY_CHANGE(PROP_SERVER_SCRIPTS, serverScripts); + // Certifiable Properties + CHECK_PROPERTY_CHANGE(PROP_ITEM_NAME, itemName); + CHECK_PROPERTY_CHANGE(PROP_ITEM_DESCRIPTION, itemDescription); + CHECK_PROPERTY_CHANGE(PROP_ITEM_CATEGORIES, itemCategories); + CHECK_PROPERTY_CHANGE(PROP_ITEM_ARTIST, itemArtist); + CHECK_PROPERTY_CHANGE(PROP_ITEM_LICENSE, itemLicense); + CHECK_PROPERTY_CHANGE(PROP_LIMITED_RUN, limitedRun); + CHECK_PROPERTY_CHANGE(PROP_MARKETPLACE_ID, marketplaceID); + CHECK_PROPERTY_CHANGE(PROP_EDITION_NUMBER, editionNumber); + CHECK_PROPERTY_CHANGE(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber); + CHECK_PROPERTY_CHANGE(PROP_CERTIFICATE_ID, certificateID); + CHECK_PROPERTY_CHANGE(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion); + + // Location data for scripts + CHECK_PROPERTY_CHANGE(PROP_LOCAL_POSITION, localPosition); + CHECK_PROPERTY_CHANGE(PROP_LOCAL_ROTATION, localRotation); + CHECK_PROPERTY_CHANGE(PROP_LOCAL_VELOCITY, localVelocity); + CHECK_PROPERTY_CHANGE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity); + CHECK_PROPERTY_CHANGE(PROP_LOCAL_DIMENSIONS, localDimensions); + // Common CHECK_PROPERTY_CHANGE(PROP_SHAPE_TYPE, shapeType); CHECK_PROPERTY_CHANGE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); @@ -416,12 +436,12 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_EMIT_ORIENTATION, emitOrientation); CHECK_PROPERTY_CHANGE(PROP_EMIT_DIMENSIONS, emitDimensions); CHECK_PROPERTY_CHANGE(PROP_EMIT_RADIUS_START, emitRadiusStart); - CHECK_PROPERTY_CHANGE(PROP_EMIT_ACCELERATION, emitAcceleration); - CHECK_PROPERTY_CHANGE(PROP_ACCELERATION_SPREAD, accelerationSpread); CHECK_PROPERTY_CHANGE(PROP_POLAR_START, polarStart); CHECK_PROPERTY_CHANGE(PROP_POLAR_FINISH, polarFinish); CHECK_PROPERTY_CHANGE(PROP_AZIMUTH_START, azimuthStart); CHECK_PROPERTY_CHANGE(PROP_AZIMUTH_FINISH, azimuthFinish); + CHECK_PROPERTY_CHANGE(PROP_EMIT_ACCELERATION, emitAcceleration); + CHECK_PROPERTY_CHANGE(PROP_ACCELERATION_SPREAD, accelerationSpread); CHECK_PROPERTY_CHANGE(PROP_PARTICLE_RADIUS, particleRadius); CHECK_PROPERTY_CHANGE(PROP_RADIUS_SPREAD, radiusSpread); CHECK_PROPERTY_CHANGE(PROP_RADIUS_START, radiusStart); @@ -535,26 +555,6 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_MAJOR_GRID_EVERY, majorGridEvery); CHECK_PROPERTY_CHANGE(PROP_MINOR_GRID_EVERY, minorGridEvery); - // Certifiable Properties - CHECK_PROPERTY_CHANGE(PROP_ITEM_NAME, itemName); - CHECK_PROPERTY_CHANGE(PROP_ITEM_DESCRIPTION, itemDescription); - CHECK_PROPERTY_CHANGE(PROP_ITEM_CATEGORIES, itemCategories); - CHECK_PROPERTY_CHANGE(PROP_ITEM_ARTIST, itemArtist); - CHECK_PROPERTY_CHANGE(PROP_ITEM_LICENSE, itemLicense); - CHECK_PROPERTY_CHANGE(PROP_LIMITED_RUN, limitedRun); - CHECK_PROPERTY_CHANGE(PROP_MARKETPLACE_ID, marketplaceID); - CHECK_PROPERTY_CHANGE(PROP_EDITION_NUMBER, editionNumber); - CHECK_PROPERTY_CHANGE(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber); - CHECK_PROPERTY_CHANGE(PROP_CERTIFICATE_ID, certificateID); - CHECK_PROPERTY_CHANGE(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion); - - // Location data for scripts - CHECK_PROPERTY_CHANGE(PROP_LOCAL_POSITION, localPosition); - CHECK_PROPERTY_CHANGE(PROP_LOCAL_ROTATION, localRotation); - CHECK_PROPERTY_CHANGE(PROP_LOCAL_VELOCITY, localVelocity); - CHECK_PROPERTY_CHANGE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity); - CHECK_PROPERTY_CHANGE(PROP_LOCAL_DIMENSIONS, localDimensions); - return changedProperties; } @@ -1018,9 +1018,9 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * relative to the entity's orientation. Must be specified in order for the entity to render. * @property {number[]} strokeWidths=[] - The widths, in m, of the line at the linePoints. Must be specified in * order for the entity to render. - * @property {Vec3[]} strokeColors=[] - Currently not used. - * @property {Color} color=255,255,255 - The base color of the line, which is multiplied with the color of the texture for - * rendering. + * @property {Vec3[]} strokeColors=[] - The base colors of each point, which are multiplied with the color of the texture, going from 0-1. + * If strokeColors.length < the number of points, color is used for the remaining points. + * @property {Color} color=255,255,255 - Used as the color for each point if strokeColors is too short. * @property {string} textures="" - The URL of a JPG or PNG texture to use for the lines. If you want transparency, use PNG * format. * @property {boolean} isUVModeStretch=true - If true, the texture is stretched to fill the whole line, otherwise @@ -1365,6 +1365,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool } // Core properties + //COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SIMULATION_OWNER, simulationOwner); // not exposed yet COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE, visible); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NAME, name); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCKED, locked); @@ -1419,9 +1420,33 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SCRIPT_TIMESTAMP, scriptTimestamp); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SERVER_SCRIPTS, serverScripts); + // Certifiable Properties + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_NAME, itemName); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_DESCRIPTION, itemDescription); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_CATEGORIES, itemCategories); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_ARTIST, itemArtist); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_LICENSE, itemLicense); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LIMITED_RUN, limitedRun); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MARKETPLACE_ID, marketplaceID); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EDITION_NUMBER, editionNumber); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CERTIFICATE_ID, certificateID); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion); + + // Local props for scripts + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_POSITION, localPosition); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ROTATION, localRotation); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_VELOCITY, localVelocity); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_DIMENSIONS, localDimensions); + // Particles only if (_type == EntityTypes::ParticleEffect) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString()); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MAX_PARTICLES, maxParticles); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LIFESPAN, lifespan); @@ -1446,17 +1471,14 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RADIUS_START, radiusStart); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RADIUS_FINISH, radiusFinish); - COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR_SPREAD, colorSpread, u8vec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR_START, colorStart, vec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR_FINISH, colorFinish, vec3Color); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA_SPREAD, alphaSpread); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA_START, alphaStart); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA_FINISH, alphaFinish); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EMITTER_SHOULD_TRAIL, emitterShouldTrail); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARTICLE_SPIN, particleSpin); @@ -1468,11 +1490,12 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Models only if (_type == EntityTypes::Model) { - COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MODEL_URL, modelURL); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString()); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); + + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MODEL_URL, modelURL); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_ROTATIONS_SET, jointRotationsSet); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_ROTATIONS, jointRotations); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet); @@ -1492,15 +1515,15 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool } if (_type == EntityTypes::Box || _type == EntityTypes::Sphere || _type == EntityTypes::Shape) { - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SHAPE, shape); COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SHAPE, shape); } // Lights only if (_type == EntityTypes::Light) { - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_SPOTLIGHT, isSpotlight); COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_SPOTLIGHT, isSpotlight); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_INTENSITY, intensity); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EXPONENT, exponent); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CUTOFF, cutoff); @@ -1524,6 +1547,9 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Zones only if (_type == EntityTypes::Zone) { + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString()); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); + if (!psuedoPropertyFlagsButDesiredEmpty) { _keyLight.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); _ambientLight.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); @@ -1531,8 +1557,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool _haze.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); _bloom.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); } - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString()); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FLYING_ALLOWED, flyingAllowed); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_GHOSTING_ALLOWED, ghostingAllowed); @@ -1572,11 +1596,12 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Polylines if (_type == EntityTypes::PolyLine) { COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_POINTS, linePoints); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_WIDTHS, strokeWidths); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_NORMALS, normals); COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_STROKE_COLORS, strokeColors, qVectorVec3Color); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_GLOW, glow); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_FACE_CAMERA, faceCamera); @@ -1597,15 +1622,15 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Image only if (_type == EntityTypes::Image) { + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IMAGE_URL, imageURL); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EMISSIVE, emissive); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_KEEP_ASPECT_RATIO, keepAspectRatio); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_BILLBOARD_MODE, billboardMode, getBillboardModeAsString()); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SUB_IMAGE, subImage); - COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha); - // Handle conversions to old 'textures' property from "imageURL" if (((!psuedoPropertyFlagsButDesiredEmpty && _desiredProperties.isEmpty()) || _desiredProperties.getHasProperty(PROP_IMAGE_URL)) && (!skipDefaults || defaultEntityProperties._imageURL != _imageURL)) { @@ -1625,26 +1650,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MINOR_GRID_EVERY, minorGridEvery); } - // Certifiable Properties - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_NAME, itemName); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_DESCRIPTION, itemDescription); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_CATEGORIES, itemCategories); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_ARTIST, itemArtist); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_LICENSE, itemLicense); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LIMITED_RUN, limitedRun); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MARKETPLACE_ID, marketplaceID); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EDITION_NUMBER, editionNumber); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CERTIFICATE_ID, certificateID); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STATIC_CERTIFICATE_VERSION, staticCertificateVersion); - - // Local props for scripts - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_POSITION, localPosition); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ROTATION, localRotation); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_VELOCITY, localVelocity); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_ANGULAR_VELOCITY, localAngularVelocity); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCAL_DIMENSIONS, localDimensions); - /**jsdoc * The axis-aligned bounding box of an entity. * @typedef {object} Entities.BoundingBox @@ -1739,6 +1744,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool } // Core + // simluationOwner above COPY_PROPERTY_FROM_QSCRIPTVALUE(visible, bool, setVisible); COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName); COPY_PROPERTY_FROM_QSCRIPTVALUE(locked, bool, setLocked); @@ -1777,7 +1783,6 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(collidesWith, CollisionMask); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(collisionsWillMove, bool, setDynamic, getDynamic); // legacy support COPY_PROPERTY_FROM_QSCRIPTVALUE(dynamic, bool, setDynamic); - // simulationOwner is read only COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionSoundURL, QString, setCollisionSoundURL); COPY_PROPERTY_FROM_QSCRIPTVALUE(actionData, QByteArray, setActionData); // TODO: should scripts be able to set this? @@ -1794,6 +1799,26 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(scriptTimestamp, quint64, setScriptTimestamp); COPY_PROPERTY_FROM_QSCRIPTVALUE(serverScripts, QString, setServerScripts); + // Certifiable Properties + COPY_PROPERTY_FROM_QSCRIPTVALUE(itemName, QString, setItemName); + COPY_PROPERTY_FROM_QSCRIPTVALUE(itemDescription, QString, setItemDescription); + COPY_PROPERTY_FROM_QSCRIPTVALUE(itemCategories, QString, setItemCategories); + COPY_PROPERTY_FROM_QSCRIPTVALUE(itemArtist, QString, setItemArtist); + COPY_PROPERTY_FROM_QSCRIPTVALUE(itemLicense, QString, setItemLicense); + COPY_PROPERTY_FROM_QSCRIPTVALUE(limitedRun, quint32, setLimitedRun); + COPY_PROPERTY_FROM_QSCRIPTVALUE(marketplaceID, QString, setMarketplaceID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(editionNumber, quint32, setEditionNumber); + COPY_PROPERTY_FROM_QSCRIPTVALUE(entityInstanceNumber, quint32, setEntityInstanceNumber); + COPY_PROPERTY_FROM_QSCRIPTVALUE(certificateID, QString, setCertificateID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(staticCertificateVersion, quint32, setStaticCertificateVersion); + + // Script location data + COPY_PROPERTY_FROM_QSCRIPTVALUE(localPosition, vec3, setLocalPosition); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localRotation, quat, setLocalRotation); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localVelocity, vec3, setLocalVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localAngularVelocity, vec3, setLocalAngularVelocity); + COPY_PROPERTY_FROM_QSCRIPTVALUE(localDimensions, vec3, setLocalDimensions); + // Common COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(shapeType, ShapeType); COPY_PROPERTY_FROM_QSCRIPTVALUE(compoundShapeURL, QString, setCompoundShapeURL); @@ -1811,12 +1836,12 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(emitOrientation, quat, setEmitOrientation); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitDimensions, vec3, setEmitDimensions); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitRadiusStart, float, setEmitRadiusStart); - COPY_PROPERTY_FROM_QSCRIPTVALUE(emitAcceleration, vec3, setEmitAcceleration); - COPY_PROPERTY_FROM_QSCRIPTVALUE(accelerationSpread, vec3, setAccelerationSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(polarStart, float, setPolarStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(polarFinish, float, setPolarFinish); COPY_PROPERTY_FROM_QSCRIPTVALUE(azimuthStart, float, setAzimuthStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(azimuthFinish, float, setAzimuthFinish); + COPY_PROPERTY_FROM_QSCRIPTVALUE(emitAcceleration, vec3, setEmitAcceleration); + COPY_PROPERTY_FROM_QSCRIPTVALUE(accelerationSpread, vec3, setAccelerationSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(particleRadius, float, setParticleRadius); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusSpread, float, setRadiusSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusStart, float, setRadiusStart); @@ -1930,26 +1955,6 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(majorGridEvery, uint32_t, setMajorGridEvery); COPY_PROPERTY_FROM_QSCRIPTVALUE(minorGridEvery, float, setMinorGridEvery); - // Certifiable Properties - COPY_PROPERTY_FROM_QSCRIPTVALUE(itemName, QString, setItemName); - COPY_PROPERTY_FROM_QSCRIPTVALUE(itemDescription, QString, setItemDescription); - COPY_PROPERTY_FROM_QSCRIPTVALUE(itemCategories, QString, setItemCategories); - COPY_PROPERTY_FROM_QSCRIPTVALUE(itemArtist, QString, setItemArtist); - COPY_PROPERTY_FROM_QSCRIPTVALUE(itemLicense, QString, setItemLicense); - COPY_PROPERTY_FROM_QSCRIPTVALUE(limitedRun, quint32, setLimitedRun); - COPY_PROPERTY_FROM_QSCRIPTVALUE(marketplaceID, QString, setMarketplaceID); - COPY_PROPERTY_FROM_QSCRIPTVALUE(editionNumber, quint32, setEditionNumber); - COPY_PROPERTY_FROM_QSCRIPTVALUE(entityInstanceNumber, quint32, setEntityInstanceNumber); - COPY_PROPERTY_FROM_QSCRIPTVALUE(certificateID, QString, setCertificateID); - COPY_PROPERTY_FROM_QSCRIPTVALUE(staticCertificateVersion, quint32, setStaticCertificateVersion); - - // Script location data - COPY_PROPERTY_FROM_QSCRIPTVALUE(localPosition, vec3, setLocalPosition); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localRotation, quat, setLocalRotation); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localVelocity, vec3, setLocalVelocity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localAngularVelocity, vec3, setLocalAngularVelocity); - COPY_PROPERTY_FROM_QSCRIPTVALUE(localDimensions, vec3, setLocalDimensions); - // Handle conversions from old 'textures' property to "imageURL" { QScriptValue V = object.property("textures"); @@ -1996,6 +2001,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool void EntityItemProperties::merge(const EntityItemProperties& other) { // Core + COPY_PROPERTY_IF_CHANGED(simulationOwner); COPY_PROPERTY_IF_CHANGED(visible); COPY_PROPERTY_IF_CHANGED(name); COPY_PROPERTY_IF_CHANGED(locked); @@ -2031,7 +2037,6 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(collisionless); COPY_PROPERTY_IF_CHANGED(collisionMask); COPY_PROPERTY_IF_CHANGED(dynamic); - COPY_PROPERTY_IF_CHANGED(simulationOwner); COPY_PROPERTY_IF_CHANGED(collisionSoundURL); COPY_PROPERTY_IF_CHANGED(actionData); @@ -2048,6 +2053,26 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(scriptTimestamp); COPY_PROPERTY_IF_CHANGED(serverScripts); + // Certifiable Properties + COPY_PROPERTY_IF_CHANGED(itemName); + COPY_PROPERTY_IF_CHANGED(itemDescription); + COPY_PROPERTY_IF_CHANGED(itemCategories); + COPY_PROPERTY_IF_CHANGED(itemArtist); + COPY_PROPERTY_IF_CHANGED(itemLicense); + COPY_PROPERTY_IF_CHANGED(limitedRun); + COPY_PROPERTY_IF_CHANGED(marketplaceID); + COPY_PROPERTY_IF_CHANGED(editionNumber); + COPY_PROPERTY_IF_CHANGED(entityInstanceNumber); + COPY_PROPERTY_IF_CHANGED(certificateID); + COPY_PROPERTY_IF_CHANGED(staticCertificateVersion); + + // Local props for scripts + COPY_PROPERTY_IF_CHANGED(localPosition); + COPY_PROPERTY_IF_CHANGED(localRotation); + COPY_PROPERTY_IF_CHANGED(localVelocity); + COPY_PROPERTY_IF_CHANGED(localAngularVelocity); + COPY_PROPERTY_IF_CHANGED(localDimensions); + // Common COPY_PROPERTY_IF_CHANGED(shapeType); COPY_PROPERTY_IF_CHANGED(compoundShapeURL); @@ -2065,12 +2090,12 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(emitOrientation); COPY_PROPERTY_IF_CHANGED(emitDimensions); COPY_PROPERTY_IF_CHANGED(emitRadiusStart); - COPY_PROPERTY_IF_CHANGED(emitAcceleration); - COPY_PROPERTY_IF_CHANGED(accelerationSpread); COPY_PROPERTY_IF_CHANGED(polarStart); COPY_PROPERTY_IF_CHANGED(polarFinish); COPY_PROPERTY_IF_CHANGED(azimuthStart); COPY_PROPERTY_IF_CHANGED(azimuthFinish); + COPY_PROPERTY_IF_CHANGED(emitAcceleration); + COPY_PROPERTY_IF_CHANGED(accelerationSpread); COPY_PROPERTY_IF_CHANGED(particleRadius); COPY_PROPERTY_IF_CHANGED(radiusSpread); COPY_PROPERTY_IF_CHANGED(radiusStart); @@ -2184,26 +2209,6 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(majorGridEvery); COPY_PROPERTY_IF_CHANGED(minorGridEvery); - // Certifiable Properties - COPY_PROPERTY_IF_CHANGED(itemName); - COPY_PROPERTY_IF_CHANGED(itemDescription); - COPY_PROPERTY_IF_CHANGED(itemCategories); - COPY_PROPERTY_IF_CHANGED(itemArtist); - COPY_PROPERTY_IF_CHANGED(itemLicense); - COPY_PROPERTY_IF_CHANGED(limitedRun); - COPY_PROPERTY_IF_CHANGED(marketplaceID); - COPY_PROPERTY_IF_CHANGED(editionNumber); - COPY_PROPERTY_IF_CHANGED(entityInstanceNumber); - COPY_PROPERTY_IF_CHANGED(certificateID); - COPY_PROPERTY_IF_CHANGED(staticCertificateVersion); - - // Local props for scripts - COPY_PROPERTY_IF_CHANGED(localPosition); - COPY_PROPERTY_IF_CHANGED(localRotation); - COPY_PROPERTY_IF_CHANGED(localVelocity); - COPY_PROPERTY_IF_CHANGED(localAngularVelocity); - COPY_PROPERTY_IF_CHANGED(localDimensions); - _lastEdited = usecTimestampNow(); } @@ -2241,6 +2246,7 @@ QScriptValue EntityItemProperties::entityPropertyFlagsToScriptValue(QScriptEngin } static QHash _propertyStringsToEnums; +static QHash _enumsToPropertyStrings; void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue& object, EntityPropertyFlags& flags) { @@ -2248,6 +2254,7 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue std::call_once(initMap, []() { // Core + ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner); ADD_PROPERTY_TO_MAP(PROP_VISIBLE, Visible, visible, bool); ADD_PROPERTY_TO_MAP(PROP_NAME, Name, name, QString); ADD_PROPERTY_TO_MAP(PROP_LOCKED, Locked, locked, bool); @@ -2306,7 +2313,6 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_COLLISION_MASK, unused, collidesWith, unused); ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, unused, collisionsWillMove, unused); // legacy support ADD_PROPERTY_TO_MAP(PROP_DYNAMIC, unused, dynamic, unused); - ADD_PROPERTY_TO_MAP(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner); ADD_PROPERTY_TO_MAP(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString); ADD_PROPERTY_TO_MAP(PROP_ACTION_DATA, ActionData, actionData, QByteArray); @@ -2323,6 +2329,26 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64); ADD_PROPERTY_TO_MAP(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString); + // Certifiable Properties + ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString); + ADD_PROPERTY_TO_MAP(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32); + ADD_PROPERTY_TO_MAP(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString); + ADD_PROPERTY_TO_MAP(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32); + ADD_PROPERTY_TO_MAP(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32); + ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString); + ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32); + + // Local script props + ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, LocalPosition, localPosition, vec3); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, vec3); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, vec3); + ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, vec3); + // Common ADD_PROPERTY_TO_MAP(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType); ADD_PROPERTY_TO_MAP(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString); @@ -2340,12 +2366,12 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, quat); ADD_PROPERTY_TO_MAP(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, vec3); ADD_PROPERTY_TO_MAP(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float); - ADD_PROPERTY_TO_MAP(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, vec3); - ADD_PROPERTY_TO_MAP(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, vec3); ADD_PROPERTY_TO_MAP(PROP_POLAR_START, EmitPolarStart, polarStart, float); ADD_PROPERTY_TO_MAP(PROP_POLAR_FINISH, EmitPolarFinish, polarFinish, float); ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_START, EmitAzimuthStart, azimuthStart, float); ADD_PROPERTY_TO_MAP(PROP_AZIMUTH_FINISH, EmitAzimuthFinish, azimuthFinish, float); + ADD_PROPERTY_TO_MAP(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, vec3); + ADD_PROPERTY_TO_MAP(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, vec3); ADD_PROPERTY_TO_MAP(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float); ADD_PROPERTY_TO_MAP(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float); ADD_PROPERTY_TO_MAP(PROP_RADIUS_START, RadiusStart, radiusStart, float); @@ -2499,39 +2525,19 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_GRID_FOLLOW_CAMERA, FollowCamera, followCamera, bool); ADD_PROPERTY_TO_MAP(PROP_MAJOR_GRID_EVERY, MajorGridEvery, majorGridEvery, uint32_t); ADD_PROPERTY_TO_MAP(PROP_MINOR_GRID_EVERY, MinorGridEvery, minorGridEvery, float); - - // Certifiable Properties - ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString); - ADD_PROPERTY_TO_MAP(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString); - ADD_PROPERTY_TO_MAP(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString); - ADD_PROPERTY_TO_MAP(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString); - ADD_PROPERTY_TO_MAP(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString); - ADD_PROPERTY_TO_MAP(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32); - ADD_PROPERTY_TO_MAP(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString); - ADD_PROPERTY_TO_MAP(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32); - ADD_PROPERTY_TO_MAP(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32); - ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString); - ADD_PROPERTY_TO_MAP(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32); - - // Local script props - ADD_PROPERTY_TO_MAP(PROP_LOCAL_POSITION, LocalPosition, localPosition, vec3); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, vec3); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, vec3); - ADD_PROPERTY_TO_MAP(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, vec3); }); if (object.isString()) { auto enumIter = _propertyStringsToEnums.find(object.toString()); if (enumIter != _propertyStringsToEnums.end()) { - flags << enumIter.value; + flags << enumIter.value(); } } else if (object.isArray()) { quint32 length = object.property("length").toInt32(); for (quint32 i = 0; i < length; i++) { auto enumIter = _propertyStringsToEnums.find(object.property(i).toString()); if (enumIter != _propertyStringsToEnums.end()) { - flags << enumIter.value; + flags << enumIter.value(); } } } @@ -2638,6 +2644,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy // PROP_CUSTOM_PROPERTIES_INCLUDED, + APPEND_ENTITY_PROPERTY(PROP_SIMULATION_OWNER, properties._simulationOwner.toByteArray()); APPEND_ENTITY_PROPERTY(PROP_VISIBLE, properties.getVisible()); APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName()); APPEND_ENTITY_PROPERTY(PROP_LOCKED, properties.getLocked()); @@ -2676,7 +2683,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_COLLISIONLESS, properties.getCollisionless()); APPEND_ENTITY_PROPERTY(PROP_COLLISION_MASK, properties.getCollisionMask()); APPEND_ENTITY_PROPERTY(PROP_DYNAMIC, properties.getDynamic()); - APPEND_ENTITY_PROPERTY(PROP_SIMULATION_OWNER, properties._simulationOwner.toByteArray()); APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, properties.getCollisionSoundURL()); APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, properties.getActionData()); @@ -2693,8 +2699,25 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_SCRIPT_TIMESTAMP, properties.getScriptTimestamp()); APPEND_ENTITY_PROPERTY(PROP_SERVER_SCRIPTS, properties.getServerScripts()); + // Certifiable Properties + APPEND_ENTITY_PROPERTY(PROP_ITEM_NAME, properties.getItemName()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, properties.getItemDescription()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_CATEGORIES, properties.getItemCategories()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_ARTIST, properties.getItemArtist()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_LICENSE, properties.getItemLicense()); + APPEND_ENTITY_PROPERTY(PROP_LIMITED_RUN, properties.getLimitedRun()); + APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, properties.getMarketplaceID()); + APPEND_ENTITY_PROPERTY(PROP_EDITION_NUMBER, properties.getEditionNumber()); + APPEND_ENTITY_PROPERTY(PROP_ENTITY_INSTANCE_NUMBER, properties.getEntityInstanceNumber()); + APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, properties.getCertificateID()); + APPEND_ENTITY_PROPERTY(PROP_STATIC_CERTIFICATE_VERSION, properties.getStaticCertificateVersion()); + if (properties.getType() == EntityTypes::ParticleEffect) { APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); + APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha()); + APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); + APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, properties.getMaxParticles()); APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, properties.getLifespan()); @@ -2719,17 +2742,14 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_RADIUS_START, properties.getRadiusStart()); APPEND_ENTITY_PROPERTY(PROP_RADIUS_FINISH, properties.getRadiusFinish()); - APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); APPEND_ENTITY_PROPERTY(PROP_COLOR_SPREAD, properties.getColorSpread()); APPEND_ENTITY_PROPERTY(PROP_COLOR_START, properties.getColorStart()); APPEND_ENTITY_PROPERTY(PROP_COLOR_FINISH, properties.getColorFinish()); - APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha()); APPEND_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, properties.getAlphaSpread()); APPEND_ENTITY_PROPERTY(PROP_ALPHA_START, properties.getAlphaStart()); APPEND_ENTITY_PROPERTY(PROP_ALPHA_FINISH, properties.getAlphaFinish()); - APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, properties.getEmitterShouldTrail()); APPEND_ENTITY_PROPERTY(PROP_PARTICLE_SPIN, properties.getParticleSpin()); @@ -2739,9 +2759,26 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_PARTICLE_ROTATE_WITH_ENTITY, properties.getRotateWithEntity()) } - if (properties.getType() == EntityTypes::Light) { - APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, properties.getIsSpotlight()); + if (properties.getType() == EntityTypes::Model) { + APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); + APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); + APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); + + APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, properties.getModelURL()); + APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, properties.getJointRotationsSet()); + APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, properties.getJointRotations()); + APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, properties.getJointTranslationsSet()); + APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, properties.getJointTranslations()); + APPEND_ENTITY_PROPERTY(PROP_RELAY_PARENT_JOINTS, properties.getRelayParentJoints()); + + _staticAnimation.setProperties(properties); + _staticAnimation.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); + } + + if (properties.getType() == EntityTypes::Light) { + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); + APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, properties.getIsSpotlight()); APPEND_ENTITY_PROPERTY(PROP_INTENSITY, properties.getIntensity()); APPEND_ENTITY_PROPERTY(PROP_EXPONENT, properties.getExponent()); APPEND_ENTITY_PROPERTY(PROP_CUTOFF, properties.getCutoff()); @@ -2762,24 +2799,10 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_BOTTOM_MARGIN, properties.getBottomMargin()); } - if (properties.getType() == EntityTypes::Model) { - APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); - APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, properties.getModelURL()); - APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); - APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); - APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); - - APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, properties.getJointRotationsSet()); - APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, properties.getJointRotations()); - APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, properties.getJointTranslationsSet()); - APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, properties.getJointTranslations()); - APPEND_ENTITY_PROPERTY(PROP_RELAY_PARENT_JOINTS, properties.getRelayParentJoints()); - - _staticAnimation.setProperties(properties); - _staticAnimation.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); - } - if (properties.getType() == EntityTypes::Zone) { + APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)properties.getShapeType()); + APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); + _staticKeyLight.setProperties(properties); _staticKeyLight.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); @@ -2795,9 +2818,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy _staticBloom.setProperties(properties); _staticBloom.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); - APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)properties.getShapeType()); - APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); - APPEND_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, properties.getFlyingAllowed()); APPEND_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, properties.getGhostingAllowed()); APPEND_ENTITY_PROPERTY(PROP_FILTER_URL, properties.getFilterURL()); @@ -2831,11 +2851,12 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy if (properties.getType() == EntityTypes::PolyLine) { APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); + APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); + APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, properties.getStrokeWidths()); APPEND_ENTITY_PROPERTY(PROP_STROKE_NORMALS, properties.getPackedNormals()); APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, properties.getPackedStrokeColors()); - APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, properties.getIsUVModeStretch()); APPEND_ENTITY_PROPERTY(PROP_LINE_GLOW, properties.getGlow()); APPEND_ENTITY_PROPERTY(PROP_LINE_FACE_CAMERA, properties.getFaceCamera()); @@ -2846,9 +2867,9 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy if (properties.getType() == EntityTypes::Shape || properties.getType() == EntityTypes::Box || properties.getType() == EntityTypes::Sphere) { - APPEND_ENTITY_PROPERTY(PROP_SHAPE, properties.getShape()); APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha()); + APPEND_ENTITY_PROPERTY(PROP_SHAPE, properties.getShape()); } // Materials @@ -2866,14 +2887,14 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy // Image if (properties.getType() == EntityTypes::Image) { + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); + APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha()); + APPEND_ENTITY_PROPERTY(PROP_IMAGE_URL, properties.getImageURL()); APPEND_ENTITY_PROPERTY(PROP_EMISSIVE, properties.getEmissive()); APPEND_ENTITY_PROPERTY(PROP_KEEP_ASPECT_RATIO, properties.getKeepAspectRatio()); APPEND_ENTITY_PROPERTY(PROP_BILLBOARD_MODE, (uint32_t)properties.getBillboardMode()); APPEND_ENTITY_PROPERTY(PROP_SUB_IMAGE, properties.getSubImage()); - - APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); - APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha()); } // Grid @@ -2885,19 +2906,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_MAJOR_GRID_EVERY, properties.getMajorGridEvery()); APPEND_ENTITY_PROPERTY(PROP_MINOR_GRID_EVERY, properties.getMinorGridEvery()); } - - // Certifiable Properties - APPEND_ENTITY_PROPERTY(PROP_ITEM_NAME, properties.getItemName()); - APPEND_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, properties.getItemDescription()); - APPEND_ENTITY_PROPERTY(PROP_ITEM_CATEGORIES, properties.getItemCategories()); - APPEND_ENTITY_PROPERTY(PROP_ITEM_ARTIST, properties.getItemArtist()); - APPEND_ENTITY_PROPERTY(PROP_ITEM_LICENSE, properties.getItemLicense()); - APPEND_ENTITY_PROPERTY(PROP_LIMITED_RUN, properties.getLimitedRun()); - APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, properties.getMarketplaceID()); - APPEND_ENTITY_PROPERTY(PROP_EDITION_NUMBER, properties.getEditionNumber()); - APPEND_ENTITY_PROPERTY(PROP_ENTITY_INSTANCE_NUMBER, properties.getEntityInstanceNumber()); - APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, properties.getCertificateID()); - APPEND_ENTITY_PROPERTY(PROP_STATIC_CERTIFICATE_VERSION, properties.getStaticCertificateVersion()); } if (propertyCount > 0) { @@ -3076,6 +3084,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int dataAt += propertyFlags.getEncodedLength(); processedBytes += propertyFlags.getEncodedLength(); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SIMULATION_OWNER, QByteArray, setSimulationOwner); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VISIBLE, bool, setVisible); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LOCKED, bool, setLocked); @@ -3112,7 +3121,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISIONLESS, bool, setCollisionless); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_MASK, uint16_t, setCollisionMask); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DYNAMIC, bool, setDynamic); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SIMULATION_OWNER, QByteArray, setSimulationOwner); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACTION_DATA, QByteArray, setActionData); @@ -3129,8 +3137,25 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCRIPT_TIMESTAMP, quint64, setScriptTimestamp); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SERVER_SCRIPTS, QString, setServerScripts); + // Certifiable Properties + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_NAME, QString, setItemName); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_DESCRIPTION, QString, setItemDescription); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_CATEGORIES, QString, setItemCategories); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_ARTIST, QString, setItemArtist); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_LICENSE, QString, setItemLicense); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIMITED_RUN, quint32, setLimitedRun); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MARKETPLACE_ID, QString, setMarketplaceID); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EDITION_NUMBER, quint32, setEditionNumber); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ENTITY_INSTANCE_NUMBER, quint32, setEntityInstanceNumber); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CERTIFICATE_ID, QString, setCertificateID); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STATIC_CERTIFICATE_VERSION, quint32, setStaticCertificateVersion); + if (properties.getType() == EntityTypes::ParticleEffect) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MAX_PARTICLES, quint32, setMaxParticles); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFESPAN, float, setLifespan); @@ -3155,17 +3180,14 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_START, float, setRadiusStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RADIUS_FINISH, float, setRadiusFinish); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_SPREAD, u8vec3Color, setColorSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_START, vec3Color, setColorStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR_FINISH, vec3Color, setColorFinish); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_SPREAD, float, setAlphaSpread); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_START, float, setAlphaStart); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA_FINISH, float, setAlphaFinish); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMITTER_SHOULD_TRAIL, bool, setEmitterShouldTrail); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARTICLE_SPIN, float, setParticleSpin); @@ -3176,12 +3198,12 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::Model) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MODEL_URL, QString, setModelURL); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MODEL_URL, QString, setModelURL); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS_SET, QVector, setJointRotationsSet); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS, QVector, setJointRotations); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS_SET, QVector, setJointTranslationsSet); @@ -3192,8 +3214,9 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::Light) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); + + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EXPONENT, float, setExponent); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CUTOFF, float, setCutoff); @@ -3215,15 +3238,15 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::Zone) { + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); + properties.getKeyLight().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); properties.getAmbientLight().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); properties.getSkybox().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); properties.getHaze().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); properties.getBloom().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FLYING_ALLOWED, bool, setFlyingAllowed); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_GHOSTING_ALLOWED, bool, setGhostingAllowed); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FILTER_URL, QString, setFilterURL); @@ -3257,11 +3280,12 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::PolyLine) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_NORMALS, QByteArray, setPackedNormals); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_COLORS, QByteArray, setPackedStrokeColors); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_UV_MODE_STRETCH, bool, setIsUVModeStretch); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_GLOW, bool, setGlow); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_FACE_CAMERA, bool, setFaceCamera); @@ -3272,9 +3296,9 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Shape || properties.getType() == EntityTypes::Box || properties.getType() == EntityTypes::Sphere) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE, QString, setShape); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE, QString, setShape); } // Materials @@ -3292,14 +3316,14 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int // Image if (properties.getType() == EntityTypes::Image) { + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IMAGE_URL, QString, setImageURL); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMISSIVE, bool, setEmissive); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_KEEP_ASPECT_RATIO, bool, setKeepAspectRatio); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BILLBOARD_MODE, BillboardMode, setBillboardMode); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SUB_IMAGE, QRect, setSubImage); - - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha); } // Grid @@ -3312,19 +3336,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MINOR_GRID_EVERY, float, setMinorGridEvery); } - // Certifiable Properties - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_NAME, QString, setItemName); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_DESCRIPTION, QString, setItemDescription); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_CATEGORIES, QString, setItemCategories); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_ARTIST, QString, setItemArtist); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_LICENSE, QString, setItemLicense); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIMITED_RUN, quint32, setLimitedRun); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MARKETPLACE_ID, QString, setMarketplaceID); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EDITION_NUMBER, quint32, setEditionNumber); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ENTITY_INSTANCE_NUMBER, quint32, setEntityInstanceNumber); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CERTIFICATE_ID, QString, setCertificateID); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STATIC_CERTIFICATE_VERSION, quint32, setStaticCertificateVersion); - return valid; } @@ -3450,6 +3461,7 @@ bool EntityItemProperties::decodeCloneEntityMessage(const QByteArray& buffer, in void EntityItemProperties::markAllChanged() { // Core + _simulationOwnerChanged = true; _visibleChanged = true; _nameChanged = true; _lockedChanged = true; @@ -3485,7 +3497,6 @@ void EntityItemProperties::markAllChanged() { _collisionlessChanged = true; _collisionMaskChanged = true; _dynamicChanged = true; - _simulationOwnerChanged = true; _collisionSoundURLChanged = true; _actionDataChanged = true; @@ -3502,6 +3513,19 @@ void EntityItemProperties::markAllChanged() { _scriptTimestampChanged = true; _serverScriptsChanged = true; + // Certifiable Properties + _itemNameChanged = true; + _itemDescriptionChanged = true; + _itemCategoriesChanged = true; + _itemArtistChanged = true; + _itemLicenseChanged = true; + _limitedRunChanged = true; + _marketplaceIDChanged = true; + _editionNumberChanged = true; + _entityInstanceNumberChanged = true; + _certificateIDChanged = true; + _staticCertificateVersionChanged = true; + // Common _shapeTypeChanged = true; _colorChanged = true; @@ -3519,12 +3543,12 @@ void EntityItemProperties::markAllChanged() { _emitOrientationChanged = true; _emitDimensionsChanged = true; _emitRadiusStartChanged = true; - _emitAccelerationChanged = true; - _accelerationSpreadChanged = true; _polarStartChanged = true; _polarFinishChanged = true; _azimuthStartChanged = true; _azimuthFinishChanged = true; + _emitAccelerationChanged = true; + _accelerationSpreadChanged = true; _particleRadiusChanged = true; _radiusSpreadChanged = true; _radiusStartChanged = true; @@ -3637,19 +3661,6 @@ void EntityItemProperties::markAllChanged() { _followCameraChanged = true; _majorGridEveryChanged = true; _minorGridEveryChanged = true; - - // Certifiable Properties - _itemNameChanged = true; - _itemDescriptionChanged = true; - _itemCategoriesChanged = true; - _itemArtistChanged = true; - _itemLicenseChanged = true; - _limitedRunChanged = true; - _marketplaceIDChanged = true; - _editionNumberChanged = true; - _entityInstanceNumberChanged = true; - _certificateIDChanged = true; - _staticCertificateVersionChanged = true; } // The minimum bounding box for the entity. @@ -3769,6 +3780,9 @@ QList EntityItemProperties::listChangedProperties() { QList out; // Core + if (simulationOwnerChanged()) { + out += "simulationOwner"; + } if (visibleChanged()) { out += "visible"; } @@ -3869,9 +3883,6 @@ QList EntityItemProperties::listChangedProperties() { if (dynamicChanged()) { out += "dynamic"; } - if (simulationOwnerChanged()) { - out += "simulationOwner"; - } if (collisionSoundURLChanged()) { out += "collisionSoundURL"; } @@ -3910,6 +3921,41 @@ QList EntityItemProperties::listChangedProperties() { out += "serverScripts"; } + // Certifiable Properties + if (itemNameChanged()) { + out += "itemName"; + } + if (itemDescriptionChanged()) { + out += "itemDescription"; + } + if (itemCategoriesChanged()) { + out += "itemCategories"; + } + if (itemArtistChanged()) { + out += "itemArtist"; + } + if (itemLicenseChanged()) { + out += "itemLicense"; + } + if (limitedRunChanged()) { + out += "limitedRun"; + } + if (marketplaceIDChanged()) { + out += "marketplaceID"; + } + if (editionNumberChanged()) { + out += "editionNumber"; + } + if (entityInstanceNumberChanged()) { + out += "entityInstanceNumber"; + } + if (certificateIDChanged()) { + out += "certificateID"; + } + if (staticCertificateVersionChanged()) { + out += "staticCertificateVersion"; + } + // Common if (shapeTypeChanged()) { out += "shapeType"; @@ -3955,12 +4001,6 @@ QList EntityItemProperties::listChangedProperties() { if (emitRadiusStartChanged()) { out += "emitRadiusStart"; } - if (emitAccelerationChanged()) { - out += "emitAcceleration"; - } - if (accelerationSpreadChanged()) { - out += "accelerationSpread"; - } if (polarStartChanged()) { out += "polarStart"; } @@ -3973,6 +4013,12 @@ QList EntityItemProperties::listChangedProperties() { if (azimuthFinishChanged()) { out += "azimuthFinish"; } + if (emitAccelerationChanged()) { + out += "emitAcceleration"; + } + if (accelerationSpreadChanged()) { + out += "accelerationSpread"; + } if (particleRadiusChanged()) { out += "particleRadius"; } @@ -4254,41 +4300,6 @@ QList EntityItemProperties::listChangedProperties() { out += "minorGridEvery"; } - // Certifiable Properties - if (itemNameChanged()) { - out += "itemName"; - } - if (itemDescriptionChanged()) { - out += "itemDescription"; - } - if (itemCategoriesChanged()) { - out += "itemCategories"; - } - if (itemArtistChanged()) { - out += "itemArtist"; - } - if (itemLicenseChanged()) { - out += "itemLicense"; - } - if (limitedRunChanged()) { - out += "limitedRun"; - } - if (marketplaceIDChanged()) { - out += "marketplaceID"; - } - if (editionNumberChanged()) { - out += "editionNumber"; - } - if (entityInstanceNumberChanged()) { - out += "entityInstanceNumber"; - } - if (certificateIDChanged()) { - out += "certificateID"; - } - if (staticCertificateVersionChanged()) { - out += "staticCertificateVersion"; - } - return out; } @@ -4478,4 +4489,19 @@ void EntityItemProperties::convertToCloneProperties(const EntityItemID& entityID setCloneLimit(ENTITY_ITEM_DEFAULT_CLONE_LIMIT); setCloneDynamic(ENTITY_ITEM_DEFAULT_CLONE_DYNAMIC); setCloneAvatarEntity(ENTITY_ITEM_DEFAULT_CLONE_AVATAR_ENTITY); -} \ No newline at end of file +} + +QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f) { + QString result = "[ "; + + for (int i = 0; i < PROP_AFTER_LAST_ITEM; i++) { + auto prop = EntityPropertyList(i); + if (f.getHasProperty(prop)) { + result = result + _enumsToPropertyStrings[prop] + " "; + } + } + + result += "]"; + dbg.nospace() << result; + return dbg; +} diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 7cc2429e17..9857878edf 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -127,6 +127,7 @@ public: // bool _fooChanged { false }; // Core Properties + DEFINE_PROPERTY_REF(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner, SimulationOwner()); DEFINE_PROPERTY(PROP_VISIBLE, Visible, visible, bool, ENTITY_ITEM_DEFAULT_VISIBLE); DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString, ENTITY_ITEM_DEFAULT_NAME); DEFINE_PROPERTY(PROP_LOCKED, Locked, locked, bool, ENTITY_ITEM_DEFAULT_LOCKED); @@ -162,7 +163,6 @@ public: DEFINE_PROPERTY(PROP_COLLISIONLESS, Collisionless, collisionless, bool, ENTITY_ITEM_DEFAULT_COLLISIONLESS); DEFINE_PROPERTY(PROP_COLLISION_MASK, CollisionMask, collisionMask, uint16_t, ENTITY_COLLISION_MASK_DEFAULT); DEFINE_PROPERTY(PROP_DYNAMIC, Dynamic, dynamic, bool, ENTITY_ITEM_DEFAULT_DYNAMIC); - DEFINE_PROPERTY_REF(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner, SimulationOwner()); DEFINE_PROPERTY_REF(PROP_COLLISION_SOUND_URL, CollisionSoundURL, collisionSoundURL, QString, ENTITY_ITEM_DEFAULT_COLLISION_SOUND_URL); DEFINE_PROPERTY_REF(PROP_ACTION_DATA, ActionData, actionData, QByteArray, QByteArray()); @@ -179,6 +179,26 @@ public: DEFINE_PROPERTY(PROP_SCRIPT_TIMESTAMP, ScriptTimestamp, scriptTimestamp, quint64, ENTITY_ITEM_DEFAULT_SCRIPT_TIMESTAMP); DEFINE_PROPERTY_REF(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString, ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS); + // Certifiable Properties - related to Proof of Purchase certificates + DEFINE_PROPERTY_REF(PROP_ITEM_NAME, ItemName, itemName, QString, ENTITY_ITEM_DEFAULT_ITEM_NAME); + DEFINE_PROPERTY_REF(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString, ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION); + DEFINE_PROPERTY_REF(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString, ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES); + DEFINE_PROPERTY_REF(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString, ENTITY_ITEM_DEFAULT_ITEM_ARTIST); + DEFINE_PROPERTY_REF(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString, ENTITY_ITEM_DEFAULT_ITEM_LICENSE); + DEFINE_PROPERTY_REF(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32, ENTITY_ITEM_DEFAULT_LIMITED_RUN); + DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID); + DEFINE_PROPERTY_REF(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32, ENTITY_ITEM_DEFAULT_EDITION_NUMBER); + DEFINE_PROPERTY_REF(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32, ENTITY_ITEM_DEFAULT_ENTITY_INSTANCE_NUMBER); + DEFINE_PROPERTY_REF(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString, ENTITY_ITEM_DEFAULT_CERTIFICATE_ID); + DEFINE_PROPERTY_REF(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32, ENTITY_ITEM_DEFAULT_STATIC_CERTIFICATE_VERSION); + + // these are used when bouncing location data into and out of scripts + DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, glm::vec3, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat, ENTITY_ITEM_DEFAULT_ROTATION); + DEFINE_PROPERTY_REF(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3); + DEFINE_PROPERTY_REF(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, glm::vec3, ENTITY_ITEM_ZERO_VEC3); + // Common DEFINE_PROPERTY_REF_ENUM(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType, SHAPE_TYPE_NONE); DEFINE_PROPERTY_REF(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString, ""); @@ -196,12 +216,12 @@ public: DEFINE_PROPERTY_REF(PROP_EMIT_ORIENTATION, EmitOrientation, emitOrientation, glm::quat, particle::DEFAULT_EMIT_ORIENTATION); DEFINE_PROPERTY_REF(PROP_EMIT_DIMENSIONS, EmitDimensions, emitDimensions, glm::vec3, particle::DEFAULT_EMIT_DIMENSIONS); DEFINE_PROPERTY(PROP_EMIT_RADIUS_START, EmitRadiusStart, emitRadiusStart, float, particle::DEFAULT_EMIT_RADIUS_START); - DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3, particle::DEFAULT_EMIT_ACCELERATION); - DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3, particle::DEFAULT_ACCELERATION_SPREAD); DEFINE_PROPERTY(PROP_POLAR_START, PolarStart, polarStart, float, particle::DEFAULT_POLAR_START); DEFINE_PROPERTY(PROP_POLAR_FINISH, PolarFinish, polarFinish, float, particle::DEFAULT_POLAR_FINISH); DEFINE_PROPERTY(PROP_AZIMUTH_START, AzimuthStart, azimuthStart, float, particle::DEFAULT_AZIMUTH_START); DEFINE_PROPERTY(PROP_AZIMUTH_FINISH, AzimuthFinish, azimuthFinish, float, particle::DEFAULT_AZIMUTH_FINISH); + DEFINE_PROPERTY_REF(PROP_EMIT_ACCELERATION, EmitAcceleration, emitAcceleration, glm::vec3, particle::DEFAULT_EMIT_ACCELERATION); + DEFINE_PROPERTY_REF(PROP_ACCELERATION_SPREAD, AccelerationSpread, accelerationSpread, glm::vec3, particle::DEFAULT_ACCELERATION_SPREAD); DEFINE_PROPERTY(PROP_PARTICLE_RADIUS, ParticleRadius, particleRadius, float, particle::DEFAULT_PARTICLE_RADIUS); DEFINE_PROPERTY(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float, particle::DEFAULT_RADIUS_SPREAD); DEFINE_PROPERTY(PROP_RADIUS_START, RadiusStart, radiusStart, float, particle::DEFAULT_RADIUS_START); @@ -315,26 +335,6 @@ public: DEFINE_PROPERTY(PROP_MAJOR_GRID_EVERY, MajorGridEvery, majorGridEvery, uint32_t, GridEntityItem::DEFAULT_MAJOR_GRID_EVERY); DEFINE_PROPERTY(PROP_MINOR_GRID_EVERY, MinorGridEvery, minorGridEvery, float, GridEntityItem::DEFAULT_MINOR_GRID_EVERY); - // Certifiable Properties - related to Proof of Purchase certificates - DEFINE_PROPERTY_REF(PROP_ITEM_NAME, ItemName, itemName, QString, ENTITY_ITEM_DEFAULT_ITEM_NAME); - DEFINE_PROPERTY_REF(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString, ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION); - DEFINE_PROPERTY_REF(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString, ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES); - DEFINE_PROPERTY_REF(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString, ENTITY_ITEM_DEFAULT_ITEM_ARTIST); - DEFINE_PROPERTY_REF(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString, ENTITY_ITEM_DEFAULT_ITEM_LICENSE); - DEFINE_PROPERTY_REF(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32, ENTITY_ITEM_DEFAULT_LIMITED_RUN); - DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID); - DEFINE_PROPERTY_REF(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32, ENTITY_ITEM_DEFAULT_EDITION_NUMBER); - DEFINE_PROPERTY_REF(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32, ENTITY_ITEM_DEFAULT_ENTITY_INSTANCE_NUMBER); - DEFINE_PROPERTY_REF(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString, ENTITY_ITEM_DEFAULT_CERTIFICATE_ID); - DEFINE_PROPERTY_REF(PROP_STATIC_CERTIFICATE_VERSION, StaticCertificateVersion, staticCertificateVersion, quint32, ENTITY_ITEM_DEFAULT_STATIC_CERTIFICATE_VERSION); - - // these are used when bouncing location data into and out of scripts - DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, glm::vec3, ENTITY_ITEM_ZERO_VEC3); - DEFINE_PROPERTY_REF(PROP_LOCAL_ROTATION, LocalRotation, localRotation, quat, ENTITY_ITEM_DEFAULT_ROTATION); - DEFINE_PROPERTY_REF(PROP_LOCAL_VELOCITY, LocalVelocity, localVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3); - DEFINE_PROPERTY_REF(PROP_LOCAL_ANGULAR_VELOCITY, LocalAngularVelocity, localAngularVelocity, glm::vec3, ENTITY_ITEM_ZERO_VEC3); - DEFINE_PROPERTY_REF(PROP_LOCAL_DIMENSIONS, LocalDimensions, localDimensions, glm::vec3, ENTITY_ITEM_ZERO_VEC3); - static QString getComponentModeAsString(uint32_t mode); std::array::const_iterator findComponent(const QString& mode); @@ -479,6 +479,8 @@ void EntityPropertyFlagsFromScriptValue(const QScriptValue& object, EntityProper inline void EntityItemProperties::setPosition(const glm::vec3& value) { _position = glm::clamp(value, (float)-HALF_TREE_SCALE, (float)HALF_TREE_SCALE); _positionChanged = true; } +QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f); + inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { debug << "EntityItemProperties[" << "\n"; diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index c963c66187..76723526db 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -411,10 +411,12 @@ inline QRect QRect_convertFromScriptValue(const QScriptValue& v, bool& isValid) static T _static##N; #define ADD_PROPERTY_TO_MAP(P, N, n, T) \ - _propertyStringsToEnums[#n] = P; + _propertyStringsToEnums[#n] = P; \ + _enumsToPropertyStrings[P] = #n; #define ADD_GROUP_PROPERTY_TO_MAP(P, G, g, N, n) \ - _propertyStringsToEnums[#g "." #n] = P; + _propertyStringsToEnums[#g "." #n] = P; \ + _enumsToPropertyStrings[P] = #g "." #n; #define DEFINE_CORE(N, n, T, V) \ public: \ diff --git a/libraries/entities/src/EntityPropertyFlags.cpp b/libraries/entities/src/EntityPropertyFlags.cpp deleted file mode 100644 index 4cc44e8318..0000000000 --- a/libraries/entities/src/EntityPropertyFlags.cpp +++ /dev/null @@ -1,206 +0,0 @@ - -#include "EntityPropertyFlags.h" - - -QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f) { - QString result = "[ "; - - result = f.getHasProperty(PROP_PAGED_PROPERTY) ? result + "pagedProperty " : result; - result = f.getHasProperty(PROP_CUSTOM_PROPERTIES_INCLUDED) ? result + "customPropertiesIncluded " : result; - result = f.getHasProperty(PROP_VISIBLE) ? result + "visible " : result; - result = f.getHasProperty(PROP_CAN_CAST_SHADOW) ? result + "canCastShadow " : result; - result = f.getHasProperty(PROP_POSITION) ? result + "position " : result; - result = f.getHasProperty(PROP_DIMENSIONS) ? result + "dimensions " : result; - result = f.getHasProperty(PROP_ROTATION) ? result + "rotation " : result; - result = f.getHasProperty(PROP_DENSITY) ? result + "density " : result; - result = f.getHasProperty(PROP_VELOCITY) ? result + "velocity " : result; - result = f.getHasProperty(PROP_GRAVITY) ? result + "gravity " : result; - result = f.getHasProperty(PROP_DAMPING) ? result + "damping " : result; - result = f.getHasProperty(PROP_LIFETIME) ? result + "lifetime " : result; - result = f.getHasProperty(PROP_SCRIPT) ? result + "script " : result; - result = f.getHasProperty(PROP_COLOR) ? result + "color " : result; - result = f.getHasProperty(PROP_MODEL_URL) ? result + "modelUrl " : result; - result = f.getHasProperty(PROP_ANIMATION_URL) ? result + "animationUrl " : result; - result = f.getHasProperty(PROP_ANIMATION_FPS) ? result + "animationFps " : result; - result = f.getHasProperty(PROP_ANIMATION_FRAME_INDEX) ? result + "animationFrameIndex " : result; - result = f.getHasProperty(PROP_ANIMATION_PLAYING) ? result + "animationPlaying " : result; - result = f.getHasProperty(PROP_ANIMATION_ALLOW_TRANSLATION) ? result + "animationAllowTranslation " : result; - result = f.getHasProperty(PROP_RELAY_PARENT_JOINTS) ? result + "relayParentJoints " : result; - result = f.getHasProperty(PROP_REGISTRATION_POINT) ? result + "registrationPoint " : result; - result = f.getHasProperty(PROP_ANGULAR_VELOCITY) ? result + "angularVelocity " : result; - result = f.getHasProperty(PROP_ANGULAR_DAMPING) ? result + "angularDamping " : result; - result = f.getHasProperty(PROP_COLLISIONLESS) ? result + "collisionless " : result; - result = f.getHasProperty(PROP_DYNAMIC) ? result + "dynamic " : result; - result = f.getHasProperty(PROP_IS_SPOTLIGHT) ? result + "isSpotlight " : result; - result = f.getHasProperty(PROP_DIFFUSE_COLOR) ? result + "diffuseColor " : result; - result = f.getHasProperty(PROP_AMBIENT_COLOR_UNUSED) ? result + "ambientColorUnused " : result; - result = f.getHasProperty(PROP_SPECULAR_COLOR_UNUSED) ? result + "specularColorUnused " : result; - result = f.getHasProperty(PROP_INTENSITY) ? result + "intensity " : result; - result = f.getHasProperty(PROP_LINEAR_ATTENUATION_UNUSED) ? result + "linearAttenuationUnused " : result; - result = f.getHasProperty(PROP_QUADRATIC_ATTENUATION_UNUSED) ? result + "quadraticAttenuationUnused " : result; - result = f.getHasProperty(PROP_EXPONENT) ? result + "exponent " : result; - result = f.getHasProperty(PROP_CUTOFF) ? result + "cutoff " : result; - result = f.getHasProperty(PROP_LOCKED) ? result + "locked " : result; - result = f.getHasProperty(PROP_TEXTURES) ? result + "textures " : result; - result = f.getHasProperty(PROP_ANIMATION_SETTINGS_UNUSED) ? result + "animationSettingsUnused " : result; - result = f.getHasProperty(PROP_USER_DATA) ? result + "userData " : result; - result = f.getHasProperty(PROP_SHAPE_TYPE) ? result + "shapeType " : result; - result = f.getHasProperty(PROP_MAX_PARTICLES) ? result + "maxParticles " : result; - result = f.getHasProperty(PROP_LIFESPAN) ? result + "lifespan " : result; - result = f.getHasProperty(PROP_EMIT_RATE) ? result + "emitRate " : result; - result = f.getHasProperty(PROP_EMIT_SPEED) ? result + "emitSpeed " : result; - result = f.getHasProperty(PROP_EMIT_ACCELERATION) ? result + "emitAcceleration " : result; - result = f.getHasProperty(PROP_PARTICLE_RADIUS) ? result + "particleRadius " : result; - result = f.getHasProperty(PROP_COMPOUND_SHAPE_URL) ? result + "compoundShapeUrl " : result; - result = f.getHasProperty(PROP_MARKETPLACE_ID) ? result + "marketplaceID " : result; - result = f.getHasProperty(PROP_ACCELERATION) ? result + "acceleration " : result; - result = f.getHasProperty(PROP_SIMULATION_OWNER) ? result + "simulationOwner " : result; - result = f.getHasProperty(PROP_NAME) ? result + "name " : result; - result = f.getHasProperty(PROP_COLLISION_SOUND_URL) ? result + "collisionSoundUrl " : result; - result = f.getHasProperty(PROP_RESTITUTION) ? result + "restitution " : result; - result = f.getHasProperty(PROP_FRICTION) ? result + "friction " : result; - result = f.getHasProperty(PROP_VOXEL_VOLUME_SIZE) ? result + "voxelVolumeSize " : result; - result = f.getHasProperty(PROP_VOXEL_DATA) ? result + "voxelData " : result; - result = f.getHasProperty(PROP_VOXEL_SURFACE_STYLE) ? result + "voxelSurfaceStyle " : result; - result = f.getHasProperty(PROP_LINE_POINTS) ? result + "linePoints " : result; - result = f.getHasProperty(PROP_HREF) ? result + "href " : result; - result = f.getHasProperty(PROP_DESCRIPTION) ? result + "description " : result; - result = f.getHasProperty(PROP_BILLBOARD_MODE) ? result + "billboardMode " : result; - result = f.getHasProperty(PROP_SCRIPT_TIMESTAMP) ? result + "scriptTimestamp " : result; - result = f.getHasProperty(PROP_ACTION_DATA) ? result + "actionData " : result; - result = f.getHasProperty(PROP_X_TEXTURE_URL) ? result + "xTextureUrl " : result; - result = f.getHasProperty(PROP_Y_TEXTURE_URL) ? result + "yTextureUrl " : result; - result = f.getHasProperty(PROP_Z_TEXTURE_URL) ? result + "zTextureUrl " : result; - result = f.getHasProperty(PROP_NORMALS) ? result + "normals " : result; - result = f.getHasProperty(PROP_STROKE_COLORS) ? result + "strokeColors " : result; - result = f.getHasProperty(PROP_STROKE_WIDTHS) ? result + "strokeWidths " : result; - result = f.getHasProperty(PROP_IS_UV_MODE_STRETCH) ? result + "isUvModeStretch " : result; - result = f.getHasProperty(PROP_SPEED_SPREAD) ? result + "speedSpread " : result; - result = f.getHasProperty(PROP_ACCELERATION_SPREAD) ? result + "accelerationSpread " : result; - result = f.getHasProperty(PROP_X_N_NEIGHBOR_ID) ? result + "xNNeighborID " : result; - result = f.getHasProperty(PROP_Y_N_NEIGHBOR_ID) ? result + "yNNeighborID " : result; - result = f.getHasProperty(PROP_Z_N_NEIGHBOR_ID) ? result + "zNNeighborID " : result; - result = f.getHasProperty(PROP_X_P_NEIGHBOR_ID) ? result + "xPNeighborID " : result; - result = f.getHasProperty(PROP_Y_P_NEIGHBOR_ID) ? result + "yPNeighborID " : result; - result = f.getHasProperty(PROP_Z_P_NEIGHBOR_ID) ? result + "zPNeighborID " : result; - result = f.getHasProperty(PROP_RADIUS_SPREAD) ? result + "radiusSpread " : result; - result = f.getHasProperty(PROP_RADIUS_START) ? result + "radiusStart " : result; - result = f.getHasProperty(PROP_RADIUS_FINISH) ? result + "radiusFinish " : result; - result = f.getHasProperty(PROP_ALPHA) ? result + "alpha " : result; - result = f.getHasProperty(PROP_COLOR_SPREAD) ? result + "colorSpread " : result; - result = f.getHasProperty(PROP_COLOR_START) ? result + "colorStart " : result; - result = f.getHasProperty(PROP_COLOR_FINISH) ? result + "colorFinish " : result; - result = f.getHasProperty(PROP_ALPHA_SPREAD) ? result + "alphaSpread " : result; - result = f.getHasProperty(PROP_ALPHA_START) ? result + "alphaStart " : result; - result = f.getHasProperty(PROP_ALPHA_FINISH) ? result + "alphaFinish " : result; - result = f.getHasProperty(PROP_EMIT_ORIENTATION) ? result + "emitOrientation " : result; - result = f.getHasProperty(PROP_EMIT_DIMENSIONS) ? result + "emitDimensions " : result; - result = f.getHasProperty(PROP_EMIT_RADIUS_START) ? result + "emitRadiusStart " : result; - result = f.getHasProperty(PROP_POLAR_START) ? result + "polarStart " : result; - result = f.getHasProperty(PROP_POLAR_FINISH) ? result + "polarFinish " : result; - result = f.getHasProperty(PROP_AZIMUTH_START) ? result + "azimuthStart " : result; - result = f.getHasProperty(PROP_AZIMUTH_FINISH) ? result + "azimuthFinish " : result; - result = f.getHasProperty(PROP_ANIMATION_LOOP) ? result + "animationLoop " : result; - result = f.getHasProperty(PROP_ANIMATION_FIRST_FRAME) ? result + "animationFirstFrame " : result; - result = f.getHasProperty(PROP_ANIMATION_LAST_FRAME) ? result + "animationLastFrame " : result; - result = f.getHasProperty(PROP_ANIMATION_HOLD) ? result + "animationHold " : result; - result = f.getHasProperty(PROP_ANIMATION_START_AUTOMATICALLY) ? result + "animationStartAutomatically " : result; - result = f.getHasProperty(PROP_EMITTER_SHOULD_TRAIL) ? result + "emitterShouldTrail " : result; - result = f.getHasProperty(PROP_PARENT_ID) ? result + "parentID " : result; - result = f.getHasProperty(PROP_PARENT_JOINT_INDEX) ? result + "parentJointIndex " : result; - result = f.getHasProperty(PROP_LOCAL_POSITION) ? result + "localPosition " : result; - result = f.getHasProperty(PROP_LOCAL_ROTATION) ? result + "localRotation " : result; - result = f.getHasProperty(PROP_QUERY_AA_CUBE) ? result + "queryAaCube " : result; - result = f.getHasProperty(PROP_JOINT_ROTATIONS_SET) ? result + "jointRotationsSet " : result; - result = f.getHasProperty(PROP_JOINT_ROTATIONS) ? result + "jointRotations " : result; - result = f.getHasProperty(PROP_JOINT_TRANSLATIONS_SET) ? result + "jointTranslationsSet " : result; - result = f.getHasProperty(PROP_JOINT_TRANSLATIONS) ? result + "jointTranslations " : result; - result = f.getHasProperty(PROP_COLLISION_MASK) ? result + "collisionMask " : result; - result = f.getHasProperty(PROP_FALLOFF_RADIUS) ? result + "falloffRadius " : result; - result = f.getHasProperty(PROP_FLYING_ALLOWED) ? result + "flyingAllowed " : result; - result = f.getHasProperty(PROP_GHOSTING_ALLOWED) ? result + "ghostingAllowed " : result; - result = f.getHasProperty(PROP_ENTITY_HOST_TYPE) ? result + "entityHostType " : result; - result = f.getHasProperty(PROP_OWNING_AVATAR_ID) ? result + "owningAvatarID " : result; - result = f.getHasProperty(PROP_SHAPE) ? result + "shape " : result; - result = f.getHasProperty(PROP_DPI) ? result + "dpi " : result; - result = f.getHasProperty(PROP_LOCAL_VELOCITY) ? result + "localVelocity " : result; - result = f.getHasProperty(PROP_LOCAL_ANGULAR_VELOCITY) ? result + "localAngularVelocity " : result; - result = f.getHasProperty(PROP_LAST_EDITED_BY) ? result + "lastEditedBy " : result; - result = f.getHasProperty(PROP_SERVER_SCRIPTS) ? result + "serverScripts " : result; - result = f.getHasProperty(PROP_FILTER_URL) ? result + "filterUrl " : result; - result = f.getHasProperty(PROP_ITEM_NAME) ? result + "itemName " : result; - result = f.getHasProperty(PROP_ITEM_DESCRIPTION) ? result + "itemDescription " : result; - result = f.getHasProperty(PROP_ITEM_CATEGORIES) ? result + "itemCategories " : result; - result = f.getHasProperty(PROP_ITEM_ARTIST) ? result + "itemArtist " : result; - result = f.getHasProperty(PROP_ITEM_LICENSE) ? result + "itemLicense " : result; - result = f.getHasProperty(PROP_LIMITED_RUN) ? result + "limitedRun " : result; - result = f.getHasProperty(PROP_EDITION_NUMBER) ? result + "editionNumber " : result; - result = f.getHasProperty(PROP_ENTITY_INSTANCE_NUMBER) ? result + "entityInstanceNumber " : result; - result = f.getHasProperty(PROP_CERTIFICATE_ID) ? result + "certificateID " : result; - result = f.getHasProperty(PROP_STATIC_CERTIFICATE_VERSION) ? result + "staticCertificateVersion " : result; - result = f.getHasProperty(PROP_CLONEABLE) ? result + "cloneable " : result; - result = f.getHasProperty(PROP_CLONE_LIFETIME) ? result + "cloneLifetime " : result; - result = f.getHasProperty(PROP_CLONE_LIMIT) ? result + "cloneLimit " : result; - result = f.getHasProperty(PROP_CLONE_DYNAMIC) ? result + "cloneDynamic " : result; - result = f.getHasProperty(PROP_CLONE_AVATAR_ENTITY) ? result + "cloneAvatarEntity " : result; - result = f.getHasProperty(PROP_CLONE_ORIGIN_ID) ? result + "cloneOriginID " : result; - result = f.getHasProperty(PROP_HAZE_MODE) ? result + "hazeMode " : result; - result = f.getHasProperty(PROP_KEYLIGHT_COLOR) ? result + "keylightColor " : result; - result = f.getHasProperty(PROP_KEYLIGHT_INTENSITY) ? result + "keylightIntensity " : result; - result = f.getHasProperty(PROP_KEYLIGHT_DIRECTION) ? result + "keylightDirection " : result; - result = f.getHasProperty(PROP_KEYLIGHT_CAST_SHADOW) ? result + "keylightCastShadow " : result; - result = f.getHasProperty(PROP_HAZE_RANGE) ? result + "hazeRange " : result; - result = f.getHasProperty(PROP_HAZE_COLOR) ? result + "hazeColor " : result; - result = f.getHasProperty(PROP_HAZE_GLARE_COLOR) ? result + "hazeGlareColor " : result; - result = f.getHasProperty(PROP_HAZE_ENABLE_GLARE) ? result + "hazeEnableGlare " : result; - result = f.getHasProperty(PROP_HAZE_GLARE_ANGLE) ? result + "hazeGlareAngle " : result; - result = f.getHasProperty(PROP_HAZE_ALTITUDE_EFFECT) ? result + "hazeAltitudeEffect " : result; - result = f.getHasProperty(PROP_HAZE_CEILING) ? result + "hazeCeiling " : result; - result = f.getHasProperty(PROP_HAZE_BASE_REF) ? result + "hazeBaseRef " : result; - result = f.getHasProperty(PROP_HAZE_BACKGROUND_BLEND) ? result + "hazeBackgroundBlend " : result; - result = f.getHasProperty(PROP_HAZE_ATTENUATE_KEYLIGHT) ? result + "hazeAttenuateKeylight " : result; - result = f.getHasProperty(PROP_HAZE_KEYLIGHT_RANGE) ? result + "hazeKeylightRange " : result; - result = f.getHasProperty(PROP_HAZE_KEYLIGHT_ALTITUDE) ? result + "hazeKeylightAltitude " : result; - result = f.getHasProperty(PROP_KEY_LIGHT_MODE) ? result + "keyLightMode " : result; - result = f.getHasProperty(PROP_AMBIENT_LIGHT_MODE) ? result + "ambientLightMode " : result; - result = f.getHasProperty(PROP_SKYBOX_MODE) ? result + "skyboxMode " : result; - result = f.getHasProperty(PROP_LOCAL_DIMENSIONS) ? result + "localDimensions " : result; - result = f.getHasProperty(PROP_MATERIAL_URL) ? result + "materialUrl " : result; - result = f.getHasProperty(PROP_MATERIAL_MAPPING_MODE) ? result + "materialMappingMode " : result; - result = f.getHasProperty(PROP_MATERIAL_PRIORITY) ? result + "materialPriority " : result; - result = f.getHasProperty(PROP_PARENT_MATERIAL_NAME) ? result + "parentMaterialName " : result; - result = f.getHasProperty(PROP_MATERIAL_MAPPING_POS) ? result + "materialMappingPos " : result; - result = f.getHasProperty(PROP_MATERIAL_MAPPING_SCALE) ? result + "materialMappingScale " : result; - result = f.getHasProperty(PROP_MATERIAL_MAPPING_ROT) ? result + "materialMappingRot " : result; - result = f.getHasProperty(PROP_MATERIAL_DATA) ? result + "materialData " : result; - result = f.getHasProperty(PROP_MATERIAL_REPEAT) ? result + "materialRepeat " : result; - result = f.getHasProperty(PROP_VISIBLE_IN_SECONDARY_CAMERA) ? result + "visibleInSecondaryCamera " : result; - result = f.getHasProperty(PROP_PARTICLE_SPIN) ? result + "particleSpin " : result; - result = f.getHasProperty(PROP_SPIN_START) ? result + "spinStart " : result; - result = f.getHasProperty(PROP_SPIN_FINISH) ? result + "spinFinish " : result; - result = f.getHasProperty(PROP_SPIN_SPREAD) ? result + "spinSpread " : result; - result = f.getHasProperty(PROP_PARTICLE_ROTATE_WITH_ENTITY) ? result + "particleRotateWithEntity " : result; - result = f.getHasProperty(PROP_BLOOM_INTENSITY) ? result + "bloomIntensity " : result; - result = f.getHasProperty(PROP_BLOOM_THRESHOLD) ? result + "bloomThreshold " : result; - result = f.getHasProperty(PROP_BLOOM_SIZE) ? result + "bloomSize " : result; - result = f.getHasProperty(PROP_GRAB_GRABBABLE) ? result + "grab.Grabbable " : result; - result = f.getHasProperty(PROP_GRAB_KINEMATIC) ? result + "grab.Kinematic " : result; - result = f.getHasProperty(PROP_GRAB_FOLLOWS_CONTROLLER) ? result + "grab.FollowsController " : result; - result = f.getHasProperty(PROP_GRAB_TRIGGERABLE) ? result + "grab.Triggerable " : result; - result = f.getHasProperty(PROP_GRAB_EQUIPPABLE) ? result + "grab.Equippable " : result; - result = - f.getHasProperty(PROP_GRAB_LEFT_EQUIPPABLE_POSITION_OFFSET) ? result + "grab.LeftEquippablePositionOffset " : result; - result = - f.getHasProperty(PROP_GRAB_LEFT_EQUIPPABLE_ROTATION_OFFSET) ? result + "grab.LeftEquippableRotationOffset " : result; - result = - f.getHasProperty(PROP_GRAB_RIGHT_EQUIPPABLE_POSITION_OFFSET) ? result + "grab.RightEquippablePositionOffset " : result; - result = - f.getHasProperty(PROP_GRAB_RIGHT_EQUIPPABLE_ROTATION_OFFSET) ? result + "grab.RightEquippableRotationOffset " : result; - result = f.getHasProperty(PROP_GRAB_EQUIPPABLE_INDICATOR_URL) ? result + "grab.EquippableIndicatorURL " : result; - result = f.getHasProperty(PROP_GRAB_EQUIPPABLE_INDICATOR_SCALE) ? result + "grab.EquippableIndicatorScale " : result; - result = f.getHasProperty(PROP_GRAB_EQUIPPABLE_INDICATOR_OFFSET) ? result + "grab.EquippableIndicatorOffset " : result; - - result += "]"; - dbg.nospace() << result; - return dbg; -} diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 78a15d259a..812b788b06 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -19,6 +19,7 @@ enum EntityPropertyList { PROP_CUSTOM_PROPERTIES_INCLUDED, // Core properties + PROP_SIMULATION_OWNER, PROP_VISIBLE, PROP_NAME, PROP_LOCKED, @@ -66,7 +67,6 @@ enum EntityPropertyList { PROP_COLLISIONLESS, PROP_COLLISION_MASK, PROP_DYNAMIC, - PROP_SIMULATION_OWNER, PROP_COLLISION_SOUND_URL, PROP_ACTION_DATA, @@ -166,13 +166,13 @@ enum EntityPropertyList { PROP_SPEED_SPREAD = PROP_DERIVED_5, PROP_EMIT_ORIENTATION = PROP_DERIVED_6, PROP_EMIT_DIMENSIONS = PROP_DERIVED_7, - PROP_EMIT_RADIUS_START = PROP_DERIVED_8, - PROP_EMIT_ACCELERATION = PROP_DERIVED_9, - PROP_ACCELERATION_SPREAD = PROP_DERIVED_10, - PROP_POLAR_START = PROP_DERIVED_11, - PROP_POLAR_FINISH = PROP_DERIVED_12, - PROP_AZIMUTH_START = PROP_DERIVED_13, - PROP_AZIMUTH_FINISH = PROP_DERIVED_14, + PROP_ACCELERATION_SPREAD = PROP_DERIVED_8, + PROP_POLAR_START = PROP_DERIVED_9, + PROP_POLAR_FINISH = PROP_DERIVED_10, + PROP_AZIMUTH_START = PROP_DERIVED_11, + PROP_AZIMUTH_FINISH = PROP_DERIVED_12, + PROP_EMIT_RADIUS_START = PROP_DERIVED_13, + PROP_EMIT_ACCELERATION = PROP_DERIVED_14, PROP_PARTICLE_RADIUS = PROP_DERIVED_15, PROP_RADIUS_SPREAD = PROP_DERIVED_16, PROP_RADIUS_START = PROP_DERIVED_17, @@ -327,10 +327,4 @@ typedef PropertyFlags EntityPropertyFlags; // one greater than the last item property due to the enum's auto-incrementing. extern EntityPropertyList PROP_LAST_ITEM; -QString EntityPropertyFlagsToString(EntityPropertyFlags propertiesFlags); - - -QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f); - - #endif // hifi_EntityPropertyFlags_h diff --git a/libraries/entities/src/ImageEntityItem.cpp b/libraries/entities/src/ImageEntityItem.cpp index 98817a63ba..cdff1b5390 100644 --- a/libraries/entities/src/ImageEntityItem.cpp +++ b/libraries/entities/src/ImageEntityItem.cpp @@ -30,30 +30,30 @@ void ImageEntityItem::setUnscaledDimensions(const glm::vec3& value) { EntityItemProperties ImageEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(imageURL, getImageURL); COPY_ENTITY_PROPERTY_TO_PROPERTIES(emissive, getEmissive); COPY_ENTITY_PROPERTY_TO_PROPERTIES(keepAspectRatio, getKeepAspectRatio); COPY_ENTITY_PROPERTY_TO_PROPERTIES(billboardMode, getBillboardMode); COPY_ENTITY_PROPERTY_TO_PROPERTIES(subImage, getSubImage); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha); - return properties; } bool ImageEntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class + SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(imageURL, setImageURL); SET_ENTITY_PROPERTY_FROM_PROPERTIES(emissive, setEmissive); SET_ENTITY_PROPERTY_FROM_PROPERTIES(keepAspectRatio, setKeepAspectRatio); SET_ENTITY_PROPERTY_FROM_PROPERTIES(billboardMode, setBillboardMode); SET_ENTITY_PROPERTY_FROM_PROPERTIES(subImage, setSubImage); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha); - if (somethingChanged) { bool wantDebug = false; if (wantDebug) { @@ -75,30 +75,30 @@ int ImageEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesRead = 0; const unsigned char* dataAt = data; + READ_ENTITY_PROPERTY(PROP_COLOR, u8vec3Color, setColor); + READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); + READ_ENTITY_PROPERTY(PROP_IMAGE_URL, QString, setImageURL); READ_ENTITY_PROPERTY(PROP_EMISSIVE, bool, setEmissive); READ_ENTITY_PROPERTY(PROP_KEEP_ASPECT_RATIO, bool, setKeepAspectRatio); READ_ENTITY_PROPERTY(PROP_BILLBOARD_MODE, BillboardMode, setBillboardMode); READ_ENTITY_PROPERTY(PROP_SUB_IMAGE, QRect, setSubImage); - READ_ENTITY_PROPERTY(PROP_COLOR, u8vec3Color, setColor); - READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); - return bytesRead; } EntityPropertyFlags ImageEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); + requestedProperties += PROP_COLOR; + requestedProperties += PROP_ALPHA; + requestedProperties += PROP_IMAGE_URL; requestedProperties += PROP_EMISSIVE; requestedProperties += PROP_KEEP_ASPECT_RATIO; requestedProperties += PROP_BILLBOARD_MODE; requestedProperties += PROP_SUB_IMAGE; - requestedProperties += PROP_COLOR; - requestedProperties += PROP_ALPHA; - return requestedProperties; } @@ -112,14 +112,14 @@ void ImageEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit bool successPropertyFits = true; + APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); + APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha()); + APPEND_ENTITY_PROPERTY(PROP_IMAGE_URL, getImageURL()); APPEND_ENTITY_PROPERTY(PROP_EMISSIVE, getEmissive()); APPEND_ENTITY_PROPERTY(PROP_KEEP_ASPECT_RATIO, getKeepAspectRatio()); APPEND_ENTITY_PROPERTY(PROP_BILLBOARD_MODE, (uint32_t)getBillboardMode()); APPEND_ENTITY_PROPERTY(PROP_SUB_IMAGE, getSubImage()); - - APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); - APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha()); } bool ImageEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index e3de5f66f8..185aa70dc0 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -71,8 +71,8 @@ void LightEntityItem::dimensionsChanged() { EntityItemProperties LightEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class - COPY_ENTITY_PROPERTY_TO_PROPERTIES(isSpotlight, getIsSpotlight); COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(isSpotlight, getIsSpotlight); COPY_ENTITY_PROPERTY_TO_PROPERTIES(intensity, getIntensity); COPY_ENTITY_PROPERTY_TO_PROPERTIES(exponent, getExponent); COPY_ENTITY_PROPERTY_TO_PROPERTIES(cutoff, getCutoff); @@ -155,8 +155,8 @@ bool LightEntityItem::setProperties(const EntityItemProperties& properties) { bool LightEntityItem::setSubClassProperties(const EntityItemProperties& properties) { bool somethingChanged = EntityItem::setSubClassProperties(properties); // set the properties in our base class - SET_ENTITY_PROPERTY_FROM_PROPERTIES(isSpotlight, setIsSpotlight); SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(isSpotlight, setIsSpotlight); SET_ENTITY_PROPERTY_FROM_PROPERTIES(intensity, setIntensity); SET_ENTITY_PROPERTY_FROM_PROPERTIES(exponent, setExponent); SET_ENTITY_PROPERTY_FROM_PROPERTIES(cutoff, setCutoff); @@ -174,8 +174,8 @@ int LightEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); + READ_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); READ_ENTITY_PROPERTY(PROP_INTENSITY, float, setIntensity); READ_ENTITY_PROPERTY(PROP_EXPONENT, float, setExponent); READ_ENTITY_PROPERTY(PROP_CUTOFF, float, setCutoff); @@ -187,8 +187,8 @@ int LightEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, EntityPropertyFlags LightEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); - requestedProperties += PROP_IS_SPOTLIGHT; requestedProperties += PROP_COLOR; + requestedProperties += PROP_IS_SPOTLIGHT; requestedProperties += PROP_INTENSITY; requestedProperties += PROP_EXPONENT; requestedProperties += PROP_CUTOFF; @@ -205,8 +205,8 @@ void LightEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit OctreeElement::AppendState& appendState) const { bool successPropertyFits = true; - APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, getIsSpotlight()); APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); + APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, getIsSpotlight()); APPEND_ENTITY_PROPERTY(PROP_INTENSITY, getIntensity()); APPEND_ENTITY_PROPERTY(PROP_EXPONENT, getExponent()); APPEND_ENTITY_PROPERTY(PROP_CUTOFF, getCutoff()); diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 067a9e0b19..55ae1c6c3b 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -55,11 +55,13 @@ void ModelEntityItem::setTextures(const QString& textures) { EntityItemProperties ModelEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class - COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(modelURL, getModelURL); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); + + COPY_ENTITY_PROPERTY_TO_PROPERTIES(modelURL, getModelURL); COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointRotationsSet, getJointRotationsSet); COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointRotations, getJointRotations); COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointTranslationsSet, getJointTranslationsSet); @@ -75,11 +77,12 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class - SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(modelURL, setModelURL); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, setShapeType); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); + + SET_ENTITY_PROPERTY_FROM_PROPERTIES(modelURL, setModelURL); SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointRotationsSet, setJointRotationsSet); SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointRotations, setJointRotations); SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointTranslationsSet, setJointTranslationsSet); @@ -116,11 +119,12 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, const unsigned char* dataAt = data; bool animationPropertiesChanged = false; - READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); - READ_ENTITY_PROPERTY(PROP_MODEL_URL, QString, setModelURL); - READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); - READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType); + READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); + READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); + READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); + + READ_ENTITY_PROPERTY(PROP_MODEL_URL, QString, setModelURL); READ_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, QVector, setJointRotationsSet); READ_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, QVector, setJointRotations); READ_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, QVector, setJointTranslationsSet); @@ -151,11 +155,12 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, EntityPropertyFlags ModelEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); - requestedProperties += PROP_COLOR; - requestedProperties += PROP_MODEL_URL; - requestedProperties += PROP_COMPOUND_SHAPE_URL; - requestedProperties += PROP_TEXTURES; requestedProperties += PROP_SHAPE_TYPE; + requestedProperties += PROP_COMPOUND_SHAPE_URL; + requestedProperties += PROP_COLOR; + requestedProperties += PROP_TEXTURES; + + requestedProperties += PROP_MODEL_URL; requestedProperties += PROP_JOINT_ROTATIONS_SET; requestedProperties += PROP_JOINT_ROTATIONS; requestedProperties += PROP_JOINT_TRANSLATIONS_SET; @@ -176,11 +181,12 @@ void ModelEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit bool successPropertyFits = true; - APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); - APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, getModelURL()); - APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL()); - APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); + APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL()); + APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); + APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures()); + + APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, getModelURL()); APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, getJointRotationsSet()); APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, getJointRotations()); APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, getJointTranslationsSet()); diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 2cafbd017e..7426318979 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -410,6 +410,10 @@ EntityItemProperties ParticleEffectEntityItem::getProperties(const EntityPropert EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(maxParticles, getMaxParticles); COPY_ENTITY_PROPERTY_TO_PROPERTIES(lifespan, getLifespan); @@ -434,17 +438,14 @@ EntityItemProperties ParticleEffectEntityItem::getProperties(const EntityPropert COPY_ENTITY_PROPERTY_TO_PROPERTIES(radiusStart, getRadiusStart); COPY_ENTITY_PROPERTY_TO_PROPERTIES(radiusFinish, getRadiusFinish); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(colorSpread, getColorSpread); COPY_ENTITY_PROPERTY_TO_PROPERTIES(colorStart, getColorStart); COPY_ENTITY_PROPERTY_TO_PROPERTIES(colorFinish, getColorFinish); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha); COPY_ENTITY_PROPERTY_TO_PROPERTIES(alphaSpread, getAlphaSpread); COPY_ENTITY_PROPERTY_TO_PROPERTIES(alphaStart, getAlphaStart); COPY_ENTITY_PROPERTY_TO_PROPERTIES(alphaFinish, getAlphaFinish); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); COPY_ENTITY_PROPERTY_TO_PROPERTIES(emitterShouldTrail, getEmitterShouldTrail); COPY_ENTITY_PROPERTY_TO_PROPERTIES(particleSpin, getParticleSpin); @@ -460,6 +461,10 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert bool somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, setShapeType); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(maxParticles, setMaxParticles); SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifespan, setLifespan); @@ -484,17 +489,14 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert SET_ENTITY_PROPERTY_FROM_PROPERTIES(radiusStart, setRadiusStart); SET_ENTITY_PROPERTY_FROM_PROPERTIES(radiusFinish, setRadiusFinish); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); SET_ENTITY_PROPERTY_FROM_PROPERTIES(colorSpread, setColorSpread); SET_ENTITY_PROPERTY_FROM_PROPERTIES(colorStart, setColorStart); SET_ENTITY_PROPERTY_FROM_PROPERTIES(colorFinish, setColorFinish); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha); SET_ENTITY_PROPERTY_FROM_PROPERTIES(alphaSpread, setAlphaSpread); SET_ENTITY_PROPERTY_FROM_PROPERTIES(alphaStart, setAlphaStart); SET_ENTITY_PROPERTY_FROM_PROPERTIES(alphaFinish, setAlphaFinish); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); SET_ENTITY_PROPERTY_FROM_PROPERTIES(emitterShouldTrail, setEmitterShouldTrail); SET_ENTITY_PROPERTY_FROM_PROPERTIES(particleSpin, setParticleSpin); @@ -531,6 +533,10 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType); + READ_ENTITY_PROPERTY(PROP_COLOR, u8vec3Color, setColor); + READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); + READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); + READ_ENTITY_PROPERTY(PROP_MAX_PARTICLES, quint32, setMaxParticles); READ_ENTITY_PROPERTY(PROP_LIFESPAN, float, setLifespan); @@ -555,17 +561,14 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch READ_ENTITY_PROPERTY(PROP_RADIUS_START, float, setRadiusStart); READ_ENTITY_PROPERTY(PROP_RADIUS_FINISH, float, setRadiusFinish); - READ_ENTITY_PROPERTY(PROP_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY(PROP_COLOR_SPREAD, u8vec3Color, setColorSpread); READ_ENTITY_PROPERTY(PROP_COLOR_START, vec3Color, setColorStart); READ_ENTITY_PROPERTY(PROP_COLOR_FINISH, vec3Color, setColorFinish); - READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); READ_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, float, setAlphaSpread); READ_ENTITY_PROPERTY(PROP_ALPHA_START, float, setAlphaStart); READ_ENTITY_PROPERTY(PROP_ALPHA_FINISH, float, setAlphaFinish); - READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, bool, setEmitterShouldTrail); READ_ENTITY_PROPERTY(PROP_PARTICLE_SPIN, float, setParticleSpin); @@ -581,6 +584,10 @@ EntityPropertyFlags ParticleEffectEntityItem::getEntityProperties(EncodeBitstrea EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); requestedProperties += PROP_SHAPE_TYPE; + requestedProperties += PROP_COLOR; + requestedProperties += PROP_ALPHA; + requestedProperties += PROP_TEXTURES; + requestedProperties += PROP_MAX_PARTICLES; requestedProperties += PROP_LIFESPAN; @@ -605,17 +612,14 @@ EntityPropertyFlags ParticleEffectEntityItem::getEntityProperties(EncodeBitstrea requestedProperties += PROP_RADIUS_START; requestedProperties += PROP_RADIUS_FINISH; - requestedProperties += PROP_COLOR; requestedProperties += PROP_COLOR_SPREAD; requestedProperties += PROP_COLOR_START; requestedProperties += PROP_COLOR_FINISH; - requestedProperties += PROP_ALPHA; requestedProperties += PROP_ALPHA_SPREAD; requestedProperties += PROP_ALPHA_START; requestedProperties += PROP_ALPHA_FINISH; - requestedProperties += PROP_TEXTURES; requestedProperties += PROP_EMITTER_SHOULD_TRAIL; requestedProperties += PROP_PARTICLE_SPIN; @@ -637,10 +641,14 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); + APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); + APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha()); + APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures()); + APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, getMaxParticles()); APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, getLifespan()); - APPEND_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, getIsEmitting()); + APPEND_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, getIsEmitting()); APPEND_ENTITY_PROPERTY(PROP_EMIT_RATE, getEmitRate()); APPEND_ENTITY_PROPERTY(PROP_EMIT_SPEED, getEmitSpeed()); APPEND_ENTITY_PROPERTY(PROP_SPEED_SPREAD, getSpeedSpread()); @@ -661,17 +669,14 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_RADIUS_START, getRadiusStart()); APPEND_ENTITY_PROPERTY(PROP_RADIUS_FINISH, getRadiusFinish()); - APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); APPEND_ENTITY_PROPERTY(PROP_COLOR_SPREAD, getColorSpread()); APPEND_ENTITY_PROPERTY(PROP_COLOR_START, getColorStart()); APPEND_ENTITY_PROPERTY(PROP_COLOR_FINISH, getColorFinish()); - APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha()); APPEND_ENTITY_PROPERTY(PROP_ALPHA_SPREAD, getAlphaSpread()); APPEND_ENTITY_PROPERTY(PROP_ALPHA_START, getAlphaStart()); APPEND_ENTITY_PROPERTY(PROP_ALPHA_FINISH, getAlphaFinish()); - APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures()); APPEND_ENTITY_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, getEmitterShouldTrail()); APPEND_ENTITY_PROPERTY(PROP_PARTICLE_SPIN, getParticleSpin()); diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index 93206165da..ee59b5b45a 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -24,7 +24,6 @@ const float PolyLineEntityItem::DEFAULT_LINE_WIDTH = 0.1f; const int PolyLineEntityItem::MAX_POINTS_PER_LINE = 60; - EntityItemPointer PolyLineEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { EntityItemPointer entity(new PolyLineEntityItem(entityID), [](EntityItem* ptr) { ptr->deleteLater(); }); entity->setProperties(properties); @@ -37,15 +36,15 @@ PolyLineEntityItem::PolyLineEntityItem(const EntityItemID& entityItemID) : Entit } EntityItemProperties PolyLineEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const { - QWriteLocker lock(&_quadReadWriteLock); EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints); COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeWidths, getStrokeWidths); COPY_ENTITY_PROPERTY_TO_PROPERTIES(normals, getNormals); COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeColors, getStrokeColors); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); COPY_ENTITY_PROPERTY_TO_PROPERTIES(isUVModeStretch, getIsUVModeStretch); COPY_ENTITY_PROPERTY_TO_PROPERTIES(glow, getGlow); COPY_ENTITY_PROPERTY_TO_PROPERTIES(faceCamera, getFaceCamera); @@ -54,16 +53,16 @@ EntityItemProperties PolyLineEntityItem::getProperties(const EntityPropertyFlags } bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { - QWriteLocker lock(&_quadReadWriteLock); bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints); SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeWidths, setStrokeWidths); SET_ENTITY_PROPERTY_FROM_PROPERTIES(normals, setNormals); SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeColors, setStrokeColors); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); SET_ENTITY_PROPERTY_FROM_PROPERTIES(isUVModeStretch, setIsUVModeStretch); SET_ENTITY_PROPERTY_FROM_PROPERTIES(glow, setGlow); SET_ENTITY_PROPERTY_FROM_PROPERTIES(faceCamera, setFaceCamera); @@ -81,137 +80,86 @@ bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { return somethingChanged; } - -bool PolyLineEntityItem::appendPoint(const glm::vec3& point) { - if (_points.size() > MAX_POINTS_PER_LINE - 1) { - qCDebug(entities) << "MAX POINTS REACHED!"; - return false; - } - - _points << point; - _pointsChanged = true; - - calculateScaleAndRegistrationPoint(); - - return true; -} - - -bool PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths) { +void PolyLineEntityItem::setLinePoints(const QVector& points) { withWriteLock([&] { - _strokeWidths = strokeWidths; - _strokeWidthsChanged = true; + _points = points; + _pointsChanged = true; }); - return true; + computeAndUpdateDimensionsAndPosition(); } -bool PolyLineEntityItem::setNormals(const QVector& normals) { +void PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths) { + withWriteLock([&] { + _widths = strokeWidths; + _widthsChanged = true; + }); + computeAndUpdateDimensionsAndPosition(); +} + +void PolyLineEntityItem::setNormals(const QVector& normals) { withWriteLock([&] { _normals = normals; _normalsChanged = true; }); - return true; } -bool PolyLineEntityItem::setStrokeColors(const QVector& strokeColors) { +void PolyLineEntityItem::setStrokeColors(const QVector& strokeColors) { withWriteLock([&] { - _strokeColors = strokeColors; - _strokeColorsChanged = true; + _colors = strokeColors; + _colorsChanged = true; }); - return true; } +void PolyLineEntityItem::computeAndUpdateDimensionsAndPosition() { + QVector points; + QVector widths; -bool PolyLineEntityItem::setLinePoints(const QVector& points) { - if (points.size() > MAX_POINTS_PER_LINE) { - return false; - } - bool result = false; - withWriteLock([&] { - //Check to see if points actually changed. If they haven't, return before doing anything else - if (points.size() != _points.size()) { - _pointsChanged = true; - } else if (points.size() == _points.size()) { - //same number of points, so now compare every point - for (int i = 0; i < points.size(); i++) { - if (points.at(i) != _points.at(i)) { - _pointsChanged = true; - break; - } - } - } - if (!_pointsChanged) { - return; - } - - _points = points; - - result = true; - }); - - if (result) { - calculateScaleAndRegistrationPoint(); - } - - return result; -} - -void PolyLineEntityItem::calculateScaleAndRegistrationPoint() { - glm::vec3 high(0.0f, 0.0f, 0.0f); - glm::vec3 low(0.0f, 0.0f, 0.0f); - int pointCount = 0; - glm::vec3 firstPoint; withReadLock([&] { - pointCount = _points.size(); - if (pointCount > 0) { - firstPoint = _points.at(0); - } - for (int i = 0; i < pointCount; i++) { - const glm::vec3& point = _points.at(i); - high = glm::max(point, high); - low = glm::min(point, low); - } + points = _points; + widths = _widths; }); - float magnitudeSquared = glm::length2(low - high); - vec3 newScale { 1 }; - vec3 newRegistrationPoint { 0.5f }; + AABox container; + float maxWidth = 0.0f; + if (_points.length() > 0) { + container = AABox(_points[0] - 0.5f * ENTITY_ITEM_DEFAULT_DIMENSIONS, ENTITY_ITEM_DEFAULT_WIDTH); + for (int i = 0; i < points.length(); i++) { + container += points[i]; + maxWidth = glm::max(maxWidth, i < widths.length() ? widths[i] : DEFAULT_LINE_WIDTH); + } + } else { + container = AABox(-0.5f * ENTITY_ITEM_DEFAULT_DIMENSIONS, ENTITY_ITEM_DEFAULT_WIDTH); + } - const float EPSILON = 0.0001f; - const float EPSILON_SQUARED = EPSILON * EPSILON; - const float HALF_LINE_WIDTH = 0.075f; // sadly _strokeWidths() don't seem to correspond to reality, so just use a flat assumption of the stroke width - const vec3 QUARTER_LINE_WIDTH { HALF_LINE_WIDTH * 0.5f }; - if (pointCount > 1 && magnitudeSquared > EPSILON_SQUARED) { - newScale = glm::abs(high) + glm::abs(low) + vec3(HALF_LINE_WIDTH); - // Center the poly line in the bounding box - glm::vec3 startPointInScaleSpace = firstPoint - low; - startPointInScaleSpace += QUARTER_LINE_WIDTH; - newRegistrationPoint = startPointInScaleSpace / newScale; - } + // Adjust the box to account for the line width, assuming the worst case + container.setScaleStayCentered(container.getScale() + 2.0f * maxWidth); - // if Polyline has only one or fewer points, use default dimension settings - setScaledDimensions(newScale); - EntityItem::setRegistrationPoint(newRegistrationPoint); + bool success; + glm::vec3 center = container.calcCenter(); + setWorldPosition(center + getCenterPosition(success)); + setScaledDimensions(container.getScale()); + withWriteLock([&] { + _polylineCenter = center; + }); } int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) { - - QWriteLocker lock(&_quadReadWriteLock); int bytesRead = 0; const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); - READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); - READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); - - READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); - READ_ENTITY_PROPERTY(PROP_STROKE_COLORS, QVector, setStrokeColors); - READ_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); + + READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); + READ_ENTITY_PROPERTY(PROP_STROKE_NORMALS, QVector, setNormals); + READ_ENTITY_PROPERTY(PROP_STROKE_COLORS, QVector, setStrokeColors); READ_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, bool, setIsUVModeStretch); + READ_ENTITY_PROPERTY(PROP_LINE_GLOW, bool, setGlow); + READ_ENTITY_PROPERTY(PROP_LINE_FACE_CAMERA, bool, setFaceCamera); return bytesRead; } @@ -219,14 +167,15 @@ int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da EntityPropertyFlags PolyLineEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); requestedProperties += PROP_COLOR; - requestedProperties += PROP_LINE_WIDTH; - requestedProperties += PROP_LINE_POINTS; - - requestedProperties += PROP_NORMALS; - requestedProperties += PROP_STROKE_COLORS; - requestedProperties += PROP_STROKE_WIDTHS; requestedProperties += PROP_TEXTURES; + + requestedProperties += PROP_LINE_POINTS; + requestedProperties += PROP_STROKE_WIDTHS; + requestedProperties += PROP_STROKE_NORMALS; + requestedProperties += PROP_STROKE_COLORS; requestedProperties += PROP_IS_UV_MODE_STRETCH; + requestedProperties += PROP_LINE_GLOW; + requestedProperties += PROP_LINE_FACE_CAMERA; return requestedProperties; } @@ -238,18 +187,18 @@ void PolyLineEntityItem::appendSubclassData(OctreePacketData* packetData, Encode int& propertyCount, OctreeElement::AppendState& appendState) const { - QWriteLocker lock(&_quadReadWriteLock); bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); - APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, getLineWidth()); - APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, getLinePoints()); - - APPEND_ENTITY_PROPERTY(PROP_NORMALS, getNormals()); - APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, getStrokeColors()); - APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, getStrokeWidths()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures()); + + APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, getLinePoints()); + APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, getStrokeWidths()); + APPEND_ENTITY_PROPERTY(PROP_STROKE_NORMALS, getNormals()); + APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, getStrokeColors()); APPEND_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, getIsUVModeStretch()); + APPEND_ENTITY_PROPERTY(PROP_LINE_GLOW, getGlow()); + APPEND_ENTITY_PROPERTY(PROP_LINE_FACE_CAMERA, getFaceCamera()); } void PolyLineEntityItem::debugDump() const { @@ -261,61 +210,49 @@ void PolyLineEntityItem::debugDump() const { qCDebug(entities) << " getLastEdited:" << debugTime(getLastEdited(), now); } - - QVector PolyLineEntityItem::getLinePoints() const { - QVector result; - withReadLock([&] { - result = _points; + return resultWithReadLock>([&] { + return _points; }); - return result; } QVector PolyLineEntityItem::getNormals() const { - QVector result; - withReadLock([&] { - result = _normals; + return resultWithReadLock>([&] { + return _normals; }); - return result; } QVector PolyLineEntityItem::getStrokeColors() const { - QVector result; - withReadLock([&] { - result = _strokeColors; + return resultWithReadLock>([&] { + return _colors; }); - return result; } QVector PolyLineEntityItem::getStrokeWidths() const { - QVector result; - withReadLock([&] { - result = _strokeWidths; + return resultWithReadLock>([&] { + return _widths; }); - return result; } QString PolyLineEntityItem::getTextures() const { - QString result; - withReadLock([&] { - result = _textures; + return resultWithReadLock([&] { + return _textures; }); - return result; } void PolyLineEntityItem::setTextures(const QString& textures) { withWriteLock([&] { if (_textures != textures) { _textures = textures; - _texturesChangedFlag = true; + _texturesChanged = true; } }); } void PolyLineEntityItem::setColor(const glm::u8vec3& value) { withWriteLock([&] { - _strokeColorsChanged = true; _color = value; + _colorsChanged = true; }); } diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h index f640bd7a9e..69afaf175c 100644 --- a/libraries/entities/src/PolyLineEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -44,38 +44,42 @@ class PolyLineEntityItem : public EntityItem { glm::u8vec3 getColor() const; void setColor(const glm::u8vec3& value); - void setLineWidth(float lineWidth){ _lineWidth = lineWidth; } - float getLineWidth() const{ return _lineWidth; } - - bool setLinePoints(const QVector& points); - bool appendPoint(const glm::vec3& point); + static const int MAX_POINTS_PER_LINE; + void setLinePoints(const QVector& points); QVector getLinePoints() const; - bool setNormals(const QVector& normals); + glm::vec3 getPolylineCenter() const { return _polylineCenter; } + + static const float DEFAULT_LINE_WIDTH; + void setStrokeWidths(const QVector& strokeWidths); + QVector getStrokeWidths() const; + + void setNormals(const QVector& normals); QVector getNormals() const; - bool setStrokeColors(const QVector& strokeColors); + void setStrokeColors(const QVector& strokeColors); QVector getStrokeColors() const; - bool setStrokeWidths(const QVector& strokeWidths); - QVector getStrokeWidths() const; - void setIsUVModeStretch(bool isUVModeStretch){ _isUVModeStretch = isUVModeStretch; } bool getIsUVModeStretch() const{ return _isUVModeStretch; } QString getTextures() const; void setTextures(const QString& textures); - virtual ShapeType getShapeType() const override { return SHAPE_TYPE_NONE; } + void setGlow(bool glow) { _glow = glow; } + bool getGlow() const { return _glow; } + + void setFaceCamera(bool faceCamera) { _faceCamera = faceCamera; } + bool getFaceCamera() const { return _faceCamera; } bool pointsChanged() const { return _pointsChanged; } bool normalsChanged() const { return _normalsChanged; } - bool strokeColorsChanged() const { return _strokeColorsChanged; } - bool strokeWidthsChanged() const { return _strokeWidthsChanged; } - bool texturesChanged() const { return _texturesChangedFlag; } - void resetTexturesChanged() { _texturesChangedFlag = false; } - void resetPolyLineChanged() { _strokeColorsChanged = _strokeWidthsChanged = _normalsChanged = _pointsChanged = false; } + bool colorsChanged() const { return _colorsChanged; } + bool widthsChanged() const { return _widthsChanged; } + bool texturesChanged() const { return _texturesChanged; } + void resetTexturesChanged() { _texturesChanged = false; } + void resetPolyLineChanged() { _colorsChanged = _widthsChanged = _normalsChanged = _pointsChanged = false; } // never have a ray intersection pick a PolyLineEntityItem. virtual bool supportsDetailedIntersection() const override { return true; } @@ -88,30 +92,27 @@ class PolyLineEntityItem : public EntityItem { BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override { return false; } - // disable these external interfaces as PolyLineEntities caculate their own dimensions based on the points they contain - virtual void setRegistrationPoint(const glm::vec3& value) override {}; // FIXME: this is suspicious! - virtual void debugDump() const override; - static const float DEFAULT_LINE_WIDTH; - static const int MAX_POINTS_PER_LINE; private: - void calculateScaleAndRegistrationPoint(); + void computeAndUpdateDimensionsAndPosition(); protected: glm::u8vec3 _color; - float _lineWidth { DEFAULT_LINE_WIDTH }; - bool _pointsChanged { true }; - bool _normalsChanged { true }; - bool _strokeColorsChanged { true }; - bool _strokeWidthsChanged { true }; QVector _points; + glm::vec3 _polylineCenter; QVector _normals; - QVector _strokeColors; - QVector _strokeWidths; + QVector _colors; + QVector _widths; QString _textures; bool _isUVModeStretch; - bool _texturesChangedFlag { false }; - mutable QReadWriteLock _quadReadWriteLock; + bool _glow; + bool _faceCamera; + + bool _pointsChanged { false }; + bool _normalsChanged { false }; + bool _colorsChanged { false }; + bool _widthsChanged { false }; + bool _texturesChanged { false }; }; #endif // hifi_PolyLineEntityItem_h diff --git a/libraries/entities/src/ShapeEntityItem.cpp b/libraries/entities/src/ShapeEntityItem.cpp index 08af12a289..88612c8be6 100644 --- a/libraries/entities/src/ShapeEntityItem.cpp +++ b/libraries/entities/src/ShapeEntityItem.cpp @@ -118,10 +118,10 @@ ShapeEntityItem::ShapeEntityItem(const EntityItemID& entityItemID) : EntityItem( EntityItemProperties ShapeEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class - properties.setShape(entity::stringFromShape(getShape())); - properties._shapeChanged = false; COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha); + properties.setShape(entity::stringFromShape(getShape())); + properties._shapeChanged = false; return properties; } @@ -158,9 +158,9 @@ void ShapeEntityItem::setShape(const entity::Shape& shape) { bool ShapeEntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class - SET_ENTITY_PROPERTY_FROM_PROPERTIES(shape, setShape); SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(shape, setShape); if (somethingChanged) { bool wantDebug = false; @@ -183,18 +183,18 @@ int ShapeEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_SHAPE, QString, setShape); READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); READ_ENTITY_PROPERTY(PROP_ALPHA, float, setAlpha); + READ_ENTITY_PROPERTY(PROP_SHAPE, QString, setShape); return bytesRead; } EntityPropertyFlags ShapeEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); - requestedProperties += PROP_SHAPE; requestedProperties += PROP_COLOR; requestedProperties += PROP_ALPHA; + requestedProperties += PROP_SHAPE; return requestedProperties; } @@ -207,9 +207,9 @@ void ShapeEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit OctreeElement::AppendState& appendState) const { bool successPropertyFits = true; - APPEND_ENTITY_PROPERTY(PROP_SHAPE, entity::stringFromShape(getShape())); APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); APPEND_ENTITY_PROPERTY(PROP_ALPHA, getAlpha()); + APPEND_ENTITY_PROPERTY(PROP_SHAPE, entity::stringFromShape(getShape())); } void ShapeEntityItem::setColor(const glm::u8vec3& value) { diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index ffd1dbba40..a265fe16cd 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -48,6 +48,9 @@ ZoneEntityItem::ZoneEntityItem(const EntityItemID& entityItemID) : EntityItem(en EntityItemProperties ZoneEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class + COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); + // Contain QString properties, must be synchronized withReadLock([&] { _keyLightProperties.getProperties(properties); @@ -57,9 +60,6 @@ EntityItemProperties ZoneEntityItem::getProperties(const EntityPropertyFlags& de _hazeProperties.getProperties(properties); _bloomProperties.getProperties(properties); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(flyingAllowed, getFlyingAllowed); COPY_ENTITY_PROPERTY_TO_PROPERTIES(ghostingAllowed, getGhostingAllowed); COPY_ENTITY_PROPERTY_TO_PROPERTIES(filterURL, getFilterURL); @@ -94,6 +94,9 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { bool ZoneEntityItem::setSubClassProperties(const EntityItemProperties& properties) { bool somethingChanged = EntityItem::setSubClassProperties(properties); // set the properties in our base class + SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, setShapeType); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); + // Contains a QString property, must be synchronized withWriteLock([&] { _keyLightPropertiesChanged = _keyLightProperties.setProperties(properties); @@ -103,9 +106,6 @@ bool ZoneEntityItem::setSubClassProperties(const EntityItemProperties& propertie _hazePropertiesChanged = _hazeProperties.setProperties(properties); _bloomPropertiesChanged = _bloomProperties.setProperties(properties); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, setShapeType); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(flyingAllowed, setFlyingAllowed); SET_ENTITY_PROPERTY_FROM_PROPERTIES(ghostingAllowed, setGhostingAllowed); SET_ENTITY_PROPERTY_FROM_PROPERTIES(filterURL, setFilterURL); @@ -129,6 +129,9 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesRead = 0; const unsigned char* dataAt = data; + READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType); + READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); + { int bytesFromKeylight; withWriteLock([&] { @@ -178,9 +181,6 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, dataAt += bytesFromBloom; } - READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType); - READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); - READ_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, bool, setFlyingAllowed); READ_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, bool, setGhostingAllowed); READ_ENTITY_PROPERTY(PROP_FILTER_URL, QString, setFilterURL); @@ -197,15 +197,15 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, EntityPropertyFlags ZoneEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); + requestedProperties += PROP_SHAPE_TYPE; + requestedProperties += PROP_COMPOUND_SHAPE_URL; + requestedProperties += _keyLightProperties.getEntityProperties(params); requestedProperties += _ambientLightProperties.getEntityProperties(params); requestedProperties += _skyboxProperties.getEntityProperties(params); requestedProperties += _hazeProperties.getEntityProperties(params); requestedProperties += _bloomProperties.getEntityProperties(params); - requestedProperties += PROP_SHAPE_TYPE; - requestedProperties += PROP_COMPOUND_SHAPE_URL; - requestedProperties += PROP_FLYING_ALLOWED; requestedProperties += PROP_GHOSTING_ALLOWED; requestedProperties += PROP_FILTER_URL; @@ -229,6 +229,9 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits bool successPropertyFits = true; + APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); + APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL()); + withReadLock([&] { _keyLightProperties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); @@ -242,9 +245,6 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits _bloomProperties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); - APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); - APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL()); - APPEND_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, getFlyingAllowed()); APPEND_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, getGhostingAllowed()); APPEND_ENTITY_PROPERTY(PROP_FILTER_URL, getFilterURL()); diff --git a/libraries/render-utils/src/glowLine.slv b/libraries/render-utils/src/glowLine.slv index 3471bc2f98..1bcb25817c 100644 --- a/libraries/render-utils/src/glowLine.slv +++ b/libraries/render-utils/src/glowLine.slv @@ -49,7 +49,7 @@ void main(void) { vec3 orthogonal = cross(v1, v2) * _lineData.width; // Deteremine which end to emit based on the vertex id (even / odd) - vec4 eye = (0 == gl_VertexID % 2) ? p1eye : p2eye; + vec4 eye = mix(p2eye, p1eye, float(gl_VertexID % 2 == 0)); // Add or subtract the orthogonal vector based on a different vertex ID // calculation diff --git a/libraries/shared/src/AABox.cpp b/libraries/shared/src/AABox.cpp index ff6c2a4e6e..6ff290f9f2 100644 --- a/libraries/shared/src/AABox.cpp +++ b/libraries/shared/src/AABox.cpp @@ -480,7 +480,7 @@ void AABox::embiggen(const glm::vec3& scale) { } void AABox::setScaleStayCentered(const glm::vec3& scale) { - _corner += -0.5f * scale; + _corner -= 0.5f * (scale - _scale); _scale = scale; } From 6094a2f0a06c32e07d8d5fb5b0fb37c90fdb0cae Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 14 Dec 2018 14:56:44 -0800 Subject: [PATCH 4/4] add back line entities, undo polyline changes temporarily --- .../src/RenderableEntityItem.cpp | 5 + .../src/RenderableLineEntityItem.cpp | 61 +++ .../src/RenderableLineEntityItem.h | 42 ++ .../src/RenderablePolyLineEntityItem.cpp | 362 ++++++++++-------- .../src/RenderablePolyLineEntityItem.h | 54 ++- .../entities-renderer/src/paintStroke.slf | 32 +- .../entities-renderer/src/paintStroke.slh | 48 --- .../entities-renderer/src/paintStroke.slv | 46 +-- .../src/paintStroke_Shared.slh | 25 -- .../src/paintStroke_fade.slf | 52 +++ .../src/paintStroke_fade.slv | 43 +++ .../entities/src/EntityItemProperties.cpp | 71 ++-- libraries/entities/src/EntityItemProperties.h | 4 +- libraries/entities/src/EntityPropertyFlags.h | 2 - .../entities/src/EntityScriptingInterface.cpp | 83 ++++ .../entities/src/EntityScriptingInterface.h | 65 ++++ libraries/entities/src/EntityTypes.cpp | 2 + libraries/entities/src/EntityTypes.h | 3 + libraries/entities/src/LineEntityItem.cpp | 175 +++++++++ libraries/entities/src/LineEntityItem.h | 77 ++++ libraries/entities/src/PolyLineEntityItem.cpp | 179 ++++++--- libraries/entities/src/PolyLineEntityItem.h | 59 ++- .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 2 +- 24 files changed, 1061 insertions(+), 433 deletions(-) create mode 100644 libraries/entities-renderer/src/RenderableLineEntityItem.cpp create mode 100644 libraries/entities-renderer/src/RenderableLineEntityItem.h delete mode 100644 libraries/entities-renderer/src/paintStroke.slh delete mode 100644 libraries/entities-renderer/src/paintStroke_Shared.slh create mode 100644 libraries/entities-renderer/src/paintStroke_fade.slf create mode 100644 libraries/entities-renderer/src/paintStroke_fade.slv create mode 100644 libraries/entities/src/LineEntityItem.cpp create mode 100644 libraries/entities/src/LineEntityItem.h diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index dec4af2d93..5fb5a15d2c 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -15,6 +15,7 @@ #include #include "RenderableLightEntityItem.h" +#include "RenderableLineEntityItem.h" #include "RenderableModelEntityItem.h" #include "RenderableParticleEffectEntityItem.h" #include "RenderablePolyVoxEntityItem.h" @@ -247,6 +248,10 @@ EntityRenderer::Pointer EntityRenderer::addToScene(EntityTreeRenderer& renderer, result = make_renderer(entity); break; + case Type::Line: + result = make_renderer(entity); + break; + case Type::PolyLine: result = make_renderer(entity); break; diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp new file mode 100644 index 0000000000..9c5424950a --- /dev/null +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp @@ -0,0 +1,61 @@ +// +// RenderableLineEntityItem.cpp +// libraries/entities-renderer/src/ +// +// Created by Seth Alves on 5/11/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "RenderableLineEntityItem.h" + +#include +#include + +using namespace render; +using namespace render::entities; + +void LineEntityRenderer::onRemoveFromSceneTyped(const TypedEntityPointer& entity) { + if (_lineVerticesID != GeometryCache::UNKNOWN_ID) { + auto geometryCache = DependencyManager::get(); + if (geometryCache) { + geometryCache->releaseID(_lineVerticesID); + } + } +} + +bool LineEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const { + return entity->pointsChanged(); +} + +void LineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) { + entity->resetPointsChanged(); + _linePoints = entity->getLinePoints(); + auto geometryCache = DependencyManager::get(); + if (_lineVerticesID == GeometryCache::UNKNOWN_ID) { + _lineVerticesID = geometryCache->allocateID(); + } + glm::vec4 lineColor(toGlm(entity->getColor()), 1.0f); + geometryCache->updateVertices(_lineVerticesID, _linePoints, lineColor); +} + +void LineEntityRenderer::doRender(RenderArgs* args) { + if (_lineVerticesID == GeometryCache::UNKNOWN_ID) { + return; + } + + PerformanceTimer perfTimer("RenderableLineEntityItem::render"); + Q_ASSERT(args->_batch); + gpu::Batch& batch = *args->_batch; + const auto& modelTransform = getModelTransform(); + Transform transform = Transform(); + transform.setTranslation(modelTransform.getTranslation()); + transform.setRotation(modelTransform.getRotation()); + batch.setModelTransform(transform); + if (_linePoints.size() > 1) { + DependencyManager::get()->bindSimpleProgram(batch); + DependencyManager::get()->renderVertices(batch, gpu::LINE_STRIP, _lineVerticesID); + } +} diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.h b/libraries/entities-renderer/src/RenderableLineEntityItem.h new file mode 100644 index 0000000000..799ba5b78c --- /dev/null +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.h @@ -0,0 +1,42 @@ +// +// RenderableLineEntityItem.h +// libraries/entities-renderer/src/ +// +// Created by Seth Alves on 5/11/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_RenderableLineEntityItem_h +#define hifi_RenderableLineEntityItem_h + +#include "RenderableEntityItem.h" +#include +#include + + +namespace render { namespace entities { + +class LineEntityRenderer : public TypedEntityRenderer { + using Parent = TypedEntityRenderer; + friend class EntityRenderer; + +public: + LineEntityRenderer(const EntityItemPointer& entity) : Parent(entity) { } + +protected: + virtual void onRemoveFromSceneTyped(const TypedEntityPointer& entity) override; + virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override; + virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override; + virtual void doRender(RenderArgs* args) override; + +private: + int _lineVerticesID { GeometryCache::UNKNOWN_ID }; + QVector _linePoints; +}; + +} } // namespace + +#endif // hifi_RenderableLineEntityItem_h diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 4a665bf666..0d9e948db8 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -19,35 +19,66 @@ #include #include -#include "paintStroke_shared.slh" +//#define POLYLINE_ENTITY_USE_FADE_EFFECT +#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT +# include +#endif using namespace render; using namespace render::entities; -gpu::PipelinePointer PolyLineEntityRenderer::_pipeline = nullptr; +static uint8_t CUSTOM_PIPELINE_NUMBER { 0 }; +static const int32_t PAINTSTROKE_TEXTURE_SLOT { 0 }; +static gpu::Stream::FormatPointer polylineFormat; +static gpu::PipelinePointer polylinePipeline; +#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT +static gpu::PipelinePointer polylineFadePipeline; +#endif -static const QUrl DEFAULT_POLYLINE_TEXTURE = QUrl(PathUtils::resourcesPath() + "images/paintStroke.png"); +static render::ShapePipelinePointer shapePipelineFactory(const render::ShapePlumber& plumber, const render::ShapeKey& key, gpu::Batch& batch) { + if (!polylinePipeline) { + gpu::ShaderPointer program = gpu::Shader::createProgram(shader::entities_renderer::program::paintStroke); +#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT + auto fadeVS = gpu::Shader::createVertex(std::string(paintStroke_fade_vert)); + auto fadePS = gpu::Shader::createPixel(std::string(paintStroke_fade_frag)); + gpu::ShaderPointer fadeProgram = gpu::Shader::createProgram(fadeVS, fadePS); +#endif + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + state->setDepthTest(true, true, gpu::LESS_EQUAL); + PrepareStencil::testMask(*state); + state->setBlendFunction(true, + gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); + polylinePipeline = gpu::Pipeline::create(program, state); +#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT + _fadePipeline = gpu::Pipeline::create(fadeProgram, state); +#endif + } -PolyLineEntityRenderer::PolyLineEntityRenderer(const EntityItemPointer& entity) : Parent(entity) { - _texture = DependencyManager::get()->getTexture(DEFAULT_POLYLINE_TEXTURE); - - _polylineGeometryBuffer = std::make_shared(); - - _polylineDataBuffer = std::make_shared(); - _polylineDataBuffer->resize(sizeof(PolylineData)); +#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT + if (key.isFaded()) { + auto fadeEffect = DependencyManager::get(); + return std::make_shared(_fadePipeline, nullptr, fadeEffect->getBatchSetter(), fadeEffect->getItemUniformSetter()); + } else { +#endif + return std::make_shared(polylinePipeline, nullptr, nullptr, nullptr); +#ifdef POLYLINE_ENTITY_USE_FADE_EFFECT + } +#endif } -void PolyLineEntityRenderer::buildPipeline() { - // FIXME: opaque pipeline - gpu::ShaderPointer program = gpu::Shader::createProgram(shader::entities_renderer::program::paintStroke); - gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - state->setCullMode(gpu::State::CullMode::CULL_NONE); - state->setDepthTest(true, true, gpu::LESS_EQUAL); - PrepareStencil::testMask(*state); - state->setBlendFunction(true, - gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, - gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); - _pipeline = gpu::Pipeline::create(program, state); +PolyLineEntityRenderer::PolyLineEntityRenderer(const EntityItemPointer& entity) : Parent(entity) { + static std::once_flag once; + std::call_once(once, [&] { + CUSTOM_PIPELINE_NUMBER = render::ShapePipeline::registerCustomShapePipelineFactory(shapePipelineFactory); + polylineFormat.reset(new gpu::Stream::Format()); + polylineFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), offsetof(Vertex, position)); + polylineFormat->setAttribute(gpu::Stream::NORMAL, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), offsetof(Vertex, normal)); + polylineFormat->setAttribute(gpu::Stream::TEXCOORD, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV), offsetof(Vertex, uv)); + polylineFormat->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RGB), offsetof(Vertex, color)); + }); + + _verticesBuffer = std::make_shared(); } ItemKey PolyLineEntityRenderer::getKey() { @@ -55,165 +86,152 @@ ItemKey PolyLineEntityRenderer::getKey() { } ShapeKey PolyLineEntityRenderer::getShapeKey() { - return ShapeKey::Builder().withOwnPipeline().withTranslucent().withoutCullFace(); -} - -bool PolyLineEntityRenderer::needsRenderUpdate() const { - bool textureLoadedChanged = resultWithReadLock([&] { - return (!_textureLoaded && _texture && _texture->isLoaded()); - }); - - if (textureLoadedChanged) { - return true; - } - - return Parent::needsRenderUpdate(); + return ShapeKey::Builder().withCustom(CUSTOM_PIPELINE_NUMBER).build(); } bool PolyLineEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const { return ( entity->pointsChanged() || - entity->widthsChanged() || + entity->strokeWidthsChanged() || entity->normalsChanged() || entity->texturesChanged() || - entity->colorsChanged() || - _isUVModeStretch != entity->getIsUVModeStretch() || - _glow != entity->getGlow() || - _faceCamera != entity->getFaceCamera() + entity->strokeColorsChanged() ); } -void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) { - auto pointsChanged = entity->pointsChanged(); - auto widthsChanged = entity->widthsChanged(); - auto normalsChanged = entity->normalsChanged(); - auto colorsChanged = entity->colorsChanged(); - - bool isUVModeStretch = entity->getIsUVModeStretch(); - bool glow = entity->getGlow(); - bool faceCamera = entity->getFaceCamera(); - - entity->resetPolyLineChanged(); - - // Transform - _renderTransform = Transform(); - _renderTransform.setTranslation(entity->getWorldPosition() - entity->getPolylineCenter()); - _renderTransform.setRotation(entity->getWorldOrientation()); - - // Textures +void PolyLineEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) { + static const QUrl DEFAULT_POLYLINE_TEXTURE = QUrl(PathUtils::resourcesPath() + "images/paintStroke.png"); + QUrl entityTextures = DEFAULT_POLYLINE_TEXTURE; if (entity->texturesChanged()) { entity->resetTexturesChanged(); - QUrl entityTextures = DEFAULT_POLYLINE_TEXTURE; auto textures = entity->getTextures(); if (!textures.isEmpty()) { entityTextures = QUrl(textures); } _texture = DependencyManager::get()->getTexture(entityTextures); - _textureAspectRatio = 1.0f; - _textureLoaded = false; } - - bool textureChanged = false; - if (!_textureLoaded && _texture && _texture->isLoaded()) { - textureChanged = true; - _textureAspectRatio = (float)_texture->getOriginalHeight() / (float)_texture->getOriginalWidth(); - _textureLoaded = true; - } - - // Geometry - if (pointsChanged) { - _points = entity->getLinePoints(); - } - if (widthsChanged) { - _widths = entity->getStrokeWidths(); - } - if (normalsChanged) { - _normals = entity->getNormals(); - } - if (colorsChanged) { - _colors = entity->getStrokeColors(); - _color = toGlm(entity->getColor()); - } - if (_isUVModeStretch != isUVModeStretch || pointsChanged || widthsChanged || normalsChanged || colorsChanged || textureChanged) { - _isUVModeStretch = isUVModeStretch; - updateGeometry(); - } - - // Data - if (faceCamera != _faceCamera || glow != _glow) { - _faceCamera = faceCamera; - _glow = glow; - updateData(); + + + if (!_texture) { + _texture = DependencyManager::get()->getTexture(entityTextures); } } -void PolyLineEntityRenderer::updateGeometry() { - int maxNumVertices = std::min(_points.length(), _normals.length()); +void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) { + auto pointsChanged = entity->pointsChanged(); + auto strokeWidthsChanged = entity->strokeWidthsChanged(); + auto normalsChanged = entity->normalsChanged(); + auto strokeColorsChanged = entity->strokeColorsChanged(); + + bool isUVModeStretch = entity->getIsUVModeStretch(); + entity->resetPolyLineChanged(); + + _polylineTransform = Transform(); + _polylineTransform.setTranslation(entity->getWorldPosition()); + _polylineTransform.setRotation(entity->getWorldOrientation()); + + if (pointsChanged) { + _lastPoints = entity->getLinePoints(); + } + if (strokeWidthsChanged) { + _lastStrokeWidths = entity->getStrokeWidths(); + } + if (normalsChanged) { + _lastNormals = entity->getNormals(); + } + if (strokeColorsChanged) { + _lastStrokeColors = entity->getStrokeColors(); + _lastStrokeColors = _lastNormals.size() == _lastStrokeColors.size() ? _lastStrokeColors : QVector({ toGlm(entity->getColor()) }); + } + if (pointsChanged || strokeWidthsChanged || normalsChanged || strokeColorsChanged) { + _empty = std::min(_lastPoints.size(), std::min(_lastNormals.size(), _lastStrokeWidths.size())) < 2; + if (!_empty) { + updateGeometry(updateVertices(_lastPoints, _lastNormals, _lastStrokeWidths, _lastStrokeColors, isUVModeStretch, _textureAspectRatio)); + } + } +} + +void PolyLineEntityRenderer::updateGeometry(const std::vector& vertices) { + _numVertices = (uint32_t)vertices.size(); + auto bufferSize = _numVertices * sizeof(Vertex); + if (bufferSize > _verticesBuffer->getSize()) { + _verticesBuffer->resize(bufferSize); + } + _verticesBuffer->setSubData(0, vertices); +} + +std::vector PolyLineEntityRenderer::updateVertices(const QVector& points, + const QVector& normals, + const QVector& strokeWidths, + const QVector& strokeColors, + const bool isUVModeStretch, + const float textureAspectRatio) { + // Calculate the minimum vector size out of normals, points, and stroke widths + int size = std::min(points.size(), std::min(normals.size(), strokeWidths.size())); + + std::vector vertices; + + // Guard against an empty polyline + if (size <= 0) { + return vertices; + } + + float uCoordInc = 1.0f / size; + float uCoord = 0.0f; + int finalIndex = size - 1; + glm::vec3 binormal; + float accumulatedDistance = 0.0f; + float distanceToLastPoint = 0.0f; + float accumulatedStrokeWidth = 0.0f; + float strokeWidth = 0.0f; bool doesStrokeWidthVary = false; - if (_widths.size() >= 0) { - for (int i = 1; i < maxNumVertices; i++) { - float width = PolyLineEntityItem::DEFAULT_LINE_WIDTH; - if (i < _widths.length()) { - width = _widths[i]; - } - if (width != _widths[i - 1]) { - doesStrokeWidthVary = true; - break; - } + + + for (int i = 1; i < strokeWidths.size(); i++) { + if (strokeWidths[i] != strokeWidths[i - 1]) { + doesStrokeWidthVary = true; + break; } } - float uCoordInc = 1.0f / maxNumVertices; - float uCoord = 0.0f; - float accumulatedDistance = 0.0f; - float accumulatedStrokeWidth = 0.0f; - glm::vec3 binormal; + for (int i = 0; i <= finalIndex; i++) { + const float& width = strokeWidths.at(i); + const auto& point = points.at(i); + const auto& normal = normals.at(i); + const auto& color = strokeColors.size() == normals.size() ? strokeColors.at(i) : strokeColors.at(0); + int vertexIndex = i * 2; + - std::vector vertices; - vertices.reserve(maxNumVertices); - for (int i = 0; i < maxNumVertices; i++) { - // Position - glm::vec3 point = _points[i]; + if (!isUVModeStretch && i >= 1) { + distanceToLastPoint = glm::distance(points.at(i), points.at(i - 1)); + accumulatedDistance += distanceToLastPoint; + strokeWidth = 2 * strokeWidths[i]; - // uCoord - float width = i < _widths.size() ? _widths[i] : PolyLineEntityItem::DEFAULT_LINE_WIDTH; - if (i > 0) { // First uCoord is 0.0f - if (!_isUVModeStretch) { - accumulatedDistance += glm::distance(point, _points[i - 1]); - - if (doesStrokeWidthVary) { - //If the stroke varies along the line the texture will stretch more or less depending on the speed - //because it looks better than using the same method as below - accumulatedStrokeWidth += width; - float increaseValue = 1; - if (accumulatedStrokeWidth != 0) { - float newUcoord = glm::ceil((_textureAspectRatio * accumulatedDistance) / (accumulatedStrokeWidth / i)); - increaseValue = newUcoord - uCoord; - } - - increaseValue = increaseValue > 0 ? increaseValue : 1; - uCoord += increaseValue; - } else { - // If the stroke width is constant then the textures should keep the aspect ratio along the line - uCoord = (_textureAspectRatio * accumulatedDistance) / width; + if (doesStrokeWidthVary) { + //If the stroke varies along the line the texture will stretch more or less depending on the speed + //because it looks better than using the same method as below + accumulatedStrokeWidth += strokeWidth; + float increaseValue = 1; + if (accumulatedStrokeWidth != 0) { + float newUcoord = glm::ceil(((1.0f / textureAspectRatio) * accumulatedDistance) / (accumulatedStrokeWidth / i)); + increaseValue = newUcoord - uCoord; } + + increaseValue = increaseValue > 0 ? increaseValue : 1; + uCoord += increaseValue; } else { - uCoord += uCoordInc; + //If the stroke width is constant then the textures should keep the aspect ratio along the line + uCoord = ((1.0f / textureAspectRatio) * accumulatedDistance) / strokeWidth; } + } else if (vertexIndex >= 2) { + uCoord += uCoordInc; } - // Color - glm::vec3 color = i < _colors.length() ? _colors[i] : _color; - - // Normal - glm::vec3 normal = _normals[i]; - - // Binormal // For last point we can assume binormals are the same since it represents the last two vertices of quad - if (i < maxNumVertices - 1) { - glm::vec3 tangent = _points[i + 1] - point; - binormal = glm::normalize(glm::cross(tangent, normal)); + if (i < finalIndex) { + const auto tangent = points.at(i + 1) - point; + binormal = glm::normalize(glm::cross(tangent, normal)) * width; // Check to make sure binormal is not a NAN. If it is, don't add to vertices vector if (binormal.x != binormal.x) { @@ -221,36 +239,54 @@ void PolyLineEntityRenderer::updateGeometry() { } } - PolylineVertex vertex = { glm::vec4(point, uCoord), glm::vec4(color, 1.0f), glm::vec4(normal, 0.0f), glm::vec4(binormal, 0.5f * width) }; - vertices.push_back(vertex); + const auto v1 = points.at(i) + binormal; + const auto v2 = points.at(i) - binormal; + vertices.emplace_back(v1, normal, vec2(uCoord, 0.0f), color); + vertices.emplace_back(v2, normal, vec2(uCoord, 1.0f), color); } - _numVertices = vertices.size(); - _polylineGeometryBuffer->setData(vertices.size() * sizeof(PolylineVertex), (const gpu::Byte*) vertices.data()); + return vertices; } -void PolyLineEntityRenderer::updateData() { - PolylineData data { glm::vec2(_faceCamera, _glow), glm::vec2(0.0f) }; - _polylineDataBuffer->setSubData(0, data); +scriptable::ScriptableModelBase PolyLineEntityRenderer::getScriptableModel() { + // TODO: adapt polyline into a triangles mesh... + return EntityRenderer::getScriptableModel(); } void PolyLineEntityRenderer::doRender(RenderArgs* args) { - if (_numVertices < 2) { + if (_empty) { return; } PerformanceTimer perfTimer("RenderablePolyLineEntityItem::render"); Q_ASSERT(args->_batch); - gpu::Batch& batch = *args->_batch; - if (!_pipeline) { - buildPipeline(); + gpu::Batch& batch = *args->_batch; + batch.setModelTransform(_polylineTransform); + + if (_texture && _texture->isLoaded()) { + batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, _texture->getGPUTexture()); + } else { + batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, DependencyManager::get()->getWhiteTexture()); } - batch.setPipeline(_pipeline); - batch.setModelTransform(_renderTransform); - batch.setResourceTexture(0, _textureLoaded ? _texture->getGPUTexture() : DependencyManager::get()->getWhiteTexture()); - batch.setResourceBuffer(0, _polylineGeometryBuffer); - batch.setUniformBuffer(0, _polylineDataBuffer); - batch.draw(gpu::TRIANGLE_STRIP, 2 * _numVertices, 0); + float textureWidth = (float)_texture->getOriginalWidth(); + float textureHeight = (float)_texture->getOriginalHeight(); + if (textureWidth != 0 && textureHeight != 0) { + _textureAspectRatio = textureWidth / textureHeight; + } + + batch.setInputFormat(polylineFormat); + batch.setInputBuffer(0, _verticesBuffer, 0, sizeof(Vertex)); + +#ifndef POLYLINE_ENTITY_USE_FADE_EFFECT + // glColor4f must be called after setInputFormat if it must be taken into account + if (_isFading) { + batch._glColor4f(1.0f, 1.0f, 1.0f, Interpolate::calculateFadeRatio(_fadeStartTime)); + } else { + batch._glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + } +#endif + + batch.draw(gpu::TRIANGLE_STRIP, _numVertices, 0); } diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index 635a456ac9..8130171da8 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -25,40 +25,52 @@ class PolyLineEntityRenderer : public TypedEntityRenderer { public: PolyLineEntityRenderer(const EntityItemPointer& entity); - // FIXME: shouldn't always be transparent: take into account texture and glow - virtual bool isTransparent() const override { return true; } - + virtual scriptable::ScriptableModelBase getScriptableModel() override; protected: - virtual bool needsRenderUpdate() const override; virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override; + virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, + Transaction& transaction, + const TypedEntityPointer& entity) override; virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override; virtual ItemKey getKey() override; virtual ShapeKey getShapeKey() override; virtual void doRender(RenderArgs* args) override; - void buildPipeline(); - void updateGeometry(); - void updateData(); + virtual bool isTransparent() const override { return true; } - QVector _points; - QVector _normals; - QVector _colors; - glm::vec3 _color; - QVector _widths; + struct Vertex { + Vertex() {} + Vertex(const vec3& position, const vec3& normal, const vec2& uv, const vec3& color) : position(position), + normal(normal), + uv(uv), + color(color) {} + vec3 position; + vec3 normal; + vec2 uv; + vec3 color; + }; + void updateGeometry(const std::vector& vertices); + static std::vector updateVertices(const QVector& points, + const QVector& normals, + const QVector& strokeWidths, + const QVector& strokeColors, + const bool isUVModeStretch, + const float textureAspectRatio); + + Transform _polylineTransform; + QVector _lastPoints; + QVector _lastNormals; + QVector _lastStrokeColors; + QVector _lastStrokeWidths; + gpu::BufferPointer _verticesBuffer; + + uint32_t _numVertices { 0 }; + bool _empty{ true }; NetworkTexturePointer _texture; float _textureAspectRatio { 1.0f }; - bool _textureLoaded { false }; - bool _isUVModeStretch; - bool _faceCamera; - bool _glow; - - int _numVertices; - gpu::BufferPointer _polylineDataBuffer; - gpu::BufferPointer _polylineGeometryBuffer; - static gpu::PipelinePointer _pipeline; }; } } // namespace diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index 6ea088751f..f2c0d5572d 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -14,27 +14,21 @@ <@include DeferredBufferWrite.slh@> -<@include paintStroke.slh@> -<$declarePolyLineBuffers()$> +// the albedo texture +LAYOUT(binding=0) uniform sampler2D originalTexture; -LAYOUT(binding=0) uniform sampler2D _texture; - -layout(location=0) in vec3 _normalWS; -layout(location=1) in vec2 _texCoord; -layout(location=2) in vec4 _color; -layout(location=3) in float _distanceFromCenter; +// the interpolated normal +layout(location=0) in vec3 interpolatedNormal; +layout(location=1) in vec2 varTexcoord; +layout(location=2) in vec4 varColor; void main(void) { - vec4 texel = texture(_texture, _texCoord); - int frontCondition = 1 - 2 * int(gl_FrontFacing); - vec3 color = _color.rgb * texel.rgb; - float alpha = texel.a * _color.a; - - alpha *= mix(1.0, pow(1.0 - abs(_distanceFromCenter), 10.0), _polylineData.faceCameraGlow.y); - + vec4 texel = texture(originalTexture, varTexcoord); + int frontCondition = 1 -int(gl_FrontFacing) * 2; + vec3 color = varColor.rgb; packDeferredFragmentTranslucent( - float(frontCondition) * _normalWS, - alpha, - color, - DEFAULT_ROUGHNESS); + float(frontCondition) * interpolatedNormal, + texel.a * varColor.a, + color * texel.rgb, + 10.0); } diff --git a/libraries/entities-renderer/src/paintStroke.slh b/libraries/entities-renderer/src/paintStroke.slh deleted file mode 100644 index 6189ac461b..0000000000 --- a/libraries/entities-renderer/src/paintStroke.slh +++ /dev/null @@ -1,48 +0,0 @@ - - -<@if not PAINTSTROKE_SLH@> -<@def PAINTSTROKE_SLH@> - -<@include paintStroke_Shared.slh@> -<@include gpu/ShaderConstants.h@> - -<@func declarePolyLineBuffers() @> - -// Hack comment to absorb the extra '//' scribe prepends - -#if !defined(GPU_SSBO_TRANSFORM_OBJECT) -LAYOUT(binding=GPU_RESOURCE_BUFFER_SLOT0_TEXTURE) uniform samplerBuffer polylineVerticesBuffer; -PolylineVertex getPolylineVertex(int i) { - int offset = 4 * i; - PolylineVertex vertex; - vertex.positionAndUCoord = texelFetch(polylineVerticesBuffer, offset); - vertex.color = texelFetch(polylineVerticesBuffer, offset + 1); - vertex.normal = texelFetch(polylineVerticesBuffer, offset + 2); - vertex.binormalAndHalfWidth = texelFetch(polylineVerticesBuffer, offset + 3); - return vertex; -} -#else -LAYOUT_STD140(binding=GPU_RESOURCE_BUFFER_SLOT0_STORAGE) buffer polylineVerticesBuffer { - PolylineVertex _vertices[]; -}; -PolylineVertex getPolylineVertex(int i) { - PolylineVertex vertex = _vertices[i]; - return vertex; -} -#endif - -LAYOUT_STD140(binding=0) uniform polylineDataBuffer { - PolylineData _polylineData; -}; - -<@endfunc@> - -<@endif@> diff --git a/libraries/entities-renderer/src/paintStroke.slv b/libraries/entities-renderer/src/paintStroke.slv index c033d2c247..ecf52d61cf 100644 --- a/libraries/entities-renderer/src/paintStroke.slv +++ b/libraries/entities-renderer/src/paintStroke.slv @@ -17,45 +17,23 @@ <@include gpu/Transform.slh@> <$declareStandardTransform()$> -<@include paintStroke.slh@> -<$declarePolyLineBuffers()$> +// the interpolated normal +layout(location=0) out vec3 interpolatedNormal; -layout(location=0) out vec3 _normalWS; -layout(location=1) out vec2 _texCoord; -layout(location=2) out vec4 _color; -layout(location=3) out float _distanceFromCenter; +//the diffuse texture +layout(location=1) out vec2 varTexcoord; + +layout(location=2) out vec4 varColor; void main(void) { - PolylineVertex vertex = getPolylineVertex(gl_VertexID / 2); - float evenVertex = float(gl_VertexID % 2 == 0); + varTexcoord = inTexCoord0.st; - _texCoord = vec2(vertex.positionAndUCoord.w, mix(1.0, 0.0, evenVertex)); - _color = color_sRGBAToLinear(vertex.color); + // pass along the diffuse color + varColor = color_sRGBAToLinear(inColor); + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - _distanceFromCenter = -1.0 + 2.0 * evenVertex; - vec4 position = vec4(vertex.positionAndUCoord.xyz, 1.0); - vec3 normal = vertex.normal.xyz; - vec3 binormal = vertex.binormalAndHalfWidth.xyz; - if (_polylineData.faceCameraGlow.x != 0.0) { - vec4 posEye; - vec3 normalEye; - vec3 binormalEye; - <$transformModelToEyePos(cam, obj, position, posEye)$> - <$transformModelToEyeDir(cam, obj, normal, normalEye)$> - <$transformModelToEyeDir(cam, obj, binormal, binormalEye)$> - - vec3 tangentEye = cross(binormalEye, normalEye); - // new normal faces the camera - normalEye = normalize(posEye.xyz); - binormalEye = normalize(cross(normalEye, tangentEye)); - posEye.xyz += _distanceFromCenter * vertex.binormalAndHalfWidth.w * binormalEye; - <$transformEyeToClipPos(cam, posEye, gl_Position)$> - <$transformEyeToWorldDir(cam, normalEye, _normalWS)$> - } else { - position.xyz += _distanceFromCenter * vertex.binormalAndHalfWidth.w * binormal; - <$transformModelToClipPos(cam, obj, position, gl_Position)$> - <$transformModelToWorldDir(cam, obj, normal, _normalWS)$> - } + <$transformModelToClipPos(cam, obj, inPosition, gl_Position)$> + <$transformModelToEyeDir(cam, obj, inNormal.xyz, interpolatedNormal)$> } \ No newline at end of file diff --git a/libraries/entities-renderer/src/paintStroke_Shared.slh b/libraries/entities-renderer/src/paintStroke_Shared.slh deleted file mode 100644 index 460f6c6042..0000000000 --- a/libraries/entities-renderer/src/paintStroke_Shared.slh +++ /dev/null @@ -1,25 +0,0 @@ -// glsl / C++ compatible source as interface for FadeEffect -#ifdef __cplusplus -# define _VEC4 glm::vec4 -# define _VEC2 glm::vec2 -#else -# define _VEC4 vec4 -# define _VEC2 vec2 -#endif - -struct PolylineVertex { - _VEC4 positionAndUCoord; - _VEC4 color; - _VEC4 normal; - _VEC4 binormalAndHalfWidth; -}; - -struct PolylineData { - _VEC2 faceCameraGlow; - _VEC2 spare; -}; - -// <@if 1@> -// Trigger Scribe include -// <@endif@> -// \ No newline at end of file diff --git a/libraries/entities-renderer/src/paintStroke_fade.slf b/libraries/entities-renderer/src/paintStroke_fade.slf new file mode 100644 index 0000000000..fa6d0aab75 --- /dev/null +++ b/libraries/entities-renderer/src/paintStroke_fade.slf @@ -0,0 +1,52 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// paintStroke_fade.frag +// fragment shader +// +// Created by Olivier Prat on 19/07/17. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include DeferredBufferWrite.slh@> + +<@include Fade.slh@> +<$declareFadeFragment()$> + +// the albedo texture +LAYOUT(binding=0) uniform sampler2D originalTexture; + +// the interpolated normal +layout(location=0) in vec3 interpolatedNormal; +layout(location=1) in vec2 varTexcoord; +layout(location=2) in vec4 varColor; +layout(location=3) in vec4 _worldPosition; + +struct PolyLineUniforms { + vec3 color; +}; + +LAYOUT(binding=0) uniform polyLineBuffer { + PolyLineUniforms polyline; +}; + +void main(void) { + vec3 fadeEmissive; + FadeObjectParams fadeParams; + + <$fetchFadeObjectParams(fadeParams)$> + applyFade(fadeParams, _worldPosition.xyz, fadeEmissive); + + vec4 texel = texture(originalTexture, varTexcoord); + int frontCondition = 1 -int(gl_FrontFacing) * 2; + vec3 color = varColor.rgb; + packDeferredFragmentTranslucent( + interpolatedNormal * float(frontCondition), + texel.a * varColor.a, + polyline.color * texel.rgb + fadeEmissive, + 10.0); +} diff --git a/libraries/entities-renderer/src/paintStroke_fade.slv b/libraries/entities-renderer/src/paintStroke_fade.slv new file mode 100644 index 0000000000..f6fcb18c98 --- /dev/null +++ b/libraries/entities-renderer/src/paintStroke_fade.slv @@ -0,0 +1,43 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// paintStroke_fade.vert +// vertex shader +// +// Created by Olivier Prat on 19/07/17. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include gpu/Inputs.slh@> +<@include gpu/Color.slh@> +<@include gpu/Transform.slh@> +<$declareStandardTransform()$> + +// the interpolated normal +layout(location=0) out vec3 interpolatedNormal; + +//the diffuse texture +layout(location=1) out vec2 varTexcoord; + +layout(location=2) out vec4 varColor; +layout(location=3) out vec4 _worldPosition; + +void main(void) { + + varTexcoord = inTexCoord0.st; + + // pass along the diffuse color + varColor = color_sRGBAToLinear(inColor); + + + // standard transform + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + <$transformModelToClipPos(cam, obj, inPosition, gl_Position)$> + <$transformModelToEyeDir(cam, obj, inNormal.xyz, interpolatedNormal)$> + <$transformModelToWorldPos(obj, inPosition, _worldPosition)$> +} \ No newline at end of file diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 17dc0cdaba..86ad35b8f5 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -527,8 +527,6 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_STROKE_NORMALS, normals); CHECK_PROPERTY_CHANGE(PROP_STROKE_COLORS, strokeColors); CHECK_PROPERTY_CHANGE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); - CHECK_PROPERTY_CHANGE(PROP_LINE_GLOW, glow); - CHECK_PROPERTY_CHANGE(PROP_LINE_FACE_CAMERA, faceCamera); // Shape CHECK_PROPERTY_CHANGE(PROP_SHAPE, shape); @@ -741,6 +739,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @see {@link Entities.EntityProperties-Image|EntityProperties-Image} * @see {@link Entities.EntityProperties-Web|EntityProperties-Web} * @see {@link Entities.EntityProperties-ParticleEffect|EntityProperties-ParticleEffect} + * @see {@link Entities.EntityProperties-Line|EntityProperties-Line} * @see {@link Entities.EntityProperties-PolyLine|EntityProperties-PolyLine} * @see {@link Entities.EntityProperties-PolyVox|EntityProperties-PolyVox} * @see {@link Entities.EntityProperties-Grid|EntityProperties-Grid} @@ -786,6 +785,33 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * }); */ +/**jsdoc + * The "Line" {@link Entities.EntityType|EntityType} draws thin, straight lines between a sequence of two or more + * points. Deprecated: Use PolyLines instead. + * It has properties in addition to the common {@link Entities.EntityProperties|EntityProperties}. + * @typedef {object} Entities.EntityProperties-Line + * @property {Vec3} dimensions=0.1,0.1,0.1 - The dimensions of the entity. Must be sufficient to contain all the + * linePoints. + * @property {Vec3[]} linePoints=[]] - The sequence of points to draw lines between. The values are relative to the entity's + * position. A maximum of 70 points can be specified. The property's value is set only if all the linePoints + * lie within the entity's dimensions. + * @property {Color} color=255,255,255 - The color of the line. + * @example Draw lines in a "V". + * var entity = Entities.addEntity({ + * type: "Line", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 2, y: 2, z: 1 }, + * linePoints: [ + * { x: -1, y: 1, z: 0 }, + * { x: 0, y: -1, z: 0 }, + * { x: 1, y: 1, z: 0 }, + * ], + * color: { red: 255, green: 0, blue: 0 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + */ + /**jsdoc * The "Material" {@link Entities.EntityType|EntityType} modifies the existing materials on * {@link Entities.EntityType|Model} entities, {@link Entities.EntityType|Shape} entities (albedo only), @@ -1025,8 +1051,6 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * format. * @property {boolean} isUVModeStretch=true - If true, the texture is stretched to fill the whole line, otherwise * the texture repeats along the line. - * @property {bool} glow=false - If true, the alpha of the strokes will drop off farther from the center. - * @property {bool} faceCamera=false - If true, each line segment will rotate to face the camera. * @example Draw a textured "V". * var entity = Entities.addEntity({ * type: "PolyLine", @@ -1593,6 +1617,13 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_Z_P_NEIGHBOR_ID, zPNeighborID); } + // Lines + if (_type == EntityTypes::Line) { + COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); + + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_POINTS, linePoints); + } + // Polylines if (_type == EntityTypes::PolyLine) { COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); @@ -1603,8 +1634,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_STROKE_NORMALS, normals); COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_STROKE_COLORS, strokeColors, qVectorVec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IS_UV_MODE_STRETCH, isUVModeStretch); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_GLOW, glow); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LINE_FACE_CAMERA, faceCamera); } // Materials @@ -1927,8 +1956,6 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(normals, qVectorVec3, setNormals); COPY_PROPERTY_FROM_QSCRIPTVALUE(strokeColors, qVectorVec3, setStrokeColors); COPY_PROPERTY_FROM_QSCRIPTVALUE(isUVModeStretch, bool, setIsUVModeStretch); - COPY_PROPERTY_FROM_QSCRIPTVALUE(glow, bool, setGlow); - COPY_PROPERTY_FROM_QSCRIPTVALUE(faceCamera, bool, setFaceCamera); // Shape COPY_PROPERTY_FROM_QSCRIPTVALUE(shape, QString, setShape); @@ -2181,8 +2208,6 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(normals); COPY_PROPERTY_IF_CHANGED(strokeColors); COPY_PROPERTY_IF_CHANGED(isUVModeStretch); - COPY_PROPERTY_IF_CHANGED(glow); - COPY_PROPERTY_IF_CHANGED(faceCamera); // Shape COPY_PROPERTY_IF_CHANGED(shape); @@ -2498,8 +2523,6 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_STROKE_NORMALS, Normals, normals, QVector); ADD_PROPERTY_TO_MAP(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector); ADD_PROPERTY_TO_MAP(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, QVector); - ADD_PROPERTY_TO_MAP(PROP_LINE_GLOW, Glow, glow); - ADD_PROPERTY_TO_MAP(PROP_LINE_FACE_CAMERA, FaceCamera, faceCamera, bool); // Shape ADD_PROPERTY_TO_MAP(PROP_SHAPE, Shape, shape, QString); @@ -2849,6 +2872,12 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_DPI, properties.getDPI()); } + if (properties.getType() == EntityTypes::Line) { + APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); + + APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); + } + if (properties.getType() == EntityTypes::PolyLine) { APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); @@ -2858,8 +2887,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_STROKE_NORMALS, properties.getPackedNormals()); APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, properties.getPackedStrokeColors()); APPEND_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, properties.getIsUVModeStretch()); - APPEND_ENTITY_PROPERTY(PROP_LINE_GLOW, properties.getGlow()); - APPEND_ENTITY_PROPERTY(PROP_LINE_FACE_CAMERA, properties.getFaceCamera()); } // NOTE: Spheres and Boxes are just special cases of Shape, and they need to include their PROP_SHAPE @@ -3278,6 +3305,12 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DPI, uint16_t, setDPI); } + if (properties.getType() == EntityTypes::Line) { + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); + + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); + } + if (properties.getType() == EntityTypes::PolyLine) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, u8vec3Color, setColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); @@ -3287,8 +3320,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_NORMALS, QByteArray, setPackedNormals); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_COLORS, QByteArray, setPackedStrokeColors); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_UV_MODE_STRETCH, bool, setIsUVModeStretch); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_GLOW, bool, setGlow); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_FACE_CAMERA, bool, setFaceCamera); } // NOTE: Spheres and Boxes are just special cases of Shape, and they need to include their PROP_SHAPE @@ -3634,8 +3665,6 @@ void EntityItemProperties::markAllChanged() { _normalsChanged = true; _strokeColorsChanged = true; _isUVModeStretchChanged = true; - _glowChanged = true; - _faceCameraChanged = true; // Shape _shapeChanged = true; @@ -4234,12 +4263,6 @@ QList EntityItemProperties::listChangedProperties() { if (isUVModeStretchChanged()) { out += "isUVModeStretch"; } - if (glowChanged()) { - out += "glow"; - } - if (faceCameraChanged()) { - out += "faceCamera"; - } // Shape if (shapeChanged()) { diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 9857878edf..fc4848bd20 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -37,6 +37,7 @@ #include "EntityPropertyFlags.h" #include "EntityPsuedoPropertyFlags.h" #include "LightEntityItem.h" +#include "LineEntityItem.h" #include "ParticleEffectEntityItem.h" #include "PolyVoxEntityItem.h" #include "SimulationOwner.h" @@ -77,6 +78,7 @@ class EntityItemProperties { friend class ImageEntityItem; friend class WebEntityItem; friend class ParticleEffectEntityItem; + friend class LineEntityItem; friend class PolyLineEntityItem; friend class PolyVoxEntityItem; friend class GridEntityItem; @@ -307,8 +309,6 @@ public: DEFINE_PROPERTY(PROP_STROKE_NORMALS, Normals, normals, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY(PROP_STROKE_COLORS, StrokeColors, strokeColors, QVector, ENTITY_ITEM_DEFAULT_EMPTY_VEC3_QVEC); DEFINE_PROPERTY(PROP_IS_UV_MODE_STRETCH, IsUVModeStretch, isUVModeStretch, bool, true); - DEFINE_PROPERTY(PROP_LINE_GLOW, Glow, glow, bool, false); - DEFINE_PROPERTY(PROP_LINE_FACE_CAMERA, FaceCamera, faceCamera, bool, false); // Shape DEFINE_PROPERTY_REF(PROP_SHAPE, Shape, shape, QString, "Sphere"); diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 812b788b06..e7cccc31df 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -290,8 +290,6 @@ enum EntityPropertyList { PROP_STROKE_NORMALS = PROP_DERIVED_2, PROP_STROKE_COLORS = PROP_DERIVED_3, PROP_IS_UV_MODE_STRETCH = PROP_DERIVED_4, - PROP_LINE_GLOW = PROP_DERIVED_5, - PROP_LINE_FACE_CAMERA = PROP_DERIVED_6, // Shape PROP_SHAPE = PROP_DERIVED_0, diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 02e8682264..33ec92b8de 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1519,6 +1519,46 @@ bool EntityScriptingInterface::polyVoxWorker(QUuid entityID, std::function actor) { + PROFILE_RANGE(script_entities, __FUNCTION__); + + if (!_entityTree) { + return false; + } + + EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); + if (!entity) { + qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; + } + + EntityTypes::EntityType entityType = entity->getType(); + + if (entityType != EntityTypes::Line) { + return false; + } + + auto now = usecTimestampNow(); + + auto lineEntity = std::static_pointer_cast(entity); + bool success; + _entityTree->withWriteLock([&] { + success = actor(*lineEntity); + entity->setLastEdited(now); + entity->setLastBroadcast(now); + }); + + EntityItemProperties properties; + _entityTree->withReadLock([&] { + properties = entity->getProperties(); + }); + + properties.setLinePointsDirty(); + properties.setLastEdited(now); + + queueEntityMessage(PacketType::EntityEdit, entityID, properties); + return success; +} + bool EntityScriptingInterface::setVoxelSphere(QUuid entityID, const glm::vec3& center, float radius, int value) { PROFILE_RANGE(script_entities, __FUNCTION__); return polyVoxWorker(entityID, [center, radius, value](PolyVoxEntityItem& polyVoxEntity) { @@ -1561,6 +1601,49 @@ bool EntityScriptingInterface::setVoxelsInCuboid(QUuid entityID, const glm::vec3 }); } +bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector& points) { + PROFILE_RANGE(script_entities, __FUNCTION__); + + EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); + if (!entity) { + qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; + } + + EntityTypes::EntityType entityType = entity->getType(); + + if (entityType == EntityTypes::Line) { + return setPoints(entityID, [points](LineEntityItem& lineEntity) -> bool + { + return (LineEntityItem*)lineEntity.setLinePoints(points); + }); + } + + return false; +} + +bool EntityScriptingInterface::appendPoint(QUuid entityID, const glm::vec3& point) { + PROFILE_RANGE(script_entities, __FUNCTION__); + + EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); + if (!entity) { + qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; + // There is no entity + return false; + } + + EntityTypes::EntityType entityType = entity->getType(); + + if (entityType == EntityTypes::Line) { + return setPoints(entityID, [point](LineEntityItem& lineEntity) -> bool + { + return (LineEntityItem*)lineEntity.appendPoint(point); + }); + } + + return false; +} + + bool EntityScriptingInterface::actionWorker(const QUuid& entityID, std::function actor) { if (!_entityTree) { diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 512e88c8e1..890c666010 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -26,6 +26,7 @@ #include #include "PolyVoxEntityItem.h" +#include "LineEntityItem.h" #include "PolyLineEntityItem.h" #include "EntityTree.h" @@ -860,12 +861,75 @@ public slots: // FIXME move to a renderable entity interface Q_INVOKABLE glm::vec3 localCoordsToVoxelCoords(const QUuid& entityID, glm::vec3 localCoords); + /**jsdoc + * Set the linePoints property of a {@link Entities.EntityType|Line} entity. + * @function Entities.setAllPoints + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Line} entity. + * @param {Vec3[]} points - The array of points to set the entity's linePoints property to. + * @returns {boolean} true if the entity's property was updated, otherwise false. The property + * may fail to be updated if the entity does not exist, the entity is not a {@link Entities.EntityType|Line} entity, + * one of the points is outside the entity's dimensions, or the number of points is greater than the maximum allowed. + * @example Change the shape of a Line entity. + * // Draw a horizontal line between two points. + * var entity = Entities.addEntity({ + * type: "Line", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 2, y: 2, z: 1 }, + * linePoints: [ + * { x: -1, y: 0, z: 0 }, + * { x:1, y: -0, z: 0 } + * ], + * color: { red: 255, green: 0, blue: 0 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * // Change the line to be a "V". + * Script.setTimeout(function () { + * Entities.setAllPoints(entity, [ + * { x: -1, y: 1, z: 0 }, + * { x: 0, y: -1, z: 0 }, + * { x: 1, y: 1, z: 0 }, + * ]); + * }, 2000); + */ + Q_INVOKABLE bool setAllPoints(QUuid entityID, const QVector& points); + + /**jsdoc + * Append a point to a {@link Entities.EntityType|Line} entity. + * @function Entities.appendPoint + * @param {Uuid} entityID - The ID of the {@link Entities.EntityType|Line} entity. + * @param {Vec3} point - The point to add to the line. The coordinates are relative to the entity's position. + * @returns {boolean} true if the point was added to the line, otherwise false. The point may + * fail to be added if the entity does not exist, the entity is not a {@link Entities.EntityType|Line} entity, the + * point is outside the entity's dimensions, or the maximum number of points has been reached. + * @example Append a point to a Line entity. + * // Draw a line between two points. + * var entity = Entities.addEntity({ + * type: "Line", + * position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), + * rotation: MyAvatar.orientation, + * dimensions: { x: 2, y: 2, z: 1 }, + * linePoints: [ + * { x: -1, y: 1, z: 0 }, + * { x: 0, y: -1, z: 0 } + * ], + * color: { red: 255, green: 0, blue: 0 }, + * lifetime: 300 // Delete after 5 minutes. + * }); + * + * // Add a third point to create a "V". + * Entities.appendPoint(entity, { x: 1, y: 1, z: 0 }); + */ + Q_INVOKABLE bool appendPoint(QUuid entityID, const glm::vec3& point); + /**jsdoc * Dumps debug information about all entities in Interface's local in-memory tree of entities it knows about to the program log. * @function Entities.dumpTree */ Q_INVOKABLE void dumpTree() const; + /**jsdoc * Add an action to an entity. An action is registered with the physics engine and is applied every physics simulation * step. Any entity may have more than one action associated with it, but only as many as will fit in an entity's @@ -1914,6 +1978,7 @@ private slots: private: bool actionWorker(const QUuid& entityID, std::function actor); bool polyVoxWorker(QUuid entityID, std::function actor); + bool setPoints(QUuid entityID, std::function actor); void queueEntityMessage(PacketType packetType, EntityItemID entityID, const EntityItemProperties& properties); bool addLocalEntityCopy(EntityItemProperties& propertiesWithSimID, EntityItemID& id, bool isClone = false); diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index 45a1e92073..e511af83b0 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -26,6 +26,7 @@ #include "TextEntityItem.h" #include "ImageEntityItem.h" #include "WebEntityItem.h" +#include "LineEntityItem.h" #include "PolyLineEntityItem.h" #include "PolyVoxEntityItem.h" #include "GridEntityItem.h" @@ -49,6 +50,7 @@ REGISTER_ENTITY_TYPE(Text) REGISTER_ENTITY_TYPE(Image) REGISTER_ENTITY_TYPE(Web) REGISTER_ENTITY_TYPE(ParticleEffect) +REGISTER_ENTITY_TYPE(Line) REGISTER_ENTITY_TYPE(PolyLine) REGISTER_ENTITY_TYPE(PolyVox) REGISTER_ENTITY_TYPE(Grid) diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index c9b9558265..29a695718e 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -70,6 +70,8 @@ public: * "ParticleEffect"A particle system that can be used to simulate things such as fire, * smoke, snow, magic spells, etc. * {@link Entities.EntityProperties-ParticleEffect|EntityProperties-ParticleEffect} + * "Line"A sequence of one or more simple straight lines. + * {@link Entities.EntityProperties-Line|EntityProperties-Line} * "PolyLine"A sequence of one or more textured straight lines. * {@link Entities.EntityProperties-PolyLine|EntityProperties-PolyLine} * "PolyVox"A set of textured voxels. @@ -97,6 +99,7 @@ public: Image, Web, ParticleEffect, + Line, PolyLine, PolyVox, Grid, diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp new file mode 100644 index 0000000000..12d1178690 --- /dev/null +++ b/libraries/entities/src/LineEntityItem.cpp @@ -0,0 +1,175 @@ +// +// LineEntityItem.cpp +// libraries/entities/src +// +// Created by Seth Alves on 5/11/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "LineEntityItem.h" + +#include + +#include + +#include "EntitiesLogging.h" +#include "EntityItemProperties.h" +#include "EntityTree.h" +#include "EntityTreeElement.h" +#include "OctreeConstants.h" + +const int LineEntityItem::MAX_POINTS_PER_LINE = 70; + + +EntityItemPointer LineEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { + EntityItemPointer entity(new LineEntityItem(entityID), [](EntityItem* ptr) { ptr->deleteLater(); }); + entity->setProperties(properties); + return entity; +} + +LineEntityItem::LineEntityItem(const EntityItemID& entityItemID) : + EntityItem(entityItemID) +{ + _type = EntityTypes::Line; +} + +EntityItemProperties LineEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const { + + EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class + + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints); + + return properties; +} + +bool LineEntityItem::setProperties(const EntityItemProperties& properties) { + bool somethingChanged = false; + somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class + + SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints); + + if (somethingChanged) { + bool wantDebug = false; + if (wantDebug) { + uint64_t now = usecTimestampNow(); + int elapsed = now - getLastEdited(); + qCDebug(entities) << "LineEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << + "now=" << now << " getLastEdited()=" << getLastEdited(); + } + setLastEdited(properties._lastEdited); + } + return somethingChanged; +} + +bool LineEntityItem::appendPoint(const glm::vec3& point) { + if (_points.size() > MAX_POINTS_PER_LINE - 1) { + qCDebug(entities) << "MAX POINTS REACHED!"; + return false; + } + glm::vec3 halfBox = getScaledDimensions() * 0.5f; + if ( (point.x < - halfBox.x || point.x > halfBox.x) || (point.y < -halfBox.y || point.y > halfBox.y) || (point.z < - halfBox.z || point.z > halfBox.z) ) { + qCDebug(entities) << "Point is outside entity's bounding box"; + return false; + } + withWriteLock([&] { + _points << point; + _pointsChanged = true; + }); + return true; +} + +bool LineEntityItem::setLinePoints(const QVector& points) { + if (points.size() > MAX_POINTS_PER_LINE) { + return false; + } + glm::vec3 halfBox = getScaledDimensions() * 0.5f; + for (int i = 0; i < points.size(); i++) { + glm::vec3 point = points.at(i); + if ( (point.x < - halfBox.x || point.x > halfBox.x) || (point.y < -halfBox.y || point.y > halfBox.y) || (point.z < - halfBox.z || point.z > halfBox.z) ) { + qCDebug(entities) << "Point is outside entity's bounding box"; + return false; + } + } + + withWriteLock([&] { + _points = points; + _pointsChanged = true; + }); + return true; +} + +int LineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { + + int bytesRead = 0; + const unsigned char* dataAt = data; + + READ_ENTITY_PROPERTY(PROP_COLOR, glm::u8vec3, setColor); + READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); + + return bytesRead; +} + + +EntityPropertyFlags LineEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { + EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); + requestedProperties += PROP_COLOR; + requestedProperties += PROP_LINE_POINTS; + return requestedProperties; +} + +void LineEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeDataPointer modelTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const { + + bool successPropertyFits = true; + + APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); + APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, getLinePoints()); +} + +void LineEntityItem::debugDump() const { + quint64 now = usecTimestampNow(); + qCDebug(entities) << " LINE EntityItem id:" << getEntityItemID() << "---------------------------------------------"; + qCDebug(entities) << " color:" << _color; + qCDebug(entities) << " position:" << debugTreeVector(getWorldPosition()); + qCDebug(entities) << " dimensions:" << debugTreeVector(getScaledDimensions()); + qCDebug(entities) << " getLastEdited:" << debugTime(getLastEdited(), now); +} + +glm::u8vec3 LineEntityItem::getColor() const { + return resultWithReadLock([&] { + return _color; + }); +} + +void LineEntityItem::setColor(const glm::u8vec3& value) { + withWriteLock([&] { + _color = value; + }); +} + +QVector LineEntityItem::getLinePoints() const { + QVector result; + withReadLock([&] { + result = _points; + }); + return result; +} + +void LineEntityItem::resetPointsChanged() { + withWriteLock([&] { + _pointsChanged = false; + }); +} diff --git a/libraries/entities/src/LineEntityItem.h b/libraries/entities/src/LineEntityItem.h new file mode 100644 index 0000000000..86ca6065bb --- /dev/null +++ b/libraries/entities/src/LineEntityItem.h @@ -0,0 +1,77 @@ +// +// LineEntityItem.h +// libraries/entities/src +// +// Created by Seth Alves on 5/11/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_LineEntityItem_h +#define hifi_LineEntityItem_h + +#include "EntityItem.h" + +class LineEntityItem : public EntityItem { + public: + static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); + + LineEntityItem(const EntityItemID& entityItemID); + + ALLOW_INSTANTIATION // This class can be instantiated + + // methods for getting/setting all properties of an entity + virtual EntityItemProperties getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const override; + virtual bool setProperties(const EntityItemProperties& properties) override; + + virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const override; + + virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeDataPointer modelTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const override; + + virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) override; + + glm::u8vec3 getColor() const; + void setColor(const glm::u8vec3& value); + + bool setLinePoints(const QVector& points); + bool appendPoint(const glm::vec3& point); + + QVector getLinePoints() const; + + virtual ShapeType getShapeType() const override { return SHAPE_TYPE_NONE; } + + // never have a ray intersection pick a LineEntityItem. + virtual bool supportsDetailedIntersection() const override { return true; } + virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, + OctreeElementPointer& element, float& distance, + BoxFace& face, glm::vec3& surfaceNormal, + QVariantMap& extraInfo, + bool precisionPicking) const override { return false; } + virtual bool findDetailedParabolaIntersection(const glm::vec3& origin, const glm::vec3& velocity, + const glm::vec3& acceleration, OctreeElementPointer& element, float& parabolicDistance, + BoxFace& face, glm::vec3& surfaceNormal, + QVariantMap& extraInfo, + bool precisionPicking) const override { return false; } + bool pointsChanged() const { return _pointsChanged; } + void resetPointsChanged(); + virtual void debugDump() const override; + static const int MAX_POINTS_PER_LINE; + + private: + glm::u8vec3 _color; + QVector _points; + bool _pointsChanged { true }; +}; + +#endif // hifi_LineEntityItem_h diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index ee59b5b45a..88f2d14ae6 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -24,6 +24,7 @@ const float PolyLineEntityItem::DEFAULT_LINE_WIDTH = 0.1f; const int PolyLineEntityItem::MAX_POINTS_PER_LINE = 60; + EntityItemPointer PolyLineEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { EntityItemPointer entity(new PolyLineEntityItem(entityID), [](EntityItem* ptr) { ptr->deleteLater(); }); entity->setProperties(properties); @@ -36,6 +37,7 @@ PolyLineEntityItem::PolyLineEntityItem(const EntityItemID& entityItemID) : Entit } EntityItemProperties PolyLineEntityItem::getProperties(const EntityPropertyFlags& desiredProperties, bool allowEmptyDesiredProperties) const { + QWriteLocker lock(&_quadReadWriteLock); EntityItemProperties properties = EntityItem::getProperties(desiredProperties, allowEmptyDesiredProperties); // get the properties from our base class COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getColor); @@ -46,13 +48,11 @@ EntityItemProperties PolyLineEntityItem::getProperties(const EntityPropertyFlags COPY_ENTITY_PROPERTY_TO_PROPERTIES(normals, getNormals); COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeColors, getStrokeColors); COPY_ENTITY_PROPERTY_TO_PROPERTIES(isUVModeStretch, getIsUVModeStretch); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(glow, getGlow); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(faceCamera, getFaceCamera); - return properties; } bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { + QWriteLocker lock(&_quadReadWriteLock); bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class @@ -64,8 +64,6 @@ bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(normals, setNormals); SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeColors, setStrokeColors); SET_ENTITY_PROPERTY_FROM_PROPERTIES(isUVModeStretch, setIsUVModeStretch); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(glow, setGlow); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(faceCamera, setFaceCamera); if (somethingChanged) { bool wantDebug = false; @@ -80,73 +78,125 @@ bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { return somethingChanged; } -void PolyLineEntityItem::setLinePoints(const QVector& points) { - withWriteLock([&] { - _points = points; - _pointsChanged = true; - }); - computeAndUpdateDimensionsAndPosition(); + +bool PolyLineEntityItem::appendPoint(const glm::vec3& point) { + if (_points.size() > MAX_POINTS_PER_LINE - 1) { + qCDebug(entities) << "MAX POINTS REACHED!"; + return false; + } + + _points << point; + _pointsChanged = true; + + calculateScaleAndRegistrationPoint(); + + return true; } -void PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths) { + +bool PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths) { withWriteLock([&] { - _widths = strokeWidths; - _widthsChanged = true; + _strokeWidths = strokeWidths; + _strokeWidthsChanged = true; }); - computeAndUpdateDimensionsAndPosition(); + return true; } -void PolyLineEntityItem::setNormals(const QVector& normals) { +bool PolyLineEntityItem::setNormals(const QVector& normals) { withWriteLock([&] { _normals = normals; _normalsChanged = true; }); + return true; } -void PolyLineEntityItem::setStrokeColors(const QVector& strokeColors) { +bool PolyLineEntityItem::setStrokeColors(const QVector& strokeColors) { withWriteLock([&] { - _colors = strokeColors; - _colorsChanged = true; + _strokeColors = strokeColors; + _strokeColorsChanged = true; }); + return true; } -void PolyLineEntityItem::computeAndUpdateDimensionsAndPosition() { - QVector points; - QVector widths; - withReadLock([&] { - points = _points; - widths = _widths; +bool PolyLineEntityItem::setLinePoints(const QVector& points) { + if (points.size() > MAX_POINTS_PER_LINE) { + return false; + } + bool result = false; + withWriteLock([&] { + //Check to see if points actually changed. If they haven't, return before doing anything else + if (points.size() != _points.size()) { + _pointsChanged = true; + } else if (points.size() == _points.size()) { + //same number of points, so now compare every point + for (int i = 0; i < points.size(); i++) { + if (points.at(i) != _points.at(i)) { + _pointsChanged = true; + break; + } + } + } + if (!_pointsChanged) { + return; + } + + _points = points; + + result = true; }); - AABox container; - float maxWidth = 0.0f; - if (_points.length() > 0) { - container = AABox(_points[0] - 0.5f * ENTITY_ITEM_DEFAULT_DIMENSIONS, ENTITY_ITEM_DEFAULT_WIDTH); - for (int i = 0; i < points.length(); i++) { - container += points[i]; - maxWidth = glm::max(maxWidth, i < widths.length() ? widths[i] : DEFAULT_LINE_WIDTH); - } - } else { - container = AABox(-0.5f * ENTITY_ITEM_DEFAULT_DIMENSIONS, ENTITY_ITEM_DEFAULT_WIDTH); + if (result) { + calculateScaleAndRegistrationPoint(); } - // Adjust the box to account for the line width, assuming the worst case - container.setScaleStayCentered(container.getScale() + 2.0f * maxWidth); + return result; +} - bool success; - glm::vec3 center = container.calcCenter(); - setWorldPosition(center + getCenterPosition(success)); - setScaledDimensions(container.getScale()); - withWriteLock([&] { - _polylineCenter = center; +void PolyLineEntityItem::calculateScaleAndRegistrationPoint() { + glm::vec3 high(0.0f, 0.0f, 0.0f); + glm::vec3 low(0.0f, 0.0f, 0.0f); + int pointCount = 0; + glm::vec3 firstPoint; + withReadLock([&] { + pointCount = _points.size(); + if (pointCount > 0) { + firstPoint = _points.at(0); + } + for (int i = 0; i < pointCount; i++) { + const glm::vec3& point = _points.at(i); + high = glm::max(point, high); + low = glm::min(point, low); + } }); + + float magnitudeSquared = glm::length2(low - high); + vec3 newScale { 1 }; + vec3 newRegistrationPoint { 0.5f }; + + const float EPSILON = 0.0001f; + const float EPSILON_SQUARED = EPSILON * EPSILON; + const float HALF_LINE_WIDTH = 0.075f; // sadly _strokeWidths() don't seem to correspond to reality, so just use a flat assumption of the stroke width + const vec3 QUARTER_LINE_WIDTH { HALF_LINE_WIDTH * 0.5f }; + if (pointCount > 1 && magnitudeSquared > EPSILON_SQUARED) { + newScale = glm::abs(high) + glm::abs(low) + vec3(HALF_LINE_WIDTH); + // Center the poly line in the bounding box + glm::vec3 startPointInScaleSpace = firstPoint - low; + startPointInScaleSpace += QUARTER_LINE_WIDTH; + newRegistrationPoint = startPointInScaleSpace / newScale; + } + + // if Polyline has only one or fewer points, use default dimension settings + setScaledDimensions(newScale); + EntityItem::setRegistrationPoint(newRegistrationPoint); } int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData, bool& somethingChanged) { + + QWriteLocker lock(&_quadReadWriteLock); int bytesRead = 0; const unsigned char* dataAt = data; @@ -158,8 +208,6 @@ int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da READ_ENTITY_PROPERTY(PROP_STROKE_NORMALS, QVector, setNormals); READ_ENTITY_PROPERTY(PROP_STROKE_COLORS, QVector, setStrokeColors); READ_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, bool, setIsUVModeStretch); - READ_ENTITY_PROPERTY(PROP_LINE_GLOW, bool, setGlow); - READ_ENTITY_PROPERTY(PROP_LINE_FACE_CAMERA, bool, setFaceCamera); return bytesRead; } @@ -174,8 +222,6 @@ EntityPropertyFlags PolyLineEntityItem::getEntityProperties(EncodeBitstreamParam requestedProperties += PROP_STROKE_NORMALS; requestedProperties += PROP_STROKE_COLORS; requestedProperties += PROP_IS_UV_MODE_STRETCH; - requestedProperties += PROP_LINE_GLOW; - requestedProperties += PROP_LINE_FACE_CAMERA; return requestedProperties; } @@ -187,6 +233,7 @@ void PolyLineEntityItem::appendSubclassData(OctreePacketData* packetData, Encode int& propertyCount, OctreeElement::AppendState& appendState) const { + QWriteLocker lock(&_quadReadWriteLock); bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); @@ -197,8 +244,6 @@ void PolyLineEntityItem::appendSubclassData(OctreePacketData* packetData, Encode APPEND_ENTITY_PROPERTY(PROP_STROKE_NORMALS, getNormals()); APPEND_ENTITY_PROPERTY(PROP_STROKE_COLORS, getStrokeColors()); APPEND_ENTITY_PROPERTY(PROP_IS_UV_MODE_STRETCH, getIsUVModeStretch()); - APPEND_ENTITY_PROPERTY(PROP_LINE_GLOW, getGlow()); - APPEND_ENTITY_PROPERTY(PROP_LINE_FACE_CAMERA, getFaceCamera()); } void PolyLineEntityItem::debugDump() const { @@ -210,49 +255,61 @@ void PolyLineEntityItem::debugDump() const { qCDebug(entities) << " getLastEdited:" << debugTime(getLastEdited(), now); } + + QVector PolyLineEntityItem::getLinePoints() const { - return resultWithReadLock>([&] { - return _points; + QVector result; + withReadLock([&] { + result = _points; }); + return result; } QVector PolyLineEntityItem::getNormals() const { - return resultWithReadLock>([&] { - return _normals; + QVector result; + withReadLock([&] { + result = _normals; }); + return result; } QVector PolyLineEntityItem::getStrokeColors() const { - return resultWithReadLock>([&] { - return _colors; + QVector result; + withReadLock([&] { + result = _strokeColors; }); + return result; } QVector PolyLineEntityItem::getStrokeWidths() const { - return resultWithReadLock>([&] { - return _widths; + QVector result; + withReadLock([&] { + result = _strokeWidths; }); + return result; } QString PolyLineEntityItem::getTextures() const { - return resultWithReadLock([&] { - return _textures; + QString result; + withReadLock([&] { + result = _textures; }); + return result; } void PolyLineEntityItem::setTextures(const QString& textures) { withWriteLock([&] { if (_textures != textures) { _textures = textures; - _texturesChanged = true; + _texturesChangedFlag = true; } }); } void PolyLineEntityItem::setColor(const glm::u8vec3& value) { withWriteLock([&] { + _strokeColorsChanged = true; _color = value; - _colorsChanged = true; }); } diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h index 69afaf175c..4420a123c5 100644 --- a/libraries/entities/src/PolyLineEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -44,42 +44,35 @@ class PolyLineEntityItem : public EntityItem { glm::u8vec3 getColor() const; void setColor(const glm::u8vec3& value); - static const int MAX_POINTS_PER_LINE; - void setLinePoints(const QVector& points); + bool setLinePoints(const QVector& points); + bool appendPoint(const glm::vec3& point); QVector getLinePoints() const; - glm::vec3 getPolylineCenter() const { return _polylineCenter; } - - static const float DEFAULT_LINE_WIDTH; - void setStrokeWidths(const QVector& strokeWidths); - QVector getStrokeWidths() const; - - void setNormals(const QVector& normals); + bool setNormals(const QVector& normals); QVector getNormals() const; - void setStrokeColors(const QVector& strokeColors); + bool setStrokeColors(const QVector& strokeColors); QVector getStrokeColors() const; + bool setStrokeWidths(const QVector& strokeWidths); + QVector getStrokeWidths() const; + void setIsUVModeStretch(bool isUVModeStretch){ _isUVModeStretch = isUVModeStretch; } bool getIsUVModeStretch() const{ return _isUVModeStretch; } QString getTextures() const; void setTextures(const QString& textures); - void setGlow(bool glow) { _glow = glow; } - bool getGlow() const { return _glow; } - - void setFaceCamera(bool faceCamera) { _faceCamera = faceCamera; } - bool getFaceCamera() const { return _faceCamera; } + virtual ShapeType getShapeType() const override { return SHAPE_TYPE_NONE; } bool pointsChanged() const { return _pointsChanged; } bool normalsChanged() const { return _normalsChanged; } - bool colorsChanged() const { return _colorsChanged; } - bool widthsChanged() const { return _widthsChanged; } - bool texturesChanged() const { return _texturesChanged; } + bool strokeColorsChanged() const { return _strokeColorsChanged; } + bool strokeWidthsChanged() const { return _strokeWidthsChanged; } + bool texturesChanged() const { return _texturesChangedFlag; } + void resetTexturesChanged() { _texturesChangedFlag = false; } + void resetPolyLineChanged() { _strokeColorsChanged = _strokeWidthsChanged = _normalsChanged = _pointsChanged = false; } - void resetTexturesChanged() { _texturesChanged = false; } - void resetPolyLineChanged() { _colorsChanged = _widthsChanged = _normalsChanged = _pointsChanged = false; } // never have a ray intersection pick a PolyLineEntityItem. virtual bool supportsDetailedIntersection() const override { return true; } @@ -92,27 +85,29 @@ class PolyLineEntityItem : public EntityItem { BoxFace& face, glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const override { return false; } + // disable these external interfaces as PolyLineEntities caculate their own dimensions based on the points they contain + virtual void setRegistrationPoint(const glm::vec3& value) override {}; // FIXME: this is suspicious! + virtual void debugDump() const override; + static const float DEFAULT_LINE_WIDTH; + static const int MAX_POINTS_PER_LINE; private: - void computeAndUpdateDimensionsAndPosition(); + void calculateScaleAndRegistrationPoint(); protected: glm::u8vec3 _color; + bool _pointsChanged { true }; + bool _normalsChanged { true }; + bool _strokeColorsChanged { true }; + bool _strokeWidthsChanged { true }; QVector _points; - glm::vec3 _polylineCenter; QVector _normals; - QVector _colors; - QVector _widths; + QVector _strokeColors; + QVector _strokeWidths; QString _textures; bool _isUVModeStretch; - bool _glow; - bool _faceCamera; - - bool _pointsChanged { false }; - bool _normalsChanged { false }; - bool _colorsChanged { false }; - bool _widthsChanged { false }; - bool _texturesChanged { false }; + bool _texturesChangedFlag { false }; + mutable QReadWriteLock _quadReadWriteLock; }; #endif // hifi_PolyLineEntityItem_h diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index ebd747fd39..c8e2aaf51e 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -33,7 +33,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::EntityEdit: case PacketType::EntityData: case PacketType::EntityPhysics: - return static_cast(EntityVersion::MissingLineProperties); + return static_cast(EntityVersion::MorePropertiesCleanup); case PacketType::EntityQuery: return static_cast(EntityQueryPacketVersion::ConicalFrustums); case PacketType::AvatarIdentity: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 1ed2dd83ff..33f3f967c9 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -251,7 +251,7 @@ enum class EntityVersion : PacketVersion { ImageEntities, GridEntities, MissingTextProperties, - MissingLineProperties + MorePropertiesCleanup }; enum class EntityScriptCallMethodVersion : PacketVersion {