[Bf-extensions-cvs] [559fbf90] master: Collection Manager: Add Holdout & Indirect Only. Task: T69577

Ryan Inch noreply at git.blender.org
Tue Aug 11 06:20:56 CEST 2020


Commit: 559fbf908ba8721f4c9e72b6dc7c3bfa0863479f
Author: Ryan Inch
Date:   Tue Aug 11 00:19:34 2020 -0400
Branches: master
https://developer.blender.org/rBA559fbf908ba8721f4c9e72b6dc7c3bfa0863479f

Collection Manager: Add Holdout & Indirect Only. Task: T69577

Add support for the Holdout and Indirect Only RTOs.

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

M	object_collection_manager/__init__.py
M	object_collection_manager/internals.py
M	object_collection_manager/operator_utils.py
M	object_collection_manager/operators.py
M	object_collection_manager/ui.py

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

diff --git a/object_collection_manager/__init__.py b/object_collection_manager/__init__.py
index 49bd0de9..d7b312a5 100644
--- a/object_collection_manager/__init__.py
+++ b/object_collection_manager/__init__.py
@@ -22,7 +22,7 @@ bl_info = {
     "name": "Collection Manager",
     "description": "Manage collections and their objects",
     "author": "Ryan Inch",
-    "version": (2, 13, 0),
+    "version": (2, 14, 0),
     "blender": (2, 80, 0),
     "location": "View3D - Object Mode (Shortcut - M)",
     "warning": '',  # used for warning icon and text in addons panel
@@ -77,6 +77,8 @@ class CollectionManagerProperties(PropertyGroup):
     show_hide_viewport: BoolProperty(default=True, name="[VV] Hide in Viewport")
     show_disable_viewport: BoolProperty(default=False, name="[DV] Disable in Viewports")
     show_render: BoolProperty(default=False, name="[RR] Disable in Renders")
+    show_holdout: BoolProperty(default=False, name="[HH] Holdout")
+    show_indirect_only: BoolProperty(default=False, name="[IO] Indirect Only")
 
     align_local_ops: BoolProperty(default=False, name="Align Local Options",
                                   description="Align local options in a column to the right")
@@ -108,6 +110,10 @@ classes = (
     operators.CMUnDisableViewportAllOperator,
     operators.CMDisableRenderOperator,
     operators.CMUnDisableRenderAllOperator,
+    operators.CMHoldoutOperator,
+    operators.CMUnHoldoutAllOperator,
+    operators.CMIndirectOnlyOperator,
+    operators.CMUnIndirectOnlyAllOperator,
     operators.CMNewCollectionOperator,
     operators.CMRemoveCollectionOperator,
     operators.CMRemoveEmptyCollectionsOperator,
diff --git a/object_collection_manager/internals.py b/object_collection_manager/internals.py
index 857e73aa..163e9804 100644
--- a/object_collection_manager/internals.py
+++ b/object_collection_manager/internals.py
@@ -53,12 +53,16 @@ rto_history = {
     "disable": {},
     "disable_all": {},
     "render": {},
-    "render_all": {}
+    "render_all": {},
+    "holdout": {},
+    "holdout_all": {},
+    "indirect": {},
+    "indirect_all": {},
 }
 
 expand_history = {
     "target": "",
-    "history": []
+    "history": [],
     }
 
 phantom_history = {
@@ -70,12 +74,16 @@ phantom_history = {
     "hide_history": {},
     "disable_history": {},
     "render_history": {},
+    "holdout_history": {},
+    "indirect_history": {},
 
     "exclude_all_history": [],
     "select_all_history": [],
     "hide_all_history": [],
     "disable_all_history": [],
-    "render_all_history": []
+    "render_all_history": [],
+    "holdout_all_history": [],
+    "indirect_all_history": [],
                    }
 
 copy_buffer = {
@@ -317,7 +325,9 @@ def update_col_name(self, context):
                 "select",
                 "hide",
                 "disable",
-                "render"
+                "render",
+                "holdout",
+                "indirect",
                 ]
 
             orig_targets = {
@@ -584,6 +594,8 @@ def generate_state():
         "hide": [],
         "disable": [],
         "render": [],
+        "holdout": [],
+        "indirect": [],
         }
 
     for name, laycol in layer_collections.items():
@@ -593,6 +605,8 @@ def generate_state():
         state["hide"].append(laycol["ptr"].hide_viewport)
         state["disable"].append(laycol["ptr"].collection.hide_viewport)
         state["render"].append(laycol["ptr"].collection.hide_render)
+        state["holdout"].append(laycol["ptr"].holdout)
+        state["indirect"].append(laycol["ptr"].indirect_only)
 
     return state
 
diff --git a/object_collection_manager/operator_utils.py b/object_collection_manager/operator_utils.py
index ed7fce09..6f7ee83b 100644
--- a/object_collection_manager/operator_utils.py
+++ b/object_collection_manager/operator_utils.py
@@ -36,12 +36,67 @@ rto_path = {
     "select": "collection.hide_select",
     "hide": "hide_viewport",
     "disable": "collection.hide_viewport",
-    "render": "collection.hide_render"
+    "render": "collection.hide_render",
+    "holdout": "holdout",
+    "indirect": "indirect_only",
+    }
+
+set_off_on = {
+    "exclude": {
+        "off": True,
+        "on": False
+        },
+    "select": {
+        "off": True,
+        "on": False
+        },
+    "hide": {
+        "off": True,
+        "on": False
+        },
+    "disable": {
+        "off": True,
+        "on": False
+        },
+    "render": {
+        "off": True,
+        "on": False
+        },
+    "holdout": {
+        "off": False,
+        "on": True
+        },
+    "indirect": {
+        "off": False,
+        "on": True
+        }
+    }
+
+get_off_on = {
+    False: {
+        "exclude": "on",
+        "select": "on",
+        "hide": "on",
+        "disable": "on",
+        "render": "on",
+        "holdout": "off",
+        "indirect": "off",
+        },
+
+    True: {
+        "exclude": "off",
+        "select": "off",
+        "hide": "off",
+        "disable": "off",
+        "render": "off",
+        "holdout": "on",
+        "indirect": "on",
+        }
     }
 
 
 def get_rto(layer_collection, rto):
-    if rto in ["exclude", "hide"]:
+    if rto in ["exclude", "hide", "holdout", "indirect"]:
         return getattr(layer_collection, rto_path[rto])
 
     else:
@@ -50,7 +105,7 @@ def get_rto(layer_collection, rto):
 
 
 def set_rto(layer_collection, rto, value):
-    if rto in ["exclude", "hide"]:
+    if rto in ["exclude", "hide", "holdout", "indirect"]:
         setattr(layer_collection, rto_path[rto], value)
 
     else:
@@ -76,13 +131,16 @@ def apply_to_children(parent, apply_function):
 
 
 def isolate_rto(cls, self, view_layer, rto, *, children=False):
+    off = set_off_on[rto]["off"]
+    on = set_off_on[rto]["on"]
+
     laycol_ptr = layer_collections[self.name]["ptr"]
     target = rto_history[rto][view_layer]["target"]
     history = rto_history[rto][view_layer]["history"]
 
     # get active collections
     active_layer_collections = [x["ptr"] for x in layer_collections.values()
-                                if not get_rto(x["ptr"], rto)]
+                                if get_rto(x["ptr"], rto) == on]
 
     # check if previous state should be restored
     if cls.isolated and self.name == target:
@@ -100,7 +158,7 @@ def isolate_rto(cls, self, view_layer, rto, *, children=False):
           active_layer_collections[0].name == self.name):
         # activate all collections
         for item in layer_collections.values():
-            set_rto(item["ptr"], rto, False)
+            set_rto(item["ptr"], rto, on)
 
         # reset target and history
         del rto_history[rto][view_layer]
@@ -130,15 +188,15 @@ def isolate_rto(cls, self, view_layer, rto, *, children=False):
         # isolate collection
         for item in layer_collections.values():
             if item["name"] != laycol_ptr.name:
-                set_rto(item["ptr"], rto, True)
+                set_rto(item["ptr"], rto, off)
 
-        set_rto(laycol_ptr, rto, False)
+        set_rto(laycol_ptr, rto, on)
 
-        if rto != "exclude":
+        if rto not in ["exclude", "holdout", "indirect"]:
             # activate all parents
             laycol = layer_collections[self.name]
             while laycol["id"] != 0:
-                set_rto(laycol["ptr"], rto, False)
+                set_rto(laycol["ptr"], rto, on)
                 laycol = laycol["parent"]
 
             if children:
@@ -156,7 +214,7 @@ def isolate_rto(cls, self, view_layer, rto, *, children=False):
 
                 apply_to_children(laycol_ptr, restore_child_states)
 
-            else:
+            elif rto == "exclude":
                 # deactivate all children
                 def deactivate_all_children(layer_collection):
                     set_rto(layer_collection, rto, True)
@@ -183,6 +241,9 @@ def toggle_children(self, view_layer, rto):
 
 
 def activate_all_rtos(view_layer, rto):
+    off = set_off_on[rto]["off"]
+    on = set_off_on[rto]["on"]
+
     history = rto_history[rto+"_all"][view_layer]
 
     # if not activated, activate all
@@ -190,12 +251,12 @@ def activate_all_rtos(view_layer, rto):
         keep_history = False
 
         for item in reversed(list(layer_collections.values())):
-            if get_rto(item["ptr"], rto) == True:
+            if get_rto(item["ptr"], rto) == off:
                 keep_history = True
 
             history.append(get_rto(item["ptr"], rto))
 
-            set_rto(item["ptr"], rto, False)
+            set_rto(item["ptr"], rto, on)
 
         if not keep_history:
             history.clear()
@@ -233,12 +294,22 @@ def copy_rtos(view_layer, rto):
         # copy
         copy_buffer["RTO"] = rto
         for laycol in layer_collections.values():
-            copy_buffer["values"].append(get_rto(laycol["ptr"], rto))
+            copy_buffer["values"].append(get_off_on[
+                                            get_rto(laycol["ptr"], rto)
+                                            ][
+                                            rto
+                                            ]
+                                        )
 
     else:
         # paste
         for x, laycol in enumerate(layer_collections.values()):
-            set_rto(laycol["ptr"], rto, copy_buffer["values"][x])
+            set_rto(laycol["ptr"],
+                    rto,
+                    set_off_on[rto][
+                        copy_buffer["values"][x]
+                        ]
+                    )
 
         # clear rto history
         rto_history[rto].pop(view_layer, None)
@@ -254,18 +325,41 @@ def swap_rtos(view_layer, rto):
         # get A
         swap_buffer["A"]["RTO"] = rto
         for laycol in layer_collections.values():
-            swap_buffer["A"]["values"].append(get_rto(laycol["ptr"], rto))
+            swap_buffer["A"]["values"].append(get_off_on[
+                                                get_rto(laycol["ptr"], rto)
+                                                ][
+                                                rto
+                                                ]
+                                            )
 
     else:
         # get B
         swap_buffer["B"]["RTO"] = rt

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list