diff --git a/scene.h b/scene.h index e3143094..82d7d1c6 100644 --- a/scene.h +++ b/scene.h @@ -37,6 +37,7 @@ struct scratch_data { struct binary_data { bool terrain{ false }; + bool terrain_included{false}; } binary; struct location_data { @@ -59,6 +60,8 @@ struct scratch_data { } trainset; std::string name; + std::string terrain_name; + bool initialized { false }; bool time_initialized { false }; }; diff --git a/simulationstateserializer.cpp b/simulationstateserializer.cpp index 7b9dde5e..7e651c69 100644 --- a/simulationstateserializer.cpp +++ b/simulationstateserializer.cpp @@ -58,12 +58,12 @@ state_serializer::deserialize_begin( std::string const &Scenariofile ) { if (false != state->scratchpad.binary.terrain) { Global.file_binary_terrain_state = true; - WriteLog("SBT present"); + WriteLog("Default SBT present"); } else { Global.file_binary_terrain_state = false; - WriteLog("SBT absent"); + WriteLog("Default SBT absent"); } scene::Groups.create(); @@ -98,6 +98,7 @@ state_serializer::deserialize_begin( std::string const &Scenariofile ) { { "test", &state_serializer::deserialize_test }, { "time", &state_serializer::deserialize_time }, { "trainset", &state_serializer::deserialize_trainset }, + { "terrain", &state_serializer::deserialize_terrain }, { "endtrainset", &state_serializer::deserialize_endtrainset } }; for( auto &function : functionlist ) { @@ -361,7 +362,11 @@ state_serializer::deserialize_firstinit( cParser &Input, scene::scratch_data &Sc if( true == Scratchpad.binary.terrain ) { // at this stage it should be safe to import terrain from the binary scene file // TBD: postpone loading furter and only load required blocks during the simulation? - Region->deserialize( Scratchpad.name ); + if (false == Scratchpad.binary.terrain_included) + { + Region->deserialize(Scratchpad.name); + } + } simulation::Paths.InitTracks(); @@ -734,6 +739,27 @@ state_serializer::deserialize_trainset( cParser &Input, scene::scratch_data &Scr >> Scratchpad.trainset.velocity; } +void +state_serializer::deserialize_terrain(cParser &Input, scene::scratch_data &Scratchpad) +{ + std::string line; + Input.getTokens(1); + Input >> line; + if ((true == Global.file_binary_terrain) && (true == ends_with(line, ".sbt"))) + { + Scratchpad.binary.terrain = Region->is_scene(line); + Global.file_binary_terrain_state = true; + Scratchpad.binary.terrain_included = true; + Scratchpad.terrain_name = line; + WriteLog("Included SBT file: " + line); + Region->deserialize(Scratchpad.terrain_name); + + } + + skip_until(Input, "endterrain"); + +} + void state_serializer::deserialize_endtrainset( cParser &Input, scene::scratch_data &Scratchpad ) { diff --git a/simulationstateserializer.h b/simulationstateserializer.h index a2043e41..67ba7ad8 100644 --- a/simulationstateserializer.h +++ b/simulationstateserializer.h @@ -70,6 +70,7 @@ private: void deserialize_test( cParser &Input, scene::scratch_data &Scratchpad ); void deserialize_time( cParser &Input, scene::scratch_data &Scratchpad ); void deserialize_trainset( cParser &Input, scene::scratch_data &Scratchpad ); + void deserialize_terrain( cParser &Input, scene::scratch_data &Scratchpad ); void deserialize_endtrainset( cParser &Input, scene::scratch_data &Scratchpad ); TTrack * deserialize_path( cParser &Input, scene::scratch_data &Scratchpad, scene::node_data const &Nodedata ); TTraction * deserialize_traction( cParser &Input, scene::scratch_data &Scratchpad, scene::node_data const &Nodedata );