[Bf-blender-cvs] [281db895f33] soc-2018-cycles-volumes: Simple OpenVDB import GUI.

Geraldine Chua noreply at git.blender.org
Tue Jul 10 09:57:05 CEST 2018


Commit: 281db895f33a3481d1a5b7689cb2e5c914613261
Author: Geraldine Chua
Date:   Tue Jul 10 15:56:23 2018 +0800
Branches: soc-2018-cycles-volumes
https://developer.blender.org/rB281db895f33a3481d1a5b7689cb2e5c914613261

Simple OpenVDB import GUI.

===================================================================

M	release/scripts/startup/bl_ui/space_info.py
M	source/blender/blenkernel/BKE_pointcache.h
M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/editors/io/CMakeLists.txt
A	source/blender/editors/io/io_openvdb.c
A	source/blender/editors/io/io_openvdb.h
M	source/blender/editors/io/io_ops.c
M	source/blender/editors/space_file/filelist.c
M	source/blender/editors/space_file/filesel.c
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/windowmanager/intern/wm_operator_props.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py
index 180e48af386..64477d56e55 100644
--- a/release/scripts/startup/bl_ui/space_info.py
+++ b/release/scripts/startup/bl_ui/space_info.py
@@ -173,6 +173,8 @@ class INFO_MT_file_import(Menu):
             self.layout.operator("wm.collada_import", text="Collada (Default) (.dae)")
         if bpy.app.build_options.alembic:
             self.layout.operator("wm.alembic_import", text="Alembic (.abc)")
+        if bpy.app.build_options.openvdb:
+            self.layout.operator("wm.openvdb_import", text="OpenVDB (.vdb)")
 
 
 class INFO_MT_file_export(Menu):
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index cc60df1b2d6..8873b70f992 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -125,6 +125,7 @@ typedef struct PTCacheFile {
 enum {
 	PTCACHE_FILE_PTCACHE = 0,
 	PTCACHE_FILE_OPENVDB = 1,
+	PTCACHE_FILE_OPENVDB_EXTERN = 2,
 };
 
 typedef struct PTCacheID {
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 3d1cdba1cdd..a8b63e131a2 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1156,6 +1156,96 @@ static int ptcache_smoke_openvdb_read(struct OpenVDBReader *reader, void *smoke_
 
 	return 1;
 }
+
+static int ptcache_smoke_openvdb_extern_read(struct OpenVDBReader *reader, void *smoke_v)
+{
+	SmokeModifierData *smd = (SmokeModifierData *)smoke_v;
+
+	if (!smd) {
+		return 0;
+	}
+
+	SmokeDomainSettings *sds = smd->domain;
+
+	int fluid_fields = smoke_get_data_flags(sds);
+	int cache_fields = 0;
+	bool reallocate = false;
+	int res[3], res_min[3], res_max[3];
+
+	if (!OpenVDBReader_has_smoke_grid(reader, VDB_SMOKE_DENSITY) &&
+	    !OpenVDBReader_has_smoke_grid(reader, VDB_SMOKE_FLAME))
+	{
+		return 0;
+	}
+
+	if (!OpenVDBReader_get_detailed_bounds(reader, res_min, res_max, res,
+	                                       sds->p0, sds->p1, sds->cell_size))
+	{
+		modifier_setError((ModifierData *)smd, "Imported OpenVDB grids have different transformations");
+	}
+
+	sds->res_min[0] = sds->res_min[1] = sds->res_min[2] = 0;
+	VECSUB(sds->res_max, res_max, res_min);
+	sub_v3_v3v3(sds->global_size, sds->p1, sds->p0);
+
+	if (sds->res[0] != res[0] || sds->res[1] != res[1] || sds->res[2] != res[2])
+	{
+		reallocate = true;
+		VECCOPY(sds->res, res);
+	}
+
+	/* check if active fields have changed */
+	if (OpenVDBReader_has_smoke_grid(reader, VDB_SMOKE_HEAT) ||
+		OpenVDBReader_has_smoke_grid(reader, VDB_SMOKE_TEMPERATURE)) {
+		cache_fields |= SM_ACTIVE_HEAT;
+	}
+	if (OpenVDBReader_has_smoke_grid(reader, VDB_SMOKE_FLAME)) {
+		cache_fields |= SM_ACTIVE_FIRE;
+	}
+	if (OpenVDBReader_has_smoke_grid(reader, VDB_SMOKE_COLOR)) {
+		cache_fields |= SM_ACTIVE_COLORS;
+	}
+
+	reallocate = (reallocate || ((fluid_fields == cache_fields) && (sds->active_fields == cache_fields)));
+
+	/* reallocate fluid if needed */
+	if (reallocate) {
+		sds->active_fields = cache_fields;
+		sds->maxres = MAX3(sds->base_res[0], sds->base_res[1], sds->base_res[2]);
+		sds->dx = 1.0f / sds->maxres;
+		smoke_reallocate_fluid(sds, sds->dx, sds->res, 1);
+		sds->total_cells = sds->res[0] * sds->res[1] * sds->res[2];
+	}
+
+	if (sds->fluid) {
+		float dt, dx, *dens, *react, *fuel, *flame, *heat, *heatold, *vx, *vy, *vz, *r, *g, *b;
+		unsigned char *obstacles;
+
+		smoke_export(sds->fluid, &dt, &dx, &dens, &react, &flame, &fuel, &heat,
+		             &heatold, &vx, &vy, &vz, &r, &g, &b, &obstacles);
+
+		if (OpenVDBReader_has_smoke_grid(reader, VDB_SMOKE_DENSITY)) {
+			OpenVDB_import_grid_fl(reader, vdb_grid_name(VDB_SMOKE_DENSITY), &dens, sds->res);
+		}
+		if(OpenVDBReader_has_smoke_grid(reader, VDB_SMOKE_HEAT)) {
+			OpenVDB_import_grid_fl(reader, vdb_grid_name(VDB_SMOKE_HEAT), &heat, sds->res);
+		}
+	    else if(OpenVDBReader_has_smoke_grid(reader, VDB_SMOKE_TEMPERATURE)) {
+			OpenVDB_import_grid_fl(reader, vdb_grid_name(VDB_SMOKE_TEMPERATURE), &heat, sds->res);
+		}
+		if (cache_fields & SM_ACTIVE_FIRE) {
+			OpenVDB_import_grid_fl(reader, vdb_grid_name(VDB_SMOKE_FLAME), &flame, sds->res);
+		}
+		if (cache_fields & SM_ACTIVE_COLORS) {
+			OpenVDB_import_grid_vec(reader, vdb_grid_name(VDB_SMOKE_COLOR), &r, &g, &b, sds->res);
+		}
+		if (OpenVDBReader_has_smoke_grid(reader, VDB_SMOKE_VELOCITY)) {
+			OpenVDB_import_grid_vec(reader, vdb_grid_name(VDB_SMOKE_VELOCITY), &vx, &vy, &vz, sds->res);
+		}
+	}
+
+	return 1;
+}
 #endif
 
 #else // WITH_SMOKE
@@ -1177,6 +1267,12 @@ static int ptcache_smoke_openvdb_read(struct OpenVDBReader *reader, void *smoke_
 	UNUSED_VARS(reader, smoke_v);
 	return 0;
 }
+
+static int ptcache_smoke_openvdb_extern_read(struct OpenVDBReader *reader, void *smoke_v)
+{
+	UNUSED_VARS(reader, smoke_v);
+	return 0;
+}
 #endif
 
 static int ptcache_dynamicpaint_totpoint(void *sd, int UNUSED(cfra))
@@ -1544,7 +1640,7 @@ void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeMo
 	pid->write_stream			= ptcache_smoke_write;
 
 	pid->write_openvdb_stream	= ptcache_smoke_openvdb_write;
-	pid->read_openvdb_stream	= ptcache_smoke_openvdb_read;
+	pid->read_openvdb_stream	= (sds->cache_file_format == PTCACHE_FILE_OPENVDB_EXTERN ? ptcache_smoke_openvdb_extern_read : ptcache_smoke_openvdb_read);
 
 	pid->write_extra_data		= NULL;
 	pid->read_extra_data		= NULL;
@@ -1868,6 +1964,19 @@ static int ptcache_filename(PTCacheID *pid, char *filename, int cfra, short do_p
 	return len; /* make sure the above string is always 16 chars */
 }
 
+static void openvdb_filepath(PTCacheID *pid, char *filepath)
+{
+	SmokeModifierData *smd = (SmokeModifierData *)pid->calldata;
+
+	BLI_strncpy(filepath, smd->domain->openvdb_filepath, 1024);
+
+	if (BLI_path_is_rel(filepath)) {
+		Library *lib = (pid->ob) ? pid->ob->id.lib : NULL;
+		const char *blendfilename = (lib && (pid->cache->flag & PTCACHE_IGNORE_LIBPATH) == 0) ? lib->filepath: G.main->name;
+		BLI_path_abs(filepath, blendfilename);
+	}
+}
+
 /* youll need to close yourself after! */
 static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra)
 {
@@ -2525,6 +2634,30 @@ static int ptcache_read_openvdb_stream(PTCacheID *pid, int cfra)
 #endif
 }
 
+static int ptcache_read_openvdb_extern_stream(PTCacheID *pid)
+{
+#if defined(WITH_OPENVDB) && defined(WITH_SMOKE)
+	char filepath[FILE_MAX * 2];
+
+	openvdb_filepath(pid, filepath);
+
+	if (!BLI_exists(filepath)) {
+		return 0;
+	}
+
+	struct OpenVDBReader *reader = OpenVDBReader_create();
+	OpenVDBReader_open(reader, filepath);
+
+	int result = pid->read_openvdb_stream(reader, pid->calldata);
+
+	OpenVDBReader_free(reader);
+	return result;
+#else
+	UNUSED_VARS(pid);
+	return 0;
+#endif
+}
+
 static int ptcache_read(PTCacheID *pid, int cfra)
 {
 	PTCacheMem *pm = NULL;
@@ -2639,6 +2772,10 @@ int BKE_ptcache_read(PTCacheID *pid, float cfra, bool no_extrapolate_old)
 	int cfrai = (int)floor(cfra), cfra1=0, cfra2=0;
 	int ret = 0;
 
+	if (pid->file_type == PTCACHE_FILE_OPENVDB_EXTERN && pid->read_openvdb_stream) {
+		return ptcache_read_openvdb_extern_stream(pid);
+	}
+
 	/* nothing to read to */
 	if (pid->totpoint(pid->calldata, cfrai) == 0)
 		return 0;
@@ -3097,6 +3234,14 @@ int  BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
 	if (!pid->cache)
 		return 0;
 
+	if (pid->file_type == PTCACHE_FILE_OPENVDB_EXTERN) {
+		char filename[MAX_PTCACHE_PATH];
+
+		openvdb_filepath(pid, filename);
+
+		return BLI_exists(filename);
+	}
+
 	if (cfra<pid->cache->startframe || cfra > pid->cache->endframe)
 		return 0;
 
diff --git a/source/blender/editors/io/CMakeLists.txt b/source/blender/editors/io/CMakeLists.txt
index b3bbce939a5..2a6f1a27564 100644
--- a/source/blender/editors/io/CMakeLists.txt
+++ b/source/blender/editors/io/CMakeLists.txt
@@ -30,6 +30,7 @@ set(INC
 	../../collada
 	../../alembic
 	../../../../intern/guardedalloc
+	../../../../intern/openvdb
 )
 
 set(INC_SYS
@@ -40,11 +41,13 @@ set(SRC
 	io_alembic.c
 	io_cache.c
 	io_collada.c
+	io_openvdb.c
 	io_ops.c
 
 	io_alembic.h
 	io_cache.h
 	io_collada.h
+	io_openvdb.h
 	io_ops.h
 )
 
@@ -60,6 +63,10 @@ if(WITH_ALEMBIC)
 	endif()
 endif()
 
+if(WITH_OPENVDB)
+	add_definitions(-DWITH_OPENVDB)
+endif()
+
 if(WITH_INTERNATIONAL)
 	add_definitions(-DWITH_INTERNATIONAL)
 endif()
diff --git a/source/blender/editors/io/io_openvdb.c b/source/blender/editors/io/io_openvdb.c
new file mode 100644
index 00000000000..16beac0e195
--- /dev/null
+++ b/source/blender/editors/io/io_openvdb.c
@@ -0,0 +1,86 @@
+
+#include "DNA_object_types.h"
+#include "DNA_smoke_types.h"
+#include "DNA_space_types.h"
+
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
+#include "BKE_pointcache.h"
+#include "BKE_report.h"
+#include "BKE_smoke.h"
+
+#include "BLI_fileops.h"
+#include "BLI_listbase.h"
+#include "BLI_path_util.h"
+#include "BLI_string.h"
+
+#include "RNA_access.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "io_openvdb.h"
+#include "openvdb_capi.h"
+
+static void wm_openvdb_import_draw(bContext *UNUSED(C), wmOperator *op)
+{
+	PointerRNA ptr;
+
+	RNA_pointer_create(NULL, op->type->srna, op->properties, &ptr);
+}
+
+static int wm_openvdb_import_exec(bContext *C, wmOperator *op)
+{
+	if (!RNA_struct_property_is_set(op->ptr, "filepath")) {
+		BKE_report(op->reports, RPT_ERROR, "No filename given");
+		return OPERATOR_CANCELLED;
+	}
+
+	char filepath[FILE_MAX];
+	char filename[64];
+
+	RNA_string_get(op->ptr, "filepath", filepath);
+	BLI_split_file_part(filepath, filename, 64);
+
+	Main *bmain = CTX_data_main(C);
+	Scene *scene = CTX_data_scene(C);
+	Object *ob = BKE_object_add(bmain, scene, OB_MESH, filename);
+
+	BLI_path_abs(filepath, ID_BLEND_PATH(G.main, (ID *)ob));
+	if (!BLI_exists(filepath)) {
+		return OPERATOR_CANCELLED;
+	}
+
+	ModifierData *md = modifier_new(eModifierType_Smoke);
+	BLI_addtail(&ob->modifiers, md);
+
+	SmokeModifierData *smd = (SmokeModifierData *)md;
+	smd->type = MOD_SMOKE_TYPE_DOMAIN;
+	smokeModifier_createType(smd);
+
+	smd->domain->flags |= MOD_SMOKE_OPENVDB_EXTERN;
+	smd->domain

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list