Store whether a mesh_data_resource in a TerrainChunk is original or not.

This commit is contained in:
Relintai 2025-02-14 15:49:39 +01:00
parent 2054f60c6d
commit 7006c947cd
3 changed files with 31 additions and 7 deletions

View File

@ -44,6 +44,8 @@
#include "modules/modules_enabled.gen.h"
#include "core/object/method_bind_ext.gen.inc"
#ifdef MODULE_LZ4_ENABLED
#include "modules/lz4/lz4_compressor.h"
#endif
@ -999,7 +1001,7 @@ void TerrainChunk::props_set(const Array &p_props) {
#endif
#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED
int TerrainChunk::mesh_data_resource_addv(const Vector3 &local_data_pos, const Ref<MeshDataResource> &mesh, const Ref<Texture> &texture, const Color &color, const bool apply_voxel_scale) {
int TerrainChunk::mesh_data_resource_addv(const Vector3 &local_data_pos, const Ref<MeshDataResource> &mesh, const Ref<Texture> &texture, const Color &color, const bool apply_voxel_scale, const bool p_original) {
ERR_FAIL_COND_V(!mesh.is_valid(), 0);
int index = _mesh_data_resources.size();
@ -1016,6 +1018,7 @@ int TerrainChunk::mesh_data_resource_addv(const Vector3 &local_data_pos, const R
e.mesh = mesh;
e.texture = texture;
e.color = color;
e.is_original = p_original;
AABB aabb = AABB(Vector3(), get_world_size());
AABB mesh_aabb = e.transform.xform(mesh->get_aabb());
@ -1040,7 +1043,7 @@ int TerrainChunk::mesh_data_resource_addv(const Vector3 &local_data_pos, const R
return index;
}
int TerrainChunk::mesh_data_resource_add(const Transform &local_transform, const Ref<MeshDataResource> &mesh, const Ref<Texture> &texture, const Color &color, const bool apply_voxel_scale) {
int TerrainChunk::mesh_data_resource_add(const Transform &local_transform, const Ref<MeshDataResource> &mesh, const Ref<Texture> &texture, const Color &color, const bool apply_voxel_scale, const bool p_original) {
ERR_FAIL_COND_V(!mesh.is_valid(), 0);
int index = _mesh_data_resources.size();
@ -1057,6 +1060,7 @@ int TerrainChunk::mesh_data_resource_add(const Transform &local_transform, const
e.mesh = mesh;
e.texture = texture;
e.color = color;
e.is_original = p_original;
AABB aabb = AABB(Vector3(), get_world_size());
AABB mesh_aabb = e.transform.xform(mesh->get_aabb());
@ -1146,6 +1150,17 @@ void TerrainChunk::mesh_data_resource_set_is_inside(const int index, const bool
_mesh_data_resources.write[index].is_inside = inside;
}
bool TerrainChunk::mesh_data_resource_get_is_original(const int index) {
ERR_FAIL_INDEX_V(index, _mesh_data_resources.size(), false);
return _mesh_data_resources[index].is_original;
}
void TerrainChunk::mesh_data_resource_set_is_original(const int index, const bool p_original) {
ERR_FAIL_INDEX(index, _mesh_data_resources.size());
_mesh_data_resources.write[index].is_original = p_original;
}
int TerrainChunk::mesh_data_resource_get_count() const {
return _mesh_data_resources.size();
}
@ -1170,6 +1185,7 @@ Array TerrainChunk::mesh_data_resources_get() {
mdr_data.push_back(e.texture);
mdr_data.push_back(e.color);
mdr_data.push_back(e.transform);
mdr_data.push_back(e.is_original);
ret.push_back(mdr_data);
}
@ -1183,14 +1199,15 @@ void TerrainChunk::mesh_data_resources_set(const Array &p_mesh_data_resources) {
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);
ERR_CONTINUE(mdr_data.size() != 5);
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];
bool is_original = mdr_data[4];
mesh_data_resource_add(transform, mesh, texture, color, false);
mesh_data_resource_add(transform, mesh, texture, color, false, is_original);
}
}
@ -1864,6 +1881,9 @@ void TerrainChunk::_bind_methods() {
ClassDB::bind_method(D_METHOD("mesh_data_resource_get_is_inside", "index"), &TerrainChunk::mesh_data_resource_get_is_inside);
ClassDB::bind_method(D_METHOD("mesh_data_resource_set_is_inside", "index", "inside"), &TerrainChunk::mesh_data_resource_set_is_inside);
ClassDB::bind_method(D_METHOD("mesh_data_resource_get_is_original", "index"), &TerrainChunk::mesh_data_resource_get_is_original);
ClassDB::bind_method(D_METHOD("mesh_data_resource_set_is_original", "index", "original"), &TerrainChunk::mesh_data_resource_set_is_original);
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);

View File

@ -280,8 +280,8 @@ public:
#endif
#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED
int mesh_data_resource_addv(const Vector3 &local_data_pos, const Ref<MeshDataResource> &mesh, const Ref<Texture> &texture = Ref<Texture>(), const Color &color = Color(1, 1, 1, 1), const bool apply_voxel_scale = true);
int mesh_data_resource_add(const Transform &local_transform, const Ref<MeshDataResource> &mesh, const Ref<Texture> &texture = Ref<Texture>(), const Color &color = Color(1, 1, 1, 1), const bool apply_voxel_scale = true);
int mesh_data_resource_addv(const Vector3 &local_data_pos, const Ref<MeshDataResource> &mesh, const Ref<Texture> &texture = Ref<Texture>(), const Color &color = Color(1, 1, 1, 1), const bool apply_voxel_scale = true, const bool p_original = true);
int mesh_data_resource_add(const Transform &local_transform, const Ref<MeshDataResource> &mesh, const Ref<Texture> &texture = Ref<Texture>(), const Color &color = Color(1, 1, 1, 1), const bool apply_voxel_scale = true, const bool p_original = true);
Ref<MeshDataResource> mesh_data_resource_get(const int index);
void mesh_data_resource_set(const int index, const Ref<MeshDataResource> &mesh);
@ -301,6 +301,9 @@ public:
bool mesh_data_resource_get_is_inside(const int index);
void mesh_data_resource_set_is_inside(const int index, const bool inside);
bool mesh_data_resource_get_is_original(const int index);
void mesh_data_resource_set_is_original(const int index, const bool p_original);
int mesh_data_resource_get_count() const;
void mesh_data_resource_remove(const int index);
void mesh_data_resource_clear();
@ -375,6 +378,7 @@ protected:
Rect2 uv_rect;
Transform transform;
bool is_inside;
bool is_original;
};
#endif

View File

@ -714,7 +714,7 @@ void TerrainWorld::prop_add(Transform transform, const Ref<PropData> &prop, cons
chunk_local_tform.origin = chunk->to_local(chunk_local_tform.origin);
chunk->mesh_data_resource_add(chunk_local_tform, mdr, mesh_data->get_texture(), Color(1, 1, 1, 1), false);
chunk->mesh_data_resource_add(chunk_local_tform, mdr, mesh_data->get_texture(), Color(1, 1, 1, 1), false, false);
continue;
}