diff options
Diffstat (limited to 'modules/raycast/raycast_occlusion_cull.cpp')
-rw-r--r-- | modules/raycast/raycast_occlusion_cull.cpp | 80 |
1 files changed, 33 insertions, 47 deletions
diff --git a/modules/raycast/raycast_occlusion_cull.cpp b/modules/raycast/raycast_occlusion_cull.cpp index 69fbf87483..5005000eae 100644 --- a/modules/raycast/raycast_occlusion_cull.cpp +++ b/modules/raycast/raycast_occlusion_cull.cpp @@ -221,7 +221,7 @@ void RaycastOcclusionCull::occluder_initialize(RID p_occluder) { void RaycastOcclusionCull::occluder_set_mesh(RID p_occluder, const PackedVector3Array &p_vertices, const PackedInt32Array &p_indices) { Occluder *occluder = occluder_owner.get_or_null(p_occluder); - ERR_FAIL_COND(!occluder); + ERR_FAIL_NULL(occluder); occluder->vertices = p_vertices; occluder->indices = p_indices; @@ -242,7 +242,7 @@ void RaycastOcclusionCull::occluder_set_mesh(RID p_occluder, const PackedVector3 void RaycastOcclusionCull::free_occluder(RID p_occluder) { Occluder *occluder = occluder_owner.get_or_null(p_occluder); - ERR_FAIL_COND(!occluder); + ERR_FAIL_NULL(occluder); memdelete(occluder); occluder_owner.free(p_occluder); } @@ -250,17 +250,15 @@ void RaycastOcclusionCull::free_occluder(RID p_occluder) { //////////////////////////////////////////////////////// void RaycastOcclusionCull::add_scenario(RID p_scenario) { - if (scenarios.has(p_scenario)) { - scenarios[p_scenario].removed = false; - } else { - scenarios[p_scenario] = Scenario(); - } + ERR_FAIL_COND(scenarios.has(p_scenario)); + scenarios[p_scenario] = Scenario(); } void RaycastOcclusionCull::remove_scenario(RID p_scenario) { - ERR_FAIL_COND(!scenarios.has(p_scenario)); - Scenario &scenario = scenarios[p_scenario]; - scenario.removed = true; + Scenario *scenario = scenarios.getptr(p_scenario); + ERR_FAIL_NULL(scenario); + scenario->free(); + scenarios.erase(p_scenario); } void RaycastOcclusionCull::scenario_set_instance(RID p_scenario, RID p_instance, RID p_occluder, const Transform3D &p_xform, bool p_enabled) { @@ -291,7 +289,7 @@ void RaycastOcclusionCull::scenario_set_instance(RID p_scenario, RID p_instance, if (p_occluder.is_valid()) { Occluder *occluder = occluder_owner.get_or_null(p_occluder); - ERR_FAIL_COND(!occluder); + ERR_FAIL_NULL(occluder); occluder->users.insert(InstanceID(p_scenario, p_instance)); } changed = true; @@ -390,6 +388,23 @@ void RaycastOcclusionCull::Scenario::_transform_vertices_range(const Vector3 *p_ } } +void RaycastOcclusionCull::Scenario::free() { + if (commit_thread) { + if (commit_thread->is_started()) { + commit_thread->wait_to_finish(); + } + memdelete(commit_thread); + commit_thread = nullptr; + } + + for (int i = 0; i < 2; i++) { + if (ebr_scene[i]) { + rtcReleaseScene(ebr_scene[i]); + ebr_scene[i] = nullptr; + } + } +} + void RaycastOcclusionCull::Scenario::_commit_scene(void *p_ud) { Scenario *scenario = (Scenario *)p_ud; int commit_idx = 1 - (scenario->current_scene_idx); @@ -397,8 +412,8 @@ void RaycastOcclusionCull::Scenario::_commit_scene(void *p_ud) { scenario->commit_done = true; } -bool RaycastOcclusionCull::Scenario::update() { - ERR_FAIL_COND_V(singleton == nullptr, false); +void RaycastOcclusionCull::Scenario::update() { + ERR_FAIL_NULL(singleton); if (commit_thread == nullptr) { commit_thread = memnew(Thread); @@ -409,22 +424,12 @@ bool RaycastOcclusionCull::Scenario::update() { commit_thread->wait_to_finish(); current_scene_idx = 1 - current_scene_idx; } else { - return false; - } - } - - if (removed) { - if (ebr_scene[0]) { - rtcReleaseScene(ebr_scene[0]); + return; } - if (ebr_scene[1]) { - rtcReleaseScene(ebr_scene[1]); - } - return true; } if (!dirty && removed_instances.is_empty() && dirty_instances_array.is_empty()) { - return false; + return; } for (const RID &scenario : removed_instances) { @@ -480,7 +485,6 @@ bool RaycastOcclusionCull::Scenario::update() { dirty = false; commit_done = false; commit_thread->start(&Scenario::_commit_scene, this); - return false; } void RaycastOcclusionCull::Scenario::_raycast(uint32_t p_idx, const RaycastThreadData *p_raycast_data) const { @@ -492,7 +496,7 @@ void RaycastOcclusionCull::Scenario::_raycast(uint32_t p_idx, const RaycastThrea } void RaycastOcclusionCull::Scenario::raycast(CameraRayTile *r_rays, const uint32_t *p_valid_masks, uint32_t p_tile_count) const { - ERR_FAIL_COND(singleton == nullptr); + ERR_FAIL_NULL(singleton); if (raycast_singleton->ebr_device == nullptr) { return; // Embree is initialized on demand when there is some scenario with occluders in it. } @@ -544,13 +548,7 @@ void RaycastOcclusionCull::buffer_update(RID p_buffer, const Transform3D &p_cam_ } Scenario &scenario = scenarios[buffer.scenario_rid]; - - bool removed = scenario.update(); - - if (removed) { - scenarios.erase(buffer.scenario_rid); - return; - } + scenario.update(); buffer.update_camera_rays(p_cam_transform, p_cam_projection, p_cam_orthogonal); @@ -603,19 +601,7 @@ RaycastOcclusionCull::RaycastOcclusionCull() { RaycastOcclusionCull::~RaycastOcclusionCull() { for (KeyValue<RID, Scenario> &K : scenarios) { - Scenario &scenario = K.value; - if (scenario.commit_thread) { - if (scenario.commit_thread->is_started()) { - scenario.commit_thread->wait_to_finish(); - } - memdelete(scenario.commit_thread); - } - - for (int i = 0; i < 2; i++) { - if (scenario.ebr_scene[i]) { - rtcReleaseScene(scenario.ebr_scene[i]); - } - } + K.value.free(); } if (ebr_device != nullptr) { |