From df2c5b8c2346623a41aa6fc8345c343c8fb37504 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 4 May 2017 18:28:12 -0700 Subject: [PATCH] adding the notification for keyLight changes modifying the KeyLIghtPayoad --- interface/src/Application.cpp | 2 +- .../src/RenderableZoneEntityItem.cpp | 31 ++++++++++++++ .../src/RenderableZoneEntityItem.h | 3 +- libraries/entities/src/ZoneEntityItem.cpp | 42 +++++++++++++------ libraries/entities/src/ZoneEntityItem.h | 13 ++++++ .../utilities/render/deferredLighting.qml | 16 ++++--- 6 files changed, 86 insertions(+), 21 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3be55e82cd..8a16b755f5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -337,7 +337,7 @@ public: // Don't actually crash in debug builds, in case this apparent deadlock is simply from // the developer actively debugging code #ifdef NDEBUG - deadlockDetectionCrash(); + // deadlockDetectionCrash(); #endif } } diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index de7b943a92..ad50c9f3cd 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -68,8 +68,17 @@ bool RenderableZoneEntityItem::setProperties(const EntityItemProperties& propert void RenderableZoneEntityItem::somethingChangedNotification() { DependencyManager::get()->updateZone(_id); + + // A new way: + if (_keyLightPropertiesChanged || _backgroundPropertiesChanged) { + notifyChangedRenderItem(); + } + + // Poopagate back to parent + ZoneEntityItem::somethingChangedNotification(); } + int RenderableZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData, @@ -290,6 +299,7 @@ void RenderableZoneEntityItem::removeFromScene(EntityItemPointer self, const ren } + void RenderableZoneEntityItem::notifyBoundChanged() { if (!render::Item::isValidID(_myMetaItem)) { return; @@ -337,3 +347,24 @@ void RenderableZoneEntityItem::updateKeyLightItemFromEntity(KeyLightPayload& key light->setType(model::Light::SUN); } + +void RenderableZoneEntityItem::sceneUpdateRenderItemFromEntity(render::Transaction& transaction) { + if (!render::Item::isValidID(_myKeyLightItem)) { + return; + } + + transaction.updateItem(_myKeyLightItem, [&](KeyLightPayload& data) { + updateKeyLightItemFromEntity(data); + }); +} + +void RenderableZoneEntityItem::notifyChangedRenderItem() { + if (!render::Item::isValidID(_myKeyLightItem)) { + return; + } + + render::Transaction transaction; + render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); + sceneUpdateRenderItemFromEntity(transaction); + scene->enqueueTransaction(transaction); +} \ No newline at end of file diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.h b/libraries/entities-renderer/src/RenderableZoneEntityItem.h index d90993145e..1f3132746c 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.h +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.h @@ -56,7 +56,8 @@ private: template void changeProperties(Lambda functor); - + void notifyChangedRenderItem(); + void sceneUpdateRenderItemFromEntity(render::Transaction& transaction); void updateKeyLightItemFromEntity(KeyLightPayload& keylightPayload); diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 1d73902e8d..364321ddf0 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -71,8 +71,26 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class - bool somethingChangedInKeyLight = _keyLightProperties.setProperties(properties); - + if (somethingChanged) { + bool wantDebug = false; + if (wantDebug) { + uint64_t now = usecTimestampNow(); + int elapsed = now - getLastEdited(); + qCDebug(entities) << "ZoneEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << + "now=" << now << " getLastEdited()=" << getLastEdited(); + } + setLastEdited(properties._lastEdited); + } + + return somethingChanged; +} + +bool ZoneEntityItem::setSubClassProperties(const EntityItemProperties& properties) { + bool somethingChanged = EntityItem::setSubClassProperties(properties); // set the properties in our base class + + + _keyLightPropertiesChanged = _keyLightProperties.setProperties(properties); + bool somethingChangedInStage = _stageProperties.setProperties(properties); SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, setShapeType); @@ -85,18 +103,8 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChangedInSkybox = _skyboxProperties.setProperties(properties); - somethingChanged = somethingChanged || somethingChangedInKeyLight || somethingChangedInStage || somethingChangedInSkybox; + somethingChanged = somethingChanged || _keyLightPropertiesChanged || somethingChangedInStage || somethingChangedInSkybox; - if (somethingChanged) { - bool wantDebug = false; - if (wantDebug) { - uint64_t now = usecTimestampNow(); - int elapsed = now - getLastEdited(); - qCDebug(entities) << "ZoneEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << - "now=" << now << " getLastEdited()=" << getLastEdited(); - } - setLastEdited(properties._lastEdited); - } return somethingChanged; } @@ -185,6 +193,14 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_FILTER_URL, getFilterURL()); } +void ZoneEntityItem::somethingChangedNotification() { + EntityItem::somethingChangedNotification(); + withWriteLock([&] { + _keyLightPropertiesChanged = false; + _backgroundPropertiesChanged = false; + }); +} + void ZoneEntityItem::debugDump() const { quint64 now = usecTimestampNow(); qCDebug(entities) << " ZoneEntityItem id:" << getEntityItemID() << "---------------------------------------------"; diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index c868da0954..2ef0b33d51 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -29,10 +29,16 @@ public: // methods for getting/setting all properties of an entity virtual EntityItemProperties getProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()) const override; virtual bool setProperties(const EntityItemProperties& properties) override; + virtual bool setSubClassProperties(const EntityItemProperties& properties) override; // TODO: eventually only include properties changed since the params.nodeData->getLastTimeBagEmpty() time virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const override; + /// Override this in your derived class if you'd like to be informed when something about the state of the entity + /// has changed. This will be called with properties change or when new data is loaded from a stream + /// Overriding this function to capture the information that a keylight / Ambient / skybox properties has changed + virtual void somethingChangedNotification() override; + virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, EntityTreeElementExtraEncodeDataPointer modelTreeElementExtraEncodeData, EntityPropertyFlags& requestedProperties, @@ -106,6 +112,13 @@ protected: bool _ghostingAllowed { DEFAULT_GHOSTING_ALLOWED }; QString _filterURL { DEFAULT_FILTER_URL }; + // Dirty flags turn true when either keylight properties is changing values. + // This gets back to false in the somethingChangedNotification() call + // Which is called after a setProperties() or a readEntitySubClassFromBUfferCall on the entity. + bool _keyLightPropertiesChanged { false }; + bool _backgroundPropertiesChanged { false }; + + static bool _drawZoneBoundaries; static bool _zonesArePickable; }; diff --git a/scripts/developer/utilities/render/deferredLighting.qml b/scripts/developer/utilities/render/deferredLighting.qml index c1d8da3db1..730aa547e7 100644 --- a/scripts/developer/utilities/render/deferredLighting.qml +++ b/scripts/developer/utilities/render/deferredLighting.qml @@ -162,13 +162,9 @@ Column { } } + Row { Column { - id: metas - CheckBox { - text: "Metas" - checked: Render.getConfig("DrawMetaBounds")["enabled"] - onCheckedChanged: { Render.getConfig("DrawMetaBounds")["enabled"] = checked } - } + CheckBox { text: "Opaques" checked: Render.getConfig("DrawOpaqueBounds")["enabled"] @@ -189,6 +185,13 @@ Column { checked: Render.getConfig("DrawOverlayTransparentBounds")["enabled"] onCheckedChanged: { Render.getConfig("DrawOverlayTransparentBounds")["enabled"] = checked } } + } + Column { + CheckBox { + text: "Metas" + checked: Render.getConfig("DrawMetaBounds")["enabled"] + onCheckedChanged: { Render.getConfig("DrawMetaBounds")["enabled"] = checked } + } CheckBox { text: "Lights" checked: Render.getConfig("DrawLightBounds")["enabled"] @@ -200,5 +203,6 @@ Column { onCheckedChanged: { Render.getConfig("ZoneRenderer")["enabled"] = checked; Render.getConfig("DrawZones")["enabled"] = checked; } } } + } }