[Bf-blender-cvs] [70174fd] soc-2013-sketch_mesh: Create of new Operator for bind Laplacian Deform Modifier The Laplacian Deform Modifier bind the initial vertexes positions. I Modified the LaplacianDeformModifierData struct to store bind state.

Alexander Pinzon Fernandez noreply at git.blender.org
Thu Nov 21 02:27:52 CET 2013


Commit: 70174fd1c2a906b845aae18b5c18082f31843b69
Author: Alexander Pinzon Fernandez
Date:   Wed Nov 20 20:25:53 2013 -0500
http://developer.blender.org/rB70174fd1c2a906b845aae18b5c18082f31843b69

Create of new Operator for bind Laplacian Deform Modifier
The Laplacian Deform Modifier bind the initial vertexes positions.
I Modified the LaplacianDeformModifierData struct to store bind state.

===================================================================

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/editors/object/object_intern.h
M	source/blender/editors/object/object_modifier.c
M	source/blender/editors/object/object_ops.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_laplaciandeform.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 87b0941..63c7fc6 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -375,8 +375,21 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
 
     def LAPLACIANDEFORM(self, layout, ob, md):
         layout.prop(md, "iterations")
-        layout.label(text="Anchors Vertex Group:")
-        layout.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        row = layout.row()
+        row.label(text="Anchors Vertex Group:")
+        row.active = not md.is_bind
+        row = layout.row()
+        row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        row.active = not md.is_bind
+        row.enabled = not md.is_bind
+        layout.separator()
+        row = layout.row()
+        if md.is_bind:
+            row.operator("object.laplaciandeform_bind", text="Unbind")
+        else:
+            row.operator("object.laplaciandeform_bind", text="Bind")
+        row.active = bool(md.vertex_group)
+        row.enabled = bool(md.vertex_group)
 
     def LAPLACIANSMOOTH(self, layout, ob, md):
         layout.prop(md, "iterations")
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index bfed1f2..ce509e2 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -173,6 +173,7 @@ void OBJECT_OT_skin_root_mark(struct wmOperatorType *ot);
 void OBJECT_OT_skin_loose_mark_clear(struct wmOperatorType *ot);
 void OBJECT_OT_skin_radii_equalize(struct wmOperatorType *ot);
 void OBJECT_OT_skin_armature_create(struct wmOperatorType *ot);
+void OBJECT_OT_laplaciandeform_bind(struct wmOperatorType *ot);
 
 /* object_constraint.c */
 void OBJECT_OT_constraint_add(struct wmOperatorType *ot);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 01dafe6..22f7a44 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2209,3 +2209,53 @@ void OBJECT_OT_ocean_bake(wmOperatorType *ot)
 	RNA_def_boolean(ot->srna, "free", FALSE, "Free", "Free the bake, rather than generating it");
 }
 
+/************************ LaplacianDeform bind operator *********************/
+
+static int laplaciandeform_poll(bContext *C)
+{
+	return edit_modifier_poll_generic(C, &RNA_LaplacianDeformModifier, 0);
+}
+
+static int laplaciandeform_bind_exec(bContext *C, wmOperator *op)
+{
+	Scene *scene = CTX_data_scene(C);
+	Object *ob = ED_object_active_context(C);
+	LaplacianDeformModifierData *mmd = (LaplacianDeformModifierData *)edit_modifier_property_get(op, ob, eModifierType_LaplacianDeform);
+	
+	if (!mmd)
+		return OPERATOR_CANCELLED;
+	if (mmd->bind) {
+		mmd->bind = 0;
+	}
+	else {
+		mmd->bind = 1;
+	}
+	DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+	WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
+	return OPERATOR_FINISHED;
+}
+
+static int laplaciandeform_bind_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+	if (edit_modifier_invoke_properties(C, op))
+		return laplaciandeform_bind_exec(C, op);
+	else 
+		return OPERATOR_CANCELLED;
+}
+
+void OBJECT_OT_laplaciandeform_bind(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Laplacian Deform Bind";
+	ot->description = "Bind mesh to system in laplacian deform modifier";
+	ot->idname = "OBJECT_OT_laplaciandeform_bind";
+	
+	/* api callbacks */
+	ot->poll = laplaciandeform_poll;
+	ot->invoke = laplaciandeform_bind_invoke;
+	ot->exec = laplaciandeform_bind_exec;
+	
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
+	edit_modifier_properties(ot);
+}
\ No newline at end of file
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index 6d760ac..74ac487 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -241,6 +241,7 @@ void ED_operatortypes_object(void)
 
 	WM_operatortype_append(OBJECT_OT_bake_image);
 	WM_operatortype_append(OBJECT_OT_drop_named_material);
+	WM_operatortype_append(OBJECT_OT_laplaciandeform_bind);
 }
 
 void ED_operatormacros_object(void)
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 24817fa..76f80da 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1300,8 +1300,14 @@ typedef struct LaplacianDeformModifierData {
 	int total_verts, repeat;
 	float *vertexco;
 	void *cacheSystem;
+	short bind, pad[3];
 	
 } LaplacianDeformModifierData;
 
+/* Smooth modifier flags */
+enum {
+	MOD_LAPLACIANDEFORM_BIND = 1,
+};
+
 
 #endif  /* __DNA_MODIFIER_TYPES_H__ */
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 08c8c79..ec86860 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -795,6 +795,11 @@ static void rna_LaplacianDeformModifier_vgroup_set(PointerRNA *ptr, const char *
 	rna_object_vgroup_name_set(ptr, value, lmd->anchor_grp_name, sizeof(lmd->anchor_grp_name));
 }
 
+static int rna_LaplacianDeformModifier_is_bind_get(PointerRNA *ptr)
+{
+	return (((LaplacianDeformModifierData *)ptr->data)->bind == 1);
+}
+
 #else
 
 static PropertyRNA *rna_def_property_subdivision_common(StructRNA *srna, const char type[])
@@ -3712,6 +3717,11 @@ static void rna_def_modifier_laplaciandeform(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "Repeat", "");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+	prop = RNA_def_property(srna, "is_bind", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_funcs(prop, "rna_LaplacianDeformModifier_is_bind_get", NULL);
+	RNA_def_property_ui_text(prop, "Bind", "Whether geometry has been bind to anchors");
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
diff --git a/source/blender/modifiers/intern/MOD_laplaciandeform.c b/source/blender/modifiers/intern/MOD_laplaciandeform.c
index c5e552f..b08f1b4 100644
--- a/source/blender/modifiers/intern/MOD_laplaciandeform.c
+++ b/source/blender/modifiers/intern/MOD_laplaciandeform.c
@@ -694,6 +694,16 @@ static void LaplacianDeformModifier_do(
 	int sysdif;
 	LaplacianSystem *sys = NULL;
 	filevertexCos = NULL;
+	if (!smd->bind) {
+		if (smd->cacheSystem) {
+			sys = smd->cacheSystem;
+			deleteLaplacianSystem(sys);
+			smd->cacheSystem = NULL;
+			smd->total_verts = 0;
+			MEM_SAFE_FREE(smd->vertexco);
+		}
+		return;
+	}
 	if (smd->cacheSystem) {
 		sysdif = isSystemDifferent(smd, ob, dm, numVerts);
 		sys = smd->cacheSystem;




More information about the Bf-blender-cvs mailing list