From 1643197af39d22039adfc8d50105969c01929e6f Mon Sep 17 00:00:00 2001 From: Relintai Date: Fri, 14 Feb 2025 15:28:14 +0100 Subject: [PATCH] Now TerrainChunks will remember whether they own a prop or not. Also added and bound missing methods to Chunk's prop api. --- modules/terraman/world/terrain_chunk.cpp | 48 +++++++++++++++++++++--- modules/terraman/world/terrain_chunk.h | 11 +++++- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/modules/terraman/world/terrain_chunk.cpp b/modules/terraman/world/terrain_chunk.cpp index b27f00c13..6cfa2374e 100644 --- a/modules/terraman/world/terrain_chunk.cpp +++ b/modules/terraman/world/terrain_chunk.cpp @@ -910,25 +910,50 @@ void TerrainChunk::clear_baked_lights() { } #ifdef MODULE_PROPS_ENABLED -void TerrainChunk::prop_add(const Transform &tarnsform, const Ref &prop) { +void TerrainChunk::prop_add(const Transform &tarnsform, const Ref &prop, const bool p_owner) { ERR_FAIL_COND(!prop.is_valid()); PropDataStore s; + s.owner = p_owner; s.transform = tarnsform; s.prop = prop; _props.push_back(s); } + Ref TerrainChunk::prop_get(int index) { ERR_FAIL_INDEX_V(index, _props.size(), Ref()); return _props.get(index).prop; } +void TerrainChunk::prop_set(const int index, const Ref &p_prop) { + ERR_FAIL_INDEX(index, _props.size()); + + _props.write[index].prop = p_prop; +} + Transform TerrainChunk::prop_get_tarnsform(const int index) { ERR_FAIL_INDEX_V(index, _props.size(), Transform()); return _props.get(index).transform; } +void TerrainChunk::prop_set_tarnsform(const int index, const Transform &p_transform) { + ERR_FAIL_INDEX(index, _props.size()); + + _props.write[index].transform = p_transform; +} + +bool TerrainChunk::prop_get_is_owner(const int index) { + ERR_FAIL_INDEX_V(index, _props.size(), false); + + return _props.get(index).owner; +} +void TerrainChunk::prop_set_is_owner(const int index, const bool p_owner) { + ERR_FAIL_INDEX(index, _props.size()); + + _props.write[index].owner = p_owner; +} + int TerrainChunk::prop_get_count() const { return _props.size(); } @@ -947,6 +972,7 @@ Array TerrainChunk::props_get() { for (int i = 0; i < _props.size(); i++) { Array prop_data; + prop_data.push_back(_props[i].owner); prop_data.push_back(_props[i].transform); prop_data.push_back(_props[i].prop.get_ref_ptr()); @@ -961,12 +987,13 @@ void TerrainChunk::props_set(const Array &p_props) { for (int i = 0; i < p_props.size(); ++i) { Array prop_data = p_props[i]; - ERR_CONTINUE(prop_data.size() != 2); + ERR_CONTINUE(prop_data.size() != 3); - Transform transform = prop_data[0]; - Ref prop = Ref(prop_data[1]); + bool owner = prop_data[0]; + Transform transform = prop_data[1]; + Ref prop = Ref(prop_data[2]); - prop_add(transform, prop); + prop_add(transform, prop, owner); } } #endif @@ -1795,8 +1822,17 @@ void TerrainChunk::_bind_methods() { //Meshes #ifdef MODULE_PROPS_ENABLED - ClassDB::bind_method(D_METHOD("prop_add", "prop"), &TerrainChunk::prop_add); + ClassDB::bind_method(D_METHOD("prop_add", "prop", "owner"), &TerrainChunk::prop_add, DEFVAL(true)); + ClassDB::bind_method(D_METHOD("prop_get", "index"), &TerrainChunk::prop_get); + ClassDB::bind_method(D_METHOD("prop_set", "index", "prop"), &TerrainChunk::prop_set); + + ClassDB::bind_method(D_METHOD("prop_get_tarnsform", "index"), &TerrainChunk::prop_get_tarnsform); + ClassDB::bind_method(D_METHOD("prop_set_tarnsform", "index", "transform"), &TerrainChunk::prop_set_tarnsform); + + ClassDB::bind_method(D_METHOD("prop_get_is_owner", "index"), &TerrainChunk::prop_get_is_owner); + ClassDB::bind_method(D_METHOD("prop_set_is_owner", "index", "owner"), &TerrainChunk::prop_set_is_owner); + ClassDB::bind_method(D_METHOD("prop_get_count"), &TerrainChunk::prop_get_count); ClassDB::bind_method(D_METHOD("prop_remove", "index"), &TerrainChunk::prop_remove); ClassDB::bind_method(D_METHOD("props_clear"), &TerrainChunk::props_clear); diff --git a/modules/terraman/world/terrain_chunk.h b/modules/terraman/world/terrain_chunk.h index a7b29f3ad..52b9b1ca5 100644 --- a/modules/terraman/world/terrain_chunk.h +++ b/modules/terraman/world/terrain_chunk.h @@ -260,9 +260,17 @@ public: void clear_baked_lights(); #ifdef MODULE_PROPS_ENABLED - void prop_add(const Transform &tarnsform, const Ref &prop); + void prop_add(const Transform &tarnsform, const Ref &prop, const bool p_owner = true); + Ref prop_get(const int index); + void prop_set(const int index, const Ref &p_prop); + Transform prop_get_tarnsform(const int index); + void prop_set_tarnsform(const int index, const Transform &p_transform); + + bool prop_get_is_owner(const int index); + void prop_set_is_owner(const int index, const bool p_owner); + int prop_get_count() const; void prop_remove(const int index); void props_clear(); @@ -353,6 +361,7 @@ protected: protected: #ifdef MODULE_PROPS_ENABLED struct PropDataStore { + bool owner; Transform transform; Ref prop; };