diff --git a/modules/terraman/world/terrain_chunk.cpp b/modules/terraman/world/terrain_chunk.cpp index bd60744db..6ea0f4b4f 100644 --- a/modules/terraman/world/terrain_chunk.cpp +++ b/modules/terraman/world/terrain_chunk.cpp @@ -915,10 +915,11 @@ void TerrainChunk::voxel_structures_set(const Vector &structures) { //Scenes -void TerrainChunk::scene_add(const Ref &p_scene, const Transform &p_transform, const Node *p_node, const bool p_original) { +void TerrainChunk::scene_add(const Ref &p_scene, const Transform &p_transform, const Node *p_node, const bool p_original, const String &p_name) { ERR_FAIL_COND(!p_scene.is_valid()); SceneDataStore s; + s.name = p_name; s.original = p_original; s.transform = p_transform; s.scene = p_scene; @@ -976,6 +977,19 @@ void TerrainChunk::scene_set_is_original(const int index, const bool p_original) emit_changed(); } +String TerrainChunk::scene_get_name(const int index) { + ERR_FAIL_INDEX_V(index, _scenes.size(), String()); + + return _scenes.get(index).name; +} +void TerrainChunk::scene_set_name(const int index, const String &p_name) { + ERR_FAIL_INDEX(index, _scenes.size()); + + _scenes.write[index].name = p_name; + + emit_changed(); +} + Node *TerrainChunk::scene_get_node(const int index) { ERR_FAIL_INDEX_V(index, _scenes.size(), 0); @@ -1081,6 +1095,7 @@ Array TerrainChunk::scenes_get() { scene_data.push_back(_scenes[i].original); scene_data.push_back(_scenes[i].transform); scene_data.push_back(_scenes[i].scene.get_ref_ptr()); + scene_data.push_back(_scenes[i].name); ret.push_back(scene_data); } @@ -1093,13 +1108,17 @@ void TerrainChunk::scenes_set(const Array &p_scenes) { for (int i = 0; i < p_scenes.size(); ++i) { Array scene_data = p_scenes[i]; - ERR_CONTINUE(scene_data.size() != 3); + ERR_CONTINUE(scene_data.size() != 3 || scene_data.size() != 4); bool original = scene_data[0]; Transform transform = scene_data[1]; Ref scene = Ref(scene_data[2]); + String name; + if (scene_data.size() > 3) { + name = scene_data[3]; + } - scene_add(scene, transform, NULL, original); + scene_add(scene, transform, NULL, original, name); } } @@ -2196,7 +2215,7 @@ void TerrainChunk::_bind_methods() { //Scenes - ClassDB::bind_method(D_METHOD("scene_add", "scene", "transform", "node", "original"), &TerrainChunk::scene_add, DEFVAL(Transform()), DEFVAL(Variant()), DEFVAL(true)); + ClassDB::bind_method(D_METHOD("scene_add", "scene", "transform", "node", "original", "name"), &TerrainChunk::scene_add, DEFVAL(Transform()), DEFVAL(Variant()), DEFVAL(true), DEFVAL(String())); ClassDB::bind_method(D_METHOD("scene_get", "index"), &TerrainChunk::scene_get); ClassDB::bind_method(D_METHOD("scene_set", "index", "scene"), &TerrainChunk::scene_set); @@ -2207,6 +2226,9 @@ void TerrainChunk::_bind_methods() { ClassDB::bind_method(D_METHOD("scene_get_is_original", "index"), &TerrainChunk::scene_get_is_original); ClassDB::bind_method(D_METHOD("scene_set_is_original", "index", "original"), &TerrainChunk::scene_set_is_original); + ClassDB::bind_method(D_METHOD("scene_get_name", "index"), &TerrainChunk::scene_get_name); + ClassDB::bind_method(D_METHOD("scene_set_name", "index", "name"), &TerrainChunk::scene_set_name); + ClassDB::bind_method(D_METHOD("scene_get_node", "index"), &TerrainChunk::scene_get_node); ClassDB::bind_method(D_METHOD("scene_set_node", "index", "node"), &TerrainChunk::scene_set_node); diff --git a/modules/terraman/world/terrain_chunk.h b/modules/terraman/world/terrain_chunk.h index 853f0adf0..80ffe9f98 100644 --- a/modules/terraman/world/terrain_chunk.h +++ b/modules/terraman/world/terrain_chunk.h @@ -248,7 +248,7 @@ public: void voxel_structures_set(const Vector &structures); //Scenes - void scene_add(const Ref &p_scene, const Transform &p_transform = Transform(), const Node *p_node = NULL, const bool p_original = true); + void scene_add(const Ref &p_scene, const Transform &p_transform = Transform(), const Node *p_node = NULL, const bool p_original = true, const String &p_name = String()); Ref scene_get(const int index); void scene_set(const int index, const Ref &p_scene); @@ -259,6 +259,9 @@ public: bool scene_get_is_original(const int index); void scene_set_is_original(const int index, const bool p_original); + String scene_get_name(const int index); + void scene_set_name(const int index, const String &p_name); + Node *scene_get_node(const int index); void scene_set_node(const int index, const Node *p_node); @@ -395,6 +398,7 @@ protected: protected: struct SceneDataStore { + String name; bool original; Transform transform; Ref scene; diff --git a/modules/terraman/world/terrain_world.cpp b/modules/terraman/world/terrain_world.cpp index a9cf81d6a..176946f6d 100644 --- a/modules/terraman/world/terrain_world.cpp +++ b/modules/terraman/world/terrain_world.cpp @@ -613,14 +613,14 @@ int TerrainWorld::generation_get_size() const { return _generating.size(); } -void TerrainWorld::scene_add(const Ref &p_scene, const Transform &p_transform, const Node *p_node, const bool p_original) { +void TerrainWorld::scene_add(const Ref &p_scene, const Transform &p_transform, const Node *p_node, const bool p_original, const String &p_name) { ERR_FAIL_COND(!p_scene.is_valid()); Vector3 wp; wp = p_transform.xform(wp); Ref chunk = get_or_create_chunk_at_world_position(wp); - chunk->scene_add(p_scene, p_transform, p_node, p_original); + chunk->scene_add(p_scene, p_transform, p_node, p_original, p_name); } #ifdef MODULE_PROPS_ENABLED @@ -1619,7 +1619,7 @@ void TerrainWorld::_bind_methods() { ClassDB::bind_method(D_METHOD("is_position_walkable", "position"), &TerrainWorld::is_position_walkable); ClassDB::bind_method(D_METHOD("on_chunk_mesh_generation_finished", "chunk"), &TerrainWorld::on_chunk_mesh_generation_finished); - ClassDB::bind_method(D_METHOD("scene_add", "scene", "transform", "node", "original"), &TerrainWorld::scene_add, DEFVAL(Transform()), DEFVAL(Variant()), DEFVAL(true)); + ClassDB::bind_method(D_METHOD("scene_add", "scene", "transform", "node", "original", "name"), &TerrainWorld::scene_add, DEFVAL(Transform()), DEFVAL(Variant()), DEFVAL(true), DEFVAL(String())); #ifdef MODULE_PROPS_ENABLED ClassDB::bind_method(D_METHOD("prop_add", "transform", "prop", "apply_voxel_scale", "original", "name"), &TerrainWorld::prop_add, DEFVAL(true), DEFVAL(true), DEFVAL(String())); diff --git a/modules/terraman/world/terrain_world.h b/modules/terraman/world/terrain_world.h index 75b783ddc..9c0810a31 100644 --- a/modules/terraman/world/terrain_world.h +++ b/modules/terraman/world/terrain_world.h @@ -175,7 +175,7 @@ public: void generation_remove_index(const int index); int generation_get_size() const; - void scene_add(const Ref &p_scene, const Transform &p_transform = Transform(), const Node *p_node = NULL, const bool p_original = true); + void scene_add(const Ref &p_scene, const Transform &p_transform = Transform(), const Node *p_node = NULL, const bool p_original = true, const String &p_name = String()); #ifdef MODULE_PROPS_ENABLED void prop_add(Transform transform, const Ref &prop, const bool apply_voxel_scale = true, const bool p_original = true, const String &p_name = String());