[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29274] trunk/blender/source/blender: - Added checking if modifier is active in find_multires_modifier

Sergey Sharybin g.ulairi at gmail.com
Sun Jun 6 17:22:27 CEST 2010


Revision: 29274
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29274
Author:   nazgul
Date:     2010-06-06 17:22:27 +0200 (Sun, 06 Jun 2010)

Log Message:
-----------
- Added checking if modifier is active in find_multires_modifier
- Pass MultiresModifierData to reshape functions

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-06-06 14:47:51 UTC (rev 29273)
+++ trunk/blender/source/blender/blenkernel/BKE_multires.h	2010-06-06 15:22:27 UTC (rev 29274)
@@ -47,15 +47,19 @@
 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 *);
 

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2010-06-06 14:47:51 UTC (rev 29273)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2010-06-06 15:22:27 UTC (rev 29274)
@@ -60,35 +60,33 @@
 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 (dm == tdm) {
+		dm = CDDM_copy(tdm);
+	}
 
-	if(tdm != dm) tdm->release(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 @@
 }
 #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 @@
 }
 
 /* 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 @@
 	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 @@
 	dm->release(dm);
 
 	/* Reshaping */
-	result= multiresModifier_reshapeFromDM(ob, ndm);
+	result= multiresModifier_reshapeFromDM(scene, mmd, ob, ndm);
 
 	/* Cleanup */
 	ndm->release(ndm);

Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c	2010-06-06 14:47:51 UTC (rev 29273)
+++ trunk/blender/source/blender/editors/object/object_modifier.c	2010-06-06 15:22:27 UTC (rev 29274)
@@ -399,7 +399,7 @@
 	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 @@
 			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 @@
 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 @@
 		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;
 }
 





More information about the Bf-blender-cvs mailing list