[Bf-blender-cvs] [a771249d7d] render-layers: Add new objects and some Base > ObjectBase convertion

Dalai Felinto noreply at git.blender.org
Tue Jan 10 17:57:13 CET 2017


Commit: a771249d7d72530e2e82334f8fa25b888cfb6b31
Author: Dalai Felinto
Date:   Tue Jan 10 17:56:29 2017 +0100
Branches: render-layers
https://developer.blender.org/rBa771249d7d72530e2e82334f8fa25b888cfb6b31

Add new objects and some Base > ObjectBase convertion

New objects are properly added to the correct collection, and are synced
into the correct collections.

===================================================================

M	release/scripts/modules/bpy_extras/object_utils.py
M	source/blender/blenkernel/BKE_context.h
M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/context.c
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/editors/armature/armature_relations.c
M	source/blender/editors/armature/pose_edit.c
M	source/blender/editors/curve/editcurve.c
M	source/blender/editors/curve/editfont.c
M	source/blender/editors/include/ED_armature.h
M	source/blender/editors/include/ED_object.h
M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/object/object_add.c
M	source/blender/editors/object/object_constraint.c
M	source/blender/editors/object/object_edit.c
M	source/blender/editors/object/object_hook.c
M	source/blender/editors/object/object_modifier.c
M	source/blender/editors/object/object_relations.c
M	source/blender/editors/object/object_select.c
M	source/blender/editors/screen/screen_context.c
M	source/blender/editors/space_outliner/outliner_select.c
M	source/blender/editors/transform/transform_conversions.c
M	source/blender/editors/transform/transform_orientations.c
M	source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
M	source/blender/makesdna/DNA_scene_types.h

===================================================================

diff --git a/release/scripts/modules/bpy_extras/object_utils.py b/release/scripts/modules/bpy_extras/object_utils.py
index c48f03c133..72a7890a08 100644
--- a/release/scripts/modules/bpy_extras/object_utils.py
+++ b/release/scripts/modules/bpy_extras/object_utils.py
@@ -103,9 +103,9 @@ def add_object_align_init(context, operator):
     return location * rotation
 
 
-def object_data_add(context, obdata, operator=None, use_active_layer=True, name=None):
+def object_data_add(context, obdata, operator=None, name=None):
     """
-    Add an object using the view context and preference to to initialize the
+    Add an object using the view context and preference to initialize the
     location, rotation and layer.
 
     :arg context: The context to use.
@@ -117,52 +117,24 @@ def object_data_add(context, obdata, operator=None, use_active_layer=True, name=
     :arg name: Optional name
     :type name: string
     :return: the newly created object in the scene.
-    :rtype: :class:`bpy.types.ObjectBase`
+    :rtype: :class:`bpy.types.Object`
     """
     scene = context.scene
+    layer = context.render_layer
+    scene_collection = context.scene_collection
 
-    # ugh, could be made nicer
-    for ob in scene.objects:
-        ob.select = False
+    bpy.ops.object.select_all(action='DESELECT')
 
     if name is None:
         name = "Object" if obdata is None else obdata.name
 
     obj_new = bpy.data.objects.new(name, obdata)
-
-    base = scene.objects.link(obj_new)
-    base.select = True
-
-    v3d = None
-    if context.space_data and context.space_data.type == 'VIEW_3D':
-        v3d = context.space_data
-
-    if v3d and v3d.local_view:
-        base.layers_from_view(context.space_data)
-
-    if operator is not None and any(operator.layers):
-        base.layers = operator.layers
-    else:
-        if use_active_layer:
-            if v3d and v3d.local_view:
-                base.layers[scene.active_layer] = True
-            else:
-                if v3d and not v3d.lock_camera_and_layers:
-                    base.layers = [True if i == v3d.active_layer
-                                   else False for i in range(len(v3d.layers))]
-                else:
-                    base.layers = [True if i == scene.active_layer
-                                   else False for i in range(len(scene.layers))]
-        else:
-            if v3d:
-                base.layers_from_view(context.space_data)
-
-        if operator is not None:
-            operator.layers = base.layers
+    scene_collection.objects.link(obj_new)
+    obj_new.select = True
 
     obj_new.matrix_world = add_object_align_init(context, operator)
 
-    obj_act = scene.objects.active
+    obj_act = layer.objects.active
 
     # XXX
     # caused because entering edit-mode does not add a empty undo slot!
@@ -174,8 +146,8 @@ def object_data_add(context, obdata, operator=None, use_active_layer=True, name=
             _obdata = bpy.data.meshes.new(name)
             obj_act = bpy.data.objects.new(_obdata.name, _obdata)
             obj_act.matrix_world = obj_new.matrix_world
-            scene.objects.link(obj_act)
-            scene.objects.active = obj_act
+            scene_collection.objects.link(obj_act)
+            layer.objects.active = obj_act
             bpy.ops.object.mode_set(mode='EDIT')
             # need empty undo step
             bpy.ops.ed.undo_push(message="Enter Editmode")
@@ -200,16 +172,14 @@ def object_data_add(context, obdata, operator=None, use_active_layer=True, name=
         bpy.ops.object.join()  # join into the active.
         if obdata:
             bpy.data.meshes.remove(obdata)
-        # base is freed, set to active object
-        base = scene.object_bases.active
 
         bpy.ops.object.mode_set(mode='EDIT')
     else:
-        scene.objects.active = obj_new
+        layer.objects.active = obj_new
         if context.user_preferences.edit.use_enter_edit_mode:
             bpy.ops.object.mode_set(mode='EDIT')
 
-    return base
+    return obj_new
 
 
 class AddObjectHelper:
@@ -230,12 +200,6 @@ class AddObjectHelper:
             name="Rotation",
             subtype='EULER',
             )
-    layers = BoolVectorProperty(
-            name="Layers",
-            size=20,
-            subtype='LAYER',
-            options={'HIDDEN', 'SKIP_SAVE'},
-            )
 
     @classmethod
     def poll(self, context):
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 60e9cf1e91..70f9fa3dfc 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -43,6 +43,7 @@ struct CacheFile;
 struct ListBase;
 struct Main;
 struct Object;
+struct ObjectBase;
 struct PointerRNA;
 struct ReportList;
 struct Scene;
@@ -269,7 +270,7 @@ int CTX_data_selectable_objects(const bContext *C, ListBase *list);
 int CTX_data_selectable_bases(const bContext *C, ListBase *list);
 
 struct Object *CTX_data_active_object(const bContext *C);
-struct Base *CTX_data_active_base(const bContext *C);
+struct ObjectBase *CTX_data_active_base(const bContext *C);
 struct Object *CTX_data_edit_object(const bContext *C);
 
 struct Image *CTX_data_edit_image(const bContext *C);
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 8122fffaa7..1d62c31188 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -37,6 +37,7 @@ extern "C" {
 #define TODO_LAYER_SYNC_FILTER /* syncing of filter_objects across all trees */
 #define TODO_LAYER_OVERRIDE /* CollectionOverride */
 #define TODO_LAYER_CONTEXT /* get/set current (context) SceneLayer */
+#define TODO_LAYER_BASE /* Base to ObjectBase related TODO */
 #define TODO_LAYER /* generic todo */
 
 struct LayerCollection;
@@ -59,6 +60,8 @@ void BKE_scene_layer_engine_set(struct SceneLayer *sl, const char *engine);
 void BKE_scene_layer_selected_objects_tag(struct SceneLayer *sl, const int tag);
 
 struct ObjectBase *BKE_scene_layer_base_find(struct SceneLayer *sl, struct Object *ob);
+void BKE_scene_layer_base_deselect_all(struct SceneLayer *sl);
+void BKE_scene_layer_base_select(struct SceneLayer *sl, struct ObjectBase *selbase);
 
 void BKE_layer_collection_free(struct SceneLayer *sl, struct LayerCollection *lc);
 
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index cf07a178fe..61413e0536 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -41,6 +41,7 @@ struct Scene;
 struct Object;
 struct BoundBox;
 struct View3D;
+struct SceneLayer;
 struct SoftBody;
 struct BulletSoftBody;
 struct MovieClip;
@@ -89,9 +90,9 @@ struct Object *BKE_object_add_only_object(
         int type, const char *name)
         ATTR_NONNULL(1) ATTR_RETURNS_NONNULL;
 struct Object *BKE_object_add(
-        struct Main *bmain, struct Scene *scene,
+        struct Main *bmain, struct Scene *scene, struct SceneLayer *sl,
         int type, const char *name)
-        ATTR_NONNULL(1, 2) ATTR_RETURNS_NONNULL;
+        ATTR_NONNULL(1, 2, 3) ATTR_RETURNS_NONNULL;
 void *BKE_object_obdata_add_from_type(
         struct Main *bmain,
         int type, const char *name)
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 577ad58dbb..9beeeac628 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -1082,7 +1082,7 @@ struct Object *CTX_data_active_object(const bContext *C)
 	return ctx_data_pointer_get(C, "active_object");
 }
 
-struct Base *CTX_data_active_base(const bContext *C)
+struct ObjectBase *CTX_data_active_base(const bContext *C)
 {
 	return ctx_data_pointer_get(C, "active_base");
 }
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 326a239064..9d8f9997de 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -141,6 +141,21 @@ ObjectBase *BKE_scene_layer_base_find(SceneLayer *sl, Object *ob)
 	return BLI_findptr(&sl->object_bases, ob, offsetof(ObjectBase, object));
 }
 
+void BKE_scene_layer_base_deselect_all(SceneLayer *sl)
+{
+	ObjectBase *base;
+
+	for (base = sl->object_bases.first; base; base = base->next) {
+		base->flag &= ~BASE_SELECTED;
+	}
+}
+
+void BKE_scene_layer_base_select(struct SceneLayer *sl, ObjectBase *selbase)
+{
+	selbase->flag |= BASE_SELECTED;
+	sl->basact = selbase;
+}
+
 static void scene_layer_object_base_unref(SceneLayer* sl, ObjectBase *base)
 {
 	base->refcount--;
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index c6666ec5ce..722e1b455e 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -91,6 +91,7 @@
 #include "BKE_icons.h"
 #include "BKE_key.h"
 #include "BKE_lamp.h"
+#include "BKE_layer.h"
 #include "BKE_lattice.h"
 #include "BKE_library.h"
 #include "BKE_library_query.h"
@@ -673,23 +674,25 @@ Object *BKE_object_add_only_object(Main *bmain, int type, const char *name)
 /* general add: to scene, with layer from area and default name */
 /* creates minimum required data, but without vertices etc. */
 Object *BKE_object_add(
-        Main *bmain, Scene *scene,
+        Main *bmain, Scene *scene, SceneLayer *sl,
         int type, const char *name)
 {
 	Object *ob;
-	Base *base;
+	ObjectBase *base;
+	LayerCollection *lc;
 
 	ob = BKE_object_add_only_object(bmain, type, name);
 
 	ob->data = BKE_object_obdata_add_from_type(bmain, type, name);
 
-	ob->lay = scene->lay;
-	
-	base = BKE_scene_base_add(scene, ob);
-	BKE_scene_base_deselect_all(scene);
-	BKE_scene_base_select(scene, base);
-	DAG_id_tag_update_ex(bmain, &ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
+	lc = BKE_layer_collection_active(sl);
+	BKE_collection_object_add(scene, lc->scene_collection, ob);
 
+	base = BKE_scene_layer_base_find(sl, ob);
+	BKE_scene_layer_base_deselect_all(sl);
+	BKE_scene_layer_base_select(sl, base);
+
+	DAG_id_tag_update_ex(bmain, &ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
 	return ob;
 }
 
diff --git a/source/blender/editors/armature/armature_re

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list