diff options
author | Brecht Van Lommel <brecht@blender.org> | 2020-11-12 22:19:30 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2020-11-12 22:30:14 +0300 |
commit | b6988de22a9c1b78fe4f5ddedfd4467db1d8e209 (patch) | |
tree | 1afe1f40db2decd3c2c60b3852ff1776369fb46c /intern/cycles | |
parent | a6c1c0427c947673b5e05d584bd82285a630336c (diff) | |
parent | d59fa12f2ad5c57c68d63e476270fcd274b61062 (diff) |
Merge branch 'blender-v2.91-release'
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/blender/blender_session.cpp | 2 | ||||
-rw-r--r-- | intern/cycles/blender/blender_volume.cpp | 25 | ||||
-rw-r--r-- | intern/cycles/render/geometry.cpp | 39 | ||||
-rw-r--r-- | intern/cycles/render/session.cpp | 35 | ||||
-rw-r--r-- | intern/cycles/render/session.h | 1 | ||||
-rw-r--r-- | intern/cycles/render/volume.cpp | 65 |
6 files changed, 89 insertions, 78 deletions
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 770f4ca51c9..8566d0e7ed5 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -260,6 +260,8 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg void BlenderSession::free_session() { + session->cancel(); + delete sync; delete session; } diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp index 1843fecd586..094d4bbc08c 100644 --- a/intern/cycles/blender/blender_volume.cpp +++ b/intern/cycles/blender/blender_volume.cpp @@ -242,13 +242,6 @@ class BlenderVolumeLoader : public VDBImageLoader { #endif } - bool equals(const ImageLoader &other) const override - { - /* TODO: detect multiple volume datablocks with the same filepath. */ - const BlenderVolumeLoader &other_loader = (const BlenderVolumeLoader &)other; - return b_volume == other_loader.b_volume && grid_name == other_loader.grid_name; - } - BL::Volume b_volume; }; @@ -307,23 +300,8 @@ static void sync_volume_object(BL::BlendData &b_data, } } -/* If the voxel attributes change, we need to rebuild the bounding mesh. */ -static vector<int> get_voxel_image_slots(Mesh *mesh) -{ - vector<int> slots; - for (const Attribute &attr : mesh->attributes.attributes) { - if (attr.element == ATTR_ELEMENT_VOXEL) { - slots.push_back(attr.data_voxel().svm_slot()); - } - } - - return slots; -} - void BlenderSync::sync_volume(BL::Object &b_ob, Volume *volume) { - vector<int> old_voxel_slots = get_voxel_image_slots(volume); - volume->clear(true); if (view_layer.use_volumes) { @@ -339,8 +317,7 @@ void BlenderSync::sync_volume(BL::Object &b_ob, Volume *volume) } /* Tag update. */ - bool rebuild = (old_voxel_slots != get_voxel_image_slots(volume)); - volume->tag_update(scene, rebuild); + volume->tag_update(scene, true); } CCL_NAMESPACE_END diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp index a63fc620c69..12f4eaf0b79 100644 --- a/intern/cycles/render/geometry.cpp +++ b/intern/cycles/render/geometry.cpp @@ -1410,12 +1410,17 @@ void GeometryManager::device_update(Device *device, true_displacement_used = true; } - if (progress.get_cancel()) + if (progress.get_cancel()) { return; + } } } } + if (progress.get_cancel()) { + return; + } + /* Tessellate meshes that are using subdivision */ if (total_tess_needed) { scoped_callback_timer timer([scene](double time) { @@ -1453,10 +1458,15 @@ void GeometryManager::device_update(Device *device, i++; - if (progress.get_cancel()) + if (progress.get_cancel()) { return; + } } } + + if (progress.get_cancel()) { + return; + } } /* Update images needed for true displacement. */ @@ -1486,8 +1496,9 @@ void GeometryManager::device_update(Device *device, }); device_update_mesh(device, dscene, scene, true, progress); } - if (progress.get_cancel()) + if (progress.get_cancel()) { return; + } { scoped_callback_timer timer([scene](double time) { @@ -1496,8 +1507,9 @@ void GeometryManager::device_update(Device *device, } }); device_update_attributes(device, dscene, scene, progress); - if (progress.get_cancel()) + if (progress.get_cancel()) { return; + } } /* Update displacement. */ @@ -1527,11 +1539,16 @@ void GeometryManager::device_update(Device *device, } } - if (progress.get_cancel()) + if (progress.get_cancel()) { return; + } } } + if (progress.get_cancel()) { + return; + } + /* Device re-update after displacement. */ if (displacement_done) { scoped_callback_timer timer([scene](double time) { @@ -1543,8 +1560,9 @@ void GeometryManager::device_update(Device *device, device_free(device, dscene); device_update_attributes(device, dscene, scene, progress); - if (progress.get_cancel()) + if (progress.get_cancel()) { return; + } } { @@ -1591,8 +1609,9 @@ void GeometryManager::device_update(Device *device, } } - if (progress.get_cancel()) + if (progress.get_cancel()) { return; + } { scoped_callback_timer timer([scene](double time) { @@ -1601,8 +1620,9 @@ void GeometryManager::device_update(Device *device, } }); device_update_bvh(device, dscene, scene, progress); - if (progress.get_cancel()) + if (progress.get_cancel()) { return; + } } { @@ -1613,8 +1633,9 @@ void GeometryManager::device_update(Device *device, } }); device_update_mesh(device, dscene, scene, false, progress); - if (progress.get_cancel()) + if (progress.get_cancel()) { return; + } } need_update = false; diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index a60542259f6..524a0e3b9d4 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -98,21 +98,7 @@ Session::Session(const SessionParams ¶ms_) Session::~Session() { - if (session_thread) { - /* wait for session thread to end */ - progress.set_cancel("Exiting"); - - gpu_need_display_buffer_update = false; - gpu_need_display_buffer_update_cond.notify_all(); - - { - thread_scoped_lock pause_lock(pause_mutex); - pause = false; - } - pause_cond.notify_all(); - - wait(); - } + cancel(); if (buffers && params.write_render_cb) { /* Copy to display buffer and write out image if requested */ @@ -146,6 +132,25 @@ void Session::start() } } +void Session::cancel() +{ + if (session_thread) { + /* wait for session thread to end */ + progress.set_cancel("Exiting"); + + gpu_need_display_buffer_update = false; + gpu_need_display_buffer_update_cond.notify_all(); + + { + thread_scoped_lock pause_lock(pause_mutex); + pause = false; + } + pause_cond.notify_all(); + + wait(); + } +} + bool Session::ready_to_reset() { double dt = time_dt() - reset_time; diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h index 770d3124db7..ab6c0b5f124 100644 --- a/intern/cycles/render/session.h +++ b/intern/cycles/render/session.h @@ -146,6 +146,7 @@ class Session { ~Session(); void start(); + void cancel(); bool draw(BufferParams ¶ms, DeviceDrawParams &draw_params); void wait(); diff --git a/intern/cycles/render/volume.cpp b/intern/cycles/render/volume.cpp index 63261d6a247..64196cdd8a8 100644 --- a/intern/cycles/render/volume.cpp +++ b/intern/cycles/render/volume.cpp @@ -491,6 +491,39 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress) string msg = string_printf("Computing Volume Mesh %s", volume->name.c_str()); progress.set_status("Updating Mesh", msg); + /* Find shader and compute padding based on volume shader interpolation settings. */ + Shader *volume_shader = NULL; + int pad_size = 0; + + foreach (Node *node, volume->get_used_shaders()) { + Shader *shader = static_cast<Shader *>(node); + + if (!shader->has_volume) { + continue; + } + + volume_shader = shader; + + if (shader->get_volume_interpolation_method() == VOLUME_INTERPOLATION_LINEAR) { + pad_size = max(1, pad_size); + } + else if (shader->get_volume_interpolation_method() == VOLUME_INTERPOLATION_CUBIC) { + pad_size = max(2, pad_size); + } + + break; + } + + /* Clear existing volume mesh, done here in case we early out due to + * empty grid or missing volume shader. */ + volume->clear(); + volume->need_update_rebuild = true; + + if (!volume_shader) { + return; + } + + /* Create volume mesh builder. */ VolumeMeshBuilder builder; #ifdef WITH_OPENVDB @@ -537,37 +570,11 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress) } #endif + /* If nothing to build, early out. */ if (builder.empty_grid()) { return; } - /* Compute padding. */ - Shader *volume_shader = NULL; - int pad_size = 0; - - foreach (Node *node, volume->get_used_shaders()) { - Shader *shader = static_cast<Shader *>(node); - - if (!shader->has_volume) { - continue; - } - - volume_shader = shader; - - if (shader->get_volume_interpolation_method() == VOLUME_INTERPOLATION_LINEAR) { - pad_size = max(1, pad_size); - } - else if (shader->get_volume_interpolation_method() == VOLUME_INTERPOLATION_CUBIC) { - pad_size = max(2, pad_size); - } - - break; - } - - if (!volume_shader) { - return; - } - builder.add_padding(pad_size); /* Slightly offset vertex coordinates to avoid overlapping faces with other @@ -583,11 +590,9 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress) vector<float3> face_normals; builder.create_mesh(vertices, indices, face_normals, face_overlap_avoidance); - volume->clear(); volume->reserve_mesh(vertices.size(), indices.size() / 3); + volume->used_shaders.clear(); volume->used_shaders.push_back_slow(volume_shader); - volume->tag_modified(); - volume->need_update_rebuild = true; for (size_t i = 0; i < vertices.size(); ++i) { volume->add_vertex(vertices[i]); |