diff options
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 14 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 40 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 11 |
3 files changed, 35 insertions, 30 deletions
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index 8716794bbd4..e8bbb58a895 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -47,15 +47,19 @@ void multires_force_external_reload(struct Object *ob); 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); +struct MultiresModifierData *find_multires_modifier(struct Scene *scene, struct Object *ob); +struct DerivedMesh *get_multires_dm(struct Scene *scene, struct MultiresModifierData *mmd, + 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 Object *dst, struct Object *src); -int multiresModifier_reshapeFromDM(struct Object *ob, struct DerivedMesh *srcdm); -int multiresModifier_reshapeFromDeformMod(struct Object *ob, struct ModifierData *md); +int multiresModifier_reshape(struct Scene *scene, struct MultiresModifierData *mmd, + struct Object *dst, struct Object *src); +int multiresModifier_reshapeFromDM(struct Scene *scene, struct MultiresModifierData *mmd, + struct Object *ob, struct DerivedMesh *srcdm); +int multiresModifier_reshapeFromDeformMod(struct Scene *scene, 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 ee8a74d6fbb..87557ea7f2e 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -60,35 +60,33 @@ 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) +DerivedMesh *get_multires_dm(Scene *scene, MultiresModifierData *mmd, Object *ob) { - Mesh *me= ob->data; - ModifierData *md= (ModifierData *)find_multires_modifier(ob); + ModifierData *md= (ModifierData *)mmd; ModifierTypeInfo *mti = modifierType_getInfo(md->type); - DerivedMesh *tdm = CDDM_from_mesh(me, ob); + DerivedMesh *tdm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); DerivedMesh *dm; - CDDM_calc_normals(tdm); dm = mti->applyModifier(md, ob, tdm, 0, 1); - - if(tdm != dm) tdm->release(tdm); + if (dm == tdm) { + dm = CDDM_copy(tdm); + } return dm; } -MultiresModifierData *find_multires_modifier(Object *ob) +MultiresModifierData *find_multires_modifier(Scene *scene, Object *ob) { ModifierData *md; - MultiresModifierData *mmd = NULL; for(md = ob->modifiers.first; md; md = md->next) { if(md->type == eModifierType_Multires) { - mmd = (MultiresModifierData*)md; - break; + if (modifier_isEnabled(scene, md, eModifierMode_Realtime)) + return (MultiresModifierData*)md; } } - return mmd; + return NULL; } static int multires_get_level(Object *ob, MultiresModifierData *mmd, int render) @@ -215,9 +213,10 @@ void multiresModifier_join(Object *ob) } #endif -int multiresModifier_reshapeFromDM(Object *ob, DerivedMesh *srcdm) +int multiresModifier_reshapeFromDM(Scene *scene, MultiresModifierData *mmd, + Object *ob, DerivedMesh *srcdm) { - DerivedMesh *mrdm = get_multires_dm (ob); + DerivedMesh *mrdm = get_multires_dm (scene, mmd, ob); if(mrdm && srcdm && mrdm->getNumVerts(mrdm) == srcdm->getNumVerts(srcdm)) { multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm)); @@ -236,13 +235,14 @@ int multiresModifier_reshapeFromDM(Object *ob, DerivedMesh *srcdm) } /* Returns 1 on success, 0 if the src's totvert doesn't match */ -int multiresModifier_reshape(Object *dst, Object *src) +int multiresModifier_reshape(Scene *scene, MultiresModifierData *mmd, Object *dst, Object *src) { - DerivedMesh *srcdm = src->derivedFinal; - return multiresModifier_reshapeFromDM(dst, srcdm); + DerivedMesh *srcdm = mesh_get_derived_final(scene, src, CD_MASK_BAREMESH); + return multiresModifier_reshapeFromDM(scene, mmd, dst, srcdm); } -int multiresModifier_reshapeFromDeformMod(Object *ob, ModifierData *md) +int multiresModifier_reshapeFromDeformMod(Scene *scene, MultiresModifierData *mmd, + Object *ob, ModifierData *md) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); DerivedMesh *dm, *ndm; @@ -250,7 +250,7 @@ int multiresModifier_reshapeFromDeformMod(Object *ob, ModifierData *md) float (*deformedVerts)[3]; /* Create DerivedMesh for deformation modifier */ - dm = get_multires_dm(ob); + dm = get_multires_dm(scene, mmd, ob); numVerts= dm->getNumVerts(dm); deformedVerts= MEM_callocN(sizeof(float)*numVerts*3, "multiresReshape_deformVerts"); @@ -264,7 +264,7 @@ int multiresModifier_reshapeFromDeformMod(Object *ob, ModifierData *md) dm->release(dm); /* Reshaping */ - result= multiresModifier_reshapeFromDM(ob, ndm); + result= multiresModifier_reshapeFromDM(scene, mmd, ob, ndm); /* Cleanup */ ndm->release(ndm); diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 3c5928d86c2..697373ea923 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -399,7 +399,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, if (ob->type==OB_MESH) { DerivedMesh *dm; Mesh *me = ob->data; - MultiresModifierData *mmd= find_multires_modifier(ob); + MultiresModifierData *mmd= find_multires_modifier(scene, ob); if( me->key) { BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys"); @@ -413,7 +413,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, multires_force_update(ob); if (mmd && mti->type==eModifierTypeType_OnlyDeform) { - multiresModifier_reshapeFromDeformMod (ob, md); + multiresModifier_reshapeFromDeformMod (scene, mmd, ob, md); } else { dm = mesh_create_derived_for_modifier(scene, ob, md); if (!dm) { @@ -954,6 +954,7 @@ void OBJECT_OT_multires_subdivide(wmOperatorType *ot) static int multires_reshape_exec(bContext *C, wmOperator *op) { Object *ob= ED_object_active_context(C), *secondob= NULL; + Scene *scene= CTX_data_scene(C); MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires); if (!mmd) @@ -971,15 +972,15 @@ static int multires_reshape_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "Second selected mesh object require to copy shape from."); return OPERATOR_CANCELLED; } - - if(!multiresModifier_reshape(ob, secondob)) { + + if(!multiresModifier_reshape(scene, mmd, ob, secondob)) { BKE_report(op->reports, RPT_ERROR, "Objects do not have the same number of vertices."); return OPERATOR_CANCELLED; } DAG_id_flush_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); - + return OPERATOR_FINISHED; } |