Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2021-01-19 20:01:22 +0300
committerJacques Lucke <jacques@blender.org>2021-01-19 20:01:22 +0300
commit05179a0ba4898c716a4b9b2d5e169c09b57e84fb (patch)
tree8e43ac2011bf00268fb250cbc98f23b0e00a0a70 /source/blender/blenkernel/intern/volume.cc
parent8b777ee6d69d4805c64756cf6a33db894160ce29 (diff)
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
Diffstat (limited to 'source/blender/blenkernel/intern/volume.cc')
-rw-r--r--source/blender/blenkernel/intern/volume.cc15
1 files 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);