mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-18 03:09:18 +02:00
build 190227. joint master controlled cab control, minor bug fixes
This commit is contained in:
@@ -21,6 +21,8 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "uilayer.h"
|
||||
#include "Logs.h"
|
||||
|
||||
auto const EU07_CONTROLLER_MOUSESLIDERSIZE{ 0.65 };
|
||||
|
||||
void
|
||||
mouse_slider::bind( user_command const &Command ) {
|
||||
|
||||
@@ -29,6 +31,7 @@ mouse_slider::bind( user_command const &Command ) {
|
||||
auto const *train { simulation::Train };
|
||||
TMoverParameters const *vehicle { nullptr };
|
||||
switch( m_command ) {
|
||||
case user_command::jointcontrollerset:
|
||||
case user_command::mastercontrollerset:
|
||||
case user_command::secondcontrollerset: {
|
||||
vehicle = ( train ? train->Controlled() : nullptr );
|
||||
@@ -47,6 +50,29 @@ mouse_slider::bind( user_command const &Command ) {
|
||||
|
||||
// calculate initial value and accepted range
|
||||
switch( m_command ) {
|
||||
case user_command::jointcontrollerset: {
|
||||
// NOTE: special case, merges two separate controls
|
||||
auto const *occupied { train ? train->Occupied() : nullptr };
|
||||
if( occupied == nullptr ) { return; }
|
||||
|
||||
auto const powerrange { static_cast<double>(
|
||||
vehicle->CoupledCtrl ?
|
||||
vehicle->MainCtrlPosNo + vehicle->ScndCtrlPosNo :
|
||||
vehicle->MainCtrlPosNo ) };
|
||||
// for simplicity upper half of the range controls power, lower controls brakes
|
||||
auto const brakerangemultiplier { powerrange / LocalBrakePosNo };
|
||||
|
||||
m_valuerange = 1.0;
|
||||
m_value =
|
||||
0.5
|
||||
+ 0.5 * ( vehicle->CoupledCtrl ?
|
||||
vehicle->MainCtrlPos + vehicle->ScndCtrlPos :
|
||||
vehicle->MainCtrlPos ) / powerrange
|
||||
- 0.5 * occupied->LocalBrakePosA;
|
||||
m_analogue = true;
|
||||
m_invertrange = false;
|
||||
break;
|
||||
}
|
||||
case user_command::mastercontrollerset: {
|
||||
m_valuerange = (
|
||||
vehicle->CoupledCtrl ?
|
||||
@@ -57,24 +83,28 @@ mouse_slider::bind( user_command const &Command ) {
|
||||
vehicle->MainCtrlPos + vehicle->ScndCtrlPos :
|
||||
vehicle->MainCtrlPos );
|
||||
m_analogue = false;
|
||||
m_invertrange = false;
|
||||
break;
|
||||
}
|
||||
case user_command::secondcontrollerset: {
|
||||
m_valuerange = vehicle->ScndCtrlPosNo;
|
||||
m_value = vehicle->ScndCtrlPos;
|
||||
m_analogue = false;
|
||||
m_invertrange = true;
|
||||
break;
|
||||
}
|
||||
case user_command::trainbrakeset: {
|
||||
m_valuerange = 1.0;
|
||||
m_value = ( vehicle->fBrakeCtrlPos - vehicle->Handle->GetPos( bh_MIN ) ) / ( vehicle->Handle->GetPos( bh_MAX ) - vehicle->Handle->GetPos( bh_MIN ) );
|
||||
m_analogue = true;
|
||||
m_invertrange = true;
|
||||
break;
|
||||
}
|
||||
case user_command::independentbrakeset: {
|
||||
m_valuerange = 1.0;
|
||||
m_value = vehicle->LocalBrakePosA;
|
||||
m_analogue = true;
|
||||
m_invertrange = true;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
@@ -86,14 +116,18 @@ mouse_slider::bind( user_command const &Command ) {
|
||||
Application.get_cursor_pos( m_cursorposition.x, m_cursorposition.y );
|
||||
Application.set_cursor( GLFW_CURSOR_DISABLED );
|
||||
|
||||
auto const controlsize { Global.iWindowHeight * 0.75 };
|
||||
auto const controlsize { Global.iWindowHeight * EU07_CONTROLLER_MOUSESLIDERSIZE };
|
||||
auto const controledge { Global.iWindowHeight * 0.5 + controlsize * 0.5 };
|
||||
auto const stepsize { controlsize / m_valuerange };
|
||||
|
||||
if( m_invertrange ) {
|
||||
m_value = ( m_analogue ? 1.0 : m_valuerange ) - m_value;
|
||||
}
|
||||
|
||||
Application.set_cursor_pos(
|
||||
Global.iWindowWidth * 0.5,
|
||||
( m_analogue ?
|
||||
controledge - ( 1.0 - m_value ) * controlsize :
|
||||
controledge - m_value * controlsize :
|
||||
controledge - m_value * stepsize - 0.5 * stepsize ) );
|
||||
}
|
||||
|
||||
@@ -108,15 +142,17 @@ mouse_slider::release() {
|
||||
void
|
||||
mouse_slider::on_move( double const Mousex, double const Mousey ) {
|
||||
|
||||
auto const controlsize { Global.iWindowHeight * 0.75 };
|
||||
auto const controlsize { Global.iWindowHeight * EU07_CONTROLLER_MOUSESLIDERSIZE };
|
||||
auto const controledge { Global.iWindowHeight * 0.5 + controlsize * 0.5 };
|
||||
auto const stepsize { controlsize / m_valuerange };
|
||||
|
||||
auto mousey = clamp( Mousey, controledge - controlsize, controledge );
|
||||
m_value = (
|
||||
m_analogue ?
|
||||
1.0 - ( ( controledge - mousey ) / controlsize ) :
|
||||
( controledge - mousey ) / controlsize :
|
||||
std::floor( ( controledge - mousey ) / stepsize ) );
|
||||
if( m_invertrange ) {
|
||||
m_value = ( m_analogue ? 1.0 : m_valuerange ) - m_value; }
|
||||
}
|
||||
|
||||
|
||||
@@ -370,6 +406,7 @@ drivermouse_input::button( int const Button, int const Action ) {
|
||||
m_varyingpollrate = true;
|
||||
break;
|
||||
}
|
||||
case user_command::jointcontrollerset:
|
||||
case user_command::mastercontrollerset:
|
||||
case user_command::secondcontrollerset:
|
||||
case user_command::trainbrakeset:
|
||||
@@ -445,6 +482,9 @@ void
|
||||
drivermouse_input::default_bindings() {
|
||||
|
||||
m_buttonbindings = {
|
||||
{ "jointctrl:", {
|
||||
user_command::jointcontrollerset,
|
||||
user_command::none } },
|
||||
{ "mainctrl:", {
|
||||
user_command::mastercontrollerset,
|
||||
user_command::none } },
|
||||
|
||||
Reference in New Issue
Block a user