diff --git a/interface/resources/qml/CurrentAPI.qml b/interface/resources/qml/CurrentAPI.qml
index d9255e51eb..96bfb5c36b 100644
--- a/interface/resources/qml/CurrentAPI.qml
+++ b/interface/resources/qml/CurrentAPI.qml
@@ -33,8 +33,6 @@ Item {
width: parent.width
height: parent.height
}
-
- FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; }
Timer {
id: updateList
diff --git a/interface/resources/qml/controls-uit/CheckBoxQQC2.qml b/interface/resources/qml/controls-uit/CheckBoxQQC2.qml
index 040cd8e505..8a9686ff5e 100644
--- a/interface/resources/qml/controls-uit/CheckBoxQQC2.qml
+++ b/interface/resources/qml/controls-uit/CheckBoxQQC2.qml
@@ -109,9 +109,9 @@ CheckBox {
contentItem: Text {
id: root
- FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; }
font.pixelSize: hifi.fontSizes.inputLabel
- font.family: ralewaySemiBold.name
+ font.family: "Raleway"
+ font.weight: Font.DemiBold
text: checkBox.text
color: checkBox.color
x: 2
diff --git a/interface/resources/qml/controls-uit/Keyboard.qml b/interface/resources/qml/controls-uit/Keyboard.qml
index 0c86754734..ea76d44aaa 100644
--- a/interface/resources/qml/controls-uit/Keyboard.qml
+++ b/interface/resources/qml/controls-uit/Keyboard.qml
@@ -125,8 +125,7 @@ Rectangle {
TextInput {
id: mirrorText
visible: showMirrorText
- FontLoader { id: font; source: "qrc:/fonts/FiraSans-Regular.ttf"; }
- font.family: font.name
+ font.family: "Fira Sans"
font.pixelSize: 20
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
@@ -165,8 +164,6 @@ Rectangle {
anchors.bottom: parent.bottom
anchors.bottomMargin: 0
- FontLoader { id: hiFiGlyphs; source: "qrc:/fonts/hifi-glyphs.ttf"; }
-
Column {
id: columnAlpha
width: keyboardWidth
@@ -250,7 +247,7 @@ Rectangle {
Key { width: 43; glyph: ","; }
Key { width: 43; glyph: "."; }
Key {
- fontFamily: hiFiGlyphs.name;
+ fontFamily: "hifi-glyphs";
fontPixelSize: 48;
letterAnchors.topMargin: -4;
verticalAlignment: Text.AlignVCenter;
@@ -343,7 +340,7 @@ Rectangle {
Key { width: 43; glyph: ","; }
Key { width: 43; glyph: "."; }
Key {
- fontFamily: hiFiGlyphs.name;
+ fontFamily: "hifi-glyphs";
fontPixelSize: 48;
letterAnchors.topMargin: -4;
verticalAlignment: Text.AlignVCenter;
diff --git a/interface/resources/qml/controls-uit/SpinBox.qml b/interface/resources/qml/controls-uit/SpinBox.qml
index f2a7e0efe8..30f6682d5a 100644
--- a/interface/resources/qml/controls-uit/SpinBox.qml
+++ b/interface/resources/qml/controls-uit/SpinBox.qml
@@ -25,8 +25,7 @@ SpinBox {
property color colorLabelInside: hifi.colors.white
property real controlHeight: height + (spinBoxLabel.visible ? spinBoxLabel.height + spinBoxLabel.anchors.bottomMargin : 0)
- FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; }
- font.family: firaSansSemiBold.name
+ font.family: "Fira Sans SemiBold"
font.pixelSize: hifi.fontSizes.textFieldInput
height: hifi.fontSizes.textFieldInput + 13 // Match height of TextField control.
diff --git a/interface/resources/qml/controls-uit/TextEdit.qml b/interface/resources/qml/controls-uit/TextEdit.qml
index 34eff7586a..0fe03150f4 100644
--- a/interface/resources/qml/controls-uit/TextEdit.qml
+++ b/interface/resources/qml/controls-uit/TextEdit.qml
@@ -16,9 +16,9 @@ import "../styles-uit"
TextEdit {
property real size: 32
-
- FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; }
- font.family: ralewaySemiBold.name
+
+ font.family: "Raleway"
+ font.weight: Font.DemiBold
font.pointSize: size
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
diff --git a/interface/resources/qml/controls-uit/TextField.qml b/interface/resources/qml/controls-uit/TextField.qml
index ee646b2575..782ab454b5 100644
--- a/interface/resources/qml/controls-uit/TextField.qml
+++ b/interface/resources/qml/controls-uit/TextField.qml
@@ -34,9 +34,7 @@ TextField {
placeholderText: textField.placeholderText
- FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; }
- FontLoader { id: hifiGlyphs; source: "qrc:/fonts/hifi-glyphs.ttf"; }
- font.family: firaSansRegular.name
+ font.family: "Fira Sans"
font.pixelSize: hifi.fontSizes.textFieldInput
height: implicitHeight + 3 // Make surrounding box higher so that highlight is vertically centered.
property alias textFieldLabel: textFieldLabel
diff --git a/interface/resources/qml/controls/FontAwesome.qml b/interface/resources/qml/controls/FontAwesome.qml
index 7eda46e17e..2c897b6347 100644
--- a/interface/resources/qml/controls/FontAwesome.qml
+++ b/interface/resources/qml/controls/FontAwesome.qml
@@ -4,13 +4,12 @@ import QtQuick.Controls.Styles 1.3
Text {
id: root
- FontLoader { id: iconFont; source: "qrc:/fonts/fontawesome-webfont.ttf"; }
property int size: 32
width: size
height: size
font.pixelSize: size
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
- font.family: iconFont.name
+ font.family: "FontAwesome"
}
diff --git a/interface/resources/qml/dialogs/FileDialog.qml b/interface/resources/qml/dialogs/FileDialog.qml
index c078ace264..572e7a7918 100644
--- a/interface/resources/qml/dialogs/FileDialog.qml
+++ b/interface/resources/qml/dialogs/FileDialog.qml
@@ -532,9 +532,6 @@ ModalWindow {
itemDelegate: Item {
clip: true
- FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; }
- FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; }
-
FiraSansSemiBold {
text: getText();
elide: styleData.elideMode
@@ -548,7 +545,7 @@ ModalWindow {
size: hifi.fontSizes.tableText
color: hifi.colors.baseGrayHighlight
font.family: (styleData.row !== -1 && fileTableView.model.get(styleData.row).fileIsDir)
- ? firaSansSemiBold.name : firaSansRegular.name
+ ? "Fira Sans SemiBold" : "Fira Sans"
function getText() {
if (styleData.row === -1) {
diff --git a/interface/resources/qml/dialogs/TabletFileDialog.qml b/interface/resources/qml/dialogs/TabletFileDialog.qml
index 776f47d19d..c635095ac6 100644
--- a/interface/resources/qml/dialogs/TabletFileDialog.qml
+++ b/interface/resources/qml/dialogs/TabletFileDialog.qml
@@ -496,9 +496,6 @@ TabletModalWindow {
itemDelegate: Item {
clip: true
- //FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; }
- //FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; }
-
FiraSansSemiBold {
text: getText();
elide: styleData.elideMode
@@ -512,7 +509,7 @@ TabletModalWindow {
size: hifi.fontSizes.tableText
color: hifi.colors.baseGrayHighlight
//font.family: (styleData.row !== -1 && fileTableView.model.get(styleData.row).fileIsDir)
- //? firaSansSemiBold.name : firaSansRegular.name
+ //? "Fira Sans SemiBold" : "Fira Sans"
function getText() {
if (styleData.row === -1) {
diff --git a/interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml b/interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml
index dabc66c502..84f4c694ff 100644
--- a/interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml
+++ b/interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml
@@ -345,9 +345,6 @@ Item {
itemDelegate: Item {
clip: true
- FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; }
- FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; }
-
FiraSansSemiBold {
text: styleData.value
elide: styleData.elideMode
@@ -361,7 +358,7 @@ Item {
size: hifi.fontSizes.tableText
color: hifi.colors.baseGrayHighlight
font.family: (styleData.row !== -1 && assetTableView.model.get(styleData.row).fileIsDir)
- ? firaSansSemiBold.name : firaSansRegular.name
+ ? "Fira Sans SemiBold" : "Fira Sans"
}
}
diff --git a/interface/resources/qml/hifi/AssetServer.qml b/interface/resources/qml/hifi/AssetServer.qml
index 19a559b66c..34be11d4df 100644
--- a/interface/resources/qml/hifi/AssetServer.qml
+++ b/interface/resources/qml/hifi/AssetServer.qml
@@ -660,8 +660,7 @@ Windows.ScrollingWindow {
text: styleData.value
- FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; }
- font.family: firaSansSemiBold.name
+ font.family: "Fira Sans SemiBold"
font.pixelSize: hifi.fontSizes.textFieldInput
height: hifi.dimensions.tableRowHeight
diff --git a/interface/resources/qml/hifi/ComboDialog.qml b/interface/resources/qml/hifi/ComboDialog.qml
index 0b1a3b1a5c..06254bb7fb 100644
--- a/interface/resources/qml/hifi/ComboDialog.qml
+++ b/interface/resources/qml/hifi/ComboDialog.qml
@@ -25,8 +25,6 @@ Item {
property int dialogHeight;
property int comboOptionTextSize: 16;
property int comboBodyTextSize: 16;
- FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; }
- FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; }
visible: false;
id: combo;
anchors.fill: parent;
diff --git a/interface/resources/qml/hifi/DesktopLetterboxMessage.qml b/interface/resources/qml/hifi/DesktopLetterboxMessage.qml
index 9230bbe962..ede8590bfb 100644
--- a/interface/resources/qml/hifi/DesktopLetterboxMessage.qml
+++ b/interface/resources/qml/hifi/DesktopLetterboxMessage.qml
@@ -24,8 +24,6 @@ Item {
property real headerTextMargin: -5
property real headerGlyphMargin: -15
property bool isDesktop: false
- FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; }
- FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; }
visible: false
id: letterbox
anchors.fill: parent
@@ -78,7 +76,8 @@ Item {
// Text Size
font.pixelSize: headerTextPixelSize
// Style
- font.family: ralewaySemiBold.name
+ font.family: "Raleway"
+ font.weight: Font.DemiBold
color: hifi.colors.darkGray
horizontalAlignment: Text.AlignHLeft
verticalAlignment: Text.AlignVCenter
@@ -101,7 +100,7 @@ Item {
horizontalAlignment: Text.AlignHLeft
// Style
font.pixelSize: popupTextPixelSize
- font.family: ralewayRegular.name
+ font.family: "Raleway"
color: hifi.colors.darkGray
wrapMode: Text.WordWrap
textFormat: Text.StyledText
diff --git a/interface/resources/qml/hifi/LetterboxMessage.qml b/interface/resources/qml/hifi/LetterboxMessage.qml
index dcd0d906db..0e9ce89ddb 100644
--- a/interface/resources/qml/hifi/LetterboxMessage.qml
+++ b/interface/resources/qml/hifi/LetterboxMessage.qml
@@ -23,8 +23,6 @@ Item {
property real popupTextPixelSize: 16
property real headerTextMargin: -5
property real headerGlyphMargin: -15
- FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; }
- FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; }
visible: false
id: letterbox
anchors.fill: parent
@@ -82,7 +80,8 @@ Item {
// Text Size
font.pixelSize: headerTextPixelSize
// Style
- font.family: ralewaySemiBold.name
+ font.family: "Raleway"
+ font.weight: Font.DemiBold
color: hifi.colors.darkGray
horizontalAlignment: Text.AlignHLeft
verticalAlignment: Text.AlignVCenter
@@ -127,7 +126,7 @@ Item {
horizontalAlignment: Text.AlignHLeft
// Style
font.pixelSize: popupTextPixelSize
- font.family: ralewayRegular.name
+ font.family: "Raleway"
color: hifi.colors.darkGray
wrapMode: Text.WordWrap
textFormat: Text.StyledText
diff --git a/interface/resources/qml/hifi/NameCard.qml b/interface/resources/qml/hifi/NameCard.qml
index 4c9c746488..c97a802f10 100644
--- a/interface/resources/qml/hifi/NameCard.qml
+++ b/interface/resources/qml/hifi/NameCard.qml
@@ -177,8 +177,7 @@ Item {
anchors.right: parent.right
anchors.rightMargin: editGlyph.width + editGlyph.anchors.rightMargin
// Style
- FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; }
- font.family: firaSansSemiBold.name
+ font.family: "Fira Sans SemiBold"
font.pixelSize: displayNameTextPixelSize
selectionColor: hifi.colors.blueAccent
selectedTextColor: "black"
diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml
index 699173aaeb..d779b4ba42 100644
--- a/interface/resources/qml/hifi/Pal.qml
+++ b/interface/resources/qml/hifi/Pal.qml
@@ -908,7 +908,6 @@ Rectangle {
anchors.horizontalCenter: parent.horizontalCenter;
}
- FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; }
Text {
id: connectionHelpText;
// Anchors
@@ -923,7 +922,7 @@ Rectangle {
horizontalAlignment: Text.AlignHLeft
// Style
font.pixelSize: 18;
- font.family: ralewayRegular.name
+ font.family: "Raleway"
color: hifi.colors.darkGray
wrapMode: Text.WordWrap
textFormat: Text.StyledText;
diff --git a/interface/resources/qml/hifi/audio/Audio.qml b/interface/resources/qml/hifi/audio/Audio.qml
index 156332579a..ba50b7f238 100644
--- a/interface/resources/qml/hifi/audio/Audio.qml
+++ b/interface/resources/qml/hifi/audio/Audio.qml
@@ -128,10 +128,10 @@ Rectangle {
AudioControls.CheckBox {
id: stereoMic
spacing: muteMic.spacing;
- text: qsTr("use stereo for stereo devices");
- checked: false;
+ text: qsTr("Enable stereo input");
+ checked: AudioScriptingInterface.isStereoInput();
onClicked: {
- var success = Audio.setIsStereoInput(checked);
+ var success = AudioScriptingInterface.setStereoInput(checked);
if (!success) {
checked = !checked;
}
@@ -219,7 +219,7 @@ Rectangle {
onPressed: {
if (!checked) {
stereoMic.checked = false;
- Audio.setIsStereoInput(false); // the next selected audio device might not support stereo
+ AudioScriptingInterface.setStereoInput(false); // the next selected audio device might not support stereo
AudioScriptingInterface.setInputDevice(info, bar.currentIndex === 1);
}
}
diff --git a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml
index 372fb3c774..96ffa390bf 100644
--- a/interface/resources/qml/hifi/commerce/checkout/Checkout.qml
+++ b/interface/resources/qml/hifi/commerce/checkout/Checkout.qml
@@ -147,8 +147,7 @@ Rectangle {
} else if (root.itemHref.indexOf('.json') > -1) {
root.itemType = "entity"; // "wearable" type handled later
} else {
- console.log("WARNING - Item type is UNKNOWN!");
- root.itemType = "entity";
+ root.itemType = "unknown";
}
}
diff --git a/interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml b/interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml
index 8eb03c1254..8a7e809b3d 100644
--- a/interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml
+++ b/interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml
@@ -141,10 +141,9 @@ Item {
}
}
- FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; }
TextMetrics {
id: textMetrics;
- font.family: ralewayRegular.name
+ font.family: "Raleway"
text: usernameText.text;
}
diff --git a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml
index fa065bc4de..b8b34dc395 100644
--- a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml
+++ b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml
@@ -174,11 +174,12 @@ Rectangle {
WalletChoice {
id: walletChoice;
proceedFunction: function (isReset) {
- console.log(isReset ? "Reset wallet." : "Trying again with new wallet.");
+ console.log("WalletChoice", isReset ? "Reset wallet." : "Trying again with new wallet.");
Commerce.setSoftReset();
if (isReset) {
walletResetSetup();
} else {
+ Commerce.clearWallet();
var msg = { referrer: walletChoice.referrer }
followReferrer(msg);
}
diff --git a/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml b/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml
index 5d03296823..c5989fff20 100644
--- a/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml
+++ b/interface/resources/qml/hifi/commerce/wallet/sendMoney/SendMoney.qml
@@ -997,14 +997,13 @@ Item {
anchors.right: parent.right;
anchors.rightMargin: 20;
height: 95;
-
- FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; }
+
TextArea {
id: optionalMessage;
property int maximumLength: 72;
property string previousText: text;
placeholderText: "Optional Public Message (" + maximumLength + " character limit)";
- font.family: firaSansSemiBold.name;
+ font.family: "Fira Sans SemiBold";
font.pixelSize: 20;
// Anchors
anchors.fill: parent;
diff --git a/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml b/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml
index 0f70b44477..a85e5d4498 100644
--- a/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml
@@ -659,8 +659,7 @@ Rectangle {
text: styleData.value
- FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; }
- font.family: firaSansSemiBold.name
+ font.family: "Fira Sans SemiBold"
font.pixelSize: hifi.fontSizes.textFieldInput
height: hifi.dimensions.tableRowHeight
diff --git a/interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml b/interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml
index ead63537f0..08b0104fce 100644
--- a/interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml
+++ b/interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml
@@ -478,9 +478,6 @@ Rectangle {
itemDelegate: Item {
clip: true
- //FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; }
- //FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; }
-
FiraSansSemiBold {
text: getText();
elide: styleData.elideMode
@@ -494,7 +491,7 @@ Rectangle {
size: hifi.fontSizes.tableText
color: hifi.colors.baseGrayHighlight
//font.family: (styleData.row !== -1 && fileTableView.model.get(styleData.row).fileIsDir)
- //? firaSansSemiBold.name : firaSansRegular.name
+ //? "Fira Sans SemiBold" : "Fira Sans"
function getText() {
if (styleData.row === -1) {
diff --git a/interface/resources/qml/styles-uit/AnonymousProRegular.qml b/interface/resources/qml/styles-uit/AnonymousProRegular.qml
index c832910ec2..d7e13423b6 100644
--- a/interface/resources/qml/styles-uit/AnonymousProRegular.qml
+++ b/interface/resources/qml/styles-uit/AnonymousProRegular.qml
@@ -14,10 +14,9 @@ import QtQuick.Controls.Styles 1.4
Text {
id: root
- FontLoader { id: anonymousProRegular; source: "qrc:/fonts/AnonymousPro-Regular.ttf"; }
property real size: 32
font.pixelSize: size
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
- font.family: anonymousProRegular.name
+ font.family: "Anonymous Pro"
}
diff --git a/interface/resources/qml/styles-uit/FiraSansRegular.qml b/interface/resources/qml/styles-uit/FiraSansRegular.qml
index 6d73210120..1166fa5cba 100644
--- a/interface/resources/qml/styles-uit/FiraSansRegular.qml
+++ b/interface/resources/qml/styles-uit/FiraSansRegular.qml
@@ -14,10 +14,9 @@ import QtQuick.Controls.Styles 1.4
Text {
id: root
- FontLoader { id: firaSansRegular; source: "qrc:/fonts/FiraSans-Regular.ttf"; }
property real size: 32
font.pixelSize: size
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
- font.family: firaSansRegular.name
+ font.family: "Fira Sans"
}
diff --git a/interface/resources/qml/styles-uit/FiraSansSemiBold.qml b/interface/resources/qml/styles-uit/FiraSansSemiBold.qml
index 2bfd319d49..2f095c57a6 100644
--- a/interface/resources/qml/styles-uit/FiraSansSemiBold.qml
+++ b/interface/resources/qml/styles-uit/FiraSansSemiBold.qml
@@ -14,10 +14,9 @@ import QtQuick.Controls.Styles 1.4
Text {
id: root
- FontLoader { id: firaSansSemiBold; source: "qrc:/fonts/FiraSans-SemiBold.ttf"; }
property real size: 32
font.pixelSize: size
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
- font.family: firaSansSemiBold.name
+ font.family: "Fira Sans SemiBold"
}
diff --git a/interface/resources/qml/styles-uit/HiFiGlyphs.qml b/interface/resources/qml/styles-uit/HiFiGlyphs.qml
index baab41e166..07f0212f0c 100644
--- a/interface/resources/qml/styles-uit/HiFiGlyphs.qml
+++ b/interface/resources/qml/styles-uit/HiFiGlyphs.qml
@@ -12,12 +12,11 @@ import QtQuick 2.5
Text {
id: root
- FontLoader { id: hiFiGlyphs; source: "qrc:/fonts/hifi-glyphs.ttf"; }
property int size: 32
font.pixelSize: size
width: size
height: size
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
- font.family: hiFiGlyphs.name
+ font.family: "hifi-glyphs"
}
diff --git a/interface/resources/qml/styles-uit/RalewayBold.qml b/interface/resources/qml/styles-uit/RalewayBold.qml
index 963d8d9ba4..5f42ecd90b 100644
--- a/interface/resources/qml/styles-uit/RalewayBold.qml
+++ b/interface/resources/qml/styles-uit/RalewayBold.qml
@@ -14,11 +14,10 @@ import QtQuick.Controls.Styles 1.4
Text {
id: root
- FontLoader { id: ralewayBold; source: "qrc:/fonts/Raleway-Bold.ttf"; }
property real size: 32
font.pixelSize: size
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
- font.family: ralewayBold.name
- font.bold: true // Font seems to need this in order to display bold.
+ font.family: "Raleway"
+ font.bold: true
}
diff --git a/interface/resources/qml/styles-uit/RalewayLight.qml b/interface/resources/qml/styles-uit/RalewayLight.qml
index 8957b70c82..e6b12fca9c 100644
--- a/interface/resources/qml/styles-uit/RalewayLight.qml
+++ b/interface/resources/qml/styles-uit/RalewayLight.qml
@@ -14,10 +14,9 @@ import QtQuick.Controls.Styles 1.4
Text {
id: root
- FontLoader { id: ralewayLight; source: "qrc:/fonts/Raleway-Light.ttf"; }
property real size: 32
font.pixelSize: size
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
- font.family: ralewayLight.name
+ font.family: "Raleway Light"
}
diff --git a/interface/resources/qml/styles-uit/RalewayRegular.qml b/interface/resources/qml/styles-uit/RalewayRegular.qml
index fd2661928c..5c9b87dc8a 100644
--- a/interface/resources/qml/styles-uit/RalewayRegular.qml
+++ b/interface/resources/qml/styles-uit/RalewayRegular.qml
@@ -14,10 +14,9 @@ import QtQuick.Controls.Styles 1.4
Text {
id: root
- FontLoader { id: ralewayRegular; source: "qrc:/fonts/Raleway-Regular.ttf"; }
property real size: 32
font.pixelSize: size
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
- font.family: ralewayRegular.name
+ font.family: "Raleway"
}
diff --git a/interface/resources/qml/styles-uit/RalewaySemiBold.qml b/interface/resources/qml/styles-uit/RalewaySemiBold.qml
index 7ec9ea3b34..0b25f900bc 100644
--- a/interface/resources/qml/styles-uit/RalewaySemiBold.qml
+++ b/interface/resources/qml/styles-uit/RalewaySemiBold.qml
@@ -14,10 +14,10 @@ import QtQuick.Controls.Styles 1.4
Text {
id: root
- FontLoader { id: ralewaySemiBold; source: "qrc:/fonts/Raleway-SemiBold.ttf"; }
property real size: 32
font.pixelSize: size
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
- font.family: ralewaySemiBold.name
+ font.family: "Raleway"
+ font.weight: Font.DemiBold
}
diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index 35f1ec65fd..68892bf247 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -981,6 +981,15 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
qInstallMessageHandler(messageHandler);
QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "styles/Inconsolata.otf");
+ QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/fontawesome-webfont.ttf");
+ QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/hifi-glyphs.ttf");
+ QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/AnonymousPro-Regular.ttf");
+ QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/FiraSans-Regular.ttf");
+ QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/FiraSans-SemiBold.ttf");
+ QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Raleway-Light.ttf");
+ QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Raleway-Regular.ttf");
+ QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Raleway-Bold.ttf");
+ QFontDatabase::addApplicationFont(PathUtils::resourcesPath() + "fonts/Raleway-SemiBold.ttf");
_window->setWindowTitle("High Fidelity Interface");
Model::setAbstractViewStateInterface(this); // The model class will sometimes need to know view state details from us
@@ -6648,17 +6657,17 @@ void Application::addAssetToWorld(QString path, QString zipFile, bool isZip, boo
addAssetToWorldInfo(filename, "Adding " + mapping.mid(1) + " to the Asset Server.");
- addAssetToWorldWithNewMapping(path, mapping, 0);
+ addAssetToWorldWithNewMapping(path, mapping, 0, isZip, isBlocks);
}
-void Application::addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy) {
+void Application::addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isZip, bool isBlocks) {
auto request = DependencyManager::get()->createGetMappingRequest(mapping);
QObject::connect(request, &GetMappingRequest::finished, this, [=](GetMappingRequest* request) mutable {
const int MAX_COPY_COUNT = 100; // Limit number of duplicate assets; recursion guard.
auto result = request->getError();
if (result == GetMappingRequest::NotFound) {
- addAssetToWorldUpload(filePath, mapping);
+ addAssetToWorldUpload(filePath, mapping, isZip, isBlocks);
} else if (result != GetMappingRequest::NoError) {
QString errorInfo = "Could not map asset name: "
+ mapping.left(mapping.length() - QString::number(copy).length() - 1);
@@ -6670,7 +6679,7 @@ void Application::addAssetToWorldWithNewMapping(QString filePath, QString mappin
}
copy++;
mapping = mapping.insert(mapping.lastIndexOf("."), "-" + QString::number(copy));
- addAssetToWorldWithNewMapping(filePath, mapping, copy);
+ addAssetToWorldWithNewMapping(filePath, mapping, copy, isZip, isBlocks);
} else {
QString errorInfo = "Too many copies of asset name: "
+ mapping.left(mapping.length() - QString::number(copy).length() - 1);
@@ -6683,7 +6692,7 @@ void Application::addAssetToWorldWithNewMapping(QString filePath, QString mappin
request->start();
}
-void Application::addAssetToWorldUpload(QString filePath, QString mapping) {
+void Application::addAssetToWorldUpload(QString filePath, QString mapping, bool isZip, bool isBlocks) {
qInfo(interfaceapp) << "Uploading" << filePath << "to Asset Server as" << mapping;
auto upload = DependencyManager::get()->createUpload(filePath);
QObject::connect(upload, &AssetUpload::finished, this, [=](AssetUpload* upload, const QString& hash) mutable {
@@ -6692,7 +6701,7 @@ void Application::addAssetToWorldUpload(QString filePath, QString mapping) {
qWarning(interfaceapp) << "Error downloading model: " + errorInfo;
addAssetToWorldError(filenameFromPath(filePath), errorInfo);
} else {
- addAssetToWorldSetMapping(filePath, mapping, hash);
+ addAssetToWorldSetMapping(filePath, mapping, hash, isZip, isBlocks);
}
// Remove temporary directory created by Clara.io market place download.
@@ -6709,7 +6718,7 @@ void Application::addAssetToWorldUpload(QString filePath, QString mapping) {
upload->start();
}
-void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash) {
+void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isZip, bool isBlocks) {
auto request = DependencyManager::get()->createSetMappingRequest(mapping, hash);
connect(request, &SetMappingRequest::finished, this, [=](SetMappingRequest* request) mutable {
if (request->getError() != SetMappingRequest::NoError) {
@@ -6717,9 +6726,10 @@ void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, Q
qWarning(interfaceapp) << "Error downloading model: " + errorInfo;
addAssetToWorldError(filenameFromPath(filePath), errorInfo);
} else {
- // to prevent files that aren't models from being loaded into world automatically
- if (filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION) ||
- filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION)) {
+ // to prevent files that aren't models or texture files from being loaded into world automatically
+ if ((filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION)) ||
+ ((filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION)) &&
+ ((!isBlocks) && (!isZip)))) {
addAssetToWorldAddEntity(filePath, mapping);
} else {
qCDebug(interfaceapp) << "Zipped contents are not supported entity files";
diff --git a/interface/src/Application.h b/interface/src/Application.h
index b53954b1c4..3537d89c97 100644
--- a/interface/src/Application.h
+++ b/interface/src/Application.h
@@ -323,11 +323,11 @@ public slots:
// FIXME: Move addAssetToWorld* methods to own class?
void addAssetToWorldFromURL(QString url);
void addAssetToWorldFromURLRequestFinished();
- void addAssetToWorld(QString filePath, QString zipFile, bool isZip, bool isBlocks);
+ void addAssetToWorld(QString filePath, QString zipFile, bool isZip = false, bool isBlocks = false);
void addAssetToWorldUnzipFailure(QString filePath);
- void addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy);
- void addAssetToWorldUpload(QString filePath, QString mapping);
- void addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash);
+ void addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isZip = false, bool isBlocks = false);
+ void addAssetToWorldUpload(QString filePath, QString mapping, bool isZip = false, bool isBlocks = false);
+ void addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isZip = false, bool isBlocks = false);
void addAssetToWorldAddEntity(QString filePath, QString mapping);
void handleUnzip(QString sourceFile, QStringList destinationFile, bool autoAdd, bool isZip, bool isBlocks);
diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp
index 712c505e8a..858af9b13d 100644
--- a/interface/src/commerce/Ledger.cpp
+++ b/interface/src/commerce/Ledger.cpp
@@ -80,9 +80,13 @@ void Ledger::signedSend(const QString& propertyName, const QByteArray& text, con
void Ledger::keysQuery(const QString& endpoint, const QString& success, const QString& fail, QJsonObject& requestParams) {
auto wallet = DependencyManager::get();
- requestParams["public_keys"] = QJsonArray::fromStringList(wallet->listPublicKeys());
-
- send(endpoint, success, fail, QNetworkAccessManager::PostOperation, AccountManagerAuth::Required, requestParams);
+ QStringList cachedPublicKeys = wallet->listPublicKeys();
+ if (!cachedPublicKeys.isEmpty()) {
+ requestParams["public_keys"] = QJsonArray::fromStringList(cachedPublicKeys);
+ send(endpoint, success, fail, QNetworkAccessManager::PostOperation, AccountManagerAuth::Required, requestParams);
+ } else {
+ qDebug(commerce) << "User attempted to call keysQuery, but cachedPublicKeys was empty!";
+ }
}
void Ledger::keysQuery(const QString& endpoint, const QString& success, const QString& fail) {
@@ -296,14 +300,18 @@ void Ledger::updateLocation(const QString& asset_id, const QString location, con
emit walletScriptingInterface->walletNotSetup();
qDebug(commerce) << "User attempted to update the location of a certificate, but their wallet wasn't ready. Status:" << walletStatus;
} else {
- QStringList keys = wallet->listPublicKeys();
- QString key = keys[0];
- QJsonObject transaction;
- transaction["certificate_id"] = asset_id;
- transaction["place_name"] = location;
- QJsonDocument transactionDoc{ transaction };
- auto transactionString = transactionDoc.toJson(QJsonDocument::Compact);
- signedSend("transaction", transactionString, key, "location", "updateLocationSuccess", "updateLocationFailure", controlledFailure);
+ QStringList cachedPublicKeys = wallet->listPublicKeys();
+ if (!cachedPublicKeys.isEmpty()) {
+ QString key = cachedPublicKeys[0];
+ QJsonObject transaction;
+ transaction["certificate_id"] = asset_id;
+ transaction["place_name"] = location;
+ QJsonDocument transactionDoc{ transaction };
+ auto transactionString = transactionDoc.toJson(QJsonDocument::Compact);
+ signedSend("transaction", transactionString, key, "location", "updateLocationSuccess", "updateLocationFailure", controlledFailure);
+ } else {
+ qDebug(commerce) << "User attempted to update the location of a certificate, but cachedPublicKeys was empty!";
+ }
}
}
@@ -359,7 +367,12 @@ void Ledger::alreadyOwned(const QString& marketplaceId) {
auto wallet = DependencyManager::get();
QString endpoint = "already_owned";
QJsonObject request;
- request["public_keys"] = QJsonArray::fromStringList(wallet->listPublicKeys());
- request["marketplace_item_id"] = marketplaceId;
- send(endpoint, "alreadyOwnedSuccess", "alreadyOwnedFailure", QNetworkAccessManager::PutOperation, AccountManagerAuth::Required, request);
+ QStringList cachedPublicKeys = wallet->listPublicKeys();
+ if (!cachedPublicKeys.isEmpty()) {
+ request["public_keys"] = QJsonArray::fromStringList(wallet->listPublicKeys());
+ request["marketplace_item_id"] = marketplaceId;
+ send(endpoint, "alreadyOwnedSuccess", "alreadyOwnedFailure", QNetworkAccessManager::PutOperation, AccountManagerAuth::Required, request);
+ } else {
+ qDebug(commerce) << "User attempted to use the alreadyOwned endpoint, but cachedPublicKeys was empty!";
+ }
}
diff --git a/interface/src/commerce/QmlCommerce.cpp b/interface/src/commerce/QmlCommerce.cpp
index 557193c074..53ec59049f 100644
--- a/interface/src/commerce/QmlCommerce.cpp
+++ b/interface/src/commerce/QmlCommerce.cpp
@@ -138,6 +138,11 @@ void QmlCommerce::setSoftReset() {
wallet->setSoftReset();
}
+void QmlCommerce::clearWallet() {
+ auto wallet = DependencyManager::get();
+ wallet->clear();
+}
+
void QmlCommerce::setPassphrase(const QString& passphrase) {
auto wallet = DependencyManager::get();
wallet->setPassphrase(passphrase);
diff --git a/interface/src/commerce/QmlCommerce.h b/interface/src/commerce/QmlCommerce.h
index 6a4eaa2be2..b4af4393e3 100644
--- a/interface/src/commerce/QmlCommerce.h
+++ b/interface/src/commerce/QmlCommerce.h
@@ -67,6 +67,7 @@ protected:
Q_INVOKABLE void setPassphrase(const QString& passphrase);
Q_INVOKABLE void changePassphrase(const QString& oldPassphrase, const QString& newPassphrase);
Q_INVOKABLE void setSoftReset();
+ Q_INVOKABLE void clearWallet();
Q_INVOKABLE void buy(const QString& assetId, int cost, const bool controlledFailure = false);
Q_INVOKABLE void balance();
diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp
index fad82115d6..060f8de09b 100644
--- a/interface/src/commerce/Wallet.cpp
+++ b/interface/src/commerce/Wallet.cpp
@@ -343,19 +343,23 @@ Wallet::Wallet() {
auto accountManager = DependencyManager::get();
connect(accountManager.data(), &AccountManager::usernameChanged, this, [&]() {
getWalletStatus();
- _publicKeys.clear();
-
- if (_securityImage) {
- delete _securityImage;
- }
- _securityImage = nullptr;
-
- // tell the provider we got nothing
- updateImageProvider();
- _passphrase->clear();
+ clear();
});
}
+void Wallet::clear() {
+ _publicKeys.clear();
+
+ if (_securityImage) {
+ delete _securityImage;
+ }
+ _securityImage = nullptr;
+
+ // tell the provider we got nothing
+ updateImageProvider();
+ _passphrase->clear();
+}
+
Wallet::~Wallet() {
if (_securityImage) {
delete _securityImage;
diff --git a/interface/src/commerce/Wallet.h b/interface/src/commerce/Wallet.h
index d771f404e5..8a7d6b8c07 100644
--- a/interface/src/commerce/Wallet.h
+++ b/interface/src/commerce/Wallet.h
@@ -49,8 +49,9 @@ public:
bool getPassphraseIsCached() { return !(_passphrase->isEmpty()); }
bool walletIsAuthenticatedWithPassphrase();
bool changePassphrase(const QString& newPassphrase);
- void setSoftReset() { _isOverridingServer = true; }
+ void setSoftReset() { _isOverridingServer = true; }
bool wasSoftReset() { bool was = _isOverridingServer; _isOverridingServer = false; return was; }
+ void clear();
void getWalletStatus();
enum WalletStatus {
diff --git a/interface/src/raypick/PickScriptingInterface.cpp b/interface/src/raypick/PickScriptingInterface.cpp
index 43e0c059f0..1bf6dd2f8e 100644
--- a/interface/src/raypick/PickScriptingInterface.cpp
+++ b/interface/src/raypick/PickScriptingInterface.cpp
@@ -174,4 +174,12 @@ void PickScriptingInterface::registerMetaTypes(QScriptEngine* engine) {
engine->globalObject().setProperty("PickType", pickTypes);
qScriptRegisterMetaType(engine, pickTypesToScriptValue, pickTypesFromScriptValue);
-}
\ No newline at end of file
+}
+
+unsigned int PickScriptingInterface::getPerFrameTimeBudget() const {
+ return DependencyManager::get()->getPerFrameTimeBudget();
+}
+
+void PickScriptingInterface::setPerFrameTimeBudget(unsigned int numUsecs) {
+ DependencyManager::get()->setPerFrameTimeBudget(numUsecs);
+}
diff --git a/interface/src/raypick/PickScriptingInterface.h b/interface/src/raypick/PickScriptingInterface.h
index 98427e34ca..288d3008bb 100644
--- a/interface/src/raypick/PickScriptingInterface.h
+++ b/interface/src/raypick/PickScriptingInterface.h
@@ -185,6 +185,14 @@ public:
*/
Q_INVOKABLE bool isMouse(unsigned int uid);
+ Q_PROPERTY(unsigned int perFrameTimeBudget READ getPerFrameTimeBudget WRITE setPerFrameTimeBudget)
+ /**jsdoc
+ * The max number of usec to spend per frame updating Pick results.
+ * @typedef {number} Picks.perFrameTimeBudget
+ */
+ unsigned int getPerFrameTimeBudget() const;
+ void setPerFrameTimeBudget(unsigned int numUsecs);
+
public slots:
static constexpr unsigned int PICK_NOTHING() { return 0; }
static constexpr unsigned int PICK_ENTITIES() { return PickFilter::getBitMask(PickFilter::FlagBit::PICK_ENTITIES); }
@@ -202,4 +210,4 @@ public slots:
static constexpr unsigned int INTERSECTED_HUD() { return IntersectionType::HUD; }
};
-#endif // hifi_PickScriptingInterface_h
\ No newline at end of file
+#endif // hifi_PickScriptingInterface_h
diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp
index 12b20566ed..e0a008b25e 100644
--- a/interface/src/scripting/WindowScriptingInterface.cpp
+++ b/interface/src/scripting/WindowScriptingInterface.cpp
@@ -259,7 +259,6 @@ void WindowScriptingInterface::browseAsync(const QString& title, const QString&
setPreviousBrowseLocation(QFileInfo(result).absolutePath());
}
emit browseChanged(result);
- emit openFileChanged(result); // Deprecated signal; to be removed in due course.
});
}
diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h
index 67fdea0bc5..5a30f44856 100644
--- a/interface/src/scripting/WindowScriptingInterface.h
+++ b/interface/src/scripting/WindowScriptingInterface.h
@@ -179,7 +179,6 @@ public slots:
* Prompt the user to choose a file. Displays a non-modal dialog that navigates the directory tree. A
* {@link Window.browseChanged|browseChanged} signal is emitted when a file is chosen; no signal is emitted if the user
* cancels the dialog.
- * @deprecated A deprecated {@link Window.openFileChanged|openFileChanged} signal is also emitted when a file is chosen.
* @function Window.browseAsync
* @param {string} title="" - The title to display at the top of the dialog.
* @param {string} directory="" - The initial directory to start browsing at.
@@ -660,15 +659,6 @@ signals:
*/
void browseChanged(QString filename);
- /**jsdoc
- * Triggered when the user chooses a file in a {@link Window.browseAsync|browseAsync} dialog.
- * @function Window.openFileChanged
- * @deprecated This signal is being replaced with {@link Window.browseChanged|browseChanged} and will be removed.
- * @param {string} filename - The path and name of the file the user chose in the dialog.
- * @returns {Signal}
- */
- void openFileChanged(QString filename);
-
/**jsdoc
* Triggered when the user OKs a {@link Window.promptAsync|promptAsync} dialog.
* @function Window.promptTextChanged
diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h
index 053202f583..3bfbdb49ce 100644
--- a/libraries/audio-client/src/AudioClient.h
+++ b/libraries/audio-client/src/AudioClient.h
@@ -193,6 +193,7 @@ public slots:
bool isMuted() { return _muted; }
virtual bool setIsStereoInput(bool stereo) override;
+ virtual bool isStereoInput() override { return _isStereoInput; }
void setNoiseReduction(bool isNoiseGateEnabled);
bool isNoiseReductionEnabled() const { return _isNoiseGateEnabled; }
diff --git a/libraries/audio/src/AbstractAudioInterface.h b/libraries/audio/src/AbstractAudioInterface.h
index ba1e733f13..30cbceeb0e 100644
--- a/libraries/audio/src/AbstractAudioInterface.h
+++ b/libraries/audio/src/AbstractAudioInterface.h
@@ -28,7 +28,7 @@ class AbstractAudioInterface : public QObject {
Q_OBJECT
public:
AbstractAudioInterface(QObject* parent = 0) : QObject(parent) {};
-
+
static void emitAudioPacket(const void* audioData, size_t bytes, quint16& sequenceNumber, bool isStereo,
const Transform& transform, glm::vec3 avatarBoundingBoxCorner, glm::vec3 avatarBoundingBoxScale,
PacketType packetType, QString codecName = QString(""));
@@ -40,8 +40,10 @@ public:
public slots:
virtual bool shouldLoopbackInjectors() { return false; }
-
+
virtual bool setIsStereoInput(bool stereo) = 0;
+
+ virtual bool isStereoInput() = 0;
};
Q_DECLARE_METATYPE(AbstractAudioInterface*)
diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp
index eb42e9af22..c4fa71a488 100644
--- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp
+++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp
@@ -286,7 +286,7 @@ bool RenderableModelEntityItem::supportsDetailedRayIntersection() const {
}
bool RenderableModelEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face,
+ OctreeElementPointer& element, float& distance, BoxFace& face,
glm::vec3& surfaceNormal, QVariantMap& extraInfo, bool precisionPicking) const {
auto model = getModel();
if (!model) {
diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h
index 5d7d84b7bc..68bc70c8a9 100644
--- a/libraries/entities-renderer/src/RenderableModelEntityItem.h
+++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h
@@ -68,7 +68,7 @@ public:
virtual bool supportsDetailedRayIntersection() const override;
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const override;
diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp
index 2b1de8d11b..0211daff1e 100644
--- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp
+++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp
@@ -565,7 +565,7 @@ public:
#endif
bool RenderablePolyVoxEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element,
+ OctreeElementPointer& element,
float& distance, BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const
{
diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h
index 0a00d1cb73..70c87dca6f 100644
--- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h
+++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h
@@ -53,7 +53,7 @@ public:
virtual bool supportsDetailedRayIntersection() const override { return true; }
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const override;
diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp
index 89a67a32d4..2f1cbfc189 100644
--- a/libraries/entities/src/EntityItem.cpp
+++ b/libraries/entities/src/EntityItem.cpp
@@ -2989,4 +2989,4 @@ std::unordered_map EntityItem::getMaterial
toReturn = _materials;
}
return toReturn;
-}
\ No newline at end of file
+}
diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h
index c7afad5d1b..fccb50e5c2 100644
--- a/libraries/entities/src/EntityItem.h
+++ b/libraries/entities/src/EntityItem.h
@@ -159,7 +159,7 @@ public:
virtual bool supportsDetailedRayIntersection() const { return false; }
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const { return true; }
diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp
index 9e32bc3346..1ae55bc333 100644
--- a/libraries/entities/src/EntityTreeElement.cpp
+++ b/libraries/entities/src/EntityTreeElement.cpp
@@ -594,17 +594,15 @@ EntityItemID EntityTreeElement::findRayIntersection(const glm::vec3& origin, con
const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly,
QVariantMap& extraInfo, bool precisionPicking) {
- keepSearching = true; // assume that we will continue searching after this.
-
EntityItemID result;
float distanceToElementCube = std::numeric_limits::max();
- float distanceToElementDetails = distance;
BoxFace localFace;
glm::vec3 localSurfaceNormal;
- QVariantMap localExtraInfo;
- // if the ray doesn't intersect with our cube, we can stop searching!
- if (!_cube.findRayIntersection(origin, direction, distanceToElementCube, localFace, localSurfaceNormal)) {
+ // if the ray doesn't intersect with our cube OR the distance to element is less than current best distance
+ // we can stop searching!
+ bool hit = _cube.findRayIntersection(origin, direction, distanceToElementCube, localFace, localSurfaceNormal);
+ if (!hit || (!_cube.contains(origin) && distanceToElementCube > distance)) {
keepSearching = false; // no point in continuing to search
return result; // we did not intersect
}
@@ -616,52 +614,46 @@ EntityItemID EntityTreeElement::findRayIntersection(const glm::vec3& origin, con
// if the distance to the element cube is not less than the current best distance, then it's not possible
// for any details inside the cube to be closer so we don't need to consider them.
- if (_cube.contains(origin) || distanceToElementCube < distance) {
-
- EntityItemID entityID = findDetailedRayIntersection(origin, direction, keepSearching, element, distanceToElementDetails,
- face, localSurfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly,
- localExtraInfo, precisionPicking, distanceToElementCube);
- if (!entityID.isNull()) {
- if (distanceToElementDetails < distance) {
- distance = distanceToElementDetails;
- face = localFace;
- surfaceNormal = localSurfaceNormal;
- extraInfo = localExtraInfo;
- result = entityID;
- }
- }
+ QVariantMap localExtraInfo;
+ float distanceToElementDetails = distance;
+ EntityItemID entityID = findDetailedRayIntersection(origin, direction, element, distanceToElementDetails,
+ face, localSurfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly,
+ localExtraInfo, precisionPicking);
+ if (!entityID.isNull() && distanceToElementDetails < distance) {
+ distance = distanceToElementDetails;
+ face = localFace;
+ surfaceNormal = localSurfaceNormal;
+ extraInfo = localExtraInfo;
+ result = entityID;
}
return result;
}
-EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching,
+EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal,
const QVector& entityIdsToInclude, const QVector& entityIDsToDiscard,
- bool visibleOnly, bool collidableOnly, QVariantMap& extraInfo, bool precisionPicking, float distanceToElementCube) {
+ bool visibleOnly, bool collidableOnly, QVariantMap& extraInfo, bool precisionPicking) {
// only called if we do intersect our bounding cube, but find if we actually intersect with entities...
int entityNumber = 0;
EntityItemID entityID;
forEachEntity([&](EntityItemPointer entity) {
- if ( (visibleOnly && !entity->isVisible()) || (collidableOnly && (entity->getCollisionless() || entity->getShapeType() == SHAPE_TYPE_NONE))
- || (entityIdsToInclude.size() > 0 && !entityIdsToInclude.contains(entity->getID()))
- || (entityIDsToDiscard.size() > 0 && entityIDsToDiscard.contains(entity->getID())) ) {
- return;
- }
-
+ // use simple line-sphere for broadphase check
+ // (this is faster and more likely to cull results than the filter check below so we do it first)
bool success;
AABox entityBox = entity->getAABox(success);
if (!success) {
return;
}
+ if (!entityBox.rayHitsBoundingSphere(origin, direction)) {
+ return;
+ }
- float localDistance;
- BoxFace localFace;
- glm::vec3 localSurfaceNormal;
- QVariantMap localExtraInfo;
-
- // if the ray doesn't intersect with our cube, we can stop searching!
- if (!entityBox.findRayIntersection(origin, direction, localDistance, localFace, localSurfaceNormal)) {
+ // check RayPick filter settings
+ if ((visibleOnly && !entity->isVisible())
+ || (collidableOnly && (entity->getCollisionless() || entity->getShapeType() == SHAPE_TYPE_NONE))
+ || (entityIdsToInclude.size() > 0 && !entityIdsToInclude.contains(entity->getID()))
+ || (entityIDsToDiscard.size() > 0 && entityIDsToDiscard.contains(entity->getID())) ) {
return;
}
@@ -682,14 +674,17 @@ EntityItemID EntityTreeElement::findDetailedRayIntersection(const glm::vec3& ori
// we can use the AABox's ray intersection by mapping our origin and direction into the entity frame
// and testing intersection there.
+ float localDistance;
+ BoxFace localFace;
+ glm::vec3 localSurfaceNormal;
if (entityFrameBox.findRayIntersection(entityFrameOrigin, entityFrameDirection, localDistance,
localFace, localSurfaceNormal)) {
if (entityFrameBox.contains(entityFrameOrigin) || localDistance < distance) {
// now ask the entity if we actually intersect
if (entity->supportsDetailedRayIntersection()) {
- if (entity->findDetailedRayIntersection(origin, direction, keepSearching, element, localDistance,
- localFace, localSurfaceNormal, localExtraInfo, precisionPicking)) {
-
+ QVariantMap localExtraInfo;
+ if (entity->findDetailedRayIntersection(origin, direction, element, localDistance,
+ localFace, localSurfaceNormal, localExtraInfo, precisionPicking)) {
if (localDistance < distance) {
distance = localDistance;
face = localFace;
diff --git a/libraries/entities/src/EntityTreeElement.h b/libraries/entities/src/EntityTreeElement.h
index 2313bde0c4..b219d64d9d 100644
--- a/libraries/entities/src/EntityTreeElement.h
+++ b/libraries/entities/src/EntityTreeElement.h
@@ -152,10 +152,10 @@ public:
const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly,
QVariantMap& extraInfo, bool precisionPicking = false);
virtual EntityItemID findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude,
const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly,
- QVariantMap& extraInfo, bool precisionPicking, float distanceToElementCube);
+ QVariantMap& extraInfo, bool precisionPicking);
virtual bool findSpherePenetration(const glm::vec3& center, float radius,
glm::vec3& penetration, void** penetratedObject) const override;
diff --git a/libraries/entities/src/LightEntityItem.cpp b/libraries/entities/src/LightEntityItem.cpp
index 85edefa413..3f7fc5f799 100644
--- a/libraries/entities/src/LightEntityItem.cpp
+++ b/libraries/entities/src/LightEntityItem.cpp
@@ -298,7 +298,7 @@ void LightEntityItem::resetLightPropertiesChanged() {
}
bool LightEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const {
diff --git a/libraries/entities/src/LightEntityItem.h b/libraries/entities/src/LightEntityItem.h
index 3be1d48aa5..4d0bde3718 100644
--- a/libraries/entities/src/LightEntityItem.h
+++ b/libraries/entities/src/LightEntityItem.h
@@ -86,7 +86,7 @@ public:
virtual bool supportsDetailedRayIntersection() const override { return true; }
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const override;
diff --git a/libraries/entities/src/LineEntityItem.h b/libraries/entities/src/LineEntityItem.h
index 9f16807084..375453e0e9 100644
--- a/libraries/entities/src/LineEntityItem.h
+++ b/libraries/entities/src/LineEntityItem.h
@@ -61,7 +61,7 @@ class LineEntityItem : public EntityItem {
// never have a ray intersection pick a LineEntityItem.
virtual bool supportsDetailedRayIntersection() const override { return true; }
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo,
bool precisionPicking) const override { return false; }
diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h
index 8af2b26216..2dc8befe97 100644
--- a/libraries/entities/src/PolyLineEntityItem.h
+++ b/libraries/entities/src/PolyLineEntityItem.h
@@ -94,7 +94,7 @@ class PolyLineEntityItem : public EntityItem {
// never have a ray intersection pick a PolyLineEntityItem.
virtual bool supportsDetailedRayIntersection() const override { return true; }
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const override { return false; }
diff --git a/libraries/entities/src/PolyVoxEntityItem.h b/libraries/entities/src/PolyVoxEntityItem.h
index 47d2a4b4e1..90982fe448 100644
--- a/libraries/entities/src/PolyVoxEntityItem.h
+++ b/libraries/entities/src/PolyVoxEntityItem.h
@@ -45,7 +45,7 @@ class PolyVoxEntityItem : public EntityItem {
// never have a ray intersection pick a PolyVoxEntityItem.
virtual bool supportsDetailedRayIntersection() const override { return true; }
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const override { return false; }
diff --git a/libraries/entities/src/ShapeEntityItem.cpp b/libraries/entities/src/ShapeEntityItem.cpp
index 2425208a87..db3d6798be 100644
--- a/libraries/entities/src/ShapeEntityItem.cpp
+++ b/libraries/entities/src/ShapeEntityItem.cpp
@@ -228,7 +228,7 @@ bool ShapeEntityItem::supportsDetailedRayIntersection() const {
}
bool ShapeEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element,
+ OctreeElementPointer& element,
float& distance, BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const {
// determine the ray in the frame of the entity transformed from a unit sphere
diff --git a/libraries/entities/src/ShapeEntityItem.h b/libraries/entities/src/ShapeEntityItem.h
index 7ad1b3c1c2..46d696f979 100644
--- a/libraries/entities/src/ShapeEntityItem.h
+++ b/libraries/entities/src/ShapeEntityItem.h
@@ -92,7 +92,7 @@ public:
bool supportsDetailedRayIntersection() const override;
bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const override;
diff --git a/libraries/entities/src/TextEntityItem.cpp b/libraries/entities/src/TextEntityItem.cpp
index 7b1089e6ed..7030a95562 100644
--- a/libraries/entities/src/TextEntityItem.cpp
+++ b/libraries/entities/src/TextEntityItem.cpp
@@ -129,7 +129,7 @@ void TextEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits
}
bool TextEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const {
glm::vec3 dimensions = getScaledDimensions();
diff --git a/libraries/entities/src/TextEntityItem.h b/libraries/entities/src/TextEntityItem.h
index 3ab743ecfd..06b377ee14 100644
--- a/libraries/entities/src/TextEntityItem.h
+++ b/libraries/entities/src/TextEntityItem.h
@@ -48,7 +48,7 @@ public:
virtual bool supportsDetailedRayIntersection() const override { return true; }
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const override;
diff --git a/libraries/entities/src/WebEntityItem.cpp b/libraries/entities/src/WebEntityItem.cpp
index 91e7bca063..548bca3225 100644
--- a/libraries/entities/src/WebEntityItem.cpp
+++ b/libraries/entities/src/WebEntityItem.cpp
@@ -106,7 +106,7 @@ void WebEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitst
}
bool WebEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const {
glm::vec3 dimensions = getScaledDimensions();
diff --git a/libraries/entities/src/WebEntityItem.h b/libraries/entities/src/WebEntityItem.h
index 7d8f37cd83..dab7cd5e22 100644
--- a/libraries/entities/src/WebEntityItem.h
+++ b/libraries/entities/src/WebEntityItem.h
@@ -47,7 +47,7 @@ public:
virtual bool supportsDetailedRayIntersection() const override { return true; }
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const override;
diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp
index 6083e5b8de..4ae020f966 100644
--- a/libraries/entities/src/ZoneEntityItem.cpp
+++ b/libraries/entities/src/ZoneEntityItem.cpp
@@ -296,7 +296,7 @@ void ZoneEntityItem::setCompoundShapeURL(const QString& url) {
}
bool ZoneEntityItem::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const {
diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h
index 95b6248fde..2c6b01fc69 100644
--- a/libraries/entities/src/ZoneEntityItem.h
+++ b/libraries/entities/src/ZoneEntityItem.h
@@ -105,7 +105,7 @@ public:
virtual bool supportsDetailedRayIntersection() const override { return true; }
virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
- bool& keepSearching, OctreeElementPointer& element, float& distance,
+ OctreeElementPointer& element, float& distance,
BoxFace& face, glm::vec3& surfaceNormal,
QVariantMap& extraInfo, bool precisionPicking) const override;
diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp
index a8eec66067..d0f175d3c2 100644
--- a/libraries/networking/src/AddressManager.cpp
+++ b/libraries/networking/src/AddressManager.cpp
@@ -46,10 +46,6 @@ AddressManager::AddressManager() :
}
-QString AddressManager::protocolVersion() {
- return protocolVersionsSignatureBase64();
-}
-
bool AddressManager::isConnected() {
return DependencyManager::get()->getDomainHandler().isConnected();
}
diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h
index 6c9f06d2dd..1b550df693 100644
--- a/libraries/networking/src/AddressManager.h
+++ b/libraries/networking/src/AddressManager.h
@@ -71,15 +71,6 @@ class AddressManager : public QObject, public Dependency {
Q_PROPERTY(QString domainID READ getDomainID)
Q_PROPERTY(QString domainId READ getDomainID)
public:
-
- /**jsdoc
- * Get Interface's protocol version.
- * @function location.protocolVersion
- * @returns {string} A string uniquely identifying the version of the metaverse protocol that Interface is using.
- * @deprecated This function is deprecated and will be removed. Use {@link Window.protocolSignature} instead.
- */
- Q_INVOKABLE QString protocolVersion();
-
using PositionGetter = std::function;
using OrientationGetter = std::function;
diff --git a/libraries/pointers/src/PickCacheOptimizer.h b/libraries/pointers/src/PickCacheOptimizer.h
index 10c9d6cf84..49a039935c 100644
--- a/libraries/pointers/src/PickCacheOptimizer.h
+++ b/libraries/pointers/src/PickCacheOptimizer.h
@@ -37,7 +37,7 @@ template
class PickCacheOptimizer {
public:
- void update(std::unordered_map>& picks, bool shouldPickHUD);
+ void update(std::unordered_map>& picks, uint32_t& nextToUpdate, uint64_t expiry, bool shouldPickHUD);
protected:
typedef std::unordered_map> PickCache;
@@ -67,66 +67,84 @@ void PickCacheOptimizer::cacheResult(const bool intersects, const PickResultP
}
template
-void PickCacheOptimizer::update(std::unordered_map>& picks, bool shouldPickHUD) {
+void PickCacheOptimizer::update(std::unordered_map>& picks,
+ uint32_t& nextToUpdate, uint64_t expiry, bool shouldPickHUD) {
PickCache results;
- for (const auto& pickPair : picks) {
- std::shared_ptr> pick = std::static_pointer_cast>(pickPair.second);
-
+ const uint32_t INVALID_PICK_ID = 0;
+ auto itr = picks.begin();
+ if (nextToUpdate != INVALID_PICK_ID) {
+ itr = picks.find(nextToUpdate);
+ if (itr == picks.end()) {
+ itr = picks.begin();
+ }
+ }
+ uint32_t numUpdates = 0;
+ while(numUpdates < picks.size()) {
+ std::shared_ptr> pick = std::static_pointer_cast>(itr->second);
T mathematicalPick = pick->getMathematicalPick();
PickResultPointer res = pick->getDefaultResult(mathematicalPick.toVariantMap());
if (!pick->isEnabled() || pick->getFilter().doesPickNothing() || pick->getMaxDistance() < 0.0f || !mathematicalPick) {
pick->setPickResult(res);
- continue;
- }
-
- if (pick->getFilter().doesPickEntities()) {
- PickCacheKey entityKey = { pick->getFilter().getEntityFlags(), pick->getIncludeItems(), pick->getIgnoreItems() };
- if (!checkAndCompareCachedResults(mathematicalPick, results, res, entityKey)) {
- PickResultPointer entityRes = pick->getEntityIntersection(mathematicalPick);
- if (entityRes) {
- cacheResult(entityRes->doesIntersect(), entityRes, entityKey, res, mathematicalPick, results, pick);
- }
- }
- }
-
- if (pick->getFilter().doesPickOverlays()) {
- PickCacheKey overlayKey = { pick->getFilter().getOverlayFlags(), pick->getIncludeItems(), pick->getIgnoreItems() };
- if (!checkAndCompareCachedResults(mathematicalPick, results, res, overlayKey)) {
- PickResultPointer overlayRes = pick->getOverlayIntersection(mathematicalPick);
- if (overlayRes) {
- cacheResult(overlayRes->doesIntersect(), overlayRes, overlayKey, res, mathematicalPick, results, pick);
- }
- }
- }
-
- if (pick->getFilter().doesPickAvatars()) {
- PickCacheKey avatarKey = { pick->getFilter().getAvatarFlags(), pick->getIncludeItems(), pick->getIgnoreItems() };
- if (!checkAndCompareCachedResults(mathematicalPick, results, res, avatarKey)) {
- PickResultPointer avatarRes = pick->getAvatarIntersection(mathematicalPick);
- if (avatarRes) {
- cacheResult(avatarRes->doesIntersect(), avatarRes, avatarKey, res, mathematicalPick, results, pick);
- }
- }
- }
-
- // Can't intersect with HUD in desktop mode
- if (pick->getFilter().doesPickHUD() && shouldPickHUD) {
- PickCacheKey hudKey = { pick->getFilter().getHUDFlags(), QVector(), QVector() };
- if (!checkAndCompareCachedResults(mathematicalPick, results, res, hudKey)) {
- PickResultPointer hudRes = pick->getHUDIntersection(mathematicalPick);
- if (hudRes) {
- cacheResult(true, hudRes, hudKey, res, mathematicalPick, results, pick);
- }
- }
- }
-
- if (pick->getMaxDistance() == 0.0f || (pick->getMaxDistance() > 0.0f && res->checkOrFilterAgainstMaxDistance(pick->getMaxDistance()))) {
- pick->setPickResult(res);
} else {
- pick->setPickResult(pick->getDefaultResult(mathematicalPick.toVariantMap()));
+ if (pick->getFilter().doesPickEntities()) {
+ PickCacheKey entityKey = { pick->getFilter().getEntityFlags(), pick->getIncludeItems(), pick->getIgnoreItems() };
+ if (!checkAndCompareCachedResults(mathematicalPick, results, res, entityKey)) {
+ PickResultPointer entityRes = pick->getEntityIntersection(mathematicalPick);
+ if (entityRes) {
+ cacheResult(entityRes->doesIntersect(), entityRes, entityKey, res, mathematicalPick, results, pick);
+ }
+ }
+ }
+
+ if (pick->getFilter().doesPickOverlays()) {
+ PickCacheKey overlayKey = { pick->getFilter().getOverlayFlags(), pick->getIncludeItems(), pick->getIgnoreItems() };
+ if (!checkAndCompareCachedResults(mathematicalPick, results, res, overlayKey)) {
+ PickResultPointer overlayRes = pick->getOverlayIntersection(mathematicalPick);
+ if (overlayRes) {
+ cacheResult(overlayRes->doesIntersect(), overlayRes, overlayKey, res, mathematicalPick, results, pick);
+ }
+ }
+ }
+
+ if (pick->getFilter().doesPickAvatars()) {
+ PickCacheKey avatarKey = { pick->getFilter().getAvatarFlags(), pick->getIncludeItems(), pick->getIgnoreItems() };
+ if (!checkAndCompareCachedResults(mathematicalPick, results, res, avatarKey)) {
+ PickResultPointer avatarRes = pick->getAvatarIntersection(mathematicalPick);
+ if (avatarRes) {
+ cacheResult(avatarRes->doesIntersect(), avatarRes, avatarKey, res, mathematicalPick, results, pick);
+ }
+ }
+ }
+
+ // Can't intersect with HUD in desktop mode
+ if (pick->getFilter().doesPickHUD() && shouldPickHUD) {
+ PickCacheKey hudKey = { pick->getFilter().getHUDFlags(), QVector(), QVector() };
+ if (!checkAndCompareCachedResults(mathematicalPick, results, res, hudKey)) {
+ PickResultPointer hudRes = pick->getHUDIntersection(mathematicalPick);
+ if (hudRes) {
+ cacheResult(true, hudRes, hudKey, res, mathematicalPick, results, pick);
+ }
+ }
+ }
+
+ if (pick->getMaxDistance() == 0.0f || (pick->getMaxDistance() > 0.0f && res->checkOrFilterAgainstMaxDistance(pick->getMaxDistance()))) {
+ pick->setPickResult(res);
+ } else {
+ pick->setPickResult(pick->getDefaultResult(mathematicalPick.toVariantMap()));
+ }
+ }
+
+ ++itr;
+ if (itr == picks.end()) {
+ itr = picks.begin();
+ }
+ nextToUpdate = itr->first;
+ ++numUpdates;
+ if (usecTimestampNow() > expiry) {
+ break;
}
}
}
-#endif // hifi_PickCacheOptimizer_h
\ No newline at end of file
+#endif // hifi_PickCacheOptimizer_h
diff --git a/libraries/pointers/src/PickManager.cpp b/libraries/pointers/src/PickManager.cpp
index 92fec014da..ba8fa814f0 100644
--- a/libraries/pointers/src/PickManager.cpp
+++ b/libraries/pointers/src/PickManager.cpp
@@ -89,14 +89,17 @@ void PickManager::setIncludeItems(unsigned int uid, const QVector& includ
}
void PickManager::update() {
+ uint64_t expiry = usecTimestampNow() + _perFrameTimeBudget;
std::unordered_map>> cachedPicks;
withReadLock([&] {
cachedPicks = _picks;
});
bool shouldPickHUD = _shouldPickHUDOperator();
- _rayPickCacheOptimizer.update(cachedPicks[PickQuery::Ray], shouldPickHUD);
- _stylusPickCacheOptimizer.update(cachedPicks[PickQuery::Stylus], false);
+ // we pass the same expiry to both updates, but the stylus updates are relatively cheap
+ // and the rayPicks updae will ALWAYS update at least one ray even when there is no budget
+ _stylusPickCacheOptimizer.update(cachedPicks[PickQuery::Stylus], _nextPickToUpdate[PickQuery::Stylus], expiry, false);
+ _rayPickCacheOptimizer.update(cachedPicks[PickQuery::Ray], _nextPickToUpdate[PickQuery::Ray], expiry, shouldPickHUD);
}
bool PickManager::isLeftHand(unsigned int uid) {
@@ -121,4 +124,4 @@ bool PickManager::isMouse(unsigned int uid) {
return pick->isMouse();
}
return false;
-}
\ No newline at end of file
+}
diff --git a/libraries/pointers/src/PickManager.h b/libraries/pointers/src/PickManager.h
index 5b069879a8..3b466be2bc 100644
--- a/libraries/pointers/src/PickManager.h
+++ b/libraries/pointers/src/PickManager.h
@@ -14,6 +14,8 @@
#include "Pick.h"
#include "PickCacheOptimizer.h"
+#include
+
class PickManager : public Dependency, protected ReadWriteLockable {
SINGLETON_DEPENDENCY
@@ -48,17 +50,24 @@ public:
static const unsigned int INVALID_PICK_ID { 0 };
+ unsigned int getPerFrameTimeBudget() const { return _perFrameTimeBudget; }
+ void setPerFrameTimeBudget(unsigned int numUsecs) { _perFrameTimeBudget = numUsecs; }
+
protected:
std::function _shouldPickHUDOperator;
std::function _calculatePos2DFromHUDOperator;
std::shared_ptr findPick(unsigned int uid) const;
std::unordered_map>> _picks;
+ unsigned int _nextPickToUpdate[PickQuery::NUM_PICK_TYPES] { 0, 0 };
std::unordered_map _typeMap;
unsigned int _nextPickID { INVALID_PICK_ID + 1 };
PickCacheOptimizer _rayPickCacheOptimizer;
PickCacheOptimizer _stylusPickCacheOptimizer;
+
+ static const unsigned int DEFAULT_PER_FRAME_TIME_BUDGET = 2 * USECS_PER_MSEC;
+ unsigned int _perFrameTimeBudget { DEFAULT_PER_FRAME_TIME_BUDGET };
};
-#endif // hifi_PickManager_h
\ No newline at end of file
+#endif // hifi_PickManager_h
diff --git a/libraries/script-engine/src/AudioScriptingInterface.cpp b/libraries/script-engine/src/AudioScriptingInterface.cpp
index dd8d284c12..f248c20d41 100644
--- a/libraries/script-engine/src/AudioScriptingInterface.cpp
+++ b/libraries/script-engine/src/AudioScriptingInterface.cpp
@@ -67,3 +67,11 @@ bool AudioScriptingInterface::setStereoInput(bool stereo) {
}
return stereoInputChanged;
}
+
+bool AudioScriptingInterface::isStereoInput() {
+ bool stereoEnabled = false;
+ if (_localAudioInterface) {
+ stereoEnabled = _localAudioInterface->isStereoInput();
+ }
+ return stereoEnabled;
+}
diff --git a/libraries/script-engine/src/AudioScriptingInterface.h b/libraries/script-engine/src/AudioScriptingInterface.h
index d46430ccce..be2b4ebc8c 100644
--- a/libraries/script-engine/src/AudioScriptingInterface.h
+++ b/libraries/script-engine/src/AudioScriptingInterface.h
@@ -36,6 +36,7 @@ protected:
Q_INVOKABLE ScriptAudioInjector* playSystemSound(SharedSoundPointer sound, const QVector3D& position);
Q_INVOKABLE bool setStereoInput(bool stereo);
+ Q_INVOKABLE bool isStereoInput();
signals:
void mutedByMixer(); /// the client has been muted by the mixer
diff --git a/libraries/script-engine/src/FileScriptingInterface.cpp b/libraries/script-engine/src/FileScriptingInterface.cpp
index 1472e53045..3bf044fd8b 100644
--- a/libraries/script-engine/src/FileScriptingInterface.cpp
+++ b/libraries/script-engine/src/FileScriptingInterface.cpp
@@ -68,6 +68,10 @@ void FileScriptingInterface::runUnzip(QString path, QUrl url, bool autoAdd, bool
if (path.contains("vr.google.com/downloads")) {
isZip = true;
}
+ if (!hasModel(fileList)) {
+ isZip = false;
+ }
+
emit unzipResult(path, fileList, autoAdd, isZip, isBlocks);
}
@@ -107,6 +111,15 @@ bool FileScriptingInterface::isTempDir(QString tempDir) {
return (testContainer == tempContainer);
}
+bool FileScriptingInterface::hasModel(QStringList fileList) {
+ for (int i = 0; i < fileList.size(); i++) {
+ if (fileList.at(i).toLower().contains(".fbx") || fileList.at(i).toLower().contains(".obj")) {
+ return true;
+ }
+ }
+ return false;
+}
+
QString FileScriptingInterface::getTempDir() {
QTemporaryDir dir;
dir.setAutoRemove(false);
diff --git a/libraries/script-engine/src/FileScriptingInterface.h b/libraries/script-engine/src/FileScriptingInterface.h
index e4c27dbf7f..5cbe417130 100644
--- a/libraries/script-engine/src/FileScriptingInterface.h
+++ b/libraries/script-engine/src/FileScriptingInterface.h
@@ -32,6 +32,7 @@ signals:
private:
bool isTempDir(QString tempDir);
+ bool hasModel(QStringList fileList);
QStringList unzipFile(QString path, QString tempDir);
void recursiveFileScan(QFileInfo file, QString* dirName);
void downloadZip(QString path, const QString link);
diff --git a/libraries/shared/src/AABox.cpp b/libraries/shared/src/AABox.cpp
index cea0a83d52..cbf3c1b785 100644
--- a/libraries/shared/src/AABox.cpp
+++ b/libraries/shared/src/AABox.cpp
@@ -287,6 +287,15 @@ bool AABox::findRayIntersection(const glm::vec3& origin, const glm::vec3& direct
return false;
}
+bool AABox::rayHitsBoundingSphere(const glm::vec3& origin, const glm::vec3& direction) const {
+ glm::vec3 localCenter = calcCenter() - origin;
+ float distance = glm::dot(localCenter, direction);
+ const float ONE_OVER_TWO_SQUARED = 0.25f;
+ float radiusSquared = ONE_OVER_TWO_SQUARED * glm::length2(_scale);
+ return (glm::length2(localCenter) < radiusSquared
+ || (glm::abs(distance) > 0.0f && glm::distance2(distance * direction, localCenter) < radiusSquared));
+}
+
bool AABox::touchesSphere(const glm::vec3& center, float radius) const {
// Avro's algorithm from this paper: http://www.mrtc.mdh.se/projects/3Dgraphics/paperF.pdf
glm::vec3 e = glm::max(_corner - center, Vectors::ZERO) + glm::max(center - _corner - _scale, Vectors::ZERO);
diff --git a/libraries/shared/src/AABox.h b/libraries/shared/src/AABox.h
index 24485eaad6..cf79cf9d04 100644
--- a/libraries/shared/src/AABox.h
+++ b/libraries/shared/src/AABox.h
@@ -71,6 +71,7 @@ public:
bool expandedIntersectsSegment(const glm::vec3& start, const glm::vec3& end, float expansion) const;
bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance,
BoxFace& face, glm::vec3& surfaceNormal) const;
+ bool rayHitsBoundingSphere(const glm::vec3& origin, const glm::vec3& direction) const;
bool touchesSphere(const glm::vec3& center, float radius) const; // fast but may generate false positives
bool touchesAAEllipsoid(const glm::vec3& center, const glm::vec3& radials) const;
bool findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration) const;
diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp
index cb3c0d07b2..49927a325b 100644
--- a/libraries/shared/src/LogHandler.cpp
+++ b/libraries/shared/src/LogHandler.cpp
@@ -22,7 +22,6 @@
#include
#include
#include
-#include
#include
#include
@@ -92,12 +91,13 @@ void LogHandler::setShouldDisplayMilliseconds(bool shouldDisplayMilliseconds) {
void LogHandler::flushRepeatedMessages() {
QMutexLocker lock(&_mutex);
- QHash::iterator message = _repeatMessageCountHash.begin();
- while (message != _repeatMessageCountHash.end()) {
+ for(auto& message: _repeatedMessages) {
- if (message.value() > 0) {
+ if (message.messageCount > 1) {
QString repeatMessage = QString("%1 repeated log entries matching \"%2\" - Last entry: \"%3\"")
- .arg(message.value()).arg(message.key()).arg(_lastRepeatedMessage.value(message.key()));
+ .arg(message.messageCount - 1)
+ .arg(message.regexp.pattern())
+ .arg(message.lastMessage);
QMessageLogContext emptyContext;
lock.unlock();
@@ -105,8 +105,7 @@ void LogHandler::flushRepeatedMessages() {
lock.relock();
}
- _lastRepeatedMessage.remove(message.key());
- message = _repeatMessageCountHash.erase(message);
+ message.messageCount = 0;
}
}
@@ -118,36 +117,24 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont
if (type == LogDebug) {
// for debug messages, check if this matches any of our regexes for repeated log messages
- foreach(const QString& regexString, getInstance()._repeatedMessageRegexes) {
- QRegExp repeatRegex(regexString);
- if (repeatRegex.indexIn(message) != -1) {
-
- if (!_repeatMessageCountHash.contains(regexString)) {
- // we have a match but didn't have this yet - output the first one
- _repeatMessageCountHash[regexString] = 0;
-
- // break the foreach so we output the first match
+ for (auto& repeatRegex : _repeatedMessages) {
+ if (repeatRegex.regexp.indexIn(message) != -1) {
+ // If we've printed the first one then return out.
+ if (repeatRegex.messageCount++ == 0) {
break;
- } else {
- // we have a match - add 1 to the count of repeats for this message and set this as the last repeated message
- _repeatMessageCountHash[regexString] += 1;
- _lastRepeatedMessage[regexString] = message;
-
- // return out, we're not printing this one
- return QString();
}
+ repeatRegex.lastMessage = message;
+ return QString();
}
}
}
+
if (type == LogDebug) {
// see if this message is one we should only print once
- foreach(const QString& regexString, getInstance()._onlyOnceMessageRegexes) {
- QRegExp onlyOnceRegex(regexString);
- if (onlyOnceRegex.indexIn(message) != -1) {
- if (!_onlyOnceMessageCountHash.contains(message)) {
+ for (auto& onceOnly : _onetimeMessages) {
+ if (onceOnly.regexp.indexIn(message) != -1) {
+ if (onceOnly.messageCount++ == 0) {
// we have a match and haven't yet printed this message.
- _onlyOnceMessageCountHash[message] = 1;
- // break the foreach so we output the first match
break;
} else {
// We've already printed this message, don't print it again.
@@ -217,10 +204,16 @@ const QString& LogHandler::addRepeatedMessageRegex(const QString& regexString) {
QMetaObject::invokeMethod(this, "setupRepeatedMessageFlusher");
QMutexLocker lock(&_mutex);
- return *_repeatedMessageRegexes.insert(regexString);
+ RepeatedMessage repeatRecord;
+ repeatRecord.regexp = QRegExp(regexString);
+ _repeatedMessages.push_back(repeatRecord);
+ return regexString;
}
const QString& LogHandler::addOnlyOnceMessageRegex(const QString& regexString) {
QMutexLocker lock(&_mutex);
- return *_onlyOnceMessageRegexes.insert(regexString);
+ OnceOnlyMessage onetimeMessage;
+ onetimeMessage.regexp = QRegExp(regexString);
+ _onetimeMessages.push_back(onetimeMessage);
+ return regexString;
}
diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h
index ea961a8d4c..2e64f16c1e 100644
--- a/libraries/shared/src/LogHandler.h
+++ b/libraries/shared/src/LogHandler.h
@@ -13,11 +13,12 @@
#ifndef hifi_LogHandler_h
#define hifi_LogHandler_h
-#include
#include
-#include
#include
+#include
#include
+#include
+#include
const int VERBOSE_LOG_INTERVAL_SECONDS = 5;
@@ -66,12 +67,19 @@ private:
bool _shouldOutputProcessID { false };
bool _shouldOutputThreadID { false };
bool _shouldDisplayMilliseconds { false };
- QSet _repeatedMessageRegexes;
- QHash _repeatMessageCountHash;
- QHash _lastRepeatedMessage;
- QSet _onlyOnceMessageRegexes;
- QHash _onlyOnceMessageCountHash;
+ struct RepeatedMessage {
+ QRegExp regexp;
+ int messageCount { 0 };
+ QString lastMessage;
+ };
+ std::vector _repeatedMessages;
+
+ struct OnceOnlyMessage {
+ QRegExp regexp;
+ int messageCount { 0 };
+ };
+ std::vector _onetimeMessages;
static QMutex _mutex;
};
diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js
index a419e9d49c..fced5fc4e9 100644
--- a/scripts/system/libraries/entitySelectionTool.js
+++ b/scripts/system/libraries/entitySelectionTool.js
@@ -272,17 +272,19 @@ SelectionDisplay = (function() {
var STRETCH_SPHERE_OFFSET = 0.06;
var STRETCH_SPHERE_CAMERA_DISTANCE_MULTIPLE = 0.01;
var STRETCH_MINIMUM_DIMENSION = 0.001;
- var STRETCH_DIRECTION_ALL_CAMERA_DISTANCE_MULTIPLE = 2;
+ var STRETCH_ALL_MINIMUM_DIMENSION = 0.01;
+ var STRETCH_DIRECTION_ALL_CAMERA_DISTANCE_MULTIPLE = 6;
var STRETCH_PANEL_WIDTH = 0.01;
var SCALE_CUBE_OFFSET = 0.5;
var SCALE_CUBE_CAMERA_DISTANCE_MULTIPLE = 0.015;
- var SCALE_MINIMUM_DIMENSION = 0.02;
var CLONER_OFFSET = { x:0.9, y:-0.9, z:0.9 };
var CTRL_KEY_CODE = 16777249;
+ var AVATAR_COLLISIONS_OPTION = "Enable Avatar Collisions";
+
var TRANSLATE_DIRECTION = {
X : 0,
Y : 1,
@@ -336,6 +338,8 @@ SelectionDisplay = (function() {
var ctrlPressed = false;
+ var handleStretchCollisionOverride = false;
+
var handlePropertiesTranslateArrowCones = {
shape: "Cone",
solid: true,
@@ -458,12 +462,12 @@ SelectionDisplay = (function() {
borderSize: 1.4
};
var handleScaleLBNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, -y, -z)
- var handleScaleRBNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, -y, z)
- var handleScaleLBFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, -y, -z)
+ var handleScaleRBNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, -y, -z)
+ var handleScaleLBFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, -y, z)
var handleScaleRBFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, -y, z)
var handleScaleLTNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, y, -z)
- var handleScaleRTNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, y, z)
- var handleScaleLTFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, y, -z)
+ var handleScaleRTNCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, y, -z)
+ var handleScaleLTFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // (-x, y, z)
var handleScaleRTFCube = Overlays.addOverlay("cube", handlePropertiesScaleCubes); // ( x, y, z)
var handlePropertiesScaleEdge = {
@@ -597,6 +601,11 @@ SelectionDisplay = (function() {
var activeTool = null;
var handleTools = {};
+ that.shutdown = function() {
+ that.restoreAvatarCollisionsFromStretch();
+ }
+ Script.scriptEnding.connect(that.shutdown);
+
// We get mouseMoveEvents from the handControllers, via handControllerPointer.
// But we dont' get mousePressEvents.
that.triggerMapping = Controller.newMapping(Script.resolvePath('') + '-click');
@@ -1021,7 +1030,6 @@ SelectionDisplay = (function() {
return;
}
-
if (SelectionManager.hasSelection()) {
var position = SelectionManager.worldPosition;
var rotation = spaceMode === SPACE_LOCAL ? SelectionManager.localRotation : SelectionManager.worldRotation;
@@ -1147,14 +1155,14 @@ SelectionDisplay = (function() {
rotation: scaleCubeRotation,
dimensions: scaleCubeDimensions
});
- var scaleRBNCubePosition = { x:-scaleCubeOffsetX, y:-scaleCubeOffsetY, z:scaleCubeOffsetZ };
+ var scaleRBNCubePosition = { x:scaleCubeOffsetX, y:-scaleCubeOffsetY, z:-scaleCubeOffsetZ };
scaleRBNCubePosition = Vec3.sum(position, Vec3.multiplyQbyV(rotation, scaleRBNCubePosition));
Overlays.editOverlay(handleScaleRBNCube, {
position: scaleRBNCubePosition,
rotation: scaleCubeRotation,
dimensions: scaleCubeDimensions
});
- var scaleLBFCubePosition = { x:scaleCubeOffsetX, y:-scaleCubeOffsetY, z:-scaleCubeOffsetZ };
+ var scaleLBFCubePosition = { x:-scaleCubeOffsetX, y:-scaleCubeOffsetY, z:scaleCubeOffsetZ };
scaleLBFCubePosition = Vec3.sum(position, Vec3.multiplyQbyV(rotation, scaleLBFCubePosition));
Overlays.editOverlay(handleScaleLBFCube, {
position: scaleLBFCubePosition,
@@ -1175,14 +1183,14 @@ SelectionDisplay = (function() {
rotation: scaleCubeRotation,
dimensions: scaleCubeDimensions
});
- var scaleRTNCubePosition = { x:-scaleCubeOffsetX, y:scaleCubeOffsetY, z:scaleCubeOffsetZ };
+ var scaleRTNCubePosition = { x:scaleCubeOffsetX, y:scaleCubeOffsetY, z:-scaleCubeOffsetZ };
scaleRTNCubePosition = Vec3.sum(position, Vec3.multiplyQbyV(rotation, scaleRTNCubePosition));
Overlays.editOverlay(handleScaleRTNCube, {
position: scaleRTNCubePosition,
rotation: scaleCubeRotation,
dimensions: scaleCubeDimensions
});
- var scaleLTFCubePosition = { x:scaleCubeOffsetX, y:scaleCubeOffsetY, z:-scaleCubeOffsetZ };
+ var scaleLTFCubePosition = { x:-scaleCubeOffsetX, y:scaleCubeOffsetY, z:scaleCubeOffsetZ };
scaleLTFCubePosition = Vec3.sum(position, Vec3.multiplyQbyV(rotation, scaleLTFCubePosition));
Overlays.editOverlay(handleScaleLTFCube, {
position: scaleLTFCubePosition,
@@ -1236,9 +1244,11 @@ SelectionDisplay = (function() {
});
// UPDATE STRETCH HIGHLIGHT PANELS
- var scaleLTFCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleLTFCubePosition);
var scaleRBFCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRBFCubePosition);
- var stretchPanelXDimensions = Vec3.subtract(scaleLTFCubePositionRotated, scaleRBFCubePositionRotated);
+ var scaleRTFCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRTFCubePosition);
+ var scaleLTNCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleLTNCubePosition);
+ var scaleRTNCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRTNCubePosition);
+ var stretchPanelXDimensions = Vec3.subtract(scaleRTNCubePositionRotated, scaleRBFCubePositionRotated);
var tempY = Math.abs(stretchPanelXDimensions.y);
stretchPanelXDimensions.x = STRETCH_PANEL_WIDTH;
stretchPanelXDimensions.y = Math.abs(stretchPanelXDimensions.z);
@@ -1249,8 +1259,6 @@ SelectionDisplay = (function() {
rotation: rotationZ,
dimensions: stretchPanelXDimensions
});
- var scaleLTNCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleLTNCubePosition);
- var scaleRTFCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRTFCubePosition);
var stretchPanelYDimensions = Vec3.subtract(scaleLTNCubePositionRotated, scaleRTFCubePositionRotated);
var tempX = Math.abs(stretchPanelYDimensions.x);
stretchPanelYDimensions.x = Math.abs(stretchPanelYDimensions.z);
@@ -1262,9 +1270,7 @@ SelectionDisplay = (function() {
rotation: rotationY,
dimensions: stretchPanelYDimensions
});
- var scaleRTFCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRTFCubePosition);
- var scaleRBNCubePositionRotated = Vec3.multiplyQbyV(rotationInverse, scaleRBNCubePosition);
- var stretchPanelZDimensions = Vec3.subtract(scaleRTFCubePositionRotated, scaleRBNCubePositionRotated);
+ var stretchPanelZDimensions = Vec3.subtract(scaleLTNCubePositionRotated, scaleRBFCubePositionRotated);
var tempX = Math.abs(stretchPanelZDimensions.x);
stretchPanelZDimensions.x = Math.abs(stretchPanelZDimensions.y);
stretchPanelZDimensions.y = tempX;
@@ -1743,6 +1749,13 @@ SelectionDisplay = (function() {
};
};
+ that.restoreAvatarCollisionsFromStretch = function() {
+ if (handleStretchCollisionOverride) {
+ Menu.setIsOptionChecked(AVATAR_COLLISIONS_OPTION, true);
+ handleStretchCollisionOverride = false;
+ }
+ }
+
// TOOL DEFINITION: HANDLE STRETCH TOOL
function makeStretchTool(stretchMode, directionEnum, directionVec, pivot, offset, stretchPanel, scaleHandle) {
var directionFor3DStretch = directionVec;
@@ -1945,6 +1958,10 @@ SelectionDisplay = (function() {
if (scaleHandle != null) {
Overlays.editOverlay(scaleHandle, { color: COLOR_SCALE_CUBE_SELECTED });
}
+ if (Menu.isOptionChecked(AVATAR_COLLISIONS_OPTION)) {
+ Menu.setIsOptionChecked(AVATAR_COLLISIONS_OPTION, false);
+ handleStretchCollisionOverride = true;
+ }
};
var onEnd = function(event, reason) {
@@ -1954,11 +1971,12 @@ SelectionDisplay = (function() {
if (scaleHandle != null) {
Overlays.editOverlay(scaleHandle, { color: COLOR_SCALE_CUBE });
}
+ that.restoreAvatarCollisionsFromStretch();
pushCommandForSelections();
};
var onMove = function(event) {
- var proportional = (spaceMode === SPACE_WORLD) || event.isShifted || directionEnum === STRETCH_DIRECTION.ALL;
+ var proportional = (spaceMode === SPACE_WORLD) || directionEnum === STRETCH_DIRECTION.ALL;
var position, dimensions, rotation;
if (spaceMode === SPACE_LOCAL) {
@@ -1999,10 +2017,10 @@ SelectionDisplay = (function() {
vector = grid.snapToSpacing(vector);
var changeInDimensions = Vec3.multiply(NEGATE_VECTOR, vec3Mult(localSigns, vector));
- if (directionEnum === STRETCH_DIRECTION.ALL) {
- var toCameraDistance = getDistanceToCamera(position);
- var dimensionsMultiple = toCameraDistance * STRETCH_DIRECTION_ALL_CAMERA_DISTANCE_MULTIPLE;
- changeInDimensions = Vec3.multiply(changeInDimensions, dimensionsMultiple);
+ if (directionEnum === STRETCH_DIRECTION.ALL) {
+ var toCameraDistance = getDistanceToCamera(position);
+ var dimensionsMultiple = toCameraDistance * STRETCH_DIRECTION_ALL_CAMERA_DISTANCE_MULTIPLE;
+ changeInDimensions = Vec3.multiply(changeInDimensions, dimensionsMultiple);
}
var newDimensions;
@@ -2027,9 +2045,11 @@ SelectionDisplay = (function() {
newDimensions = Vec3.sum(initialDimensions, changeInDimensions);
}
- newDimensions.x = Math.max(newDimensions.x, STRETCH_MINIMUM_DIMENSION);
- newDimensions.y = Math.max(newDimensions.y, STRETCH_MINIMUM_DIMENSION);
- newDimensions.z = Math.max(newDimensions.z, STRETCH_MINIMUM_DIMENSION);
+ var minimumDimension = directionEnum === STRETCH_DIRECTION.ALL ? STRETCH_ALL_MINIMUM_DIMENSION :
+ STRETCH_MINIMUM_DIMENSION;
+ newDimensions.x = Math.max(newDimensions.x, minimumDimension);
+ newDimensions.y = Math.max(newDimensions.y, minimumDimension);
+ newDimensions.z = Math.max(newDimensions.z, minimumDimension);
var changeInPosition = Vec3.multiplyQbyV(rotation, vec3Mult(localDeltaPivot, changeInDimensions));
if (directionEnum === STRETCH_DIRECTION.ALL) {
@@ -2089,10 +2109,10 @@ SelectionDisplay = (function() {
directionVector = { x:1, y:1, z:1 };
selectedHandle = handleScaleLBNCube;
} else if (directionEnum === SCALE_DIRECTION.RBN) {
- directionVector = { x:1, y:1, z:-1 };
+ directionVector = { x:-1, y:1, z:1 };
selectedHandle = handleScaleRBNCube;
} else if (directionEnum === SCALE_DIRECTION.LBF) {
- directionVector = { x:-1, y:1, z:1 };
+ directionVector = { x:1, y:1, z:-1 };
selectedHandle = handleScaleLBFCube;
} else if (directionEnum === SCALE_DIRECTION.RBF) {
directionVector = { x:-1, y:1, z:-1 };
@@ -2101,10 +2121,10 @@ SelectionDisplay = (function() {
directionVector = { x:1, y:-1, z:1 };
selectedHandle = handleScaleLTNCube;
} else if (directionEnum === SCALE_DIRECTION.RTN) {
- directionVector = { x:1, y:-1, z:-1 };
+ directionVector = { x:-1, y:-1, z:1 };
selectedHandle = handleScaleRTNCube;
} else if (directionEnum === SCALE_DIRECTION.LTF) {
- directionVector = { x:-1, y:-1, z:1 };
+ directionVector = { x:1, y:-1, z:-1 };
selectedHandle = handleScaleLTFCube;
} else if (directionEnum === SCALE_DIRECTION.RTF) {
directionVector = { x:-1, y:-1, z:-1 };
diff --git a/scripts/system/particle_explorer/hifi-entity-ui.js b/scripts/system/particle_explorer/hifi-entity-ui.js
index 720aaee4d9..05b6ba6f75 100644
--- a/scripts/system/particle_explorer/hifi-entity-ui.js
+++ b/scripts/system/particle_explorer/hifi-entity-ui.js
@@ -439,8 +439,9 @@ HifiEntityUI.prototype = {
$colPickContainer.colpick({
- colorScheme: 'dark',
- layout: 'hex',
+ colorScheme: (group.layoutColorScheme === undefined ? 'dark' : group.layoutColorScheme),
+ layout: (group.layoutType === undefined ? 'hex' : group.layoutType),
+ submit: (group.useSubmitButton === undefined ? true : group.useSubmitButton),
color: {
r: domArray[0].value,
g: domArray[1].value,
diff --git a/scripts/system/particle_explorer/particleExplorer.html b/scripts/system/particle_explorer/particleExplorer.html
index 48cd4afa06..ab4c249cc3 100644
--- a/scripts/system/particle_explorer/particleExplorer.html
+++ b/scripts/system/particle_explorer/particleExplorer.html
@@ -27,6 +27,7 @@
+
diff --git a/scripts/system/particle_explorer/particleExplorer.js b/scripts/system/particle_explorer/particleExplorer.js
index 971798828f..3598f30ee0 100644
--- a/scripts/system/particle_explorer/particleExplorer.js
+++ b/scripts/system/particle_explorer/particleExplorer.js
@@ -236,7 +236,10 @@
red: 255,
green: 255,
blue: 255
- }
+ },
+ layoutType: "hex",
+ layoutColorScheme: "dark",
+ useSubmitButton: false
},
{
type: "Row"
@@ -249,7 +252,10 @@
red: 0,
green: 0,
blue: 0
- }
+ },
+ layoutType: "hex",
+ layoutColorScheme: "dark",
+ useSubmitButton: false
},
{
type: "Row"
@@ -262,7 +268,10 @@
red: 255,
green: 255,
blue: 255
- }
+ },
+ layoutType: "hex",
+ layoutColorScheme: "dark",
+ useSubmitButton: false
},
{
type: "Row"
@@ -275,7 +284,10 @@
red: 255,
green: 255,
blue: 255
- }
+ },
+ layoutType: "hex",
+ layoutColorScheme: "dark",
+ useSubmitButton: false
},
{
type: "Row"