[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16652] trunk/blender: Merging fluidcontrol to trunk from rev16649 fluidcontrol branch.

Daniel Genrich daniel.genrich at gmx.net
Sun Sep 21 20:20:02 CEST 2008


Revision: 16652
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16652
Author:   genscher
Date:     2008-09-21 20:20:02 +0200 (Sun, 21 Sep 2008)

Log Message:
-----------
Merging fluidcontrol to trunk from rev16649 fluidcontrol branch. Code provided by Nils Thuerey.

Revision Links:
--------------
    http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16649

Modified Paths:
--------------
    trunk/blender/intern/elbeem/CMakeLists.txt
    trunk/blender/intern/elbeem/SConscript
    trunk/blender/intern/elbeem/extern/elbeem.h
    trunk/blender/intern/elbeem/intern/elbeem.cpp
    trunk/blender/intern/elbeem/intern/isosurface.cpp
    trunk/blender/intern/elbeem/intern/ntl_geometryclass.h
    trunk/blender/intern/elbeem/intern/ntl_geometryobject.cpp
    trunk/blender/intern/elbeem/intern/ntl_geometryobject.h
    trunk/blender/intern/elbeem/intern/ntl_ray.cpp
    trunk/blender/intern/elbeem/intern/ntl_ray.h
    trunk/blender/intern/elbeem/intern/ntl_world.cpp
    trunk/blender/intern/elbeem/intern/simulation_object.cpp
    trunk/blender/intern/elbeem/intern/solver_adap.cpp
    trunk/blender/intern/elbeem/intern/solver_class.h
    trunk/blender/intern/elbeem/intern/solver_init.cpp
    trunk/blender/intern/elbeem/intern/solver_main.cpp
    trunk/blender/intern/elbeem/intern/solver_relax.h
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/ipo.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/makesdna/DNA_ipo_types.h
    trunk/blender/source/blender/makesdna/DNA_modifier_types.h
    trunk/blender/source/blender/makesdna/DNA_object_fluidsim.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/src/buttons_editing.c
    trunk/blender/source/blender/src/buttons_object.c
    trunk/blender/source/blender/src/editipo.c
    trunk/blender/source/blender/src/editipo_lib.c
    trunk/blender/source/blender/src/editmesh.c
    trunk/blender/source/blender/src/fluidsim.c
    trunk/blender/source/blender/src/header_ipo.c

Added Paths:
-----------
    trunk/blender/intern/elbeem/intern/controlparticles.cpp
    trunk/blender/intern/elbeem/intern/controlparticles.h
    trunk/blender/intern/elbeem/intern/elbeem_control.cpp
    trunk/blender/intern/elbeem/intern/elbeem_control.h
    trunk/blender/intern/elbeem/intern/mvmcoords.cpp
    trunk/blender/intern/elbeem/intern/mvmcoords.h
    trunk/blender/intern/elbeem/intern/solver_control.cpp
    trunk/blender/intern/elbeem/intern/solver_control.h
    trunk/blender/source/blender/blenkernel/BKE_fluidsim.h
    trunk/blender/source/blender/blenkernel/intern/fluidsim.c

Removed Paths:
-------------
    trunk/blender/intern/elbeem/intern/elbeem.h

Modified: trunk/blender/intern/elbeem/CMakeLists.txt
===================================================================
--- trunk/blender/intern/elbeem/CMakeLists.txt	2008-09-21 16:04:33 UTC (rev 16651)
+++ trunk/blender/intern/elbeem/CMakeLists.txt	2008-09-21 18:20:02 UTC (rev 16652)
@@ -24,11 +24,11 @@
 #
 # ***** END GPL LICENSE BLOCK *****
 
-SET(INC ${PNG_INC} ${ZLIB_INC} ${SDL_INC})
+SET(INC ${PNG_INC} ${ZLIB_INC} ${SDL_INC} extern)
 
 FILE(GLOB SRC intern/*.cpp)
 
-ADD_DEFINITIONS(-DNOGUI -DELBEEM_BLENDER=1)
+ADD_DEFINITIONS(-DNOGUI -DELBEEM_BLENDER=1 -DLBM_INCLUDE_CONTROL=1)
 IF(WINDOWS)
     ADD_DEFINITIONS(-DUSE_MSVC6FIXES)
 ENDIF(WINDOWS)

Modified: trunk/blender/intern/elbeem/SConscript
===================================================================
--- trunk/blender/intern/elbeem/SConscript	2008-09-21 16:04:33 UTC (rev 16651)
+++ trunk/blender/intern/elbeem/SConscript	2008-09-21 18:20:02 UTC (rev 16652)
@@ -5,13 +5,14 @@
 
 sources = env.Glob('intern/*.cpp')
 
-defs = ' NOGUI ELBEEM_BLENDER=1'
+defs = 'NOGUI ELBEEM_BLENDER=1 LBM_INCLUDE_CONTROL=1'
 
 if env['WITH_BF_OPENMP'] == 1:
     defs += ' PARALLEL'
 
 if env['OURPLATFORM']=='win32-vc':
     defs += ' USE_MSVC6FIXES'
-incs = env['BF_PNG_INC'] + ' ' + env['BF_ZLIB_INC'] + ' ' +env['BF_SDL_INC']
+incs = env['BF_PNG_INC'] + ' ' + env['BF_ZLIB_INC'] + ' ' +env['BF_SDL_INC'] 
+incs += ' extern '
 
 env.BlenderLib ('bf_elbeem', sources, Split(incs), Split(defs), libtype='blender', priority=0 )

Modified: trunk/blender/intern/elbeem/extern/elbeem.h
===================================================================
--- trunk/blender/intern/elbeem/extern/elbeem.h	2008-09-21 16:04:33 UTC (rev 16651)
+++ trunk/blender/intern/elbeem/extern/elbeem.h	2008-09-21 18:20:02 UTC (rev 16652)
@@ -32,7 +32,7 @@
   short version;
 	/* id number of simulation domain, needed if more than a
 	 * single domain should be simulated */
-	short domainId;
+	short domainId; // unused within blender
 
 	/* geometrical extent */
 	float geoStart[3], geoSize[3];
@@ -97,10 +97,13 @@
 
 
 // defines for elbeemMesh->type below
+/* please keep in sync with DNA_object_fluidsim.h */
 #define OB_FLUIDSIM_FLUID       4
 #define OB_FLUIDSIM_OBSTACLE    8
 #define OB_FLUIDSIM_INFLOW      16
 #define OB_FLUIDSIM_OUTFLOW     32
+#define OB_FLUIDSIM_PARTICLE    64
+#define OB_FLUIDSIM_CONTROL 	128
 
 // defines for elbeemMesh->obstacleType below
 #define FLUIDSIM_OBSTACLE_NOSLIP     1
@@ -113,7 +116,7 @@
 
 // a single mesh object
 typedef struct elbeemMesh {
-  /* obstacle,fluid or inflow... */
+  /* obstacle,fluid or inflow or control ... */
   short type;
 	/* id of simulation domain it belongs to */
 	short parentDomainId;
@@ -155,6 +158,20 @@
 
 	/* name of the mesh, mostly for debugging */
 	const char *name;
+	
+	/* fluid control settings */
+	float cpsTimeStart;
+	float cpsTimeEnd;
+	float cpsQuality;
+	
+	int channelSizeAttractforceStrength;
+	float *channelAttractforceStrength;
+	int channelSizeAttractforceRadius;
+	float *channelAttractforceRadius;
+	int channelSizeVelocityforceStrength;
+	float *channelVelocityforceStrength;
+	int channelSizeVelocityforceRadius;
+	float *channelVelocityforceRadius;
 } elbeemMesh;
 
 // API functions
@@ -170,6 +187,9 @@
 // start fluidsim init (returns !=0 upon failure)
 int elbeemInit(void);
 
+// frees fluidsim
+int elbeemFree(void);
+
 // start fluidsim init (returns !=0 upon failure)
 int elbeemAddDomain(struct elbeemSimulationSettings*);
 
@@ -223,6 +243,7 @@
 // structs, for these use OB_xxx defines above
 
 /*! fluid geometry init types */
+// type "int" used, so max is 8
 #define FGI_FLAGSTART   16
 #define FGI_FLUID			  (1<<(FGI_FLAGSTART+ 0))
 #define FGI_NO_FLUID	  (1<<(FGI_FLAGSTART+ 1))
@@ -232,6 +253,7 @@
 #define FGI_NO_BND		  (1<<(FGI_FLAGSTART+ 5))
 #define FGI_MBNDINFLOW	(1<<(FGI_FLAGSTART+ 6))
 #define FGI_MBNDOUTFLOW	(1<<(FGI_FLAGSTART+ 7))
+#define FGI_CONTROL	(1<<(FGI_FLAGSTART+ 8))
 
 // all boundary types at once
 #define FGI_ALLBOUNDS ( FGI_BNDNO | FGI_BNDFREE | FGI_BNDPART | FGI_MBNDINFLOW | FGI_MBNDOUTFLOW )

Copied: trunk/blender/intern/elbeem/intern/controlparticles.cpp (from rev 16651, branches/fluidcontrol/intern/elbeem/intern/controlparticles.cpp)
===================================================================
--- trunk/blender/intern/elbeem/intern/controlparticles.cpp	                        (rev 0)
+++ trunk/blender/intern/elbeem/intern/controlparticles.cpp	2008-09-21 18:20:02 UTC (rev 16652)
@@ -0,0 +1,1459 @@
+// --------------------------------------------------------------------------
+//
+// El'Beem - the visual lattice boltzmann freesurface simulator
+// All code distributed as part of El'Beem is covered by the version 2 of the 
+// GNU General Public License. See the file COPYING for details.  
+//
+// Copyright 2008 Nils Thuerey , Richard Keiser, Mark Pauly, Ulrich Ruede
+//
+// implementation of control particle handling
+//
+// --------------------------------------------------------------------------
+
+// indicator for LBM inclusion
+#include "ntl_geometrymodel.h"
+#include "ntl_world.h"
+#include "solver_class.h"
+#include "controlparticles.h"
+#include "mvmcoords.h"
+#include <zlib.h>
+
+#ifndef sqrtf
+#define sqrtf sqrt
+#endif
+
+// brute force circle test init in initTimeArray
+// replaced by mDebugInit
+//#define CP_FORCECIRCLEINIT 0
+
+
+void ControlParticles::initBlenderTest() {
+	mPartSets.clear();
+
+	ControlParticleSet cps;
+	mPartSets.push_back(cps);
+	int setCnt = mPartSets.size()-1;
+	ControlParticle p; 
+
+	// set for time zero
+	mPartSets[setCnt].time = 0.;
+
+	// add single particle 
+	p.reset();
+	p.pos = LbmVec(0.5, 0.5, -0.5);
+	mPartSets[setCnt].particles.push_back(p);
+
+	// add second set for animation
+	mPartSets.push_back(cps);
+	setCnt = mPartSets.size()-1;
+	mPartSets[setCnt].time = 0.15;
+
+	// insert new position
+	p.reset();
+	p.pos = LbmVec(-0.5, -0.5, 0.5);
+	mPartSets[setCnt].particles.push_back(p);
+
+	// applyTrafos();
+	initTime(0. , 1.);
+}
+
+// blender control object gets converted to mvm flui control object
+int ControlParticles::initFromObject(ntlGeometryObjModel *model) {
+	vector<ntlTriangle> triangles;
+	vector<ntlVec3Gfx> vertices;
+	vector<ntlVec3Gfx> normals;
+	
+	/*
+	model->loadBobjModel(string(infile));
+	
+	model->setLoaded(true);
+	
+	model->setGeoInitId(gid);
+	
+	
+	printf("a animated? %d\n", model->getIsAnimated());
+	printf("b animated? %d\n", model->getMeshAnimated());
+	*/
+	
+	model->setGeoInitType(FGI_FLUID);
+	
+	model->getTriangles(mCPSTimeStart, &triangles, &vertices, &normals, 1 ); 
+	// model->applyTransformation(mCPSTimeStart, &vertices, &normals, 0, vertices.size(), true);
+	
+	// valid mesh?
+	if(triangles.size() <= 0) {
+		return 0;
+	}
+
+	ntlRenderGlobals *glob = new ntlRenderGlobals;
+	ntlScene *genscene = new ntlScene( glob, false );
+	genscene->addGeoClass(model);
+	genscene->addGeoObject(model);
+	genscene->buildScene(0., false);
+	char treeFlag = (1<<(4+model->getGeoInitId()));
+
+	ntlTree *tree = new ntlTree( 
+	15, 8,  // TREEwarning - fixed values for depth & maxtriangles here...
+	genscene, treeFlag );
+
+	// TODO? use params
+	ntlVec3Gfx start,end;
+	model->getExtends(start,end);
+	/*
+	printf("start - x: %f, y: %f, z: %f\n", start[0], start[1], start[2]);
+	printf("end   - x: %f, y: %f, z: %f\n", end[0], end[1], end[2]);
+	printf("mCPSWidth: %f\n");
+*/
+	LbmFloat width = mCPSWidth;
+	if(width<=LBM_EPSILON) { errMsg("ControlParticles::initFromMVMCMesh","Invalid mCPSWidth! "<<mCPSWidth); width=mCPSWidth=0.1; }
+	ntlVec3Gfx org = start+ntlVec3Gfx(width*0.5);
+	gfxReal distance = -1.;
+	vector<ntlVec3Gfx> inspos;
+	int approxmax = (int)( ((end[0]-start[0])/width)*((end[1]-start[1])/width)*((end[2]-start[2])/width) );
+
+	// printf("distance: %f, width: %f\n", distance, width);
+	
+	while(org[2]<end[2]) {
+		while(org[1]<end[1]) {
+			while(org[0]<end[0]) {
+				if(checkPointInside(tree, org, distance)) {
+					inspos.push_back(org);
+				}
+				// TODO optimize, use distance
+				org[0] += width;
+			}
+			org[1] += width;
+			org[0] = start[0];
+		}
+		org[2] += width;
+		org[1] = start[1];
+	}
+	
+	// printf("inspos.size(): %d\n", inspos.size());
+
+	MeanValueMeshCoords mvm;
+	mvm.calculateMVMCs(vertices,triangles, inspos, mCPSWeightFac);
+	vector<ntlVec3Gfx> ninspos;
+	mvm.transfer(vertices, ninspos);
+
+	// init first set, check dist
+	ControlParticleSet firstcps; //T
+	mPartSets.push_back(firstcps);
+	mPartSets[mPartSets.size()-1].time = mCPSTimeStart;
+	vector<bool> useCP;
+
+	for(int i=0; i<(int)inspos.size(); i++) {
+		ControlParticle p; p.reset();
+		p.pos = vec2L(inspos[i]);
+		
+		double cpdist = norm(inspos[i]-ninspos[i]);
+		bool usecpv = true;
+
+		mPartSets[mPartSets.size()-1].particles.push_back(p);
+		useCP.push_back(usecpv);
+	}
+
+	// init further sets, temporal mesh sampling
+	double tsampling = mCPSTimestep;
+	// printf("tsampling: %f, ninspos.size(): %d, mCPSTimeEnd: %f\n", tsampling, ninspos.size(), mCPSTimeEnd);
+	
+	int totcnt = (int)( (mCPSTimeEnd-mCPSTimeStart)/tsampling ), tcnt=0;
+	for(double t=mCPSTimeStart+tsampling; ((t<mCPSTimeEnd) && (ninspos.size()>0.)); t+=tsampling) {
+		ControlParticleSet nextcps; //T
+		mPartSets.push_back(nextcps);
+		mPartSets[mPartSets.size()-1].time = (gfxReal)t;
+
+		vertices.clear(); triangles.clear(); normals.clear();
+		model->getTriangles(t, &triangles, &vertices, &normals, 1 );
+		mvm.transfer(vertices, ninspos);
+		
+		tcnt++;
+		for(size_t i=0; i < ninspos.size(); i++) {
+			
+			if(useCP[i]) {
+				ControlParticle p; p.reset();
+				p.pos = vec2L(ninspos[i]);
+				mPartSets[mPartSets.size()-1].particles.push_back(p);
+			}
+		}
+	}
+	
+	model->setGeoInitType(FGI_CONTROL);
+
+	delete tree;
+	delete genscene;
+	delete glob;
+	
+	// do reverse here
+	if(model->getGeoPartSlipValue())
+	{
+		mirrorTime();
+	}
+	
+	return 1;
+}
+
+
+// init all zero / defaults for a single particle
+void ControlParticle::reset() {
+	pos = LbmVec(0.,0.,0.);
+	vel = LbmVec(0.,0.,0.);
+	influence = 1.;
+	size = 1.;
+#ifndef LBMDIM
+#ifdef MAIN_2D
+	rotaxis = LbmVec(0.,1.,0.); // SPH xz
+#else // MAIN_2D
+	// 3d - roate in xy plane, vortex
+	rotaxis = LbmVec(0.,0.,1.);
+	// 3d - rotate for wave
+	//rotaxis = LbmVec(0.,1.,0.);
+#endif // MAIN_2D
+#else // LBMDIM
+	rotaxis = LbmVec(0.,1.,0.); // LBM xy , is swapped afterwards
+#endif // LBMDIM
+
+	density = 0.;
+	densityWeight = 0.;
+	avgVelAcc = avgVel = LbmVec(0.);
+	avgVelWeight = 0.;
+}
+
+
+// default preset/empty init
+ControlParticles::ControlParticles() :
+	_influenceTangential(0.f),

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list