This commit is contained in:
milek7
2019-01-13 14:19:21 +01:00
parent 3db9efd3f7
commit cb106fb135
17 changed files with 82 additions and 66 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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 ) ) {

View File

@@ -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

View File

@@ -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;

View File

@@ -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<uint32_t>( 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);
}

View File

@@ -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

View File

@@ -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 },
};
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -35,8 +35,10 @@ void network::connection::message_received(std::shared_ptr<message> &msg)
else if (msg->type == message::CONNECT_ACCEPT)
{
auto cmd = std::dynamic_pointer_cast<accept_message>(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)
{

View File

@@ -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::seconds>( ( 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 );
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 &);
};
};

View File

@@ -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)