2929
3030__all__ = [
3131 'LOG_ALLOCATION_VARS' , 'colorspace_factory' , 'view_transform_factory' ,
32- 'ConfigData' , 'validate_config' , 'generate_config'
32+ 'look_factory' , ' ConfigData' , 'validate_config' , 'generate_config'
3333]
3434
3535LOG_ALLOCATION_VARS = (- 8 , 5 , 2 ** - 8 )
@@ -223,6 +223,64 @@ def view_transform_factory(name,
223223 return view_transform
224224
225225
226+ @required ('OpenColorIO' )
227+ def look_factory (name ,
228+ process_space = None ,
229+ description = None ,
230+ forward_transform = None ,
231+ inverse_transform = None ,
232+ base_look = None ):
233+ """
234+ *OpenColorIO* look factory.
235+
236+ Parameters
237+ ----------
238+ name : unicode
239+ *OpenColorIO* look name.
240+ process_space : unicode, optional
241+ *OpenColorIO* look process space, e.g. *OpenColorIO* colorspace or role
242+ name.
243+ description : unicode, optional
244+ *OpenColorIO* look description.
245+ forward_transform : object, optional
246+ *To Reference* *OpenColorIO* look transform.
247+ inverse_transform : object, optional
248+ *From Reference* *OpenColorIO* look transform.
249+ base_look : ViewTransform, optional
250+ Inherited *OpenColorIO* base look.
251+
252+ Returns
253+ -------
254+ Look
255+ *OpenColorIO* look.
256+ """
257+
258+ import PyOpenColorIO as ocio
259+
260+ if process_space is None :
261+ process_space = ocio .ROLE_SCENE_LINEAR
262+
263+ if base_look is not None :
264+ look = base_look
265+ else :
266+ look = ocio .Look ()
267+
268+ look .setProcessSpace (process_space )
269+
270+ if forward_transform is not None :
271+ look .setTransform (forward_transform )
272+
273+ if inverse_transform is not None :
274+ look .setInverseTransform (inverse_transform )
275+
276+ look .setName (name )
277+
278+ if description is not None :
279+ look .setDescription (description )
280+
281+ return look
282+
283+
226284@dataclass
227285class ConfigData :
228286 """
@@ -239,6 +297,9 @@ class ConfigData:
239297 colorspaces : array_like
240298 Config colorspaces, an iterable of
241299 :attr:`PyOpenColorIO.ColorSpace` class instances.
300+ looks : array_like, optional
301+ Config looks, an iterable of :attr:`PyOpenColorIO.Look` class
302+ instances.
242303 view_transforms : array_like, optional
243304 Config view transforms, an iterable of
244305 :attr:`PyOpenColorIO.ViewTransform` class instances.
@@ -265,6 +326,7 @@ class ConfigData:
265326 description
266327 roles
267328 colorspaces
329+ looks
268330 view_transforms
269331 inactive_colorspaces
270332 shared_views
@@ -280,6 +342,7 @@ class ConfigData:
280342 'An "OpenColorIO" config generated by "OpenColorIO-Config-ACES".' )
281343 roles : Union [dict , OrderedDict ] = field (default_factory = dict )
282344 colorspaces : Union [list , tuple ] = field (default_factory = list )
345+ looks : Union [list , tuple ] = field (default_factory = list )
283346 view_transforms : Union [list , tuple ] = field (default_factory = list )
284347 inactive_colorspaces : Union [list , tuple ] = field (default_factory = list )
285348 shared_views : Union [list , tuple ] = field (default_factory = list )
@@ -354,6 +417,10 @@ def generate_config(data, config_name=None, validate=True):
354417 logging .debug (f'Adding "{ view_transform .getName ()} " view transform.' )
355418 config .addViewTransform (view_transform )
356419
420+ for look in data .looks :
421+ logging .debug (f'Adding "{ look .getName ()} " look.' )
422+ config .addLook (look )
423+
357424 if data .profile_version >= 2 :
358425 logging .debug (f'Disabling "{ data .inactive_colorspaces } " colorspaces.' )
359426 config .setInactiveColorSpaces (',' .join (data .inactive_colorspaces ))
@@ -479,6 +546,10 @@ def generate_config(data, config_name=None, validate=True):
479546 'Colorspace' ,
480547 to_reference = ocio .ColorSpaceTransform ('CCTF - sRGB' , 'Gamut - sRGB' ))
481548 colorspace_4 = colorspace_factory ('Utility - Raw' , 'Utility' , is_data = True )
549+ _red_cdl_transform = ocio .CDLTransform ()
550+ _red_cdl_transform .setSlope ([0 , 0 , 0 ])
551+ _red_cdl_transform .setOffset ([1 , 0 , 0 ])
552+ look_1 = look_factory ('Look - Red' , forward_transform = _red_cdl_transform )
482553 display_1 = colorspace_factory (
483554 'View - sRGB Monitor - sRGB' , 'View' , base_colorspace = colorspace_3 )
484555
@@ -487,6 +558,7 @@ def generate_config(data, config_name=None, validate=True):
487558 colorspaces = [
488559 colorspace_1 , colorspace_2 , colorspace_3 , colorspace_4 , display_1
489560 ],
561+ looks = [look_1 ],
490562 views = [
491563 {
492564 'display' : 'sRGB Monitor' ,
@@ -526,6 +598,10 @@ def generate_config(data, config_name=None, validate=True):
526598 colorspace_4 = colorspace_factory (
527599 'CCTF - sRGB' , 'CCTF' , to_reference = transform )
528600 colorspace_5 = colorspace_factory ('Utility - Raw' , 'Utility' , is_data = True )
601+ _red_cdl_transform = ocio .CDLTransform ()
602+ _red_cdl_transform .setSlope ([0 , 0 , 0 ])
603+ _red_cdl_transform .setOffset ([1 , 0 , 0 ])
604+ look_1 = look_factory ('Look - Red' , forward_transform = _red_cdl_transform )
529605 interchange = colorspace_factory ('CIE-XYZ D65' )
530606 display_1 = colorspace_factory (
531607 'sRGB Monitor' ,
@@ -567,6 +643,7 @@ def generate_config(data, config_name=None, validate=True):
567643 colorspace_1 , colorspace_2 , colorspace_3 , colorspace_4 ,
568644 colorspace_5 , interchange , display_1 , display_2
569645 ],
646+ looks = [look_1 ],
570647 view_transforms = [view_transform_1 , view_transform_2 ],
571648 inactive_colorspaces = ['CIE-XYZ D65' ],
572649 shared_views = shared_views ,
0 commit comments