Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/makesrna/intern/makesrna.c6
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c99
2 files changed, 99 insertions, 6 deletions
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 3e948e2d712..83c115aa751 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -2024,7 +2024,7 @@ static void rna_def_function_funcs_header(FILE *f, StructRNA *srna, FunctionDefR
char funcname[2048];
rna_construct_wrapper_function_name(
- funcname, sizeof(funcname), srna->identifier, func->identifier, NULL);
+ funcname, sizeof(funcname), srna->identifier, func->identifier, "func");
rna_generate_static_parameter_prototypes(f, srna, dfunc, funcname, 1);
}
@@ -2452,7 +2452,7 @@ static void rna_def_struct_function_call_impl_cpp(FILE *f, StructRNA *srna, Func
int first = 1;
rna_construct_wrapper_function_name(
- funcname, sizeof(funcname), srna->identifier, func->identifier, NULL);
+ funcname, sizeof(funcname), srna->identifier, func->identifier, "func");
fprintf(f, "%s(", funcname);
@@ -2615,7 +2615,7 @@ static void rna_def_function_wrapper_funcs(FILE *f, StructDefRNA *dsrna, Functio
}
rna_construct_wrapper_function_name(
- funcname, sizeof(funcname), srna->identifier, func->identifier, NULL);
+ funcname, sizeof(funcname), srna->identifier, func->identifier, "func");
rna_generate_static_parameter_prototypes(f, srna, dfunc, funcname, 0);
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 4f304f97cac..d244b1333cd 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -445,6 +445,8 @@ const EnumPropertyItem rna_enum_axis_flag_xyz_items[] = {
# include "BKE_object.h"
# include "BKE_particle.h"
+# include "BLI_sort_utils.h"
+
# include "DEG_depsgraph.h"
# include "DEG_depsgraph_build.h"
# include "DEG_depsgraph_query.h"
@@ -741,12 +743,79 @@ RNA_MOD_OBJECT_SET(SurfaceDeform, target, OB_MESH);
static void rna_HookModifier_object_set(PointerRNA *ptr, PointerRNA value)
{
+ Object *owner = (Object *)ptr->id.data;
HookModifierData *hmd = ptr->data;
Object *ob = (Object *)value.data;
hmd->object = ob;
id_lib_extern((ID *)ob);
- BKE_object_modifier_hook_reset(ob, hmd);
+ BKE_object_modifier_hook_reset(owner, hmd);
+}
+
+static void rna_HookModifier_subtarget_set(PointerRNA *ptr, const char *value)
+{
+ Object *owner = (Object *)ptr->id.data;
+ HookModifierData *hmd = ptr->data;
+
+ BLI_strncpy(hmd->subtarget, value, sizeof(hmd->subtarget));
+ BKE_object_modifier_hook_reset(owner, hmd);
+}
+
+static int rna_HookModifier_vertex_indices_get_length(PointerRNA *ptr,
+ int length[RNA_MAX_ARRAY_DIMENSION])
+{
+ HookModifierData *hmd = ptr->data;
+ int totindex = hmd->indexar ? hmd->totindex : 0;
+ return (length[0] = totindex);
+}
+
+static void rna_HookModifier_vertex_indices_get(PointerRNA *ptr, int *values)
+{
+ HookModifierData *hmd = ptr->data;
+ if (hmd->indexar != NULL) {
+ memcpy(values, hmd->indexar, sizeof(int) * hmd->totindex);
+ }
+}
+
+static void rna_HookModifier_vertex_indices_set(HookModifierData *hmd,
+ ReportList *reports,
+ int indices_len,
+ int *indices)
+{
+ if (indices_len == 0) {
+ MEM_SAFE_FREE(hmd->indexar);
+ hmd->totindex = 0;
+ }
+ else {
+ /* Reject negative indices. */
+ for (int i = 0; i < indices_len; i++) {
+ if (indices[i] < 0) {
+ BKE_reportf(reports, RPT_ERROR, "Negative vertex index in vertex_indices_set");
+ return;
+ }
+ }
+
+ /* Copy and sort the index array. */
+ size_t size = sizeof(int) * indices_len;
+ int *buffer = MEM_mallocN(size, "hook indexar");
+ memcpy(buffer, indices, size);
+
+ qsort(buffer, indices_len, sizeof(int), BLI_sortutil_cmp_int);
+
+ /* Reject duplicate indices. */
+ for (int i = 1; i < indices_len; i++) {
+ if (buffer[i] == buffer[i - 1]) {
+ BKE_reportf(reports, RPT_ERROR, "Duplicate index %d in vertex_indices_set", buffer[i]);
+ MEM_freeN(buffer);
+ return;
+ }
+ }
+
+ /* Success - save the new array. */
+ MEM_SAFE_FREE(hmd->indexar);
+ hmd->indexar = buffer;
+ hmd->totindex = indices_len;
+ }
}
static PointerRNA rna_UVProjector_object_get(PointerRNA *ptr)
@@ -2149,6 +2218,8 @@ static void rna_def_modifier_hook(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+ FunctionRNA *func;
+ PropertyRNA *parm;
srna = RNA_def_struct(brna, "HookModifier", "Modifier");
RNA_def_struct_ui_text(
@@ -2181,9 +2252,10 @@ static void rna_def_modifier_hook(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Falloff Curve", "Custom falloff curve");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop = RNA_def_property(srna, "center", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "center", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "cent");
- RNA_def_property_ui_text(prop, "Hook Center", "");
+ RNA_def_property_ui_text(
+ prop, "Hook Center", "Center of the hook, used for falloff and display");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "matrix_inverse", PROP_FLOAT, PROP_MATRIX);
@@ -2206,6 +2278,7 @@ static void rna_def_modifier_hook(BlenderRNA *brna)
prop,
"Sub-Target",
"Name of Parent Bone for hook (if applicable), also recalculates and clears offset");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_HookModifier_subtarget_set");
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
prop = RNA_def_property(srna, "use_falloff_uniform", PROP_BOOLEAN, PROP_NONE);
@@ -2221,6 +2294,26 @@ static void rna_def_modifier_hook(BlenderRNA *brna)
"Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_HookModifier_name_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop = RNA_def_property(srna, "vertex_indices", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_array(prop, RNA_MAX_ARRAY_LENGTH);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_HookModifier_vertex_indices_get_length");
+ RNA_def_property_int_funcs(prop, "rna_HookModifier_vertex_indices_get", NULL, NULL);
+ RNA_def_property_ui_text(prop,
+ "Vertex Indices",
+ "Indices of vertices bound to the modifier. For bezier curves, "
+ "handles count as additional vertices");
+
+ func = RNA_def_function(srna, "vertex_indices_set", "rna_HookModifier_vertex_indices_set");
+ RNA_def_function_ui_description(
+ func, "Validates and assigns the array of vertex indices bound to the modifier");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm = RNA_def_int_array(
+ func, "indices", 1, NULL, INT_MIN, INT_MAX, "", "Vertex Indices", 0, INT_MAX);
+ RNA_def_property_array(parm, RNA_MAX_ARRAY_LENGTH);
+ RNA_def_parameter_flags(parm, PROP_DYNAMIC, PARM_REQUIRED);
}
static void rna_def_modifier_softbody(BlenderRNA *brna)