[Bf-blender-cvs] [e6a37c3] soc-2014-fluid: low res: errors in grid construction fixed, methods for passing obstacles to Mantaflow added

Roman Pogribnyi noreply at git.blender.org
Tue Oct 21 23:09:45 CEST 2014


Commit: e6a37c3f243082cfa0e10d176b7cbbcb5353f681
Author: Roman Pogribnyi
Date:   Sat Oct 18 15:15:45 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rBe6a37c3f243082cfa0e10d176b7cbbcb5353f681

low res: errors in grid construction fixed, methods for passing obstacles to Mantaflow added

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

M	intern/smoke/intern/MANTA.cpp
M	intern/smoke/intern/MANTA.h
M	source/blender/python/manta_pp/grid.cpp
M	source/blender/python/manta_pp/grid.h

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

diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index 9691520..e8fbc33 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -365,7 +365,7 @@ void Manta_API::addGrid(void * data, string name, string type, int x, int y, int
 	stringStream << grid_name << " = s.create(" << gridNameFromType(type) << ")";
 	const std::string command_1 = stringStream.str();
 	stringStream.str("");
-	stringStream << grid_name << ".readGridFromMemory(\'"<< data << "\',\'" << name << "\', " << x << "," << z << "," << y << ")";
+	stringStream << grid_name << ".readGridFromMemory(\'"<< data << "\', " << x << "," << z << "," << y << ")";
 	const std::string command_2 = stringStream.str();
 	const std::string command_3 = name + ".add(" + grid_name + ")";
 	PyGILState_STATE gilstate = PyGILState_Ensure();
@@ -389,7 +389,7 @@ void Manta_API::addAdaptiveGrid(void * data, string name, string type, int minX,
 	stringStream << grid_name << " = s.create(" << gridNameFromType(type) << ")";
 	const std::string command_1 = stringStream.str();
 	stringStream.str("");
-	stringStream << grid_name << ".readAdaptiveGridFromMemory(\'"<< data << "\',\'" << name << "\', vec3(" << minX << "," << minY << "," << minZ << 
+	stringStream << grid_name << ".readAdaptiveGridFromMemory(\'"<< data << "\', vec3(" << minX << "," << minY << "," << minZ << 
 	"), vec3(" << maxX << "," << maxY << "," << maxZ << ") )";
 	const std::string command_2 = stringStream.str();
 	const std::string command_3 = name + ".add(" + grid_name + ")";
@@ -402,6 +402,25 @@ void Manta_API::addAdaptiveGrid(void * data, string name, string type, int minX,
 	PyGILState_Release(gilstate);		
 }
 
+void Manta_API::export_obstacles(float *data, int x, int y, int z)
+{
+	std::ostringstream stringStream;
+	std::string grid_name = "obs_sdf";
+	stringStream.str("");
+	stringStream << grid_name << " = s.create(RealGrid)";
+	const std::string command_1 = stringStream.str();
+	stringStream.str("");
+	stringStream << grid_name << ".readGridFromMemory(\'"<< data << "\',\'" << grid_name << "\', " << x << "," << y << "," << z << ")";
+	const std::string command_2 = stringStream.str();
+	const std::string command_3 = grid_name + ".applyToGrid(grid = flags, value = FlagObstacle)";
+	PyGILState_STATE gilstate = PyGILState_Ensure();
+	PyRun_SimpleString(command_1.c_str());
+	PyRun_SimpleString(command_2.c_str());
+	PyRun_SimpleString(command_3.c_str());
+	PyGILState_Release(gilstate);		
+}
+
+
 void Manta_API::run_manta_sim_thread(void *arguments)
 {
 	struct manta_arg_struct *args = (struct manta_arg_struct *)arguments;
diff --git a/intern/smoke/intern/MANTA.h b/intern/smoke/intern/MANTA.h
index 29dd146..5bb4811 100644
--- a/intern/smoke/intern/MANTA.h
+++ b/intern/smoke/intern/MANTA.h
@@ -86,6 +86,8 @@ public:
 	static string gridNameFromType(const string& type);
 	static void addGrid(void * data,string name, string type, int x, int y, int z);
 	static void addAdaptiveGrid(void * data, string name, string type,int minX, int minY, int minZ, int maxX, int maxY, int maxZ);
+	static void export_obstacles(float *data, int x, int y, int z);
+	
 };
 
 
diff --git a/source/blender/python/manta_pp/grid.cpp b/source/blender/python/manta_pp/grid.cpp
index 1f1d698..96ce003 100644
--- a/source/blender/python/manta_pp/grid.cpp
+++ b/source/blender/python/manta_pp/grid.cpp
@@ -348,8 +348,9 @@ template<class T> void Grid<T>::writeGridToMemory(const std::string& memLoc, con
 	memcpy(gridPointer, mData, sizeAllowed_num);
 }
 
-template<class T> void Grid<T>::readGridFromMemory(const std::string& memLoc, const std::string& gridName, int x, int y, int z)
+template<class T> void Grid<T>::readGridFromMemory(const std::string& memLoc, int x, int y, int z)
 {
+	debMsg("Reading grid from " + memLoc,1);
 	if (memLoc == "" ||memLoc == "0" ){
 		debMsg("Can not write grid to NULL pointer",1);
 		return;
@@ -365,7 +366,7 @@ template<class T> void Grid<T>::readGridFromMemory(const std::string& memLoc, co
 	memcpy(mData, gridPointer, sizeof(T) * x * y * z);
 }
 
-template<class T> void Grid<T>::readAdaptiveGridFromMemory(const std::string& memLoc, const std::string& gridname, Vec3i minSize, Vec3i maxSize)
+template<class T> void Grid<T>::readAdaptiveGridFromMemory(const std::string& memLoc, Vec3i minSize, Vec3i maxSize)
 {
 	if (memLoc == "" ||memLoc == "0" ){
 		debMsg("Can not write grid to NULL pointer",1);
@@ -379,7 +380,7 @@ template<class T> void Grid<T>::readAdaptiveGridFromMemory(const std::string& me
 		debMsg("Adaptive grid larger than current",1);
 		return;
 	}
-	Vec3i adaptiveSize = maxSize - minSize + Vec3i(1);
+	Vec3i adaptiveSize = maxSize - minSize;
 	stringstream ss(memLoc);
 	void *gridPointer = NULL;
 	ss >> gridPointer;
@@ -387,7 +388,7 @@ template<class T> void Grid<T>::readAdaptiveGridFromMemory(const std::string& me
 	for (int x = 0; x < adaptiveSize.x; ++x){
 		for (int y = 0; y < adaptiveSize.y; ++y){
 			for (int z = 0; z < adaptiveSize.z; ++z){
-				get(x + minSize.x, y + minSize.y, z + minSize.z) = data_Array[(x + minSize.x) + adaptiveSize.x * (y + minSize.y) + adaptiveSize.x * adaptiveSize.y * (z + minSize.z)];
+				get(x + minSize.x, y + minSize.y, z + minSize.z) = data_Array[x  + adaptiveSize.x * y + adaptiveSize.x * adaptiveSize.y * z];
 			}
 		}
 	}
@@ -403,10 +404,20 @@ template<class T> void Grid<T>::readAdaptiveGridFromMemory(const std::string& me
 		(*grid)(i,j,k) = (*texture)(i,j,k) * value;
 }   inline Grid<Real> * getArg0() { return grid; } typedef Grid<Real>  type0;inline Grid<Real> * getArg1() { return texture; } typedef Grid<Real>  type1;inline Real& getArg2() { return value; } typedef Real type2;inline FlagGrid* getArg3() { return respectFlags; } typedef FlagGrid type3; void run() {  const int _maxX = maxX; const int _maxY = maxY; for (int k=minZ; k< maxZ; k++) for (int j=0; j< _maxY; j++) for (int i=0; i< _maxX; i++) op(i,j,k, grid,texture,value,respectFlags);  } Grid< [...]
 
+
+ struct ApplyTextureToIntGrid : public KernelBase { ApplyTextureToIntGrid(Grid<int> *grid, Grid<Real> *texture, int value, FlagGrid* respectFlags) :  KernelBase(grid,0) ,grid(grid),texture(texture),value(value),respectFlags(respectFlags)   { run(); }  inline void op(int i, int j, int k, Grid<int> *grid, Grid<Real> *texture, int value, FlagGrid* respectFlags )  {
+	if (respectFlags && respectFlags->isObstacle(i,j,k))
+		return;
+	if ((*texture)(i,j,k) > 0)
+		(*grid)(i,j,k) = value ;
+}   inline Grid<int> * getArg0() { return grid; } typedef Grid<int>  type0;inline Grid<Real> * getArg1() { return texture; } typedef Grid<Real>  type1;inline int& getArg2() { return value; } typedef int type2;inline FlagGrid* getArg3() { return respectFlags; } typedef FlagGrid type3; void run() {  const int _maxX = maxX; const int _maxY = maxY; for (int k=minZ; k< maxZ; k++) for (int j=0; j< _maxY; j++) for (int i=0; i< _maxX; i++) op(i,j,k, grid,texture,value,respectFlags);  } Grid<int> [...]
+
 template<class T> void Grid<T>::applyToGrid(GridBase *grid, FlagGrid* respectFlags)
 {
 	if (this->getType() & GridBase::TypeReal)
 		ApplyTextureToRealGrid((Grid<Real>*)grid, (Grid<Real>*)this, _args.get<Real>("value"), respectFlags);
+	if (this->getType() & GridBase::TypeInt)
+		ApplyTextureToIntGrid((Grid<int>*)grid, (Grid<Real>*)this, _args.get<int>("value"), respectFlags);
 }
 
 // helper functions for UV grid data (stored grid coordinates as Vec3 values, and uv weight in entry zero)
diff --git a/source/blender/python/manta_pp/grid.h b/source/blender/python/manta_pp/grid.h
index 97b1b86..07d982f 100644
--- a/source/blender/python/manta_pp/grid.h
+++ b/source/blender/python/manta_pp/grid.h
@@ -189,8 +189,8 @@ template<class T> class Grid : public GridBase {public:
 
 	//! write and read grid data to pointed memory
 	void writeGridToMemory(const std::string& memLoc, const std::string& sizeAllowed); static PyObject* _W_19 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); Grid* pbo = dynamic_cast<Grid*>(Pb::objFromPy(_self)); pbPreparePlugin(pbo->getParent(), "Grid::writeGridToMemory"); PyObject *_retval = 0; { ArgLocker _lock; const std::string& memLoc = _args.get<std::string >("memLoc",0,&_lock); const std::string& sizeAllowed = _args.get<std::string >("si [...]
-	void readGridFromMemory(const std::string& memLoc, const std::string& gridname, int x, int y, int z); static PyObject* _W_20 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); Grid* pbo = dynamic_cast<Grid*>(Pb::objFromPy(_self)); pbPreparePlugin(pbo->getParent(), "Grid::readGridFromMemory"); PyObject *_retval = 0; { ArgLocker _lock; const std::string& memLoc = _args.get<std::string >("memLoc",0,&_lock); const std::string& gridname = _args.get< [...]
-	void readAdaptiveGridFromMemory(const std::string& memLoc, const std::string& gridname, Vec3i min, Vec3i max); static PyObject* _W_21 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); Grid* pbo = dynamic_cast<Grid*>(Pb::objFromPy(_self)); pbPreparePlugin(pbo->getParent(), "Grid::readAdaptiveGridFromMemory"); PyObject *_retval = 0; { ArgLocker _lock; const std::string& memLoc = _args.get<std::string >("memLoc",0,&_lock); const std::string& grid [...]

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list