Now props and mesh data resources are saved with the TerrainChunks.

This commit is contained in:
Relintai 2025-02-10 17:48:11 +01:00
parent b0177a2c3a
commit eb3ed4fa20
3 changed files with 83 additions and 0 deletions

View File

@ -833,6 +833,35 @@ void TerrainChunk::prop_remove(const int index) {
void TerrainChunk::props_clear() {
_props.clear();
}
Array TerrainChunk::props_get() {
Array ret;
for (int i = 0; i < _props.size(); i++) {
Array prop_data;
prop_data.push_back(_props[i].transform);
prop_data.push_back(_props[i].prop.get_ref_ptr());
ret.push_back(prop_data);
}
return ret;
}
void TerrainChunk::props_set(const Array &p_props) {
props_clear();
for (int i = 0; i < p_props.size(); ++i) {
Array prop_data = p_props[i];
ERR_CONTINUE(prop_data.size() != 2);
Transform transform = prop_data[0];
Ref<PropData> prop = Ref<PropData>(prop_data[1]);
prop_add(transform, prop);
}
}
#endif
#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED
@ -995,6 +1024,42 @@ void TerrainChunk::mesh_data_resource_clear() {
_mesh_data_resources.clear();
}
Array TerrainChunk::mesh_data_resources_get() {
Array ret;
for (int i = 0; i < _mesh_data_resources.size(); i++) {
MeshDataResourceEntry e = _mesh_data_resources[i];
Array mdr_data;
mdr_data.push_back(e.mesh.get_ref_ptr());
mdr_data.push_back(e.texture);
mdr_data.push_back(e.color);
mdr_data.push_back(e.transform);
ret.push_back(mdr_data);
}
return ret;
}
void TerrainChunk::mesh_data_resources_set(const Array &p_mesh_data_resources) {
mesh_data_resource_clear();
for (int i = 0; i < p_mesh_data_resources.size(); ++i) {
Array mdr_data = p_mesh_data_resources[i];
ERR_CONTINUE(mdr_data.size() != 4);
Ref<MeshDataResource> mesh = Ref<MeshDataResource>(mdr_data[0]);
Ref<Texture> texture = Ref<Texture>(mdr_data[1]);
Color color = mdr_data[2];
Transform transform = mdr_data[3];
mesh_data_resource_add(transform, mesh, texture, color, false);
}
}
#endif
int TerrainChunk::collider_add(const Transform &local_transform, const Ref<Shape> &shape, const RID &shape_rid, const RID &body) {
@ -1609,6 +1674,10 @@ void TerrainChunk::_bind_methods() {
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);
ClassDB::bind_method(D_METHOD("props_get"), &TerrainChunk::props_get);
ClassDB::bind_method(D_METHOD("props_set"), &TerrainChunk::props_set);
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "props"), "props_set", "props_get");
#endif
#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED
@ -1636,6 +1705,10 @@ void TerrainChunk::_bind_methods() {
ClassDB::bind_method(D_METHOD("mesh_data_resource_get_count"), &TerrainChunk::mesh_data_resource_get_count);
ClassDB::bind_method(D_METHOD("mesh_data_resource_remove", "index"), &TerrainChunk::mesh_data_resource_remove);
ClassDB::bind_method(D_METHOD("mesh_data_resource_clear"), &TerrainChunk::mesh_data_resource_clear);
ClassDB::bind_method(D_METHOD("mesh_data_resources_get"), &TerrainChunk::mesh_data_resources_get);
ClassDB::bind_method(D_METHOD("mesh_data_resources_set"), &TerrainChunk::mesh_data_resources_set);
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "mesh_data_resources"), "mesh_data_resources_set", "mesh_data_resources_get");
#endif
ClassDB::bind_method(D_METHOD("collider_add", "local_transform", "shape", "shape_rid", "body"), &TerrainChunk::collider_add, DEFVAL(RID()), DEFVAL(RID()));

View File

@ -251,6 +251,9 @@ public:
int prop_get_count() const;
void prop_remove(const int index);
void props_clear();
Array props_get();
void props_set(const Array &p_props);
#endif
#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED
@ -278,6 +281,9 @@ public:
int mesh_data_resource_get_count() const;
void mesh_data_resource_remove(const int index);
void mesh_data_resource_clear();
Array mesh_data_resources_get();
void mesh_data_resources_set(const Array &p_mesh_data_resources);
#endif
//Colliders

View File

@ -639,6 +639,8 @@ void TerrainWorld::prop_add(Transform transform, const Ref<PropData> &prop, cons
sp->set_transform(t);
}
// TODO store this in a chunk, and manage loading/unloading it with it
continue;
}
@ -659,6 +661,8 @@ void TerrainWorld::prop_add(Transform transform, const Ref<PropData> &prop, cons
light_add(light);
// TODO store this in a chunk, and manage loading/unloading it with it
continue;
}