16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-18 01:59:19 +02:00

disable interaction in pause mode, audio volume calculations tweak

This commit is contained in:
tmj-fstate
2018-09-05 13:49:48 +02:00
parent bbe5fe9758
commit bb0e1eb3bf
8 changed files with 265 additions and 211 deletions

View File

@@ -127,7 +127,7 @@ global_settings::ConfigParse(cParser &Parser) {
// selected device for audio renderer
Parser.getTokens();
Parser >> AudioVolume;
AudioVolume = clamp( AudioVolume, 1.f, 4.f );
AudioVolume = clamp( AudioVolume, 0.0f, 2.f );
}
// else if (str==AnsiString("renderalpha")) //McZapkie-1312302 - dwuprzebiegowe renderowanie
// bRenderAlpha=(GetNextSymbol().LowerCase()==AnsiString("yes"));

View File

@@ -40,7 +40,7 @@ struct global_settings {
std::string LastGLError;
float ZoomFactor{ 1.f }; // determines current camera zoom level. TODO: move it to the renderer
bool CabWindowOpen{ false }; // controls sound attenuation between cab and outside
bool ControlPicking{ false }; // indicates controls pick mode is active
bool ControlPicking{ true }; // indicates controls pick mode is active
bool DLFont{ false }; // switch indicating presence of basic font
bool bActive{ true }; // czy jest aktywnym oknem
int iPause{ 0 }; // globalna pauza ruchu: b0=start,b1=klawisz,b2=tło,b3=lagi,b4=wczytywanie

View File

@@ -154,7 +154,7 @@ openal_source::sync_with( sound_properties const &State ) {
properties.soundproofing = State.soundproofing;
properties.soundproofing_stamp = State.soundproofing_stamp;
::alSourcef( id, AL_GAIN, properties.gain * properties.soundproofing * Global.AudioVolume );
::alSourcef( id, AL_GAIN, properties.gain * properties.soundproofing );
}
if( sound_range > 0 ) {
auto const rangesquared { sound_range * sound_range };
@@ -170,7 +170,7 @@ openal_source::sync_with( sound_properties const &State ) {
clamp<float>(
( distancesquared - rangesquared ) / ( fadedistance * fadedistance ),
0.f, 1.f ) ) };
::alSourcef( id, AL_GAIN, properties.gain * properties.soundproofing * rangefactor * Global.AudioVolume );
::alSourcef( id, AL_GAIN, properties.gain * properties.soundproofing * rangefactor );
}
is_in_range = ( distancesquared <= rangesquared );
}
@@ -283,10 +283,7 @@ openal_renderer::init() {
// basic initialization failed
return false;
}
//
// ::alDistanceModel( AL_LINEAR_DISTANCE );
::alDistanceModel( AL_INVERSE_DISTANCE_CLAMPED );
::alListenerf( AL_GAIN, clamp( Global.AudioVolume, 1.f, 4.f ) );
// all done
m_ready = true;
return true;
@@ -319,6 +316,8 @@ void
openal_renderer::update( double const Deltatime ) {
// update listener
// gain
::alListenerf( AL_GAIN, clamp( Global.AudioVolume, 0.f, 2.f ) * ( Global.iPause == 0 ? 1.f : 0.15f ) );
// orientation
glm::dmat4 cameramatrix;
Global.pCamera.SetMatrix( cameramatrix );

View File

@@ -299,9 +299,7 @@ driver_mode::enter() {
Timer::ResetTimers();
Application.set_cursor( GLFW_CURSOR_DISABLED );
Application.set_cursor_pos( 0, 0 );
Global.ControlPicking = false;
set_picking( Global.ControlPicking );
}
// maintenance method, called when the mode is deactivated
@@ -351,6 +349,9 @@ driver_mode::on_key( int const Key, int const Scancode, int const Action, int co
void
driver_mode::on_cursor_pos( double const Horizontal, double const Vertical ) {
// give the ui first shot at the input processing...
if( true == m_userinterface->on_cursor_pos( Horizontal, Vertical ) ) { return; }
if( false == Global.ControlPicking ) {
// in regular view mode keep cursor on screen
Application.set_cursor_pos( 0, 0 );
@@ -362,6 +363,9 @@ driver_mode::on_cursor_pos( double const Horizontal, double const Vertical ) {
void
driver_mode::on_mouse_button( int const Button, int const Action, int const Mods ) {
// give the ui first shot at the input processing...
if( true == m_userinterface->on_mouse_button( Button, Action ) ) { return; }
// give the potential event recipient a shot at it, in the virtual z order
m_input.mouse.button( Button, Action );
}
@@ -561,8 +565,8 @@ driver_mode::OnKeyDown(int cKey) {
// actual key processing
// TODO: redo the input system
if( ( cKey >= GLFW_KEY_0 ) && ( cKey <= GLFW_KEY_9 ) ) // klawisze cyfrowe
{
if( ( cKey >= GLFW_KEY_0 ) && ( cKey <= GLFW_KEY_9 ) ) {
// klawisze cyfrowe
int i = cKey - GLFW_KEY_0; // numer klawisza
if (Global.shiftState) {
// z [Shift] uruchomienie eventu
@@ -600,217 +604,183 @@ driver_mode::OnKeyDown(int cKey) {
}
}
}
return;
}
else if( ( cKey >= GLFW_KEY_F1 ) && ( cKey <= GLFW_KEY_F12 ) )
{
switch (cKey) {
case GLFW_KEY_F1: {
switch (cKey) {
if( DebugModeFlag ) {
// additional simulation clock jump keys in debug mode
if( Global.ctrlState ) {
// ctrl-f1
simulation::Time.update( 20.0 * 60.0 );
}
else if( Global.shiftState ) {
// shift-f1
simulation::Time.update( 5.0 * 60.0 );
}
}
break;
}
case GLFW_KEY_F4: {
InOutKey( !Global.shiftState ); // distant view with Shift, short distance step out otherwise
break;
}
case GLFW_KEY_F5: {
// przesiadka do innego pojazdu
if( false == FreeFlyModeFlag ) {
// only available in free fly mode
break;
}
TDynamicObject *tmp = std::get<TDynamicObject *>( simulation::Region->find_vehicle( Global.pCamera.Pos, 50, true, false ) );
if( tmp != nullptr ) {
if( simulation::Train ) {// jeśli mielismy pojazd
if( simulation::Train->Dynamic()->Mechanik ) { // na skutek jakiegoś błędu może czasem zniknąć
simulation::Train->Dynamic()->Mechanik->TakeControl( true ); // oddajemy dotychczasowy AI
}
}
if( ( true == DebugModeFlag )
|| ( tmp->MoverParameters->Vel <= 5.0 ) ) {
// works always in debug mode, or for stopped/slow moving vehicles otherwise
if( simulation::Train == nullptr ) {
simulation::Train = new TTrain(); // jeśli niczym jeszcze nie jeździlismy
}
if( simulation::Train->Init( tmp ) ) { // przejmujemy sterowanie
simulation::Train->Dynamic()->Mechanik->TakeControl( false );
}
else {
SafeDelete( simulation::Train ); // i nie ma czym sterować
}
if( simulation::Train ) {
InOutKey(); // do kabiny
}
}
}
break;
}
case GLFW_KEY_F6: {
// przyspieszenie symulacji do testowania scenerii... uwaga na FPS!
if( DebugModeFlag ) {
if( Global.ctrlState ) { Global.fTimeSpeed = ( Global.shiftState ? 60.0 : 20.0 ); }
else { Global.fTimeSpeed = ( Global.shiftState ? 5.0 : 1.0 ); }
}
break;
}
case GLFW_KEY_F7: {
// debug mode functions
if( DebugModeFlag ) {
if( Global.ctrlState
&& Global.shiftState ) {
// shift + ctrl + f7 toggles between debug and regular camera
DebugCameraFlag = !DebugCameraFlag;
}
else if( Global.ctrlState ) {
// ctrl + f7 toggles static daylight
simulation::Environment.toggle_daylight();
break;
}
else if( Global.shiftState ) {
// shift + f7 is currently unused
}
else {
// f7: wireframe toggle
// TODO: pass this to renderer instead of making direct calls
Global.bWireFrame = !Global.bWireFrame;
if( true == Global.bWireFrame ) {
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
}
else {
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
}
}
}
break;
}
case GLFW_KEY_F11: {
// editor mode
if( ( false == Global.ctrlState )
&& ( false == Global.shiftState ) ) {
Application.push_mode( eu07_application::mode::editor );
}
break;
}
case GLFW_KEY_F12: {
// quick debug mode toggle
if( Global.ctrlState
&& Global.shiftState ) {
DebugModeFlag = !DebugModeFlag;
}
break;
}
default: {
break;
}
}
// if (cKey!=VK_F4)
return; // nie są przekazywane do pojazdu wcale
}
/*
if ((Global.iTextMode == GLFW_KEY_F12) ? (cKey >= '0') && (cKey <= '9') : false)
{ // tryb konfiguracji debugmode (przestawianie kamery już wyłączone
if (!Global.shiftState) // bez [Shift]
{
if (cKey == GLFW_KEY_1)
Global.iWriteLogEnabled ^= 1; // włącz/wyłącz logowanie do pliku
else if (cKey == GLFW_KEY_2)
{ // włącz/wyłącz okno konsoli
Global.iWriteLogEnabled ^= 2;
if ((Global.iWriteLogEnabled & 2) == 0) // nie było okienka
{ // otwarcie okna
AllocConsole(); // jeśli konsola już jest, to zwróci błąd; uwalniać nie ma po
// co, bo się odłączy
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
}
}
// else if (cKey=='3') Global.iWriteLogEnabled^=4; //wypisywanie nazw torów
}
}
else */
if( cKey == GLFW_KEY_ESCAPE ) {
// toggle pause
if( Global.iPause & 1 ) {
// jeśli pauza startowa
// odpauzowanie, gdy po wczytaniu miało nie startować
Global.iPause &= ~1;
}
else if( ( Global.iMultiplayer & 2 ) == 0 ) {
// w multiplayerze pauza nie ma sensu
Global.iPause ^= 2; // zmiana stanu zapauzowania
if( ( Global.iPause & 2 )
&& ( false == Global.ControlPicking ) ) {
set_picking( true );
}
}
}
else {
if( ( true == DebugModeFlag )
&& ( false == Global.shiftState )
&& ( true == Global.ctrlState )
&& ( simulation::Train != nullptr )
&& ( simulation::Train->Dynamic()->Controller == Humandriver ) ) {
case GLFW_KEY_F1: {
if( DebugModeFlag ) {
// przesuwanie składu o 100m
auto *vehicle { simulation::Train->Dynamic() };
TDynamicObject *d = vehicle;
if( cKey == GLFW_KEY_LEFT_BRACKET ) {
while( d ) {
d->Move( 100.0 * d->DirectionGet() );
d = d->Next(); // pozostałe też
}
d = vehicle->Prev();
while( d ) {
d->Move( 100.0 * d->DirectionGet() );
d = d->Prev(); // w drugą stronę też
// additional simulation clock jump keys in debug mode
if( Global.ctrlState ) {
// ctrl-f1
simulation::Time.update( 20.0 * 60.0 );
}
else if( Global.shiftState ) {
// shift-f1
simulation::Time.update( 5.0 * 60.0 );
}
}
break;
}
case GLFW_KEY_F4: {
InOutKey( !Global.shiftState ); // distant view with Shift, short distance step out otherwise
break;
}
case GLFW_KEY_F5: {
// przesiadka do innego pojazdu
if( false == FreeFlyModeFlag ) {
// only available in free fly mode
break;
}
TDynamicObject *tmp = std::get<TDynamicObject *>( simulation::Region->find_vehicle( Global.pCamera.Pos, 50, true, false ) );
if( tmp != nullptr ) {
if( simulation::Train ) {// jeśli mielismy pojazd
if( simulation::Train->Dynamic()->Mechanik ) { // na skutek jakiegoś błędu może czasem zniknąć
simulation::Train->Dynamic()->Mechanik->TakeControl( true ); // oddajemy dotychczasowy AI
}
}
else if( cKey == GLFW_KEY_RIGHT_BRACKET ) {
while( d ) {
d->Move( -100.0 * d->DirectionGet() );
d = d->Next(); // pozostałe też
if( ( true == DebugModeFlag )
|| ( tmp->MoverParameters->Vel <= 5.0 ) ) {
// works always in debug mode, or for stopped/slow moving vehicles otherwise
if( simulation::Train == nullptr ) {
simulation::Train = new TTrain(); // jeśli niczym jeszcze nie jeździlismy
}
d = vehicle->Prev();
while( d ) {
d->Move( -100.0 * d->DirectionGet() );
d = d->Prev(); // w drugą stronę też
if( simulation::Train->Init( tmp ) ) { // przejmujemy sterowanie
simulation::Train->Dynamic()->Mechanik->TakeControl( false );
}
}
else if( cKey == GLFW_KEY_TAB ) {
while( d ) {
d->MoverParameters->V += d->DirectionGet()*2.78;
d = d->Next(); // pozostałe też
else {
SafeDelete( simulation::Train ); // i nie ma czym sterować
}
d = vehicle->Prev();
while( d ) {
d->MoverParameters->V += d->DirectionGet()*2.78;
d = d->Prev(); // w drugą stronę też
if( simulation::Train ) {
InOutKey(); // do kabiny
}
}
}
break;
}
case GLFW_KEY_F6: {
// przyspieszenie symulacji do testowania scenerii... uwaga na FPS!
if( DebugModeFlag ) {
if( Global.ctrlState ) { Global.fTimeSpeed = ( Global.shiftState ? 60.0 : 20.0 ); }
else { Global.fTimeSpeed = ( Global.shiftState ? 5.0 : 1.0 ); }
}
break;
}
case GLFW_KEY_F7: {
// debug mode functions
if( DebugModeFlag ) {
if( Global.ctrlState
&& Global.shiftState ) {
// shift + ctrl + f7 toggles between debug and regular camera
DebugCameraFlag = !DebugCameraFlag;
}
else if( Global.ctrlState ) {
// ctrl + f7 toggles static daylight
simulation::Environment.toggle_daylight();
break;
}
else if( Global.shiftState ) {
// shift + f7 is currently unused
}
else {
// f7: wireframe toggle
// TODO: pass this to renderer instead of making direct calls
Global.bWireFrame = !Global.bWireFrame;
if( true == Global.bWireFrame ) {
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
}
else {
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
}
}
}
break;
}
case GLFW_KEY_F11: {
// editor mode
if( ( false == Global.ctrlState )
&& ( false == Global.shiftState ) ) {
Application.push_mode( eu07_application::mode::editor );
}
break;
}
case GLFW_KEY_F12: {
// quick debug mode toggle
if( Global.ctrlState
&& Global.shiftState ) {
DebugModeFlag = !DebugModeFlag;
}
break;
}
case GLFW_KEY_LEFT_BRACKET:
case GLFW_KEY_RIGHT_BRACKET:
case GLFW_KEY_TAB: {
// consist movement in debug mode
if( ( true == DebugModeFlag )
&& ( false == Global.shiftState )
&& ( true == Global.ctrlState )
&& ( simulation::Train != nullptr )
&& ( simulation::Train->Dynamic()->Controller == Humandriver ) ) {
if( DebugModeFlag ) {
// przesuwanie składu o 100m
auto *vehicle { simulation::Train->Dynamic() };
TDynamicObject *d = vehicle;
if( cKey == GLFW_KEY_LEFT_BRACKET ) {
while( d ) {
d->Move( 100.0 * d->DirectionGet() );
d = d->Next(); // pozostałe też
}
d = vehicle->Prev();
while( d ) {
d->Move( 100.0 * d->DirectionGet() );
d = d->Prev(); // w drugą stronę też
}
}
else if( cKey == GLFW_KEY_RIGHT_BRACKET ) {
while( d ) {
d->Move( -100.0 * d->DirectionGet() );
d = d->Next(); // pozostałe też
}
d = vehicle->Prev();
while( d ) {
d->Move( -100.0 * d->DirectionGet() );
d = d->Prev(); // w drugą stronę też
}
}
else if( cKey == GLFW_KEY_TAB ) {
while( d ) {
d->MoverParameters->V += d->DirectionGet()*2.78;
d = d->Next(); // pozostałe też
}
d = vehicle->Prev();
while( d ) {
d->MoverParameters->V += d->DirectionGet()*2.78;
d = d->Prev(); // w drugą stronę też
}
}
}
}
break;
}
default: {
break;
}
}
return; // nie są przekazywane do pojazdu wcale
}
// places camera outside the controlled vehicle, or nearest if nothing is under control

View File

@@ -11,6 +11,7 @@ http://mozilla.org/MPL/2.0/.
#include "driveruilayer.h"
#include "globals.h"
#include "application.h"
#include "translation.h"
#include "simulation.h"
#include "train.h"
@@ -42,7 +43,26 @@ bool
driver_ui::on_key( int const Key, int const Action ) {
// TODO: pass the input first through an active ui element if there's any
// if the ui element shows no interest or we don't have one, try to interpret the input yourself:
// shared conditions
if( Key == GLFW_KEY_ESCAPE ) {
// toggle pause
if( Action != GLFW_PRESS ) { return true; } // recognized, but ignored
if( Global.iPause & 1 ) {
// jeśli pauza startowa
// odpauzowanie, gdy po wczytaniu miało nie startować
Global.iPause ^= 1;
}
else if( ( Global.iMultiplayer & 2 ) == 0 ) {
// w multiplayerze pauza nie ma sensu
Global.iPause ^= 2; // zmiana stanu zapauzowania
}
return true;
}
// if the pause is on ignore block other input
if( m_paused ) { return true; }
switch( Key ) {
case GLFW_KEY_F1:
@@ -108,10 +128,32 @@ driver_ui::on_key( int const Key, int const Action ) {
return false;
}
// potentially processes provided mouse movement. returns: true if the input was processed, false otherwise
bool
driver_ui::on_cursor_pos( double const Horizontal, double const Vertical ) {
// intercept mouse movement when the pause window is on
return m_paused;
}
// potentially processes provided mouse button. returns: true if the input was processed, false otherwise
bool
driver_ui::on_mouse_button( int const Button, int const Action ) {
// intercept mouse movement when the pause window is on
return m_paused;
}
// updates state of UI elements
void
driver_ui::update() {
auto const pausemask { 1 | 2 };
auto ispaused { ( Global.iPause & pausemask ) != 0 };
if( ( ispaused != m_paused )
&& ( false == Global.ControlPicking ) ) {
set_cursor( ispaused );
}
m_paused = ispaused;
set_tooltip( "" );
auto const *train { simulation::Train };
@@ -138,12 +180,24 @@ driver_ui::update() {
ui_layer::update();
}
void
driver_ui::set_cursor( bool const Visible ) {
if( Visible ) {
Application.set_cursor( GLFW_CURSOR_NORMAL );
Application.set_cursor_pos( Global.iWindowWidth / 2, Global.iWindowHeight / 2 );
}
else {
Application.set_cursor( GLFW_CURSOR_DISABLED );
Application.set_cursor_pos( 0, 0 );
}
}
// render() subclass details
void
driver_ui::render_() {
auto const pausemask { 1 | 2 };
if( ( Global.iPause & pausemask ) != 0 ) {
if( m_paused ) {
// pause/quit modal
auto const popupheader { locale::strings[ locale::string::driver_pause_header ].c_str() };
ImGui::OpenPopup( popupheader );
@@ -151,6 +205,7 @@ driver_ui::render_() {
auto const popupwidth{ locale::strings[ locale::string::driver_pause_header ].size() * 7 };
if( ImGui::Button( locale::strings[ locale::string::driver_pause_resume ].c_str(), ImVec2( popupwidth, 0 ) ) ) {
ImGui::CloseCurrentPopup();
auto const pausemask { 1 | 2 };
Global.iPause &= ~pausemask;
}
if( ImGui::Button( locale::strings[ locale::string::driver_pause_quit ].c_str(), ImVec2( popupwidth, 0 ) ) ) {

View File

@@ -21,12 +21,21 @@ public:
// potentially processes provided input key. returns: true if the input was processed, false otherwise
bool
on_key( int const Key, int const Action ) override;
// potentially processes provided mouse movement. returns: true if the input was processed, false otherwise
bool
on_cursor_pos( double const Horizontal, double const Vertical ) override;
// potentially processes provided mouse button. returns: true if the input was processed, false otherwise
bool
on_mouse_button( int const Button, int const Action ) override;
// updates state of UI elements
void
update() override;
private:
// methods
// sets visibility of the cursor
void
set_cursor( bool const Visible );
// render() subclass details
void
render_() override;
@@ -35,5 +44,6 @@ private:
timetable_panel m_timetablepanel { "Timetable", false };
debug_panel m_debugpanel { "Debug Data", false };
transcripts_panel m_transcriptspanel { "Transcripts", true }; // voice transcripts
bool m_paused { false };
};

View File

@@ -129,6 +129,18 @@ ui_layer::on_key( int const Key, int const Action ) {
return false;
}
bool
ui_layer::on_cursor_pos( double const Horizontal, double const Vertical ) {
return false;
}
bool
ui_layer::on_mouse_button( int const Button, int const Action ) {
return false;
}
void
ui_layer::update() {

View File

@@ -69,6 +69,14 @@ public:
virtual
bool
on_key( int const Key, int const Action );
// potentially processes provided mouse movement. returns: true if the input was processed, false otherwise
virtual
bool
on_cursor_pos( double const Horizontal, double const Vertical );
// potentially processes provided mouse button. returns: true if the input was processed, false otherwise
virtual
bool
on_mouse_button( int const Button, int const Action );
// updates state of UI elements
virtual
void