[Bf-blender-cvs] [41f4ea4] openvdb: A new function to create a sparse vector grid from three scalar dense grids.

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


Commit: 41f4ea44548b47bb38e1b830f03921232fb8aa17
Author: Kévin Dietrich
Date:   Fri May 22 04:01:31 2015 +0200
Branches: openvdb
https://developer.blender.org/rB41f4ea44548b47bb38e1b830f03921232fb8aa17

A new function to create a sparse vector grid from three scalar dense
grids.

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

M	source/blender/blenkernel/intern/smoke.c
M	source/blender/openvdb/intern/openvdb_reader.h
M	source/blender/openvdb/intern/openvdb_smoke_export.cpp
M	source/blender/openvdb/openvdb_capi.cpp
M	source/blender/openvdb/openvdb_capi.h
M	source/blender/openvdb/openvdb_intern.h

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

diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index f87ba14..28de417 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -3143,7 +3143,7 @@ static void cache_filename(char *string, const char *path, const char *fname, co
 
 static void OpenVDB_export_smoke(SmokeDomainSettings *sds, struct OpenVDBWriter *writer)
 {
-	int fluid_fields;
+	int fluid_fields = smoke_get_data_flags(sds);
 
 	OpenVDBWriter_add_meta_int(writer, "fluid_fields", fluid_fields);
 
@@ -3172,14 +3172,16 @@ static void OpenVDB_export_smoke(SmokeDomainSettings *sds, struct OpenVDBWriter
 		}
 
 		if (fluid_fields & SM_ACTIVE_COLORS) {
-			OpenVDB_export_grid_fl(writer, "red", r, sds->res, sds->obmat);
-			OpenVDB_export_grid_fl(writer, "green", g, sds->res, sds->obmat);
-			OpenVDB_export_grid_fl(writer, "blue", b, sds->res, sds->obmat);
+//			OpenVDB_export_grid_fl(writer, "red", r, sds->res, sds->obmat);
+//			OpenVDB_export_grid_fl(writer, "green", g, sds->res, sds->obmat);
+//			OpenVDB_export_grid_fl(writer, "blue", b, sds->res, sds->obmat);
+			OpenVDB_export_grid_vec(writer, "color", r, g, b, sds->res, sds->obmat);
 		}
 
-		OpenVDB_export_grid_fl(writer, "vx", vx, sds->res, sds->obmat);
-		OpenVDB_export_grid_fl(writer, "vy", vy, sds->res, sds->obmat);
-		OpenVDB_export_grid_fl(writer, "vz", vz, sds->res, sds->obmat);
+//		OpenVDB_export_grid_fl(writer, "vx", vx, sds->res, sds->obmat);
+//		OpenVDB_export_grid_fl(writer, "vy", vy, sds->res, sds->obmat);
+//		OpenVDB_export_grid_fl(writer, "vz", vz, sds->res, sds->obmat);
+		OpenVDB_export_grid_vec(writer, "velocity", vx, vy, vz, sds->res, sds->obmat);
 
 		OpenVDB_export_grid_ch(writer, "obstacles", obstacles, sds->res, sds->obmat);
 	}
@@ -3189,7 +3191,7 @@ static void OpenVDB_export_smoke(SmokeDomainSettings *sds, struct OpenVDBWriter
 
 		smoke_turbulence_export(sds->wt, &dens, &react, &flame, &fuel, &r, &g, &b, &tcu, &tcv, &tcw);
 
-		OpenVDB_export_grid_fl(writer, "density", dens, sds->res, sds->obmat);
+		OpenVDB_export_grid_fl(writer, "density high", dens, sds->res_wt, sds->obmat);
 
 		if (fluid_fields & SM_ACTIVE_FIRE) {
 			OpenVDB_export_grid_fl(writer, "flame high", flame, sds->res_wt, sds->obmat);
@@ -3198,20 +3200,22 @@ static void OpenVDB_export_smoke(SmokeDomainSettings *sds, struct OpenVDBWriter
 		}
 
 		if (fluid_fields & SM_ACTIVE_COLORS) {
-			OpenVDB_export_grid_fl(writer, "red high", r, sds->res, sds->obmat);
-			OpenVDB_export_grid_fl(writer, "green high", g, sds->res, sds->obmat);
-			OpenVDB_export_grid_fl(writer, "blue high", b, sds->res, sds->obmat);
+//			OpenVDB_export_grid_fl(writer, "red high", r, sds->res, sds->obmat);
+//			OpenVDB_export_grid_fl(writer, "green high", g, sds->res, sds->obmat);
+//			OpenVDB_export_grid_fl(writer, "blue high", b, sds->res, sds->obmat);
+			OpenVDB_export_grid_vec(writer, "color high", r, g, b, sds->res_wt, sds->obmat);
 		}
 
-		OpenVDB_export_grid_fl(writer, "tcu", tcu, sds->res, sds->obmat);
-		OpenVDB_export_grid_fl(writer, "tcv", tcv, sds->res, sds->obmat);
-		OpenVDB_export_grid_fl(writer, "tcw", tcw, sds->res, sds->obmat);
+//		OpenVDB_export_grid_fl(writer, "tcu", tcu, sds->res, sds->obmat);
+//		OpenVDB_export_grid_fl(writer, "tcv", tcv, sds->res, sds->obmat);
+//		OpenVDB_export_grid_fl(writer, "tcw", tcw, sds->res, sds->obmat);
+		OpenVDB_export_grid_vec(writer, "tex_co", tcu, tcv, tcw, sds->res, sds->obmat);
 	}
 }
 
 static void OpenVDB_import_smoke(SmokeDomainSettings *sds, struct OpenVDBReader *reader)
 {
-	int fluid_fields = smoke_get_data_flags(sds);
+	int fluid_fields;
 
 	if (sds->fluid) {
 		float dt, dx, *dens, *react, *fuel, *flame, *heat, *heatold, *vx, *vy, *vz, *r, *g, *b;
diff --git a/source/blender/openvdb/intern/openvdb_reader.h b/source/blender/openvdb/intern/openvdb_reader.h
index 99941be..f90dcd2 100644
--- a/source/blender/openvdb/intern/openvdb_reader.h
+++ b/source/blender/openvdb/intern/openvdb_reader.h
@@ -33,7 +33,6 @@ class OpenVDBFile {
 
 public:
 	OpenVDBFile(const std::string &name);
-
 	openvdb::MetaMap::Ptr metamap() const;
 };
 
diff --git a/source/blender/openvdb/intern/openvdb_smoke_export.cpp b/source/blender/openvdb/intern/openvdb_smoke_export.cpp
index 4428446..cdb564c 100644
--- a/source/blender/openvdb/intern/openvdb_smoke_export.cpp
+++ b/source/blender/openvdb/intern/openvdb_smoke_export.cpp
@@ -27,6 +27,7 @@
 
 #include <openvdb/openvdb.h>
 #include <openvdb/tools/Dense.h>
+#include <openvdb/tools/ValueTransformer.h>
 
 #include "openvdb_capi.h"
 #include "openvdb_intern.h"
@@ -39,56 +40,80 @@ using namespace openvdb;
 
 namespace internal {
 
-static void OpenVDB_export_vector_grid(OpenVDBWriter *writer,
-                                       const std::string &name,
-                                       const float *data_x, const float *data_y, const float *data_z,
-                                       const math::CoordBBox &bbox,
-                                       const math::Transform::Ptr transform)
+class MergeScalarGrids {
+	tree::ValueAccessor<const FloatTree> m_acc_x, m_acc_y, m_acc_z;
+
+public:
+	MergeScalarGrids(const FloatTree *x_tree, const FloatTree *y_tree, const FloatTree *z_tree)
+	    : m_acc_x(*x_tree)
+	    , m_acc_y(*y_tree)
+	    , m_acc_z(*z_tree)
+	{}
+
+	MergeScalarGrids(const MergeScalarGrids &other)
+	    : m_acc_x(other.m_acc_x)
+	    , m_acc_y(other.m_acc_y)
+	    , m_acc_z(other.m_acc_z)
+	{}
+
+	void operator()(const Vec3STree::ValueOnIter &it) const
+	{
+		const math::Coord xyz = it.getCoord();
+		float x = m_acc_x.getValue(xyz);
+		float y = m_acc_y.getValue(xyz);
+		float z = m_acc_z.getValue(xyz);
+
+		it.setValue(Vec3s(x, y, z));
+	}
+};
+
+void OpenVDB_export_vector_grid(OpenVDBWriter *writer,
+                                const std::string &name,
+                                const float *data_x, const float *data_y, const float *data_z,
+                                const int res[3],
+                                float fluid_mat[4][4])
 {
-	math::Coord res = bbox.max();
-	Vec3SGrid::Ptr grid = Vec3SGrid::create(Vec3s(0.0f));
-	Vec3SGrid::Accessor acc = grid->getAccessor();
 
-	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) {
-				Coord xyz(x, y, z);
-				Vec3s value(data_x[index], data_y[index], data_z[index]);
-				acc.setValue(xyz, value);
-			}
-		}
-	}
+	math::CoordBBox bbox(Coord(0), Coord(res[0] - 1, res[1] - 1, res[2] - 1));
 
-	grid->setName(name);
-	grid->setTransform(transform->copy());
-	grid->setIsInWorldSpace(false);
+	Mat4R mat = Mat4R(
+		  fluid_mat[0][0], fluid_mat[0][1], fluid_mat[0][2], fluid_mat[0][3],
+          fluid_mat[1][0], fluid_mat[1][1], fluid_mat[1][2], fluid_mat[1][3],
+          fluid_mat[2][0], fluid_mat[2][1], fluid_mat[2][2], fluid_mat[2][3],
+          fluid_mat[3][0], fluid_mat[3][1], fluid_mat[3][2], fluid_mat[3][3]);
 
-	writer->insert(grid);
-}
+	math::Transform::Ptr transform = math::Transform::createLinearTransform(mat);
 
-template <typename GridType, typename T>
-static void OpenVDB_import_grid(GridBase::Ptr &grid,
-                                T *data,
-                                const math::CoordBBox &bbox)
-{
-	typename GridType::Ptr grid_tmp = gridPtrCast<GridType>(grid);
-	typename GridType::Accessor acc = grid_tmp->getAccessor();
+	FloatGrid::Ptr grid[3];
 
-	/* TODO(kevin): figure out why it doesn't really work */
-	//tools::Dense<T, tools::LayoutXYZ> dense_grid(bbox);
-	//tools::copyToDense(*grid_tmp, dense_grid);
+	grid[0] = FloatGrid::create(0.0f);
+	tools::Dense<const float, tools::LayoutXYZ> dense_grid_x(bbox, data_x);
+	tools::copyFromDense(dense_grid_x, grid[0]->tree(), 1e-3f, true);
 
-	math::Coord res = bbox.max();
-	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);
-			}
-		}
+	grid[1] = FloatGrid::create(0.0f);
+	tools::Dense<const float, tools::LayoutXYZ> dense_grid_y(bbox, data_y);
+	tools::copyFromDense(dense_grid_y, grid[1]->tree(), 1e-3f, true);
+
+	grid[2] = FloatGrid::create(0.0f);
+	tools::Dense<const float, tools::LayoutXYZ> dense_grid_z(bbox, data_z);
+	tools::copyFromDense(dense_grid_z, grid[2]->tree(), 1e-3f, true);
+
+	Vec3SGrid::Ptr vecgrid = Vec3SGrid::create(Vec3s(0.0f));
+
+	/* Activate voxels in the vector grid based on the scalar grids to ensure
+	 * thread safety later on */
+	for (int i = 0; i < 3; ++i) {
+		vecgrid->tree().topologyUnion(grid[i]->tree());
 	}
+
+	MergeScalarGrids op(&(grid[0]->tree()), &(grid[1]->tree()), &(grid[2]->tree()));
+	tools::foreach(vecgrid->beginValueOn(), op, true, false);
+
+	vecgrid->setName(name);
+	vecgrid->setTransform(transform);
+	vecgrid->setIsInWorldSpace(false);
+
+	writer->insert(vecgrid);
 }
 
 static void OpenVDB_import_grid_vector(GridBase::Ptr &grid,
diff --git a/source/blender/openvdb/openvdb_capi.cpp b/source/blender/openvdb/openvdb_capi.cpp
index f978356..e487765 100644
--- a/source/blender/openvdb/openvdb_capi.cpp
+++ b/source/blender/openvdb/openvdb_capi.cpp
@@ -107,6 +107,14 @@ void OpenVDB_export_grid_ch(OpenVDBWriter *writer,
 	internal::OpenVDB_export_grid<Int32Grid>(writer, name, data, res, matrix);
 }
 
+void OpenVDB_export_grid_vec(struct OpenVDBWriter *writer,
+                             const char *name,
+                             const float *data_x, const float *data_y, const float *data_z,
+                             const int res[3], float matrix[4][4])
+{
+	internal::OpenVDB_export_vector_grid(writer, name, data_x, data_y, data_z, res, matrix);
+}
+
 void OpenVDB_import_grid_fl(OpenVDBReader *reader,
                             const char *name, float **data,
                             const int res[3])
diff --git a/source/blender/openvdb/openvdb_capi.h b/source/blender/openvdb/openvdb_capi.h
index fb948c2..10992aa 100644
--- a/source/blender/openvdb/openvdb_capi.h
+++ b/source/blender/openvdb/openvdb_capi.h
@@ -83,6 +83,11 @@ void OpenVDB_export_grid_ch(struct OpenVDBWriter *writer,
                             const char *n

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list