[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28156] trunk/blender/source/blender: Todo #21831: Deform modifier is applied to base mesh instead of

joe joeedh at gmail.com
Wed Apr 14 14:03:30 CEST 2010


Thank you!!

Joe

On Tue, Apr 13, 2010 at 8:06 AM, Sergey Sharybin <g.ulairi at gmail.com> wrote:
> Revision: 28156
>          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28156
> Author:   nazgul
> Date:     2010-04-13 08:06:49 +0200 (Tue, 13 Apr 2010)
>
> Log Message:
> -----------
> Todo #21831: Deform modifier is applied to base mesh instead of
>             multires modifier if both are in the stack (patch #21965)
>
> This patch also removes limitation of multires reshaping when
> destination object has got modifiers after multires modifier.
>
> Modified Paths:
> --------------
>    trunk/blender/source/blender/blenkernel/BKE_multires.h
>    trunk/blender/source/blender/blenkernel/intern/multires.c
>    trunk/blender/source/blender/editors/object/object_modifier.c
>
> Modified: trunk/blender/source/blender/blenkernel/BKE_multires.h
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/BKE_multires.h      2010-04-13 00:55:37 UTC (rev 28155)
> +++ trunk/blender/source/blender/blenkernel/BKE_multires.h      2010-04-13 06:06:49 UTC (rev 28156)
> @@ -35,6 +35,7 @@
>  struct MFace;
>  struct Multires;
>  struct MultiresModifierData;
> +struct ModifierData;
>  struct Object;
>
>  void multires_mark_as_modified(struct Object *ob);
> @@ -46,11 +47,14 @@
>        int local_mmd, struct DerivedMesh*, struct Object *, int, int);
>
>  struct MultiresModifierData *find_multires_modifier(struct Object *ob);
> +struct DerivedMesh *get_multires_dm(struct Object *ob);
>  void multiresModifier_join(struct Object *);
>  void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);
>  void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob,
>                                int updateblock, int simple);
>  int multiresModifier_reshape(struct MultiresModifierData *mmd, struct Object *dst, struct Object *src);
> +int multiresModifier_reshapeFromDM(struct MultiresModifierData *mmd, struct Object *ob, struct DerivedMesh *srcdm);
> +int multiresModifier_reshapeFromDeformMod(struct MultiresModifierData *mmd, struct Object *ob, struct ModifierData *md);
>
>  void multires_stitch_grids(struct Object *);
>
>
> Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/intern/multires.c   2010-04-13 00:55:37 UTC (rev 28155)
> +++ trunk/blender/source/blender/blenkernel/intern/multires.c   2010-04-13 06:06:49 UTC (rev 28156)
> @@ -60,6 +60,22 @@
>  static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert);
>  static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int add, DMGridData **oldGridData, int totlvl);
>
> +DerivedMesh *get_multires_dm(Object *ob)
> +{
> +       Mesh *me= ob->data;
> +       ModifierData *md= (ModifierData *)find_multires_modifier(ob);
> +       ModifierTypeInfo *mti = modifierType_getInfo(md->type);
> +       DerivedMesh *tdm = CDDM_from_mesh(me, ob);
> +       DerivedMesh *dm;
> +
> +       CDDM_calc_normals(tdm);
> +       dm = mti->applyModifier(md, ob, tdm, 0, 1);
> +
> +       if(tdm != dm) tdm->release(tdm);
> +
> +       return dm;
> +}
> +
>  MultiresModifierData *find_multires_modifier(Object *ob)
>  {
>        ModifierData *md;
> @@ -191,24 +207,64 @@
>  }
>  #endif
>
> -/* Returns 1 on success, 0 if the src's totvert doesn't match */
> -int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src)
> +int multiresModifier_reshapeFromDM(MultiresModifierData *mmd, Object *ob, DerivedMesh *srcdm)
>  {
> -       DerivedMesh *srcdm = src->derivedFinal;
> -       DerivedMesh *mrdm = dst->derivedFinal;
> +       DerivedMesh *mrdm = get_multires_dm (ob);
>
>        if(mrdm && srcdm && mrdm->getNumVerts(mrdm) == srcdm->getNumVerts(srcdm)) {
>                multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm));
>
>                multires_dm_mark_as_modified(mrdm);
> -               multires_force_update(dst);
> +               multires_force_update(ob);
>
> +               mrdm->release(mrdm);
> +
>                return 1;
>        }
>
> +       mrdm->release(mrdm);
> +
>        return 0;
>  }
>
> +/* Returns 1 on success, 0 if the src's totvert doesn't match */
> +int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src)
> +{
> +       DerivedMesh *srcdm = src->derivedFinal;
> +       return multiresModifier_reshapeFromDM(mmd, dst, srcdm);
> +}
> +
> +int multiresModifier_reshapeFromDeformMod(MultiresModifierData *mmd, Object *ob, ModifierData *md)
> +{
> +       ModifierTypeInfo *mti = modifierType_getInfo(md->type);
> +       DerivedMesh *dm, *ndm;
> +       int numVerts, result;
> +       float (*deformedVerts)[3];
> +
> +       /* Create DerivedMesh for deformation modifier */
> +       dm = get_multires_dm(ob);
> +       numVerts= dm->getNumVerts(dm);
> +       deformedVerts= MEM_callocN(sizeof(float)*numVerts*3, "multiresReshape_deformVerts");
> +
> +       dm->getVertCos(dm, deformedVerts);
> +       mti->deformVerts(md, ob, dm, deformedVerts, numVerts, 0, 0);
> +
> +       ndm= CDDM_copy(dm);
> +       CDDM_apply_vert_coords(ndm, deformedVerts);
> +
> +       MEM_freeN(deformedVerts);
> +       dm->release(dm);
> +
> +       /* Reshaping */
> +       result= multiresModifier_reshapeFromDM(mmd, ob, ndm);
> +
> +       /* Cleanup */
> +       ndm->release(ndm);
> +
> +       return result;
> +}
> +
> +
>  static void column_vectors_to_mat3(float mat[][3], float v1[3], float v2[3], float v3[3])
>  {
>        copy_v3_v3(mat[0], v1);
>
> Modified: trunk/blender/source/blender/editors/object/object_modifier.c
> ===================================================================
> --- trunk/blender/source/blender/editors/object/object_modifier.c       2010-04-13 00:55:37 UTC (rev 28155)
> +++ trunk/blender/source/blender/editors/object/object_modifier.c       2010-04-13 06:06:49 UTC (rev 28156)
> @@ -389,32 +389,44 @@
>
>  static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, ModifierData *md)
>  {
> +       ModifierTypeInfo *mti= modifierType_getInfo(md->type);
> +
> +       if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && mti->isDisabled(md, 0))) {
> +               BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply");
> +               return 0;
> +       }
> +
>        if (ob->type==OB_MESH) {
>                DerivedMesh *dm;
>                Mesh *me = ob->data;
> +               MultiresModifierData *mmd= find_multires_modifier(ob);
> +
>                if( me->key) {
>                        BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
>                        return 0;
>                }
> -
> +
>                mesh_pmv_off(ob, me);
> -
> +
>                /* Multires: ensure that recent sculpting is applied */
>                if(md->type == eModifierType_Multires)
>                        multires_force_update(ob);
> -
> -               dm = mesh_create_derived_for_modifier(scene, ob, md);
> -               if (!dm) {
> -                       BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply");
> -                       return 0;
> +
> +               if (mmd && mti->type==eModifierTypeType_OnlyDeform) {
> +                       multiresModifier_reshapeFromDeformMod (mmd, ob, md);
> +               } else {
> +                       dm = mesh_create_derived_for_modifier(scene, ob, md);
> +                       if (!dm) {
> +                               BKE_report(reports, RPT_ERROR, "Modifier is returned error, skipping apply");
> +                               return 0;
> +                       }
> +
> +                       DM_to_mesh(dm, me);
> +
> +                       dm->release(dm);
>                }
> -
> -               DM_to_mesh(dm, me);
> -
> -               dm->release(dm);
>        }
>        else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
> -               ModifierTypeInfo *mti = modifierType_getInfo(md->type);
>                Curve *cu;
>                int numVerts;
>                float (*vertexCos)[3];
> @@ -427,11 +439,6 @@
>                cu = ob->data;
>                BKE_report(reports, RPT_INFO, "Applied modifier only changed CV points, not tesselated/bevel vertices");
>
> -               if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && mti->isDisabled(md, 0))) {
> -                       BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply");
> -                       return 0;
> -               }
> -
>                vertexCos = curve_getVertexCos(cu, &cu->nurb, &numVerts);
>                mti->deformVerts(md, ob, NULL, vertexCos, numVerts, 0, 0);
>                curve_applyVertexCos(cu, &cu->nurb, vertexCos);
> @@ -829,11 +836,6 @@
>        Object *ob= ptr.id.data, *secondob= NULL;
>        MultiresModifierData *mmd= ptr.data;
>
> -       if(ob->derivedFinal == NULL || ob->derivedFinal->type != DM_TYPE_CCGDM) {
> -               BKE_report(op->reports, RPT_ERROR, "Active objects multires is disabled, can't reshape multires data.");
> -               return OPERATOR_CANCELLED;
> -       }
> -
>        CTX_DATA_BEGIN(C, Object*, selob, selected_editable_objects) {
>                if(selob->type == OB_MESH && selob != ob) {
>                        secondob= selob;
>
>
> _______________________________________________
> 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