Added support for the RED DRAGONcolor2 and REDcolor4 as well as support for convertin...
[OpenColorIO-Configs.git] / aces_1.0.0 / python / create_aces_config.py
index dce012b..88701f0 100755 (executable)
@@ -587,10 +587,15 @@ def generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutRes
     configData['colorSpaces'] = []
 
     # Matrix converting ACES AP1 primaries to AP0
-    acesAP1toAP0 = [0.6954522414, 0.1406786965, 0.1638690622,
-                    0.0447945634, 0.8596711185, 0.0955343182,
+    acesAP1toAP0 = [ 0.6954522414, 0.1406786965, 0.1638690622,
+                     0.0447945634, 0.8596711185, 0.0955343182,
                     -0.0055258826, 0.0040252103, 1.0015006723]
 
+    # Matrix converting ACES AP0 primaries to XYZ
+    acesAP0toXYZ = [0.9525523959,  0.0000000000,  0.0000936786,
+                    0.3439664498,  0.7281660966, -0.0721325464,
+                    0.0000000000,  0.0000000000,  1.0088251844]
+
     #
     # ACEScc
     #
@@ -604,7 +609,7 @@ def generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutRes
         ctls = [
             '%s/ACEScc/ACEScsc.ACEScc_to_ACES.a1.0.0.ctl' % acesCTLReleaseDir,
             # This transform gets back to the AP1 primaries
-            # Useful to the 1d LUT is only covering the transfer function
+            # Useful as the 1d LUT is only covering the transfer function
             # The primaries switch is covered by the matrix below
             '%s/ACEScg/ACEScsc.ACES_to_ACEScg.a1.0.0.ctl' % acesCTLReleaseDir
         ]
@@ -655,7 +660,7 @@ def generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutRes
         ctls = [
             '%s/ACESproxy/ACEScsc.ACESproxy10i_to_ACES.a1.0.0.ctl' % acesCTLReleaseDir,
             # This transform gets back to the AP1 primaries
-            # Useful to the 1d LUT is only covering the transfer function
+            # Useful as the 1d LUT is only covering the transfer function
             # The primaries switch is covered by the matrix below
             '%s/ACEScg/ACEScsc.ACES_to_ACEScg.a1.0.0.ctl' % acesCTLReleaseDir
         ]
@@ -900,17 +905,17 @@ def generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutRes
         if gamut == 'DRAGONcolor':
             cs.toReferenceTransforms.append( {
                 'type':'matrix',
-                'matrix':mat44FromMat33([0.532279, 0.376648, 0.091073, 
-                                        0.046344, 0.974513, -0.020860, 
+                'matrix':mat44FromMat33([0.532279,  0.376648,  0.091073, 
+                                         0.046344,  0.974513, -0.020860, 
                                         -0.053976, -0.000320, 1.054267]),
                 'direction':'forward'
             })
-        elif gamut == 'REDcolor3':
+        elif gamut == 'DRAGONcolor2':
             cs.toReferenceTransforms.append( {
                 'type':'matrix',
-                'matrix':mat44FromMat33([0.512136, 0.360370, 0.127494, 
-                                        0.070377, 0.903884, 0.025737
-                                        -0.020824, 0.017671, 1.003123]),
+                'matrix':mat44FromMat33([0.468452,  0.331484,  0.200064, 
+                                         0.040787,  0.857658,  0.101553
+                                        -0.047504, -0.000282, 1.047756]),
                 'direction':'forward'
             })
         elif gamut == 'REDcolor2':
@@ -921,6 +926,22 @@ def generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutRes
                                         -0.105257, 0.025320, 1.079907]),
                 'direction':'forward'
             })
+        elif gamut == 'REDcolor3':
+            cs.toReferenceTransforms.append( {
+                'type':'matrix',
+                'matrix':mat44FromMat33([0.512136, 0.360370, 0.127494, 
+                                         0.070377, 0.903884, 0.025737, 
+                                        -0.020824, 0.017671, 1.003123]),
+                'direction':'forward'
+            })
+        elif gamut == 'REDcolor4':
+            cs.toReferenceTransforms.append( {
+                'type':'matrix',
+                'matrix':mat44FromMat33([0.474202, 0.333677, 0.192121, 
+                                         0.065164, 0.836932, 0.097901, 
+                                        -0.019281, 0.016362, 1.002889]),
+                'direction':'forward'
+            })
 
         cs.fromReferenceTransforms = []
         return cs
@@ -929,12 +950,18 @@ def generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutRes
     REDlogFilmDRAGON = createREDlogFilm("DRAGONcolor", "REDlogFilm", name="REDlogFilm")
     configData['colorSpaces'].append(REDlogFilmDRAGON)
 
+    REDlogFilmDRAGON2 = createREDlogFilm("DRAGONcolor2", "REDlogFilm", name="REDlogFilm")
+    configData['colorSpaces'].append(REDlogFilmDRAGON2)
+
     REDlogFilmREDcolor2 = createREDlogFilm("REDcolor2", "REDlogFilm", name="REDlogFilm")
     configData['colorSpaces'].append(REDlogFilmREDcolor2)
 
     REDlogFilmREDcolor3 = createREDlogFilm("REDcolor3", "REDlogFilm", name="REDlogFilm")
     configData['colorSpaces'].append(REDlogFilmREDcolor3)
 
+    REDlogFilmREDcolor4 = createREDlogFilm("REDcolor4", "REDlogFilm", name="REDlogFilm")
+    configData['colorSpaces'].append(REDlogFilmREDcolor4)
+
     # Linearization only
     REDlogFilmDRAGON = createREDlogFilm("", "REDlogFilm", name="REDlogFilm")
     configData['colorSpaces'].append(REDlogFilmDRAGON)
@@ -943,12 +970,18 @@ def generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutRes
     REDlogFilmDRAGON = createREDlogFilm("DRAGONcolor", "", name="REDlogFilm")
     configData['colorSpaces'].append(REDlogFilmDRAGON)
 
+    REDlogFilmDRAGON2 = createREDlogFilm("DRAGONcolor2", "", name="REDlogFilm")
+    configData['colorSpaces'].append(REDlogFilmDRAGON2)
+
     REDlogFilmREDcolor2 = createREDlogFilm("REDcolor2", "", name="REDlogFilm")
     configData['colorSpaces'].append(REDlogFilmREDcolor2)
 
     REDlogFilmREDcolor3 = createREDlogFilm("REDcolor3", "", name="REDlogFilm")
     configData['colorSpaces'].append(REDlogFilmREDcolor3)
 
+    REDlogFilmREDcolor4 = createREDlogFilm("REDcolor4", "", name="REDlogFilm")
+    configData['colorSpaces'].append(REDlogFilmREDcolor4)
+
     #
     # Canon-Log to ACES
     #
@@ -1575,7 +1608,7 @@ def generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutRes
     lmtLutResolution3d = max(65, lutResolution3d)
 
     # Log 2 shaper
-    lmtShaperName = 'lmtShaper'
+    lmtShaperName = 'LMT Shaper'
     lmtParams = {
         'middleGrey'  : 0.18,
         'minExposure' : -10.0,
@@ -1806,7 +1839,7 @@ def generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutRes
         middleGrey=log2Params['middleGrey'], 
         minExposure=log2Params['minExposure'], 
         maxExposure=log2Params['maxExposure'])
-    log2ShaperAP1.name = "%s AP1" % log2ShaperAP1.name
+    log2ShaperAP1.name = "%s AP1" % log2ShaperAP1.name
     # AP1 primaries to AP0 primaries
     log2ShaperAP1.toReferenceTransforms.append( {
         'type':'matrix',
@@ -1892,6 +1925,75 @@ def generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutRes
                 'Log':ACEScc, 
                 'Output Transform':csFull }
 
+    #
+    # Generic Matrix transform
+    #
+    def createGenericMatrix(name='matrix', 
+        fromReferenceValues=[],
+        toReferenceValues=[]):
+        cs = ColorSpace(name)
+        cs.description = "The %s color space" % name
+        cs.equalityGroup = name
+        cs.family = 'Utility'
+        cs.isData=False
+
+        cs.toReferenceTransforms = []
+        if toReferenceValues != []:
+            for matrix in toReferenceValues:
+                cs.toReferenceTransforms.append( {
+                    'type':'matrix',
+                    'matrix':mat44FromMat33(matrix),
+                    'direction':'forward'
+                })
+
+        cs.fromReferenceTransforms = []
+        if fromReferenceValues != []:
+            for matrix in fromReferenceValues:
+                cs.fromReferenceTransforms.append( {
+                    'type':'matrix',
+                    'matrix':mat44FromMat33(matrix),
+                    'direction':'forward'
+                })
+
+        return cs
+
+    cs = createGenericMatrix('XYZ', fromReferenceValues=[acesAP0toXYZ])
+    configData['colorSpaces'].append(cs)   
+
+    cs = createGenericMatrix('Linear - AP1', toReferenceValues=[acesAP1toAP0])
+    configData['colorSpaces'].append(cs)   
+
+    # ACES to Linear, P3D60 primaries
+    xyzToP3D60 = [ 2.4027414142, -0.8974841639, -0.3880533700,
+                  -0.8325796487,  1.7692317536,  0.0237127115,
+                   0.0388233815, -0.0824996856,  1.0363685997]
+
+    cs = createGenericMatrix('Linear - P3-D60', fromReferenceValues=[acesAP0toXYZ, xyzToP3D60])
+    configData['colorSpaces'].append(cs)   
+
+    # ACES to Linear, P3D60 primaries
+    xyzToP3DCI = [ 2.7253940305, -1.0180030062, -0.4401631952,
+                  -0.7951680258,  1.6897320548,  0.0226471906,
+                   0.0412418914, -0.0876390192,  1.1009293786]
+
+    cs = createGenericMatrix('Linear - P3-DCI', fromReferenceValues=[acesAP0toXYZ, xyzToP3DCI])
+    configData['colorSpaces'].append(cs)   
+
+    # ACES to Linear, Rec 709 primaries
+    xyzToRec709 = [ 3.2409699419, -1.5373831776, -0.4986107603,
+                   -0.9692436363,  1.8759675015,  0.0415550574,
+                    0.0556300797, -0.2039769589,  1.0569715142]
+
+    cs = createGenericMatrix('Linear - Rec.709', fromReferenceValues=[acesAP0toXYZ, xyzToRec709])
+    configData['colorSpaces'].append(cs)   
+
+    # ACES to Linear, Rec 2020 primaries
+    xyzToRec2020 = [ 1.7166511880, -0.3556707838, -0.2533662814,
+                    -0.6666843518,  1.6164812366,  0.0157685458,
+                     0.0176398574, -0.0427706133,  0.9421031212]
+
+    cs = createGenericMatrix('Linear - Rec.2020', fromReferenceValues=[acesAP0toXYZ, xyzToRec2020])
+    configData['colorSpaces'].append(cs)   
 
     print( "generateLUTs - end" )
     return configData
@@ -1954,7 +2056,7 @@ def generateBakedLUTs(odtInfo, shaperName, bakedDir, configPath, lutResolution1d
             args += ["--outputspace", "%s" % odtName ]
             args += ["--description", "%s - %s for %s data" % (odtPrefix, odtName, inputspace) ]
             if inputspace == 'ACEScg':
-                linShaperName = "%s AP1" % shaperName 
+                linShaperName = "%s AP1" % shaperName 
             else:
                 linShaperName = shaperName
             args += ["--shaperspace", linShaperName, "--shapersize", str(lutResolutionShaper) ] 
@@ -2153,7 +2255,7 @@ def createACESConfig(acesCTLReleaseDir,
 
     # Generate config data and LUTs for different transforms
     lutDir = "%s/luts" % configDir
-    shaperName = 'outputShaper'
+    shaperName = 'Output Shaper'
     configData = generateLUTs(odtInfo, lmtInfo, shaperName, acesCTLReleaseDir, lutDir, lutResolution1d, lutResolution3d, cleanup)
     
     # Create the config using the generated LUTs