Revision: 18652
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18652
Author:   ton
Date:     2009-01-24 15:24:59 +0100 (Sat, 24 Jan 2009)

Log Message:
-----------
2.5

- writeimage.c back, put in space_file now...
- renamed fluidsim.c to distinguish from bke version

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/space_file/Makefile
    branches/blender2.5/blender/source/blender/editors/space_file/SConscript

Added Paths:
-----------
    branches/blender2.5/blender/source/blender/editors/physics/ed_fluidsim.c
    branches/blender2.5/blender/source/blender/editors/space_file/writeimage.c

Removed Paths:
-------------
    branches/blender2.5/blender/source/blender/editors/physics/fluidsim.c

Copied: 
branches/blender2.5/blender/source/blender/editors/physics/ed_fluidsim.c (from 
rev 18650, 
branches/blender2.5/blender/source/blender/editors/physics/fluidsim.c)
===================================================================
--- branches/blender2.5/blender/source/blender/editors/physics/ed_fluidsim.c    
                        (rev 0)
+++ branches/blender2.5/blender/source/blender/editors/physics/ed_fluidsim.c    
2009-01-24 14:24:59 UTC (rev 18652)
@@ -0,0 +1,1149 @@
+/**
+ * fluidsim.c
+ * 
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#ifdef WIN32   /* Windos */
+#ifndef snprintf
+#define snprintf _snprintf
+#endif
+#endif
+
+#include "MEM_guardedalloc.h"
+
+/* types */
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_fluidsim.h"       
+#include "DNA_key_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_camera_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_key_types.h" 
+
+#include "BLI_blenlib.h"
+#include "BLI_threads.h"
+#include "BLI_arithb.h"
+
+#include "BKE_blender.h"
+#include "BKE_context.h"
+#include "BKE_customdata.h"
+#include "BKE_displist.h"
+#include "BKE_effect.h"
+#include "BKE_fluidsim.h"
+#include "BKE_global.h"
+#include "BKE_modifier.h"
+#include "BKE_main.h"
+#include "BKE_key.h"
+#include "BKE_scene.h"
+#include "BKE_object.h"
+#include "BKE_softbody.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_ipo.h"
+
+#include "PIL_time.h"
+
+#include "LBM_fluidsim.h"
+
+#include "BIF_gl.h"
+
+#include "ED_anim_api.h"
+#include "ED_fluidsim.h"
+
+/* XXX */
+/* from header info.c */
+static int start_progress_bar(void) {return 0;};
+static void end_progress_bar(void) {};
+static void waitcursor() {};
+static int progress_bar(float done, char *busy_info) {return 0;}
+static int pupmenu() {return 0;}
+/* XXX */
+
+
+double fluidsimViscosityPreset[6] = {
+       -1.0,   /* unused */
+       -1.0,   /* manual */
+       1.0e-6, /* water */
+       5.0e-5, /* some (thick) oil */
+       2.0e-3, /* ca. honey */
+       -1.0    /* end */
+};
+
+char* fluidsimViscosityPresetString[6] = {
+       "UNUSED",       /* unused */
+       "UNUSED",       /* manual */
+       "  = 1.0 * 10^-6", /* water */
+       "  = 5.0 * 10^-5", /* some (thick) oil */
+       "  = 2.0 * 10^-3", /* ca. honey */
+       "INVALID"       /* end */
+};
+
+/* enable/disable overall compilation */
+#ifndef DISABLE_ELBEEM
+
+
+/* ********************** fluid sim settings struct functions 
********************** */
+
+/* helper function */
+void fluidsimGetGeometryObjFilename(struct Object *ob, char *dst) { //, char 
*srcname) {
+       //snprintf(dst,FILE_MAXFILE, "%s_cfgdata_%s.bobj.gz", srcname, 
ob->id.name);
+       snprintf(dst,FILE_MAXFILE, "fluidcfgdata_%s.bobj.gz", ob->id.name);
+}
+
+
+
+
+/* 
********************************************************************************
 */
+/* ********************** fluid sim channel helper functions 
********************** */
+/* 
********************************************************************************
 */
+
+// no. of entries for the two channel sizes
+#define CHANNEL_FLOAT 1
+#define CHANNEL_VEC   3
+
+#define FS_FREE_ONECHANNEL(c,str) { \
+       if(c){ MEM_freeN(c); c=NULL; } \
+} // end ONE CHANN, debug: fprintf(stderr,"freeing " str " \n"); 
+
+#define FS_FREE_CHANNELS { \
+       FS_FREE_ONECHANNEL(timeAtIndex,"timeAtIndex");\
+       FS_FREE_ONECHANNEL(timeAtFrame,"timeAtFrame");\
+       FS_FREE_ONECHANNEL(channelDomainTime,"channelDomainTime"); \
+       FS_FREE_ONECHANNEL(channelDomainGravity,"channelDomainGravity");\
+       FS_FREE_ONECHANNEL(channelDomainViscosity,"channelDomainViscosity");\
+       for(i=0;i<256;i++) { \
+               FS_FREE_ONECHANNEL(channelObjMove[i][0],"channelObjMove0"); \
+               FS_FREE_ONECHANNEL(channelObjMove[i][1],"channelObjMove1"); \
+               FS_FREE_ONECHANNEL(channelObjMove[i][2],"channelObjMove2"); \
+               FS_FREE_ONECHANNEL(channelObjInivel[i],"channelObjInivel"); \
+               FS_FREE_ONECHANNEL(channelObjActive[i],"channelObjActive"); \
+               
FS_FREE_ONECHANNEL(channelAttractforceStrength[i],"channelAttractforceStrength");
 \
+               
FS_FREE_ONECHANNEL(channelAttractforceRadius[i],"channelAttractforceRadius"); \
+               
FS_FREE_ONECHANNEL(channelVelocityforceStrength[i],"channelVelocityforceStrength");
 \
+               
FS_FREE_ONECHANNEL(channelVelocityforceRadius[i],"channelVelocityforceRadius"); 
\
+       }  \
+} // end FS FREE CHANNELS
+
+
+// simplify channels before printing
+// for API this is done anyway upon init
+#if 0
+static void fluidsimPrintChannel(FILE *file, float *channel, int paramsize, 
char *str, int entries) 
+{ 
+       int i,j; 
+       int channelSize = paramsize; 
+
+       if(entries==3) {
+               elbeemSimplifyChannelVec3( channel, &channelSize); 
+       } else if(entries==1) {
+               elbeemSimplifyChannelFloat( channel, &channelSize); 
+       } else {
+               // invalid, cant happen?
+       }
+
+       fprintf(file, "      CHANNEL %s = \n", str); 
+       for(i=0; i<channelSize;i++) { 
+               fprintf(file,"        ");  
+               for(j=0;j<=entries;j++) {  // also print time value
+                       fprintf(file," %f ", channel[i*(entries+1)+j] ); 
+                       if(j==entries-1){ fprintf(file,"  "); }
+               } 
+               fprintf(file," \n");  
+       } 
+
+       fprintf(file,  "      ; \n" ); 
+}
+#endif
+
+static void fluidsimInitChannel(Scene *scene, float **setchannel, int size, 
float *time, 
+               int *icuIds, float *defaults, Ipo* ipo, int entries) 
+{
+#if 0
+       /* goes away completely */
+       int i,j;
+       IpoCurve* icus[3];
+       char *cstr = NULL;
+       float *channel = NULL;
+       float aniFrlen = scene->r.framelen;
+       int current_frame = scene->r.cfra;
+       if((entries<1) || (entries>3)) {
+               printf("fluidsimInitChannel::Error - invalid no. of entries: 
%d\n",entries);
+               entries = 1;
+       }
+
+       cstr = "fluidsiminit_channelfloat";
+       if(entries>1) cstr = "fluidsiminit_channelvec";
+       channel = MEM_callocN( size* (entries+1)* sizeof(float), cstr );
+       
+       if(ipo) {
+               for(j=0; j<entries; j++) icus[j]  = find_ipocurve(ipo, 
icuIds[j] );
+       } else {
+               for(j=0; j<entries; j++) icus[j]  = NULL; 
+       }
+       
+       for(j=0; j<entries; j++) {
+               if(icus[j]) { 
+                       for(i=1; i<=size; i++) {
+                               /* Bugfix to make python drivers working
+                               // which uses Blender.get("curframe") 
+                               */
+                               scene->r.cfra = floor(aniFrlen*((float)i));
+                               
+                               // XXX calc_icu(icus[j], aniFrlen*((float)i) );
+                               channel[(i-1)*(entries+1) + j] = 
icus[j]->curval;
+                       }
+               }  else {
+                       for(i=1; i<=size; i++) { channel[(i-1)*(entries+1) + j] 
= defaults[j]; }
+               }
+               //printf("fluidsimInitChannel entry:%d , ",j); for(i=1; 
i<=size; i++) { printf(" val%d:%f ",i, channel[(i-1)*(entries+1) + j] ); } 
printf(" \n"); // DEBUG
+       }
+       // set time values
+       for(i=1; i<=size; i++) {
+               channel[(i-1)*(entries+1) + entries] = time[i];
+       }
+       scene->r.cfra = current_frame;
+       *setchannel = channel;
+#endif
+}
+
+static void fluidsimInitMeshChannel(bContext *C, float **setchannel, int size, 
Object *obm, int vertices, 
+                                                                       float 
*time, int modifierIndex) 
+{
+       Scene *scene= CTX_data_scene(C);
+       float *channel = NULL;
+       int mallsize = size* (3*vertices+1);
+       int frame,i;
+       int numVerts=0, numTris=0;
+       int setsize = 3*vertices+1;
+
+       channel = MEM_callocN( mallsize* sizeof(float), "fluidsim_meshchannel" 
);
+
+       //fprintf(stderr,"\n\nfluidsimInitMeshChannel size%d verts%d mallsize%d 
\n\n\n",size,vertices,mallsize);
+       for(frame=1; frame<=size; frame++) {
+               float *verts=NULL;
+               int *tris=NULL;
+               scene->r.cfra = frame;
+               ED_update_for_newframe(C, 0);
+
+               initElbeemMesh(scene, obm, &numVerts, &verts, &numTris, &tris, 
1, modifierIndex);
+               //fprintf(stderr,"\nfluidsimInitMeshChannel frame%d verts%d/%d 
\n\n",frame,vertices,numVerts);
+               for(i=0; i<3*vertices;i++) {
+                       channel[(frame-1)*setsize + i] = verts[i];
+                       //fprintf(stdout," frame%d vert%d=%f 
\n",frame,i,verts[i]);
+                       //if(i%3==2) fprintf(stdout,"\n");
+               }
+               channel[(frame-1)*setsize + setsize-1] = time[frame];
+
+               MEM_freeN(verts);
+               MEM_freeN(tris);
+       }
+       *setchannel = channel;
+}
+
+
+/* 
********************************************************************************
 */
+/* ********************** simulation thread             
************************* */
+/* 
********************************************************************************
 */
+
+static volatile int    globalBakeState = 0; // 0 everything ok, -1 abort 
simulation, -2 sim error, 1 sim done
+static volatile int    globalBakeFrame = 0;
+static volatile int g_break= 0;
+
+// run simulation in seperate thread
+static void *fluidsimSimulateThread(void *unused) { // *ptr) {
+       //char* fnameCfgPath = (char*)(ptr);
+       int ret=0;
+       
+       ret = elbeemSimulate();
+       BLI_lock_thread(LOCK_CUSTOM1);
+       if(globalBakeState==0) {
+               if(ret==0) {
+                       // if no error, set to normal exit
+                       globalBakeState = 1;
+               } else {
+                       // simulation failed, display error
+                       globalBakeState = -2;
+               }
+       }
+       BLI_unlock_thread(LOCK_CUSTOM1);
+       return NULL;
+}
+
+
+int runSimulationCallback(void *data, int status, int frame) {
+       //elbeemSimulationSettings *settings = (elbeemSimulationSettings*)data;
+       //printf("elbeem blender cb s%d, f%d, domainid:%d \n", status,frame, 
settings->domainId ); // DEBUG
+       int state = 0;
+       if(status==FLUIDSIM_CBSTATUS_NEWFRAME) {
+               BLI_lock_thread(LOCK_CUSTOM1);
+               globalBakeFrame = frame-1;
+               BLI_unlock_thread(LOCK_CUSTOM1);
+       }
+       
+       //if((frameCounter==3) && (!frameStop)) { frameStop=1; return 1; }
+               
+       BLI_lock_thread(LOCK_CUSTOM1);
+       state = globalBakeState;
+       BLI_unlock_thread(LOCK_CUSTOM1);
+       
+       if(state!=0) {
+               return FLUIDSIM_CBRET_ABORT;
+       }
+       
+       return FLUIDSIM_CBRET_CONTINUE;
+}
+
+

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to