From 5fbf10c2f390918f126ea287c52302df8038add3 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 8 Oct 2018 23:48:12 -0700 Subject: [PATCH 1/8] INtroducing the LODEnabled flag on the render item in order prevent LOD to hide important objects regardless of the LOD level. --- interface/src/ui/overlays/ModelOverlay.cpp | 22 ++++++++++++++++++++++ interface/src/ui/overlays/ModelOverlay.h | 3 +++ libraries/render-utils/src/Model.cpp | 11 +++++++++++ libraries/render-utils/src/Model.h | 3 +++ libraries/render/src/render/CullTask.cpp | 6 +++--- libraries/render/src/render/Item.h | 9 +++++++++ scripts/system/libraries/WebTablet.js | 3 ++- 7 files changed, 53 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index eee8222051..2379685252 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -127,6 +127,11 @@ void ModelOverlay::update(float deltatime) { _model->setGroupCulled(_isGroupCulled, scene); metaDirty = true; } + if (_lodEnabledDirty) { + _lodEnabledDirty = false; + _model->setLODEnabled(_isLODEnabled, scene); + metaDirty = true; + } if (metaDirty) { transaction.updateItem(getRenderItemID(), [](Overlay& data) {}); } @@ -191,6 +196,14 @@ void ModelOverlay::setGroupCulled(bool groupCulled) { } } +void ModelOverlay::setLODEnabled(bool lodEnabled) { + if (lodEnabled != _isLODEnabled) { + _isLODEnabled = lodEnabled; + _lodEnabledDirty = true; + } +} + + void ModelOverlay::setProperties(const QVariantMap& properties) { auto origPosition = getWorldPosition(); auto origRotation = getWorldOrientation(); @@ -248,6 +261,12 @@ void ModelOverlay::setProperties(const QVariantMap& properties) { setGroupCulled(groupCulledValue.toBool()); } + auto lodEnabledValue = properties["isLODEnabled"]; + if (lodEnabledValue.isValid() && lodEnabledValue.canConvert(QVariant::Bool)) { + setLODEnabled(lodEnabledValue.toBool()); + } + + // jointNames is read-only. // jointPositions is read-only. // jointOrientations is read-only. @@ -765,5 +784,8 @@ render::ItemKey ModelOverlay::getKey() { if (_isGroupCulled) { builder.withMetaCullGroup(); } + if (!_isLODEnabled) { + builder.withLODDisabled(); + } return builder.build(); } \ No newline at end of file diff --git a/interface/src/ui/overlays/ModelOverlay.h b/interface/src/ui/overlays/ModelOverlay.h index bd922e258a..dc127afe48 100644 --- a/interface/src/ui/overlays/ModelOverlay.h +++ b/interface/src/ui/overlays/ModelOverlay.h @@ -69,6 +69,7 @@ public: void setDrawInFront(bool drawInFront) override; void setDrawHUDLayer(bool drawHUDLayer) override; void setGroupCulled(bool groupCulled); + void setLODEnabled(bool lodEnabled); void addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName) override; void removeMaterial(graphics::MaterialPointer material, const std::string& parentMaterialName) override; @@ -130,6 +131,8 @@ private: bool _drawInHUDDirty { false }; bool _isGroupCulled { false }; bool _groupCulledDirty { false }; + bool _isLODEnabled{ true }; + bool _lodEnabledDirty{ true }; void processMaterials(); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index a700c200f8..8b50f2e420 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -973,6 +973,17 @@ bool Model::isGroupCulled() const { return _renderItemKeyGlobalFlags.isSubMetaCulled(); } +void Model::setLODEnabled(bool isLODEnabled, const render::ScenePointer& scene) { + if (Model::isLODEnabled() != isLODEnabled) { + auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); + _renderItemKeyGlobalFlags = (isLODEnabled ? keyBuilder.withLODEnabled() : keyBuilder.withLODDisabled()); + updateRenderItemsKey(scene); + } +} +bool Model::isLODEnabled() const { + return _renderItemKeyGlobalFlags.isLODEnabled(); +} + const render::ItemKey Model::getRenderItemKeyGlobalFlags() const { return _renderItemKeyGlobalFlags; } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index e42da4ecb1..954cc57e0b 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -119,6 +119,9 @@ public: bool isGroupCulled() const; void setGroupCulled(bool isGroupCulled, const render::ScenePointer& scene = nullptr); + bool isLODEnabled() const; + void setLODEnabled(bool isLODEnabled, const render::ScenePointer& scene = nullptr); + bool canCastShadow() const; void setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene = nullptr); diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp index b2930032a3..ad9f6b7076 100644 --- a/libraries/render/src/render/CullTask.cpp +++ b/libraries/render/src/render/CullTask.cpp @@ -205,7 +205,7 @@ void CullSpatialSelection::run(const RenderContextPointer& renderContext, if (!srcFilter.selectsNothing()) { auto filter = render::ItemFilter::Builder(srcFilter).withoutSubMetaCulled().build(); - // Now get the bound, and + // Now get the bound, and // filter individually against the _filter // visibility cull if partially selected ( octree cell contianing it was partial) // distance cull if was a subcell item ( octree cell is way bigger than the item bound itself, so now need to test per item) @@ -294,7 +294,7 @@ void CullSpatialSelection::run(const RenderContextPointer& renderContext, auto& item = scene->getItem(id); if (filter.test(item.getKey())) { ItemBound itemBound(id, item.getBound()); - if (test.solidAngleTest(itemBound.bound)) { + if (item.getKey().isLODDisabled() || test.solidAngleTest(itemBound.bound)) { outItems.emplace_back(itemBound); if (item.getKey().isMetaCullGroup()) { item.fetchMetaSubItemBounds(outItems, (*scene)); @@ -329,7 +329,7 @@ void CullSpatialSelection::run(const RenderContextPointer& renderContext, if (filter.test(item.getKey())) { ItemBound itemBound(id, item.getBound()); if (test.frustumTest(itemBound.bound)) { - if (test.solidAngleTest(itemBound.bound)) { + if (item.getKey().isLODDisabled() || test.solidAngleTest(itemBound.bound)) { outItems.emplace_back(itemBound); if (item.getKey().isMetaCullGroup()) { item.fetchMetaSubItemBounds(outItems, (*scene)); diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index 88e85c604a..a30067cb5c 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -101,6 +101,7 @@ public: SHADOW_CASTER, // Item cast shadows 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 + LOD_DISABLED, // Item LOD behavior is disabled, it won't be LODed because of lod behavior in the view FIRST_TAG_BIT, // 8 Tags available to organize the items and filter them against LAST_TAG_BIT = FIRST_TAG_BIT + NUM_TAGS, @@ -160,6 +161,8 @@ public: 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& withLODDisabled() { _flags.set(LOD_DISABLED); return (*this); } + Builder& withLODEnabled() { _flags.reset(LOD_DISABLED); 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 @@ -203,6 +206,9 @@ public: bool isSubMetaCulled() const { return _flags[SUB_META_CULLED]; } void setSubMetaCulled(bool metaCulled) { (metaCulled ? _flags.set(SUB_META_CULLED) : _flags.reset(SUB_META_CULLED)); } + bool isLODEnabled() const { return !_flags[LOD_DISABLED]; } + bool isLODDisabled() const { return _flags[LOD_DISABLED]; } + 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); } @@ -274,6 +280,9 @@ public: Builder& withoutSubMetaCulled() { _value.reset(ItemKey::SUB_META_CULLED); _mask.set(ItemKey::SUB_META_CULLED); return (*this); } Builder& withSubMetaCulled() { _value.set(ItemKey::SUB_META_CULLED); _mask.set(ItemKey::SUB_META_CULLED); return (*this); } + Builder& withLODEnabled() { _value.reset(ItemKey::LOD_DISABLED); _mask.set(ItemKey::LOD_DISABLED); return (*this); } + Builder& withLODDisabled() { _value.set(ItemKey::LOD_DISABLED); _mask.set(ItemKey::LOD_DISABLED); return (*this); } + Builder& withoutTag(ItemKey::Tag tagIndex) { _value.reset(ItemKey::FIRST_TAG_BIT + tagIndex); _mask.set(ItemKey::FIRST_TAG_BIT + tagIndex); return (*this); } Builder& withTag(ItemKey::Tag tagIndex) { _value.set(ItemKey::FIRST_TAG_BIT + tagIndex); _mask.set(ItemKey::FIRST_TAG_BIT + tagIndex); return (*this); } // Set ALL the tags in one call using the Tag bits and the Tag bits touched diff --git a/scripts/system/libraries/WebTablet.js b/scripts/system/libraries/WebTablet.js index c201a251d0..0d13874e4c 100644 --- a/scripts/system/libraries/WebTablet.js +++ b/scripts/system/libraries/WebTablet.js @@ -135,7 +135,8 @@ WebTablet = function (url, width, dpi, hand, clientOnly, location, visible) { dimensions: { x: tabletWidth, y: tabletHeight, z: tabletDepth }, parentID: MyAvatar.SELF_ID, visible: visible, - isGroupCulled: true + isGroupCulled: true, + isLODEnabled: false }; // compute position, rotation & parentJointIndex of the tablet From ae3d5c148ae3882d74628994cbf3cd68c945f52c Mon Sep 17 00:00:00 2001 From: sam gateau Date: Mon, 15 Oct 2018 17:48:16 -0700 Subject: [PATCH 2/8] Debugging the tablet disappearing in hmd --- interface/src/ui/overlays/ModelOverlay.cpp | 20 ++++++++++++++++++-- libraries/render-utils/src/Model.cpp | 20 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 2379685252..5040842b3b 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -571,8 +571,24 @@ void ModelOverlay::locationChanged(bool tellPhysics) { // FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform() if (_model && _model->isActive()) { - _model->setRotation(getWorldOrientation()); - _model->setTranslation(getWorldPosition()); + if (!_isLODEnabled) { + auto rot = _model->getRotation(); + auto tra = _model->getTranslation(); + + auto nrot = getWorldOrientation(); + auto ntra = getWorldPosition(); + if (glm::any(glm::notEqual(rot, nrot))) { + rot = nrot; + _model->setRotation(rot); + } + if (glm::any(glm::notEqual(tra, ntra))) { + tra = ntra; + _model->setTranslation(tra); + } + } else { + _model->setRotation(getWorldOrientation()); + _model->setTranslation(getWorldPosition()); + } } } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 8b50f2e420..2bc9d25aff 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -228,6 +228,10 @@ void Model::updateRenderItems() { bool isWireframe = self->isWireframe(); auto renderItemKeyGlobalFlags = self->getRenderItemKeyGlobalFlags(); + if (renderItemKeyGlobalFlags.isLODDisabled()) { + modelTransform.setScale(glm::vec3(1.0f)); + } + render::Transaction transaction; for (int i = 0; i < (int) self->_modelMeshRenderItemIDs.size(); i++) { @@ -247,6 +251,8 @@ void Model::updateRenderItems() { data.updateClusterBuffer(meshState.clusterMatrices); } + auto bound = data.getBound(); + Transform renderTransform = modelTransform; if (useDualQuaternionSkinning) { @@ -264,6 +270,15 @@ void Model::updateRenderItems() { } data.updateTransformForSkinnedMesh(renderTransform, modelTransform); + if (renderItemKeyGlobalFlags.isLODDisabled()) { + auto newBound = data.getBound(); + if (bound != newBound) { + data.updateTransformForSkinnedMesh(renderTransform, modelTransform); + } else { + data.updateTransformForSkinnedMesh(renderTransform, modelTransform); + } + } + data.updateKey(renderItemKeyGlobalFlags); data.setShapeKey(invalidatePayloadShapeKey, isWireframe, useDualQuaternionSkinning); }); @@ -893,7 +908,12 @@ void Model::updateRenderItemsKey(const render::ScenePointer& scene) { _needsFixupInScene = true; return; } + auto prevVal = _needsFixupInScene; auto renderItemsKey = _renderItemKeyGlobalFlags; + if (renderItemsKey.isLODDisabled()) { + _needsFixupInScene = true; + _needsFixupInScene = prevVal; + } render::Transaction transaction; foreach(auto item, _modelMeshRenderItemsMap.keys()) { transaction.updateItem(item, [renderItemsKey](ModelMeshPartPayload& data) { From 4837fd86de6e72a59436280364d241fc4babe4f9 Mon Sep 17 00:00:00 2001 From: sam gateau Date: Tue, 16 Oct 2018 17:29:46 -0700 Subject: [PATCH 3/8] Desperataly trying to be efficient in js --- .../utilities/render/deferredLighting.qml | 26 +++- scripts/developer/utilities/render/luci.js | 128 +++++++++++++++--- 2 files changed, 129 insertions(+), 25 deletions(-) diff --git a/scripts/developer/utilities/render/deferredLighting.qml b/scripts/developer/utilities/render/deferredLighting.qml index a9479b2935..135c3fac97 100644 --- a/scripts/developer/utilities/render/deferredLighting.qml +++ b/scripts/developer/utilities/render/deferredLighting.qml @@ -279,11 +279,27 @@ Rectangle { } } Separator {} - HifiControls.Button { - text: "Engine" - // activeFocusOnPress: false - onClicked: { - sendToScript({method: "openEngineView"}); + Row { + HifiControls.Button { + text: "Engine" + // activeFocusOnPress: false + onClicked: { + sendToScript({method: "openEngineView"}); + } + } + HifiControls.Button { + text: "LOD" + // activeFocusOnPress: false + onClicked: { + sendToScript({method: "openEngineLODView"}); + } + } + HifiControls.Button { + text: "Cull" + // activeFocusOnPress: false + onClicked: { + sendToScript({method: "openCullInspectorView"}); + } } } } diff --git a/scripts/developer/utilities/render/luci.js b/scripts/developer/utilities/render/luci.js index cb5b01f9b2..40fb6e01d7 100644 --- a/scripts/developer/utilities/render/luci.js +++ b/scripts/developer/utilities/render/luci.js @@ -88,35 +88,123 @@ } - function fromQml(message) { - switch (message.method) { - case "openEngineView": - openEngineTaskView(); - break; - } - } + + var Page = function(title, qmlurl, width, height) { + + this.title = title; + this.qml = Script.resolvePath(qmlurl); + this.width = width; + this.height = height; + this.window = null; + }; + + Page.prototype.createView = function() { + if (this.window == null) { + var window = Desktop.createWindow(this.qml, { + title: this.title, + presentationMode: Desktop.PresentationMode.NATIVE, + size: {x: this.width, y: this.height} + }); + this.window = window + this.window.closed.connect(this.killView); + } + }; + + Page.prototype.killView = function() { + if (this.window !== undefined) { + this.window.closed.disconnect(this.killView); + this.window.close() + this.window = undefined + } + }; + + var pages = [] + pages.push_back(new Page('Render Engine', 'engineInspector.qml', 300, 400)) + + var engineInspectorView = null - function openEngineTaskView() { - if (engineInspectorView == null) { + function openEngineInspectorView() { + + /* if (engineInspectorView == null) { var qml = Script.resolvePath('engineInspector.qml'); - var window = new OverlayWindow({ + var window = Desktop.createWindow(qml, { title: 'Render Engine', - source: qml, - width: 300, - height: 400 + presentationMode: Desktop.PresentationMode.NATIVE, + size: {x: 300, y: 400} }); - window.setPosition(200, 50); engineInspectorView = window - window.closed.connect(function() { engineInspectorView = null; }); - } else { - engineInspectorView.setPosition(200, 50); + window.closed.connect(killEngineInspectorView); } } + function killEngineInspectorView() { + if (engineInspectorView !== undefined) { + engineInspectorView.closed.disconnect(killEngineInspectorView); + engineInspectorView.close() + engineInspectorView = undefined + } + } +*/ + var cullInspectorView = null + function openCullInspectorView() { + if (cullInspectorView == null) { + var qml = Script.resolvePath('culling.qml'); + var window = Desktop.createWindow(qml, { + title: 'Cull Inspector', + presentationMode: Desktop.PresentationMode.NATIVE, + size: {x: 400, y: 600} + }); + cullInspectorView = window + window.closed.connect(killCullInspectorView); + } + } + function killCullInspectorView() { + if (cullInspectorView !== undefined) { + cullInspectorView.closed.disconnect(killCullInspectorView); + cullInspectorView.close() + cullInspectorView = undefined + } + } + + var engineLODView = null + function openEngineLODView() { + if (engineLODView == null) { + engineLODView = Desktop.createWindow(Script.resolvePath('lod.qml'), { + title: 'Render LOD', + flags: Desktop.ALWAYS_ON_TOP, + presentationMode: Desktop.PresentationMode.NATIVE, + size: {x: 300, y: 500}, + }); + engineLODView.closed.connect(killEngineLODView); + } + } + function killEngineLODView() { + if (engineLODView !== undefined) { + engineLODView.closed.disconnect(killEngineLODView); + engineLODView.close() + engineLODView = undefined + } + } + + + function fromQml(message) { + switch (message.method) { + case "openEngineView": + openEngineInspectorView(); + break; + case "openCullInspectorView": + openCullInspectorView(); + break; + case "openEngineLODView": + openEngineLODView(); + break; + } + } + Script.scriptEnding.connect(function () { if (onLuciScreen) { tablet.gotoHomeScreen(); @@ -125,8 +213,8 @@ tablet.screenChanged.disconnect(onScreenChanged); tablet.removeButton(button); - if (engineInspectorView !== null) { - engineInspectorView.close() - } + killEngineInspectorView(); + killCullInspectorView(); + killEngineLODWindow(); }); }()); \ No newline at end of file From 5f229280066eb3b6a081a14c08fc492039d7be17 Mon Sep 17 00:00:00 2001 From: sam gateau Date: Wed, 17 Oct 2018 12:12:13 -0700 Subject: [PATCH 4/8] consolidating the tools under luci --- scripts/developer/utilities/render/luci.js | 259 +++++++-------------- 1 file changed, 90 insertions(+), 169 deletions(-) diff --git a/scripts/developer/utilities/render/luci.js b/scripts/developer/utilities/render/luci.js index 40fb6e01d7..cffeb615c9 100644 --- a/scripts/developer/utilities/render/luci.js +++ b/scripts/developer/utilities/render/luci.js @@ -11,210 +11,131 @@ // (function() { - var TABLET_BUTTON_NAME = "LUCI"; - var QMLAPP_URL = Script.resolvePath("./deferredLighting.qml"); - var ICON_URL = Script.resolvePath("../../../system/assets/images/luci-i.svg"); - var ACTIVE_ICON_URL = Script.resolvePath("../../../system/assets/images/luci-a.svg"); - - - var onLuciScreen = false; - - function onClicked() { - if (onLuciScreen) { - tablet.gotoHomeScreen(); - } else { - tablet.loadQMLSource(QMLAPP_URL); - } - } - - var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); - var button = tablet.addButton({ - text: TABLET_BUTTON_NAME, - icon: ICON_URL, - activeIcon: ACTIVE_ICON_URL - }); - - var hasEventBridge = false; - - function wireEventBridge(on) { - if (!tablet) { - print("Warning in wireEventBridge(): 'tablet' undefined!"); - return; - } - if (on) { - if (!hasEventBridge) { - tablet.fromQml.connect(fromQml); - hasEventBridge = true; - } - } else { - if (hasEventBridge) { - tablet.fromQml.disconnect(fromQml); - hasEventBridge = false; - } - } - } - - function onScreenChanged(type, url) { - if (url === QMLAPP_URL) { - onLuciScreen = true; - } else { - onLuciScreen = false; - } - - button.editProperties({isActive: onLuciScreen}); - wireEventBridge(onLuciScreen); - } - - button.clicked.connect(onClicked); - tablet.screenChanged.connect(onScreenChanged); + var AppUi = Script.require('appUi'); var moveDebugCursor = false; - Controller.mousePressEvent.connect(function (e) { + var onMousePressEvent = function (e) { if (e.isMiddleButton) { moveDebugCursor = true; setDebugCursor(e.x, e.y); } - }); - Controller.mouseReleaseEvent.connect(function() { moveDebugCursor = false; }); - Controller.mouseMoveEvent.connect(function (e) { if (moveDebugCursor) setDebugCursor(e.x, e.y); }); + }; + Controller.mousePressEvent.connect(onMousePressEvent); + var onMouseReleaseEvent = function () { + moveDebugCursor = false; + }; + Controller.mouseReleaseEvent.connect(onMouseReleaseEvent); + var onMouseMoveEvent = function (e) { + if (moveDebugCursor) { + setDebugCursor(e.x, e.y); + } + }; + Controller.mouseMoveEvent.connect(onMouseMoveEvent); function setDebugCursor(x, y) { - nx = 2.0 * (x / Window.innerWidth) - 1.0; - ny = 1.0 - 2.0 * ((y) / (Window.innerHeight)); + var nx = 2.0 * (x / Window.innerWidth) - 1.0; + var ny = 1.0 - 2.0 * ((y) / (Window.innerHeight)); - Render.getConfig("RenderMainView").getConfig("DebugDeferredBuffer").size = { x: nx, y: ny, z: 1.0, w: 1.0 }; + Render.getConfig("RenderMainView").getConfig("DebugDeferredBuffer").size = { x: nx, y: ny, z: 1.0, w: 1.0 }; } - - - var Page = function(title, qmlurl, width, height) { - + function Page(title, qmlurl, width, height) { this.title = title; - this.qml = Script.resolvePath(qmlurl); + this.qml = qmlurl; this.width = width; this.height = height; - this.window = null; + this.window; + + print("Page: New Page:" + JSON.stringify(this)); + } + + Page.prototype.killView = function () { + print("Page: Kill window for page:" + JSON.stringify(this)); + if (this.window) { + print("Page: Kill window for page:" + this.title); + //this.window.closed.disconnect(function () { + // this.killView(); + //}); + this.window.close(); + this.window = false; + } }; - Page.prototype.createView = function() { - if (this.window == null) { - var window = Desktop.createWindow(this.qml, { + Page.prototype.createView = function () { + var that = this; + if (!this.window) { + print("Page: New window for page:" + this.title); + this.window = Desktop.createWindow(Script.resolvePath(this.qml), { title: this.title, presentationMode: Desktop.PresentationMode.NATIVE, size: {x: this.width, y: this.height} }); - this.window = window - this.window.closed.connect(this.killView); + this.window.closed.connect(function () { + that.killView(); + }); } }; - Page.prototype.killView = function() { - if (this.window !== undefined) { - this.window.closed.disconnect(this.killView); - this.window.close() - this.window = undefined - } + + var Pages = function () { + this._pages = {}; }; - var pages = [] - pages.push_back(new Page('Render Engine', 'engineInspector.qml', 300, 400)) + Pages.prototype.addPage = function (command, title, qmlurl, width, height) { + this._pages[command] = new Page(title, qmlurl, width, height); + }; - + Pages.prototype.open = function (command) { + print("Pages: command = " + command); + if (!this._pages[command]) { + print("Pages: unknown command = " + command); + return; + } + this._pages[command].createView(); + }; - var engineInspectorView = null - function openEngineInspectorView() { - - /* if (engineInspectorView == null) { - var qml = Script.resolvePath('engineInspector.qml'); - var window = Desktop.createWindow(qml, { - title: 'Render Engine', - presentationMode: Desktop.PresentationMode.NATIVE, - size: {x: 300, y: 400} - }); - engineInspectorView = window - window.closed.connect(killEngineInspectorView); + Pages.prototype.clear = function () { + for (var p in this._pages) { + print("Pages: kill page: " + p); + this._pages[p].killView(); + delete this._pages[p]; } - } + this._pages = {}; + }; + var pages = new Pages(); - function killEngineInspectorView() { - if (engineInspectorView !== undefined) { - engineInspectorView.closed.disconnect(killEngineInspectorView); - engineInspectorView.close() - engineInspectorView = undefined - } - } -*/ - var cullInspectorView = null - function openCullInspectorView() { - if (cullInspectorView == null) { - var qml = Script.resolvePath('culling.qml'); - var window = Desktop.createWindow(qml, { - title: 'Cull Inspector', - presentationMode: Desktop.PresentationMode.NATIVE, - size: {x: 400, y: 600} - }); - cullInspectorView = window - window.closed.connect(killCullInspectorView); - } - } - - function killCullInspectorView() { - if (cullInspectorView !== undefined) { - cullInspectorView.closed.disconnect(killCullInspectorView); - cullInspectorView.close() - cullInspectorView = undefined - } - } - - var engineLODView = null - function openEngineLODView() { - if (engineLODView == null) { - engineLODView = Desktop.createWindow(Script.resolvePath('lod.qml'), { - title: 'Render LOD', - flags: Desktop.ALWAYS_ON_TOP, - presentationMode: Desktop.PresentationMode.NATIVE, - size: {x: 300, y: 500}, - }); - engineLODView.closed.connect(killEngineLODView); - } - } - function killEngineLODView() { - if (engineLODView !== undefined) { - engineLODView.closed.disconnect(killEngineLODView); - engineLODView.close() - engineLODView = undefined - } - } - - + pages.addPage('openEngineView', 'Render Engine', 'engineInspector.qml', 300, 400); + pages.addPage('openEngineLODView', 'Render LOD', 'lod.qml', 300, 400); + pages.addPage('openCullInspectorView', 'Cull Inspector', 'culling.qml', 300, 400); function fromQml(message) { - switch (message.method) { - case "openEngineView": - openEngineInspectorView(); - break; - case "openCullInspectorView": - openCullInspectorView(); - break; - case "openEngineLODView": - openEngineLODView(); - break; - } + if (pages.open(message.method)) { + return; + } } + var ui; + function startup() { + ui = new AppUi({ + buttonName: "LUCI", + home: Script.resolvePath("deferredLighting.qml"), + additionalAppScreens: Script.resolvePath("engineInspector.qml"), + onMessage: fromQml, + normalButton: Script.resolvePath("../../../system/assets/images/luci-i.svg"), + activeButton: Script.resolvePath("../../../system/assets/images/luci-a.svg") + }); + } + startup(); Script.scriptEnding.connect(function () { - if (onLuciScreen) { - tablet.gotoHomeScreen(); - } - button.clicked.disconnect(onClicked); - tablet.screenChanged.disconnect(onScreenChanged); - tablet.removeButton(button); - - killEngineInspectorView(); - killCullInspectorView(); - killEngineLODWindow(); + Controller.mousePressEvent.disconnect(onMousePressEvent); + Controller.mouseReleaseEvent.disconnect(onMouseReleaseEvent); + Controller.mouseMoveEvent.disconnect(onMouseMoveEvent); + pages.clear(); + // killEngineInspectorView(); + // killCullInspectorView(); + // killEngineLODWindow(); }); -}()); \ No newline at end of file +}()); From 60447bc52176993e408dc189755632e19dc4c21a Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 22 Oct 2018 22:27:16 -0700 Subject: [PATCH 5/8] Adding the missing MetaType on the overlay... --- interface/src/ui/overlays/ModelOverlay.cpp | 1 + interface/src/ui/overlays/Overlay.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 5040842b3b..80fbe0fb95 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -803,5 +803,6 @@ render::ItemKey ModelOverlay::getKey() { if (!_isLODEnabled) { builder.withLODDisabled(); } + return builder.build(); } \ No newline at end of file diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index 22cf924727..1bf94adfa0 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -247,7 +247,7 @@ void Overlay::removeMaterial(graphics::MaterialPointer material, const std::stri } render::ItemKey Overlay::getKey() { - auto builder = render::ItemKey::Builder().withTypeShape(); + auto builder = render::ItemKey::Builder().withTypeShape().withTypeMeta(); builder.withViewSpace(); builder.withLayer(render::hifi::LAYER_2D); From 702f6229b87869b118ed2ff8308abebfbc1420a0 Mon Sep 17 00:00:00 2001 From: sam gateau Date: Tue, 23 Oct 2018 08:50:10 -0700 Subject: [PATCH 6/8] Removing the pseudo fix for lod culling that is not ready in this pr --- interface/src/ui/overlays/ModelOverlay.cpp | 43 +--------------------- interface/src/ui/overlays/ModelOverlay.h | 3 -- libraries/render-utils/src/Model.cpp | 31 ---------------- libraries/render-utils/src/Model.h | 3 -- libraries/render/src/render/CullTask.cpp | 4 +- libraries/render/src/render/Item.h | 9 ----- 6 files changed, 4 insertions(+), 89 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 80fbe0fb95..eee8222051 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -127,11 +127,6 @@ void ModelOverlay::update(float deltatime) { _model->setGroupCulled(_isGroupCulled, scene); metaDirty = true; } - if (_lodEnabledDirty) { - _lodEnabledDirty = false; - _model->setLODEnabled(_isLODEnabled, scene); - metaDirty = true; - } if (metaDirty) { transaction.updateItem(getRenderItemID(), [](Overlay& data) {}); } @@ -196,14 +191,6 @@ void ModelOverlay::setGroupCulled(bool groupCulled) { } } -void ModelOverlay::setLODEnabled(bool lodEnabled) { - if (lodEnabled != _isLODEnabled) { - _isLODEnabled = lodEnabled; - _lodEnabledDirty = true; - } -} - - void ModelOverlay::setProperties(const QVariantMap& properties) { auto origPosition = getWorldPosition(); auto origRotation = getWorldOrientation(); @@ -261,12 +248,6 @@ void ModelOverlay::setProperties(const QVariantMap& properties) { setGroupCulled(groupCulledValue.toBool()); } - auto lodEnabledValue = properties["isLODEnabled"]; - if (lodEnabledValue.isValid() && lodEnabledValue.canConvert(QVariant::Bool)) { - setLODEnabled(lodEnabledValue.toBool()); - } - - // jointNames is read-only. // jointPositions is read-only. // jointOrientations is read-only. @@ -571,24 +552,8 @@ void ModelOverlay::locationChanged(bool tellPhysics) { // FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform() if (_model && _model->isActive()) { - if (!_isLODEnabled) { - auto rot = _model->getRotation(); - auto tra = _model->getTranslation(); - - auto nrot = getWorldOrientation(); - auto ntra = getWorldPosition(); - if (glm::any(glm::notEqual(rot, nrot))) { - rot = nrot; - _model->setRotation(rot); - } - if (glm::any(glm::notEqual(tra, ntra))) { - tra = ntra; - _model->setTranslation(tra); - } - } else { - _model->setRotation(getWorldOrientation()); - _model->setTranslation(getWorldPosition()); - } + _model->setRotation(getWorldOrientation()); + _model->setTranslation(getWorldPosition()); } } @@ -800,9 +765,5 @@ render::ItemKey ModelOverlay::getKey() { if (_isGroupCulled) { builder.withMetaCullGroup(); } - if (!_isLODEnabled) { - builder.withLODDisabled(); - } - return builder.build(); } \ No newline at end of file diff --git a/interface/src/ui/overlays/ModelOverlay.h b/interface/src/ui/overlays/ModelOverlay.h index dc127afe48..bd922e258a 100644 --- a/interface/src/ui/overlays/ModelOverlay.h +++ b/interface/src/ui/overlays/ModelOverlay.h @@ -69,7 +69,6 @@ public: void setDrawInFront(bool drawInFront) override; void setDrawHUDLayer(bool drawHUDLayer) override; void setGroupCulled(bool groupCulled); - void setLODEnabled(bool lodEnabled); void addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName) override; void removeMaterial(graphics::MaterialPointer material, const std::string& parentMaterialName) override; @@ -131,8 +130,6 @@ private: bool _drawInHUDDirty { false }; bool _isGroupCulled { false }; bool _groupCulledDirty { false }; - bool _isLODEnabled{ true }; - bool _lodEnabledDirty{ true }; void processMaterials(); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index da50fd6ff0..53009e8bfa 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -226,10 +226,6 @@ void Model::updateRenderItems() { bool isWireframe = self->isWireframe(); auto renderItemKeyGlobalFlags = self->getRenderItemKeyGlobalFlags(); - if (renderItemKeyGlobalFlags.isLODDisabled()) { - modelTransform.setScale(glm::vec3(1.0f)); - } - render::Transaction transaction; for (int i = 0; i < (int) self->_modelMeshRenderItemIDs.size(); i++) { @@ -249,8 +245,6 @@ void Model::updateRenderItems() { data.updateClusterBuffer(meshState.clusterMatrices); } - auto bound = data.getBound(); - Transform renderTransform = modelTransform; if (useDualQuaternionSkinning) { @@ -268,15 +262,6 @@ void Model::updateRenderItems() { } data.updateTransformForSkinnedMesh(renderTransform, modelTransform); - if (renderItemKeyGlobalFlags.isLODDisabled()) { - auto newBound = data.getBound(); - if (bound != newBound) { - data.updateTransformForSkinnedMesh(renderTransform, modelTransform); - } else { - data.updateTransformForSkinnedMesh(renderTransform, modelTransform); - } - } - data.updateKey(renderItemKeyGlobalFlags); data.setShapeKey(invalidatePayloadShapeKey, isWireframe, useDualQuaternionSkinning); }); @@ -906,12 +891,7 @@ void Model::updateRenderItemsKey(const render::ScenePointer& scene) { _needsFixupInScene = true; return; } - auto prevVal = _needsFixupInScene; auto renderItemsKey = _renderItemKeyGlobalFlags; - if (renderItemsKey.isLODDisabled()) { - _needsFixupInScene = true; - _needsFixupInScene = prevVal; - } render::Transaction transaction; foreach(auto item, _modelMeshRenderItemsMap.keys()) { transaction.updateItem(item, [renderItemsKey](ModelMeshPartPayload& data) { @@ -991,17 +971,6 @@ bool Model::isGroupCulled() const { return _renderItemKeyGlobalFlags.isSubMetaCulled(); } -void Model::setLODEnabled(bool isLODEnabled, const render::ScenePointer& scene) { - if (Model::isLODEnabled() != isLODEnabled) { - auto keyBuilder = render::ItemKey::Builder(_renderItemKeyGlobalFlags); - _renderItemKeyGlobalFlags = (isLODEnabled ? keyBuilder.withLODEnabled() : keyBuilder.withLODDisabled()); - updateRenderItemsKey(scene); - } -} -bool Model::isLODEnabled() const { - return _renderItemKeyGlobalFlags.isLODEnabled(); -} - const render::ItemKey Model::getRenderItemKeyGlobalFlags() const { return _renderItemKeyGlobalFlags; } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 6988e870a5..71809821eb 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -120,9 +120,6 @@ public: bool isGroupCulled() const; void setGroupCulled(bool isGroupCulled, const render::ScenePointer& scene = nullptr); - bool isLODEnabled() const; - void setLODEnabled(bool isLODEnabled, const render::ScenePointer& scene = nullptr); - bool canCastShadow() const; void setCanCastShadow(bool canCastShadow, const render::ScenePointer& scene = nullptr); diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp index ad9f6b7076..5e5c6b4c6e 100644 --- a/libraries/render/src/render/CullTask.cpp +++ b/libraries/render/src/render/CullTask.cpp @@ -294,7 +294,7 @@ void CullSpatialSelection::run(const RenderContextPointer& renderContext, auto& item = scene->getItem(id); if (filter.test(item.getKey())) { ItemBound itemBound(id, item.getBound()); - if (item.getKey().isLODDisabled() || test.solidAngleTest(itemBound.bound)) { + if (test.solidAngleTest(itemBound.bound)) { outItems.emplace_back(itemBound); if (item.getKey().isMetaCullGroup()) { item.fetchMetaSubItemBounds(outItems, (*scene)); @@ -329,7 +329,7 @@ void CullSpatialSelection::run(const RenderContextPointer& renderContext, if (filter.test(item.getKey())) { ItemBound itemBound(id, item.getBound()); if (test.frustumTest(itemBound.bound)) { - if (item.getKey().isLODDisabled() || test.solidAngleTest(itemBound.bound)) { + if (test.solidAngleTest(itemBound.bound)) { outItems.emplace_back(itemBound); if (item.getKey().isMetaCullGroup()) { item.fetchMetaSubItemBounds(outItems, (*scene)); diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index 9d2c0928e0..a87e2031f9 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -101,7 +101,6 @@ public: SHADOW_CASTER, // Item cast shadows 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 - LOD_DISABLED, // Item LOD behavior is disabled, it won't be LODed because of lod behavior in the view FIRST_TAG_BIT, // 8 Tags available to organize the items and filter them against LAST_TAG_BIT = FIRST_TAG_BIT + NUM_TAGS, @@ -161,8 +160,6 @@ public: 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& withLODDisabled() { _flags.set(LOD_DISABLED); return (*this); } - Builder& withLODEnabled() { _flags.reset(LOD_DISABLED); 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 @@ -206,9 +203,6 @@ public: bool isSubMetaCulled() const { return _flags[SUB_META_CULLED]; } void setSubMetaCulled(bool metaCulled) { (metaCulled ? _flags.set(SUB_META_CULLED) : _flags.reset(SUB_META_CULLED)); } - bool isLODEnabled() const { return !_flags[LOD_DISABLED]; } - bool isLODDisabled() const { return _flags[LOD_DISABLED]; } - 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); } @@ -280,9 +274,6 @@ public: Builder& withoutSubMetaCulled() { _value.reset(ItemKey::SUB_META_CULLED); _mask.set(ItemKey::SUB_META_CULLED); return (*this); } Builder& withSubMetaCulled() { _value.set(ItemKey::SUB_META_CULLED); _mask.set(ItemKey::SUB_META_CULLED); return (*this); } - Builder& withLODEnabled() { _value.reset(ItemKey::LOD_DISABLED); _mask.set(ItemKey::LOD_DISABLED); return (*this); } - Builder& withLODDisabled() { _value.set(ItemKey::LOD_DISABLED); _mask.set(ItemKey::LOD_DISABLED); return (*this); } - Builder& withoutTag(ItemKey::Tag tagIndex) { _value.reset(ItemKey::FIRST_TAG_BIT + tagIndex); _mask.set(ItemKey::FIRST_TAG_BIT + tagIndex); return (*this); } Builder& withTag(ItemKey::Tag tagIndex) { _value.set(ItemKey::FIRST_TAG_BIT + tagIndex); _mask.set(ItemKey::FIRST_TAG_BIT + tagIndex); return (*this); } // Set ALL the tags in one call using the Tag bits and the Tag bits touched From 25213febfde8c915ca44198eb33294e283b9a6ef Mon Sep 17 00:00:00 2001 From: sam gateau Date: Tue, 23 Oct 2018 10:05:10 -0700 Subject: [PATCH 7/8] REmoving the uneeded extra property --- scripts/system/libraries/WebTablet.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/system/libraries/WebTablet.js b/scripts/system/libraries/WebTablet.js index 2ed54d12c8..8e5b41deda 100644 --- a/scripts/system/libraries/WebTablet.js +++ b/scripts/system/libraries/WebTablet.js @@ -133,8 +133,7 @@ WebTablet = function (url, width, dpi, hand, clientOnly, location, visible) { dimensions: { x: tabletWidth, y: tabletHeight, z: tabletDepth }, parentID: MyAvatar.SELF_ID, visible: visible, - isGroupCulled: true, - isLODEnabled: false + isGroupCulled: true }; // compute position, rotation & parentJointIndex of the tablet From c40ded598da5392f4d49049667ab74f504667fb8 Mon Sep 17 00:00:00 2001 From: sam gateau Date: Wed, 7 Nov 2018 12:18:52 -0800 Subject: [PATCH 8/8] REmoving any attempt to fix anything in this pr --- interface/src/ui/overlays/Overlay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/overlays/Overlay.cpp b/interface/src/ui/overlays/Overlay.cpp index 1bf94adfa0..22cf924727 100644 --- a/interface/src/ui/overlays/Overlay.cpp +++ b/interface/src/ui/overlays/Overlay.cpp @@ -247,7 +247,7 @@ void Overlay::removeMaterial(graphics::MaterialPointer material, const std::stri } render::ItemKey Overlay::getKey() { - auto builder = render::ItemKey::Builder().withTypeShape().withTypeMeta(); + auto builder = render::ItemKey::Builder().withTypeShape(); builder.withViewSpace(); builder.withLayer(render::hifi::LAYER_2D);