You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Sandbox/Editor/InfoBar.cpp

395 lines
12 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
#include "EditorDefs.h"
#include "InfoBar.h"
// Editor
#include "MainWindow.h"
#include "DisplaySettings.h"
#include "GameEngine.h"
#include "Include/ITransformManipulator.h"
#include "ActionManager.h"
#include "Settings.h"
#include "Include/IObjectManager.h"
#include "MathConversion.h"
AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
#include <ui_InfoBar.h>
AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
#include <QLineEdit>
#include <AzQtComponents/Components/Style.h>
void BeautifyEulerAngles(Vec3& v)
{
if (v.x + v.y + v.z >= 360.0f)
{
v.x = 180.0f - v.x;
v.y = 180.0f - v.y;
v.z = 180.0f - v.z;
}
}
/////////////////////////////////////////////////////////////////////////////
// CInfoBar dialog
CInfoBar::CInfoBar(QWidget* parent)
: QWidget(parent)
, ui(new Ui::CInfoBar)
{
ui->setupUi(this);
m_bSelectionChanged = false;
m_bDragMode = false;
m_prevMoveSpeed = 0;
m_currValue = Vec3(-111, +222, -333); //this wasn't initialized. I don't know what a good value is
m_oldMainVolume = 1.0f;
GetIEditor()->RegisterNotifyListener(this);
//audio request setup
m_oMuteAudioRequest.pData = &m_oMuteAudioRequestData;
m_oUnmuteAudioRequest.pData = &m_oUnmuteAudioRequestData;
OnInitDialog();
auto comboBoxTextChanged = static_cast<void(QComboBox::*)(const QString&)>(&QComboBox::currentTextChanged);
connect(ui->m_moveSpeed, comboBoxTextChanged, this, &CInfoBar::OnUpdateMoveSpeedText);
connect(ui->m_moveSpeed->lineEdit(), &QLineEdit::returnPressed, this, &CInfoBar::OnSpeedComboBoxEnter);
// Hide some buttons from the expander menu
AzQtComponents::Style::addClass(ui->m_physDoStepBtn, "expanderMenu_hide");
AzQtComponents::Style::addClass(ui->m_physSingleStepBtn, "expanderMenu_hide");
connect(ui->m_physicsBtn, &QToolButton::clicked, this, &CInfoBar::OnBnClickedPhysics);
connect(ui->m_physSingleStepBtn, &QToolButton::clicked, this, &CInfoBar::OnBnClickedSingleStepPhys);
connect(ui->m_physDoStepBtn, &QToolButton::clicked, this, &CInfoBar::OnBnClickedDoStepPhys);
connect(ui->m_syncPlayerBtn, &QToolButton::clicked, this, &CInfoBar::OnBnClickedSyncplayer);
connect(ui->m_gotoPos, &QToolButton::clicked, this, &CInfoBar::OnBnClickedGotoPosition);
connect(ui->m_muteBtn, &QToolButton::clicked, this, &CInfoBar::OnBnClickedMuteAudio);
connect(ui->m_vrBtn, &QToolButton::clicked, this, &CInfoBar::OnBnClickedEnableVR);
connect(this, &CInfoBar::ActionTriggered, MainWindow::instance()->GetActionManager(), &ActionManager::ActionTriggered);
connect(ui->m_physicsBtn, &QAbstractButton::toggled, ui->m_physicsBtn, [this](bool checked) {
ui->m_physicsBtn->setToolTip(checked ? tr("Stop Simulation (Ctrl+P)") : tr("Simulate (Ctrl+P)"));
});
connect(ui->m_physSingleStepBtn, &QAbstractButton::toggled, ui->m_physSingleStepBtn, [this](bool checked) {
ui->m_physSingleStepBtn->setToolTip(checked ? tr("Disable Physics/AI Single-step Mode ('<' in Game Mode)") : tr("Enable Physics/AI Single-step Mode ('<' in Game Mode)"));
});
connect(ui->m_syncPlayerBtn, &QAbstractButton::toggled, ui->m_syncPlayerBtn, [this](bool checked) {
ui->m_syncPlayerBtn->setToolTip(checked ? tr("Synchronize Player with Camera") : tr("Move Player and Camera Separately"));
});
connect(ui->m_muteBtn, &QAbstractButton::toggled, ui->m_muteBtn, [this](bool checked) {
ui->m_muteBtn->setToolTip(checked ? tr("Un-mute Audio") : tr("Mute Audio"));
});
connect(ui->m_vrBtn, &QAbstractButton::toggled, ui->m_vrBtn, [this](bool checked) {
ui->m_vrBtn->setToolTip(checked ? tr("Disable VR Preview") : tr("Enable VR Preview"));
});
ui->m_moveSpeed->setValidator(new QDoubleValidator(m_minSpeed, m_maxSpeed, m_numDecimals, ui->m_moveSpeed));
// Save off the move speed here since setting up the combo box can cause it to update values in the background.
float cameraMoveSpeed = gSettings.cameraMoveSpeed;
// Populate the presets in the ComboBox
for (float presetValue : m_speedPresetValues)
{
ui->m_moveSpeed->addItem(QString().setNum(presetValue, 'f', m_numDecimals), presetValue);
}
SetSpeedComboBox(cameraMoveSpeed);
ui->m_moveSpeed->setInsertPolicy(QComboBox::NoInsert);
using namespace AzToolsFramework::ComponentModeFramework;
EditorComponentModeNotificationBus::Handler::BusConnect(AzToolsFramework::GetEntityContextId());
}
//////////////////////////////////////////////////////////////////////////
CInfoBar::~CInfoBar()
{
using namespace AzToolsFramework::ComponentModeFramework;
EditorComponentModeNotificationBus::Handler::BusDisconnect();
GetIEditor()->UnregisterNotifyListener(this);
AZ::VR::VREventBus::Handler::BusDisconnect();
}
//////////////////////////////////////////////////////////////////////////
void CInfoBar::OnEditorNotifyEvent(EEditorNotifyEvent event)
{
if (event == eNotify_OnIdleUpdate)
{
IdleUpdate();
}
else if (event == eNotify_OnBeginGameMode || event == eNotify_OnEndGameMode)
{
// Audio: determine muted state of audio
//m_bMuted = gEnv->pAudioSystem->GetMainVolume() == 0.f;
ui->m_muteBtn->setChecked(gSettings.bMuteAudio);
}
else if (event == eNotify_OnBeginLoad || event == eNotify_OnCloseScene)
{
// make sure AI/Physics is disabled on level load (CE-4229)
if (GetIEditor()->GetGameEngine()->GetSimulationMode())
{
OnBnClickedPhysics();
}
ui->m_physicsBtn->setEnabled(false);
ui->m_physSingleStepBtn->setEnabled(false);
ui->m_physDoStepBtn->setEnabled(false);
}
else if (event == eNotify_OnEndLoad || event == eNotify_OnEndNewScene)
{
ui->m_physicsBtn->setEnabled(true);
ui->m_physSingleStepBtn->setEnabled(true);
ui->m_physDoStepBtn->setEnabled(true);
}
else if (event == eNotify_OnSelectionChange)
{
m_bSelectionChanged = true;
}
}
void CInfoBar::IdleUpdate()
{
if (!m_idleUpdateEnabled)
{
return;
}
bool updateUI = false;
// Update Width/Height of selection rectangle.
AABB box;
GetIEditor()->GetSelectedRegion(box);
float width = box.max.x - box.min.x;
float height = box.max.y - box.min.y;
if (m_width != width || m_height != height)
{
m_width = width;
m_height = height;
updateUI = true;
}
Vec3 marker = GetIEditor()->GetMarkerPosition();
int selectedEntitiesCount = 0;
AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult(
selectedEntitiesCount, &AzToolsFramework::ToolsApplicationRequests::GetSelectedEntitiesCount);
if (selectedEntitiesCount != m_numSelected)
{
m_numSelected = selectedEntitiesCount;
updateUI = true;
}
QString str;
if (updateUI)
{
if (m_numSelected == 0)
{
str = tr("None Selected");
}
else if (m_numSelected == 1)
{
str = tr("1 Object Selected");
}
else
{
str = tr("%1 Objects Selected").arg(m_numSelected);
}
ui->m_statusText->setText(str);
m_sLastText = str;
}
if (gSettings.cameraMoveSpeed != m_prevMoveSpeed &&
!ui->m_moveSpeed->lineEdit()->hasFocus())
{
m_prevMoveSpeed = gSettings.cameraMoveSpeed;
SetSpeedComboBox(gSettings.cameraMoveSpeed);
}
{
bool bPhysics = GetIEditor()->GetGameEngine()->GetSimulationMode();
if ((ui->m_physicsBtn->isChecked() && !bPhysics) ||
(!ui->m_physicsBtn->isChecked() && bPhysics))
{
ui->m_physicsBtn->setChecked(bPhysics);
}
// Unsupported for Phyics:: atm
bool bSingleStep = false;
if (ui->m_physSingleStepBtn->isChecked() != bSingleStep)
{
ui->m_physSingleStepBtn->setChecked(bSingleStep);
}
bool bSyncPlayer = GetIEditor()->GetGameEngine()->IsSyncPlayerPosition();
if ((!ui->m_syncPlayerBtn->isChecked() && !bSyncPlayer) ||
(ui->m_syncPlayerBtn->isChecked() && bSyncPlayer))
{
ui->m_syncPlayerBtn->setChecked(!bSyncPlayer);
}
}
// if our selection changed, or if our display values are out of date
if (m_bSelectionChanged)
{
m_bSelectionChanged = false;
}
}
inline double Round(double fVal, double fStep)
{
if (fStep > 0.f)
{
fVal = int_round(fVal / fStep) * fStep;
}
return fVal;
}
void CInfoBar::OnUpdateMoveSpeedText(const QString& text)
{
gSettings.cameraMoveSpeed = aznumeric_cast<float>(Round(text.toDouble(), m_speedStep));
}
void CInfoBar::OnSpeedComboBoxEnter()
{
ui->m_moveSpeed->clearFocus();
}
void CInfoBar::OnInitDialog()
{
QFontMetrics metrics({});
int width = metrics.boundingRect("-9999.99").width() * m_fieldWidthMultiplier;
ui->m_moveSpeed->setFixedWidth(width);
ui->m_physicsBtn->setEnabled(false);
ui->m_physSingleStepBtn->setEnabled(false);
ui->m_physDoStepBtn->setEnabled(false);
ui->m_muteBtn->setChecked(gSettings.bMuteAudio);
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequest, gSettings.bMuteAudio ? m_oMuteAudioRequest : m_oUnmuteAudioRequest);
//This is here just in case this class hasn't been created before
//a VR headset was initialized
ui->m_vrBtn->setEnabled(false);
if (AZ::VR::HMDDeviceRequestBus::GetTotalNumOfEventHandlers() != 0)
{
ui->m_vrBtn->setEnabled(true);
}
AZ::VR::VREventBus::Handler::BusConnect();
}
void CInfoBar::OnHMDInitialized()
{
ui->m_vrBtn->setEnabled(true);
}
void CInfoBar::OnHMDShutdown()
{
ui->m_vrBtn->setEnabled(false);
}
void CInfoBar::OnBnClickedTerrainCollision()
{
emit ActionTriggered(ID_TERRAIN_COLLISION);
}
void CInfoBar::OnBnClickedPhysics()
{
if (!ui->m_physicsBtn->isEnabled())
{
return;
}
bool bPhysics = GetIEditor()->GetGameEngine()->GetSimulationMode();
ui->m_physicsBtn->setChecked(bPhysics);
emit ActionTriggered(ID_SWITCH_PHYSICS);
if (bPhysics && ui->m_physSingleStepBtn->isChecked())
{
OnBnClickedSingleStepPhys();
}
}
void CInfoBar::OnBnClickedSingleStepPhys()
{
}
void CInfoBar::OnBnClickedDoStepPhys()
{
}
//////////////////////////////////////////////////////////////////////////
void CInfoBar::OnBnClickedSyncplayer()
{
emit ActionTriggered(ID_GAME_SYNCPLAYER);
}
//////////////////////////////////////////////////////////////////////////
void CInfoBar::OnBnClickedGotoPosition()
{
emit ActionTriggered(ID_DISPLAY_GOTOPOSITION);
}
//////////////////////////////////////////////////////////////////////////
void CInfoBar::OnBnClickedMuteAudio()
{
gSettings.bMuteAudio = !gSettings.bMuteAudio;
Audio::AudioSystemRequestBus::Broadcast(&Audio::AudioSystemRequestBus::Events::PushRequest, gSettings.bMuteAudio ? m_oMuteAudioRequest : m_oUnmuteAudioRequest);
ui->m_muteBtn->setChecked(gSettings.bMuteAudio);
}
void CInfoBar::OnBnClickedEnableVR()
{
gSettings.bEnableGameModeVR = !gSettings.bEnableGameModeVR;
ui->m_vrBtn->setChecked(gSettings.bEnableGameModeVR);
}
void CInfoBar::EnteredComponentMode(const AZStd::vector<AZ::Uuid>& /*componentModeTypes*/)
{
ui->m_physicsBtn->setDisabled(true);
}
void CInfoBar::LeftComponentMode(const AZStd::vector<AZ::Uuid>& /*componentModeTypes*/)
{
ui->m_physicsBtn->setEnabled(true);
}
void CInfoBar::SetSpeedComboBox(double value)
{
value = AZStd::clamp(Round(value, m_speedStep), m_minSpeed, m_maxSpeed);
int index = ui->m_moveSpeed->findData(value);
if (index != -1)
{
ui->m_moveSpeed->setCurrentIndex(index);
}
else
{
ui->m_moveSpeed->lineEdit()->setText(QString().setNum(value, 'f', m_numDecimals));
}
}
#include <moc_InfoBar.cpp>