Now TerrainChunks will remember whether they own a prop or not. Also added and bound missing methods to Chunk's prop api.

This commit is contained in:
Relintai 2025-02-14 15:28:14 +01:00
parent 954ca26471
commit 1643197af3
2 changed files with 52 additions and 7 deletions

View File

@ -910,25 +910,50 @@ void TerrainChunk::clear_baked_lights() {
}
#ifdef MODULE_PROPS_ENABLED
void TerrainChunk::prop_add(const Transform &tarnsform, const Ref<PropData> &prop) {
void TerrainChunk::prop_add(const Transform &tarnsform, const Ref<PropData> &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<PropData> TerrainChunk::prop_get(int index) {
ERR_FAIL_INDEX_V(index, _props.size(), Ref<PropData>());
return _props.get(index).prop;
}
void TerrainChunk::prop_set(const int index, const Ref<PropData> &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<PropData> prop = Ref<PropData>(prop_data[1]);
bool owner = prop_data[0];
Transform transform = prop_data[1];
Ref<PropData> prop = Ref<PropData>(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);

View File

@ -260,9 +260,17 @@ public:
void clear_baked_lights();
#ifdef MODULE_PROPS_ENABLED
void prop_add(const Transform &tarnsform, const Ref<PropData> &prop);
void prop_add(const Transform &tarnsform, const Ref<PropData> &prop, const bool p_owner = true);
Ref<PropData> prop_get(const int index);
void prop_set(const int index, const Ref<PropData> &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<PropData> prop;
};