From 6e23924ed9e4ae536685d57325a80eb0959ecd1a Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Mon, 25 Nov 2019 13:22:35 -0800 Subject: [PATCH 1/5] Add screenshare zone-property - WIP --- .../entities/src/EntityItemProperties.cpp | 23 +++++++++++++++++++ libraries/entities/src/EntityItemProperties.h | 3 +++ libraries/entities/src/EntityPropertyFlags.h | 3 +++ libraries/entities/src/ZoneEntityItem.cpp | 5 ++++ libraries/entities/src/ZoneEntityItem.h | 6 +++++ libraries/networking/src/udt/PacketHeaders.h | 1 + .../create/assets/data/createAppTooltips.json | 3 +++ scripts/system/create/edit.js | 3 ++- .../html/js/entityProperties.js | 6 +++++ 9 files changed, 52 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 319dfc922f..a3bb72fa51 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -299,6 +299,16 @@ void EntityItemProperties::setAvatarPriorityFromString(const QString& mode) { } } +QString EntityItemProperties::getScreenshareAsString() const { return getComponentModeAsString(_screenshare); } +void EntityItemProperties::setScreenshareFromString(const QString& mode) { + auto modeItr = stringToComponentMode.find(mode.toLower()); + if (modeItr != stringToComponentMode.end()) { + _screenshare = modeItr.value(); + _screenshareChanged = true; + } +} + + inline void addTextEffect(QHash& lookup, TextEffect effect) { lookup[TextEffectHelpers::getNameForTextEffect(effect)] = effect; } const QHash stringToTextEffectLookup = [] { QHash toReturn; @@ -566,6 +576,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_HAZE_MODE, hazeMode); CHECK_PROPERTY_CHANGE(PROP_BLOOM_MODE, bloomMode); CHECK_PROPERTY_CHANGE(PROP_AVATAR_PRIORITY, avatarPriority); + CHECK_PROPERTY_CHANGE(PROP_SCREENSHARE, screenshare); // Polyvox CHECK_PROPERTY_CHANGE(PROP_VOXEL_VOLUME_SIZE, voxelVolumeSize); @@ -1429,6 +1440,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { * @property {Entities.AvatarPriorityMode} avatarPriority="inherit" - Configures the priority of updates from avatars in the * zone to other clients. * + * @property {Entities.ScreenshareMode} screenshare="inherit" - Configures a zone for screen-sharing. + * * @example Create a zone that casts a red key light along the x-axis. * var zone = Entities.addEntity({ * type: "Zone", @@ -1779,6 +1792,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_HAZE_MODE, hazeMode, getHazeModeAsString()); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_BLOOM_MODE, bloomMode, getBloomModeAsString()); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_AVATAR_PRIORITY, avatarPriority, getAvatarPriorityAsString()); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SCREENSHARE, screenshare, getScreenshareAsString()); } // Web only @@ -2150,6 +2164,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(hazeMode, HazeMode); COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(bloomMode, BloomMode); COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(avatarPriority, AvatarPriority); + COPY_PROPERTY_FROM_QSCRIPTVALUE_ENUM(screenshare, Screenshare); // Polyvox COPY_PROPERTY_FROM_QSCRIPTVALUE(voxelVolumeSize, vec3, setVoxelVolumeSize); @@ -2438,6 +2453,7 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(hazeMode); COPY_PROPERTY_IF_CHANGED(bloomMode); COPY_PROPERTY_IF_CHANGED(avatarPriority); + COPY_PROPERTY_IF_CHANGED(screenshare); // Polyvox COPY_PROPERTY_IF_CHANGED(voxelVolumeSize); @@ -2834,6 +2850,7 @@ bool EntityItemProperties::getPropertyInfo(const QString& propertyName, EntityPr ADD_PROPERTY_TO_MAP(PROP_HAZE_MODE, HazeMode, hazeMode, uint32_t); ADD_PROPERTY_TO_MAP(PROP_BLOOM_MODE, BloomMode, bloomMode, uint32_t); ADD_PROPERTY_TO_MAP(PROP_AVATAR_PRIORITY, AvatarPriority, avatarPriority, uint32_t); + ADD_PROPERTY_TO_MAP(PROP_SCREENSHARE, Screenshare, screenshare, uint32_t); // Polyvox ADD_PROPERTY_TO_MAP(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, vec3); @@ -3252,6 +3269,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy APPEND_ENTITY_PROPERTY(PROP_HAZE_MODE, (uint32_t)properties.getHazeMode()); APPEND_ENTITY_PROPERTY(PROP_BLOOM_MODE, (uint32_t)properties.getBloomMode()); APPEND_ENTITY_PROPERTY(PROP_AVATAR_PRIORITY, (uint32_t)properties.getAvatarPriority()); + APPEND_ENTITY_PROPERTY(PROP_SCREENSHARE, (uint32_t)properties.getScreenshare()); } if (properties.getType() == EntityTypes::PolyVox) { @@ -3726,6 +3744,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_HAZE_MODE, uint32_t, setHazeMode); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BLOOM_MODE, uint32_t, setBloomMode); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_AVATAR_PRIORITY, uint32_t, setAvatarPriority); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SCREENSHARE, uint32_t, setScreenshare); } if (properties.getType() == EntityTypes::PolyVox) { @@ -4117,6 +4136,7 @@ void EntityItemProperties::markAllChanged() { _hazeModeChanged = true; _bloomModeChanged = true; _avatarPriorityChanged = true; + _screenshareChanged = true; // Polyvox _voxelVolumeSizeChanged = true; @@ -4739,6 +4759,9 @@ QList EntityItemProperties::listChangedProperties() { if (avatarPriorityChanged()) { out += "avatarPriority"; } + if (screenshareChanged()) { + out += "screenshare"; + } // Polyvox if (voxelVolumeSizeChanged()) { diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 63d8183899..fbd941bd85 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -337,6 +337,7 @@ public: DEFINE_PROPERTY_REF_ENUM(PROP_HAZE_MODE, HazeMode, hazeMode, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT); DEFINE_PROPERTY_REF_ENUM(PROP_BLOOM_MODE, BloomMode, bloomMode, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT); DEFINE_PROPERTY_REF_ENUM(PROP_AVATAR_PRIORITY, AvatarPriority, avatarPriority, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT); + DEFINE_PROPERTY_REF_ENUM(PROP_SCREENSHARE, Screenshare, screenshare, uint32_t, (uint32_t)COMPONENT_MODE_INHERIT); // Polyvox DEFINE_PROPERTY_REF(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, glm::vec3, PolyVoxEntityItem::DEFAULT_VOXEL_VOLUME_SIZE); @@ -699,6 +700,8 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, AvatarPriority, avatarPriority, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, Screenshare, screenshare, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, EntityHostTypeAsString, entityHostType, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, OwningAvatarID, owningAvatarID, ""); diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index d5af337a7d..1ffd8fdc3c 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -161,6 +161,7 @@ enum EntityPropertyList { PROP_DERIVED_31, PROP_DERIVED_32, PROP_DERIVED_33, + PROP_DERIVED_34, PROP_AFTER_LAST_ITEM, @@ -290,6 +291,8 @@ enum EntityPropertyList { PROP_BLOOM_MODE = PROP_DERIVED_32, // Avatar priority PROP_AVATAR_PRIORITY = PROP_DERIVED_33, + // Screen-sharing + PROP_SCREENSHARE = PROP_DERIVED_34, // Polyvox PROP_VOXEL_VOLUME_SIZE = PROP_DERIVED_0, diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index d54998e74f..4030291a44 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -71,6 +71,7 @@ EntityItemProperties ZoneEntityItem::getProperties(const EntityPropertyFlags& de COPY_ENTITY_PROPERTY_TO_PROPERTIES(hazeMode, getHazeMode); COPY_ENTITY_PROPERTY_TO_PROPERTIES(bloomMode, getBloomMode); COPY_ENTITY_PROPERTY_TO_PROPERTIES(avatarPriority, getAvatarPriority); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(screenshare, getScreenshare); return properties; } @@ -118,6 +119,7 @@ bool ZoneEntityItem::setSubClassProperties(const EntityItemProperties& propertie SET_ENTITY_PROPERTY_FROM_PROPERTIES(hazeMode, setHazeMode); SET_ENTITY_PROPERTY_FROM_PROPERTIES(bloomMode, setBloomMode); SET_ENTITY_PROPERTY_FROM_PROPERTIES(avatarPriority, setAvatarPriority); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(screenshare, setScreenshare); somethingChanged = somethingChanged || _keyLightPropertiesChanged || _ambientLightPropertiesChanged || _skyboxPropertiesChanged || _hazePropertiesChanged || _bloomPropertiesChanged; @@ -194,6 +196,7 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_HAZE_MODE, uint32_t, setHazeMode); READ_ENTITY_PROPERTY(PROP_BLOOM_MODE, uint32_t, setBloomMode); READ_ENTITY_PROPERTY(PROP_AVATAR_PRIORITY, uint32_t, setAvatarPriority); + READ_ENTITY_PROPERTY(PROP_SCREENSHARE, uint32_t, setScreenshare); return bytesRead; } @@ -214,6 +217,7 @@ EntityPropertyFlags ZoneEntityItem::getEntityProperties(EncodeBitstreamParams& p requestedProperties += PROP_GHOSTING_ALLOWED; requestedProperties += PROP_FILTER_URL; requestedProperties += PROP_AVATAR_PRIORITY; + requestedProperties += PROP_SCREENSHARE; requestedProperties += PROP_KEY_LIGHT_MODE; requestedProperties += PROP_AMBIENT_LIGHT_MODE; @@ -260,6 +264,7 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_HAZE_MODE, (uint32_t)getHazeMode()); APPEND_ENTITY_PROPERTY(PROP_BLOOM_MODE, (uint32_t)getBloomMode()); APPEND_ENTITY_PROPERTY(PROP_AVATAR_PRIORITY, getAvatarPriority()); + APPEND_ENTITY_PROPERTY(PROP_SCREENSHARE, getScreenshare()); } void ZoneEntityItem::debugDump() const { diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index d6647e701e..295727d657 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -102,6 +102,9 @@ public: uint32_t getAvatarPriority() const { return _avatarPriority; } void setAvatarPriority(uint32_t value) { _avatarPriority = value; } + uint32_t getScreenshare() const { return _screenshare; } + void setScreenshare(uint32_t value) { _screenshare = value; } + bool keyLightPropertiesChanged() const { return _keyLightPropertiesChanged; } bool ambientLightPropertiesChanged() const { return _ambientLightPropertiesChanged; } bool skyboxPropertiesChanged() const { return _skyboxPropertiesChanged; } @@ -156,6 +159,9 @@ protected: // Avatar-updates priority uint32_t _avatarPriority { COMPONENT_MODE_INHERIT }; + // Screen-sharing zone + uint32_t _screenshare { COMPONENT_MODE_INHERIT }; + // Dirty flags turn true when either keylight properties is changing values. bool _keyLightPropertiesChanged { false }; bool _ambientLightPropertiesChanged { false }; diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 75904d8122..805e5d3a09 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -277,6 +277,7 @@ enum class EntityVersion : PacketVersion { ShadowBiasAndDistance, TextEntityFonts, ScriptServerKinematicMotion, + ScreenshareZone, // Add new versions above here NUM_PACKET_TYPE, diff --git a/scripts/system/create/assets/data/createAppTooltips.json b/scripts/system/create/assets/data/createAppTooltips.json index 8b160e0630..da12d2d503 100644 --- a/scripts/system/create/assets/data/createAppTooltips.json +++ b/scripts/system/create/assets/data/createAppTooltips.json @@ -147,6 +147,9 @@ "avatarPriority": { "tooltip": "Alter Avatars' update priorities." }, + "screenshare": { + "tooltip": "Enable screen-sharing within this zone" + }, "modelURL": { "tooltip": "A mesh model from an FBX or OBJ file." }, diff --git a/scripts/system/create/edit.js b/scripts/system/create/edit.js index 828fd70e6f..ee4a11f91a 100644 --- a/scripts/system/create/edit.js +++ b/scripts/system/create/edit.js @@ -393,7 +393,8 @@ const DEFAULT_ENTITY_PROPERTIES = { }, shapeType: "box", bloomMode: "inherit", - avatarPriority: "inherit" + avatarPriority: "inherit", + screenshare: "inherit", }, Model: { collisionShape: "none", diff --git a/scripts/system/create/entityProperties/html/js/entityProperties.js b/scripts/system/create/entityProperties/html/js/entityProperties.js index b5a9b77bf4..64d44cc270 100644 --- a/scripts/system/create/entityProperties/html/js/entityProperties.js +++ b/scripts/system/create/entityProperties/html/js/entityProperties.js @@ -497,6 +497,12 @@ const GROUPS = [ options: { inherit: "Inherit", crowd: "Crowd", hero: "Hero" }, propertyID: "avatarPriority", }, + { + label: "Screen-share", + type: "dropdown", + options: { inherit: "Inherit", disabled: "Off", enabled: "On" }, + propertyID: "screenshare", + } ] }, From 6b371ec38824c615908b8ad18ab03eecddbda045 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Mon, 25 Nov 2019 18:30:53 -0800 Subject: [PATCH 2/5] Changes to avatar mixer to use screenshare zones --- .../src/avatars/AvatarMixerClientData.cpp | 96 ++++++++++--------- libraries/entities/src/ZoneEntityItem.cpp | 4 +- 2 files changed, 52 insertions(+), 48 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index ea5246c59a..aeac279a95 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -23,8 +23,7 @@ #include "AvatarMixerSlave.h" -AvatarMixerClientData::AvatarMixerClientData(const QUuid& nodeID, Node::LocalID nodeLocalID) : - NodeData(nodeID, nodeLocalID) { +AvatarMixerClientData::AvatarMixerClientData(const QUuid& nodeID, Node::LocalID nodeLocalID) : NodeData(nodeID, nodeLocalID) { // in case somebody calls getSessionUUID on the AvatarData instance, make sure it has the right ID _avatar->setID(nodeID); } @@ -92,41 +91,46 @@ int AvatarMixerClientData::processPackets(const SlaveSharedData& slaveSharedData } namespace { - using std::static_pointer_cast; +using std::static_pointer_cast; - // Operator to find if a point is within an avatar-priority (hero) Zone Entity. - struct FindPriorityZone { - glm::vec3 position; - bool isInPriorityZone { false }; - float zoneVolume { std::numeric_limits::max() }; - EntityItemID id {}; +// Operator to find if a point is within an avatar-priority (hero) Zone Entity. +struct FindContainingZone { + glm::vec3 position; + bool isInPriorityZone { false }; + bool isInScreenshareZone { false }; + float priorityZoneVolume { std::numeric_limits::max() }; + float screenshareZoneVolume { priorityZoneVolume }; + EntityItemID id{}; - static bool operation(const OctreeElementPointer& element, void* extraData) { - auto findPriorityZone = static_cast(extraData); - if (element->getAACube().contains(findPriorityZone->position)) { - const EntityTreeElementPointer entityTreeElement = static_pointer_cast(element); - entityTreeElement->forEachEntity([&findPriorityZone](EntityItemPointer item) { - if (item->getType() == EntityTypes::Zone - && item->contains(findPriorityZone->position)) { - auto zoneItem = static_pointer_cast(item); - if (zoneItem->getAvatarPriority() != COMPONENT_MODE_INHERIT) { - float volume = zoneItem->getVolumeEstimate(); - if (volume < findPriorityZone->zoneVolume) { // Smaller volume wins - findPriorityZone->isInPriorityZone = zoneItem->getAvatarPriority() == COMPONENT_MODE_ENABLED; - findPriorityZone->zoneVolume = volume; - findPriorityZone->id = zoneItem->getEntityItemID(); - } + static bool operation(const OctreeElementPointer& element, void* extraData) { + auto findContainingZone = static_cast(extraData); + if (element->getAACube().contains(findContainingZone->position)) { + const EntityTreeElementPointer entityTreeElement = static_pointer_cast(element); + entityTreeElement->forEachEntity([&findContainingZone](EntityItemPointer item) { + if (item->getType() == EntityTypes::Zone && item->contains(findContainingZone->position)) { + auto zoneItem = static_pointer_cast(item); + if (zoneItem->getAvatarPriority() != COMPONENT_MODE_INHERIT) { + float volume = zoneItem->getVolumeEstimate(); + if (volume < findContainingZone->priorityZoneVolume) { // Smaller volume wins + findContainingZone->isInPriorityZone = zoneItem->getAvatarPriority() == COMPONENT_MODE_ENABLED; + findContainingZone->priorityZoneVolume = volume; + } + if (volume < findContainingZone->screenshareZoneVolume) { + findContainingZone->isInScreenshareZone = zoneItem->getScreenshare() == COMPONENT_MODE_ENABLED; + findContainingZone->screenshareZoneVolume = volume; + findContainingZone->id = zoneItem->getEntityItemID(); } } - }); - return true; // Keep recursing - } else { // Position isn't within this subspace, so end recursion. - return false; - } + } + }); + return true; // Keep recursing + } else { // Position isn't within this subspace, so end recursion. + return false; } - }; + } +}; -} // Close anonymous namespace. +} // namespace int AvatarMixerClientData::parseData(ReceivedMessage& message, const SlaveSharedData& slaveSharedData) { // pull the sequence number from the data first @@ -152,15 +156,17 @@ int AvatarMixerClientData::parseData(ReceivedMessage& message, const SlaveShared auto newPosition = _avatar->getClientGlobalPosition(); if (newPosition != oldPosition || _avatar->getNeedsHeroCheck()) { EntityTree& entityTree = *slaveSharedData.entityTree; - FindPriorityZone findPriorityZone { newPosition } ; - entityTree.recurseTreeWithOperation(&FindPriorityZone::operation, &findPriorityZone); - bool currentlyHasPriority = findPriorityZone.isInPriorityZone; + FindContainingZone findContainingZone{ newPosition }; + entityTree.recurseTreeWithOperation(&FindContainingZone::operation, &findContainingZone); + bool currentlyHasPriority = findContainingZone.isInPriorityZone; if (currentlyHasPriority != _avatar->getHasPriority()) { _avatar->setHasPriority(currentlyHasPriority); + } + if (findContainingZone.isInScreenshareZone) { auto nodeList = DependencyManager::get(); auto packet = NLPacket::create(PacketType::AvatarZonePresence, 2 * NUM_BYTES_RFC4122_UUID, true); packet->write(_avatar->getSessionUUID().toRfc4122()); - packet->write(findPriorityZone.id.toRfc4122()); + packet->write(findContainingZone.id.toRfc4122()); nodeList->sendPacket(std::move(packet), nodeList->getDomainSockAddr()); } _avatar->setNeedsHeroCheck(false); @@ -227,8 +233,7 @@ void AvatarMixerClientData::processSetTraitsMessage(ReceivedMessage& message, } } else { // Trying to read more bytes than available, bail - if (message.getBytesLeftToRead() < qint64(NUM_BYTES_RFC4122_UUID + - sizeof(AvatarTraits::TraitWireSize))) { + if (message.getBytesLeftToRead() < qint64(NUM_BYTES_RFC4122_UUID + sizeof(AvatarTraits::TraitWireSize))) { qWarning() << "Refusing to process malformed traits packet from" << message.getSenderSockAddr(); return; } @@ -244,8 +249,7 @@ void AvatarMixerClientData::processSetTraitsMessage(ReceivedMessage& message, break; } - if (traitType == AvatarTraits::AvatarEntity || - traitType == AvatarTraits::Grab) { + if (traitType == AvatarTraits::AvatarEntity || traitType == AvatarTraits::Grab) { auto& instanceVersionRef = _lastReceivedTraitVersions.getInstanceValueRef(traitType, instanceID); if (packetTraitVersion > instanceVersionRef) { @@ -303,7 +307,8 @@ void AvatarMixerClientData::processBulkAvatarTraitsAckMessage(ReceivedMessage& m auto simpleReceivedIt = traitVersions.simpleCBegin(); while (simpleReceivedIt != traitVersions.simpleCEnd()) { if (*simpleReceivedIt != AvatarTraits::DEFAULT_TRAIT_VERSION) { - auto traitType = static_cast(std::distance(traitVersions.simpleCBegin(), simpleReceivedIt)); + auto traitType = + static_cast(std::distance(traitVersions.simpleCBegin(), simpleReceivedIt)); _perNodeAckedTraitVersions[nodeId][traitType] = *simpleReceivedIt; } simpleReceivedIt++; @@ -361,8 +366,8 @@ void AvatarMixerClientData::checkSkeletonURLAgainstWhitelist(const SlaveSharedDa // make sure we're not unecessarily overriding the default avatar with the default avatar if (_avatar->getWireSafeSkeletonModelURL() != slaveSharedData.skeletonReplacementURL) { // we need to change this avatar's skeleton URL, and send them a traits packet informing them of the change - qDebug() << "Overwriting avatar URL" << _avatar->getWireSafeSkeletonModelURL() - << "to replacement" << slaveSharedData.skeletonReplacementURL << "for" << sendingNode.getUUID(); + qDebug() << "Overwriting avatar URL" << _avatar->getWireSafeSkeletonModelURL() << "to replacement" + << slaveSharedData.skeletonReplacementURL << "for" << sendingNode.getUUID(); _avatar->setSkeletonModelURL(slaveSharedData.skeletonReplacementURL); auto packet = NLPacket::create(PacketType::SetAvatarTraits, -1, true); @@ -463,9 +468,7 @@ void AvatarMixerClientData::readViewFrustumPacket(const QByteArray& message) { bool AvatarMixerClientData::otherAvatarInView(const AABox& otherAvatarBox) { return std::any_of(std::begin(_currentViewFrustums), std::end(_currentViewFrustums), - [&](const ConicalViewFrustum& viewFrustum) { - return viewFrustum.intersects(otherAvatarBox); - }); + [&](const ConicalViewFrustum& viewFrustum) { return viewFrustum.intersects(otherAvatarBox); }); } void AvatarMixerClientData::loadJSONStats(QJsonObject& jsonObject) const { @@ -484,7 +487,8 @@ void AvatarMixerClientData::loadJSONStats(QJsonObject& jsonObject) const { jsonObject["recent_other_av_out_of_view"] = _recentOtherAvatarsOutOfView; } -AvatarMixerClientData::TraitsCheckTimestamp AvatarMixerClientData::getLastOtherAvatarTraitsSendPoint(Node::LocalID otherAvatar) const { +AvatarMixerClientData::TraitsCheckTimestamp AvatarMixerClientData::getLastOtherAvatarTraitsSendPoint( + Node::LocalID otherAvatar) const { auto it = _lastSentTraitsTimestamps.find(otherAvatar); if (it != _lastSentTraitsTimestamps.end()) { diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 4030291a44..1ddc972029 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -476,9 +476,9 @@ bool ZoneEntityItem::matchesJSONFilters(const QJsonObject& jsonFilters) const { static const QString AVATAR_PRIORITY_PROPERTY = "avatarPriority"; - // If set ignore only priority-inherit zones: + // If set match zones of interest to avatar mixer: if (jsonFilters.contains(AVATAR_PRIORITY_PROPERTY) && jsonFilters[AVATAR_PRIORITY_PROPERTY].toBool() - && _avatarPriority != COMPONENT_MODE_INHERIT) { + && (_avatarPriority != COMPONENT_MODE_INHERIT || _screenshare != COMPONENT_MODE_INHERIT)) { return true; } From 8b2fc968f63c67edf013f27e5ce00ab0fb8fd2b3 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 26 Nov 2019 13:32:50 -0800 Subject: [PATCH 3/5] Fix logic in zone-checking code, other clean-up --- .../src/avatars/AvatarMixerClientData.cpp | 40 +++++++++++-------- assignment-client/src/avatars/MixerAvatar.h | 4 ++ 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index aeac279a95..8f62fe6bc9 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -100,7 +100,7 @@ struct FindContainingZone { bool isInScreenshareZone { false }; float priorityZoneVolume { std::numeric_limits::max() }; float screenshareZoneVolume { priorityZoneVolume }; - EntityItemID id{}; + EntityItemID screenshareZoneid{}; static bool operation(const OctreeElementPointer& element, void* extraData) { auto findContainingZone = static_cast(extraData); @@ -109,17 +109,19 @@ struct FindContainingZone { entityTreeElement->forEachEntity([&findContainingZone](EntityItemPointer item) { if (item->getType() == EntityTypes::Zone && item->contains(findContainingZone->position)) { auto zoneItem = static_pointer_cast(item); - if (zoneItem->getAvatarPriority() != COMPONENT_MODE_INHERIT) { - float volume = zoneItem->getVolumeEstimate(); - if (volume < findContainingZone->priorityZoneVolume) { // Smaller volume wins - findContainingZone->isInPriorityZone = zoneItem->getAvatarPriority() == COMPONENT_MODE_ENABLED; - findContainingZone->priorityZoneVolume = volume; - } - if (volume < findContainingZone->screenshareZoneVolume) { - findContainingZone->isInScreenshareZone = zoneItem->getScreenshare() == COMPONENT_MODE_ENABLED; + auto avatarPriorityProperty = zoneItem->getAvatarPriority(); + auto screenshareProperty = zoneItem->getScreenshare(); + float volume = zoneItem->getVolumeEstimate(); + if (avatarPriorityProperty != COMPONENT_MODE_INHERIT + && volume < findContainingZone->priorityZoneVolume) { // Smaller volume wins + findContainingZone->isInPriorityZone = avatarPriorityProperty == COMPONENT_MODE_ENABLED; + findContainingZone->priorityZoneVolume = volume; + } + if (screenshareProperty != COMPONENT_MODE_INHERIT + && volume < findContainingZone->screenshareZoneVolume) { + findContainingZone->isInScreenshareZone = screenshareProperty == COMPONENT_MODE_ENABLED; findContainingZone->screenshareZoneVolume = volume; - findContainingZone->id = zoneItem->getEntityItemID(); - } + findContainingZone->screenshareZoneid = zoneItem->getEntityItemID(); } } }); @@ -162,12 +164,16 @@ int AvatarMixerClientData::parseData(ReceivedMessage& message, const SlaveShared if (currentlyHasPriority != _avatar->getHasPriority()) { _avatar->setHasPriority(currentlyHasPriority); } - if (findContainingZone.isInScreenshareZone) { - auto nodeList = DependencyManager::get(); - auto packet = NLPacket::create(PacketType::AvatarZonePresence, 2 * NUM_BYTES_RFC4122_UUID, true); - packet->write(_avatar->getSessionUUID().toRfc4122()); - packet->write(findContainingZone.id.toRfc4122()); - nodeList->sendPacket(std::move(packet), nodeList->getDomainSockAddr()); + bool isInScreenshareZone = findContainingZone.isInScreenshareZone; + if (isInScreenshareZone != _avatar->isInScreenshareZone()) { + _avatar->setInScreenshareZone(isInScreenshareZone); + if (isInScreenshareZone) { + auto nodeList = DependencyManager::get(); + auto packet = NLPacket::create(PacketType::AvatarZonePresence, 2 * NUM_BYTES_RFC4122_UUID, true); + packet->write(_avatar->getSessionUUID().toRfc4122()); + packet->write(findContainingZone.screenshareZoneid.toRfc4122()); + nodeList->sendPacket(std::move(packet), nodeList->getDomainSockAddr()); + } } _avatar->setNeedsHeroCheck(false); } diff --git a/assignment-client/src/avatars/MixerAvatar.h b/assignment-client/src/avatars/MixerAvatar.h index ec24d4e6bc..57daef021d 100644 --- a/assignment-client/src/avatars/MixerAvatar.h +++ b/assignment-client/src/avatars/MixerAvatar.h @@ -43,6 +43,9 @@ public: }; Q_ENUM(VerifyState) + bool isInScreenshareZone() const { return _inScreenshareZone; } + void setInScreenshareZone(bool value = true) { _inScreenshareZone = value; } + private: bool _needsHeroCheck { false }; static const char* stateToName(VerifyState state); @@ -65,6 +68,7 @@ private: int _numberChallenges { 0 }; bool _certifyFailed { false }; bool _needsIdentityUpdate { false }; + bool _inScreenshareZone { false }; bool generateFSTHash(); bool validateFSTHash(const QString& publicKey) const; From 65fcf898bee3579cdc536836edba3870f0733f52 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 26 Nov 2019 13:40:37 -0800 Subject: [PATCH 4/5] Use null zone id for leaving a screen zone --- .../src/avatars/AvatarMixerClientData.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index 8f62fe6bc9..5fdbd4cc9a 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -167,13 +167,12 @@ int AvatarMixerClientData::parseData(ReceivedMessage& message, const SlaveShared bool isInScreenshareZone = findContainingZone.isInScreenshareZone; if (isInScreenshareZone != _avatar->isInScreenshareZone()) { _avatar->setInScreenshareZone(isInScreenshareZone); - if (isInScreenshareZone) { - auto nodeList = DependencyManager::get(); - auto packet = NLPacket::create(PacketType::AvatarZonePresence, 2 * NUM_BYTES_RFC4122_UUID, true); - packet->write(_avatar->getSessionUUID().toRfc4122()); - packet->write(findContainingZone.screenshareZoneid.toRfc4122()); - nodeList->sendPacket(std::move(packet), nodeList->getDomainSockAddr()); - } + const QUuid& zoneId = isInScreenshareZone ? findContainingZone.screenshareZoneid : QUuid(); + auto nodeList = DependencyManager::get(); + auto packet = NLPacket::create(PacketType::AvatarZonePresence, 2 * NUM_BYTES_RFC4122_UUID, true); + packet->write(_avatar->getSessionUUID().toRfc4122()); + packet->write(zoneId.toRfc4122()); + nodeList->sendPacket(std::move(packet), nodeList->getDomainSockAddr()); } _avatar->setNeedsHeroCheck(false); } From e3ae92ec84034ae13dd66702ee1e5d2aa03d4457 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 26 Nov 2019 16:06:25 -0800 Subject: [PATCH 5/5] Send notification whenever screen-share zone changes --- assignment-client/src/avatars/AvatarMixerClientData.cpp | 4 +++- assignment-client/src/avatars/MixerAvatar.h | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index 5fdbd4cc9a..f86dc7f766 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -165,8 +165,10 @@ int AvatarMixerClientData::parseData(ReceivedMessage& message, const SlaveShared _avatar->setHasPriority(currentlyHasPriority); } bool isInScreenshareZone = findContainingZone.isInScreenshareZone; - if (isInScreenshareZone != _avatar->isInScreenshareZone()) { + if (isInScreenshareZone != _avatar->isInScreenshareZone() + || findContainingZone.screenshareZoneid != _avatar->getScreenshareZone()) { _avatar->setInScreenshareZone(isInScreenshareZone); + _avatar->setScreenshareZone(findContainingZone.screenshareZoneid); const QUuid& zoneId = isInScreenshareZone ? findContainingZone.screenshareZoneid : QUuid(); auto nodeList = DependencyManager::get(); auto packet = NLPacket::create(PacketType::AvatarZonePresence, 2 * NUM_BYTES_RFC4122_UUID, true); diff --git a/assignment-client/src/avatars/MixerAvatar.h b/assignment-client/src/avatars/MixerAvatar.h index 57daef021d..09a3522067 100644 --- a/assignment-client/src/avatars/MixerAvatar.h +++ b/assignment-client/src/avatars/MixerAvatar.h @@ -45,6 +45,8 @@ public: bool isInScreenshareZone() const { return _inScreenshareZone; } void setInScreenshareZone(bool value = true) { _inScreenshareZone = value; } + const QUuid& getScreenshareZone() const { return _screenshareZone; } + void setScreenshareZone(QUuid zone) { _screenshareZone = zone; } private: bool _needsHeroCheck { false }; @@ -69,6 +71,7 @@ private: bool _certifyFailed { false }; bool _needsIdentityUpdate { false }; bool _inScreenshareZone { false }; + QUuid _screenshareZone; bool generateFSTHash(); bool validateFSTHash(const QString& publicKey) const;