[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