47 const short actcol_test = std::clamp(index + 1, 1, ob->
totcol);
48 if (ob->
actcol != actcol_test) {
65 switch (obedit->
type) {
100 if (ml_act && (!select_only || (ml_act->
flag &
SELECT))) {
117 mul_m4_v3(obedit->world_to_object().ptr(), r_center);
140 mul_m4_v3(ob->object_to_world().ptr(), r_center);
147 mul_m4_v3(ob->object_to_world().ptr(), r_center);
153 copy_v3_v3(r_center, ob->object_to_world().location());
201 Object *ob = base->object;
202 if (ob->
parent !=
nullptr) {
203 if (!objects_in_transdata.
contains(ob)) {
212 if (ob_parent_recurse !=
nullptr) {
213 while (ob_parent_recurse !=
nullptr) {
214 if (objects_in_transdata.
contains(ob_parent_recurse)) {
217 ob_parent_recurse = ob_parent_recurse->
parent;
220 if (ob_parent_recurse) {
231 Object *ob = base->object;
233 if (objects_in_transdata.
contains(ob)) {
236 else if (ob->
parent !=
nullptr) {
238 if (!objects_in_transdata.
contains(ob)) {
254 Object *ob_parent_recurse,
258 std::unique_ptr<XFormObjectSkipChild> xf = std::make_unique<XFormObjectSkipChild>();
260 copy_m4_m4(xf->obmat_orig, ob->object_to_world().ptr());
263 if (ob_parent_recurse) {
264 copy_m4_m4(xf->parent_recurse_obmat_orig, ob_parent_recurse->object_to_world().ptr());
267 xf->ob_parent_recurse = ob_parent_recurse;
294 float parent_recurse_obmat_inv[4][4];
295 invert_m4_m4(parent_recurse_obmat_inv, ob_parent_recurse_eval->object_to_world().ptr());
298 float parent_obmat_calc[4][4];
309 float parent_recurse_obmat_inv[4][4];
310 invert_m4_m4(parent_recurse_obmat_inv, ob_parent_recurse_eval->object_to_world().ptr());
313 float obmat_calc[4][4];
318 float obmat_parent_relative_orig[4][4];
319 float obmat_parent_relative_calc[4][4];
320 float obmat_parent_relative_inv_orig[4][4];
324 invert_m4_m4(obmat_parent_relative_inv_orig, obmat_parent_relative_orig);
327 mul_m4_m4m4(dmat, obmat_parent_relative_calc, obmat_parent_relative_inv_orig);
352 std::unique_ptr<XFormObjectData>
xod;
451 for (
uint i = 0;
i < objects_len;) {
453 objects[
i] = objects[--objects_len];
462 bool is_translation_only;
464 float test_m4_a[4][4], test_m4_b[4][4];
468 is_translation_only =
equals_m4m4(test_m4_a, test_m4_b);
471 if (is_translation_only) {
472 for (
uint i = 0;
i < objects_len;
i++) {
479 for (
uint i = 0;
i < objects_len;
i++) {
Blender kernel action and pose functionality.
void BKE_pose_channel_transform_location(const bArmature *arm, const bPoseChannel *pose_bone, float r_pose_space_pivot[3])
bPoseChannel * BKE_pose_channel_active_if_bonecoll_visible(Object *ob) ATTR_WARN_UNUSED_RESULT
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
BPoint * BKE_lattice_active_point_get(Lattice *lt)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
General operations, lookup, etc. for blender objects.
void BKE_object_apply_mat4(Object *ob, const float mat[4][4], bool use_compat, bool use_parent)
void BKE_object_to_mat4(const Object *ob, float r_mat[4][4])
void BKE_scene_graph_evaluated_ensure(Depsgraph *depsgraph, Main *bmain)
BLI_INLINE void * BLI_ghashIterator_getKey(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
BLI_INLINE void * BLI_ghashIterator_getValue(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
#define GHASH_ITER(gh_iter_, ghash_)
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
#define LISTBASE_FOREACH(type, var, list)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
bool equals_m4m4(const float mat1[4][4], const float mat2[4][4])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
bool invert_m4(float mat[4][4])
void unit_m4(float m[4][4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
void DEG_id_tag_update(ID *id, unsigned int flags)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
Object is a sort of wrapper for general info.
#define BASE_SELECTED(v3d, base)
Read Guarded memory(de)allocation.
void BM_editselection_center(BMEditSelection *ese, float r_center[3])
bool BM_select_history_active_get(BMesh *bm, BMEditSelection *ese)
BPy_StructRNA * depsgraph
bool contains(const Key &key) const
bool ED_curve_active_center(Curve *cu, float center[3])
bool calc_active_center(Object *ob, bool select_only, float r_center[3])
void xform_skip_child_container_item_ensure_from_array(XFormObjectSkipChild_Container *xcs, const Scene *scene, ViewLayer *view_layer, Object **objects, uint objects_len)
static bool object_parent_in_set(const Set< Object * > &objects_set, Object *ob)
@ XFORM_OB_SKIP_CHILD_PARENT_IS_XFORM
@ XFORM_OB_SKIP_CHILD_PARENT_IS_XFORM_INDIRECT
@ XFORM_OB_SKIP_CHILD_PARENT_APPLY
void object_xform_array_m4(Object **objects, uint objects_len, const float matrix[4][4])
void data_xform_container_destroy(XFormObjectData_Container *xds)
XFormObjectSkipChild_Container * xform_skip_child_container_create()
static void trans_obdata_in_obmode_free_elem(void *xf_p)
void data_xform_container_update_all(XFormObjectData_Container *xds, Main *bmain, Depsgraph *depsgraph)
void data_xform_by_mat4(XFormObjectData &xod, const float4x4 &transform)
void object_xform_skip_child_container_destroy(XFormObjectSkipChild_Container *xcs)
std::unique_ptr< XFormObjectData > data_xform_create(ID *id)
void object_xform_skip_child_container_item_ensure(XFormObjectSkipChild_Container *xcs, Object *ob, Object *ob_parent_recurse, int mode)
bool calc_active_center_for_editmode(Object *obedit, bool select_only, float r_center[3])
bool material_active_index_set(Object *ob, int index)
bool calc_active_center_for_posemode(Object *ob, bool select_only, float r_center[3])
void data_xform_container_item_ensure(XFormObjectData_Container *xds, Object *ob)
void object_xform_skip_child_container_update_all(XFormObjectSkipChild_Container *xcs, Main *bmain, Depsgraph *depsgraph)
XFormObjectData_Container * data_xform_container_create()
MatBase< float, 4, 4 > float4x4
struct EditBone * act_edbone
const c_style_mat & ptr() const
void WM_main_add_notifier(uint type, void *reference)