[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25502] trunk/blender: Multires: added back Reshape function, to copy vertex locations

Brecht Van Lommel brecht at blender.org
Mon Dec 21 16:55:10 CET 2009


Revision: 25502
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25502
Author:   blendix
Date:     2009-12-21 16:55:10 +0100 (Mon, 21 Dec 2009)

Log Message:
-----------
Multires: added back Reshape function, to copy vertex locations
from another mesh.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/properties_data_modifier.py
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/editors/object/object_intern.h
    trunk/blender/source/blender/editors/object/object_modifier.c
    trunk/blender/source/blender/editors/object/object_ops.c
    trunk/blender/source/blender/makesrna/intern/rna_modifier.c

Modified: trunk/blender/release/scripts/ui/properties_data_modifier.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_data_modifier.py	2009-12-21 15:37:19 UTC (rev 25501)
+++ trunk/blender/release/scripts/ui/properties_data_modifier.py	2009-12-21 15:55:10 UTC (rev 25502)
@@ -445,6 +445,7 @@
         col.enabled = ob.mode != 'EDIT'
         col.operator("object.multires_subdivide", text="Subdivide")
         col.operator("object.multires_higher_levels_delete", text="Delete Higher")
+        col.operator("object.multires_reshape", text="Reshape")
         col.prop(md, "optimal_display")
 
         layout.separator()

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2009-12-21 15:37:19 UTC (rev 25501)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2009-12-21 15:55:10 UTC (rev 25502)
@@ -63,6 +63,7 @@
 static const int multires_grid_tot[] = {0, 4, 9, 25, 81, 289, 1089, 4225, 16641, 66049, 263169, 1050625, 4198401, 16785409};
 static const int multires_side_tot[] = {0, 2, 3, 5,  9,  17,  33,   65,   129,   257,   513,    1025,    2049,    4097};
 
+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);
 
 MultiresModifierData *find_multires_modifier(Object *ob)
@@ -106,6 +107,27 @@
 	CLAMP(mmd->renderlvl, 0, mmd->totlvl);
 }
 
+static void multires_dm_mark_as_modified(DerivedMesh *dm)
+{
+	CCGDerivedMesh *ccgdm = (CCGDerivedMesh*)dm;
+	ccgdm->multires.modified = 1;
+}
+
+void multires_mark_as_modified(Object *ob)
+{
+	if(ob && ob->derivedFinal)
+		multires_dm_mark_as_modified(ob->derivedFinal);
+}
+
+void multires_force_update(Object *ob)
+{
+	if(ob && ob->derivedFinal) {
+		ob->derivedFinal->needsFree =1;
+		ob->derivedFinal->release(ob->derivedFinal);
+		ob->derivedFinal = NULL;
+	}
+}
+
 /* XXX */
 #if 0
 void multiresModifier_join(Object *ob)
@@ -168,30 +190,22 @@
 }
 #endif
 
-/* Returns 0 on success, 1 if the src's totvert doesn't match */
+/* Returns 1 on success, 0 if the src's totvert doesn't match */
 int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src)
 {
-	/* XXX */
-#if 0
-	Mesh *src_me = get_mesh(src);
+	DerivedMesh *srcdm = src->derivedFinal;
 	DerivedMesh *mrdm = dst->derivedFinal;
 
-	if(mrdm && mrdm->getNumVerts(mrdm) == src_me->totvert) {
-		MVert *mvert = CDDM_get_verts(mrdm);
-		int i;
+	if(mrdm && srcdm && mrdm->getNumVerts(mrdm) == srcdm->getNumVerts(srcdm)) {
+		multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm));
 
-		for(i = 0; i < src_me->totvert; ++i)
-			copy_v3_v3(mvert[i].co, src_me->mvert[i].co);
-		mrdm->needsFree = 1;
-		MultiresDM_mark_as_modified(mrdm);
-		mrdm->release(mrdm);
-		dst->derivedFinal = NULL;
+		multires_dm_mark_as_modified(mrdm);
+		multires_force_update(dst);
 
-		return 0;
+		return 1;
 	}
-#endif
 
-	return 1;
+	return 0;
 }
 
 static void column_vectors_to_mat3(float mat[][3], float v1[3], float v2[3], float v3[3])
@@ -242,7 +256,7 @@
 }
 
 /* direction=1 for delete higher, direction=0 for lower (not implemented yet) */
-void multiresModifier_del_levels(struct MultiresModifierData *mmd, struct Object *ob, int direction)
+void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction)
 {
 	Mesh *me = get_mesh(ob);
 	int lvl = multires_get_level(ob, mmd, 0);
@@ -621,27 +635,6 @@
 	}
 }
 
-static void multires_dm_mark_as_modified(struct DerivedMesh *dm)
-{
-	CCGDerivedMesh *ccgdm = (CCGDerivedMesh*)dm;
-	ccgdm->multires.modified = 1;
-}
-
-void multires_mark_as_modified(struct Object *ob)
-{
-	if(ob && ob->derivedFinal)
-		multires_dm_mark_as_modified(ob->derivedFinal);
-}
-
-void multires_force_update(Object *ob)
-{
-	if(ob && ob->derivedFinal) {
-		ob->derivedFinal->needsFree =1;
-		ob->derivedFinal->release(ob->derivedFinal);
-		ob->derivedFinal = NULL;
-	}
-}
-
 void multires_stitch_grids(Object *ob)
 {
 	/* utility for smooth brush */
@@ -661,7 +654,7 @@
 	}
 }
 
-struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int local_mmd, DerivedMesh *dm, Object *ob,
+DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int local_mmd, DerivedMesh *dm, Object *ob,
 						    int useRenderParams, int isFinalCalc)
 {
 	Mesh *me= ob->data;
@@ -973,7 +966,7 @@
 	}
 }
 
-static void multires_old_mvert_to_ss(DerivedMesh *dm, MVert *mvert)
+static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert)
 {
 	CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
 	CCGSubSurf *ss = ccgdm->ss;
@@ -1197,7 +1190,7 @@
 
 	MEM_freeN(vvmap);
 
-	multires_old_mvert_to_ss(dm, vdst);
+	multires_mvert_to_ss(dm, vdst);
 }
 
 

Modified: trunk/blender/source/blender/editors/object/object_intern.h
===================================================================
--- trunk/blender/source/blender/editors/object/object_intern.h	2009-12-21 15:37:19 UTC (rev 25501)
+++ trunk/blender/source/blender/editors/object/object_intern.h	2009-12-21 15:55:10 UTC (rev 25502)
@@ -142,6 +142,7 @@
 void OBJECT_OT_modifier_convert(struct wmOperatorType *ot);
 void OBJECT_OT_modifier_copy(struct wmOperatorType *ot);
 void OBJECT_OT_multires_subdivide(struct wmOperatorType *ot);
+void OBJECT_OT_multires_reshape(struct wmOperatorType *ot);
 void OBJECT_OT_multires_higher_levels_delete(struct wmOperatorType *ot);
 void OBJECT_OT_multires_save_external(struct wmOperatorType *ot);
 void OBJECT_OT_multires_pack_external(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c	2009-12-21 15:37:19 UTC (rev 25501)
+++ trunk/blender/source/blender/editors/object/object_modifier.c	2009-12-21 15:55:10 UTC (rev 25502)
@@ -814,6 +814,51 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
+/****************** multires reshape operator *********************/
+
+static int multires_reshape_exec(bContext *C, wmOperator *op)
+{
+	PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier);
+	Object *ob= ptr.id.data, *secondob= NULL;
+	MultiresModifierData *mmd= ptr.data;
+
+	CTX_DATA_BEGIN(C, Object*, selob, selected_editable_objects) {
+		if(selob->type == OB_MESH && selob != ob) {
+			secondob= selob;
+			break;
+		}
+	}
+	CTX_DATA_END;
+
+	if(!secondob) {
+		BKE_report(op->reports, RPT_ERROR, "Second selected mesh object require to copy shape from.");
+		return OPERATOR_CANCELLED;
+	}
+	
+	if(!multiresModifier_reshape(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;
+}
+
+void OBJECT_OT_multires_reshape(wmOperatorType *ot)
+{
+	ot->name= "Multires Reshape";
+	ot->description= "Copy vertex coordinates from other object.";
+	ot->idname= "OBJECT_OT_multires_reshape";
+
+	ot->poll= multires_poll;
+	ot->exec= multires_reshape_exec;
+	
+	/* flags */
+	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
 /****************** multires save external operator *********************/
 
 static int multires_save_external_exec(bContext *C, wmOperator *op)

Modified: trunk/blender/source/blender/editors/object/object_ops.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_ops.c	2009-12-21 15:37:19 UTC (rev 25501)
+++ trunk/blender/source/blender/editors/object/object_ops.c	2009-12-21 15:55:10 UTC (rev 25502)
@@ -135,6 +135,7 @@
 	WM_operatortype_append(OBJECT_OT_modifier_convert);
 	WM_operatortype_append(OBJECT_OT_modifier_copy);
 	WM_operatortype_append(OBJECT_OT_multires_subdivide);
+	WM_operatortype_append(OBJECT_OT_multires_reshape);
 	WM_operatortype_append(OBJECT_OT_multires_higher_levels_delete);
 	WM_operatortype_append(OBJECT_OT_multires_save_external);
 	WM_operatortype_append(OBJECT_OT_multires_pack_external);

Modified: trunk/blender/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2009-12-21 15:37:19 UTC (rev 25501)
+++ trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2009-12-21 15:55:10 UTC (rev 25502)
@@ -55,9 +55,9 @@
 	{eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""},
 	{eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""},
 	{eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multiresolution", ""},
+	{eModifierType_Solidify, "SOLIDIFY", ICON_MOD_DISPLACE, "Solidify", ""},
 	{eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
 	{eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
-	{eModifierType_Solidify, "SOLIDIFY", ICON_MOD_DISPLACE, "Solidify", ""},
 	{0, "", 0, "Deform", ""},
 	{eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
 	{eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},





More information about the Bf-blender-cvs mailing list