diff --git a/DynObj.cpp b/DynObj.cpp index f5d3db27..9a6c7e7f 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -1087,9 +1087,9 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist) } // ABu 29.01.05 koniec przeklejenia ************************************* -TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track, TDynamicObject *MyPointer, int &CouplNr) +TDynamicObject * TDynamicObject::ABuFindNearestObject(glm::vec3 pos, TTrack *Track, TDynamicObject *MyPointer, int &CouplNr) { - // zwraca wskaznik do obiektu znajdujacego sie na torze (Track), którego sprzęg jest najblizszy kamerze + // zwraca wskaznik do obiektu znajdujacego sie na torze (Track), którego sprzęg jest najblizszy punktowi // służy np. do łączenia i rozpinania sprzęgów // WE: Track - tor, na ktorym odbywa sie poszukiwanie // MyPointer - wskaznik do obiektu szukajacego @@ -1100,19 +1100,19 @@ TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track, TDynamicObj if( CouplNr == -2 ) { // wektor [kamera-obiekt] - poszukiwanie obiektu - if( Math3D::LengthSquared3( Global.pCamera.Pos - dynamic->vPosition ) < 100.0 ) { + if( Math3D::LengthSquared3( pos - dynamic->vPosition ) < 100.0 ) { // 10 metrów return dynamic; } } else { // jeśli (CouplNr) inne niz -2, szukamy sprzęgu - if( Math3D::LengthSquared3( Global.pCamera.Pos - dynamic->vCoulpler[ 0 ] ) < 25.0 ) { + if( Math3D::LengthSquared3( pos - dynamic->vCoulpler[ 0 ] ) < 25.0 ) { // 5 metrów CouplNr = 0; return dynamic; } - if( Math3D::LengthSquared3( Global.pCamera.Pos - dynamic->vCoulpler[ 1 ] ) < 25.0 ) { + if( Math3D::LengthSquared3( pos - dynamic->vCoulpler[ 1 ] ) < 25.0 ) { // 5 metrów CouplNr = 1; return dynamic; @@ -1123,13 +1123,13 @@ TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track, TDynamicObj return nullptr; } -TDynamicObject * TDynamicObject::ABuScanNearestObject(TTrack *Track, double ScanDir, double ScanDist, int &CouplNr) -{ // skanowanie toru w poszukiwaniu obiektu najblizszego kamerze +TDynamicObject * TDynamicObject::ABuScanNearestObject(glm::vec3 pos, TTrack *Track, double ScanDir, double ScanDist, int &CouplNr) +{ // skanowanie toru w poszukiwaniu obiektu najblizszego punktowi if (ABuGetDirection() < 0) ScanDir = -ScanDir; TDynamicObject *FoundedObj; FoundedObj = - ABuFindNearestObject(Track, this, CouplNr); // zwraca numer sprzęgu znalezionego pojazdu + ABuFindNearestObject(pos, Track, this, CouplNr); // zwraca numer sprzęgu znalezionego pojazdu if (FoundedObj == NULL) { double ActDist; // Przeskanowana odleglosc. @@ -1165,7 +1165,7 @@ TDynamicObject * TDynamicObject::ABuScanNearestObject(TTrack *Track, double Scan if (Track != NULL) { // jesli jest kolejny odcinek toru CurrDist = Track->Length(); - FoundedObj = ABuFindNearestObject(Track, this, CouplNr); + FoundedObj = ABuFindNearestObject(pos, Track, this, CouplNr); if (FoundedObj != NULL) ActDist = ScanDist; } diff --git a/DynObj.h b/DynObj.h index 82dfb96e..4b3ec592 100644 --- a/DynObj.h +++ b/DynObj.h @@ -176,7 +176,7 @@ private: // położenie pojazdu w świecie oraz parametry ruchu int iAxleFirst; // numer pierwszej osi w kierunku ruchu (oś wiążąca pojazd z torem i wyzwalająca eventy) float fAxleDist; // rozstaw wózków albo osi do liczenia proporcji zacienienia Math3D::vector3 modelRot; // obrot pudła względem świata - do przeanalizowania, czy potrzebne!!! - TDynamicObject * ABuFindNearestObject( TTrack *Track, TDynamicObject *MyPointer, int &CouplNr ); + TDynamicObject * ABuFindNearestObject(glm::vec3 pos, TTrack *Track, TDynamicObject *MyPointer, int &CouplNr ); glm::dvec3 m_future_movement; glm::dvec3 m_future_wheels_angle; @@ -498,8 +498,8 @@ private: // float EmR; // vector3 smokeoffset; - TDynamicObject * ABuScanNearestObject(TTrack *Track, double ScanDir, double ScanDist, - int &CouplNr); + TDynamicObject * ABuScanNearestObject(glm::vec3 pos, TTrack *Track, double ScanDir, double ScanDist, + int &CouplNr); TDynamicObject * GetFirstDynamic(int cpl_type, int cf = 1); void ABuSetModelShake( Math3D::vector3 mShake); diff --git a/Timer.cpp b/Timer.cpp index 1e0bfa03..befad28e 100644 --- a/Timer.cpp +++ b/Timer.cpp @@ -16,7 +16,7 @@ namespace Timer { subsystem_stopwatches subsystem; -double DeltaTime, DeltaRenderTime; +double DeltaTime = 0.0, DeltaRenderTime = 0.0; double fFPS{ 0.0f }; double fLastTime{ 0.0f }; DWORD dwFrames{ 0 }; @@ -48,7 +48,7 @@ void set_delta_override(double t) void ResetTimers() { UpdateTimers( Global.iPause != 0 ); - DeltaTime = 0.1; + DeltaTime = 0.0; DeltaRenderTime = 0.0; } diff --git a/Train.cpp b/Train.cpp index 9ea0fc2d..2d0f5b7c 100644 --- a/Train.cpp +++ b/Train.cpp @@ -719,15 +719,14 @@ void TTrain::set_paired_open_motor_connectors_button( bool const State ) { // locates nearest vehicle belonging to the consist TDynamicObject * -TTrain::find_nearest_consist_vehicle() const { +TTrain::find_nearest_consist_vehicle(bool freefly, glm::vec3 pos) const { + if (!freefly) + return DynamicObject; - if( false == FreeFlyModeFlag ) { - return DynamicObject; - } auto coupler { -2 }; // scan for vehicle, not any specific coupler - auto *vehicle{ DynamicObject->ABuScanNearestObject( DynamicObject->GetTrack(), 1, 1500, coupler ) }; + auto *vehicle{ DynamicObject->ABuScanNearestObject( pos, DynamicObject->GetTrack(), 1, 1500, coupler ) }; if( vehicle == nullptr ) - vehicle = DynamicObject->ABuScanNearestObject( DynamicObject->GetTrack(), -1, 1500, coupler ); + vehicle = DynamicObject->ABuScanNearestObject( pos, DynamicObject->GetTrack(), -1, 1500, coupler ); // TBD, TODO: perform owner test for the located vehicle return vehicle; } @@ -1029,7 +1028,7 @@ void TTrain::OnCommand_independentbrakebailoff( TTrain *Train, command_data cons } else { // car brake handling, while in walk mode - auto *vehicle { Train->find_nearest_consist_vehicle() }; + auto *vehicle { Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle != nullptr ) { if( Command.action == GLFW_PRESS ) { // press or hold @@ -1212,7 +1211,7 @@ void TTrain::OnCommand_trainbrakeoperationtoggle( TTrain *Train, command_data co if( Command.action == GLFW_PRESS ) { - auto *vehicle { Train->find_nearest_consist_vehicle() }; + auto *vehicle { Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle == nullptr ) { return; } vehicle->MoverParameters->Hamulec->SetBrakeStatus( vehicle->MoverParameters->Hamulec->GetBrakeStatus() ^ b_dmg ); @@ -1223,7 +1222,7 @@ void TTrain::OnCommand_manualbrakeincrease( TTrain *Train, command_data const &C if( Command.action != GLFW_RELEASE ) { - auto *vehicle { Train->find_nearest_consist_vehicle() }; + auto *vehicle { Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle == nullptr ) { return; } if( ( vehicle->MoverParameters->LocalBrake == TLocalBrake::ManualBrake ) @@ -1238,7 +1237,7 @@ void TTrain::OnCommand_manualbrakedecrease( TTrain *Train, command_data const &C if( Command.action != GLFW_RELEASE ) { - auto *vehicle { Train->find_nearest_consist_vehicle() }; + auto *vehicle { Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle == nullptr ) { return; } if( ( vehicle->MoverParameters->LocalBrake == TLocalBrake::ManualBrake ) @@ -1398,7 +1397,7 @@ void TTrain::OnCommand_brakeactingspeedincrease( TTrain *Train, command_data con if( Command.action == GLFW_PRESS ) { - auto *vehicle { Train->find_nearest_consist_vehicle() }; + auto *vehicle { Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle == nullptr ) { return; } if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_M ) != 0 ) { @@ -1418,7 +1417,7 @@ void TTrain::OnCommand_brakeactingspeeddecrease( TTrain *Train, command_data con if( Command.action == GLFW_PRESS ) { - auto *vehicle { Train->find_nearest_consist_vehicle() }; + auto *vehicle { Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle == nullptr ) { return; } if( vehicle->MoverParameters->BrakeDelayFlag == bdelay_G ) { @@ -1438,7 +1437,7 @@ void TTrain::OnCommand_brakeactingspeedsetcargo( TTrain *Train, command_data con if( Command.action == GLFW_PRESS ) { - auto *vehicle { Train->find_nearest_consist_vehicle() }; + auto *vehicle { Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle == nullptr ) { return; } Train->set_train_brake_speed( vehicle, bdelay_G ); @@ -1449,7 +1448,7 @@ void TTrain::OnCommand_brakeactingspeedsetpassenger( TTrain *Train, command_data if( Command.action == GLFW_PRESS ) { - auto *vehicle { Train->find_nearest_consist_vehicle() }; + auto *vehicle { Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle == nullptr ) { return; } Train->set_train_brake_speed( vehicle, bdelay_P ); @@ -1460,7 +1459,7 @@ void TTrain::OnCommand_brakeactingspeedsetrapid( TTrain *Train, command_data con if( Command.action == GLFW_PRESS ) { - auto *vehicle{ Train->find_nearest_consist_vehicle() }; + auto *vehicle{ Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle == nullptr ) { return; } Train->set_train_brake_speed( vehicle, bdelay_R ); @@ -1471,7 +1470,7 @@ void TTrain::OnCommand_brakeloadcompensationincrease( TTrain *Train, command_dat if( ( true == FreeFlyModeFlag ) && ( Command.action == GLFW_PRESS ) ) { - auto *vehicle { Train->find_nearest_consist_vehicle() }; + auto *vehicle { Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle != nullptr ) { vehicle->MoverParameters->IncBrakeMult(); } @@ -1482,7 +1481,7 @@ void TTrain::OnCommand_brakeloadcompensationdecrease( TTrain *Train, command_dat if( ( true == FreeFlyModeFlag ) && ( Command.action == GLFW_PRESS ) ) { - auto *vehicle { Train->find_nearest_consist_vehicle() }; + auto *vehicle { Train->find_nearest_consist_vehicle(Command.freefly, Command.location) }; if( vehicle != nullptr ) { vehicle->MoverParameters->DecBrakeMult(); } @@ -4485,13 +4484,13 @@ void TTrain::OnCommand_doorcloseall( TTrain *Train, command_data const &Command void TTrain::OnCommand_carcouplingincrease( TTrain *Train, command_data const &Command ) { - if( ( true == FreeFlyModeFlag ) + if( ( true == Command.freefly ) && ( Command.action == GLFW_PRESS ) ) { // tryb freefly, press only auto coupler { -1 }; - auto *vehicle { Train->DynamicObject->ABuScanNearestObject( Train->DynamicObject->GetTrack(), 1, 1500, coupler ) }; + auto *vehicle { Train->DynamicObject->ABuScanNearestObject( Command.location, Train->DynamicObject->GetTrack(), 1, 1500, coupler ) }; if( vehicle == nullptr ) - vehicle = Train->DynamicObject->ABuScanNearestObject( Train->DynamicObject->GetTrack(), -1, 1500, coupler ); + vehicle = Train->DynamicObject->ABuScanNearestObject( Command.location, Train->DynamicObject->GetTrack(), -1, 1500, coupler ); if( ( coupler != -1 ) && ( vehicle != nullptr ) ) { @@ -4507,13 +4506,13 @@ void TTrain::OnCommand_carcouplingincrease( TTrain *Train, command_data const &C void TTrain::OnCommand_carcouplingdisconnect( TTrain *Train, command_data const &Command ) { - if( ( true == FreeFlyModeFlag ) + if( ( true == Command.freefly ) && ( Command.action == GLFW_PRESS ) ) { // tryb freefly, press only auto coupler { -1 }; - auto *vehicle { Train->DynamicObject->ABuScanNearestObject( Train->DynamicObject->GetTrack(), 1, 1500, coupler ) }; + auto *vehicle { Train->DynamicObject->ABuScanNearestObject( Command.location, Train->DynamicObject->GetTrack(), 1, 1500, coupler ) }; if( vehicle == nullptr ) - vehicle = Train->DynamicObject->ABuScanNearestObject( Train->DynamicObject->GetTrack(), -1, 1500, coupler ); + vehicle = Train->DynamicObject->ABuScanNearestObject( Command.location, Train->DynamicObject->GetTrack(), -1, 1500, coupler ); if( ( coupler != -1 ) && ( vehicle != nullptr ) ) { diff --git a/Train.h b/Train.h index 83d5d0a1..80a29bb0 100644 --- a/Train.h +++ b/Train.h @@ -136,7 +136,7 @@ class TTrain // helper, returns true for EMU with oerlikon brake bool is_eztoer() const; // locates nearest vehicle belonging to the consist - TDynamicObject *find_nearest_consist_vehicle() const; + TDynamicObject *find_nearest_consist_vehicle(bool freefly, glm::vec3 pos) const; // mover master controller to specified position void set_master_controller( double const Position ); // moves train brake lever to specified position, potentially emits switch sound if conditions are met diff --git a/application.cpp b/application.cpp index 26008dd9..b97dbb0f 100644 --- a/application.cpp +++ b/application.cpp @@ -138,9 +138,6 @@ eu07_application::init( int Argc, char *Argv[] ) { return result; } - //Global.random_seed = std::time(nullptr); - //Global.random_engine.seed(Global.random_seed); - if (!init_network()) return -1; diff --git a/command.cpp b/command.cpp index 5a38670c..c9c07487 100644 --- a/command.cpp +++ b/command.cpp @@ -226,6 +226,7 @@ commanddescription_sequence Commands_descriptions = { { "vehiclemoveforwards", command_target::vehicle, command_mode::oneoff }, { "vehiclemovebackwards", command_target::vehicle, command_mode::oneoff }, { "vehicleboost", command_target::vehicle, command_mode::oneoff }, + { "debugtoggle", command_target::simulation, command_mode::oneoff }, }; } // simulation @@ -238,7 +239,7 @@ void command_queue::update() double delta = Timer::GetDeltaTime(); for (auto c : m_active_continuous) { - command_data data({c.first, GLFW_REPEAT, 0.0, 0.0, delta}); + command_data data({c.first, GLFW_REPEAT, 0.0, 0.0, delta, false, glm::vec3()}); // todo: improve auto lookup = m_commands.emplace( c.second, commanddata_sequence() ); // recipient stack was either located or created, so we can add to it quite safely lookup.first->second.emplace_back( data ); @@ -365,7 +366,7 @@ command_relay::post( user_command const Command, double const Param1, double con } uint32_t combined_recipient = static_cast( command.target ) | Recipient; - command_data commanddata({Command, Action, Param1, Param2, Timer::GetDeltaTime() }); + command_data commanddata({Command, Action, Param1, Param2, Timer::GetDeltaTime(), FreeFlyModeFlag, Global.pCamera.Pos }); simulation::Commands->push(commanddata, combined_recipient); } diff --git a/command.h b/command.h index 2f788528..85cfbc12 100644 --- a/command.h +++ b/command.h @@ -220,6 +220,7 @@ enum class user_command { vehiclemoveforwards, vehiclemovebackwards, vehicleboost, + debugtoggle, none = -1 }; @@ -257,6 +258,9 @@ struct command_data { double param1; double param2; double time_delta; + + bool freefly; + glm::vec3 location; }; // command_queues: collects and holds commands from input sources, for processing by their intended recipients diff --git a/driverkeyboardinput.cpp b/driverkeyboardinput.cpp index 4bb1ccd4..78f3bd8b 100644 --- a/driverkeyboardinput.cpp +++ b/driverkeyboardinput.cpp @@ -227,6 +227,7 @@ driverkeyboard_input::default_bindings() { { user_command::vehiclemoveforwards, GLFW_KEY_LEFT_BRACKET | keymodifier::control }, { user_command::vehiclemovebackwards, GLFW_KEY_RIGHT_BRACKET | keymodifier::control }, { user_command::vehicleboost, GLFW_KEY_TAB | keymodifier::control }, + { user_command::debugtoggle, GLFW_KEY_F12 | keymodifier::control | keymodifier::shift }, }; } diff --git a/drivermode.cpp b/drivermode.cpp index 092c8e2b..9790c220 100644 --- a/drivermode.cpp +++ b/drivermode.cpp @@ -107,13 +107,6 @@ driver_mode::update() { if (deltatime != 0.0) { - static uint32_t fcount = 0; - fcount ++; - if (fcount > 500) { - fcount = 0; - WriteLog(std::to_string(Random(1.0, 100.0))); - } - // jak pauza, to nie ma po co tego przeliczać simulation::Time.update( deltatime ); @@ -785,15 +778,6 @@ driver_mode::OnKeyDown(int cKey) { } break; } - case GLFW_KEY_F12: { - // quick debug mode toggle - if( Global.ctrlState - && Global.shiftState ) { - DebugModeFlag = !DebugModeFlag; - } - break; - } - default: { break; } diff --git a/network/message.cpp b/network/message.cpp index 1b31e607..2893a813 100644 --- a/network/message.cpp +++ b/network/message.cpp @@ -38,6 +38,9 @@ void::network::command_message::serialize(std::ostream &stream) sn_utils::ls_float64(stream, data.param1); sn_utils::ls_float64(stream, data.param2); sn_utils::ls_float64(stream, data.time_delta); + + sn_utils::s_bool(stream, data.freefly); + sn_utils::s_vec3(stream, data.location); } } } @@ -58,6 +61,9 @@ void network::command_message::deserialize(std::istream &stream) data.param2 = sn_utils::ld_float64(stream); data.time_delta = sn_utils::ld_float64(stream); + data.freefly = sn_utils::d_bool(stream); + data.location = sn_utils::d_vec3(stream); + sequence.emplace_back(data); } @@ -72,7 +78,7 @@ size_t network::command_message::get_size() for (auto const &kv : commands) { cmd_size += 8; for (command_data const &data : kv.second) { - cmd_size += 8 + 3 * 8; + cmd_size += 8 + 3 * 8 + 2 + 4 * 3; } } diff --git a/network/network.cpp b/network/network.cpp index 172d32a8..76b6bae0 100644 --- a/network/network.cpp +++ b/network/network.cpp @@ -35,8 +35,10 @@ void network::connection::message_received(std::shared_ptr &msg) else if (msg->type == message::CONNECT_ACCEPT) { auto cmd = std::dynamic_pointer_cast(msg); + WriteLog("accept received", logtype::net); - //Global.random_engine.seed(cmd->seed); + Global.random_seed = cmd->seed; + Global.random_engine.seed(Global.random_seed); } else if (msg->type == message::CLIENT_COMMAND) { diff --git a/scenarioloadermode.cpp b/scenarioloadermode.cpp index 89bec3d9..625499ff 100644 --- a/scenarioloadermode.cpp +++ b/scenarioloadermode.cpp @@ -43,6 +43,8 @@ scenarioloader_mode::update() { if( true == simulation::State.deserialize( Global.SceneryFile ) ) { WriteLog( "Scenario loading time: " + std::to_string( std::chrono::duration_cast( ( std::chrono::system_clock::now() - timestart ) ).count() ) + " seconds" ); // TODO: implement and use next mode cue + Global.random_seed = std::random_device{}(); + Global.random_engine.seed(Global.random_seed); Application.pop_mode(); Application.push_mode( eu07_application::mode::driver ); } diff --git a/simulation.cpp b/simulation.cpp index badec89f..47734958 100644 --- a/simulation.cpp +++ b/simulation.cpp @@ -81,6 +81,9 @@ void state_manager::process_commands() { if (commanddata.action == GLFW_RELEASE) continue; + if (commanddata.command == user_command::debugtoggle) + DebugModeFlag = !DebugModeFlag; + if (DebugModeFlag) { if (commanddata.command == user_command::timejump) { Time.update(commanddata.param1); diff --git a/sn_utils.cpp b/sn_utils.cpp index 9906d9c1..3831d9c5 100644 --- a/sn_utils.cpp +++ b/sn_utils.cpp @@ -88,6 +88,14 @@ glm::dvec3 sn_utils::d_dvec3(std::istream& s) ld_float64(s) }; } +glm::vec3 sn_utils::d_vec3( std::istream& s) +{ + return { + ld_float32(s), + ld_float32(s), + ld_float32(s) }; +} + glm::vec4 sn_utils::d_vec4( std::istream& s) { return { @@ -173,6 +181,13 @@ void sn_utils::s_dvec3(std::ostream &s, glm::dvec3 const &v) ls_float64(s, v.z); } +void sn_utils::s_vec3(std::ostream &s, glm::vec3 const &v) +{ + ls_float32(s, v.x); + ls_float32(s, v.y); + ls_float32(s, v.z); +} + void sn_utils::s_vec4(std::ostream &s, glm::vec4 const &v) { ls_float32(s, v.x); diff --git a/sn_utils.h b/sn_utils.h index e11d1b31..2fd2d7df 100644 --- a/sn_utils.h +++ b/sn_utils.h @@ -15,6 +15,7 @@ public: static std::string d_str(std::istream&); static bool d_bool(std::istream&); static glm::dvec3 d_dvec3(std::istream&); + static glm::vec3 d_vec3(std::istream&); static glm::vec4 d_vec4(std::istream&); static void ls_uint16(std::ostream&, uint16_t); @@ -25,5 +26,6 @@ public: static void s_str(std::ostream&, std::string); static void s_bool(std::ostream&, bool); static void s_dvec3(std::ostream&, glm::dvec3 const &); + static void s_vec3(std::ostream&, glm::vec3 const &); static void s_vec4(std::ostream&, glm::vec4 const &); -}; \ No newline at end of file +}; diff --git a/utilities.cpp b/utilities.cpp index f767510f..7bb737a4 100644 --- a/utilities.cpp +++ b/utilities.cpp @@ -105,14 +105,14 @@ bool ClearFlag( int &Flag, int const Value ) { double Random(double a, double b) { - std::uniform_real_distribution<> dis(a, b); - return dis(Global.random_engine); + uint32_t val = Global.random_engine(); + return interpolate(a, b, (double)val / Global.random_engine.max()); } double LocalRandom(double a, double b) { - std::uniform_real_distribution<> dis(a, b); - return dis(Global.local_random_engine); + uint32_t val = Global.local_random_engine(); + return interpolate(a, b, (double)val / Global.random_engine.max()); } bool FuzzyLogic(double Test, double Threshold, double Probability)