diff --git a/CHANGELOG.md b/CHANGELOG.md index def6b62..e711729 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ Activate / deactivate layer opacity according to prefix Activate / deactivate all masks using MA layers --> +1.8.1 + +- added: `Reset Layer State` (Check layer) in Autobuild +- added: environment variable `GP_RENDER_LAYER_GROUP_PATTERN` for layer merging regex pattern + 1.8.0 - added: Allow to rename output on the fly using `connect selection to output` diff --git a/OP_auto_build.py b/OP_auto_build.py index c2248c6..b5829df 100644 --- a/OP_auto_build.py +++ b/OP_auto_build.py @@ -88,7 +88,7 @@ class GPEXP_OT_render_auto_build(bpy.types.Operator): description='Clean material stack. i.e: Replace "mat.001" in material stack if "mat" exists and has same color') prefix_filter : StringProperty(name='Prefix Filter', default='CO, CU, FX, TO', # , MA # exclude MA if mask are applied - description='Comma separated prefix to render. Set the other prefix and non-prefixed layer to exluded viewlayer') + description='Comma separated prefix to render, Layer with those prefix will be made visible') set_layers_colors : BoolProperty(name='Set Layers Colors', default=True, description='Set colors for on layers according to prefix (hadrcoded color set)') @@ -102,6 +102,9 @@ class GPEXP_OT_render_auto_build(bpy.types.Operator): export_layer_infos : BoolProperty(name='Export Layer Infos', default=True, description='Export layers infos to a Json file') + reset_layers_state : BoolProperty(name='Reset Layer State', default=True, + description='Set layer opacity to 100%, Disable use light on all layer, set regular blend mode, hide invisible') + group_all_adjacent_layer_type : BoolProperty(name='Group All Adjacent Layer Type', default=False, description='Fuse output Viewlayer according to adjacent Prefix in layer stack') @@ -150,6 +153,7 @@ class GPEXP_OT_render_auto_build(bpy.types.Operator): col.prop(self, 'trigger_rename_lowercase') col.prop(self, 'trigger_renumber_by_distance') col.prop(self, 'export_layer_infos') + col.prop(self, 'reset_layers_state') col.label(text='Send prefixed layer to render scene (except excluded)') col.prop(self, 'excluded_prefix', text='Excluded') @@ -246,6 +250,10 @@ class GPEXP_OT_render_auto_build(bpy.types.Operator): print('Export layer infos (skip if json already exists)') bpy.ops.gp.export_infos_for_compo('INVOKE_DEFAULT', skip_check=True) + ## Reset layer states -> 100% opacity (except mask layer 'MA' by default), remove use light, set default blend mode, hide material named "invisible". + if self.reset_layers_state: + bpy.ops.gp.layers_state() + ## Set GP object data to single user (Individual viewlayers) if self.make_gp_single_user: for o in ob_list: diff --git a/README.md b/README.md index 29bb2ee..f02f33e 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ Organise export of gp layers through compositor output `FILE_FORMAT` : Define file_format used for output. If not specified, use `OPEN_EXR_MULTILAYER` (set `OPEN_EXR` for separate sequences) +`GP_RENDER_MERGE_PATTERN` : Regex pattern for GP layer group merge. If not specified, pattern is `^([A-Z]{2})_` to match gp_toolbox two-capital-letter prefix system) + ### Notable operator arguments for automatisation diff --git a/__init__.py b/__init__.py index 783cc63..e608e74 100644 --- a/__init__.py +++ b/__init__.py @@ -2,7 +2,7 @@ bl_info = { "name": "GP Render", "description": "Organise export of gp layers through compositor output", "author": "Samuel Bernou", - "version": (1, 8, 0), + "version": (1, 8, 1), "blender": (3, 0, 0), "location": "View3D", "warning": "", diff --git a/fn.py b/fn.py index 59d43ef..5e952c1 100644 --- a/fn.py +++ b/fn.py @@ -1,13 +1,14 @@ -from typing import Coroutine import bpy import os import re +import json + from mathutils import Vector from pathlib import Path +from itertools import groupby from math import isclose from collections import defaultdict from time import time -import json from . constant import RD_SCENE_NAME @@ -579,8 +580,8 @@ def group_adjacent_layer_prefix_rlayer(ob, excluded_prefix=[], first_name=True): :first_name: Keep the viewlayer of the bottom layer in group, else last ''' - from itertools import groupby - re_prefix = re.compile(r'^([A-Z]{2})_') + pattern = os.environ.get('GP_RENDER_MERGE_PATTERN', r'^([A-Z]{2})_') + re_prefix = re.compile(pattern) if isinstance(excluded_prefix, str): excluded_prefix = [p.strip() for p in excluded_prefix.split(',')]