diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_volume.h | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/volume.cc | 37 |
2 files changed, 43 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_volume.h b/source/blender/blenkernel/BKE_volume.h index 738042cc3c0..e199a113410 100644 --- a/source/blender/blenkernel/BKE_volume.h +++ b/source/blender/blenkernel/BKE_volume.h @@ -30,6 +30,7 @@ struct BoundBox; struct Depsgraph; struct Main; struct Object; +struct ReportList; struct Scene; struct Volume; struct VolumeGridVector; @@ -143,6 +144,12 @@ struct VolumeGrid *BKE_volume_grid_add(struct Volume *volume, VolumeGridType type); void BKE_volume_grid_remove(struct Volume *volume, struct VolumeGrid *grid); +/* File Save */ +bool BKE_volume_save(struct Volume *volume, + struct Main *bmain, + struct ReportList *reports, + const char *filename); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc index 7e895e0ba7a..87c45753393 100644 --- a/source/blender/blenkernel/intern/volume.cc +++ b/source/blender/blenkernel/intern/volume.cc @@ -44,6 +44,7 @@ #include "BKE_modifier.h" #include "BKE_object.h" #include "BKE_packedFile.h" +#include "BKE_report.h" #include "BKE_scene.h" #include "BKE_volume.h" @@ -401,7 +402,7 @@ struct VolumeGrid { * the actual grids are always saved in a VDB file. */ struct VolumeGridVector : public std::list<VolumeGrid> { - VolumeGridVector() + VolumeGridVector() : metadata(new openvdb::MetaMap()) { filepath[0] = '\0'; } @@ -803,6 +804,40 @@ void BKE_volume_unload(Volume *volume) #endif } +/* File Save */ + +bool BKE_volume_save(Volume *volume, Main *bmain, ReportList *reports, const char *filepath) +{ +#ifdef WITH_OPENVDB + if (!BKE_volume_load(volume, bmain)) { + BKE_reportf(reports, RPT_ERROR, "Could not load volume for writing"); + return false; + } + + VolumeGridVector &grids = *volume->runtime.grids; + openvdb::GridCPtrVec vdb_grids; + + for (VolumeGrid &grid : grids) { + vdb_grids.push_back(BKE_volume_grid_openvdb_for_read(volume, &grid)); + } + + try { + openvdb::io::File file(filepath); + file.write(vdb_grids, *grids.metadata); + file.close(); + } + catch (const openvdb::IoError &e) { + BKE_reportf(reports, RPT_ERROR, "Could not write volume: %s", e.what()); + return false; + } + + return true; +#else + UNUSED_VARS(volume, bmain, reports, filepath); + return false; +#endif +} + BoundBox *BKE_volume_boundbox_get(Object *ob) { BLI_assert(ob->type == OB_VOLUME); |