- # -------------------------------------------------------------------------
- # *ACES RRT* with supplied *ODT*.
- # -------------------------------------------------------------------------
- def create_ACES_RRT_plus_ODT(odt_name,
- odt_values,
- shaper_info,
- lut_resolution_1d=1024,
- lut_resolution_3d=64,
- cleanup=True,
- aliases=[]):
- cs = ColorSpace('%s' % odt_name)
- cs.description = '%s - %s Output Transform' % (
- odt_values['transformUserNamePrefix'], odt_name)
- cs.aliases = aliases
- cs.equality_group = ''
- cs.family = 'Output'
- cs.is_data = False
-
- pprint.pprint(odt_values)
-
- # Generating the *shaper* transform.
- (shaper_name,
- shaper_to_ACES_CTL,
- shaper_from_ACES_CTL,
- shaper_input_scale,
- shaper_params) = shaper_info
-
- if 'legalRange' in odt_values:
- shaper_params['legalRange'] = odt_values['legalRange']
- else:
- shaper_params['legalRange'] = 0
-
- shaper_lut = '%s_to_aces.spi1d' % shaper_name
- if not os.path.exists(os.path.join(lut_directory, shaper_lut)):
- ctls = [shaper_to_ACES_CTL % aces_CTL_directory]
-
- shaper_lut = sanitize_path(shaper_lut)
-
- generate_1d_LUT_from_CTL(
- os.path.join(lut_directory, shaper_lut),
- ctls,
- lut_resolution_1d,
- 'float',
- 1.0 / shaper_input_scale,
- 1.0,
- shaper_params,
- cleanup,
- aces_CTL_directory)
-
- shaper_OCIO_transform = {
- 'type': 'lutFile',
- 'path': shaper_lut,
- 'interpolation': 'linear',
- 'direction': 'inverse'}
-
- # Generating the *forward* transform.
- cs.from_reference_transforms = []
-
- if 'transformLUT' in odt_values:
- transform_LUT_file_name = os.path.basename(
- odt_values['transformLUT'])
- lut = os.path.join(lut_directory, transform_LUT_file_name)
- shutil.copy(odt_values['transformLUT'], lut)
-
- cs.from_reference_transforms.append(shaper_OCIO_transform)
- cs.from_reference_transforms.append({
- 'type': 'lutFile',
- 'path': transform_LUT_file_name,
- 'interpolation': 'tetrahedral',
- 'direction': 'forward'})
- elif 'transformCTL' in odt_values:
- ctls = [
- shaper_to_ACES_CTL % aces_CTL_directory,
- os.path.join(aces_CTL_directory,
- 'rrt',
- 'RRT.a1.0.0.ctl'),
- os.path.join(aces_CTL_directory,
- 'odt',
- odt_values['transformCTL'])]
- lut = '%s.RRT.a1.0.0.%s.spi3d' % (shaper_name, odt_name)
-
- lut = sanitize_path(lut)
-
- generate_3d_LUT_from_CTL(
- os.path.join(lut_directory, lut),
- # shaperLUT,
- ctls,
- lut_resolution_3d,
- 'float',
- 1.0 / shaper_input_scale,
- 1.0,
- shaper_params,
- cleanup,
- aces_CTL_directory)
-
- cs.from_reference_transforms.append(shaper_OCIO_transform)
- cs.from_reference_transforms.append({
- 'type': 'lutFile',
- 'path': lut,
- 'interpolation': 'tetrahedral',
- 'direction': 'forward'})
-
- # Generating the *inverse* transform.
- cs.to_reference_transforms = []
-
- if 'transformLUTInverse' in odt_values:
- transform_LUT_inverse_file_name = os.path.basename(
- odt_values['transformLUTInverse'])
- lut = os.path.join(lut_directory, transform_LUT_inverse_file_name)
- shutil.copy(odt_values['transformLUTInverse'], lut)
-
- cs.to_reference_transforms.append({
- 'type': 'lutFile',
- 'path': transform_LUT_inverse_file_name,
- 'interpolation': 'tetrahedral',
- 'direction': 'forward'})
-
- shaper_inverse = shaper_OCIO_transform.copy()
- shaper_inverse['direction'] = 'forward'
- cs.to_reference_transforms.append(shaper_inverse)
- elif 'transformCTLInverse' in odt_values:
- ctls = [os.path.join(aces_CTL_directory,
- 'odt',
- odt_values['transformCTLInverse']),
- os.path.join(aces_CTL_directory,
- 'rrt',
- 'InvRRT.a1.0.0.ctl'),
- shaper_from_ACES_CTL % aces_CTL_directory]
- lut = 'InvRRT.a1.0.0.%s.%s.spi3d' % (odt_name, shaper_name)
-
- lut = sanitize_path(lut)
-
- generate_3d_LUT_from_CTL(
- os.path.join(lut_directory, lut),
- # None,
- ctls,
- lut_resolution_3d,
- 'half',
- 1.0,
- shaper_input_scale,
- shaper_params,
- cleanup,
- aces_CTL_directory)
-
- cs.to_reference_transforms.append({
- 'type': 'lutFile',
- 'path': lut,
- 'interpolation': 'tetrahedral',
- 'direction': 'forward'})
-
- shaper_inverse = shaper_OCIO_transform.copy()
- shaper_inverse['direction'] = 'forward'
- cs.to_reference_transforms.append(shaper_inverse)
-
- return cs
-
- # -------------------------------------------------------------------------
- # *RRT / ODT* Shaper Options
- # -------------------------------------------------------------------------
- shaper_data = {}
-
- # Defining the *Log 2* shaper.
- log2_shaper_name = shaper_name
- log2_shaper_name_aliases = ["crv_%s" % compact(shaper_name)]
- log2_params = {
- 'middleGrey': 0.18,
- 'minExposure': -6.0,
- 'maxExposure': 6.5}
-
- log2_shaper = create_generic_log(
- name=log2_shaper_name,
- middle_grey=log2_params['middleGrey'],
- min_exposure=log2_params['minExposure'],
- max_exposure=log2_params['maxExposure'],
- aliases=log2_shaper_name_aliases)
- config_data['colorSpaces'].append(log2_shaper)
-
- shaper_input_scale_generic_log2 = 1.0
-
- # *Log 2* shaper name and *CTL* transforms bundled up.
- log2_shaper_data = [
- log2_shaper_name,
- os.path.join('%s',
- 'utilities',
- 'ACESlib.OCIO_shaper_log2_to_lin_param.a1.0.0.ctl'),
- os.path.join('%s',
- 'utilities',
- 'ACESlib.OCIO_shaper_lin_to_log2_param.a1.0.0.ctl'),
- shaper_input_scale_generic_log2,
- log2_params]
-
- shaper_data[log2_shaper_name] = log2_shaper_data
-
- # Shaper that also includes the AP1 primaries.
- # Needed for some LUT baking steps.
- log2_shaper_api1_name_aliases = ["%s_ap1" % compact(shaper_name)]
- log2_shaper_AP1 = create_generic_log(
- name=log2_shaper_name,
- middle_grey=log2_params['middleGrey'],
- min_exposure=log2_params['minExposure'],
- max_exposure=log2_params['maxExposure'],
- aliases=log2_shaper_api1_name_aliases)
- log2_shaper_AP1.name = '%s - AP1' % log2_shaper_AP1.name
-
- # *AP1* primaries to *AP0* primaries.
- log2_shaper_AP1.to_reference_transforms.append({
- 'type': 'matrix',
- 'matrix': mat44_from_mat33(ACES_AP1_to_AP0),
- 'direction': 'forward'
- })
- config_data['colorSpaces'].append(log2_shaper_AP1)
-
- rrt_shaper = log2_shaper_data
-
- # *RRT + ODT* combinations.
- sorted_odts = sorted(odt_info.iteritems(), key=lambda x: x[1])
- print(sorted_odts)
- for odt in sorted_odts:
- (odt_name, odt_values) = odt
-
- # Handling *ODTs* that can generate either *legal* or *full* output.
- if odt_name in ['Academy.Rec2020_100nits_dim.a1.0.0',
- 'Academy.Rec709_100nits_dim.a1.0.0',
- 'Academy.Rec709_D60sim_100nits_dim.a1.0.0']:
- odt_name_legal = '%s - Legal' % odt_values['transformUserName']
- else:
- odt_name_legal = odt_values['transformUserName']
-
- odt_legal = odt_values.copy()
- odt_legal['legalRange'] = 1
-
- odt_aliases = ["out_%s" % compact(odt_name_legal)]
-
- cs = create_ACES_RRT_plus_ODT(
- odt_name_legal,
- odt_legal,
- rrt_shaper,
- lut_resolution_1d,
- lut_resolution_3d,
- cleanup,
- odt_aliases)
- config_data['colorSpaces'].append(cs)
-
- config_data['displays'][odt_name_legal] = {
- 'Linear': ACES,
- 'Log': ACEScc,
- 'Output Transform': cs}
-
- if odt_name in ['Academy.Rec2020_100nits_dim.a1.0.0',
- 'Academy.Rec709_100nits_dim.a1.0.0',
- 'Academy.Rec709_D60sim_100nits_dim.a1.0.0']:
- print('Generating full range ODT for %s' % odt_name)
-
- odt_name_full = '%s - Full' % odt_values['transformUserName']
- odt_full = odt_values.copy()
- odt_full['legalRange'] = 0
-
- odt_full_aliases = ["out_%s" % compact(odt_name_full)]
-
- cs_full = create_ACES_RRT_plus_ODT(
- odt_name_full,
- odt_full,
- rrt_shaper,
- lut_resolution_1d,
- lut_resolution_3d,
- cleanup,
- odt_full_aliases)
- config_data['colorSpaces'].append(cs_full)
-
- config_data['displays'][odt_name_full] = {
- 'Linear': ACES,
- 'Log': ACEScc,
- 'Output Transform': cs_full}
-
- # -------------------------------------------------------------------------
- # Generic Matrix transform
- # -------------------------------------------------------------------------
- def create_generic_matrix(name='matrix',
- from_reference_values=None,
- to_reference_values=None,
- aliases=[]):
-
- if from_reference_values is None:
- from_reference_values = []
- if to_reference_values is None:
- to_reference_values = []
-
- cs = ColorSpace(name)
- cs.description = 'The %s color space' % name
- cs.aliases = []
- cs.equality_group = name
- cs.family = 'Utility'
- cs.is_data = False
-
- cs.to_reference_transforms = []
- if to_reference_values:
- for matrix in to_reference_values:
- cs.to_reference_transforms.append({
- 'type': 'matrix',
- 'matrix': mat44_from_mat33(matrix),
- 'direction': 'forward'})
-
- cs.from_reference_transforms = []
- if from_reference_values:
- for matrix in from_reference_values:
- cs.from_reference_transforms.append({
- 'type': 'matrix',
- 'matrix': mat44_from_mat33(matrix),
- 'direction': 'forward'})
-
- return cs
-
- cs = create_generic_matrix('XYZ',
- from_reference_values=[ACES_AP0_to_XYZ],
- aliases=["lin_xyz"])
- config_data['colorSpaces'].append(cs)
-
- cs = create_generic_matrix(
- 'Linear - AP1',
- to_reference_values=[ACES_AP1_to_AP0],
- aliases=["lin_ap1"])
- config_data['colorSpaces'].append(cs)
-
- # *ACES* to *Linear*, *P3D60* primaries.
- XYZ_to_P3D60 = [2.4027414142, -0.8974841639, -0.3880533700,
- -0.8325796487, 1.7692317536, 0.0237127115,
- 0.0388233815, -0.0824996856, 1.0363685997]
-
- cs = create_generic_matrix(
- 'Linear - P3-D60',
- from_reference_values=[ACES_AP0_to_XYZ, XYZ_to_P3D60],
- aliases=["lin_p3d60"])
- config_data['colorSpaces'].append(cs)
-
- # *ACES* to *Linear*, *P3DCI* primaries.
- XYZ_to_P3DCI = [2.7253940305, -1.0180030062, -0.4401631952,
- -0.7951680258, 1.6897320548, 0.0226471906,
- 0.0412418914, -0.0876390192, 1.1009293786]
-
- cs = create_generic_matrix(
- 'Linear - P3-DCI',
- from_reference_values=[ACES_AP0_to_XYZ, XYZ_to_P3DCI],
- aliases=["lin_p3dci"])
- config_data['colorSpaces'].append(cs)
-
- # *ACES* to *Linear*, *Rec. 709* primaries.
- XYZ_to_Rec709 = [3.2409699419, -1.5373831776, -0.4986107603,
- -0.9692436363, 1.8759675015, 0.0415550574,
- 0.0556300797, -0.2039769589, 1.0569715142]
-
- cs = create_generic_matrix(
- 'Linear - Rec.709',
- from_reference_values=[ACES_AP0_to_XYZ, XYZ_to_Rec709],
- aliases=["lin_rec709"])
- config_data['colorSpaces'].append(cs)
-
- # *ACES* to *Linear*, *Rec. 2020* primaries.
- XYZ_to_Rec2020 = [1.7166511880, -0.3556707838, -0.2533662814,
- -0.6666843518, 1.6164812366, 0.0157685458,
- 0.0176398574, -0.0427706133, 0.9421031212]
-
- cs = create_generic_matrix(
- 'Linear - Rec.2020',
- from_reference_values=[ACES_AP0_to_XYZ, XYZ_to_Rec2020],
- aliases=["lin_rec2020"])
- config_data['colorSpaces'].append(cs)
-