diff --git a/modules/terraman/world/terrain_chunk.cpp b/modules/terraman/world/terrain_chunk.cpp index b4aed2ae6..493258136 100644 --- a/modules/terraman/world/terrain_chunk.cpp +++ b/modules/terraman/world/terrain_chunk.cpp @@ -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 &mesh, const Ref &texture, const Color &color, const bool apply_voxel_scale) { +int TerrainChunk::mesh_data_resource_addv(const Vector3 &local_data_pos, const Ref &mesh, const Ref &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 &mesh, const Ref &texture, const Color &color, const bool apply_voxel_scale) { +int TerrainChunk::mesh_data_resource_add(const Transform &local_transform, const Ref &mesh, const Ref &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 mesh = Ref(mdr_data[0]); Ref texture = Ref(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); diff --git a/modules/terraman/world/terrain_chunk.h b/modules/terraman/world/terrain_chunk.h index defaf8fe8..fd6af8a16 100644 --- a/modules/terraman/world/terrain_chunk.h +++ b/modules/terraman/world/terrain_chunk.h @@ -280,8 +280,8 @@ public: #endif #ifdef MODULE_MESH_DATA_RESOURCE_ENABLED - int mesh_data_resource_addv(const Vector3 &local_data_pos, const Ref &mesh, const Ref &texture = Ref(), 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 &mesh, const Ref &texture = Ref(), 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 &mesh, const Ref &texture = Ref(), 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 &mesh, const Ref &texture = Ref(), const Color &color = Color(1, 1, 1, 1), const bool apply_voxel_scale = true, const bool p_original = true); Ref mesh_data_resource_get(const int index); void mesh_data_resource_set(const int index, const Ref &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 diff --git a/modules/terraman/world/terrain_world.cpp b/modules/terraman/world/terrain_world.cpp index 37ea08eb4..c8bcfec14 100644 --- a/modules/terraman/world/terrain_world.cpp +++ b/modules/terraman/world/terrain_world.cpp @@ -714,7 +714,7 @@ void TerrainWorld::prop_add(Transform transform, const Ref &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; }