diff options
Diffstat (limited to 'object_collection_manager/operators.py')
-rw-r--r-- | object_collection_manager/operators.py | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/object_collection_manager/operators.py b/object_collection_manager/operators.py index 7509d3f2..ff1bbf95 100644 --- a/object_collection_manager/operators.py +++ b/object_collection_manager/operators.py @@ -909,6 +909,211 @@ class CMUnDisableRenderAllOperator(Operator): return {'FINISHED'} +class CMHoldoutOperator(Operator): + bl_label = "[HH] Holdout" + bl_description = ( + " * Shift+LMB - Isolate/Restore.\n" + " * Shift+Ctrl+LMB - Isolate nested/Restore.\n" + " * Ctrl+LMB - Toggle nested.\n" + " * Alt+LMB - Discard history" + ) + bl_idname = "view3d.holdout_collection" + bl_options = {'REGISTER', 'UNDO'} + + name: StringProperty() + + # static class var + isolated = False + + def invoke(self, context, event): + global rto_history + cls = CMHoldoutOperator + + modifiers = get_modifiers(event) + view_layer = context.view_layer.name + laycol_ptr = layer_collections[self.name]["ptr"] + + if not view_layer in rto_history["holdout"]: + rto_history["holdout"][view_layer] = {"target": "", "history": []} + + if modifiers == {"alt"}: + del rto_history["holdout"][view_layer] + cls.isolated = False + + elif modifiers == {"shift"}: + isolate_rto(cls, self, view_layer, "holdout") + + elif modifiers == {"ctrl"}: + toggle_children(self, view_layer, "holdout") + + cls.isolated = False + + elif modifiers == {"ctrl", "shift"}: + isolate_rto(cls, self, view_layer, "holdout", children=True) + + else: + # toggle holdout + + # reset holdout history + del rto_history["holdout"][view_layer] + + # toggle holdout of collection in viewport + laycol_ptr.holdout = not laycol_ptr.holdout + + cls.isolated = False + + # reset holdout all history + if view_layer in rto_history["holdout_all"]: + del rto_history["holdout_all"][view_layer] + + return {'FINISHED'} + + +class CMUnHoldoutAllOperator(Operator): + bl_label = "[HH Global] Holdout" + bl_description = ( + " * LMB - Enable all/Restore.\n" + " * Shift+LMB - Invert.\n" + " * Ctrl+LMB - Copy/Paste RTOs.\n" + " * Ctrl+Alt+LMB - Swap RTOs.\n" + " * Alt+LMB - Discard history" + ) + bl_idname = "view3d.un_holdout_all_collections" + bl_options = {'REGISTER', 'UNDO'} + + def invoke(self, context, event): + global rto_history + + view_layer = context.view_layer.name + modifiers = get_modifiers(event) + + if not view_layer in rto_history["holdout_all"]: + rto_history["holdout_all"][view_layer] = [] + + if modifiers == {"alt"}: + # clear all states + del rto_history["holdout_all"][view_layer] + clear_copy("holdout") + clear_swap("holdout") + + elif modifiers == {"ctrl"}: + copy_rtos(view_layer, "holdout") + + elif modifiers == {"ctrl", "alt"}: + swap_rtos(view_layer, "holdout") + + elif modifiers == {"shift"}: + invert_rtos(view_layer, "holdout") + + else: + activate_all_rtos(view_layer, "holdout") + + return {'FINISHED'} + + +class CMIndirectOnlyOperator(Operator): + bl_label = "[IO] Indirect Only" + bl_description = ( + " * Shift+LMB - Isolate/Restore.\n" + " * Shift+Ctrl+LMB - Isolate nested/Restore.\n" + " * Ctrl+LMB - Toggle nested.\n" + " * Alt+LMB - Discard history" + ) + bl_idname = "view3d.indirect_only_collection" + bl_options = {'REGISTER', 'UNDO'} + + name: StringProperty() + + # static class var + isolated = False + + def invoke(self, context, event): + global rto_history + cls = CMIndirectOnlyOperator + + modifiers = get_modifiers(event) + view_layer = context.view_layer.name + laycol_ptr = layer_collections[self.name]["ptr"] + + if not view_layer in rto_history["indirect"]: + rto_history["indirect"][view_layer] = {"target": "", "history": []} + + + if modifiers == {"alt"}: + del rto_history["indirect"][view_layer] + cls.isolated = False + + elif modifiers == {"shift"}: + isolate_rto(cls, self, view_layer, "indirect") + + elif modifiers == {"ctrl"}: + toggle_children(self, view_layer, "indirect") + + cls.isolated = False + + elif modifiers == {"ctrl", "shift"}: + isolate_rto(cls, self, view_layer, "indirect", children=True) + + else: + # toggle indirect only + + # reset indirect history + del rto_history["indirect"][view_layer] + + # toggle indirect only of collection + laycol_ptr.indirect_only = not laycol_ptr.indirect_only + + cls.isolated = False + + # reset indirect all history + if view_layer in rto_history["indirect_all"]: + del rto_history["indirect_all"][view_layer] + + return {'FINISHED'} + + +class CMUnIndirectOnlyAllOperator(Operator): + bl_label = "[IO Global] Indirect Only" + bl_description = ( + " * LMB - Enable all/Restore.\n" + " * Shift+LMB - Invert.\n" + " * Ctrl+LMB - Copy/Paste RTOs.\n" + " * Ctrl+Alt+LMB - Swap RTOs.\n" + " * Alt+LMB - Discard history" + ) + bl_idname = "view3d.un_indirect_only_all_collections" + bl_options = {'REGISTER', 'UNDO'} + + def invoke(self, context, event): + global rto_history + + view_layer = context.view_layer.name + modifiers = get_modifiers(event) + + if not view_layer in rto_history["indirect_all"]: + rto_history["indirect_all"][view_layer] = [] + + if modifiers == {"alt"}: + # clear all states + del rto_history["indirect_all"][view_layer] + clear_copy("indirect") + clear_swap("indirect") + + elif modifiers == {"ctrl"}: + copy_rtos(view_layer, "indirect") + + elif modifiers == {"ctrl", "alt"}: + swap_rtos(view_layer, "indirect") + + elif modifiers == {"shift"}: + invert_rtos(view_layer, "indirect") + + else: + activate_all_rtos(view_layer, "indirect") + + return {'FINISHED'} + + class CMRemoveCollectionOperator(Operator): '''Remove Collection''' bl_label = "Remove Collection" @@ -1112,6 +1317,8 @@ class CMPhantomModeOperator(Operator): "hide": layer_collection.hide_viewport, "disable": layer_collection.collection.hide_viewport, "render": layer_collection.collection.hide_render, + "holdout": layer_collection.holdout, + "indirect": layer_collection.indirect_only, } apply_to_children(view_layer.layer_collection, save_visibility_state) @@ -1132,6 +1339,8 @@ class CMPhantomModeOperator(Operator): layer_collection.hide_viewport = phantom_laycol["hide"] layer_collection.collection.hide_viewport = phantom_laycol["disable"] layer_collection.collection.hide_render = phantom_laycol["render"] + layer_collection.holdout = phantom_laycol["holdout"] + layer_collection.indirect_only = phantom_laycol["indirect"] apply_to_children(view_layer.layer_collection, restore_visibility_state) |