From 6aa9ef991013d620fd95170a05ccf8fee2fb61a6 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Wed, 30 Sep 2015 20:51:25 -0700 Subject: [PATCH 01/30] first cut at migrating animation settings into a property group --- .../entities/src/EntityItemProperties.cpp | 83 ++++++++++--------- libraries/entities/src/EntityItemProperties.h | 22 +++-- libraries/entities/src/ModelEntityItem.cpp | 54 ++++++------ libraries/entities/src/ModelEntityItem.h | 12 ++- .../entities/src/ParticleEffectEntityItem.cpp | 56 ++++++++----- .../entities/src/ParticleEffectEntityItem.h | 11 ++- .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 1 + 8 files changed, 145 insertions(+), 96 deletions(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index b92ea34827..ea80b27877 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -64,10 +64,10 @@ CONSTRUCT_PROPERTY(alphaStart, ParticleEffectEntityItem::DEFAULT_ALPHA_START), CONSTRUCT_PROPERTY(alphaFinish, ParticleEffectEntityItem::DEFAULT_ALPHA_FINISH), CONSTRUCT_PROPERTY(modelURL, ""), CONSTRUCT_PROPERTY(compoundShapeURL, ""), -CONSTRUCT_PROPERTY(animationURL, ""), -CONSTRUCT_PROPERTY(animationFPS, ModelEntityItem::DEFAULT_ANIMATION_FPS), -CONSTRUCT_PROPERTY(animationFrameIndex, ModelEntityItem::DEFAULT_ANIMATION_FRAME_INDEX), -CONSTRUCT_PROPERTY(animationIsPlaying, ModelEntityItem::DEFAULT_ANIMATION_IS_PLAYING), +//CONSTRUCT_PROPERTY(animationURL, ""), +//CONSTRUCT_PROPERTY(animationFPS, ModelEntityItem::DEFAULT_ANIMATION_FPS), +//CONSTRUCT_PROPERTY(animationFrameIndex, ModelEntityItem::DEFAULT_ANIMATION_FRAME_INDEX), +//CONSTRUCT_PROPERTY(animationIsPlaying, ModelEntityItem::DEFAULT_ANIMATION_IS_PLAYING), CONSTRUCT_PROPERTY(registrationPoint, ENTITY_ITEM_DEFAULT_REGISTRATION_POINT), CONSTRUCT_PROPERTY(angularVelocity, ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY), CONSTRUCT_PROPERTY(angularDamping, ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING), @@ -79,8 +79,8 @@ CONSTRUCT_PROPERTY(exponent, 0.0f), CONSTRUCT_PROPERTY(cutoff, ENTITY_ITEM_DEFAULT_CUTOFF), CONSTRUCT_PROPERTY(locked, ENTITY_ITEM_DEFAULT_LOCKED), CONSTRUCT_PROPERTY(textures, ""), -CONSTRUCT_PROPERTY(animationSettings, "{\"firstFrame\":0,\"fps\":30,\"frameIndex\":0,\"hold\":false," - "\"lastFrame\":100000,\"loop\":false,\"running\":false,\"startAutomatically\":false}"), +//CONSTRUCT_PROPERTY(animationSettings, "{\"firstFrame\":0,\"fps\":30,\"frameIndex\":0,\"hold\":false," +// "\"lastFrame\":100000,\"loop\":false,\"running\":false,\"startAutomatically\":false}"), CONSTRUCT_PROPERTY(userData, ENTITY_ITEM_DEFAULT_USER_DATA), CONSTRUCT_PROPERTY(simulationOwner, SimulationOwner()), CONSTRUCT_PROPERTY(text, TextEntityItem::DEFAULT_TEXT), @@ -167,11 +167,13 @@ void EntityItemProperties::calculateNaturalPosition(const glm::vec3& min, const _naturalPosition = max - halfDimension; } +/* bool EntityItemProperties::animationSettingsChanged() const { return _animationSettingsChanged; } void EntityItemProperties::setAnimationSettings(const QString& value) { + // the animations setting is a JSON string that may contain various animation settings. // if it includes fps, frameIndex, or running, those values will be parsed out and // will over ride the regular animation settings @@ -223,6 +225,7 @@ QString EntityItemProperties::getAnimationSettings() const { QString jsonByteString(jsonByteArray); return jsonByteString; } +*/ void EntityItemProperties::setCreated(QDateTime &v) { _created = v.toMSecsSinceEpoch() * 1000; // usec per msec @@ -355,11 +358,11 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_ALPHA_FINISH, alphaFinish); CHECK_PROPERTY_CHANGE(PROP_MODEL_URL, modelURL); CHECK_PROPERTY_CHANGE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); - CHECK_PROPERTY_CHANGE(PROP_ANIMATION_URL, animationURL); - CHECK_PROPERTY_CHANGE(PROP_ANIMATION_PLAYING, animationIsPlaying); - CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FRAME_INDEX, animationFrameIndex); - CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FPS, animationFPS); - CHECK_PROPERTY_CHANGE(PROP_ANIMATION_SETTINGS, animationSettings); + //CHECK_PROPERTY_CHANGE(PROP_ANIMATION_URL, animationURL); + //CHECK_PROPERTY_CHANGE(PROP_ANIMATION_PLAYING, animationIsPlaying); + //CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FRAME_INDEX, animationFrameIndex); + //CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FPS, animationFPS); + //CHECK_PROPERTY_CHANGE(PROP_ANIMATION_SETTINGS, animationSettings); CHECK_PROPERTY_CHANGE(PROP_VISIBLE, visible); CHECK_PROPERTY_CHANGE(PROP_REGISTRATION_POINT, registrationPoint); CHECK_PROPERTY_CHANGE(PROP_ANGULAR_VELOCITY, angularVelocity); @@ -519,7 +522,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Models only if (_type == EntityTypes::Model) { COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MODEL_URL, modelURL); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, animationURL); + //COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, animationURL); } if (_type == EntityTypes::Model || _type == EntityTypes::Zone || _type == EntityTypes::ParticleEffect) { @@ -534,10 +537,10 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Models & Particles if (_type == EntityTypes::Model || _type == EntityTypes::ParticleEffect) { COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_PLAYING, animationIsPlaying); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, animationFPS); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, animationFrameIndex); - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_SETTINGS, animationSettings, getAnimationSettings()); + //COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_PLAYING, animationIsPlaying); + //COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, animationFPS); + //COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, animationFrameIndex); + //COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_SETTINGS, animationSettings, getAnimationSettings()); } // Lights only @@ -673,11 +676,11 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(alphaFinish, float, setAlphaFinish); COPY_PROPERTY_FROM_QSCRIPTVALUE(modelURL, QString, setModelURL); COPY_PROPERTY_FROM_QSCRIPTVALUE(compoundShapeURL, QString, setCompoundShapeURL); - COPY_PROPERTY_FROM_QSCRIPTVALUE(animationURL, QString, setAnimationURL); - COPY_PROPERTY_FROM_QSCRIPTVALUE(animationIsPlaying, bool, setAnimationIsPlaying); - COPY_PROPERTY_FROM_QSCRIPTVALUE(animationFPS, float, setAnimationFPS); - COPY_PROPERTY_FROM_QSCRIPTVALUE(animationFrameIndex, float, setAnimationFrameIndex); - COPY_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, QString, setAnimationSettings); + //COPY_PROPERTY_FROM_QSCRIPTVALUE(animationURL, QString, setAnimationURL); + //COPY_PROPERTY_FROM_QSCRIPTVALUE(animationIsPlaying, bool, setAnimationIsPlaying); + //COPY_PROPERTY_FROM_QSCRIPTVALUE(animationFPS, float, setAnimationFPS); + //COPY_PROPERTY_FROM_QSCRIPTVALUE(animationFrameIndex, float, setAnimationFrameIndex); + //COPY_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, QString, setAnimationSettings); COPY_PROPERTY_FROM_QSCRIPTVALUE(glowLevel, float, setGlowLevel); COPY_PROPERTY_FROM_QSCRIPTVALUE(localRenderAlpha, float, setLocalRenderAlpha); COPY_PROPERTY_FROM_QSCRIPTVALUE(ignoreForCollisions, bool, setIgnoreForCollisions); @@ -1087,12 +1090,12 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem if (properties.getType() == EntityTypes::Model) { APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, properties.getModelURL()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, properties.getAnimationURL()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, properties.getAnimationFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, properties.getAnimationFrameIndex()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, properties.getAnimationIsPlaying()); + //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, properties.getAnimationURL()); + //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, properties.getAnimationFPS()); + //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, properties.getAnimationFrameIndex()); + //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, properties.getAnimationIsPlaying()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, properties.getAnimationSettings()); + //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, properties.getAnimationSettings()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); } @@ -1105,10 +1108,10 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem } if (properties.getType() == EntityTypes::ParticleEffect) { - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, properties.getAnimationFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, properties.getAnimationFrameIndex()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, properties.getAnimationIsPlaying()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, properties.getAnimationSettings()); + //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, properties.getAnimationFPS()); + //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, properties.getAnimationFrameIndex()); + //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, properties.getAnimationIsPlaying()); + //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, properties.getAnimationSettings()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, properties.getMaxParticles()); APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, properties.getLifespan()); @@ -1377,12 +1380,12 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Model) { 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_ANIMATION_URL, QString, setAnimationURL); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FPS, float, setAnimationFPS); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); + //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_URL, QString, setAnimationURL); + //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FPS, float, setAnimationFPS); + //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); + //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); + //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); } @@ -1395,10 +1398,10 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::ParticleEffect) { - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FPS, float, setAnimationFPS); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); + //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FPS, float, setAnimationFPS); + //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); + //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); + //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MAX_PARTICLES, float, setMaxParticles); @@ -1534,11 +1537,13 @@ void EntityItemProperties::markAllChanged() { _alphaChanged = true; _modelURLChanged = true; _compoundShapeURLChanged = true; + /* _animationURLChanged = true; _animationIsPlayingChanged = true; _animationFrameIndexChanged = true; _animationFPSChanged = true; _animationSettingsChanged = true; + */ _glowLevelChanged = true; _localRenderAlphaChanged = true; _isSpotlightChanged = true; diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 55be145d85..29249d35e3 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -29,6 +29,7 @@ #include #include +#include "AnimationPropertyGroup.h" #include "AtmospherePropertyGroup.h" #include "EntityItemID.h" #include "EntityItemPropertiesMacros.h" @@ -115,10 +116,13 @@ public: DEFINE_PROPERTY(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float); DEFINE_PROPERTY_REF(PROP_MODEL_URL, ModelURL, modelURL, QString); DEFINE_PROPERTY_REF(PROP_COMPOUND_SHAPE_URL, CompoundShapeURL, compoundShapeURL, QString); + /* DEFINE_PROPERTY_REF(PROP_ANIMATION_URL, AnimationURL, animationURL, QString); DEFINE_PROPERTY(PROP_ANIMATION_FPS, AnimationFPS, animationFPS, float); DEFINE_PROPERTY(PROP_ANIMATION_FRAME_INDEX, AnimationFrameIndex, animationFrameIndex, float); DEFINE_PROPERTY(PROP_ANIMATION_PLAYING, AnimationIsPlaying, animationIsPlaying, bool); + //DEFINE_PROPERTY_REF_WITH_SETTER_AND_GETTER(PROP_ANIMATION_SETTINGS, AnimationSettings, animationSettings, QString); + */ DEFINE_PROPERTY_REF(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, glm::vec3); DEFINE_PROPERTY_REF(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, glm::vec3); DEFINE_PROPERTY(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float); @@ -130,7 +134,6 @@ public: DEFINE_PROPERTY(PROP_CUTOFF, Cutoff, cutoff, float); DEFINE_PROPERTY(PROP_LOCKED, Locked, locked, bool); DEFINE_PROPERTY_REF(PROP_TEXTURES, Textures, textures, QString); - DEFINE_PROPERTY_REF_WITH_SETTER_AND_GETTER(PROP_ANIMATION_SETTINGS, AnimationSettings, animationSettings, QString); DEFINE_PROPERTY_REF(PROP_USER_DATA, UserData, userData, QString); DEFINE_PROPERTY_REF(PROP_SIMULATION_OWNER, SimulationOwner, simulationOwner, SimulationOwner); DEFINE_PROPERTY_REF(PROP_TEXT, Text, text, QString); @@ -169,6 +172,7 @@ public: DEFINE_PROPERTY_GROUP(Stage, stage, StagePropertyGroup); DEFINE_PROPERTY_GROUP(Atmosphere, atmosphere, AtmospherePropertyGroup); DEFINE_PROPERTY_GROUP(Skybox, skybox, SkyboxPropertyGroup); + DEFINE_PROPERTY_GROUP(Animation, animation, AnimationPropertyGroup); DEFINE_PROPERTY_REF(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString); DEFINE_PROPERTY(PROP_LINE_WIDTH, LineWidth, lineWidth, float); DEFINE_PROPERTY_REF(LINE_POINTS, LinePoints, linePoints, QVector); @@ -200,7 +204,7 @@ public: bool containsBoundsProperties() const { return (_positionChanged || _dimensionsChanged); } bool containsPositionChange() const { return _positionChanged; } bool containsDimensionsChange() const { return _dimensionsChanged; } - bool containsAnimationSettingsChange() const { return _animationSettingsChanged; } + bool containsAnimationSettingsChange() const { return false; /*_animationSettingsChanged;*/ } // FIXME float getGlowLevel() const { return _glowLevel; } float getLocalRenderAlpha() const { return _localRenderAlpha; } @@ -297,9 +301,9 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { if (properties.containsPositionChange()) { debug << " position:" << properties.getPosition() << "in meters" << "\n"; } - if (properties.containsAnimationSettingsChange()) { - debug << " animationSettings:" << properties.getAnimationSettings() << "\n"; - } + //if (properties.containsAnimationSettingsChange()) { + // debug << " animationSettings:" << properties.getAnimationSettings() << "\n"; + //} DEBUG_PROPERTY_IF_CHANGED(debug, properties, Dimensions, dimensions, "in meters"); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Velocity, velocity, "in meters"); @@ -326,10 +330,10 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, AlphaFinish, alphaFinish, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, ModelURL, modelURL, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, CompoundShapeURL, compoundShapeURL, ""); - DEBUG_PROPERTY_IF_CHANGED(debug, properties, AnimationURL, animationURL, ""); - DEBUG_PROPERTY_IF_CHANGED(debug, properties, AnimationFPS, animationFPS, ""); - DEBUG_PROPERTY_IF_CHANGED(debug, properties, AnimationFrameIndex, animationFrameIndex, ""); - DEBUG_PROPERTY_IF_CHANGED(debug, properties, AnimationIsPlaying, animationIsPlaying, ""); + //DEBUG_PROPERTY_IF_CHANGED(debug, properties, AnimationURL, animationURL, ""); + //DEBUG_PROPERTY_IF_CHANGED(debug, properties, AnimationFPS, animationFPS, ""); + //DEBUG_PROPERTY_IF_CHANGED(debug, properties, AnimationFrameIndex, animationFrameIndex, ""); + //DEBUG_PROPERTY_IF_CHANGED(debug, properties, AnimationIsPlaying, animationIsPlaying, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, RegistrationPoint, registrationPoint, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, AngularVelocity, angularVelocity, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, AngularDamping, angularDamping, ""); diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 70747937d8..61b10d69e8 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -49,14 +49,12 @@ EntityItemProperties ModelEntityItem::getProperties(EntityPropertyFlags desiredP COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getXColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(modelURL, getModelURL); COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationURL, getAnimationURL); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationIsPlaying, getAnimationIsPlaying); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationFrameIndex, getAnimationFrameIndex); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationFPS, getAnimationFPS); COPY_ENTITY_PROPERTY_TO_PROPERTIES(glowLevel, getGlowLevel); COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationSettings, getAnimationSettings); COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); + + _animationProperties.getProperties(properties); + return properties; } @@ -67,14 +65,11 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { 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(animationURL, setAnimationURL); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationIsPlaying, setAnimationIsPlaying); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationFrameIndex, setAnimationFrameIndex); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationFPS, setAnimationFPS); SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationSettings, setAnimationSettings); SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); + bool somethingChangedInStage = _animationProperties.setProperties(properties); + if (somethingChanged) { bool wantDebug = false; if (wantDebug) { @@ -113,9 +108,11 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, float animationFPS = getAnimationFPS(); float animationFrameIndex = getAnimationFrameIndex(); bool animationIsPlaying = getAnimationIsPlaying(); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setAnimationFPS); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); - READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); + if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setAnimationFPS); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); + } if (propertyFlags.getHasProperty(PROP_ANIMATION_PLAYING)) { if (animationIsPlaying != getAnimationIsPlaying()) { @@ -130,9 +127,22 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, } READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); - READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); + if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { + READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); + } else { + int bytesFromAnimation = _animationProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, + propertyFlags, overwriteLocalData); + + bytesRead += bytesFromAnimation; + dataAt += bytesFromAnimation; + + // FIXME -- we need to actually get the property values out of the _animationProperties + // and use them for our AnimationLoop + } + READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); + return bytesRead; } @@ -142,13 +152,9 @@ EntityPropertyFlags ModelEntityItem::getEntityProperties(EncodeBitstreamParams& requestedProperties += PROP_MODEL_URL; requestedProperties += PROP_COMPOUND_SHAPE_URL; - requestedProperties += PROP_ANIMATION_URL; - requestedProperties += PROP_ANIMATION_FPS; - requestedProperties += PROP_ANIMATION_FRAME_INDEX; - requestedProperties += PROP_ANIMATION_PLAYING; - requestedProperties += PROP_ANIMATION_SETTINGS; requestedProperties += PROP_TEXTURES; requestedProperties += PROP_SHAPE_TYPE; + requestedProperties += _animationProperties.getEntityProperties(params); return requestedProperties; } @@ -166,12 +172,12 @@ void ModelEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit 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_ANIMATION_URL, getAnimationURL()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getAnimationFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getAnimationFrameIndex()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getAnimationIsPlaying()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, getAnimationSettings()); + + // FIXME - we probably need to make sure the _animationProperties has the latest data from the AnimationLoop + _animationProperties.appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties, + propertyFlags, propertiesDidntFit, propertyCount, appendState); + APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); } diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index bf6d7a9785..c00766dfbe 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -79,6 +79,11 @@ public: // model related properties void setModelURL(const QString& url) { _modelURL = url; } virtual void setCompoundShapeURL(const QString& url); + + + // Animation related items... + const AnimationPropertyGroup& getAnimationProperties() const { return _animationProperties; } + void setAnimationURL(const QString& url); static const float DEFAULT_ANIMATION_FRAME_INDEX; void setAnimationFrameIndex(float value); @@ -134,9 +139,14 @@ protected: QString _compoundShapeURL; quint64 _lastAnimated; - QString _animationURL; + AnimationPropertyGroup _animationProperties; AnimationLoop _animationLoop; + + // FIXME - delete these + QString _animationURL; QString _animationSettings; + + QString _textures; ShapeType _shapeType = SHAPE_TYPE_NONE; diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 9d11dff55a..8b75bf29dd 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -168,11 +168,11 @@ EntityItemProperties ParticleEffectEntityItem::getProperties(EntityPropertyFlags COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getXColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(alpha, getAlpha); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationIsPlaying, getAnimationIsPlaying); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationFrameIndex, getAnimationFrameIndex); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationFPS, getAnimationFPS); + //COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationIsPlaying, getAnimationIsPlaying); + //COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationFrameIndex, getAnimationFrameIndex); + //COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationFPS, getAnimationFPS); COPY_ENTITY_PROPERTY_TO_PROPERTIES(glowLevel, getGlowLevel); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationSettings, getAnimationSettings); + //COPY_ENTITY_PROPERTY_TO_PROPERTIES(animationSettings, getAnimationSettings); COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); COPY_ENTITY_PROPERTY_TO_PROPERTIES(maxParticles, getMaxParticles); COPY_ENTITY_PROPERTY_TO_PROPERTIES(lifespan, getLifespan); @@ -208,11 +208,11 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); SET_ENTITY_PROPERTY_FROM_PROPERTIES(alpha, setAlpha); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationIsPlaying, setAnimationIsPlaying); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationFrameIndex, setAnimationFrameIndex); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationFPS, setAnimationFPS); + //SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationIsPlaying, setAnimationIsPlaying); + //SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationFrameIndex, setAnimationFrameIndex); + //SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationFPS, setAnimationFPS); SET_ENTITY_PROPERTY_FROM_PROPERTIES(glowLevel, setGlowLevel); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationSettings, setAnimationSettings); + //SET_ENTITY_PROPERTY_FROM_PROPERTIES(animationSettings, setAnimationSettings); SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); SET_ENTITY_PROPERTY_FROM_PROPERTIES(maxParticles, setMaxParticles); SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifespan, setLifespan); @@ -268,9 +268,11 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch float animationFPS = getAnimationFPS(); float animationFrameIndex = getAnimationFrameIndex(); bool animationIsPlaying = getAnimationIsPlaying(); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setAnimationFPS); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); - READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); + if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setAnimationFPS); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); + } if (propertyFlags.getHasProperty(PROP_ANIMATION_PLAYING)) { if (animationIsPlaying != getAnimationIsPlaying()) { @@ -283,7 +285,20 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch if (propertyFlags.getHasProperty(PROP_ANIMATION_FRAME_INDEX)) { setAnimationFrameIndex(animationFrameIndex); } - READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); + if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { + READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); + } + else { + int bytesFromAnimation = _animationProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, + propertyFlags, overwriteLocalData); + + bytesRead += bytesFromAnimation; + dataAt += bytesFromAnimation; + + // FIXME -- we need to actually get the property values out of the _animationProperties + // and use them for our AnimationLoop + } + READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); READ_ENTITY_PROPERTY(PROP_MAX_PARTICLES, quint32, setMaxParticles); READ_ENTITY_PROPERTY(PROP_LIFESPAN, float, setLifespan); @@ -348,10 +363,6 @@ EntityPropertyFlags ParticleEffectEntityItem::getEntityProperties(EncodeBitstrea EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); requestedProperties += PROP_COLOR; - requestedProperties += PROP_ANIMATION_FPS; - requestedProperties += PROP_ANIMATION_FRAME_INDEX; - requestedProperties += PROP_ANIMATION_PLAYING; - requestedProperties += PROP_ANIMATION_SETTINGS; requestedProperties += PROP_SHAPE_TYPE; requestedProperties += PROP_MAX_PARTICLES; requestedProperties += PROP_LIFESPAN; @@ -380,11 +391,13 @@ EntityPropertyFlags ParticleEffectEntityItem::getEntityProperties(EncodeBitstrea requestedProperties += PROP_AZIMUTH_START; requestedProperties += PROP_AZIMUTH_FINISH; + requestedProperties += _animationProperties.getEntityProperties(params); + return requestedProperties; } void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, - EntityTreeElementExtraEncodeData* modelTreeElementExtraEncodeData, + EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, @@ -393,10 +406,11 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getAnimationFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getAnimationFrameIndex()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getAnimationIsPlaying()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, getAnimationSettings()); + + // FIXME - we probably need to make sure the _animationProperties has the latest data from the AnimationLoop + _animationProperties.appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties, + propertyFlags, propertiesDidntFit, propertyCount, appendState); + APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, getMaxParticles()); APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, getLifespan()); diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index 74d39aa4af..4e37165b55 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -31,7 +31,7 @@ public: virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const; virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, - EntityTreeElementExtraEncodeData* modelTreeElementExtraEncodeData, + EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, @@ -91,6 +91,9 @@ public: virtual void debugDump() const; + + const AnimationPropertyGroup& getAnimationProperties() const { return _animationProperties; } + static const float DEFAULT_ANIMATION_FRAME_INDEX; void setAnimationFrameIndex(float value); void setAnimationSettings(const QString& value); @@ -245,9 +248,15 @@ protected: float _radiusStart = DEFAULT_RADIUS_START; float _radiusFinish = DEFAULT_RADIUS_FINISH; float _radiusSpread = DEFAULT_RADIUS_SPREAD; + + quint64 _lastAnimated; + AnimationPropertyGroup _animationProperties; AnimationLoop _animationLoop; + + // FIXME - remove this QString _animationSettings; + QString _textures = DEFAULT_TEXTURES; bool _texturesChangedFlag = false; ShapeType _shapeType = SHAPE_TYPE_NONE; diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index a8cf743686..bdf6f8c524 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -38,7 +38,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::EntityAdd: case PacketType::EntityEdit: case PacketType::EntityData: - return VERSION_ENTITIES_PARTICLE_ELLIPSOID_EMITTER; + return VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP; default: return 14; } diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 9f3c5950a2..25a99d65f7 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -141,5 +141,6 @@ const PacketVersion VERSION_ENTITIES_PARTICLE_RADIUS_PROPERTIES = 41; const PacketVersion VERSION_ENTITIES_PARTICLE_COLOR_PROPERTIES = 42; const PacketVersion VERSION_ENTITIES_PROTOCOL_HEADER_SWAP = 43; const PacketVersion VERSION_ENTITIES_PARTICLE_ELLIPSOID_EMITTER = 44; +const PacketVersion VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP = 45; #endif // hifi_PacketHeaders_h From 9fc684edf0692e6198757ef64bcc3331c1e5e27f Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Wed, 30 Sep 2015 20:51:37 -0700 Subject: [PATCH 02/30] first cut at migrating animation settings into a property group --- .../entities/src/AnimationPropertyGroup.cpp | 210 ++++++++++++++++++ .../entities/src/AnimationPropertyGroup.h | 83 +++++++ .../entities/src/EntityItemProperties.cpp | 7 - libraries/entities/src/EntityPropertyFlags.h | 6 + 4 files changed, 299 insertions(+), 7 deletions(-) create mode 100644 libraries/entities/src/AnimationPropertyGroup.cpp create mode 100644 libraries/entities/src/AnimationPropertyGroup.h diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp new file mode 100644 index 0000000000..bc2dc61601 --- /dev/null +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -0,0 +1,210 @@ +// +// AnimationPropertyGroup.cpp +// libraries/entities/src +// +// Created by Brad Hefta-Gaub on 12/4/13. +// Copyright 2013 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 + +#include "AnimationPropertyGroup.h" +#include "EntityItemProperties.h" +#include "EntityItemPropertiesMacros.h" + +AnimationPropertyGroup::AnimationPropertyGroup() { + //_url = QString(); +} + +void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, Animation, animation, URL, url); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, Animation, animation, FPS, fps); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, Animation, animation, FrameIndex, frameIndex); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, Animation, animation, Running, running); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_START_AUTOMATICALLY, Animation, animation, StartAutomatically, startAutomatically); +} + +void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, url, QString, setURL); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, fps, float, setFPS); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, frameIndex, float, setFrameIndex); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, running, bool, setRunning); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, loop, bool, setLoop); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, firstFrame, float, setFirstFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, lastFrame, float, setLastFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, hold, bool, setHold); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, startAutomatically, bool, setStartAutomatically); +} + +void AnimationPropertyGroup::debugDump() const { + qDebug() << " AnimationPropertyGroup: ---------------------------------------------"; + qDebug() << " URL:" << getURL() << " has changed:" << urlChanged(); +} + +bool AnimationPropertyGroup::appentToEditPacket(OctreePacketData* packetData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const { + + bool successPropertyFits = true; + + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); + + return true; +} + + +bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags, const unsigned char*& dataAt , int& processedBytes) { + + int bytesRead = 0; + bool overwriteLocalData = true; + + READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, setLoop); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, setFirstFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, float, setLastFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, setHold); + READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); + + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_URL, URL); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FPS, FPS); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FRAME_INDEX, FrameIndex); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_PLAYING, Running); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_LOOP, Loop); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FIRST_FRAME, FirstFrame); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_LAST_FRAME, LastFrame); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_HOLD, Hold); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_START_AUTOMATICALLY, StartAutomatically); + + processedBytes += bytesRead; + + return true; +} + +void AnimationPropertyGroup::markAllChanged() { + _urlChanged = true; + _fpsChanged = true; + _frameIndexChanged = true; + _runningChanged = true; +} + +EntityPropertyFlags AnimationPropertyGroup::getChangedProperties() const { + EntityPropertyFlags changedProperties; + + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_URL, url); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FPS, fps); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FRAME_INDEX, frameIndex); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_PLAYING, running); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_LOOP, loop); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FIRST_FRAME, firstFrame); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_LAST_FRAME, lastFrame); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_HOLD, hold); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_START_AUTOMATICALLY, startAutomatically); + + return changedProperties; +} + +void AnimationPropertyGroup::getProperties(EntityItemProperties& properties) const { + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, URL, getURL); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FPS, getFPS); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FrameIndex, getFrameIndex); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Running, getRunning); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Loop, getLoop); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FirstFrame, getFirstFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, LastFrame, getLastFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Hold, getHold); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, StartAutomatically, getStartAutomatically); +} + +bool AnimationPropertyGroup::setProperties(const EntityItemProperties& properties) { + bool somethingChanged = false; + + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, URL, url, setURL); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FPS, fps, setFPS); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FrameIndex, frameIndex, setFrameIndex); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Running, running, setRunning); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Loop, loop, setLoop); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FirstFrame, firstFrame, setFirstFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, LastFrame, lastFrame, setLastFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Hold, hold, setHold); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, setStartAutomatically); + + return somethingChanged; +} + +EntityPropertyFlags AnimationPropertyGroup::getEntityProperties(EncodeBitstreamParams& params) const { + EntityPropertyFlags requestedProperties; + + requestedProperties += PROP_ANIMATION_URL; + requestedProperties += PROP_ANIMATION_FPS; + requestedProperties += PROP_ANIMATION_FRAME_INDEX; + requestedProperties += PROP_ANIMATION_PLAYING; + requestedProperties += PROP_ANIMATION_LOOP; + requestedProperties += PROP_ANIMATION_FIRST_FRAME; + requestedProperties += PROP_ANIMATION_LAST_FRAME; + requestedProperties += PROP_ANIMATION_HOLD; + requestedProperties += PROP_ANIMATION_START_AUTOMATICALLY; + + return requestedProperties; +} + +void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const { + + bool successPropertyFits = true; + + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); +} + +int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + + int bytesRead = 0; + const unsigned char* dataAt = data; + + READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, setLoop); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, setFirstFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, float, setLastFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, setHold); + READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); + + return bytesRead; +} diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h new file mode 100644 index 0000000000..d931684e9e --- /dev/null +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -0,0 +1,83 @@ +// +// AnimationPropertyGroup.h +// libraries/entities/src +// +// Created by Brad Hefta-Gaub on 2015/9/30. +// Copyright 2013 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_AnimationPropertyGroup_h +#define hifi_AnimationPropertyGroup_h + +#include + +#include "PropertyGroup.h" +#include "EntityItemPropertiesMacros.h" + +class EntityItemProperties; +class EncodeBitstreamParams; +class OctreePacketData; +class EntityTreeElementExtraEncodeData; +class ReadBitstreamToTreeParams; + +#include +#include + + +class AnimationPropertyGroup : public PropertyGroup { +public: + AnimationPropertyGroup(); + virtual ~AnimationPropertyGroup() {} + + // EntityItemProperty related helpers + virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const; + virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings); + virtual void debugDump() const; + + virtual bool appentToEditPacket(OctreePacketData* packetData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const; + + virtual bool decodeFromEditPacket(EntityPropertyFlags& propertyFlags, const unsigned char*& dataAt , int& processedBytes); + virtual void markAllChanged(); + virtual EntityPropertyFlags getChangedProperties() const; + + // EntityItem related helpers + // methods for getting/setting all properties of an entity + virtual void getProperties(EntityItemProperties& propertiesOut) const; + + /// returns true if something changed + virtual bool setProperties(const EntityItemProperties& properties); + + virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const; + + virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const; + + virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + + DEFINE_PROPERTY_REF(PROP_ANIMATION_URL, URL, url, QString); + DEFINE_PROPERTY(PROP_ANIMATION_FPS, FPS, fps, float); + DEFINE_PROPERTY(PROP_ANIMATION_FRAME_INDEX, FrameIndex, frameIndex, float); + DEFINE_PROPERTY(PROP_ANIMATION_PLAYING, Running, running, bool); // was animationIsPlaying + DEFINE_PROPERTY(PROP_ANIMATION_LOOP, Loop, loop, bool); // was animationSettings.loop + DEFINE_PROPERTY(PROP_ANIMATION_FIRST_FRAME, FirstFrame, firstFrame, float); // was animationSettings.firstFrame + DEFINE_PROPERTY(PROP_ANIMATION_LAST_FRAME, LastFrame, lastFrame, float); // was animationSettings.lastFrame + DEFINE_PROPERTY(PROP_ANIMATION_HOLD, Hold, hold, bool); // was animationSettings.hold + DEFINE_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, StartAutomatically, startAutomatically, bool); // was animationSettings.startAutomatically +}; + +#endif // hifi_AnimationPropertyGroup_h diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index ea80b27877..d29b1d6a46 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1537,13 +1537,6 @@ void EntityItemProperties::markAllChanged() { _alphaChanged = true; _modelURLChanged = true; _compoundShapeURLChanged = true; - /* - _animationURLChanged = true; - _animationIsPlayingChanged = true; - _animationFrameIndexChanged = true; - _animationFPSChanged = true; - _animationSettingsChanged = true; - */ _glowLevelChanged = true; _localRenderAlphaChanged = true; _isSpotlightChanged = true; diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 71215a5596..849e3e3a61 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -143,6 +143,12 @@ enum EntityPropertyList { PROP_AZIMUTH_START, PROP_AZIMUTH_FINISH, + PROP_ANIMATION_LOOP, + PROP_ANIMATION_FIRST_FRAME, + PROP_ANIMATION_LAST_FRAME, + PROP_ANIMATION_HOLD, + PROP_ANIMATION_START_AUTOMATICALLY, + //////////////////////////////////////////////////////////////////////////////////////////////////// // ATTENTION: add new properties to end of list just ABOVE this line PROP_AFTER_LAST_ITEM, From d7ee41cc2326f4ade5115c8bc009aca4d1cf636e Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Wed, 30 Sep 2015 20:51:37 -0700 Subject: [PATCH 03/30] first cut at migrating animation settings into a property group --- .../entities/src/AnimationPropertyGroup.cpp | 210 ++++++++++++++++++ .../entities/src/AnimationPropertyGroup.h | 83 +++++++ .../entities/src/EntityItemProperties.cpp | 37 +-- libraries/entities/src/EntityPropertyFlags.h | 6 + 4 files changed, 310 insertions(+), 26 deletions(-) create mode 100644 libraries/entities/src/AnimationPropertyGroup.cpp create mode 100644 libraries/entities/src/AnimationPropertyGroup.h diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp new file mode 100644 index 0000000000..bc2dc61601 --- /dev/null +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -0,0 +1,210 @@ +// +// AnimationPropertyGroup.cpp +// libraries/entities/src +// +// Created by Brad Hefta-Gaub on 12/4/13. +// Copyright 2013 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 + +#include "AnimationPropertyGroup.h" +#include "EntityItemProperties.h" +#include "EntityItemPropertiesMacros.h" + +AnimationPropertyGroup::AnimationPropertyGroup() { + //_url = QString(); +} + +void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, Animation, animation, URL, url); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, Animation, animation, FPS, fps); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, Animation, animation, FrameIndex, frameIndex); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, Animation, animation, Running, running); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_START_AUTOMATICALLY, Animation, animation, StartAutomatically, startAutomatically); +} + +void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, url, QString, setURL); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, fps, float, setFPS); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, frameIndex, float, setFrameIndex); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, running, bool, setRunning); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, loop, bool, setLoop); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, firstFrame, float, setFirstFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, lastFrame, float, setLastFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, hold, bool, setHold); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, startAutomatically, bool, setStartAutomatically); +} + +void AnimationPropertyGroup::debugDump() const { + qDebug() << " AnimationPropertyGroup: ---------------------------------------------"; + qDebug() << " URL:" << getURL() << " has changed:" << urlChanged(); +} + +bool AnimationPropertyGroup::appentToEditPacket(OctreePacketData* packetData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const { + + bool successPropertyFits = true; + + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); + + return true; +} + + +bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags, const unsigned char*& dataAt , int& processedBytes) { + + int bytesRead = 0; + bool overwriteLocalData = true; + + READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, setLoop); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, setFirstFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, float, setLastFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, setHold); + READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); + + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_URL, URL); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FPS, FPS); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FRAME_INDEX, FrameIndex); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_PLAYING, Running); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_LOOP, Loop); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FIRST_FRAME, FirstFrame); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_LAST_FRAME, LastFrame); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_HOLD, Hold); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_START_AUTOMATICALLY, StartAutomatically); + + processedBytes += bytesRead; + + return true; +} + +void AnimationPropertyGroup::markAllChanged() { + _urlChanged = true; + _fpsChanged = true; + _frameIndexChanged = true; + _runningChanged = true; +} + +EntityPropertyFlags AnimationPropertyGroup::getChangedProperties() const { + EntityPropertyFlags changedProperties; + + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_URL, url); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FPS, fps); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FRAME_INDEX, frameIndex); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_PLAYING, running); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_LOOP, loop); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FIRST_FRAME, firstFrame); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_LAST_FRAME, lastFrame); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_HOLD, hold); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_START_AUTOMATICALLY, startAutomatically); + + return changedProperties; +} + +void AnimationPropertyGroup::getProperties(EntityItemProperties& properties) const { + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, URL, getURL); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FPS, getFPS); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FrameIndex, getFrameIndex); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Running, getRunning); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Loop, getLoop); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FirstFrame, getFirstFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, LastFrame, getLastFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Hold, getHold); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, StartAutomatically, getStartAutomatically); +} + +bool AnimationPropertyGroup::setProperties(const EntityItemProperties& properties) { + bool somethingChanged = false; + + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, URL, url, setURL); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FPS, fps, setFPS); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FrameIndex, frameIndex, setFrameIndex); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Running, running, setRunning); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Loop, loop, setLoop); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FirstFrame, firstFrame, setFirstFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, LastFrame, lastFrame, setLastFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Hold, hold, setHold); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, setStartAutomatically); + + return somethingChanged; +} + +EntityPropertyFlags AnimationPropertyGroup::getEntityProperties(EncodeBitstreamParams& params) const { + EntityPropertyFlags requestedProperties; + + requestedProperties += PROP_ANIMATION_URL; + requestedProperties += PROP_ANIMATION_FPS; + requestedProperties += PROP_ANIMATION_FRAME_INDEX; + requestedProperties += PROP_ANIMATION_PLAYING; + requestedProperties += PROP_ANIMATION_LOOP; + requestedProperties += PROP_ANIMATION_FIRST_FRAME; + requestedProperties += PROP_ANIMATION_LAST_FRAME; + requestedProperties += PROP_ANIMATION_HOLD; + requestedProperties += PROP_ANIMATION_START_AUTOMATICALLY; + + return requestedProperties; +} + +void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const { + + bool successPropertyFits = true; + + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); +} + +int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + + int bytesRead = 0; + const unsigned char* dataAt = data; + + READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, setLoop); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, setFirstFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, float, setLastFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, setHold); + READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); + + return bytesRead; +} diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h new file mode 100644 index 0000000000..d931684e9e --- /dev/null +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -0,0 +1,83 @@ +// +// AnimationPropertyGroup.h +// libraries/entities/src +// +// Created by Brad Hefta-Gaub on 2015/9/30. +// Copyright 2013 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_AnimationPropertyGroup_h +#define hifi_AnimationPropertyGroup_h + +#include + +#include "PropertyGroup.h" +#include "EntityItemPropertiesMacros.h" + +class EntityItemProperties; +class EncodeBitstreamParams; +class OctreePacketData; +class EntityTreeElementExtraEncodeData; +class ReadBitstreamToTreeParams; + +#include +#include + + +class AnimationPropertyGroup : public PropertyGroup { +public: + AnimationPropertyGroup(); + virtual ~AnimationPropertyGroup() {} + + // EntityItemProperty related helpers + virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const; + virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings); + virtual void debugDump() const; + + virtual bool appentToEditPacket(OctreePacketData* packetData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const; + + virtual bool decodeFromEditPacket(EntityPropertyFlags& propertyFlags, const unsigned char*& dataAt , int& processedBytes); + virtual void markAllChanged(); + virtual EntityPropertyFlags getChangedProperties() const; + + // EntityItem related helpers + // methods for getting/setting all properties of an entity + virtual void getProperties(EntityItemProperties& propertiesOut) const; + + /// returns true if something changed + virtual bool setProperties(const EntityItemProperties& properties); + + virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const; + + virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const; + + virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + + DEFINE_PROPERTY_REF(PROP_ANIMATION_URL, URL, url, QString); + DEFINE_PROPERTY(PROP_ANIMATION_FPS, FPS, fps, float); + DEFINE_PROPERTY(PROP_ANIMATION_FRAME_INDEX, FrameIndex, frameIndex, float); + DEFINE_PROPERTY(PROP_ANIMATION_PLAYING, Running, running, bool); // was animationIsPlaying + DEFINE_PROPERTY(PROP_ANIMATION_LOOP, Loop, loop, bool); // was animationSettings.loop + DEFINE_PROPERTY(PROP_ANIMATION_FIRST_FRAME, FirstFrame, firstFrame, float); // was animationSettings.firstFrame + DEFINE_PROPERTY(PROP_ANIMATION_LAST_FRAME, LastFrame, lastFrame, float); // was animationSettings.lastFrame + DEFINE_PROPERTY(PROP_ANIMATION_HOLD, Hold, hold, bool); // was animationSettings.hold + DEFINE_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, StartAutomatically, startAutomatically, bool); // was animationSettings.startAutomatically +}; + +#endif // hifi_AnimationPropertyGroup_h diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index ea80b27877..d98169fade 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -30,6 +30,7 @@ #include "LineEntityItem.h" #include "PolyLineEntityItem.h" +AnimationPropertyGroup EntityItemProperties::_staticAnimation; AtmospherePropertyGroup EntityItemProperties::_staticAtmosphere; SkyboxPropertyGroup EntityItemProperties::_staticSkybox; StagePropertyGroup EntityItemProperties::_staticStage; @@ -1090,13 +1091,11 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem if (properties.getType() == EntityTypes::Model) { APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, properties.getModelURL()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); - //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, properties.getAnimationURL()); - //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, properties.getAnimationFPS()); - //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, properties.getAnimationFrameIndex()); - //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, properties.getAnimationIsPlaying()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); - //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, properties.getAnimationSettings()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); + + _staticAnimation.setProperties(properties); + _staticAnimation.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); } if (properties.getType() == EntityTypes::Light) { @@ -1108,10 +1107,9 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem } if (properties.getType() == EntityTypes::ParticleEffect) { - //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, properties.getAnimationFPS()); - //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, properties.getAnimationFrameIndex()); - //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, properties.getAnimationIsPlaying()); - //APPEND_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, properties.getAnimationSettings()); + _staticAnimation.setProperties(properties); + _staticAnimation.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); + APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, properties.getMaxParticles()); APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, properties.getLifespan()); @@ -1380,13 +1378,10 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Model) { 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_ANIMATION_URL, QString, setAnimationURL); - //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FPS, float, setAnimationFPS); - //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); - //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); - //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); + + properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); } if (properties.getType() == EntityTypes::Light) { @@ -1398,12 +1393,9 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::ParticleEffect) { - //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FPS, float, setAnimationFPS); - //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); - //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); - //READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); + properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MAX_PARTICLES, float, setMaxParticles); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFESPAN, float, setLifespan); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_RATE, float, setEmitRate); @@ -1537,13 +1529,6 @@ void EntityItemProperties::markAllChanged() { _alphaChanged = true; _modelURLChanged = true; _compoundShapeURLChanged = true; - /* - _animationURLChanged = true; - _animationIsPlayingChanged = true; - _animationFrameIndexChanged = true; - _animationFPSChanged = true; - _animationSettingsChanged = true; - */ _glowLevelChanged = true; _localRenderAlphaChanged = true; _isSpotlightChanged = true; diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 71215a5596..849e3e3a61 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -143,6 +143,12 @@ enum EntityPropertyList { PROP_AZIMUTH_START, PROP_AZIMUTH_FINISH, + PROP_ANIMATION_LOOP, + PROP_ANIMATION_FIRST_FRAME, + PROP_ANIMATION_LAST_FRAME, + PROP_ANIMATION_HOLD, + PROP_ANIMATION_START_AUTOMATICALLY, + //////////////////////////////////////////////////////////////////////////////////////////////////// // ATTENTION: add new properties to end of list just ABOVE this line PROP_AFTER_LAST_ITEM, From aca25bd76ef016e15612225f7b177c1321e06995 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 1 Oct 2015 11:05:16 -0700 Subject: [PATCH 04/30] connect up AnimationPropertyGroup to AnimationLoop --- .../example/entities/animatedModelExample.js | 19 +- libraries/animation/src/AnimationLoop.cpp | 23 +- libraries/animation/src/AnimationLoop.h | 24 +- .../entities/src/AnimationPropertyGroup.cpp | 237 +++++++++++++----- .../entities/src/AnimationPropertyGroup.h | 18 +- .../entities/src/AtmospherePropertyGroup.cpp | 2 +- .../entities/src/AtmospherePropertyGroup.h | 2 +- .../entities/src/EntityItemProperties.cpp | 28 +-- libraries/entities/src/EntityItemProperties.h | 4 +- .../entities/src/EntityItemPropertiesMacros.h | 12 + libraries/entities/src/ModelEntityItem.cpp | 35 +-- .../entities/src/ParticleEffectEntityItem.cpp | 6 +- libraries/entities/src/PropertyGroup.h | 2 +- .../entities/src/SkyboxPropertyGroup.cpp | 2 +- libraries/entities/src/SkyboxPropertyGroup.h | 2 +- libraries/entities/src/StagePropertyGroup.cpp | 2 +- libraries/entities/src/StagePropertyGroup.h | 2 +- 17 files changed, 285 insertions(+), 135 deletions(-) diff --git a/examples/example/entities/animatedModelExample.js b/examples/example/entities/animatedModelExample.js index af2fab05a0..47bca9cfb0 100644 --- a/examples/example/entities/animatedModelExample.js +++ b/examples/example/entities/animatedModelExample.js @@ -37,8 +37,12 @@ var originalProperties = { modelURL: "http://public.highfidelity.io/cozza13/club/dragon/dragon.fbx", rotation: rotation, - animationURL: "http://public.highfidelity.io/cozza13/club/dragon/flying.fbx", - animationIsPlaying: true, + //animationURL: "http://public.highfidelity.io/cozza13/club/dragon/flying.fbx", + //animationIsPlaying: true, + animationSettings: { + url: "http://public.highfidelity.io/cozza13/club/dragon/flying.fbx", + running: true + } }; var modelID = Entities.addEntity(originalProperties); @@ -99,13 +103,18 @@ function moveModel(deltaTime) { if (somethingChanged) { var newProperties = { - animationIsPlaying: isPlaying, - animationFPS: animationFPS, + //animationIsPlaying: isPlaying, + //animationFPS: animationFPS, + animationSettings: { + running: isPlaying, + fps: animationFPS + } }; if (resetFrame) { print("resetting the frame!"); - newProperties.animationFrameIndex = 0; + //newProperties.animationFrameIndex = 0; + newProperties.animationSettings.frameIndex = 0; resetFrame = false; } diff --git a/libraries/animation/src/AnimationLoop.cpp b/libraries/animation/src/AnimationLoop.cpp index a2a27170c2..6ad724922e 100644 --- a/libraries/animation/src/AnimationLoop.cpp +++ b/libraries/animation/src/AnimationLoop.cpp @@ -14,16 +14,17 @@ const float AnimationLoop::MAXIMUM_POSSIBLE_FRAME = 100000.0f; -AnimationLoop::AnimationLoop() : - _fps(30.0f), - _loop(false), - _hold(false), - _startAutomatically(false), - _firstFrame(0.0f), - _lastFrame(MAXIMUM_POSSIBLE_FRAME), - _running(false), - _frameIndex(0.0f), - _maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME) +AnimationLoop::AnimationLoop() +/*: +_fps(30.0f), +_loop(false), +_hold(false), +_startAutomatically(false), +_firstFrame(0.0f), +_lastFrame(MAXIMUM_POSSIBLE_FRAME), +_running(false), +_frameIndex(0.0f), +_maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME)*/ { } @@ -89,7 +90,7 @@ void AnimationLoop::setRunning(bool running) { _running = running; // If we just set running to true, then also reset the frame to the first frame - if (running) { + if (running && _resetOnRunning) { // move back to the beginning _frameIndex = _firstFrame; } diff --git a/libraries/animation/src/AnimationLoop.h b/libraries/animation/src/AnimationLoop.h index 02161544ba..3c6079d967 100644 --- a/libraries/animation/src/AnimationLoop.h +++ b/libraries/animation/src/AnimationLoop.h @@ -41,7 +41,12 @@ public: void setLastFrame(float lastFrame) { _lastFrame = glm::clamp(lastFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); } float getLastFrame() const { return _lastFrame; } + /// by default the AnimationLoop will always reset to the first frame on any call to setRunning + /// this is not desirable in the case of entities with animations, if you don't want the reset + /// to happen then call this method with false; + void setResetOnRunning(bool resetOnRunning) { _resetOnRunning = resetOnRunning; } void setRunning(bool running); + bool getRunning() const { return _running; } bool isRunning() const { return _running; } void setFrameIndex(float frameIndex) { _frameIndex = glm::clamp(frameIndex, _firstFrame, _lastFrame); } @@ -55,15 +60,16 @@ public: void simulate(float deltaTime); private: - float _fps; - bool _loop; - bool _hold; - bool _startAutomatically; - float _firstFrame; - float _lastFrame; - bool _running; - float _frameIndex; - float _maxFrameIndexHint; + float _fps = 30.0f; + bool _loop = false; + bool _hold = false; + bool _startAutomatically = false; + float _firstFrame = 0.0f; + float _lastFrame = MAXIMUM_POSSIBLE_FRAME; + bool _running = false; + float _frameIndex = 0.0f; + float _maxFrameIndexHint = MAXIMUM_POSSIBLE_FRAME; + bool _resetOnRunning = false; }; #endif // hifi_AnimationLoop_h diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index bc2dc61601..a93becd7fb 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -11,6 +11,8 @@ #include +#include + #include "AnimationPropertyGroup.h" #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" @@ -20,27 +22,51 @@ AnimationPropertyGroup::AnimationPropertyGroup() { } void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, Animation, animation, URL, url); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, Animation, animation, FPS, fps); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, Animation, animation, FrameIndex, frameIndex); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, Animation, animation, Running, running); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_START_AUTOMATICALLY, Animation, animation, StartAutomatically, startAutomatically); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, AnimationSettings, animationSettings, URL, url); + + if (_animationLoop) { + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FPS, AnimationSettings, animationSettings, FPS, fps, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, FrameIndex, frameIndex, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, Running, running, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LOOP, AnimationSettings, animationSettings, Loop, loop, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FIRST_FRAME, AnimationSettings, animationSettings, FirstFrame, firstFrame, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LAST_FRAME, AnimationSettings, animationSettings, LastFrame, lastFrame, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_HOLD, AnimationSettings, animationSettings, Hold, hold, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_START_AUTOMATICALLY, AnimationSettings, animationSettings, StartAutomatically, startAutomatically, _animationLoop->getFPS); + } else { + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, AnimationSettings, animationSettings, FPS, fps); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, FrameIndex, frameIndex); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, Running, running); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LOOP, AnimationSettings, animationSettings, Loop, loop); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FIRST_FRAME, AnimationSettings, animationSettings, FirstFrame, firstFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LAST_FRAME, AnimationSettings, animationSettings, LastFrame, lastFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_HOLD, AnimationSettings, animationSettings, Hold, hold); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_START_AUTOMATICALLY, AnimationSettings, animationSettings, StartAutomatically, startAutomatically); + } } void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, url, QString, setURL); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, fps, float, setFPS); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, frameIndex, float, setFrameIndex); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, running, bool, setRunning); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, loop, bool, setLoop); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, firstFrame, float, setFirstFrame); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, lastFrame, float, setLastFrame); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, hold, bool, setHold); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, startAutomatically, bool, setStartAutomatically); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, url, QString, setURL); + + if (_animationLoop) { + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, fps, float, _animationLoop->setFPS); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, frameIndex, float, _animationLoop->setFrameIndex); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, running, bool, _animationLoop->setRunning); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, loop, bool, _animationLoop->setLoop); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, firstFrame, float, _animationLoop->setFirstFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, lastFrame, float, _animationLoop->setLastFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, hold, bool, _animationLoop->setHold); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, startAutomatically, bool, _animationLoop->setStartAutomatically); + } else { + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, fps, float, setFPS); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, frameIndex, float, setFrameIndex); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, running, bool, setRunning); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, loop, bool, setLoop); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, firstFrame, float, setFirstFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, lastFrame, float, setLastFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, hold, bool, setHold); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, startAutomatically, bool, setStartAutomatically); + } } void AnimationPropertyGroup::debugDump() const { @@ -48,7 +74,7 @@ void AnimationPropertyGroup::debugDump() const { qDebug() << " URL:" << getURL() << " has changed:" << urlChanged(); } -bool AnimationPropertyGroup::appentToEditPacket(OctreePacketData* packetData, +bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, @@ -58,14 +84,25 @@ bool AnimationPropertyGroup::appentToEditPacket(OctreePacketData* packetData, bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getRunning()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); + if (_animationLoop) { + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, _animationLoop->getFPS()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, _animationLoop->getLoop()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, _animationLoop->getFirstFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, _animationLoop->getLastFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, _animationLoop->getHold()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, _animationLoop->getStartAutomatically()); + } else { + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); + } return true; } @@ -77,14 +114,25 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF bool overwriteLocalData = true; READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); - READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); - READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, setLoop); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, setFirstFrame); - READ_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, float, setLastFrame); - READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, setHold); - READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); + if (_animationLoop) { + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, _animationLoop->setFPS); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, _animationLoop->setRunning); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, _animationLoop->setLoop); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, _animationLoop->setFirstFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, float, _animationLoop->setLastFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, _animationLoop->setHold); + READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, _animationLoop->setStartAutomatically); + } else { + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, setLoop); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, setFirstFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, float, setLastFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, setHold); + READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); + } DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_URL, URL); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FPS, FPS); @@ -125,29 +173,55 @@ EntityPropertyFlags AnimationPropertyGroup::getChangedProperties() const { } void AnimationPropertyGroup::getProperties(EntityItemProperties& properties) const { - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, URL, getURL); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FPS, getFPS); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FrameIndex, getFrameIndex); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Running, getRunning); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Loop, getLoop); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FirstFrame, getFirstFrame); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, LastFrame, getLastFrame); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Hold, getHold); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, StartAutomatically, getStartAutomatically); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, URL, getURL); + + if (_animationLoop) { + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FPS, _animationLoop->getFPS); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FrameIndex, _animationLoop->getFrameIndex); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Running, _animationLoop->getRunning); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Loop, _animationLoop->getLoop); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FirstFrame, _animationLoop->getFirstFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, LastFrame, _animationLoop->getLastFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Hold, _animationLoop->getHold); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, StartAutomatically, _animationLoop->getStartAutomatically); + } else { + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FPS, getFPS); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FrameIndex, getFrameIndex); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Running, getRunning); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Loop, getLoop); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FirstFrame, getFirstFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, LastFrame, getLastFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Hold, getHold); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, StartAutomatically, getStartAutomatically); + } } bool AnimationPropertyGroup::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, URL, url, setURL); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FPS, fps, setFPS); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FrameIndex, frameIndex, setFrameIndex); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Running, running, setRunning); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Loop, loop, setLoop); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FirstFrame, firstFrame, setFirstFrame); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, LastFrame, lastFrame, setLastFrame); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Hold, hold, setHold); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, setStartAutomatically); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, URL, url, setURL); + + if (_animationLoop) { + qDebug() << "AnimationPropertyGroup::setProperties() -- apply new properties to our associated AnimationLoop"; + + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FPS, fps, _animationLoop->setFPS); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FrameIndex, frameIndex, _animationLoop->setFrameIndex); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Running, running, _animationLoop->setRunning); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Loop, loop, _animationLoop->setLoop); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FirstFrame, firstFrame, _animationLoop->setFirstFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, LastFrame, lastFrame, _animationLoop->setLastFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Hold, hold, _animationLoop->setHold); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, StartAutomatically, startAutomatically, _animationLoop->setStartAutomatically); + } else { + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FPS, fps, setFPS); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FrameIndex, frameIndex, setFrameIndex); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Running, running, setRunning); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Loop, loop, setLoop); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FirstFrame, firstFrame, setFirstFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, LastFrame, lastFrame, setLastFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Hold, hold, setHold); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, StartAutomatically, startAutomatically, setStartAutomatically); + } return somethingChanged; } @@ -179,14 +253,25 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getRunning()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); + if (_animationLoop) { + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); + } else { + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, _animationLoop->getFPS()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, _animationLoop->getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, _animationLoop->getLoop()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, _animationLoop->getFirstFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, _animationLoop->getLastFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, _animationLoop->getHold()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, _animationLoop->getStartAutomatically()); + } } int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, @@ -197,14 +282,28 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); - READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); - READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, setLoop); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, setFirstFrame); - READ_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, float, setLastFrame); - READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, setHold); - READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); + if (_animationLoop) { + // apply new properties to our associated AnimationLoop + qDebug() << "AnimationPropertyGroup::readEntitySubclassDataFromBuffer() -- apply new properties to our associated AnimationLoop"; + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, _animationLoop->setFPS); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, _animationLoop->setRunning); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, _animationLoop->setLoop); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, _animationLoop->setFirstFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, float, _animationLoop->setLastFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, _animationLoop->setHold); + READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, _animationLoop->setStartAutomatically); + } else { + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, setLoop); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, setFirstFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, float, setLastFrame); + READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, setHold); + READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); + } + return bytesRead; } diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index d931684e9e..a26975a83c 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -9,6 +9,16 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // + +// FIXME - TODO +// 1) make EntityItemProperties support old versions of animation properties +// DONE - 2) rename the group animationSettings +// 3) make sure that setting properties and reading from stream actually set the animationLoop object properly +// 4) test it! +// 5) update all scripts +// 6) remove all remnants of old member variables +// 7) research and remove animation settings from Particle Effect + #ifndef hifi_AnimationPropertyGroup_h #define hifi_AnimationPropertyGroup_h @@ -22,6 +32,7 @@ class EncodeBitstreamParams; class OctreePacketData; class EntityTreeElementExtraEncodeData; class ReadBitstreamToTreeParams; +class AnimationLoop; #include #include @@ -37,7 +48,7 @@ public: virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings); virtual void debugDump() const; - virtual bool appentToEditPacket(OctreePacketData* packetData, + virtual bool appendToEditPacket(OctreePacketData* packetData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, @@ -78,6 +89,11 @@ public: DEFINE_PROPERTY(PROP_ANIMATION_LAST_FRAME, LastFrame, lastFrame, float); // was animationSettings.lastFrame DEFINE_PROPERTY(PROP_ANIMATION_HOLD, Hold, hold, bool); // was animationSettings.hold DEFINE_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, StartAutomatically, startAutomatically, bool); // was animationSettings.startAutomatically + +public: + void associateWithAnimationLoop(AnimationLoop* animationLoop) { _animationLoop = animationLoop; } +private: + AnimationLoop* _animationLoop = nullptr; }; #endif // hifi_AnimationPropertyGroup_h diff --git a/libraries/entities/src/AtmospherePropertyGroup.cpp b/libraries/entities/src/AtmospherePropertyGroup.cpp index f8117dbb62..676a214b81 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.cpp +++ b/libraries/entities/src/AtmospherePropertyGroup.cpp @@ -63,7 +63,7 @@ void AtmospherePropertyGroup::debugDump() const { qDebug() << " Has Stars:" << getHasStars() << " has changed:" << hasStarsChanged(); } -bool AtmospherePropertyGroup::appentToEditPacket(OctreePacketData* packetData, +bool AtmospherePropertyGroup::appendToEditPacket(OctreePacketData* packetData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, diff --git a/libraries/entities/src/AtmospherePropertyGroup.h b/libraries/entities/src/AtmospherePropertyGroup.h index c4b50822fa..715b923feb 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.h +++ b/libraries/entities/src/AtmospherePropertyGroup.h @@ -57,7 +57,7 @@ public: virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings); virtual void debugDump() const; - virtual bool appentToEditPacket(OctreePacketData* packetData, + virtual bool appendToEditPacket(OctreePacketData* packetData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index b5bd032949..5c4c89a465 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -30,7 +30,7 @@ #include "LineEntityItem.h" #include "PolyLineEntityItem.h" -AnimationPropertyGroup EntityItemProperties::_staticAnimation; +AnimationPropertyGroup EntityItemProperties::_staticAnimationSettings; AtmospherePropertyGroup EntityItemProperties::_staticAtmosphere; SkyboxPropertyGroup EntityItemProperties::_staticSkybox; StagePropertyGroup EntityItemProperties::_staticStage; @@ -430,7 +430,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_Y_P_NEIGHBOR_ID, yPNeighborID); CHECK_PROPERTY_CHANGE(PROP_Z_P_NEIGHBOR_ID, zPNeighborID); - changedProperties += _animation.getChangedProperties(); + changedProperties += _animationSettings.getChangedProperties(); changedProperties += _atmosphere.getChangedProperties(); changedProperties += _skybox.getChangedProperties(); changedProperties += _stage.getChangedProperties(); @@ -537,7 +537,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Models & Particles if (_type == EntityTypes::Model || _type == EntityTypes::ParticleEffect) { - _animation.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); + _animationSettings.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); } @@ -740,7 +740,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool //COPY_PROPERTY_FROM_QSCRIPTVALUE(simulationOwner, ???, setSimulatorPriority); } - _animation.copyFromScriptValue(object, _defaultSettings); + _animationSettings.copyFromScriptValue(object, _defaultSettings); _atmosphere.copyFromScriptValue(object, _defaultSettings); _skybox.copyFromScriptValue(object, _defaultSettings); _stage.copyFromScriptValue(object, _defaultSettings); @@ -1096,8 +1096,8 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); - _staticAnimation.setProperties(properties); - _staticAnimation.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); + _staticAnimationSettings.setProperties(properties); + _staticAnimationSettings.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); } if (properties.getType() == EntityTypes::Light) { @@ -1109,8 +1109,8 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem } if (properties.getType() == EntityTypes::ParticleEffect) { - _staticAnimation.setProperties(properties); - _staticAnimation.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); + _staticAnimationSettings.setProperties(properties); + _staticAnimationSettings.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, properties.getMaxParticles()); @@ -1146,7 +1146,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, properties.getKeyLightDirection()); _staticStage.setProperties(properties); - _staticStage.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); + _staticStage.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()); @@ -1154,10 +1154,10 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_MODE, (uint32_t)properties.getBackgroundMode()); _staticAtmosphere.setProperties(properties); - _staticAtmosphere.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); + _staticAtmosphere.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); _staticSkybox.setProperties(properties); - _staticSkybox.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); + _staticSkybox.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); } if (properties.getType() == EntityTypes::PolyVox) { @@ -1383,7 +1383,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); - properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); + properties.getAnimationSettings().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); } if (properties.getType() == EntityTypes::Light) { @@ -1395,7 +1395,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::ParticleEffect) { - properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); + properties.getAnimationSettings().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MAX_PARTICLES, float, setMaxParticles); @@ -1583,7 +1583,7 @@ void EntityItemProperties::markAllChanged() { _backgroundModeChanged = true; - _animation.markAllChanged(); + _animationSettings.markAllChanged(); _atmosphere.markAllChanged(); _skybox.markAllChanged(); _stage.markAllChanged(); diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index c8bf0836d5..82095b6b71 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -165,7 +165,7 @@ public: DEFINE_PROPERTY_GROUP(Stage, stage, StagePropertyGroup); DEFINE_PROPERTY_GROUP(Atmosphere, atmosphere, AtmospherePropertyGroup); DEFINE_PROPERTY_GROUP(Skybox, skybox, SkyboxPropertyGroup); - DEFINE_PROPERTY_GROUP(Animation, animation, AnimationPropertyGroup); + DEFINE_PROPERTY_GROUP(AnimationSettings, animationSettings, AnimationPropertyGroup); DEFINE_PROPERTY_REF(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString); DEFINE_PROPERTY(PROP_LINE_WIDTH, LineWidth, lineWidth, float); DEFINE_PROPERTY_REF(LINE_POINTS, LinePoints, linePoints, QVector); @@ -373,7 +373,7 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, YPNeighborID, yPNeighborID, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, ZPNeighborID, zPNeighborID, ""); - properties.getAnimation().debugDump(); + properties.getAnimationSettings().debugDump(); properties.getAtmosphere().debugDump(); properties.getSkybox().debugDump(); properties.getStage().debugDump(); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 731e49b388..6b2a21ddf5 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -131,6 +131,18 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const EntityItemID& v) properties.setProperty(#g, groupProperties); \ } +#define COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(X,G,g,P,p,M) \ + if ((desiredProperties.isEmpty() || desiredProperties.getHasProperty(X)) && \ + (!skipDefaults || defaultEntityProperties.get##G().get##P() != get##P())) { \ + QScriptValue groupProperties = properties.property(#g); \ + if (!groupProperties.isValid()) { \ + groupProperties = engine->newObject(); \ + } \ + QScriptValue V = convertScriptValue(engine, M()); \ + groupProperties.setProperty(#p, V); \ + properties.setProperty(#g, groupProperties); \ + } + #define COPY_PROPERTY_TO_QSCRIPTVALUE(p,P) \ if ((_desiredProperties.isEmpty() || _desiredProperties.getHasProperty(p)) && \ (!skipDefaults || defaultEntityProperties._##P != _##P)) { \ diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 738d28f026..de06fecd81 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -41,6 +41,9 @@ ModelEntityItem::ModelEntityItem(const EntityItemID& entityItemID, const EntityI _jointMappingCompleted = false; _lastKnownFrameIndex = -1; _color[0] = _color[1] = _color[2] = 0; + + _animationProperties.associateWithAnimationLoop(&_animationLoop); + _animationLoop.setResetOnRunning(false); } EntityItemProperties ModelEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { @@ -107,39 +110,39 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, // Because we're using AnimationLoop which will reset the frame index if you change it's running state // we want to read these values in the order they appear in the buffer, but call our setters in an // order that allows AnimationLoop to preserve the correct frame rate. - float animationFPS = getAnimationFPS(); - float animationFrameIndex = getAnimationFrameIndex(); - bool animationIsPlaying = getAnimationIsPlaying(); if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { + float animationFPS = getAnimationFPS(); + float animationFrameIndex = getAnimationFrameIndex(); + bool animationIsPlaying = getAnimationIsPlaying(); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setAnimationFPS); READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); - } - if (propertyFlags.getHasProperty(PROP_ANIMATION_PLAYING)) { - if (animationIsPlaying != getAnimationIsPlaying()) { - setAnimationIsPlaying(animationIsPlaying); + if (propertyFlags.getHasProperty(PROP_ANIMATION_PLAYING)) { + if (animationIsPlaying != getAnimationIsPlaying()) { + setAnimationIsPlaying(animationIsPlaying); + } + } + if (propertyFlags.getHasProperty(PROP_ANIMATION_FPS)) { + setAnimationFPS(animationFPS); + } + if (propertyFlags.getHasProperty(PROP_ANIMATION_FRAME_INDEX)) { + setAnimationFrameIndex(animationFrameIndex); } - } - if (propertyFlags.getHasProperty(PROP_ANIMATION_FPS)) { - setAnimationFPS(animationFPS); - } - if (propertyFlags.getHasProperty(PROP_ANIMATION_FRAME_INDEX)) { - setAnimationFrameIndex(animationFrameIndex); } READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); } else { + // Note: since we've associated our _animationProperties with our _animationLoop, the readEntitySubclassDataFromBuffer() + // will automatically read into the animation loop int bytesFromAnimation = _animationProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, propertyFlags, overwriteLocalData); bytesRead += bytesFromAnimation; dataAt += bytesFromAnimation; - - // FIXME -- we need to actually get the property values out of the _animationProperties - // and use them for our AnimationLoop } READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 5bf2369cd5..496d0d437f 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -103,11 +103,15 @@ ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityIte _alphaMiddles(DEFAULT_MAX_PARTICLES, DEFAULT_ALPHA), _alphaFinishes(DEFAULT_MAX_PARTICLES, DEFAULT_ALPHA), _particleMaxBound(glm::vec3(1.0f, 1.0f, 1.0f)), - _particleMinBound(glm::vec3(-1.0f, -1.0f, -1.0f)) { + _particleMinBound(glm::vec3(-1.0f, -1.0f, -1.0f)) +{ _type = EntityTypes::ParticleEffect; setColor(DEFAULT_COLOR); setProperties(properties); + + _animationProperties.associateWithAnimationLoop(&_animationLoop); + _animationLoop.setResetOnRunning(false); } ParticleEffectEntityItem::~ParticleEffectEntityItem() { diff --git a/libraries/entities/src/PropertyGroup.h b/libraries/entities/src/PropertyGroup.h index f780907896..4069e7be02 100644 --- a/libraries/entities/src/PropertyGroup.h +++ b/libraries/entities/src/PropertyGroup.h @@ -59,7 +59,7 @@ public: virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) = 0; virtual void debugDump() const { } - virtual bool appentToEditPacket(OctreePacketData* packetData, + virtual bool appendToEditPacket(OctreePacketData* packetData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, diff --git a/libraries/entities/src/SkyboxPropertyGroup.cpp b/libraries/entities/src/SkyboxPropertyGroup.cpp index 624a382d55..261e050387 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.cpp +++ b/libraries/entities/src/SkyboxPropertyGroup.cpp @@ -36,7 +36,7 @@ void SkyboxPropertyGroup::debugDump() const { qDebug() << " URL:" << getURL() << " has changed:" << urlChanged(); } -bool SkyboxPropertyGroup::appentToEditPacket(OctreePacketData* packetData, +bool SkyboxPropertyGroup::appendToEditPacket(OctreePacketData* packetData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, diff --git a/libraries/entities/src/SkyboxPropertyGroup.h b/libraries/entities/src/SkyboxPropertyGroup.h index 25d982cbe7..995c87e1db 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.h +++ b/libraries/entities/src/SkyboxPropertyGroup.h @@ -37,7 +37,7 @@ public: virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings); virtual void debugDump() const; - virtual bool appentToEditPacket(OctreePacketData* packetData, + virtual bool appendToEditPacket(OctreePacketData* packetData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, diff --git a/libraries/entities/src/StagePropertyGroup.cpp b/libraries/entities/src/StagePropertyGroup.cpp index fb27f9a464..a8b7705a73 100644 --- a/libraries/entities/src/StagePropertyGroup.cpp +++ b/libraries/entities/src/StagePropertyGroup.cpp @@ -76,7 +76,7 @@ void StagePropertyGroup::debugDump() const { qDebug() << " _automaticHourDay:" << _automaticHourDay; } -bool StagePropertyGroup::appentToEditPacket(OctreePacketData* packetData, +bool StagePropertyGroup::appendToEditPacket(OctreePacketData* packetData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, diff --git a/libraries/entities/src/StagePropertyGroup.h b/libraries/entities/src/StagePropertyGroup.h index 32eb3462a3..0f1cbf5a89 100644 --- a/libraries/entities/src/StagePropertyGroup.h +++ b/libraries/entities/src/StagePropertyGroup.h @@ -37,7 +37,7 @@ public: virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings); virtual void debugDump() const; - virtual bool appentToEditPacket(OctreePacketData* packetData, + virtual bool appendToEditPacket(OctreePacketData* packetData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, EntityPropertyFlags& propertiesDidntFit, From 91a27e3adf1b4d79ecc2825a04004f57a9dde4e5 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 1 Oct 2015 13:29:07 -0700 Subject: [PATCH 05/30] get animation to actually run again --- libraries/animation/src/AnimationLoop.cpp | 6 +- .../src/RenderableModelEntityItem.cpp | 1 + .../entities/src/AnimationPropertyGroup.cpp | 50 ++++++++++++---- .../entities/src/AnimationPropertyGroup.h | 5 +- libraries/entities/src/ModelEntityItem.cpp | 58 ++++--------------- libraries/entities/src/ModelEntityItem.h | 20 +++---- 6 files changed, 66 insertions(+), 74 deletions(-) diff --git a/libraries/animation/src/AnimationLoop.cpp b/libraries/animation/src/AnimationLoop.cpp index 6ad724922e..f6c414c1d7 100644 --- a/libraries/animation/src/AnimationLoop.cpp +++ b/libraries/animation/src/AnimationLoop.cpp @@ -14,8 +14,7 @@ const float AnimationLoop::MAXIMUM_POSSIBLE_FRAME = 100000.0f; -AnimationLoop::AnimationLoop() -/*: +AnimationLoop::AnimationLoop() : _fps(30.0f), _loop(false), _hold(false), @@ -24,7 +23,7 @@ _firstFrame(0.0f), _lastFrame(MAXIMUM_POSSIBLE_FRAME), _running(false), _frameIndex(0.0f), -_maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME)*/ +_maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME) { } @@ -85,6 +84,7 @@ void AnimationLoop::setStartAutomatically(bool startAutomatically) { } void AnimationLoop::setRunning(bool running) { + qDebug() << "AnimationLoop::setRunning() new running:" << running << "old _running:" << _running; // don't do anything if the new value is the same as the value we already have if (_running != running) { _running = running; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index c978fab012..15cea8b432 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -269,6 +269,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { if (_model) { // handle animations.. if (hasAnimation()) { + if (!jointsMapped()) { QStringList modelJointNames = _model->getJointNames(); mapJoints(modelJointNames); diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index a93becd7fb..da7d309316 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -17,22 +17,35 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" -AnimationPropertyGroup::AnimationPropertyGroup() { - //_url = QString(); + +AnimationPropertyGroup::AnimationPropertyGroup() : +CONSTRUCT_PROPERTY(fps, 30.0f), +CONSTRUCT_PROPERTY(running, false), +CONSTRUCT_PROPERTY(loop, true), +CONSTRUCT_PROPERTY(firstFrame, 0.0f), +CONSTRUCT_PROPERTY(lastFrame, AnimationLoop::MAXIMUM_POSSIBLE_FRAME), +CONSTRUCT_PROPERTY(hold, false), +CONSTRUCT_PROPERTY(startAutomatically, false) +{ + static const QString DEFAULT_URL; + + _url = DEFAULT_URL; } void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, AnimationSettings, animationSettings, URL, url); + //qDebug() << "AnimationPropertyGroup::copyToScriptValue() url:" << getURL(); + if (_animationLoop) { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FPS, AnimationSettings, animationSettings, FPS, fps, _animationLoop->getFPS); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, FrameIndex, frameIndex, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, Running, running, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LOOP, AnimationSettings, animationSettings, Loop, loop, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FIRST_FRAME, AnimationSettings, animationSettings, FirstFrame, firstFrame, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LAST_FRAME, AnimationSettings, animationSettings, LastFrame, lastFrame, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_HOLD, AnimationSettings, animationSettings, Hold, hold, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_START_AUTOMATICALLY, AnimationSettings, animationSettings, StartAutomatically, startAutomatically, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, Running, running, _animationLoop->getRunning); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LOOP, AnimationSettings, animationSettings, Loop, loop, _animationLoop->getLoop); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FIRST_FRAME, AnimationSettings, animationSettings, FirstFrame, firstFrame, _animationLoop->getFirstFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LAST_FRAME, AnimationSettings, animationSettings, LastFrame, lastFrame, _animationLoop->getLastFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_HOLD, AnimationSettings, animationSettings, Hold, hold, _animationLoop->getHold); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_START_AUTOMATICALLY, AnimationSettings, animationSettings, StartAutomatically, startAutomatically, _animationLoop->getStartAutomatically); } else { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, AnimationSettings, animationSettings, FPS, fps); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, FrameIndex, frameIndex); @@ -48,6 +61,8 @@ void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desire void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, url, QString, setURL); + //qDebug() << "AnimationPropertyGroup::copyFromScriptValue() url:" << getURL(); + if (_animationLoop) { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, fps, float, _animationLoop->setFPS); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, frameIndex, float, _animationLoop->setFrameIndex); @@ -84,6 +99,9 @@ bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); + + //qDebug() << "AnimationPropertyGroup::appendToEditPacket() url:" << getURL(); + if (_animationLoop) { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, _animationLoop->getFPS()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getFrameIndex()); @@ -114,6 +132,9 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF bool overwriteLocalData = true; READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); + + //qDebug() << "AnimationPropertyGroup::decodeFromEditPacket() url:" << getURL(); + if (_animationLoop) { READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, _animationLoop->setFPS); READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setFrameIndex); @@ -175,6 +196,8 @@ EntityPropertyFlags AnimationPropertyGroup::getChangedProperties() const { void AnimationPropertyGroup::getProperties(EntityItemProperties& properties) const { COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, URL, getURL); + //qDebug() << "AnimationPropertyGroup::getProperties() url:" << getURL(); + if (_animationLoop) { COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FPS, _animationLoop->getFPS); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FrameIndex, _animationLoop->getFrameIndex); @@ -201,8 +224,10 @@ bool AnimationPropertyGroup::setProperties(const EntityItemProperties& propertie SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, URL, url, setURL); + //qDebug() << "AnimationPropertyGroup::setProperties() url:" << getURL(); + if (_animationLoop) { - qDebug() << "AnimationPropertyGroup::setProperties() -- apply new properties to our associated AnimationLoop"; + //qDebug() << "AnimationPropertyGroup::setProperties() -- apply new properties to our associated AnimationLoop"; SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FPS, fps, _animationLoop->setFPS); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FrameIndex, frameIndex, _animationLoop->setFrameIndex); @@ -252,6 +277,8 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En bool successPropertyFits = true; + //qDebug() << "AnimationPropertyGroup::appendSubclassData() url:" << getURL(); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); if (_animationLoop) { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); @@ -282,9 +309,12 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char const unsigned char* dataAt = data; READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); + + //qDebug() << "AnimationPropertyGroup::readEntitySubclassDataFromBuffer() url:" << getURL(); + if (_animationLoop) { // apply new properties to our associated AnimationLoop - qDebug() << "AnimationPropertyGroup::readEntitySubclassDataFromBuffer() -- apply new properties to our associated AnimationLoop"; + //qDebug() << "AnimationPropertyGroup::readEntitySubclassDataFromBuffer() -- apply new properties to our associated AnimationLoop"; READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, _animationLoop->setFPS); READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setFrameIndex); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, _animationLoop->setRunning); diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index a26975a83c..2c04303482 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -91,7 +91,10 @@ public: DEFINE_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, StartAutomatically, startAutomatically, bool); // was animationSettings.startAutomatically public: - void associateWithAnimationLoop(AnimationLoop* animationLoop) { _animationLoop = animationLoop; } + void associateWithAnimationLoop(AnimationLoop* animationLoop) { + qDebug() << "associateWithAnimationLoop() this:" << this << "animationLoop:" << animationLoop; + _animationLoop = animationLoop; + } private: AnimationLoop* _animationLoop = nullptr; }; diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index de06fecd81..5e4e1e534b 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -35,15 +35,15 @@ EntityItemPointer ModelEntityItem::factory(const EntityItemID& entityID, const E ModelEntityItem::ModelEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : EntityItem(entityItemID) { + _animationProperties.associateWithAnimationLoop(&_animationLoop); + _animationLoop.setResetOnRunning(false); + _type = EntityTypes::Model; setProperties(properties); _lastAnimated = usecTimestampNow(); _jointMappingCompleted = false; _lastKnownFrameIndex = -1; _color[0] = _color[1] = _color[2] = 0; - - _animationProperties.associateWithAnimationLoop(&_animationLoop); - _animationLoop.setResetOnRunning(false); } EntityItemProperties ModelEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { @@ -62,6 +62,8 @@ EntityItemProperties ModelEntityItem::getProperties(EntityPropertyFlags desiredP } bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { + qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID(); + bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class @@ -215,7 +217,7 @@ void ModelEntityItem::mapJoints(const QStringList& modelJointNames) { return; } - AnimationPointer myAnimation = getAnimation(_animationURL); + AnimationPointer myAnimation = getAnimation(_animationProperties.getURL()); if (myAnimation && myAnimation->isLoaded()) { QStringList animationJointNames = myAnimation->getJointNames(); @@ -236,7 +238,7 @@ const QVector& ModelEntityItem::getAnimationFrame(bool& newFrame) { return _lastKnownFrameData; } - AnimationPointer myAnimation = getAnimation(_animationURL); // FIXME: this could be optimized + AnimationPointer myAnimation = getAnimation(_animationProperties.getURL()); // FIXME: this could be optimized if (myAnimation && myAnimation->isLoaded()) { const QVector& frames = myAnimation->getFramesReference(); // NOTE: getFrames() is too heavy @@ -282,6 +284,7 @@ void ModelEntityItem::update(const quint64& now) { if (getAnimationIsPlaying()) { float deltaTime = (float)(now - _lastAnimated) / (float)USECS_PER_SECOND; _lastAnimated = now; + qDebug() << "ModelEntityItem::update() calling _animationLoop.simulate(deltaTime);"; _animationLoop.simulate(deltaTime); } else { _lastAnimated = now; @@ -334,7 +337,7 @@ void ModelEntityItem::setCompoundShapeURL(const QString& url) { void ModelEntityItem::setAnimationURL(const QString& url) { _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; - _animationURL = url; + _animationProperties.setURL(url); } void ModelEntityItem::setAnimationFrameIndex(float value) { @@ -411,7 +414,7 @@ void ModelEntityItem::setAnimationSettings(const QString& value) { setAnimationStartAutomatically(startAutomatically); } - _animationSettings = value; + //_animationSettings = value; _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; } @@ -425,47 +428,6 @@ void ModelEntityItem::setAnimationFPS(float value) { _animationLoop.setFPS(value); } -QString ModelEntityItem::getAnimationSettings() const { - // the animations setting is a JSON string that may contain various animation settings. - // if it includes fps, frameIndex, or running, those values will be parsed out and - // will over ride the regular animation settings - QString value = _animationSettings; - - QJsonDocument settingsAsJson = QJsonDocument::fromJson(value.toUtf8()); - QJsonObject settingsAsJsonObject = settingsAsJson.object(); - QVariantMap settingsMap = settingsAsJsonObject.toVariantMap(); - - QVariant fpsValue(getAnimationFPS()); - settingsMap["fps"] = fpsValue; - - QVariant frameIndexValue(getAnimationFrameIndex()); - settingsMap["frameIndex"] = frameIndexValue; - - QVariant runningValue(getAnimationIsPlaying()); - settingsMap["running"] = runningValue; - - QVariant firstFrameValue(getAnimationFirstFrame()); - settingsMap["firstFrame"] = firstFrameValue; - - QVariant lastFrameValue(getAnimationLastFrame()); - settingsMap["lastFrame"] = lastFrameValue; - - QVariant loopValue(getAnimationLoop()); - settingsMap["loop"] = loopValue; - - QVariant holdValue(getAnimationHold()); - settingsMap["hold"] = holdValue; - - QVariant startAutomaticallyValue(getAnimationStartAutomatically()); - settingsMap["startAutomatically"] = startAutomaticallyValue; - - settingsAsJsonObject = QJsonObject::fromVariantMap(settingsMap); - QJsonDocument newDocument(settingsAsJsonObject); - QByteArray jsonByteArray = newDocument.toJson(QJsonDocument::Compact); - QString jsonByteString(jsonByteArray); - return jsonByteString; -} - // virtual bool ModelEntityItem::shouldBePhysical() const { return EntityItem::shouldBePhysical() && getShapeType() != SHAPE_TYPE_NONE; diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index c00766dfbe..c8b2d072bb 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -65,10 +65,6 @@ public: static const QString DEFAULT_COMPOUND_SHAPE_URL; const QString& getCompoundShapeURL() const { return _compoundShapeURL; } - bool hasAnimation() const { return !_animationURL.isEmpty(); } - static const QString DEFAULT_ANIMATION_URL; - const QString& getAnimationURL() const { return _animationURL; } - void setColor(const rgbColor& value) { memcpy(_color, value, sizeof(_color)); } void setColor(const xColor& value) { _color[RED_INDEX] = value.red; @@ -84,10 +80,13 @@ public: // Animation related items... const AnimationPropertyGroup& getAnimationProperties() const { return _animationProperties; } + bool hasAnimation() const { return !_animationProperties.getURL().isEmpty(); } + static const QString DEFAULT_ANIMATION_URL; + const QString& getAnimationURL() const { return _animationProperties.getURL(); } void setAnimationURL(const QString& url); + static const float DEFAULT_ANIMATION_FRAME_INDEX; void setAnimationFrameIndex(float value); - void setAnimationSettings(const QString& value); static const bool DEFAULT_ANIMATION_IS_PLAYING; void setAnimationIsPlaying(bool value); @@ -117,7 +116,6 @@ public: bool getAnimationIsPlaying() const { return _animationLoop.isRunning(); } float getAnimationFrameIndex() const { return _animationLoop.getFrameIndex(); } float getAnimationFPS() const { return _animationLoop.getFPS(); } - QString getAnimationSettings() const; static const QString DEFAULT_TEXTURES; const QString& getTextures() const { return _textures; } @@ -126,7 +124,10 @@ public: virtual bool shouldBePhysical() const; static void cleanupLoadedAnimations(); - + +private: + void setAnimationSettings(const QString& value); // only called for old bitstream format + protected: QVector _lastKnownFrameData; int _lastKnownFrameIndex; @@ -142,11 +143,6 @@ protected: AnimationPropertyGroup _animationProperties; AnimationLoop _animationLoop; - // FIXME - delete these - QString _animationURL; - QString _animationSettings; - - QString _textures; ShapeType _shapeType = SHAPE_TYPE_NONE; From 815c4c69afd3975ef5789f7e508b049438bd6bcb Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 1 Oct 2015 14:52:28 -0700 Subject: [PATCH 06/30] support for legacy properties --- .../entities/src/AnimationPropertyGroup.cpp | 24 +++++++--- .../entities/src/AnimationPropertyGroup.h | 2 +- .../entities/src/EntityItemProperties.cpp | 46 ------------------- libraries/entities/src/ModelEntityItem.cpp | 19 +------- 4 files changed, 21 insertions(+), 70 deletions(-) diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index da7d309316..a75404e316 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -17,8 +17,8 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" - AnimationPropertyGroup::AnimationPropertyGroup() : +CONSTRUCT_PROPERTY(url, QString{}), CONSTRUCT_PROPERTY(fps, 30.0f), CONSTRUCT_PROPERTY(running, false), CONSTRUCT_PROPERTY(loop, true), @@ -27,9 +27,6 @@ CONSTRUCT_PROPERTY(lastFrame, AnimationLoop::MAXIMUM_POSSIBLE_FRAME), CONSTRUCT_PROPERTY(hold, false), CONSTRUCT_PROPERTY(startAutomatically, false) { - static const QString DEFAULT_URL; - - _url = DEFAULT_URL; } void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { @@ -40,7 +37,7 @@ void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desire if (_animationLoop) { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FPS, AnimationSettings, animationSettings, FPS, fps, _animationLoop->getFPS); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, FrameIndex, frameIndex, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, Running, running, _animationLoop->getRunning); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_PLAYING, AnimationSettings, animationSettings, Running, running, _animationLoop->getRunning); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LOOP, AnimationSettings, animationSettings, Loop, loop, _animationLoop->getLoop); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FIRST_FRAME, AnimationSettings, animationSettings, FirstFrame, firstFrame, _animationLoop->getFirstFrame); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LAST_FRAME, AnimationSettings, animationSettings, LastFrame, lastFrame, _animationLoop->getLastFrame); @@ -49,7 +46,7 @@ void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desire } else { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, AnimationSettings, animationSettings, FPS, fps); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, FrameIndex, frameIndex); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, Running, running); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_PLAYING, AnimationSettings, animationSettings, Running, running); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LOOP, AnimationSettings, animationSettings, Loop, loop); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FIRST_FRAME, AnimationSettings, animationSettings, FirstFrame, firstFrame); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LAST_FRAME, AnimationSettings, animationSettings, LastFrame, lastFrame); @@ -59,8 +56,12 @@ void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desire } void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, url, QString, setURL); + // legacy property support + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationURL, QString, setURL, getURL); + //qDebug() << "AnimationPropertyGroup::copyFromScriptValue() url:" << getURL(); if (_animationLoop) { @@ -72,6 +73,12 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, lastFrame, float, _animationLoop->setLastFrame); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, hold, bool, _animationLoop->setHold); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, startAutomatically, bool, _animationLoop->setStartAutomatically); + + // legacy property support + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFPS, float, _animationLoop->setFPS, _animationLoop->getFPS); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationIsPlaying, bool, _animationLoop->setRunning, _animationLoop->getRunning); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFrameIndex, float, _animationLoop->setFrameIndex, _animationLoop->getFrameIndex); + } else { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, fps, float, setFPS); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, frameIndex, float, setFrameIndex); @@ -81,6 +88,11 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, lastFrame, float, setLastFrame); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, hold, bool, setHold); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, startAutomatically, bool, setStartAutomatically); + + // legacy property support + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFPS, float, setFPS, getFPS); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationIsPlaying, bool, setRunning, getRunning); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFrameIndex, float, setFrameIndex, getFrameIndex); } } diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 2c04303482..4502a7c36b 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -13,7 +13,7 @@ // FIXME - TODO // 1) make EntityItemProperties support old versions of animation properties // DONE - 2) rename the group animationSettings -// 3) make sure that setting properties and reading from stream actually set the animationLoop object properly +// DONE - 3) make sure that setting properties and reading from stream actually set the animationLoop object properly // 4) test it! // 5) update all scripts // 6) remove all remnants of old member variables diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 5c4c89a465..d0cedbfe37 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -65,10 +65,6 @@ CONSTRUCT_PROPERTY(alphaStart, ParticleEffectEntityItem::DEFAULT_ALPHA_START), CONSTRUCT_PROPERTY(alphaFinish, ParticleEffectEntityItem::DEFAULT_ALPHA_FINISH), CONSTRUCT_PROPERTY(modelURL, ""), CONSTRUCT_PROPERTY(compoundShapeURL, ""), -//CONSTRUCT_PROPERTY(animationURL, ""), -//CONSTRUCT_PROPERTY(animationFPS, ModelEntityItem::DEFAULT_ANIMATION_FPS), -//CONSTRUCT_PROPERTY(animationFrameIndex, ModelEntityItem::DEFAULT_ANIMATION_FRAME_INDEX), -//CONSTRUCT_PROPERTY(animationIsPlaying, ModelEntityItem::DEFAULT_ANIMATION_IS_PLAYING), CONSTRUCT_PROPERTY(registrationPoint, ENTITY_ITEM_DEFAULT_REGISTRATION_POINT), CONSTRUCT_PROPERTY(angularVelocity, ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY), CONSTRUCT_PROPERTY(angularDamping, ENTITY_ITEM_DEFAULT_ANGULAR_DAMPING), @@ -80,8 +76,6 @@ CONSTRUCT_PROPERTY(exponent, 0.0f), CONSTRUCT_PROPERTY(cutoff, ENTITY_ITEM_DEFAULT_CUTOFF), CONSTRUCT_PROPERTY(locked, ENTITY_ITEM_DEFAULT_LOCKED), CONSTRUCT_PROPERTY(textures, ""), -//CONSTRUCT_PROPERTY(animationSettings, "{\"firstFrame\":0,\"fps\":30,\"frameIndex\":0,\"hold\":false," -// "\"lastFrame\":100000,\"loop\":false,\"running\":false,\"startAutomatically\":false}"), CONSTRUCT_PROPERTY(userData, ENTITY_ITEM_DEFAULT_USER_DATA), CONSTRUCT_PROPERTY(simulationOwner, SimulationOwner()), CONSTRUCT_PROPERTY(text, TextEntityItem::DEFAULT_TEXT), @@ -169,10 +163,6 @@ void EntityItemProperties::calculateNaturalPosition(const glm::vec3& min, const } /* -bool EntityItemProperties::animationSettingsChanged() const { - return _animationSettingsChanged; -} - void EntityItemProperties::setAnimationSettings(const QString& value) { // the animations setting is a JSON string that may contain various animation settings. @@ -200,32 +190,6 @@ void EntityItemProperties::setAnimationSettings(const QString& value) { _animationSettings = value; _animationSettingsChanged = true; } - -QString EntityItemProperties::getAnimationSettings() const { - // the animations setting is a JSON string that may contain various animation settings. - // if it includes fps, frameIndex, or running, those values will be parsed out and - // will over ride the regular animation settings - QString value = _animationSettings; - - QJsonDocument settingsAsJson = QJsonDocument::fromJson(value.toUtf8()); - QJsonObject settingsAsJsonObject = settingsAsJson.object(); - QVariantMap settingsMap = settingsAsJsonObject.toVariantMap(); - - QVariant fpsValue(getAnimationFPS()); - settingsMap["fps"] = fpsValue; - - QVariant frameIndexValue(getAnimationFrameIndex()); - settingsMap["frameIndex"] = frameIndexValue; - - QVariant runningValue(getAnimationIsPlaying()); - settingsMap["running"] = runningValue; - - settingsAsJsonObject = QJsonObject::fromVariantMap(settingsMap); - QJsonDocument newDocument(settingsAsJsonObject); - QByteArray jsonByteArray = newDocument.toJson(QJsonDocument::Compact); - QString jsonByteString(jsonByteArray); - return jsonByteString; -} */ void EntityItemProperties::setCreated(QDateTime &v) { @@ -359,11 +323,6 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_ALPHA_FINISH, alphaFinish); CHECK_PROPERTY_CHANGE(PROP_MODEL_URL, modelURL); CHECK_PROPERTY_CHANGE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); - //CHECK_PROPERTY_CHANGE(PROP_ANIMATION_URL, animationURL); - //CHECK_PROPERTY_CHANGE(PROP_ANIMATION_PLAYING, animationIsPlaying); - //CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FRAME_INDEX, animationFrameIndex); - //CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FPS, animationFPS); - //CHECK_PROPERTY_CHANGE(PROP_ANIMATION_SETTINGS, animationSettings); CHECK_PROPERTY_CHANGE(PROP_VISIBLE, visible); CHECK_PROPERTY_CHANGE(PROP_REGISTRATION_POINT, registrationPoint); CHECK_PROPERTY_CHANGE(PROP_ANGULAR_VELOCITY, angularVelocity); @@ -824,10 +783,6 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_ALPHA_FINISH, AlphaFinish, alphaFinish, float); 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_ANIMATION_URL, AnimationURL, animationURL, QString); - ADD_PROPERTY_TO_MAP(PROP_ANIMATION_FPS, AnimationFPS, animationFPS, float); - ADD_PROPERTY_TO_MAP(PROP_ANIMATION_FRAME_INDEX, AnimationFrameIndex, animationFrameIndex, float); - ADD_PROPERTY_TO_MAP(PROP_ANIMATION_PLAYING, AnimationIsPlaying, animationIsPlaying, bool); ADD_PROPERTY_TO_MAP(PROP_REGISTRATION_POINT, RegistrationPoint, registrationPoint, glm::vec3); ADD_PROPERTY_TO_MAP(PROP_ANGULAR_VELOCITY, AngularVelocity, angularVelocity, glm::vec3); ADD_PROPERTY_TO_MAP(PROP_ANGULAR_DAMPING, AngularDamping, angularDamping, float); @@ -839,7 +794,6 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue 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_ANIMATION_SETTINGS, AnimationSettings, animationSettings, 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); diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 5e4e1e534b..9c0024ff79 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -113,35 +113,20 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, // we want to read these values in the order they appear in the buffer, but call our setters in an // order that allows AnimationLoop to preserve the correct frame rate. if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { - float animationFPS = getAnimationFPS(); - float animationFrameIndex = getAnimationFrameIndex(); - bool animationIsPlaying = getAnimationIsPlaying(); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setAnimationFPS); READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); - - if (propertyFlags.getHasProperty(PROP_ANIMATION_PLAYING)) { - if (animationIsPlaying != getAnimationIsPlaying()) { - setAnimationIsPlaying(animationIsPlaying); - } - } - if (propertyFlags.getHasProperty(PROP_ANIMATION_FPS)) { - setAnimationFPS(animationFPS); - } - if (propertyFlags.getHasProperty(PROP_ANIMATION_FRAME_INDEX)) { - setAnimationFrameIndex(animationFrameIndex); - } } READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); + if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); } else { // Note: since we've associated our _animationProperties with our _animationLoop, the readEntitySubclassDataFromBuffer() // will automatically read into the animation loop int bytesFromAnimation = _animationProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, - propertyFlags, overwriteLocalData); + propertyFlags, overwriteLocalData); bytesRead += bytesFromAnimation; dataAt += bytesFromAnimation; From cf2693e7121afd8b23d20bed35783f38dea38cf6 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 2 Oct 2015 08:31:22 -0700 Subject: [PATCH 07/30] working fistFrame lastFrame --- libraries/animation/src/AnimationLoop.cpp | 2 - libraries/animation/src/AnimationLoop.h | 8 +- .../entities/src/AnimationPropertyGroup.cpp | 220 ++++++++++++------ .../entities/src/AnimationPropertyGroup.h | 12 +- .../entities/src/EntityItemProperties.cpp | 52 +---- libraries/entities/src/EntityItemProperties.h | 4 +- .../entities/src/EntityItemPropertiesMacros.h | 12 + libraries/entities/src/ModelEntityItem.cpp | 1 - 8 files changed, 192 insertions(+), 119 deletions(-) diff --git a/libraries/animation/src/AnimationLoop.cpp b/libraries/animation/src/AnimationLoop.cpp index f6c414c1d7..7f559dd257 100644 --- a/libraries/animation/src/AnimationLoop.cpp +++ b/libraries/animation/src/AnimationLoop.cpp @@ -70,7 +70,6 @@ void AnimationLoop::simulate(float deltaTime) { // wrap within the the desired range if (_frameIndex < startFrameIndex) { _frameIndex = endFrameIndex - glm::mod(endFrameIndex - _frameIndex, endFrameIndex - startFrameIndex); - } else if (_frameIndex > endFrameIndex) { _frameIndex = startFrameIndex + glm::mod(_frameIndex - startFrameIndex, endFrameIndex - startFrameIndex); } @@ -84,7 +83,6 @@ void AnimationLoop::setStartAutomatically(bool startAutomatically) { } void AnimationLoop::setRunning(bool running) { - qDebug() << "AnimationLoop::setRunning() new running:" << running << "old _running:" << _running; // don't do anything if the new value is the same as the value we already have if (_running != running) { _running = running; diff --git a/libraries/animation/src/AnimationLoop.h b/libraries/animation/src/AnimationLoop.h index 3c6079d967..c906ba530f 100644 --- a/libraries/animation/src/AnimationLoop.h +++ b/libraries/animation/src/AnimationLoop.h @@ -35,10 +35,14 @@ public: void setStartAutomatically(bool startAutomatically); bool getStartAutomatically() const { return _startAutomatically; } - void setFirstFrame(float firstFrame) { _firstFrame = glm::clamp(firstFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); } + void setFirstFrame(float firstFrame) { _firstFrame = glm::clamp(firstFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); + //qDebug() << "AnimationLoop::setFirstFrame() firstFrame:" << firstFrame << "_firstFrame:" << _firstFrame; + } float getFirstFrame() const { return _firstFrame; } - void setLastFrame(float lastFrame) { _lastFrame = glm::clamp(lastFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); } + void setLastFrame(float lastFrame) { _lastFrame = glm::clamp(lastFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); + //qDebug() << "AnimationLoop::setLastFrame() lastFrame:" << lastFrame<< "_lastFrame:" << _lastFrame; + } float getLastFrame() const { return _lastFrame; } /// by default the AnimationLoop will always reset to the first frame on any call to setRunning diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index a75404e316..47733c205d 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -9,6 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include #include #include @@ -30,49 +31,50 @@ CONSTRUCT_PROPERTY(startAutomatically, false) } void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, AnimationSettings, animationSettings, URL, url); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, Animation, animation, URL, url); //qDebug() << "AnimationPropertyGroup::copyToScriptValue() url:" << getURL(); if (_animationLoop) { - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FPS, AnimationSettings, animationSettings, FPS, fps, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, FrameIndex, frameIndex, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_PLAYING, AnimationSettings, animationSettings, Running, running, _animationLoop->getRunning); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LOOP, AnimationSettings, animationSettings, Loop, loop, _animationLoop->getLoop); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FIRST_FRAME, AnimationSettings, animationSettings, FirstFrame, firstFrame, _animationLoop->getFirstFrame); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LAST_FRAME, AnimationSettings, animationSettings, LastFrame, lastFrame, _animationLoop->getLastFrame); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_HOLD, AnimationSettings, animationSettings, Hold, hold, _animationLoop->getHold); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_START_AUTOMATICALLY, AnimationSettings, animationSettings, StartAutomatically, startAutomatically, _animationLoop->getStartAutomatically); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FPS, Animation, animation, FPS, fps, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, Animation, animation, FrameIndex, frameIndex, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_PLAYING, Animation, animation, Running, running, _animationLoop->getRunning); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop, _animationLoop->getLoop); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame, _animationLoop->getFirstFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame, _animationLoop->getLastFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold, _animationLoop->getHold); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_START_AUTOMATICALLY, Animation, animation, StartAutomatically, startAutomatically, _animationLoop->getStartAutomatically); } else { - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, AnimationSettings, animationSettings, FPS, fps); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, AnimationSettings, animationSettings, FrameIndex, frameIndex); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_PLAYING, AnimationSettings, animationSettings, Running, running); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LOOP, AnimationSettings, animationSettings, Loop, loop); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FIRST_FRAME, AnimationSettings, animationSettings, FirstFrame, firstFrame); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LAST_FRAME, AnimationSettings, animationSettings, LastFrame, lastFrame); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_HOLD, AnimationSettings, animationSettings, Hold, hold); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_START_AUTOMATICALLY, AnimationSettings, animationSettings, StartAutomatically, startAutomatically); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, Animation, animation, FPS, fps); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, Animation, animation, FrameIndex, frameIndex); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_PLAYING, Animation, animation, Running, running); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LAST_FRAME, Animation, animation, LastFrame, lastFrame); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_HOLD, Animation, animation, Hold, hold); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_START_AUTOMATICALLY, Animation, animation, StartAutomatically, startAutomatically); } } void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, url, QString, setURL); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, url, QString, setURL); // legacy property support COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationURL, QString, setURL, getURL); + COPY_PROPERTY_FROM_QSCRIPTVALUE_NOCHECK(animationSettings, QString, setFromOldAnimationSettings); //qDebug() << "AnimationPropertyGroup::copyFromScriptValue() url:" << getURL(); if (_animationLoop) { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, fps, float, _animationLoop->setFPS); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, frameIndex, float, _animationLoop->setFrameIndex); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, running, bool, _animationLoop->setRunning); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, loop, bool, _animationLoop->setLoop); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, firstFrame, float, _animationLoop->setFirstFrame); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, lastFrame, float, _animationLoop->setLastFrame); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, hold, bool, _animationLoop->setHold); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, startAutomatically, bool, _animationLoop->setStartAutomatically); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, fps, float, _animationLoop->setFPS); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, frameIndex, float, _animationLoop->setFrameIndex); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, running, bool, _animationLoop->setRunning); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, loop, bool, _animationLoop->setLoop); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, firstFrame, float, _animationLoop->setFirstFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, lastFrame, float, _animationLoop->setLastFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, hold, bool, _animationLoop->setHold); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, startAutomatically, bool, _animationLoop->setStartAutomatically); // legacy property support COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFPS, float, _animationLoop->setFPS, _animationLoop->getFPS); @@ -80,14 +82,14 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFrameIndex, float, _animationLoop->setFrameIndex, _animationLoop->getFrameIndex); } else { - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, fps, float, setFPS); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, frameIndex, float, setFrameIndex); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, running, bool, setRunning); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, loop, bool, setLoop); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, firstFrame, float, setFirstFrame); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, lastFrame, float, setLastFrame); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, hold, bool, setHold); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animationSettings, startAutomatically, bool, setStartAutomatically); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, fps, float, setFPS); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, frameIndex, float, setFrameIndex); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, running, bool, setRunning); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, loop, bool, setLoop); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, firstFrame, float, setFirstFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, lastFrame, float, setLastFrame); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, hold, bool, setHold); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, startAutomatically, bool, setStartAutomatically); // legacy property support COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFPS, float, setFPS, getFPS); @@ -96,6 +98,88 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo } } +void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { + + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() value:" << value; + // the animations setting is a JSON string that may contain various animation settings. + // if it includes fps, frameIndex, or running, those values will be parsed out and + // will over ride the regular animation settings + + float fps = _animationLoop ? _animationLoop->getFPS() : getFPS(); + float frameIndex = _animationLoop ? _animationLoop->getFrameIndex() : getFrameIndex(); + bool running = _animationLoop ? _animationLoop->getRunning() : getRunning(); + float firstFrame = _animationLoop ? _animationLoop->getFirstFrame() : getFirstFrame(); + float lastFrame = _animationLoop ? _animationLoop->getLastFrame() : getLastFrame(); + bool loop = _animationLoop ? _animationLoop->getLoop() : getLoop(); + bool hold = _animationLoop ? _animationLoop->getHold() : getHold(); + bool startAutomatically = _animationLoop ? _animationLoop->getStartAutomatically() : getStartAutomatically(); + + QJsonDocument settingsAsJson = QJsonDocument::fromJson(value.toUtf8()); + QJsonObject settingsAsJsonObject = settingsAsJson.object(); + QVariantMap settingsMap = settingsAsJsonObject.toVariantMap(); + + if (settingsMap.contains("fps")) { + fps = settingsMap["fps"].toFloat(); + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had fps:" << fps; + } + + if (settingsMap.contains("frameIndex")) { + frameIndex = settingsMap["frameIndex"].toFloat(); + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had frameIndex"; + } + + if (settingsMap.contains("running")) { + running = settingsMap["running"].toBool(); + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had running"; + } + + if (settingsMap.contains("firstFrame")) { + frameIndex = settingsMap["firstFrame"].toFloat(); + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had firstFrame"; + } + + if (settingsMap.contains("lastFrame")) { + frameIndex = settingsMap["lastFrame"].toFloat(); + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had lastFrame"; + } + + if (settingsMap.contains("loop")) { + running = settingsMap["loop"].toBool(); + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had loop"; + } + + if (settingsMap.contains("hold")) { + running = settingsMap["hold"].toBool(); + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had hold"; + } + + if (settingsMap.contains("startAutomatically")) { + running = settingsMap["startAutomatically"].toBool(); + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had startAutomatically"; + } + + if (_animationLoop) { + _animationLoop->setFPS(fps); + _animationLoop->setFrameIndex(frameIndex); + _animationLoop->setRunning(running); + _animationLoop->setFirstFrame(firstFrame); + _animationLoop->setLastFrame(lastFrame); + _animationLoop->setLoop(loop); + _animationLoop->setHold(hold); + _animationLoop->setStartAutomatically(startAutomatically); + } else { + setFPS(fps); + setFrameIndex(frameIndex); + setRunning(running); + setFirstFrame(firstFrame); + setLastFrame(lastFrame); + setLoop(loop); + setHold(hold); + setStartAutomatically(startAutomatically); + } +} + + void AnimationPropertyGroup::debugDump() const { qDebug() << " AnimationPropertyGroup: ---------------------------------------------"; qDebug() << " URL:" << getURL() << " has changed:" << urlChanged(); @@ -206,58 +290,58 @@ EntityPropertyFlags AnimationPropertyGroup::getChangedProperties() const { } void AnimationPropertyGroup::getProperties(EntityItemProperties& properties) const { - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, URL, getURL); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, URL, getURL); //qDebug() << "AnimationPropertyGroup::getProperties() url:" << getURL(); if (_animationLoop) { - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FPS, _animationLoop->getFPS); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FrameIndex, _animationLoop->getFrameIndex); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Running, _animationLoop->getRunning); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Loop, _animationLoop->getLoop); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FirstFrame, _animationLoop->getFirstFrame); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, LastFrame, _animationLoop->getLastFrame); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Hold, _animationLoop->getHold); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, StartAutomatically, _animationLoop->getStartAutomatically); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FPS, _animationLoop->getFPS); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FrameIndex, _animationLoop->getFrameIndex); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Running, _animationLoop->getRunning); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Loop, _animationLoop->getLoop); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FirstFrame, _animationLoop->getFirstFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, LastFrame, _animationLoop->getLastFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Hold, _animationLoop->getHold); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, StartAutomatically, _animationLoop->getStartAutomatically); } else { - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FPS, getFPS); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FrameIndex, getFrameIndex); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Running, getRunning); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Loop, getLoop); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, FirstFrame, getFirstFrame); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, LastFrame, getLastFrame); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, Hold, getHold); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(AnimationSettings, StartAutomatically, getStartAutomatically); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FPS, getFPS); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FrameIndex, getFrameIndex); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Running, getRunning); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Loop, getLoop); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FirstFrame, getFirstFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, LastFrame, getLastFrame); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Hold, getHold); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, StartAutomatically, getStartAutomatically); } } bool AnimationPropertyGroup::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, URL, url, setURL); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, URL, url, setURL); //qDebug() << "AnimationPropertyGroup::setProperties() url:" << getURL(); if (_animationLoop) { //qDebug() << "AnimationPropertyGroup::setProperties() -- apply new properties to our associated AnimationLoop"; - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FPS, fps, _animationLoop->setFPS); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FrameIndex, frameIndex, _animationLoop->setFrameIndex); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Running, running, _animationLoop->setRunning); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Loop, loop, _animationLoop->setLoop); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FirstFrame, firstFrame, _animationLoop->setFirstFrame); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, LastFrame, lastFrame, _animationLoop->setLastFrame); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Hold, hold, _animationLoop->setHold); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, StartAutomatically, startAutomatically, _animationLoop->setStartAutomatically); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FPS, fps, _animationLoop->setFPS); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FrameIndex, frameIndex, _animationLoop->setFrameIndex); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Running, running, _animationLoop->setRunning); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Loop, loop, _animationLoop->setLoop); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FirstFrame, firstFrame, _animationLoop->setFirstFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, LastFrame, lastFrame, _animationLoop->setLastFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Hold, hold, _animationLoop->setHold); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, _animationLoop->setStartAutomatically); } else { - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FPS, fps, setFPS); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FrameIndex, frameIndex, setFrameIndex); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Running, running, setRunning); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Loop, loop, setLoop); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, FirstFrame, firstFrame, setFirstFrame); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, LastFrame, lastFrame, setLastFrame); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, Hold, hold, setHold); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(AnimationSettings, StartAutomatically, startAutomatically, setStartAutomatically); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FPS, fps, setFPS); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FrameIndex, frameIndex, setFrameIndex); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Running, running, setRunning); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Loop, loop, setLoop); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FirstFrame, firstFrame, setFirstFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, LastFrame, lastFrame, setLastFrame); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Hold, hold, setHold); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, setStartAutomatically); } return somethingChanged; diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 4502a7c36b..75ba146266 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -11,12 +11,15 @@ // FIXME - TODO -// 1) make EntityItemProperties support old versions of animation properties +// DONE - 1) make EntityItemProperties support old versions of animation properties // DONE - 2) rename the group animationSettings // DONE - 3) make sure that setting properties and reading from stream actually set the animationLoop object properly // 4) test it! +// a) toybox/windmill +// b) toybox "put me down" doll +// c) asana bugs about animations // 5) update all scripts -// 6) remove all remnants of old member variables +// DONE - 6) remove all remnants of old member variables // 7) research and remove animation settings from Particle Effect #ifndef hifi_AnimationPropertyGroup_h @@ -95,7 +98,10 @@ public: qDebug() << "associateWithAnimationLoop() this:" << this << "animationLoop:" << animationLoop; _animationLoop = animationLoop; } -private: + +protected: + void setFromOldAnimationSettings(const QString& value); + AnimationLoop* _animationLoop = nullptr; }; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index d0cedbfe37..a1b191bc0c 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -30,7 +30,7 @@ #include "LineEntityItem.h" #include "PolyLineEntityItem.h" -AnimationPropertyGroup EntityItemProperties::_staticAnimationSettings; +AnimationPropertyGroup EntityItemProperties::_staticAnimation; AtmospherePropertyGroup EntityItemProperties::_staticAtmosphere; SkyboxPropertyGroup EntityItemProperties::_staticSkybox; StagePropertyGroup EntityItemProperties::_staticStage; @@ -162,36 +162,6 @@ void EntityItemProperties::calculateNaturalPosition(const glm::vec3& min, const _naturalPosition = max - halfDimension; } -/* -void EntityItemProperties::setAnimationSettings(const QString& value) { - - // the animations setting is a JSON string that may contain various animation settings. - // if it includes fps, frameIndex, or running, those values will be parsed out and - // will over ride the regular animation settings - - QJsonDocument settingsAsJson = QJsonDocument::fromJson(value.toUtf8()); - QJsonObject settingsAsJsonObject = settingsAsJson.object(); - QVariantMap settingsMap = settingsAsJsonObject.toVariantMap(); - if (settingsMap.contains("fps")) { - float fps = settingsMap["fps"].toFloat(); - setAnimationFPS(fps); - } - - if (settingsMap.contains("frameIndex")) { - float frameIndex = settingsMap["frameIndex"].toFloat(); - setAnimationFrameIndex(frameIndex); - } - - if (settingsMap.contains("running")) { - bool running = settingsMap["running"].toBool(); - setAnimationIsPlaying(running); - } - - _animationSettings = value; - _animationSettingsChanged = true; -} -*/ - void EntityItemProperties::setCreated(QDateTime &v) { _created = v.toMSecsSinceEpoch() * 1000; // usec per msec } @@ -389,7 +359,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_Y_P_NEIGHBOR_ID, yPNeighborID); CHECK_PROPERTY_CHANGE(PROP_Z_P_NEIGHBOR_ID, zPNeighborID); - changedProperties += _animationSettings.getChangedProperties(); + changedProperties += _animation.getChangedProperties(); changedProperties += _atmosphere.getChangedProperties(); changedProperties += _skybox.getChangedProperties(); changedProperties += _stage.getChangedProperties(); @@ -496,7 +466,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Models & Particles if (_type == EntityTypes::Model || _type == EntityTypes::ParticleEffect) { - _animationSettings.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); + _animation.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); } @@ -699,7 +669,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool //COPY_PROPERTY_FROM_QSCRIPTVALUE(simulationOwner, ???, setSimulatorPriority); } - _animationSettings.copyFromScriptValue(object, _defaultSettings); + _animation.copyFromScriptValue(object, _defaultSettings); _atmosphere.copyFromScriptValue(object, _defaultSettings); _skybox.copyFromScriptValue(object, _defaultSettings); _stage.copyFromScriptValue(object, _defaultSettings); @@ -1050,8 +1020,8 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); - _staticAnimationSettings.setProperties(properties); - _staticAnimationSettings.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); + _staticAnimation.setProperties(properties); + _staticAnimation.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); } if (properties.getType() == EntityTypes::Light) { @@ -1063,8 +1033,8 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem } if (properties.getType() == EntityTypes::ParticleEffect) { - _staticAnimationSettings.setProperties(properties); - _staticAnimationSettings.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); + _staticAnimation.setProperties(properties); + _staticAnimation.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, properties.getMaxParticles()); @@ -1337,7 +1307,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); - properties.getAnimationSettings().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); + properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); } if (properties.getType() == EntityTypes::Light) { @@ -1349,7 +1319,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::ParticleEffect) { - properties.getAnimationSettings().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); + properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MAX_PARTICLES, float, setMaxParticles); @@ -1537,7 +1507,7 @@ void EntityItemProperties::markAllChanged() { _backgroundModeChanged = true; - _animationSettings.markAllChanged(); + _animation.markAllChanged(); _atmosphere.markAllChanged(); _skybox.markAllChanged(); _stage.markAllChanged(); diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 82095b6b71..c8bf0836d5 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -165,7 +165,7 @@ public: DEFINE_PROPERTY_GROUP(Stage, stage, StagePropertyGroup); DEFINE_PROPERTY_GROUP(Atmosphere, atmosphere, AtmospherePropertyGroup); DEFINE_PROPERTY_GROUP(Skybox, skybox, SkyboxPropertyGroup); - DEFINE_PROPERTY_GROUP(AnimationSettings, animationSettings, AnimationPropertyGroup); + DEFINE_PROPERTY_GROUP(Animation, animation, AnimationPropertyGroup); DEFINE_PROPERTY_REF(PROP_SOURCE_URL, SourceUrl, sourceUrl, QString); DEFINE_PROPERTY(PROP_LINE_WIDTH, LineWidth, lineWidth, float); DEFINE_PROPERTY_REF(LINE_POINTS, LinePoints, linePoints, QVector); @@ -373,7 +373,7 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, YPNeighborID, yPNeighborID, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, ZPNeighborID, zPNeighborID, ""); - properties.getAnimationSettings().debugDump(); + properties.getAnimation().debugDump(); properties.getAtmosphere().debugDump(); properties.getSkybox().debugDump(); properties.getStage().debugDump(); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 6b2a21ddf5..8e0b968fcb 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -289,6 +289,18 @@ inline xColor xColor_convertFromScriptValue(const QScriptValue& v, bool& isValid }\ } +#define COPY_PROPERTY_FROM_QSCRIPTVALUE_NOCHECK(P, T, S) \ +{ \ + QScriptValue V = object.property(#P); \ + if (V.isValid()) { \ + bool isValid = false; \ + T newValue = T##_convertFromScriptValue(V, isValid); \ + if (isValid && (_defaultSettings)) { \ + S(newValue); \ + } \ + }\ +} + #define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(G, P, T, S) \ { \ QScriptValue G = object.property(#G); \ diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 9c0024ff79..55911b213b 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -269,7 +269,6 @@ void ModelEntityItem::update(const quint64& now) { if (getAnimationIsPlaying()) { float deltaTime = (float)(now - _lastAnimated) / (float)USECS_PER_SECOND; _lastAnimated = now; - qDebug() << "ModelEntityItem::update() calling _animationLoop.simulate(deltaTime);"; _animationLoop.simulate(deltaTime); } else { _lastAnimated = now; From b27396606b512c2878be69db61074b902d87d385 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 2 Oct 2015 12:34:46 -0700 Subject: [PATCH 08/30] fix first run --- libraries/animation/src/AnimationLoop.cpp | 31 ++++++++++++++--------- libraries/animation/src/AnimationLoop.h | 1 + 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/libraries/animation/src/AnimationLoop.cpp b/libraries/animation/src/AnimationLoop.cpp index 7f559dd257..6062d71f9c 100644 --- a/libraries/animation/src/AnimationLoop.cpp +++ b/libraries/animation/src/AnimationLoop.cpp @@ -15,15 +15,17 @@ const float AnimationLoop::MAXIMUM_POSSIBLE_FRAME = 100000.0f; AnimationLoop::AnimationLoop() : -_fps(30.0f), -_loop(false), -_hold(false), -_startAutomatically(false), -_firstFrame(0.0f), -_lastFrame(MAXIMUM_POSSIBLE_FRAME), -_running(false), -_frameIndex(0.0f), -_maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME) + _fps(30.0f), + _loop(false), + _hold(false), + _startAutomatically(false), + _firstFrame(0.0f), + _lastFrame(MAXIMUM_POSSIBLE_FRAME), + _running(false), + _frameIndex(0.0f), + _maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME), + _resetOnRunning(false), + _firstRun(true) { } @@ -35,7 +37,9 @@ AnimationLoop::AnimationLoop(const AnimationDetails& animationDetails) : _firstFrame(animationDetails.firstFrame), _lastFrame(animationDetails.lastFrame), _running(animationDetails.running), - _frameIndex(animationDetails.frameIndex) + _frameIndex(animationDetails.frameIndex), + _resetOnRunning(false), + _firstRun(true) { } @@ -48,7 +52,9 @@ AnimationLoop::AnimationLoop(float fps, bool loop, bool hold, bool startAutomati _firstFrame(firstFrame), _lastFrame(lastFrame), _running(running), - _frameIndex(frameIndex) + _frameIndex(frameIndex), + _resetOnRunning(false), + _firstRun(true) { } @@ -88,9 +94,10 @@ void AnimationLoop::setRunning(bool running) { _running = running; // If we just set running to true, then also reset the frame to the first frame - if (running && _resetOnRunning) { + if (running && (_resetOnRunning || _firstRun)) { // move back to the beginning _frameIndex = _firstFrame; + _firstRun = false; } } } diff --git a/libraries/animation/src/AnimationLoop.h b/libraries/animation/src/AnimationLoop.h index c906ba530f..ae5a88fdbd 100644 --- a/libraries/animation/src/AnimationLoop.h +++ b/libraries/animation/src/AnimationLoop.h @@ -74,6 +74,7 @@ private: float _frameIndex = 0.0f; float _maxFrameIndexHint = MAXIMUM_POSSIBLE_FRAME; bool _resetOnRunning = false; + bool _firstRun = true; }; #endif // hifi_AnimationLoop_h From 98e8b3083df063d26e373db9d0a40aa04bf8cac0 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 2 Oct 2015 13:04:02 -0700 Subject: [PATCH 09/30] comment --- libraries/entities/src/AnimationPropertyGroup.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 75ba146266..0dbf6d1615 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -15,12 +15,13 @@ // DONE - 2) rename the group animationSettings // DONE - 3) make sure that setting properties and reading from stream actually set the animationLoop object properly // 4) test it! -// a) toybox/windmill +// a) toybox/windmill // b) toybox "put me down" doll // c) asana bugs about animations // 5) update all scripts // DONE - 6) remove all remnants of old member variables // 7) research and remove animation settings from Particle Effect +// 8) make sure animations start properly when entering a domain... with previously running animations #ifndef hifi_AnimationPropertyGroup_h #define hifi_AnimationPropertyGroup_h From 02536a5ab9dd9647559067277d346d0558add013 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 2 Oct 2015 14:17:01 -0700 Subject: [PATCH 10/30] remove animationSettings from particles, add isEmitting --- examples/entityScripts/portal.js | 6 +- .../example/entities/animatedModelExample.js | 31 ++- examples/example/entities/butterflies.js | 13 +- examples/example/entities/particlesTest.js | 17 +- examples/fireworks.js | 11 +- examples/html/entityProperties.html | 20 +- examples/libraries/entityPropertyDialogBox.js | 34 +-- examples/particleDance.js | 11 +- examples/particle_explorer/main.js | 5 +- .../particle_explorer/particleExplorer.js | 13 +- examples/particles.js | 8 +- examples/toys/breakdanceCore.js | 10 +- examples/toys/grenade.js | 13 +- examples/toys/sprayPaintCan.js | 9 +- libraries/animation/src/AnimationLoop.h | 30 ++- .../src/RenderableModelEntityItem.cpp | 1 - .../entities/src/AnimationPropertyGroup.h | 10 +- .../entities/src/EntityItemProperties.cpp | 11 +- libraries/entities/src/EntityItemProperties.h | 2 + libraries/entities/src/EntityPropertyFlags.h | 4 + .../entities/src/ParticleEffectEntityItem.cpp | 211 ++---------------- .../entities/src/ParticleEffectEntityItem.h | 44 +--- unpublishedScripts/masterReset.js | 20 +- 23 files changed, 134 insertions(+), 400 deletions(-) diff --git a/examples/entityScripts/portal.js b/examples/entityScripts/portal.js index 4e2ec6ddaf..879c1f9197 100644 --- a/examples/entityScripts/portal.js +++ b/examples/entityScripts/portal.js @@ -32,8 +32,7 @@ this.leaveEntity = function(entityID) { Entities.editEntity(entityID, { - animationURL: animationURL, - animationSettings: '{ "frameIndex": 1, "running": false }' + animation: { url: animationURL, frameIndex: 1, running: false } }); playSound(); @@ -41,8 +40,7 @@ this.hoverEnterEntity = function(entityID) { Entities.editEntity(entityID, { - animationURL: animationURL, - animationSettings: '{ "fps": 24, "firstFrame": 1, "lastFrame": 25, "frameIndex": 1, "running": true, "hold": true }' + animation: { url: animationURL, fps: 24, firstFrame: 1, lastFrame: 25, frameIndex: 1, running: true, hold: true } }); }; }) \ No newline at end of file diff --git a/examples/example/entities/animatedModelExample.js b/examples/example/entities/animatedModelExample.js index 47bca9cfb0..6c97671463 100644 --- a/examples/example/entities/animatedModelExample.js +++ b/examples/example/entities/animatedModelExample.js @@ -18,7 +18,15 @@ var stopAfter = moveUntil + 100; var pitch = 0.0; var yaw = 0.0; var roll = 0.0; -var rotation = Quat.fromPitchYawRollDegrees(pitch, yaw, roll) +var rotation = Quat.fromPitchYawRollDegrees(pitch, yaw, roll); + +var animationSettings = JSON.stringify({ + loop: true, + running: true, + fps: 30, + firstFrame: 10, + lastFrame: 20, +}); var originalProperties = { type: "Model", @@ -37,12 +45,21 @@ var originalProperties = { modelURL: "http://public.highfidelity.io/cozza13/club/dragon/dragon.fbx", rotation: rotation, - //animationURL: "http://public.highfidelity.io/cozza13/club/dragon/flying.fbx", + + + animationURL: "http://public.highfidelity.io/cozza13/club/dragon/flying.fbx", + animationSettings: animationSettings, //animationIsPlaying: true, - animationSettings: { + /* + animation: { url: "http://public.highfidelity.io/cozza13/club/dragon/flying.fbx", - running: true + running: true, + fps: 30, + firstFrame: 10, + lastFrame: 20, + loop: true } + */ }; var modelID = Entities.addEntity(originalProperties); @@ -105,7 +122,7 @@ function moveModel(deltaTime) { var newProperties = { //animationIsPlaying: isPlaying, //animationFPS: animationFPS, - animationSettings: { + animation: { running: isPlaying, fps: animationFPS } @@ -114,7 +131,7 @@ function moveModel(deltaTime) { if (resetFrame) { print("resetting the frame!"); //newProperties.animationFrameIndex = 0; - newProperties.animationSettings.frameIndex = 0; + newProperties.animation.frameIndex = 0; resetFrame = false; } @@ -124,7 +141,7 @@ function moveModel(deltaTime) { // register the call back so it fires before each data send -Script.update.connect(moveModel); +//Script.update.connect(moveModel); Script.scriptEnding.connect(function () { diff --git a/examples/example/entities/butterflies.js b/examples/example/entities/butterflies.js index 8b02cf5768..2eac9d6258 100644 --- a/examples/example/entities/butterflies.js +++ b/examples/example/entities/butterflies.js @@ -85,8 +85,17 @@ function addButterfly() { damping: 0.00001, dimensions: dimensions, color: color, - animationURL: "http://public.highfidelity.io/models/content/butterfly/butterfly.fbx", - animationSettings: "{\"firstFrame\":0,\"fps\":" + newFrameRate + ",\"frameIndex\":0,\"hold\":false,\"lastFrame\":10000,\"loop\":true,\"running\":true,\"startAutomatically\":false}", + animation: { + url: "http://public.highfidelity.io/models/content/butterfly/butterfly.fbx", + firstFrame: 0, + fps: newFrameRate, + frameIndex: 0, + hold: false, + lastFrame: 10000, + loop: true, + running: true, + startAutomatically:false + }, modelURL: "http://public.highfidelity.io/models/content/butterfly/butterfly.fbx" }; butterflies.push(Entities.addEntity(properties)); diff --git a/examples/example/entities/particlesTest.js b/examples/example/entities/particlesTest.js index bfa4a47ffb..a2bbdbd9d0 100644 --- a/examples/example/entities/particlesTest.js +++ b/examples/example/entities/particlesTest.js @@ -43,7 +43,7 @@ speedSpread: 0.0, accelerationSpread: { x: 0.0, y: 0.0, z: 0.0 }, radiusSpread: 0.0, - animationIsPlaying: true + isEmitting: true }); break; case 1: @@ -195,7 +195,7 @@ polarFinish: 0.0, azimuthStart: -PI, azimuthFinish: PI, - animationIsPlaying: false + isEmitting: false }); Entities.editEntity(box, { visible: true @@ -210,15 +210,7 @@ function setUp() { var boxPoint, - spawnPoint, - animation = { - fps: 30, - frameIndex: 0, - running: true, - firstFrame: 0, - lastFrame: 30, - loop: true - }; + spawnPoint; boxPoint = Vec3.sum(MyAvatar.position, Vec3.multiply(4.0, Quat.getFront(Camera.getOrientation()))); boxPoint = Vec3.sum(boxPoint, { x: 0.0, y: -0.5, z: 0.0 }); @@ -265,8 +257,7 @@ lifespan: 5.0, visible: false, locked: false, - animationSettings: animation, - animationIsPlaying: false, + isEmitting: false, lifetime: 3600 // 1 hour; just in case }); diff --git a/examples/fireworks.js b/examples/fireworks.js index 3485b1687f..610db389ba 100644 --- a/examples/fireworks.js +++ b/examples/fireworks.js @@ -117,15 +117,6 @@ Rocket = function(point, colorPalette) { } }); - this.animationSettings = JSON.stringify({ - fps: 40, - frameIndex: 0, - running: true, - firstFrame: 0, - lastFrame: 20, - loop: false - }); - this.direction = { x: randFloat(-0.4, 0.4), y: 1.0, @@ -170,7 +161,7 @@ Rocket.prototype.explode = function(position) { print(JSON.stringify(color)); this.bursts.push(Entities.addEntity({ type: "ParticleEffect", - animationSettings: this.animationSettings, + isEmitting: true, position: position, textures: 'https://raw.githubusercontent.com/ericrius1/SantasLair/santa/assets/smokeparticle.png', emitRate: this.emitRate, diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index 268a2fb7f2..40b94c2eb2 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -282,7 +282,6 @@ var elModelAnimationPlaying = document.getElementById("property-model-animation-playing"); var elModelAnimationFPS = document.getElementById("property-model-animation-fps"); var elModelAnimationFrame = document.getElementById("property-model-animation-frame"); - var elModelAnimationSettings = document.getElementById("property-model-animation-settings"); var elModelTextures = document.getElementById("property-model-textures"); var elModelOriginalTextures = document.getElementById("property-model-original-textures"); @@ -506,11 +505,10 @@ elModelURL.value = properties.modelURL; elShapeType.value = properties.shapeType; elCompoundShapeURL.value = properties.compoundShapeURL; - elModelAnimationURL.value = properties.animationURL; - elModelAnimationPlaying.checked = properties.animationIsPlaying; - elModelAnimationFPS.value = properties.animationFPS; - elModelAnimationFrame.value = properties.animationFrameIndex; - elModelAnimationSettings.value = properties.animationSettings; + elModelAnimationURL.value = properties.animation.url; + elModelAnimationPlaying.checked = properties.animation.running; + elModelAnimationFPS.value = properties.animation.fps; + elModelAnimationFrame.value = properties.animation.frameIndex; elModelTextures.value = properties.textures; elModelOriginalTextures.value = properties.originalTextures; } else if (properties.type == "Web") { @@ -756,11 +754,11 @@ elModelURL.addEventListener('change', createEmitTextPropertyUpdateFunction('modelURL')); elShapeType.addEventListener('change', createEmitTextPropertyUpdateFunction('shapeType')); elCompoundShapeURL.addEventListener('change', createEmitTextPropertyUpdateFunction('compoundShapeURL')); - elModelAnimationURL.addEventListener('change', createEmitTextPropertyUpdateFunction('animationURL')); - elModelAnimationPlaying.addEventListener('change', createEmitCheckedPropertyUpdateFunction('animationIsPlaying')); - elModelAnimationFPS.addEventListener('change', createEmitNumberPropertyUpdateFunction('animationFPS')); - elModelAnimationFrame.addEventListener('change', createEmitNumberPropertyUpdateFunction('animationFrameIndex')); - elModelAnimationSettings.addEventListener('change', createEmitTextPropertyUpdateFunction('animationSettings')); + + elModelAnimationURL.addEventListener('change', createEmitGroupTextPropertyUpdateFunction('animation', 'url')); + elModelAnimationPlaying.addEventListener('change', createEmitGroupCheckedPropertyUpdateFunction('animation','running')); + elModelAnimationFPS.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation','fps')); + elModelAnimationFrame.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation','frameIndex')); elModelTextures.addEventListener('change', createEmitTextPropertyUpdateFunction('textures')); elTextText.addEventListener('change', createEmitTextPropertyUpdateFunction('text')); diff --git a/examples/libraries/entityPropertyDialogBox.js b/examples/libraries/entityPropertyDialogBox.js index 49231ca7c1..a9e2e05445 100644 --- a/examples/libraries/entityPropertyDialogBox.js +++ b/examples/libraries/entityPropertyDialogBox.js @@ -27,7 +27,6 @@ EntityPropertyDialogBox = (function () { var editModelID = -1; var previousAnimationIsPlaying; var previousAnimationFrameIndex; - var previousAnimationSettings; that.cleanup = function () { }; @@ -56,18 +55,15 @@ EntityPropertyDialogBox = (function () { index++; array.push({ label: "Compound Shape URL:", value: properties.compoundShapeURL }); index++; - array.push({ label: "Animation URL:", value: properties.animationURL }); + array.push({ label: "Animation URL:", value: properties.animation.url }); index++; - array.push({ label: "Animation is playing:", type: "checkbox", value: properties.animationIsPlaying }); - previousAnimationIsPlaying = properties.animationIsPlaying; + array.push({ label: "Animation is playing:", type: "checkbox", value: properties.animation.running }); + previousAnimationIsPlaying = properties.animation.running; index++; - array.push({ label: "Animation FPS:", value: properties.animationFPS }); + array.push({ label: "Animation FPS:", value: properties.animation.fps }); index++; - array.push({ label: "Animation Frame:", value: properties.animationFrameIndex }); - previousAnimationFrameIndex = properties.animationFrameIndex; - index++; - array.push({ label: "Animation Settings:", value: properties.animationSettings }); - previousAnimationSettings = properties.animationSettings; + array.push({ label: "Animation Frame:", value: properties.animation.frameIndex }); + previousAnimationFrameIndex = properties.animation.frameIndex; index++; array.push({ label: "Textures:", value: properties.textures }); index++; @@ -312,30 +308,24 @@ EntityPropertyDialogBox = (function () { properties.modelURL = array[index++].value; properties.shapeType = array[index++].value; properties.compoundShapeURL = array[index++].value; - properties.animationURL = array[index++].value; + properties.animation.url = array[index++].value; var newAnimationIsPlaying = array[index++].value; if (previousAnimationIsPlaying != newAnimationIsPlaying) { - properties.animationIsPlaying = newAnimationIsPlaying; + properties.animation.running = newAnimationIsPlaying; } else { - delete properties.animationIsPlaying; + delete properties.animation.running; } - properties.animationFPS = array[index++].value; + properties.animation.fps = array[index++].value; var newAnimationFrameIndex = array[index++].value; if (previousAnimationFrameIndex != newAnimationFrameIndex) { - properties.animationFrameIndex = newAnimationFrameIndex; + properties.animation.frameIndex = newAnimationFrameIndex; } else { - delete properties.animationFrameIndex; + delete properties.animation.frameIndex; } - var newAnimationSettings = array[index++].value; - if (previousAnimationSettings != newAnimationSettings) { - properties.animationSettings = newAnimationSettings; - } else { - delete properties.animationSettings; - } properties.textures = array[index++].value; index++; // skip textureNames label } diff --git a/examples/particleDance.js b/examples/particleDance.js index 6b1f84bb8e..9a0c1fc521 100644 --- a/examples/particleDance.js +++ b/examples/particleDance.js @@ -51,15 +51,6 @@ this.emitRate = randInt(80, 120); this.emitStrength = randInt(4.0, 6.0); - this.animationSettings = JSON.stringify({ - fps: 10, - frameIndex: 0, - running: true, - firstFrame: 0, - lastFrame: 50, - loop: true - }); - this.direction = { x: randFloat(-0.3, 0.3), y: 1.0, @@ -85,7 +76,7 @@ var color = colorPalette[colorIndex]; this.emitters.push(Entities.addEntity({ type: "ParticleEffect", - animationSettings: this.animationSettings, + isEmitting: true, position: this.point, textures: TEXTURE_PATH, emitRate: this.emitRate, diff --git a/examples/particle_explorer/main.js b/examples/particle_explorer/main.js index 4be8168407..32ec12b640 100644 --- a/examples/particle_explorer/main.js +++ b/examples/particle_explorer/main.js @@ -72,10 +72,7 @@ var keysToIgnore = [ 'marketplaceID', 'collisionSoundURL', 'shapeType', - 'animationSettings', - 'animationFrameIndex', - 'animationIsPlaying', - 'animationFPS', + 'isEmitting', 'sittingPoints', 'originalTextures' ]; diff --git a/examples/particle_explorer/particleExplorer.js b/examples/particle_explorer/particleExplorer.js index 6f03eb3c61..16c75e18c6 100644 --- a/examples/particle_explorer/particleExplorer.js +++ b/examples/particle_explorer/particleExplorer.js @@ -55,15 +55,7 @@ var particleProperties; function setUp() { var boxPoint, - spawnPoint, - animation = { - fps: 30, - frameIndex: 0, - running: true, - firstFrame: 0, - lastFrame: 30, - loop: true - }; + spawnPoint; boxPoint = Vec3.sum(MyAvatar.position, Vec3.multiply(4.0, Quat.getFront(Camera.getOrientation()))); boxPoint = Vec3.sum(boxPoint, { @@ -138,8 +130,7 @@ function setUp() { lifespan: 5.0, visible: false, locked: false, - animationSettings: animation, - animationIsPlaying: true, + isEmitting: true, lifetime: 3600 // 1 hour; just in case }); diff --git a/examples/particles.js b/examples/particles.js index def21704d1..adfed2cf11 100644 --- a/examples/particles.js +++ b/examples/particles.js @@ -29,17 +29,11 @@ // constructor function TestFx(color, emitDirection, emitRate, emitStrength, blinkRate) { - var animationSettings = JSON.stringify({ fps: 30, - frameIndex: 0, - running: true, - firstFrame: 0, - lastFrame: 30, - loop: true }); var PI = 3.141593; var DEG_TO_RAD = PI / 180.0; this.entity = Entities.addEntity({ type: "ParticleEffect", - animationSettings: animationSettings, + isEmitting: true, position: spawnPoint, dimensions: {x: 2, y: 2, z: 2}, emitSpeed: 5, diff --git a/examples/toys/breakdanceCore.js b/examples/toys/breakdanceCore.js index 6a69e8d35a..655e55dfc6 100644 --- a/examples/toys/breakdanceCore.js +++ b/examples/toys/breakdanceCore.js @@ -384,13 +384,14 @@ function createOverlays() { } var TEMPORARY_LIFETIME = 60; -var ANIMATION_SETTINGS = JSON.stringify({ +var ANIMATION_SETTINGS = { + url: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx", fps: 30, running: true, loop: true, firstFrame: 1, lastFrame: 10000 -}); +}; var NATURAL_DIMENSIONS = { x: 1.63, y: 1.67, z: 0.31 }; var DIMENSIONS = Vec3.multiply(NATURAL_DIMENSIONS, 0.3); @@ -407,8 +408,7 @@ function createPuppet(model, location) { type: "Model", modelURL: model, registrationPoint: { x: 0.5, y: 0, z: 0.5 }, - animationURL: "http://s3.amazonaws.com/hifi-public/animations/Breakdancing/breakdance_ready.fbx", - animationSettings: ANIMATION_SETTINGS, + animation: ANIMATION_SETTINGS, position: location, ignoreForCollisions: true, dimensions: DIMENSIONS, @@ -558,7 +558,7 @@ breakdanceUpdate = function(deltaTime) { var props = Entities.getEntityProperties(puppetEntityID); //print("puppetEntityID:" + puppetEntityID + "age:"+props.age); Entities.editEntity(puppetEntityID, { - animationURL: poses[poseValue].animation, + animation: { url: poses[poseValue].animation }, lifetime: TEMPORARY_LIFETIME + props.age // renew lifetime }); } diff --git a/examples/toys/grenade.js b/examples/toys/grenade.js index c6a9c5bdeb..7b987b1091 100644 --- a/examples/toys/grenade.js +++ b/examples/toys/grenade.js @@ -33,15 +33,6 @@ var originalPosition = null; var isGrenade = false; var isBurning = false; -var animationSettings = JSON.stringify({ - running: true, - loop: true - }); -var explodeAnimationSettings = JSON.stringify({ - running: true, - loop: false - }); - var GRAVITY = -9.8; var TIME_TO_EXPLODE = 2500; var DISTANCE_IN_FRONT_OF_ME = 1.0; @@ -85,7 +76,7 @@ function update() { // Create fuse particles particles = Entities.addEntity({ type: "ParticleEffect", - animationSettings: animationSettings, + isEmitting: true, position: newProperties.position, textures: 'https://raw.githubusercontent.com/ericrius1/SantasLair/santa/assets/smokeparticle.png', emitRate: 100, @@ -142,7 +133,7 @@ function boom() { Audio.playSound(boomSound, audioOptions); Entities.addEntity({ type: "ParticleEffect", - animationSettings: explodeAnimationSettings, + isEmitting: true, position: properties.position, textures: 'https://raw.githubusercontent.com/ericrius1/SantasLair/santa/assets/smokeparticle.png', emitRate: 200, diff --git a/examples/toys/sprayPaintCan.js b/examples/toys/sprayPaintCan.js index e0aeb19995..b67224b976 100644 --- a/examples/toys/sprayPaintCan.js +++ b/examples/toys/sprayPaintCan.js @@ -62,20 +62,13 @@ this.enableStream = function() { var position = Entities.getEntityProperties(this.entityId, "position").position; - var animationSettings = JSON.stringify({ - fps: 30, - loop: true, - firstFrame: 1, - lastFrame: 10000, - running: true - }); var PI = 3.141593; var DEG_TO_RAD = PI / 180.0; this.paintStream = Entities.addEntity({ type: "ParticleEffect", name: "streamEffect", - animationSettings: animationSettings, + isEmitting: true, position: position, textures: "https://raw.githubusercontent.com/ericrius1/SantasLair/santa/assets/smokeparticle.png", emitSpeed: 3, diff --git a/libraries/animation/src/AnimationLoop.h b/libraries/animation/src/AnimationLoop.h index ae5a88fdbd..eb58774223 100644 --- a/libraries/animation/src/AnimationLoop.h +++ b/libraries/animation/src/AnimationLoop.h @@ -35,14 +35,10 @@ public: void setStartAutomatically(bool startAutomatically); bool getStartAutomatically() const { return _startAutomatically; } - void setFirstFrame(float firstFrame) { _firstFrame = glm::clamp(firstFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); - //qDebug() << "AnimationLoop::setFirstFrame() firstFrame:" << firstFrame << "_firstFrame:" << _firstFrame; - } + void setFirstFrame(float firstFrame) { _firstFrame = glm::clamp(firstFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); } float getFirstFrame() const { return _firstFrame; } - void setLastFrame(float lastFrame) { _lastFrame = glm::clamp(lastFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); - //qDebug() << "AnimationLoop::setLastFrame() lastFrame:" << lastFrame<< "_lastFrame:" << _lastFrame; - } + void setLastFrame(float lastFrame) { _lastFrame = glm::clamp(lastFrame, 0.0f, MAXIMUM_POSSIBLE_FRAME); } float getLastFrame() const { return _lastFrame; } /// by default the AnimationLoop will always reset to the first frame on any call to setRunning @@ -64,17 +60,17 @@ public: void simulate(float deltaTime); private: - float _fps = 30.0f; - bool _loop = false; - bool _hold = false; - bool _startAutomatically = false; - float _firstFrame = 0.0f; - float _lastFrame = MAXIMUM_POSSIBLE_FRAME; - bool _running = false; - float _frameIndex = 0.0f; - float _maxFrameIndexHint = MAXIMUM_POSSIBLE_FRAME; - bool _resetOnRunning = false; - bool _firstRun = true; + float _fps; + bool _loop; + bool _hold; + bool _startAutomatically; + float _firstFrame; + float _lastFrame; + bool _running; + float _frameIndex; + float _maxFrameIndexHint; + bool _resetOnRunning; + bool _firstRun; }; #endif // hifi_AnimationLoop_h diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 15cea8b432..c978fab012 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -269,7 +269,6 @@ void RenderableModelEntityItem::render(RenderArgs* args) { if (_model) { // handle animations.. if (hasAnimation()) { - if (!jointsMapped()) { QStringList modelJointNames = _model->getJointNames(); mapJoints(modelJointNames); diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 0dbf6d1615..9219bb3065 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -18,9 +18,10 @@ // a) toybox/windmill // b) toybox "put me down" doll // c) asana bugs about animations -// 5) update all scripts +// +// DONE - 5) update all scripts // DONE - 6) remove all remnants of old member variables -// 7) research and remove animation settings from Particle Effect +// DONE - 7) research and remove animation settings from Particle Effect // 8) make sure animations start properly when entering a domain... with previously running animations #ifndef hifi_AnimationPropertyGroup_h @@ -95,10 +96,7 @@ public: DEFINE_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, StartAutomatically, startAutomatically, bool); // was animationSettings.startAutomatically public: - void associateWithAnimationLoop(AnimationLoop* animationLoop) { - qDebug() << "associateWithAnimationLoop() this:" << this << "animationLoop:" << animationLoop; - _animationLoop = animationLoop; - } + void associateWithAnimationLoop(AnimationLoop* animationLoop) { _animationLoop = animationLoop; } protected: void setFromOldAnimationSettings(const QString& value); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index eaa21fed12..8b4d4660bf 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -453,6 +453,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Models only if (_type == EntityTypes::Model) { COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MODEL_URL, modelURL); + _animation.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); } if (_type == EntityTypes::Model || _type == EntityTypes::Zone || _type == EntityTypes::ParticleEffect) { @@ -466,7 +467,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool // Models & Particles if (_type == EntityTypes::Model || _type == EntityTypes::ParticleEffect) { - _animation.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); } @@ -621,6 +621,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRITPTVALUE_ENUM(shapeType, ShapeType); COPY_PROPERTY_FROM_QSCRIPTVALUE(maxParticles, float, setMaxParticles); COPY_PROPERTY_FROM_QSCRIPTVALUE(lifespan, float, setLifespan); + COPY_PROPERTY_FROM_QSCRIPTVALUE(isEmitting, bool, setIsEmitting); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitRate, float, setEmitRate); COPY_PROPERTY_FROM_QSCRIPTVALUE(emitSpeed, float, setEmitSpeed); COPY_PROPERTY_FROM_QSCRIPTVALUE(speedSpread, float, setSpeedSpread); @@ -773,6 +774,7 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType); 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); ADD_PROPERTY_TO_MAP(PROP_EMIT_RATE, EmitRate, emitRate, float); ADD_PROPERTY_TO_MAP(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, glm::vec3); ADD_PROPERTY_TO_MAP(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, glm::vec3); @@ -1033,12 +1035,10 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem } if (properties.getType() == EntityTypes::ParticleEffect) { - _staticAnimation.setProperties(properties); - _staticAnimation.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); - APPEND_ENTITY_PROPERTY(PROP_TEXTURES, properties.getTextures()); APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, properties.getMaxParticles()); APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, properties.getLifespan()); + APPEND_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, properties.getIsEmitting()); APPEND_ENTITY_PROPERTY(PROP_EMIT_RATE, properties.getEmitRate()); APPEND_ENTITY_PROPERTY(PROP_EMIT_SPEED, properties.getEmitSpeed()); APPEND_ENTITY_PROPERTY(PROP_SPEED_SPREAD, properties.getSpeedSpread()); @@ -1319,11 +1319,10 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } if (properties.getType() == EntityTypes::ParticleEffect) { - properties.getAnimation().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MAX_PARTICLES, float, setMaxParticles); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFESPAN, float, setLifespan); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMITTING_PARTICLES, bool, setIsEmitting); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_RATE, float, setEmitRate); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_SPEED, float, setEmitSpeed); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SPEED_SPREAD, float, setSpeedSpread); diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index c8bf0836d5..a12328e438 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -136,6 +136,7 @@ public: DEFINE_PROPERTY_REF_ENUM(PROP_SHAPE_TYPE, ShapeType, shapeType, ShapeType); DEFINE_PROPERTY(PROP_MAX_PARTICLES, MaxParticles, maxParticles, quint32); DEFINE_PROPERTY(PROP_LIFESPAN, Lifespan, lifespan, float); + DEFINE_PROPERTY(PROP_EMITTING_PARTICLES, IsEmitting, isEmitting, bool); DEFINE_PROPERTY(PROP_EMIT_RATE, EmitRate, emitRate, float); DEFINE_PROPERTY(PROP_EMIT_SPEED, EmitSpeed, emitSpeed, float); DEFINE_PROPERTY(PROP_SPEED_SPREAD, SpeedSpread, speedSpread, float); @@ -339,6 +340,7 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, ShapeType, shapeType, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, MaxParticles, maxParticles, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, Lifespan, lifespan, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, IsEmitting, isEmitting, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitRate, emitRate, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, EmitSpeed, emitSpeed, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, SpeedSpread, speedSpread, ""); diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 849e3e3a61..d70a5c9616 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -194,6 +194,10 @@ enum EntityPropertyList { // other properties which will never overlap with each other. PROP_SOURCE_URL = PROP_MODEL_URL, + // 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, + // WARNING!!! DO NOT ADD PROPS_xxx here unless you really really meant to.... Add them UP above }; diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index e52d9d0b5d..6023db56e1 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -52,9 +52,9 @@ const float ParticleEffectEntityItem::DEFAULT_ALPHA = 1.0f; const float ParticleEffectEntityItem::DEFAULT_ALPHA_SPREAD = 0.0f; const float ParticleEffectEntityItem::DEFAULT_ALPHA_START = DEFAULT_ALPHA; const float ParticleEffectEntityItem::DEFAULT_ALPHA_FINISH = DEFAULT_ALPHA; -const float ParticleEffectEntityItem::DEFAULT_ANIMATION_FRAME_INDEX = 0.0f; -const bool ParticleEffectEntityItem::DEFAULT_ANIMATION_IS_PLAYING = false; -const float ParticleEffectEntityItem::DEFAULT_ANIMATION_FPS = 30.0f; +//const float ParticleEffectEntityItem::DEFAULT_ANIMATION_FRAME_INDEX = 0.0f; +//const bool ParticleEffectEntityItem::DEFAULT_ANIMATION_IS_PLAYING = false; +//const float ParticleEffectEntityItem::DEFAULT_ANIMATION_FPS = 30.0f; const quint32 ParticleEffectEntityItem::DEFAULT_MAX_PARTICLES = 1000; const float ParticleEffectEntityItem::DEFAULT_LIFESPAN = 3.0f; const float ParticleEffectEntityItem::DEFAULT_EMIT_RATE = 15.0f; @@ -83,9 +83,8 @@ EntityItemPointer ParticleEffectEntityItem::factory(const EntityItemID& entityID // our non-pure virtual subclass for now... ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : EntityItem(entityItemID), - _lastAnimated(usecTimestampNow()), - _animationLoop(), - _animationSettings(), + _lastSimulated(usecTimestampNow()), + _isEmitting(true), _particleLifetimes(DEFAULT_MAX_PARTICLES, 0.0f), _particlePositions(DEFAULT_MAX_PARTICLES, glm::vec3(0.0f, 0.0f, 0.0f)), _particleVelocities(DEFAULT_MAX_PARTICLES, glm::vec3(0.0f, 0.0f, 0.0f)), @@ -109,9 +108,6 @@ ParticleEffectEntityItem::ParticleEffectEntityItem(const EntityItemID& entityIte _type = EntityTypes::ParticleEffect; setColor(DEFAULT_COLOR); setProperties(properties); - - _animationProperties.associateWithAnimationLoop(&_animationLoop); - _animationLoop.setResetOnRunning(false); } ParticleEffectEntityItem::~ParticleEffectEntityItem() { @@ -176,6 +172,7 @@ EntityItemProperties ParticleEffectEntityItem::getProperties(EntityPropertyFlags COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); COPY_ENTITY_PROPERTY_TO_PROPERTIES(maxParticles, getMaxParticles); COPY_ENTITY_PROPERTY_TO_PROPERTIES(lifespan, getLifespan); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(isEmitting, getIsEmitting); COPY_ENTITY_PROPERTY_TO_PROPERTIES(emitRate, getEmitRate); COPY_ENTITY_PROPERTY_TO_PROPERTIES(emitSpeed, getEmitSpeed); COPY_ENTITY_PROPERTY_TO_PROPERTIES(speedSpread, getSpeedSpread); @@ -200,8 +197,6 @@ EntityItemProperties ParticleEffectEntityItem::getProperties(EntityPropertyFlags COPY_ENTITY_PROPERTY_TO_PROPERTIES(alphaFinish, getAlphaFinish); COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); - _animationProperties.getProperties(properties); - return properties; } @@ -214,6 +209,7 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); SET_ENTITY_PROPERTY_FROM_PROPERTIES(maxParticles, setMaxParticles); SET_ENTITY_PROPERTY_FROM_PROPERTIES(lifespan, setLifespan); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(isEmitting, setIsEmitting); SET_ENTITY_PROPERTY_FROM_PROPERTIES(emitRate, setEmitRate); SET_ENTITY_PROPERTY_FROM_PROPERTIES(emitSpeed, setEmitSpeed); SET_ENTITY_PROPERTY_FROM_PROPERTIES(speedSpread, setSpeedSpread); @@ -238,10 +234,6 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert SET_ENTITY_PROPERTY_FROM_PROPERTIES(alphaFinish, setAlphaFinish); SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); - bool somethingChangedInAnimations = _animationProperties.setProperties(properties); - - somethingChanged = somethingChanged || somethingChangedInAnimations; - if (somethingChanged) { bool wantDebug = false; if (wantDebug) { @@ -267,38 +259,11 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch // Because we're using AnimationLoop which will reset the frame index if you change it's running state // we want to read these values in the order they appear in the buffer, but call our setters in an // order that allows AnimationLoop to preserve the correct frame rate. - float animationFPS = getAnimationFPS(); - float animationFrameIndex = getAnimationFrameIndex(); - bool animationIsPlaying = getAnimationIsPlaying(); if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { - READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setAnimationFPS); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); - READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); - } - - if (propertyFlags.getHasProperty(PROP_ANIMATION_PLAYING)) { - if (animationIsPlaying != getAnimationIsPlaying()) { - setAnimationIsPlaying(animationIsPlaying); - } - } - if (propertyFlags.getHasProperty(PROP_ANIMATION_FPS)) { - setAnimationFPS(animationFPS); - } - if (propertyFlags.getHasProperty(PROP_ANIMATION_FRAME_INDEX)) { - setAnimationFrameIndex(animationFrameIndex); - } - if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { - READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); - } - else { - int bytesFromAnimation = _animationProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, - propertyFlags, overwriteLocalData); - - bytesRead += bytesFromAnimation; - dataAt += bytesFromAnimation; - - // FIXME -- we need to actually get the property values out of the _animationProperties - // and use them for our AnimationLoop + SKIP_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float); + SKIP_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float); + SKIP_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool); + SKIP_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString); } READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); @@ -393,8 +358,6 @@ EntityPropertyFlags ParticleEffectEntityItem::getEntityProperties(EncodeBitstrea requestedProperties += PROP_AZIMUTH_START; requestedProperties += PROP_AZIMUTH_FINISH; - requestedProperties += _animationProperties.getEntityProperties(params); - return requestedProperties; } @@ -408,11 +371,6 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); - - // FIXME - we probably need to make sure the _animationProperties has the latest data from the AnimationLoop - _animationProperties.appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties, - propertyFlags, propertiesDidntFit, propertyCount, appendState); - APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, getMaxParticles()); APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, getLifespan()); @@ -442,9 +400,10 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_AZIMUTH_FINISH, getAzimuthFinish()); } -bool ParticleEffectEntityItem::isAnimatingSomething() const { - // keep animating if there are particles still alive. - return (getAnimationIsPlaying() || getLivingParticleCount() > 0) && getAnimationFPS() != 0.0f; +bool ParticleEffectEntityItem::isEmittingParticles() const { + // keep emitting if there are particles still alive. + //return (getAnimationIsPlaying() || getLivingParticleCount() > 0) && getAnimationFPS() != 0.0f; + return (getLivingParticleCount() > 0); } bool ParticleEffectEntityItem::needsToCallUpdate() const { @@ -453,15 +412,10 @@ bool ParticleEffectEntityItem::needsToCallUpdate() const { void ParticleEffectEntityItem::update(const quint64& now) { - float deltaTime = (float)(now - _lastAnimated) / (float)USECS_PER_SECOND; - _lastAnimated = now; + float deltaTime = (float)(now - _lastSimulated) / (float)USECS_PER_SECOND; + _lastSimulated = now; - // only advance the frame index if we're playing - if (getAnimationIsPlaying()) { - _animationLoop.simulate(deltaTime); - } - - if (isAnimatingSomething()) { + if (isEmittingParticles()) { stepSimulation(deltaTime); } @@ -484,131 +438,6 @@ void ParticleEffectEntityItem::updateShapeType(ShapeType type) { } } -void ParticleEffectEntityItem::setAnimationFrameIndex(float value) { -#ifdef WANT_DEBUG - if (isAnimatingSomething()) { - qCDebug(entities) << "ParticleEffectEntityItem::setAnimationFrameIndex()"; - qCDebug(entities) << " value:" << value; - qCDebug(entities) << " was:" << _animationLoop.getFrameIndex(); - } -#endif - _animationLoop.setFrameIndex(value); -} - -void ParticleEffectEntityItem::setAnimationSettings(const QString& value) { - // the animations setting is a JSON string that may contain various animation settings. - // if it includes fps, frameIndex, or running, those values will be parsed out and - // will over ride the regular animation settings - - QJsonDocument settingsAsJson = QJsonDocument::fromJson(value.toUtf8()); - QJsonObject settingsAsJsonObject = settingsAsJson.object(); - QVariantMap settingsMap = settingsAsJsonObject.toVariantMap(); - if (settingsMap.contains("fps")) { - float fps = settingsMap["fps"].toFloat(); - setAnimationFPS(fps); - } - - if (settingsMap.contains("frameIndex")) { - float frameIndex = settingsMap["frameIndex"].toFloat(); -#ifdef WANT_DEBUG - if (isAnimatingSomething()) { - qCDebug(entities) << "ParticleEffectEntityItem::setAnimationSettings() calling setAnimationFrameIndex()..."; - qCDebug(entities) << " settings:" << value; - qCDebug(entities) << " settingsMap[frameIndex]:" << settingsMap["frameIndex"]; - qCDebug(entities, " frameIndex: %20.5f", frameIndex); - } -#endif - - setAnimationFrameIndex(frameIndex); - } - - if (settingsMap.contains("running")) { - bool running = settingsMap["running"].toBool(); - if (running != getAnimationIsPlaying()) { - setAnimationIsPlaying(running); - } - } - - if (settingsMap.contains("firstFrame")) { - float firstFrame = settingsMap["firstFrame"].toFloat(); - setAnimationFirstFrame(firstFrame); - } - - if (settingsMap.contains("lastFrame")) { - float lastFrame = settingsMap["lastFrame"].toFloat(); - setAnimationLastFrame(lastFrame); - } - - if (settingsMap.contains("loop")) { - bool loop = settingsMap["loop"].toBool(); - setAnimationLoop(loop); - } - - if (settingsMap.contains("hold")) { - bool hold = settingsMap["hold"].toBool(); - setAnimationHold(hold); - } - - if (settingsMap.contains("startAutomatically")) { - bool startAutomatically = settingsMap["startAutomatically"].toBool(); - setAnimationStartAutomatically(startAutomatically); - } - - _animationSettings = value; - _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; -} - -void ParticleEffectEntityItem::setAnimationIsPlaying(bool value) { - _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; - _animationLoop.setRunning(value); -} - -void ParticleEffectEntityItem::setAnimationFPS(float value) { - _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; - _animationLoop.setFPS(value); -} - -QString ParticleEffectEntityItem::getAnimationSettings() const { - // the animations setting is a JSON string that may contain various animation settings. - // if it includes fps, frameIndex, or running, those values will be parsed out and - // will over ride the regular animation settings - QString value = _animationSettings; - - QJsonDocument settingsAsJson = QJsonDocument::fromJson(value.toUtf8()); - QJsonObject settingsAsJsonObject = settingsAsJson.object(); - QVariantMap settingsMap = settingsAsJsonObject.toVariantMap(); - - QVariant fpsValue(getAnimationFPS()); - settingsMap["fps"] = fpsValue; - - QVariant frameIndexValue(getAnimationFrameIndex()); - settingsMap["frameIndex"] = frameIndexValue; - - QVariant runningValue(getAnimationIsPlaying()); - settingsMap["running"] = runningValue; - - QVariant firstFrameValue(getAnimationFirstFrame()); - settingsMap["firstFrame"] = firstFrameValue; - - QVariant lastFrameValue(getAnimationLastFrame()); - settingsMap["lastFrame"] = lastFrameValue; - - QVariant loopValue(getAnimationLoop()); - settingsMap["loop"] = loopValue; - - QVariant holdValue(getAnimationHold()); - settingsMap["hold"] = holdValue; - - QVariant startAutomaticallyValue(getAnimationStartAutomatically()); - settingsMap["startAutomatically"] = startAutomaticallyValue; - - settingsAsJsonObject = QJsonObject::fromVariantMap(settingsMap); - QJsonDocument newDocument(settingsAsJsonObject); - QByteArray jsonByteArray = newDocument.toJson(QJsonDocument::Compact); - QString jsonByteString(jsonByteArray); - return jsonByteString; -} - void ParticleEffectEntityItem::updateRadius(quint32 index, float age) { _particleRadiuses[index] = Interpolate::interpolate3Points(_radiusStarts[index], _radiusMiddles[index], _radiusFinishes[index], age); @@ -669,8 +498,8 @@ void ParticleEffectEntityItem::stepSimulation(float deltaTime) { } } - // emit new particles, but only if animation is playing - if (getAnimationIsPlaying()) { + // emit new particles, but only if we are emmitting + if (isEmittingParticles()) { float timeLeftInFrame = deltaTime; while (_timeUntilNextEmit < timeLeftInFrame) { diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index cb2e80a1be..44cfb76a02 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -91,33 +91,9 @@ public: virtual void debugDump() const; - - const AnimationPropertyGroup& getAnimationProperties() const { return _animationProperties; } - - static const float DEFAULT_ANIMATION_FRAME_INDEX; - void setAnimationFrameIndex(float value); - void setAnimationSettings(const QString& value); - - static const bool DEFAULT_ANIMATION_IS_PLAYING; - void setAnimationIsPlaying(bool value); - - static const float DEFAULT_ANIMATION_FPS; - void setAnimationFPS(float value); - - void setAnimationLoop(bool loop) { _animationLoop.setLoop(loop); } - bool getAnimationLoop() const { return _animationLoop.getLoop(); } - - void setAnimationHold(bool hold) { _animationLoop.setHold(hold); } - bool getAnimationHold() const { return _animationLoop.getHold(); } - - void setAnimationStartAutomatically(bool startAutomatically) { _animationLoop.setStartAutomatically(startAutomatically); } - bool getAnimationStartAutomatically() const { return _animationLoop.getStartAutomatically(); } - - void setAnimationFirstFrame(float firstFrame) { _animationLoop.setFirstFrame(firstFrame); } - float getAnimationFirstFrame() const { return _animationLoop.getFirstFrame(); } - - void setAnimationLastFrame(float lastFrame) { _animationLoop.setLastFrame(lastFrame); } - float getAnimationLastFrame() const { return _animationLoop.getLastFrame(); } + bool isEmittingParticles() const; /// emitting enabled, and there are particles alive + bool getIsEmitting() const { return _isEmitting; } + void setIsEmitting(bool isEmitting) { _isEmitting = isEmitting; } static const quint32 DEFAULT_MAX_PARTICLES; void setMaxParticles(quint32 maxParticles); @@ -195,12 +171,6 @@ public: void computeAndUpdateDimensions(); - - bool getAnimationIsPlaying() const { return _animationLoop.isRunning(); } - float getAnimationFrameIndex() const { return _animationLoop.getFrameIndex(); } - float getAnimationFPS() const { return _animationLoop.getFPS(); } - QString getAnimationSettings() const; - static const QString DEFAULT_TEXTURES; const QString& getTextures() const { return _textures; } void setTextures(const QString& textures) { @@ -250,12 +220,8 @@ protected: float _radiusSpread = DEFAULT_RADIUS_SPREAD; - quint64 _lastAnimated; - AnimationPropertyGroup _animationProperties; - AnimationLoop _animationLoop; - - // FIXME - remove this - QString _animationSettings; + quint64 _lastSimulated; + bool _isEmitting; QString _textures = DEFAULT_TEXTURES; bool _texturesChangedFlag = false; diff --git a/unpublishedScripts/masterReset.js b/unpublishedScripts/masterReset.js index d6759e2b48..f08d62e087 100644 --- a/unpublishedScripts/masterReset.js +++ b/unpublishedScripts/masterReset.js @@ -112,19 +112,10 @@ function createFire() { var myOrientation = Quat.fromPitchYawRollDegrees(-90, 0, 0.0); - var animationSettings = JSON.stringify({ - fps: 30, - running: true, - loop: true, - firstFrame: 1, - lastFrame: 10000 - }); - - var fire = Entities.addEntity({ type: "ParticleEffect", name: "fire", - animationSettings: animationSettings, + isEmitting: true, textures: "https://hifi-public.s3.amazonaws.com/alan/Particles/Particle-Sprite-Smoke-1.png", position: { x: 551.45, @@ -187,17 +178,16 @@ function createFire() { function createCat(position) { var scriptURL = Script.resolvePath("../examples/toys/cat.js"); var modelURL = "http://hifi-public.s3.amazonaws.com/ryan/Dark_Cat.fbx"; - var animationURL = "http://hifi-public.s3.amazonaws.com/ryan/sleeping.fbx"; - var animationSettings = JSON.stringify({ + var animationSettings = { + url: "http://hifi-public.s3.amazonaws.com/ryan/sleeping.fbx", running: true, - }); + }; var cat = Entities.addEntity({ type: "Model", modelURL: modelURL, name: "cat", script: scriptURL, - animationURL: animationURL, - animationSettings: animationSettings, + animation: animationSettings, position: position, rotation: { w: 0.35020983219146729, From 86a3825a5a6caa0dd4088af4f8b0d20582b05c9c Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 2 Oct 2015 14:50:59 -0700 Subject: [PATCH 11/30] tweak --- libraries/entities/src/AnimationPropertyGroup.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 9219bb3065..fa12d8f279 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -47,6 +47,7 @@ class AnimationPropertyGroup : public PropertyGroup { public: AnimationPropertyGroup(); virtual ~AnimationPropertyGroup() {} + void associateWithAnimationLoop(AnimationLoop* animationLoop) { _animationLoop = animationLoop; } // EntityItemProperty related helpers virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const; @@ -95,9 +96,6 @@ public: DEFINE_PROPERTY(PROP_ANIMATION_HOLD, Hold, hold, bool); // was animationSettings.hold DEFINE_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, StartAutomatically, startAutomatically, bool); // was animationSettings.startAutomatically -public: - void associateWithAnimationLoop(AnimationLoop* animationLoop) { _animationLoop = animationLoop; } - protected: void setFromOldAnimationSettings(const QString& value); From f618a2adfa3375a1d3d6dc62df5679df96056394 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 2 Oct 2015 17:06:32 -0700 Subject: [PATCH 12/30] gak - get streaming working again --- libraries/animation/src/AnimationLoop.cpp | 13 ++--- libraries/animation/src/AnimationLoop.h | 1 - .../entities/src/AnimationPropertyGroup.cpp | 47 +++++++++++-------- .../entities/src/EntityItemProperties.cpp | 1 + libraries/entities/src/ModelEntityItem.cpp | 22 +++++++-- 5 files changed, 51 insertions(+), 33 deletions(-) diff --git a/libraries/animation/src/AnimationLoop.cpp b/libraries/animation/src/AnimationLoop.cpp index 6062d71f9c..cd360a79a7 100644 --- a/libraries/animation/src/AnimationLoop.cpp +++ b/libraries/animation/src/AnimationLoop.cpp @@ -24,8 +24,7 @@ AnimationLoop::AnimationLoop() : _running(false), _frameIndex(0.0f), _maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME), - _resetOnRunning(false), - _firstRun(true) + _resetOnRunning(false) { } @@ -38,8 +37,7 @@ AnimationLoop::AnimationLoop(const AnimationDetails& animationDetails) : _lastFrame(animationDetails.lastFrame), _running(animationDetails.running), _frameIndex(animationDetails.frameIndex), - _resetOnRunning(false), - _firstRun(true) + _resetOnRunning(false) { } @@ -53,8 +51,7 @@ AnimationLoop::AnimationLoop(float fps, bool loop, bool hold, bool startAutomati _lastFrame(lastFrame), _running(running), _frameIndex(frameIndex), - _resetOnRunning(false), - _firstRun(true) + _resetOnRunning(false) { } @@ -94,10 +91,10 @@ void AnimationLoop::setRunning(bool running) { _running = running; // If we just set running to true, then also reset the frame to the first frame - if (running && (_resetOnRunning || _firstRun)) { + if (running && (_resetOnRunning)) { // move back to the beginning + qDebug() << "resetting _frameIndex:" << _frameIndex << "to _firstFrame:" << _firstFrame; _frameIndex = _firstFrame; - _firstRun = false; } } } diff --git a/libraries/animation/src/AnimationLoop.h b/libraries/animation/src/AnimationLoop.h index eb58774223..6c3df659dc 100644 --- a/libraries/animation/src/AnimationLoop.h +++ b/libraries/animation/src/AnimationLoop.h @@ -70,7 +70,6 @@ private: float _frameIndex; float _maxFrameIndexHint; bool _resetOnRunning; - bool _firstRun; }; #endif // hifi_AnimationLoop_h diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index 47733c205d..653cf4c4f8 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -100,7 +100,8 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() value:" << value; + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() url:" << getURL() << "value:" << value; + // the animations setting is a JSON string that may contain various animation settings. // if it includes fps, frameIndex, or running, those values will be parsed out and // will over ride the regular animation settings @@ -125,37 +126,37 @@ void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { if (settingsMap.contains("frameIndex")) { frameIndex = settingsMap["frameIndex"].toFloat(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had frameIndex"; + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had frameIndex:" << frameIndex; } if (settingsMap.contains("running")) { running = settingsMap["running"].toBool(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had running"; + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had running:" << running; } if (settingsMap.contains("firstFrame")) { frameIndex = settingsMap["firstFrame"].toFloat(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had firstFrame"; + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had firstFrame:" << firstFrame; } if (settingsMap.contains("lastFrame")) { frameIndex = settingsMap["lastFrame"].toFloat(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had lastFrame"; + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had lastFrame:" << lastFrame; } if (settingsMap.contains("loop")) { running = settingsMap["loop"].toBool(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had loop"; + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had loop:" << loop; } if (settingsMap.contains("hold")) { running = settingsMap["hold"].toBool(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had hold"; + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had hold:" << hold; } if (settingsMap.contains("startAutomatically")) { running = settingsMap["startAutomatically"].toBool(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had startAutomatically"; + qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had startAutomatically:" << startAutomatically; } if (_animationLoop) { @@ -182,7 +183,9 @@ void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { void AnimationPropertyGroup::debugDump() const { qDebug() << " AnimationPropertyGroup: ---------------------------------------------"; - qDebug() << " URL:" << getURL() << " has changed:" << urlChanged(); + qDebug() << " url:" << getURL() << " has changed:" << urlChanged(); + qDebug() << " fps:" << getFPS() << " has changed:" << fpsChanged(); + qDebug() << "frameIndex:" << getFrameIndex() << " has changed:" << frameIndexChanged(); } bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, @@ -377,15 +380,6 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); if (_animationLoop) { - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getRunning()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); - } else { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, _animationLoop->getFPS()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getFrameIndex()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, _animationLoop->getRunning()); @@ -395,6 +389,16 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, _animationLoop->getHold()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, _animationLoop->getStartAutomatically()); } + else { + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); + } } int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, @@ -410,7 +414,7 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char if (_animationLoop) { // apply new properties to our associated AnimationLoop - //qDebug() << "AnimationPropertyGroup::readEntitySubclassDataFromBuffer() -- apply new properties to our associated AnimationLoop"; + qDebug() << "AnimationPropertyGroup::readEntitySubclassDataFromBuffer() -- apply new properties to our associated AnimationLoop"; READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, _animationLoop->setFPS); READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setFrameIndex); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, _animationLoop->setRunning); @@ -420,6 +424,7 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, _animationLoop->setHold); READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, _animationLoop->setStartAutomatically); } else { + qDebug() << "AnimationPropertyGroup::readEntitySubclassDataFromBuffer() -- NO AnimationLoop store locally"; READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); @@ -430,6 +435,10 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); } + if (_animationLoop) { + qDebug() << "_animationLoop->isRunning():" << _animationLoop->isRunning(); + } + return bytesRead; } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 8b4d4660bf..cdd6c5b2ca 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -176,6 +176,7 @@ void EntityItemProperties::debugDump() const { qCDebug(entities) << " _modelURL=" << _modelURL; qCDebug(entities) << " _compoundShapeURL=" << _compoundShapeURL; + getAnimation().debugDump(); getAtmosphere().debugDump(); getSkybox().debugDump(); diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index e2111fb9c1..f7b4e014db 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -49,6 +49,8 @@ ModelEntityItem::ModelEntityItem(const EntityItemID& entityItemID, const EntityI EntityItemProperties ModelEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class + //qDebug() << "ModelEntityItem::getProperties() id:" << getEntityItemID(); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getXColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(modelURL, getModelURL); COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); @@ -58,6 +60,8 @@ EntityItemProperties ModelEntityItem::getProperties(EntityPropertyFlags desiredP _animationProperties.getProperties(properties); + //properties.debugDump(); + return properties; } @@ -73,7 +77,11 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); + qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() << "modelURL:" << getModelURL(); + qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() << "calling _animationProperties.setProperties()"; bool somethingChangedInAnimations = _animationProperties.setProperties(properties); + qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() << "AFTER _animationProperties.setProperties() running:" << _animationLoop.getRunning(); + qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() << "AFTER _animationProperties.setProperties() frameIndex:" << _animationLoop.getFrameIndex(); somethingChanged = somethingChanged || somethingChangedInAnimations; @@ -102,17 +110,15 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_MODEL_URL, QString, setModelURL); if (args.bitstreamVersion < VERSION_ENTITIES_HAS_COLLISION_MODEL) { setCompoundShapeURL(""); - } else if (args.bitstreamVersion == VERSION_ENTITIES_HAS_COLLISION_MODEL) { - READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); } else { READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); } - READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setAnimationURL); // Because we're using AnimationLoop which will reset the frame index if you change it's running state // we want to read these values in the order they appear in the buffer, but call our setters in an // order that allows AnimationLoop to preserve the correct frame rate. if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { + READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setAnimationURL); READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setAnimationFPS); READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); @@ -135,6 +141,9 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); + qDebug() << "ModelEntityItem::readEntitySubclassDataFromBuffer()"; + debugDump(); + return bytesRead; } @@ -278,7 +287,9 @@ void ModelEntityItem::update(const quint64& now) { float deltaTime = (float)(now - _lastAnimated) / (float)USECS_PER_SECOND; _lastAnimated = now; _animationLoop.simulate(deltaTime); - } else { + //qDebug() << "ModelEntityItem::update() id:" << getEntityItemID() << "frameIndex:" << _animationLoop.getFrameIndex(); + } + else { _lastAnimated = now; } EntityItem::update(now); // let our base class handle it's updates... @@ -290,7 +301,8 @@ void ModelEntityItem::debugDump() const { qCDebug(entities) << " position:" << getPosition(); qCDebug(entities) << " dimensions:" << getDimensions(); qCDebug(entities) << " model URL:" << getModelURL(); - qCDebug(entities) << " compound shape URL:" << getCompoundShapeURL(); + qCDebug(entities) << " _animationLoop.isRunning():" << _animationLoop.isRunning(); + //qCDebug(entities) << " compound shape URL:" << getCompoundShapeURL(); } void ModelEntityItem::updateShapeType(ShapeType type) { From 68dc30360322f4b375ebfcda87f40a792789a3ad Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 2 Oct 2015 17:12:03 -0700 Subject: [PATCH 13/30] remove debug --- .../entities/src/AnimationPropertyGroup.cpp | 42 +------------------ libraries/entities/src/ModelEntityItem.cpp | 22 +--------- 2 files changed, 2 insertions(+), 62 deletions(-) diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index 653cf4c4f8..7108f3a4cd 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -33,8 +33,6 @@ CONSTRUCT_PROPERTY(startAutomatically, false) void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_URL, Animation, animation, URL, url); - //qDebug() << "AnimationPropertyGroup::copyToScriptValue() url:" << getURL(); - if (_animationLoop) { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FPS, Animation, animation, FPS, fps, _animationLoop->getFPS); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, Animation, animation, FrameIndex, frameIndex, _animationLoop->getFPS); @@ -64,8 +62,6 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationURL, QString, setURL, getURL); COPY_PROPERTY_FROM_QSCRIPTVALUE_NOCHECK(animationSettings, QString, setFromOldAnimationSettings); - //qDebug() << "AnimationPropertyGroup::copyFromScriptValue() url:" << getURL(); - if (_animationLoop) { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, fps, float, _animationLoop->setFPS); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, frameIndex, float, _animationLoop->setFrameIndex); @@ -99,9 +95,6 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo } void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { - - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() url:" << getURL() << "value:" << value; - // the animations setting is a JSON string that may contain various animation settings. // if it includes fps, frameIndex, or running, those values will be parsed out and // will over ride the regular animation settings @@ -121,42 +114,34 @@ void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { if (settingsMap.contains("fps")) { fps = settingsMap["fps"].toFloat(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had fps:" << fps; } if (settingsMap.contains("frameIndex")) { frameIndex = settingsMap["frameIndex"].toFloat(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had frameIndex:" << frameIndex; } if (settingsMap.contains("running")) { running = settingsMap["running"].toBool(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had running:" << running; } if (settingsMap.contains("firstFrame")) { frameIndex = settingsMap["firstFrame"].toFloat(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had firstFrame:" << firstFrame; } if (settingsMap.contains("lastFrame")) { frameIndex = settingsMap["lastFrame"].toFloat(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had lastFrame:" << lastFrame; } if (settingsMap.contains("loop")) { running = settingsMap["loop"].toBool(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had loop:" << loop; } if (settingsMap.contains("hold")) { running = settingsMap["hold"].toBool(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had hold:" << hold; } if (settingsMap.contains("startAutomatically")) { running = settingsMap["startAutomatically"].toBool(); - qDebug() << "AnimationPropertyGroup::setFromOldAnimationSettings() had startAutomatically:" << startAutomatically; } if (_animationLoop) { @@ -198,9 +183,6 @@ bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); - - //qDebug() << "AnimationPropertyGroup::appendToEditPacket() url:" << getURL(); - if (_animationLoop) { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, _animationLoop->getFPS()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getFrameIndex()); @@ -232,8 +214,6 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); - //qDebug() << "AnimationPropertyGroup::decodeFromEditPacket() url:" << getURL(); - if (_animationLoop) { READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, _animationLoop->setFPS); READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setFrameIndex); @@ -294,9 +274,6 @@ EntityPropertyFlags AnimationPropertyGroup::getChangedProperties() const { void AnimationPropertyGroup::getProperties(EntityItemProperties& properties) const { COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, URL, getURL); - - //qDebug() << "AnimationPropertyGroup::getProperties() url:" << getURL(); - if (_animationLoop) { COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FPS, _animationLoop->getFPS); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FrameIndex, _animationLoop->getFrameIndex); @@ -322,12 +299,7 @@ bool AnimationPropertyGroup::setProperties(const EntityItemProperties& propertie bool somethingChanged = false; SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, URL, url, setURL); - - //qDebug() << "AnimationPropertyGroup::setProperties() url:" << getURL(); - if (_animationLoop) { - //qDebug() << "AnimationPropertyGroup::setProperties() -- apply new properties to our associated AnimationLoop"; - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FPS, fps, _animationLoop->setFPS); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FrameIndex, frameIndex, _animationLoop->setFrameIndex); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Running, running, _animationLoop->setRunning); @@ -376,8 +348,6 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En bool successPropertyFits = true; - //qDebug() << "AnimationPropertyGroup::appendSubclassData() url:" << getURL(); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); if (_animationLoop) { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, _animationLoop->getFPS()); @@ -388,8 +358,7 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, _animationLoop->getLastFrame()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, _animationLoop->getHold()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, _animationLoop->getStartAutomatically()); - } - else { + } else { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getRunning()); @@ -410,11 +379,8 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); - //qDebug() << "AnimationPropertyGroup::readEntitySubclassDataFromBuffer() url:" << getURL(); - if (_animationLoop) { // apply new properties to our associated AnimationLoop - qDebug() << "AnimationPropertyGroup::readEntitySubclassDataFromBuffer() -- apply new properties to our associated AnimationLoop"; READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, _animationLoop->setFPS); READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setFrameIndex); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, _animationLoop->setRunning); @@ -424,7 +390,6 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char READ_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, bool, _animationLoop->setHold); READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, _animationLoop->setStartAutomatically); } else { - qDebug() << "AnimationPropertyGroup::readEntitySubclassDataFromBuffer() -- NO AnimationLoop store locally"; READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); @@ -435,10 +400,5 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); } - if (_animationLoop) { - qDebug() << "_animationLoop->isRunning():" << _animationLoop->isRunning(); - } - - return bytesRead; } diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index f7b4e014db..ef8ddbead6 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -48,26 +48,17 @@ ModelEntityItem::ModelEntityItem(const EntityItemID& entityItemID, const EntityI EntityItemProperties ModelEntityItem::getProperties(EntityPropertyFlags desiredProperties) const { EntityItemProperties properties = EntityItem::getProperties(desiredProperties); // get the properties from our base class - - //qDebug() << "ModelEntityItem::getProperties() id:" << getEntityItemID(); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(color, getXColor); COPY_ENTITY_PROPERTY_TO_PROPERTIES(modelURL, getModelURL); COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); COPY_ENTITY_PROPERTY_TO_PROPERTIES(glowLevel, getGlowLevel); COPY_ENTITY_PROPERTY_TO_PROPERTIES(textures, getTextures); COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); - _animationProperties.getProperties(properties); - - //properties.debugDump(); - return properties; } bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { - qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID(); - bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class @@ -77,12 +68,7 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(textures, setTextures); SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); - qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() << "modelURL:" << getModelURL(); - qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() << "calling _animationProperties.setProperties()"; bool somethingChangedInAnimations = _animationProperties.setProperties(properties); - qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() << "AFTER _animationProperties.setProperties() running:" << _animationLoop.getRunning(); - qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() << "AFTER _animationProperties.setProperties() frameIndex:" << _animationLoop.getFrameIndex(); - somethingChanged = somethingChanged || somethingChangedInAnimations; if (somethingChanged) { @@ -140,10 +126,6 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); - - qDebug() << "ModelEntityItem::readEntitySubclassDataFromBuffer()"; - debugDump(); - return bytesRead; } @@ -287,9 +269,7 @@ void ModelEntityItem::update(const quint64& now) { float deltaTime = (float)(now - _lastAnimated) / (float)USECS_PER_SECOND; _lastAnimated = now; _animationLoop.simulate(deltaTime); - //qDebug() << "ModelEntityItem::update() id:" << getEntityItemID() << "frameIndex:" << _animationLoop.getFrameIndex(); - } - else { + } else { _lastAnimated = now; } EntityItem::update(now); // let our base class handle it's updates... From eb9078bda5cdfac683b6a04102235440952ee4ba Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 2 Oct 2015 17:27:45 -0700 Subject: [PATCH 14/30] cleanup --- .../entities/src/AnimationPropertyGroup.h | 6 +++-- libraries/entities/src/ModelEntityItem.cpp | 23 +------------------ libraries/entities/src/ModelEntityItem.h | 8 +------ .../entities/src/ParticleEffectEntityItem.cpp | 7 +++--- 4 files changed, 10 insertions(+), 34 deletions(-) diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index fa12d8f279..5541e49840 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -15,14 +15,16 @@ // DONE - 2) rename the group animationSettings // DONE - 3) make sure that setting properties and reading from stream actually set the animationLoop object properly // 4) test it! -// a) toybox/windmill +// DONE - a) toybox/windmill // b) toybox "put me down" doll // c) asana bugs about animations // // DONE - 5) update all scripts // DONE - 6) remove all remnants of old member variables // DONE - 7) research and remove animation settings from Particle Effect -// 8) make sure animations start properly when entering a domain... with previously running animations +// DONE - 8) make sure animations start properly when entering a domain... with previously running animations +// 9) test particles!!! +// #ifndef hifi_AnimationPropertyGroup_h #define hifi_AnimationPropertyGroup_h diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index ef8ddbead6..a23279a72f 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -22,11 +22,6 @@ const QString ModelEntityItem::DEFAULT_MODEL_URL = QString(""); const QString ModelEntityItem::DEFAULT_COMPOUND_SHAPE_URL = QString(""); -const QString ModelEntityItem::DEFAULT_ANIMATION_URL = QString(""); -const float ModelEntityItem::DEFAULT_ANIMATION_FRAME_INDEX = 0.0f; -const bool ModelEntityItem::DEFAULT_ANIMATION_IS_PLAYING = false; -const float ModelEntityItem::DEFAULT_ANIMATION_FPS = 30.0f; - EntityItemPointer ModelEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return std::make_shared(entityID, properties); @@ -157,7 +152,6 @@ void ModelEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL()); APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures()); - // FIXME - we probably need to make sure the _animationProperties has the latest data from the AnimationLoop _animationProperties.appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); @@ -281,8 +275,7 @@ void ModelEntityItem::debugDump() const { qCDebug(entities) << " position:" << getPosition(); qCDebug(entities) << " dimensions:" << getDimensions(); qCDebug(entities) << " model URL:" << getModelURL(); - qCDebug(entities) << " _animationLoop.isRunning():" << _animationLoop.isRunning(); - //qCDebug(entities) << " compound shape URL:" << getCompoundShapeURL(); + qCDebug(entities) << " compound shape URL:" << getCompoundShapeURL(); } void ModelEntityItem::updateShapeType(ShapeType type) { @@ -324,19 +317,6 @@ void ModelEntityItem::setAnimationURL(const QString& url) { _animationProperties.setURL(url); } -void ModelEntityItem::setAnimationFrameIndex(float value) { -#ifdef WANT_DEBUG - if (isAnimatingSomething()) { - qCDebug(entities) << "ModelEntityItem::setAnimationFrameIndex()"; - qCDebug(entities) << " value:" << value; - qCDebug(entities) << " was:" << _animationLoop.getFrameIndex(); - qCDebug(entities) << " model URL:" << getModelURL(); - qCDebug(entities) << " animation URL:" << getAnimationURL(); - } -#endif - _animationLoop.setFrameIndex(value); -} - void ModelEntityItem::setAnimationSettings(const QString& value) { // the animations setting is a JSON string that may contain various animation settings. // if it includes fps, frameIndex, or running, those values will be parsed out and @@ -398,7 +378,6 @@ void ModelEntityItem::setAnimationSettings(const QString& value) { setAnimationStartAutomatically(startAutomatically); } - //_animationSettings = value; _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; } diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index b677de22cc..66f102fe7a 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -81,17 +81,11 @@ public: const AnimationPropertyGroup& getAnimationProperties() const { return _animationProperties; } bool hasAnimation() const { return !_animationProperties.getURL().isEmpty(); } - static const QString DEFAULT_ANIMATION_URL; const QString& getAnimationURL() const { return _animationProperties.getURL(); } void setAnimationURL(const QString& url); - static const float DEFAULT_ANIMATION_FRAME_INDEX; - void setAnimationFrameIndex(float value); - - static const bool DEFAULT_ANIMATION_IS_PLAYING; + void setAnimationFrameIndex(float value) { _animationLoop.setFrameIndex(value); } void setAnimationIsPlaying(bool value); - - static const float DEFAULT_ANIMATION_FPS; void setAnimationFPS(float value); void setAnimationLoop(bool loop) { _animationLoop.setLoop(loop); } diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 6023db56e1..421565fc84 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -52,9 +52,6 @@ const float ParticleEffectEntityItem::DEFAULT_ALPHA = 1.0f; const float ParticleEffectEntityItem::DEFAULT_ALPHA_SPREAD = 0.0f; const float ParticleEffectEntityItem::DEFAULT_ALPHA_START = DEFAULT_ALPHA; const float ParticleEffectEntityItem::DEFAULT_ALPHA_FINISH = DEFAULT_ALPHA; -//const float ParticleEffectEntityItem::DEFAULT_ANIMATION_FRAME_INDEX = 0.0f; -//const bool ParticleEffectEntityItem::DEFAULT_ANIMATION_IS_PLAYING = false; -//const float ParticleEffectEntityItem::DEFAULT_ANIMATION_FPS = 30.0f; const quint32 ParticleEffectEntityItem::DEFAULT_MAX_PARTICLES = 1000; const float ParticleEffectEntityItem::DEFAULT_LIFESPAN = 3.0f; const float ParticleEffectEntityItem::DEFAULT_EMIT_RATE = 15.0f; @@ -264,6 +261,8 @@ int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch SKIP_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float); SKIP_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool); SKIP_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString); + } else { + READ_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, bool, setIsEmitting); } READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); @@ -333,6 +332,7 @@ EntityPropertyFlags ParticleEffectEntityItem::getEntityProperties(EncodeBitstrea requestedProperties += PROP_SHAPE_TYPE; requestedProperties += PROP_MAX_PARTICLES; requestedProperties += PROP_LIFESPAN; + requestedProperties += PROP_EMITTING_PARTICLES; requestedProperties += PROP_EMIT_RATE; requestedProperties += PROP_EMIT_ACCELERATION; requestedProperties += PROP_ACCELERATION_SPREAD; @@ -371,6 +371,7 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); + APPEND_ENTITY_PROPERTY(PROP_EMITTING_PARTICLES, getIsEmitting()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_MAX_PARTICLES, getMaxParticles()); APPEND_ENTITY_PROPERTY(PROP_LIFESPAN, getLifespan()); From accdd8c86afd57ad97a681882e35a14d89db804e Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Fri, 2 Oct 2015 19:15:24 -0700 Subject: [PATCH 15/30] add animation properties to edit properties --- examples/html/entityProperties.html | 46 +++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index 40b94c2eb2..5743d65ed0 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -282,6 +282,11 @@ var elModelAnimationPlaying = document.getElementById("property-model-animation-playing"); var elModelAnimationFPS = document.getElementById("property-model-animation-fps"); var elModelAnimationFrame = document.getElementById("property-model-animation-frame"); + var elModelAnimationFirstFrame = document.getElementById("property-model-animation-first-frame"); + var elModelAnimationLastFrame = document.getElementById("property-model-animation-last-frame"); + var elModelAnimationLoop = document.getElementById("property-model-animation-loop"); + var elModelAnimationHold = document.getElementById("property-model-animation-hold"); + var elModelAnimationStartAutomatically = document.getElementById("property-model-animation-start-automatically"); var elModelTextures = document.getElementById("property-model-textures"); var elModelOriginalTextures = document.getElementById("property-model-original-textures"); @@ -509,6 +514,11 @@ elModelAnimationPlaying.checked = properties.animation.running; elModelAnimationFPS.value = properties.animation.fps; elModelAnimationFrame.value = properties.animation.frameIndex; + elModelAnimationFirstFrame.value = properties.animation.firstFrame; + elModelAnimationLastFrame.value = properties.animation.lastFrame; + elModelAnimationLoop.checked = properties.animation.loop; + elModelAnimationHold.checked = properties.animation.hold; + elModelAnimationStartAutomatically.checked = properties.animation.startAutomatically; elModelTextures.value = properties.textures; elModelOriginalTextures.value = properties.originalTextures; } else if (properties.type == "Web") { @@ -758,7 +768,13 @@ elModelAnimationURL.addEventListener('change', createEmitGroupTextPropertyUpdateFunction('animation', 'url')); elModelAnimationPlaying.addEventListener('change', createEmitGroupCheckedPropertyUpdateFunction('animation','running')); elModelAnimationFPS.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation','fps')); - elModelAnimationFrame.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation','frameIndex')); + elModelAnimationFrame.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation', 'frameIndex')); + elModelAnimationFirstFrame.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation', 'firstFrame')); + elModelAnimationLastFrame.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation', 'lastFrame')); + elModelAnimationLoop.addEventListener('change', createEmitGroupCheckedPropertyUpdateFunction('animation', 'loop')); + elModelAnimationHold.addEventListener('change', createEmitGroupCheckedPropertyUpdateFunction('animation', 'hold')); + elModelAnimationStartAutomatically.addEventListener('change', createEmitGroupCheckedPropertyUpdateFunction('animation', 'startAutomatically')); + elModelTextures.addEventListener('change', createEmitTextPropertyUpdateFunction('textures')); elTextText.addEventListener('change', createEmitTextPropertyUpdateFunction('text')); @@ -1278,11 +1294,35 @@
-
Animation Settings
+
Animation First Frame
- +
+
+
Animation Last Frame
+
+ +
+
+
+ Animation Loop + + + +
+
+ Animation Hold + + + +
+
+ Animation Start Automatically + + + +
Textures
From 2720e6ddf4b0bec61ef44ca0410aaaaf3ce4e5c7 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Sat, 3 Oct 2015 08:00:33 -0700 Subject: [PATCH 16/30] debug running property --- .../entities/src/AnimationPropertyGroup.cpp | 39 +++++++++++++++++++ .../entities/src/AnimationPropertyGroup.h | 6 ++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index 7108f3a4cd..29b134235a 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -92,6 +92,13 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationIsPlaying, bool, setRunning, getRunning); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFrameIndex, float, setFrameIndex, getFrameIndex); } + + if (_animationLoop) { + qDebug() << "copyFromScriptValue() running:" << _animationLoop->getRunning(); + } else { + qDebug() << "copyFromScriptValue() running:" << getRunning(); + } + } void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { @@ -203,6 +210,13 @@ bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); } + if (_animationLoop) { + qDebug() << "appendToEditPacket() running:" << _animationLoop->getRunning(); + } else { + qDebug() << "appendToEditPacket() running:" << getRunning(); + } + + return true; } @@ -246,6 +260,12 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF processedBytes += bytesRead; + if (_animationLoop) { + qDebug() << "decodeFromEditPacket() running:" << _animationLoop->getRunning(); + } else { + qDebug() << "decodeFromEditPacket() running:" << getRunning(); + } + return true; } @@ -319,6 +339,12 @@ bool AnimationPropertyGroup::setProperties(const EntityItemProperties& propertie SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, setStartAutomatically); } + if (_animationLoop) { + qDebug() << "setProperties() running:" << _animationLoop->getRunning(); + } else { + qDebug() << "setProperties() running:" << getRunning(); + } + return somethingChanged; } @@ -368,6 +394,13 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); } + + if (_animationLoop) { + qDebug() << "appendSubclassData() running:" << _animationLoop->getRunning(); + } else { + qDebug() << "appendSubclassData() running:" << getRunning(); + } + } int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, @@ -400,5 +433,11 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); } + if (_animationLoop) { + qDebug() << "readEntitySubclassDataFromBuffer() running:" << _animationLoop->getRunning(); + } else { + qDebug() << "readEntitySubclassDataFromBuffer() running:" << getRunning(); + } + return bytesRead; } diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 5541e49840..5612c1a99e 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -16,14 +16,16 @@ // DONE - 3) make sure that setting properties and reading from stream actually set the animationLoop object properly // 4) test it! // DONE - a) toybox/windmill -// b) toybox "put me down" doll +// DONE - b) toybox "put me down" doll // c) asana bugs about animations +// d) spray paint can (particles) +// e) grenade // // DONE - 5) update all scripts // DONE - 6) remove all remnants of old member variables // DONE - 7) research and remove animation settings from Particle Effect // DONE - 8) make sure animations start properly when entering a domain... with previously running animations -// 9) test particles!!! +// 9) debug running property // #ifndef hifi_AnimationPropertyGroup_h From 8befade007bd18c47db4ee3487e6828fe6f0bd88 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Sun, 4 Oct 2015 15:08:35 +0200 Subject: [PATCH 17/30] expose position and orientation of HMD to Javascript. - HMD.orientation - HMD.position --- interface/src/scripting/HMDScriptingInterface.cpp | 14 ++++++++++++++ interface/src/scripting/HMDScriptingInterface.h | 8 ++++++++ 2 files changed, 22 insertions(+) diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index 68ac511eaf..4629ff5917 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -57,3 +57,17 @@ QScriptValue HMDScriptingInterface::getHUDLookAtPosition3D(QScriptContext* conte float HMDScriptingInterface::getIPD() const { return Application::getInstance()->getActiveDisplayPlugin()->getIPD(); } + +glm::vec3 HMDScriptingInterface::getPosition() const { + if (Application::getInstance()->getActiveDisplayPlugin()->isHmd()) { + return glm::vec3(Application::getInstance()->getActiveDisplayPlugin()->getHeadPose()[3]); + } + return glm::vec3(); +} + +glm::quat HMDScriptingInterface::getOrientation() const { + if (Application::getInstance()->getActiveDisplayPlugin()->isHmd()) { + return glm::quat_cast(Application::getInstance()->getActiveDisplayPlugin()->getHeadPose()); + } + return glm::quat(); +} diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index 82b444abaa..1ac524d7f1 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -20,6 +20,8 @@ class HMDScriptingInterface : public QObject { Q_OBJECT Q_PROPERTY(bool magnifier READ getMagnifier) Q_PROPERTY(bool active READ isHMDMode) + Q_PROPERTY(glm::vec3 position READ getPosition) + Q_PROPERTY(glm::quat orientation READ getOrientation) Q_PROPERTY(float ipd READ getIPD) public: static HMDScriptingInterface& getInstance(); @@ -36,6 +38,12 @@ private: bool isHMDMode() const { return Application::getInstance()->isHMDMode(); } float getIPD() const; + // Get the position of the HMD + glm::vec3 getPosition() const; + + // Get the orientation of the HMD + glm::quat getOrientation() const; + bool getHUDLookAtPosition3D(glm::vec3& result) const; }; From 6f86b0f5507a2dab8e43e07d620a767f5a5ff832 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sun, 4 Oct 2015 15:23:17 -0700 Subject: [PATCH 18/30] particle fixes --- examples/particles.js | 9 +++++---- libraries/entities/src/ParticleEffectEntityItem.cpp | 3 +-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/particles.js b/examples/particles.js index adfed2cf11..a46baf2dea 100644 --- a/examples/particles.js +++ b/examples/particles.js @@ -11,7 +11,7 @@ gravity: { x: 0, y: 0, z: 0 }, visible: true, locked: false, - lifetime: 6000 }); + lifetime: 6000}); var self = this; this.timer = Script.setInterval(function () { var colorProp = { color: { red: Math.random() * 255, @@ -36,7 +36,8 @@ isEmitting: true, position: spawnPoint, dimensions: {x: 2, y: 2, z: 2}, - emitSpeed: 5, + emitSpeed: 0.05, + maxParticles: 2, speedSpread: 2, polarFinish: 30 * DEG_TO_RAD, emitAcceleration: {x: 0, y: -9.8, z: 0}, @@ -52,8 +53,8 @@ this.timer = Script.setInterval(function () { // flip is playing state self.isPlaying = !self.isPlaying; - var animProp = { animationIsPlaying: self.isPlaying }; - Entities.editEntity(self.entity, animProp); + var emittingProp = { isEmitting: self.isPlaying }; + Entities.editEntity(self.entity, emittingProp); }, (1 / blinkRate) * 1000); } diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 421565fc84..ace0edb0e1 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -403,8 +403,7 @@ void ParticleEffectEntityItem::appendSubclassData(OctreePacketData* packetData, bool ParticleEffectEntityItem::isEmittingParticles() const { // keep emitting if there are particles still alive. - //return (getAnimationIsPlaying() || getLivingParticleCount() > 0) && getAnimationFPS() != 0.0f; - return (getLivingParticleCount() > 0); + return (getIsEmitting() || getLivingParticleCount() > 0); } bool ParticleEffectEntityItem::needsToCallUpdate() const { From 8c8e83dc8e0617d590552174ff3a12e544ae2fa9 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Mon, 5 Oct 2015 14:17:12 -0700 Subject: [PATCH 19/30] more debugging on animation.running --- examples/html/entityProperties.html | 12 ++++++- .../entities/src/AnimationPropertyGroup.cpp | 33 ++++++++++++------- .../entities/src/EntityItemProperties.cpp | 1 - libraries/entities/src/EntityTree.cpp | 2 ++ libraries/entities/src/ModelEntityItem.cpp | 7 ++++ 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index 5743d65ed0..9ea1933dfb 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -10,6 +10,15 @@ var DEGREES_TO_RADIANS = PI / 180.0; var RADIANS_TO_DEGREES = 180.0 / PI; + debugPrint = function(message) { + EventBridge.emitWebEvent( + JSON.stringify({ + type:"print", + message: message + }) + ); + }; + function enableChildren(el, selector) { els = el.querySelectorAll(selector); for (var i = 0; i < els.length; i++) { @@ -37,10 +46,11 @@ }; } function createEmitGroupCheckedPropertyUpdateFunction(group, propertyName) { - return function() { + return function () { var properties = {}; properties[group] = {}; properties[group][propertyName] = this.checked; + //debugPrint(" about to emitWebEvent() properties:" + JSON.stringify(properties)); EventBridge.emitWebEvent( JSON.stringify({ type: "update", diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index 29b134235a..5e981cf14a 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -93,11 +93,14 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFrameIndex, float, setFrameIndex, getFrameIndex); } + /* if (_animationLoop) { qDebug() << "copyFromScriptValue() running:" << _animationLoop->getRunning(); } else { qDebug() << "copyFromScriptValue() running:" << getRunning(); } + */ + } @@ -193,7 +196,7 @@ bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, if (_animationLoop) { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, _animationLoop->getFPS()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getFrameIndex()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, _animationLoop->getRunning()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, _animationLoop->getLoop()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, _animationLoop->getFirstFrame()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, _animationLoop->getLastFrame()); @@ -202,7 +205,7 @@ bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, } else { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getRunning()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getRunning()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LAST_FRAME, getLastFrame()); @@ -210,13 +213,6 @@ bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); } - if (_animationLoop) { - qDebug() << "appendToEditPacket() running:" << _animationLoop->getRunning(); - } else { - qDebug() << "appendToEditPacket() running:" << getRunning(); - } - - return true; } @@ -260,11 +256,18 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF processedBytes += bytesRead; - if (_animationLoop) { - qDebug() << "decodeFromEditPacket() running:" << _animationLoop->getRunning(); + /* + if (propertyFlags.getHasProperty(PROP_ANIMATION_PLAYING)) { + qDebug() << "AnimationPropertyGroup::decodeFromEditPacket() DID contain PROP_ANIMATION_PLAYING -----------"; + if (_animationLoop) { + qDebug() << " decodeFromEditPacket() _animationLoop->getRunning:" << _animationLoop->getRunning(); + } else { + qDebug() << " decodeFromEditPacket() getRunning:" << getRunning(); + } } else { - qDebug() << "decodeFromEditPacket() running:" << getRunning(); + qDebug() << "AnimationPropertyGroup::decodeFromEditPacket() packet did not contain PROP_ANIMATION_PLAYING"; } + */ return true; } @@ -339,11 +342,13 @@ bool AnimationPropertyGroup::setProperties(const EntityItemProperties& propertie SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, setStartAutomatically); } + /* if (_animationLoop) { qDebug() << "setProperties() running:" << _animationLoop->getRunning(); } else { qDebug() << "setProperties() running:" << getRunning(); } + */ return somethingChanged; } @@ -395,11 +400,13 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); } + /* if (_animationLoop) { qDebug() << "appendSubclassData() running:" << _animationLoop->getRunning(); } else { qDebug() << "appendSubclassData() running:" << getRunning(); } + */ } @@ -433,11 +440,13 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); } + /* if (_animationLoop) { qDebug() << "readEntitySubclassDataFromBuffer() running:" << _animationLoop->getRunning(); } else { qDebug() << "readEntitySubclassDataFromBuffer() running:" << getRunning(); } + */ return bytesRead; } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index cdd6c5b2ca..387032f58c 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1150,7 +1150,6 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem // If any part of the model items didn't fit, then the element is considered partial if (appendState != OctreeElement::COMPLETED) { - // TODO: handle mechanism for handling partial fitting data! // add this item into our list for the next appendElementData() pass //modelTreeElementExtraEncodeData->includedItems.insert(getEntityItemID(), propertiesDidntFit); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index c4c02d364f..44183d76de 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -583,6 +583,8 @@ int EntityTree::processEditPacketData(NLPacket& packet, const unsigned char* edi case PacketType::EntityAdd: case PacketType::EntityEdit: { + qCDebug(entities) << "EntityTree::processEditPacketData()... EntityAdd/EntityEdit"; + quint64 startDecode = 0, endDecode = 0; quint64 startLookup = 0, endLookup = 0; quint64 startUpdate = 0, endUpdate = 0; diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index e140e88d55..964bc8f46b 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -77,6 +77,8 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { setLastEdited(properties._lastEdited); } + //qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() << " running:" << getAnimationIsPlaying(); + return somethingChanged; } @@ -121,6 +123,8 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); + //qDebug() << "ModelEntityItem::readEntitySubclassDataFromBuffer() id:" << getEntityItemID() << " running:" << getAnimationIsPlaying(); + return bytesRead; } @@ -156,6 +160,9 @@ void ModelEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit propertyFlags, propertiesDidntFit, propertyCount, appendState); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); + + //qDebug() << "ModelEntityItem::appendSubclassData() id:" << getEntityItemID() << " running:" << getAnimationIsPlaying(); + } From f30a94064f01bd3dc6bd2b7c4a3e10a263954e18 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Mon, 5 Oct 2015 15:50:55 -0700 Subject: [PATCH 20/30] make animation start/stop work --- .../src/RenderableModelEntityItem.cpp | 2 + .../entities/src/AnimationPropertyGroup.cpp | 37 ++++++++++++++++--- libraries/entities/src/ModelEntityItem.cpp | 24 +++++++++++- libraries/entities/src/PropertyGroup.h | 6 +++ 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index ed088bc9b5..54f5c384e0 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -269,6 +269,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { if (_model) { // handle animations.. if (hasAnimation()) { + //qDebug() << "RenderableModelEntityItem::render() -- hasAnimation()"; if (!jointsMapped()) { QStringList modelJointNames = _model->getJointNames(); mapJoints(modelJointNames); @@ -279,6 +280,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { QVector frameDataRotations; QVector frameDataTranslations; getAnimationFrame(newFrame, frameDataRotations, frameDataTranslations); + qDebug() << "RenderableModelEntityItem::render() -- getAnimationFrame() newFrame:" << newFrame; assert(frameDataRotations.size() == frameDataTranslations.size()); if (newFrame) { for (int i = 0; i < frameDataRotations.size(); i++) { diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index 5e981cf14a..a7e77a75e0 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -342,13 +342,13 @@ bool AnimationPropertyGroup::setProperties(const EntityItemProperties& propertie SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, setStartAutomatically); } - /* if (_animationLoop) { - qDebug() << "setProperties() running:" << _animationLoop->getRunning(); + qDebug() << "setProperties() _animationLoop->running:" << _animationLoop->getRunning(); } else { qDebug() << "setProperties() running:" << getRunning(); } - */ + + _somethingChanged = somethingChanged; return somethingChanged; } @@ -414,6 +414,14 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + float fps = _animationLoop ? _animationLoop->getFPS() : getFPS(); + bool running = _animationLoop ? _animationLoop->getRunning() : getRunning(); + float firstFrame = _animationLoop ? _animationLoop->getFirstFrame() : getFirstFrame(); + float lastFrame = _animationLoop ? _animationLoop->getLastFrame() : getLastFrame(); + bool loop = _animationLoop ? _animationLoop->getLoop() : getLoop(); + bool hold = _animationLoop ? _animationLoop->getHold() : getHold(); + bool startAutomatically = _animationLoop ? _animationLoop->getStartAutomatically() : getStartAutomatically(); + int bytesRead = 0; const unsigned char* dataAt = data; @@ -440,13 +448,30 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); } - /* + float newFPS = _animationLoop ? _animationLoop->getFPS() : getFPS(); + bool newRunning = _animationLoop ? _animationLoop->getRunning() : getRunning(); + float newFirstFrame = _animationLoop ? _animationLoop->getFirstFrame() : getFirstFrame(); + float newLastFrame = _animationLoop ? _animationLoop->getLastFrame() : getLastFrame(); + bool newLoop = _animationLoop ? _animationLoop->getLoop() : getLoop(); + bool newHold = _animationLoop ? _animationLoop->getHold() : getHold(); + bool newStartAutomatically = _animationLoop ? _animationLoop->getStartAutomatically() : getStartAutomatically(); + + // NOTE: we don't check frameIndex because that is assumed to always be changing. + _somethingChanged = newFPS != fps || + newRunning != running || + newFirstFrame != firstFrame || + newLastFrame != lastFrame || + newLoop != loop || + newHold != hold || + newStartAutomatically != startAutomatically; + + + if (_animationLoop) { - qDebug() << "readEntitySubclassDataFromBuffer() running:" << _animationLoop->getRunning(); + qDebug() << "readEntitySubclassDataFromBuffer() _animationLoop->running:" << _animationLoop->getRunning(); } else { qDebug() << "readEntitySubclassDataFromBuffer() running:" << getRunning(); } - */ return bytesRead; } diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 964bc8f46b..b1f306b758 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -64,6 +64,10 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); bool somethingChangedInAnimations = _animationProperties.setProperties(properties); + + if (somethingChangedInAnimations) { + _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; + } somethingChanged = somethingChanged || somethingChangedInAnimations; if (somethingChanged) { @@ -77,7 +81,9 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { setLastEdited(properties._lastEdited); } - //qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() << " running:" << getAnimationIsPlaying(); + qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() + << " properties.animation.running:" << properties.getAnimation().getRunning() + << " running:" << getAnimationIsPlaying(); return somethingChanged; } @@ -109,11 +115,16 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); + qDebug() << "ModelEntityItem::readEntitySubclassDataFromBuffer() id:" << getEntityItemID() << " args.bitstreamVersion:" << args.bitstreamVersion << " VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP:" << VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP; + if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); } else { // Note: since we've associated our _animationProperties with our _animationLoop, the readEntitySubclassDataFromBuffer() // will automatically read into the animation loop + + qDebug() << "ModelEntityItem::readEntitySubclassDataFromBuffer() id:" << getEntityItemID() << " calling _animationProperties.readEntitySubclassDataFromBuffer()"; + int bytesFromAnimation = _animationProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, propertyFlags, overwriteLocalData); @@ -123,7 +134,11 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); - //qDebug() << "ModelEntityItem::readEntitySubclassDataFromBuffer() id:" << getEntityItemID() << " running:" << getAnimationIsPlaying(); + qDebug() << "ModelEntityItem::readEntitySubclassDataFromBuffer() id:" << getEntityItemID() << " running:" << getAnimationIsPlaying(); + + if (_animationProperties.somethingChanged()) { + _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; + } return bytesRead; } @@ -223,6 +238,7 @@ void ModelEntityItem::getAnimationFrame(bool& newFrame, int frameCount = frames.size(); if (frameCount > 0) { + qDebug() << "getAnimationFrameIndex:" << getAnimationFrameIndex(); int animationFrameIndex = (int)(glm::floor(getAnimationFrameIndex())) % frameCount; if (animationFrameIndex < 0 || animationFrameIndex > frameCount) { animationFrameIndex = 0; @@ -265,6 +281,10 @@ bool ModelEntityItem::needsToCallUpdate() const { } void ModelEntityItem::update(const quint64& now) { + if (hasAnimation()) { + qDebug() << "ModelEntityItem::update() getAnimationIsPlaying():" << getAnimationIsPlaying(); + } + // only advance the frame index if we're playing if (getAnimationIsPlaying()) { float deltaTime = (float)(now - _lastAnimated) / (float)USECS_PER_SECOND; diff --git a/libraries/entities/src/PropertyGroup.h b/libraries/entities/src/PropertyGroup.h index 4069e7be02..d030400993 100644 --- a/libraries/entities/src/PropertyGroup.h +++ b/libraries/entities/src/PropertyGroup.h @@ -81,6 +81,9 @@ public: /// has changed. This will be called with properties change or when new data is loaded from a stream virtual void somethingChangedNotification() { } + /// set to true or false after setProperties() and readEntitySubclassDataFromBuffer() if something in the state has changed. + bool somethingChanged() const { return _somethingChanged; } + virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const = 0; @@ -95,6 +98,9 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData) = 0; + +protected: + bool _somethingChanged = false; }; #endif // hifi_PropertyGroup_h From 3c6e9378c39ab0dc5cefa3528c96eef9eaac169a Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 6 Oct 2015 20:20:37 +0200 Subject: [PATCH 21/30] fixes merge issues --- interface/src/Application.cpp | 4 ++-- libraries/octree/src/OctreeHeadlessViewer.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 565debfbaf..b25f3aa6a5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4981,7 +4981,7 @@ mat4 Application::getEyeProjection(int eye) const { mat4 Application::getEyePose(int eye) const { if (isHMDMode()) { return getActiveDisplayPlugin()->getEyePose((Eye)eye); - } + } return mat4(); } @@ -4990,7 +4990,7 @@ mat4 Application::getEyeOffset(int eye) const { if (isHMDMode()) { mat4 identity; return getActiveDisplayPlugin()->getView((Eye)eye, identity); -} + } return mat4(); } diff --git a/libraries/octree/src/OctreeHeadlessViewer.h b/libraries/octree/src/OctreeHeadlessViewer.h index 009fcb5cb2..605db15cd2 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.h +++ b/libraries/octree/src/OctreeHeadlessViewer.h @@ -53,8 +53,8 @@ public slots: void setMaxPacketsPerSecond(int maxPacketsPerSecond) { _maxPacketsPerSecond = maxPacketsPerSecond; } // getters for camera attributes - const glm::vec3 getPosition() const { return _viewFrustum.getPosition(); } - const glm::quat getOrientation() const { return _viewFrustum.getOrientation(); } + const glm::vec3& getPosition() const { return _viewFrustum.getPosition(); } + const glm::quat& getOrientation() const { return _viewFrustum.getOrientation(); } // getters for LOD and PPS float getVoxelSizeScale() const { return _voxelSizeScale; } From 4e8fc08458b32c396a2eb49b4ca8f6124f5a1025 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 6 Oct 2015 20:48:51 +0200 Subject: [PATCH 22/30] made the changes as suggested by @hyperlogic --- interface/src/scripting/HMDScriptingInterface.cpp | 9 +++++++-- interface/src/scripting/HMDScriptingInterface.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index 4629ff5917..ca25f5f72a 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -58,16 +58,21 @@ float HMDScriptingInterface::getIPD() const { return Application::getInstance()->getActiveDisplayPlugin()->getIPD(); } +glm::mat4 HMDScriptingInterface::getWorldHMDMatrix() const { + MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); + return myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix(); +} + glm::vec3 HMDScriptingInterface::getPosition() const { if (Application::getInstance()->getActiveDisplayPlugin()->isHmd()) { - return glm::vec3(Application::getInstance()->getActiveDisplayPlugin()->getHeadPose()[3]); + return extractTranslation(getWorldHMDMatrix()); } return glm::vec3(); } glm::quat HMDScriptingInterface::getOrientation() const { if (Application::getInstance()->getActiveDisplayPlugin()->isHmd()) { - return glm::quat_cast(Application::getInstance()->getActiveDisplayPlugin()->getHeadPose()); + return glm::normalize(glm::quat_cast(getWorldHMDMatrix())); } return glm::quat(); } diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index 50944ab695..ac2ab0149e 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -46,6 +46,7 @@ private: bool getHUDLookAtPosition3D(glm::vec3& result) const; + glm::mat4 getWorldHMDMatrix() const; }; #endif // hifi_HMDScriptingInterface_h From 1319642a597e73838dd1b413f8d0a43e863cb6b1 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Tue, 6 Oct 2015 15:59:35 -0700 Subject: [PATCH 23/30] fix frame jumping behavior on restart --- libraries/animation/src/AnimationLoop.cpp | 22 +++++++++++++++++++--- libraries/animation/src/AnimationLoop.h | 7 +++++-- libraries/entities/src/ModelEntityItem.cpp | 17 +++++++---------- libraries/entities/src/ModelEntityItem.h | 1 - 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/libraries/animation/src/AnimationLoop.cpp b/libraries/animation/src/AnimationLoop.cpp index cd360a79a7..ee07558c4a 100644 --- a/libraries/animation/src/AnimationLoop.cpp +++ b/libraries/animation/src/AnimationLoop.cpp @@ -9,6 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include + #include "AnimationCache.h" #include "AnimationLoop.h" @@ -24,7 +26,8 @@ AnimationLoop::AnimationLoop() : _running(false), _frameIndex(0.0f), _maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME), - _resetOnRunning(false) + _resetOnRunning(false), + _lastSimulated(usecTimestampNow()) { } @@ -37,7 +40,8 @@ AnimationLoop::AnimationLoop(const AnimationDetails& animationDetails) : _lastFrame(animationDetails.lastFrame), _running(animationDetails.running), _frameIndex(animationDetails.frameIndex), - _resetOnRunning(false) + _resetOnRunning(false), + _lastSimulated(usecTimestampNow()) { } @@ -51,10 +55,17 @@ AnimationLoop::AnimationLoop(float fps, bool loop, bool hold, bool startAutomati _lastFrame(lastFrame), _running(running), _frameIndex(frameIndex), - _resetOnRunning(false) + _resetOnRunning(false), + _lastSimulated(usecTimestampNow()) { } +void AnimationLoop::simulateAtTime(quint64 now) { + float deltaTime = (float)(now - _lastSimulated) / (float)USECS_PER_SECOND; + _lastSimulated = now; + simulate(deltaTime); +} + void AnimationLoop::simulate(float deltaTime) { _frameIndex += deltaTime * _fps; @@ -96,5 +107,10 @@ void AnimationLoop::setRunning(bool running) { qDebug() << "resetting _frameIndex:" << _frameIndex << "to _firstFrame:" << _firstFrame; _frameIndex = _firstFrame; } + + // If we just started running, set our + if (_running) { + _lastSimulated = usecTimestampNow(); + } } } diff --git a/libraries/animation/src/AnimationLoop.h b/libraries/animation/src/AnimationLoop.h index 6c3df659dc..4fa827768e 100644 --- a/libraries/animation/src/AnimationLoop.h +++ b/libraries/animation/src/AnimationLoop.h @@ -57,8 +57,10 @@ public: void start() { setRunning(true); } void stop() { setRunning(false); } - void simulate(float deltaTime); - + void simulate(float deltaTime); /// call this with deltaTime if you as the caller are managing the delta time between calls + + void simulateAtTime(quint64 now); /// call this with "now" if you want the animationLoop to handle delta times + private: float _fps; bool _loop; @@ -70,6 +72,7 @@ private: float _frameIndex; float _maxFrameIndexHint; bool _resetOnRunning; + quint64 _lastSimulated; }; #endif // hifi_AnimationLoop_h diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index b1f306b758..73119f4211 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -35,7 +35,6 @@ ModelEntityItem::ModelEntityItem(const EntityItemID& entityItemID, const EntityI _type = EntityTypes::Model; setProperties(properties); - _lastAnimated = usecTimestampNow(); _jointMappingCompleted = false; _lastKnownFrameIndex = -1; _color[0] = _color[1] = _color[2] = 0; @@ -281,18 +280,16 @@ bool ModelEntityItem::needsToCallUpdate() const { } void ModelEntityItem::update(const quint64& now) { + + // only worry about this if we have an animation if (hasAnimation()) { - qDebug() << "ModelEntityItem::update() getAnimationIsPlaying():" << getAnimationIsPlaying(); + // only advance the frame index if we're playing + if (getAnimationIsPlaying()) { + _animationLoop.simulateAtTime(now); + qDebug() << "ModelEntityItem::update() getAnimationIsPlaying():" << getAnimationIsPlaying() << "frame:" << getAnimationFrameIndex(); + } } - // only advance the frame index if we're playing - if (getAnimationIsPlaying()) { - float deltaTime = (float)(now - _lastAnimated) / (float)USECS_PER_SECOND; - _lastAnimated = now; - _animationLoop.simulate(deltaTime); - } else { - _lastAnimated = now; - } EntityItem::update(now); // let our base class handle it's updates... } diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 66f102fe7a..eece037f2d 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -134,7 +134,6 @@ protected: QString _modelURL; QString _compoundShapeURL; - quint64 _lastAnimated; AnimationPropertyGroup _animationProperties; AnimationLoop _animationLoop; From 016bf4011d4a7e6d1600c7ffa72a973f8afc0ed0 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Tue, 6 Oct 2015 16:07:36 -0700 Subject: [PATCH 24/30] cleanup --- .../example/entities/animatedModelExample.js | 20 +-------- libraries/animation/src/AnimationLoop.cpp | 1 - .../src/RenderableModelEntityItem.cpp | 2 - .../entities/src/AnimationPropertyGroup.cpp | 43 ------------------- libraries/entities/src/ModelEntityItem.cpp | 25 ++--------- 5 files changed, 4 insertions(+), 87 deletions(-) diff --git a/examples/example/entities/animatedModelExample.js b/examples/example/entities/animatedModelExample.js index 6c97671463..1e7869559e 100644 --- a/examples/example/entities/animatedModelExample.js +++ b/examples/example/entities/animatedModelExample.js @@ -20,14 +20,6 @@ var yaw = 0.0; var roll = 0.0; var rotation = Quat.fromPitchYawRollDegrees(pitch, yaw, roll); -var animationSettings = JSON.stringify({ - loop: true, - running: true, - fps: 30, - firstFrame: 10, - lastFrame: 20, -}); - var originalProperties = { type: "Model", position: { x: MyAvatar.position.x, @@ -45,12 +37,6 @@ var originalProperties = { modelURL: "http://public.highfidelity.io/cozza13/club/dragon/dragon.fbx", rotation: rotation, - - - animationURL: "http://public.highfidelity.io/cozza13/club/dragon/flying.fbx", - animationSettings: animationSettings, - //animationIsPlaying: true, - /* animation: { url: "http://public.highfidelity.io/cozza13/club/dragon/flying.fbx", running: true, @@ -59,7 +45,6 @@ var originalProperties = { lastFrame: 20, loop: true } - */ }; var modelID = Entities.addEntity(originalProperties); @@ -120,8 +105,6 @@ function moveModel(deltaTime) { if (somethingChanged) { var newProperties = { - //animationIsPlaying: isPlaying, - //animationFPS: animationFPS, animation: { running: isPlaying, fps: animationFPS @@ -130,7 +113,6 @@ function moveModel(deltaTime) { if (resetFrame) { print("resetting the frame!"); - //newProperties.animationFrameIndex = 0; newProperties.animation.frameIndex = 0; resetFrame = false; } @@ -141,7 +123,7 @@ function moveModel(deltaTime) { // register the call back so it fires before each data send -//Script.update.connect(moveModel); +Script.update.connect(moveModel); Script.scriptEnding.connect(function () { diff --git a/libraries/animation/src/AnimationLoop.cpp b/libraries/animation/src/AnimationLoop.cpp index ee07558c4a..59b8e7d209 100644 --- a/libraries/animation/src/AnimationLoop.cpp +++ b/libraries/animation/src/AnimationLoop.cpp @@ -104,7 +104,6 @@ void AnimationLoop::setRunning(bool running) { // If we just set running to true, then also reset the frame to the first frame if (running && (_resetOnRunning)) { // move back to the beginning - qDebug() << "resetting _frameIndex:" << _frameIndex << "to _firstFrame:" << _firstFrame; _frameIndex = _firstFrame; } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 54f5c384e0..ed088bc9b5 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -269,7 +269,6 @@ void RenderableModelEntityItem::render(RenderArgs* args) { if (_model) { // handle animations.. if (hasAnimation()) { - //qDebug() << "RenderableModelEntityItem::render() -- hasAnimation()"; if (!jointsMapped()) { QStringList modelJointNames = _model->getJointNames(); mapJoints(modelJointNames); @@ -280,7 +279,6 @@ void RenderableModelEntityItem::render(RenderArgs* args) { QVector frameDataRotations; QVector frameDataTranslations; getAnimationFrame(newFrame, frameDataRotations, frameDataTranslations); - qDebug() << "RenderableModelEntityItem::render() -- getAnimationFrame() newFrame:" << newFrame; assert(frameDataRotations.size() == frameDataTranslations.size()); if (newFrame) { for (int i = 0; i < frameDataRotations.size(); i++) { diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index a7e77a75e0..f648c4c06e 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -93,15 +93,6 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFrameIndex, float, setFrameIndex, getFrameIndex); } - /* - if (_animationLoop) { - qDebug() << "copyFromScriptValue() running:" << _animationLoop->getRunning(); - } else { - qDebug() << "copyFromScriptValue() running:" << getRunning(); - } - */ - - } void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { @@ -256,19 +247,6 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF processedBytes += bytesRead; - /* - if (propertyFlags.getHasProperty(PROP_ANIMATION_PLAYING)) { - qDebug() << "AnimationPropertyGroup::decodeFromEditPacket() DID contain PROP_ANIMATION_PLAYING -----------"; - if (_animationLoop) { - qDebug() << " decodeFromEditPacket() _animationLoop->getRunning:" << _animationLoop->getRunning(); - } else { - qDebug() << " decodeFromEditPacket() getRunning:" << getRunning(); - } - } else { - qDebug() << "AnimationPropertyGroup::decodeFromEditPacket() packet did not contain PROP_ANIMATION_PLAYING"; - } - */ - return true; } @@ -342,12 +320,6 @@ bool AnimationPropertyGroup::setProperties(const EntityItemProperties& propertie SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, setStartAutomatically); } - if (_animationLoop) { - qDebug() << "setProperties() _animationLoop->running:" << _animationLoop->getRunning(); - } else { - qDebug() << "setProperties() running:" << getRunning(); - } - _somethingChanged = somethingChanged; return somethingChanged; @@ -399,15 +371,6 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En APPEND_ENTITY_PROPERTY(PROP_ANIMATION_HOLD, getHold()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, getStartAutomatically()); } - - /* - if (_animationLoop) { - qDebug() << "appendSubclassData() running:" << _animationLoop->getRunning(); - } else { - qDebug() << "appendSubclassData() running:" << getRunning(); - } - */ - } int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, @@ -467,11 +430,5 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char - if (_animationLoop) { - qDebug() << "readEntitySubclassDataFromBuffer() _animationLoop->running:" << _animationLoop->getRunning(); - } else { - qDebug() << "readEntitySubclassDataFromBuffer() running:" << getRunning(); - } - return bytesRead; } diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 73119f4211..1eafc50141 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -80,10 +80,6 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { setLastEdited(properties._lastEdited); } - qDebug() << "ModelEntityItem::setProperties() id:" << getEntityItemID() - << " properties.animation.running:" << properties.getAnimation().getRunning() - << " running:" << getAnimationIsPlaying(); - return somethingChanged; } @@ -114,16 +110,11 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures); - qDebug() << "ModelEntityItem::readEntitySubclassDataFromBuffer() id:" << getEntityItemID() << " args.bitstreamVersion:" << args.bitstreamVersion << " VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP:" << VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP; - if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { READ_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); } else { // Note: since we've associated our _animationProperties with our _animationLoop, the readEntitySubclassDataFromBuffer() // will automatically read into the animation loop - - qDebug() << "ModelEntityItem::readEntitySubclassDataFromBuffer() id:" << getEntityItemID() << " calling _animationProperties.readEntitySubclassDataFromBuffer()"; - int bytesFromAnimation = _animationProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, propertyFlags, overwriteLocalData); @@ -133,8 +124,6 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); - qDebug() << "ModelEntityItem::readEntitySubclassDataFromBuffer() id:" << getEntityItemID() << " running:" << getAnimationIsPlaying(); - if (_animationProperties.somethingChanged()) { _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; } @@ -174,9 +163,6 @@ void ModelEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit propertyFlags, propertiesDidntFit, propertyCount, appendState); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); - - //qDebug() << "ModelEntityItem::appendSubclassData() id:" << getEntityItemID() << " running:" << getAnimationIsPlaying(); - } @@ -237,7 +223,6 @@ void ModelEntityItem::getAnimationFrame(bool& newFrame, int frameCount = frames.size(); if (frameCount > 0) { - qDebug() << "getAnimationFrameIndex:" << getAnimationFrameIndex(); int animationFrameIndex = (int)(glm::floor(getAnimationFrameIndex())) % frameCount; if (animationFrameIndex < 0 || animationFrameIndex > frameCount) { animationFrameIndex = 0; @@ -281,13 +266,9 @@ bool ModelEntityItem::needsToCallUpdate() const { void ModelEntityItem::update(const quint64& now) { - // only worry about this if we have an animation - if (hasAnimation()) { - // only advance the frame index if we're playing - if (getAnimationIsPlaying()) { - _animationLoop.simulateAtTime(now); - qDebug() << "ModelEntityItem::update() getAnimationIsPlaying():" << getAnimationIsPlaying() << "frame:" << getAnimationFrameIndex(); - } + // only advance the frame index if we're playing + if (getAnimationIsPlaying()) { + _animationLoop.simulateAtTime(now); } EntityItem::update(now); // let our base class handle it's updates... From 6e5847bb1c773c7f790a90b3bd65b9b6cbab04e5 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Tue, 6 Oct 2015 19:58:25 -0700 Subject: [PATCH 25/30] make Hand Input Mouse off by default --- interface/src/Application.cpp | 2 +- interface/src/Menu.cpp | 2 +- interface/src/Menu.h | 2 +- interface/src/ui/ApplicationCompositor.cpp | 7 ++++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b44ac6804d..3ac667f7b4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2745,7 +2745,7 @@ void Application::update(float deltaTime) { Hand* hand = DependencyManager::get()->getMyAvatar()->getHand(); setPalmData(hand, leftHand, deltaTime, LEFT_HAND_INDEX, userInputMapper->getActionState(UserInputMapper::LEFT_HAND_CLICK)); setPalmData(hand, rightHand, deltaTime, RIGHT_HAND_INDEX, userInputMapper->getActionState(UserInputMapper::RIGHT_HAND_CLICK)); - if (Menu::getInstance()->isOptionChecked(MenuOption::HandMouseInput)) { + if (Menu::getInstance()->isOptionChecked(MenuOption::EnableHandMouseInput)) { emulateMouse(hand, userInputMapper->getActionState(UserInputMapper::LEFT_HAND_CLICK), userInputMapper->getActionState(UserInputMapper::SHIFT), LEFT_HAND_INDEX); emulateMouse(hand, userInputMapper->getActionState(UserInputMapper::RIGHT_HAND_CLICK), diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 9abfd1e34c..ae41ca2493 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -464,7 +464,7 @@ Menu::Menu() { MenuWrapper* handOptionsMenu = developerMenu->addMenu("Hands"); addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayHandTargets, 0, false); - addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::HandMouseInput, 0, true); + addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::EnableHandMouseInput, 0, false); addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::LowVelocityFilter, 0, true, qApp, SLOT(setLowVelocityFilter(bool))); addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::ShowIKConstraints, 0, false); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 33ce659a51..4c9c3ef7b5 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -204,7 +204,7 @@ namespace MenuOption { const QString FrameTimer = "Show Timer"; const QString FullscreenMirror = "Fullscreen Mirror"; const QString GlowWhenSpeaking = "Glow When Speaking"; - const QString HandMouseInput = "Enable Hand Mouse Input"; + const QString EnableHandMouseInput = "Enable Hand Controller Mouse Input"; const QString IncreaseAvatarSize = "Increase Avatar Size"; const QString IndependentMode = "Independent Mode"; const QString InputMenu = "Avatar>Input Devices"; diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index cb4ae9990c..7a90e30e53 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -313,8 +313,8 @@ void ApplicationCompositor::displayOverlayTextureHmd(RenderArgs* renderArgs, int glm::mat4 overlayXfm; _modelTransform.getMatrix(overlayXfm); - // Only render the hand pointers if the HandMouseInput is enabled - if (Menu::getInstance()->isOptionChecked(MenuOption::HandMouseInput)) { + // Only render the hand pointers if the EnableHandMouseInput is enabled + if (Menu::getInstance()->isOptionChecked(MenuOption::EnableHandMouseInput)) { MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); for (int i = 0; i < (int)myAvatar->getHand()->getNumPalms(); i++) { PalmData& palm = myAvatar->getHand()->getPalms()[i]; @@ -435,7 +435,8 @@ void ApplicationCompositor::renderPointers(gpu::Batch& batch) { _magActive[MOUSE] = _magnifier; _reticleActive[LEFT_CONTROLLER] = false; _reticleActive[RIGHT_CONTROLLER] = false; - } else if (qApp->getLastMouseMoveWasSimulated() && Menu::getInstance()->isOptionChecked(MenuOption::HandMouseInput)) { + } else if (qApp->getLastMouseMoveWasSimulated() + && Menu::getInstance()->isOptionChecked(MenuOption::EnableHandMouseInput)) { //only render controller pointer if we aren't already rendering a mouse pointer _reticleActive[MOUSE] = false; _magActive[MOUSE] = false; From ad5a6fac626b1c6d5a119842c7c8c622687ce340 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 7 Oct 2015 15:10:40 +0200 Subject: [PATCH 26/30] - applying of new qApp accessing method. - Some magic constant replacements with Helper "glm::vec3(matrix[3])" -> "extractTranslation(matrix)" --- interface/src/avatar/MyAvatar.cpp | 6 +++--- interface/src/scripting/HMDScriptingInterface.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 7592aad061..7baa6cf66f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1345,11 +1345,11 @@ void MyAvatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, fl glm::mat4 headPose = qApp->getActiveDisplayPlugin()->getHeadPose(); glm::mat4 leftEyePose = qApp->getActiveDisplayPlugin()->getEyeToHeadTransform(Eye::Left); leftEyePose = leftEyePose * headPose; - glm::vec3 leftEyePosition = glm::vec3(leftEyePose[3]); + glm::vec3 leftEyePosition = extractTranslation(leftEyePose); glm::mat4 rightEyePose = qApp->getActiveDisplayPlugin()->getEyeToHeadTransform(Eye::Right); rightEyePose = rightEyePose * headPose; - glm::vec3 rightEyePosition = glm::vec3(rightEyePose[3]); - glm::vec3 headPosition = glm::vec3(headPose[3]); + glm::vec3 rightEyePosition = extractTranslation(rightEyePose); + glm::vec3 headPosition = extractTranslation(headPose); getHead()->renderLookAts(renderArgs, cameraPosition + getOrientation() * (leftEyePosition - headPosition), diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index f8a0ba7ed6..28d358fa39 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -70,14 +70,14 @@ glm::mat4 HMDScriptingInterface::getWorldHMDMatrix() const { } glm::vec3 HMDScriptingInterface::getPosition() const { - if (Application::getInstance()->getActiveDisplayPlugin()->isHmd()) { + if (qApp->getActiveDisplayPlugin()->isHmd()) { return extractTranslation(getWorldHMDMatrix()); } return glm::vec3(); } glm::quat HMDScriptingInterface::getOrientation() const { - if (Application::getInstance()->getActiveDisplayPlugin()->isHmd()) { + if (qApp->getActiveDisplayPlugin()->isHmd()) { return glm::normalize(glm::quat_cast(getWorldHMDMatrix())); } return glm::quat(); From 6eeb64b03234569b67be21a55c4fa917bb952dfe Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Wed, 7 Oct 2015 11:23:24 -0700 Subject: [PATCH 27/30] CR feedback --- examples/html/entityProperties.html | 1 - libraries/animation/src/AnimationHandle.h | 2 +- libraries/animation/src/AnimationLoop.cpp | 8 ++++---- libraries/animation/src/AnimationLoop.h | 1 - libraries/entities/src/ModelEntityItem.h | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index 9ea1933dfb..eff4d50b26 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -50,7 +50,6 @@ var properties = {}; properties[group] = {}; properties[group][propertyName] = this.checked; - //debugPrint(" about to emitWebEvent() properties:" + JSON.stringify(properties)); EventBridge.emitWebEvent( JSON.stringify({ type: "update", diff --git a/libraries/animation/src/AnimationHandle.h b/libraries/animation/src/AnimationHandle.h index 4ecbac74d8..cc17a380df 100644 --- a/libraries/animation/src/AnimationHandle.h +++ b/libraries/animation/src/AnimationHandle.h @@ -92,7 +92,7 @@ public: float getLastFrame() const { return _animationLoop.getLastFrame(); } void setRunning(bool running, bool restoreJoints = true); - bool isRunning() const { return _animationLoop.isRunning(); } + bool isRunning() const { return _animationLoop.getRunning(); } void setFrameIndex(float frameIndex) { _animationLoop.setFrameIndex(frameIndex); } float getFrameIndex() const { return _animationLoop.getFrameIndex(); } diff --git a/libraries/animation/src/AnimationLoop.cpp b/libraries/animation/src/AnimationLoop.cpp index 59b8e7d209..8556128ae8 100644 --- a/libraries/animation/src/AnimationLoop.cpp +++ b/libraries/animation/src/AnimationLoop.cpp @@ -26,7 +26,7 @@ AnimationLoop::AnimationLoop() : _running(false), _frameIndex(0.0f), _maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME), - _resetOnRunning(false), + _resetOnRunning(true), _lastSimulated(usecTimestampNow()) { } @@ -40,7 +40,7 @@ AnimationLoop::AnimationLoop(const AnimationDetails& animationDetails) : _lastFrame(animationDetails.lastFrame), _running(animationDetails.running), _frameIndex(animationDetails.frameIndex), - _resetOnRunning(false), + _resetOnRunning(true), _lastSimulated(usecTimestampNow()) { } @@ -55,7 +55,7 @@ AnimationLoop::AnimationLoop(float fps, bool loop, bool hold, bool startAutomati _lastFrame(lastFrame), _running(running), _frameIndex(frameIndex), - _resetOnRunning(false), + _resetOnRunning(true), _lastSimulated(usecTimestampNow()) { } @@ -91,7 +91,7 @@ void AnimationLoop::simulate(float deltaTime) { } void AnimationLoop::setStartAutomatically(bool startAutomatically) { - if ((_startAutomatically = startAutomatically) && !isRunning()) { + if ((_startAutomatically = startAutomatically) && !getRunning()) { start(); } } diff --git a/libraries/animation/src/AnimationLoop.h b/libraries/animation/src/AnimationLoop.h index 4fa827768e..6e6220310b 100644 --- a/libraries/animation/src/AnimationLoop.h +++ b/libraries/animation/src/AnimationLoop.h @@ -47,7 +47,6 @@ public: void setResetOnRunning(bool resetOnRunning) { _resetOnRunning = resetOnRunning; } void setRunning(bool running); bool getRunning() const { return _running; } - bool isRunning() const { return _running; } void setFrameIndex(float frameIndex) { _frameIndex = glm::clamp(frameIndex, _firstFrame, _lastFrame); } float getFrameIndex() const { return _frameIndex; } diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index eece037f2d..83e98c21eb 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -107,7 +107,7 @@ public: void getAnimationFrame(bool& newFrame, QVector& rotationsResult, QVector& translationsResult); bool jointsMapped() const { return _jointMappingCompleted; } - bool getAnimationIsPlaying() const { return _animationLoop.isRunning(); } + bool getAnimationIsPlaying() const { return _animationLoop.getRunning(); } float getAnimationFrameIndex() const { return _animationLoop.getFrameIndex(); } float getAnimationFPS() const { return _animationLoop.getFPS(); } From 57cc7adbfe8ac4f2c1abc2c24ef5b9ca573bd322 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Wed, 7 Oct 2015 12:27:12 -0700 Subject: [PATCH 28/30] standardize somethingChanged - CR feedback --- .../src/RenderableModelEntityItem.cpp | 6 ++-- .../src/RenderableModelEntityItem.h | 3 +- .../src/RenderableZoneEntityItem.cpp | 6 ++-- .../src/RenderableZoneEntityItem.h | 3 +- .../entities/src/AnimationPropertyGroup.cpp | 33 ++----------------- .../entities/src/AnimationPropertyGroup.h | 21 ++---------- .../entities/src/AtmospherePropertyGroup.cpp | 4 ++- .../entities/src/AtmospherePropertyGroup.h | 3 +- libraries/entities/src/BoxEntityItem.cpp | 3 +- libraries/entities/src/BoxEntityItem.h | 3 +- libraries/entities/src/EntityItem.cpp | 3 +- libraries/entities/src/EntityItem.h | 5 +-- .../entities/src/EntityItemPropertiesMacros.h | 1 + libraries/entities/src/EntityTree.cpp | 2 -- libraries/entities/src/LightEntityItem.cpp | 3 +- libraries/entities/src/LightEntityItem.h | 3 +- libraries/entities/src/LineEntityItem.cpp | 4 +-- libraries/entities/src/LineEntityItem.h | 3 +- libraries/entities/src/ModelEntityItem.cpp | 9 +++-- libraries/entities/src/ModelEntityItem.h | 3 +- .../entities/src/ParticleEffectEntityItem.cpp | 3 +- .../entities/src/ParticleEffectEntityItem.h | 3 +- libraries/entities/src/PolyLineEntityItem.cpp | 6 ++-- libraries/entities/src/PolyLineEntityItem.h | 3 +- libraries/entities/src/PolyVoxEntityItem.cpp | 3 +- libraries/entities/src/PolyVoxEntityItem.h | 3 +- libraries/entities/src/PropertyGroup.h | 10 ++---- .../entities/src/SkyboxPropertyGroup.cpp | 4 ++- libraries/entities/src/SkyboxPropertyGroup.h | 3 +- libraries/entities/src/SphereEntityItem.cpp | 3 +- libraries/entities/src/SphereEntityItem.h | 3 +- libraries/entities/src/StagePropertyGroup.cpp | 4 ++- libraries/entities/src/StagePropertyGroup.h | 3 +- libraries/entities/src/TextEntityItem.cpp | 3 +- libraries/entities/src/TextEntityItem.h | 3 +- libraries/entities/src/WebEntityItem.cpp | 3 +- libraries/entities/src/WebEntityItem.h | 3 +- libraries/entities/src/ZoneEntityItem.cpp | 9 ++--- libraries/entities/src/ZoneEntityItem.h | 3 +- 39 files changed, 93 insertions(+), 103 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index ed088bc9b5..5627338ebf 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -46,10 +46,12 @@ bool RenderableModelEntityItem::setProperties(const EntityItemProperties& proper int RenderableModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { QString oldModelURL = getModelURL(); int bytesRead = ModelEntityItem::readEntitySubclassDataFromBuffer(data, bytesLeftToRead, - args, propertyFlags, overwriteLocalData); + args, propertyFlags, + overwriteLocalData, somethingChanged); if (oldModelURL != getModelURL()) { _needsModelReload = true; } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 509b842c08..9673a378f6 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -39,7 +39,8 @@ public: virtual bool setProperties(const EntityItemProperties& properties); virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); virtual void somethingChangedNotification() { // FIX ME: this is overly aggressive. We only really need to simulate() if something about diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index c8088b7406..ff56bef46b 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -61,11 +61,13 @@ bool RenderableZoneEntityItem::setProperties(const EntityItemProperties& propert int RenderableZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; changeProperties([&]() { bytesRead = ZoneEntityItem::readEntitySubclassDataFromBuffer(data, bytesLeftToRead, - args, propertyFlags, overwriteLocalData); + args, propertyFlags, + overwriteLocalData, somethingChanged); }); return bytesRead; } diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.h b/libraries/entities-renderer/src/RenderableZoneEntityItem.h index f455ea34de..92de136df6 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.h +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.h @@ -30,7 +30,8 @@ public: virtual bool setProperties(const EntityItemProperties& properties); virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); virtual void render(RenderArgs* args); virtual bool contains(const glm::vec3& point) const; diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index f648c4c06e..8b5d64b387 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -212,6 +212,7 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF int bytesRead = 0; bool overwriteLocalData = true; + bool somethingChanged = false; READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setURL); @@ -320,8 +321,6 @@ bool AnimationPropertyGroup::setProperties(const EntityItemProperties& propertie SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, setStartAutomatically); } - _somethingChanged = somethingChanged; - return somethingChanged; } @@ -375,15 +374,8 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { - - float fps = _animationLoop ? _animationLoop->getFPS() : getFPS(); - bool running = _animationLoop ? _animationLoop->getRunning() : getRunning(); - float firstFrame = _animationLoop ? _animationLoop->getFirstFrame() : getFirstFrame(); - float lastFrame = _animationLoop ? _animationLoop->getLastFrame() : getLastFrame(); - bool loop = _animationLoop ? _animationLoop->getLoop() : getLoop(); - bool hold = _animationLoop ? _animationLoop->getHold() : getHold(); - bool startAutomatically = _animationLoop ? _animationLoop->getStartAutomatically() : getStartAutomatically(); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; @@ -411,24 +403,5 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, setStartAutomatically); } - float newFPS = _animationLoop ? _animationLoop->getFPS() : getFPS(); - bool newRunning = _animationLoop ? _animationLoop->getRunning() : getRunning(); - float newFirstFrame = _animationLoop ? _animationLoop->getFirstFrame() : getFirstFrame(); - float newLastFrame = _animationLoop ? _animationLoop->getLastFrame() : getLastFrame(); - bool newLoop = _animationLoop ? _animationLoop->getLoop() : getLoop(); - bool newHold = _animationLoop ? _animationLoop->getHold() : getHold(); - bool newStartAutomatically = _animationLoop ? _animationLoop->getStartAutomatically() : getStartAutomatically(); - - // NOTE: we don't check frameIndex because that is assumed to always be changing. - _somethingChanged = newFPS != fps || - newRunning != running || - newFirstFrame != firstFrame || - newLastFrame != lastFrame || - newLoop != loop || - newHold != hold || - newStartAutomatically != startAutomatically; - - - return bytesRead; } diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 5612c1a99e..60f57ef491 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -10,24 +10,6 @@ // -// FIXME - TODO -// DONE - 1) make EntityItemProperties support old versions of animation properties -// DONE - 2) rename the group animationSettings -// DONE - 3) make sure that setting properties and reading from stream actually set the animationLoop object properly -// 4) test it! -// DONE - a) toybox/windmill -// DONE - b) toybox "put me down" doll -// c) asana bugs about animations -// d) spray paint can (particles) -// e) grenade -// -// DONE - 5) update all scripts -// DONE - 6) remove all remnants of old member variables -// DONE - 7) research and remove animation settings from Particle Effect -// DONE - 8) make sure animations start properly when entering a domain... with previously running animations -// 9) debug running property -// - #ifndef hifi_AnimationPropertyGroup_h #define hifi_AnimationPropertyGroup_h @@ -88,7 +70,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); DEFINE_PROPERTY_REF(PROP_ANIMATION_URL, URL, url, QString); DEFINE_PROPERTY(PROP_ANIMATION_FPS, FPS, fps, float); diff --git a/libraries/entities/src/AtmospherePropertyGroup.cpp b/libraries/entities/src/AtmospherePropertyGroup.cpp index 676a214b81..e24dc5791b 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.cpp +++ b/libraries/entities/src/AtmospherePropertyGroup.cpp @@ -88,6 +88,7 @@ bool AtmospherePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& property int bytesRead = 0; bool overwriteLocalData = true; + bool somethingChanged = false; READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_CENTER, glm::vec3, setCenter); READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, float, setInnerRadius); @@ -194,7 +195,8 @@ void AtmospherePropertyGroup::appendSubclassData(OctreePacketData* packetData, E int AtmospherePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/AtmospherePropertyGroup.h b/libraries/entities/src/AtmospherePropertyGroup.h index 715b923feb..50ed56ef87 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.h +++ b/libraries/entities/src/AtmospherePropertyGroup.h @@ -87,7 +87,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_CENTER, Center, center, glm::vec3); diff --git a/libraries/entities/src/BoxEntityItem.cpp b/libraries/entities/src/BoxEntityItem.cpp index 4f30060207..97a9d77236 100644 --- a/libraries/entities/src/BoxEntityItem.cpp +++ b/libraries/entities/src/BoxEntityItem.cpp @@ -65,7 +65,8 @@ bool BoxEntityItem::setProperties(const EntityItemProperties& properties) { int BoxEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/BoxEntityItem.h b/libraries/entities/src/BoxEntityItem.h index cc3bba4823..6c1b5b2312 100644 --- a/libraries/entities/src/BoxEntityItem.h +++ b/libraries/entities/src/BoxEntityItem.h @@ -39,7 +39,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); const rgbColor& getColor() const { return _color; } xColor getXColor() const { xColor color = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; return color; } diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index c4f5ad0061..a8f3adc12e 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -403,6 +403,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef bool overwriteLocalData = true; // assume the new content overwrites our local data quint64 now = usecTimestampNow(); + bool somethingChanged = false; // _created { @@ -715,7 +716,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } bytesRead += readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, - propertyFlags, overwriteLocalData); + propertyFlags, overwriteLocalData, somethingChanged); //////////////////////////////////// // WARNING: Do not add stream content here after the subclass. Always add it before the subclass diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index d11ffadc75..23892c6fc3 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -179,8 +179,9 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) - { return 0; } + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) + { somethingChanged = false; return 0; } virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges) { return false; } // by default entity items don't add to scene diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 8e0b968fcb..39d8a38380 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -42,6 +42,7 @@ if (overwriteLocalData) { \ S(fromBuffer); \ } \ + somethingChanged = true; \ } #define SKIP_ENTITY_PROPERTY(P,T) \ diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 44183d76de..c4c02d364f 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -583,8 +583,6 @@ int EntityTree::processEditPacketData(NLPacket& packet, const unsigned char* edi case PacketType::EntityAdd: case PacketType::EntityEdit: { - qCDebug(entities) << "EntityTree::processEditPacketData()... EntityAdd/EntityEdit"; - quint64 startDecode = 0, endDecode = 0; quint64 startLookup = 0, endLookup = 0; quint64 startUpdate = 0, endUpdate = 0; diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp index 1d2e358799..376b84921a 100644 --- a/libraries/entities/src/LightEntityItem.cpp +++ b/libraries/entities/src/LightEntityItem.cpp @@ -119,7 +119,8 @@ bool LightEntityItem::setProperties(const EntityItemProperties& properties) { int LightEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h index 0590955700..9f8d340852 100644 --- a/libraries/entities/src/LightEntityItem.h +++ b/libraries/entities/src/LightEntityItem.h @@ -41,7 +41,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); const rgbColor& getColor() const { return _color; } xColor getXColor() const { diff --git a/libraries/entities/src/LineEntityItem.cpp b/libraries/entities/src/LineEntityItem.cpp index 856d443a44..ab9b656963 100644 --- a/libraries/entities/src/LineEntityItem.cpp +++ b/libraries/entities/src/LineEntityItem.cpp @@ -121,7 +121,8 @@ bool LineEntityItem::setLinePoints(const QVector& points) { int LineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; @@ -129,7 +130,6 @@ int LineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); - return bytesRead; } diff --git a/libraries/entities/src/LineEntityItem.h b/libraries/entities/src/LineEntityItem.h index b462cd804c..b20587637f 100644 --- a/libraries/entities/src/LineEntityItem.h +++ b/libraries/entities/src/LineEntityItem.h @@ -39,7 +39,8 @@ class LineEntityItem : public EntityItem { virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); const rgbColor& getColor() const { return _color; } xColor getXColor() const { xColor color = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; return color; } diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 1eafc50141..6f426a539e 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -85,10 +85,12 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) { int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; + bool animationPropertiesChanged = false; READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); READ_ENTITY_PROPERTY(PROP_MODEL_URL, QString, setModelURL); @@ -116,7 +118,7 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, // Note: since we've associated our _animationProperties with our _animationLoop, the readEntitySubclassDataFromBuffer() // will automatically read into the animation loop int bytesFromAnimation = _animationProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, - propertyFlags, overwriteLocalData); + propertyFlags, overwriteLocalData, animationPropertiesChanged); bytesRead += bytesFromAnimation; dataAt += bytesFromAnimation; @@ -124,8 +126,9 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, updateShapeType); - if (_animationProperties.somethingChanged()) { + if (animationPropertiesChanged) { _dirtyFlags |= EntityItem::DIRTY_UPDATEABLE; + somethingChanged = true; } return bytesRead; diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index 83e98c21eb..cbd54a6acd 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -42,7 +42,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); virtual void update(const quint64& now); virtual bool needsToCallUpdate() const; diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index ace0edb0e1..a0a79996c9 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -246,7 +246,8 @@ bool ParticleEffectEntityItem::setProperties(const EntityItemProperties& propert int ParticleEffectEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/ParticleEffectEntityItem.h b/libraries/entities/src/ParticleEffectEntityItem.h index 44cfb76a02..3f8fe5bf51 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.h +++ b/libraries/entities/src/ParticleEffectEntityItem.h @@ -40,7 +40,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); virtual void update(const quint64& now); virtual bool needsToCallUpdate() const; diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index a01c2ce17b..fbb8250882 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -184,8 +184,10 @@ bool PolyLineEntityItem::setLinePoints(const QVector& points) { int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { - QWriteLocker lock(&_quadReadWriteLock); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { + + QWriteLocker lock(&_quadReadWriteLock); int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h index e20a0b1c93..86a1dfb6e0 100644 --- a/libraries/entities/src/PolyLineEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -39,7 +39,8 @@ class PolyLineEntityItem : public EntityItem { virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); const rgbColor& getColor() const { return _color; } xColor getXColor() const { xColor color = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; return color; } diff --git a/libraries/entities/src/PolyVoxEntityItem.cpp b/libraries/entities/src/PolyVoxEntityItem.cpp index 70ae25c65c..368954b891 100644 --- a/libraries/entities/src/PolyVoxEntityItem.cpp +++ b/libraries/entities/src/PolyVoxEntityItem.cpp @@ -152,7 +152,8 @@ bool PolyVoxEntityItem::setProperties(const EntityItemProperties& properties) { int PolyVoxEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/PolyVoxEntityItem.h b/libraries/entities/src/PolyVoxEntityItem.h index 8a781bf127..9070ad250f 100644 --- a/libraries/entities/src/PolyVoxEntityItem.h +++ b/libraries/entities/src/PolyVoxEntityItem.h @@ -39,7 +39,8 @@ class PolyVoxEntityItem : public EntityItem { virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); // never have a ray intersection pick a PolyVoxEntityItem. virtual bool supportsDetailedRayIntersection() const { return true; } diff --git a/libraries/entities/src/PropertyGroup.h b/libraries/entities/src/PropertyGroup.h index d030400993..ea73f8656a 100644 --- a/libraries/entities/src/PropertyGroup.h +++ b/libraries/entities/src/PropertyGroup.h @@ -81,10 +81,6 @@ public: /// has changed. This will be called with properties change or when new data is loaded from a stream virtual void somethingChangedNotification() { } - /// set to true or false after setProperties() and readEntitySubclassDataFromBuffer() if something in the state has changed. - bool somethingChanged() const { return _somethingChanged; } - - virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const = 0; virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, @@ -97,10 +93,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) = 0; - -protected: - bool _somethingChanged = false; + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) = 0; }; #endif // hifi_PropertyGroup_h diff --git a/libraries/entities/src/SkyboxPropertyGroup.cpp b/libraries/entities/src/SkyboxPropertyGroup.cpp index 261e050387..d3ed82274a 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.cpp +++ b/libraries/entities/src/SkyboxPropertyGroup.cpp @@ -56,6 +56,7 @@ bool SkyboxPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlag int bytesRead = 0; bool overwriteLocalData = true; + bool somethingChanged = false; READ_ENTITY_PROPERTY(PROP_SKYBOX_COLOR, xColor, setColor); READ_ENTITY_PROPERTY(PROP_SKYBOX_URL, QString, setURL); @@ -121,7 +122,8 @@ void SkyboxPropertyGroup::appendSubclassData(OctreePacketData* packetData, Encod int SkyboxPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/SkyboxPropertyGroup.h b/libraries/entities/src/SkyboxPropertyGroup.h index 995c87e1db..6e8d4340fe 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.h +++ b/libraries/entities/src/SkyboxPropertyGroup.h @@ -67,7 +67,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); glm::vec3 getColorVec3() const { const quint8 MAX_COLOR = 255; diff --git a/libraries/entities/src/SphereEntityItem.cpp b/libraries/entities/src/SphereEntityItem.cpp index 1d0b2db5b3..3f41ef6d91 100644 --- a/libraries/entities/src/SphereEntityItem.cpp +++ b/libraries/entities/src/SphereEntityItem.cpp @@ -63,7 +63,8 @@ bool SphereEntityItem::setProperties(const EntityItemProperties& properties) { int SphereEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/SphereEntityItem.h b/libraries/entities/src/SphereEntityItem.h index 81a6cf704c..e1e31d4839 100644 --- a/libraries/entities/src/SphereEntityItem.h +++ b/libraries/entities/src/SphereEntityItem.h @@ -38,7 +38,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); const rgbColor& getColor() const { return _color; } xColor getXColor() const { xColor color = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; return color; } diff --git a/libraries/entities/src/StagePropertyGroup.cpp b/libraries/entities/src/StagePropertyGroup.cpp index a8b7705a73..bab68c7a4b 100644 --- a/libraries/entities/src/StagePropertyGroup.cpp +++ b/libraries/entities/src/StagePropertyGroup.cpp @@ -101,6 +101,7 @@ bool StagePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags int bytesRead = 0; bool overwriteLocalData = true; + bool somethingChanged = false; READ_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, bool, setSunModelEnabled); READ_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, float, setLatitude); @@ -206,7 +207,8 @@ void StagePropertyGroup::appendSubclassData(OctreePacketData* packetData, Encode int StagePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/StagePropertyGroup.h b/libraries/entities/src/StagePropertyGroup.h index 0f1cbf5a89..208eff479c 100644 --- a/libraries/entities/src/StagePropertyGroup.h +++ b/libraries/entities/src/StagePropertyGroup.h @@ -67,7 +67,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); static const bool DEFAULT_STAGE_SUN_MODEL_ENABLED; static const float DEFAULT_STAGE_LATITUDE; diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp index dec4f4b4da..d19e3be4c9 100644 --- a/libraries/entities/src/TextEntityItem.cpp +++ b/libraries/entities/src/TextEntityItem.cpp @@ -84,7 +84,8 @@ bool TextEntityItem::setProperties(const EntityItemProperties& properties) { int TextEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h index 0874651302..d205e9d01e 100644 --- a/libraries/entities/src/TextEntityItem.h +++ b/libraries/entities/src/TextEntityItem.h @@ -43,7 +43,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, diff --git a/libraries/entities/src/WebEntityItem.cpp b/libraries/entities/src/WebEntityItem.cpp index d6fc0e2148..496f2b412d 100644 --- a/libraries/entities/src/WebEntityItem.cpp +++ b/libraries/entities/src/WebEntityItem.cpp @@ -68,7 +68,8 @@ bool WebEntityItem::setProperties(const EntityItemProperties& properties) { int WebEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; diff --git a/libraries/entities/src/WebEntityItem.h b/libraries/entities/src/WebEntityItem.h index 7046051b8e..425d89de76 100644 --- a/libraries/entities/src/WebEntityItem.h +++ b/libraries/entities/src/WebEntityItem.h @@ -42,7 +42,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 137ad55303..69357426ed 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -129,7 +129,8 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged) { int bytesRead = 0; const unsigned char* dataAt = data; @@ -139,7 +140,7 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, glm::vec3, setKeyLightDirection); int bytesFromStage = _stageProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, - propertyFlags, overwriteLocalData); + propertyFlags, overwriteLocalData, somethingChanged); bytesRead += bytesFromStage; dataAt += bytesFromStage; @@ -149,13 +150,13 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_BACKGROUND_MODE, BackgroundMode, setBackgroundMode); int bytesFromAtmosphere = _atmosphereProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, - propertyFlags, overwriteLocalData); + propertyFlags, overwriteLocalData, somethingChanged); bytesRead += bytesFromAtmosphere; dataAt += bytesFromAtmosphere; int bytesFromSkybox = _skyboxProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, - propertyFlags, overwriteLocalData); + propertyFlags, overwriteLocalData, somethingChanged); bytesRead += bytesFromSkybox; dataAt += bytesFromSkybox; diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index 96b0f9cbeb..a81cc97c2f 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -43,7 +43,8 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + EntityPropertyFlags& propertyFlags, bool overwriteLocalData, + bool& somethingChanged); xColor getKeyLightColor() const { xColor color = { _keyLightColor[RED_INDEX], _keyLightColor[GREEN_INDEX], _keyLightColor[BLUE_INDEX] }; return color; } void setKeyLightColor(const xColor& value) { From 7a85e5b7a7215203cd3d25111d7b1fb54daf9643 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Wed, 7 Oct 2015 13:02:58 -0700 Subject: [PATCH 29/30] rename frameIndex to currentFrame --- .../src/avatars/ScriptableAvatar.cpp | 16 ++--- examples/dancing_bot.js | 6 +- examples/entityScripts/portal.js | 4 +- .../ZZZ-MOVE-TO_DOCS-animationStateExample.js | 2 +- .../example/entities/animatedModelExample.js | 2 +- examples/example/entities/butterflies.js | 2 +- examples/html/entityProperties.html | 4 +- examples/libraries/entityPropertyDialogBox.js | 14 ++--- examples/toys/doll/doll.js | 15 ++--- libraries/animation/src/AnimationCache.cpp | 8 +-- libraries/animation/src/AnimationCache.h | 4 +- libraries/animation/src/AnimationHandle.cpp | 16 ++--- libraries/animation/src/AnimationHandle.h | 6 +- libraries/animation/src/AnimationLoop.cpp | 24 ++++---- libraries/animation/src/AnimationLoop.h | 8 +-- .../entities/src/AnimationPropertyGroup.cpp | 59 ++++++++++--------- .../entities/src/AnimationPropertyGroup.h | 2 +- .../entities/src/EntityItemProperties.cpp | 2 +- libraries/entities/src/ModelEntityItem.cpp | 27 +++++---- libraries/entities/src/ModelEntityItem.h | 6 +- 20 files changed, 115 insertions(+), 112 deletions(-) diff --git a/assignment-client/src/avatars/ScriptableAvatar.cpp b/assignment-client/src/avatars/ScriptableAvatar.cpp index 36a527009e..161be954ff 100644 --- a/assignment-client/src/avatars/ScriptableAvatar.cpp +++ b/assignment-client/src/avatars/ScriptableAvatar.cpp @@ -61,17 +61,17 @@ void ScriptableAvatar::update(float deltatime) { _jointData.resize(modelJoints.size()); } - float frameIndex = _animationDetails.frameIndex + deltatime * _animationDetails.fps; - if (_animationDetails.loop || frameIndex < _animationDetails.lastFrame) { - while (frameIndex >= _animationDetails.lastFrame) { - frameIndex -= (_animationDetails.lastFrame - _animationDetails.firstFrame); + float currentFrame = _animationDetails.currentFrame + deltatime * _animationDetails.fps; + if (_animationDetails.loop || currentFrame < _animationDetails.lastFrame) { + while (currentFrame >= _animationDetails.lastFrame) { + currentFrame -= (_animationDetails.lastFrame - _animationDetails.firstFrame); } - _animationDetails.frameIndex = frameIndex; + _animationDetails.currentFrame = currentFrame; const int frameCount = _animation->getFrames().size(); - const FBXAnimationFrame& floorFrame = _animation->getFrames().at((int)glm::floor(frameIndex) % frameCount); - const FBXAnimationFrame& ceilFrame = _animation->getFrames().at((int)glm::ceil(frameIndex) % frameCount); - const float frameFraction = glm::fract(frameIndex); + const FBXAnimationFrame& floorFrame = _animation->getFrames().at((int)glm::floor(currentFrame) % frameCount); + const FBXAnimationFrame& ceilFrame = _animation->getFrames().at((int)glm::ceil(currentFrame) % frameCount); + const float frameFraction = glm::fract(currentFrame); for (int i = 0; i < modelJoints.size(); i++) { int mapping = animationJoints.indexOf(modelJoints[i]); diff --git a/examples/dancing_bot.js b/examples/dancing_bot.js index 2c0a35adb7..3e8912074f 100644 --- a/examples/dancing_bot.js +++ b/examples/dancing_bot.js @@ -19,7 +19,7 @@ Agent.isAvatar = true; var jointMapping; -var frameIndex = 0.0; +var currentFrame = 0.0; var FRAME_RATE = 30.0; // frames per second @@ -35,9 +35,9 @@ Script.update.connect(function(deltaTime) { jointMapping[i] = animationJointNames.indexOf(avatarJointNames[i]); } } - frameIndex += deltaTime * FRAME_RATE; + currentFrame += deltaTime * FRAME_RATE; var frames = animation.frames; - var rotations = frames[Math.floor(frameIndex) % frames.length].rotations; + var rotations = frames[Math.floor(currentFrame) % frames.length].rotations; for (var j = 0; j < jointMapping.length; j++) { var rotationIndex = jointMapping[j]; if (rotationIndex != -1) { diff --git a/examples/entityScripts/portal.js b/examples/entityScripts/portal.js index 879c1f9197..7fc195fbee 100644 --- a/examples/entityScripts/portal.js +++ b/examples/entityScripts/portal.js @@ -32,7 +32,7 @@ this.leaveEntity = function(entityID) { Entities.editEntity(entityID, { - animation: { url: animationURL, frameIndex: 1, running: false } + animation: { url: animationURL, currentFrame: 1, running: false } }); playSound(); @@ -40,7 +40,7 @@ this.hoverEnterEntity = function(entityID) { Entities.editEntity(entityID, { - animation: { url: animationURL, fps: 24, firstFrame: 1, lastFrame: 25, frameIndex: 1, running: true, hold: true } + animation: { url: animationURL, fps: 24, firstFrame: 1, lastFrame: 25, currentFrame: 1, running: true, hold: true } }); }; }) \ No newline at end of file diff --git a/examples/example/entities/ZZZ-MOVE-TO_DOCS-animationStateExample.js b/examples/example/entities/ZZZ-MOVE-TO_DOCS-animationStateExample.js index c6987c8626..8e71308768 100644 --- a/examples/example/entities/ZZZ-MOVE-TO_DOCS-animationStateExample.js +++ b/examples/example/entities/ZZZ-MOVE-TO_DOCS-animationStateExample.js @@ -18,7 +18,7 @@ function displayAnimationDetails(deltaTime) { print("count =" + count + " deltaTime=" + deltaTime); count++; var animationDetails = MyAvatar.getAnimationDetailsByRole("idle"); - print("animationDetails.frameIndex=" + animationDetails.frameIndex); + print("animationDetails.currentFrame=" + animationDetails.currentFrame); } function scriptEnding() { diff --git a/examples/example/entities/animatedModelExample.js b/examples/example/entities/animatedModelExample.js index 1e7869559e..5c2e1530aa 100644 --- a/examples/example/entities/animatedModelExample.js +++ b/examples/example/entities/animatedModelExample.js @@ -113,7 +113,7 @@ function moveModel(deltaTime) { if (resetFrame) { print("resetting the frame!"); - newProperties.animation.frameIndex = 0; + newProperties.animation.currentFrame = 0; resetFrame = false; } diff --git a/examples/example/entities/butterflies.js b/examples/example/entities/butterflies.js index 2eac9d6258..3a78a2fc1c 100644 --- a/examples/example/entities/butterflies.js +++ b/examples/example/entities/butterflies.js @@ -89,7 +89,7 @@ function addButterfly() { url: "http://public.highfidelity.io/models/content/butterfly/butterfly.fbx", firstFrame: 0, fps: newFrameRate, - frameIndex: 0, + currentFrame: 0, hold: false, lastFrame: 10000, loop: true, diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index eff4d50b26..268e95010c 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -522,7 +522,7 @@ elModelAnimationURL.value = properties.animation.url; elModelAnimationPlaying.checked = properties.animation.running; elModelAnimationFPS.value = properties.animation.fps; - elModelAnimationFrame.value = properties.animation.frameIndex; + elModelAnimationFrame.value = properties.animation.currentFrame; elModelAnimationFirstFrame.value = properties.animation.firstFrame; elModelAnimationLastFrame.value = properties.animation.lastFrame; elModelAnimationLoop.checked = properties.animation.loop; @@ -777,7 +777,7 @@ elModelAnimationURL.addEventListener('change', createEmitGroupTextPropertyUpdateFunction('animation', 'url')); elModelAnimationPlaying.addEventListener('change', createEmitGroupCheckedPropertyUpdateFunction('animation','running')); elModelAnimationFPS.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation','fps')); - elModelAnimationFrame.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation', 'frameIndex')); + elModelAnimationFrame.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation', 'currentFrame')); elModelAnimationFirstFrame.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation', 'firstFrame')); elModelAnimationLastFrame.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('animation', 'lastFrame')); elModelAnimationLoop.addEventListener('change', createEmitGroupCheckedPropertyUpdateFunction('animation', 'loop')); diff --git a/examples/libraries/entityPropertyDialogBox.js b/examples/libraries/entityPropertyDialogBox.js index a9e2e05445..4fd24756e0 100644 --- a/examples/libraries/entityPropertyDialogBox.js +++ b/examples/libraries/entityPropertyDialogBox.js @@ -26,7 +26,7 @@ EntityPropertyDialogBox = (function () { var rescalePercentage; var editModelID = -1; var previousAnimationIsPlaying; - var previousAnimationFrameIndex; + var previousAnimationCurrentFrame; that.cleanup = function () { }; @@ -62,8 +62,8 @@ EntityPropertyDialogBox = (function () { index++; array.push({ label: "Animation FPS:", value: properties.animation.fps }); index++; - array.push({ label: "Animation Frame:", value: properties.animation.frameIndex }); - previousAnimationFrameIndex = properties.animation.frameIndex; + array.push({ label: "Animation Frame:", value: properties.animation.currentFrame }); + previousAnimationCurrentFrame = properties.animation.currentFrame; index++; array.push({ label: "Textures:", value: properties.textures }); index++; @@ -319,11 +319,11 @@ EntityPropertyDialogBox = (function () { properties.animation.fps = array[index++].value; - var newAnimationFrameIndex = array[index++].value; - if (previousAnimationFrameIndex != newAnimationFrameIndex) { - properties.animation.frameIndex = newAnimationFrameIndex; + var newAnimationCurrentFrame = array[index++].value; + if (previousAnimationCurrentFrame != newAnimationCurrentFrame) { + properties.animation.currentFrame = newAnimationCurrentFrame; } else { - delete properties.animation.frameIndex; + delete properties.animation.currentFrame; } properties.textures = array[index++].value; diff --git a/examples/toys/doll/doll.js b/examples/toys/doll/doll.js index 19a7dacda9..8f8a8cd840 100644 --- a/examples/toys/doll/doll.js +++ b/examples/toys/doll/doll.js @@ -35,8 +35,10 @@ startNearGrab: function() { Entities.editEntity(this.entityID, { - animationURL: "https://hifi-public.s3.amazonaws.com/models/Bboys/zombie_scream.fbx", - animationFrameIndex: 0 + animation: { + url: "https://hifi-public.s3.amazonaws.com/models/Bboys/zombie_scream.fbx", + currentFrame: 0 + } }); Entities.editEntity(_this.entityID, { @@ -65,11 +67,10 @@ if (this.isGrabbed === true && this.hand === this.initialHand) { this.audioInjector.stop(); Entities.editEntity(this.entityID, { - animationFrameIndex: 0 - }); - - Entities.editEntity(this.entityID, { - animationURL: "http://hifi-public.s3.amazonaws.com/models/Bboys/bboy2/bboy2.fbx" + animation: { + url: "http://hifi-public.s3.amazonaws.com/models/Bboys/bboy2/bboy2.fbx", + currentFrame: 0 + } }); this.isGrabbed = false; diff --git a/libraries/animation/src/AnimationCache.cpp b/libraries/animation/src/AnimationCache.cpp index dfe1f2cbed..bf5ad233d6 100644 --- a/libraries/animation/src/AnimationCache.cpp +++ b/libraries/animation/src/AnimationCache.cpp @@ -130,15 +130,15 @@ void Animation::animationParseError(int error, QString str) { AnimationDetails::AnimationDetails() : role(), url(), fps(0.0f), priority(0.0f), loop(false), hold(false), - startAutomatically(false), firstFrame(0.0f), lastFrame(0.0f), running(false), frameIndex(0.0f) + startAutomatically(false), firstFrame(0.0f), lastFrame(0.0f), running(false), currentFrame(0.0f) { } AnimationDetails::AnimationDetails(QString role, QUrl url, float fps, float priority, bool loop, - bool hold, bool startAutomatically, float firstFrame, float lastFrame, bool running, float frameIndex) : + bool hold, bool startAutomatically, float firstFrame, float lastFrame, bool running, float currentFrame) : role(role), url(url), fps(fps), priority(priority), loop(loop), hold(hold), startAutomatically(startAutomatically), firstFrame(firstFrame), lastFrame(lastFrame), - running(running), frameIndex(frameIndex) + running(running), currentFrame(currentFrame) { } @@ -155,7 +155,7 @@ QScriptValue animationDetailsToScriptValue(QScriptEngine* engine, const Animatio obj.setProperty("firstFrame", details.firstFrame); obj.setProperty("lastFrame", details.lastFrame); obj.setProperty("running", details.running); - obj.setProperty("frameIndex", details.frameIndex); + obj.setProperty("currentFrame", details.currentFrame); return obj; } diff --git a/libraries/animation/src/AnimationCache.h b/libraries/animation/src/AnimationCache.h index 3a8fbf3a61..6143d9b42e 100644 --- a/libraries/animation/src/AnimationCache.h +++ b/libraries/animation/src/AnimationCache.h @@ -97,7 +97,7 @@ class AnimationDetails { public: AnimationDetails(); AnimationDetails(QString role, QUrl url, float fps, float priority, bool loop, - bool hold, bool startAutomatically, float firstFrame, float lastFrame, bool running, float frameIndex); + bool hold, bool startAutomatically, float firstFrame, float lastFrame, bool running, float currentFrame); QString role; QUrl url; @@ -109,7 +109,7 @@ public: float firstFrame; float lastFrame; bool running; - float frameIndex; + float currentFrame; }; Q_DECLARE_METATYPE(AnimationDetails); QScriptValue animationDetailsToScriptValue(QScriptEngine* engine, const AnimationDetails& event); diff --git a/libraries/animation/src/AnimationHandle.cpp b/libraries/animation/src/AnimationHandle.cpp index cee182afc8..93ce3613e7 100644 --- a/libraries/animation/src/AnimationHandle.cpp +++ b/libraries/animation/src/AnimationHandle.cpp @@ -53,7 +53,7 @@ void AnimationHandle::setMaskedJoints(const QStringList& maskedJoints) { void AnimationHandle::setRunning(bool running, bool doRestoreJoints) { if (running && isRunning() && (getFadePerSecond() >= 0.0f)) { // if we're already running, this is the same as a restart -- unless we're fading out. - setFrameIndex(getFirstFrame()); + setCurrentFrame(getFirstFrame()); return; } _animationLoop.setRunning(running); @@ -82,7 +82,7 @@ AnimationHandle::AnimationHandle(RigPointer rig) : AnimationDetails AnimationHandle::getAnimationDetails() const { AnimationDetails details(_role, _url, getFPS(), _priority, getLoop(), getHold(), - getStartAutomatically(), getFirstFrame(), getLastFrame(), isRunning(), getFrameIndex()); + getStartAutomatically(), getFirstFrame(), getLastFrame(), isRunning(), getCurrentFrame()); return details; } @@ -97,7 +97,7 @@ void AnimationHandle::setAnimationDetails(const AnimationDetails& details) { setFirstFrame(details.firstFrame); setLastFrame(details.lastFrame); setRunning(details.running); - setFrameIndex(details.frameIndex); + setCurrentFrame(details.currentFrame); // NOTE: AnimationDetails doesn't support maskedJoints //setMaskedJoints(const QStringList& maskedJoints); @@ -160,19 +160,19 @@ void AnimationHandle::simulate(float deltaTime) { } // blend between the closest two frames - applyFrame(getFrameIndex()); + applyFrame(getCurrentFrame()); } -void AnimationHandle::applyFrame(float frameIndex) { +void AnimationHandle::applyFrame(float currentFrame) { if (!_animation || !_animation->isLoaded()) { return; } const FBXGeometry& animationGeometry = _animation->getGeometry(); int frameCount = animationGeometry.animationFrames.size(); - const FBXAnimationFrame& floorFrame = animationGeometry.animationFrames.at((int)glm::floor(frameIndex) % frameCount); - const FBXAnimationFrame& ceilFrame = animationGeometry.animationFrames.at((int)glm::ceil(frameIndex) % frameCount); - float frameFraction = glm::fract(frameIndex); + const FBXAnimationFrame& floorFrame = animationGeometry.animationFrames.at((int)glm::floor(currentFrame) % frameCount); + const FBXAnimationFrame& ceilFrame = animationGeometry.animationFrames.at((int)glm::ceil(currentFrame) % frameCount); + float frameFraction = glm::fract(currentFrame); for (int i = 0; i < _jointMappings.size(); i++) { int mapping = _jointMappings.at(i); diff --git a/libraries/animation/src/AnimationHandle.h b/libraries/animation/src/AnimationHandle.h index cc17a380df..7492d3fa48 100644 --- a/libraries/animation/src/AnimationHandle.h +++ b/libraries/animation/src/AnimationHandle.h @@ -94,8 +94,8 @@ public: void setRunning(bool running, bool restoreJoints = true); bool isRunning() const { return _animationLoop.getRunning(); } - void setFrameIndex(float frameIndex) { _animationLoop.setFrameIndex(frameIndex); } - float getFrameIndex() const { return _animationLoop.getFrameIndex(); } + void setCurrentFrame(float currentFrame) { _animationLoop.setCurrentFrame(currentFrame); } + float getCurrentFrame() const { return _animationLoop.getCurrentFrame(); } AnimationDetails getAnimationDetails() const; void setAnimationDetails(const AnimationDetails& details); @@ -103,7 +103,7 @@ public: void setJointMappings(QVector jointMappings); QVector getJointMappings(); // computing if necessary void simulate(float deltaTime); - void applyFrame(float frameIndex); + void applyFrame(float currentFrame); void replaceMatchingPriorities(float newPriority); void restoreJoints(); void clearJoints() { _jointMappings.clear(); } diff --git a/libraries/animation/src/AnimationLoop.cpp b/libraries/animation/src/AnimationLoop.cpp index 8556128ae8..1e04af5dfa 100644 --- a/libraries/animation/src/AnimationLoop.cpp +++ b/libraries/animation/src/AnimationLoop.cpp @@ -24,7 +24,7 @@ AnimationLoop::AnimationLoop() : _firstFrame(0.0f), _lastFrame(MAXIMUM_POSSIBLE_FRAME), _running(false), - _frameIndex(0.0f), + _currentFrame(0.0f), _maxFrameIndexHint(MAXIMUM_POSSIBLE_FRAME), _resetOnRunning(true), _lastSimulated(usecTimestampNow()) @@ -39,14 +39,14 @@ AnimationLoop::AnimationLoop(const AnimationDetails& animationDetails) : _firstFrame(animationDetails.firstFrame), _lastFrame(animationDetails.lastFrame), _running(animationDetails.running), - _frameIndex(animationDetails.frameIndex), + _currentFrame(animationDetails.currentFrame), _resetOnRunning(true), _lastSimulated(usecTimestampNow()) { } AnimationLoop::AnimationLoop(float fps, bool loop, bool hold, bool startAutomatically, float firstFrame, - float lastFrame, bool running, float frameIndex) : + float lastFrame, bool running, float currentFrame) : _fps(fps), _loop(loop), _hold(hold), @@ -54,7 +54,7 @@ AnimationLoop::AnimationLoop(float fps, bool loop, bool hold, bool startAutomati _firstFrame(firstFrame), _lastFrame(lastFrame), _running(running), - _frameIndex(frameIndex), + _currentFrame(currentFrame), _resetOnRunning(true), _lastSimulated(usecTimestampNow()) { @@ -67,25 +67,25 @@ void AnimationLoop::simulateAtTime(quint64 now) { } void AnimationLoop::simulate(float deltaTime) { - _frameIndex += deltaTime * _fps; + _currentFrame += deltaTime * _fps; // If we knew the number of frames from the animation, we'd consider using it here // animationGeometry.animationFrames.size() float maxFrame = _maxFrameIndexHint; float endFrameIndex = qMin(_lastFrame, maxFrame - (_loop ? 0.0f : 1.0f)); float startFrameIndex = qMin(_firstFrame, endFrameIndex); - if ((!_loop && (_frameIndex < startFrameIndex || _frameIndex > endFrameIndex)) || startFrameIndex == endFrameIndex) { + if ((!_loop && (_currentFrame < startFrameIndex || _currentFrame > endFrameIndex)) || startFrameIndex == endFrameIndex) { // passed the end; apply the last frame - _frameIndex = glm::clamp(_frameIndex, startFrameIndex, endFrameIndex); + _currentFrame = glm::clamp(_currentFrame, startFrameIndex, endFrameIndex); if (!_hold) { stop(); } } else { // wrap within the the desired range - if (_frameIndex < startFrameIndex) { - _frameIndex = endFrameIndex - glm::mod(endFrameIndex - _frameIndex, endFrameIndex - startFrameIndex); - } else if (_frameIndex > endFrameIndex) { - _frameIndex = startFrameIndex + glm::mod(_frameIndex - startFrameIndex, endFrameIndex - startFrameIndex); + if (_currentFrame < startFrameIndex) { + _currentFrame = endFrameIndex - glm::mod(endFrameIndex - _currentFrame, endFrameIndex - startFrameIndex); + } else if (_currentFrame > endFrameIndex) { + _currentFrame = startFrameIndex + glm::mod(_currentFrame - startFrameIndex, endFrameIndex - startFrameIndex); } } } @@ -104,7 +104,7 @@ void AnimationLoop::setRunning(bool running) { // If we just set running to true, then also reset the frame to the first frame if (running && (_resetOnRunning)) { // move back to the beginning - _frameIndex = _firstFrame; + _currentFrame = _firstFrame; } // If we just started running, set our diff --git a/libraries/animation/src/AnimationLoop.h b/libraries/animation/src/AnimationLoop.h index 6e6220310b..10664c47e7 100644 --- a/libraries/animation/src/AnimationLoop.h +++ b/libraries/animation/src/AnimationLoop.h @@ -21,7 +21,7 @@ public: AnimationLoop(); AnimationLoop(const AnimationDetails& animationDetails); AnimationLoop(float fps, bool loop, bool hold, bool startAutomatically, float firstFrame, - float lastFrame, bool running, float frameIndex); + float lastFrame, bool running, float currentFrame); void setFPS(float fps) { _fps = fps; } float getFPS() const { return _fps; } @@ -48,8 +48,8 @@ public: void setRunning(bool running); bool getRunning() const { return _running; } - void setFrameIndex(float frameIndex) { _frameIndex = glm::clamp(frameIndex, _firstFrame, _lastFrame); } - float getFrameIndex() const { return _frameIndex; } + void setCurrentFrame(float currentFrame) { _currentFrame = glm::clamp(currentFrame, _firstFrame, _lastFrame); } + float getCurrentFrame() const { return _currentFrame; } void setMaxFrameIndexHint(float value) { _maxFrameIndexHint = glm::clamp(value, 0.0f, MAXIMUM_POSSIBLE_FRAME); } float getMaxFrameIndexHint() const { return _maxFrameIndexHint; } @@ -68,7 +68,7 @@ private: float _firstFrame; float _lastFrame; bool _running; - float _frameIndex; + float _currentFrame; float _maxFrameIndexHint; bool _resetOnRunning; quint64 _lastSimulated; diff --git a/libraries/entities/src/AnimationPropertyGroup.cpp b/libraries/entities/src/AnimationPropertyGroup.cpp index 8b5d64b387..3c22707869 100644 --- a/libraries/entities/src/AnimationPropertyGroup.cpp +++ b/libraries/entities/src/AnimationPropertyGroup.cpp @@ -35,7 +35,7 @@ void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desire if (_animationLoop) { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FPS, Animation, animation, FPS, fps, _animationLoop->getFPS); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, Animation, animation, FrameIndex, frameIndex, _animationLoop->getFPS); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FRAME_INDEX, Animation, animation, CurrentFrame, currentFrame, _animationLoop->getFPS); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_PLAYING, Animation, animation, Running, running, _animationLoop->getRunning); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop, _animationLoop->getLoop); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame, _animationLoop->getFirstFrame); @@ -44,7 +44,7 @@ void AnimationPropertyGroup::copyToScriptValue(const EntityPropertyFlags& desire COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_ANIMATION_START_AUTOMATICALLY, Animation, animation, StartAutomatically, startAutomatically, _animationLoop->getStartAutomatically); } else { COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FPS, Animation, animation, FPS, fps); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, Animation, animation, FrameIndex, frameIndex); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FRAME_INDEX, Animation, animation, CurrentFrame, currentFrame); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_PLAYING, Animation, animation, Running, running); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_LOOP, Animation, animation, Loop, loop); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_ANIMATION_FIRST_FRAME, Animation, animation, FirstFrame, firstFrame); @@ -64,7 +64,7 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo if (_animationLoop) { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, fps, float, _animationLoop->setFPS); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, frameIndex, float, _animationLoop->setFrameIndex); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, currentFrame, float, _animationLoop->setCurrentFrame); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, running, bool, _animationLoop->setRunning); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, loop, bool, _animationLoop->setLoop); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, firstFrame, float, _animationLoop->setFirstFrame); @@ -75,11 +75,11 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo // legacy property support COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFPS, float, _animationLoop->setFPS, _animationLoop->getFPS); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationIsPlaying, bool, _animationLoop->setRunning, _animationLoop->getRunning); - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFrameIndex, float, _animationLoop->setFrameIndex, _animationLoop->getFrameIndex); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFrameIndex, float, _animationLoop->setCurrentFrame, _animationLoop->getCurrentFrame); } else { COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, fps, float, setFPS); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, frameIndex, float, setFrameIndex); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, currentFrame, float, setCurrentFrame); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, running, bool, setRunning); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, loop, bool, setLoop); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(animation, firstFrame, float, setFirstFrame); @@ -90,18 +90,18 @@ void AnimationPropertyGroup::copyFromScriptValue(const QScriptValue& object, boo // legacy property support COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFPS, float, setFPS, getFPS); COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationIsPlaying, bool, setRunning, getRunning); - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFrameIndex, float, setFrameIndex, getFrameIndex); + COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(animationFrameIndex, float, setCurrentFrame, getCurrentFrame); } } void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { // the animations setting is a JSON string that may contain various animation settings. - // if it includes fps, frameIndex, or running, those values will be parsed out and + // if it includes fps, currentFrame, or running, those values will be parsed out and // will over ride the regular animation settings float fps = _animationLoop ? _animationLoop->getFPS() : getFPS(); - float frameIndex = _animationLoop ? _animationLoop->getFrameIndex() : getFrameIndex(); + float currentFrame = _animationLoop ? _animationLoop->getCurrentFrame() : getCurrentFrame(); bool running = _animationLoop ? _animationLoop->getRunning() : getRunning(); float firstFrame = _animationLoop ? _animationLoop->getFirstFrame() : getFirstFrame(); float lastFrame = _animationLoop ? _animationLoop->getLastFrame() : getLastFrame(); @@ -117,8 +117,9 @@ void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { fps = settingsMap["fps"].toFloat(); } + // old settings had frameIndex if (settingsMap.contains("frameIndex")) { - frameIndex = settingsMap["frameIndex"].toFloat(); + currentFrame = settingsMap["frameIndex"].toFloat(); } if (settingsMap.contains("running")) { @@ -126,11 +127,11 @@ void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { } if (settingsMap.contains("firstFrame")) { - frameIndex = settingsMap["firstFrame"].toFloat(); + firstFrame = settingsMap["firstFrame"].toFloat(); } if (settingsMap.contains("lastFrame")) { - frameIndex = settingsMap["lastFrame"].toFloat(); + lastFrame = settingsMap["lastFrame"].toFloat(); } if (settingsMap.contains("loop")) { @@ -147,7 +148,7 @@ void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { if (_animationLoop) { _animationLoop->setFPS(fps); - _animationLoop->setFrameIndex(frameIndex); + _animationLoop->setCurrentFrame(currentFrame); _animationLoop->setRunning(running); _animationLoop->setFirstFrame(firstFrame); _animationLoop->setLastFrame(lastFrame); @@ -156,7 +157,7 @@ void AnimationPropertyGroup::setFromOldAnimationSettings(const QString& value) { _animationLoop->setStartAutomatically(startAutomatically); } else { setFPS(fps); - setFrameIndex(frameIndex); + setCurrentFrame(currentFrame); setRunning(running); setFirstFrame(firstFrame); setLastFrame(lastFrame); @@ -171,7 +172,7 @@ void AnimationPropertyGroup::debugDump() const { qDebug() << " AnimationPropertyGroup: ---------------------------------------------"; qDebug() << " url:" << getURL() << " has changed:" << urlChanged(); qDebug() << " fps:" << getFPS() << " has changed:" << fpsChanged(); - qDebug() << "frameIndex:" << getFrameIndex() << " has changed:" << frameIndexChanged(); + qDebug() << "currentFrame:" << getCurrentFrame() << " has changed:" << currentFrameChanged(); } bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, @@ -186,7 +187,7 @@ bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); if (_animationLoop) { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, _animationLoop->getFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getCurrentFrame()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, _animationLoop->getRunning()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, _animationLoop->getLoop()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, _animationLoop->getFirstFrame()); @@ -195,7 +196,7 @@ bool AnimationPropertyGroup::appendToEditPacket(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, _animationLoop->getStartAutomatically()); } else { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getCurrentFrame()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getRunning()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); @@ -218,7 +219,7 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF if (_animationLoop) { READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, _animationLoop->setFPS); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setCurrentFrame); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, _animationLoop->setRunning); READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, _animationLoop->setLoop); READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, _animationLoop->setFirstFrame); @@ -227,7 +228,7 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, _animationLoop->setStartAutomatically); } else { READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setCurrentFrame); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, setLoop); READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, setFirstFrame); @@ -238,7 +239,7 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_URL, URL); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FPS, FPS); - DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FRAME_INDEX, FrameIndex); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FRAME_INDEX, CurrentFrame); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_PLAYING, Running); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_LOOP, Loop); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_ANIMATION_FIRST_FRAME, FirstFrame); @@ -254,7 +255,7 @@ bool AnimationPropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyF void AnimationPropertyGroup::markAllChanged() { _urlChanged = true; _fpsChanged = true; - _frameIndexChanged = true; + _currentFrameChanged = true; _runningChanged = true; } @@ -263,7 +264,7 @@ EntityPropertyFlags AnimationPropertyGroup::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_ANIMATION_URL, url); CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FPS, fps); - CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FRAME_INDEX, frameIndex); + CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FRAME_INDEX, currentFrame); CHECK_PROPERTY_CHANGE(PROP_ANIMATION_PLAYING, running); CHECK_PROPERTY_CHANGE(PROP_ANIMATION_LOOP, loop); CHECK_PROPERTY_CHANGE(PROP_ANIMATION_FIRST_FRAME, firstFrame); @@ -278,7 +279,7 @@ void AnimationPropertyGroup::getProperties(EntityItemProperties& properties) con COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, URL, getURL); if (_animationLoop) { COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FPS, _animationLoop->getFPS); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FrameIndex, _animationLoop->getFrameIndex); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, CurrentFrame, _animationLoop->getCurrentFrame); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Running, _animationLoop->getRunning); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Loop, _animationLoop->getLoop); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FirstFrame, _animationLoop->getFirstFrame); @@ -287,7 +288,7 @@ void AnimationPropertyGroup::getProperties(EntityItemProperties& properties) con COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, StartAutomatically, _animationLoop->getStartAutomatically); } else { COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FPS, getFPS); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FrameIndex, getFrameIndex); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, CurrentFrame, getCurrentFrame); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Running, getRunning); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, Loop, getLoop); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Animation, FirstFrame, getFirstFrame); @@ -303,7 +304,7 @@ bool AnimationPropertyGroup::setProperties(const EntityItemProperties& propertie SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, URL, url, setURL); if (_animationLoop) { SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FPS, fps, _animationLoop->setFPS); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FrameIndex, frameIndex, _animationLoop->setFrameIndex); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, CurrentFrame, currentFrame, _animationLoop->setCurrentFrame); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Running, running, _animationLoop->setRunning); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Loop, loop, _animationLoop->setLoop); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FirstFrame, firstFrame, _animationLoop->setFirstFrame); @@ -312,7 +313,7 @@ bool AnimationPropertyGroup::setProperties(const EntityItemProperties& propertie SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, StartAutomatically, startAutomatically, _animationLoop->setStartAutomatically); } else { SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FPS, fps, setFPS); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FrameIndex, frameIndex, setFrameIndex); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, CurrentFrame, currentFrame, setCurrentFrame); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Running, running, setRunning); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, Loop, loop, setLoop); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Animation, FirstFrame, firstFrame, setFirstFrame); @@ -353,7 +354,7 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En APPEND_ENTITY_PROPERTY(PROP_ANIMATION_URL, getURL()); if (_animationLoop) { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, _animationLoop->getFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, _animationLoop->getCurrentFrame()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, _animationLoop->getRunning()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, _animationLoop->getLoop()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, _animationLoop->getFirstFrame()); @@ -362,7 +363,7 @@ void AnimationPropertyGroup::appendSubclassData(OctreePacketData* packetData, En APPEND_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, _animationLoop->getStartAutomatically()); } else { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, getFPS()); - APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getFrameIndex()); + APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, getCurrentFrame()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, getRunning()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, getLoop()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, getFirstFrame()); @@ -385,7 +386,7 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char if (_animationLoop) { // apply new properties to our associated AnimationLoop READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, _animationLoop->setFPS); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, _animationLoop->setCurrentFrame); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, _animationLoop->setRunning); READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, _animationLoop->setLoop); READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, _animationLoop->setFirstFrame); @@ -394,7 +395,7 @@ int AnimationPropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char READ_ENTITY_PROPERTY(PROP_ANIMATION_START_AUTOMATICALLY, bool, _animationLoop->setStartAutomatically); } else { READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setFPS); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setCurrentFrame); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setRunning); READ_ENTITY_PROPERTY(PROP_ANIMATION_LOOP, bool, setLoop); READ_ENTITY_PROPERTY(PROP_ANIMATION_FIRST_FRAME, float, setFirstFrame); diff --git a/libraries/entities/src/AnimationPropertyGroup.h b/libraries/entities/src/AnimationPropertyGroup.h index 60f57ef491..76782a85cd 100644 --- a/libraries/entities/src/AnimationPropertyGroup.h +++ b/libraries/entities/src/AnimationPropertyGroup.h @@ -75,7 +75,7 @@ public: DEFINE_PROPERTY_REF(PROP_ANIMATION_URL, URL, url, QString); DEFINE_PROPERTY(PROP_ANIMATION_FPS, FPS, fps, float); - DEFINE_PROPERTY(PROP_ANIMATION_FRAME_INDEX, FrameIndex, frameIndex, float); + DEFINE_PROPERTY(PROP_ANIMATION_FRAME_INDEX, CurrentFrame, currentFrame, float); DEFINE_PROPERTY(PROP_ANIMATION_PLAYING, Running, running, bool); // was animationIsPlaying DEFINE_PROPERTY(PROP_ANIMATION_LOOP, Loop, loop, bool); // was animationSettings.loop DEFINE_PROPERTY(PROP_ANIMATION_FIRST_FRAME, FirstFrame, firstFrame, float); // was animationSettings.firstFrame diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 387032f58c..b17ca41e9b 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -823,7 +823,7 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue 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, FrameIndex, frameIndex); + 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); diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 6f426a539e..bcf2318a0d 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -36,7 +36,7 @@ ModelEntityItem::ModelEntityItem(const EntityItemID& entityItemID, const EntityI _type = EntityTypes::Model; setProperties(properties); _jointMappingCompleted = false; - _lastKnownFrameIndex = -1; + _lastKnownCurrentFrame = -1; _color[0] = _color[1] = _color[2] = 0; } @@ -106,7 +106,7 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, if (args.bitstreamVersion < VERSION_ENTITIES_ANIMATION_PROPERTIES_GROUP) { READ_ENTITY_PROPERTY(PROP_ANIMATION_URL, QString, setAnimationURL); READ_ENTITY_PROPERTY(PROP_ANIMATION_FPS, float, setAnimationFPS); - READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); + READ_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, float, setAnimationCurrentFrame); READ_ENTITY_PROPERTY(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); } @@ -226,17 +226,17 @@ void ModelEntityItem::getAnimationFrame(bool& newFrame, int frameCount = frames.size(); if (frameCount > 0) { - int animationFrameIndex = (int)(glm::floor(getAnimationFrameIndex())) % frameCount; - if (animationFrameIndex < 0 || animationFrameIndex > frameCount) { - animationFrameIndex = 0; + int animationCurrentFrame = (int)(glm::floor(getAnimationCurrentFrame())) % frameCount; + if (animationCurrentFrame < 0 || animationCurrentFrame > frameCount) { + animationCurrentFrame = 0; } - if (animationFrameIndex != _lastKnownFrameIndex) { - _lastKnownFrameIndex = animationFrameIndex; + if (animationCurrentFrame != _lastKnownCurrentFrame) { + _lastKnownCurrentFrame = animationCurrentFrame; newFrame = true; - const QVector& rotations = frames[animationFrameIndex].rotations; - const QVector& translations = frames[animationFrameIndex].translations; + const QVector& rotations = frames[animationCurrentFrame].rotations; + const QVector& translations = frames[animationCurrentFrame].translations; _lastKnownFrameDataRotations.resize(_jointMapping.size()); _lastKnownFrameDataTranslations.resize(_jointMapping.size()); @@ -327,7 +327,7 @@ void ModelEntityItem::setAnimationURL(const QString& url) { void ModelEntityItem::setAnimationSettings(const QString& value) { // the animations setting is a JSON string that may contain various animation settings. - // if it includes fps, frameIndex, or running, those values will be parsed out and + // if it includes fps, currentFrame, or running, those values will be parsed out and // will over ride the regular animation settings QJsonDocument settingsAsJson = QJsonDocument::fromJson(value.toUtf8()); @@ -338,8 +338,9 @@ void ModelEntityItem::setAnimationSettings(const QString& value) { setAnimationFPS(fps); } + // old settings used frameIndex if (settingsMap.contains("frameIndex")) { - float frameIndex = settingsMap["frameIndex"].toFloat(); + float currentFrame = settingsMap["frameIndex"].toFloat(); #ifdef WANT_DEBUG if (isAnimatingSomething()) { qCDebug(entities) << "ModelEntityItem::setAnimationSettings() calling setAnimationFrameIndex()..."; @@ -347,11 +348,11 @@ void ModelEntityItem::setAnimationSettings(const QString& value) { qCDebug(entities) << " animation URL:" << getAnimationURL(); qCDebug(entities) << " settings:" << value; qCDebug(entities) << " settingsMap[frameIndex]:" << settingsMap["frameIndex"]; - qCDebug(entities" frameIndex: %20.5f", frameIndex); + qCDebug(entities" currentFrame: %20.5f", currentFrame); } #endif - setAnimationFrameIndex(frameIndex); + setAnimationCurrentFrame(currentFrame); } if (settingsMap.contains("running")) { diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index cbd54a6acd..187cad48eb 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -85,7 +85,7 @@ public: const QString& getAnimationURL() const { return _animationProperties.getURL(); } void setAnimationURL(const QString& url); - void setAnimationFrameIndex(float value) { _animationLoop.setFrameIndex(value); } + void setAnimationCurrentFrame(float value) { _animationLoop.setCurrentFrame(value); } void setAnimationIsPlaying(bool value); void setAnimationFPS(float value); @@ -109,7 +109,7 @@ public: bool jointsMapped() const { return _jointMappingCompleted; } bool getAnimationIsPlaying() const { return _animationLoop.getRunning(); } - float getAnimationFrameIndex() const { return _animationLoop.getFrameIndex(); } + float getAnimationCurrentFrame() const { return _animationLoop.getCurrentFrame(); } float getAnimationFPS() const { return _animationLoop.getFPS(); } static const QString DEFAULT_TEXTURES; @@ -126,7 +126,7 @@ private: protected: QVector _lastKnownFrameDataRotations; QVector _lastKnownFrameDataTranslations; - int _lastKnownFrameIndex; + int _lastKnownCurrentFrame; bool isAnimatingSomething() const; From b09ae1755e50041ad7ea7614c02fcb213812a064 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Wed, 7 Oct 2015 13:59:00 -0700 Subject: [PATCH 30/30] fix formatting of macros --- .../entities/src/EntityItemPropertiesMacros.h | 112 +++++++++--------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 39d8a38380..eb9a75259d 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -132,17 +132,17 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const EntityItemID& v) properties.setProperty(#g, groupProperties); \ } -#define COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(X,G,g,P,p,M) \ - if ((desiredProperties.isEmpty() || desiredProperties.getHasProperty(X)) && \ - (!skipDefaults || defaultEntityProperties.get##G().get##P() != get##P())) { \ - QScriptValue groupProperties = properties.property(#g); \ - if (!groupProperties.isValid()) { \ - groupProperties = engine->newObject(); \ - } \ - QScriptValue V = convertScriptValue(engine, M()); \ - groupProperties.setProperty(#p, V); \ - properties.setProperty(#g, groupProperties); \ - } +#define COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_GETTER(X,G,g,P,p,M) \ + if ((desiredProperties.isEmpty() || desiredProperties.getHasProperty(X)) && \ + (!skipDefaults || defaultEntityProperties.get##G().get##P() != get##P())) { \ + QScriptValue groupProperties = properties.property(#g); \ + if (!groupProperties.isValid()) { \ + groupProperties = engine->newObject(); \ + } \ + QScriptValue V = convertScriptValue(engine, M()); \ + groupProperties.setProperty(#p, V); \ + properties.setProperty(#g, groupProperties); \ + } #define COPY_PROPERTY_TO_QSCRIPTVALUE(p,P) \ if ((_desiredProperties.isEmpty() || _desiredProperties.getHasProperty(p)) && \ @@ -165,7 +165,7 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const EntityItemID& v) if (!skipDefaults || defaultEntityProperties._##P != _##P) { \ QScriptValue V = convertScriptValue(engine, G); \ properties.setProperty(#P, V); \ - } + } typedef glm::vec3 glmVec3; typedef glm::quat glmQuat; @@ -266,55 +266,55 @@ inline xColor xColor_convertFromScriptValue(const QScriptValue& v, bool& isValid } -#define COPY_PROPERTY_FROM_QSCRIPTVALUE(P, T, S) \ - { \ - QScriptValue V = object.property(#P); \ - if (V.isValid()) { \ - bool isValid = false; \ - T newValue = T##_convertFromScriptValue(V, isValid); \ +#define COPY_PROPERTY_FROM_QSCRIPTVALUE(P, T, S) \ + { \ + QScriptValue V = object.property(#P); \ + if (V.isValid()) { \ + bool isValid = false; \ + T newValue = T##_convertFromScriptValue(V, isValid); \ if (isValid && (_defaultSettings || newValue != _##P)) { \ - S(newValue); \ - } \ - } \ + S(newValue); \ + } \ + } \ } -#define COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(P, T, S, G) \ -{ \ - QScriptValue V = object.property(#P); \ - if (V.isValid()) { \ - bool isValid = false; \ - T newValue = T##_convertFromScriptValue(V, isValid); \ +#define COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(P, T, S, G) \ +{ \ + QScriptValue V = object.property(#P); \ + if (V.isValid()) { \ + bool isValid = false; \ + T newValue = T##_convertFromScriptValue(V, isValid); \ if (isValid && (_defaultSettings || newValue != G())) { \ - S(newValue); \ - } \ - }\ + S(newValue); \ + } \ + } \ } -#define COPY_PROPERTY_FROM_QSCRIPTVALUE_NOCHECK(P, T, S) \ -{ \ - QScriptValue V = object.property(#P); \ - if (V.isValid()) { \ - bool isValid = false; \ +#define COPY_PROPERTY_FROM_QSCRIPTVALUE_NOCHECK(P, T, S) \ +{ \ + QScriptValue V = object.property(#P); \ + if (V.isValid()) { \ + bool isValid = false; \ T newValue = T##_convertFromScriptValue(V, isValid); \ - if (isValid && (_defaultSettings)) { \ - S(newValue); \ - } \ - }\ + if (isValid && (_defaultSettings)) { \ + S(newValue); \ + } \ + } \ } -#define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(G, P, T, S) \ - { \ - QScriptValue G = object.property(#G); \ - if (G.isValid()) { \ - QScriptValue V = G.property(#P); \ - if (V.isValid()) { \ - bool isValid = false; \ - T newValue = T##_convertFromScriptValue(V, isValid); \ +#define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(G, P, T, S) \ + { \ + QScriptValue G = object.property(#G); \ + if (G.isValid()) { \ + QScriptValue V = G.property(#P); \ + if (V.isValid()) { \ + bool isValid = false; \ + T newValue = T##_convertFromScriptValue(V, isValid); \ if (isValid && (_defaultSettings || newValue != _##P)) { \ - S(newValue); \ - } \ - } \ - } \ + S(newValue); \ + } \ + } \ + } \ } #define COPY_PROPERTY_FROM_QSCRITPTVALUE_ENUM(P, S) \ @@ -330,12 +330,12 @@ inline xColor xColor_convertFromScriptValue(const QScriptValue& v, bool& isValid _##n(V), \ _##n##Changed(false) -#define DEFINE_PROPERTY_GROUP(N, n, T) \ - public: \ +#define DEFINE_PROPERTY_GROUP(N, n, T) \ + public: \ const T& get##N() const { return _##n; } \ - T& get##N() { return _##n; } \ - private: \ - T _##n; \ + T& get##N() { return _##n; } \ + private: \ + T _##n; \ static T _static##N; #define ADD_PROPERTY_TO_MAP(P, N, n, T) \