495
496
/* clear parenting relationship completely */
496
497
ob->parent = NULL;
500
500
case CLEAR_PARENT_KEEP_TRANSFORM:
502
502
/* remove parent, and apply the parented transform result as object's local transforms */
503
503
ob->parent = NULL;
504
504
BKE_object_apply_mat4(ob, ob->obmat, TRUE, FALSE);
508
507
case CLEAR_PARENT_INVERSE:
510
509
/* object stays parented, but the parent inverse (i.e. offset from parent to retain binding state) is cleared */
511
510
unit_m4(ob->parentinv);
516
515
DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
586
585
{PAR_PATH_CONST, "PATH_CONST", 0, "Path Constraint", ""},
587
586
{PAR_LATTICE, "LATTICE", 0, "Lattice Deform", ""},
588
587
{PAR_VERTEX, "VERTEX", 0, "Vertex", ""},
589
{PAR_TRIA, "TRIA", 0, "Triangle", ""},
588
{PAR_VERTEX_TRI, "VERTEX_TRI", 0, "Vertex (Triangle)", ""},
590
589
{0, NULL, 0, NULL, NULL}
593
592
int ED_object_parent_set(ReportList *reports, Main *bmain, Scene *scene, Object *ob, Object *par,
594
int partype, int xmirror, int keep_transform)
593
int partype, bool xmirror, bool keep_transform, const int vert_par[3])
596
595
bPoseChannel *pchan = NULL;
597
596
int pararm = ELEM4(partype, PAR_ARMATURE, PAR_ARMATURE_NAME, PAR_ARMATURE_ENVELOPE, PAR_ARMATURE_AUTO);
781
static void parent_set_vert_find(KDTree *tree, Object *child, int vert_par[3], bool is_tri)
783
const float *co_find = child->obmat[3];
785
KDTreeNearest nearest[3];
788
tot = BLI_kdtree_find_nearest_n(tree, co_find, NULL, nearest, 3);
789
BLI_assert(tot == 3);
791
vert_par[0] = nearest[0].index;
792
vert_par[1] = nearest[1].index;
793
vert_par[2] = nearest[2].index;
795
BLI_assert(min_iii(UNPACK3(vert_par)) >= 0);
798
vert_par[0] = BLI_kdtree_find_nearest(tree, co_find, NULL, NULL);
799
BLI_assert(vert_par[0] >= 0);
771
805
static int parent_set_exec(bContext *C, wmOperator *op)
773
807
Main *bmain = CTX_data_main(C);
774
808
Scene *scene = CTX_data_scene(C);
775
809
Object *par = ED_object_active_context(C);
776
810
int partype = RNA_enum_get(op->ptr, "type");
777
int xmirror = RNA_boolean_get(op->ptr, "xmirror");
778
int keep_transform = RNA_boolean_get(op->ptr, "keep_transform");
811
bool xmirror = RNA_boolean_get(op->ptr, "xmirror");
812
bool keep_transform = RNA_boolean_get(op->ptr, "keep_transform");
815
/* vertex parent (kdtree) */
816
const bool is_vert_par = ELEM(partype, PAR_VERTEX, PAR_VERTEX_TRI);
817
const bool is_tri = partype == PAR_VERTEX_TRI;
819
struct KDTree *tree = NULL;
820
int vert_par[3] = {0, 0, 0};
821
int *vert_par_p = is_vert_par ? vert_par : NULL;
825
tree = BKE_object_as_kdtree(par, &tree_tot);
826
BLI_assert(tree != NULL);
828
if (tree_tot < (is_tri ? 3 : 1)) {
829
BKE_report(op->reports, RPT_ERROR, "Not enough vertices for vertex-parent");
836
/* Non vertex-parent */
781
837
CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
783
if (!ED_object_parent_set(op->reports, bmain, scene, ob, par, partype, xmirror, keep_transform)) {
840
parent_set_vert_find(tree, ob, vert_par, is_tri);
843
if (!ED_object_parent_set(op->reports, bmain, scene, ob, par, partype, xmirror, keep_transform, vert_par_p)) {
853
BLI_kdtree_free(tree);
791
857
return OPERATOR_CANCELLED;
837
903
uiItemEnumO_ptr(layout, ot, NULL, 0, "type", PAR_LATTICE);
906
/* vertex parenting */
907
if (OB_TYPE_SUPPORT_PARVERT(ob->type)) {
908
uiItemEnumO_ptr(layout, ot, NULL, 0, "type", PAR_VERTEX);
909
uiItemEnumO_ptr(layout, ot, NULL, 0, "type", PAR_VERTEX_TRI);
840
912
uiPupMenuEnd(C, pup);
842
914
return OPERATOR_CANCELLED;