return transform
-def add_colorspace_alias(config,
- reference_colorspace,
- colorspace,
- colorspace_alias_names):
+def add_colorspace_aliases(config,
+ reference_colorspace,
+ colorspace,
+ colorspace_alias_names,
+ family='Aliases'):
"""
Object description.
for alias_name in colorspace_alias_names:
if alias_name.lower() == colorspace.name.lower():
- print('Skipping alias creation for %s, alias %s, because lower cased names match' % (
- colorspace.name, alias_name) )
- return
+ print(
+ 'Skipping alias creation for %s, alias %s, because lower cased names match' % (
+ colorspace.name, alias_name))
+ continue
print('Adding alias colorspace space %s, alias to %s' % (
alias_name, colorspace.name))
- compact_family_name = 'Aliases'
+ compact_family_name = family
description = colorspace.description
if colorspace.aces_transform_id:
config.addColorSpace(ocio_colorspace_alias)
+
def colorspace_prefixed_name(colorspace):
prefix = colorspace.family.replace("/", " - ")
return "%s - %s" % (prefix, colorspace.name)
+
def add_look(config,
look,
prefix,
if len(look) == 4:
look_cccid = look[3]
- print('Adding look %s - %s' % (look_name, ", ".join(look)) )
+ print('Adding look %s - %s' % (look_name, ", ".join(look)))
#
# Copy look lut
#
if custom_lut_dir:
if not '$' in look_lut:
- print( "Getting ready to copy look lut : %s" % look_lut )
+ print("Getting ready to copy look lut : %s" % look_lut)
shutil.copy2(look_lut, custom_lut_dir)
look_lut = os.path.split(look_lut)[1]
else:
- print( "Skipping LUT copy because path contains a context variable" )
+ print("Skipping LUT copy because path contains a context variable")
#
# Create OCIO Look
#
# Look 1
- print('Adding look to config' )
+ print('Adding look to config')
lk1 = ocio.Look()
- lk1.setName( look_name )
- lk1.setProcessSpace( look_colorspace )
+ lk1.setName(look_name)
+ lk1.setProcessSpace(look_colorspace)
keys = {'type': 'lutFile',
'path': look_lut,
keys['cccid'] = look_cccid
ocio_transform = generate_OCIO_transform([keys])
- lk1.setTransform( ocio_transform )
+ lk1.setTransform(ocio_transform)
# add to config
- config.addLook( lk1 )
+ config.addLook(lk1)
- print( "Creating aliased colorspace")
+ print("Creating aliased colorspace")
#
# Create OCIO colorspace that references that look
#
look_aliases = ["look_%s" % compact(look_name)]
colorspace = ColorSpace(look_name,
- aliases=look_aliases,
- description="The %s Look colorspace" % look_name,
- family='Look')
+ aliases=look_aliases,
+ description="The %s Look colorspace" % look_name,
+ family='Look')
colorspace.from_reference_transforms = [{'type': 'look',
- 'look': look_name,
- 'src': reference_name,
- 'dst': reference_name,
- 'direction': 'forward'}]
+ 'look': look_name,
+ 'src': reference_name,
+ 'dst': reference_name,
+ 'direction': 'forward'}]
print('Adding colorspace %s, alias to look %s to config data' % (
look_name, look_name))
print("")
+
def integrate_looks_into_views(config,
looks,
reference_name,
type
Return value description.
"""
- look_names = [look[0] for look in looks]
+ look_names = [look[0] for look in looks]
# Option 1 - Add a 'look' to each Display
# - Assumes there is a Display for each ACES Output Transform
for view_name, output_colorspace in view_list.iteritems():
if view_name == "Output Transform":
- print( "Adding new View that incorporates looks" )
+ print("Adding new View that incorporates looks")
# Make a copy of the output colorspace
output_colorspace_copy = copy.deepcopy(output_colorspace)
- #for look_name in look_names:
+ # for look_name in look_names:
for i in range(len(look_names)):
look_name = look_names[i]
# Add the LookTransform to the head of the from_reference transform list
if output_colorspace_copy.from_reference_transforms:
- output_colorspace_copy.from_reference_transforms.insert(i, {'type': 'look',
- 'look': look_name,
- 'src': reference_name,
- 'dst': reference_name,
- 'direction': 'forward'})
+ output_colorspace_copy.from_reference_transforms.insert(
+ i, {'type': 'look',
+ 'look': look_name,
+ 'src': reference_name,
+ 'dst': reference_name,
+ 'direction': 'forward'})
# Add the LookTransform to the end of the to_reference transform list
if output_colorspace_copy.to_reference_transforms:
- inverse_look_name = look_names[len(look_names) -1 -i]
+ inverse_look_name = look_names[
+ len(look_names) - 1 - i]
- output_colorspace_copy.to_reference_transforms.append({'type': 'look',
- 'look': inverse_look_name,
- 'src': reference_name,
- 'dst': reference_name,
- 'direction': 'inverse'})
+ output_colorspace_copy.to_reference_transforms.append(
+ {'type': 'look',
+ 'look': inverse_look_name,
+ 'src': reference_name,
+ 'dst': reference_name,
+ 'direction': 'inverse'})
if not look_name in config_data['looks']:
config_data['looks'].append(look_name)
look_names_string = ", ".join(look_names)
- output_colorspace_copy.name = "%s with %s" % (output_colorspace.name, look_names_string)
- output_colorspace_copy.aliases = ["out_%s" % compact(output_colorspace_copy.name)]
+ output_colorspace_copy.name = "%s with %s" % (
+ output_colorspace.name, look_names_string)
+ output_colorspace_copy.aliases = [
+ "out_%s" % compact(output_colorspace_copy.name)]
- print( "Colorspace that incorporates looks created : %s" % output_colorspace_copy.name )
+ print(
+ "Colorspace that incorporates looks created : %s" % output_colorspace_copy.name)
config_data['colorSpaces'].append(output_colorspace_copy)
if output_colorspace_copy:
- print( "Adding colorspace that incorporates looks into view list" )
+ print(
+ "Adding colorspace that incorporates looks into view list")
# Change the name of the View
- view_list["Output Transform with %s" % look_names_string] = output_colorspace_copy
+ view_list[
+ "Output Transform with %s" % look_names_string] = output_colorspace_copy
config_data['displays'][display] = view_list
- #print( "Display : %s, View List : %s" % (display, ", ".join(view_list)) )
+ # print( "Display : %s, View List : %s" % (display, ", ".join(view_list)) )
+
-def create_config(config_data,
- aliases=False,
- prefix=False,
- multiple_displays=False,
- look_info=[],
- custom_lut_dir=None):
+def create_config(config_data,
+ aliases=False,
+ prefix=False,
+ multiple_displays=False,
+ look_info=[],
+ custom_lut_dir=None):
"""
Object description.
# Add alias
if aliases:
if reference_data.aliases != []:
- #add_colorspace_alias(config, reference_data,
+ # add_colorspace_alias(config, reference_data,
# reference_data, reference_data.aliases)
# defer adding alias colorspaces until end. Helps with some applications
- alias_colorspaces.append([reference_data, reference_data, reference_data.aliases])
-
+ alias_colorspaces.append(
+ [reference_data, reference_data, reference_data.aliases])
print("")
- #print( "color spaces : %s" % [x.name for x in sorted(config_data['colorSpaces'])])
+ # print( "color spaces : %s" % [x.name for x in sorted(config_data['colorSpaces'])])
#
# Add Looks and Look colorspaces
# Add looks and colorspaces
for look in look_info:
- add_look(config,
- look,
- prefix,
- custom_lut_dir,
- reference_data.name,
- config_data)
+ add_look(config,
+ look,
+ prefix,
+ custom_lut_dir,
+ reference_data.name,
+ config_data)
# Integrate looks with displays, views
- integrate_looks_into_views(config,
- look_info,
- reference_data.name,
- config_data,
- multiple_displays)
+ integrate_looks_into_views(config,
+ look_info,
+ reference_data.name,
+ config_data,
+ multiple_displays)
print("")
#
if aliases:
if colorspace.aliases != []:
- #add_colorspace_alias(config, reference_data,
+ # add_colorspace_alias(config, reference_data,
# colorspace, colorspace.aliases)
# defer adding alias colorspaces until end. Helps with some applications
- alias_colorspaces.append([reference_data, colorspace, colorspace.aliases])
+ alias_colorspaces.append(
+ [reference_data, colorspace, colorspace.aliases])
print('')
print("")
+ #
+ # We add roles early so we can create alias colorspaces with the names of the roles
+ # before the rest of the colorspace aliases are added to the config.
+ #
+ print('Setting the roles')
+
+ if prefix:
+ set_config_default_roles(
+ config,
+ color_picking=prefixed_names[
+ config_data['roles']['color_picking']],
+ color_timing=prefixed_names[config_data['roles']['color_timing']],
+ compositing_log=prefixed_names[
+ config_data['roles']['compositing_log']],
+ data=prefixed_names[config_data['roles']['data']],
+ default=prefixed_names[config_data['roles']['default']],
+ matte_paint=prefixed_names[config_data['roles']['matte_paint']],
+ reference=prefixed_names[config_data['roles']['reference']],
+ scene_linear=prefixed_names[config_data['roles']['scene_linear']],
+ texture_paint=prefixed_names[
+ config_data['roles']['texture_paint']])
+
+ # Not allowed for the moment. role names can not overlap with colorspace names.
+ '''
+ # Add the aliased colorspaces for each role
+ for role_name, role_colorspace_name in config_data['roles'].iteritems():
+ role_colorspace_prefixed_name = prefixed_names[role_colorspace_name]
+
+ print( "Finding colorspace : %s" % role_colorspace_prefixed_name )
+ # Find the colorspace pointed to by the role
+ role_colorspaces = [colorspace for colorspace in config_data['colorSpaces'] if colorspace.name == role_colorspace_prefixed_name]
+ role_colorspace = None
+ if len(role_colorspaces) > 0:
+ role_colorspace = role_colorspaces[0]
+ else:
+ if reference_data.name == role_colorspace_prefixed_name:
+ role_colorspace = reference_data
+
+ if role_colorspace:
+ print( "Adding an alias colorspace named %s, pointing to %s" % (
+ role_name, role_colorspace.name))
+
+ add_colorspace_aliases(config, reference_data, role_colorspace, [role_name], 'Roles')
+ '''
+
+ else:
+ set_config_default_roles(
+ config,
+ color_picking=config_data['roles']['color_picking'],
+ color_timing=config_data['roles']['color_timing'],
+ compositing_log=config_data['roles']['compositing_log'],
+ data=config_data['roles']['data'],
+ default=config_data['roles']['default'],
+ matte_paint=config_data['roles']['matte_paint'],
+ reference=config_data['roles']['reference'],
+ scene_linear=config_data['roles']['scene_linear'],
+ texture_paint=config_data['roles']['texture_paint'])
+
+ # Not allowed for the moment. role names can not overlap with colorspace names.
+ '''
+ # Add the aliased colorspaces for each role
+ for role_name, role_colorspace_name in config_data['roles'].iteritems():
+ # Find the colorspace pointed to by the role
+ role_colorspaces = [colorspace for colorspace in config_data['colorSpaces'] if colorspace.name == role_colorspace_name]
+ role_colorspace = None
+ if len(role_colorspaces) > 0:
+ role_colorspace = role_colorspaces[0]
+ else:
+ if reference_data.name == role_colorspace_name:
+ role_colorspace = reference_data
+
+ if role_colorspace:
+ print( "Adding an alias colorspace named %s, pointing to %s" % (
+ role_name, role_colorspace.name))
+
+ add_colorspace_aliases(config, reference_data, role_colorspace, [role_name], 'Roles')
+ '''
+
+ print("")
+
# We add these at the end as some applications use the order of the colorspaces
# definitions in the config to order the colorspaces in their selection lists.
# Other go alphabetically. This should keep the alias colorspaces out of the way
# for the apps that use the order of definition in the config.
print('Adding the alias colorspaces')
for reference, colorspace, aliases in alias_colorspaces:
- add_colorspace_alias(config, reference, colorspace, aliases)
+ add_colorspace_aliases(config, reference, colorspace, aliases)
print("")
print('Adding the diplays and views')
+ # Set the color_picking role to be the first Display's Output Transform View
+ default_display_name = config_data['defaultDisplay']
+ default_display_views = config_data['displays'][default_display_name]
+ default_display_colorspace = default_display_views['Output Transform']
+
+ set_config_default_roles(
+ config,
+ color_picking=default_display_colorspace.name)
+
# Defining the *views* and *displays*.
displays = []
views = []
-
# Defining a *generic* *display* and *view* setup.
if multiple_displays:
# Built list of looks to add to Displays
looks = config_data['looks'] if ('looks' in config_data) else []
looks = ", ".join(looks)
- print( "Creating multiple displays, with looks : %s" % looks)
+ print("Creating multiple displays, with looks : %s" % looks)
+
+ # Note: We don't reorder the Displays to put the 'defaultDisplay' first
+ # because OCIO will order them alphabetically when the config is written to disk.
# Create Displays, Views
for display, view_list in config_data['displays'].iteritems():
# Add View with looks
view_name_with_looks = "%s with %s" % (view_name, looks)
- config.addDisplay(display, view_name_with_looks, colorspace.name, looks)
+ config.addDisplay(display, view_name_with_looks,
+ colorspace.name, looks)
else:
config.addDisplay(display, view_name, colorspace.name)
if not (view_name in views):
views.append(view_name)
displays.append(display)
+ # Defining the set of *views* and *displays* useful in a *GUI* context.
else:
- # Defining the set of *views* and *displays* useful in a *GUI* context.
- #display_name = 'ACES'
- single_display_name = config_data['roles']['scene_linear']
+ single_display_name = 'ACES'
+ # single_display_name = config_data['roles']['scene_linear']
displays.append(single_display_name)
- display_names = sorted(config_data['displays'])
-
# Make sure the default display is first
- default_display = config_data['defaultDisplay']
- display_names.insert(0, display_names.pop(display_names.index(default_display)))
+ display_names = sorted(config_data['displays'])
+ display_names.insert(0, display_names.pop(
+ display_names.index(default_display_name)))
# Built list of looks to add to Displays
looks = config_data['looks'] if ('looks' in config_data) else []
view_list = config_data['displays'][display]
for view_name, colorspace in view_list.iteritems():
if 'Output Transform' in view_name:
- #print( "Adding view for %s" % view_name )
-
- # Maya 2016 doesn't like parentheses in View names
- display_cleaned = replace(display, {')': '', '(': ''})
+ # print( "Adding view for %s" % colorspace.name )
# We use the Display names as the View names in this case
# as there is a single Display that contains all views.
# This works for more applications than not, as of the time of this implementation.
+ # Maya 2016 doesn't like parentheses in View names
+ display_cleaned = replace(display, {')': '', '(': ''})
+
# If View includes looks
if 'with' in view_name:
# Integrate looks into view name
- display_cleaned = "%s with %s" % (display_cleaned, look_names)
+ display_cleaned = "%s with %s" % (
+ display_cleaned, look_names)
viewsWithLooksAtEnd = False
# Storing combo of display, view and colorspace name in a list so we can
# add them to the end of the list
if viewsWithLooksAtEnd:
- displays_views_colorspaces.append([single_display_name, display_cleaned, colorspace.name])
+ displays_views_colorspaces.append(
+ [single_display_name, display_cleaned,
+ colorspace.name])
# Or add as normal
else:
- config.addDisplay(single_display_name, display_cleaned, colorspace.name)
+ config.addDisplay(single_display_name,
+ display_cleaned, colorspace.name)
# Add to views list
if not (display_cleaned in views):
# A normal View
else:
- config.addDisplay(single_display_name, display_cleaned, colorspace.name)
+ config.addDisplay(single_display_name, display_cleaned,
+ colorspace.name)
# Add to views list
if not (display_cleaned in views):
views.append(display_cleaned)
# Add to config any display, view combinations that were saved for later
+ # This list will be empty unless viewsWithLooksAtEnd is set to True above
for display_view_colorspace in displays_views_colorspaces:
single_display_name, display_cleaned, colorspace_name = display_view_colorspace
# Add to config
- config.addDisplay(single_display_name, display_cleaned, colorspace_name)
+ config.addDisplay(single_display_name, display_cleaned,
+ colorspace_name)
# Add to views list
if not (display_cleaned in views):
# single_display_name = 'Utility'
# displays.append(single_display_name)
- raw_display_space_name = config_data['roles']['data']
+ raw_display_space_name = config_data['roles']['data']
log_display_space_name = config_data['roles']['compositing_log']
# Find the newly-prefixed colorspace names
if prefix:
- #print( prefixed_names )
+ # print( prefixed_names )
raw_display_space_name = prefixed_names[raw_display_space_name]
log_display_space_name = prefixed_names[log_display_space_name]
print("")
- print('Setting the roles')
-
- if prefix:
- set_config_default_roles(
- config,
- color_picking=prefixed_names[config_data['roles']['color_picking']],
- color_timing=prefixed_names[config_data['roles']['color_timing']],
- compositing_log=prefixed_names[config_data['roles']['compositing_log']],
- data=prefixed_names[config_data['roles']['data']],
- default=prefixed_names[config_data['roles']['default']],
- matte_paint=prefixed_names[config_data['roles']['matte_paint']],
- reference=prefixed_names[config_data['roles']['reference']],
- scene_linear=prefixed_names[config_data['roles']['scene_linear']],
- texture_paint=prefixed_names[config_data['roles']['texture_paint']])
- else:
- set_config_default_roles(
- config,
- color_picking=config_data['roles']['color_picking'],
- color_timing=config_data['roles']['color_timing'],
- compositing_log=config_data['roles']['compositing_log'],
- data=config_data['roles']['data'],
- default=config_data['roles']['default'],
- matte_paint=config_data['roles']['matte_paint'],
- reference=config_data['roles']['reference'],
- scene_linear=config_data['roles']['scene_linear'],
- texture_paint=config_data['roles']['texture_paint'])
-
- print("")
-
# Make sure we didn't create a bad config
config.sanityCheck()
for original, prefixed in prefixed_names.iteritems():
prefixed_names_inverse[prefixed] = original
- # Reet the reference colorspace name
+ # Reset the reference colorspace name
reference_data.name = prefixed_names_inverse[reference_data.name]
# Reset the rest of the colorspace names
- for colorspace in config_data['colorSpaces']:
- colorspace.name = prefixed_names_inverse[colorspace.name]
+ try:
+ for colorspace in config_data['colorSpaces']:
+ colorspace.name = prefixed_names_inverse[colorspace.name]
+ except:
+ print("Prefixed names")
+ for original, prefixed in prefixed_names.iteritems():
+ print("%s, %s" % (original, prefixed))
+
+ print("\n")
+
+ print("Inverse Lookup of Prefixed names")
+ for prefixed, original in prefixed_names_inverse.iteritems():
+ print("%s, %s" % (prefixed, original))
+ raise
return config
Return value description.
"""
- # Create two entries for ODTs that have full and legal range support
odt_info_C = dict(odt_info)
+
+ # Uncomment if you would like to support the older behavior where ODTs
+ # that have support for full and legal range output generate a LUT for each.
+ '''
+ # Create two entries for ODTs that have full and legal range support
for odt_ctl_name, odt_values in odt_info.iteritems():
if odt_values['transformHasFullLegalSwitch']:
odt_name = odt_values['transformUserName']
odt_info_C['%s - Full' % odt_ctl_name] = odt_values_full
del (odt_info_C[odt_ctl_name])
+ '''
# Generate appropriate LUTs for each ODT
for odt_ctl_name, odt_values in odt_info_C.iteritems():
bake_lut.execute()
-def create_config_dir(config_directory,
+def create_config_dir(config_directory,
bake_secondary_LUTs=False,
custom_lut_dir=None):
"""
if copy_custom_luts:
custom_lut_dir = os.path.join(config_directory, "custom")
- lut_directory = create_config_dir(config_directory,
+ lut_directory = create_config_dir(config_directory,
bake_secondary_LUTs,
custom_lut_dir)
cleanup)
print('Creating config - with prefixes, with aliases')
- config = create_config(config_data,
- prefix=prefix_colorspaces_with_family_names,
- aliases=True,
- multiple_displays=multiple_displays,
- look_info=look_info,
- custom_lut_dir=custom_lut_dir)
+ config = create_config(config_data,
+ prefix=prefix_colorspaces_with_family_names,
+ aliases=True,
+ multiple_displays=multiple_displays,
+ look_info=look_info,
+ custom_lut_dir=custom_lut_dir)
print('\n\n\n')
write_config(config,
import optparse
- usage = '%prog [options]\n'
+ usage = '%prog [options]\n'
usage += '\n'
usage += 'An OCIO config generation script for ACES 1.0\n'
usage += '\n'
usage += '\n'
look_info = []
+
def look_info_callback(option, opt_str, value, parser):
- print( "look_info_callback" )
- print( option, opt_str, value, parser )
+ print("look_info_callback")
+ print(option, opt_str, value, parser)
if opt_str == "--addCustomLookCDL":
look_info.append(value)
elif opt_str == "--addCustomLookLUT":
p.add_option('--dontBakeSecondaryLUTs', action='store_true', default=False)
p.add_option('--keepTempImages', action='store_true', default=False)
- p.add_option('--createMultipleDisplays', action='store_true', default=False)
-
- p.add_option('--addCustomLookLUT', '', type='string', nargs=3,
- action="callback", callback=look_info_callback)
- p.add_option('--addCustomLookCDL', '', type='string', nargs=4,
- action="callback", callback=look_info_callback)
- p.add_option('--addACESLookLUT', '', type='string', nargs=2,
- action="callback", callback=look_info_callback)
- p.add_option('--addACESLookCDL', '', type='string', nargs=3,
- action="callback", callback=look_info_callback)
+ p.add_option('--createMultipleDisplays', action='store_true',
+ default=False)
+
+ p.add_option('--addCustomLookLUT', '', type='string', nargs=3,
+ action="callback", callback=look_info_callback)
+ p.add_option('--addCustomLookCDL', '', type='string', nargs=4,
+ action="callback", callback=look_info_callback)
+ p.add_option('--addACESLookLUT', '', type='string', nargs=2,
+ action="callback", callback=look_info_callback)
+ p.add_option('--addACESLookCDL', '', type='string', nargs=3,
+ action="callback", callback=look_info_callback)
p.add_option('--copyCustomLUTs', action='store_true', default=False)
options, arguments = p.parse_args()
multiple_displays = options.createMultipleDisplays
copy_custom_luts = options.copyCustomLUTs
- print( look_info )
+ print(look_info)
# TODO: Investigate the following statements.
try:
copy_custom_luts,
cleanup_temp_images)
+
if __name__ == '__main__':
main()