[Bf-blender-cvs] [d008cf40e78] rigid_deform: reimplement binding

Jacques Lucke noreply at git.blender.org
Thu Jan 31 19:55:38 CET 2019


Commit: d008cf40e7881888663e51bbaec88d49d90452c4
Author: Jacques Lucke
Date:   Sun Dec 9 14:48:09 2018 +0100
Branches: rigid_deform
https://developer.blender.org/rBd008cf40e7881888663e51bbaec88d49d90452c4

reimplement binding

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

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

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 28cfa9bf6fa..f15ba356e20 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1636,6 +1636,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
     def RIGID_DEFORM(self, layout, ob, md):
         layout.prop_search(md, "anchor_group_name", ob, "vertex_groups", text="Anchors")
         layout.operator("object.rigiddeform_bind", text="Bind")
+        layout.label(text=f"Is Bound: {md.is_bind}")
 
 
 class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 3d017e69138..cfef854ffd4 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2349,9 +2349,16 @@ static bool rigiddeform_bind_poll(bContext *C)
 	return edit_modifier_poll_generic(C, &RNA_RigidDeformModifier, 0);
 }
 
-static int rigiddeform_bind_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
+static int rigiddeform_bind_exec(bContext *C, wmOperator *op)
 {
-	printf("Hello World\n");
+	Scene *scene = CTX_data_scene(C);
+	Object *ob = ED_object_active_context(C);
+	Depsgraph *depsgraph = CTX_data_depsgraph(C);
+	RigidDeformModifierData *rdmd = (RigidDeformModifierData *)edit_modifier_property_get(op, ob, eModifierType_RigidDeform);
+
+	rdmd->bind_next_execution = true;
+	object_force_modifier_update_for_bind(depsgraph, scene, ob);
+
 	return OPERATOR_FINISHED;
 }
 
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 5d58efe423b..a67470214f5 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1950,6 +1950,8 @@ enum {
 
 typedef struct RigidDeformModifierBindData {
 	int *anchor_indices;
+	float (*initial_positions)[3];
+	int anchor_amount, vertex_amount;
 } RigidDeformModifierBindData;
 
 typedef struct RigidDeformModifierData {
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 7cdc96fe9b3..e3b93aeb9c3 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -788,6 +788,12 @@ static bool rna_LaplacianDeformModifier_is_bind_get(PointerRNA *ptr)
 	return ((lmd->flag & MOD_LAPLACIANDEFORM_BIND) && (lmd->vertexco != NULL));
 }
 
+static bool rna_RigidDeformModifier_is_bind_get(PointerRNA *ptr)
+{
+	RigidDeformModifierData *rdmd = (RigidDeformModifierData *)ptr->data;
+	return rdmd->bind_data != NULL;
+}
+
 /* NOTE: Curve and array modifiers requires curve path to be evaluated,
  * dependency graph will make sure that curve eval would create such a path,
  * but if curve was already evaluated we might miss path.
@@ -5084,6 +5090,11 @@ static void rna_def_modifier_rigiddeform(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "Vertex Group for Anchors",
 	    "Name of the vertex group which determines anchors");
 	RNA_def_property_string_funcs(prop, NULL, NULL, "rna_RigidDeformModifier_anchor_group_name_set");
+
+	prop = RNA_def_property(srna, "is_bind", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_funcs(prop, "rna_RigidDeformModifier_is_bind_get", NULL);
+	RNA_def_property_ui_text(prop, "Bound", "Geometry has been bound to the modifier");
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 }
 
 void RNA_def_modifier(BlenderRNA *brna)
diff --git a/source/blender/modifiers/intern/MOD_rigiddeform.c b/source/blender/modifiers/intern/MOD_rigiddeform.c
index 2da1d1235fa..6bdcfc94af5 100644
--- a/source/blender/modifiers/intern/MOD_rigiddeform.c
+++ b/source/blender/modifiers/intern/MOD_rigiddeform.c
@@ -30,22 +30,189 @@
 #include "DNA_mesh_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
 
+#include "BKE_library.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
+#include "BKE_deform.h"
 
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
 
 #include "MOD_util.h"
+
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
+
+typedef float (*VectorArray)[3];
+typedef RigidDeformModifierBindData BindData;
+
+/* ************* Binding *************** */
+
+static bool vertex_group_exists(Object *ob, Mesh *mesh, const char *name)
+{
+	MDeformVert *dvert = NULL;
+	int group_index = -1;
+	MOD_get_vgroup(ob, mesh, name, &dvert, &group_index);
+	return group_index >= 0 && dvert != NULL;
+}
+
+static void get_all_vertex_weights(Object *ob, Mesh *mesh, const char *name, float *dst)
+{
+	MDeformVert *vertices;
+	int group_index;
+	MOD_get_vgroup(ob, mesh, name, &vertices, &group_index);
+	for (int i = 0; i < mesh->totvert; i++) {
+		dst[i] = defvert_find_weight(vertices + i, group_index);
+	}
+}
+
+static int count_non_zero_indices(float *values, int length)
+{
+	int amount = 0;
+	for (int i = 0; i < length; i++) {
+		if (values[i] != 0) amount++;
+	}
+	return amount;
+}
 
+static void get_non_zero_indices(float *values, int length, int **r_indices, int *r_amount)
+{
+	int amount = count_non_zero_indices(values, length);
+	int *indices = MEM_malloc_arrayN(amount, sizeof(int), __func__);
+
+	int index = 0;
+	for (int i = 0; i < length; i++) {
+		if (values[i] != 0) {
+			indices[index] = i;
+			index++;
+		}
+	}
+
+	*r_indices = indices;
+	*r_amount = amount;
+}
+
+static void get_non_zero_weight_indices(
+        Object *ob, Mesh *mesh, const char *weight_group_name,
+        int **r_indices, int *r_amount)
+{
+	int vertex_amount = mesh->totvert;
+	float *weights = MEM_malloc_arrayN(vertex_amount, sizeof(float), __func__);
+	get_all_vertex_weights(ob, mesh, weight_group_name, weights);
+	get_non_zero_indices(weights, vertex_amount, r_indices, r_amount);
+}
+
+static void get_anchor_indices(
+        Object *ob, Mesh *mesh, const char *anchor_group_name,
+        int **r_indices, int *r_amount)
+{
+	get_non_zero_weight_indices(ob, mesh, anchor_group_name, r_indices, r_amount);
+}
+
+static BindData *bind_data_calculate(
+        RigidDeformModifierData *rdmd, Object *ob, Mesh *mesh, VectorArray vertex_cos)
+{
+	if (rdmd->anchor_group_name[0] == '\0') {
+		modifier_setError(&rdmd->modifier, "No vertex group selected.");
+		return NULL;
+	}
+	if (!vertex_group_exists(ob, mesh, rdmd->anchor_group_name)) {
+		modifier_setError(&rdmd->modifier, "Vertex group '%s' does not exist.", rdmd->anchor_group_name);
+		return NULL;
+	}
+
+	BindData *bind_data = MEM_callocN(sizeof(BindData), __func__);
+
+	int vertex_amount = mesh->totvert;
+	bind_data->vertex_amount = vertex_amount;
+	bind_data->initial_positions = MEM_malloc_arrayN(vertex_amount, sizeof(float) * 3 * vertex_amount, __func__);
+	memcpy(bind_data->initial_positions, vertex_cos, sizeof(float) * 3 * vertex_amount);
+
+	get_anchor_indices(
+	        ob, mesh, rdmd->anchor_group_name,
+	        &bind_data->anchor_indices, &bind_data->anchor_amount);
+
+	return bind_data;
+}
+
+static void bind_data_free(BindData *bind_data)
+{
+	MEM_freeN(bind_data->initial_positions);
+	MEM_freeN(bind_data->anchor_indices);
+	MEM_freeN(bind_data);
+}
+
+static void bind_current_mesh_to_modifier(
+        RigidDeformModifierData *rdmd,
+        RigidDeformModifierData *rdmd_orig,
+        Object *ob, Mesh *mesh, VectorArray vertex_cos)
+{
+	if (rdmd->bind_data) {
+		bind_data_free(rdmd->bind_data);
+	}
+
+	rdmd_orig->bind_data = bind_data_calculate(rdmd, ob, mesh, vertex_cos);
+	rdmd->bind_data = rdmd_orig->bind_data;
+}
+
+
+/* ********** Calculate new positions *********** */
+
+
+static void deform_vertices(
+        RigidDeformModifierData *rdmd,
+        Object *ob, Mesh *mesh, VectorArray vertex_cos)
+{
+
+}
+
+static RigidDeformModifierData *get_original_modifier_data(
+        RigidDeformModifierData *rdmd, const ModifierEvalContext *ctx)
+{
+	Object *ob_orig = DEG_get_original_object(ctx->object);
+	return (RigidDeformModifierData *)modifiers_findByName(ob_orig, rdmd->modifier.name);
+}
+
+static void run_modifier(
+        RigidDeformModifierData *md, const ModifierEvalContext *ctx,
+        Mesh *mesh, VectorArray vertex_cos)
+{
+	Object *ob = ctx->object;
+	RigidDeformModifierData *rdmd = (RigidDeformModifierData *)md;
+	RigidDeformModifierData *rdmd_orig = get_original_modifier_data(rdmd, ctx);
+
+	if (rdmd->bind_next_execution) {
+		bind_current_mesh_to_modifier(rdmd, rdmd_orig, ob, mesh, vertex_cos);
+		rdmd->bind_next_execution = false;
+	}
+}
 
 static void deformVerts(
         ModifierData *md, const ModifierEvalContext *ctx,
-        Mesh *mesh, float (*vertexCos)[3],
-        int numVerts)
+        Mesh *mesh, VectorArray vertex_cos, int vertex_amount)
 {
+	Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, vertex_amount, false, false);
+
+	run_modifier((RigidDeformModifierData *)md, ctx, mesh_src, vertex_cos);
+
+	if (mesh_src != mesh) {
+		BKE_id_free(NULL, mesh_src);
+	}
+}
+
+static void deformVertsEM(
+        ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData,
+        Mesh *mesh, VectorArray vertex_cos, int vertex_amount)
+{
+	Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, vertex_amount, false, false);
+
+	run_modifier((RigidDeformModifierData *)md, ctx, mesh_src, vertex_cos);
+
+	if (mesh_src != mesh) {
+		BKE_id_free(NULL, mesh_src);
+	}
 }
 
 static void initData(ModifierData *md)
@@ -56,12 +223,19 @@ static void initData(ModifierData *md)
 	rdmd->bind_next_execution = false;
 }
 
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
+{
+	CustomDataMask dataMask = 0;
+	dataMask |= CD_MASK_MDEFORMVERT;
+	return dataMask;
+}
+
  ModifierTypeInfo modifierType_RigidDeform = {
 	/* name */              "Rigid Deform",
 	/* structName */        "RigidDeformModifierData",
 	/* structSize */        sizeof(RigidDeformModifierData),
 	/* type */              eModifierTypeType_OnlyDeform,
-	/* flags */             eModifierTypeFlag_AcceptsMesh,
+	/* flags */             eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode,
 	/*

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list