Initial GUI implementation, yet not functional
This commit is contained in:
@@ -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 )
|
||||
|
||||
3
intern/elbeem/extern/elbeem.h
vendored
3
intern/elbeem/extern/elbeem.h
vendored
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
@@ -13,10 +13,13 @@
|
||||
|
||||
// add mesh as fluidsim object
|
||||
int elbeemControlAddSet(struct elbeemControl*) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int elbeemControlComputeMesh(struct elbeemMesh) {
|
||||
int elbeemControlComputeMesh(struct elbeemMesh*) {
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user