17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-17 01:39:20 +02:00

feat(editor): edit session (-edit) and scenery layers

This commit is contained in:
2026-10-02 21:29:18 +02:00
parent 69f5f551a1
commit 73f2f68aa0
19 changed files with 560 additions and 3 deletions

View File

@@ -24,6 +24,7 @@ http://mozilla.org/MPL/2.0/.
#include "rendering/lightarray.h"
#include "rendering/particles.h"
#include "scene/scene.h"
#include "scene/scenelayers.h"
#include "vehicle/Train.h"
#include "application/application.h"
#include "utilities/Logs.h"
@@ -493,6 +494,7 @@ TEventLauncher * state_manager::create_eventlauncher(const std::string &src, con
}
void state_manager::delete_model(TAnimModel *model) {
scene::Layers.count(model->layer(), scene::layer_item::model, -1);
Region->erase(model);
Instances.purge(model);
}

View File

@@ -16,6 +16,7 @@ http://mozilla.org/MPL/2.0/.
#include "simulation/simulationsounds.h"
#include "simulation/simulationenvironment.h"
#include "scene/scenenodegroups.h"
#include "scene/scenelayers.h"
#include "rendering/particles.h"
#include "world/Event.h"
#include "world/MemCell.h"
@@ -73,6 +74,14 @@ state_serializer::deserialize_begin( std::string const &Scenariofile ) {
}
scene::Groups.create();
scene::Layers.clear();
if( true == Global.editor_session ) {
// scenery opened for editing: keep track of which scenery file defines each node.
// the scenario file itself is the root layer, and the default target for nodes created in the editor
state->input.sceneryLayers = true;
scene::Layers.active( scene::Layers.open( Scenariofile ) );
}
if( false == state->input.ok() )
throw invalid_scenery_exception();
@@ -155,6 +164,7 @@ state_serializer::deserialize_continue(std::shared_ptr<deserializer_state> state
}
scene::Groups.close();
scene::Layers.close();
scene::Groups.update_map();
Region->create_map_geometry();
@@ -345,6 +355,7 @@ state_serializer::deserialize_event( cParser &Input, scene::scratch_data &Scratc
if( true == simulation::Events.insert( event ) ) {
scene::Groups.insert( scene::Groups.handle(), event );
scene::Layers.count( scene::Layers.handle(), scene::layer_item::event );
}
else {
delete event;
@@ -436,6 +447,7 @@ state_serializer::deserialize_node( cParser &Input, scene::scratch_data &Scratch
>> nodedata.name
>> nodedata.type;
if( nodedata.name == "none" ) { nodedata.name.clear(); }
nodedata.layer = scene::Layers.handle();
// type-based deserialization. not elegant but it'll do
if( nodedata.type == "dynamic" ) {
@@ -643,6 +655,34 @@ state_serializer::deserialize_node( cParser &Input, scene::scratch_data &Scratch
simulation::Region->insert( sound );
}
if( nodedata.layer != null_handle ) {
// scenery opened for editing: keep count of what the scenery file contains
// NOTE: node types which failed to load bail out earlier and aren't counted
static std::unordered_map<std::string, scene::layer_item> const itemtypes {
{ "dynamic", scene::layer_item::vehicle },
{ "track", scene::layer_item::track },
{ "traction", scene::layer_item::traction },
{ "tractionpowersource", scene::layer_item::powersource },
{ "model", scene::layer_item::model },
{ "triangles", scene::layer_item::shape },
{ "triangle_strip", scene::layer_item::shape },
{ "triangle_fan", scene::layer_item::shape },
{ "lines", scene::layer_item::lines },
{ "line_strip", scene::layer_item::lines },
{ "line_loop", scene::layer_item::lines },
{ "memcell", scene::layer_item::memcell },
{ "eventlauncher", scene::layer_item::launcher },
{ "sound", scene::layer_item::sound } };
auto const lookup { itemtypes.find( nodedata.type ) };
if( lookup != itemtypes.end() ) {
scene::Layers.count(
nodedata.layer,
// models with negative minimum range are 3d terrain, converted to shapes
( lookup->second == scene::layer_item::model && nodedata.range_min < 0.0 ) ?
scene::layer_item::shape :
lookup->second );
}
}
}
void
@@ -1328,6 +1368,7 @@ TAnimModel *state_serializer::create_model(const std::string &src, const std::st
parser.getTokens(2); // name, type
nodedata.name = name;
nodedata.type = "model";
nodedata.layer = scene::Layers.active(); // null_handle unless the scenery was opened for editing
scene::scratch_data scratch;
@@ -1340,6 +1381,7 @@ TAnimModel *state_serializer::create_model(const std::string &src, const std::st
cloned->location(position);
simulation::Instances.insert(cloned);
simulation::Region->insert(cloned);
scene::Layers.count(cloned->layer(), scene::layer_item::model);
return cloned;
}