From d93828f2f084d7eed463123d92235ac47a66204c Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 21 Dec 2017 11:50:02 -0700 Subject: [PATCH 01/17] Fix an improve currentAPI.js --- interface/resources/qml/CurrentAPI.qml | 617 ++++++++++++++++++ libraries/script-engine/src/ScriptEngines.h | 5 + .../developer/utilities/tools/currentAPI.js | 201 ++++-- 3 files changed, 785 insertions(+), 38 deletions(-) create mode 100644 interface/resources/qml/CurrentAPI.qml diff --git a/interface/resources/qml/CurrentAPI.qml b/interface/resources/qml/CurrentAPI.qml new file mode 100644 index 0000000000..98eb639e50 --- /dev/null +++ b/interface/resources/qml/CurrentAPI.qml @@ -0,0 +1,617 @@ +// +// ScriptAPI.qml +// +// Created by Luis Cuenca on 12/18/2017 +// Copyright 2017 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 +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import "styles-uit" +import "controls-uit" as HifiControls + +Item { + id: root + width: parent.width + height: parent.height + + + property bool keyboardEnabled: false + property bool keyboardRaised: false + property bool punctuationMode: false + + property var maxUpdateValues: 20 + property var maxReloadValues: 200 + property var apiMembers: [] + property var membersWithValues: [] + property var isReloading: false + property var evaluatingIdx: -1 + property Component scrollSlider + property Component keyboard + + Rectangle { + color: "white" + width: parent.width + height: parent.height + } + + FontLoader { id: ralewayRegular; source: pathToFonts + "fonts/Raleway-Regular.ttf"; } + + Timer { + id: updateList + interval: 200 + repeat: false + running: false + onTriggered: { + scrollSlider.y = 0; + list.contentY = 0; + } + } + + Row { + id: topBar + anchors.left: parent.left + anchors.leftMargin: 8 + width: parent.width + height: 50 + HifiControls.GlyphButton { + id: search + enabled: true + glyph: hifi.glyphs.search + color: hifi.colors.text + size: 48 + width: 50 + height: 50 + onClicked: { + addListElements(searchBar.text); + focus = true; + } + } + + HifiControls.GlyphButton { + id: back; + enabled: true; + glyph: hifi.glyphs.backward + color: hifi.colors.text + size: 48 + width: 30 + height: 50 + anchors.margins: 2 + onClicked: { + var text = searchBar.text; + var chain = text.split("."); + if (chain.length > 2) { + var result = chain[0]+"."; + for (var i = 1; i < chain.length-2; i++) { + result += chain[i] + "."; + } + result += chain[chain.length-2]; + searchBar.text = result; + } else { + searchBar.text = (chain.length > 1) ? chain[0] : ""; + } + if (chain.length > 1) { + addListElements(searchBar.text); + } else { + addListElements(); + } + focus = true; + } + } + + TextField { + id: searchBar + focus: true + font.pixelSize: 16 + width: 2*(parent.width-back.width-search.width-reload.width-update.width-evaluate.width-addMember.width-16)/3 + height: parent.height + font.family: ralewayRegular.name + placeholderText: "Search" + onAccepted: { + console.log("Enter Pressed"); + search.clicked(); + } + onActiveFocusChanged: { + if (activeFocus && HMD.mounted) { + keyboard.raised = true; + } else { + keyboard.raised = false; + } + } + + } + + HifiControls.Button { + id: addMember; + enabled: true; + fontSize: 30 + text: "+" + width: 50 + height: 50 + anchors.margins: 2 + onClicked: { + addNewMember(); + updateList.start(); + focus = true; + } + } + + HifiControls.Button { + id: evaluate; + enabled: true; + text: "Eval" + width: 50 + height: 50 + anchors.margins: 2 + onClicked: { + evaluateMember(); + focus = true; + } + } + TextField { + id: valueBar + focus: true + font.pixelSize: 16 + width: (parent.width-back.width-search.width-reload.width-update.width-evaluate.width-addMember.width-16)/3 + height: parent.height + font.family: ralewayRegular.name + placeholderText: "Value" + textColor: "#4466DD" + anchors.margins: 2 + } + + HifiControls.GlyphButton { + id: reload; + enabled: false; + glyph: hifi.glyphs.reload + color: hifi.colors.text + size: 48 + width: 50 + height: 50 + anchors.margins: 2 + onClicked: { + reloadListValues(); + focus = true; + } + } + + HifiControls.GlyphButton { + id: update; + enabled: false; + glyph: hifi.glyphs.playback_play + size: 48 + width: 50 + height: 50 + anchors.margins: 2 + onClicked: { + if (isReloading) { + update.glyph = hifi.glyphs.playback_play + isReloading = false; + stopReload(); + } else { + update.glyph = hifi.glyphs.stop_square + isReloading = true; + startReload(); + } + focus = true; + } + } + } + + ListModel { + id: memberModel + } + + Component { + id: memberDelegate + + Row { + id: memberRow + property var isMainKey: apiType === "class"; + spacing: 10 + Rectangle { + width: isMainKey ? 20 : 40; + height: parent.height + } + + RalewayRegular { + text: apiMember + size: !isMainKey ? 16 : 22 + MouseArea { + width: list.width + height: parent.height + onClicked: { + searchBar.text = apiType=="function()" ? apiMember + "()" : apiMember; + valueBar.text = !apiValue ? "" : apiValue; + list.currentIndex = index; + evaluatingIdx = index; + } + onDoubleClicked: { + if (apiType === "class") { + addListElements(apiMember+"."); + } else { + isolateElement(evaluatingIdx); + } + + } + } + } + + + RalewayRegular { + text: apiType + size: 14 + color: hifi.colors.baseGrayHighlight + } + + RalewayRegular { + text: !apiValue ? "" : apiValue; + size: 16 + color: "#4466DD" + } + } + } + + + Rectangle { + id: membersBackground + anchors { + left: parent.left; right: parent.right; top: topBar.bottom; bottom: parent.bottom; + margins: hifi.dimensions.contentMargin.x + bottomMargin: hifi.dimensions.contentSpacing.y + 40 + } + color: "white" + radius: 4 + + ListView { + id: list + anchors { + top: parent.top + left: parent.left + right: scrollBar.left + bottom: parent.bottom + margins: 4 + } + clip: true + cacheBuffer: 4000 + model: memberModel + delegate: memberDelegate + highlightMoveDuration: 0 + + highlight: Rectangle { + anchors { + left: parent ? parent.left : undefined + right: parent ? parent.right : undefined + leftMargin: hifi.dimensions.borderWidth + rightMargin: hifi.dimensions.borderWidth + } + color: "#BBDDFF" + } + onMovementStarted: { + scrollSlider.manual = true; + } + onMovementEnded: { + if (list.contentHeight > list.height) { + var range = list.contentY/(list.contentHeight-list.height); + range = range > 1 ? 1 : range; + var idx = Math.round((list.count-1)*range); + scrollSlider.positionSlider(idx); + } + scrollSlider.manual = false; + returnToBounds() + } + } + + Rectangle { + id: scrollBar + + property bool scrolling: list.contentHeight > list.height + + anchors { + top: parent.top + right: parent.right + bottom: parent.bottom + topMargin: 4 + bottomMargin: 4 + } + width: scrolling ? 18 : 0 + radius: 4 + color: hifi.colors.baseGrayShadow + + MouseArea { + anchors.fill: parent + + onClicked: { + var index = scrollSlider.y * (list.count - 1) / (scrollBar.height - scrollSlider.height); + index = Math.round(index); + var scrollAmount = Math.round(list.count/10); + index = index + (mouse.y <= scrollSlider.y ? -scrollAmount : scrollAmount); + if (index < 0) { + index = 0; + } + if (index > list.count - 1) { + index = list.count - 1; + } + scrollSlider.positionSlider(index); + } + } + + Rectangle { + id: scrollSlider + + property var manual: false + + function positionSlider(index){ + y = index*(scrollBar.height - scrollSlider.height)/(list.count - 1); + } + + anchors { + right: parent.right + rightMargin: 3 + } + width: 12 + height: (list.height / list.contentHeight) * list.height + radius: width / 4 + color: "white" + + visible: scrollBar.scrolling; + + onYChanged: { + var index = y * (list.count - 1) / (scrollBar.height - scrollSlider.height); + index = Math.round(index); + if (!manual) { + list.positionViewAtIndex(index, ListView.Visible); + } + } + + MouseArea { + anchors.fill: parent + drag.target: scrollSlider + drag.axis: Drag.YAxis + drag.minimumY: 0 + drag.maximumY: scrollBar.height - scrollSlider.height + } + } + } + + + + } + + HifiControls.GlyphButton { + id: clipboard; + enabled: true; + glyph: hifi.glyphs.scriptNew + size: 38 + width: 50 + height: 50 + anchors.left: parent.left + anchors.bottom: parent.bottom + anchors.margins: 2 + anchors.leftMargin: 8 + onClicked: { + var buffer = ""; + for (var i = 0; i < memberModel.count; i++) { + var datarow = memberModel.get(i); + buffer += "\n" + datarow.apiMember + " " + datarow.apiType + " " + datarow.apiValue; + } + Window.copyToClipboard(buffer); + focus = true; + } + } + + HifiControls.Button { + id: debug; + enabled: true; + text: "Debug Script" + width: 120 + height: 50 + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.margins: 2 + anchors.rightMargin: 8 + onClicked: { + sendToScript({type: "selectScript"}); + } + } + + HifiControls.Keyboard { + id: keyboard; + raised: false; + anchors { + bottom: parent.bottom; + left: parent.left; + right: parent.right; + } + // "\ue02b" + Keys.onPressed: { + console.log(event.nativeScanCode); + if (event.key == Qt.Key_Left) { + keyboard.raised = false; + } + } + } + + + + function addNewMember() { + apiMembers.push({member: searchBar.text, type: "user", value: valueBar.text, hasValue: true}); + var data = {'memberIndex': apiMembers.length-1, 'apiMember': searchBar.text, 'apiType':"user", 'apiValue': valueBar.text}; + memberModel.insert(0, data); + computeMembersWithValues(); + } + + function evaluateMember() { + sendToScript({type: "evaluateMember", data:{member: searchBar.text, index: evaluatingIdx}}); + } + + function getValuesToRefresh() { + var valuesToRefresh = []; + for (var i = 0; i < membersWithValues.length; i++) { + var index = membersWithValues[i]; + var row = memberModel.get(index); + valuesToRefresh.push({index: index, member: (row.apiType == "function()") ? row.apiMember+"()" : row.apiMember, value: row.apiValue}); + } + return valuesToRefresh; + } + + + function reloadListValues(){ + var valuesToRefresh = getValuesToRefresh(); + sendToScript({type: "refreshValues", data:valuesToRefresh}); + } + + function startReload(){ + var valuesToRefresh = getValuesToRefresh(); + sendToScript({type: "startRefreshValues", data:valuesToRefresh}); + } + + function stopReload(){ + sendToScript({type: "stopRefreshValues"}); + } + + function refreshValues(data) { + var buffer = ""; + for (var i = 0; i < data.length; i++) { + var row = memberModel.get(data[i].index); + row.apiValue = data[i].value; + apiMembers[row.memberIndex].value = data[i].value; + memberModel.set(data[i].index, row); + buffer += "\n" + apiMembers[row.memberIndex].member + " : " + data[i].value; + } + print(buffer); + } + + + function fromScript(message) { + if (message.type === "methods") { + apiMembers = message.data; + if (ScriptDiscoveryService.debugScriptUrl != "") { + addListElements("GlobalDebugger"); + if (memberModel.count == 0) { + addListElements(); + } + } else { + addListElements(); + } + + } else if (message.type === "debugMethods") { + addListElements("GlobalDebugger"); + } else if (message.type === "refreshValues") { + refreshValues(message.data); + } else if (message.type === "evaluateMember") { + valueBar.text = message.data.value; + var selrow = memberModel.get(message.data.index); + if (selrow.apiMember === searchBar.text || selrow.apiMember === searchBar.text + "()") { + selrow.apiValue = message.data.value; + apiMembers[selrow.memberIndex].value = message.data.value; + apiMembers[selrow.memberIndex].hasValue = true; + memberModel.set(message.data.index, selrow); + } + } else if (message.type === "selectScript") { + if (message.data.length > 0) { + ScriptDiscoveryService.debugScriptUrl = message.data; + } + } + } + + + function getFilterPairs(filter){ + var filteredArray = []; + var filterChain; + filterChain = filter.split(" "); + for (var i = 0; i < filterChain.length; i++) { + filterChain[i] = filterChain[i].toUpperCase(); + } + var matchPairs = []; + + for (var i = 0; i < apiMembers.length; i++) { + if (filterChain != undefined) { + var found = 0; + var memberComp = apiMembers[i].member.toUpperCase(); + for (var j = 0; j < filterChain.length; j++) { + found += memberComp.indexOf(filterChain[j]) >= 0 ? 1 : 0; + } + if (found === 0) { + continue; + } + matchPairs.push({index: i, found: found, member: apiMembers[i].member}); + } + } + + matchPairs.sort(function(a, b){ + if(a.found > b.found) return -1; + if(a.found < b.found) return 1; + if(a.member > b.member) return 1; + if(a.member < b.member) return -1; + return 0; + }); + + return matchPairs; + } + + function isolateElement(index) { + var oldElement = memberModel.get(index); + var newElement = {memberIndex: oldElement.memberIndex, apiMember: oldElement.apiMember, apiType: oldElement.apiType, apiValue: oldElement.apiValue}; + membersWithValues = apiMembers[oldElement.memberIndex].hasValue ? [0] : []; + memberModel.remove(0, memberModel.count); + memberModel.append(newElement); + } + + function computeMembersWithValues() { + membersWithValues = []; + for (var i = 0; i < memberModel.count; i++) { + var idx = memberModel.get(i).memberIndex; + if (apiMembers[idx].hasValue) { + membersWithValues.push(i); + } + } + update.enabled = membersWithValues.length <= maxUpdateValues; + reload.enabled = membersWithValues.length <= maxReloadValues; + } + + function addListElements(filter) { + valueBar.text = ""; + memberModel.remove(0, memberModel.count); + + var filteredArray = (filter != undefined) ? [] : apiMembers; + var matchPairs; + if (filter != undefined) { + matchPairs = getFilterPairs(filter); + for (var i = 0; i < matchPairs.length; i++) { + if (matchPairs[i].found < matchPairs[0].found) { + break; + } + var idx = matchPairs[i].index; + filteredArray.push(apiMembers[idx]); + } + } + + for (var i = 0; i < filteredArray.length; i++) { + var data = {'memberIndex': matchPairs ? matchPairs[i].index : i, + 'apiMember': filteredArray[i].member, + 'apiType': filteredArray[i].type, + 'apiValue': filteredArray[i].value}; + + memberModel.append(data); + } + + computeMembersWithValues(); + + if (isReloading) { + update.glyph = hifi.glyphs.playback_play + isReloading = false; + stopReload(); + } + + if (memberModel.count > 0) { + scrollSlider.y = 0; + list.contentY = 0; + } + } + + signal sendToScript(var message); +} \ No newline at end of file diff --git a/libraries/script-engine/src/ScriptEngines.h b/libraries/script-engine/src/ScriptEngines.h index f2b0105be1..0f807b08cf 100644 --- a/libraries/script-engine/src/ScriptEngines.h +++ b/libraries/script-engine/src/ScriptEngines.h @@ -31,6 +31,7 @@ class ScriptEngines : public QObject, public Dependency { Q_PROPERTY(ScriptsModel* scriptsModel READ scriptsModel CONSTANT) Q_PROPERTY(ScriptsModelFilter* scriptsModelFilter READ scriptsModelFilter CONSTANT) + Q_PROPERTY(QString debugScriptUrl READ getDebugScriptUrl WRITE setDebugScriptUrl) public: using ScriptInitializer = std::function; @@ -41,6 +42,9 @@ public: void loadScripts(); void saveScripts(); + QString getDebugScriptUrl() { return _debugScriptUrl; }; + void setDebugScriptUrl(const QString& url) { _debugScriptUrl = url; }; + QString getScriptsLocation() const; void loadDefaultScripts(); void setScriptsLocation(const QString& scriptsLocation); @@ -117,6 +121,7 @@ protected: std::atomic _isStopped { false }; std::atomic _isReloading { false }; bool _defaultScriptsLocationOverridden { false }; + QString _debugScriptUrl; }; QUrl normalizeScriptURL(const QUrl& rawScriptURL); diff --git a/scripts/developer/utilities/tools/currentAPI.js b/scripts/developer/utilities/tools/currentAPI.js index cb9f152794..f282c2dba9 100644 --- a/scripts/developer/utilities/tools/currentAPI.js +++ b/scripts/developer/utilities/tools/currentAPI.js @@ -1,42 +1,167 @@ -// -// currentAPI.js -// examples -// -// Created by Clément Brisset on 5/30/14. -// Copyright 2014 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 -// +(function(){ + var array = []; + var mainKeys = Object.keys(this); + var qml = Script.resourcesPath() + '/qml/CurrentAPI.qml'; + var needsUpdate = false; + var updateTime = 20; + var updateData = []; + var deltaTime = 0; + var maxUpdatingMethods = 20; + var scriptPath = ""; + + if (ScriptDiscoveryService.debugScriptUrl != "") { + Script.include(ScriptDiscoveryService.debugScriptUrl); + } + + var window = new OverlayWindow({ + title: 'API methods', + source: qml, + width: 1200, + height: 500 + }); -var array = []; -function listKeys(string, object) { - if (string === "listKeys" || string === "array" || string === "buffer" || string === "i") { - return; - } - - if (typeof(object) !== "object" || object === null) { - array.push(string + " " + typeof(object)); - return; - } - - var keys = Object.keys(object); - for (var i = 0; i < keys.length; ++i) { - if (string === "") { - listKeys(keys[i], object[keys[i]]); - } else if (keys[i] !== "parent") { - listKeys(string + "." + keys[i], object[keys[i]]); - } - } -} + window.closed.connect(function () { + Script.stop(); + }); -listKeys("", this); -array.sort(); + function addMainKeys(){ + var keys = Object.keys(this); + for (var i = 0; i < keys.length; i++) { + array.push({member:keys[i] , type: "class"}); + } + } -var buffer = "\n======= JS API list ======="; -for (var i = 0; i < array.length; ++i) { - buffer += "\n" + array[i]; -} -buffer += "\n========= API END =========\n"; + function memberHasValue(member, type) { + if (type === "function()") { + if (member.indexOf(".has") < 0 && member.indexOf(".is") < 0) { + return false; + } + if (member.indexOf("indow") < 0) { + return true; + } + } else if (type === "boolean" || type === "string" || type === "number" || type === "user") { + return true; + } + return false; + } + + function listKeys(string, object) { + if (string === "listKeys" || string === "array" || string === "buffer" || string === "i") { + return; + } + + if (typeof(object) !== "object" || object === null) { + var type = typeof(object); + if (type === "function") { + chain = string.split("("); + if (chain.length > 1) { + string = chain[0]; + type = "function(" + chain[1]; + } + } + var value = ""; + var hasValue = false; + if (memberHasValue(string, type)){ + var evalstring = type === "function()" ? string+"()" : string; + try{ + value = "" + eval(evalstring); + hasValue = true; + } catch(e) { + value = "Error evaluating"; + } + } + array.push({member:string , type: type, value: value, hasValue: hasValue}); + return; + } + + var keys = Object.keys(object); + for (var i = 0; i < keys.length; ++i) { + if (string === "") { + listKeys(keys[i], object[keys[i]]); + } else if (keys[i] !== "parent") { + listKeys(string + "." + keys[i], object[keys[i]]); + } + } + } + + function findMethods(addon, object, addkeys) { + array = []; + var string = addkeys ? "" : addon+"."; + listKeys(string, object); + if (addkeys) { + addMainKeys(); + } + array.sort(function(a, b){ + if(a.member < b.member) return -1; + if(a.member > b.member) return 1; + return 0; + }); + }; + + findMethods("", this, true); + window.sendToQml({type:"methods", data:array}); + + window.fromQml.connect(function(message){ + if (message.type == "refreshValues") { + updateData = message.data; + updateValues(); + } else if (message.type == "startRefreshValues") { + updateData = message.data; + if (updateData.length > maxUpdatingMethods) { + updateData = message.data; + updateValues(); + } else { + needsUpdate = true; + deltaTime = updateTime; + } + } else if (message.type == "stopRefreshValues") { + needsUpdate = false; + deltaTime = 0; + } else if (message.type == "evaluateMember") { + var value = "" + try { + value = "" + eval(message.data.member); + } catch(e) { + value = "Error evaluating" + } + window.sendToQml({type:"evaluateMember", data:{value:value, index:message.data.index}}); + } else if (message.type == "selectScript") { + scriptPath = Window.browse("Select script to debug", "*.js", "JS files(*.js)"); + if (scriptPath) { + ScriptDiscoveryService.stopScript(Paths.defaultScripts + "/developer/utilities/tools/currentAPI.js", true); + } + } + }); + + function updateValues() { + for (var i = 0; i < updateData.length; i++) { + try { + updateData[i].value = "" + eval(updateData[i].member); + } catch(e) { + updateData[i].value = "Error evaluating" + } + } + window.sendToQml({type: "refreshValues", data: updateData}); + } + + Script.update.connect(function(){ + deltaTime++; + if (deltaTime > updateTime) { + deltaTime = 0; + if (needsUpdate) { + updateValues(); + } + } + }); + + Script.scriptEnding.connect(function(){ + if (!scriptPath || scriptPath.length == 0) { + ScriptDiscoveryService.debugScriptUrl = ""; + } else { + ScriptDiscoveryService.debugScriptUrl = scriptPath; + } + console.log("done running"); + window.close(); + }); +}()); -print(buffer); From 54297e00a8038c3f6e9e15d0f53be85918ee9209 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 21 Dec 2017 12:48:21 -0700 Subject: [PATCH 02/17] button size fix --- interface/resources/qml/CurrentAPI.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/resources/qml/CurrentAPI.qml b/interface/resources/qml/CurrentAPI.qml index 98eb639e50..735cbdbab5 100644 --- a/interface/resources/qml/CurrentAPI.qml +++ b/interface/resources/qml/CurrentAPI.qml @@ -127,7 +127,6 @@ Item { HifiControls.Button { id: addMember; enabled: true; - fontSize: 30 text: "+" width: 50 height: 50 From 38bfddf78647d8e0c1ce9af533f5348fe86e4201 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 21 Dec 2017 16:26:06 -0700 Subject: [PATCH 03/17] Added filter for QT autogenerated functions and integrated it to Developers menu --- interface/resources/qml/CurrentAPI.qml | 50 ++- interface/src/Menu.cpp | 8 + .../developer/utilities/tools/currentAPI.js | 324 +++++++++--------- 3 files changed, 215 insertions(+), 167 deletions(-) diff --git a/interface/resources/qml/CurrentAPI.qml b/interface/resources/qml/CurrentAPI.qml index 735cbdbab5..45cf09925a 100644 --- a/interface/resources/qml/CurrentAPI.qml +++ b/interface/resources/qml/CurrentAPI.qml @@ -18,10 +18,7 @@ Item { width: parent.width height: parent.height - - property bool keyboardEnabled: false - property bool keyboardRaised: false - property bool punctuationMode: false + property var hideQtMethods: true property var maxUpdateValues: 20 property var maxReloadValues: 200 @@ -31,7 +28,7 @@ Item { property var evaluatingIdx: -1 property Component scrollSlider property Component keyboard - + Rectangle { color: "white" width: parent.width @@ -375,9 +372,6 @@ Item { } } } - - - } HifiControls.GlyphButton { @@ -417,6 +411,30 @@ Item { } } + HifiControls.CheckBox { + id: hideQt + boxSize: 25 + boxRadius: 3 + checked: true + anchors.left: clipboard.right + anchors.leftMargin: 8 + anchors.verticalCenter: clipboard.verticalCenter + anchors.margins: 2 + onClicked: { + hideQtMethods = checked; + addListElements(); + } + } + + HifiControls.Label { + id: hideLabel + anchors.left: hideQt.right + anchors.verticalCenter: clipboard.verticalCenter + anchors.margins: 2 + font.pixelSize: 15 + text: "Hide Qt Methods" + } + HifiControls.Keyboard { id: keyboard; raised: false; @@ -425,7 +443,7 @@ Item { left: parent.left; right: parent.right; } - // "\ue02b" + Keys.onPressed: { console.log(event.nativeScanCode); if (event.key == Qt.Key_Left) { @@ -433,8 +451,6 @@ Item { } } } - - function addNewMember() { apiMembers.push({member: searchBar.text, type: "user", value: valueBar.text, hasValue: true}); @@ -595,7 +611,17 @@ Item { 'apiType': filteredArray[i].type, 'apiValue': filteredArray[i].value}; - memberModel.append(data); + if (hideQtMethods) { + var chain = data.apiMember.split("."); + var method = chain[chain.length-1]; + if (method != "destroyed" && + method != "objectName" && + method != "objectNameChanged") { + memberModel.append(data); + } + } else { + memberModel.append(data); + } } computeMembersWithValues(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 9bbb72357b..25148f1d23 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -757,6 +757,14 @@ Menu::Menu() { // Developer > Stats addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Stats); + // Developer > API Debugger + action = addActionToQMenuAndActionHash(developerMenu, "API Debugger"); + connect(action, &QAction::triggered, [] { + auto scriptEngines = DependencyManager::get(); + QUrl defaultScriptsLoc = PathUtils::defaultScriptsLocation(); + defaultScriptsLoc.setPath(defaultScriptsLoc.path() + "developer/utilities/tools/currentAPI.js"); + scriptEngines->loadScript(defaultScriptsLoc.toString()); + }); #if 0 /// -------------- REMOVED FOR NOW -------------- addDisabledActionAndSeparator(navigateMenu, "History"); diff --git a/scripts/developer/utilities/tools/currentAPI.js b/scripts/developer/utilities/tools/currentAPI.js index f282c2dba9..175b84b8d9 100644 --- a/scripts/developer/utilities/tools/currentAPI.js +++ b/scripts/developer/utilities/tools/currentAPI.js @@ -1,167 +1,181 @@ +// +// currentAPI.js +// examples +// +// Created by Clément Brisset on 5/30/14. +// Copyright 2014 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 +// + + (function(){ - var array = []; - var mainKeys = Object.keys(this); - var qml = Script.resourcesPath() + '/qml/CurrentAPI.qml'; - var needsUpdate = false; - var updateTime = 20; - var updateData = []; - var deltaTime = 0; - var maxUpdatingMethods = 20; - var scriptPath = ""; - - if (ScriptDiscoveryService.debugScriptUrl != "") { - Script.include(ScriptDiscoveryService.debugScriptUrl); - } - - var window = new OverlayWindow({ - title: 'API methods', - source: qml, - width: 1200, - height: 500 - }); + var array = []; + var mainKeys = Object.keys(this); + var qml = Script.resourcesPath() + '/qml/CurrentAPI.qml'; + var needsUpdate = false; + var updateTime = 20; + var updateData = []; + var deltaTime = 0; + var maxUpdatingMethods = 20; + var scriptPath = ""; + + if (ScriptDiscoveryService.debugScriptUrl != "") { + Script.include(ScriptDiscoveryService.debugScriptUrl); + } + + var window = new OverlayWindow({ + title: 'API Debugger', + source: qml, + width: 1200, + height: 500 + }); - window.closed.connect(function () { - Script.stop(); - }); + window.closed.connect(function () { + Script.stop(); + }); - function addMainKeys(){ - var keys = Object.keys(this); - for (var i = 0; i < keys.length; i++) { - array.push({member:keys[i] , type: "class"}); - } - } + function addMainKeys(){ + var keys = Object.keys(this); + for (var i = 0; i < keys.length; i++) { + array.push({member:keys[i] , type: "class"}); + } + } - function memberHasValue(member, type) { - if (type === "function()") { - if (member.indexOf(".has") < 0 && member.indexOf(".is") < 0) { - return false; - } - if (member.indexOf("indow") < 0) { - return true; - } - } else if (type === "boolean" || type === "string" || type === "number" || type === "user") { - return true; - } - return false; - } + function memberHasValue(member, type) { + if (type === "function()") { + if (member.indexOf(".has") < 0 && member.indexOf(".is") < 0 && member.indexOf(".get") < 0) { + return false; + } + if (member.indexOf("indow") < 0) { + return true; + } + } else if (type === "boolean" || type === "string" || type === "number" || type === "user") { + return true; + } + return false; + } - function listKeys(string, object) { - if (string === "listKeys" || string === "array" || string === "buffer" || string === "i") { - return; - } - - if (typeof(object) !== "object" || object === null) { - var type = typeof(object); - if (type === "function") { - chain = string.split("("); - if (chain.length > 1) { - string = chain[0]; - type = "function(" + chain[1]; - } - } - var value = ""; - var hasValue = false; - if (memberHasValue(string, type)){ - var evalstring = type === "function()" ? string+"()" : string; - try{ - value = "" + eval(evalstring); - hasValue = true; - } catch(e) { - value = "Error evaluating"; - } - } - array.push({member:string , type: type, value: value, hasValue: hasValue}); - return; - } - - var keys = Object.keys(object); - for (var i = 0; i < keys.length; ++i) { - if (string === "") { - listKeys(keys[i], object[keys[i]]); - } else if (keys[i] !== "parent") { - listKeys(string + "." + keys[i], object[keys[i]]); - } - } - } + function listKeys(string, object) { + if (string === "listKeys" || string === "array" || string === "buffer" || string === "i") { + return; + } + + if (typeof(object) !== "object" || object === null) { + var type = typeof(object); + if (type === "function") { + chain = string.split("("); + if (chain.length > 1) { + string = chain[0]; + type = "function(" + chain[1]; + } else { + type = "function()"; + } + } + var value = ""; + var hasValue = false; + if (memberHasValue(string, type)){ + var evalstring = type === "function()" ? string+"()" : string; + try{ + value = "" + eval(evalstring); + hasValue = true; + } catch(e) { + value = "Error evaluating"; + } + } + array.push({member:string , type: type, value: value, hasValue: hasValue}); + return; + } + + var keys = Object.keys(object); + for (var i = 0; i < keys.length; ++i) { + if (string === "") { + listKeys(keys[i], object[keys[i]]); + } else if (keys[i] !== "parent") { + listKeys(string + "." + keys[i], object[keys[i]]); + } + } + } - function findMethods(addon, object, addkeys) { - array = []; - var string = addkeys ? "" : addon+"."; - listKeys(string, object); - if (addkeys) { - addMainKeys(); - } - array.sort(function(a, b){ - if(a.member < b.member) return -1; - if(a.member > b.member) return 1; - return 0; - }); - }; + function findMethods(addon, object, addkeys) { + array = []; + var string = addkeys ? "" : addon+"."; + listKeys(string, object); + if (addkeys) { + addMainKeys(); + } + array.sort(function(a, b){ + if(a.member < b.member) return -1; + if(a.member > b.member) return 1; + return 0; + }); + }; - findMethods("", this, true); - window.sendToQml({type:"methods", data:array}); + findMethods("", this, true); + window.sendToQml({type:"methods", data:array}); - window.fromQml.connect(function(message){ - if (message.type == "refreshValues") { - updateData = message.data; - updateValues(); - } else if (message.type == "startRefreshValues") { - updateData = message.data; - if (updateData.length > maxUpdatingMethods) { - updateData = message.data; - updateValues(); - } else { - needsUpdate = true; - deltaTime = updateTime; - } - } else if (message.type == "stopRefreshValues") { - needsUpdate = false; - deltaTime = 0; - } else if (message.type == "evaluateMember") { - var value = "" - try { - value = "" + eval(message.data.member); - } catch(e) { - value = "Error evaluating" - } - window.sendToQml({type:"evaluateMember", data:{value:value, index:message.data.index}}); - } else if (message.type == "selectScript") { - scriptPath = Window.browse("Select script to debug", "*.js", "JS files(*.js)"); - if (scriptPath) { - ScriptDiscoveryService.stopScript(Paths.defaultScripts + "/developer/utilities/tools/currentAPI.js", true); - } - } - }); + window.fromQml.connect(function(message){ + if (message.type == "refreshValues") { + updateData = message.data; + updateValues(); + } else if (message.type == "startRefreshValues") { + updateData = message.data; + if (updateData.length > maxUpdatingMethods) { + updateData = message.data; + updateValues(); + } else { + needsUpdate = true; + deltaTime = updateTime; + } + } else if (message.type == "stopRefreshValues") { + needsUpdate = false; + deltaTime = 0; + } else if (message.type == "evaluateMember") { + var value = "" + try { + value = "" + eval(message.data.member); + } catch(e) { + value = "Error evaluating" + } + window.sendToQml({type:"evaluateMember", data:{value:value, index:message.data.index}}); + } else if (message.type == "selectScript") { + scriptPath = Window.browse("Select script to debug", "*.js", "JS files(*.js)"); + if (scriptPath) { + ScriptDiscoveryService.stopScript(Paths.defaultScripts + "/developer/utilities/tools/currentAPI.js", true); + } + } + }); - function updateValues() { - for (var i = 0; i < updateData.length; i++) { - try { - updateData[i].value = "" + eval(updateData[i].member); - } catch(e) { - updateData[i].value = "Error evaluating" - } - } - window.sendToQml({type: "refreshValues", data: updateData}); - } + function updateValues() { + for (var i = 0; i < updateData.length; i++) { + try { + updateData[i].value = "" + eval(updateData[i].member); + } catch(e) { + updateData[i].value = "Error evaluating" + } + } + window.sendToQml({type: "refreshValues", data: updateData}); + } - Script.update.connect(function(){ - deltaTime++; - if (deltaTime > updateTime) { - deltaTime = 0; - if (needsUpdate) { - updateValues(); - } - } - }); - - Script.scriptEnding.connect(function(){ - if (!scriptPath || scriptPath.length == 0) { - ScriptDiscoveryService.debugScriptUrl = ""; - } else { - ScriptDiscoveryService.debugScriptUrl = scriptPath; - } - console.log("done running"); - window.close(); - }); + Script.update.connect(function(){ + deltaTime++; + if (deltaTime > updateTime) { + deltaTime = 0; + if (needsUpdate) { + updateValues(); + } + } + }); + + Script.scriptEnding.connect(function(){ + if (!scriptPath || scriptPath.length == 0) { + ScriptDiscoveryService.debugScriptUrl = ""; + } else { + ScriptDiscoveryService.debugScriptUrl = scriptPath; + } + console.log("done running"); + window.close(); + }); }()); From 47038e43495967e5a69c73588bff15ea69e772f7 Mon Sep 17 00:00:00 2001 From: Cain Kilgore Date: Sun, 7 Jan 2018 08:31:36 +0000 Subject: [PATCH 04/17] WL 21664 - Window.innerHeight should not include the menu bar --- .../src/scripting/WindowScriptingInterface.cpp | 16 ++++++++++------ .../src/scripting/WindowScriptingInterface.h | 3 +++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 4b355653b6..7fe7022e47 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -176,10 +176,6 @@ bool WindowScriptingInterface::isPointOnDesktopWindow(QVariant point) { return offscreenUi->isPointOnDesktopWindow(point); } -glm::vec2 WindowScriptingInterface::getDeviceSize() const { - return qApp->getDeviceSize(); -} - /// Makes sure that the reticle is visible, use this in blocking forms that require a reticle and /// might be in same thread as a script that sets the reticle to invisible void WindowScriptingInterface::ensureReticleVisible() const { @@ -391,11 +387,19 @@ QString WindowScriptingInterface::checkVersion() { } int WindowScriptingInterface::getInnerWidth() { - return qApp->getWindow()->geometry().width(); + return qApp->getDeviceSize().x; } int WindowScriptingInterface::getInnerHeight() { - return qApp->getWindow()->geometry().height(); + return qApp->getDeviceSize().y; +} + +int WindowScriptingInterface::getMenuHeight() { + return qApp->getPrimaryMenu()->geometry().height(); +} + +glm::vec2 WindowScriptingInterface::getDeviceSize() const { + return qApp->getDeviceSize(); } int WindowScriptingInterface::getX() { diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index d223f95af4..57ada00ed8 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -39,11 +39,14 @@ class WindowScriptingInterface : public QObject, public Dependency { Q_PROPERTY(int innerHeight READ getInnerHeight) Q_PROPERTY(int x READ getX) Q_PROPERTY(int y READ getY) + Q_PROPERTY(int menuHeight READ getMenuHeight) + public: WindowScriptingInterface(); ~WindowScriptingInterface(); int getInnerWidth(); int getInnerHeight(); + int getMenuHeight(); int getX(); int getY(); From 61edd83987dbe2c5629f82b4387439d2f33af42d Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Tue, 12 Dec 2017 17:02:07 -0800 Subject: [PATCH 05/17] Improve stability for HMD third person avatars Previously there was a hack where the sensor to world matrix was NOT updated in HMD mode if the camera was third person. The reason the hack existed was to make third person camera less nauseating for users. However this had a major drawbacks. It led to avatar hip spasms when the user turned around in the tracked volume, while in third person camera. To fix this issue properly, the hack which prevented updating the sensor to world matrix was removed, and now the third person camera is now computed in sensor space relative to the hmd. --- interface/src/Application.cpp | 30 ++++++++++++++++++------ interface/src/Application.h | 5 +++- interface/src/avatar/MyAvatar.cpp | 11 +++------ interface/src/avatar/MySkeletonModel.cpp | 1 - 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f3c41565f8..2d5ec4c62c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2441,7 +2441,7 @@ void Application::initializeUi() { offscreenSurfaceCache->reserve(Web3DOverlay::QML, 2); } -void Application::updateCamera(RenderArgs& renderArgs) { +void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { PROFILE_RANGE(render, __FUNCTION__); PerformanceTimer perfTimer("updateCamera"); @@ -2456,6 +2456,7 @@ void Application::updateCamera(RenderArgs& renderArgs) { // Using the latter will cause the camera to wobble with idle animations, // or with changes from the face tracker if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { + _thirdPersonHMDCameraBoomValid= false; if (isHMDMode()) { mat4 camMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix(); _myCamera.setPosition(extractTranslation(camMat)); @@ -2468,12 +2469,25 @@ void Application::updateCamera(RenderArgs& renderArgs) { } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { if (isHMDMode()) { - auto hmdWorldMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix(); - _myCamera.setOrientation(glm::normalize(glmExtractRotation(hmdWorldMat))); - _myCamera.setPosition(extractTranslation(hmdWorldMat) + - myAvatar->getWorldOrientation() * boomOffset); + + if (!_thirdPersonHMDCameraBoomValid) { + const glm::vec3 CAMERA_OFFSET = glm::vec3(0.0f, 0.0f, 0.7f); + _thirdPersonHMDCameraBoom = cancelOutRollAndPitch(myAvatar->getHMDSensorOrientation()) * CAMERA_OFFSET; + _thirdPersonHMDCameraBoomValid = true; + } + + glm::mat4 thirdPersonCameraSensorToWorldMatrix = myAvatar->getSensorToWorldMatrix(); + + const glm::vec3 cameraPos = myAvatar->getHMDSensorPosition() + _thirdPersonHMDCameraBoom * myAvatar->getBoomLength(); + glm::mat4 sensorCameraMat = createMatFromQuatAndPos(myAvatar->getHMDSensorOrientation(), cameraPos); + glm::mat4 worldCameraMat = thirdPersonCameraSensorToWorldMatrix * sensorCameraMat; + + _myCamera.setOrientation(glm::normalize(glmExtractRotation(worldCameraMat))); + _myCamera.setPosition(extractTranslation(worldCameraMat)); } else { + _thirdPersonHMDCameraBoomValid = false; + _myCamera.setOrientation(myAvatar->getHead()->getOrientation()); if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) { _myCamera.setPosition(myAvatar->getDefaultEyePosition() @@ -2486,6 +2500,7 @@ void Application::updateCamera(RenderArgs& renderArgs) { } } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { + _thirdPersonHMDCameraBoomValid= false; if (isHMDMode()) { auto mirrorBodyOrientation = myAvatar->getWorldOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)); @@ -2520,6 +2535,7 @@ void Application::updateCamera(RenderArgs& renderArgs) { renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; } else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) { + _thirdPersonHMDCameraBoomValid= false; EntityItemPointer cameraEntity = _myCamera.getCameraEntityPointer(); if (cameraEntity != nullptr) { if (isHMDMode()) { @@ -5094,7 +5110,7 @@ void Application::update(float deltaTime) { _postUpdateLambdas.clear(); } - editRenderArgs([this](AppRenderArgs& appRenderArgs) { + editRenderArgs([this, deltaTime](AppRenderArgs& appRenderArgs) { appRenderArgs._headPose= getHMDSensorPose(); auto myAvatar = getMyAvatar(); @@ -5140,7 +5156,7 @@ void Application::update(float deltaTime) { resizeGL(); } - this->updateCamera(appRenderArgs._renderArgs); + this->updateCamera(appRenderArgs._renderArgs, deltaTime); appRenderArgs._eyeToWorld = _myCamera.getTransform(); appRenderArgs._isStereo = false; diff --git a/interface/src/Application.h b/interface/src/Application.h index 479ce919a3..b01e998a21 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -146,7 +146,7 @@ public: void initializeGL(); void initializeUi(); - void updateCamera(RenderArgs& renderArgs); + void updateCamera(RenderArgs& renderArgs, float deltaTime); void paintGL(); void resizeGL(); @@ -695,6 +695,9 @@ private: void startHMDStandBySession(); void endHMDSession(); + glm::vec3 _thirdPersonHMDCameraBoom { 0.0f, 0.0f, -1.0f }; + bool _thirdPersonHMDCameraBoomValid { true }; + QUrl _avatarOverrideUrl; bool _saveAvatarOverrideUrl { false }; QObject* _renderEventHandler{ nullptr }; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 68e417ba1d..e863a58e14 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -2799,14 +2799,9 @@ void MyAvatar::FollowHelper::decrementTimeRemaining(float dt) { } bool MyAvatar::FollowHelper::shouldActivateRotation(const MyAvatar& myAvatar, const glm::mat4& desiredBodyMatrix, const glm::mat4& currentBodyMatrix) const { - auto cameraMode = qApp->getCamera().getMode(); - if (cameraMode == CAMERA_MODE_THIRD_PERSON) { - return false; - } else { - const float FOLLOW_ROTATION_THRESHOLD = cosf(PI / 6.0f); // 30 degrees - glm::vec2 bodyFacing = getFacingDir2D(currentBodyMatrix); - return glm::dot(-myAvatar.getHeadControllerFacingMovingAverage(), bodyFacing) < FOLLOW_ROTATION_THRESHOLD; - } + const float FOLLOW_ROTATION_THRESHOLD = cosf(PI / 6.0f); // 30 degrees + glm::vec2 bodyFacing = getFacingDir2D(currentBodyMatrix); + return glm::dot(-myAvatar.getHeadControllerFacingMovingAverage(), bodyFacing) < FOLLOW_ROTATION_THRESHOLD; } bool MyAvatar::FollowHelper::shouldActivateHorizontal(const MyAvatar& myAvatar, const glm::mat4& desiredBodyMatrix, const glm::mat4& currentBodyMatrix) const { diff --git a/interface/src/avatar/MySkeletonModel.cpp b/interface/src/avatar/MySkeletonModel.cpp index 50e0474831..17bce655fd 100644 --- a/interface/src/avatar/MySkeletonModel.cpp +++ b/interface/src/avatar/MySkeletonModel.cpp @@ -34,7 +34,6 @@ Rig::CharacterControllerState convertCharacterControllerState(CharacterControlle } static AnimPose computeHipsInSensorFrame(MyAvatar* myAvatar, bool isFlying) { - glm::mat4 worldToSensorMat = glm::inverse(myAvatar->getSensorToWorldMatrix()); // check for pinned hips. From 46b494c80231ad6900a64261be4c242a02887240 Mon Sep 17 00:00:00 2001 From: Nissim Hadar Date: Mon, 8 Jan 2018 14:34:46 -0800 Subject: [PATCH 06/17] Removed the Stage functionality - it is now implemented as a script. --- .../src/RenderableZoneEntityItem.cpp | 1 - .../src/RenderableZoneEntityItem.h | 1 - .../entities/src/EntityItemProperties.cpp | 19 -- libraries/entities/src/EntityItemProperties.h | 2 - libraries/entities/src/EntityPropertyFlags.h | 7 - libraries/entities/src/StagePropertyGroup.cpp | 283 ------------------ libraries/entities/src/StagePropertyGroup.h | 96 ------ libraries/entities/src/ZoneEntityItem.cpp | 17 -- libraries/entities/src/ZoneEntityItem.h | 4 - scripts/system/html/entityProperties.html | 27 -- scripts/system/html/js/entityProperties.js | 27 -- 11 files changed, 484 deletions(-) delete mode 100644 libraries/entities/src/StagePropertyGroup.cpp delete mode 100644 libraries/entities/src/StagePropertyGroup.h diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index ae00f168c6..1c4a0e1fce 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -218,7 +218,6 @@ void ZoneEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scen _ambientLightProperties = entity->getAmbientLightProperties(); _skyboxProperties = entity->getSkyboxProperties(); _hazeProperties = entity->getHazeProperties(); - _stageProperties = entity->getStageProperties(); #if 0 if (_lastShapeURL != _typedEntity->getCompoundShapeURL()) { diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.h b/libraries/entities-renderer/src/RenderableZoneEntityItem.h index 744f1823fc..982e12dd57 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.h +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.h @@ -112,7 +112,6 @@ private: KeyLightPropertyGroup _keyLightProperties; AmbientLightPropertyGroup _ambientLightProperties; HazePropertyGroup _hazeProperties; - StagePropertyGroup _stageProperties; SkyboxPropertyGroup _skyboxProperties; // More attributes used for rendering: diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index f3ceeb208d..8bfce7e2d2 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -33,7 +33,6 @@ AnimationPropertyGroup EntityItemProperties::_staticAnimation; SkyboxPropertyGroup EntityItemProperties::_staticSkybox; HazePropertyGroup EntityItemProperties::_staticHaze; -StagePropertyGroup EntityItemProperties::_staticStage; KeyLightPropertyGroup EntityItemProperties::_staticKeyLight; AmbientLightPropertyGroup EntityItemProperties::_staticAmbientLight; @@ -401,7 +400,6 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { changedProperties += _keyLight.getChangedProperties(); changedProperties += _ambientLight.getChangedProperties(); changedProperties += _skybox.getChangedProperties(); - changedProperties += _stage.getChangedProperties(); changedProperties += _haze.getChangedProperties(); return changedProperties; @@ -576,7 +574,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool _keyLight.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); _ambientLight.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); - _stage.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); _skybox.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FLYING_ALLOWED, flyingAllowed); @@ -810,7 +807,6 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool _keyLight.copyFromScriptValue(object, _defaultSettings); _ambientLight.copyFromScriptValue(object, _defaultSettings); _skybox.copyFromScriptValue(object, _defaultSettings); - _stage.copyFromScriptValue(object, _defaultSettings); _haze.copyFromScriptValue(object, _defaultSettings); COPY_PROPERTY_FROM_QSCRIPTVALUE(xTextureURL, QString, setXTextureURL); @@ -961,7 +957,6 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { _keyLight.merge(other._keyLight); _ambientLight.merge(other._ambientLight); _skybox.merge(other._skybox); - _stage.merge(other._stage); _haze.merge(other._haze); COPY_PROPERTY_IF_CHANGED(xTextureURL); @@ -1184,14 +1179,6 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_COLOR, Skybox, skybox, Color, color); ADD_GROUP_PROPERTY_TO_MAP(PROP_SKYBOX_URL, Skybox, skybox, URL, url); - ADD_GROUP_PROPERTY_TO_MAP(PROP_STAGE_SUN_MODEL_ENABLED, Stage, stage, SunModelEnabled, sunModelEnabled); - ADD_GROUP_PROPERTY_TO_MAP(PROP_STAGE_LATITUDE, Stage, stage, Latitude, latitude); - ADD_GROUP_PROPERTY_TO_MAP(PROP_STAGE_LONGITUDE, Stage, stage, Longitude, longitude); - ADD_GROUP_PROPERTY_TO_MAP(PROP_STAGE_ALTITUDE, Stage, stage, Altitude, altitude); - ADD_GROUP_PROPERTY_TO_MAP(PROP_STAGE_DAY, Stage, stage, Day, day); - ADD_GROUP_PROPERTY_TO_MAP(PROP_STAGE_HOUR, Stage, stage, Hour, hour); - ADD_GROUP_PROPERTY_TO_MAP(PROP_STAGE_AUTOMATIC_HOURDAY, Stage, stage, AutomaticHourDay, automaticHourDay); - ADD_PROPERTY_TO_MAP(PROP_FLYING_ALLOWED, FlyingAllowed, flyingAllowed, bool); ADD_PROPERTY_TO_MAP(PROP_GHOSTING_ALLOWED, GhostingAllowed, ghostingAllowed, bool); ADD_PROPERTY_TO_MAP(PROP_FILTER_URL, FilterURL, filterURL, QString); @@ -1447,9 +1434,6 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy _staticAmbientLight.setProperties(properties); _staticAmbientLight.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); - _staticStage.setProperties(properties); - _staticStage.appendToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); - APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)properties.getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); @@ -1805,7 +1789,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Zone) { properties.getKeyLight().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); properties.getAmbientLight().decodeFromEditPacket(propertyFlags, dataAt, processedBytes); - properties.getStage().decodeFromEditPacket(propertyFlags, dataAt , processedBytes); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); @@ -2056,7 +2039,6 @@ void EntityItemProperties::markAllChanged() { _animation.markAllChanged(); _skybox.markAllChanged(); - _stage.markAllChanged(); _haze.markAllChanged(); _sourceUrlChanged = true; @@ -2513,7 +2495,6 @@ QList EntityItemProperties::listChangedProperties() { getKeyLight().listChangedProperties(out); getAmbientLight().listChangedProperties(out); getSkybox().listChangedProperties(out); - getStage().listChangedProperties(out); getHaze().listChangedProperties(out); return out; diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 587a72fb04..d0dabbf5b6 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -41,7 +41,6 @@ #include "SimulationOwner.h" #include "SkyboxPropertyGroup.h" #include "HazePropertyGroup.h" -#include "StagePropertyGroup.h" #include "TextEntityItem.h" #include "ZoneEntityItem.h" @@ -185,7 +184,6 @@ public: DEFINE_PROPERTY_REF(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray, PolyVoxEntityItem::DEFAULT_VOXEL_DATA); DEFINE_PROPERTY_REF(PROP_VOXEL_SURFACE_STYLE, VoxelSurfaceStyle, voxelSurfaceStyle, uint16_t, PolyVoxEntityItem::DEFAULT_VOXEL_SURFACE_STYLE); DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString, ENTITY_ITEM_DEFAULT_NAME); - DEFINE_PROPERTY_GROUP(Stage, stage, StagePropertyGroup); DEFINE_PROPERTY_REF_ENUM(PROP_KEY_LIGHT_MODE, KeyLightMode, keyLightMode, uint32_t, (uint32_t)COMPONENT_MODE_ENABLED); DEFINE_PROPERTY_REF_ENUM(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, uint32_t, (uint32_t)COMPONENT_MODE_ENABLED); diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index f216bf46d0..7fd72bf0ee 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -248,13 +248,6 @@ enum EntityPropertyList { PROP_KEYLIGHT_COLOR = PROP_COLOR, PROP_KEYLIGHT_INTENSITY = PROP_INTENSITY, PROP_KEYLIGHT_DIRECTION = PROP_EXPONENT, - PROP_STAGE_SUN_MODEL_ENABLED = PROP_IS_SPOTLIGHT, - PROP_STAGE_LATITUDE = PROP_DIFFUSE_COLOR, - PROP_STAGE_LONGITUDE = PROP_AMBIENT_COLOR_UNUSED, - PROP_STAGE_ALTITUDE = PROP_SPECULAR_COLOR_UNUSED, - PROP_STAGE_DAY = PROP_LINEAR_ATTENUATION_UNUSED, - PROP_STAGE_HOUR = PROP_QUADRATIC_ATTENUATION_UNUSED, - PROP_STAGE_AUTOMATIC_HOURDAY = PROP_ANIMATION_FRAME_INDEX, PROP_SKYBOX_COLOR = PROP_ANIMATION_URL, PROP_SKYBOX_URL = PROP_ANIMATION_FPS, diff --git a/libraries/entities/src/StagePropertyGroup.cpp b/libraries/entities/src/StagePropertyGroup.cpp deleted file mode 100644 index cd486c96ac..0000000000 --- a/libraries/entities/src/StagePropertyGroup.cpp +++ /dev/null @@ -1,283 +0,0 @@ -// -// StagePropertyGroup.cpp -// libraries/entities/src -// -// Created by Brad Hefta-Gaub on 12/4/13. -// Copyright 2013 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 -// - -#include -#include -#include - -#include - -#include "StagePropertyGroup.h" -#include "EntityItemProperties.h" -#include "EntityItemPropertiesMacros.h" - -const bool StagePropertyGroup::DEFAULT_STAGE_SUN_MODEL_ENABLED = false; -const float StagePropertyGroup::DEFAULT_STAGE_LATITUDE = 37.777f; -const float StagePropertyGroup::DEFAULT_STAGE_LONGITUDE = 122.407f; -const float StagePropertyGroup::DEFAULT_STAGE_ALTITUDE = 0.03f; -const quint16 StagePropertyGroup::DEFAULT_STAGE_DAY = 60; -const float StagePropertyGroup::DEFAULT_STAGE_HOUR = 12.0f; - -void StagePropertyGroup::copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_STAGE_SUN_MODEL_ENABLED, Stage, stage, SunModelEnabled, sunModelEnabled); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_STAGE_LATITUDE, Stage, stage, Latitude, latitude); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_STAGE_LONGITUDE, Stage, stage, Longitude, longitude); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_STAGE_ALTITUDE, Stage, stage, Altitude, altitude); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_STAGE_DAY, Stage, stage, Day, day); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_STAGE_HOUR, Stage, stage, Hour, hour); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(PROP_STAGE_AUTOMATIC_HOURDAY, Stage, stage, AutomaticHourDay, automaticHourDay); -} - -void StagePropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - - // Backward compatibility support for the old way of doing stage properties - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(stageSunModelEnabled, bool, setSunModelEnabled, getSunModelEnabled); - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(stageLatitude, float, setLatitude, getLatitude); - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(stageLongitude, float, setLongitude, getLongitude); - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(stageAltitude, float, setAltitude, getAltitude); - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(stageDay, uint16_t, setDay, getDay); - COPY_PROPERTY_FROM_QSCRIPTVALUE_GETTER(stageHour, float, setHour, getHour); - - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(stage, sunModelEnabled, bool, setSunModelEnabled); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(stage, latitude, float, setLatitude); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(stage, longitude, float, setLongitude); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(stage, altitude, float, setAltitude); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(stage, day, uint16_t, setDay); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(stage, hour, float, setHour); - COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE(stage, automaticHourDay, bool, setAutomaticHourDay); -} - -void StagePropertyGroup::merge(const StagePropertyGroup& other) { - COPY_PROPERTY_IF_CHANGED(sunModelEnabled); - COPY_PROPERTY_IF_CHANGED(latitude); - COPY_PROPERTY_IF_CHANGED(longitude); - COPY_PROPERTY_IF_CHANGED(altitude); - COPY_PROPERTY_IF_CHANGED(day); - COPY_PROPERTY_IF_CHANGED(hour); - COPY_PROPERTY_IF_CHANGED(automaticHourDay); -} - - -void StagePropertyGroup::debugDump() const { - qCDebug(entities) << " StagePropertyGroup: ---------------------------------------------"; - qCDebug(entities) << " _sunModelEnabled:" << _sunModelEnabled; - qCDebug(entities) << " _latitude:" << _latitude; - qCDebug(entities) << " _longitude:" << _longitude; - qCDebug(entities) << " _altitude:" << _altitude; - qCDebug(entities) << " _day:" << _day; - qCDebug(entities) << " _hour:" << _hour; - qCDebug(entities) << " _automaticHourDay:" << _automaticHourDay; -} - -void StagePropertyGroup::listChangedProperties(QList& out) { - if (sunModelEnabledChanged()) { - out << "stage-sunModelEnabled"; - } - if (latitudeChanged()) { - out << "stage-latitude"; - } - if (altitudeChanged()) { - out << "stage-altitude"; - } - if (dayChanged()) { - out << "stage-day"; - } - if (hourChanged()) { - out << "stage-hour"; - } - if (automaticHourDayChanged()) { - out << "stage-automaticHourDay"; - } -} - -bool StagePropertyGroup::appendToEditPacket(OctreePacketData* packetData, - EntityPropertyFlags& requestedProperties, - EntityPropertyFlags& propertyFlags, - EntityPropertyFlags& propertiesDidntFit, - int& propertyCount, - OctreeElement::AppendState& appendState) const { - - bool successPropertyFits = true; - - APPEND_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, getSunModelEnabled()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, getLatitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, getLongitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, getAltitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_DAY, getDay()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, getHour()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, getAutomaticHourDay()); - - return true; -} - - -bool StagePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags, const unsigned char*& dataAt , int& processedBytes) { - - int bytesRead = 0; - bool overwriteLocalData = true; - bool somethingChanged = false; - - READ_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, bool, setSunModelEnabled); - READ_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, float, setLatitude); - READ_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, float, setLongitude); - READ_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, float, setAltitude); - READ_ENTITY_PROPERTY(PROP_STAGE_DAY, quint16, setDay); - READ_ENTITY_PROPERTY(PROP_STAGE_HOUR, float, setHour); - READ_ENTITY_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, bool, setAutomaticHourDay); - - DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_SUN_MODEL_ENABLED, SunModelEnabled); - DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_LATITUDE, Latitude); - DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_LONGITUDE, Longitude); - DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_ALTITUDE, Altitude); - DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_DAY, Day); - DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_HOUR, Hour); - DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_AUTOMATIC_HOURDAY, AutomaticHourDay); - - processedBytes += bytesRead; - - Q_UNUSED(somethingChanged); - - return true; -} - -void StagePropertyGroup::markAllChanged() { - _sunModelEnabledChanged = true; - _latitudeChanged = true; - _longitudeChanged = true; - _altitudeChanged = true; - _dayChanged = true; - _hourChanged = true; - _automaticHourDayChanged = true; -} - -EntityPropertyFlags StagePropertyGroup::getChangedProperties() const { - EntityPropertyFlags changedProperties; - - CHECK_PROPERTY_CHANGE(PROP_STAGE_SUN_MODEL_ENABLED, sunModelEnabled); - CHECK_PROPERTY_CHANGE(PROP_STAGE_LATITUDE, latitude); - CHECK_PROPERTY_CHANGE(PROP_STAGE_LONGITUDE, longitude); - CHECK_PROPERTY_CHANGE(PROP_STAGE_ALTITUDE, altitude); - CHECK_PROPERTY_CHANGE(PROP_STAGE_DAY, day); - CHECK_PROPERTY_CHANGE(PROP_STAGE_HOUR, hour); - CHECK_PROPERTY_CHANGE(PROP_STAGE_AUTOMATIC_HOURDAY, automaticHourDay); - - return changedProperties; -} - -void StagePropertyGroup::getProperties(EntityItemProperties& properties) const { - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, SunModelEnabled, getSunModelEnabled); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, Latitude, getLatitude); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, Longitude, getLongitude); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, Altitude, getAltitude); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, Day, getDay); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, Hour, getHour); - COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, AutomaticHourDay, getAutomaticHourDay); -} - -bool StagePropertyGroup::setProperties(const EntityItemProperties& properties) { - bool somethingChanged = false; - - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, SunModelEnabled, sunModelEnabled, setSunModelEnabled); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, Latitude, latitude, setLatitude); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, Longitude, longitude, setLongitude); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, Altitude, altitude, setAltitude); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, Day, day, setDay); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, Hour, hour, setHour); - SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, AutomaticHourDay, automaticHourDay, setAutomaticHourDay); - - return somethingChanged; -} - -EntityPropertyFlags StagePropertyGroup::getEntityProperties(EncodeBitstreamParams& params) const { - EntityPropertyFlags requestedProperties; - - requestedProperties += PROP_STAGE_SUN_MODEL_ENABLED; - requestedProperties += PROP_STAGE_LATITUDE; - requestedProperties += PROP_STAGE_LONGITUDE; - requestedProperties += PROP_STAGE_ALTITUDE; - requestedProperties += PROP_STAGE_DAY; - requestedProperties += PROP_STAGE_HOUR; - requestedProperties += PROP_STAGE_AUTOMATIC_HOURDAY; - - return requestedProperties; -} - -void StagePropertyGroup::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, - EntityTreeElementExtraEncodeDataPointer entityTreeElementExtraEncodeData, - EntityPropertyFlags& requestedProperties, - EntityPropertyFlags& propertyFlags, - EntityPropertyFlags& propertiesDidntFit, - int& propertyCount, - OctreeElement::AppendState& appendState) const { - - bool successPropertyFits = true; - - APPEND_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, getSunModelEnabled()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, getLatitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, getLongitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, getAltitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_DAY, getDay()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, getHour()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, getAutomaticHourDay()); -} - -int StagePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, - ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData, - bool& somethingChanged) { - - int bytesRead = 0; - const unsigned char* dataAt = data; - - READ_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, bool, setSunModelEnabled); - READ_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, float, setLatitude); - READ_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, float, setLongitude); - READ_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, float, setAltitude); - READ_ENTITY_PROPERTY(PROP_STAGE_DAY, quint16, setDay); - READ_ENTITY_PROPERTY(PROP_STAGE_HOUR, float, setHour); - READ_ENTITY_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, bool, setAutomaticHourDay); - - return bytesRead; -} - -static const float TOTAL_LONGITUDES = 360.0f; -static const float HOURS_PER_DAY = 24; -static const float SECONDS_PER_DAY = 60 * 60 * HOURS_PER_DAY; -static const float MSECS_PER_DAY = SECONDS_PER_DAY * MSECS_PER_SECOND; - -float StagePropertyGroup::calculateHour() const { - if (!_automaticHourDay) { - return _hour; - } - - QDateTime utc(QDateTime::currentDateTimeUtc()); - float adjustFromUTC = (_longitude / TOTAL_LONGITUDES); - float offsetFromUTCinMsecs = adjustFromUTC * MSECS_PER_DAY; - int msecsSinceStartOfDay = utc.time().msecsSinceStartOfDay(); - float calutatedHour = ((msecsSinceStartOfDay + offsetFromUTCinMsecs) / MSECS_PER_DAY) * HOURS_PER_DAY; - - // calculate hour based on longitude and time from GMT - return calutatedHour; -} - -uint16_t StagePropertyGroup::calculateDay() const { - - if (!_automaticHourDay) { - return _day; - } - - QDateTime utc(QDateTime::currentDateTimeUtc()); - int calutatedDay = utc.date().dayOfYear(); - - // calculate day based on longitude and time from GMT - return calutatedDay; -} - diff --git a/libraries/entities/src/StagePropertyGroup.h b/libraries/entities/src/StagePropertyGroup.h deleted file mode 100644 index 3e5bad5443..0000000000 --- a/libraries/entities/src/StagePropertyGroup.h +++ /dev/null @@ -1,96 +0,0 @@ -// -// StagePropertyGroup.h -// libraries/entities/src -// -// Created by Brad Hefta-Gaub on 12/4/13. -// Copyright 2013 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_StagePropertyGroup_h -#define hifi_StagePropertyGroup_h - -#include - -#include "PropertyGroup.h" -#include "EntityItemPropertiesMacros.h" - -class EntityItemProperties; -class EncodeBitstreamParams; -class OctreePacketData; -class EntityTreeElementExtraEncodeData; -class ReadBitstreamToTreeParams; - -#include -#include - - -class StagePropertyGroup : public PropertyGroup { -public: - // EntityItemProperty related helpers - virtual void copyToScriptValue(const EntityPropertyFlags& desiredProperties, QScriptValue& properties, - QScriptEngine* engine, bool skipDefaults, - EntityItemProperties& defaultEntityProperties) const override; - virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) override; - - void merge(const StagePropertyGroup& other); - - virtual void debugDump() const override; - virtual void listChangedProperties(QList& out) override; - - virtual bool appendToEditPacket(OctreePacketData* packetData, - EntityPropertyFlags& requestedProperties, - EntityPropertyFlags& propertyFlags, - EntityPropertyFlags& propertiesDidntFit, - int& propertyCount, - OctreeElement::AppendState& appendState) const override; - - virtual bool decodeFromEditPacket(EntityPropertyFlags& propertyFlags, - const unsigned char*& dataAt, int& processedBytes) override; - virtual void markAllChanged() override; - virtual EntityPropertyFlags getChangedProperties() const override; - - // EntityItem related helpers - // methods for getting/setting all properties of an entity - virtual void getProperties(EntityItemProperties& propertiesOut) const override; - - /// returns true if something changed - virtual bool setProperties(const EntityItemProperties& properties) override; - - virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const override; - - virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, - EntityTreeElementExtraEncodeDataPointer entityTreeElementExtraEncodeData, - EntityPropertyFlags& requestedProperties, - EntityPropertyFlags& propertyFlags, - EntityPropertyFlags& propertiesDidntFit, - int& propertyCount, - OctreeElement::AppendState& appendState) const override; - - virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, - ReadBitstreamToTreeParams& args, - EntityPropertyFlags& propertyFlags, bool overwriteLocalData, - bool& somethingChanged) override; - - static const bool DEFAULT_STAGE_SUN_MODEL_ENABLED; - static const float DEFAULT_STAGE_LATITUDE; - static const float DEFAULT_STAGE_LONGITUDE; - static const float DEFAULT_STAGE_ALTITUDE; - static const quint16 DEFAULT_STAGE_DAY; - static const float DEFAULT_STAGE_HOUR; - - float calculateHour() const; - uint16_t calculateDay() const; - - DEFINE_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, SunModelEnabled, sunModelEnabled, bool, DEFAULT_STAGE_SUN_MODEL_ENABLED); - DEFINE_PROPERTY(PROP_STAGE_LATITUDE, Latitude, latitude, float, DEFAULT_STAGE_LATITUDE); - DEFINE_PROPERTY(PROP_STAGE_LONGITUDE, Longitude, longitude, float, DEFAULT_STAGE_LONGITUDE); - DEFINE_PROPERTY(PROP_STAGE_ALTITUDE, Altitude, altitude, float, DEFAULT_STAGE_ALTITUDE); - DEFINE_PROPERTY(PROP_STAGE_DAY, Day, day, uint16_t, DEFAULT_STAGE_DAY); - DEFINE_PROPERTY(PROP_STAGE_HOUR, Hour, hour, float, DEFAULT_STAGE_HOUR); - DEFINE_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, AutomaticHourDay, automaticHourDay, bool, false); -}; - -#endif // hifi_StagePropertyGroup_h diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 27b2122511..7c2aa08cd1 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -56,8 +56,6 @@ EntityItemProperties ZoneEntityItem::getProperties(EntityPropertyFlags desiredPr _ambientLightProperties.getProperties(properties); }); - _stageProperties.getProperties(properties); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); @@ -109,8 +107,6 @@ bool ZoneEntityItem::setSubClassProperties(const EntityItemProperties& propertie _ambientLightPropertiesChanged = _ambientLightProperties.setProperties(properties); }); - _stagePropertiesChanged = _stageProperties.setProperties(properties); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, setShapeType); SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); @@ -163,12 +159,6 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, bytesRead += bytesFromAmbientlight; dataAt += bytesFromAmbientlight; - int bytesFromStage = _stageProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, - propertyFlags, overwriteLocalData, _stagePropertiesChanged); - somethingChanged = somethingChanged || _stagePropertiesChanged; - bytesRead += bytesFromStage; - dataAt += bytesFromStage; - READ_ENTITY_PROPERTY(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); @@ -214,8 +204,6 @@ EntityPropertyFlags ZoneEntityItem::getEntityProperties(EncodeBitstreamParams& p requestedProperties += _ambientLightProperties.getEntityProperties(params); }); - requestedProperties += _stageProperties.getEntityProperties(params); - requestedProperties += PROP_SHAPE_TYPE; requestedProperties += PROP_COMPOUND_SHAPE_URL; @@ -253,10 +241,6 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits _ambientLightProperties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); - _stageProperties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties, - propertyFlags, propertiesDidntFit, propertyCount, appendState); - - APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL()); @@ -291,7 +275,6 @@ void ZoneEntityItem::debugDump() const { _ambientLightProperties.debugDump(); _skyboxProperties.debugDump(); _hazeProperties.debugDump(); - _stageProperties.debugDump(); } ShapeType ZoneEntityItem::getShapeType() const { diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index fc79db4311..05dcc05416 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -18,7 +18,6 @@ #include "EntityTree.h" #include "SkyboxPropertyGroup.h" #include "HazePropertyGroup.h" -#include "StagePropertyGroup.h" #include class ZoneEntityItem : public EntityItem { @@ -85,8 +84,6 @@ public: const HazePropertyGroup& getHazeProperties() const { return _hazeProperties; } - const StagePropertyGroup& getStageProperties() const { return _stageProperties; } - bool getFlyingAllowed() const { return _flyingAllowed; } void setFlyingAllowed(bool value) { _flyingAllowed = value; } bool getGhostingAllowed() const { return _ghostingAllowed; } @@ -136,7 +133,6 @@ protected: SkyboxPropertyGroup _skyboxProperties; HazePropertyGroup _hazeProperties; - StagePropertyGroup _stageProperties; bool _flyingAllowed { DEFAULT_FLYING_ALLOWED }; bool _ghostingAllowed { DEFAULT_GHOSTING_ALLOWED }; diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index 38d6a99f0c..b93974ee77 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -490,10 +490,6 @@ ZoneM
-
- - -
@@ -681,29 +677,6 @@
-
- - Stage - -
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
-
-
diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index 2e0af2d23d..72092b66ca 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -639,8 +639,6 @@ function loaded() { var elTextBackgroundColorGreen = document.getElementById("property-text-background-color-green"); var elTextBackgroundColorBlue = document.getElementById("property-text-background-color-blue"); - var elZoneStageSunModelEnabled = document.getElementById("property-zone-stage-sun-model-enabled"); - // Key light var elZoneKeyLightModeInherit = document.getElementById("property-zone-key-light-mode-inherit"); var elZoneKeyLightModeDisabled = document.getElementById("property-zone-key-light-mode-disabled"); @@ -692,13 +690,6 @@ function loaded() { var elZoneHazeBackgroundBlend = document.getElementById("property-zone-haze-background-blend"); - var elZoneStageLatitude = document.getElementById("property-zone-stage-latitude"); - var elZoneStageLongitude = document.getElementById("property-zone-stage-longitude"); - var elZoneStageAltitude = document.getElementById("property-zone-stage-altitude"); - var elZoneStageAutomaticHourDay = document.getElementById("property-zone-stage-automatic-hour-day"); - var elZoneStageDay = document.getElementById("property-zone-stage-day"); - var elZoneStageHour = document.getElementById("property-zone-stage-hour"); - var elZoneSkyboxColor = document.getElementById("property-zone-skybox-color"); var elZoneSkyboxColorRed = document.getElementById("property-zone-skybox-color-red"); var elZoneSkyboxColorGreen = document.getElementById("property-zone-skybox-color-green"); @@ -1026,7 +1017,6 @@ function loaded() { elZoneKeyLightModeDisabled.checked = (properties.keyLightMode === 'disabled'); elZoneKeyLightModeEnabled.checked = (properties.keyLightMode === 'enabled'); - elZoneStageSunModelEnabled.checked = properties.stage.sunModelEnabled; elZoneKeyLightColor.style.backgroundColor = "rgb(" + properties.keyLight.color.red + "," + properties.keyLight.color.green + "," + properties.keyLight.color.blue + ")"; elZoneKeyLightColorRed.value = properties.keyLight.color.red; @@ -1082,13 +1072,6 @@ function loaded() { elZoneHazeCeiling.value = properties.haze.hazeCeiling.toFixed(0); elZoneHazeBackgroundBlend.value = properties.haze.hazeBackgroundBlend.toFixed(2); - - elZoneStageLatitude.value = properties.stage.latitude.toFixed(2); - elZoneStageLongitude.value = properties.stage.longitude.toFixed(2); - elZoneStageAltitude.value = properties.stage.altitude.toFixed(2); - elZoneStageAutomaticHourDay.checked = properties.stage.automaticHourDay; - elZoneStageDay.value = properties.stage.day; - elZoneStageHour.value = properties.stage.hour; elShapeType.value = properties.shapeType; elCompoundShapeURL.value = properties.compoundShapeURL; @@ -1449,8 +1432,6 @@ function loaded() { elZoneKeyLightModeDisabled.addEventListener('change', keyLightModeChanged); elZoneKeyLightModeEnabled.addEventListener('change', keyLightModeChanged); - elZoneStageSunModelEnabled.addEventListener('change', - createEmitGroupCheckedPropertyUpdateFunction('stage', 'sunModelEnabled')); colorPickers.push($('#property-zone-key-light-color').colpick({ colorScheme: 'dark', layout: 'hex', @@ -1582,14 +1563,6 @@ function loaded() { elZoneHazeBackgroundBlend.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('haze', 'hazeBackgroundBlend')); - elZoneStageLatitude.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('stage', 'latitude')); - elZoneStageLongitude.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('stage', 'longitude')); - elZoneStageAltitude.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('stage', 'altitude')); - elZoneStageAutomaticHourDay.addEventListener('change', - createEmitGroupCheckedPropertyUpdateFunction('stage', 'automaticHourDay')); - elZoneStageDay.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('stage', 'day')); - elZoneStageHour.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('stage', 'hour')); - var zoneSkyboxColorChangeFunction = createEmitGroupColorPropertyUpdateFunction('skybox', 'color', elZoneSkyboxColorRed, elZoneSkyboxColorGreen, elZoneSkyboxColorBlue); elZoneSkyboxColorRed.addEventListener('change', zoneSkyboxColorChangeFunction); From 46de7ed83bb4f109d8eb4c6f6730efc15180fb17 Mon Sep 17 00:00:00 2001 From: Cain Kilgore Date: Tue, 9 Jan 2018 08:32:59 +0000 Subject: [PATCH 07/17] WL 21666 - Window.domainChanged() isn't emitted if domain isn't running --- interface/src/scripting/WindowScriptingInterface.cpp | 6 ++++++ interface/src/scripting/WindowScriptingInterface.h | 1 + 2 files changed, 7 insertions(+) diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 4b355653b6..9b1285723b 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -49,6 +49,8 @@ void CustomPromptResultFromScriptValue(const QScriptValue& object, CustomPromptR WindowScriptingInterface::WindowScriptingInterface() { const DomainHandler& domainHandler = DependencyManager::get()->getDomainHandler(); connect(&domainHandler, &DomainHandler::connectedToDomain, this, &WindowScriptingInterface::domainChanged); + connect(&domainHandler, &DomainHandler::disconnectedFromDomain, this, &WindowScriptingInterface::disconnectedFromDomain); + connect(&domainHandler, &DomainHandler::domainConnectionRefused, this, &WindowScriptingInterface::domainConnectionRefused); connect(qApp, &Application::svoImportRequested, [this](const QString& urlString) { @@ -134,6 +136,10 @@ void WindowScriptingInterface::promptAsync(const QString& message, const QString }); } +void WindowScriptingInterface::disconnectedFromDomain() { + emit domainChanged(""); +} + CustomPromptResult WindowScriptingInterface::customPrompt(const QVariant& config) { CustomPromptResult result; bool ok = false; diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index d223f95af4..c27940c231 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -83,6 +83,7 @@ public slots: private slots: void onMessageBoxSelected(int button); + void disconnectedFromDomain(); signals: void domainChanged(const QString& domainHostname); From 0e3913baffd9193cd6db957701a38331cc587fd5 Mon Sep 17 00:00:00 2001 From: Cain Kilgore Date: Tue, 9 Jan 2018 09:07:26 +0000 Subject: [PATCH 08/17] Removed Window.menuHeight --- interface/src/scripting/WindowScriptingInterface.cpp | 4 ---- interface/src/scripting/WindowScriptingInterface.h | 2 -- 2 files changed, 6 deletions(-) diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 7fe7022e47..5677e6b32e 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -394,10 +394,6 @@ int WindowScriptingInterface::getInnerHeight() { return qApp->getDeviceSize().y; } -int WindowScriptingInterface::getMenuHeight() { - return qApp->getPrimaryMenu()->geometry().height(); -} - glm::vec2 WindowScriptingInterface::getDeviceSize() const { return qApp->getDeviceSize(); } diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 57ada00ed8..3b8412900f 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -39,14 +39,12 @@ class WindowScriptingInterface : public QObject, public Dependency { Q_PROPERTY(int innerHeight READ getInnerHeight) Q_PROPERTY(int x READ getX) Q_PROPERTY(int y READ getY) - Q_PROPERTY(int menuHeight READ getMenuHeight) public: WindowScriptingInterface(); ~WindowScriptingInterface(); int getInnerWidth(); int getInnerHeight(); - int getMenuHeight(); int getX(); int getY(); From f78ee7c167bb6783a9886230ff6cd793e7de19c1 Mon Sep 17 00:00:00 2001 From: Cain Kilgore Date: Tue, 9 Jan 2018 09:44:12 +0000 Subject: [PATCH 09/17] WL 21667 - Window.browseDir() dialog doesn't let user use Esc to cancel --- .../resources/qml/dialogs/FileDialog.qml | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/interface/resources/qml/dialogs/FileDialog.qml b/interface/resources/qml/dialogs/FileDialog.qml index b9633104d5..c49fa145cd 100644 --- a/interface/resources/qml/dialogs/FileDialog.qml +++ b/interface/resources/qml/dialogs/FileDialog.qml @@ -70,7 +70,16 @@ ModalWindow { signal selectedFile(var file); signal canceled(); - + signal selected(int button); + + function click(button) { + clickedButton = button; + selected(button); + destroy(); + } + + property int clickedButton: OriginalDialogs.StandardButton.NoButton; + Component.onCompleted: { console.log("Helper " + helper + " drives " + drives); @@ -628,7 +637,10 @@ ModalWindow { case Qt.Key_Backtab: event.accepted = false; break; - + case Qt.Key_Escape: + event.accepted = true; + root.click(OriginalDialogs.StandardButton.Cancel); + break; default: if (addToPrefix(event)) { event.accepted = true @@ -793,7 +805,11 @@ ModalWindow { case Qt.Key_Home: event.accepted = d.navigateHome(); break; - - } + + case Qt.Key_Escape: + event.accepted = true; + root.click(OriginalDialogs.StandardButton.Cancel); + break; + } } } From a42b0cf485183186c0c1571e8d26c1e23e583633 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Tue, 9 Jan 2018 14:58:23 -0800 Subject: [PATCH 10/17] comment out logging --- interface/resources/qml/hifi/tablet/TabletAddressDialog.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml b/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml index 217adc5083..f3cda533e9 100644 --- a/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml +++ b/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml @@ -62,7 +62,8 @@ StackView { var callback = rpcCalls[message.id]; if (!callback) { - console.log('No callback for message fromScript', JSON.stringify(message)); + // FIXME: We often recieve very long messages here, the logging of which is drastically slowing down the main thread + //console.log('No callback for message fromScript', JSON.stringify(message)); return; } delete rpcCalls[message.id]; From c46531296f71644fc63b988513c80be1aa677a2b Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Tue, 9 Jan 2018 18:28:54 -0800 Subject: [PATCH 11/17] move key logic from onClicked to onReleased --- interface/resources/qml/controls-uit/Key.qml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/interface/resources/qml/controls-uit/Key.qml b/interface/resources/qml/controls-uit/Key.qml index b2c720368d..dd77fc92dc 100644 --- a/interface/resources/qml/controls-uit/Key.qml +++ b/interface/resources/qml/controls-uit/Key.qml @@ -45,18 +45,6 @@ Item { } } - onClicked: { - mouse.accepted = true; - Tablet.playSound(TabletEnums.ButtonClick); - - webEntity.synthesizeKeyPress(glyph); - webEntity.synthesizeKeyPress(glyph, mirrorText); - - if (toggle) { - toggled = !toggled; - } - } - onDoubleClicked: { mouse.accepted = true; } @@ -94,6 +82,14 @@ Item { onReleased: { if (containsMouse) { + Tablet.playSound(TabletEnums.ButtonClick); + + webEntity.synthesizeKeyPress(glyph); + webEntity.synthesizeKeyPress(glyph, mirrorText); + + if (toggle) { + toggled = !toggled; + } keyItem.state = "mouseOver"; } else { if (toggled) { From 057c7086374776bc75e6904e913d490ebbb62384 Mon Sep 17 00:00:00 2001 From: Cain Kilgore Date: Wed, 10 Jan 2018 19:24:52 +0000 Subject: [PATCH 12/17] Spaces instead of Tabs (Damnit VS Re-install!) --- .../resources/qml/dialogs/FileDialog.qml | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/interface/resources/qml/dialogs/FileDialog.qml b/interface/resources/qml/dialogs/FileDialog.qml index c49fa145cd..d2115b5e7e 100644 --- a/interface/resources/qml/dialogs/FileDialog.qml +++ b/interface/resources/qml/dialogs/FileDialog.qml @@ -71,14 +71,13 @@ ModalWindow { signal selectedFile(var file); signal canceled(); signal selected(int button); - - function click(button) { - clickedButton = button; - selected(button); - destroy(); + function click(button) { + clickedButton = button; + selected(button); + destroy(); } - property int clickedButton: OriginalDialogs.StandardButton.NoButton; + property int clickedButton: OriginalDialogs.StandardButton.NoButton; Component.onCompleted: { console.log("Helper " + helper + " drives " + drives); @@ -637,10 +636,10 @@ ModalWindow { case Qt.Key_Backtab: event.accepted = false; break; - case Qt.Key_Escape: - event.accepted = true; - root.click(OriginalDialogs.StandardButton.Cancel); - break; + case Qt.Key_Escape: + event.accepted = true; + root.click(OriginalDialogs.StandardButton.Cancel); + break; default: if (addToPrefix(event)) { event.accepted = true @@ -806,10 +805,10 @@ ModalWindow { event.accepted = d.navigateHome(); break; - case Qt.Key_Escape: - event.accepted = true; - root.click(OriginalDialogs.StandardButton.Cancel); - break; + case Qt.Key_Escape: + event.accepted = true; + root.click(OriginalDialogs.StandardButton.Cancel); + break; } } } From c99a936720b4dbd0d2a453aa22d02f579e4b8c07 Mon Sep 17 00:00:00 2001 From: Nissim Hadar Date: Wed, 10 Jan 2018 11:45:37 -0800 Subject: [PATCH 13/17] Bumped up protocol version. --- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index d71a4da99d..573f814018 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -30,7 +30,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::EntityEdit: case PacketType::EntityData: case PacketType::EntityPhysics: - return static_cast(EntityVersion::ZoneLightInheritModes); + return static_cast(EntityVersion::StageRemoved); case PacketType::EntityQuery: return static_cast(EntityQueryPacketVersion::RemovedJurisdictions); diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 63fde0a2e9..ad30eadb9c 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -202,7 +202,8 @@ enum class EntityVersion : PacketVersion { HazeEffect, StaticCertJsonVersionOne, OwnershipChallengeFix, - ZoneLightInheritModes + ZoneLightInheritModes, + StageRemoved }; enum class EntityScriptCallMethodVersion : PacketVersion { From ae997928c138416744129769f9af07a40442696e Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Wed, 10 Jan 2018 11:51:44 -0800 Subject: [PATCH 14/17] Bug fix to prevent wrists entering the avatar's torso. This was inadvertently disabled in PR #11978. --- interface/src/avatar/MySkeletonModel.cpp | 16 ++++++------ libraries/animation/src/Rig.cpp | 31 ++++++++++++------------ libraries/animation/src/Rig.h | 12 ++++++--- 3 files changed, 33 insertions(+), 26 deletions(-) diff --git a/interface/src/avatar/MySkeletonModel.cpp b/interface/src/avatar/MySkeletonModel.cpp index 8d07a878b9..a8bdafb607 100644 --- a/interface/src/avatar/MySkeletonModel.cpp +++ b/interface/src/avatar/MySkeletonModel.cpp @@ -106,7 +106,7 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { if (avatarHeadPose.isValid()) { AnimPose pose(avatarHeadPose.getRotation(), avatarHeadPose.getTranslation()); params.primaryControllerPoses[Rig::PrimaryControllerType_Head] = avatarToRigPose * pose; - params.primaryControllerActiveFlags[Rig::PrimaryControllerType_Head] = true; + params.primaryControllerFlags[Rig::PrimaryControllerType_Head] = (uint8_t)Rig::ControllerFlags::Enabled; } else { // even though full head IK is disabled, the rig still needs the head orientation to rotate the head up and // down in desktop mode. @@ -114,7 +114,7 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { // postMult 180 is necessary to convert head from -z forward to z forward. glm::quat headRot = Quaternions::Y_180 * head->getFinalOrientationInLocalFrame() * Quaternions::Y_180; params.primaryControllerPoses[Rig::PrimaryControllerType_Head] = AnimPose(glm::vec3(1.0f), headRot, glm::vec3(0.0f)); - params.primaryControllerActiveFlags[Rig::PrimaryControllerType_Head] = false; + params.primaryControllerFlags[Rig::PrimaryControllerType_Head] = 0; } // @@ -135,10 +135,10 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { if (controllerPose.isValid()) { AnimPose pose(controllerPose.getRotation(), controllerPose.getTranslation()); params.primaryControllerPoses[pair.second] = avatarToRigPose * pose; - params.primaryControllerActiveFlags[pair.second] = true; + params.primaryControllerFlags[pair.second] = (uint8_t)Rig::ControllerFlags::Enabled; } else { params.primaryControllerPoses[pair.second] = AnimPose::identity; - params.primaryControllerActiveFlags[pair.second] = false; + params.primaryControllerFlags[pair.second] = 0; } } @@ -166,15 +166,15 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { if (controllerPose.isValid()) { AnimPose pose(controllerPose.getRotation(), controllerPose.getTranslation()); params.secondaryControllerPoses[pair.second] = avatarToRigPose * pose; - params.secondaryControllerActiveFlags[pair.second] = true; + params.secondaryControllerFlags[pair.second] = (uint8_t)Rig::ControllerFlags::Enabled; } else { params.secondaryControllerPoses[pair.second] = AnimPose::identity; - params.secondaryControllerActiveFlags[pair.second] = false; + params.secondaryControllerFlags[pair.second] = 0; } } // if hips are not under direct control, estimate the hips position. - if (avatarHeadPose.isValid() && !params.primaryControllerActiveFlags[Rig::PrimaryControllerType_Hips]) { + if (avatarHeadPose.isValid() && !(params.primaryControllerFlags[Rig::PrimaryControllerType_Hips] & (uint8_t)Rig::ControllerFlags::Enabled)) { bool isFlying = (myAvatar->getCharacterController()->getState() == CharacterController::State::Hover || myAvatar->getCharacterController()->computeCollisionGroup() == BULLET_COLLISION_GROUP_COLLISIONLESS); if (!_prevHipsValid) { @@ -200,7 +200,7 @@ void MySkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { AnimPose sensorToRigPose(invRigMat * myAvatar->getSensorToWorldMatrix()); params.primaryControllerPoses[Rig::PrimaryControllerType_Hips] = sensorToRigPose * hips; - params.primaryControllerActiveFlags[Rig::PrimaryControllerType_Hips] = true; + params.primaryControllerFlags[Rig::PrimaryControllerType_Hips] = (uint8_t)Rig::ControllerFlags::Enabled | (uint8_t)Rig::ControllerFlags::Estimated; } else { _prevHipsValid = false; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 44745c5c2d..27ba7a38a4 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1265,7 +1265,8 @@ glm::vec3 Rig::deflectHandFromTorso(const glm::vec3& handPosition, const FBXJoin return position; } -void Rig::updateHands(bool leftHandEnabled, bool rightHandEnabled, bool hipsEnabled, bool leftArmEnabled, bool rightArmEnabled, float dt, +void Rig::updateHands(bool leftHandEnabled, bool rightHandEnabled, bool hipsEnabled, bool hipsEstimated, + bool leftArmEnabled, bool rightArmEnabled, float dt, const AnimPose& leftHandPose, const AnimPose& rightHandPose, const FBXJointShapeInfo& hipsShapeInfo, const FBXJointShapeInfo& spineShapeInfo, const FBXJointShapeInfo& spine1ShapeInfo, const FBXJointShapeInfo& spine2ShapeInfo) { @@ -1279,7 +1280,7 @@ void Rig::updateHands(bool leftHandEnabled, bool rightHandEnabled, bool hipsEnab glm::vec3 handPosition = leftHandPose.trans(); glm::quat handRotation = leftHandPose.rot(); - if (!hipsEnabled) { + if (!hipsEnabled || hipsEstimated) { // prevent the hand IK targets from intersecting the torso handPosition = deflectHandFromTorso(handPosition, hipsShapeInfo, spineShapeInfo, spine1ShapeInfo, spine2ShapeInfo); } @@ -1326,7 +1327,7 @@ void Rig::updateHands(bool leftHandEnabled, bool rightHandEnabled, bool hipsEnab glm::vec3 handPosition = rightHandPose.trans(); glm::quat handRotation = rightHandPose.rot(); - if (!hipsEnabled) { + if (!hipsEnabled || hipsEstimated) { // prevent the hand IK targets from intersecting the torso handPosition = deflectHandFromTorso(handPosition, hipsShapeInfo, spineShapeInfo, spine1ShapeInfo, spine2ShapeInfo); } @@ -1550,20 +1551,20 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo _animVars.set("isTalking", params.isTalking); _animVars.set("notIsTalking", !params.isTalking); - bool headEnabled = params.primaryControllerActiveFlags[PrimaryControllerType_Head]; - bool leftHandEnabled = params.primaryControllerActiveFlags[PrimaryControllerType_LeftHand]; - bool rightHandEnabled = params.primaryControllerActiveFlags[PrimaryControllerType_RightHand]; - bool hipsEnabled = params.primaryControllerActiveFlags[PrimaryControllerType_Hips]; - bool leftFootEnabled = params.primaryControllerActiveFlags[PrimaryControllerType_LeftFoot]; - bool rightFootEnabled = params.primaryControllerActiveFlags[PrimaryControllerType_RightFoot]; - bool spine2Enabled = params.primaryControllerActiveFlags[PrimaryControllerType_Spine2]; - - bool leftArmEnabled = params.secondaryControllerActiveFlags[SecondaryControllerType_LeftArm]; - bool rightArmEnabled = params.secondaryControllerActiveFlags[SecondaryControllerType_RightArm]; + bool headEnabled = params.primaryControllerFlags[PrimaryControllerType_Head] & (uint8_t)ControllerFlags::Enabled; + bool leftHandEnabled = params.primaryControllerFlags[PrimaryControllerType_LeftHand] & (uint8_t)ControllerFlags::Enabled; + bool rightHandEnabled = params.primaryControllerFlags[PrimaryControllerType_RightHand] & (uint8_t)ControllerFlags::Enabled; + bool hipsEnabled = params.primaryControllerFlags[PrimaryControllerType_Hips] & (uint8_t)ControllerFlags::Enabled; + bool hipsEstimated = params.primaryControllerFlags[PrimaryControllerType_Hips] & (uint8_t)ControllerFlags::Estimated; + bool leftFootEnabled = params.primaryControllerFlags[PrimaryControllerType_LeftFoot] & (uint8_t)ControllerFlags::Enabled; + bool rightFootEnabled = params.primaryControllerFlags[PrimaryControllerType_RightFoot] & (uint8_t)ControllerFlags::Enabled; + bool spine2Enabled = params.primaryControllerFlags[PrimaryControllerType_Spine2] & (uint8_t)ControllerFlags::Enabled; + bool leftArmEnabled = params.secondaryControllerFlags[SecondaryControllerType_LeftArm] & (uint8_t)ControllerFlags::Enabled; + bool rightArmEnabled = params.secondaryControllerFlags[SecondaryControllerType_RightArm] & (uint8_t)ControllerFlags::Enabled; updateHead(headEnabled, hipsEnabled, params.primaryControllerPoses[PrimaryControllerType_Head]); - updateHands(leftHandEnabled, rightHandEnabled, hipsEnabled, leftArmEnabled, rightArmEnabled, dt, + updateHands(leftHandEnabled, rightHandEnabled, hipsEnabled, hipsEstimated, leftArmEnabled, rightArmEnabled, dt, params.primaryControllerPoses[PrimaryControllerType_LeftHand], params.primaryControllerPoses[PrimaryControllerType_RightHand], params.hipsShapeInfo, params.spineShapeInfo, params.spine1ShapeInfo, params.spine2ShapeInfo); @@ -1623,7 +1624,7 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo for (int i = 0; i < (int)NumSecondaryControllerTypes; i++) { int index = indexOfJoint(secondaryControllerJointNames[i]); if (index >= 0) { - if (params.secondaryControllerActiveFlags[i]) { + if (params.secondaryControllerFlags[i] & (uint8_t)ControllerFlags::Enabled) { ikNode->setSecondaryTargetInRigFrame(index, params.secondaryControllerPoses[i]); } else { ikNode->clearSecondaryTarget(index); diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 1ec4d9527f..2b276386a0 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -69,11 +69,16 @@ public: NumSecondaryControllerTypes }; + enum class ControllerFlags : uint8_t { + Enabled = 0x01, + Estimated = 0x02 + }; + struct ControllerParameters { AnimPose primaryControllerPoses[NumPrimaryControllerTypes]; // rig space - bool primaryControllerActiveFlags[NumPrimaryControllerTypes]; + uint8_t primaryControllerFlags[NumPrimaryControllerTypes]; AnimPose secondaryControllerPoses[NumSecondaryControllerTypes]; // rig space - bool secondaryControllerActiveFlags[NumSecondaryControllerTypes]; + uint8_t secondaryControllerFlags[NumSecondaryControllerTypes]; bool isTalking; FBXJointShapeInfo hipsShapeInfo; FBXJointShapeInfo spineShapeInfo; @@ -251,7 +256,8 @@ protected: void buildAbsoluteRigPoses(const AnimPoseVec& relativePoses, AnimPoseVec& absolutePosesOut); void updateHead(bool headEnabled, bool hipsEnabled, const AnimPose& headMatrix); - void updateHands(bool leftHandEnabled, bool rightHandEnabled, bool hipsEnabled, bool leftArmEnabled, bool rightArmEnabled, float dt, + void updateHands(bool leftHandEnabled, bool rightHandEnabled, bool hipsEnabled, bool hipsEstimated, + bool leftArmEnabled, bool rightArmEnabled, float dt, const AnimPose& leftHandPose, const AnimPose& rightHandPose, const FBXJointShapeInfo& hipsShapeInfo, const FBXJointShapeInfo& spineShapeInfo, const FBXJointShapeInfo& spine1ShapeInfo, const FBXJointShapeInfo& spine2ShapeInfo); From b26e31a36244579a41516b79d84754ea122c34fd Mon Sep 17 00:00:00 2001 From: Cain Kilgore Date: Wed, 10 Jan 2018 20:27:19 +0000 Subject: [PATCH 15/17] Copy paste? Never! --- interface/src/scripting/WindowScriptingInterface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 3b8412900f..33ff8d1f96 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -1,5 +1,5 @@ // -// WindowScriptingInterface.cpp +// WindowScriptingInterface.h // interface/src/scripting // // Created by Ryan Huffman on 4/29/14. From 104ac0ffae379d48f70b1e6827f341b83ae9177e Mon Sep 17 00:00:00 2001 From: Cain Kilgore Date: Wed, 10 Jan 2018 20:30:41 +0000 Subject: [PATCH 16/17] Indents, man --- interface/resources/qml/dialogs/FileDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/dialogs/FileDialog.qml b/interface/resources/qml/dialogs/FileDialog.qml index d2115b5e7e..7b1a177c86 100644 --- a/interface/resources/qml/dialogs/FileDialog.qml +++ b/interface/resources/qml/dialogs/FileDialog.qml @@ -636,7 +636,7 @@ ModalWindow { case Qt.Key_Backtab: event.accepted = false; break; - case Qt.Key_Escape: + case Qt.Key_Escape: event.accepted = true; root.click(OriginalDialogs.StandardButton.Cancel); break; From 8396997dec278aa873efc2c7938c045d876f0f95 Mon Sep 17 00:00:00 2001 From: Nissim Hadar Date: Wed, 10 Jan 2018 13:35:57 -0800 Subject: [PATCH 17/17] Renamed enum element. --- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 573f814018..db670c0a88 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -30,7 +30,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::EntityEdit: case PacketType::EntityData: case PacketType::EntityPhysics: - return static_cast(EntityVersion::StageRemoved); + return static_cast(EntityVersion::ZoneStageRemoved); case PacketType::EntityQuery: return static_cast(EntityQueryPacketVersion::RemovedJurisdictions); diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index ad30eadb9c..7eafbbccf5 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -203,7 +203,7 @@ enum class EntityVersion : PacketVersion { StaticCertJsonVersionOne, OwnershipChallengeFix, ZoneLightInheritModes, - StageRemoved + ZoneStageRemoved }; enum class EntityScriptCallMethodVersion : PacketVersion {