Thank you!! Joe
On Tue, Apr 13, 2010 at 8:06 AM, Sergey Sharybin <[email protected]> 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 > [email protected] > http://lists.blender.org/mailman/listinfo/bf-blender-cvs > _______________________________________________ Bf-committers mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-committers
