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:
authorCampbell Barton <ideasman42@gmail.com>2020-02-01 05:34:27 +0300
committerCampbell Barton <ideasman42@gmail.com>2020-02-01 05:34:27 +0300
commit3ba5461af0c8b1273d3daf87d050c24a690273be (patch)
treef444c816d456e8adcfa9c9736decaa6e0507958f /source/blender/editors/object/object_transform.c
parent253dbdbb39147d4a74ae450964315a4cfd78a837 (diff)
Object: support 'Affect Parents' for snap/clear transform
Resolves T69450
Diffstat (limited to 'source/blender/editors/object/object_transform.c')
-rw-r--r--source/blender/editors/object/object_transform.c42
1 files changed, 35 insertions, 7 deletions
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index 26fd66c7f3e..4f56664ec99 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -44,6 +44,7 @@
#include "BKE_curve.h"
#include "BKE_main.h"
#include "BKE_idcode.h"
+#include "BKE_layer.h"
#include "BKE_mball.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
@@ -296,22 +297,43 @@ static int object_clear_transform_generic_exec(bContext *C,
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ /* May be NULL. */
+ View3D *v3d = CTX_wm_view3d(C);
KeyingSet *ks;
const bool clear_delta = RNA_boolean_get(op->ptr, "clear_delta");
- /* sanity checks */
- if (ELEM(NULL, clear_func, default_ksName)) {
- BKE_report(op->reports,
- RPT_ERROR,
- "Programming error: missing clear transform function or keying set name");
+ BLI_assert(!ELEM(NULL, clear_func, default_ksName));
+
+ Object **objects = NULL;
+ uint objects_len = 0;
+ {
+ BLI_array_declare(objects);
+ FOREACH_SELECTED_EDITABLE_OBJECT_BEGIN (view_layer, v3d, ob) {
+ BLI_array_append(objects, ob);
+ }
+ FOREACH_SELECTED_EDITABLE_OBJECT_END;
+ objects_len = BLI_array_len(objects);
+ }
+
+ if (objects == NULL) {
return OPERATOR_CANCELLED;
}
/* Support transforming the object data. */
+ const bool use_transform_skip_children = (scene->toolsettings->transform_flag &
+ SCE_XFORM_SKIP_CHILDREN);
const bool use_transform_data_origin = (scene->toolsettings->transform_flag &
SCE_XFORM_DATA_ORIGIN);
+ struct XFormObjectSkipChild_Container *xcs = NULL;
struct XFormObjectData_Container *xds = NULL;
+ if (use_transform_skip_children) {
+ BKE_scene_graph_evaluated_ensure(depsgraph, bmain);
+ xcs = ED_object_xform_skip_child_container_create();
+ ED_object_xform_skip_child_container_item_ensure_from_array(
+ xcs, view_layer, objects, objects_len);
+ }
if (use_transform_data_origin) {
BKE_scene_graph_evaluated_ensure(depsgraph, bmain);
xds = ED_object_data_xform_container_create();
@@ -320,7 +342,8 @@ static int object_clear_transform_generic_exec(bContext *C,
/* get KeyingSet to use */
ks = ANIM_get_keyingset_for_autokeying(scene, default_ksName);
- CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) {
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *ob = objects[ob_index];
if (use_transform_data_origin) {
ED_object_data_xform_container_item_ensure(xds, ob);
@@ -334,7 +357,12 @@ static int object_clear_transform_generic_exec(bContext *C,
/* tag for updates */
DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM);
}
- CTX_DATA_END;
+ MEM_freeN(objects);
+
+ if (use_transform_skip_children) {
+ ED_object_xform_skip_child_container_update_all(xcs, bmain, depsgraph);
+ ED_object_xform_skip_child_container_destroy(xcs);
+ }
if (use_transform_data_origin) {
ED_object_data_xform_container_update_all(xds, bmain, depsgraph);