Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Thuerey <nils@thuerey.de>2005-10-10 15:31:06 +0400
committerNils Thuerey <nils@thuerey.de>2005-10-10 15:31:06 +0400
commit7095d8a11f911ddc460f0469736aecbe6cb9ef4c (patch)
tree9ca7f6abbfcf4522efa14041f2d48c6464efec9f /source/blender/src/fluidsim.c
parentd3d8441f678e8bf444a04e7379abc5322e4980b0 (diff)
- minor solver fix for msvc compilation
- added pop up menues for fluid sim bake with no fluid objects or without valid output dir settings - fixed 3d view redraw for fluidsim buttons
Diffstat (limited to 'source/blender/src/fluidsim.c')
-rw-r--r--source/blender/src/fluidsim.c90
1 files changed, 67 insertions, 23 deletions
diff --git a/source/blender/src/fluidsim.c b/source/blender/src/fluidsim.c
index bec2e28f8b1..c0ab26b7733 100644
--- a/source/blender/src/fluidsim.c
+++ b/source/blender/src/fluidsim.c
@@ -75,6 +75,8 @@
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_cursors.h"
+#include "BIF_interface.h"
+#include "BSE_headerbuttons.h"
#include "mydevice.h"
@@ -135,7 +137,7 @@ typedef struct {
/* allocates and initializes general main data */
FluidsimSettings *fluidsimSettingsNew(struct Object *srcob)
{
- char blendDir[FILE_MAXDIR], blendFile[FILE_MAXFILE];
+ //char blendDir[FILE_MAXDIR], blendFile[FILE_MAXFILE];
FluidsimSettings *fss;
fss= MEM_callocN( sizeof(FluidsimSettings), "fluidsimsettings memory");
@@ -167,9 +169,10 @@ FluidsimSettings *fluidsimSettingsNew(struct Object *srcob)
strcpy(fss->surfdataDir,"//"); // current dir
// fss->surfdataPrefix take from .blend filename
- strcpy(blendDir, G.sce);
- BLI_splitdirstring(blendDir, blendFile);
- snprintf(fss->surfdataPrefix,FILE_MAXFILE,"%s_%s", blendFile, srcob->id.name);
+ //strcpy(blendDir, G.sce);
+ //BLI_splitdirstring(blendDir, blendFile);
+ //snprintf(fss->surfdataPrefix,FILE_MAXFILE,"%s_%s", blendFile, srcob->id.name);
+ strcpy(fss->surfdataPrefix,""); // init upon first bake
fss->orgMesh = (Mesh *)srcob->data;
return fss;
@@ -230,11 +233,11 @@ void fluidsimBake(struct Object *ob)
const int maxRes = 200;
int gridlevels = 0;
- const char *strEnvName = "BLENDER_ELBEEMDEBUG"; // from blendercall.cpp
+ char outDir[FILE_MAXDIR], outPrefix[FILE_MAXFILE]; // store & modify output settings
+ int outStringsChanged = 0; // modified? copy back before baking
+ int haveSomeFluid = 0; // check if any fluid objects are set
- // test section
- // int nr= pupmenu("Continue?%t|Yes%x1|No%x0");
- // if(nr==0) return;
+ const char *strEnvName = "BLENDER_ELBEEMDEBUG"; // from blendercall.cpp
if(getenv(strEnvName)) {
int dlevel = atoi(getenv(strEnvName));
@@ -288,6 +291,21 @@ void fluidsimBake(struct Object *ob)
snprintf(debugStrBuffer,256,"fluidsimBake::msg: Baking %s, refine: %d\n", fsDomain->id.name , gridlevels );
elbeemDebugOut(debugStrBuffer);
+ // check if theres any fluid
+ // abort baking if not...
+ for(obit= G.main->object.first; obit; obit= obit->id.next) {
+ if( (obit->fluidsimFlag & OB_FLUIDSIM_ENABLE) &&
+ (obit->type==OB_MESH) && (
+ (obit->fluidsimSettings->type == OB_FLUIDSIM_FLUID) ||
+ (obit->fluidsimSettings->type == OB_FLUIDSIM_INFLOW) )
+ ) {
+ haveSomeFluid = 1;
+ }
+ }
+ if(!haveSomeFluid) {
+ pupmenu("Fluidsim Bake Error%t|No fluid objects in scene... Aborted%x0");
+ return;
+ }
// prepare names...
strcpy(curWd, G.sce);
@@ -295,55 +313,81 @@ void fluidsimBake(struct Object *ob)
if(strlen(curWd)<1) {
BLI_getwdN(curWd);
}
- if(strlen(fsDomain->fluidsimSettings->surfdataPrefix)<1) {
+ // work on these vars here... copy back later
+ strncpy(outDir, fsDomain->fluidsimSettings->surfdataDir, FILE_MAXDIR);
+ strncpy(outPrefix, fsDomain->fluidsimSettings->surfdataPrefix, FILE_MAXFILE);
+ if(strlen(outPrefix)<1) {
// make new from current .blend filename , and domain object name
strcpy(blendDir, G.sce);
BLI_splitdirstring(blendDir, blendFile);
// todo... strip .blend
- snprintf(fsDomain->fluidsimSettings->surfdataPrefix,FILE_MAXFILE,"%s_%s", blendFile, fsDomain->id.name);
- snprintf(debugStrBuffer,256,"fluidsimBake::error - warning resetting output prefix to '%s'\n", fsDomain->fluidsimSettings->surfdataPrefix);
+ snprintf(outPrefix,FILE_MAXFILE,"%s_%s", blendFile, fsDomain->id.name);
+ snprintf(debugStrBuffer,256,"fluidsimBake::error - warning resetting output prefix to '%s'\n", outPrefix);
elbeemDebugOut(debugStrBuffer);
+ outStringsChanged=1;
}
// check selected directory
#ifdef WIN32
// windows workaroung because stat seems to be broken...
// simply try to open cfg file for writing
- snprintf(fnameCfg,FILE_MAXFILE,"%s.cfg", fsDomain->fluidsimSettings->surfdataPrefix);
- BLI_make_file_string(curWd, fnameCfgPath, fsDomain->fluidsimSettings->surfdataDir, fnameCfg);
+ snprintf(fnameCfg,FILE_MAXFILE,"%s.cfg", outPrefix);
+ BLI_make_file_string(curWd, fnameCfgPath, outDir, fnameCfg);
fileCfg = fopen(fnameCfgPath, "w");
if(fileCfg) {
dirExist = 1;
fclose(fileCfg);
}
#else // WIN32
- BLI_make_file_string(curWd, fnameCfgPath, fsDomain->fluidsimSettings->surfdataDir, "");
+ BLI_make_file_string(curWd, fnameCfgPath, outDir, "");
if(S_ISDIR(BLI_exist(fnameCfgPath))) dirExist = 1;
#endif // WIN32
- if((strlen(fsDomain->fluidsimSettings->surfdataDir)<1) || (!dirExist)) {
+ if((strlen(outDir)<1) || (!dirExist)) {
// invalid dir, reset to current
- strcpy(fsDomain->fluidsimSettings->surfdataDir, "//");
- snprintf(debugStrBuffer,256,"fluidsimBake::error - warning resetting output dir to '%s'\n", fsDomain->fluidsimSettings->surfdataDir);
+ strcpy(outDir, "//");
+ snprintf(debugStrBuffer,256,"fluidsimBake::error - warning resetting output dir to '%s'\n", outDir);
elbeemDebugOut(debugStrBuffer);
+ outStringsChanged=1;
+ }
+
+ // check if modified output dir is ok
+ if(outStringsChanged) {
+ char dispmsg[FILE_MAXDIR+FILE_MAXFILE+256];
+ int selection=0;
+ strcpy(dispmsg,"Output settings set to: '");
+ strcat(dispmsg, outDir);
+ if(dispmsg[ strlen(dispmsg)-1 ]!='/') strcat(dispmsg,"/");
+ strcat(dispmsg, outPrefix);
+ //snprintf(dispmsg, FILE_MAXDIR+FILE_MAXFILE+10, "%s '%s'", changeMsg, fnameCfgPath);
+ strcat(dispmsg, "'%t|Continue with changed settings%x1|Discard and abort%x0");
+
+ // ask user if thats what he/she wants...
+ selection = pupmenu(dispmsg);
+ if(selection==0) return;
}
// dump data for frame 0
G.scene->r.cfra = 0;
scene_update_for_newframe(G.scene, G.scene->lay);
- snprintf(fnameCfg,FILE_MAXFILE,"%s.cfg", fsDomain->fluidsimSettings->surfdataPrefix);
- BLI_make_file_string(curWd, fnameCfgPath, fsDomain->fluidsimSettings->surfdataDir, fnameCfg);
+ snprintf(fnameCfg,FILE_MAXFILE,"%s.cfg", outPrefix);
+ BLI_make_file_string(curWd, fnameCfgPath, outDir, fnameCfg);
// start writing
fileCfg = fopen(fnameCfgPath, "w");
if(!fileCfg) {
snprintf(debugStrBuffer,256,"fluidsimBake::error - Unable to open file for writing '%s'\n", fnameCfgPath);
elbeemDebugOut(debugStrBuffer);
+
+ pupmenu("Fluidsim Bake Error%t|Unable to output files... Aborted%x0");
return;
}
fprintf(fileCfg, "# Blender ElBeem File , Source %s , Frame %d, to %s \n\n\n", G.sce, -1, fnameCfg );
+ // valid settings -> store
+ strncpy(fsDomain->fluidsimSettings->surfdataDir, outDir, FILE_MAXDIR);
+ strncpy(fsDomain->fluidsimSettings->surfdataPrefix, outPrefix, FILE_MAXFILE);
// FIXME set aniframetime from no. frames and duration
/* output simulation settings */
@@ -468,8 +512,8 @@ void fluidsimBake(struct Object *ob)
char fnamePreview[FILE_MAXFILE];
char fnamePreviewPath[FILE_MAXFILE+FILE_MAXDIR];
- snprintf(fnamePreview,FILE_MAXFILE,"%s_surface", fsDomain->fluidsimSettings->surfdataPrefix );
- BLI_make_file_string(curWd, fnamePreviewPath, fsDomain->fluidsimSettings->surfdataDir, fnamePreview);
+ snprintf(fnamePreview,FILE_MAXFILE,"%s_surface", outPrefix );
+ BLI_make_file_string(curWd, fnamePreviewPath, outDir, fnamePreview);
resx = G.scene->r.xsch;
resy = G.scene->r.ysch;
if((cam) && (cam->type == OB_CAMERA)) {
@@ -575,8 +619,8 @@ void fluidsimBake(struct Object *ob)
(obit->type==OB_MESH) &&
(obit->fluidsimSettings->type != OB_FLUIDSIM_DOMAIN)
) {
- getGeometryObjFilename(obit, fnameObjdat, fsDomain->fluidsimSettings->surfdataPrefix);
- BLI_make_file_string(curWd, bobjPath, fsDomain->fluidsimSettings->surfdataDir, fnameObjdat);
+ getGeometryObjFilename(obit, fnameObjdat, outPrefix);
+ BLI_make_file_string(curWd, bobjPath, outDir, fnameObjdat);
fprintf(fileCfg, objectStringStart, obit->id.name ); // abs path
if(obit->fluidsimSettings->type == OB_FLUIDSIM_FLUID) {
fprintf(fileCfg, fluidString, "fluid", bobjPath, // do use absolute paths?