From 633b8d30db97f13e8a67d7a095a0fd3a9b4a4825 Mon Sep 17 00:00:00 2001 From: Johnny Matthews Date: Fri, 21 Mar 2025 23:43:48 +0100 Subject: [PATCH] Fix #135071: Vertex Parenting: Provide Index Access Options When using vertex parenting, an option for using the parent object final evaluated indices is exposed in the Object Properties: Relations panel. This allows the calculation of the parent vertex position to ignore the the CD_ORIGINDEX layer and instead use the final indices that may have been altered by the node tree evaluation. The indices that will be used for the vertex parenting are also exposed to the UI in the same panel, allowing them to be altered after the vertex parent has been created. --- scripts/startup/bl_ui/properties_object.py | 6 ++++++ source/blender/blenkernel/intern/object.cc | 16 +++++++++------- source/blender/makesdna/DNA_object_types.h | 2 ++ source/blender/makesrna/intern/rna_object.cc | 8 ++++++++ 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/scripts/startup/bl_ui/properties_object.py b/scripts/startup/bl_ui/properties_object.py index f1d02ae63bb..acc0e1f0ab9 100644 --- a/scripts/startup/bl_ui/properties_object.py +++ b/scripts/startup/bl_ui/properties_object.py @@ -126,6 +126,12 @@ class OBJECT_PT_relations(ObjectButtonsPanel, Panel): parent = ob.parent if parent and ob.parent_type == 'BONE' and parent.type == 'ARMATURE': sub.prop_search(ob, "parent_bone", parent.data, "bones") + elif ob.parent_type == 'VERTEX': + col.prop(ob, "parent_vertices", text="Parent Vertex", index=0) + sub.prop(ob, "use_parent_final_indices") + elif ob.parent_type == 'VERTEX_3': + col.prop(ob, "parent_vertices", text="Parent Vertices") + sub.prop(ob, "use_parent_final_indices") sub.active = (parent is not None) sub.prop(ob, "use_camera_lock_parent") diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc index 806df03b980..21a7aa9e799 100644 --- a/source/blender/blenkernel/intern/object.cc +++ b/source/blender/blenkernel/intern/object.cc @@ -3040,7 +3040,7 @@ static void ob_parbone(const Object *ob, const Object *par, float r_mat[4][4]) } } -static void give_parvert(const Object *par, int nr, float vec[3]) +static void give_parvert(const Object *par, int nr, float vec[3], const bool use_evaluated_indices) { zero_v3(vec); @@ -3082,7 +3082,8 @@ static void give_parvert(const Object *par, int nr, float vec[3]) count++; } } - else if (CustomData_has_layer(&mesh_eval->vert_data, CD_ORIGINDEX)) { + else if (use_evaluated_indices && CustomData_has_layer(&mesh_eval->vert_data, CD_ORIGINDEX)) + { const int *index = (const int *)CustomData_get_layer(&mesh_eval->vert_data, CD_ORIGINDEX); /* Get the average of all verts with (original index == nr). */ for (int i = 0; i < numVerts; i++) { @@ -3166,10 +3167,11 @@ static void ob_parvert3(const Object *ob, const Object *par, float r_mat[4][4]) /* in local ob space */ if (OB_TYPE_SUPPORT_PARVERT(par->type)) { float cmat[3][3], v1[3], v2[3], v3[3], q[4]; + const bool use_evaluated_indices = !(ob->transflag & OB_PARENT_USE_FINAL_INDICES); - give_parvert(par, ob->par1, v1); - give_parvert(par, ob->par2, v2); - give_parvert(par, ob->par3, v3); + give_parvert(par, ob->par1, v1, use_evaluated_indices); + give_parvert(par, ob->par2, v2, use_evaluated_indices); + give_parvert(par, ob->par3, v3, use_evaluated_indices); tri_to_quat(q, v1, v2, v3); quat_to_mat3(cmat, q); @@ -3186,7 +3188,7 @@ void BKE_object_get_parent_matrix(const Object *ob, Object *par, float r_parentm { float tmat[4][4]; float vec[3]; - + const bool use_evaluated_indices = !(ob->transflag & OB_PARENT_USE_FINAL_INDICES); switch (ob->partype & PARTYPE) { case PAROBJECT: { bool ok = false; @@ -3212,7 +3214,7 @@ void BKE_object_get_parent_matrix(const Object *ob, Object *par, float r_parentm case PARVERT1: unit_m4(r_parentmat); - give_parvert(par, ob->par1, vec); + give_parvert(par, ob->par1, vec, use_evaluated_indices); mul_v3_m4v3(r_parentmat[3], par->object_to_world().ptr(), vec); break; case PARVERT3: diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index ef9f36ba46d..e709ec76e4f 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -572,6 +572,8 @@ enum { OB_TRANSFLAG_UNUSED_12 = 1 << 12, /* cleared */ /* runtime constraints disable */ OB_NO_CONSTRAINTS = 1 << 13, + /* when calculating vertex parent position, ignore CD_ORIGINDEX layer */ + OB_PARENT_USE_FINAL_INDICES = 1 << 14, OB_DUPLI = OB_DUPLIVERTS | OB_DUPLICOLLECTION | OB_DUPLIFACES | OB_DUPLIPARTS, }; diff --git a/source/blender/makesrna/intern/rna_object.cc b/source/blender/makesrna/intern/rna_object.cc index 5499084ee2d..e54296c35d4 100644 --- a/source/blender/makesrna/intern/rna_object.cc +++ b/source/blender/makesrna/intern/rna_object.cc @@ -2955,6 +2955,14 @@ static void rna_def_object(BlenderRNA *brna) prop, "Parent Bone", "Name of parent bone in case of a bone parenting relation"); RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_dependency_update"); + prop = RNA_def_property(srna, "use_parent_final_indices", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "transflag", OB_PARENT_USE_FINAL_INDICES); + RNA_def_property_ui_text( + prop, + "Use Final Indices", + "Use the final evaluated indices rather than the original mesh indices"); + RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Object_internal_update"); + prop = RNA_def_property(srna, "use_camera_lock_parent", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( prop, nullptr, "transflag", OB_TRANSFORM_ADJUST_ROOT_PARENT_FOR_VIEW_LOCK);