From a896e9872cb27a4077120e8d3addc5e1f8f5a54d Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 14 Mar 2018 17:09:23 -0700 Subject: [PATCH 01/53] adressing the avatar vissibility switch --- interface/src/avatar/MyAvatar.cpp | 3 ++- .../avatars-renderer/src/avatars-renderer/Avatar.cpp | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 9620a2dcec..f18b2ed42c 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1114,7 +1114,8 @@ void MyAvatar::setEnableDebugDrawIKChains(bool isEnabled) { } void MyAvatar::setEnableMeshVisible(bool isEnabled) { - _skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); + // TODO: This should tell the main MetaRenderItem of the Avatar to be hidden to control vsisiblity since the model is culled by the MetaRI. + _skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); } void MyAvatar::setEnableInverseKinematics(bool isEnabled) { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 65145d4c88..f90f3660a0 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -52,7 +52,13 @@ const glm::vec3 HAND_TO_PALM_OFFSET(0.0f, 0.12f, 0.08f); namespace render { template <> const ItemKey payloadGetKey(const AvatarSharedPointer& avatar) { - return ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1).withMetaCullGroup(); + ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1).withMetaCullGroup(); + auto avatarPtr = static_pointer_cast(avatar); + auto model = avatarPtr->getSkeletonModel(); + if (model && !model->isVisible()) { + keyBuilder.withInvisible(); + } + return keyBuilder.build(); } template <> const Item::Bound payloadGetBound(const AvatarSharedPointer& avatar) { return static_pointer_cast(avatar)->getBounds(); From 2fc23d799ad8fbca48e795835546662e90744c26 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 15 Mar 2018 18:05:58 -0700 Subject: [PATCH 02/53] adding the correct flag maybe? --- libraries/render-utils/src/CauterizedModel.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 1596f7ba83..3c6a0df850 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -220,6 +220,7 @@ void CauterizedModel::updateRenderItems() { bool isLayeredInFront = self->isLayeredInFront(); bool isLayeredInHUD = self->isLayeredInHUD(); bool enableCauterization = self->getEnableCauterization(); + bool isGroupCulled = self->isGroupCulled(); render::Transaction transaction; for (int i = 0; i < (int)self->_modelMeshRenderItemIDs.size(); i++) { @@ -234,7 +235,7 @@ void CauterizedModel::updateRenderItems() { bool useDualQuaternionSkinning = self->getUseDualQuaternionSkinning(); transaction.updateItem(itemID, [modelTransform, meshState, useDualQuaternionSkinning, cauterizedMeshState, invalidatePayloadShapeKey, - isWireframe, isVisible, isLayeredInFront, isLayeredInHUD, canCastShadow, enableCauterization](CauterizedMeshPartPayload& data) { + isWireframe, isVisible, isLayeredInFront, isLayeredInHUD, canCastShadow, enableCauterization, isGroupCulled](CauterizedMeshPartPayload& data) { if (useDualQuaternionSkinning) { data.updateClusterBuffer(meshState.clusterDualQuaternions, cauterizedMeshState.clusterDualQuaternions); @@ -276,7 +277,7 @@ void CauterizedModel::updateRenderItems() { data.updateTransformForCauterizedMesh(renderTransform); data.setEnableCauterization(enableCauterization); - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, render::ItemKey::TAG_BITS_ALL); + data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, render::ItemKey::TAG_BITS_ALL, isGroupCulled); data.setLayer(isLayeredInFront, isLayeredInHUD); data.setShapeKey(invalidatePayloadShapeKey, isWireframe, useDualQuaternionSkinning); }); From 986318ccfdfe367c08756dbde6ad9caff03bdf41 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Mon, 14 May 2018 16:33:28 -0700 Subject: [PATCH 03/53] Adding preliminary scripts to repro getChildren issue. --- scripts/defaultScripts.js | 4 ++- scripts/system/createobject.js | 60 ++++++++++++++++++++++++++++++++++ scripts/system/deleteobject.js | 41 +++++++++++++++++++++++ 3 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 scripts/system/createobject.js create mode 100644 scripts/system/deleteobject.js diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js index 71755e3abb..13994a7e3c 100644 --- a/scripts/defaultScripts.js +++ b/scripts/defaultScripts.js @@ -30,7 +30,9 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/dialTone.js", "system/firstPersonHMD.js", "system/tablet-ui/tabletUI.js", - "system/emote.js" + "system/emote.js", + "system/createobject.js", + "system/deleteobject.js" ]; var DEFAULT_SCRIPTS_SEPARATE = [ "system/controllers/controllerScripts.js" diff --git a/scripts/system/createobject.js b/scripts/system/createobject.js new file mode 100644 index 0000000000..527bf64315 --- /dev/null +++ b/scripts/system/createobject.js @@ -0,0 +1,60 @@ +(function(){ + var button; + var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); + + function createEntity(description, position, parent) { + var entity = Entities.addEntity({ + type: "Sphere", + position: position, + dimensions: Vec3.HALF, + dynamic: true, + collisionless: true, + parentID: parent, + lifetime: 300 // Delete after 5 minutes. + }); + print(description + ": " + entity); + return entity; + } + + + function createBabies() { + var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, {x: 0, y: 2, z: -5})); + var root = createEntity("Root", position, Uuid.NULL); + var ctr; + var avatarChildren = []; + // make five children. + for(var ctr = 0; ctr < 5; ctr++) { + avatarChildren.append(CreateEntity("Child" + ctr, Vec3.sum(position, { x: ctr, y: -1, z: ctr }), root)); + }} + + button = tablet.addButton({ + icon: "icons/tablet-icons/clap-i.svg", + text: "Create OBJ", + sortOrder: 1 + }); + + button.clicked.connect(createBabies); + + Script.scriptEnding.connect(function () { + button.clicked.disconnect(createBabies); + if (tablet) { + tablet.removeButton(button); + } + }); + +/* var entityID = Entities.addEntity({*/ + //type: "Box", + //position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), + //dimensions: { x: 0.5, y: 0.5, z: 0.5 }, + //dynamic: true, + //collisionless: false, + //userData: "{ \"grabbableKey\": { \"grabbable\": true, \"kinematic\": false } }", + //lifetime: 300 // Delete after 5 minutes. + //}); + + /*var actionID = Entities.addAction("slider", entityID, {*/ + //axis: { x: 0, y: 1, z: 0 }, + //linearLow: 0, + //linearHigh: 0.6 + /*});*/ +}()); diff --git a/scripts/system/deleteobject.js b/scripts/system/deleteobject.js new file mode 100644 index 0000000000..2c366b5546 --- /dev/null +++ b/scripts/system/deleteobject.js @@ -0,0 +1,41 @@ +(function(){ + var button; + var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); + + function destroyBabies() { + var avatarEntityID = + for(var ctr = 0; ctr < getChildrenIDs(); ctr++) { + avatarChildren.append(CreateEntity("Child" + ctr, Vec3.sum(position, { x: ctr, y: -1, z: ctr }), root)); + }} + + button = tablet.addButton({ + icon: "icons/tablet-icons/clap-i.svg", + text: "Destroy OBJ", + sortOrder: 1 + }); + + button.clicked.connect(createBabies); + + Script.scriptEnding.connect(function () { + button.clicked.disconnect(createBabies); + if (tablet) { + tablet.removeButton(button); + } + }); + +/* var entityID = Entities.addEntity({*/ + //type: "Box", + //position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), + //dimensions: { x: 0.5, y: 0.5, z: 0.5 }, + //dynamic: true, + //collisionless: false, + //userData: "{ \"grabbableKey\": { \"grabbable\": true, \"kinematic\": false } }", + //lifetime: 300 // Delete after 5 minutes. + //}); + + /*var actionID = Entities.addAction("slider", entityID, {*/ + //axis: { x: 0, y: 1, z: 0 }, + //linearLow: 0, + //linearHigh: 0.6 + /*});*/ +}()); From bd6905b3d2c73d75d281cd0d0a98db7aa8b943a2 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Mon, 14 May 2018 18:25:39 -0700 Subject: [PATCH 04/53] Adding possible solution to issue#1934. --- .../entities/src/EntityScriptingInterface.cpp | 28 +++++-- scripts/defaultScripts.js | 3 +- scripts/system/createobject.js | 77 ++++++++++++++----- scripts/system/deleteobject.js | 15 ++-- 4 files changed, 85 insertions(+), 38 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 7c16214a78..65bacfec5a 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1660,14 +1660,28 @@ QVector EntityScriptingInterface::getChildrenIDs(const QUuid& parentID) { return result; } - EntityItemPointer entity = _entityTree->findEntityByEntityItemID(parentID); - if (!entity) { - qCDebug(entities) << "EntityScriptingInterface::getChildrenIDs - no entity with ID" << parentID; - return result; - } - + //EntityItemPointer entity = _entityTree->findEntityByEntityItemID(parentID); + //if (!entity) { + // qCDebug(entities) << "EntityScriptingInterface::getChildrenIDs - no entity with ID" << parentID; + // return result; + //} _entityTree->withReadLock([&] { - entity->forEachChild([&](SpatiallyNestablePointer child) { + QSharedPointer parentFinder = DependencyManager::get(); + if (!parentFinder) { + return; + } + bool success; + SpatiallyNestableWeakPointer parentWP = parentFinder->find(parentID, success); + if (!success) { + return; + } + SpatiallyNestablePointer parent = parentWP.lock(); + if (!parent) { + return; + } + //_entityTree->withReadLock([&] { + //entity->forEachChild([&](SpatiallyNestablePointer child) { + parent->forEachChild([&](SpatiallyNestablePointer child) { result.push_back(child->getID()); }); }); diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js index 13994a7e3c..12e9a4fd58 100644 --- a/scripts/defaultScripts.js +++ b/scripts/defaultScripts.js @@ -31,8 +31,7 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/firstPersonHMD.js", "system/tablet-ui/tabletUI.js", "system/emote.js", - "system/createobject.js", - "system/deleteobject.js" + "system/createobject.js" ]; var DEFAULT_SCRIPTS_SEPARATE = [ "system/controllers/controllerScripts.js" diff --git a/scripts/system/createobject.js b/scripts/system/createobject.js index 527bf64315..887313130c 100644 --- a/scripts/system/createobject.js +++ b/scripts/system/createobject.js @@ -3,34 +3,69 @@ var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); function createEntity(description, position, parent) { - var entity = Entities.addEntity({ - type: "Sphere", - position: position, - dimensions: Vec3.HALF, - dynamic: true, - collisionless: true, - parentID: parent, - lifetime: 300 // Delete after 5 minutes. - }); - print(description + ": " + entity); - return entity; + var entity = Entities.addEntity({ + type: "Sphere", + position: position, + dimensions: Vec3.HALF, + dynamic: true, + collisionless: true, + parentID: parent, + lifetime: 300 // Delete after 5 minutes. + }); + //print(description + ": " + entity); + return entity; } - function createBabies() { - var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, {x: 0, y: 2, z: -5})); - var root = createEntity("Root", position, Uuid.NULL); - var ctr; - var avatarChildren = []; - // make five children. - for(var ctr = 0; ctr < 5; ctr++) { - avatarChildren.append(CreateEntity("Child" + ctr, Vec3.sum(position, { x: ctr, y: -1, z: ctr }), root)); - }} + var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, {x: 0, y: 2, z: -5})); + //var root = createEntity("Root", position, Uuid.NULL); + var avatarChildren = []; + var overlayChildren = []; + var entityChildren = []; + var avatar = MyAvatar.sessionUUID; + if (avatar === Uuid.NULL) { + avatar = MyAvatar.SELF_ID; + } + var textToWrite = "Avatar UUID: " + avatar + "\n\n"; + // make five children. + for(var ctr = 0; ctr < 5; ctr++) { + var entity = createEntity("AvatarChild" + ctr, Vec3.sum(position, { x: ctr, y: -1, z: ctr }), avatar); + avatarChildren.push(entity); + textToWrite += "AvatarChild" + ctr + " UUID: " + entity + "\n"; + } + var overlay = Overlays.addOverlay("cube", { + position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -3 })), + rotation: MyAvatar.orientation, + dimensions: { x: 0.3, y: 0.3, z: 0.3 }, + solid: true + }); + textToWrite += "\nOverlay UUID: " + overlay + "\n\n"; + for(var ctr = 0; ctr < 5; ctr++) { + var entity = createEntity("OverlayChild" + ctr, Vec3.sum(position, { x: ctr, y: -1, z: ctr }), overlay); + overlayChildren.push(entity); + textToWrite += "OverlayChild" + ctr + " UUID: " + entity + "\n"; + } + var rootEntity = Entities.addEntity({ + type: "Sphere", + position: position, + dimensions: Vec3.HALF, + dynamic: true, + collisionless: true, + lifetime: 300 // Delete after 5 minutes. + }); + textToWrite += "\nEntity UUID: " + rootEntity + "\n\n"; + for(var ctr = 0; ctr < 5; ctr++) { + var entity = createEntity("EntityChild" + ctr, Vec3.sum(position, { x: ctr, y: -1, z: ctr }), rootEntity); + entityChildren.push(entity); + textToWrite += "EntityChild" + ctr + " UUID: " + entity + "\n"; + } + console.log(textToWrite); + } button = tablet.addButton({ icon: "icons/tablet-icons/clap-i.svg", text: "Create OBJ", - sortOrder: 1 + sortOrder: 12 }); button.clicked.connect(createBabies); diff --git a/scripts/system/deleteobject.js b/scripts/system/deleteobject.js index 2c366b5546..ff65762497 100644 --- a/scripts/system/deleteobject.js +++ b/scripts/system/deleteobject.js @@ -3,21 +3,20 @@ var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); function destroyBabies() { - var avatarEntityID = - for(var ctr = 0; ctr < getChildrenIDs(); ctr++) { - avatarChildren.append(CreateEntity("Child" + ctr, Vec3.sum(position, { x: ctr, y: -1, z: ctr }), root)); - }} + // TODO: destroy babies + } + button = tablet.addButton({ - icon: "icons/tablet-icons/clap-i.svg", + icon: "icons/tablet-icons/clap-a.svg", text: "Destroy OBJ", - sortOrder: 1 + sortOrder: 13 }); - button.clicked.connect(createBabies); + button.clicked.connect(destroyBabies); Script.scriptEnding.connect(function () { - button.clicked.disconnect(createBabies); + button.clicked.disconnect(destroyBabies); if (tablet) { tablet.removeButton(button); } From f82e597ac7bf45dc654a1f0e3b6d1e5d85b1a7a9 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Tue, 15 May 2018 09:34:07 -0700 Subject: [PATCH 05/53] Updating documentation for getChildrenIDs + fixing issue #1934 --- interface/src/ui/overlays/Overlays.h | 2 +- libraries/entities/src/EntityScriptingInterface.cpp | 8 -------- libraries/entities/src/EntityScriptingInterface.h | 8 ++++---- scripts/defaultScripts.js | 3 +-- 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index cf1151b46a..b2728e68b2 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -482,7 +482,7 @@ public slots: /**jsdoc * Check if there is an overlay of a given ID. - * @function Overlays.isAddedOverly + * @function Overlays.isAddedOverlay * @param {Uuid} overlayID - The ID to check. * @returns {boolean} true if an overlay with the given ID exists, false otherwise. */ diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 65bacfec5a..2558cb4ed7 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1659,12 +1659,6 @@ QVector EntityScriptingInterface::getChildrenIDs(const QUuid& parentID) { if (!_entityTree) { return result; } - - //EntityItemPointer entity = _entityTree->findEntityByEntityItemID(parentID); - //if (!entity) { - // qCDebug(entities) << "EntityScriptingInterface::getChildrenIDs - no entity with ID" << parentID; - // return result; - //} _entityTree->withReadLock([&] { QSharedPointer parentFinder = DependencyManager::get(); if (!parentFinder) { @@ -1679,8 +1673,6 @@ QVector EntityScriptingInterface::getChildrenIDs(const QUuid& parentID) { if (!parent) { return; } - //_entityTree->withReadLock([&] { - //entity->forEachChild([&](SpatiallyNestablePointer child) { parent->forEachChild([&](SpatiallyNestablePointer child) { result.push_back(child->getID()); }); diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 7e47d9e2d4..46a994e183 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -1216,12 +1216,12 @@ public slots: /**jsdoc - * Get the IDs of entities, overlays, and avatars that are directly parented to an entity. To get all descendants of an - * entity, recurse on the IDs returned by the function. + * Get the IDs of entities, overlays, and avatars that are directly parented to an entity, overlay, or avatar model. To get all descendants of an + * entity; overlay; or avatar, recurse on the IDs returned by the function. * @function Entities.getChildrenIDs - * @param {Uuid} parentID - The ID of the entity to get the children IDs of. + * @param {Uuid} parentID - The ID of the entity, overlay, or avatar to get the children IDs of. * @returns {Uuid[]} An array of entity, overlay, and avatar IDs that are parented directly to the parentID - * entity. Does not include children's children, etc. The array is empty if no children can be found or + * entity, overlay, or avatar. Does not include children's children, etc. The array is empty if no children can be found or * parentID cannot be found. * @example Report the children of an entity. * function createEntity(description, position, parent) { diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js index 12e9a4fd58..71755e3abb 100644 --- a/scripts/defaultScripts.js +++ b/scripts/defaultScripts.js @@ -30,8 +30,7 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/dialTone.js", "system/firstPersonHMD.js", "system/tablet-ui/tabletUI.js", - "system/emote.js", - "system/createobject.js" + "system/emote.js" ]; var DEFAULT_SCRIPTS_SEPARATE = [ "system/controllers/controllerScripts.js" From 839d4a3bdaa961a0614b80bd67c665f68dc95839 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Tue, 15 May 2018 09:36:32 -0700 Subject: [PATCH 06/53] removing test script --- scripts/system/createobject.js | 95 ---------------------------------- 1 file changed, 95 deletions(-) delete mode 100644 scripts/system/createobject.js diff --git a/scripts/system/createobject.js b/scripts/system/createobject.js deleted file mode 100644 index 887313130c..0000000000 --- a/scripts/system/createobject.js +++ /dev/null @@ -1,95 +0,0 @@ -(function(){ - var button; - var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); - - function createEntity(description, position, parent) { - var entity = Entities.addEntity({ - type: "Sphere", - position: position, - dimensions: Vec3.HALF, - dynamic: true, - collisionless: true, - parentID: parent, - lifetime: 300 // Delete after 5 minutes. - }); - //print(description + ": " + entity); - return entity; - } - - function createBabies() { - var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, {x: 0, y: 2, z: -5})); - //var root = createEntity("Root", position, Uuid.NULL); - var avatarChildren = []; - var overlayChildren = []; - var entityChildren = []; - var avatar = MyAvatar.sessionUUID; - if (avatar === Uuid.NULL) { - avatar = MyAvatar.SELF_ID; - } - var textToWrite = "Avatar UUID: " + avatar + "\n\n"; - // make five children. - for(var ctr = 0; ctr < 5; ctr++) { - var entity = createEntity("AvatarChild" + ctr, Vec3.sum(position, { x: ctr, y: -1, z: ctr }), avatar); - avatarChildren.push(entity); - textToWrite += "AvatarChild" + ctr + " UUID: " + entity + "\n"; - } - var overlay = Overlays.addOverlay("cube", { - position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -3 })), - rotation: MyAvatar.orientation, - dimensions: { x: 0.3, y: 0.3, z: 0.3 }, - solid: true - }); - textToWrite += "\nOverlay UUID: " + overlay + "\n\n"; - for(var ctr = 0; ctr < 5; ctr++) { - var entity = createEntity("OverlayChild" + ctr, Vec3.sum(position, { x: ctr, y: -1, z: ctr }), overlay); - overlayChildren.push(entity); - textToWrite += "OverlayChild" + ctr + " UUID: " + entity + "\n"; - } - var rootEntity = Entities.addEntity({ - type: "Sphere", - position: position, - dimensions: Vec3.HALF, - dynamic: true, - collisionless: true, - lifetime: 300 // Delete after 5 minutes. - }); - textToWrite += "\nEntity UUID: " + rootEntity + "\n\n"; - for(var ctr = 0; ctr < 5; ctr++) { - var entity = createEntity("EntityChild" + ctr, Vec3.sum(position, { x: ctr, y: -1, z: ctr }), rootEntity); - entityChildren.push(entity); - textToWrite += "EntityChild" + ctr + " UUID: " + entity + "\n"; - } - console.log(textToWrite); - } - - button = tablet.addButton({ - icon: "icons/tablet-icons/clap-i.svg", - text: "Create OBJ", - sortOrder: 12 - }); - - button.clicked.connect(createBabies); - - Script.scriptEnding.connect(function () { - button.clicked.disconnect(createBabies); - if (tablet) { - tablet.removeButton(button); - } - }); - -/* var entityID = Entities.addEntity({*/ - //type: "Box", - //position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), - //dimensions: { x: 0.5, y: 0.5, z: 0.5 }, - //dynamic: true, - //collisionless: false, - //userData: "{ \"grabbableKey\": { \"grabbable\": true, \"kinematic\": false } }", - //lifetime: 300 // Delete after 5 minutes. - //}); - - /*var actionID = Entities.addAction("slider", entityID, {*/ - //axis: { x: 0, y: 1, z: 0 }, - //linearLow: 0, - //linearHigh: 0.6 - /*});*/ -}()); From 9269bd261965dee53c1f489fcdd0ec1267bd9beb Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Tue, 15 May 2018 09:37:42 -0700 Subject: [PATCH 07/53] removing dummy script --- scripts/system/deleteobject.js | 40 ---------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 scripts/system/deleteobject.js diff --git a/scripts/system/deleteobject.js b/scripts/system/deleteobject.js deleted file mode 100644 index ff65762497..0000000000 --- a/scripts/system/deleteobject.js +++ /dev/null @@ -1,40 +0,0 @@ -(function(){ - var button; - var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); - - function destroyBabies() { - // TODO: destroy babies - } - - - button = tablet.addButton({ - icon: "icons/tablet-icons/clap-a.svg", - text: "Destroy OBJ", - sortOrder: 13 - }); - - button.clicked.connect(destroyBabies); - - Script.scriptEnding.connect(function () { - button.clicked.disconnect(destroyBabies); - if (tablet) { - tablet.removeButton(button); - } - }); - -/* var entityID = Entities.addEntity({*/ - //type: "Box", - //position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -5 })), - //dimensions: { x: 0.5, y: 0.5, z: 0.5 }, - //dynamic: true, - //collisionless: false, - //userData: "{ \"grabbableKey\": { \"grabbable\": true, \"kinematic\": false } }", - //lifetime: 300 // Delete after 5 minutes. - //}); - - /*var actionID = Entities.addAction("slider", entityID, {*/ - //axis: { x: 0, y: 1, z: 0 }, - //linearLow: 0, - //linearHigh: 0.6 - /*});*/ -}()); From 92e9a8e064058644efd50f25bb03692c5c003597 Mon Sep 17 00:00:00 2001 From: Wayne Chen Date: Tue, 15 May 2018 16:32:01 -0700 Subject: [PATCH 08/53] fixing typo in documentation. --- libraries/entities/src/EntityScriptingInterface.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 46a994e183..eefb254c2a 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -1216,8 +1216,7 @@ public slots: /**jsdoc - * Get the IDs of entities, overlays, and avatars that are directly parented to an entity, overlay, or avatar model. To get all descendants of an - * entity; overlay; or avatar, recurse on the IDs returned by the function. + * Get the IDs of entities, overlays, and avatars that are directly parented to an entity, overlay, or avatar model. Recurse on the IDs returned by the function to get all descendants of an entity, overlay, or avatar. * @function Entities.getChildrenIDs * @param {Uuid} parentID - The ID of the entity, overlay, or avatar to get the children IDs of. * @returns {Uuid[]} An array of entity, overlay, and avatar IDs that are parented directly to the parentID From 86a8672c5a7a230ece2a79341299cb2dab186334 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Thu, 17 May 2018 10:17:22 -0700 Subject: [PATCH 09/53] Initialize Qt/openssl before RSA keygen to prevent collision --- libraries/networking/src/RSAKeypairGenerator.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/RSAKeypairGenerator.cpp b/libraries/networking/src/RSAKeypairGenerator.cpp index 8ca8b81ea3..dcd4e7fd3c 100644 --- a/libraries/networking/src/RSAKeypairGenerator.cpp +++ b/libraries/networking/src/RSAKeypairGenerator.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include "NetworkLogging.h" @@ -25,7 +26,8 @@ RSAKeypairGenerator::RSAKeypairGenerator(QObject* parent) : QObject(parent) { - + // Ensure openssl/Qt config is set up. + QSslConfiguration::defaultConfiguration(); } void RSAKeypairGenerator::generateKeypair() { From fe92cf0c4788bc2942253d9ade93849d344cf7b2 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Thu, 17 May 2018 13:34:38 -0700 Subject: [PATCH 10/53] Move fix up a level to bit a little more general --- libraries/networking/src/AccountManager.cpp | 3 +++ libraries/networking/src/RSAKeypairGenerator.cpp | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 049129b2ba..1f6932094c 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -729,6 +729,9 @@ void AccountManager::generateNewKeypair(bool isUserKeypair, const QUuid& domainI return; } + // Ensure openssl/Qt config is set up. + QSslConfiguration::defaultConfiguration(); + // make sure we don't already have an outbound keypair generation request if (!_isWaitingForKeypairResponse) { _isWaitingForKeypairResponse = true; diff --git a/libraries/networking/src/RSAKeypairGenerator.cpp b/libraries/networking/src/RSAKeypairGenerator.cpp index dcd4e7fd3c..222b04b47c 100644 --- a/libraries/networking/src/RSAKeypairGenerator.cpp +++ b/libraries/networking/src/RSAKeypairGenerator.cpp @@ -15,7 +15,6 @@ #include #include -#include #include #include "NetworkLogging.h" @@ -26,8 +25,7 @@ RSAKeypairGenerator::RSAKeypairGenerator(QObject* parent) : QObject(parent) { - // Ensure openssl/Qt config is set up. - QSslConfiguration::defaultConfiguration(); + } void RSAKeypairGenerator::generateKeypair() { From aa18aaa7b19e2969633de95b5f55a0e7eb2ef2cc Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 17 May 2018 18:06:46 -0700 Subject: [PATCH 11/53] Maybe --- interface/src/avatar/MyAvatar.cpp | 2 +- interface/src/avatar/MyAvatar.h | 4 ++-- .../src/avatars-renderer/Avatar.cpp | 14 ++++++++++++++ .../avatars-renderer/src/avatars-renderer/Avatar.h | 4 ++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 193e974484..8817ea3d05 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1127,8 +1127,8 @@ void MyAvatar::setEnableDebugDrawIKChains(bool isEnabled) { } void MyAvatar::setEnableMeshVisible(bool isEnabled) { - // TODO: This should tell the main MetaRenderItem of the Avatar to be hidden to control vsisiblity since the model is culled by the MetaRI. _skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + Avatar::setEnableMeshVisible(isEnabled); } void MyAvatar::setEnableInverseKinematics(bool isEnabled) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 154e2e4d09..5e78d508fe 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1159,7 +1159,7 @@ public slots: * @function MyAvatar.getEnableMeshVisible * @returns {boolean} true if your avatar's mesh is visible, otherwise false. */ - bool getEnableMeshVisible() const { return _skeletonModel->isVisible(); } + bool getEnableMeshVisible() const override { return _skeletonModel->isVisible(); } /**jsdoc * Set whether or not your avatar mesh is visible. @@ -1171,7 +1171,7 @@ public slots: * MyAvatar.setEnableMeshVisible(true); * }, 10000); */ - void setEnableMeshVisible(bool isEnabled); + void setEnableMeshVisible(bool isEnabled) override; /**jsdoc * @function MyAvatar.setEnableInverseKinematics diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 38828a5163..858318746c 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -765,6 +765,20 @@ void Avatar::render(RenderArgs* renderArgs) { } } + +void Avatar::setEnableMeshVisible(bool isEnabled) { + render::Transaction transaction; + if (render::Item::isValidID(_renderItemID)) { + transaction.updateItem>(_renderItemID, [](render::Payload& p) { + }); + } + qApp->getMain3DScene()->enqueueTransaction(transaction); +} + +bool Avatar::getEnableMeshVisible() const { + return true; +} + void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { bool canTryFade{ false }; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 01114b5f6d..06bc1b174c 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -356,6 +356,10 @@ public: virtual void setAvatarEntityDataChanged(bool value) override; + // Show hide the model representation of the avatar + virtual void setEnableMeshVisible(bool isEnabled); + virtual bool getEnableMeshVisible() const; + void addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName) override; void removeMaterial(graphics::MaterialPointer material, const std::string& parentMaterialName) override; From 545ada0abb608a577362a36d0550bce1260dc83f Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 18 May 2018 10:28:52 -0700 Subject: [PATCH 12/53] Connect signal to keyGen thread for it to quit when owner destructed --- libraries/networking/src/AccountManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 1f6932094c..a975a86ada 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -761,6 +761,7 @@ void AccountManager::generateNewKeypair(bool isUserKeypair, const QUuid& domainI this, &AccountManager::handleKeypairGenerationError); connect(keypairGenerator, &QObject::destroyed, generateThread, &QThread::quit); + connect(this, &QObject::destroyed, generateThread, &QThread::quit); connect(generateThread, &QThread::finished, generateThread, &QThread::deleteLater); keypairGenerator->moveToThread(generateThread); From 36a08fdd8415a4de327f019e49c1fb108a86b30a Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 18 May 2018 17:41:28 -0700 Subject: [PATCH 13/53] Friday night end of the day, last compilation.... almost --- interface/src/avatar/MyAvatar.cpp | 5 ++- interface/src/avatar/MyAvatar.h | 2 +- .../src/avatars-renderer/Avatar.cpp | 20 ++++++---- .../src/avatars-renderer/Avatar.h | 3 ++ libraries/render/src/render/CullTask.cpp | 38 +++++++++---------- 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 8817ea3d05..c698bb3c1b 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1126,8 +1126,11 @@ void MyAvatar::setEnableDebugDrawIKChains(bool isEnabled) { _enableDebugDrawIKChains = isEnabled; } +bool MyAvatar::getEnableMeshVisible() const { + return Avatar::getEnableMeshVisible(); +} + void MyAvatar::setEnableMeshVisible(bool isEnabled) { - _skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); Avatar::setEnableMeshVisible(isEnabled); } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 5e78d508fe..4070d3372c 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1159,7 +1159,7 @@ public slots: * @function MyAvatar.getEnableMeshVisible * @returns {boolean} true if your avatar's mesh is visible, otherwise false. */ - bool getEnableMeshVisible() const override { return _skeletonModel->isVisible(); } + bool getEnableMeshVisible() const override; /**jsdoc * Set whether or not your avatar mesh is visible. diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 858318746c..a3b5a731bb 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -55,7 +55,9 @@ namespace render { ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1).withMetaCullGroup(); auto avatarPtr = static_pointer_cast(avatar); auto model = avatarPtr->getSkeletonModel(); - if (model && !model->isVisible()) { + //if (model && !model->isVisible()) { + + if (!avatarPtr->getEnableMeshVisible() && model) { keyBuilder.withInvisible(); } return keyBuilder.build(); @@ -767,16 +769,14 @@ void Avatar::render(RenderArgs* renderArgs) { void Avatar::setEnableMeshVisible(bool isEnabled) { - render::Transaction transaction; - if (render::Item::isValidID(_renderItemID)) { - transaction.updateItem>(_renderItemID, [](render::Payload& p) { - }); + if (_isMeshEnableVisible != isEnabled) { + _isMeshEnableVisible = isEnabled; + _needMeshVisibleSwitch = true; } - qApp->getMain3DScene()->enqueueTransaction(transaction); } bool Avatar::getEnableMeshVisible() const { - return true; + return _isMeshEnableVisible; } void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { @@ -801,6 +801,12 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { } } + if (_needMeshVisibleSwitch) { + // _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + updateRenderItem(transaction); + _needMeshVisibleSwitch = false; + } + if (_mustFadeIn && canTryFade) { // Do it now to be sure all the sub items are ready and the fade is sent to them too fade(transaction, render::Transition::USER_ENTER_DOMAIN); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 06bc1b174c..f7e89653b5 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -536,6 +536,9 @@ protected: std::mutex _materialsLock; void processMaterials(); + + bool _isMeshEnableVisible{ true }; + bool _needMeshVisibleSwitch{ true }; }; #endif // hifi_Avatar_h diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp index b5819f114f..ce6755b893 100644 --- a/libraries/render/src/render/CullTask.cpp +++ b/libraries/render/src/render/CullTask.cpp @@ -368,9 +368,9 @@ void CullShapeBounds::run(const RenderContextPointer& renderContext, const Input RenderArgs* args = renderContext->args; const auto& inShapes = inputs.get0(); - const auto& cullFilter = inputs.get1(); - const auto& boundsFilter = inputs.get2(); - const auto& antiFrustum = inputs.get3(); + const auto& cullFilter = inputs.get1(); + const auto& boundsFilter = inputs.get2(); + const auto& antiFrustum = inputs.get3(); auto& outShapes = outputs.edit0(); auto& outBounds = outputs.edit1(); @@ -380,7 +380,7 @@ void CullShapeBounds::run(const RenderContextPointer& renderContext, const Input if (!cullFilter.selectsNothing() || !boundsFilter.selectsNothing()) { auto& details = args->_details.edit(_detailType); Test test(_cullFunctor, args, details, antiFrustum); - auto scene = args->_scene; + auto scene = args->_scene; for (auto& inItems : inShapes) { auto key = inItems.first; @@ -395,26 +395,26 @@ void CullShapeBounds::run(const RenderContextPointer& renderContext, const Input if (antiFrustum == nullptr) { for (auto& item : inItems.second) { if (test.solidAngleTest(item.bound) && test.frustumTest(item.bound)) { - const auto shapeKey = scene->getItem(item.id).getKey(); - if (cullFilter.test(shapeKey)) { - outItems->second.emplace_back(item); - } - if (boundsFilter.test(shapeKey)) { - outBounds += item.bound; - } + const auto shapeKey = scene->getItem(item.id).getKey(); + if (cullFilter.test(shapeKey)) { + outItems->second.emplace_back(item); + } + if (boundsFilter.test(shapeKey)) { + outBounds += item.bound; + } } } } else { for (auto& item : inItems.second) { if (test.solidAngleTest(item.bound) && test.frustumTest(item.bound) && test.antiFrustumTest(item.bound)) { - const auto shapeKey = scene->getItem(item.id).getKey(); - if (cullFilter.test(shapeKey)) { - outItems->second.emplace_back(item); - } - if (boundsFilter.test(shapeKey)) { - outBounds += item.bound; - } - } + const auto shapeKey = scene->getItem(item.id).getKey(); + if (cullFilter.test(shapeKey)) { + outItems->second.emplace_back(item); + } + if (boundsFilter.test(shapeKey)) { + outBounds += item.bound; + } + } } } details._rendered += (int)outItems->second.size(); From 072d0f262cc3bc4f1d3bfeb61ad164fbcf5f84e0 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 21 May 2018 18:07:04 -0700 Subject: [PATCH 14/53] FIxing the problem of shadows not repecting the cull group --- libraries/render/src/render/CullTask.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp index ce6755b893..f013b2c1d3 100644 --- a/libraries/render/src/render/CullTask.cpp +++ b/libraries/render/src/render/CullTask.cpp @@ -395,9 +395,13 @@ void CullShapeBounds::run(const RenderContextPointer& renderContext, const Input if (antiFrustum == nullptr) { for (auto& item : inItems.second) { if (test.solidAngleTest(item.bound) && test.frustumTest(item.bound)) { - const auto shapeKey = scene->getItem(item.id).getKey(); + const auto& theItem = scene->getItem(item.id); + const auto shapeKey = theItem.getKey(); if (cullFilter.test(shapeKey)) { outItems->second.emplace_back(item); + if (theItem.getKey().isMetaCullGroup()) { + theItem.fetchMetaSubItemBounds(outItems->second, (*scene)); + } } if (boundsFilter.test(shapeKey)) { outBounds += item.bound; @@ -407,9 +411,13 @@ void CullShapeBounds::run(const RenderContextPointer& renderContext, const Input } else { for (auto& item : inItems.second) { if (test.solidAngleTest(item.bound) && test.frustumTest(item.bound) && test.antiFrustumTest(item.bound)) { - const auto shapeKey = scene->getItem(item.id).getKey(); + const auto& theItem = scene->getItem(item.id); + const auto shapeKey = theItem.getKey(); if (cullFilter.test(shapeKey)) { outItems->second.emplace_back(item); + if (theItem.getKey().isMetaCullGroup()) { + theItem.fetchMetaSubItemBounds(outItems->second, (*scene)); + } } if (boundsFilter.test(shapeKey)) { outBounds += item.bound; From 184d50b0185942a59aa695021c8241498b0939bc Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 22 May 2018 17:55:26 -0700 Subject: [PATCH 15/53] Well --- .../src/avatars-renderer/Avatar.cpp | 26 ++++++++++++++----- .../src/avatars-renderer/Avatar.h | 4 ++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index a3b5a731bb..63d71f87b4 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -63,7 +63,7 @@ namespace render { return keyBuilder.build(); } template <> const Item::Bound payloadGetBound(const AvatarSharedPointer& avatar) { - return static_pointer_cast(avatar)->getBounds(); + return static_pointer_cast(avatar)->getRenderBounds(); } template <> void payloadRender(const AvatarSharedPointer& avatar, RenderArgs* args) { auto avatarPtr = static_pointer_cast(avatar); @@ -172,6 +172,11 @@ AABox Avatar::getBounds() const { return _skeletonModel->getRenderableMeshBound(); } + +AABox Avatar::getRenderBounds() const { + return _renderBound; +} + void Avatar::animateScaleChanges(float deltaTime) { if (_isAnimatingScale) { @@ -577,11 +582,12 @@ static TextRenderer3D* textRenderer(TextRendererType type) { void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { auto avatarPayload = new render::Payload(self); - auto avatarPayloadPointer = Avatar::PayloadPointer(avatarPayload); - + auto avatarPayloadPointer = std::shared_ptr>(avatarPayload); if (_renderItemID == render::Item::INVALID_ITEM_ID) { _renderItemID = scene->allocateID(); } + // INitialize the _render bound as we are creating the avatar render item + _renderBound = getBounds(); transaction.resetItem(_renderItemID, avatarPayloadPointer); _skeletonModel->addToScene(scene, transaction); processMaterials(); @@ -642,13 +648,21 @@ void Avatar::removeFromScene(AvatarSharedPointer self, const render::ScenePointe } emit DependencyManager::get()->modelRemovedFromScene(getSessionUUID(), NestableType::Avatar, _skeletonModel); } - +#pragma optimize("", off) void Avatar::updateRenderItem(render::Transaction& transaction) { if (render::Item::isValidID(_renderItemID)) { - transaction.updateItem>(_renderItemID, [](render::Payload& p) {}); + auto renderBound = getBounds(); + transaction.updateItem(_renderItemID, + [renderBound](AvatarData& avatar) { + auto avatarPtr = dynamic_cast(&avatar); + if (avatarPtr) { + avatarPtr->_renderBound = renderBound; + } + } + ); } } - +#pragma optimize("", on) void Avatar::postUpdate(float deltaTime, const render::ScenePointer& scene) { if (isMyAvatar() ? showMyLookAtVectors : showOtherLookAtVectors) { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index f7e89653b5..9e9b995b71 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -74,7 +74,7 @@ public: virtual void instantiableAvatar() = 0; typedef render::Payload Payload; - typedef std::shared_ptr PayloadPointer; + // typedef std::shared_ptr PayloadPointer; void init(); void updateAvatarEntities(); @@ -322,6 +322,7 @@ public: bool hasNewJointData() const { return _hasNewJointData; } float getBoundingRadius() const; + AABox getRenderBounds() const; // THis call is accessible from rendering thread only to report the bounding box of the avatar during the frame. void addToScene(AvatarSharedPointer self, const render::ScenePointer& scene); void ensureInScene(AvatarSharedPointer self, const render::ScenePointer& scene); @@ -537,6 +538,7 @@ protected: void processMaterials(); + AABox _renderBound; bool _isMeshEnableVisible{ true }; bool _needMeshVisibleSwitch{ true }; }; From 13d02011f35bf8c085cdd332145998bbb4535867 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 24 May 2018 00:53:29 -0700 Subject: [PATCH 16/53] There and back again... --- interface/src/avatar/AvatarManager.cpp | 3 +++ .../src/avatars-renderer/Avatar.cpp | 8 +++----- libraries/render/src/render/CullTask.cpp | 13 +++---------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 094b3bb67b..2e9c9fdecd 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -104,6 +104,9 @@ void AvatarManager::updateMyAvatar(float deltaTime) { PerformanceWarning warn(showWarnings, "AvatarManager::updateMyAvatar()"); _myAvatar->update(deltaTime); + render::Transaction transaction; + _myAvatar->updateRenderItem(transaction); + qApp->getMain3DScene()->enqueueTransaction(transaction); quint64 now = usecTimestampNow(); quint64 dt = now - _lastSendAvatarDataTime; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 63d71f87b4..a96603bbdd 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -52,12 +52,10 @@ const glm::vec3 HAND_TO_PALM_OFFSET(0.0f, 0.12f, 0.08f); namespace render { template <> const ItemKey payloadGetKey(const AvatarSharedPointer& avatar) { - ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1).withMetaCullGroup(); + ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withShadowCaster().withTypeMeta().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1).withMetaCullGroup(); auto avatarPtr = static_pointer_cast(avatar); auto model = avatarPtr->getSkeletonModel(); - //if (model && !model->isVisible()) { - - if (!avatarPtr->getEnableMeshVisible() && model) { + if (!avatarPtr->getEnableMeshVisible()) { keyBuilder.withInvisible(); } return keyBuilder.build(); @@ -816,7 +814,7 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { } if (_needMeshVisibleSwitch) { - // _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); updateRenderItem(transaction); _needMeshVisibleSwitch = false; } diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp index f013b2c1d3..3f55e6dedc 100644 --- a/libraries/render/src/render/CullTask.cpp +++ b/libraries/render/src/render/CullTask.cpp @@ -395,13 +395,9 @@ void CullShapeBounds::run(const RenderContextPointer& renderContext, const Input if (antiFrustum == nullptr) { for (auto& item : inItems.second) { if (test.solidAngleTest(item.bound) && test.frustumTest(item.bound)) { - const auto& theItem = scene->getItem(item.id); - const auto shapeKey = theItem.getKey(); + const auto shapeKey = scene->getItem(item.id).getKey(); if (cullFilter.test(shapeKey)) { outItems->second.emplace_back(item); - if (theItem.getKey().isMetaCullGroup()) { - theItem.fetchMetaSubItemBounds(outItems->second, (*scene)); - } } if (boundsFilter.test(shapeKey)) { outBounds += item.bound; @@ -411,13 +407,9 @@ void CullShapeBounds::run(const RenderContextPointer& renderContext, const Input } else { for (auto& item : inItems.second) { if (test.solidAngleTest(item.bound) && test.frustumTest(item.bound) && test.antiFrustumTest(item.bound)) { - const auto& theItem = scene->getItem(item.id); - const auto shapeKey = theItem.getKey(); + const auto shapeKey = scene->getItem(item.id).getKey(); if (cullFilter.test(shapeKey)) { outItems->second.emplace_back(item); - if (theItem.getKey().isMetaCullGroup()) { - theItem.fetchMetaSubItemBounds(outItems->second, (*scene)); - } } if (boundsFilter.test(shapeKey)) { outBounds += item.bound; @@ -495,6 +487,7 @@ void FetchSpatialSelection::run(const RenderContextPointer& renderContext, if (filter.test(item.getKey())) { ItemBound itemBound(id, item.getBound()); outItems.emplace_back(itemBound); + } } } From b8b337dbe44d600c258d5211d12cd6e0a97192f4 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 24 May 2018 01:18:36 -0700 Subject: [PATCH 17/53] There and back again... --- .../avatars-renderer/src/avatars-renderer/Avatar.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index a96603bbdd..9566aa20ae 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -52,7 +52,7 @@ const glm::vec3 HAND_TO_PALM_OFFSET(0.0f, 0.12f, 0.08f); namespace render { template <> const ItemKey payloadGetKey(const AvatarSharedPointer& avatar) { - ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withShadowCaster().withTypeMeta().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1).withMetaCullGroup(); + ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1).withMetaCullGroup(); auto avatarPtr = static_pointer_cast(avatar); auto model = avatarPtr->getSkeletonModel(); if (!avatarPtr->getEnableMeshVisible()) { @@ -588,9 +588,12 @@ void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& sc _renderBound = getBounds(); transaction.resetItem(_renderItemID, avatarPayloadPointer); _skeletonModel->addToScene(scene, transaction); + _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + _skeletonModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); processMaterials(); for (auto& attachmentModel : _attachmentModels) { attachmentModel->addToScene(scene, transaction); + attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); } _mustFadeIn = true; @@ -646,7 +649,7 @@ void Avatar::removeFromScene(AvatarSharedPointer self, const render::ScenePointe } emit DependencyManager::get()->modelRemovedFromScene(getSessionUUID(), NestableType::Avatar, _skeletonModel); } -#pragma optimize("", off) + void Avatar::updateRenderItem(render::Transaction& transaction) { if (render::Item::isValidID(_renderItemID)) { auto renderBound = getBounds(); @@ -660,7 +663,7 @@ void Avatar::updateRenderItem(render::Transaction& transaction) { ); } } -#pragma optimize("", on) + void Avatar::postUpdate(float deltaTime, const render::ScenePointer& scene) { if (isMyAvatar() ? showMyLookAtVectors : showOtherLookAtVectors) { @@ -802,6 +805,7 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { if (_skeletonModel->isRenderable() && _skeletonModel->needsFixupInScene()) { _skeletonModel->removeFromScene(scene, transaction); _skeletonModel->addToScene(scene, transaction); + _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); processMaterials(); canTryFade = true; _isAnimatingScale = true; @@ -810,6 +814,7 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { if (attachmentModel->isRenderable() && attachmentModel->needsFixupInScene()) { attachmentModel->removeFromScene(scene, transaction); attachmentModel->addToScene(scene, transaction); + attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); } } From 77d6ea6bec1052ed9a70b184fcfe55eeb2e59de9 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 24 May 2018 16:48:03 -0700 Subject: [PATCH 18/53] Added hide/show for task bar (Windows only). --- .../src/scripting/TestScriptingInterface.cpp | 5 ++++ .../src/scripting/TestScriptingInterface.h | 5 ++++ .../src/ui-plugins/PluginContainer.cpp | 1 + tools/auto-tester/src/ui/AutoTester.cpp | 30 +++++++++++++++++++ tools/auto-tester/src/ui/AutoTester.h | 4 +++ tools/auto-tester/src/ui/AutoTester.ui | 26 ++++++++++++++++ 6 files changed, 71 insertions(+) diff --git a/interface/src/scripting/TestScriptingInterface.cpp b/interface/src/scripting/TestScriptingInterface.cpp index 700994c517..430441226f 100644 --- a/interface/src/scripting/TestScriptingInterface.cpp +++ b/interface/src/scripting/TestScriptingInterface.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -186,3 +187,7 @@ void TestScriptingInterface::saveObject(QVariant variant, const QString& filenam file.write(jsonData); file.close(); } + +void TestScriptingInterface::showMaximized() { + qApp->getWindow()->showMaximized(); +} \ No newline at end of file diff --git a/interface/src/scripting/TestScriptingInterface.h b/interface/src/scripting/TestScriptingInterface.h index 5666417727..282983cec9 100644 --- a/interface/src/scripting/TestScriptingInterface.h +++ b/interface/src/scripting/TestScriptingInterface.h @@ -91,6 +91,11 @@ public slots: */ void saveObject(QVariant v, const QString& filename); + /**jsdoc + * Maximizes the window + */ + void showMaximized(); + private: bool waitForCondition(qint64 maxWaitMs, std::function condition); QString _testResultsLocation; diff --git a/libraries/ui-plugins/src/ui-plugins/PluginContainer.cpp b/libraries/ui-plugins/src/ui-plugins/PluginContainer.cpp index 58dc971cb9..8d4a87f4b0 100644 --- a/libraries/ui-plugins/src/ui-plugins/PluginContainer.cpp +++ b/libraries/ui-plugins/src/ui-plugins/PluginContainer.cpp @@ -204,6 +204,7 @@ void PluginContainer::setFullscreen(const QScreen* target, bool hideMenu) { #endif } +#pragma optimize("", off) void PluginContainer::unsetFullscreen(const QScreen* avoid) { auto _window = getPrimaryWindow(); _window->showNormal(); diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index ea2633edf4..abc84f2d5f 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -10,6 +10,11 @@ // #include "AutoTester.h" +#ifdef Q_OS_WIN +#include +#include +#endif + AutoTester::AutoTester(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); ui.checkBoxInteractiveMode->setChecked(true); @@ -20,6 +25,11 @@ AutoTester::AutoTester(QWidget *parent) : QMainWindow(parent) { connect(ui.actionClose, &QAction::triggered, this, &AutoTester::on_closeButton_clicked); connect(ui.actionAbout, &QAction::triggered, this, &AutoTester::about); +#ifndef Q_OS_WIN + ui.hideTaskbarButton->setVisible(false); + ui.showTaskbarButton->setVisible(false); +#endif + test = new Test(); } @@ -56,6 +66,26 @@ void AutoTester::on_createTestsOutlineButton_clicked() { test->createTestsOutline(); } +void AutoTester::on_showTaskbarButton_clicked() { +#ifdef Q_OS_WIN + APPBARDATA abd = { sizeof abd }; + UINT uState = (UINT)SHAppBarMessage(ABM_GETSTATE, &abd); + LPARAM param = uState & ABS_ALWAYSONTOP; + abd.lParam = param; + SHAppBarMessage(ABM_SETSTATE, &abd); +#endif +} + +void AutoTester::on_hideTaskbarButton_clicked() { +#ifdef Q_OS_WIN + APPBARDATA abd = { sizeof abd }; + UINT uState = (UINT)SHAppBarMessage(ABM_GETSTATE, &abd); + LPARAM param = uState & ABS_ALWAYSONTOP; + abd.lParam = ABS_AUTOHIDE | param; + SHAppBarMessage(ABM_SETSTATE, &abd); +#endif +} + void AutoTester::on_closeButton_clicked() { exit(0); } diff --git a/tools/auto-tester/src/ui/AutoTester.h b/tools/auto-tester/src/ui/AutoTester.h index 5991afed1b..a4709dffeb 100644 --- a/tools/auto-tester/src/ui/AutoTester.h +++ b/tools/auto-tester/src/ui/AutoTester.h @@ -36,6 +36,10 @@ private slots: void on_createMDFileButton_clicked(); void on_createAllMDFilesButton_clicked(); void on_createTestsOutlineButton_clicked(); + + void on_showTaskbarButton_clicked(); + void on_hideTaskbarButton_clicked(); + void on_closeButton_clicked(); void saveImage(int index); diff --git a/tools/auto-tester/src/ui/AutoTester.ui b/tools/auto-tester/src/ui/AutoTester.ui index c9ea229012..236138acf4 100644 --- a/tools/auto-tester/src/ui/AutoTester.ui +++ b/tools/auto-tester/src/ui/AutoTester.ui @@ -147,6 +147,32 @@ Create Tests Outline + + + + 490 + 280 + 91 + 40 + + + + Show Taskbar + + + + + + 490 + 230 + 91 + 40 + + + + Hide Taskbar + + From 24738ebbe2babfb216be7b8f29feca1af59a17f7 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 25 May 2018 08:28:21 -0700 Subject: [PATCH 19/53] Added missing semi-colons. --- tools/auto-tester/src/Test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 23d097b855..3865ee7f86 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -395,9 +395,9 @@ void Test::createRecursiveScript(const QString& topLevelDirectory, bool interact const QString DATE_TIME_FORMAT("MMM d yyyy, h:mm"); textStream << "// This is an automatically generated file, created by auto-tester on " << QDateTime::currentDateTime().toString(DATE_TIME_FORMAT) << endl << endl; - textStream << "user = \"" + GIT_HUB_USER + "/\"" << endl; - textStream << "repository = \"" + GIT_HUB_REPOSITORY + "/\"" << endl; - textStream << "branch = \"" + GIT_HUB_BRANCH + "/\"" << endl << endl; + textStream << "user = \"" + GIT_HUB_USER + "/;\"" << endl; + textStream << "repository = \"" + GIT_HUB_REPOSITORY + "/;\"" << endl; + textStream << "branch = \"" + GIT_HUB_BRANCH + "/;\"" << endl << endl; textStream << "var autoTester = Script.require(\"https://github.com/" + GIT_HUB_USER + "/hifi_tests/blob/" + GIT_HUB_BRANCH + "/tests/utils/autoTester.js?raw=true\");" << endl << endl; From 590b4f91c52c1f8ac7c3327445d5886473bb966d Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 25 May 2018 09:16:51 -0700 Subject: [PATCH 20/53] Added comments. --- tools/auto-tester/src/ui/AutoTester.cpp | 24 ++++++++++++++---------- tools/auto-tester/src/ui/AutoTester.h | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index abc84f2d5f..1edd7f6f28 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -66,16 +66,10 @@ void AutoTester::on_createTestsOutlineButton_clicked() { test->createTestsOutline(); } -void AutoTester::on_showTaskbarButton_clicked() { -#ifdef Q_OS_WIN - APPBARDATA abd = { sizeof abd }; - UINT uState = (UINT)SHAppBarMessage(ABM_GETSTATE, &abd); - LPARAM param = uState & ABS_ALWAYSONTOP; - abd.lParam = param; - SHAppBarMessage(ABM_SETSTATE, &abd); -#endif -} - +// To toggle between show and hide +// if (uState & ABS_AUTOHIDE) on_showTaskbarButton_clicked(); +// else on_hideTaskbarButton_clicked(); +// void AutoTester::on_hideTaskbarButton_clicked() { #ifdef Q_OS_WIN APPBARDATA abd = { sizeof abd }; @@ -86,6 +80,16 @@ void AutoTester::on_hideTaskbarButton_clicked() { #endif } +void AutoTester::on_showTaskbarButton_clicked() { +#ifdef Q_OS_WIN + APPBARDATA abd = { sizeof abd }; + UINT uState = (UINT)SHAppBarMessage(ABM_GETSTATE, &abd); + LPARAM param = uState & ABS_ALWAYSONTOP; + abd.lParam = param; + SHAppBarMessage(ABM_SETSTATE, &abd); +#endif +} + void AutoTester::on_closeButton_clicked() { exit(0); } diff --git a/tools/auto-tester/src/ui/AutoTester.h b/tools/auto-tester/src/ui/AutoTester.h index a4709dffeb..7b419a9af8 100644 --- a/tools/auto-tester/src/ui/AutoTester.h +++ b/tools/auto-tester/src/ui/AutoTester.h @@ -37,8 +37,8 @@ private slots: void on_createAllMDFilesButton_clicked(); void on_createTestsOutlineButton_clicked(); - void on_showTaskbarButton_clicked(); void on_hideTaskbarButton_clicked(); + void on_showTaskbarButton_clicked(); void on_closeButton_clicked(); From 87220e501a848881b56f25733fc7ccb56f3dd192 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 25 May 2018 15:02:00 -0700 Subject: [PATCH 21/53] Don't show tablet in test mode, so that it won't appear in snapshots. Its location is not fixed - this will cause image comparisons to fail) --- interface/src/Application.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1a009954b5..420306874b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1033,6 +1033,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo if ((i + 2) < args.size() && args.at(i + 2) == TEST_QUIT_WHEN_FINISHED_OPTION) { quitWhenFinished = true; } + } else if (args.at(i) == TEST_RESULTS_LOCATION_COMMAND) { // Set test snapshot location only if it is a writeable directory QString path(args.at(i + 1)); @@ -2265,6 +2266,14 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo qCDebug(interfaceapp) << "Metaverse session ID is" << uuidStringWithoutCurlyBraces(accountManager->getSessionID()); + // Don't show tablet in test mode, so that it won't appear in snapshots + // (its location is not fixed - this will cause image comparisons to fail) + if (property(hifi::properties::TEST).isValid()) { + Menu::getInstance()->setIsOptionChecked(MenuOption::DesktopTabletToToolbar, false); + _desktopTabletBecomesToolbarSetting.set(false); + updateSystemTabletMode(); + } + #if defined(Q_OS_ANDROID) AndroidHelper::instance().init(); connect(&AndroidHelper::instance(), &AndroidHelper::enterBackground, this, &Application::enterBackground); From dcab7e4e8173bf9a7ce31943db58c37a95ed64cf Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 25 May 2018 15:03:45 -0700 Subject: [PATCH 22/53] Corrected misplaced semicolons. --- tools/auto-tester/src/Test.cpp | 6 +++--- tools/auto-tester/src/Test.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 3865ee7f86..5281f84d7a 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -395,9 +395,9 @@ void Test::createRecursiveScript(const QString& topLevelDirectory, bool interact const QString DATE_TIME_FORMAT("MMM d yyyy, h:mm"); textStream << "// This is an automatically generated file, created by auto-tester on " << QDateTime::currentDateTime().toString(DATE_TIME_FORMAT) << endl << endl; - textStream << "user = \"" + GIT_HUB_USER + "/;\"" << endl; - textStream << "repository = \"" + GIT_HUB_REPOSITORY + "/;\"" << endl; - textStream << "branch = \"" + GIT_HUB_BRANCH + "/;\"" << endl << endl; + textStream << "user = \"" + GIT_HUB_USER + "/\";" << endl; + textStream << "repository = \"" + GIT_HUB_REPOSITORY + "/\";" << endl; + textStream << "branch = \"" + GIT_HUB_BRANCH + "/\";" << endl << endl; textStream << "var autoTester = Script.require(\"https://github.com/" + GIT_HUB_USER + "/hifi_tests/blob/" + GIT_HUB_BRANCH + "/tests/utils/autoTester.js?raw=true\");" << endl << endl; diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index 32564035e7..ed6ddc315a 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -102,9 +102,9 @@ private: QStringList resultImagesFullFilenames; // Used for accessing GitHub - const QString GIT_HUB_USER{ "highfidelity" }; + const QString GIT_HUB_USER{ "NissimHadar" }; const QString GIT_HUB_REPOSITORY{ "hifi_tests" }; - const QString GIT_HUB_BRANCH{ "master" }; + const QString GIT_HUB_BRANCH{ "DailyTests" }; const QString DATETIME_FORMAT{ "yyyy-MM-dd_hh-mm-ss" }; From 221b513b19550fa31e9f8e6336b2d24131e4a78c Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 25 May 2018 16:33:34 -0700 Subject: [PATCH 23/53] Oh boy --- .../src/avatars-renderer/Avatar.cpp | 12 +++- libraries/render-utils/src/MeshPartPayload.h | 2 + libraries/render-utils/src/Model.cpp | 56 ++++++++++++------- libraries/render-utils/src/Model.h | 41 +++++++++----- 4 files changed, 75 insertions(+), 36 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 9566aa20ae..924fded652 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -593,7 +593,8 @@ void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& sc processMaterials(); for (auto& attachmentModel : _attachmentModels) { attachmentModel->addToScene(scene, transaction); - attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false); + attachmentModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false); } _mustFadeIn = true; @@ -806,6 +807,7 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { _skeletonModel->removeFromScene(scene, transaction); _skeletonModel->addToScene(scene, transaction); _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + _skeletonModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); processMaterials(); canTryFade = true; _isAnimatingScale = true; @@ -814,12 +816,18 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { if (attachmentModel->isRenderable() && attachmentModel->needsFixupInScene()) { attachmentModel->removeFromScene(scene, transaction); attachmentModel->addToScene(scene, transaction); - attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false); + attachmentModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false); } } if (_needMeshVisibleSwitch) { _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + for (auto attachmentModel : _attachmentModels) { + if (attachmentModel->isRenderable()) { + attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false); + } + } updateRenderItem(transaction); _needMeshVisibleSwitch = false; } diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 08ad7a8311..53ed0ada78 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -33,6 +33,7 @@ public: typedef Payload::DataPointer Pointer; virtual void updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false); + virtual void updateKey(const render::ItemKey& key); virtual void updateMeshPart(const std::shared_ptr& drawMesh, int partIndex); @@ -96,6 +97,7 @@ public: void notifyLocationChanged() override; void updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false) override; + void updateKey(const render::ItemKey& key) override; // matrix palette skinning void updateClusterBuffer(const std::vector& clusterMatrices); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 65b12ac0d4..5ac84ec913 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -103,11 +103,12 @@ Model::Model(QObject* parent, SpatiallyNestable* spatiallyNestableOverride) : _snapModelToRegistrationPoint(false), _snappedToRegistrationPoint(false), _url(HTTP_INVALID_COM), - _isVisible(true), - _canCastShadow(false), + // _isVisible(true), + // _canCastShadow(false), _blendNumber(0), _appliedBlendNumber(0), - _isWireframe(false) + _isWireframe(false), + _renderItemsKey(render::ItemKey::Builder().withVisible().withTagBits(AllViews).build()) { // we may have been created in the network thread, but we live in the main thread if (_viewState) { @@ -270,7 +271,7 @@ void Model::updateRenderItems() { bool isWireframe = self->isWireframe(); bool isVisible = self->isVisible(); bool canCastShadow = self->canCastShadow(); - uint8_t viewTagBits = self->getViewTagBits(); + uint8_t viewTagBits = self->getViewVisibilityMask(); bool isLayeredInFront = self->isLayeredInFront(); bool isLayeredInHUD = self->isLayeredInHUD(); bool isGroupCulled = self->isGroupCulled(); @@ -772,7 +773,7 @@ void Model::calculateTriangleSets(const FBXGeometry& geometry) { } } } - +/* void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled) { if (_isVisible != isVisible || _viewTagBits != viewTagBits || _isGroupCulled != isGroupCulled) { _isVisible = isVisible; @@ -798,24 +799,41 @@ void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, scene->enqueueTransaction(transaction); } } +*/ -void Model::setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled) { - if (_canCastShadow != canCastShadow) { - _canCastShadow = canCastShadow; +void Model::updateRenderItemsKey(const render::ScenePointer& scene) { + auto renderItemsKey = _renderItemsKey; + render::Transaction transaction; + foreach(auto item, _modelMeshRenderItemsMap.keys()) { + transaction.updateItem(item, [renderItemsKey](ModelMeshPartPayload& data) { + data.updateKey(renderItemsKey); + }); + } + foreach(auto item, _collisionRenderItemsMap.keys()) { + transaction.updateItem(item, [renderItemsKey](ModelMeshPartPayload& data) { + data.updateKey(renderItemsKey); + }); + } + scene->enqueueTransaction(transaction); +} - bool isVisible = _isVisible; - bool isLayeredInFront = _isLayeredInFront; - bool isLayeredInHUD = _isLayeredInHUD; +void Model::setVisibleInScene(bool pisVisible, const render::ScenePointer& scene) { + if (isVisible() != pisVisible) { + auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); + _renderItemsKey = (pisVisible ? keyBuilder.withVisible() : keyBuilder.withInvisible()); + updateRenderItemsKey(scene); + } +} - render::Transaction transaction; - foreach (auto item, _modelMeshRenderItemsMap.keys()) { - transaction.updateItem(item, - [isVisible, viewTagBits, canCastShadow, isLayeredInFront, isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, viewTagBits, canCastShadow, isLayeredInFront || isLayeredInHUD, isGroupCulled); - }); - } +bool Model::isVisible() const { + +} - scene->enqueueTransaction(transaction); +void Model::setCanCastShadow(bool pcanCastShadow, const render::ScenePointer& scene) { + if (canCastShadow() != pcanCastShadow) { + auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); + _renderItemsKey = (pcanCastShadow ? keyBuilder.withShadowCaster() : keyBuilder.withoutShadowCaster()); + updateRenderItemsKey(scene); } } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 2b14a7c055..0fec5ace04 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -87,13 +87,29 @@ public: const QUrl& getURL() const { return _url; } // new Scene/Engine rendering support - void setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled); + void setVisibleInScene(bool isVisible, const render::ScenePointer& scene); + bool isVisible() const; - bool canCastShadow() const { return _canCastShadow; } - void setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled); + enum ViewVisibilityMask : uint8_t { + MainView = 0x01, //render::ItemKey::TAG_BITS_0, + SecondaryView = 0x02, //render::ItemKey::TAG_BITS_1, + AllViews = 0xFF, //render::ItemKey::TAG_BITS_ALL, + }; + ViewVisibilityMask getViewVisibilityMask() const; + void setViewVisibilityMask(uint8_t mask, const render::ScenePointer& scene); + + bool isGroupCulled() const; + void setGroupCulled(bool isGroupCulled); + + bool canCastShadow() const; + void setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene); void setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene); void setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene); + + bool isLayeredInFront() const; + bool isLayeredInHUD() const; + bool needsFixupInScene() const; bool needsReload() const { return _needsReload; } @@ -108,13 +124,7 @@ public: void removeFromScene(const render::ScenePointer& scene, render::Transaction& transaction); bool isRenderable() const; - bool isVisible() const { return _isVisible; } - uint8_t getViewTagBits() const { return _viewTagBits; } - - bool isLayeredInFront() const { return _isLayeredInFront; } - bool isLayeredInHUD() const { return _isLayeredInHUD; } - - bool isGroupCulled() const { return _isGroupCulled; } + void updateRenderItemsKey(const render::ScenePointer& scene); virtual void updateRenderItems(); void setRenderItemsNeedUpdate(); @@ -404,10 +414,10 @@ protected: QVector _blendshapeCoefficients; QUrl _url; - bool _isVisible; - uint8_t _viewTagBits{ render::ItemKey::TAG_BITS_ALL }; + // bool _isVisible; + // uint8_t _viewTagBits{ render::ItemKey::TAG_BITS_ALL }; - bool _canCastShadow; + // bool _canCastShadow; gpu::Buffers _blendedVertexBuffers; @@ -471,11 +481,12 @@ protected: int _renderInfoDrawCalls { 0 }; int _renderInfoHasTransparent { false }; - bool _isLayeredInFront { false }; + render::ItemKey _renderItemsKey; + /* bool _isLayeredInFront { false }; bool _isLayeredInHUD { false }; bool _isGroupCulled{ false }; - + */ bool shouldInvalidatePayloadShapeKey(int meshIndex); private: From 20d2128a10153335d7d2956fe4b0f482741fa240 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 25 May 2018 17:36:55 -0700 Subject: [PATCH 24/53] Corrected timing bug. --- interface/src/Application.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e382b9814e..66a2fd99d3 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2220,8 +2220,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(this, &QCoreApplication::aboutToQuit, this, &Application::addAssetToWorldMessageClose); connect(&domainHandler, &DomainHandler::domainURLChanged, this, &Application::addAssetToWorldMessageClose); - updateSystemTabletMode(); - connect(&_myCamera, &Camera::modeUpdated, this, &Application::cameraModeChanged); DependencyManager::get()->setShouldPickHUDOperator([&]() { return DependencyManager::get()->isHMDMode(); }); @@ -2271,8 +2269,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo if (property(hifi::properties::TEST).isValid()) { Menu::getInstance()->setIsOptionChecked(MenuOption::DesktopTabletToToolbar, false); _desktopTabletBecomesToolbarSetting.set(false); - updateSystemTabletMode(); } + updateSystemTabletMode(); #if defined(Q_OS_ANDROID) AndroidHelper::instance().init(); From ddea1c64bc3b0cd9d5b5f08412de9328b7c10a86 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Fri, 25 May 2018 17:37:31 -0700 Subject: [PATCH 25/53] Updated AutoTester. --- tools/auto-tester/src/ImageComparer.cpp | 10 ++++++++-- tools/auto-tester/src/Test.cpp | 2 +- tools/auto-tester/src/ui/AutoTester.cpp | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/auto-tester/src/ImageComparer.cpp b/tools/auto-tester/src/ImageComparer.cpp index eb892484a2..3afdeaec0a 100644 --- a/tools/auto-tester/src/ImageComparer.cpp +++ b/tools/auto-tester/src/ImageComparer.cpp @@ -15,6 +15,12 @@ // Computes SSIM - see https://en.wikipedia.org/wiki/Structural_similarity // The value is computed for the luminance component and the average value is returned double ImageComparer::compareImages(QImage resultImage, QImage expectedImage) const { + // Make sure the image is 8 bits per colour + QImage::Format format = expectedImage.format(); + if (format != QImage::Format::Format_ARGB32) { + throw -1; + } + const int L = 255; // (2^number of bits per pixel) - 1 const double K1 { 0.01 }; const double K2 { 0.03 }; @@ -54,8 +60,8 @@ double ImageComparer::compareImages(QImage resultImage, QImage expectedImage) co // Collect pixels into linear arrays int i{ 0 }; - for (int xx = 0; xx < WIN_SIZE; ++xx) { - for (int yy = 0; yy < WIN_SIZE; ++yy) { + for (int xx = 0; xx < WIN_SIZE && x + xx < expectedImage.width(); ++xx) { + for (int yy = 0; yy < WIN_SIZE && y + yy < expectedImage.height(); ++yy) { // Get pixels QRgb pixelP = expectedImage.pixel(QPoint(x + xx, y + yy)); QRgb pixelQ = resultImage.pixel(QPoint(x + xx, y + yy)); diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 5281f84d7a..5c69715d2e 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -63,7 +63,7 @@ bool Test::compareImageLists(bool isInteractiveMode, QProgressBar* progressBar) // Loop over both lists and compare each pair of images // Quit loop if user has aborted due to a failed test. - const double THRESHOLD { 0.99 }; + const double THRESHOLD { 0.9995 }; bool success{ true }; bool keepOn{ true }; for (int i = 0; keepOn && i < expectedImagesFullFilenames.length(); ++i) { diff --git a/tools/auto-tester/src/ui/AutoTester.cpp b/tools/auto-tester/src/ui/AutoTester.cpp index 1edd7f6f28..14329e36c2 100644 --- a/tools/auto-tester/src/ui/AutoTester.cpp +++ b/tools/auto-tester/src/ui/AutoTester.cpp @@ -129,7 +129,7 @@ void AutoTester::saveImage(int index) { pixmap.loadFromData(downloaders[index]->downloadedData()); QImage image = pixmap.toImage(); - image = image.convertToFormat(QImage::Format_RGB32); + image = image.convertToFormat(QImage::Format_ARGB32); QString fullPathname = _directoryName + "/" + _filenames[index]; if (!image.save(fullPathname, 0, 100)) { From 678effdb4818a47872eb224d5512245adfe12d9e Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sat, 26 May 2018 23:28:59 -0700 Subject: [PATCH 26/53] Cleaning up the Model set ItemKey flags and bringing Item::Layer in the ItemKey --- interface/src/avatar/MyAvatar.cpp | 14 +- interface/src/ui/overlays/ModelOverlay.cpp | 6 +- interface/src/ui/overlays/OverlaysPayload.cpp | 8 +- .../src/avatars-renderer/Avatar.cpp | 32 +++-- .../src/avatars-renderer/SkeletonModel.cpp | 2 +- .../src/RenderableModelEntityItem.cpp | 12 +- .../render-utils/src/MeshPartPayload.cpp | 50 +++++-- libraries/render-utils/src/MeshPartPayload.h | 4 +- libraries/render-utils/src/Model.cpp | 131 ++++++++---------- libraries/render-utils/src/Model.h | 16 +-- libraries/render/src/render/Item.cpp | 8 +- libraries/render/src/render/Item.h | 79 ++++++++--- 12 files changed, 227 insertions(+), 135 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 69f81ab257..ced6d55784 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1483,7 +1483,10 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { _skeletonModelChangeCount++; int skeletonModelChangeCount = _skeletonModelChangeCount; Avatar::setSkeletonModelURL(skeletonModelURL); - _skeletonModel->setVisibleInScene(true, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true); + _skeletonModel->setViewMask(render::ItemKey::TAG_BITS_NONE); + _skeletonModel->setGroupCulled(true); + _skeletonModel->setVisibleInScene(true, qApp->getMain3DScene()); + _headBoneSet.clear(); _cauterizationNeedsUpdate = true; @@ -2060,12 +2063,11 @@ void MyAvatar::preDisplaySide(const RenderArgs* renderArgs) { _attachmentData[i].jointName.compare("Face", Qt::CaseInsensitive) == 0) { uint8_t modelRenderTagBits = shouldDrawHead ? render::ItemKey::TAG_BITS_0 : render::ItemKey::TAG_BITS_NONE; modelRenderTagBits |= render::ItemKey::TAG_BITS_1; - _attachmentModels[i]->setVisibleInScene(true, qApp->getMain3DScene(), - modelRenderTagBits, false); - uint8_t castShadowRenderTagBits = render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1; - _attachmentModels[i]->setCanCastShadow(true, qApp->getMain3DScene(), - castShadowRenderTagBits, false); + _attachmentModels[i]->setViewMask(modelRenderTagBits); + _attachmentModels[i]->setGroupCulled(false); + _attachmentModels[i]->setCanCastShadow(true); + _attachmentModels[i]->setVisibleInScene(true, qApp->getMain3DScene()); } } } diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 27e3bd0e2d..cb66828dc5 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -103,10 +103,12 @@ void ModelOverlay::update(float deltatime) { if (_visibleDirty) { _visibleDirty = false; // don't show overlays in mirrors or spectator-cam unless _isVisibleInSecondaryCamera is true - _model->setVisibleInScene(getVisible(), scene, + _model->setViewMask((_isVisibleInSecondaryCamera ? render::ItemKey::TAG_BITS_1 : render::ItemKey::TAG_BITS_NONE), scene); + _model->setVisibleInScene(getVisible(), scene); + /*, render::ItemKey::TAG_BITS_0 | (_isVisibleInSecondaryCamera ? render::ItemKey::TAG_BITS_1 : render::ItemKey::TAG_BITS_NONE), - false); + false);*/ } if (_drawInFrontDirty) { _drawInFrontDirty = false; diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index 185547a333..1a79c54ac2 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -35,14 +35,18 @@ namespace render { auto builder = ItemKey::Builder().withTypeShape(); if (overlay->is3D()) { auto overlay3D = std::static_pointer_cast(overlay); - if (overlay3D->getDrawInFront() || overlay3D->getDrawHUDLayer()) { - builder.withLayered(); + if (overlay3D->getDrawInFront()) { + builder.withLayer(render::Item::LAYER_3D_FRONT); + } else if (overlay3D->getDrawHUDLayer()) { + builder.withLayer(render::Item::LAYER_3D_HUD); } + if (overlay->isTransparent()) { builder.withTransparent(); } } else { builder.withViewSpace(); + builder.withLayer(render::Item::LAYER_2D); } if (!overlay->getVisible()) { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 924fded652..2d675088f7 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -588,13 +588,18 @@ void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& sc _renderBound = getBounds(); transaction.resetItem(_renderItemID, avatarPayloadPointer); _skeletonModel->addToScene(scene, transaction); - _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); - _skeletonModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + _skeletonModel->setViewMask(Model::AllViews); + _skeletonModel->setGroupCulled(true); + _skeletonModel->setCanCastShadow(true); + _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene); + processMaterials(); for (auto& attachmentModel : _attachmentModels) { attachmentModel->addToScene(scene, transaction); - attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false); - attachmentModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false); + attachmentModel->setViewMask(Model::AllViews); + attachmentModel->setGroupCulled(true); + attachmentModel->setCanCastShadow(true); + attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene); } _mustFadeIn = true; @@ -806,8 +811,12 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { if (_skeletonModel->isRenderable() && _skeletonModel->needsFixupInScene()) { _skeletonModel->removeFromScene(scene, transaction); _skeletonModel->addToScene(scene, transaction); - _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); - _skeletonModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + + _skeletonModel->setViewMask(Model::AllViews); + _skeletonModel->setGroupCulled(true); + _skeletonModel->setCanCastShadow(true); + _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene); + processMaterials(); canTryFade = true; _isAnimatingScale = true; @@ -816,16 +825,19 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { if (attachmentModel->isRenderable() && attachmentModel->needsFixupInScene()) { attachmentModel->removeFromScene(scene, transaction); attachmentModel->addToScene(scene, transaction); - attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false); - attachmentModel->setCanCastShadow(true, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false); + + attachmentModel->setViewMask(Model::AllViews); + attachmentModel->setGroupCulled(true); + attachmentModel->setCanCastShadow(true); + attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene); } } if (_needMeshVisibleSwitch) { - _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true); + _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene); for (auto attachmentModel : _attachmentModels) { if (attachmentModel->isRenderable()) { - attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, false); + attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene); } } updateRenderItem(transaction); diff --git a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp index 428f86f0ab..de8c02f10e 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp @@ -35,7 +35,7 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) : _useDualQuaternionSkinning = true; // Avatars all cast shadow - _canCastShadow = true; + setCanCastShadow(true); assert(_owningAvatar); } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index c4fa71a488..6a300ca587 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -1391,16 +1391,22 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce render::ItemKey::TAG_BITS_1 : // draw in every view except the main one (view zero) render::ItemKey::TAG_BITS_ALL; // draw in all views - if (model->isVisible() != _visible || model->getViewTagBits() != viewTaskBits) { + if (model->isVisible() != _visible) { // FIXME: this seems like it could be optimized if we tracked our last known visible state in // the renderable item. As it stands now the model checks it's visible/invisible state // so most of the time we don't do anything in this function. - model->setVisibleInScene(_visible, scene, viewTaskBits, false); + // model->setVisibleInScene(_visible, scene, viewTaskBits, false); + model->setVisibleInScene(_visible, scene); } + + if (model->getViewMask() != viewTaskBits) { + model->setViewMask(viewTaskBits, scene); + } + // TODO? early exit here when not visible? if (model->canCastShadow() != _canCastShadow) { - model->setCanCastShadow(_canCastShadow, scene, viewTaskBits, false); + model->setCanCastShadow(_canCastShadow, scene); } if (_needsCollisionGeometryUpdate) { diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 72a4b7e0a4..fa8a8ebfc9 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -79,7 +79,7 @@ void MeshPartPayload::removeMaterial(graphics::MaterialPointer material) { _drawMaterials.remove(material); } -void MeshPartPayload::updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled) { +void MeshPartPayload::updateKey(bool isVisible, uint8_t layer, bool canCastShadow, uint8_t tagBits, bool isGroupCulled) { ItemKey::Builder builder; builder.withTypeShape(); @@ -89,9 +89,10 @@ void MeshPartPayload::updateKey(bool isVisible, bool isLayered, bool canCastShad builder.withTagBits(tagBits); - if (isLayered) { - builder.withLayered(); - } + // if (layer) { + // builder.withLayered(); + builder.withLayer((ItemKey::Layer) layer); + // } if (canCastShadow) { builder.withShadowCaster(); @@ -111,6 +112,20 @@ void MeshPartPayload::updateKey(bool isVisible, bool isLayered, bool canCastShad _itemKey = builder.build(); } +void MeshPartPayload::updateKey(const render::ItemKey& key) { + ItemKey::Builder builder(key); + builder.withTypeShape(); + + if (topMaterialExists()) { + auto matKey = _drawMaterials.top().material->getKey(); + if (matKey.isTranslucent()) { + builder.withTransparent(); + } + } + + _itemKey = builder.build(); +} + ItemKey MeshPartPayload::getKey() const { return _itemKey; } @@ -332,7 +347,7 @@ void ModelMeshPartPayload::updateTransformForSkinnedMesh(const Transform& render } // Note that this method is called for models but not for shapes -void ModelMeshPartPayload::updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled) { +void ModelMeshPartPayload::updateKey(bool isVisible, uint8_t layer, bool canCastShadow, uint8_t tagBits, bool isGroupCulled) { ItemKey::Builder builder; builder.withTypeShape(); @@ -342,9 +357,9 @@ void ModelMeshPartPayload::updateKey(bool isVisible, bool isLayered, bool canCas builder.withTagBits(tagBits); - if (isLayered) { - builder.withLayered(); - } + // if (isLayered) { + builder.withLayer((ItemKey::Layer) layer); + // } if (canCastShadow) { builder.withShadowCaster(); @@ -368,6 +383,25 @@ void ModelMeshPartPayload::updateKey(bool isVisible, bool isLayered, bool canCas _itemKey = builder.build(); } +void ModelMeshPartPayload::updateKey(const render::ItemKey& key) { + ItemKey::Builder builder(key); + builder.withTypeShape(); + + if (_isBlendShaped || _isSkinned) { + builder.withDeformed(); + } + + if (topMaterialExists()) { + auto matKey = _drawMaterials.top().material->getKey(); + if (matKey.isTranslucent()) { + builder.withTransparent(); + } + } + + _itemKey = builder.build(); +} + + void ModelMeshPartPayload::setLayer(bool isLayeredInFront, bool isLayeredInHUD) { if (isLayeredInFront) { _layer = Item::LAYER_3D_FRONT; diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 53ed0ada78..f6ca09d2f0 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -32,7 +32,7 @@ public: typedef render::Payload Payload; typedef Payload::DataPointer Pointer; - virtual void updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false); + virtual void updateKey(bool isVisible, uint8_t layer, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false); virtual void updateKey(const render::ItemKey& key); virtual void updateMeshPart(const std::shared_ptr& drawMesh, int partIndex); @@ -96,7 +96,7 @@ public: void notifyLocationChanged() override; - void updateKey(bool isVisible, bool isLayered, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false) override; + void updateKey(bool isVisible, uint8_t layer, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false) override; void updateKey(const render::ItemKey& key) override; // matrix palette skinning diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 5ac84ec913..533705f2ba 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -271,7 +271,7 @@ void Model::updateRenderItems() { bool isWireframe = self->isWireframe(); bool isVisible = self->isVisible(); bool canCastShadow = self->canCastShadow(); - uint8_t viewTagBits = self->getViewVisibilityMask(); + uint8_t viewTagBits = self->getViewMask(); bool isLayeredInFront = self->isLayeredInFront(); bool isLayeredInHUD = self->isLayeredInHUD(); bool isGroupCulled = self->isGroupCulled(); @@ -802,6 +802,10 @@ void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, */ void Model::updateRenderItemsKey(const render::ScenePointer& scene) { + if (!scene) { + _needsFixupInScene = true; + return; + } auto renderItemsKey = _renderItemsKey; render::Transaction transaction; foreach(auto item, _modelMeshRenderItemsMap.keys()) { @@ -817,84 +821,76 @@ void Model::updateRenderItemsKey(const render::ScenePointer& scene) { scene->enqueueTransaction(transaction); } -void Model::setVisibleInScene(bool pisVisible, const render::ScenePointer& scene) { - if (isVisible() != pisVisible) { +void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene) { + if (Model::isVisible() != isVisible) { auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); - _renderItemsKey = (pisVisible ? keyBuilder.withVisible() : keyBuilder.withInvisible()); + _renderItemsKey = (isVisible ? keyBuilder.withVisible() : keyBuilder.withInvisible()); updateRenderItemsKey(scene); } } bool Model::isVisible() const { - + return _renderItemsKey.isVisible(); } -void Model::setCanCastShadow(bool pcanCastShadow, const render::ScenePointer& scene) { - if (canCastShadow() != pcanCastShadow) { +void Model::setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene) { + if (Model::canCastShadow() != canCastShadow) { auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); - _renderItemsKey = (pcanCastShadow ? keyBuilder.withShadowCaster() : keyBuilder.withoutShadowCaster()); + _renderItemsKey = (canCastShadow ? keyBuilder.withShadowCaster() : keyBuilder.withoutShadowCaster()); updateRenderItemsKey(scene); } } +bool Model::canCastShadow() const { + return _renderItemsKey.isShadowCaster(); +} + void Model::setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene) { - if (_isLayeredInFront != isLayeredInFront) { - _isLayeredInFront = isLayeredInFront; - - bool isVisible = _isVisible; - bool canCastShadow = _canCastShadow; - uint8_t viewTagBits = _viewTagBits; - bool isLayeredInHUD = _isLayeredInHUD; - bool isGroupCulled = _isGroupCulled; - - render::Transaction transaction; - foreach(auto item, _modelMeshRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, - isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); - data.setLayer(isLayeredInFront, isLayeredInHUD); - }); - } - foreach(auto item, _collisionRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, - isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); - data.setLayer(isLayeredInFront, isLayeredInHUD); - }); - } - scene->enqueueTransaction(transaction); + if (Model::isLayeredInFront() != isLayeredInFront) { + auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); + _renderItemsKey = (isLayeredInFront ? keyBuilder.withLayer(render::Item::LAYER_3D_FRONT) : keyBuilder.withoutLayer()); + updateRenderItemsKey(scene); } } +bool Model::isLayeredInFront() const { + return _renderItemsKey.isLayer(render::Item::LAYER_3D_FRONT); +} + void Model::setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene) { - if (_isLayeredInHUD != isLayeredInHUD) { - _isLayeredInHUD = isLayeredInHUD; - - bool isVisible = _isVisible; - bool canCastShadow = _canCastShadow; - uint8_t viewTagBits = _viewTagBits; - bool isLayeredInFront = _isLayeredInFront; - bool isGroupCulled = _isGroupCulled; - - render::Transaction transaction; - foreach(auto item, _modelMeshRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, - isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); - data.setLayer(isLayeredInFront, isLayeredInHUD); - }); - } - foreach(auto item, _collisionRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, - isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); - data.setLayer(isLayeredInFront, isLayeredInHUD); - }); - } - scene->enqueueTransaction(transaction); + if (Model::isLayeredInHUD() != isLayeredInHUD) { + auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); + _renderItemsKey = (isLayeredInHUD ? keyBuilder.withLayer(render::Item::LAYER_3D_HUD) : keyBuilder.withoutLayer()); + updateRenderItemsKey(scene); } } +bool Model::isLayeredInHUD() const { + return _renderItemsKey.isLayer(render::Item::LAYER_3D_HUD); +} + +void Model::setViewMask(uint8_t mask, const render::ScenePointer& scene) { + if (Model::getViewMask() != mask) { + auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); + _renderItemsKey = keyBuilder.withTagBits(mask); + updateRenderItemsKey(scene); + } +} +Model::ViewMask Model::getViewMask() const { + return (Model::ViewMask) _renderItemsKey.getTagBits(); +} + +void Model::setGroupCulled(bool isGroupCulled, const render::ScenePointer& scene) { + if (Model::isGroupCulled() != isGroupCulled) { + auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); + _renderItemsKey = (isGroupCulled ? keyBuilder.withSubMetaCulled() : keyBuilder.withoutSubMetaCulled()); + updateRenderItemsKey(scene); + } +} +bool Model::isGroupCulled() const { + return _renderItemsKey.isSubMetaCulled(); +} + bool Model::addToScene(const render::ScenePointer& scene, render::Transaction& transaction, render::Item::Status::Getters& statusGetters) { @@ -1694,20 +1690,16 @@ void Model::addMaterial(graphics::MaterialLayer material, const std::string& par for (auto shapeID : shapeIDs) { if (shapeID < _modelMeshRenderItemIDs.size()) { auto itemID = _modelMeshRenderItemIDs[shapeID]; - bool visible = isVisible(); - uint8_t viewTagBits = getViewTagBits(); - bool layeredInFront = isLayeredInFront(); - bool layeredInHUD = isLayeredInHUD(); - bool canCastShadow = _canCastShadow; + auto renderItemsKey = _renderItemsKey; bool wireframe = isWireframe(); auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex; bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex); bool useDualQuaternionSkinning = _useDualQuaternionSkinning; - transaction.updateItem(itemID, [material, visible, layeredInFront, layeredInHUD, viewTagBits, canCastShadow, + transaction.updateItem(itemID, [material, renderItemsKey, invalidatePayloadShapeKey, wireframe, useDualQuaternionSkinning](ModelMeshPartPayload& data) { data.addMaterial(material); // if the material changed, we might need to update our item key or shape key - data.updateKey(visible, layeredInFront || layeredInHUD, canCastShadow, viewTagBits); + data.updateKey(renderItemsKey); data.setShapeKey(invalidatePayloadShapeKey, wireframe, useDualQuaternionSkinning); }); } @@ -1722,19 +1714,16 @@ void Model::removeMaterial(graphics::MaterialPointer material, const std::string if (shapeID < _modelMeshRenderItemIDs.size()) { auto itemID = _modelMeshRenderItemIDs[shapeID]; bool visible = isVisible(); - uint8_t viewTagBits = getViewTagBits(); - bool layeredInFront = isLayeredInFront(); - bool layeredInHUD = isLayeredInHUD(); - bool canCastShadow = _canCastShadow; + auto renderItemsKey = _renderItemsKey; bool wireframe = isWireframe(); auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex; bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex); bool useDualQuaternionSkinning = _useDualQuaternionSkinning; - transaction.updateItem(itemID, [material, visible, layeredInFront, layeredInHUD, viewTagBits, canCastShadow, + transaction.updateItem(itemID, [material, visible, renderItemsKey, invalidatePayloadShapeKey, wireframe, useDualQuaternionSkinning](ModelMeshPartPayload& data) { data.removeMaterial(material); // if the material changed, we might need to update our item key or shape key - data.updateKey(visible, layeredInFront || layeredInHUD, canCastShadow, viewTagBits); + data.updateKey(renderItemsKey); data.setShapeKey(invalidatePayloadShapeKey, wireframe, useDualQuaternionSkinning); }); } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 0fec5ace04..fb72f3bf23 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -87,25 +87,25 @@ public: const QUrl& getURL() const { return _url; } // new Scene/Engine rendering support - void setVisibleInScene(bool isVisible, const render::ScenePointer& scene); + void setVisibleInScene(bool isVisible, const render::ScenePointer& scene = nullptr); bool isVisible() const; - enum ViewVisibilityMask : uint8_t { + enum ViewMask : uint8_t { MainView = 0x01, //render::ItemKey::TAG_BITS_0, SecondaryView = 0x02, //render::ItemKey::TAG_BITS_1, AllViews = 0xFF, //render::ItemKey::TAG_BITS_ALL, }; - ViewVisibilityMask getViewVisibilityMask() const; - void setViewVisibilityMask(uint8_t mask, const render::ScenePointer& scene); + ViewMask getViewMask() const; + void setViewMask(uint8_t mask, const render::ScenePointer& scene = nullptr); bool isGroupCulled() const; - void setGroupCulled(bool isGroupCulled); + void setGroupCulled(bool isGroupCulled, const render::ScenePointer& scene = nullptr); bool canCastShadow() const; - void setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene); + void setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene = nullptr); - void setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene); - void setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene); + void setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene = nullptr); + void setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene = nullptr); bool isLayeredInFront() const; bool isLayeredInHUD() const; diff --git a/libraries/render/src/render/Item.cpp b/libraries/render/src/render/Item.cpp index 9c5efb9fa7..95cb3c9aed 100644 --- a/libraries/render/src/render/Item.cpp +++ b/libraries/render/src/render/Item.cpp @@ -29,10 +29,11 @@ const float Item::Status::Value::CYAN = 180.0f; const float Item::Status::Value::BLUE = 240.0f; const float Item::Status::Value::MAGENTA = 300.0f; -const int Item::LAYER_2D = 0; +/*const int Item::LAYER_2D = 0; const int Item::LAYER_3D = 1; const int Item::LAYER_3D_FRONT = 2; const int Item::LAYER_3D_HUD = 3; +*/ const uint8_t ItemKey::TAG_BITS_ALL { 0xFF }; const uint8_t ItemKey::TAG_BITS_NONE { 0x00 }; @@ -47,6 +48,11 @@ const uint8_t ItemKey::TAG_BITS_7 { 0x80 }; const uint32_t ItemKey::KEY_TAG_BITS_MASK = ((uint32_t) ItemKey::TAG_BITS_ALL) << FIRST_TAG_BIT; +// Layer bits are derived from the Layer enum, the number of bits needed to represent integer 0 to NUM_LAYERS +//const uint8_t ItemKey::NUM_LAYER_BITS { 3 }; +const uint8_t ItemKey::LAYER_BITS_ALL { 0x07 }; + +const uint32_t ItemKey::KEY_LAYER_BITS_MASK = ((uint32_t)ItemKey::LAYER_BITS_ALL) << FIRST_LAYER_BIT; void Item::Status::Value::setScale(float scale) { diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index b8a3fbf0f8..6353dca1a3 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -66,9 +66,30 @@ public: const static uint8_t TAG_BITS_6; const static uint8_t TAG_BITS_7; + // Items are organized in layers, an item belongs to one of the 8 Layers available. + // By default an item is in the 'LAYER_NONE' meaning that it is NOT layered. + // Which is equivalent to say that LAYER_NONE, is the default Layer. + // THere is NO ordering relationship between layers. + enum Layer : uint8_t { + LAYER_NONE = 0, // layer 0 is a 'NOT' layer, items are not considered layered, this is the default value + LAYER_1, + LAYER_2, + LAYER_3, + LAYER_4, + LAYER_5, + LAYER_6, + LAYER_BACKGROUND, // Last Layer is the background by convention + + NUM_LAYERS, + NUM_LAYER_BITS = 3 + }; + // Layer bits are derived from the Layer enum, the number of bits needed to represent integer 0 to NUM_LAYERS + const static uint8_t LAYER_BITS_ALL; + enum FlagBit : uint32_t { - TYPE_SHAPE = 0, // Item is a Shape - TYPE_LIGHT, // Item is a Light + TYPE_SHAPE = 0, // Item is a Shape: Implements the Shape Interface that draw a Geometry rendered with a Material + TYPE_LIGHT, // Item is a Light: Implements the Light Interface that + TYPE_CAMERA, // Item is a Camera: Implements the Camera Interface TYPE_META, // Item is a Meta: meanning it s used to represent a higher level object, potentially represented by other render items TRANSLUCENT, // Transparent and not opaque, for some odd reason TRANSPARENCY doesn't work... @@ -77,13 +98,15 @@ public: DEFORMED, // Deformed within bound, not solid INVISIBLE, // Visible or not in the scene? SHADOW_CASTER, // Item cast shadows - LAYERED, // Item belongs to one of the layers different from the default layer META_CULL_GROUP, // As a meta item, the culling of my sub items is based solely on my bounding box and my visibility in the view SUB_META_CULLED, // As a sub item of a meta render item set as cull group, need to be set to my culling to the meta render it FIRST_TAG_BIT, // 8 Tags available to organize the items and filter them against LAST_TAG_BIT = FIRST_TAG_BIT + NUM_TAGS, + FIRST_LAYER_BIT, // 8 Exclusive Layers (encoded in 3 bits) available to organize the items in layers, an item can only belong to ONE layer + LAST_LAYER_BIT = FIRST_LAYER_BIT + NUM_LAYER_BITS, + __SMALLER, // Reserved bit for spatialized item to indicate that it is smaller than expected in the cell in which it belongs (probably because it overlaps over several smaller cells) NUM_FLAGS, // Not a valid flag @@ -96,6 +119,12 @@ public: return (keyBits & ~KEY_TAG_BITS_MASK) | (((uint32_t)tagBits) << FIRST_TAG_BIT); } + // All the bits touching layer bits sets to true + const static uint32_t KEY_LAYER_BITS_MASK; + static uint32_t evalLayerBitsWithKeyBits(uint8_t layer, const uint32_t keyBits) { + return (keyBits & ~KEY_LAYER_BITS_MASK) | (((uint32_t)layer & LAYER_BITS_ALL) << FIRST_LAYER_BIT); + } + // The key is the Flags Flags _flags; @@ -124,19 +153,24 @@ public: Builder& withInvisible() { _flags.set(INVISIBLE); return (*this); } Builder& withVisible() { _flags.reset(INVISIBLE); return (*this); } Builder& withShadowCaster() { _flags.set(SHADOW_CASTER); return (*this); } - Builder& withLayered() { _flags.set(LAYERED); return (*this); } + Builder& withoutShadowCaster() { _flags.reset(SHADOW_CASTER); return (*this); } Builder& withMetaCullGroup() { _flags.set(META_CULL_GROUP); return (*this); } + Builder& withoutMetaCullGroup() { _flags.reset(META_CULL_GROUP); return (*this); } Builder& withSubMetaCulled() { _flags.set(SUB_META_CULLED); return (*this); } + Builder& withoutSubMetaCulled() { _flags.reset(SUB_META_CULLED); return (*this); } Builder& withTag(Tag tag) { _flags.set(FIRST_TAG_BIT + tag); return (*this); } // Set ALL the tags in one call using the Tag bits Builder& withTagBits(uint8_t tagBits) { _flags = evalTagBitsWithKeyBits(tagBits, _flags.to_ulong()); return (*this); } + Builder& withLayer(uint8_t layer) { _flags = evalLayerBitsWithKeyBits(layer, _flags.to_ulong()); return (*this); } + Builder& withoutLayer() { return withLayer(LAYER_NONE); } + // Convenient standard keys that we will keep on using all over the place static Builder opaqueShape() { return Builder().withTypeShape(); } static Builder transparentShape() { return Builder().withTypeShape().withTransparent(); } static Builder light() { return Builder().withTypeLight(); } - static Builder background() { return Builder().withViewSpace().withLayered(); } + static Builder background() { return Builder().withViewSpace().withLayer(LAYER_BACKGROUND); } }; ItemKey(const Builder& builder) : ItemKey(builder._flags) {} @@ -161,9 +195,6 @@ public: bool isShadowCaster() const { return _flags[SHADOW_CASTER]; } - bool isLayered() const { return _flags[LAYERED]; } - bool isSpatial() const { return !isLayered(); } - bool isMetaCullGroup() const { return _flags[META_CULL_GROUP]; } void setMetaCullGroup(bool cullGroup) { (cullGroup ? _flags.set(META_CULL_GROUP) : _flags.reset(META_CULL_GROUP)); } @@ -173,6 +204,11 @@ public: bool isTag(Tag tag) const { return _flags[FIRST_TAG_BIT + tag]; } uint8_t getTagBits() const { return ((_flags.to_ulong() & KEY_TAG_BITS_MASK) >> FIRST_TAG_BIT); } + uint8_t getLayer() const { return ((_flags.to_ulong() & KEY_LAYER_BITS_MASK) >> FIRST_LAYER_BIT); } + bool isLayer(uint8_t layer) const { return getLayer() == layer; } + bool isLayered() const { return getLayer() != LAYER_NONE; } + bool isSpatial() const { return !isLayered(); } + // Probably not public, flags used by the scene bool isSmall() const { return _flags[__SMALLER]; } void setSmaller(bool smaller) { (smaller ? _flags.set(__SMALLER) : _flags.reset(__SMALLER)); } @@ -230,9 +266,6 @@ public: Builder& withNoShadowCaster() { _value.reset(ItemKey::SHADOW_CASTER); _mask.set(ItemKey::SHADOW_CASTER); return (*this); } Builder& withShadowCaster() { _value.set(ItemKey::SHADOW_CASTER); _mask.set(ItemKey::SHADOW_CASTER); return (*this); } - Builder& withoutLayered() { _value.reset(ItemKey::LAYERED); _mask.set(ItemKey::LAYERED); return (*this); } - Builder& withLayered() { _value.set(ItemKey::LAYERED); _mask.set(ItemKey::LAYERED); return (*this); } - Builder& withoutMetaCullGroup() { _value.reset(ItemKey::META_CULL_GROUP); _mask.set(ItemKey::META_CULL_GROUP); return (*this); } Builder& withMetaCullGroup() { _value.set(ItemKey::META_CULL_GROUP); _mask.set(ItemKey::META_CULL_GROUP); return (*this); } @@ -244,6 +277,9 @@ public: // Set ALL the tags in one call using the Tag bits and the Tag bits touched Builder& withTagBits(uint8_t tagBits, uint8_t tagMask) { _value = ItemKey::evalTagBitsWithKeyBits(tagBits, _value.to_ulong()); _mask = ItemKey::evalTagBitsWithKeyBits(tagMask, _mask.to_ulong()); return (*this); } + Builder& withoutLayered() { _value = ItemKey::evalLayerBitsWithKeyBits(ItemKey::LAYER_NONE, _value.to_ulong()); _mask |= ItemKey::KEY_LAYER_BITS_MASK; return (*this); } + Builder& withLayer(uint8_t layer) { _value = ItemKey::evalLayerBitsWithKeyBits(layer, _value.to_ulong()); _mask |= ItemKey::KEY_LAYER_BITS_MASK; return (*this); } + Builder& withNothing() { _value.reset(); _mask.reset(); return (*this); } // Convenient standard keys that we will keep on using all over the place @@ -252,9 +288,9 @@ public: static Builder transparentShape() { return Builder().withTypeShape().withTransparent().withWorldSpace(); } static Builder light() { return Builder().withTypeLight(); } static Builder meta() { return Builder().withTypeMeta(); } - static Builder background() { return Builder().withViewSpace().withLayered(); } - static Builder opaqueShapeLayered() { return Builder().withTypeShape().withOpaque().withWorldSpace().withLayered(); } - static Builder transparentShapeLayered() { return Builder().withTypeShape().withTransparent().withWorldSpace().withLayered(); } + static Builder background() { return Builder().withViewSpace().withLayer(ItemKey::LAYER_BACKGROUND); } + // static Builder opaqueShapeLayered() { return Builder().withTypeShape().withOpaque().withWorldSpace().withLayered(); } + // static Builder transparentShapeLayered() { return Builder().withTypeShape().withTransparent().withWorldSpace().withLayered(); } static Builder nothing() { return Builder().withNothing(); } }; @@ -377,7 +413,7 @@ public: public: virtual const ItemKey getKey() const = 0; virtual const Bound getBound() const = 0; - virtual int getLayer() const = 0; + // virtual int getLayer() const = 0; virtual void render(RenderArgs* args) = 0; virtual const ShapeKey getShapeKey() const = 0; @@ -423,12 +459,13 @@ public: const Bound getBound() const { return _payload->getBound(); } // Get the layer where the item belongs. - int getLayer() const { return _payload->getLayer(); } + // int getLayer() const { return _payload->getLayer(); } + int getLayer() const { return _key.getLayer(); } - static const int LAYER_2D; - static const int LAYER_3D; - static const int LAYER_3D_FRONT; - static const int LAYER_3D_HUD; + static const uint8_t LAYER_2D{ ItemKey::LAYER_1 }; + static const uint8_t LAYER_3D{ ItemKey::LAYER_NONE }; + static const uint8_t LAYER_3D_FRONT{ ItemKey::LAYER_2 }; + static const uint8_t LAYER_3D_HUD{ ItemKey::LAYER_3 }; // Render call for the item void render(RenderArgs* args) const { _payload->render(args); } @@ -505,7 +542,7 @@ public: // Payload general interface virtual const ItemKey getKey() const override { return payloadGetKey(_data); } virtual const Item::Bound getBound() const override { return payloadGetBound(_data); } - virtual int getLayer() const override { return payloadGetLayer(_data); } + // virtual int getLayer() const override { return payloadGetLayer(_data); } virtual void render(RenderArgs* args) override { payloadRender(_data, args); } From 817be6d5b65d0e915043506ffaf57ce458e1e41b Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Mon, 28 May 2018 12:03:22 -0700 Subject: [PATCH 27/53] Removed debug code. --- libraries/ui-plugins/src/ui-plugins/PluginContainer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/ui-plugins/src/ui-plugins/PluginContainer.cpp b/libraries/ui-plugins/src/ui-plugins/PluginContainer.cpp index 8d4a87f4b0..58dc971cb9 100644 --- a/libraries/ui-plugins/src/ui-plugins/PluginContainer.cpp +++ b/libraries/ui-plugins/src/ui-plugins/PluginContainer.cpp @@ -204,7 +204,6 @@ void PluginContainer::setFullscreen(const QScreen* target, bool hideMenu) { #endif } -#pragma optimize("", off) void PluginContainer::unsetFullscreen(const QScreen* avoid) { auto _window = getPrimaryWindow(); _window->showNormal(); From 5fd8cd71c60fbd9e51ffcc70eb1c1c60fbaa179b Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Mon, 28 May 2018 12:05:40 -0700 Subject: [PATCH 28/53] Reverted to main repo, for the PR. --- tools/auto-tester/src/Test.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/auto-tester/src/Test.h b/tools/auto-tester/src/Test.h index ed6ddc315a..32564035e7 100644 --- a/tools/auto-tester/src/Test.h +++ b/tools/auto-tester/src/Test.h @@ -102,9 +102,9 @@ private: QStringList resultImagesFullFilenames; // Used for accessing GitHub - const QString GIT_HUB_USER{ "NissimHadar" }; + const QString GIT_HUB_USER{ "highfidelity" }; const QString GIT_HUB_REPOSITORY{ "hifi_tests" }; - const QString GIT_HUB_BRANCH{ "DailyTests" }; + const QString GIT_HUB_BRANCH{ "master" }; const QString DATETIME_FORMAT{ "yyyy-MM-dd_hh-mm-ss" }; From 658c0e329fab2f78f43b1a340c5bb35b656ab83a Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Mon, 28 May 2018 19:57:54 -0700 Subject: [PATCH 29/53] Corrected comment. --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 66a2fd99d3..6056ad05d3 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2264,8 +2264,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo qCDebug(interfaceapp) << "Metaverse session ID is" << uuidStringWithoutCurlyBraces(accountManager->getSessionID()); - // Don't show tablet in test mode, so that it won't appear in snapshots - // (its location is not fixed - this will cause image comparisons to fail) + // Don't show toolbar in test mode, so that it won't appear in snapshots + // (its screen location is not fixed - this will cause image comparisons to fail) if (property(hifi::properties::TEST).isValid()) { Menu::getInstance()->setIsOptionChecked(MenuOption::DesktopTabletToToolbar, false); _desktopTabletBecomesToolbarSetting.set(false); From 2f94c43968664a24c9d8124154b04c1f103591d8 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 28 May 2018 23:20:04 -0700 Subject: [PATCH 30/53] Removing the getLayer from the meshPArtPayload and check that it s working --- libraries/render-utils/src/CauterizedModel.cpp | 2 +- libraries/render-utils/src/MeshPartPayload.cpp | 10 ++++++---- libraries/render-utils/src/MeshPartPayload.h | 8 ++++---- libraries/render-utils/src/Model.cpp | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 3c6a0df850..387d0c7c23 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -278,7 +278,7 @@ void CauterizedModel::updateRenderItems() { data.setEnableCauterization(enableCauterization); data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, render::ItemKey::TAG_BITS_ALL, isGroupCulled); - data.setLayer(isLayeredInFront, isLayeredInHUD); + // data.setLayer(isLayeredInFront, isLayeredInHUD); data.setShapeKey(invalidatePayloadShapeKey, isWireframe, useDualQuaternionSkinning); }); } diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index fa8a8ebfc9..5792a0c981 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -215,12 +215,13 @@ template <> const Item::Bound payloadGetBound(const ModelMeshPartPayload::Pointe } return Item::Bound(); } +/* template <> int payloadGetLayer(const ModelMeshPartPayload::Pointer& payload) { if (payload) { return payload->getLayer(); } return 0; -} +}*/ template <> const ShapeKey shapeGetShapeKey(const ModelMeshPartPayload::Pointer& payload) { if (payload) { @@ -401,7 +402,7 @@ void ModelMeshPartPayload::updateKey(const render::ItemKey& key) { _itemKey = builder.build(); } - +/* void ModelMeshPartPayload::setLayer(bool isLayeredInFront, bool isLayeredInHUD) { if (isLayeredInFront) { _layer = Item::LAYER_3D_FRONT; @@ -411,10 +412,11 @@ void ModelMeshPartPayload::setLayer(bool isLayeredInFront, bool isLayeredInHUD) _layer = Item::LAYER_3D; } } - +*/ +/* int ModelMeshPartPayload::getLayer() const { return _layer; -} +}*/ void ModelMeshPartPayload::setShapeKey(bool invalidateShapeKey, bool isWireframe, bool useDualQuaternionSkinning) { if (invalidateShapeKey) { diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index f6ca09d2f0..6782760d4c 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -107,11 +107,11 @@ public: void updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform); // Render Item interface - int getLayer() const; +// int getLayer() const; render::ShapeKey getShapeKey() const override; // shape interface void render(RenderArgs* args) override; - void setLayer(bool isLayeredInFront, bool isLayeredInHUD); +// void setLayer(bool isLayeredInFront, bool isLayeredInHUD); void setShapeKey(bool invalidateShapeKey, bool isWireframe, bool useDualQuaternionSkinning); // ModelMeshPartPayload functions to perform render @@ -141,13 +141,13 @@ private: gpu::BufferPointer _blendedVertexBuffer; render::ShapeKey _shapeKey { render::ShapeKey::Builder::invalid() }; - int _layer { render::Item::LAYER_3D }; + // int _layer { render::Item::LAYER_3D }; }; namespace render { template <> const ItemKey payloadGetKey(const ModelMeshPartPayload::Pointer& payload); template <> const Item::Bound payloadGetBound(const ModelMeshPartPayload::Pointer& payload); - template <> int payloadGetLayer(const ModelMeshPartPayload::Pointer& payload); + // template <> int payloadGetLayer(const ModelMeshPartPayload::Pointer& payload); template <> const ShapeKey shapeGetShapeKey(const ModelMeshPartPayload::Pointer& payload); template <> void payloadRender(const ModelMeshPartPayload::Pointer& payload, RenderArgs* args); } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 533705f2ba..d5a0f243b0 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -315,7 +315,7 @@ void Model::updateRenderItems() { data.updateTransformForSkinnedMesh(renderTransform, modelTransform); data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); - data.setLayer(isLayeredInFront, isLayeredInHUD); + // data.setLayer(isLayeredInFront, isLayeredInHUD); data.setShapeKey(invalidatePayloadShapeKey, isWireframe, useDualQuaternionSkinning); }); } From 0af1599b532c45fbb849fbf6c127855fe7b8a567 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Tue, 29 May 2018 09:45:03 -0700 Subject: [PATCH 31/53] Added jsdoc to TestScriptingInterface. --- .../src/scripting/TestScriptingInterface.h | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/interface/src/scripting/TestScriptingInterface.h b/interface/src/scripting/TestScriptingInterface.h index 282983cec9..8838677562 100644 --- a/interface/src/scripting/TestScriptingInterface.h +++ b/interface/src/scripting/TestScriptingInterface.h @@ -27,55 +27,96 @@ public slots: /**jsdoc * Exits the application + * @function Test.quit */ void quit(); /**jsdoc * Waits for all texture transfers to be complete + * @function Test.waitForTextureIdle */ void waitForTextureIdle(); /**jsdoc * Waits for all pending downloads to be complete + * @function Test.waitForDownloadIdle */ void waitForDownloadIdle(); /**jsdoc * Waits for all file parsing operations to be complete + * @function Test.waitForProcessingIdle */ void waitForProcessingIdle(); /**jsdoc * Waits for all pending downloads, parsing and texture transfers to be complete + * @function Test.waitIdle */ void waitIdle(); + /**jsdoc + * Waits for establishment of connection to server + * @function Test.waitForConnection + */ bool waitForConnection(qint64 maxWaitMs = 10000); + /**jsdoc + * Waits a specific number of milliseconds + * @function Test.wait + * @param {int} milliseconds - Number of milliseconds to wait + */ void wait(int milliseconds); + /**jsdoc + * Waits for all pending downloads, parsing and texture transfers to be complete + * @function Test.loadTestScene + * @param {string} sceneFile - URL of scene to load + */ bool loadTestScene(QString sceneFile); + /**jsdoc + * Clears all caches + * @function Test.clear + */ void clear(); /**jsdoc * Start recording Chrome compatible tracing events * logRules can be used to specify a set of logging category rules to limit what gets captured + * @function Test.startTracing + * @param {string} logrules [defaultValue=""] - See implementation for explanation */ bool startTracing(QString logrules = ""); /**jsdoc * Stop recording Chrome compatible tracing events and serialize recorded events to a file * Using a filename with a .gz extension will automatically compress the output file + * @function Test.stopTracing + * @param {string} filename - Name of file to save to + * @returns {bool} True if successful. */ bool stopTracing(QString filename); + /**jsdoc + * Starts a specific trace event + * @function Test.startTraceEvent + * @param {string} name - Name of event + */ void startTraceEvent(QString name); + /**jsdoc + * Stop a specific name event + * Using a filename with a .gz extension will automatically compress the output file + * @function Test.endTraceEvent + * @param {string} filename - Name of event + */ void endTraceEvent(QString name); /**jsdoc * Write detailed timing stats of next physics stepSimulation() to filename + * @function Test.savePhysicsSimulationStats + * @param {string} filename - Name of file to save to */ void savePhysicsSimulationStats(QString filename); @@ -83,16 +124,19 @@ public slots: /**jsdoc * Clear all caches (menu command Reload Content) + * @function Test.clearCaches */ void clearCaches(); /**jsdoc * Save a JSON object to a file in the test results location + * @function Test.saveObject */ void saveObject(QVariant v, const QString& filename); /**jsdoc * Maximizes the window + * @function Test.showMaximized */ void showMaximized(); From c49bcbe4e9560adb5ba3470d9c2ef4de540dedf4 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Tue, 29 May 2018 11:20:29 -0700 Subject: [PATCH 32/53] Removed "Don't show toolbar in test mode.." as this functionality is available through JS commands. --- interface/src/Application.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6056ad05d3..c8559f660f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1033,7 +1033,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo if ((i + 2) < args.size() && args.at(i + 2) == TEST_QUIT_WHEN_FINISHED_OPTION) { quitWhenFinished = true; } - } else if (args.at(i) == TEST_RESULTS_LOCATION_COMMAND) { // Set test snapshot location only if it is a writeable directory QString path(args.at(i + 1)); @@ -2220,6 +2219,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(this, &QCoreApplication::aboutToQuit, this, &Application::addAssetToWorldMessageClose); connect(&domainHandler, &DomainHandler::domainURLChanged, this, &Application::addAssetToWorldMessageClose); + updateSystemTabletMode(); + connect(&_myCamera, &Camera::modeUpdated, this, &Application::cameraModeChanged); DependencyManager::get()->setShouldPickHUDOperator([&]() { return DependencyManager::get()->isHMDMode(); }); @@ -2264,14 +2265,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo qCDebug(interfaceapp) << "Metaverse session ID is" << uuidStringWithoutCurlyBraces(accountManager->getSessionID()); - // Don't show toolbar in test mode, so that it won't appear in snapshots - // (its screen location is not fixed - this will cause image comparisons to fail) - if (property(hifi::properties::TEST).isValid()) { - Menu::getInstance()->setIsOptionChecked(MenuOption::DesktopTabletToToolbar, false); - _desktopTabletBecomesToolbarSetting.set(false); - } - updateSystemTabletMode(); - #if defined(Q_OS_ANDROID) AndroidHelper::instance().init(); connect(&AndroidHelper::instance(), &AndroidHelper::enterBackground, this, &Application::enterBackground); From 855084b6d52f6b51807c5c574bf57e56ede9822a Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Tue, 29 May 2018 11:29:59 -0700 Subject: [PATCH 33/53] Updated jsdoc. --- interface/src/scripting/TestScriptingInterface.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/interface/src/scripting/TestScriptingInterface.h b/interface/src/scripting/TestScriptingInterface.h index 8838677562..df0be08236 100644 --- a/interface/src/scripting/TestScriptingInterface.h +++ b/interface/src/scripting/TestScriptingInterface.h @@ -120,6 +120,12 @@ public slots: */ void savePhysicsSimulationStats(QString filename); + /**jsdoc + * Profiles a specific function + * @function Test.savePhysicsSimulationStats + * @param {string} name - Name used to reference the function + * @param {function} function - Function to profile + */ Q_INVOKABLE void profileRange(const QString& name, QScriptValue function); /**jsdoc @@ -131,6 +137,8 @@ public slots: /**jsdoc * Save a JSON object to a file in the test results location * @function Test.saveObject + * @param {string} name - Name of the object + * @param {string} filename - Name of file to save to */ void saveObject(QVariant v, const QString& filename); From 5fb7ec7b72f675b97cd3729c93ac634aefa703ab Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Tue, 29 May 2018 11:50:23 -0700 Subject: [PATCH 34/53] Updated jsdoc --- interface/src/scripting/TestScriptingInterface.h | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/scripting/TestScriptingInterface.h b/interface/src/scripting/TestScriptingInterface.h index df0be08236..c47e39d1f3 100644 --- a/interface/src/scripting/TestScriptingInterface.h +++ b/interface/src/scripting/TestScriptingInterface.h @@ -58,6 +58,7 @@ public slots: /**jsdoc * Waits for establishment of connection to server * @function Test.waitForConnection + * @param {int} maxWaitMs [default=10000] - Number of milliseconds to wait */ bool waitForConnection(qint64 maxWaitMs = 10000); From 66d39667e1587983129ab8b84132b756650e1c6d Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 29 May 2018 17:04:37 -0700 Subject: [PATCH 35/53] AccountManager destructor waits for any RSA key thread --- libraries/networking/src/AccountManager.cpp | 16 +++++++++++++++- libraries/networking/src/AccountManager.h | 7 +++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index a975a86ada..ffc73f0701 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -93,6 +93,13 @@ AccountManager::AccountManager(UserAgentGetter userAgentGetter) : const QString DOUBLE_SLASH_SUBSTITUTE = "slashslash"; const QString ACCOUNT_MANAGER_REQUESTED_SCOPE = "owner"; +AccountManager::~AccountManager() { + QMutexLocker lock(&_rsaKeygenLock); + while (_rsaKeygenThread) { + _rsaKeygenWait.wait(&_rsaKeygenLock); + } +} + void AccountManager::logout() { // a logout means we want to delete the DataServerAccountInfo we currently have for this URL, in-memory and in file _accountInfo = DataServerAccountInfo(); @@ -761,8 +768,9 @@ void AccountManager::generateNewKeypair(bool isUserKeypair, const QUuid& domainI this, &AccountManager::handleKeypairGenerationError); connect(keypairGenerator, &QObject::destroyed, generateThread, &QThread::quit); - connect(this, &QObject::destroyed, generateThread, &QThread::quit); + connect(generateThread, &QThread::finished, this, &AccountManager::rsaKeygenThreadFinished); connect(generateThread, &QThread::finished, generateThread, &QThread::deleteLater); + _rsaKeygenThread = generateThread; keypairGenerator->moveToThread(generateThread); @@ -870,3 +878,9 @@ void AccountManager::handleKeypairGenerationError() { sender()->deleteLater(); } + +void AccountManager::rsaKeygenThreadFinished() { + QMutexLocker lock(&_rsaKeygenLock); + _rsaKeygenThread = nullptr; + _rsaKeygenWait.wakeAll(); +} diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index 87b17d00d5..af89b67bdc 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include @@ -63,6 +65,7 @@ class AccountManager : public QObject, public Dependency { Q_OBJECT public: AccountManager(UserAgentGetter userAgentGetter = DEFAULT_USER_AGENT_GETTER); + ~AccountManager(); Q_INVOKABLE void sendRequest(const QString& path, AccountManagerAuth::Type authType, @@ -131,6 +134,7 @@ private slots: void publicKeyUploadSucceeded(QNetworkReply& reply); void publicKeyUploadFailed(QNetworkReply& reply); void generateNewKeypair(bool isUserKeypair = true, const QUuid& domainID = QUuid()); + void rsaKeygenThreadFinished(); private: AccountManager(AccountManager const& other) = delete; @@ -156,6 +160,9 @@ private: QByteArray _pendingPrivateKey; QUuid _sessionID { QUuid::createUuid() }; + QMutex _rsaKeygenLock; + QWaitCondition _rsaKeygenWait; + QThread* _rsaKeygenThread { nullptr }; }; #endif // hifi_AccountManager_h From 873cabe2848bbbecb17525f8791bb90265205017 Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 29 May 2018 17:46:25 -0700 Subject: [PATCH 36/53] Cleaning the code --- interface/src/avatar/MyAvatar.cpp | 4 +- interface/src/ui/overlays/ModelOverlay.cpp | 7 +- interface/src/ui/overlays/Overlay.h | 1 - interface/src/ui/overlays/OverlaysPayload.cpp | 15 --- .../src/avatars-renderer/Avatar.cpp | 4 +- libraries/render-utils/src/Model.cpp | 94 ++++++------------- libraries/render-utils/src/Model.h | 23 +++-- libraries/render/src/render/Item.cpp | 1 - libraries/render/src/render/Item.h | 18 ++-- 9 files changed, 58 insertions(+), 109 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index b89e3e6387..4306e9c76c 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -2061,8 +2061,8 @@ void MyAvatar::preDisplaySide(const RenderArgs* renderArgs) { _attachmentData[i].jointName.compare("RightEye", Qt::CaseInsensitive) == 0 || _attachmentData[i].jointName.compare("HeadTop_End", Qt::CaseInsensitive) == 0 || _attachmentData[i].jointName.compare("Face", Qt::CaseInsensitive) == 0) { - uint8_t modelRenderTagBits = shouldDrawHead ? render::ItemKey::TAG_BITS_0 : render::ItemKey::TAG_BITS_NONE; - modelRenderTagBits |= render::ItemKey::TAG_BITS_1; + uint8_t modelRenderTagBits = shouldDrawHead ? Model::MainView : Model::NoView; + modelRenderTagBits |= Model::SecondaryView; _attachmentModels[i]->setViewMask(modelRenderTagBits); _attachmentModels[i]->setGroupCulled(false); diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index cb66828dc5..cc40993480 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -103,12 +103,9 @@ void ModelOverlay::update(float deltatime) { if (_visibleDirty) { _visibleDirty = false; // don't show overlays in mirrors or spectator-cam unless _isVisibleInSecondaryCamera is true - _model->setViewMask((_isVisibleInSecondaryCamera ? render::ItemKey::TAG_BITS_1 : render::ItemKey::TAG_BITS_NONE), scene); + uint8_t modelRenderTagBits = Model::MainView | (_isVisibleInSecondaryCamera ? Model::SecondaryView : Model::NoView); + _model->setViewMask(modelRenderTagBits, scene); _model->setVisibleInScene(getVisible(), scene); - /*, - render::ItemKey::TAG_BITS_0 | - (_isVisibleInSecondaryCamera ? render::ItemKey::TAG_BITS_1 : render::ItemKey::TAG_BITS_NONE), - false);*/ } if (_drawInFrontDirty) { _drawInFrontDirty = false; diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index 2f27d50f7e..890d5178e5 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -132,7 +132,6 @@ private: namespace render { template <> const ItemKey payloadGetKey(const Overlay::Pointer& overlay); template <> const Item::Bound payloadGetBound(const Overlay::Pointer& overlay); - template <> int payloadGetLayer(const Overlay::Pointer& overlay); template <> void payloadRender(const Overlay::Pointer& overlay, RenderArgs* args); template <> const ShapeKey shapeGetShapeKey(const Overlay::Pointer& overlay); template <> uint32_t metaFetchMetaSubItems(const Overlay::Pointer& overlay, ItemIDs& subItems); diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index 1a79c54ac2..4bb03a5669 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -64,20 +64,6 @@ namespace render { template <> const Item::Bound payloadGetBound(const Overlay::Pointer& overlay) { return overlay->getBounds(); } - template <> int payloadGetLayer(const Overlay::Pointer& overlay) { - if (overlay->is3D()) { - auto overlay3D = std::dynamic_pointer_cast(overlay); - if (overlay3D->getDrawInFront()) { - return Item::LAYER_3D_FRONT; - } else if (overlay3D->getDrawHUDLayer()) { - return Item::LAYER_3D_HUD; - } else { - return Item::LAYER_3D; - } - } else { - return Item::LAYER_2D; - } - } template <> void payloadRender(const Overlay::Pointer& overlay, RenderArgs* args) { if (args) { overlay->render(args); @@ -87,7 +73,6 @@ namespace render { return overlay->getShapeKey(); } - template <> uint32_t metaFetchMetaSubItems(const Overlay::Pointer& overlay, ItemIDs& subItems) { return overlay->fetchMetaSubItems(subItems); } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 2d675088f7..d23c583cda 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -597,7 +597,7 @@ void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& sc for (auto& attachmentModel : _attachmentModels) { attachmentModel->addToScene(scene, transaction); attachmentModel->setViewMask(Model::AllViews); - attachmentModel->setGroupCulled(true); + attachmentModel->setGroupCulled(false); attachmentModel->setCanCastShadow(true); attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene); } @@ -827,7 +827,7 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { attachmentModel->addToScene(scene, transaction); attachmentModel->setViewMask(Model::AllViews); - attachmentModel->setGroupCulled(true); + attachmentModel->setGroupCulled(false); attachmentModel->setCanCastShadow(true); attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene); } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index d5a0f243b0..284d9c8e26 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -103,12 +103,10 @@ Model::Model(QObject* parent, SpatiallyNestable* spatiallyNestableOverride) : _snapModelToRegistrationPoint(false), _snappedToRegistrationPoint(false), _url(HTTP_INVALID_COM), - // _isVisible(true), - // _canCastShadow(false), _blendNumber(0), _appliedBlendNumber(0), _isWireframe(false), - _renderItemsKey(render::ItemKey::Builder().withVisible().withTagBits(AllViews).build()) + _renderItemKeyGlobalFlags(render::ItemKey::Builder().withVisible().withTagBits(AllViews).build()) { // we may have been created in the network thread, but we live in the main thread if (_viewState) { @@ -269,12 +267,7 @@ void Model::updateRenderItems() { modelTransform.setScale(glm::vec3(1.0f)); bool isWireframe = self->isWireframe(); - bool isVisible = self->isVisible(); - bool canCastShadow = self->canCastShadow(); - uint8_t viewTagBits = self->getViewMask(); - bool isLayeredInFront = self->isLayeredInFront(); - bool isLayeredInHUD = self->isLayeredInHUD(); - bool isGroupCulled = self->isGroupCulled(); + auto renderItemKeyGlobalFlags = self->getRenderItemKeyGlobalFlags(); render::Transaction transaction; for (int i = 0; i < (int) self->_modelMeshRenderItemIDs.size(); i++) { @@ -288,9 +281,7 @@ void Model::updateRenderItems() { bool useDualQuaternionSkinning = self->getUseDualQuaternionSkinning(); transaction.updateItem(itemID, [modelTransform, meshState, useDualQuaternionSkinning, - invalidatePayloadShapeKey, isWireframe, isVisible, - canCastShadow, viewTagBits, isLayeredInFront, - isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { + invalidatePayloadShapeKey, isWireframe, renderItemKeyGlobalFlags](ModelMeshPartPayload& data) { if (useDualQuaternionSkinning) { data.updateClusterBuffer(meshState.clusterDualQuaternions); } else { @@ -314,8 +305,7 @@ void Model::updateRenderItems() { } data.updateTransformForSkinnedMesh(renderTransform, modelTransform); - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); - // data.setLayer(isLayeredInFront, isLayeredInHUD); + data.updateKey(renderItemKeyGlobalFlags); data.setShapeKey(invalidatePayloadShapeKey, isWireframe, useDualQuaternionSkinning); }); } @@ -323,8 +313,9 @@ void Model::updateRenderItems() { Transform collisionMeshOffset; collisionMeshOffset.setIdentity(); foreach(auto itemID, self->_collisionRenderItemsMap.keys()) { - transaction.updateItem(itemID, [modelTransform, collisionMeshOffset](MeshPartPayload& data) { + transaction.updateItem(itemID, [renderItemKeyGlobalFlags, modelTransform, collisionMeshOffset](MeshPartPayload& data) { // update the model transform for this render item. + data.updateKey(renderItemKeyGlobalFlags); data.updateTransform(modelTransform, collisionMeshOffset); }); } @@ -773,40 +764,13 @@ void Model::calculateTriangleSets(const FBXGeometry& geometry) { } } } -/* -void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled) { - if (_isVisible != isVisible || _viewTagBits != viewTagBits || _isGroupCulled != isGroupCulled) { - _isVisible = isVisible; - _viewTagBits = viewTagBits; - _isGroupCulled = isGroupCulled; - - bool isLayeredInFront = _isLayeredInFront; - bool isLayeredInHUD = _isLayeredInHUD; - bool canCastShadow = _canCastShadow; - render::Transaction transaction; - foreach (auto item, _modelMeshRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, - isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); - }); - } - foreach(auto item, _collisionRenderItemsMap.keys()) { - transaction.updateItem(item, [isVisible, viewTagBits, isLayeredInFront, canCastShadow, - isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) { - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, viewTagBits, isGroupCulled); - }); - } - scene->enqueueTransaction(transaction); - } -} -*/ void Model::updateRenderItemsKey(const render::ScenePointer& scene) { if (!scene) { _needsFixupInScene = true; return; } - auto renderItemsKey = _renderItemsKey; + auto renderItemsKey = _renderItemKeyGlobalFlags; render::Transaction transaction; foreach(auto item, _modelMeshRenderItemsMap.keys()) { transaction.updateItem(item, [renderItemsKey](ModelMeshPartPayload& data) { @@ -823,72 +787,76 @@ void Model::updateRenderItemsKey(const render::ScenePointer& scene) { void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene) { if (Model::isVisible() != isVisible) { - auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); - _renderItemsKey = (isVisible ? keyBuilder.withVisible() : keyBuilder.withInvisible()); + auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); + _renderItemKeyGlobalFlags = (isVisible ? keyBuilder.withVisible() : keyBuilder.withInvisible()); updateRenderItemsKey(scene); } } bool Model::isVisible() const { - return _renderItemsKey.isVisible(); + return _renderItemKeyGlobalFlags.isVisible(); } void Model::setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene) { if (Model::canCastShadow() != canCastShadow) { - auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); - _renderItemsKey = (canCastShadow ? keyBuilder.withShadowCaster() : keyBuilder.withoutShadowCaster()); + auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); + _renderItemKeyGlobalFlags = (canCastShadow ? keyBuilder.withShadowCaster() : keyBuilder.withoutShadowCaster()); updateRenderItemsKey(scene); } } bool Model::canCastShadow() const { - return _renderItemsKey.isShadowCaster(); + return _renderItemKeyGlobalFlags.isShadowCaster(); } void Model::setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene) { if (Model::isLayeredInFront() != isLayeredInFront) { - auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); - _renderItemsKey = (isLayeredInFront ? keyBuilder.withLayer(render::Item::LAYER_3D_FRONT) : keyBuilder.withoutLayer()); + auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); + _renderItemKeyGlobalFlags = (isLayeredInFront ? keyBuilder.withLayer(render::Item::LAYER_3D_FRONT) : keyBuilder.withoutLayer()); updateRenderItemsKey(scene); } } bool Model::isLayeredInFront() const { - return _renderItemsKey.isLayer(render::Item::LAYER_3D_FRONT); + return _renderItemKeyGlobalFlags.isLayer(render::Item::LAYER_3D_FRONT); } void Model::setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene) { if (Model::isLayeredInHUD() != isLayeredInHUD) { - auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); - _renderItemsKey = (isLayeredInHUD ? keyBuilder.withLayer(render::Item::LAYER_3D_HUD) : keyBuilder.withoutLayer()); + auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); + _renderItemKeyGlobalFlags = (isLayeredInHUD ? keyBuilder.withLayer(render::Item::LAYER_3D_HUD) : keyBuilder.withoutLayer()); updateRenderItemsKey(scene); } } bool Model::isLayeredInHUD() const { - return _renderItemsKey.isLayer(render::Item::LAYER_3D_HUD); + return _renderItemKeyGlobalFlags.isLayer(render::Item::LAYER_3D_HUD); } void Model::setViewMask(uint8_t mask, const render::ScenePointer& scene) { if (Model::getViewMask() != mask) { - auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); - _renderItemsKey = keyBuilder.withTagBits(mask); + auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); + _renderItemKeyGlobalFlags = keyBuilder.withTagBits(mask); updateRenderItemsKey(scene); } } Model::ViewMask Model::getViewMask() const { - return (Model::ViewMask) _renderItemsKey.getTagBits(); + return (Model::ViewMask) _renderItemKeyGlobalFlags.getTagBits(); } void Model::setGroupCulled(bool isGroupCulled, const render::ScenePointer& scene) { if (Model::isGroupCulled() != isGroupCulled) { - auto keyBuilder = render::ItemKey::Builder(_renderItemsKey); - _renderItemsKey = (isGroupCulled ? keyBuilder.withSubMetaCulled() : keyBuilder.withoutSubMetaCulled()); + auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); + _renderItemKeyGlobalFlags = (isGroupCulled ? keyBuilder.withSubMetaCulled() : keyBuilder.withoutSubMetaCulled()); updateRenderItemsKey(scene); } } bool Model::isGroupCulled() const { - return _renderItemsKey.isSubMetaCulled(); + return _renderItemKeyGlobalFlags.isSubMetaCulled(); +} + +const render::ItemKey Model::getRenderItemKeyGlobalFlags() const { + return _renderItemKeyGlobalFlags; } bool Model::addToScene(const render::ScenePointer& scene, @@ -1690,7 +1658,7 @@ void Model::addMaterial(graphics::MaterialLayer material, const std::string& par for (auto shapeID : shapeIDs) { if (shapeID < _modelMeshRenderItemIDs.size()) { auto itemID = _modelMeshRenderItemIDs[shapeID]; - auto renderItemsKey = _renderItemsKey; + auto renderItemsKey = _renderItemKeyGlobalFlags; bool wireframe = isWireframe(); auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex; bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex); @@ -1714,7 +1682,7 @@ void Model::removeMaterial(graphics::MaterialPointer material, const std::string if (shapeID < _modelMeshRenderItemIDs.size()) { auto itemID = _modelMeshRenderItemIDs[shapeID]; bool visible = isVisible(); - auto renderItemsKey = _renderItemsKey; + auto renderItemsKey = _renderItemKeyGlobalFlags; bool wireframe = isWireframe(); auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex; bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index fb72f3bf23..cefd760f61 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -91,6 +91,7 @@ public: bool isVisible() const; enum ViewMask : uint8_t { + NoView = 0x00, // Not drawn at all MainView = 0x01, //render::ItemKey::TAG_BITS_0, SecondaryView = 0x02, //render::ItemKey::TAG_BITS_1, AllViews = 0xFF, //render::ItemKey::TAG_BITS_ALL, @@ -110,6 +111,9 @@ public: bool isLayeredInFront() const; bool isLayeredInHUD() const; + // Access the current RenderItemKey Global Flags used by the model and applied to the render items representing the parts of the model. + const render::ItemKey getRenderItemKeyGlobalFlags() const; + bool needsFixupInScene() const; bool needsReload() const { return _needsReload; } @@ -414,10 +418,6 @@ protected: QVector _blendshapeCoefficients; QUrl _url; - // bool _isVisible; - // uint8_t _viewTagBits{ render::ItemKey::TAG_BITS_ALL }; - - // bool _canCastShadow; gpu::Buffers _blendedVertexBuffers; @@ -481,12 +481,17 @@ protected: int _renderInfoDrawCalls { 0 }; int _renderInfoHasTransparent { false }; - render::ItemKey _renderItemsKey; - /* bool _isLayeredInFront { false }; - bool _isLayeredInHUD { false }; + // This Render ItemKey Global Flags capture the Model wide global set of flags that should be communicated to all the render items representing the Model. + // The flags concerned are: + // - isVisible: if true the Model is visible globally in the scene, regardless of the other flags in the item keys (tags or layer or shadow caster). + // - TagBits: the view mask defined through the TagBits telling in which view the Model is rendered if visible. + // - Layer: In which Layer this Model lives. + // - CastShadow: if true and visible and rendered in the view, the Model cast shadows if in a Light volume casting shadows. + // - CullGroup: if true, the render items representing the parts of the Model are culled by a single Meta render item that knows about them, they are not culled individually. + // For this to work, a Meta RI must exists and knows about the RIs of this Model. + // + render::ItemKey _renderItemKeyGlobalFlags; - bool _isGroupCulled{ false }; - */ bool shouldInvalidatePayloadShapeKey(int meshIndex); private: diff --git a/libraries/render/src/render/Item.cpp b/libraries/render/src/render/Item.cpp index 95cb3c9aed..8ea0474d16 100644 --- a/libraries/render/src/render/Item.cpp +++ b/libraries/render/src/render/Item.cpp @@ -49,7 +49,6 @@ const uint8_t ItemKey::TAG_BITS_7 { 0x80 }; const uint32_t ItemKey::KEY_TAG_BITS_MASK = ((uint32_t) ItemKey::TAG_BITS_ALL) << FIRST_TAG_BIT; // Layer bits are derived from the Layer enum, the number of bits needed to represent integer 0 to NUM_LAYERS -//const uint8_t ItemKey::NUM_LAYER_BITS { 3 }; const uint8_t ItemKey::LAYER_BITS_ALL { 0x07 }; const uint32_t ItemKey::KEY_LAYER_BITS_MASK = ((uint32_t)ItemKey::LAYER_BITS_ALL) << FIRST_LAYER_BIT; diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index 6353dca1a3..27aee5e981 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -67,11 +67,10 @@ public: const static uint8_t TAG_BITS_7; // Items are organized in layers, an item belongs to one of the 8 Layers available. - // By default an item is in the 'LAYER_NONE' meaning that it is NOT layered. - // Which is equivalent to say that LAYER_NONE, is the default Layer. + // By default an item is in the 'LAYER_DEFAULT' meaning that it is NOT layered. // THere is NO ordering relationship between layers. enum Layer : uint8_t { - LAYER_NONE = 0, // layer 0 is a 'NOT' layer, items are not considered layered, this is the default value + LAYER_DEFAULT = 0, // layer 0 aka Default is a 'NOT' layer, items are not considered layered, this is the default value LAYER_1, LAYER_2, LAYER_3, @@ -164,7 +163,7 @@ public: Builder& withTagBits(uint8_t tagBits) { _flags = evalTagBitsWithKeyBits(tagBits, _flags.to_ulong()); return (*this); } Builder& withLayer(uint8_t layer) { _flags = evalLayerBitsWithKeyBits(layer, _flags.to_ulong()); return (*this); } - Builder& withoutLayer() { return withLayer(LAYER_NONE); } + Builder& withoutLayer() { return withLayer(LAYER_DEFAULT); } // Convenient standard keys that we will keep on using all over the place static Builder opaqueShape() { return Builder().withTypeShape(); } @@ -206,7 +205,7 @@ public: uint8_t getLayer() const { return ((_flags.to_ulong() & KEY_LAYER_BITS_MASK) >> FIRST_LAYER_BIT); } bool isLayer(uint8_t layer) const { return getLayer() == layer; } - bool isLayered() const { return getLayer() != LAYER_NONE; } + bool isLayered() const { return getLayer() != LAYER_DEFAULT; } bool isSpatial() const { return !isLayered(); } // Probably not public, flags used by the scene @@ -277,7 +276,7 @@ public: // Set ALL the tags in one call using the Tag bits and the Tag bits touched Builder& withTagBits(uint8_t tagBits, uint8_t tagMask) { _value = ItemKey::evalTagBitsWithKeyBits(tagBits, _value.to_ulong()); _mask = ItemKey::evalTagBitsWithKeyBits(tagMask, _mask.to_ulong()); return (*this); } - Builder& withoutLayered() { _value = ItemKey::evalLayerBitsWithKeyBits(ItemKey::LAYER_NONE, _value.to_ulong()); _mask |= ItemKey::KEY_LAYER_BITS_MASK; return (*this); } + Builder& withoutLayered() { _value = ItemKey::evalLayerBitsWithKeyBits(ItemKey::LAYER_DEFAULT, _value.to_ulong()); _mask |= ItemKey::KEY_LAYER_BITS_MASK; return (*this); } Builder& withLayer(uint8_t layer) { _value = ItemKey::evalLayerBitsWithKeyBits(layer, _value.to_ulong()); _mask |= ItemKey::KEY_LAYER_BITS_MASK; return (*this); } Builder& withNothing() { _value.reset(); _mask.reset(); return (*this); } @@ -458,12 +457,11 @@ public: // Get the bound of the item expressed in world space (or eye space depending on the key.isWorldSpace()) const Bound getBound() const { return _payload->getBound(); } - // Get the layer where the item belongs. - // int getLayer() const { return _payload->getLayer(); } + // Get the layer where the item belongs, simply reflecting the key. int getLayer() const { return _key.getLayer(); } static const uint8_t LAYER_2D{ ItemKey::LAYER_1 }; - static const uint8_t LAYER_3D{ ItemKey::LAYER_NONE }; + static const uint8_t LAYER_3D{ ItemKey::LAYER_DEFAULT }; static const uint8_t LAYER_3D_FRONT{ ItemKey::LAYER_2 }; static const uint8_t LAYER_3D_HUD{ ItemKey::LAYER_3 }; @@ -515,7 +513,6 @@ inline QDebug operator<<(QDebug debug, const Item& item) { // Item shared interface supported by the payload template const ItemKey payloadGetKey(const std::shared_ptr& payloadData) { return ItemKey(); } template const Item::Bound payloadGetBound(const std::shared_ptr& payloadData) { return Item::Bound(); } -template int payloadGetLayer(const std::shared_ptr& payloadData) { return 0; } template void payloadRender(const std::shared_ptr& payloadData, RenderArgs* args) { } // Shape type interface @@ -542,7 +539,6 @@ public: // Payload general interface virtual const ItemKey getKey() const override { return payloadGetKey(_data); } virtual const Item::Bound getBound() const override { return payloadGetBound(_data); } - // virtual int getLayer() const override { return payloadGetLayer(_data); } virtual void render(RenderArgs* args) override { payloadRender(_data, args); } From 5d3502ed88d6a0c83f7a2e0d0e11e409e6988fd2 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 22 May 2018 12:12:53 -0700 Subject: [PATCH 37/53] activate body when removing action --- libraries/physics/src/PhysicsEngine.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index 21b5b38b13..dc8e40cef0 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -776,6 +776,7 @@ void PhysicsEngine::removeDynamic(const QUuid dynamicID) { _objectDynamics.remove(dynamicID); foreach(btRigidBody* rigidBody, rigidBodies) { _objectDynamicsByBody[rigidBody].remove(dynamic->getID()); + rigidBody->activate(); } dynamic->invalidate(); } From bc57003cfb917b028e869a461b34e4f10537575a Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 29 May 2018 17:56:12 -0700 Subject: [PATCH 38/53] activate body before disconnecting action from entity --- libraries/physics/src/ObjectDynamic.cpp | 7 +++++++ libraries/physics/src/ObjectDynamic.h | 2 +- libraries/physics/src/PhysicsEngine.cpp | 1 - 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/physics/src/ObjectDynamic.cpp b/libraries/physics/src/ObjectDynamic.cpp index 3341025a8f..28323a8b92 100644 --- a/libraries/physics/src/ObjectDynamic.cpp +++ b/libraries/physics/src/ObjectDynamic.cpp @@ -159,6 +159,13 @@ void ObjectDynamic::removeFromSimulation(EntitySimulationPointer simulation) con simulation->removeDynamic(myID); } +void ObjectDynamic::setOwnerEntity(const EntityItemPointer ownerEntity) { + if (!ownerEntity) { + activateBody(); + } + _ownerEntity = ownerEntity; +} + EntityItemPointer ObjectDynamic::getEntityByID(EntityItemID entityID) const { EntityItemPointer ownerEntity; withReadLock([&]{ diff --git a/libraries/physics/src/ObjectDynamic.h b/libraries/physics/src/ObjectDynamic.h index 7fdf2e323a..bfee79aca9 100644 --- a/libraries/physics/src/ObjectDynamic.h +++ b/libraries/physics/src/ObjectDynamic.h @@ -33,7 +33,7 @@ public: virtual void removeFromSimulation(EntitySimulationPointer simulation) const override; virtual EntityItemWeakPointer getOwnerEntity() const override { return _ownerEntity; } - virtual void setOwnerEntity(const EntityItemPointer ownerEntity) override { _ownerEntity = ownerEntity; } + virtual void setOwnerEntity(const EntityItemPointer ownerEntity) override; virtual void invalidate() {}; diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index dc8e40cef0..21b5b38b13 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -776,7 +776,6 @@ void PhysicsEngine::removeDynamic(const QUuid dynamicID) { _objectDynamics.remove(dynamicID); foreach(btRigidBody* rigidBody, rigidBodies) { _objectDynamicsByBody[rigidBody].remove(dynamic->getID()); - rigidBody->activate(); } dynamic->invalidate(); } From 2e9076c71e1b62dae8e2de35c706e511fcaa7b61 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 30 May 2018 11:14:49 -0700 Subject: [PATCH 39/53] Clean up and trying to get ready for merge --- interface/src/avatar/MyAvatar.cpp | 2 +- .../src/avatars-renderer/Avatar.cpp | 2 +- .../src/avatars-renderer/Avatar.h | 1 - .../src/RenderableModelEntityItem.cpp | 11 +-- .../render-utils/src/CauterizedModel.cpp | 11 +-- .../render-utils/src/MeshPartPayload.cpp | 92 ------------------- libraries/render-utils/src/MeshPartPayload.h | 6 -- libraries/render/src/render/Item.cpp | 6 -- libraries/render/src/render/Item.h | 9 +- 9 files changed, 13 insertions(+), 127 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 4306e9c76c..8c9bda56c2 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1483,7 +1483,7 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { _skeletonModelChangeCount++; int skeletonModelChangeCount = _skeletonModelChangeCount; Avatar::setSkeletonModelURL(skeletonModelURL); - _skeletonModel->setViewMask(render::ItemKey::TAG_BITS_NONE); + _skeletonModel->setViewMask(Model::NoView); _skeletonModel->setGroupCulled(true); _skeletonModel->setVisibleInScene(true, qApp->getMain3DScene()); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index d23c583cda..014ba56365 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -52,7 +52,7 @@ const glm::vec3 HAND_TO_PALM_OFFSET(0.0f, 0.12f, 0.08f); namespace render { template <> const ItemKey payloadGetKey(const AvatarSharedPointer& avatar) { - ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1).withMetaCullGroup(); + ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(Model::AllViews).withMetaCullGroup(); auto avatarPtr = static_pointer_cast(avatar); auto model = avatarPtr->getSkeletonModel(); if (!avatarPtr->getEnableMeshVisible()) { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index b2cd1631c2..f48a981ec3 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -74,7 +74,6 @@ public: virtual void instantiableAvatar() = 0; typedef render::Payload Payload; - // typedef std::shared_ptr PayloadPointer; void init(); void updateAvatarEntities(); diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 6a300ca587..2dbaa44849 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -1387,20 +1387,19 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce entity->stopModelOverrideIfNoParent(); // Default behavior for model is to not be visible in main view if cauterized (aka parented to the avatar's neck joint) - uint32_t viewTaskBits = _cauterized ? - render::ItemKey::TAG_BITS_1 : // draw in every view except the main one (view zero) - render::ItemKey::TAG_BITS_ALL; // draw in all views + auto viewMask = _cauterized ? + Model::SecondaryView : // draw in every view except the main one (view zero) + Model::AllViews; // draw in all views if (model->isVisible() != _visible) { // FIXME: this seems like it could be optimized if we tracked our last known visible state in // the renderable item. As it stands now the model checks it's visible/invisible state // so most of the time we don't do anything in this function. - // model->setVisibleInScene(_visible, scene, viewTaskBits, false); model->setVisibleInScene(_visible, scene); } - if (model->getViewMask() != viewTaskBits) { - model->setViewMask(viewTaskBits, scene); + if (model->getViewMask() != viewMask) { + model->setViewMask(viewMask, scene); } // TODO? early exit here when not visible? diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 387d0c7c23..79e0637af4 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -215,12 +215,8 @@ void CauterizedModel::updateRenderItems() { modelTransform.setRotation(self->getRotation()); bool isWireframe = self->isWireframe(); - bool isVisible = self->isVisible(); - bool canCastShadow = self->canCastShadow(); - bool isLayeredInFront = self->isLayeredInFront(); - bool isLayeredInHUD = self->isLayeredInHUD(); + auto renderItemKeyGlobalFlags = self->getRenderItemKeyGlobalFlags(); bool enableCauterization = self->getEnableCauterization(); - bool isGroupCulled = self->isGroupCulled(); render::Transaction transaction; for (int i = 0; i < (int)self->_modelMeshRenderItemIDs.size(); i++) { @@ -235,7 +231,7 @@ void CauterizedModel::updateRenderItems() { bool useDualQuaternionSkinning = self->getUseDualQuaternionSkinning(); transaction.updateItem(itemID, [modelTransform, meshState, useDualQuaternionSkinning, cauterizedMeshState, invalidatePayloadShapeKey, - isWireframe, isVisible, isLayeredInFront, isLayeredInHUD, canCastShadow, enableCauterization, isGroupCulled](CauterizedMeshPartPayload& data) { + isWireframe, renderItemKeyGlobalFlags, enableCauterization](CauterizedMeshPartPayload& data) { if (useDualQuaternionSkinning) { data.updateClusterBuffer(meshState.clusterDualQuaternions, cauterizedMeshState.clusterDualQuaternions); @@ -277,8 +273,7 @@ void CauterizedModel::updateRenderItems() { data.updateTransformForCauterizedMesh(renderTransform); data.setEnableCauterization(enableCauterization); - data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, canCastShadow, render::ItemKey::TAG_BITS_ALL, isGroupCulled); - // data.setLayer(isLayeredInFront, isLayeredInHUD); + data.updateKey(renderItemKeyGlobalFlags); data.setShapeKey(invalidatePayloadShapeKey, isWireframe, useDualQuaternionSkinning); }); } diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 5792a0c981..7cf8bc8297 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -79,39 +79,6 @@ void MeshPartPayload::removeMaterial(graphics::MaterialPointer material) { _drawMaterials.remove(material); } -void MeshPartPayload::updateKey(bool isVisible, uint8_t layer, bool canCastShadow, uint8_t tagBits, bool isGroupCulled) { - ItemKey::Builder builder; - builder.withTypeShape(); - - if (!isVisible) { - builder.withInvisible(); - } - - builder.withTagBits(tagBits); - - // if (layer) { - // builder.withLayered(); - builder.withLayer((ItemKey::Layer) layer); - // } - - if (canCastShadow) { - builder.withShadowCaster(); - } - - if (isGroupCulled) { - builder.withSubMetaCulled(); - } - - if (topMaterialExists()) { - auto matKey = _drawMaterials.top().material->getKey(); - if (matKey.isTranslucent()) { - builder.withTransparent(); - } - } - - _itemKey = builder.build(); -} - void MeshPartPayload::updateKey(const render::ItemKey& key) { ItemKey::Builder builder(key); builder.withTypeShape(); @@ -215,13 +182,6 @@ template <> const Item::Bound payloadGetBound(const ModelMeshPartPayload::Pointe } return Item::Bound(); } -/* -template <> int payloadGetLayer(const ModelMeshPartPayload::Pointer& payload) { - if (payload) { - return payload->getLayer(); - } - return 0; -}*/ template <> const ShapeKey shapeGetShapeKey(const ModelMeshPartPayload::Pointer& payload) { if (payload) { @@ -348,42 +308,6 @@ void ModelMeshPartPayload::updateTransformForSkinnedMesh(const Transform& render } // Note that this method is called for models but not for shapes -void ModelMeshPartPayload::updateKey(bool isVisible, uint8_t layer, bool canCastShadow, uint8_t tagBits, bool isGroupCulled) { - ItemKey::Builder builder; - builder.withTypeShape(); - - if (!isVisible) { - builder.withInvisible(); - } - - builder.withTagBits(tagBits); - - // if (isLayered) { - builder.withLayer((ItemKey::Layer) layer); - // } - - if (canCastShadow) { - builder.withShadowCaster(); - } - - if (isGroupCulled) { - builder.withSubMetaCulled(); - } - - if (_isBlendShaped || _isSkinned) { - builder.withDeformed(); - } - - if (topMaterialExists()) { - auto matKey = _drawMaterials.top().material->getKey(); - if (matKey.isTranslucent()) { - builder.withTransparent(); - } - } - - _itemKey = builder.build(); -} - void ModelMeshPartPayload::updateKey(const render::ItemKey& key) { ItemKey::Builder builder(key); builder.withTypeShape(); @@ -402,22 +326,6 @@ void ModelMeshPartPayload::updateKey(const render::ItemKey& key) { _itemKey = builder.build(); } -/* -void ModelMeshPartPayload::setLayer(bool isLayeredInFront, bool isLayeredInHUD) { - if (isLayeredInFront) { - _layer = Item::LAYER_3D_FRONT; - } else if (isLayeredInHUD) { - _layer = Item::LAYER_3D_HUD; - } else { - _layer = Item::LAYER_3D; - } -} -*/ -/* -int ModelMeshPartPayload::getLayer() const { - return _layer; -}*/ - void ModelMeshPartPayload::setShapeKey(bool invalidateShapeKey, bool isWireframe, bool useDualQuaternionSkinning) { if (invalidateShapeKey) { _shapeKey = ShapeKey::Builder::invalid(); diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 6782760d4c..5c7177e890 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -32,7 +32,6 @@ public: typedef render::Payload Payload; typedef Payload::DataPointer Pointer; - virtual void updateKey(bool isVisible, uint8_t layer, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false); virtual void updateKey(const render::ItemKey& key); virtual void updateMeshPart(const std::shared_ptr& drawMesh, int partIndex); @@ -96,7 +95,6 @@ public: void notifyLocationChanged() override; - void updateKey(bool isVisible, uint8_t layer, bool canCastShadow, uint8_t tagBits, bool isGroupCulled = false) override; void updateKey(const render::ItemKey& key) override; // matrix palette skinning @@ -107,11 +105,9 @@ public: void updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform); // Render Item interface -// int getLayer() const; render::ShapeKey getShapeKey() const override; // shape interface void render(RenderArgs* args) override; -// void setLayer(bool isLayeredInFront, bool isLayeredInHUD); void setShapeKey(bool invalidateShapeKey, bool isWireframe, bool useDualQuaternionSkinning); // ModelMeshPartPayload functions to perform render @@ -141,13 +137,11 @@ private: gpu::BufferPointer _blendedVertexBuffer; render::ShapeKey _shapeKey { render::ShapeKey::Builder::invalid() }; - // int _layer { render::Item::LAYER_3D }; }; namespace render { template <> const ItemKey payloadGetKey(const ModelMeshPartPayload::Pointer& payload); template <> const Item::Bound payloadGetBound(const ModelMeshPartPayload::Pointer& payload); - // template <> int payloadGetLayer(const ModelMeshPartPayload::Pointer& payload); template <> const ShapeKey shapeGetShapeKey(const ModelMeshPartPayload::Pointer& payload); template <> void payloadRender(const ModelMeshPartPayload::Pointer& payload, RenderArgs* args); } diff --git a/libraries/render/src/render/Item.cpp b/libraries/render/src/render/Item.cpp index 8ea0474d16..e2fb69e003 100644 --- a/libraries/render/src/render/Item.cpp +++ b/libraries/render/src/render/Item.cpp @@ -29,12 +29,6 @@ const float Item::Status::Value::CYAN = 180.0f; const float Item::Status::Value::BLUE = 240.0f; const float Item::Status::Value::MAGENTA = 300.0f; -/*const int Item::LAYER_2D = 0; -const int Item::LAYER_3D = 1; -const int Item::LAYER_3D_FRONT = 2; -const int Item::LAYER_3D_HUD = 3; -*/ - const uint8_t ItemKey::TAG_BITS_ALL { 0xFF }; const uint8_t ItemKey::TAG_BITS_NONE { 0x00 }; const uint8_t ItemKey::TAG_BITS_0 { 0x01 }; diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index 27aee5e981..e8e5c99d7d 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -288,8 +288,6 @@ public: static Builder light() { return Builder().withTypeLight(); } static Builder meta() { return Builder().withTypeMeta(); } static Builder background() { return Builder().withViewSpace().withLayer(ItemKey::LAYER_BACKGROUND); } - // static Builder opaqueShapeLayered() { return Builder().withTypeShape().withOpaque().withWorldSpace().withLayered(); } - // static Builder transparentShapeLayered() { return Builder().withTypeShape().withTransparent().withWorldSpace().withLayered(); } static Builder nothing() { return Builder().withNothing(); } }; @@ -412,7 +410,6 @@ public: public: virtual const ItemKey getKey() const = 0; virtual const Bound getBound() const = 0; - // virtual int getLayer() const = 0; virtual void render(RenderArgs* args) = 0; virtual const ShapeKey getShapeKey() const = 0; @@ -460,10 +457,10 @@ public: // Get the layer where the item belongs, simply reflecting the key. int getLayer() const { return _key.getLayer(); } - static const uint8_t LAYER_2D{ ItemKey::LAYER_1 }; static const uint8_t LAYER_3D{ ItemKey::LAYER_DEFAULT }; - static const uint8_t LAYER_3D_FRONT{ ItemKey::LAYER_2 }; - static const uint8_t LAYER_3D_HUD{ ItemKey::LAYER_3 }; + static const uint8_t LAYER_3D_FRONT{ ItemKey::LAYER_1 }; + static const uint8_t LAYER_3D_HUD{ ItemKey::LAYER_2 }; + static const uint8_t LAYER_2D{ ItemKey::LAYER_3 }; // Render call for the item void render(RenderArgs* args) const { _payload->render(args); } From 072d8b70b15455c5ab758eb7c64741e832370813 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 30 May 2018 13:36:02 -0700 Subject: [PATCH 40/53] adding back notifcations --- scripts/defaultScripts.js | 1 + scripts/system/notifications.js | 49 --------------------------------- 2 files changed, 1 insertion(+), 49 deletions(-) diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js index b0cbf0e246..59a51830be 100644 --- a/scripts/defaultScripts.js +++ b/scripts/defaultScripts.js @@ -23,6 +23,7 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/makeUserConnection.js", "system/tablet-goto.js", "system/marketplaces/marketplaces.js", + "system/notifications.js", "system/commerce/wallet.js", "system/edit.js", "system/dialTone.js", diff --git a/scripts/system/notifications.js b/scripts/system/notifications.js index a28f343ad3..0778e2a44b 100644 --- a/scripts/system/notifications.js +++ b/scripts/system/notifications.js @@ -79,11 +79,7 @@ var frame = 0; var ctrlIsPressed = false; var ready = true; - var MENU_NAME = 'Tools > Notifications'; - var PLAY_NOTIFICATION_SOUNDS_MENU_ITEM = "Play Notification Sounds"; var NOTIFICATION_MENU_ITEM_POST = " Notifications"; - var PLAY_NOTIFICATION_SOUNDS_SETTING = "play_notification_sounds"; - var PLAY_NOTIFICATION_SOUNDS_TYPE_SETTING_PRE = "play_notification_sounds_type_"; var NOTIFICATIONS_MESSAGE_CHANNEL = "Hifi-Notifications"; var NotificationType = { @@ -401,11 +397,6 @@ alpha: backgroundAlpha }; - if (Menu.isOptionChecked(PLAY_NOTIFICATION_SOUNDS_MENU_ITEM) && - Menu.isOptionChecked(NotificationType.getMenuString(notificationType))) { - randomSounds.playRandom(); - } - return notify(noticeProperties, buttonProperties, height, imageProperties); } @@ -618,30 +609,6 @@ } } - function setup() { - var type; - Menu.addMenu(MENU_NAME); - var checked = Settings.getValue(PLAY_NOTIFICATION_SOUNDS_SETTING); - checked = checked === '' ? true : checked; - Menu.addMenuItem({ - menuName: MENU_NAME, - menuItemName: PLAY_NOTIFICATION_SOUNDS_MENU_ITEM, - isCheckable: true, - isChecked: Settings.getValue(PLAY_NOTIFICATION_SOUNDS_SETTING) - }); - Menu.addSeparator(MENU_NAME, "Play sounds for:"); - for (type in NotificationType.properties) { - checked = Settings.getValue(PLAY_NOTIFICATION_SOUNDS_TYPE_SETTING_PRE + (parseInt(type, 10) + 1)); - checked = checked === '' ? true : checked; - Menu.addMenuItem({ - menuName: MENU_NAME, - menuItemName: NotificationType.properties[type].text + NOTIFICATION_MENU_ITEM_POST, - isCheckable: true, - isChecked: checked - }); - } - } - // When our script shuts down, we should clean up all of our overlays function scriptEnding() { var notificationIndex; @@ -649,27 +616,14 @@ Overlays.deleteOverlay(notifications[notificationIndex]); Overlays.deleteOverlay(buttons[notificationIndex]); } - Menu.removeMenu(MENU_NAME); Messages.unsubscribe(NOTIFICATIONS_MESSAGE_CHANNEL); } - function menuItemEvent(menuItem) { - if (menuItem === PLAY_NOTIFICATION_SOUNDS_MENU_ITEM) { - Settings.setValue(PLAY_NOTIFICATION_SOUNDS_SETTING, Menu.isOptionChecked(PLAY_NOTIFICATION_SOUNDS_MENU_ITEM)); - return; - } - var notificationType = NotificationType.getTypeFromMenuItem(menuItem); - if (notificationType !== notificationType.UNKNOWN) { - Settings.setValue(PLAY_NOTIFICATION_SOUNDS_TYPE_SETTING_PRE + notificationType, Menu.isOptionChecked(menuItem)); - } - } - Controller.keyPressEvent.connect(keyPressEvent); Controller.mousePressEvent.connect(mousePressEvent); Controller.keyReleaseEvent.connect(keyReleaseEvent); Script.update.connect(update); Script.scriptEnding.connect(scriptEnding); - Menu.menuItemEvent.connect(menuItemEvent); Window.domainConnectionRefused.connect(onDomainConnectionRefused); Window.stillSnapshotTaken.connect(onSnapshotTaken); Window.snapshot360Taken.connect(onSnapshotTaken); @@ -684,7 +638,4 @@ Messages.subscribe(NOTIFICATIONS_MESSAGE_CHANNEL); Messages.messageReceived.connect(onMessageReceived); - - setup(); - }()); // END LOCAL_SCOPE From 457b77ca0980ad71dee23a17c9f40e09abfe6a0b Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 30 May 2018 13:37:32 -0700 Subject: [PATCH 41/53] fixing static definition maybe --- libraries/render/src/render/Item.cpp | 5 +++++ libraries/render/src/render/Item.h | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libraries/render/src/render/Item.cpp b/libraries/render/src/render/Item.cpp index e2fb69e003..ab24a11107 100644 --- a/libraries/render/src/render/Item.cpp +++ b/libraries/render/src/render/Item.cpp @@ -29,6 +29,11 @@ const float Item::Status::Value::CYAN = 180.0f; const float Item::Status::Value::BLUE = 240.0f; const float Item::Status::Value::MAGENTA = 300.0f; +const uint8_t Item::LAYER_3D = ItemKey::LAYER_DEFAULT; +const uint8_t Item::LAYER_3D_FRONT = ItemKey::LAYER_1; +const uint8_t Item::LAYER_3D_HUD = ItemKey::LAYER_2; +const uint8_t Item::LAYER_2D = ItemKey::LAYER_3; + const uint8_t ItemKey::TAG_BITS_ALL { 0xFF }; const uint8_t ItemKey::TAG_BITS_NONE { 0x00 }; const uint8_t ItemKey::TAG_BITS_0 { 0x01 }; diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index e8e5c99d7d..45641d42ff 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -457,10 +457,10 @@ public: // Get the layer where the item belongs, simply reflecting the key. int getLayer() const { return _key.getLayer(); } - static const uint8_t LAYER_3D{ ItemKey::LAYER_DEFAULT }; - static const uint8_t LAYER_3D_FRONT{ ItemKey::LAYER_1 }; - static const uint8_t LAYER_3D_HUD{ ItemKey::LAYER_2 }; - static const uint8_t LAYER_2D{ ItemKey::LAYER_3 }; + static const uint8_t LAYER_3D; + static const uint8_t LAYER_3D_FRONT; + static const uint8_t LAYER_3D_HUD; + static const uint8_t LAYER_2D; // Render call for the item void render(RenderArgs* args) const { _payload->render(args); } From 8fb5d1b92d8f1b1fde8319a82113c7a723396de3 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 30 May 2018 13:41:08 -0700 Subject: [PATCH 42/53] Make RSA key-pair class a Runnable that's owned by a threadpool --- libraries/networking/src/AccountManager.cpp | 134 +++++++----------- libraries/networking/src/AccountManager.h | 8 +- .../networking/src/RSAKeypairGenerator.cpp | 5 +- .../networking/src/RSAKeypairGenerator.h | 15 +- 4 files changed, 61 insertions(+), 101 deletions(-) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index ffc73f0701..516484780c 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -94,10 +95,6 @@ const QString DOUBLE_SLASH_SUBSTITUTE = "slashslash"; const QString ACCOUNT_MANAGER_REQUESTED_SCOPE = "owner"; AccountManager::~AccountManager() { - QMutexLocker lock(&_rsaKeygenLock); - while (_rsaKeygenThread) { - _rsaKeygenWait.wait(&_rsaKeygenLock); - } } void AccountManager::logout() { @@ -747,96 +744,75 @@ void AccountManager::generateNewKeypair(bool isUserKeypair, const QUuid& domainI qCDebug(networking) << "Clearing current private key in DataServerAccountInfo"; _accountInfo.setPrivateKey(QByteArray()); - // setup a new QThread to generate the keypair on, in case it takes a while - QThread* generateThread = new QThread(this); - generateThread->setObjectName("Account Manager Generator Thread"); - - // setup a keypair generator + // Create a runnable keypair generated to create an RSA pair and exit. RSAKeypairGenerator* keypairGenerator = new RSAKeypairGenerator; if (!isUserKeypair) { - keypairGenerator->setDomainID(domainID); _accountInfo.setDomainID(domainID); } - // start keypair generation when the thread starts - connect(generateThread, &QThread::started, keypairGenerator, &RSAKeypairGenerator::generateKeypair); - // handle success or failure of keypair generation - connect(keypairGenerator, &RSAKeypairGenerator::generatedKeypair, this, &AccountManager::processGeneratedKeypair); - connect(keypairGenerator, &RSAKeypairGenerator::errorGeneratingKeypair, - this, &AccountManager::handleKeypairGenerationError); - - connect(keypairGenerator, &QObject::destroyed, generateThread, &QThread::quit); - connect(generateThread, &QThread::finished, this, &AccountManager::rsaKeygenThreadFinished); - connect(generateThread, &QThread::finished, generateThread, &QThread::deleteLater); - _rsaKeygenThread = generateThread; - - keypairGenerator->moveToThread(generateThread); + connect(keypairGenerator, &RSAKeypairGenerator::generatedKeypair, this, + &AccountManager::processGeneratedKeypair); + connect(keypairGenerator, &RSAKeypairGenerator::errorGeneratingKeypair, this, + &AccountManager::handleKeypairGenerationError); qCDebug(networking) << "Starting worker thread to generate 2048-bit RSA keypair."; - generateThread->start(); + // Start on Qt's global thread pool. + QThreadPool::globalInstance()->start(keypairGenerator); } } -void AccountManager::processGeneratedKeypair() { +void AccountManager::processGeneratedKeypair(QByteArray publicKey, QByteArray privateKey) { qCDebug(networking) << "Generated 2048-bit RSA keypair. Uploading public key now."; - RSAKeypairGenerator* keypairGenerator = qobject_cast(sender()); + // hold the private key to later set our metaverse API account info if upload succeeds + _pendingPrivateKey = privateKey; - if (keypairGenerator) { - // hold the private key to later set our metaverse API account info if upload succeeds - _pendingPrivateKey = keypairGenerator->getPrivateKey(); + // upload the public key so data-web has an up-to-date key + const QString USER_PUBLIC_KEY_UPDATE_PATH = "api/v1/user/public_key"; + const QString DOMAIN_PUBLIC_KEY_UPDATE_PATH = "api/v1/domains/%1/public_key"; - // upload the public key so data-web has an up-to-date key - const QString USER_PUBLIC_KEY_UPDATE_PATH = "api/v1/user/public_key"; - const QString DOMAIN_PUBLIC_KEY_UPDATE_PATH = "api/v1/domains/%1/public_key"; - - QString uploadPath; - const auto& domainID = keypairGenerator->getDomainID(); - if (domainID.isNull()) { - uploadPath = USER_PUBLIC_KEY_UPDATE_PATH; - } else { - uploadPath = DOMAIN_PUBLIC_KEY_UPDATE_PATH.arg(uuidStringWithoutCurlyBraces(domainID)); - } - - // setup a multipart upload to send up the public key - QHttpMultiPart* requestMultiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); - - QHttpPart publicKeyPart; - publicKeyPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")); - - publicKeyPart.setHeader(QNetworkRequest::ContentDispositionHeader, - QVariant("form-data; name=\"public_key\"; filename=\"public_key\"")); - publicKeyPart.setBody(keypairGenerator->getPublicKey()); - requestMultiPart->append(publicKeyPart); - - if (!domainID.isNull()) { - const auto& key = getTemporaryDomainKey(domainID); - QHttpPart apiKeyPart; - publicKeyPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")); - apiKeyPart.setHeader(QNetworkRequest::ContentDispositionHeader, - QVariant("form-data; name=\"api_key\"")); - apiKeyPart.setBody(key.toUtf8()); - requestMultiPart->append(apiKeyPart); - } - - // setup callback parameters so we know once the keypair upload has succeeded or failed - JSONCallbackParameters callbackParameters; - callbackParameters.jsonCallbackReceiver = this; - callbackParameters.jsonCallbackMethod = "publicKeyUploadSucceeded"; - callbackParameters.errorCallbackReceiver = this; - callbackParameters.errorCallbackMethod = "publicKeyUploadFailed"; - - sendRequest(uploadPath, AccountManagerAuth::Optional, QNetworkAccessManager::PutOperation, - callbackParameters, QByteArray(), requestMultiPart); - - keypairGenerator->deleteLater(); + QString uploadPath; + const auto& domainID = _accountInfo.getDomainID(); + if (domainID.isNull()) { + uploadPath = USER_PUBLIC_KEY_UPDATE_PATH; } else { - qCWarning(networking) << "Expected processGeneratedKeypair to be called by a live RSAKeypairGenerator" - << "but the casted sender is NULL. Will not process generated keypair."; + uploadPath = DOMAIN_PUBLIC_KEY_UPDATE_PATH.arg(uuidStringWithoutCurlyBraces(domainID)); } + + // setup a multipart upload to send up the public key + QHttpMultiPart* requestMultiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); + + QHttpPart publicKeyPart; + publicKeyPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")); + + publicKeyPart.setHeader(QNetworkRequest::ContentDispositionHeader, + QVariant("form-data; name=\"public_key\"; filename=\"public_key\"")); + publicKeyPart.setBody(publicKey); + requestMultiPart->append(publicKeyPart); + + // Currently broken? We don't have the temporary domain key. + if (!domainID.isNull()) { + const auto& key = getTemporaryDomainKey(domainID); + QHttpPart apiKeyPart; + publicKeyPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream")); + apiKeyPart.setHeader(QNetworkRequest::ContentDispositionHeader, + QVariant("form-data; name=\"api_key\"")); + apiKeyPart.setBody(key.toUtf8()); + requestMultiPart->append(apiKeyPart); + } + + // setup callback parameters so we know once the keypair upload has succeeded or failed + JSONCallbackParameters callbackParameters; + callbackParameters.jsonCallbackReceiver = this; + callbackParameters.jsonCallbackMethod = "publicKeyUploadSucceeded"; + callbackParameters.errorCallbackReceiver = this; + callbackParameters.errorCallbackMethod = "publicKeyUploadFailed"; + + sendRequest(uploadPath, AccountManagerAuth::Optional, QNetworkAccessManager::PutOperation, + callbackParameters, QByteArray(), requestMultiPart); } void AccountManager::publicKeyUploadSucceeded(QNetworkReply& reply) { @@ -875,12 +851,4 @@ void AccountManager::handleKeypairGenerationError() { // reset our waiting state for keypair response _isWaitingForKeypairResponse = false; - - sender()->deleteLater(); -} - -void AccountManager::rsaKeygenThreadFinished() { - QMutexLocker lock(&_rsaKeygenLock); - _rsaKeygenThread = nullptr; - _rsaKeygenWait.wakeAll(); } diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index af89b67bdc..a24acb35f5 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -15,8 +15,6 @@ #include #include #include -#include -#include #include #include @@ -130,11 +128,10 @@ signals: private slots: void processReply(); void handleKeypairGenerationError(); - void processGeneratedKeypair(); + void processGeneratedKeypair(QByteArray publicKey, QByteArray privateKey); void publicKeyUploadSucceeded(QNetworkReply& reply); void publicKeyUploadFailed(QNetworkReply& reply); void generateNewKeypair(bool isUserKeypair = true, const QUuid& domainID = QUuid()); - void rsaKeygenThreadFinished(); private: AccountManager(AccountManager const& other) = delete; @@ -160,9 +157,6 @@ private: QByteArray _pendingPrivateKey; QUuid _sessionID { QUuid::createUuid() }; - QMutex _rsaKeygenLock; - QWaitCondition _rsaKeygenWait; - QThread* _rsaKeygenThread { nullptr }; }; #endif // hifi_AccountManager_h diff --git a/libraries/networking/src/RSAKeypairGenerator.cpp b/libraries/networking/src/RSAKeypairGenerator.cpp index 222b04b47c..e83615e3df 100644 --- a/libraries/networking/src/RSAKeypairGenerator.cpp +++ b/libraries/networking/src/RSAKeypairGenerator.cpp @@ -25,7 +25,10 @@ RSAKeypairGenerator::RSAKeypairGenerator(QObject* parent) : QObject(parent) { +} +void RSAKeypairGenerator::run() { + generateKeypair(); } void RSAKeypairGenerator::generateKeypair() { @@ -92,5 +95,5 @@ void RSAKeypairGenerator::generateKeypair() { OPENSSL_free(publicKeyDER); OPENSSL_free(privateKeyDER); - emit generatedKeypair(); + emit generatedKeypair(_publicKey, _privateKey); } diff --git a/libraries/networking/src/RSAKeypairGenerator.h b/libraries/networking/src/RSAKeypairGenerator.h index 36f4a9550b..552f12395b 100644 --- a/libraries/networking/src/RSAKeypairGenerator.h +++ b/libraries/networking/src/RSAKeypairGenerator.h @@ -13,25 +13,20 @@ #define hifi_RSAKeypairGenerator_h #include +#include #include -class RSAKeypairGenerator : public QObject { +class RSAKeypairGenerator : public QObject, public QRunnable { Q_OBJECT public: - RSAKeypairGenerator(QObject* parent = 0); + RSAKeypairGenerator(QObject* parent = nullptr); - void setDomainID(const QUuid& domainID) { _domainID = domainID; } - const QUuid& getDomainID() const { return _domainID; } - - const QByteArray& getPublicKey() const { return _publicKey; } - const QByteArray& getPrivateKey() const { return _privateKey; } - -public slots: + virtual void run() override; void generateKeypair(); signals: void errorGeneratingKeypair(); - void generatedKeypair(); + void generatedKeypair(QByteArray publicKey, QByteArray privateKey); private: QUuid _domainID; From a3324c5616268d9b6fccae47b228d47d0f9b1257 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 30 May 2018 13:52:26 -0700 Subject: [PATCH 43/53] Remove empty destructor --- libraries/networking/src/AccountManager.cpp | 3 --- libraries/networking/src/AccountManager.h | 1 - 2 files changed, 4 deletions(-) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 516484780c..1830560130 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -94,9 +94,6 @@ AccountManager::AccountManager(UserAgentGetter userAgentGetter) : const QString DOUBLE_SLASH_SUBSTITUTE = "slashslash"; const QString ACCOUNT_MANAGER_REQUESTED_SCOPE = "owner"; -AccountManager::~AccountManager() { -} - void AccountManager::logout() { // a logout means we want to delete the DataServerAccountInfo we currently have for this URL, in-memory and in file _accountInfo = DataServerAccountInfo(); diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index a24acb35f5..3ff657b72a 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -63,7 +63,6 @@ class AccountManager : public QObject, public Dependency { Q_OBJECT public: AccountManager(UserAgentGetter userAgentGetter = DEFAULT_USER_AGENT_GETTER); - ~AccountManager(); Q_INVOKABLE void sendRequest(const QString& path, AccountManagerAuth::Type authType, From c8a04911f4a174c095cff1bd46a6af6377a11113 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 30 May 2018 16:45:29 -0700 Subject: [PATCH 44/53] Interface respects Show Overlay menu checkbox on start up. --- interface/src/Application.cpp | 10 +++++++++- interface/src/Application.h | 4 ++++ interface/src/Menu.cpp | 5 ++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c8559f660f..7d5fa81180 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3177,6 +3177,12 @@ void Application::setHmdTabletBecomesToolbarSetting(bool value) { updateSystemTabletMode(); } +#pragma optimize("", off) +void Application::setShowOverlays(bool value) { + _hmdTabletBecomesToolbarSetting.set(value); + updateSystemTabletMode(); +} + void Application::setPreferStylusOverLaser(bool value) { _preferStylusOverLaserSetting.set(value); } @@ -8260,13 +8266,15 @@ void Application::updateThreadPoolCount() const { QThreadPool::globalInstance()->setMaxThreadCount(threadPoolSize); } +#pragma optimize("", off) void Application::updateSystemTabletMode() { if (_settingsLoaded) { qApp->setProperty(hifi::properties::HMD, isHMDMode()); if (isHMDMode()) { DependencyManager::get()->setToolbarMode(getHmdTabletBecomesToolbarSetting()); } else { - DependencyManager::get()->setToolbarMode(getDesktopTabletBecomesToolbarSetting()); + // Show toolbar if toolbar is enabled AND the Show Overlays menu option is checked + DependencyManager::get()->setToolbarMode(getDesktopTabletBecomesToolbarSetting() && (Menu::getInstance()->isOptionChecked(MenuOption::Overlays))); } } } diff --git a/interface/src/Application.h b/interface/src/Application.h index 0fea476c07..856537d8e7 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -218,8 +218,12 @@ public: bool getDesktopTabletBecomesToolbarSetting() { return _desktopTabletBecomesToolbarSetting.get(); } void setDesktopTabletBecomesToolbarSetting(bool value); + bool getHmdTabletBecomesToolbarSetting() { return _hmdTabletBecomesToolbarSetting.get(); } void setHmdTabletBecomesToolbarSetting(bool value); + + void setShowOverlays(bool value); + bool getPreferStylusOverLaser() { return _preferStylusOverLaserSetting.get(); } void setPreferStylusOverLaser(bool value); // FIXME: Remove setting completely or make available through JavaScript API? diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index f55c389a1f..38d319aca2 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -240,7 +240,10 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::CenterPlayerInView, 0, true, qApp, SLOT(rotationModeChanged())); - addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Overlays, 0, true); + action = addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Overlays, 0, true); + connect(action, &QAction::triggered, [action] { + qApp->setDesktopTabletBecomesToolbarSetting(action->isChecked()); + }); // View > Enter First Person Mode in HMD addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPersonHMD, 0, true); From 06c167cc6801606c840b2cb1abe2443a7e08f53a Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 30 May 2018 16:49:36 -0700 Subject: [PATCH 45/53] Add error to failure name. --- tools/auto-tester/src/Test.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/auto-tester/src/Test.cpp b/tools/auto-tester/src/Test.cpp index 5c69715d2e..1a25cc5c0e 100644 --- a/tools/auto-tester/src/Test.cpp +++ b/tools/auto-tester/src/Test.cpp @@ -131,7 +131,9 @@ void Test::appendTestResultsToFile(const QString& testResultsFolderPath, TestFai exit(-1); } - QString failureFolderPath { testResultsFolderPath + "/" + "Failure_" + QString::number(index) + "--" + testFailure._actualImageFilename.left(testFailure._actualImageFilename.length() - 4) }; + QString err = QString::number(testFailure._error).left(6); + + QString failureFolderPath { testResultsFolderPath + "/" + err + "-Failure_" + QString::number(index) + "--" + testFailure._actualImageFilename.left(testFailure._actualImageFilename.length() - 4) }; if (!QDir().mkdir(failureFolderPath)) { QMessageBox::critical(0, "Internal error: " + QString(__FILE__) + ":" + QString::number(__LINE__), "Failed to create folder " + failureFolderPath); exit(-1); From d01d774f76f969a006c269daacefeb4f0ee78ed0 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 30 May 2018 16:51:17 -0700 Subject: [PATCH 46/53] WIP. --- interface/src/Application.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 5225a85bd7..6a271a276b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3180,7 +3180,6 @@ void Application::setHmdTabletBecomesToolbarSetting(bool value) { updateSystemTabletMode(); } -#pragma optimize("", off) void Application::setShowOverlays(bool value) { _hmdTabletBecomesToolbarSetting.set(value); updateSystemTabletMode(); @@ -8269,7 +8268,6 @@ void Application::updateThreadPoolCount() const { QThreadPool::globalInstance()->setMaxThreadCount(threadPoolSize); } -#pragma optimize("", off) void Application::updateSystemTabletMode() { if (_settingsLoaded) { qApp->setProperty(hifi::properties::HMD, isHMDMode()); From c1bc3bd1548b8c0dc53e7dbfd525003d0298d86f Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 30 May 2018 16:58:35 -0700 Subject: [PATCH 47/53] WIP. --- interface/src/Application.cpp | 13 +------------ interface/src/Application.h | 4 ---- interface/src/Menu.cpp | 5 +---- 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6a271a276b..23657b184a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3180,11 +3180,6 @@ void Application::setHmdTabletBecomesToolbarSetting(bool value) { updateSystemTabletMode(); } -void Application::setShowOverlays(bool value) { - _hmdTabletBecomesToolbarSetting.set(value); - updateSystemTabletMode(); -} - void Application::setPreferStylusOverLaser(bool value) { _preferStylusOverLaserSetting.set(value); } @@ -5130,11 +5125,6 @@ void Application::toggleOverlays() { menu->setIsOptionChecked(MenuOption::Overlays, !menu->isOptionChecked(MenuOption::Overlays)); } -void Application::setOverlaysVisible(bool visible) { - auto menu = Menu::getInstance(); - menu->setIsOptionChecked(MenuOption::Overlays, visible); -} - void Application::centerUI() { _overlayConductor.centerUI(); } @@ -8274,8 +8264,7 @@ void Application::updateSystemTabletMode() { if (isHMDMode()) { DependencyManager::get()->setToolbarMode(getHmdTabletBecomesToolbarSetting()); } else { - // Show toolbar if toolbar is enabled AND the Show Overlays menu option is checked - DependencyManager::get()->setToolbarMode(getDesktopTabletBecomesToolbarSetting() && (Menu::getInstance()->isOptionChecked(MenuOption::Overlays))); + DependencyManager::get()->setToolbarMode(getDesktopTabletBecomesToolbarSetting()); } } } diff --git a/interface/src/Application.h b/interface/src/Application.h index 856537d8e7..0fea476c07 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -218,12 +218,8 @@ public: bool getDesktopTabletBecomesToolbarSetting() { return _desktopTabletBecomesToolbarSetting.get(); } void setDesktopTabletBecomesToolbarSetting(bool value); - bool getHmdTabletBecomesToolbarSetting() { return _hmdTabletBecomesToolbarSetting.get(); } void setHmdTabletBecomesToolbarSetting(bool value); - - void setShowOverlays(bool value); - bool getPreferStylusOverLaser() { return _preferStylusOverLaserSetting.get(); } void setPreferStylusOverLaser(bool value); // FIXME: Remove setting completely or make available through JavaScript API? diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 38d319aca2..f55c389a1f 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -240,10 +240,7 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::CenterPlayerInView, 0, true, qApp, SLOT(rotationModeChanged())); - action = addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Overlays, 0, true); - connect(action, &QAction::triggered, [action] { - qApp->setDesktopTabletBecomesToolbarSetting(action->isChecked()); - }); + addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Overlays, 0, true); // View > Enter First Person Mode in HMD addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPersonHMD, 0, true); From df668e44ca4f867d7e0ed37c7bf75a16b18abd96 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 30 May 2018 16:59:53 -0700 Subject: [PATCH 48/53] WIP. --- interface/src/Application.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 23657b184a..42081de10d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3180,6 +3180,11 @@ void Application::setHmdTabletBecomesToolbarSetting(bool value) { updateSystemTabletMode(); } +void Application::setShowOverlays(bool value) { + _hmdTabletBecomesToolbarSetting.set(value); + updateSystemTabletMode(); +} + void Application::setPreferStylusOverLaser(bool value) { _preferStylusOverLaserSetting.set(value); } From 51b1188bdb6690ff809e0d41ca4b24df1e302ad7 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 30 May 2018 17:01:47 -0700 Subject: [PATCH 49/53] WIP. --- interface/src/Application.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 42081de10d..23657b184a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3180,11 +3180,6 @@ void Application::setHmdTabletBecomesToolbarSetting(bool value) { updateSystemTabletMode(); } -void Application::setShowOverlays(bool value) { - _hmdTabletBecomesToolbarSetting.set(value); - updateSystemTabletMode(); -} - void Application::setPreferStylusOverLaser(bool value) { _preferStylusOverLaserSetting.set(value); } From 6717a16098d71e37322ba1027b4c854aef646c52 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 30 May 2018 17:04:19 -0700 Subject: [PATCH 50/53] WIP. --- interface/src/Application.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 23657b184a..60b431fce7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5125,6 +5125,11 @@ void Application::toggleOverlays() { menu->setIsOptionChecked(MenuOption::Overlays, !menu->isOptionChecked(MenuOption::Overlays)); } +void Application::setShowOverlays(bool value) { + _hmdTabletBecomesToolbarSetting.set(value); + updateSystemTabletMode(); +} + void Application::centerUI() { _overlayConductor.centerUI(); } From bea21e3a681628d36452b0c101c232ab8edcac47 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 30 May 2018 17:06:49 -0700 Subject: [PATCH 51/53] WIP. --- interface/src/Application.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 60b431fce7..a43c2fdc5f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5125,9 +5125,9 @@ void Application::toggleOverlays() { menu->setIsOptionChecked(MenuOption::Overlays, !menu->isOptionChecked(MenuOption::Overlays)); } -void Application::setShowOverlays(bool value) { - _hmdTabletBecomesToolbarSetting.set(value); - updateSystemTabletMode(); +void Application::setOverlaysVisible(bool visible) { + auto menu = Menu::getInstance(); + menu->setIsOptionChecked(MenuOption::Overlays, visible); } void Application::centerUI() { From 513acc529e55e79660fad8f6d47911cec98f44dc Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 30 May 2018 23:31:54 -0700 Subject: [PATCH 52/53] INtroduce RenderConstants header file to define the alias names for Tag and Layer for Hifi REnder Engine --- interface/src/avatar/MyAvatar.cpp | 15 ++----- interface/src/avatar/MyAvatar.h | 2 - interface/src/ui/overlays/ModelOverlay.cpp | 4 +- interface/src/ui/overlays/OverlaysPayload.cpp | 10 ++--- .../src/avatars-renderer/Avatar.cpp | 29 ++++++------ .../src/avatars-renderer/Avatar.h | 2 +- .../src/RenderableModelEntityItem.cpp | 10 ++--- libraries/render-utils/src/Model.cpp | 44 +++++++++---------- libraries/render-utils/src/Model.h | 11 ++--- libraries/render-utils/src/RenderConstants.h | 37 ++++++++++++++++ .../render-utils/src/RenderDeferredTask.cpp | 5 ++- .../render-utils/src/RenderForwardTask.cpp | 5 ++- libraries/render/src/render/Item.cpp | 11 ++--- libraries/render/src/render/Item.h | 30 ++++++++----- 14 files changed, 120 insertions(+), 95 deletions(-) create mode 100644 libraries/render-utils/src/RenderConstants.h diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 8c9bda56c2..45fff2e17d 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1126,14 +1126,6 @@ void MyAvatar::setEnableDebugDrawIKChains(bool isEnabled) { _enableDebugDrawIKChains = isEnabled; } -bool MyAvatar::getEnableMeshVisible() const { - return Avatar::getEnableMeshVisible(); -} - -void MyAvatar::setEnableMeshVisible(bool isEnabled) { - Avatar::setEnableMeshVisible(isEnabled); -} - void MyAvatar::setEnableInverseKinematics(bool isEnabled) { _skeletonModel->getRig().setEnableInverseKinematics(isEnabled); } @@ -1483,7 +1475,7 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { _skeletonModelChangeCount++; int skeletonModelChangeCount = _skeletonModelChangeCount; Avatar::setSkeletonModelURL(skeletonModelURL); - _skeletonModel->setViewMask(Model::NoView); + _skeletonModel->setTagMask(Render::TAG_NONE); _skeletonModel->setGroupCulled(true); _skeletonModel->setVisibleInScene(true, qApp->getMain3DScene()); @@ -2061,10 +2053,9 @@ void MyAvatar::preDisplaySide(const RenderArgs* renderArgs) { _attachmentData[i].jointName.compare("RightEye", Qt::CaseInsensitive) == 0 || _attachmentData[i].jointName.compare("HeadTop_End", Qt::CaseInsensitive) == 0 || _attachmentData[i].jointName.compare("Face", Qt::CaseInsensitive) == 0) { - uint8_t modelRenderTagBits = shouldDrawHead ? Model::MainView : Model::NoView; - modelRenderTagBits |= Model::SecondaryView; + uint8_t modelRenderTagBits = shouldDrawHead ? Render::TAG_ALL_VIEWS : Render::TAG_SECONDARY_VIEW; - _attachmentModels[i]->setViewMask(modelRenderTagBits); + _attachmentModels[i]->setTagMask(modelRenderTagBits); _attachmentModels[i]->setGroupCulled(false); _attachmentModels[i]->setCanCastShadow(true); _attachmentModels[i]->setVisibleInScene(true, qApp->getMain3DScene()); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index b0c68899cf..f7cb75d340 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1159,7 +1159,6 @@ public slots: * @function MyAvatar.getEnableMeshVisible * @returns {boolean} true if your avatar's mesh is visible, otherwise false. */ - bool getEnableMeshVisible() const override; /**jsdoc * Set whether or not your avatar mesh is visible. @@ -1171,7 +1170,6 @@ public slots: * MyAvatar.setEnableMeshVisible(true); * }, 10000); */ - void setEnableMeshVisible(bool isEnabled) override; /**jsdoc * @function MyAvatar.setEnableInverseKinematics diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index cc40993480..ddf7241c5c 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -103,8 +103,8 @@ void ModelOverlay::update(float deltatime) { if (_visibleDirty) { _visibleDirty = false; // don't show overlays in mirrors or spectator-cam unless _isVisibleInSecondaryCamera is true - uint8_t modelRenderTagBits = Model::MainView | (_isVisibleInSecondaryCamera ? Model::SecondaryView : Model::NoView); - _model->setViewMask(modelRenderTagBits, scene); + uint8_t modelRenderTagMak = (_isVisibleInSecondaryCamera ? Render::TAG_ALL_VIEWS : Render::TAG_MAIN_VIEW); + _model->setTagMask(modelRenderTagMak, scene); _model->setVisibleInScene(getVisible(), scene); } if (_drawInFrontDirty) { diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index 4bb03a5669..642ae15d17 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -36,9 +36,9 @@ namespace render { if (overlay->is3D()) { auto overlay3D = std::static_pointer_cast(overlay); if (overlay3D->getDrawInFront()) { - builder.withLayer(render::Item::LAYER_3D_FRONT); + builder.withLayer(Render::LAYER_3D_FRONT); } else if (overlay3D->getDrawHUDLayer()) { - builder.withLayer(render::Item::LAYER_3D_HUD); + builder.withLayer(Render::LAYER_3D_HUD); } if (overlay->isTransparent()) { @@ -46,7 +46,7 @@ namespace render { } } else { builder.withViewSpace(); - builder.withLayer(render::Item::LAYER_2D); + builder.withLayer(Render::LAYER_2D); } if (!overlay->getVisible()) { @@ -54,8 +54,8 @@ namespace render { } // always visible in primary view. if isVisibleInSecondaryCamera, also draw in secondary view - uint32_t viewTaskBits = render::ItemKey::TAG_BITS_0 | - (overlay->getIsVisibleInSecondaryCamera() ? render::ItemKey::TAG_BITS_1 : render::ItemKey::TAG_BITS_NONE); + uint32_t viewTaskBits = Render::TAG_MAIN_VIEW | + (overlay->getIsVisibleInSecondaryCamera() ? Render::TAG_SECONDARY_VIEW : Render::TAG_NONE); builder.withTagBits(viewTaskBits); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 014ba56365..7eef7fc12a 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -52,9 +52,8 @@ const glm::vec3 HAND_TO_PALM_OFFSET(0.0f, 0.12f, 0.08f); namespace render { template <> const ItemKey payloadGetKey(const AvatarSharedPointer& avatar) { - ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(Model::AllViews).withMetaCullGroup(); + ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(Render::TAG_ALL_VIEWS).withMetaCullGroup(); auto avatarPtr = static_pointer_cast(avatar); - auto model = avatarPtr->getSkeletonModel(); if (!avatarPtr->getEnableMeshVisible()) { keyBuilder.withInvisible(); } @@ -588,18 +587,18 @@ void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& sc _renderBound = getBounds(); transaction.resetItem(_renderItemID, avatarPayloadPointer); _skeletonModel->addToScene(scene, transaction); - _skeletonModel->setViewMask(Model::AllViews); + _skeletonModel->setTagMask(Render::TAG_ALL_VIEWS); _skeletonModel->setGroupCulled(true); _skeletonModel->setCanCastShadow(true); - _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene); + _skeletonModel->setVisibleInScene(_isMeshVisible, scene); processMaterials(); for (auto& attachmentModel : _attachmentModels) { attachmentModel->addToScene(scene, transaction); - attachmentModel->setViewMask(Model::AllViews); + attachmentModel->setTagMask(Render::TAG_ALL_VIEWS); attachmentModel->setGroupCulled(false); attachmentModel->setCanCastShadow(true); - attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene); + attachmentModel->setVisibleInScene(_isMeshVisible, scene); } _mustFadeIn = true; @@ -790,14 +789,14 @@ void Avatar::render(RenderArgs* renderArgs) { void Avatar::setEnableMeshVisible(bool isEnabled) { - if (_isMeshEnableVisible != isEnabled) { - _isMeshEnableVisible = isEnabled; + if (_isMeshVisible != isEnabled) { + _isMeshVisible = isEnabled; _needMeshVisibleSwitch = true; } } bool Avatar::getEnableMeshVisible() const { - return _isMeshEnableVisible; + return _isMeshVisible; } void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { @@ -812,10 +811,10 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { _skeletonModel->removeFromScene(scene, transaction); _skeletonModel->addToScene(scene, transaction); - _skeletonModel->setViewMask(Model::AllViews); + _skeletonModel->setTagMask(Render::TAG_ALL_VIEWS); _skeletonModel->setGroupCulled(true); _skeletonModel->setCanCastShadow(true); - _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene); + _skeletonModel->setVisibleInScene(_isMeshVisible, scene); processMaterials(); canTryFade = true; @@ -826,18 +825,18 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { attachmentModel->removeFromScene(scene, transaction); attachmentModel->addToScene(scene, transaction); - attachmentModel->setViewMask(Model::AllViews); + attachmentModel->setTagMask(Render::TAG_ALL_VIEWS); attachmentModel->setGroupCulled(false); attachmentModel->setCanCastShadow(true); - attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene); + attachmentModel->setVisibleInScene(_isMeshVisible, scene); } } if (_needMeshVisibleSwitch) { - _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene); + _skeletonModel->setVisibleInScene(_isMeshVisible, scene); for (auto attachmentModel : _attachmentModels) { if (attachmentModel->isRenderable()) { - attachmentModel->setVisibleInScene(_isMeshEnableVisible, scene); + attachmentModel->setVisibleInScene(_isMeshVisible, scene); } } updateRenderItem(transaction); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index f48a981ec3..10c1d9ead2 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -538,7 +538,7 @@ protected: void processMaterials(); AABox _renderBound; - bool _isMeshEnableVisible{ true }; + bool _isMeshVisible{ true }; bool _needMeshVisibleSwitch{ true }; }; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 2dbaa44849..d65e38b688 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -1387,9 +1387,9 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce entity->stopModelOverrideIfNoParent(); // Default behavior for model is to not be visible in main view if cauterized (aka parented to the avatar's neck joint) - auto viewMask = _cauterized ? - Model::SecondaryView : // draw in every view except the main one (view zero) - Model::AllViews; // draw in all views + auto tagMask = _cauterized ? + Render::TAG_SECONDARY_VIEW : // draw in every view except the main one (view zero) + Render::TAG_ALL_VIEWS; // draw in all views if (model->isVisible() != _visible) { // FIXME: this seems like it could be optimized if we tracked our last known visible state in @@ -1398,8 +1398,8 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce model->setVisibleInScene(_visible, scene); } - if (model->getViewMask() != viewMask) { - model->setViewMask(viewMask, scene); + if (model->getTagMask() != tagMask) { + model->setTagMask(tagMask, scene); } // TODO? early exit here when not visible? diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 284d9c8e26..4530892299 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -106,7 +106,7 @@ Model::Model(QObject* parent, SpatiallyNestable* spatiallyNestableOverride) : _blendNumber(0), _appliedBlendNumber(0), _isWireframe(false), - _renderItemKeyGlobalFlags(render::ItemKey::Builder().withVisible().withTagBits(AllViews).build()) + _renderItemKeyGlobalFlags(render::ItemKey::Builder().withVisible().withTagBits(Render::TAG_ALL_VIEWS).build()) { // we may have been created in the network thread, but we live in the main thread if (_viewState) { @@ -785,10 +785,10 @@ void Model::updateRenderItemsKey(const render::ScenePointer& scene) { scene->enqueueTransaction(transaction); } -void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene) { - if (Model::isVisible() != isVisible) { +void Model::setVisibleInScene(bool visible, const render::ScenePointer& scene) { + if (Model::isVisible() != visible) { auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); - _renderItemKeyGlobalFlags = (isVisible ? keyBuilder.withVisible() : keyBuilder.withInvisible()); + _renderItemKeyGlobalFlags = (visible ? keyBuilder.withVisible() : keyBuilder.withInvisible()); updateRenderItemsKey(scene); } } @@ -797,10 +797,10 @@ bool Model::isVisible() const { return _renderItemKeyGlobalFlags.isVisible(); } -void Model::setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene) { - if (Model::canCastShadow() != canCastShadow) { +void Model::setCanCastShadow(bool castShadow, const render::ScenePointer& scene) { + if (Model::canCastShadow() != castShadow) { auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); - _renderItemKeyGlobalFlags = (canCastShadow ? keyBuilder.withShadowCaster() : keyBuilder.withoutShadowCaster()); + _renderItemKeyGlobalFlags = (castShadow ? keyBuilder.withShadowCaster() : keyBuilder.withoutShadowCaster()); updateRenderItemsKey(scene); } } @@ -809,45 +809,45 @@ bool Model::canCastShadow() const { return _renderItemKeyGlobalFlags.isShadowCaster(); } -void Model::setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene) { - if (Model::isLayeredInFront() != isLayeredInFront) { +void Model::setLayeredInFront(bool layeredInFront, const render::ScenePointer& scene) { + if (Model::isLayeredInFront() != layeredInFront) { auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); - _renderItemKeyGlobalFlags = (isLayeredInFront ? keyBuilder.withLayer(render::Item::LAYER_3D_FRONT) : keyBuilder.withoutLayer()); + _renderItemKeyGlobalFlags = (layeredInFront ? keyBuilder.withLayer(Render::LAYER_3D_FRONT) : keyBuilder.withoutLayer()); updateRenderItemsKey(scene); } } bool Model::isLayeredInFront() const { - return _renderItemKeyGlobalFlags.isLayer(render::Item::LAYER_3D_FRONT); + return _renderItemKeyGlobalFlags.isLayer(Render::LAYER_3D_FRONT); } -void Model::setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene) { - if (Model::isLayeredInHUD() != isLayeredInHUD) { +void Model::setLayeredInHUD(bool layeredInHUD, const render::ScenePointer& scene) { + if (Model::isLayeredInHUD() != layeredInHUD) { auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); - _renderItemKeyGlobalFlags = (isLayeredInHUD ? keyBuilder.withLayer(render::Item::LAYER_3D_HUD) : keyBuilder.withoutLayer()); + _renderItemKeyGlobalFlags = (layeredInHUD ? keyBuilder.withLayer(Render::LAYER_3D_HUD) : keyBuilder.withoutLayer()); updateRenderItemsKey(scene); } } bool Model::isLayeredInHUD() const { - return _renderItemKeyGlobalFlags.isLayer(render::Item::LAYER_3D_HUD); + return _renderItemKeyGlobalFlags.isLayer(Render::LAYER_3D_HUD); } -void Model::setViewMask(uint8_t mask, const render::ScenePointer& scene) { - if (Model::getViewMask() != mask) { +void Model::setTagMask(uint8_t mask, const render::ScenePointer& scene) { + if (Model::getTagMask() != mask) { auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); _renderItemKeyGlobalFlags = keyBuilder.withTagBits(mask); updateRenderItemsKey(scene); } } -Model::ViewMask Model::getViewMask() const { - return (Model::ViewMask) _renderItemKeyGlobalFlags.getTagBits(); +Render::Tag Model::getTagMask() const { + return (Render::Tag) _renderItemKeyGlobalFlags.getTagBits(); } -void Model::setGroupCulled(bool isGroupCulled, const render::ScenePointer& scene) { - if (Model::isGroupCulled() != isGroupCulled) { +void Model::setGroupCulled(bool groupCulled, const render::ScenePointer& scene) { + if (Model::isGroupCulled() != groupCulled) { auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); - _renderItemKeyGlobalFlags = (isGroupCulled ? keyBuilder.withSubMetaCulled() : keyBuilder.withoutSubMetaCulled()); + _renderItemKeyGlobalFlags = (groupCulled ? keyBuilder.withSubMetaCulled() : keyBuilder.withoutSubMetaCulled()); updateRenderItemsKey(scene); } } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index cefd760f61..23b0350dcb 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -33,6 +33,7 @@ #include #include +#include "RenderConstants.h" #include "GeometryCache.h" #include "TextureCache.h" #include "Rig.h" @@ -90,14 +91,8 @@ public: void setVisibleInScene(bool isVisible, const render::ScenePointer& scene = nullptr); bool isVisible() const; - enum ViewMask : uint8_t { - NoView = 0x00, // Not drawn at all - MainView = 0x01, //render::ItemKey::TAG_BITS_0, - SecondaryView = 0x02, //render::ItemKey::TAG_BITS_1, - AllViews = 0xFF, //render::ItemKey::TAG_BITS_ALL, - }; - ViewMask getViewMask() const; - void setViewMask(uint8_t mask, const render::ScenePointer& scene = nullptr); + Render::Tag getTagMask() const; + void setTagMask(uint8_t mask, const render::ScenePointer& scene = nullptr); bool isGroupCulled() const; void setGroupCulled(bool isGroupCulled, const render::ScenePointer& scene = nullptr); diff --git a/libraries/render-utils/src/RenderConstants.h b/libraries/render-utils/src/RenderConstants.h new file mode 100644 index 0000000000..96596c47fd --- /dev/null +++ b/libraries/render-utils/src/RenderConstants.h @@ -0,0 +1,37 @@ +// +// RenderConstants.h +// libraries/render-utils/src +// +// Created by Sam Gateau on 5/30/2018. +// Copyright 2018 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_RenderConstants_h +#define hifi_RenderConstants_h + +#include + +class Render { +public: + + // Tag is the alias names of render::ItemKey::Tag combinations used in the Hifi Render Engine + enum Tag : uint8_t { + TAG_NONE = render::ItemKey::TAG_BITS_NONE, // No Tags at all + TAG_MAIN_VIEW = render::ItemKey::TAG_BITS_0, // Main view + TAG_SECONDARY_VIEW = render::ItemKey::TAG_BITS_1, // Secondary View + TAG_ALL_VIEWS = TAG_MAIN_VIEW | TAG_SECONDARY_VIEW, // All views + }; + + // Layer is the alias names of the render::ItemKey::Layer used in the Hifi Render Engine + enum Layer : uint8_t { + LAYER_3D = render::ItemKey::LAYER_DEFAULT, + LAYER_3D_FRONT = render::ItemKey::LAYER_1, + LAYER_3D_HUD = render::ItemKey::LAYER_2, + LAYER_2D = render::ItemKey::LAYER_3, + LAYER_BACKGROUND = render::ItemKey::LAYER_BACKGROUND, + }; +}; + +#endif // hifi_RenderConstants_h diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 3ea56f8542..b64cf2e5e0 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -27,6 +27,7 @@ #include #include +#include "RenderConstants.h" #include "RenderCommonTask.h" #include "LightingModel.h" #include "StencilMaskPass.h" @@ -200,8 +201,8 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto overlaysInFrontRangeTimer = task.addJob("BeginOverlaysInFrontRangeTimer", "BeginOverlaysInFrontRangeTimer"); // Layered Overlays - const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, Item::LAYER_3D_FRONT); - const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, Item::LAYER_3D_FRONT); + const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, Render::LAYER_3D_FRONT); + const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, Render::LAYER_3D_FRONT); const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN(0); const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN(0); diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 4388a39cf3..9b7d799b86 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -23,6 +23,7 @@ #include +#include "RenderConstants.h" #include "StencilMaskPass.h" #include "ZoneRenderer.h" #include "FadeEffect.h" @@ -79,8 +80,8 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend task.addJob("PrepareStencil", framebuffer); // Layered Overlays - const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, Item::LAYER_3D_FRONT); - const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, Item::LAYER_3D_FRONT); + const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, Render::LAYER_3D_FRONT); + const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, Render::LAYER_3D_FRONT); const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN(0); const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN(0); diff --git a/libraries/render/src/render/Item.cpp b/libraries/render/src/render/Item.cpp index ab24a11107..bca0364c71 100644 --- a/libraries/render/src/render/Item.cpp +++ b/libraries/render/src/render/Item.cpp @@ -28,12 +28,7 @@ const float Item::Status::Value::GREEN = 120.0f; const float Item::Status::Value::CYAN = 180.0f; const float Item::Status::Value::BLUE = 240.0f; const float Item::Status::Value::MAGENTA = 300.0f; - -const uint8_t Item::LAYER_3D = ItemKey::LAYER_DEFAULT; -const uint8_t Item::LAYER_3D_FRONT = ItemKey::LAYER_1; -const uint8_t Item::LAYER_3D_HUD = ItemKey::LAYER_2; -const uint8_t Item::LAYER_2D = ItemKey::LAYER_3; - +/* const uint8_t ItemKey::TAG_BITS_ALL { 0xFF }; const uint8_t ItemKey::TAG_BITS_NONE { 0x00 }; const uint8_t ItemKey::TAG_BITS_0 { 0x01 }; @@ -44,11 +39,11 @@ const uint8_t ItemKey::TAG_BITS_4 { 0x10 }; const uint8_t ItemKey::TAG_BITS_5 { 0x20 }; const uint8_t ItemKey::TAG_BITS_6 { 0x40 }; const uint8_t ItemKey::TAG_BITS_7 { 0x80 }; - +*/ const uint32_t ItemKey::KEY_TAG_BITS_MASK = ((uint32_t) ItemKey::TAG_BITS_ALL) << FIRST_TAG_BIT; // Layer bits are derived from the Layer enum, the number of bits needed to represent integer 0 to NUM_LAYERS -const uint8_t ItemKey::LAYER_BITS_ALL { 0x07 }; +//const uint8_t ItemKey::LAYER_BITS_ALL { 0x07 }; const uint32_t ItemKey::KEY_LAYER_BITS_MASK = ((uint32_t)ItemKey::LAYER_BITS_ALL) << FIRST_LAYER_BIT; diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index 45641d42ff..490c7530b3 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -52,10 +52,21 @@ public: TAG_6, TAG_7, - NUM_TAGS + NUM_TAGS, + + TAG_BITS_ALL = 0xFF, + TAG_BITS_NONE = 0x00, + TAG_BITS_0 = 0x01, + TAG_BITS_1 = 0x02, + TAG_BITS_2 = 0x04, + TAG_BITS_3 = 0x08, + TAG_BITS_4 = 0x10, + TAG_BITS_5 = 0x20, + TAG_BITS_6 = 0x40, + TAG_BITS_7 = 0x80, }; - // Tag bits are derived from the Tag enum - const static uint8_t TAG_BITS_ALL; + /* // Tag bits are derived from the Tag enum + constexpr static uint8_t TAG_BITS_ALL; const static uint8_t TAG_BITS_NONE; const static uint8_t TAG_BITS_0; const static uint8_t TAG_BITS_1; @@ -65,7 +76,7 @@ public: const static uint8_t TAG_BITS_5; const static uint8_t TAG_BITS_6; const static uint8_t TAG_BITS_7; - +*/ // Items are organized in layers, an item belongs to one of the 8 Layers available. // By default an item is in the 'LAYER_DEFAULT' meaning that it is NOT layered. // THere is NO ordering relationship between layers. @@ -80,10 +91,12 @@ public: LAYER_BACKGROUND, // Last Layer is the background by convention NUM_LAYERS, - NUM_LAYER_BITS = 3 + + NUM_LAYER_BITS = 3, + LAYER_BITS_ALL = 0x07, }; // Layer bits are derived from the Layer enum, the number of bits needed to represent integer 0 to NUM_LAYERS - const static uint8_t LAYER_BITS_ALL; + // const static uint8_t LAYER_BITS_ALL; enum FlagBit : uint32_t { TYPE_SHAPE = 0, // Item is a Shape: Implements the Shape Interface that draw a Geometry rendered with a Material @@ -457,11 +470,6 @@ public: // Get the layer where the item belongs, simply reflecting the key. int getLayer() const { return _key.getLayer(); } - static const uint8_t LAYER_3D; - static const uint8_t LAYER_3D_FRONT; - static const uint8_t LAYER_3D_HUD; - static const uint8_t LAYER_2D; - // Render call for the item void render(RenderArgs* args) const { _payload->render(args); } From 386c0f9ab2b268c6001c506f5e4930e4c5d22f3f Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 31 May 2018 12:16:57 -0700 Subject: [PATCH 53/53] Re review adjustments --- interface/src/avatar/MyAvatar.cpp | 12 +++++- interface/src/avatar/MyAvatar.h | 2 + interface/src/ui/overlays/ModelOverlay.cpp | 4 +- interface/src/ui/overlays/OverlaysPayload.cpp | 12 +++--- .../src/avatars-renderer/Avatar.cpp | 10 ++--- .../src/RenderableModelEntityItem.cpp | 4 +- libraries/render-utils/src/Model.cpp | 14 +++--- libraries/render-utils/src/Model.h | 4 +- libraries/render-utils/src/RenderConstants.h | 37 ---------------- .../render-utils/src/RenderDeferredTask.cpp | 6 +-- .../render-utils/src/RenderForwardTask.cpp | 6 +-- libraries/render-utils/src/RenderHifi.h | 43 +++++++++++++++++++ libraries/render/src/render/Item.cpp | 17 +------- libraries/render/src/render/Item.h | 19 ++------ libraries/shared/src/shared/QtHelpers.h | 2 +- 15 files changed, 91 insertions(+), 101 deletions(-) delete mode 100644 libraries/render-utils/src/RenderConstants.h create mode 100644 libraries/render-utils/src/RenderHifi.h diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 45fff2e17d..0783094e10 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1126,6 +1126,14 @@ void MyAvatar::setEnableDebugDrawIKChains(bool isEnabled) { _enableDebugDrawIKChains = isEnabled; } +void MyAvatar::setEnableMeshVisible(bool isEnabled) { + return Avatar::setEnableMeshVisible(isEnabled); +} + +bool MyAvatar::getEnableMeshVisible() const { + return Avatar::getEnableMeshVisible(); +} + void MyAvatar::setEnableInverseKinematics(bool isEnabled) { _skeletonModel->getRig().setEnableInverseKinematics(isEnabled); } @@ -1475,7 +1483,7 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { _skeletonModelChangeCount++; int skeletonModelChangeCount = _skeletonModelChangeCount; Avatar::setSkeletonModelURL(skeletonModelURL); - _skeletonModel->setTagMask(Render::TAG_NONE); + _skeletonModel->setTagMask(render::hifi::TAG_NONE); _skeletonModel->setGroupCulled(true); _skeletonModel->setVisibleInScene(true, qApp->getMain3DScene()); @@ -2053,7 +2061,7 @@ void MyAvatar::preDisplaySide(const RenderArgs* renderArgs) { _attachmentData[i].jointName.compare("RightEye", Qt::CaseInsensitive) == 0 || _attachmentData[i].jointName.compare("HeadTop_End", Qt::CaseInsensitive) == 0 || _attachmentData[i].jointName.compare("Face", Qt::CaseInsensitive) == 0) { - uint8_t modelRenderTagBits = shouldDrawHead ? Render::TAG_ALL_VIEWS : Render::TAG_SECONDARY_VIEW; + uint8_t modelRenderTagBits = shouldDrawHead ? render::hifi::TAG_ALL_VIEWS : render::hifi::TAG_SECONDARY_VIEW; _attachmentModels[i]->setTagMask(modelRenderTagBits); _attachmentModels[i]->setGroupCulled(false); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index f7cb75d340..514dd9dcaf 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1159,6 +1159,7 @@ public slots: * @function MyAvatar.getEnableMeshVisible * @returns {boolean} true if your avatar's mesh is visible, otherwise false. */ + bool getEnableMeshVisible() const override; /**jsdoc * Set whether or not your avatar mesh is visible. @@ -1170,6 +1171,7 @@ public slots: * MyAvatar.setEnableMeshVisible(true); * }, 10000); */ + virtual void setEnableMeshVisible(bool isEnabled) override; /**jsdoc * @function MyAvatar.setEnableInverseKinematics diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index ddf7241c5c..a541b3365f 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -103,8 +103,8 @@ void ModelOverlay::update(float deltatime) { if (_visibleDirty) { _visibleDirty = false; // don't show overlays in mirrors or spectator-cam unless _isVisibleInSecondaryCamera is true - uint8_t modelRenderTagMak = (_isVisibleInSecondaryCamera ? Render::TAG_ALL_VIEWS : Render::TAG_MAIN_VIEW); - _model->setTagMask(modelRenderTagMak, scene); + uint8_t modelRenderTagMask = (_isVisibleInSecondaryCamera ? render::hifi::TAG_ALL_VIEWS : render::hifi::TAG_MAIN_VIEW); + _model->setTagMask(modelRenderTagMask, scene); _model->setVisibleInScene(getVisible(), scene); } if (_drawInFrontDirty) { diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index 642ae15d17..6b55b2b701 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -36,9 +36,9 @@ namespace render { if (overlay->is3D()) { auto overlay3D = std::static_pointer_cast(overlay); if (overlay3D->getDrawInFront()) { - builder.withLayer(Render::LAYER_3D_FRONT); + builder.withLayer(render::hifi::LAYER_3D_FRONT); } else if (overlay3D->getDrawHUDLayer()) { - builder.withLayer(Render::LAYER_3D_HUD); + builder.withLayer(render::hifi::LAYER_3D_HUD); } if (overlay->isTransparent()) { @@ -46,7 +46,7 @@ namespace render { } } else { builder.withViewSpace(); - builder.withLayer(Render::LAYER_2D); + builder.withLayer(render::hifi::LAYER_2D); } if (!overlay->getVisible()) { @@ -54,10 +54,10 @@ namespace render { } // always visible in primary view. if isVisibleInSecondaryCamera, also draw in secondary view - uint32_t viewTaskBits = Render::TAG_MAIN_VIEW | - (overlay->getIsVisibleInSecondaryCamera() ? Render::TAG_SECONDARY_VIEW : Render::TAG_NONE); + uint32_t viewTagBits = render::hifi::TAG_MAIN_VIEW | + (overlay->getIsVisibleInSecondaryCamera() ? render::hifi::TAG_SECONDARY_VIEW : render::hifi::TAG_NONE); - builder.withTagBits(viewTaskBits); + builder.withTagBits(viewTagBits); return builder.build(); } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 7eef7fc12a..5ce7637a3a 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -52,7 +52,7 @@ const glm::vec3 HAND_TO_PALM_OFFSET(0.0f, 0.12f, 0.08f); namespace render { template <> const ItemKey payloadGetKey(const AvatarSharedPointer& avatar) { - ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(Render::TAG_ALL_VIEWS).withMetaCullGroup(); + ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(render::hifi::TAG_ALL_VIEWS).withMetaCullGroup(); auto avatarPtr = static_pointer_cast(avatar); if (!avatarPtr->getEnableMeshVisible()) { keyBuilder.withInvisible(); @@ -587,7 +587,7 @@ void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& sc _renderBound = getBounds(); transaction.resetItem(_renderItemID, avatarPayloadPointer); _skeletonModel->addToScene(scene, transaction); - _skeletonModel->setTagMask(Render::TAG_ALL_VIEWS); + _skeletonModel->setTagMask(render::hifi::TAG_ALL_VIEWS); _skeletonModel->setGroupCulled(true); _skeletonModel->setCanCastShadow(true); _skeletonModel->setVisibleInScene(_isMeshVisible, scene); @@ -595,7 +595,7 @@ void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& sc processMaterials(); for (auto& attachmentModel : _attachmentModels) { attachmentModel->addToScene(scene, transaction); - attachmentModel->setTagMask(Render::TAG_ALL_VIEWS); + attachmentModel->setTagMask(render::hifi::TAG_ALL_VIEWS); attachmentModel->setGroupCulled(false); attachmentModel->setCanCastShadow(true); attachmentModel->setVisibleInScene(_isMeshVisible, scene); @@ -811,7 +811,7 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { _skeletonModel->removeFromScene(scene, transaction); _skeletonModel->addToScene(scene, transaction); - _skeletonModel->setTagMask(Render::TAG_ALL_VIEWS); + _skeletonModel->setTagMask(render::hifi::TAG_ALL_VIEWS); _skeletonModel->setGroupCulled(true); _skeletonModel->setCanCastShadow(true); _skeletonModel->setVisibleInScene(_isMeshVisible, scene); @@ -825,7 +825,7 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) { attachmentModel->removeFromScene(scene, transaction); attachmentModel->addToScene(scene, transaction); - attachmentModel->setTagMask(Render::TAG_ALL_VIEWS); + attachmentModel->setTagMask(render::hifi::TAG_ALL_VIEWS); attachmentModel->setGroupCulled(false); attachmentModel->setCanCastShadow(true); attachmentModel->setVisibleInScene(_isMeshVisible, scene); diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index d65e38b688..4026a94f65 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -1388,8 +1388,8 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce // Default behavior for model is to not be visible in main view if cauterized (aka parented to the avatar's neck joint) auto tagMask = _cauterized ? - Render::TAG_SECONDARY_VIEW : // draw in every view except the main one (view zero) - Render::TAG_ALL_VIEWS; // draw in all views + render::hifi::TAG_SECONDARY_VIEW : // draw in every view except the main one (view zero) + render::hifi::TAG_ALL_VIEWS; // draw in all views if (model->isVisible() != _visible) { // FIXME: this seems like it could be optimized if we tracked our last known visible state in diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 4530892299..7cfb1f6bc8 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -106,7 +106,7 @@ Model::Model(QObject* parent, SpatiallyNestable* spatiallyNestableOverride) : _blendNumber(0), _appliedBlendNumber(0), _isWireframe(false), - _renderItemKeyGlobalFlags(render::ItemKey::Builder().withVisible().withTagBits(Render::TAG_ALL_VIEWS).build()) + _renderItemKeyGlobalFlags(render::ItemKey::Builder().withVisible().withTagBits(render::hifi::TAG_ALL_VIEWS).build()) { // we may have been created in the network thread, but we live in the main thread if (_viewState) { @@ -812,25 +812,25 @@ bool Model::canCastShadow() const { void Model::setLayeredInFront(bool layeredInFront, const render::ScenePointer& scene) { if (Model::isLayeredInFront() != layeredInFront) { auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); - _renderItemKeyGlobalFlags = (layeredInFront ? keyBuilder.withLayer(Render::LAYER_3D_FRONT) : keyBuilder.withoutLayer()); + _renderItemKeyGlobalFlags = (layeredInFront ? keyBuilder.withLayer(render::hifi::LAYER_3D_FRONT) : keyBuilder.withoutLayer()); updateRenderItemsKey(scene); } } bool Model::isLayeredInFront() const { - return _renderItemKeyGlobalFlags.isLayer(Render::LAYER_3D_FRONT); + return _renderItemKeyGlobalFlags.isLayer(render::hifi::LAYER_3D_FRONT); } void Model::setLayeredInHUD(bool layeredInHUD, const render::ScenePointer& scene) { if (Model::isLayeredInHUD() != layeredInHUD) { auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); - _renderItemKeyGlobalFlags = (layeredInHUD ? keyBuilder.withLayer(Render::LAYER_3D_HUD) : keyBuilder.withoutLayer()); + _renderItemKeyGlobalFlags = (layeredInHUD ? keyBuilder.withLayer(render::hifi::LAYER_3D_HUD) : keyBuilder.withoutLayer()); updateRenderItemsKey(scene); } } bool Model::isLayeredInHUD() const { - return _renderItemKeyGlobalFlags.isLayer(Render::LAYER_3D_HUD); + return _renderItemKeyGlobalFlags.isLayer(render::hifi::LAYER_3D_HUD); } void Model::setTagMask(uint8_t mask, const render::ScenePointer& scene) { @@ -840,8 +840,8 @@ void Model::setTagMask(uint8_t mask, const render::ScenePointer& scene) { updateRenderItemsKey(scene); } } -Render::Tag Model::getTagMask() const { - return (Render::Tag) _renderItemKeyGlobalFlags.getTagBits(); +render::hifi::Tag Model::getTagMask() const { + return (render::hifi::Tag) _renderItemKeyGlobalFlags.getTagBits(); } void Model::setGroupCulled(bool groupCulled, const render::ScenePointer& scene) { diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 23b0350dcb..4180288106 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -33,7 +33,7 @@ #include #include -#include "RenderConstants.h" +#include "RenderHifi.h" #include "GeometryCache.h" #include "TextureCache.h" #include "Rig.h" @@ -91,7 +91,7 @@ public: void setVisibleInScene(bool isVisible, const render::ScenePointer& scene = nullptr); bool isVisible() const; - Render::Tag getTagMask() const; + render::hifi::Tag getTagMask() const; void setTagMask(uint8_t mask, const render::ScenePointer& scene = nullptr); bool isGroupCulled() const; diff --git a/libraries/render-utils/src/RenderConstants.h b/libraries/render-utils/src/RenderConstants.h deleted file mode 100644 index 96596c47fd..0000000000 --- a/libraries/render-utils/src/RenderConstants.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// RenderConstants.h -// libraries/render-utils/src -// -// Created by Sam Gateau on 5/30/2018. -// Copyright 2018 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_RenderConstants_h -#define hifi_RenderConstants_h - -#include - -class Render { -public: - - // Tag is the alias names of render::ItemKey::Tag combinations used in the Hifi Render Engine - enum Tag : uint8_t { - TAG_NONE = render::ItemKey::TAG_BITS_NONE, // No Tags at all - TAG_MAIN_VIEW = render::ItemKey::TAG_BITS_0, // Main view - TAG_SECONDARY_VIEW = render::ItemKey::TAG_BITS_1, // Secondary View - TAG_ALL_VIEWS = TAG_MAIN_VIEW | TAG_SECONDARY_VIEW, // All views - }; - - // Layer is the alias names of the render::ItemKey::Layer used in the Hifi Render Engine - enum Layer : uint8_t { - LAYER_3D = render::ItemKey::LAYER_DEFAULT, - LAYER_3D_FRONT = render::ItemKey::LAYER_1, - LAYER_3D_HUD = render::ItemKey::LAYER_2, - LAYER_2D = render::ItemKey::LAYER_3, - LAYER_BACKGROUND = render::ItemKey::LAYER_BACKGROUND, - }; -}; - -#endif // hifi_RenderConstants_h diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index b64cf2e5e0..47cab54d09 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -27,7 +27,7 @@ #include #include -#include "RenderConstants.h" +#include "RenderHifi.h" #include "RenderCommonTask.h" #include "LightingModel.h" #include "StencilMaskPass.h" @@ -201,8 +201,8 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto overlaysInFrontRangeTimer = task.addJob("BeginOverlaysInFrontRangeTimer", "BeginOverlaysInFrontRangeTimer"); // Layered Overlays - const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, Render::LAYER_3D_FRONT); - const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, Render::LAYER_3D_FRONT); + const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, render::hifi::LAYER_3D_FRONT); + const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, render::hifi::LAYER_3D_FRONT); const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN(0); const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN(0); diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 9b7d799b86..09a2afb711 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -23,7 +23,7 @@ #include -#include "RenderConstants.h" +#include "RenderHifi.h" #include "StencilMaskPass.h" #include "ZoneRenderer.h" #include "FadeEffect.h" @@ -80,8 +80,8 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend task.addJob("PrepareStencil", framebuffer); // Layered Overlays - const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, Render::LAYER_3D_FRONT); - const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, Render::LAYER_3D_FRONT); + const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, render::hifi::LAYER_3D_FRONT); + const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, render::hifi::LAYER_3D_FRONT); const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN(0); const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN(0); diff --git a/libraries/render-utils/src/RenderHifi.h b/libraries/render-utils/src/RenderHifi.h new file mode 100644 index 0000000000..c489a0ad1d --- /dev/null +++ b/libraries/render-utils/src/RenderHifi.h @@ -0,0 +1,43 @@ +// +// RenderHifi.h +// libraries/render-utils/src +// +// Created by Sam Gateau on 5/30/2018. +// Copyright 2018 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_RenderHifi_h +#define hifi_RenderHifi_h + +#include + + + +// In the library render-utils we are specializing the generic components of the render library to create the custom hifi render engine +// Objects and types serving this goal are define in the namespace render.hifi +// TODO: extend the namespace to all the classes where it make sense in render-utils +namespace render { + namespace hifi { + + // Tag is the alias names of render::ItemKey::Tag combinations used in the Hifi Render Engine + enum Tag : uint8_t { + TAG_NONE = render::ItemKey::TAG_BITS_NONE, // No Tags at all + TAG_MAIN_VIEW = render::ItemKey::TAG_BITS_0, // Main view + TAG_SECONDARY_VIEW = render::ItemKey::TAG_BITS_1, // Secondary View + TAG_ALL_VIEWS = TAG_MAIN_VIEW | TAG_SECONDARY_VIEW, // All views + }; + + // Layer is the alias names of the render::ItemKey::Layer used in the Hifi Render Engine + enum Layer : uint8_t { + LAYER_3D = render::ItemKey::LAYER_DEFAULT, + LAYER_3D_FRONT = render::ItemKey::LAYER_1, + LAYER_3D_HUD = render::ItemKey::LAYER_2, + LAYER_2D = render::ItemKey::LAYER_3, + LAYER_BACKGROUND = render::ItemKey::LAYER_BACKGROUND, + }; + } +} + +#endif // hifi_RenderHifi_h diff --git a/libraries/render/src/render/Item.cpp b/libraries/render/src/render/Item.cpp index bca0364c71..532964777f 100644 --- a/libraries/render/src/render/Item.cpp +++ b/libraries/render/src/render/Item.cpp @@ -28,26 +28,11 @@ const float Item::Status::Value::GREEN = 120.0f; const float Item::Status::Value::CYAN = 180.0f; const float Item::Status::Value::BLUE = 240.0f; const float Item::Status::Value::MAGENTA = 300.0f; -/* -const uint8_t ItemKey::TAG_BITS_ALL { 0xFF }; -const uint8_t ItemKey::TAG_BITS_NONE { 0x00 }; -const uint8_t ItemKey::TAG_BITS_0 { 0x01 }; -const uint8_t ItemKey::TAG_BITS_1 { 0x02 }; -const uint8_t ItemKey::TAG_BITS_2 { 0x04 }; -const uint8_t ItemKey::TAG_BITS_3 { 0x08 }; -const uint8_t ItemKey::TAG_BITS_4 { 0x10 }; -const uint8_t ItemKey::TAG_BITS_5 { 0x20 }; -const uint8_t ItemKey::TAG_BITS_6 { 0x40 }; -const uint8_t ItemKey::TAG_BITS_7 { 0x80 }; -*/ + const uint32_t ItemKey::KEY_TAG_BITS_MASK = ((uint32_t) ItemKey::TAG_BITS_ALL) << FIRST_TAG_BIT; -// Layer bits are derived from the Layer enum, the number of bits needed to represent integer 0 to NUM_LAYERS -//const uint8_t ItemKey::LAYER_BITS_ALL { 0x07 }; - const uint32_t ItemKey::KEY_LAYER_BITS_MASK = ((uint32_t)ItemKey::LAYER_BITS_ALL) << FIRST_LAYER_BIT; - void Item::Status::Value::setScale(float scale) { _scale = (std::numeric_limits::max() -1) * 0.5f * (1.0f + std::max(std::min(scale, 1.0f), 0.0f)); } diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index 490c7530b3..1dfef73686 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -54,6 +54,7 @@ public: NUM_TAGS, + // Tag bits are derived from the Tag enum TAG_BITS_ALL = 0xFF, TAG_BITS_NONE = 0x00, TAG_BITS_0 = 0x01, @@ -65,18 +66,7 @@ public: TAG_BITS_6 = 0x40, TAG_BITS_7 = 0x80, }; - /* // Tag bits are derived from the Tag enum - constexpr static uint8_t TAG_BITS_ALL; - const static uint8_t TAG_BITS_NONE; - const static uint8_t TAG_BITS_0; - const static uint8_t TAG_BITS_1; - const static uint8_t TAG_BITS_2; - const static uint8_t TAG_BITS_3; - const static uint8_t TAG_BITS_4; - const static uint8_t TAG_BITS_5; - const static uint8_t TAG_BITS_6; - const static uint8_t TAG_BITS_7; -*/ + // Items are organized in layers, an item belongs to one of the 8 Layers available. // By default an item is in the 'LAYER_DEFAULT' meaning that it is NOT layered. // THere is NO ordering relationship between layers. @@ -92,11 +82,10 @@ public: NUM_LAYERS, - NUM_LAYER_BITS = 3, + // Layer bits are derived from the Layer enum, the number of bits needed to represent integer 0 to NUM_LAYERS + NUM_LAYER_BITS = 3, LAYER_BITS_ALL = 0x07, }; - // Layer bits are derived from the Layer enum, the number of bits needed to represent integer 0 to NUM_LAYERS - // const static uint8_t LAYER_BITS_ALL; enum FlagBit : uint32_t { TYPE_SHAPE = 0, // Item is a Shape: Implements the Shape Interface that draw a Geometry rendered with a Material diff --git a/libraries/shared/src/shared/QtHelpers.h b/libraries/shared/src/shared/QtHelpers.h index 2133119324..3387be6909 100644 --- a/libraries/shared/src/shared/QtHelpers.h +++ b/libraries/shared/src/shared/QtHelpers.h @@ -48,6 +48,6 @@ bool blockingInvokeMethod( } } #define BLOCKING_INVOKE_METHOD(obj, member, ...) \ - hifi::qt::blockingInvokeMethod(__FUNCTION__, obj, member, ##__VA_ARGS__) + ::hifi::qt::blockingInvokeMethod(__FUNCTION__, obj, member, ##__VA_ARGS__) #endif