diff --git a/modules/terraman/world/terrain_chunk.cpp b/modules/terraman/world/terrain_chunk.cpp index 493258136..17e02dc81 100644 --- a/modules/terraman/world/terrain_chunk.cpp +++ b/modules/terraman/world/terrain_chunk.cpp @@ -752,11 +752,55 @@ void TerrainChunk::lights_clear() { Vector TerrainChunk::lights_get() { VARIANT_ARRAY_GET(_lights); } -void TerrainChunk::lights_set(const Vector &chunks) { +void TerrainChunk::lights_set(const Vector &p_lights) { lights_clear(); - for (int i = 0; i < chunks.size(); ++i) { - Ref light = Ref(chunks[i]); + for (int i = 0; i < p_lights.size(); ++i) { + Ref light = Ref(p_lights[i]); + + light_add(light); + } +} + +Vector TerrainChunk::owned_lights_get() { + Vector r; + for (int i = 0; i < _lights.size(); i++) { + Ref l = _lights[i]; + + if (!l.is_valid()) { + continue; + } + + if (l->get_owner_type() != TerrainLight::OWNER_TYPE_NONE) { + continue; + } + + r.push_back(_lights[i].get_ref_ptr()); + } + return r; +} +void TerrainChunk::owned_lights_set(const Vector &p_lights) { + for (int i = 0; i < _lights.size(); ++i) { + Ref l = _lights[i]; + + if (!l.is_valid()) { + continue; + } + + if (l->get_owner_type() != TerrainLight::OWNER_TYPE_NONE) { + continue; + } + + light_remove_index(i); + --i; + } + + for (int i = 0; i < p_lights.size(); ++i) { + Ref light = Ref(p_lights[i]); + + if (!light.is_valid()) { + continue; + } light_add(light); } @@ -1819,7 +1863,11 @@ void TerrainChunk::_bind_methods() { ClassDB::bind_method(D_METHOD("lights_get"), &TerrainChunk::lights_get); ClassDB::bind_method(D_METHOD("lights_set", "chunks"), &TerrainChunk::lights_set); - ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "lights", PROPERTY_HINT_NONE, "23/20:TerrainLight", PROPERTY_USAGE_DEFAULT, "TerrainLight"), "lights_set", "lights_get"); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "lights", PROPERTY_HINT_NONE, "23/20:TerrainLight", 0, "TerrainLight"), "lights_set", "lights_get"); + + ClassDB::bind_method(D_METHOD("owned_lights_get"), &TerrainChunk::owned_lights_get); + ClassDB::bind_method(D_METHOD("owned_lights_set", "chunks"), &TerrainChunk::owned_lights_set); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "owned_lights", PROPERTY_HINT_NONE, "23/20:TerrainLight", PROPERTY_USAGE_DEFAULT, "TerrainLight"), "owned_lights_set", "owned_lights_get"); ClassDB::bind_method(D_METHOD("_on_light_moved"), &TerrainChunk::_on_light_moved); diff --git a/modules/terraman/world/terrain_chunk.h b/modules/terraman/world/terrain_chunk.h index fd6af8a16..955541b93 100644 --- a/modules/terraman/world/terrain_chunk.h +++ b/modules/terraman/world/terrain_chunk.h @@ -228,7 +228,10 @@ public: void lights_clear(); Vector lights_get(); - void lights_set(const Vector &chunks); + void lights_set(const Vector &p_lights); + + Vector owned_lights_get(); + void owned_lights_set(const Vector &p_lights); void _on_light_moved(const Ref &p_light);