diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2010-04-13 10:06:49 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2010-04-13 10:06:49 +0400 |
commit | 403c1e2a8ea1bf5780ac6b290d9099a8bd279dea (patch) | |
tree | 11ec4856366d921922fa7fff4893cd7e3b7b107b /source/blender | |
parent | 449c270cd501e969ab994785096c03b5e6268a70 (diff) |
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.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 66 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 46 |
3 files changed, 89 insertions, 27 deletions
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index 22f70d079ca..e5c7745f637 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -35,6 +35,7 @@ struct Mesh; struct MFace; struct Multires; struct MultiresModifierData; +struct ModifierData; struct Object; void multires_mark_as_modified(struct Object *ob); @@ -46,11 +47,14 @@ struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData* 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 *); diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index c70d12bcb75..9e95581b211 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -60,6 +60,22 @@ static const int multires_side_tot[] = {0, 2, 3, 5, 9, 17, 33, 65, 129, 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 @@ void multiresModifier_join(Object *ob) } #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); diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index a43f3de9b14..18cc0adab8a 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -389,32 +389,44 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M 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 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, 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 @@ static int multires_reshape_exec(bContext *C, wmOperator *op) 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; |