[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