Initial GUI implementation, yet not functional
authorDaniel Genrich <daniel.genrich@gmx.net>
Fri, 4 Jul 2008 15:23:21 +0000 (15:23 +0000)
committerDaniel Genrich <daniel.genrich@gmx.net>
Fri, 4 Jul 2008 15:23:21 +0000 (15:23 +0000)
intern/elbeem/SConscript
intern/elbeem/extern/elbeem.h
intern/elbeem/intern/elbeem.cpp
intern/elbeem/intern/elbeem.h [deleted file]
intern/elbeem/intern/elbeem_control.cpp
intern/elbeem/intern/elbeem_control.h
intern/elbeem/intern/solver_control.cpp
source/blender/makesdna/DNA_object_fluidsim.h
source/blender/src/buttons_object.c
source/blender/src/fluidsim.c

index cea718e..5ee8da8 100644 (file)
@@ -12,6 +12,7 @@ if env['WITH_BF_OPENMP'] == 1:
 
 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 )
index 2a594dd..30ec406 100644 (file)
@@ -97,10 +97,13 @@ typedef struct elbeemSimulationSettings {
 
 
 // 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
index 23a447a..d019c03 100644 (file)
@@ -165,7 +165,7 @@ int globalMeshCounter = 1;
 // add mesh as fluidsim object
 extern "C" 
 int elbeemAddMesh(elbeemMesh *mesh) {
-       int initType = -1;
+       int initType;
        if(getElbeemState() != SIMWORLD_INITIALIZING) { errFatal("elbeemAddMesh","World and domain not initialized, call elbeemInit and elbeemAddDomain before...", SIMWORLD_INITERROR); }
 
        switch(mesh->type) {
@@ -177,9 +177,9 @@ int elbeemAddMesh(elbeemMesh *mesh) {
                case OB_FLUIDSIM_FLUID: initType = FGI_FLUID; break;
                case OB_FLUIDSIM_INFLOW: initType = FGI_MBNDINFLOW; break;
                case OB_FLUIDSIM_OUTFLOW: initType = FGI_MBNDOUTFLOW; break;
+               case OB_FLUIDSIM_CONTROL: initType = 0; break; // DG TODO: add correct time for fluid control object
+               default: return 1; // invalid type
        }
-       // invalid type?
-       if(initType<0) return 1;
        
        ntlGeometryObjModel *obj = new ntlGeometryObjModel( );
        gpWorld->getRenderGlobals()->getSimScene()->addGeoClass( obj );
diff --git a/intern/elbeem/intern/elbeem.h b/intern/elbeem/intern/elbeem.h
deleted file mode 100644 (file)
index 2a594dd..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-/******************************************************************************
- *
- * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method
- * 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 2003-2006 Nils Thuerey
- *
- * API header
- */
-#ifndef ELBEEM_API_H
-#define ELBEEM_API_H
-
-
-// simulation run callback function type (elbeemSimulationSettings->runsimCallback)
-// best use with FLUIDSIM_CBxxx defines below.
-// >parameters
-// return values: 0=continue, 1=stop, 2=abort
-// data pointer: user data pointer from elbeemSimulationSettings->runsimUserData
-// status integer: 1=running simulation, 2=new frame saved
-// frame integer: if status is 1, contains current frame number
-typedef int (*elbeemRunSimulationCallback)(void *data, int status, int frame);
-#define FLUIDSIM_CBRET_CONTINUE    0
-#define FLUIDSIM_CBRET_STOP        1
-#define FLUIDSIM_CBRET_ABORT       2 
-#define FLUIDSIM_CBSTATUS_STEP     1 
-#define FLUIDSIM_CBSTATUS_NEWFRAME 2 
-
-
-// global settings for the simulation
-typedef struct elbeemSimulationSettings {
-  /* version number */
-  short version;
-       /* id number of simulation domain, needed if more than a
-        * single domain should be simulated */
-       short domainId;
-
-       /* geometrical extent */
-       float geoStart[3], geoSize[3];
-
-  /* resolutions */
-  short resolutionxyz;
-  short previewresxyz;
-  /* size of the domain in real units (meters along largest resolution x,y,z extent) */
-  float realsize;
-
-  /* fluid properties */
-  double viscosity;
-  /* gravity strength */
-  float gravity[3];
-  /* anim start end time */
-  float animStart, aniFrameTime;
-       /* no. of frames to simulate & output */
-       short noOfFrames;
-  /* g star param (LBM compressibility) */
-  float gstar;
-  /* activate refinement? */
-  short maxRefine;
-  /* probability for surface particle generation (0.0=off) */
-  float generateParticles;
-  /* amount of tracer particles to generate (0=off) */
-  int numTracerParticles;
-
-  /* store output path, and file prefix for baked fluid surface */
-  char outputPath[160+80];
-
-       /* channel for frame time, visc & gravity animations */
-       int channelSizeFrameTime;
-       float *channelFrameTime;
-       int channelSizeViscosity;
-       float *channelViscosity;
-       int channelSizeGravity;
-       float *channelGravity;  // vector
-
-       /* boundary types and settings for domain walls */
-       short domainobsType;
-       float domainobsPartslip;
-       /* generate speed vectors for vertices (e.g. for image based motion blur)*/
-       short generateVertexVectors;
-       /* strength of surface smoothing */
-       float surfaceSmoothing;
-       /* no. of surface subdivisions */
-       int   surfaceSubdivs;
-
-       /* global transformation to apply to fluidsim mesh */
-       float surfaceTrafo[4*4];
-
-       /* development variables, testing for upcoming releases...*/
-       float farFieldSize;
-
-       /* callback function to notify calling program of performed simulation steps
-        * or newly available frame data, if NULL it is ignored */
-       elbeemRunSimulationCallback runsimCallback;
-       /* pointer passed to runsimCallback for user data storage */
-       void* runsimUserData;
-
-} elbeemSimulationSettings;
-
-
-// defines for elbeemMesh->type below
-#define OB_FLUIDSIM_FLUID       4
-#define OB_FLUIDSIM_OBSTACLE    8
-#define OB_FLUIDSIM_INFLOW      16
-#define OB_FLUIDSIM_OUTFLOW     32
-
-// defines for elbeemMesh->obstacleType below
-#define FLUIDSIM_OBSTACLE_NOSLIP     1
-#define FLUIDSIM_OBSTACLE_PARTSLIP   2
-#define FLUIDSIM_OBSTACLE_FREESLIP   3
-
-#define OB_VOLUMEINIT_VOLUME 1
-#define OB_VOLUMEINIT_SHELL  2
-#define OB_VOLUMEINIT_BOTH   (OB_VOLUMEINIT_SHELL|OB_VOLUMEINIT_VOLUME)
-
-// a single mesh object
-typedef struct elbeemMesh {
-  /* obstacle,fluid or inflow... */
-  short type;
-       /* id of simulation domain it belongs to */
-       short parentDomainId;
-
-       /* vertices */
-  int numVertices;
-       float *vertices; // = float[n][3];
-       /* animated vertices */
-  int channelSizeVertices;
-       float *channelVertices; // = float[channelSizeVertices* (n*3+1) ];
-
-       /* triangles */
-       int   numTriangles;
-  int   *triangles; // = int[][3];
-
-       /* animation channels */
-       int channelSizeTranslation;
-       float *channelTranslation;
-       int channelSizeRotation;
-       float *channelRotation;
-       int channelSizeScale;
-       float *channelScale;
-       
-       /* active channel */
-       int channelSizeActive;
-       float *channelActive;
-       /* initial velocity channel (e.g. for inflow) */
-       int channelSizeInitialVel;
-       float *channelInitialVel; // vector
-       /* use initial velocity in object coordinates? (e.g. for rotation) */
-       short localInivelCoords;
-       /* boundary types and settings */
-       short obstacleType;
-       float obstaclePartslip;
-       /* amount of force transfer from fluid to obj, 0=off, 1=normal */
-       float obstacleImpactFactor;
-       /* init volume, shell or both? use OB_VOLUMEINIT_xxx defines above */
-       short volumeInitType;
-
-       /* name of the mesh, mostly for debugging */
-       const char *name;
-} elbeemMesh;
-
-// API functions
-
-#ifdef __cplusplus
-extern "C"  {
-#endif // __cplusplus
-
-// reset elbeemSimulationSettings struct with defaults
-void elbeemResetSettings(struct elbeemSimulationSettings*);
-// start fluidsim init (returns !=0 upon failure)
-int elbeemInit(void);
-
-// start fluidsim init (returns !=0 upon failure)
-int elbeemAddDomain(struct elbeemSimulationSettings*);
-
-// get failure message during simulation or init
-// if an error occured (the string is copied into buffer,
-// max. length = 256 chars )
-void elbeemGetErrorString(char *buffer);
-
-// reset elbeemMesh struct with zeroes
-void elbeemResetMesh(struct elbeemMesh*);
-
-// add mesh as fluidsim object
-int elbeemAddMesh(struct elbeemMesh*);
-
-// do the actual simulation
-int elbeemSimulate(void);
-
-// continue a previously stopped simulation
-int elbeemContinueSimulation(void);
-
-
-// helper functions 
-
-// simplify animation channels
-// returns if the channel and its size changed
-int elbeemSimplifyChannelFloat(float *channel, int *size);
-int elbeemSimplifyChannelVec3(float *channel, int *size);
-
-// helper functions implemented in utilities.cpp
-
-/* set elbeem debug output level (0=off to 10=full on) */
-void elbeemSetDebugLevel(int level);
-/* elbeem debug output function, prints if debug level >0 */
-void elbeemDebugOut(char *msg);
-
-/* estimate how much memory a given setup will require */
-double elbeemEstimateMemreq(int res,
-    float sx, float sy, float sz,
-    int refine, char *retstr);
-
-
-
-#ifdef __cplusplus
-}
-#endif // __cplusplus
-
-
-
-/******************************************************************************/
-// internal defines, do not use for initializing elbeemMesh
-// structs, for these use OB_xxx defines above
-
-/*! fluid geometry init types */
-#define FGI_FLAGSTART   16
-#define FGI_FLUID                        (1<<(FGI_FLAGSTART+ 0))
-#define FGI_NO_FLUID     (1<<(FGI_FLAGSTART+ 1))
-#define FGI_BNDNO                        (1<<(FGI_FLAGSTART+ 2))
-#define FGI_BNDFREE              (1<<(FGI_FLAGSTART+ 3))
-#define FGI_BNDPART              (1<<(FGI_FLAGSTART+ 4))
-#define FGI_NO_BND               (1<<(FGI_FLAGSTART+ 5))
-#define FGI_MBNDINFLOW (1<<(FGI_FLAGSTART+ 6))
-#define FGI_MBNDOUTFLOW        (1<<(FGI_FLAGSTART+ 7))
-
-// all boundary types at once
-#define FGI_ALLBOUNDS ( FGI_BNDNO | FGI_BNDFREE | FGI_BNDPART | FGI_MBNDINFLOW | FGI_MBNDOUTFLOW )
-
-
-#endif // ELBEEM_API_H
index 272cfa6..800167b 100644 (file)
 
 // add mesh as fluidsim object
 int elbeemControlAddSet(struct elbeemControl*) {
+       
        return 0;
 }
 
-int elbeemControlComputeMesh(struct elbeemMesh) {
+int elbeemControlComputeMesh(struct elbeemMesh*) {
+       
+       
        return 0;
 }
 
index 0d30835..70a58fe 100644 (file)
@@ -57,6 +57,6 @@ typedef struct elbeemControl {
 int elbeemControlAddSet(struct elbeemControl*);
 
 // sample & track mesh control particles, TODO add return type...
-int elbeemControlComputeMesh(struct elbeemMesh);
+int elbeemControlComputeMesh(struct elbeemMesh*);
 
 #endif // ELBEEMCONTROL_API_H
index 69f1682..d03e42a 100644 (file)
@@ -213,7 +213,7 @@ LbmFsgrSolver::initCpdata()
        //if( (getenv("ELBEEM_CPINFILE")) || (getenv("ELBEEM_CPOUTFILE")) ){ mUseTestdata=1; }
 
        // NT blender integration manual test setup
-       if(1) {
+       if(0) {
                // manually switch on! if this is zero, nothing is done...
                mpControl->mSetForceStrength = this->mTForceStrength = 1.;
                mpControl->mCons.clear();
index 9b1e4fb..51592d7 100644 (file)
@@ -117,6 +117,12 @@ typedef struct FluidsimSettings {
 
        /* save fluidsurface normals in mvert.no, and surface vertex velocities (if available) in mvert.co */
        struct MVert *meshSurfNormals;
+       
+       /* Fluid control settings */
+       float attractforceStrength;
+       float attractforceRadius;
+       float velocityforceStrength;
+       float velocityforceRadius;
 
 } FluidsimSettings;
 
@@ -128,6 +134,7 @@ typedef struct FluidsimSettings {
 #define OB_FLUIDSIM_INFLOW      16
 #define OB_FLUIDSIM_OUTFLOW     32
 #define OB_FLUIDSIM_PARTICLE    64
+#define OB_FLUIDSIM_CONTROL    128
 
 #define OB_TYPEFLAG_START       0
 #define OB_FSGEO_THIN           (1<<(OB_TYPEFLAG_START+1))
index ba40972..9967e69 100644 (file)
@@ -4950,9 +4950,11 @@ static void object_panel_fluidsim(Object *ob)
                        uiDefButS(block, ROW, B_FLUIDSIM_CHANGETYPE ,"Obstacle",         230, yline, 70,objHeight, &fss->type, 15.0, OB_FLUIDSIM_OBSTACLE,20.0, 3.0, "Object is a fixed obstacle.");
                        yline -= lineHeight;
 
-                       uiDefButS(block, ROW, B_FLUIDSIM_CHANGETYPE    ,"Inflow",           90, yline, 70,objHeight, &fss->type, 15.0, OB_FLUIDSIM_INFLOW,  20.0, 4.0, "Object adds fluid to the simulation.");
-                       uiDefButS(block, ROW, B_FLUIDSIM_CHANGETYPE    ,"Outflow",   160, yline, 70,objHeight, &fss->type, 15.0, OB_FLUIDSIM_OUTFLOW, 20.0, 5.0, "Object removes fluid from the simulation.");
-                       uiDefButS(block, ROW, B_FLUIDSIM_MAKEPART ,"Particle",   230, yline, 70,objHeight, &fss->type, 15.0, OB_FLUIDSIM_PARTICLE,20.0, 3.0, "Object is made a particle system to display particles generated by a fluidsim domain object.");
+                       uiDefButS(block, ROW, B_FLUIDSIM_CHANGETYPE    ,"Inflow",           90, yline, 52,objHeight, &fss->type, 15.0, OB_FLUIDSIM_INFLOW,  20.0, 4.0, "Object adds fluid to the simulation.");
+                       uiDefButS(block, ROW, B_FLUIDSIM_CHANGETYPE    ,"Outflow",   142, yline, 52,objHeight, &fss->type, 15.0, OB_FLUIDSIM_OUTFLOW, 20.0, 5.0, "Object removes fluid from the simulation.");
+                       uiDefButS(block, ROW, B_FLUIDSIM_MAKEPART ,"Particle",   194, yline, 52,objHeight, &fss->type, 15.0, OB_FLUIDSIM_PARTICLE,20.0, 3.0, "Object is made a particle system to display particles generated by a fluidsim domain object.");
+                       
+                       uiDefButS(block, ROW, B_FLUIDSIM_CHANGETYPE ,"Control",  246, yline, 54,objHeight, &fss->type, 15.0, OB_FLUIDSIM_CONTROL,20.0, 3.0, "Object is made a fluid control mesh, which influences the fluid.");
                        uiBlockEndAlign(block);
                        yline -= lineHeight;
                        yline -= 2*separateHeight;
@@ -5211,6 +5213,24 @@ static void object_panel_fluidsim(Object *ob)
                                yline -= lineHeight;
                        } // disabled for now...
 
+                       }
+                       else if(fss->type == OB_FLUIDSIM_CONTROL) {
+                               
+                               uiDefBut(block, LABEL, 0, "Attraction force:", 0,yline,300,20, NULL, 0.0, 0, 0, 0, "");
+                               
+                               yline -= lineHeight;
+                               
+                               uiDefButF(block, NUM, B_DIFF, "Strength:", 0, yline,150,20, &fss->attractforceStrength, 0.0, 2.0,   10,0, "");
+                               uiDefButF(block, NUM, B_DIFF, "Radius:", 150, yline,150,20, &fss->attractforceRadius, 0.0, 2.0,   10,0, "");
+                               
+                               yline -= lineHeight;
+                               
+                               uiDefBut(block, LABEL, 0, "Velocity force:", 0,yline,300,20, NULL, 0.0, 0, 0, 0, "");
+                               
+                               yline -= lineHeight;
+                               
+                               uiDefButF(block, NUM, B_DIFF, "Strength:", 0, yline,150,20, &fss->velocityforceStrength, 0.0, 2.0,   10,0, "");
+                               uiDefButF(block, NUM, B_DIFF, "Radius:", 150, yline,150,20, &fss->velocityforceRadius, 0.0, 2.0,   10,0, "");
                        }
                        else {
                                yline -= lineHeight + 5;
index 8b9c896..58e5a96 100644 (file)
@@ -213,6 +213,12 @@ FluidsimSettings *fluidsimSettingsNew(struct Object *srcob)
        fss->surfaceSubdivs = 1.0;
        fss->particleInfSize = 0.0;
        fss->particleInfAlpha = 0.0;
+       
+       // init fluid control settings
+       fss->attractforceStrength = 0.2;
+       fss->attractforceRadius = 0.75;
+       fss->velocityforceStrength = 0.2;
+       fss->velocityforceRadius = 0.75;
 
        return fss;
 }