Merge branch 'blender-v2.91-release'
This commit is contained in:
commit
b6988de22a
@ -260,6 +260,8 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg
|
|||||||
|
|
||||||
void BlenderSession::free_session()
|
void BlenderSession::free_session()
|
||||||
{
|
{
|
||||||
|
session->cancel();
|
||||||
|
|
||||||
delete sync;
|
delete sync;
|
||||||
delete session;
|
delete session;
|
||||||
}
|
}
|
||||||
|
@ -242,13 +242,6 @@ class BlenderVolumeLoader : public VDBImageLoader {
|
|||||||
#endif
|
#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;
|
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)
|
void BlenderSync::sync_volume(BL::Object &b_ob, Volume *volume)
|
||||||
{
|
{
|
||||||
vector<int> old_voxel_slots = get_voxel_image_slots(volume);
|
|
||||||
|
|
||||||
volume->clear(true);
|
volume->clear(true);
|
||||||
|
|
||||||
if (view_layer.use_volumes) {
|
if (view_layer.use_volumes) {
|
||||||
@ -339,8 +317,7 @@ void BlenderSync::sync_volume(BL::Object &b_ob, Volume *volume)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Tag update. */
|
/* Tag update. */
|
||||||
bool rebuild = (old_voxel_slots != get_voxel_image_slots(volume));
|
volume->tag_update(scene, true);
|
||||||
volume->tag_update(scene, rebuild);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CCL_NAMESPACE_END
|
CCL_NAMESPACE_END
|
||||||
|
@ -1410,12 +1410,17 @@ void GeometryManager::device_update(Device *device,
|
|||||||
true_displacement_used = true;
|
true_displacement_used = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress.get_cancel())
|
if (progress.get_cancel()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (progress.get_cancel()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Tessellate meshes that are using subdivision */
|
/* Tessellate meshes that are using subdivision */
|
||||||
if (total_tess_needed) {
|
if (total_tess_needed) {
|
||||||
scoped_callback_timer timer([scene](double time) {
|
scoped_callback_timer timer([scene](double time) {
|
||||||
@ -1453,10 +1458,15 @@ void GeometryManager::device_update(Device *device,
|
|||||||
|
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
if (progress.get_cancel())
|
if (progress.get_cancel()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (progress.get_cancel()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update images needed for true displacement. */
|
/* Update images needed for true displacement. */
|
||||||
@ -1486,8 +1496,9 @@ void GeometryManager::device_update(Device *device,
|
|||||||
});
|
});
|
||||||
device_update_mesh(device, dscene, scene, true, progress);
|
device_update_mesh(device, dscene, scene, true, progress);
|
||||||
}
|
}
|
||||||
if (progress.get_cancel())
|
if (progress.get_cancel()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
scoped_callback_timer timer([scene](double time) {
|
scoped_callback_timer timer([scene](double time) {
|
||||||
@ -1496,8 +1507,9 @@ void GeometryManager::device_update(Device *device,
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
device_update_attributes(device, dscene, scene, progress);
|
device_update_attributes(device, dscene, scene, progress);
|
||||||
if (progress.get_cancel())
|
if (progress.get_cancel()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update displacement. */
|
/* Update displacement. */
|
||||||
@ -1527,11 +1539,16 @@ void GeometryManager::device_update(Device *device,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress.get_cancel())
|
if (progress.get_cancel()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (progress.get_cancel()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Device re-update after displacement. */
|
/* Device re-update after displacement. */
|
||||||
if (displacement_done) {
|
if (displacement_done) {
|
||||||
scoped_callback_timer timer([scene](double time) {
|
scoped_callback_timer timer([scene](double time) {
|
||||||
@ -1543,8 +1560,9 @@ void GeometryManager::device_update(Device *device,
|
|||||||
device_free(device, dscene);
|
device_free(device, dscene);
|
||||||
|
|
||||||
device_update_attributes(device, dscene, scene, progress);
|
device_update_attributes(device, dscene, scene, progress);
|
||||||
if (progress.get_cancel())
|
if (progress.get_cancel()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -1591,8 +1609,9 @@ void GeometryManager::device_update(Device *device,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress.get_cancel())
|
if (progress.get_cancel()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
scoped_callback_timer timer([scene](double time) {
|
scoped_callback_timer timer([scene](double time) {
|
||||||
@ -1601,8 +1620,9 @@ void GeometryManager::device_update(Device *device,
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
device_update_bvh(device, dscene, scene, progress);
|
device_update_bvh(device, dscene, scene, progress);
|
||||||
if (progress.get_cancel())
|
if (progress.get_cancel()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -1613,8 +1633,9 @@ void GeometryManager::device_update(Device *device,
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
device_update_mesh(device, dscene, scene, false, progress);
|
device_update_mesh(device, dscene, scene, false, progress);
|
||||||
if (progress.get_cancel())
|
if (progress.get_cancel()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
need_update = false;
|
need_update = false;
|
||||||
|
@ -98,21 +98,7 @@ Session::Session(const SessionParams ¶ms_)
|
|||||||
|
|
||||||
Session::~Session()
|
Session::~Session()
|
||||||
{
|
{
|
||||||
if (session_thread) {
|
cancel();
|
||||||
/* 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();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buffers && params.write_render_cb) {
|
if (buffers && params.write_render_cb) {
|
||||||
/* Copy to display buffer and write out image if requested */
|
/* 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()
|
bool Session::ready_to_reset()
|
||||||
{
|
{
|
||||||
double dt = time_dt() - reset_time;
|
double dt = time_dt() - reset_time;
|
||||||
|
@ -146,6 +146,7 @@ class Session {
|
|||||||
~Session();
|
~Session();
|
||||||
|
|
||||||
void start();
|
void start();
|
||||||
|
void cancel();
|
||||||
bool draw(BufferParams ¶ms, DeviceDrawParams &draw_params);
|
bool draw(BufferParams ¶ms, DeviceDrawParams &draw_params);
|
||||||
void wait();
|
void wait();
|
||||||
|
|
||||||
|
@ -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());
|
string msg = string_printf("Computing Volume Mesh %s", volume->name.c_str());
|
||||||
progress.set_status("Updating Mesh", msg);
|
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;
|
VolumeMeshBuilder builder;
|
||||||
|
|
||||||
#ifdef WITH_OPENVDB
|
#ifdef WITH_OPENVDB
|
||||||
@ -537,37 +570,11 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* If nothing to build, early out. */
|
||||||
if (builder.empty_grid()) {
|
if (builder.empty_grid()) {
|
||||||
return;
|
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);
|
builder.add_padding(pad_size);
|
||||||
|
|
||||||
/* Slightly offset vertex coordinates to avoid overlapping faces with other
|
/* 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;
|
vector<float3> face_normals;
|
||||||
builder.create_mesh(vertices, indices, face_normals, face_overlap_avoidance);
|
builder.create_mesh(vertices, indices, face_normals, face_overlap_avoidance);
|
||||||
|
|
||||||
volume->clear();
|
|
||||||
volume->reserve_mesh(vertices.size(), indices.size() / 3);
|
volume->reserve_mesh(vertices.size(), indices.size() / 3);
|
||||||
|
volume->used_shaders.clear();
|
||||||
volume->used_shaders.push_back_slow(volume_shader);
|
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) {
|
for (size_t i = 0; i < vertices.size(); ++i) {
|
||||||
volume->add_vertex(vertices[i]);
|
volume->add_vertex(vertices[i]);
|
||||||
|
@ -576,6 +576,12 @@ class USERPREF_PT_system_sound(SystemPanel, CenterAlignMixIn, Panel):
|
|||||||
class USERPREF_PT_system_cycles_devices(SystemPanel, CenterAlignMixIn, Panel):
|
class USERPREF_PT_system_cycles_devices(SystemPanel, CenterAlignMixIn, Panel):
|
||||||
bl_label = "Cycles Render Devices"
|
bl_label = "Cycles Render Devices"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
# No GPU rendering on macOS currently.
|
||||||
|
import sys
|
||||||
|
return bpy.app.build_options.cycles and sys.platform != "darwin"
|
||||||
|
|
||||||
def draw_centered(self, context, layout):
|
def draw_centered(self, context, layout):
|
||||||
prefs = context.preferences
|
prefs = context.preferences
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user