diff --git a/world/blocky/terra_world_blocky.cpp b/world/blocky/terra_world_blocky.cpp index 5d6cc8c..11b6414 100644 --- a/world/blocky/terra_world_blocky.cpp +++ b/world/blocky/terra_world_blocky.cpp @@ -47,8 +47,8 @@ Ref TerraWorldBlocky::_create_chunk(int x, int z, Ref ch pj.instance(); pj->set_prop_mesher(Ref(memnew(TerraMesherBlocky))); - tj->add_mesher(Ref(memnew(TerraMesherBlocky()))); - tj->add_liquid_mesher(Ref(memnew(TerraMesherLiquidBlocky()))); + tj->set_mesher(Ref(memnew(TerraMesherBlocky()))); + tj->set_liquid_mesher(Ref(memnew(TerraMesherLiquidBlocky()))); chunk->job_add(lj); chunk->job_add(tj); diff --git a/world/jobs/terra_terrarin_job.cpp b/world/jobs/terra_terrarin_job.cpp index 84badde..e822e2f 100644 --- a/world/jobs/terra_terrarin_job.cpp +++ b/world/jobs/terra_terrarin_job.cpp @@ -34,119 +34,54 @@ SOFTWARE. #include "../../../mesh_utils/fast_quadratic_mesh_simplifier.h" #endif -Ref TerraTerrarinJob::get_mesher(int index) const { - ERR_FAIL_INDEX_V(index, _meshers.size(), Ref()); - - return _meshers.get(index); +Ref TerraTerrarinJob::get_mesher() const { + return _mesher; } -void TerraTerrarinJob::set_mesher(int index, const Ref &mesher) { - ERR_FAIL_INDEX(index, _meshers.size()); - - _meshers.set(index, mesher); -} -void TerraTerrarinJob::remove_mesher(const int index) { - ERR_FAIL_INDEX(index, _meshers.size()); - - _meshers.remove(index); -} -void TerraTerrarinJob::add_mesher(const Ref &mesher) { - _meshers.push_back(mesher); -} -int TerraTerrarinJob::get_mesher_count() const { - return _meshers.size(); +void TerraTerrarinJob::set_mesher(const Ref &mesher) { + _mesher = mesher; } -Ref TerraTerrarinJob::get_liquid_mesher(int index) const { - ERR_FAIL_INDEX_V(index, _liquid_meshers.size(), Ref()); - - return _liquid_meshers.get(index); +Ref TerraTerrarinJob::get_liquid_mesher() const { + return _liquid_mesher; } -void TerraTerrarinJob::set_liquid_mesher(int index, const Ref &mesher) { - ERR_FAIL_INDEX(index, _liquid_meshers.size()); - - _liquid_meshers.set(index, mesher); -} -void TerraTerrarinJob::remove_liquid_mesher(const int index) { - ERR_FAIL_INDEX(index, _liquid_meshers.size()); - - _liquid_meshers.remove(index); -} -void TerraTerrarinJob::add_liquid_mesher(const Ref &mesher) { - _liquid_meshers.push_back(mesher); -} -int TerraTerrarinJob::get_liquid_mesher_count() const { - return _liquid_meshers.size(); +void TerraTerrarinJob::set_liquid_mesher(const Ref &mesher) { + _liquid_mesher = mesher; } void TerraTerrarinJob::phase_setup() { - for (int i = 0; i < _meshers.size(); ++i) { - Ref mesher = _meshers.get(i); - - ERR_CONTINUE(!mesher.is_valid()); - - mesher->set_library(_chunk->get_library()); - mesher->reset(); + if (_mesher.is_valid()) { + _mesher->set_library(_chunk->get_library()); + _mesher->reset(); } - for (int i = 0; i < _liquid_meshers.size(); ++i) { - Ref mesher = _liquid_meshers.get(i); - - ERR_CONTINUE(!mesher.is_valid()); - - mesher->set_library(_chunk->get_library()); - mesher->reset(); + if (_liquid_mesher.is_valid()) { + _liquid_mesher->set_library(_chunk->get_library()); + _liquid_mesher->reset(); } next_phase(); } void TerraTerrarinJob::phase_terrarin_mesh_setup() { - int starti = 0; - - if (has_meta("tms_m")) { - starti = get_meta("tms_m"); + if (should_return()) { + return; } - for (int i = starti; i < _meshers.size(); ++i) { - if (should_return()) { - set_meta("tms_m", i); - return; + if (_mesher.is_valid()) { + if (should_do()) { + _mesher->add_chunk(_chunk); + + if (should_return()) { + return; + } } - - Ref mesher = _meshers.get(i); - - ERR_CONTINUE(!mesher.is_valid()); - - mesher->add_chunk(_chunk); } - starti = 0; - - if (has_meta("tms_lm")) { - starti = get_meta("tms_lm"); - } - - for (int i = starti; i < _liquid_meshers.size(); ++i) { - if (should_return()) { - set_meta("tms_lm", i); - return; - } - - Ref mesher = _liquid_meshers.get(i); - - ERR_CONTINUE(!mesher.is_valid()); - - mesher->add_chunk(_chunk); - } - - if (has_meta("tms_m")) { - remove_meta("tms_m"); - } - - if (has_meta("tms_lm")) { - remove_meta("tms_lm"); + if (_liquid_mesher.is_valid()) { + _liquid_mesher->add_chunk(_chunk); } + reset_stages(); next_phase(); } @@ -158,61 +93,35 @@ void TerraTerrarinJob::phase_collider() { return; } - int starti = 0; + ERR_FAIL_COND(!_mesher.is_valid()); - if (has_meta("bpc_aa")) { - starti = get_meta("bpc_aa"); + if (should_return()) { + return; } - for (int i = starti; i < _meshers.size(); ++i) { + if (should_do()) { + temp_arr_collider.append_array(_mesher->build_collider()); + if (should_return()) { - set_meta("bpc_aa", i); return; } - - Ref mesher = _meshers.get(i); - - ERR_CONTINUE(!mesher.is_valid()); - - temp_arr_collider.append_array(mesher->build_collider()); } if (Engine::get_singleton()->is_editor_hint()) { - starti = 0; - - if (has_meta("bpc_laa")) { - starti = get_meta("bpc_laa"); + if (_liquid_mesher.is_valid()) { + temp_arr_collider_liquid.append_array(_liquid_mesher->build_collider()); } - - for (int i = 0; i < _liquid_meshers.size(); ++i) { - if (should_return()) { - set_meta("bpc_laa", i); - return; - } - - Ref mesher = _liquid_meshers.get(i); - - ERR_CONTINUE(!mesher.is_valid()); - - temp_arr_collider_liquid.append_array(mesher->build_collider()); - } - } - - if (has_meta("bpc_aa")) { - remove_meta("bpc_aa"); - } - - if (has_meta("bpc_laa")) { - remove_meta("bpc_laa"); } if (temp_arr_collider.size() == 0 && temp_arr_collider_liquid.size() == 0) { + reset_stages(); next_phase(); next_phase(); return; } set_build_phase_type(BUILD_PHASE_TYPE_PHYSICS_PROCESS); + reset_stages(); next_phase(); } @@ -248,130 +157,47 @@ void TerraTerrarinJob::phase_physics_process() { } set_build_phase_type(BUILD_PHASE_TYPE_NORMAL); + reset_stages(); next_phase(); } void TerraTerrarinJob::phase_terrarin_mesh() { Ref chunk = _chunk; + ERR_FAIL_COND(!_mesher.is_valid()); + + if (should_return()) { + return; + } + if ((chunk->get_build_flags() & TerraChunkDefault::BUILD_FLAG_USE_LIGHTING) != 0) { - int starti = 0; + if (should_do()) { + _mesher->bake_colors(_chunk); - if (has_meta("bptm_ulm")) { - starti = get_meta("bptm_ulm"); - } - - for (int i = starti; i < _meshers.size(); ++i) { if (should_return()) { - set_meta("bptm_ulm", i); + return; } - - Ref mesher = _meshers.get(i); - - ERR_CONTINUE(!mesher.is_valid()); - - mesher->bake_colors(_chunk); } - starti = 0; + if (should_do()) { + _liquid_mesher->bake_colors(_chunk); - if (has_meta("bptm_ullm")) { - starti = get_meta("bptm_ullm"); - } - - for (int i = starti; i < _liquid_meshers.size(); ++i) { if (should_return()) { - set_meta("bptm_ullm", i); + return; } - - Ref mesher = _liquid_meshers.get(i); - - ERR_CONTINUE(!mesher.is_valid()); - - mesher->bake_colors(_chunk); } } - int starti = 0; - - if (has_meta("bptm_mm")) { - starti = get_meta("bptm_mm"); - } - - Ref mesher; - for (int i = starti; i < _meshers.size(); ++i) { - if (should_return()) { - set_meta("bptm_mm", i); - } - - Ref m = _meshers.get(i); - - ERR_CONTINUE(!m.is_valid()); - - if (!mesher.is_valid()) { - mesher = m; - mesher->set_material(_chunk->get_library()->material_get(0)); - continue; - } - - mesher->set_material(_chunk->get_library()->material_get(0)); - mesher->add_mesher(m); - } - - ERR_FAIL_COND(!mesher.is_valid()); - - starti = 0; - - if (has_meta("bptm_lmm")) { - starti = get_meta("bptm_lmm"); - } - - Ref liquid_mesher; - for (int i = starti; i < _liquid_meshers.size(); ++i) { - if (should_return()) { - set_meta("bptm_lmm", i); - } - - Ref m = _liquid_meshers.get(i); - - ERR_CONTINUE(!m.is_valid()); - - if (!liquid_mesher.is_valid()) { - liquid_mesher = m; - liquid_mesher->set_material(_chunk->get_library()->material_get(0)); - continue; - } - - liquid_mesher->set_material(_chunk->get_library()->material_get(0)); - liquid_mesher->add_mesher(m); - } - - if (mesher->get_vertex_count() == 0 && liquid_mesher.is_valid() && liquid_mesher->get_vertex_count() == 0) { - if (has_meta("bptm_ulm")) { - remove_meta("bptm_ulm"); - } - - if (has_meta("bptm_ullm")) { - remove_meta("bptm_ullm"); - } - - if (has_meta("bptm_mm")) { - remove_meta("bptm_mm"); - } - - if (has_meta("bptm_lmm")) { - remove_meta("bptm_lmm"); - } - + if (_mesher->get_vertex_count() == 0 && (!_liquid_mesher.is_valid() || _liquid_mesher->get_vertex_count() == 0)) { reset_stages(); next_phase(); return; } - if (mesher->get_vertex_count() != 0) { + if (_mesher->get_vertex_count() != 0) { if (should_do()) { - temp_mesh_arr = mesher->build_mesh(); + temp_mesh_arr = _mesher->build_mesh(); if (should_return()) { return; @@ -413,6 +239,7 @@ void TerraTerrarinJob::phase_terrarin_mesh() { } } + if ((chunk->get_build_flags() & TerraChunkDefault::BUILD_FLAG_CREATE_LODS) != 0) { if (should_do()) { if (chunk->get_lod_num() >= 1) { @@ -508,9 +335,9 @@ void TerraTerrarinJob::phase_terrarin_mesh() { } } - if (liquid_mesher.is_valid() && liquid_mesher->get_vertex_count() != 0) { + if (_liquid_mesher.is_valid() && _liquid_mesher->get_vertex_count() != 0) { if (should_do()) { - temp_mesh_arr = liquid_mesher->build_mesh(); + temp_mesh_arr = _liquid_mesher->build_mesh(); if (should_return()) { return; @@ -606,30 +433,21 @@ void TerraTerrarinJob::_reset() { _build_done = false; _phase = 0; - for (int i = 0; i < _meshers.size(); ++i) { - Ref mesher = _meshers.get(i); + ERR_FAIL_COND(!_mesher.is_valid()); - ERR_CONTINUE(!mesher.is_valid()); + _mesher->set_voxel_scale(_chunk->get_voxel_scale()); - mesher->set_voxel_scale(_chunk->get_voxel_scale()); + Ref chunk = _chunk; + Ref md = _mesher; - Ref chunk = _chunk; - Ref md = mesher; - - if (chunk.is_valid() && md.is_valid()) { - md->set_build_flags(chunk->get_build_flags()); - } + if (chunk.is_valid() && md.is_valid()) { + md->set_build_flags(chunk->get_build_flags()); } - for (int i = 0; i < _liquid_meshers.size(); ++i) { - Ref mesher = _liquid_meshers.get(i); + if (_liquid_mesher.is_valid()) { + _liquid_mesher->set_voxel_scale(_chunk->get_voxel_scale()); - ERR_CONTINUE(!mesher.is_valid()); - - mesher->set_voxel_scale(_chunk->get_voxel_scale()); - - Ref chunk = _chunk; - Ref md = mesher; + md = _liquid_mesher; if (chunk.is_valid() && md.is_valid()) { md->set_build_flags(chunk->get_build_flags()); @@ -646,22 +464,16 @@ TerraTerrarinJob::TerraTerrarinJob() { } TerraTerrarinJob::~TerraTerrarinJob() { - _meshers.clear(); - _liquid_meshers.clear(); + _mesher.unref(); + _liquid_mesher.unref(); } void TerraTerrarinJob::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_mesher", "index"), &TerraTerrarinJob::get_mesher); - ClassDB::bind_method(D_METHOD("set_mesher", "index", "mesher"), &TerraTerrarinJob::set_mesher); - ClassDB::bind_method(D_METHOD("remove_mesher", "index"), &TerraTerrarinJob::remove_mesher); - ClassDB::bind_method(D_METHOD("add_mesher", "mesher"), &TerraTerrarinJob::add_mesher); - ClassDB::bind_method(D_METHOD("get_mesher_count"), &TerraTerrarinJob::get_mesher_count); + ClassDB::bind_method(D_METHOD("get_mesher"), &TerraTerrarinJob::get_mesher); + ClassDB::bind_method(D_METHOD("set_mesher", "mesher"), &TerraTerrarinJob::set_mesher); - ClassDB::bind_method(D_METHOD("get_liquid_mesher", "index"), &TerraTerrarinJob::get_liquid_mesher); - ClassDB::bind_method(D_METHOD("set_liquid_mesher", "index", "mesher"), &TerraTerrarinJob::set_liquid_mesher); - ClassDB::bind_method(D_METHOD("remove_liquid_mesher", "index"), &TerraTerrarinJob::remove_liquid_mesher); - ClassDB::bind_method(D_METHOD("add_liquid_mesher", "mesher"), &TerraTerrarinJob::add_liquid_mesher); - ClassDB::bind_method(D_METHOD("get_liquid_mesher_count"), &TerraTerrarinJob::get_liquid_mesher_count); + ClassDB::bind_method(D_METHOD("get_liquid_mesher"), &TerraTerrarinJob::get_liquid_mesher); + ClassDB::bind_method(D_METHOD("set_liquid_mesher", "mesher"), &TerraTerrarinJob::set_liquid_mesher); ClassDB::bind_method(D_METHOD("_physics_process", "delta"), &TerraTerrarinJob::_physics_process); } diff --git a/world/jobs/terra_terrarin_job.h b/world/jobs/terra_terrarin_job.h index d4ec893..4801fd3 100644 --- a/world/jobs/terra_terrarin_job.h +++ b/world/jobs/terra_terrarin_job.h @@ -37,19 +37,11 @@ class TerraTerrarinJob : public TerraJob { GDCLASS(TerraTerrarinJob, TerraJob); public: - //Meshers - Ref get_mesher(const int index) const; - void set_mesher(const int index, const Ref &mesher); - void remove_mesher(const int index); - void add_mesher(const Ref &mesher); - int get_mesher_count() const; + Ref get_mesher() const; + void set_mesher(const Ref &mesher); - //Liquid Meshers - Ref get_liquid_mesher(const int index) const; - void set_liquid_mesher(const int index, const Ref &mesher); - void remove_liquid_mesher(const int index); - void add_liquid_mesher(const Ref &mesher); - int get_liquid_mesher_count() const; + Ref get_liquid_mesher() const; + void set_liquid_mesher(const Ref &mesher); void phase_setup(); void phase_terrarin_mesh_setup(); @@ -69,8 +61,8 @@ public: protected: static void _bind_methods(); - Vector> _meshers; - Vector> _liquid_meshers; + Ref _mesher; + Ref _liquid_mesher; PoolVector temp_arr_collider; PoolVector temp_arr_collider_liquid;