[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28376] trunk/blender/source/blender: Mesh Deform Modifier: compress static binding weights better, threshold

Daniel Salazar - 3Developer.com zanqdo at gmail.com
Sat Apr 24 09:55:43 CEST 2010


Also opening a file with a binded mdef older than this commit and just
saving it makes a corrupt blend file impossible to open again

Daniel Salazar
www.3developer.com


On Fri, Apr 23, 2010 at 3:50 PM, Daniel Salazar - 3Developer.com <
zanqdo at gmail.com> wrote:

> This broke mdef binding in trunk
>
> cheers
>
> Daniel Salazar
> www.3developer.com
>
>
>
> On Fri, Apr 23, 2010 at 5:19 AM, Brecht Van Lommel <brecht at blender.org>wrote:
>
>> Revision: 28376
>>
>> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28376
>> Author:   blendix
>> Date:     2010-04-23 13:19:06 +0200 (Fri, 23 Apr 2010)
>>
>> Log Message:
>> -----------
>> Mesh Deform Modifier: compress static binding weights better, threshold
>> is still set very low so in many cases it could be even smaller, but being
>> a bit conservative here to try to avoid breaking rigs.
>>
>> This is not forward-compatible, i.e. loading new files in older blender
>> versions will loose the binding.
>>
>> Modified Paths:
>> --------------
>>    trunk/blender/source/blender/blenkernel/BKE_modifier.h
>>    trunk/blender/source/blender/blenloader/intern/readfile.c
>>    trunk/blender/source/blender/editors/armature/meshlaplacian.c
>>    trunk/blender/source/blender/makesdna/DNA_modifier_types.h
>>    trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
>>
>> Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
>> ===================================================================
>> --- trunk/blender/source/blender/blenkernel/BKE_modifier.h      2010-04-23
>> 10:47:57 UTC (rev 28375)
>> +++ trunk/blender/source/blender/blenkernel/BKE_modifier.h      2010-04-23
>> 11:19:06 UTC (rev 28376)
>> @@ -321,5 +321,8 @@
>>
>>       int required_mode);
>>  struct ModifierData  *modifiers_getVirtualModifierList(struct Object
>> *ob);
>>
>> +/* here for do_versions */
>> +void modifier_mdef_compact_influences(struct ModifierData *md);
>> +
>>  #endif
>>
>>
>> Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
>> ===================================================================
>> --- trunk/blender/source/blender/blenloader/intern/readfile.c   2010-04-23
>> 10:47:57 UTC (rev 28375)
>> +++ trunk/blender/source/blender/blenloader/intern/readfile.c   2010-04-23
>> 11:19:06 UTC (rev 28376)
>> @@ -3852,24 +3852,35 @@
>>                else if (md->type==eModifierType_MeshDeform) {
>>                        MeshDeformModifierData *mmd =
>> (MeshDeformModifierData*) md;
>>
>> -                       mmd->bindweights= newdataadr(fd,
>> mmd->bindweights);
>> -                       mmd->bindcos= newdataadr(fd, mmd->bindcos);
>> +                       mmd->bindinfluences= newdataadr(fd,
>> mmd->bindinfluences);
>> +                       mmd->bindoffsets= newdataadr(fd,
>> mmd->bindoffsets);
>> +                       mmd->bindcagecos= newdataadr(fd,
>> mmd->bindcagecos);
>>                        mmd->dyngrid= newdataadr(fd, mmd->dyngrid);
>>                        mmd->dyninfluences= newdataadr(fd,
>> mmd->dyninfluences);
>>                        mmd->dynverts= newdataadr(fd, mmd->dynverts);
>>
>> +                       mmd->bindweights= newdataadr(fd,
>> mmd->bindweights);
>> +                       mmd->bindcos= newdataadr(fd, mmd->bindcos);
>> +
>>                        if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
>>                                int a;
>>
>> +                               if(mmd->bindoffsets)
>> +                                       for(a=0; a<mmd->totvert+1; a++)
>> +
>> SWITCH_INT(mmd->bindoffsets[a])
>> +                               if(mmd->bindcagecos)
>> +                                       for(a=0; a<mmd->totcagevert*3;
>> a++)
>> +
>> SWITCH_INT(mmd->bindcagecos[a])
>> +                               if(mmd->dynverts)
>> +                                       for(a=0; a<mmd->totvert; a++)
>> +
>> SWITCH_INT(mmd->dynverts[a])
>> +
>>                                if(mmd->bindweights)
>>                                        for(a=0;
>> a<mmd->totcagevert*mmd->totvert; a++)
>>
>>  SWITCH_INT(mmd->bindweights[a])
>>                                if(mmd->bindcos)
>>                                        for(a=0; a<mmd->totcagevert*3; a++)
>>                                                SWITCH_INT(mmd->bindcos[a])
>> -                               if(mmd->dynverts)
>> -                                       for(a=0; a<mmd->totvert; a++)
>> -
>> SWITCH_INT(mmd->dynverts[a])
>>                        }
>>                }
>>        }
>> @@ -5169,7 +5180,7 @@
>>                                /*comma expressions, (e.g. expr1, expr2,
>> expr3) evalutate each expression,
>>                                  from left to right.  the right-most
>> expression sets the result of the comma
>>                                  expression as a whole*/
>> -                               for(cl= sconsole->history.first; cl &&
>> (clnext=cl->next), cl; cl= clnext) {
>> +                               for(cl= sconsole->history.first; cl &&
>> (clnext=cl->next); cl= clnext) {
>>                                        cl->line= newdataadr(fd, cl->line);
>>                                        if (!cl->line) {
>>
>>  BLI_remlink(&sconsole->history, cl);
>> @@ -6451,6 +6462,30 @@
>>        }
>>  }
>>
>> +static void do_version_mdef_250(FileData *fd, Library *lib, Main *main)
>> +{
>> +       Object *ob;
>> +       ModifierData *md;
>> +       MeshDeformModifierData *mmd;
>> +
>> +       for(ob= main->object.first; ob; ob=ob->id.next) {
>> +               for(md=ob->modifiers.first; md; md=md->next) {
>> +                       if(md->type == eModifierType_MeshDeform) {
>> +                               mmd= (MeshDeformModifierData*)md;
>> +
>> +                               if(mmd->bindcos) {
>> +                                       /* make bindcos NULL in order to
>> trick older versions
>> +                                          into thinking that the mesh was
>> not bound yet */
>> +                                       mmd->bindcagecos= mmd->bindcos;
>> +                                       mmd->bindcos= NULL;
>> +
>> +
>> modifier_mdef_compact_influences(md);
>> +                               }
>> +                       }
>> +               }
>> +       }
>> +}
>> +
>>  static void do_version_constraints_radians_degrees_250(ListBase *lb)
>>  {
>>        bConstraint *con;
>> @@ -10780,7 +10815,7 @@
>>
>>        /* put 2.50 compatibility code here until next subversion bump */
>>        {
>> -
>> +               do_version_mdef_250(fd, lib, main);
>>        }
>>
>>        /* WATCH IT!!!: pointers from libdata have not been converted yet
>> here! */
>> @@ -12219,16 +12254,17 @@
>>                                                        printf("
>>  absolute lib: %s\n", mainptr->curlib->filename);
>>                                                        printf("
>>  relative lib: %s\n", mainptr->curlib->name);
>>                                                        printf("  enter a
>> new path:\n");
>> -                                                       scanf("%s",
>> newlib_path);
>>
>> -
>> strcpy(mainptr->curlib->name, newlib_path);
>> -
>> strcpy(mainptr->curlib->filename, newlib_path);
>> -
>> cleanup_path(G.sce, mainptr->curlib->filename);
>> -
>> -                                                       fd=
>> blo_openblenderfile(mainptr->curlib->filename, basefd->reports);
>> +                                                       if(scanf("%s",
>> newlib_path) > 0) {
>> +
>> strcpy(mainptr->curlib->name, newlib_path);
>> +
>> strcpy(mainptr->curlib->filename, newlib_path);
>> +
>> cleanup_path(G.sce, mainptr->curlib->filename);
>> +
>> +                                                               fd=
>> blo_openblenderfile(mainptr->curlib->filename, basefd->reports);
>>
>> -                                                       if(fd) {
>> -
>> printf("found: '%s', party on macuno!\n", mainptr->curlib->filename);
>> +                                                               if(fd) {
>> +
>> printf("found: '%s', party on macuno!\n", mainptr->curlib->filename);
>> +                                                               }
>>                                                        }
>>                                                }
>>                                        }
>>
>> Modified: trunk/blender/source/blender/editors/armature/meshlaplacian.c
>> ===================================================================
>> --- trunk/blender/source/blender/editors/armature/meshlaplacian.c
>> 2010-04-23 10:47:57 UTC (rev 28375)
>> +++ trunk/blender/source/blender/editors/armature/meshlaplacian.c
>> 2010-04-23 11:19:06 UTC (rev 28376)
>> @@ -44,6 +44,7 @@
>>  #include "BLI_memarena.h"
>>
>>  #include "BKE_DerivedMesh.h"
>> +#include "BKE_modifier.h"
>>  #include "BKE_utildefines.h"
>>
>>  #ifdef RIGID_DEFORM
>> @@ -1991,19 +1992,22 @@
>>  #endif
>>
>>        /* assign bind variables */
>> -       mmd->bindcos= (float*)mdb.cagecos;
>> +       mmd->bindcagecos= (float*)mdb.cagecos;
>>        mmd->totvert= mdb.totvert;
>>        mmd->totcagevert= mdb.totcagevert;
>>        copy_m4_m4(mmd->bindmat, mmd->object->obmat);
>>
>> -       /* transform bindcos to world space */
>> +       /* transform bindcagecos to world space */
>>        for(a=0; a<mdb.totcagevert; a++)
>> -               mul_m4_v3(mmd->object->obmat, mmd->bindcos+a*3);
>> +               mul_m4_v3(mmd->object->obmat, mmd->bindcagecos+a*3);
>>
>>        /* free */
>>        mdb.cagedm->release(mdb.cagedm);
>>        MEM_freeN(mdb.vertexcos);
>>
>> +       /* compact weights */
>> +       modifier_mdef_compact_influences((ModifierData*)mmd);
>> +
>>        end_progress_bar();
>>        waitcursor(0);
>>  }
>>
>> Modified: trunk/blender/source/blender/makesdna/DNA_modifier_types.h
>> ===================================================================
>> --- trunk/blender/source/blender/makesdna/DNA_modifier_types.h  2010-04-23
>> 10:47:57 UTC (rev 28375)
>> +++ trunk/blender/source/blender/makesdna/DNA_modifier_types.h  2010-04-23
>> 11:19:06 UTC (rev 28376)
>> @@ -516,9 +516,13 @@
>>
>>        short gridsize, flag, mode, pad;
>>
>> -       /* variables filled in when bound */
>> -       float *bindweights, *bindcos;   /* computed binding weights */
>> +       /* result of static binding */
>> +       MDefInfluence *bindinfluences;  /* influences */
>> +       int *bindoffsets;                               /* offsets into
>> influences array */
>> +       float *bindcagecos;                             /* coordinates
>> that cage was bound with */
>>        int totvert, totcagevert;               /* total vertices in mesh
>> and cage */
>> +
>> +       /* result of dynamic binding */
>>        MDefCell *dyngrid;                              /* grid with
>> dynamic binding cell points */
>>        MDefInfluence *dyninfluences;   /* dynamic binding vertex
>> influences */
>>        int *dynverts, *pad2;                   /* is this vertex bound or
>> not? */
>> @@ -528,6 +532,10 @@
>>        float dyncellwidth;                             /* width of dynamic
>> bind cell */
>>        float bindmat[4][4];                    /* matrix of cage at
>> binding time */
>>
>> +       /* deprecated storage */
>> +       float *bindweights;                             /* deprecated
>> inefficient storage */
>> +       float *bindcos;                                 /* deprecated
>> storage of cage coords */
>> +
>>        /* runtime */
>>        void (*bindfunc)(struct Scene *scene, struct DerivedMesh *dm,
>>                struct MeshDeformModifierData *mmd,
>>
>> Modified: trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
>> ===================================================================
>> --- trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
>>  2010-04-23 10:47:57 UTC (rev 28375)
>> +++ trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
>>  2010-04-23 11:19:06 UTC (rev 28376)
>> @@ -352,7 +352,69 @@
>>                dm->release(dm);
>>  }
>>
>> +#define MESHDEFORM_MIN_INFLUENCE 0.00001
>>
>> +void modifier_mdef_compact_influences(ModifierData *md)
>> +{
>> +       MeshDeformModifierData *mmd= (MeshDeformModifierData*)md;
>> +       float weight, *weights, totweight;
>> +       int totinfluence, totvert, totcagevert, a, b;
>> +
>> +       weights= mmd->bindweights;
>> +       if(!weights)
>> +               return;
>> +
>> +       totvert= mmd->totvert;
>> +       totcagevert= mmd->totcagevert;
>> +
>> +       /* count number of influences above threshold */
>> +       for(b=0; b<totvert; b++) {
>> +               for(a=0; a<totcagevert; a++) {
>> +                       weight= weights[a + b*totcagevert];
>> +
>> +                       if(weight > MESHDEFORM_MIN_INFLUENCE)
>> +                               mmd->totinfluence++;
>> +               }
>> +       }
>> +
>> +       /* allocate bind influences */
>> +       mmd->bindinfluences=
>> MEM_callocN(sizeof(MDefInfluence)*mmd->totinfluence, "MDefBindInfluence");
>> +       mmd->bindoffsets= MEM_callocN(sizeof(int)*(totvert+1),
>> "MDefBindOffset");
>> +
>> +       /* write influences */
>> +       totinfluence= 0;
>> +
>> +       for(b=0; b<totvert; b++) {
>> +               mmd->bindoffsets[b]= totinfluence;
>> +               totweight= 0.0f;
>> +
>> +               /* sum total weight */
>> +               for(a=0; a<totcagevert; a++) {
>> +                       weight= weights[a + b*totcagevert];
>> +
>> +                       if(weight > MESHDEFORM_MIN_INFLUENCE)
>> +                               totweight += weight;
>> +               }
>> +
>> +               /* assign weights normalized */
>> +               for(a=0; a<totcagevert; a++) {
>> +                       weight= weights[a + b*totcagevert];
>> +
>> +                       if(weight > MESHDEFORM_MIN_INFLUENCE) {
>> +                               mmd->bindinfluences[totinfluence].weight=
>> weight/totweight;
>> +                               mmd->bindinfluences[totinfluence].vertex=
>> a;
>> +                               totinfluence++;
>> +                       }
>> +               }
>> +       }
>> +
>> +       mmd->bindoffsets[b]= totinfluence;
>> +
>> +       /* free */
>> +       MEM_freeN(mmd->bindweights);
>> +       mmd->bindweights= NULL;
>> +}
>> +
>>  ModifierTypeInfo modifierType_MeshDeform = {
>>        /* name */              "MeshDeform",
>>        /* structName */        "MeshDeformModifierData",
>>
>>
>> _______________________________________________
>> Bf-blender-cvs mailing list
>> Bf-blender-cvs at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>
>
>


More information about the Bf-committers mailing list