From d7fecc9e963d8823d3e6a045c96d3a166ac031a6 Mon Sep 17 00:00:00 2001 From: Daniel Genrich Date: Fri, 25 Jul 2008 18:57:16 +0000 Subject: Fluid control: WIP commit before weekend, not working is crashing on the first 3 frames --- intern/elbeem/extern/elbeem.h | 5 ++++- intern/elbeem/intern/controlparticles.cpp | 8 ++++++-- intern/elbeem/intern/elbeem.cpp | 8 ++++++++ intern/elbeem/intern/ntl_ray.cpp | 3 ++- intern/elbeem/intern/ntl_world.cpp | 15 +++++++++++---- intern/elbeem/intern/solver_control.cpp | 19 ++++++++++++++----- 6 files changed, 45 insertions(+), 13 deletions(-) (limited to 'intern/elbeem') diff --git a/intern/elbeem/extern/elbeem.h b/intern/elbeem/extern/elbeem.h index 2cee22a62a4..e29890aba44 100644 --- a/intern/elbeem/extern/elbeem.h +++ b/intern/elbeem/extern/elbeem.h @@ -32,7 +32,7 @@ typedef struct elbeemSimulationSettings { 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]; @@ -187,6 +187,9 @@ void elbeemResetSettings(struct elbeemSimulationSettings*); // 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*); diff --git a/intern/elbeem/intern/controlparticles.cpp b/intern/elbeem/intern/controlparticles.cpp index 75b7e9bfd80..90bc99cada7 100644 --- a/intern/elbeem/intern/controlparticles.cpp +++ b/intern/elbeem/intern/controlparticles.cpp @@ -57,6 +57,7 @@ void ControlParticles::initBlenderTest() { initTime(0. , 1.); } +// blender control object gets converted to mvm flui control object int ControlParticles::initFromObject(ntlGeometryObjModel *model) { vector triangles; vector vertices; @@ -73,6 +74,7 @@ int ControlParticles::initFromObject(ntlGeometryObjModel *model) { 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 ); @@ -137,7 +139,7 @@ int ControlParticles::initFromObject(ntlGeometryObjModel *model) { // init first set, check dist ControlParticleSet firstcps; //T mPartSets.push_back(firstcps); - mPartSets[mPartSets.size()-1].time = (gfxReal)0.; + mPartSets[mPartSets.size()-1].time = mCPSTimeStart; vector useCP; for(int i=0; i<(int)inspos.size(); i++) { @@ -1378,8 +1380,10 @@ void ControlParticles::calculateCpInfluenceOpt(ControlParticle *cp, LbmVec fluid #if (CP_PROJECT2D==1) && (defined(MAIN_2D) || LBMDIM==2) // fillFactor *= 2.0 *0.75 * pdistance; // 2d>3d sampling #endif // (CP_PROJECT2D==1) && (defined(MAIN_2D) || LBMDIM==2) + + LbmFloat signum = getInfluenceAttraction() > 0.0 ? 1.0 : -1.0; cp->density += falloffAtt * fillFactor; - force->forceAtt += posDelta *cp->densityWeight *cp->influence; + force->forceAtt += posDelta *cp->densityWeight *cp->influence *signum; force->weightAtt += falloffAtt*cp->densityWeight *cp->influence; LbmFloat falloffVel = 0.; //CPKernel::kernel(cpfo * 1.0, pdistance); diff --git a/intern/elbeem/intern/elbeem.cpp b/intern/elbeem/intern/elbeem.cpp index 0deed5082b0..c9e6bc7989b 100644 --- a/intern/elbeem/intern/elbeem.cpp +++ b/intern/elbeem/intern/elbeem.cpp @@ -96,6 +96,13 @@ int elbeemInit() { return 0; } +// fluidsim end +extern "C" +int elbeemFree() { + + return 0; +} + // start fluidsim init extern "C" int elbeemAddDomain(elbeemSimulationSettings *settings) { @@ -253,6 +260,7 @@ int elbeemSimulate(void) { if(getElbeemState() != SIMWORLD_STOP) { // ok, we're done... delete gpWorld; + gpWorld = NULL; debMsgStd("elbeemSimulate",DM_NOTIFY, "El'Beem simulation done, time: "<::iterator iter = mGeos.begin(); iter != mGeos.end(); iter++) { //errMsg("ntlScene::~ntlScene","Deleting obj "<<(*iter)->getName() ); diff --git a/intern/elbeem/intern/ntl_world.cpp b/intern/elbeem/intern/ntl_world.cpp index 21d9d63aac0..c7aa3495c93 100644 --- a/intern/elbeem/intern/ntl_world.cpp +++ b/intern/elbeem/intern/ntl_world.cpp @@ -236,10 +236,15 @@ ntlWorld::~ntlWorld() { delete mpGlob->getRenderScene(); delete mpGlob->getSimScene(); - delete mpGlob; - delete mpLightList; - delete mpPropList; - delete mpSims; + + delete mpGlob; + + + // these get assigned to mpGlob but not freed there + delete mpLightList; + delete mpPropList; // materials + delete mpSims; + #ifndef NOGUI if(mpOpenGLRenderer) delete mpOpenGLRenderer; #endif // NOGUI @@ -895,6 +900,8 @@ ntlRenderGlobals::ntlRenderGlobals() : ntlRenderGlobals::~ntlRenderGlobals() { if(mpOpenGlAttr) delete mpOpenGlAttr; if(mpBlenderAttr) delete mpBlenderAttr; + + } diff --git a/intern/elbeem/intern/solver_control.cpp b/intern/elbeem/intern/solver_control.cpp index ee032f17f8a..6b4c31b8f3e 100644 --- a/intern/elbeem/intern/solver_control.cpp +++ b/intern/elbeem/intern/solver_control.cpp @@ -236,7 +236,6 @@ LbmFsgrSolver::initCpdata() // dont load any file cset->mContrPartFile = string(""); - // TODO dg: switch to channels later cset->mcForceAtt = obj->getCpsAttrFStr(); cset->mcRadiusAtt = obj->getCpsAttrFRad(); cset->mcForceVel = obj->getCpsVelFStr(); @@ -491,8 +490,8 @@ LbmFsgrSolver::handleCpdata() // init for current time for(int cpssi=0; cpssi<(int)mpControl->mCons.size(); cpssi++) { ControlParticles *cparts = mpControl->mCons[cpssi]->mCparts; - LbmControlSet *cset = mpControl->mCons[cpssi]; + cparts->setRadiusAtt(cset->mcRadiusAtt.get(mSimulationTime)); cparts->setRadiusVel(cset->mcRadiusVel.get(mSimulationTime)); cparts->setInfluenceAttraction(cset->mcForceAtt.get(mSimulationTime) ); @@ -506,18 +505,22 @@ LbmFsgrSolver::handleCpdata() cparts->setInfluenceVelocity( cset->mcForceVel.get(mSimulationTime), mLevel[fineLev].timestep ); cparts->setLastOffset( vec2L(cset->mcCpOffset.get(mSimulationTime-mLevel[fineLev].timestep)) ); cparts->setLastScale( vec2L(cset->mcCpScale.get(mSimulationTime-mLevel[fineLev].timestep)) ); + } // check actual values - LbmFloat iatt = mpControl->mCons[0]->mCparts->getInfluenceAttraction(); + LbmFloat iatt = ABS(mpControl->mCons[0]->mCparts->getInfluenceAttraction()); LbmFloat ivel = mpControl->mCons[0]->mCparts->getInfluenceVelocity(); LbmFloat imaxd = mpControl->mCons[0]->mCparts->getInfluenceMaxdist(); //errMsg("FINCIT","iatt="<