diff options
-rw-r--r-- | source/blender/blenkernel/BKE_volume.h | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/volume.cc | 37 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_volume.c | 8 |
3 files changed, 51 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); diff --git a/source/blender/makesrna/intern/rna_volume.c b/source/blender/makesrna/intern/rna_volume.c index 8a5e25c52fb..7f3941e29b8 100644 --- a/source/blender/makesrna/intern/rna_volume.c +++ b/source/blender/makesrna/intern/rna_volume.c @@ -343,6 +343,14 @@ static void rna_def_volume_grids(BlenderRNA *brna, PropertyRNA *cprop) func = RNA_def_function(srna, "unload", "BKE_volume_unload"); RNA_def_function_ui_description(func, "Unload all grid and voxel data from memory"); + + func = RNA_def_function(srna, "save", "BKE_volume_save"); + RNA_def_function_ui_description(func, "Save grids and metadata to file"); + RNA_def_function_flag(func, FUNC_USE_MAIN | FUNC_USE_REPORTS); + parm = RNA_def_string_file_path(func, "filepath", NULL, 0, "", "File path to save to"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + parm = RNA_def_boolean(func, "success", 0, "", "True if grid list was successfully loaded"); + RNA_def_function_return(func, parm); } static void rna_def_volume_display(BlenderRNA *brna) |