- added fix for fluidsim copying bug
authorNils Thuerey <nils@thuerey.de>
Mon, 12 Jun 2006 06:18:57 +0000 (06:18 +0000)
committerNils Thuerey <nils@thuerey.de>
Mon, 12 Jun 2006 06:18:57 +0000 (06:18 +0000)
  (surface mesh structs werent handled correctly,
  copying is now done in a new function)

intern/elbeem/extern/LBM_fluidsim.h
source/blender/blenkernel/bad_level_call_stubs/stubs.c
source/blender/blenkernel/intern/object.c
source/blender/src/fluidsim.c

index a6ba16a959978dabe33454d8f47a79e02369d937..0f7e0e1ef5ded3d5ccb8ab5a005072df7c8009b1 100644 (file)
@@ -48,6 +48,9 @@ struct FluidsimSettings* fluidsimSettingsNew(struct Object *srcob);
 /* frees internal data itself */
 void fluidsimSettingsFree(struct FluidsimSettings* sb);
 
 /* frees internal data itself */
 void fluidsimSettingsFree(struct FluidsimSettings* sb);
 
+/* duplicate internal data */
+struct FluidsimSettings* fluidsimSettingsCopy(struct FluidsimSettings* sb);
+
 /* export blender geometry to fluid solver */
 void fluidsimBake(struct Object* ob);
 
 /* export blender geometry to fluid solver */
 void fluidsimBake(struct Object* ob);
 
index b927cbe98effa0a9466527467753df610f69ffc6..1bad2de5bbc3b246a33bd763291a14cce7cb7b6a 100644 (file)
@@ -60,6 +60,7 @@ void insert_vert_ipo(struct IpoCurve *icu, float x, float y);
 struct IpoCurve *verify_ipocurve(struct ID *id, short a, char *b, char *d, int e);
 void elbeemDebugOut(char *msg);
 void fluidsimSettingsFree(struct FluidsimSettings* sb);
 struct IpoCurve *verify_ipocurve(struct ID *id, short a, char *b, char *d, int e);
 void elbeemDebugOut(char *msg);
 void fluidsimSettingsFree(struct FluidsimSettings* sb);
+void fluidsimSettingsCopy(struct FluidsimSettings* sb);
 
 
 /* readfile.c */
 
 
 /* readfile.c */
@@ -224,6 +225,7 @@ struct DispListMesh *NewBooleanMeshDLM(struct Object *ob, struct Object *ob_sele
 // bobj read/write debug messages
 void elbeemDebugOut(char *msg) {}
 void fluidsimSettingsFree(struct FluidsimSettings* sb) {}
 // bobj read/write debug messages
 void elbeemDebugOut(char *msg) {}
 void fluidsimSettingsFree(struct FluidsimSettings* sb) {}
+void fluidsimSettingsCopy(struct FluidsimSettings* sb) {}
 
 /*new render funcs */
 void     externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta) {}
 
 /*new render funcs */
 void     externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta) {}
index f76137c586f2e8994505b6391cc572a01f62303e..d4aa87ec87a44883d1d9e0d330936cdce0e78946 100644 (file)
@@ -902,8 +902,9 @@ Object *copy_object(Object *ob)
        obn->soft= copy_softbody(ob->soft);
 
        /* NT copy fluid sim setting memory */
        obn->soft= copy_softbody(ob->soft);
 
        /* NT copy fluid sim setting memory */
-       if(obn->fluidsimSettings) obn->fluidsimSettings = MEM_dupallocN(ob->fluidsimSettings);
-       else obn->fluidsimSettings = NULL;
+       //if(obn->fluidsimSettings) obn->fluidsimSettings = MEM_dupallocN(ob->fluidsimSettings);
+       //else obn->fluidsimSettings = NULL;
+       obn->fluidsimSettings = fluidsimSettingsCopy(ob->fluidsimSettings);
        
        obn->derivedDeform = NULL;
        obn->derivedFinal = NULL;
        
        obn->derivedDeform = NULL;
        obn->derivedFinal = NULL;
index 858c01834b98318def99411985fe601245c0bec6..8f028d9670f00493157aa7ffef21faf6cd8351cd 100644 (file)
@@ -208,6 +208,37 @@ FluidsimSettings *fluidsimSettingsNew(struct Object *srcob)
        return fss;
 }
 
        return fss;
 }
 
+/* duplicate struct, analogous to free */
+FluidsimSettings* fluidsimSettingsCopy(FluidsimSettings *fss)
+{
+       FluidsimSettings *dupfss;
+       Mesh *dupFsMesh = NULL;
+
+       if(!fss) return NULL;
+       dupfss = MEM_dupallocN(fss);
+
+       dupFsMesh = fss->meshSurface;
+       if(dupFsMesh) {
+               dupfss->meshSurface = MEM_dupallocN(dupFsMesh);
+               if(dupFsMesh->mvert) dupfss->meshSurface->mvert = MEM_dupallocN(dupFsMesh->mvert);
+               if(dupFsMesh->medge) dupfss->meshSurface->medge = MEM_dupallocN(dupFsMesh->medge);
+               if(dupFsMesh->mface) dupfss->meshSurface->mface = MEM_dupallocN(dupFsMesh->mface);
+       }
+
+       dupFsMesh = fss->meshBB;
+       if(dupFsMesh) {
+               dupfss->meshBB = MEM_dupallocN(dupFsMesh);
+               if(dupFsMesh->mvert) dupfss->meshBB->mvert = MEM_dupallocN(dupFsMesh->mvert);
+               if(dupFsMesh->medge) dupfss->meshBB->medge = MEM_dupallocN(dupFsMesh->medge);
+               if(dupFsMesh->mface) dupfss->meshBB->mface = MEM_dupallocN(dupFsMesh->mface);
+       }
+
+       if(fss->meshSurfNormals) dupfss->meshSurfNormals = MEM_dupallocN(fss->meshSurfNormals);
+
+       return dupfss;
+}
+
+
 /* free struct */
 void fluidsimSettingsFree(FluidsimSettings *fss)
 {
 /* free struct */
 void fluidsimSettingsFree(FluidsimSettings *fss)
 {