From 05179a0ba4898c716a4b9b2d5e169c09b57e84fb Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Tue, 19 Jan 2021 18:01:22 +0100 Subject: Volumes: fix calling BKE_volume_load from multiple threads `BKE_volume_is_loaded` uses `grids.filepath` to determine if the grids are already loaded. The issue was that `grids.filepath` was set before the grids were loaded, resulting in incorrect early returns for other threads. Differential Revision: https://developer.blender.org/D10150 --- source/blender/blenkernel/intern/volume.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc index eadb01c43fc..9e7a3736141 100644 --- a/source/blender/blenkernel/intern/volume.cc +++ b/source/blender/blenkernel/intern/volume.cc @@ -783,21 +783,22 @@ bool BKE_volume_load(Volume *volume, Main *bmain) /* Get absolute file path at current frame. */ const char *volume_name = volume->id.name + 2; - volume_filepath_get(bmain, volume, grids.filepath); + char filepath[FILE_MAX]; + volume_filepath_get(bmain, volume, filepath); - CLOG_INFO(&LOG, 1, "Volume %s: load %s", volume_name, grids.filepath); + CLOG_INFO(&LOG, 1, "Volume %s: load %s", volume_name, filepath); /* Test if file exists. */ - if (!BLI_exists(grids.filepath)) { + if (!BLI_exists(filepath)) { char filename[FILE_MAX]; - BLI_split_file_part(grids.filepath, filename, sizeof(filename)); + BLI_split_file_part(filepath, filename, sizeof(filename)); grids.error_msg = filename + std::string(" not found"); CLOG_INFO(&LOG, 1, "Volume %s: %s", volume_name, grids.error_msg.c_str()); return false; } /* Open OpenVDB file. */ - openvdb::io::File file(grids.filepath); + openvdb::io::File file(filepath); openvdb::GridPtrVec vdb_grids; try { @@ -814,11 +815,13 @@ bool BKE_volume_load(Volume *volume, Main *bmain) /* Add grids read from file to own vector, filtering out any NULL pointers. */ for (const openvdb::GridBase::Ptr &vdb_grid : vdb_grids) { if (vdb_grid) { - VolumeFileCache::Entry template_entry(grids.filepath, vdb_grid); + VolumeFileCache::Entry template_entry(filepath, vdb_grid); grids.emplace_back(template_entry, volume->runtime.default_simplify_level); } } + BLI_strncpy(grids.filepath, filepath, FILE_MAX); + return grids.error_msg.empty(); #else UNUSED_VARS(bmain, volume); -- cgit v1.2.3