From 99c217184b20833933273855cf2135a2ef753962 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Fri, 19 Jun 2015 14:46:39 -0700 Subject: [PATCH] Fixing the mic/camera buttons and the mirror UI buttons --- interface/resources/qml/AvatarInputs.qml | 177 ++++++++ interface/resources/qml/Stats.qml | 462 +++++++++++---------- interface/src/Application.cpp | 83 +--- interface/src/Application.h | 2 - interface/src/audio/AudioToolBox.cpp | 114 ----- interface/src/audio/AudioToolBox.h | 36 -- interface/src/devices/CameraToolBox.cpp | 121 ------ interface/src/devices/CameraToolBox.h | 45 -- interface/src/ui/ApplicationCompositor.cpp | 15 - interface/src/ui/ApplicationOverlay.cpp | 146 +------ interface/src/ui/ApplicationOverlay.h | 4 +- interface/src/ui/AvatarInputs.cpp | 133 ++++++ interface/src/ui/AvatarInputs.h | 59 +++ interface/src/ui/RearMirrorTools.cpp | 134 ------ interface/src/ui/RearMirrorTools.h | 56 --- interface/src/ui/Stats.cpp | 7 +- interface/src/ui/Stats.h | 5 +- 17 files changed, 626 insertions(+), 973 deletions(-) create mode 100644 interface/resources/qml/AvatarInputs.qml delete mode 100644 interface/src/audio/AudioToolBox.cpp delete mode 100644 interface/src/audio/AudioToolBox.h delete mode 100644 interface/src/devices/CameraToolBox.cpp delete mode 100644 interface/src/devices/CameraToolBox.h create mode 100644 interface/src/ui/AvatarInputs.cpp create mode 100644 interface/src/ui/AvatarInputs.h delete mode 100644 interface/src/ui/RearMirrorTools.cpp delete mode 100644 interface/src/ui/RearMirrorTools.h diff --git a/interface/resources/qml/AvatarInputs.qml b/interface/resources/qml/AvatarInputs.qml new file mode 100644 index 0000000000..7888ffd967 --- /dev/null +++ b/interface/resources/qml/AvatarInputs.qml @@ -0,0 +1,177 @@ +// +// Created by Bradley Austin Davis on 2015/06/19 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import Hifi 1.0 as Hifi +import QtQuick 2.4 +import QtQuick.Controls 1.3 +import QtGraphicalEffects 1.0 + +Hifi.AvatarInputs { + id: root + objectName: "AvatarInputs" + anchors.fill: parent + +// width: 800 +// height: 600 +// color: "black" + readonly property int iconPadding: 5 + readonly property int mirrorHeight: 215 + readonly property int mirrorWidth: 265 + readonly property int mirrorTopPad: iconPadding + readonly property int mirrorLeftPad: 10 + readonly property int iconSize: 24 + + Item { + id: mirror + width: root.mirrorWidth + height: root.mirrorVisible ? root.mirrorHeight : 0 + visible: root.mirrorVisible + anchors.left: parent.left + anchors.leftMargin: root.mirrorLeftPad + anchors.top: parent.top + anchors.topMargin: root.mirrorTopPad + clip: true + + MouseArea { + id: hover + anchors.fill: parent + hoverEnabled: true + propagateComposedEvents: true + } + + Image { + id: closeMirror + visible: hover.containsMouse + width: root.iconSize + height: root.iconSize + anchors.top: parent.top + anchors.topMargin: root.iconPadding + anchors.left: parent.left + anchors.leftMargin: root.iconPadding + source: "../images/close.svg" + MouseArea { + anchors.fill: parent + onClicked: { + root.closeMirror(); + } + } + } + + Image { + id: zoomIn + visible: hover.containsMouse + width: root.iconSize + height: root.iconSize + anchors.bottom: parent.bottom + anchors.bottomMargin: root.iconPadding + anchors.left: parent.left + anchors.leftMargin: root.iconPadding + source: root.mirrorZoomed ? "../images/minus.svg" : "../images/plus.svg" + MouseArea { + anchors.fill: parent + onClicked: { + root.toggleZoom(); + } + } + } + } + + Item { + width: root.mirrorWidth + height: 44 + + x: root.mirrorLeftPad + y: root.mirrorVisible ? root.mirrorTopPad + root.mirrorHeight : 5 + + + + Rectangle { + anchors.fill: parent + color: root.mirrorVisible ? (root.audioClipping ? "red" : "#696969") : "#00000000" + + Image { + id: faceMute + width: root.iconSize + height: root.iconSize + visible: root.cameraEnabled + anchors.left: parent.left + anchors.leftMargin: root.iconPadding + anchors.verticalCenter: parent.verticalCenter + source: root.cameraMuted ? "../images/face-mute.svg" : "../images/face.svg" + MouseArea { + anchors.fill: parent + onClicked: { + root.toggleCameraMute() + } + onDoubleClicked: { + root.resetSensors(); + } + } + } + + Image { + id: micMute + width: root.iconSize + height: root.iconSize + anchors.left: root.cameraEnabled ? faceMute.right : parent.left + anchors.leftMargin: root.iconPadding + anchors.verticalCenter: parent.verticalCenter + source: root.audioMuted ? "../images/mic-mute.svg" : "../images/mic.svg" + MouseArea { + anchors.fill: parent + onClicked: { + root.toggleAudioMute() + } + } + } + + Item { + id: audioMeter + anchors.verticalCenter: parent.verticalCenter + anchors.left: micMute.right + anchors.leftMargin: root.iconPadding + anchors.right: parent.right + anchors.rightMargin: root.iconPadding + height: 8 + Rectangle { + id: blueRect + color: "blue" + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + width: parent.width / 4 + } + Rectangle { + id: greenRect + color: "green" + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: blueRect.right + anchors.right: redRect.left + } + Rectangle { + id: redRect + color: "red" + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + width: parent.width / 5 + } + Rectangle { + z: 100 + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + width: (1.0 - root.audioLevel) * parent.width + color: "black" + } + } + } + } +} + diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index 8ddea6a355..128dbcd3a6 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -2,255 +2,257 @@ import Hifi 1.0 as Hifi import QtQuick 2.3 import QtQuick.Controls 1.2 -Hifi.Stats { - id: root - objectName: "Stats" - implicitHeight: row.height - implicitWidth: row.width - readonly property int sTATS_GENERAL_MIN_WIDTH: 165 - readonly property int sTATS_PING_MIN_WIDTH: 190 - readonly property int sTATS_GEO_MIN_WIDTH: 240 - readonly property int sTATS_OCTREE_MIN_WIDTH: 410 - readonly property int fontSize: 12 - readonly property string fontColor: "white" - readonly property string bgColor: "#99333333" +Item { + anchors.fill: parent + anchors.leftMargin: 300 + Hifi.Stats { + id: root + objectName: "Stats" + implicitHeight: row.height + implicitWidth: row.width - onParentChanged: { - root.x = parent.width - root.width; - } + anchors.horizontalCenter: parent.horizontalCenter + readonly property int sTATS_GENERAL_MIN_WIDTH: 165 + readonly property int sTATS_PING_MIN_WIDTH: 190 + readonly property int sTATS_GEO_MIN_WIDTH: 240 + readonly property int sTATS_OCTREE_MIN_WIDTH: 410 + readonly property int fontSize: 12 + readonly property string fontColor: "white" + readonly property string bgColor: "#99333333" - Row { - id: row - spacing: 8 - Rectangle { - width: generalCol.width + 8; - height: generalCol.height + 8; - color: root.bgColor; + Row { + id: row + spacing: 8 + Rectangle { + width: generalCol.width + 8; + height: generalCol.height + 8; + color: root.bgColor; - MouseArea { - anchors.fill: parent - onClicked: { root.expanded = !root.expanded; } - } - - Column { - id: generalCol - spacing: 4; x: 4; y: 4; - width: sTATS_GENERAL_MIN_WIDTH - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - text: "Servers: " + root.serverCount + MouseArea { + anchors.fill: parent + onClicked: { root.expanded = !root.expanded; } } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - text: "Avatars: " + root.avatarCount - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - text: "Framerate: " + root.framerate - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - text: "Packets In/Out: " + root.packetInCount + "/" + root.packetOutCount - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - text: "Mbps In/Out: " + root.mbpsIn.toFixed(2) + "/" + root.mbpsOut.toFixed(2) - } - } - } - - Rectangle { - width: pingCol.width + 8 - height: pingCol.height + 8 - color: root.bgColor; - visible: root.audioPing != -2 - MouseArea { - anchors.fill: parent - onClicked: { root.expanded = !root.expanded; } - } - Column { - id: pingCol - spacing: 4; x: 4; y: 4; - width: sTATS_PING_MIN_WIDTH - Text { - color: root.fontColor - font.pixelSize: root.fontSize - text: "Audio ping: " + root.audioPing - } - Text { - color: root.fontColor - font.pixelSize: root.fontSize - text: "Avatar ping: " + root.avatarPing - } - Text { - color: root.fontColor - font.pixelSize: root.fontSize - text: "Entities avg ping: " + root.entitiesPing - } - Text { - color: root.fontColor - font.pixelSize: root.fontSize - visible: root.expanded; - text: "Voxel max ping: " + 0 - } - } - } - Rectangle { - width: geoCol.width + 8 - height: geoCol.height + 8 - color: root.bgColor; - MouseArea { - anchors.fill: parent - onClicked: { root.expanded = !root.expanded; } + Column { + id: generalCol + spacing: 4; x: 4; y: 4; + width: sTATS_GENERAL_MIN_WIDTH + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + text: "Servers: " + root.serverCount + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + text: "Avatars: " + root.avatarCount + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + text: "Framerate: " + root.framerate + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + text: "Packets In/Out: " + root.packetInCount + "/" + root.packetOutCount + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + text: "Mbps In/Out: " + root.mbpsIn.toFixed(2) + "/" + root.mbpsOut.toFixed(2) + } + } } - Column { - id: geoCol - spacing: 4; x: 4; y: 4; - width: sTATS_GEO_MIN_WIDTH - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - text: "Position: " + root.position.x.toFixed(1) + ", " + - root.position.y.toFixed(1) + ", " + root.position.z.toFixed(1) + + Rectangle { + width: pingCol.width + 8 + height: pingCol.height + 8 + color: root.bgColor; + visible: root.audioPing != -2 + MouseArea { + anchors.fill: parent + onClicked: { root.expanded = !root.expanded; } } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - text: "Velocity: " + root.velocity.toFixed(1) + Column { + id: pingCol + spacing: 4; x: 4; y: 4; + width: sTATS_PING_MIN_WIDTH + Text { + color: root.fontColor + font.pixelSize: root.fontSize + text: "Audio ping: " + root.audioPing + } + Text { + color: root.fontColor + font.pixelSize: root.fontSize + text: "Avatar ping: " + root.avatarPing + } + Text { + color: root.fontColor + font.pixelSize: root.fontSize + text: "Entities avg ping: " + root.entitiesPing + } + Text { + color: root.fontColor + font.pixelSize: root.fontSize + visible: root.expanded; + text: "Voxel max ping: " + 0 + } } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - text: "Yaw: " + root.yaw.toFixed(1) + } + + Rectangle { + width: geoCol.width + 8 + height: geoCol.height + 8 + color: root.bgColor; + MouseArea { + anchors.fill: parent + onClicked: { root.expanded = !root.expanded; } } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: root.expanded; - text: "Avatar Mixer: " + root.avatarMixerKbps + " kbps, " + - root.avatarMixerPps + "pps"; + Column { + id: geoCol + spacing: 4; x: 4; y: 4; + width: sTATS_GEO_MIN_WIDTH + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + text: "Position: " + root.position.x.toFixed(1) + ", " + + root.position.y.toFixed(1) + ", " + root.position.z.toFixed(1) + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + text: "Velocity: " + root.velocity.toFixed(1) + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + text: "Yaw: " + root.yaw.toFixed(1) + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded; + text: "Avatar Mixer: " + root.avatarMixerKbps + " kbps, " + + root.avatarMixerPps + "pps"; + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded; + text: "Downloads: "; + } } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: root.expanded; - text: "Downloads: "; + } + Rectangle { + width: octreeCol.width + 8 + height: octreeCol.height + 8 + color: root.bgColor; + MouseArea { + anchors.fill: parent + onClicked: { root.expanded = !root.expanded; } + } + Column { + id: octreeCol + spacing: 4; x: 4; y: 4; + width: sTATS_OCTREE_MIN_WIDTH + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + text: "Triangles: " + root.triangles + + " / Quads: " + root.quads + " / Material Switches: " + root.materialSwitches + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded; + text: "\tMesh Parts Rendered Opaque: " + root.meshOpaque + + " / Translucent: " + root.meshTranslucent; + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded; + text: "\tOpaque considered: " + root.opaqueConsidered + + " / Out of view: " + root.opaqueOutOfView + " / Too small: " + root.opaqueTooSmall; + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: !root.expanded + text: "Octree Elements Server: " + root.serverElements + + " Local: " + root.localElements; + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded + text: "Octree Sending Mode: " + root.sendingMode; + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded + text: "Octree Packets to Process: " + root.packetStats; + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded + text: "Octree Elements - "; + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded + text: "\tServer: " + root.serverElements + + " Internal: " + root.serverInternal + + " Leaves: " + root.serverLeaves; + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded + text: "\tLocal: " + root.localElements + + " Internal: " + root.localInternal + + " Leaves: " + root.localLeaves; + } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded + text: "LOD: " + root.lodStatus; + } } } } + Rectangle { - width: octreeCol.width + 8 - height: octreeCol.height + 8 + y: 250 + visible: root.timingExpanded + width: perfText.width + 8 + height: perfText.height + 8 color: root.bgColor; - MouseArea { - anchors.fill: parent - onClicked: { root.expanded = !root.expanded; } + Text { + x: 4; y: 4 + id: perfText + color: root.fontColor + font.family: root.monospaceFont + font.pixelSize: 12 + text: "------------------------------------------ Function " + + "--------------------------------------- --msecs- -calls--\n" + + root.timingStats; } - Column { - id: octreeCol - spacing: 4; x: 4; y: 4; - width: sTATS_OCTREE_MIN_WIDTH - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - text: "Triangles: " + root.triangles + - " / Quads: " + root.quads + " / Material Switches: " + root.materialSwitches - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: root.expanded; - text: "\tMesh Parts Rendered Opaque: " + root.meshOpaque + - " / Translucent: " + root.meshTranslucent; - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: root.expanded; - text: "\tOpaque considered: " + root.opaqueConsidered + - " / Out of view: " + root.opaqueOutOfView + " / Too small: " + root.opaqueTooSmall; - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: !root.expanded - text: "Octree Elements Server: " + root.serverElements + - " Local: " + root.localElements; - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: root.expanded - text: "Octree Sending Mode: " + root.sendingMode; - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: root.expanded - text: "Octree Packets to Process: " + root.packetStats; - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: root.expanded - text: "Octree Elements - "; - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: root.expanded - text: "\tServer: " + root.serverElements + - " Internal: " + root.serverInternal + - " Leaves: " + root.serverLeaves; - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: root.expanded - text: "\tLocal: " + root.localElements + - " Internal: " + root.localInternal + - " Leaves: " + root.localLeaves; - } - Text { - color: root.fontColor; - font.pixelSize: root.fontSize - visible: root.expanded - text: "LOD: " + root.lodStatus; - } + } + + Connections { + target: root.parent + onWidthChanged: { + root.x = root.parent.width - root.width; } } } - Rectangle { - y: 250 - visible: root.timingExpanded - width: perfText.width + 8 - height: perfText.height + 8 - color: root.bgColor; - Text { - x: 4; y: 4 - id: perfText - color: root.fontColor - font.family: root.monospaceFont - font.pixelSize: 12 - text: "------------------------------------------ Function " + - "--------------------------------------- --msecs- -calls--\n" + - root.timingStats; - } - } - - Connections { - target: root.parent - onWidthChanged: { - root.x = root.parent.width - root.width; - } - } } - diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dc0eb3d23f..fafe339bd1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -66,6 +66,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -83,6 +86,7 @@ #include #include #include +#include #include #include #include @@ -107,11 +111,9 @@ #include "avatar/AvatarManager.h" -#include "audio/AudioToolBox.h" #include "audio/AudioIOStatsRenderer.h" #include "audio/AudioScope.h" -#include "devices/CameraToolBox.h" #include "devices/DdeFaceTracker.h" #include "devices/Faceshift.h" #include "devices/Leapmotion.h" @@ -121,12 +123,6 @@ #include "devices/OculusManager.h" #include "devices/TV3DManager.h" -#include "gpu/Batch.h" -#include "gpu/Context.h" -#include "gpu/GLBackend.h" - -#include "RenderDeferredTask.h" - #include "scripting/AccountScriptingInterface.h" #include "scripting/AudioDeviceScriptingInterface.h" #include "scripting/ClipboardScriptingInterface.h" @@ -142,6 +138,7 @@ #include "SpeechRecognizer.h" #endif +#include "ui/AvatarInputs.h" #include "ui/DataWebDialog.h" #include "ui/DialogsManager.h" #include "ui/LoginDialog.h" @@ -282,8 +279,6 @@ bool setupEssentials(int& argc, char** argv) { auto animationCache = DependencyManager::set(); auto ddeFaceTracker = DependencyManager::set(); auto modelBlender = DependencyManager::set(); - auto audioToolBox = DependencyManager::set(); - auto cameraToolBox = DependencyManager::set(); auto avatarManager = DependencyManager::set(); auto lodManager = DependencyManager::set(); auto jsConsole = DependencyManager::set(); @@ -861,23 +856,11 @@ void Application::initializeUi() { }); } -/* - { - PerformanceTimer perfTimer("renderOverlay"); - gpu::Context context(new gpu::GLBackend()); - RenderArgs renderArgs(&context, nullptr, getViewFrustum(), lodManager->getOctreeSizeScale(), - lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE, - RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); - _applicationOverlay.renderOverlay(&renderArgs); - } -*/ - void Application::paintGL() { PROFILE_RANGE(__FUNCTION__); _glWidget->makeCurrent(); auto lodManager = DependencyManager::get(); - gpu::Context context(new gpu::GLBackend()); RenderArgs renderArgs(&context, nullptr, getViewFrustum(), lodManager->getOctreeSizeScale(), lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE, @@ -895,6 +878,17 @@ void Application::paintGL() { PerformanceWarning warn(showWarnings, "Application::paintGL()"); resizeGL(); + { + PerformanceTimer perfTimer("renderOverlay"); + /* + gpu::Context context(new gpu::GLBackend()); + RenderArgs renderArgs(&context, nullptr, getViewFrustum(), lodManager->getOctreeSizeScale(), + lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE, + RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); + */ + _applicationOverlay.renderOverlay(&renderArgs); + } + glEnable(GL_LINE_SMOOTH); Menu::getInstance()->setIsOptionChecked("First Person", _myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN); @@ -977,9 +971,7 @@ void Application::paintGL() { glPopMatrix(); renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; - if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { - _rearMirrorTools->render(&renderArgs, true, _glWidget->mapFromGlobal(QCursor::pos())); - } else if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { + if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { renderRearViewMirror(&renderArgs, _mirrorViewRect); } @@ -1576,23 +1568,6 @@ void Application::mousePressEvent(QMouseEvent* event, unsigned int deviceID) { _mouseDragStarted = getTrueMouse(); _mousePressed = true; - if (mouseOnScreen()) { - if (DependencyManager::get()->mousePressEvent(getMouseX(), getMouseY())) { - // stop propagation - return; - } - - if (DependencyManager::get()->mousePressEvent(getMouseX(), getMouseY())) { - // stop propagation - return; - } - - if (_rearMirrorTools->mousePressEvent(getMouseX(), getMouseY())) { - // stop propagation - return; - } - } - // nobody handled this - make it an action event on the _window object HFActionEvent actionEvent(HFActionEvent::startType(), computePickRay(event->x(), event->y())); @@ -1609,17 +1584,6 @@ void Application::mouseDoublePressEvent(QMouseEvent* event, unsigned int deviceI if (_controllerScriptingInterface.isMouseCaptured()) { return; } - - if (activeWindow() == _window) { - if (event->button() == Qt::LeftButton) { - if (mouseOnScreen()) { - if (DependencyManager::get()->mouseDoublePressEvent(getMouseX(), getMouseY())) { - // stop propagation - return; - } - } - } - } } void Application::mouseReleaseEvent(QMouseEvent* event, unsigned int deviceID) { @@ -2223,13 +2187,6 @@ void Application::init() { _entityClipboardRenderer.setViewFrustum(getViewFrustum()); _entityClipboardRenderer.setTree(&_entityClipboard); - _rearMirrorTools = new RearMirrorTools(_mirrorViewRect); - connect(_rearMirrorTools, SIGNAL(closeView()), SLOT(closeMirrorView())); - connect(_rearMirrorTools, SIGNAL(restoreView()), SLOT(restoreMirrorView())); - connect(_rearMirrorTools, SIGNAL(shrinkView()), SLOT(shrinkMirrorView())); - connect(_rearMirrorTools, SIGNAL(resetView()), SLOT(resetSensors())); - - // initialize the GlowEffect with our widget bool glow = Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect); DependencyManager::get()->init(glow); @@ -3662,7 +3619,7 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi _mirrorCamera.setPosition(_myAvatar->getPosition() + _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, -1.0f) * BILLBOARD_DISTANCE * _myAvatar->getScale()); - } else if (RearMirrorTools::rearViewZoomLevel.get() == BODY) { + } else if (!AvatarInputs::getInstance()->mirrorZoomed()) { _mirrorCamera.setPosition(_myAvatar->getChestPosition() + _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_REARVIEW_BODY_DISTANCE * _myAvatar->getScale()); @@ -3712,10 +3669,6 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi displaySide(renderArgs, _mirrorCamera, true, billboard); glPopMatrix(); - if (!billboard) { - _rearMirrorTools->render(renderArgs, false, _glWidget->mapFromGlobal(QCursor::pos())); - } - // reset Viewport and projection matrix glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); glDisable(GL_SCISSOR_TEST); diff --git a/interface/src/Application.h b/interface/src/Application.h index 99834a13d2..b126757621 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -62,7 +62,6 @@ #include "ui/ModelsBrowser.h" #include "ui/NodeBounds.h" #include "ui/OctreeStatsDialog.h" -#include "ui/RearMirrorTools.h" #include "ui/SnapshotShareDialog.h" #include "ui/LodToolsDialog.h" #include "ui/LogDialog.h" @@ -566,7 +565,6 @@ private: Camera _myCamera; // My view onto the world Camera _mirrorCamera; // Cammera for mirror view QRect _mirrorViewRect; - RearMirrorTools* _rearMirrorTools; Setting::Handle _firstRun; Setting::Handle _previousScriptLocation; diff --git a/interface/src/audio/AudioToolBox.cpp b/interface/src/audio/AudioToolBox.cpp deleted file mode 100644 index 68328e151e..0000000000 --- a/interface/src/audio/AudioToolBox.cpp +++ /dev/null @@ -1,114 +0,0 @@ -// -// AudioToolBox.cpp -// interface/src/audio -// -// Created by Stephen Birarda on 2014-12-16. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "InterfaceConfig.h" - -#include -#include -#include -#include -#include - -#include "Application.h" -#include "AudioToolBox.h" - -// Mute icon configration -const int MUTE_ICON_SIZE = 24; - -AudioToolBox::AudioToolBox() : - _iconPulseTimeReference(usecTimestampNow()) -{ -} - -bool AudioToolBox::mousePressEvent(int x, int y) { - if (_iconBounds.contains(x, y)) { - DependencyManager::get()->toggleMute(); - return true; - } - return false; -} - -void AudioToolBox::render(int x, int y, int padding, bool boxed) { - glEnable(GL_TEXTURE_2D); - - if (!_micTexture) { - _micTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + "images/mic.svg"); - } - if (!_muteTexture) { - _muteTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + "images/mic-mute.svg"); - } - if (_boxTexture) { - _boxTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + "images/audio-box.svg"); - } - - auto audioIO = DependencyManager::get(); - - if (boxed) { - bool isClipping = ((audioIO->getTimeSinceLastClip() > 0.0f) && (audioIO->getTimeSinceLastClip() < 1.0f)); - const int BOX_LEFT_PADDING = 5; - const int BOX_TOP_PADDING = 10; - const int BOX_WIDTH = 266; - const int BOX_HEIGHT = 44; - - QRect boxBounds = QRect(x - BOX_LEFT_PADDING, y - BOX_TOP_PADDING, BOX_WIDTH, BOX_HEIGHT); - glm::vec4 quadColor; - - if (isClipping) { - quadColor = glm::vec4(1.0f, 0.0f, 0.0f, 1.0f); - } else { - quadColor = glm::vec4(0.41f, 0.41f, 0.41f, 1.0f); - } - glm::vec2 topLeft(boxBounds.left(), boxBounds.top()); - glm::vec2 bottomRight(boxBounds.right(), boxBounds.bottom()); - static const glm::vec2 texCoordTopLeft(1,1); - static const glm::vec2 texCoordBottomRight(0, 0); - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_boxTexture)); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor); - } - - float iconColor = 1.0f; - - _iconBounds = QRect(x + padding, y, MUTE_ICON_SIZE, MUTE_ICON_SIZE); - if (!audioIO->isMuted()) { - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_micTexture)); - iconColor = 1.0f; - } else { - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_muteTexture)); - - // Make muted icon pulsate - static const float PULSE_MIN = 0.4f; - static const float PULSE_MAX = 1.0f; - static const float PULSE_FREQUENCY = 1.0f; // in Hz - qint64 now = usecTimestampNow(); - if (now - _iconPulseTimeReference > (qint64)USECS_PER_SECOND) { - // Prevents t from getting too big, which would diminish glm::cos precision - _iconPulseTimeReference = now - ((now - _iconPulseTimeReference) % USECS_PER_SECOND); - } - float t = (float)(now - _iconPulseTimeReference) / (float)USECS_PER_SECOND; - float pulseFactor = (glm::cos(t * PULSE_FREQUENCY * 2.0f * PI) + 1.0f) / 2.0f; - iconColor = PULSE_MIN + (PULSE_MAX - PULSE_MIN) * pulseFactor; - } - - glm::vec4 quadColor(iconColor, iconColor, iconColor, 1.0f); - - glm::vec2 topLeft(_iconBounds.left(), _iconBounds.top()); - glm::vec2 bottomRight(_iconBounds.right(), _iconBounds.bottom()); - glm::vec2 texCoordTopLeft(1,1); - glm::vec2 texCoordBottomRight(0,0); - - if (_boxQuadID == GeometryCache::UNKNOWN_ID) { - _boxQuadID = DependencyManager::get()->allocateID(); - } - - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor, _boxQuadID); - glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_TEXTURE_2D); -} \ No newline at end of file diff --git a/interface/src/audio/AudioToolBox.h b/interface/src/audio/AudioToolBox.h deleted file mode 100644 index ea2ef9f96a..0000000000 --- a/interface/src/audio/AudioToolBox.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// AudioToolBox.h -// interface/src/audio -// -// Created by Stephen Birarda on 2014-12-16. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_AudioToolBox_h -#define hifi_AudioToolBox_h - -#include -#include -#include - -class AudioToolBox : public Dependency { - SINGLETON_DEPENDENCY -public: - void render(int x, int y, int padding, bool boxed); - - bool mousePressEvent(int x, int y); -protected: - AudioToolBox(); -private: - gpu::TexturePointer _micTexture; - gpu::TexturePointer _muteTexture; - gpu::TexturePointer _boxTexture; - int _boxQuadID = GeometryCache::UNKNOWN_ID; - QRect _iconBounds; - qint64 _iconPulseTimeReference = 0; -}; - -#endif // hifi_AudioToolBox_h \ No newline at end of file diff --git a/interface/src/devices/CameraToolBox.cpp b/interface/src/devices/CameraToolBox.cpp deleted file mode 100644 index 27cee5185b..0000000000 --- a/interface/src/devices/CameraToolBox.cpp +++ /dev/null @@ -1,121 +0,0 @@ -// -// CameraToolBox.cpp -// interface/src/devices -// -// Created by David Rowe on 30 Apr 2015. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "InterfaceConfig.h" - -#include -#include - -#include "gpu/GLBackend.h" -#include "Application.h" -#include "CameraToolBox.h" -#include "FaceTracker.h" - - -CameraToolBox::CameraToolBox() : - _iconPulseTimeReference(usecTimestampNow()), - _doubleClickTimer(NULL) -{ -} - -CameraToolBox::~CameraToolBox() { - if (_doubleClickTimer) { - _doubleClickTimer->stop(); - delete _doubleClickTimer; - } -} - -bool CameraToolBox::mousePressEvent(int x, int y) { - if (_iconBounds.contains(x, y)) { - if (!_doubleClickTimer) { - // Toggle mute after waiting to check that it's not a double-click. - const int DOUBLE_CLICK_WAIT = 200; // ms - _doubleClickTimer = new QTimer(this); - connect(_doubleClickTimer, SIGNAL(timeout()), this, SLOT(toggleMute())); - _doubleClickTimer->setSingleShot(true); - _doubleClickTimer->setInterval(DOUBLE_CLICK_WAIT); - _doubleClickTimer->start(); - } - return true; - } - return false; -} - -bool CameraToolBox::mouseDoublePressEvent(int x, int y) { - if (_iconBounds.contains(x, y)) { - if (_doubleClickTimer) { - _doubleClickTimer->stop(); - delete _doubleClickTimer; - _doubleClickTimer = NULL; - } - Application::getInstance()->resetSensors(); - return true; - } - return false; -} - -void CameraToolBox::toggleMute() { - delete _doubleClickTimer; - _doubleClickTimer = NULL; - - FaceTracker* faceTracker = Application::getInstance()->getSelectedFaceTracker(); - if (faceTracker) { - faceTracker->toggleMute(); - } -} - -void CameraToolBox::render(int x, int y, bool boxed) { - glEnable(GL_TEXTURE_2D); - - if (!_enabledTexture) { - _enabledTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + "images/face.svg"); - } - if (!_mutedTexture) { - _mutedTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + "images/face-mute.svg"); - } - - const int MUTE_ICON_SIZE = 24; - _iconBounds = QRect(x, y, MUTE_ICON_SIZE, MUTE_ICON_SIZE); - float iconColor = 1.0f; - if (!Menu::getInstance()->isOptionChecked(MenuOption::MuteFaceTracking)) { - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_enabledTexture)); - } else { - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_mutedTexture)); - - // Make muted icon pulsate - static const float PULSE_MIN = 0.4f; - static const float PULSE_MAX = 1.0f; - static const float PULSE_FREQUENCY = 1.0f; // in Hz - qint64 now = usecTimestampNow(); - if (now - _iconPulseTimeReference > (qint64)USECS_PER_SECOND) { - // Prevents t from getting too big, which would diminish glm::cos precision - _iconPulseTimeReference = now - ((now - _iconPulseTimeReference) % USECS_PER_SECOND); - } - float t = (float)(now - _iconPulseTimeReference) / (float)USECS_PER_SECOND; - float pulseFactor = (glm::cos(t * PULSE_FREQUENCY * 2.0f * PI) + 1.0f) / 2.0f; - iconColor = PULSE_MIN + (PULSE_MAX - PULSE_MIN) * pulseFactor; - } - - glm::vec4 quadColor(iconColor, iconColor, iconColor, 1.0f); - - glm::vec2 topLeft(_iconBounds.left(), _iconBounds.top()); - glm::vec2 bottomRight(_iconBounds.right(), _iconBounds.bottom()); - glm::vec2 texCoordTopLeft(1,1); - glm::vec2 texCoordBottomRight(0,0); - - if (_boxQuadID == GeometryCache::UNKNOWN_ID) { - _boxQuadID = DependencyManager::get()->allocateID(); - } - - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor, _boxQuadID); - - glDisable(GL_TEXTURE_2D); -} \ No newline at end of file diff --git a/interface/src/devices/CameraToolBox.h b/interface/src/devices/CameraToolBox.h deleted file mode 100644 index 89e0c6a8dc..0000000000 --- a/interface/src/devices/CameraToolBox.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// CameraToolBox.h -// interface/src/devices -// -// Created by David Rowe on 30 Apr 2015. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_CameraToolBox_h -#define hifi_CameraToolBox_h - -#include - -#include -#include - -class CameraToolBox : public QObject, public Dependency { - Q_OBJECT - SINGLETON_DEPENDENCY - -public: - void render(int x, int y, bool boxed); - bool mousePressEvent(int x, int y); - bool mouseDoublePressEvent(int x, int y); - -protected: - CameraToolBox(); - ~CameraToolBox(); - -private slots: - void toggleMute(); - -private: - gpu::TexturePointer _enabledTexture; - gpu::TexturePointer _mutedTexture; - int _boxQuadID = GeometryCache::UNKNOWN_ID; - QRect _iconBounds; - qint64 _iconPulseTimeReference = 0; - QTimer* _doubleClickTimer; -}; - -#endif // hifi_CameraToolBox_h \ No newline at end of file diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index c2d2d91216..8e8290f060 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -16,27 +16,12 @@ #include #include -#include #include -#include -#include #include -#include #include - -#include "AudioClient.h" -#include "audio/AudioIOStatsRenderer.h" -#include "audio/AudioScope.h" -#include "audio/AudioToolBox.h" #include "Application.h" -#include "devices/CameraToolBox.h" -#include "Util.h" -#include "ui/Stats.h" - -#include "../../libraries/render-utils/standardTransformPNTC_vert.h" -#include "../../libraries/render-utils/standardDrawTexture_frag.h" // Used to animate the magnification windows static const float MAG_SPEED = 0.08f; diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index b24054f8a8..8e5bdca8c0 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -29,13 +29,12 @@ #include "AudioClient.h" #include "audio/AudioIOStatsRenderer.h" #include "audio/AudioScope.h" -#include "audio/AudioToolBox.h" #include "Application.h" #include "ApplicationOverlay.h" -#include "devices/CameraToolBox.h" #include "Util.h" #include "ui/Stats.h" +#include "ui/AvatarInputs.h" const float WHITE_TEXT[] = { 0.93f, 0.93f, 0.93f }; const int AUDIO_METER_GAP = 5; @@ -86,12 +85,10 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { // TODO move to Application::idle()? Stats::getInstance()->updateStats(); + AvatarInputs::getInstance()->update(); buildFramebufferObject(); - // First render the mirror to the mirror FBO - // renderRearViewToFbo(renderArgs); - // Execute the batch into our framebuffer _overlayFramebuffer->bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -99,10 +96,7 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { // Now render the overlay components together into a single texture renderOverlays(renderArgs); - //renderAudioMeter(renderArgs); - //renderCameraToggle(renderArgs); renderStatsAndLogs(renderArgs); - // renderRearView(renderArgs); renderDomainConnectionStatusBorder(renderArgs); renderQmlUi(renderArgs); _overlayFramebuffer->release(); @@ -149,142 +143,6 @@ void ApplicationOverlay::renderOverlays(RenderArgs* renderArgs) { fboViewport(_overlayFramebuffer); } -void ApplicationOverlay::renderCameraToggle(RenderArgs* renderArgs) { - if (Menu::getInstance()->isOptionChecked(MenuOption::NoFaceTracking)) { - return; - } - - int audioMeterY; - bool smallMirrorVisible = Menu::getInstance()->isOptionChecked(MenuOption::Mirror) && !qApp->isHMDMode(); - bool boxed = smallMirrorVisible && - !Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror); - if (boxed) { - audioMeterY = MIRROR_VIEW_HEIGHT + AUDIO_METER_GAP + MUTE_ICON_PADDING; - } else { - audioMeterY = AUDIO_METER_GAP + MUTE_ICON_PADDING; - } - - DependencyManager::get()->render(MIRROR_VIEW_LEFT_PADDING + AUDIO_METER_GAP, audioMeterY, boxed); - fboViewport(_overlayFramebuffer); -} - -void ApplicationOverlay::renderAudioMeter(RenderArgs* renderArgs) { - auto audio = DependencyManager::get(); - - // Audio VU Meter and Mute Icon - const int MUTE_ICON_SIZE = 24; - const int AUDIO_METER_HEIGHT = 8; - const int INTER_ICON_GAP = 2; - - int cameraSpace = 0; - int audioMeterWidth = MIRROR_VIEW_WIDTH - MUTE_ICON_SIZE - MUTE_ICON_PADDING; - int audioMeterScaleWidth = audioMeterWidth - 2; - int audioMeterX = MIRROR_VIEW_LEFT_PADDING + MUTE_ICON_SIZE + AUDIO_METER_GAP; - if (!Menu::getInstance()->isOptionChecked(MenuOption::NoFaceTracking)) { - cameraSpace = MUTE_ICON_SIZE + INTER_ICON_GAP; - audioMeterWidth -= cameraSpace; - audioMeterScaleWidth -= cameraSpace; - audioMeterX += cameraSpace; - } - - int audioMeterY; - bool smallMirrorVisible = Menu::getInstance()->isOptionChecked(MenuOption::Mirror) && !qApp->isHMDMode(); - bool boxed = smallMirrorVisible && - !Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror); - if (boxed) { - audioMeterY = MIRROR_VIEW_HEIGHT + AUDIO_METER_GAP + MUTE_ICON_PADDING; - } else { - audioMeterY = AUDIO_METER_GAP + MUTE_ICON_PADDING; - } - - const glm::vec4 AUDIO_METER_BLUE = { 0.0, 0.0, 1.0, 1.0 }; - const glm::vec4 AUDIO_METER_GREEN = { 0.0, 1.0, 0.0, 1.0 }; - const glm::vec4 AUDIO_METER_RED = { 1.0, 0.0, 0.0, 1.0 }; - const float CLIPPING_INDICATOR_TIME = 1.0f; - const float AUDIO_METER_AVERAGING = 0.5; - const float LOG2 = log(2.0f); - const float METER_LOUDNESS_SCALE = 2.8f / 5.0f; - const float LOG2_LOUDNESS_FLOOR = 11.0f; - float audioGreenStart = 0.25f * audioMeterScaleWidth; - float audioRedStart = 0.8f * audioMeterScaleWidth; - float audioLevel = 0.0f; - float loudness = audio->getLastInputLoudness() + 1.0f; - - _trailingAudioLoudness = AUDIO_METER_AVERAGING * _trailingAudioLoudness + (1.0f - AUDIO_METER_AVERAGING) * loudness; - float log2loudness = logf(_trailingAudioLoudness) / LOG2; - - if (log2loudness <= LOG2_LOUDNESS_FLOOR) { - audioLevel = (log2loudness / LOG2_LOUDNESS_FLOOR) * METER_LOUDNESS_SCALE * audioMeterScaleWidth; - } else { - audioLevel = (log2loudness - (LOG2_LOUDNESS_FLOOR - 1.0f)) * METER_LOUDNESS_SCALE * audioMeterScaleWidth; - } - if (audioLevel > audioMeterScaleWidth) { - audioLevel = audioMeterScaleWidth; - } - bool isClipping = ((audio->getTimeSinceLastClip() > 0.0f) && (audio->getTimeSinceLastClip() < CLIPPING_INDICATOR_TIME)); - - DependencyManager::get()->render(MIRROR_VIEW_LEFT_PADDING + AUDIO_METER_GAP, audioMeterY, cameraSpace, boxed); - - auto canvasSize = qApp->getCanvasSize(); - DependencyManager::get()->render(canvasSize.x, canvasSize.y); - DependencyManager::get()->render(WHITE_TEXT, canvasSize.x, canvasSize.y); - - audioMeterY += AUDIO_METER_HEIGHT; - - // Draw audio meter background Quad - DependencyManager::get()->renderQuad(audioMeterX, audioMeterY, audioMeterWidth, AUDIO_METER_HEIGHT, - glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)); - - if (audioLevel > audioRedStart) { - glm::vec4 quadColor; - if (!isClipping) { - quadColor = AUDIO_METER_RED; - } else { - quadColor = glm::vec4(1, 1, 1, 1); - } - // Draw Red Quad - DependencyManager::get()->renderQuad(audioMeterX + audioRedStart, - audioMeterY, - audioLevel - audioRedStart, - AUDIO_METER_HEIGHT, quadColor, - _audioRedQuad); - - audioLevel = audioRedStart; - } - - if (audioLevel > audioGreenStart) { - glm::vec4 quadColor; - if (!isClipping) { - quadColor = AUDIO_METER_GREEN; - } else { - quadColor = glm::vec4(1, 1, 1, 1); - } - // Draw Green Quad - DependencyManager::get()->renderQuad(audioMeterX + audioGreenStart, - audioMeterY, - audioLevel - audioGreenStart, - AUDIO_METER_HEIGHT, quadColor, - _audioGreenQuad); - - audioLevel = audioGreenStart; - } - - if (audioLevel >= 0) { - glm::vec4 quadColor; - if (!isClipping) { - quadColor = AUDIO_METER_BLUE; - } else { - quadColor = glm::vec4(1, 1, 1, 1); - } - // Draw Blue (low level) quad - DependencyManager::get()->renderQuad(audioMeterX, - audioMeterY, - audioLevel, AUDIO_METER_HEIGHT, quadColor, - _audioBlueQuad); - } - fboViewport(_overlayFramebuffer); -} - void ApplicationOverlay::renderRearViewToFbo(RenderArgs* renderArgs) { } diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index e50622d122..e7b28d53ed 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -29,8 +29,8 @@ public: private: - void renderAudioMeter(RenderArgs* renderArgs); - void renderCameraToggle(RenderArgs* renderArgs); + //void renderAudioMeter(RenderArgs* renderArgs); + //void renderCameraToggle(RenderArgs* renderArgs); void renderStatsAndLogs(RenderArgs* renderArgs); void renderDomainConnectionStatusBorder(RenderArgs* renderArgs); void renderRearViewToFbo(RenderArgs* renderArgs); diff --git a/interface/src/ui/AvatarInputs.cpp b/interface/src/ui/AvatarInputs.cpp new file mode 100644 index 0000000000..4066dab80c --- /dev/null +++ b/interface/src/ui/AvatarInputs.cpp @@ -0,0 +1,133 @@ +// +// Created by Bradley Austin Davis 2015/06/19 +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + + +#include "Application.h" +#include "AvatarInputs.h" + +#include + +#include "Menu.h" +#include "devices/FaceTracker.h" + +HIFI_QML_DEF(AvatarInputs) + + +static AvatarInputs* INSTANCE{ nullptr }; +static const char SETTINGS_GROUP_NAME[] = "Rear View Tools"; +static const char ZOOM_LEVEL_SETTINGS[] = "ZoomLevel"; + +static Setting::Handle rearViewZoomLevel(QStringList() << SETTINGS_GROUP_NAME << ZOOM_LEVEL_SETTINGS, 0); + +AvatarInputs* AvatarInputs::getInstance() { + if (!INSTANCE) { + AvatarInputs::registerType(); + AvatarInputs::show(); + Q_ASSERT(INSTANCE); + } + return INSTANCE; +} + +AvatarInputs::AvatarInputs(QQuickItem* parent) : QQuickItem(parent) { + INSTANCE = this; + _mirrorZoomed = rearViewZoomLevel.get() != 0; +} + +#define AI_UPDATE(name, src) \ + { \ + auto val = src; \ + if (_##name != val) { \ + _##name = val; \ + emit name##Changed(); \ + } \ + } + +#define AI_UPDATE_FLOAT(name, src, epsilon) \ + { \ + float val = src; \ + if (abs(_##name - val) >= epsilon) { \ + _##name = val; \ + emit name##Changed(); \ + } \ + } + +void AvatarInputs::update() { + if (!Menu::getInstance()) { + return; + } + AI_UPDATE(mirrorVisible, Menu::getInstance()->isOptionChecked(MenuOption::Mirror) && !qApp->isHMDMode() + && !Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)); + AI_UPDATE(cameraEnabled, !Menu::getInstance()->isOptionChecked(MenuOption::NoFaceTracking)); + AI_UPDATE(cameraMuted, Menu::getInstance()->isOptionChecked(MenuOption::MuteFaceTracking)); + + auto audioIO = DependencyManager::get(); + const float CLIPPING_INDICATOR_TIME = 1.0f; + const float AUDIO_METER_AVERAGING = 0.5; + const float LOG2 = log(2.0f); + const float METER_LOUDNESS_SCALE = 2.8f / 5.0f; + const float LOG2_LOUDNESS_FLOOR = 11.0f; + float audioLevel = 0.0f; + auto audio = DependencyManager::get(); + float loudness = audio->getLastInputLoudness() + 1.0f; + + _trailingAudioLoudness = AUDIO_METER_AVERAGING * _trailingAudioLoudness + (1.0f - AUDIO_METER_AVERAGING) * loudness; + + float log2loudness = logf(_trailingAudioLoudness) / LOG2; + + if (log2loudness <= LOG2_LOUDNESS_FLOOR) { + audioLevel = (log2loudness / LOG2_LOUDNESS_FLOOR) * METER_LOUDNESS_SCALE; + } else { + audioLevel = (log2loudness - (LOG2_LOUDNESS_FLOOR - 1.0f)) * METER_LOUDNESS_SCALE; + } + if (audioLevel > 1.0) { + audioLevel = 1.0; + } + AI_UPDATE_FLOAT(audioLevel, audioLevel, 0.01); + AI_UPDATE(audioClipping, ((audioIO->getTimeSinceLastClip() > 0.0f) && (audioIO->getTimeSinceLastClip() < 1.0f))); + AI_UPDATE(audioMuted, audioIO->isMuted()); + + //// Make muted icon pulsate + //static const float PULSE_MIN = 0.4f; + //static const float PULSE_MAX = 1.0f; + //static const float PULSE_FREQUENCY = 1.0f; // in Hz + //qint64 now = usecTimestampNow(); + //if (now - _iconPulseTimeReference > (qint64)USECS_PER_SECOND) { + // // Prevents t from getting too big, which would diminish glm::cos precision + // _iconPulseTimeReference = now - ((now - _iconPulseTimeReference) % USECS_PER_SECOND); + //} + //float t = (float)(now - _iconPulseTimeReference) / (float)USECS_PER_SECOND; + //float pulseFactor = (glm::cos(t * PULSE_FREQUENCY * 2.0f * PI) + 1.0f) / 2.0f; + //iconColor = PULSE_MIN + (PULSE_MAX - PULSE_MIN) * pulseFactor; +} + +void AvatarInputs::toggleCameraMute() { + FaceTracker* faceTracker = Application::getInstance()->getSelectedFaceTracker(); + if (faceTracker) { + faceTracker->toggleMute(); + } +} + +void AvatarInputs::toggleAudioMute() { + DependencyManager::get()->toggleMute(); +} + +void AvatarInputs::resetSensors() { + qApp->resetSensors(); +} + +void AvatarInputs::toggleZoom() { + _mirrorZoomed = !_mirrorZoomed; + rearViewZoomLevel.set(_mirrorZoomed ? 0 : 1); + emit mirrorZoomedChanged(); +} + +void AvatarInputs::closeMirror() { + if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { + Menu::getInstance()->triggerOption(MenuOption::Mirror); + } +} diff --git a/interface/src/ui/AvatarInputs.h b/interface/src/ui/AvatarInputs.h new file mode 100644 index 0000000000..8ed4e8f163 --- /dev/null +++ b/interface/src/ui/AvatarInputs.h @@ -0,0 +1,59 @@ +// +// Created by Bradley Austin Davis 2015/06/19 +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_AvatarInputs_h +#define hifi_AvatarInputs_h + +#include +#include + +#define AI_PROPERTY(type, name, initialValue) \ + Q_PROPERTY(type name READ name NOTIFY name##Changed) \ +public: \ + type name() { return _##name; }; \ +private: \ + type _##name{ initialValue }; + +class AvatarInputs : public QQuickItem { + Q_OBJECT + HIFI_QML_DECL + + AI_PROPERTY(bool, cameraEnabled, false) + AI_PROPERTY(bool, cameraMuted, false) + AI_PROPERTY(bool, audioMuted, false) + AI_PROPERTY(bool, audioClipping, false) + AI_PROPERTY(float, audioLevel, 0) + AI_PROPERTY(bool, mirrorVisible, false) + AI_PROPERTY(bool, mirrorZoomed, true) + +public: + static AvatarInputs* getInstance(); + AvatarInputs(QQuickItem* parent = nullptr); + void update(); + +signals: + void cameraEnabledChanged(); + void cameraMutedChanged(); + void audioMutedChanged(); + void audioClippingChanged(); + void audioLevelChanged(); + void mirrorVisibleChanged(); + void mirrorZoomedChanged(); + +protected: + Q_INVOKABLE void resetSensors(); + Q_INVOKABLE void toggleCameraMute(); + Q_INVOKABLE void toggleAudioMute(); + Q_INVOKABLE void toggleZoom(); + Q_INVOKABLE void closeMirror(); + +private: + float _trailingAudioLoudness{ 0 }; +}; + +#endif // hifi_AvatarInputs_h diff --git a/interface/src/ui/RearMirrorTools.cpp b/interface/src/ui/RearMirrorTools.cpp deleted file mode 100644 index 33f3e1b487..0000000000 --- a/interface/src/ui/RearMirrorTools.cpp +++ /dev/null @@ -1,134 +0,0 @@ -// -// RearMirrorTools.cpp -// interface/src/ui -// -// Created by Stojce Slavkovski on 10/23/2013. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "InterfaceConfig.h" - -#include - -#include -#include -#include - -#include "Application.h" -#include "RearMirrorTools.h" -#include "Util.h" - -const int ICON_SIZE = 24; -const int ICON_PADDING = 5; - -const char SETTINGS_GROUP_NAME[] = "Rear View Tools"; -const char ZOOM_LEVEL_SETTINGS[] = "ZoomLevel"; -Setting::Handle RearMirrorTools::rearViewZoomLevel(QStringList() << SETTINGS_GROUP_NAME << ZOOM_LEVEL_SETTINGS, - ZoomLevel::HEAD); - -RearMirrorTools::RearMirrorTools(QRect& bounds) : - _bounds(bounds), - _windowed(false), - _fullScreen(false) -{ - _closeTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + "images/close.svg"); - - _zoomHeadTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + "images/plus.svg"); - _zoomBodyTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + "images/minus.svg"); - - _shrinkIconRect = QRect(ICON_PADDING, ICON_PADDING, ICON_SIZE, ICON_SIZE); - _closeIconRect = QRect(_bounds.left() + ICON_PADDING, _bounds.top() + ICON_PADDING, ICON_SIZE, ICON_SIZE); - _resetIconRect = QRect(_bounds.width() - ICON_SIZE - ICON_PADDING, _bounds.top() + ICON_PADDING, ICON_SIZE, ICON_SIZE); - _bodyZoomIconRect = QRect(_bounds.width() - ICON_SIZE - ICON_PADDING, _bounds.bottom() - ICON_PADDING - ICON_SIZE, ICON_SIZE, ICON_SIZE); - _headZoomIconRect = QRect(_bounds.left() + ICON_PADDING, _bounds.bottom() - ICON_PADDING - ICON_SIZE, ICON_SIZE, ICON_SIZE); -} - -void RearMirrorTools::render(RenderArgs* renderArgs, bool fullScreen, const QPoint & mousePosition) { - if (fullScreen) { - _fullScreen = true; - displayIcon(QRect(QPoint(), qApp->getDeviceSize()), _shrinkIconRect, _closeTexture); - } else { - // render rear view tools if mouse is in the bounds - _windowed = _bounds.contains(mousePosition); - if (_windowed) { - displayIcon(_bounds, _closeIconRect, _closeTexture); - - ZoomLevel zoomLevel = (ZoomLevel)rearViewZoomLevel.get(); - displayIcon(_bounds, _headZoomIconRect, _zoomHeadTexture, zoomLevel == HEAD); - displayIcon(_bounds, _bodyZoomIconRect, _zoomBodyTexture, zoomLevel == BODY); - } - } -} - -bool RearMirrorTools::mousePressEvent(int x, int y) { - if (_windowed) { - if (_closeIconRect.contains(x, y)) { - _windowed = false; - emit closeView(); - return true; - } - - if (_headZoomIconRect.contains(x, y)) { - rearViewZoomLevel.set(HEAD); - return true; - } - - if (_bodyZoomIconRect.contains(x, y)) { - rearViewZoomLevel.set(BODY); - return true; - } - - if (_bounds.contains(x, y)) { - _windowed = false; - emit restoreView(); - return true; - } - } - - if (_fullScreen) { - if (_shrinkIconRect.contains(x, y)) { - _fullScreen = false; - emit shrinkView(); - return true; - } - } - return false; -} - -void RearMirrorTools::displayIcon(QRect bounds, QRect iconBounds, const gpu::TexturePointer& texture, bool selected) { - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - - glOrtho(bounds.left(), bounds.right(), bounds.bottom(), bounds.top(), -1.0, 1.0); - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - glEnable(GL_TEXTURE_2D); - - glm::vec4 quadColor; - if (selected) { - quadColor = glm::vec4(.5f, .5f, .5f, 1.0f); - } else { - quadColor = glm::vec4(1, 1, 1, 1); - } - - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(texture)); - - glm::vec2 topLeft(iconBounds.left(), iconBounds.top()); - glm::vec2 bottomRight(iconBounds.right(), iconBounds.bottom()); - static const glm::vec2 texCoordTopLeft(0.0f, 1.0f); - static const glm::vec2 texCoordBottomRight(1.0f, 0.0f); - - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor); - - glPopMatrix(); - - glMatrixMode(GL_MODELVIEW); - - glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_TEXTURE_2D); -} diff --git a/interface/src/ui/RearMirrorTools.h b/interface/src/ui/RearMirrorTools.h deleted file mode 100644 index c633d72a49..0000000000 --- a/interface/src/ui/RearMirrorTools.h +++ /dev/null @@ -1,56 +0,0 @@ -// -// RearMirrorTools.h -// interface/src/ui -// -// Created by Stojce Slavkovski on 10/23/2013. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_RearMirrorTools_h -#define hifi_RearMirrorTools_h - -#include -#include - -enum ZoomLevel { - HEAD = 0, - BODY = 1 -}; - -class RearMirrorTools : public QObject { - Q_OBJECT -public: - RearMirrorTools(QRect& bounds); - void render(RenderArgs* renderArgs, bool fullScreen, const QPoint & mousePos); - bool mousePressEvent(int x, int y); - - static Setting::Handle rearViewZoomLevel; - -signals: - void closeView(); - void shrinkView(); - void resetView(); - void restoreView(); - -private: - QRect _bounds; - gpu::TexturePointer _closeTexture; - gpu::TexturePointer _zoomBodyTexture; - gpu::TexturePointer _zoomHeadTexture; - - QRect _closeIconRect; - QRect _resetIconRect; - QRect _shrinkIconRect; - QRect _headZoomIconRect; - QRect _bodyZoomIconRect; - - bool _windowed; - bool _fullScreen; - - void displayIcon(QRect bounds, QRect iconBounds, const gpu::TexturePointer& texture, bool selected = false); -}; - -#endif // hifi_RearMirrorTools_h diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index acc9521c72..934f53ffc7 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -1,8 +1,5 @@ // -// Stats.cpp -// interface/src/ui -// -// Created by Lucas Crisman on 22/03/14. +// Created by Bradley Austin Davis 2015/06/17 // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. @@ -376,4 +373,4 @@ void Stats::display( } -*/ \ No newline at end of file +*/ diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index 58d920d9a5..8582d436af 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -1,8 +1,5 @@ // -// Stats.h -// interface/src/ui -// -// Created by Lucas Crisman on 22/03/14. +// Created by Bradley Austin Davis 2015/06/17 // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0.