set default file output to EXR multilayer
1.6.2 - changed: Default fileout format changed from `OPEN_EXR` to `OPEN_EXR_MULTILAYER` (a `FILE_FORMAT` env variable can be set to specify nodes format) - changed: Default compression changed from `ZIP` to `PIZ` - changed: Rename/renumber function consider OPEN_EXR_MULTILAYER to affect `layer_slots` instead of `file_slots`main
parent
9820f273c2
commit
b973668f02
|
@ -14,6 +14,12 @@ Activate / deactivate layer opacity according to prefix
|
||||||
Activate / deactivate all masks using MA layers
|
Activate / deactivate all masks using MA layers
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
1.6.2
|
||||||
|
|
||||||
|
- changed: Default fileout format changed from `OPEN_EXR` to `OPEN_EXR_MULTILAYER` (a `FILE_FORMAT` env variable can be set to specify nodes format)
|
||||||
|
- changed: Default compression changed from `ZIP` to `PIZ`
|
||||||
|
- changed: Rename/renumber function consider OPEN_EXR_MULTILAYER to affect `layer_slots` instead of `file_slots`
|
||||||
|
|
||||||
1.6.1
|
1.6.1
|
||||||
|
|
||||||
- fixed: preview output for Blender 4.0+
|
- fixed: preview output for Blender 4.0+
|
||||||
|
|
|
@ -64,8 +64,6 @@ def check_file_output_numbering(reports=None):
|
||||||
continue
|
continue
|
||||||
file_outs += [n for n in S.node_tree.nodes if n.type == 'OUTPUT_FILE']
|
file_outs += [n for n in S.node_tree.nodes if n.type == 'OUTPUT_FILE']
|
||||||
|
|
||||||
used=False
|
|
||||||
|
|
||||||
if not file_outs:
|
if not file_outs:
|
||||||
reports.append('No file output nodes found')
|
reports.append('No file output nodes found')
|
||||||
return reports
|
return reports
|
||||||
|
@ -74,11 +72,12 @@ def check_file_output_numbering(reports=None):
|
||||||
if not prenum.match(fo.base_path.split('/')[-1]):
|
if not prenum.match(fo.base_path.split('/')[-1]):
|
||||||
reports.append(f'No object numbering : node {fo.name}')
|
reports.append(f'No object numbering : node {fo.name}')
|
||||||
pct = 0
|
pct = 0
|
||||||
for fs in fo.file_slots:
|
slots = fo.layer_slots if fo.format.file_format == 'OPEN_EXR_MULTILAYER' else fo.file_slots
|
||||||
|
for fs in slots:
|
||||||
if not prenum.match(fs.path.split('/')[0]):
|
if not prenum.match(fs.path.split('/')[0]):
|
||||||
pct += 1
|
pct += 1
|
||||||
if pct:
|
if pct:
|
||||||
reports.append(f'{pct}/{len(fo.file_slots)} slots not numbered: node {fo.name}')
|
reports.append(f'{pct}/{len(slots)} slots not numbered: node {fo.name}')
|
||||||
|
|
||||||
return reports
|
return reports
|
||||||
class GPEXP_OT_check_render_scene(bpy.types.Operator):
|
class GPEXP_OT_check_render_scene(bpy.types.Operator):
|
||||||
|
|
|
@ -2,7 +2,7 @@ bl_info = {
|
||||||
"name": "GP Render",
|
"name": "GP Render",
|
||||||
"description": "Organise export of gp layers through compositor output",
|
"description": "Organise export of gp layers through compositor output",
|
||||||
"author": "Samuel Bernou",
|
"author": "Samuel Bernou",
|
||||||
"version": (1, 6, 1),
|
"version": (1, 6, 2),
|
||||||
"blender": (3, 0, 0),
|
"blender": (3, 0, 0),
|
||||||
"location": "View3D",
|
"location": "View3D",
|
||||||
"warning": "",
|
"warning": "",
|
||||||
|
|
42
fn.py
42
fn.py
|
@ -150,12 +150,15 @@ def copy_settings(obj_a, obj_b):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def set_file_output_format(fo):
|
def set_file_output_format(fo):
|
||||||
fo.format.file_format = 'OPEN_EXR'
|
# FIXME for now default fallback to multilayer
|
||||||
|
env_file_format = os.environ.get('FILE_FORMAT')
|
||||||
|
fo.format.file_format = env_file_format if env_file_format else 'OPEN_EXR_MULTILAYER'
|
||||||
|
# fo.format.file_format = 'OPEN_EXR' # 'OPEN_EXR_MULTILAYER'
|
||||||
fo.format.color_mode = 'RGBA'
|
fo.format.color_mode = 'RGBA'
|
||||||
fo.format.color_depth = '16'
|
fo.format.color_depth = '16'
|
||||||
fo.format.exr_codec = 'ZIP'
|
fo.format.exr_codec = 'PIZ' # 'ZIP', 'RLE'
|
||||||
# fo.format.exr_codec = 'RLE'
|
|
||||||
|
|
||||||
|
## PNG format
|
||||||
# fo.format.file_format = 'PNG'
|
# fo.format.file_format = 'PNG'
|
||||||
# fo.format.color_mode = 'RGBA'
|
# fo.format.color_mode = 'RGBA'
|
||||||
# fo.format.color_depth = '8'
|
# fo.format.color_depth = '8'
|
||||||
|
@ -898,21 +901,26 @@ def get_numbered_output(out, slot_name):
|
||||||
|
|
||||||
|
|
||||||
def add_fileslot_number(fs, number):
|
def add_fileslot_number(fs, number):
|
||||||
elems = fs.path.split('/')
|
field_attr = 'name' if hasattr(fs, 'name') else 'path'
|
||||||
|
|
||||||
|
elems = getattr(fs, field_attr).split('/')
|
||||||
for i, e in enumerate(elems):
|
for i, e in enumerate(elems):
|
||||||
if re.match(r'^\d{3}_', e):
|
if re.match(r'^\d{3}_', e):
|
||||||
elems[i] = re.sub(r'^(\d{3})', lambda x: str(number).zfill(3), e)
|
elems[i] = re.sub(r'^(\d{3})', lambda x: str(number).zfill(3), e)
|
||||||
else:
|
else:
|
||||||
elems[i] = f'{str(number).zfill(3)}_{e}'
|
elems[i] = f'{str(number).zfill(3)}_{e}'
|
||||||
new = '/'.join(elems)
|
new = '/'.join(elems)
|
||||||
fs.path = new
|
|
||||||
|
setattr(fs, field_attr, new)
|
||||||
return new
|
return new
|
||||||
|
|
||||||
def renumber(fo, offset=10):
|
def renumber(fo, offset=10):
|
||||||
'''Force renumber all the slots with a 3'''
|
'''Force renumber all the slots with a 3'''
|
||||||
|
|
||||||
if fo.type != 'OUTPUT_FILE': return
|
if fo.type != 'OUTPUT_FILE': return
|
||||||
ct = 10 # start at 10
|
ct = 10 # start at 10
|
||||||
for fs in fo.file_slots:
|
slots = fo.layer_slots if fo.format.file_format == 'OPEN_EXR_MULTILAYER' else fo.file_slots
|
||||||
|
for fs in slots:
|
||||||
add_fileslot_number(fs, ct)
|
add_fileslot_number(fs, ct)
|
||||||
ct += offset
|
ct += offset
|
||||||
|
|
||||||
|
@ -921,7 +929,11 @@ def get_num(string) -> int:
|
||||||
return leading number or None
|
return leading number or None
|
||||||
'''
|
'''
|
||||||
if not isinstance(string, str):
|
if not isinstance(string, str):
|
||||||
string = string.path
|
if hasattr(string, 'path'):
|
||||||
|
string = string.path
|
||||||
|
else:
|
||||||
|
string = string.name
|
||||||
|
|
||||||
num = re.search(r'^(\d{3})_', string)
|
num = re.search(r'^(\d{3})_', string)
|
||||||
if num:
|
if num:
|
||||||
return int(num.group(1))
|
return int(num.group(1))
|
||||||
|
@ -930,13 +942,21 @@ def delete_numbering(fo): # padding=3
|
||||||
'''Delete prefix numbering on all slots on passed file output'''
|
'''Delete prefix numbering on all slots on passed file output'''
|
||||||
|
|
||||||
if fo.type != 'OUTPUT_FILE': return
|
if fo.type != 'OUTPUT_FILE': return
|
||||||
for fs in fo.file_slots:
|
|
||||||
elems = fs.path.split('/')
|
if fo.format.file_format == 'OPEN_EXR_MULTILAYER':
|
||||||
|
slots = fo.layer_slots
|
||||||
|
field_attr = 'name'
|
||||||
|
else:
|
||||||
|
slots = fo.file_slots
|
||||||
|
field_attr = 'path'
|
||||||
|
|
||||||
|
for fs in slots:
|
||||||
|
elems = getattr(fs, field_attr).split('/')
|
||||||
for i, e in enumerate(elems):
|
for i, e in enumerate(elems):
|
||||||
elems[i] = re.sub(r'^\d{3}_', '', e)
|
elems[i] = re.sub(r'^\d{3}_', '', e)
|
||||||
|
|
||||||
new = '/'.join(elems)
|
new = '/'.join(elems)
|
||||||
fs.path = new
|
setattr(fs, field_attr, new)
|
||||||
|
|
||||||
def reverse_fileout_inputs(fo):
|
def reverse_fileout_inputs(fo):
|
||||||
count = len(fo.inputs)
|
count = len(fo.inputs)
|
||||||
|
@ -954,7 +974,7 @@ def renumber_keep_existing(fo, offset=10, invert=True):
|
||||||
if invert:
|
if invert:
|
||||||
reverse_fileout_inputs(fo)
|
reverse_fileout_inputs(fo)
|
||||||
|
|
||||||
fsl = fo.file_slots
|
fsl = fo.layer_slots if fo.format.file_format == 'OPEN_EXR_MULTILAYER' else fo.file_slots
|
||||||
|
|
||||||
last_idx = len(fsl) - 1
|
last_idx = len(fsl) - 1
|
||||||
prev = None
|
prev = None
|
||||||
|
|
Loading…
Reference in New Issue