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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to