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:
-rw-r--r--source/blender/blenkernel/BKE_volume.h7
-rw-r--r--source/blender/blenkernel/intern/volume.cc37
-rw-r--r--source/blender/makesrna/intern/rna_volume.c8
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)