From 952553e9adddcb246e3cd82a13ad4e322084bcd1 Mon Sep 17 00:00:00 2001 From: Relintai Date: Thu, 6 Feb 2025 17:21:35 +0100 Subject: [PATCH] Clear meshes as needed in TerrainTerrainJob. --- .../world/jobs/terrain_terrain_job.cpp | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/modules/terraman/world/jobs/terrain_terrain_job.cpp b/modules/terraman/world/jobs/terrain_terrain_job.cpp index 5513b3f8b..62de682b2 100644 --- a/modules/terraman/world/jobs/terrain_terrain_job.cpp +++ b/modules/terraman/world/jobs/terrain_terrain_job.cpp @@ -331,17 +331,6 @@ void TerrainTerrainJob::phase_terrain_mesh() { //allocate if (count > 0) chunk->meshes_create(TerrainChunkDefault::MESH_INDEX_TERRAIN, count); - - } else { - //we have the meshes, just clear - int count = chunk->mesh_rid_get_count(TerrainChunkDefault::MESH_INDEX_TERRAIN, TerrainChunkDefault::MESH_TYPE_INDEX_MESH); - - for (int i = 0; i < count; ++i) { - mesh_rid = chunk->mesh_rid_get_index(TerrainChunkDefault::MESH_INDEX_TERRAIN, TerrainChunkDefault::MESH_TYPE_INDEX_MESH, i); - - if (RS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0) - RS::get_singleton()->mesh_remove_surface(mesh_rid, 0); - } } } @@ -399,14 +388,15 @@ void TerrainTerrainJob::phase_terrain_mesh() { mesh_rid = chunk->mesh_rid_get_index(TerrainChunkDefault::MESH_INDEX_LIQUID, TerrainChunkDefault::MESH_TYPE_INDEX_MESH, 0); } - if (RS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0) - RS::get_singleton()->mesh_remove_surface(mesh_rid, 0); - if (should_return()) { return; } } + if (RS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0) { + RS::get_singleton()->mesh_clear(mesh_rid); + } + RS::get_singleton()->mesh_add_surface_from_arrays(mesh_rid, RenderingServer::PRIMITIVE_TRIANGLES, temp_mesh_arr); Ref lmat; @@ -506,6 +496,10 @@ void TerrainTerrainJob::step_type_normal() { RID mesh_rid = chunk->mesh_rid_get_index(TerrainChunkDefault::MESH_INDEX_TERRAIN, TerrainChunkDefault::MESH_TYPE_INDEX_MESH, _current_mesh); + if (RS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0) { + RS::get_singleton()->mesh_clear(mesh_rid); + } + RS::get_singleton()->mesh_add_surface_from_arrays(mesh_rid, RenderingServer::PRIMITIVE_TRIANGLES, temp_mesh_arr); Ref lmat; @@ -543,6 +537,10 @@ void TerrainTerrainJob::step_type_normal_lod() { RID mesh_rid = chunk->mesh_rid_get_index(TerrainChunkDefault::MESH_INDEX_TERRAIN, TerrainChunkDefault::MESH_TYPE_INDEX_MESH, _current_mesh); + if (RS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0) { + RS::get_singleton()->mesh_clear(mesh_rid); + } + RS::get_singleton()->mesh_add_surface_from_arrays(mesh_rid, RenderingServer::PRIMITIVE_TRIANGLES, temp_mesh_arr); Ref lmat; @@ -567,6 +565,10 @@ void TerrainTerrainJob::step_type_drop_uv2() { temp_mesh_arr[RenderingServer::ARRAY_TEX_UV2] = Variant(); + if (RS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0) { + RS::get_singleton()->mesh_clear(mesh_rid); + } + RenderingServer::get_singleton()->mesh_add_surface_from_arrays(mesh_rid, RenderingServer::PRIMITIVE_TRIANGLES, temp_mesh_arr); Ref lmat; @@ -591,6 +593,10 @@ void TerrainTerrainJob::step_type_merge_verts() { Ref chunk = _chunk; RID mesh_rid = chunk->mesh_rid_get_index(TerrainChunkDefault::MESH_INDEX_TERRAIN, TerrainChunkDefault::MESH_TYPE_INDEX_MESH, _current_mesh); + if (RS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0) { + RS::get_singleton()->mesh_clear(mesh_rid); + } + RenderingServer::get_singleton()->mesh_add_surface_from_arrays(mesh_rid, RenderingServer::PRIMITIVE_TRIANGLES, temp_mesh_arr); Ref lmat; @@ -635,6 +641,10 @@ void TerrainTerrainJob::step_type_bake_texture() { RID mesh_rid = chunk->mesh_rid_get_index(TerrainChunkDefault::MESH_INDEX_TERRAIN, TerrainChunkDefault::MESH_TYPE_INDEX_MESH, _current_mesh); + if (RS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0) { + RS::get_singleton()->mesh_clear(mesh_rid); + } + RenderingServer::get_singleton()->mesh_add_surface_from_arrays(mesh_rid, RenderingServer::PRIMITIVE_TRIANGLES, temp_mesh_arr); if (lmat.is_valid()) { @@ -662,6 +672,10 @@ void TerrainTerrainJob::step_type_simplify_mesh() { RID mesh_rid = chunk->mesh_rid_get_index(TerrainChunkDefault::MESH_INDEX_TERRAIN, TerrainChunkDefault::MESH_TYPE_INDEX_MESH, _current_mesh); + if (RS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0) { + RS::get_singleton()->mesh_clear(mesh_rid); + } + RenderingServer::get_singleton()->mesh_add_surface_from_arrays(mesh_rid, RenderingServer::PRIMITIVE_TRIANGLES, temp_mesh_arr); Ref lmat;