Phase1: fluidsim obstacles/control objects are grabbed from the specific position...
authorDaniel Genrich <daniel.genrich@gmx.net>
Mon, 28 Jul 2008 11:01:34 +0000 (11:01 +0000)
committerDaniel Genrich <daniel.genrich@gmx.net>
Mon, 28 Jul 2008 11:01:34 +0000 (11:01 +0000)
source/blender/blenkernel/BKE_DerivedMesh.h
source/blender/blenkernel/BKE_fluidsim.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/fluidsim.c
source/blender/src/buttons_editing.c
source/blender/src/fluidsim.c

index f61b300f708e09dd3870a86f56a257d40a6742ed..e6162c7ff654dc160f2e615266492fecdb401f49 100644 (file)
@@ -412,7 +412,10 @@ DerivedMesh *mesh_create_derived_for_modifier(struct Object *ob, struct Modifier
 
 DerivedMesh *mesh_create_derived_render(struct Object *ob,
                                         CustomDataMask dataMask);
-/* same as above but wont use render settings */
+
+DerivedMesh *mesh_create_derived_index_render(struct Object *ob, CustomDataMask dataMask, int index);
+
+               /* same as above but wont use render settings */
 DerivedMesh *mesh_create_derived_view(struct Object *ob,
                                       CustomDataMask dataMask);
 DerivedMesh *mesh_create_derived_no_deform(struct Object *ob,
index a3a109a1aa696211325519af02774a5fc1b4662a..33c706da82b6120593247d95ed60960c91ca5c73 100644 (file)
 #include "BKE_DerivedMesh.h"
 
 /* old interface */
-FluidsimSettings *fluidsimSettingsNew(struct Object *srcob);
+FluidsimSettings *fluidsimSettingsNew(Object *srcob);
 
-
-void initElbeemMesh(Object *ob, int *numVertices, float **vertices, int *numTriangles, int **triangles, int useGlobalCoords);
-
-void loadFluidsimMesh(Object *srcob, int useRenderParams);
+void initElbeemMesh(Object *ob, int *numVertices, float **vertices, int *numTriangles, int **triangles, int useGlobalCoords, int modifierIndex);
 
 
 /* new fluid-modifier interface */
@@ -50,6 +47,7 @@ void fluidsim_free(FluidsimModifierData *fluidmd);
 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);
 
+// get bounding box of mesh
 void fluid_get_bb(MVert *mvert, int totvert, float obmat[][4],
                 /*RET*/ float start[3], /*RET*/ float size[3] );
 
index bfd47f14009a7f4c13d6f050050a0bab172fbb80..7c0d73085ebf0535f8924985cc3d26706e9f928c 100644 (file)
@@ -1856,7 +1856,7 @@ static void add_orco_dm(Object *ob, DerivedMesh *dm, DerivedMesh *orcodm)
 static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
                                 DerivedMesh **deform_r, DerivedMesh **final_r,
                                 int useRenderParams, int useDeform,
-                                int needMapping, CustomDataMask dataMask)
+                                int needMapping, CustomDataMask dataMask, int index)
 {
        Mesh *me = ob->data;
        ModifierData *firstmd, *md;
@@ -1865,7 +1865,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
        float (*deformedVerts)[3] = NULL;
        DerivedMesh *dm, *orcodm, *finaldm;
        int numVerts = me->totvert;
-       int required_mode;
+       int required_mode, i;
 
        md = firstmd = modifiers_getVirtualModifierList(ob);
 
@@ -1888,7 +1888,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
                        deformedVerts = mesh_getVertexCos(me, &numVerts);
                
                /* Apply all leading deforming modifiers */
-               for(; md; md = md->next, curr = curr->next) {
+               for(i = 0; md; md = md->next, curr = curr->next, i++) {
                        ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
                        if((md->mode & required_mode) != required_mode) continue;
@@ -1902,6 +1902,10 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
                        } else {
                                break;
                        }
+                       
+                       /* grab modifiers until index i */
+                       if(i==index)
+                               break;
                }
 
                /* Result of all leading deforming modifiers is cached for
@@ -1948,7 +1952,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
        if(me->vnode) dm = derivedmesh_from_versemesh(me->vnode, deformedVerts);
 #endif
 
-       for(; md; md = md->next, curr = curr->next) {
+       for(i = 0; md; md = md->next, curr = curr->next, i++) {
                ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
                if((md->mode & required_mode) != required_mode) continue;
@@ -2054,6 +2058,10 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
                                }
                        } 
                }
+               
+               /* grab modifiers until index i */
+               if(i==index)
+                       break;
        }
 
        for(md=firstmd; md; md=md->next)
@@ -2428,13 +2436,13 @@ static void mesh_build_data(Object *ob, CustomDataMask dataMask)
 
                        mesh_calc_modifiers(ob, NULL, &ob->derivedDeform,
                                            &ob->derivedFinal, 0, 1,
-                                           needMapping, dataMask);
+                                           needMapping, dataMask, -1);
 
                        CustomData_free_layer_active(&me->fdata, CD_MCOL, me->totface);
                } else {
                        mesh_calc_modifiers(ob, NULL, &ob->derivedDeform,
                                            &ob->derivedFinal, G.rendering, 1,
-                                           needMapping, dataMask);
+                                           needMapping, dataMask, -1);
                }
 
                INIT_MINMAX(min, max);
@@ -2605,7 +2613,21 @@ DerivedMesh *mesh_create_derived_render(Object *ob, CustomDataMask dataMask)
        int orig_lvl= 0;
        
        vert_copy= multires_render_pin(ob, me, &orig_lvl);
-       mesh_calc_modifiers(ob, NULL, NULL, &final, 1, 1, 0, dataMask);
+       mesh_calc_modifiers(ob, NULL, NULL, &final, 1, 1, 0, dataMask, -1);
+       multires_render_final(ob, me, &final, vert_copy, orig_lvl, dataMask);
+
+       return final;
+}
+
+DerivedMesh *mesh_create_derived_index_render(Object *ob, CustomDataMask dataMask, int index)
+{
+       DerivedMesh *final;
+       Mesh *me= get_mesh(ob);
+       float *vert_copy= NULL;
+       int orig_lvl= 0;
+       
+       vert_copy= multires_render_pin(ob, me, &orig_lvl);
+       mesh_calc_modifiers(ob, NULL, NULL, &final, 1, 1, 0, dataMask, index);
        multires_render_final(ob, me, &final, vert_copy, orig_lvl, dataMask);
 
        return final;
@@ -2615,7 +2637,7 @@ DerivedMesh *mesh_create_derived_view(Object *ob, CustomDataMask dataMask)
 {
        DerivedMesh *final;
 
-       mesh_calc_modifiers(ob, NULL, NULL, &final, 0, 1, 0, dataMask);
+       mesh_calc_modifiers(ob, NULL, NULL, &final, 0, 1, 0, dataMask, -1);
 
        return final;
 }
@@ -2625,7 +2647,7 @@ DerivedMesh *mesh_create_derived_no_deform(Object *ob, float (*vertCos)[3],
 {
        DerivedMesh *final;
        
-       mesh_calc_modifiers(ob, vertCos, NULL, &final, 0, 0, 0, dataMask);
+       mesh_calc_modifiers(ob, vertCos, NULL, &final, 0, 0, 0, dataMask, -1);
 
        return final;
 }
@@ -2640,7 +2662,7 @@ DerivedMesh *mesh_create_derived_no_deform_render(Object *ob,
        int orig_lvl= 0;
 
        vert_copy= multires_render_pin(ob, me, &orig_lvl);
-       mesh_calc_modifiers(ob, vertCos, NULL, &final, 1, 0, 0, dataMask);
+       mesh_calc_modifiers(ob, vertCos, NULL, &final, 1, 0, 0, dataMask, -1);
        multires_render_final(ob, me, &final, vert_copy, orig_lvl, dataMask);
 
        return final;
index 032dc7f44ed3058d4cbd47cdfb90c62c7d6c9aa4..fb0f3975529dc7a3d0e97afdf4da88479f782879 100644 (file)
@@ -511,118 +511,10 @@ void fluid_get_bb(MVert *mvert, int totvert, float obmat[][4],
 // file handling
 //-------------------------------------------------------------------------------
 
-
-/* write .bobj.gz file for a mesh object */
-void writeBobjgz(char *filename, struct Object *ob, int useGlobalCoords, int append, float time) 
-{
-       int wri,i,j,totvert,totface;
-       float wrf;
-       gzFile gzf;
-       DerivedMesh *dm;
-       float vec[3];
-       float rotmat[3][3];
-       MVert *mvert;
-       MFace *mface;
-       //if(append)return; // DEBUG
-
-       if(!ob->data || (ob->type!=OB_MESH)) 
-       {
-               return;
-       }
-       if((ob->size[0]<0.0) || (ob->size[0]<0.0) || (ob->size[0]<0.0) ) 
-       {
-               return;
-       }
-
-       if(append) gzf = gzopen(filename, "a+b9");
-       else       gzf = gzopen(filename, "wb9");
-       
-       if (!gzf) 
-               return;
-
-       dm = mesh_create_derived_render(ob, CD_MASK_BAREMESH);
-       //dm = mesh_create_derived_no_deform(ob,NULL);
-
-       mvert = dm->getVertArray(dm);
-       mface = dm->getFaceArray(dm);
-       totvert = dm->getNumVerts(dm);
-       totface = dm->getNumFaces(dm);
-
-       // write time value for appended anim mesh
-       if(append) 
-       {
-               gzwrite(gzf, &time, sizeof(time));
-       }
-
-       // continue with verts/norms
-       if(sizeof(wri)!=4) { return; } // paranoia check
-       wri = dm->getNumVerts(dm);
-       mvert = dm->getVertArray(dm);
-       gzwrite(gzf, &wri, sizeof(wri));
-       for(i=0; i<wri;i++) 
-       {
-               VECCOPY(vec, mvert[i].co);
-               if(useGlobalCoords) { Mat4MulVecfl(ob->obmat, vec); }
-               for(j=0; j<3; j++) {
-                       wrf = vec[j]; 
-                       gzwrite(gzf, &wrf, sizeof( wrf )); 
-               }
-       }
-
-       // should be the same as Vertices.size
-       wri = totvert;
-       gzwrite(gzf, &wri, sizeof(wri));
-       EulToMat3(ob->rot, rotmat);
-       for(i=0; i<wri;i++) 
-       {
-               VECCOPY(vec, mvert[i].no);
-               Normalize(vec);
-               if(useGlobalCoords) { Mat3MulVecfl(rotmat, vec); }
-               for(j=0; j<3; j++) {
-                       wrf = vec[j];
-                       gzwrite(gzf, &wrf, sizeof( wrf )); 
-               }
-       }
-
-       // append only writes verts&norms 
-       if(!append) {
-               // compute no. of triangles 
-               wri = 0;
-               for(i=0; i<totface; i++) 
-               {
-                       wri++;
-                       if(mface[i].v4) { wri++; }
-               }
-               gzwrite(gzf, &wri, sizeof(wri));
-               for(i=0; i<totface; i++) 
-               {
-
-                       int face[4];
-                       face[0] = mface[i].v1;
-                       face[1] = mface[i].v2;
-                       face[2] = mface[i].v3;
-                       face[3] = mface[i].v4;
-
-                       gzwrite(gzf, &(face[0]), sizeof( face[0] )); 
-                       gzwrite(gzf, &(face[1]), sizeof( face[1] )); 
-                       gzwrite(gzf, &(face[2]), sizeof( face[2] )); 
-                       if(face[3]) 
-                       { 
-                               gzwrite(gzf, &(face[0]), sizeof( face[0] )); 
-                               gzwrite(gzf, &(face[2]), sizeof( face[2] )); 
-                               gzwrite(gzf, &(face[3]), sizeof( face[3] )); 
-                       } // quad
-               }
-       }
-       
-       gzclose( gzf );
-       dm->release(dm);
-}
-
 void initElbeemMesh(struct Object *ob, 
                    int *numVertices, float **vertices, 
       int *numTriangles, int **triangles,
-      int useGlobalCoords) 
+      int useGlobalCoords, int modifierIndex
 {
        DerivedMesh *dm = NULL;
        MVert *mvert;
@@ -631,7 +523,7 @@ void initElbeemMesh(struct Object *ob,
        float *verts;
        int *tris;
 
-       dm = mesh_create_derived_render(ob, CD_MASK_BAREMESH);
+       dm = mesh_create_derived_index_render(ob, CD_MASK_BAREMESH, modifierIndex);
        //dm = mesh_create_derived_no_deform(ob,NULL);
 
        mvert = dm->getVertArray(dm);
index 66adc1b603ce64be71e1cc1a9fe5b38c3c3a6005..a3c84439b45bc6644bd7c36d56d7bd859187e8a2 100644 (file)
@@ -1813,6 +1813,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                        height = 31;
                } else if (md->type==eModifierType_Collision) {
                        height = 31;
+               } else if (md->type==eModifierType_Fluidsim) {
+                       height = 31;
                } else if (md->type==eModifierType_Boolean) {
                        height = 48;
                } else if (md->type==eModifierType_Array) {
@@ -1826,8 +1828,6 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                        height = 94;
                } else if (md->type==eModifierType_Explode) {
                        height = 94;
-               } else if (md->type==eModifierType_Fluidsim) {
-                       height = 31;
                }
                                                        /* roundbox 4 free variables: corner-rounding, nop, roundbox type, shade */
                uiDefBut(block, ROUNDBOX, 0, "", x-10, y-height-2, width, height-2, NULL, 5.0, 0.0, 12, 40, ""); 
@@ -2242,6 +2242,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                        uiDefBut(block, LABEL, 1, "See Cloth panel.",   lx, (cy-=19), buttonWidth,19, NULL, 0.0, 0.0, 0, 0, "");
                } else if (md->type==eModifierType_Collision) {
                        uiDefBut(block, LABEL, 1, "See Collision panel.",       lx, (cy-=19), buttonWidth,19, NULL, 0.0, 0.0, 0, 0, "");
+               } else if (md->type==eModifierType_Fluidsim) {
+                       uiDefBut(block, LABEL, 1, "See Fluidsim panel.",        lx, (cy-=19), buttonWidth,19, NULL, 0.0, 0.0, 0, 0, "");
                } else if (md->type==eModifierType_Boolean) {
                        BooleanModifierData *bmd = (BooleanModifierData*) md;
                        uiDefButI(block, MENU, B_MODIFIER_RECALC, "Operation%t|Intersect%x0|Union%x1|Difference%x2",    lx,(cy-=19),buttonWidth,19, &bmd->operation, 0.0, 1.0, 0, 0, "Boolean operation to perform");
index 153d53a1cde632f04582eff71557c2a855037ba5..d2ad4bed62554bc7c7c428371b4d47a76b1013e3 100644 (file)
@@ -251,7 +251,7 @@ static void fluidsimInitChannel(float **setchannel, int size, float *time,
        *setchannel = channel;
 }
 
-static void fluidsimInitMeshChannel(float **setchannel, int size, Object *obm, int vertices, float *time) {
+static void fluidsimInitMeshChannel(float **setchannel, int size, Object *obm, int vertices, float *time, int modifierIndex) {
        float *channel = NULL;
        int mallsize = size* (3*vertices+1);
        int frame,i;
@@ -267,7 +267,7 @@ static void fluidsimInitMeshChannel(float **setchannel, int size, Object *obm, i
                G.scene->r.cfra = frame;
                scene_update_for_newframe(G.scene, G.scene->lay);
 
-               initElbeemMesh(obm, &numVerts, &verts, &numTris, &tris, 1);
+               initElbeemMesh(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];
@@ -911,13 +911,15 @@ void fluidsimBake(struct Object *ob)
                                int o = channelObjCount;
                                int     deform = (fluidmdtmp->fss->domainNovecgen); // misused value
                                // todo - use blenderInitElbeemMesh
+                               int modifierIndex = modifiers_indexInObject(obit, fluidmdtmp);
+                               
                                elbeemMesh fsmesh;
                                elbeemResetMesh( &fsmesh );
                                fsmesh.type = fluidmdtmp->fss->type;
                                // get name of object for debugging solver
                                fsmesh.name = obit->id.name; 
 
-                               initElbeemMesh(obit, &numVerts, &verts, &numTris, &tris, 0);
+                               initElbeemMesh(obit, &numVerts, &verts, &numTris, &tris, 0, modifierIndex);
                                fsmesh.numVertices   = numVerts;
                                fsmesh.numTriangles  = numTris;
                                fsmesh.vertices      = verts;
@@ -977,7 +979,7 @@ void fluidsimBake(struct Object *ob)
                                // animated meshes
                                if(deform) {
                                        fsmesh.channelSizeVertices = allchannelSize;
-                                       fluidsimInitMeshChannel( &fsmesh.channelVertices, allchannelSize, obit, numVerts, timeAtFrame);
+                                       fluidsimInitMeshChannel( &fsmesh.channelVertices, allchannelSize, obit, numVerts, timeAtFrame, modifierIndex);
                                        G.scene->r.cfra = startFrame;
                                        scene_update_for_newframe(G.scene, G.scene->lay);
                                        // remove channels