diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 1609052d54..bc1f614f79 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -853,3 +853,19 @@ void EntityTreeRenderer::updateEntityRenderStatus(bool shouldRenderEntities) { } } } + +void EntityTreeRenderer::updateZone(const EntityItemID& id) { + if (!_bestZone) { + // Get in the zone! + auto zone = getTree()->findEntityByEntityItemID(id); + if (zone && zone->contains(_lastAvatarPosition)) { + _currentEntitiesInside << id; + emit enterEntity(id); + _entitiesScriptEngine->callEntityScriptMethod(id, "enterEntity"); + _bestZone = std::dynamic_pointer_cast(zone); + } + } + if (_bestZone && _bestZone->getID() == id) { + applyZonePropertiesToScene(_bestZone); + } +} diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 60f65cabe7..5aadf7d299 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -109,6 +109,7 @@ public slots: void entitySciptChanging(const EntityItemID& entityID, const bool reload); void entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); void updateEntityRenderStatus(bool shouldRenderEntities); + void updateZone(const EntityItemID& id); // optional slots that can be wired to menu items void setDisplayModelBounds(bool value) { _displayModelBounds = value; } diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 44345ac0a2..ef47a777c2 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -18,6 +18,7 @@ #include #include +#include "EntityTreeRenderer.h" #include "RenderableEntityItem.h" // Sphere entities should fit inside a cube entity of the same size, so a sphere that has dimensions 1x1x1 @@ -62,6 +63,10 @@ bool RenderableZoneEntityItem::setProperties(const EntityItemProperties& propert return somethingChanged; } +void RenderableZoneEntityItem::somethingChangedNotification() { + DependencyManager::get()->updateZone(_id); +} + int RenderableZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData, diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.h b/libraries/entities-renderer/src/RenderableZoneEntityItem.h index 6eb829a48f..4ba862fff8 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.h +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.h @@ -28,6 +28,8 @@ public: { } virtual bool setProperties(const EntityItemProperties& properties); + virtual void somethingChangedNotification() override; + virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData,