Commit: adf355849f5c68bf504ba435cc54872b2e2ee87a
Author: Dalai Felinto
Date:   Sun Feb 12 20:43:06 2017 +0100
Branches: blender2.8
https://developer.blender.org/rBadf355849f5c68bf504ba435cc54872b2e2ee87a

Layers: Per-Collection edit mode settings

I didn't manage to get the proper object context in the collection
properties editor. That said I got it working for now in a temporary way
since this will change once we get workspaces anyways

(see changes in buttons_context.c and
rna_scene.c::rna_LayerCollection_mode_settings_get)

I still need to handle the merging of the settings. I will find a
provisory solution while we wait for depsgraph.

(also layer_collection_create_mode_settings_object and 
layer_collection_create_mode_settings_edit could probably be elsewhere - under 
draw/engines likely)

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

M       release/scripts/startup/bl_ui/properties_collection.py
M       source/blender/blenkernel/BKE_layer.h
M       source/blender/blenkernel/intern/layer.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/writefile.c
M       source/blender/editors/space_buttons/buttons_context.c
M       source/blender/makesdna/DNA_layer_types.h
M       source/blender/makesrna/RNA_enum_types.h
M       source/blender/makesrna/intern/rna_scene.c

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

diff --git a/release/scripts/startup/bl_ui/properties_collection.py 
b/release/scripts/startup/bl_ui/properties_collection.py
index 88d78f98ef..71da89fa10 100644
--- a/release/scripts/startup/bl_ui/properties_collection.py
+++ b/release/scripts/startup/bl_ui/properties_collection.py
@@ -124,5 +124,41 @@ class COLLECTION_PT_clay_settings(CollectionButtonsPanel, 
Panel):
         template_engine_settings(col, settings, "ssao_attenuation")
 
 
+class COLLECTION_PT_object_mode_settings(CollectionButtonsPanel, Panel):
+    bl_label = "Object Mode Settings"
+
+    @classmethod
+    def poll(cls, context):
+        ob = context.object
+        return ob and (ob.mode == 'OBJECT')
+
+    def draw(self, context):
+        layout = self.layout
+
+        collection = context.layer_collection
+        settings = collection.get_mode_settings('OBJECT')
+
+        col = layout.column()
+        template_engine_settings(col, settings, "foo")
+
+
+class COLLECTION_PT_edit_mode_settings(CollectionButtonsPanel, Panel):
+    bl_label = "Edit Mode Settings"
+
+    @classmethod
+    def poll(cls, context):
+        ob = context.object
+        return ob and (ob.mode == 'EDIT')
+
+    def draw(self, context):
+        layout = self.layout
+
+        collection = context.layer_collection
+        settings = collection.get_mode_settings('EDIT')
+
+        col = layout.column()
+        template_engine_settings(col, settings, "bar")
+
+
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
diff --git a/source/blender/blenkernel/BKE_layer.h 
b/source/blender/blenkernel/BKE_layer.h
index 9bee353bb3..e60dddf776 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -15,7 +15,7 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
- * Contributor(s): Dalai Felinto
+ * Contributor(s): Blender Foundation, Dalai Felinto
  *
  * ***** END GPL LICENSE BLOCK *****
  */
@@ -103,7 +103,7 @@ void BKE_collection_override_datablock_add(struct 
LayerCollection *lc, const cha
 
 /* engine settings */
 typedef void (*CollectionEngineSettingsCB)(struct RenderEngine *engine, struct 
CollectionEngineSettings *ces);
-struct CollectionEngineSettings *BKE_layer_collection_engine_get(struct 
LayerCollection *lc, const char *engine_name);
+struct CollectionEngineSettings *BKE_layer_collection_engine_get(struct 
LayerCollection *lc, const int type, const char *engine_name);
 void BKE_layer_collection_engine_settings_callback_register(struct Main 
*bmain, const char *engine_name, CollectionEngineSettingsCB func);
 void BKE_layer_collection_engine_settings_callback_free(void);
 
diff --git a/source/blender/blenkernel/intern/layer.c 
b/source/blender/blenkernel/intern/layer.c
index ef4816af54..cfbce5e0ff 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -52,6 +52,7 @@ static LayerCollection 
*find_layer_collection_by_scene_collection(LayerCollectio
 static CollectionEngineSettings *collection_engine_settings_create(struct 
CollectionEngineSettingsCB_Type *ces_type);
 static void layer_collection_engine_settings_free(LayerCollection *lc);
 static void layer_collection_create_engine_settings(LayerCollection *lc);
+static void layer_collection_create_mode_settings(LayerCollection *lc);
 static void scene_layer_engine_settings_update(SceneLayer *sl, Object *ob, 
const char *engine_name);
 static void object_bases_Iterator_next(Iterator *iter, const int flag);
 
@@ -557,6 +558,7 @@ static LayerCollection *layer_collection_add(SceneLayer 
*sl, ListBase *lb, Scene
        lc->flag = COLLECTION_VISIBLE + COLLECTION_SELECTABLE + 
COLLECTION_FOLDED;
 
        layer_collection_create_engine_settings(lc);
+       layer_collection_create_mode_settings(lc);
        layer_collection_populate(sl, lc, sc);
        return lc;
 }
@@ -685,7 +687,7 @@ typedef struct CollectionEngineSettingsCB_Type {
 
 static void create_engine_settings_layer_collection(LayerCollection *lc, 
CollectionEngineSettingsCB_Type *ces_type)
 {
-       if (BKE_layer_collection_engine_get(lc, ces_type->name)) {
+       if (BKE_layer_collection_engine_get(lc, COLLECTION_MODE_NONE, 
ces_type->name)) {
                return;
        }
 
@@ -778,6 +780,11 @@ static void 
layer_collection_engine_settings_free(LayerCollection *lc)
        for (CollectionEngineSettings *ces = lc->engine_settings.first; ces; 
ces = ces->next) {
                BKE_layer_collection_engine_settings_free(ces);
        }
+
+       for (CollectionEngineSettings *ces = lc->mode_settings.first; ces; ces 
= ces->next) {
+               BKE_layer_collection_engine_settings_free(ces);
+       }
+
        BLI_freelistN(&lc->engine_settings);
 }
 
@@ -792,14 +799,54 @@ static void 
layer_collection_create_engine_settings(LayerCollection *lc)
        }
 }
 
+static void layer_collection_create_mode_settings_object(LayerCollection *lc)
+{
+       CollectionEngineSettings *ces;
+
+       ces = MEM_callocN(sizeof(CollectionEngineSettings), "Object Mode 
Settings");
+       BLI_addtail(&lc->mode_settings, ces);
+       ces->type = COLLECTION_MODE_OBJECT;
+
+       /* properties */
+       BKE_collection_engine_property_add_int(ces, "foo", 2);
+}
+
+static void layer_collection_create_mode_settings_edit(LayerCollection *lc)
+{
+       CollectionEngineSettings *ces;
+
+       ces = MEM_callocN(sizeof(CollectionEngineSettings), "Edit Mode 
Settings");
+       BLI_addtail(&lc->mode_settings, ces);
+       ces->type = COLLECTION_MODE_EDIT;
+
+       /* properties */
+       BKE_collection_engine_property_add_float(ces, "bar", 0.5);
+}
+
+static void layer_collection_create_mode_settings(LayerCollection *lc)
+{
+       layer_collection_create_mode_settings_object(lc);
+       layer_collection_create_mode_settings_edit(lc);
+}
+
 /**
  * Return layer collection engine settings for specified engine
  */
-CollectionEngineSettings *BKE_layer_collection_engine_get(LayerCollection *lc, 
const char *engine_name)
+CollectionEngineSettings *BKE_layer_collection_engine_get(LayerCollection *lc, 
const int type, const char *engine_name)
 {
-       CollectionEngineSettings *ces;
-       ces = BLI_findstring(&lc->engine_settings, engine_name, 
offsetof(CollectionEngineSettings, name));
-       return ces;
+       if (type == COLLECTION_MODE_NONE) {
+               return BLI_findstring(&lc->engine_settings, engine_name, 
offsetof(CollectionEngineSettings, name));
+       }
+       else {
+               CollectionEngineSettings *ces;
+               for (ces = lc->mode_settings.first; ces; ces = ces->next) {
+                       if (ces->type == type) {
+                               return ces;
+                       }
+               }
+       }
+       BLI_assert(false);
+       return NULL;
 }
 
 /* ---------------------------------------------------------------------- */
@@ -947,7 +994,7 @@ static void layer_collection_engine_settings_update(
        CollectionEngineSettings ces = {NULL};
        collection_engine_settings_copy(&ces, ces_parent);
 
-       CollectionEngineSettings *ces_lc = BKE_layer_collection_engine_get(lc, 
ces.name);
+       CollectionEngineSettings *ces_lc = BKE_layer_collection_engine_get(lc, 
ces.type, ces.name);
        collection_engine_settings_merge(&ces, ces_lc);
 
        if (BLI_findptr(&lc->object_bases, base, offsetof(LinkData, data)) != 
NULL) {
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index da0650d02f..35ab1d2a4c 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5955,6 +5955,8 @@ static void direct_link_layer_collections(FileData *fd, 
ListBase *lb)
 
                direct_link_engine_settings(fd, &lc->engine_settings);
 
+               direct_link_engine_settings(fd, &lc->mode_settings);
+
                direct_link_layer_collections(fd, &lc->layer_collections);
        }
 }
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index 16d73557bb..f781fbcdb1 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2599,6 +2599,8 @@ static void write_layer_collections(WriteData *wd, 
ListBase *lb)
 
                write_collection_engine_settings(wd, &lc->engine_settings);
 
+               write_collection_engine_settings(wd, &lc->mode_settings);
+
                write_layer_collections(wd, &lc->layer_collections);
        }
 }
diff --git a/source/blender/editors/space_buttons/buttons_context.c 
b/source/blender/editors/space_buttons/buttons_context.c
index f53d98a1b5..34213d3d56 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -571,6 +571,14 @@ static int buttons_context_path_collection(const bContext 
*C, ButsContextPath *p
        if (sc) {
                RNA_pointer_create(NULL, &RNA_LayerCollection, sc, 
&path->ptr[path->len]);
                path->len++;
+
+               /* temporary object in context path to get edit mode */
+               Object *ob = CTX_data_active_object(C);
+               if (ob) {
+                       RNA_id_pointer_create(&ob->id, &path->ptr[path->len]);
+                       path->len++;
+               }
+
                return 1;
        }
 
diff --git a/source/blender/makesdna/DNA_layer_types.h 
b/source/blender/makesdna/DNA_layer_types.h
index bd456b526c..5d8bff3ef1 100644
--- a/source/blender/makesdna/DNA_layer_types.h
+++ b/source/blender/makesdna/DNA_layer_types.h
@@ -60,6 +60,7 @@ typedef struct LayerCollection {
        ListBase overrides;
        ListBase layer_collections; /* synced with collection->collections */
        ListBase engine_settings; /* CollectionEngineSettings */
+       ListBase mode_settings; /* CollectionModeSettings */
 } LayerCollection;
 
 typedef struct SceneLayer {
@@ -136,6 +137,8 @@ typedef struct CollectionEngineSettings {
        struct CollectionEngineSettings *next, *prev;
        char name[32]; /* engine name - MAX_NAME */
        ListBase properties; /* CollectionProperty */
+       int type; /* CollectionEngineSettingsType */
+       int pad;
 } CollectionEngineSettings;
 
 /* CollectionEngineProperty->flag */
@@ -143,12 +146,19 @@ enum {
        COLLECTION_PROP_USE = (1 << 0),
 };
 
-/* CollectionEntineProperty.type */
+/* CollectionEngineProperty.type */
 typedef enum CollectionEnginePropertyType {
        COLLECTION_PROP_TYPE_FLOAT = 0,
        COLLECTION_PROP_TYPE_INT = 1,
 } CollectionEnginePropertyType;
 
+/* CollectionEngineSettings->type */
+typedef enum CollectionEngineSettingsType {
+       COLLECTION_MODE_NONE = 0,
+       COLLECTION_MODE_OBJECT = 1,
+       COLLECTION_MODE_EDIT = 2,
+} CollectionModeSettingsType;
+
 /* *************************************************************** 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to