[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