[Bf-blender-cvs] [8c8b54b] openvdb: Import grids for playback now works.

Kévin Dietrich noreply at git.blender.org
Fri Jun 5 14:08:11 CEST 2015


Commit: 8c8b54b60187cd846283f6a4c00453fdc2c2acec
Author: Kévin Dietrich
Date:   Thu May 28 02:41:10 2015 +0200
Branches: openvdb
https://developer.blender.org/rB8c8b54b60187cd846283f6a4c00453fdc2c2acec

Import grids for playback now works.

It is still commented out due to the need of a good cache (reading)
system.

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

M	intern/openvdb/intern/openvdb_dense_convert.cpp
M	intern/openvdb/intern/openvdb_dense_convert.h
M	source/blender/blenkernel/intern/smoke.c

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

diff --git a/intern/openvdb/intern/openvdb_dense_convert.cpp b/intern/openvdb/intern/openvdb_dense_convert.cpp
index e095d46..c299679 100644
--- a/intern/openvdb/intern/openvdb_dense_convert.cpp
+++ b/intern/openvdb/intern/openvdb_dense_convert.cpp
@@ -168,11 +168,11 @@ void OpenVDB_import_grid_vector(OpenVDBReader *reader,
 {
 	Vec3SGrid::Ptr vgrid = gridPtrCast<Vec3SGrid>(reader->getGrid(name));
 
+#if 0
 	SplitVectorGrid vector_split;
 	vector_split(vgrid);
 
 	FloatGrid::Ptr grid[3];
-
 	math::CoordBBox bbox(Coord(0), Coord(res[0] - 1, res[1] - 1, res[2] - 1));
 
 	grid[0] = vector_split.grid_x();
@@ -189,6 +189,23 @@ void OpenVDB_import_grid_vector(OpenVDBReader *reader,
 	tools::Dense<float, tools::LayoutXYZ> dense_grid_z(bbox);
 	tools::copyToDense(*grid[2], dense_grid_z);
 	*data_z = dense_grid_z.data();
+#else
+	Vec3SGrid::Accessor acc = vgrid->getAccessor();
+	math::Coord xyz;
+	int &x = xyz[0], &y = xyz[1], &z = xyz[2];
+
+	int index = 0;
+	for (z = 0; z < res[2]; ++z) {
+		for (y = 0; y < res[1]; ++y) {
+			for (x = 0; x < res[0]; ++x, ++index) {
+				math::Vec3s value = acc.getValue(xyz);
+				(*data_x)[index] = value.x();
+				(*data_y)[index] = value.y();
+				(*data_z)[index] = value.z();
+			}
+		}
+	}
+#endif
 }
 
 void OpenVDB_update_fluid_transform(const char *filename, float matrix[4][4], float matrix_high[4][4])
diff --git a/intern/openvdb/intern/openvdb_dense_convert.h b/intern/openvdb/intern/openvdb_dense_convert.h
index 4102498..ee55a33 100644
--- a/intern/openvdb/intern/openvdb_dense_convert.h
+++ b/intern/openvdb/intern/openvdb_dense_convert.h
@@ -78,24 +78,26 @@ void OpenVDB_import_grid(OpenVDBReader *reader,
 	using namespace openvdb;
 
 	typename GridType::Ptr grid_tmp = gridPtrCast<GridType>(reader->getGrid(name));
-//	typename GridType::Accessor acc = grid_tmp->getAccessor();
-
+#if 0
 	math::CoordBBox bbox(Coord(0), Coord(res[0] - 1, res[1] - 1, res[2] - 1));
 
 	tools::Dense<T, tools::LayoutXYZ> dense_grid(bbox);
 	tools::copyToDense(*grid_tmp, dense_grid);
-
-	*data = dense_grid.data();
-
-//	int index = 0;
-//	for (int z = 0; z <= res.z(); ++z) {
-//		for (int y = 0; y <= res.y(); ++y) {
-//			for (int x = 0; x <= res.x(); ++x, ++index) {
-//				math::Coord xyz(x, y, z);
-//				data[index] = acc.getValue(xyz);
-//			}
-//		}
-//	}
+	memcpy(*data, dense_grid.data(), sizeof(T) * res[0] * res[1] * res[2]);
+#else
+	typename GridType::Accessor acc = grid_tmp->getAccessor();
+	math::Coord xyz;
+	int &x = xyz[0], &y = xyz[1], &z = xyz[2];
+
+	int index = 0;
+	for (z = 0; z < res[2]; ++z) {
+		for (y = 0; y < res[1]; ++y) {
+			for (x = 0; x < res[0]; ++x, ++index) {
+				(*data)[index] = acc.getValue(xyz);
+			}
+		}
+	}
+#endif
 }
 
 void OpenVDB_export_vector_grid(OpenVDBWriter *writer,
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index 20f8322..fbc14ee 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -2714,7 +2714,7 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
 		}
 
 		/* try to read from openvdb cache */
-//		if (sds->use_openvdb && (sds->flags & MOD_SMOKE_OPENVDB_EXPORTED) == 0) {
+//		if (sds->use_openvdb && (sds->flags & MOD_SMOKE_OPENVDB_EXPORTED)) {
 //			smokeModifier_OpenVDB_import(smd, scene, ob);
 //			smd->time = framenr;
 //			return;
@@ -3082,8 +3082,6 @@ static void compute_fluid_matrices(SmokeDomainSettings *sds)
 
 static void OpenVDB_read_fluid_settings(SmokeDomainSettings *sds, struct OpenVDBReader *reader)
 {
-	OpenVDBReader_get_meta_int(reader, "active_fields", &sds->active_fields);
-	OpenVDBReader_get_meta_v3_int(reader, "resolution", sds->res);
 	OpenVDBReader_get_meta_v3_int(reader, "min_resolution", sds->res_min);
 	OpenVDBReader_get_meta_v3_int(reader, "max_resolution", sds->res_max);
 	OpenVDBReader_get_meta_v3_int(reader, "base_resolution", sds->base_res);
@@ -3205,7 +3203,47 @@ static void OpenVDB_export_smoke(SmokeDomainSettings *sds, struct OpenVDBWriter
 
 static void OpenVDB_import_smoke(SmokeDomainSettings *sds, struct OpenVDBReader *reader)
 {
-	int fluid_fields;
+	int fluid_fields = smoke_get_data_flags(sds);
+	int active_fields, cache_fields = 0;
+	int cache_res[3];
+	float cache_dx;
+	bool reallocate = false;
+
+	OpenVDBReader_get_meta_int(reader, "fluid_fields", &cache_fields);
+	OpenVDBReader_get_meta_int(reader, "active_fields", &active_fields);
+	OpenVDBReader_get_meta_fl(reader, "dx", &cache_dx);
+	OpenVDBReader_get_meta_v3_int(reader, "resolution", cache_res);
+
+	/* check if resolution has changed */
+	if (sds->res[0] != cache_res[0] ||
+		sds->res[1] != cache_res[1] ||
+		sds->res[2] != cache_res[2])
+	{
+		if (sds->flags & MOD_SMOKE_ADAPTIVE_DOMAIN) {
+			reallocate = true;
+		}
+		else {
+			return;
+		}
+	}
+
+	/* reallocate fluid if needed*/
+	if (reallocate) {
+		sds->active_fields = active_fields | cache_fields;
+		smoke_reallocate_fluid(sds, cache_dx, cache_res, 1);
+		sds->dx = cache_dx;
+		copy_v3_v3_int(sds->res, cache_res);
+		sds->total_cells = cache_res[0] * cache_res[1] * cache_res[2];
+
+		if (sds->flags & MOD_SMOKE_HIGHRES) {
+			smoke_reallocate_highres_fluid(sds, cache_dx, cache_res, 1);
+		}
+	}
+
+	/* check if active fields have changed */
+	if ((fluid_fields != cache_fields) || (active_fields != sds->active_fields)) {
+		reallocate = true;
+	}
 
 	if (sds->fluid) {
 		float dt, dx, *dens, *react, *fuel, *flame, *heat, *heatold, *vx, *vy, *vz, *r, *g, *b;
@@ -3214,8 +3252,6 @@ static void OpenVDB_import_smoke(SmokeDomainSettings *sds, struct OpenVDBReader
 		smoke_export(sds->fluid, &dt, &dx, &dens, &react, &flame, &fuel, &heat,
 		             &heatold, &vx, &vy, &vz, &r, &g, &b, &obstacles);
 
-		OpenVDBReader_get_meta_int(reader, "fluid_fields", &fluid_fields);
-		OpenVDBReader_get_meta_fl(reader, "dx", &dx);
 		OpenVDBReader_get_meta_fl(reader, "dt", &dt);
 
 		OpenVDB_import_grid_fl(reader, "Shadow", &sds->shadow, sds->res);




More information about the Bf-blender-cvs mailing list