Almost done with 'Phase 1': Fixed depsgraph update of modifier, fixed material index deletion, fixed face flag deletion (using face0 now as old fluid code)
This commit is contained in:
@@ -47,7 +47,7 @@ void loadFluidsimMesh(Object *srcob, int useRenderParams);
|
||||
void fluidsim_init(FluidsimModifierData *fluidmd);
|
||||
void fluidsim_free(FluidsimModifierData *fluidmd);
|
||||
|
||||
DerivedMesh *fluidsim_read_cache(Object *ob, FluidsimModifierData *fluidmd, int framenr, int useRenderParams);
|
||||
DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifierData *fluidmd, int framenr, int useRenderParams);
|
||||
DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc);
|
||||
|
||||
void fluid_get_bb(MVert *mvert, int totvert, float obmat[][4],
|
||||
|
||||
@@ -179,9 +179,9 @@ DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Object *ob, Deri
|
||||
// clmd->sim_parms->timescale= timescale;
|
||||
|
||||
/* try to read from cache */
|
||||
if((result = fluidsim_read_cache(ob, fluidmd, framenr, useRenderParams)))
|
||||
if(((fss->lastgoodframe >= framenr) || (fss->lastgoodframe < 0)) && (result = fluidsim_read_cache(ob, dm, fluidmd, framenr, useRenderParams)))
|
||||
{
|
||||
fss->lastgoodframe = framenr;
|
||||
// fss->lastgoodframe = framenr; // set also in src/fluidsim.c
|
||||
return result;
|
||||
}
|
||||
else
|
||||
@@ -189,13 +189,20 @@ DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Object *ob, Deri
|
||||
// display last known good frame
|
||||
if(fss->lastgoodframe >= 0)
|
||||
{
|
||||
if((result = fluidsim_read_cache(ob, fluidmd, fss->lastgoodframe, useRenderParams)))
|
||||
if((result = fluidsim_read_cache(ob, dm, fluidmd, fss->lastgoodframe, useRenderParams)))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
// it was supposed to be a valid frame but it isn't!
|
||||
fss->lastgoodframe = -1;
|
||||
fss->lastgoodframe = framenr - 1;
|
||||
|
||||
|
||||
// this could be likely the case when you load an old fluidsim
|
||||
if((result = fluidsim_read_cache(ob, dm, fluidmd, fss->lastgoodframe, useRenderParams)))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
result = CDDM_copy(dm);
|
||||
@@ -216,7 +223,7 @@ static DerivedMesh *fluidsim_read_obj(char *filename)
|
||||
float wrf;
|
||||
int gotBytes;
|
||||
gzFile gzf;
|
||||
int numverts = 0, numfaces = 0, numedges = 0;
|
||||
int numverts = 0, numfaces = 0;
|
||||
DerivedMesh *dm = NULL;
|
||||
MFace *mface;
|
||||
MVert *mvert;
|
||||
@@ -364,13 +371,16 @@ static DerivedMesh *fluidsim_read_obj(char *filename)
|
||||
return dm;
|
||||
}
|
||||
|
||||
DerivedMesh *fluidsim_read_cache(Object *ob, FluidsimModifierData *fluidmd, int framenr, int useRenderParams)
|
||||
DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifierData *fluidmd, int framenr, int useRenderParams)
|
||||
{
|
||||
int displaymode = 0;
|
||||
int curFrame = framenr - 1 /*G.scene->r.sfra*/; /* start with 0 at start frame */
|
||||
char targetDir[FILE_MAXFILE+FILE_MAXDIR], targetFile[FILE_MAXFILE+FILE_MAXDIR];
|
||||
FluidsimSettings *fss = fluidmd->fss;
|
||||
DerivedMesh *dm = NULL;
|
||||
MFace *mface;
|
||||
int numfaces;
|
||||
int mat_nr, flag, i;
|
||||
|
||||
if(!useRenderParams) {
|
||||
displaymode = fss->guiDisplayMode;
|
||||
@@ -422,6 +432,19 @@ DerivedMesh *fluidsim_read_cache(Object *ob, FluidsimModifierData *fluidmd, int
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// assign material + flags to new dm
|
||||
mface = orgdm->getFaceArray(orgdm);
|
||||
mat_nr = mface[0].mat_nr;
|
||||
flag = mface[0].flag;
|
||||
|
||||
mface = dm->getFaceArray(dm);
|
||||
numfaces = dm->getNumFaces(dm);
|
||||
for(i=0; i<numfaces; i++)
|
||||
{
|
||||
mface[i].mat_nr = mat_nr;
|
||||
mface[i].flag = flag;
|
||||
}
|
||||
|
||||
// load vertex velocities, if they exist...
|
||||
// TODO? use generate flag as loading flag as well?
|
||||
// warning, needs original .bobj.gz mesh loading filename
|
||||
|
||||
@@ -6932,6 +6932,36 @@ static DerivedMesh * fluidsimModifier_applyModifier(
|
||||
return derivedData;
|
||||
}
|
||||
|
||||
static void fluidsimModifier_updateDepgraph(
|
||||
ModifierData *md, DagForest *forest,
|
||||
Object *ob, DagNode *obNode)
|
||||
{
|
||||
FluidsimModifierData *fluidmd= (FluidsimModifierData*) md;
|
||||
Base *base;
|
||||
|
||||
if(fluidmd && fluidmd->fss)
|
||||
{
|
||||
if(fluidmd->fss->type == OB_FLUIDSIM_DOMAIN)
|
||||
{
|
||||
for(base = G.scene->base.first; base; base= base->next)
|
||||
{
|
||||
Object *ob1= base->object;
|
||||
if(ob1 != ob)
|
||||
{
|
||||
FluidsimModifierData *fluidmdtmp = (FluidsimModifierData *)modifiers_findByType(ob1, eModifierType_Fluidsim);
|
||||
|
||||
// only put dependancies from NON-DOMAIN fluids in here
|
||||
if(fluidmdtmp && fluidmdtmp->fss && (fluidmdtmp->fss->type!=OB_FLUIDSIM_DOMAIN))
|
||||
{
|
||||
DagNode *curNode = dag_get_node(forest, ob1);
|
||||
dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Fluidsim Object");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int fluidsimModifier_dependsOnTime(ModifierData *md)
|
||||
{
|
||||
return 1;
|
||||
@@ -7577,6 +7607,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
|
||||
mti->freeData = fluidsimModifier_freeData;
|
||||
mti->dependsOnTime = fluidsimModifier_dependsOnTime;
|
||||
mti->applyModifier = fluidsimModifier_applyModifier;
|
||||
mti->updateDepgraph = fluidsimModifier_updateDepgraph;
|
||||
|
||||
typeArrInit = 0;
|
||||
#undef INIT_TYPE
|
||||
|
||||
@@ -7745,6 +7745,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
|
||||
fluidmd->fss = MEM_dupallocN(ob->fluidsimSettings);
|
||||
fluidmd->fss->ipo = newlibadr_us(fd, ob->id.lib, ob->fluidsimSettings->ipo);
|
||||
MEM_freeN(ob->fluidsimSettings);
|
||||
|
||||
fluidmd->fss->lastgoodframe = INT_MAX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5041,7 +5041,6 @@ static void object_panel_fluidsim(Object *ob)
|
||||
{
|
||||
const int maxRes = 512;
|
||||
char memString[32];
|
||||
int i;
|
||||
Mesh *mesh = ob->data;
|
||||
|
||||
// use mesh bounding box and object scaling
|
||||
|
||||
@@ -1038,6 +1038,10 @@ void fluidsimBake(struct Object *ob)
|
||||
if(event == ESCKEY) {
|
||||
// abort...
|
||||
SDL_mutexP(globalBakeLock);
|
||||
|
||||
if(domainSettings)
|
||||
domainSettings->lastgoodframe = startFrame+globalBakeFrame;
|
||||
|
||||
done = -1;
|
||||
globalBakeFrame = 0;
|
||||
globalBakeState = -1;
|
||||
@@ -1078,6 +1082,13 @@ void fluidsimBake(struct Object *ob)
|
||||
|
||||
// go back to "current" blender time
|
||||
waitcursor(0);
|
||||
|
||||
if(globalBakeState >= 0)
|
||||
{
|
||||
if(domainSettings)
|
||||
domainSettings->lastgoodframe = startFrame+globalBakeFrame;
|
||||
}
|
||||
|
||||
G.scene->r.cfra = origFrame;
|
||||
scene_update_for_newframe(G.scene, G.scene->lay);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
|
||||
Reference in New Issue
Block a user