X-Git-Url: http://users.mur.at/ms/git/gitweb/?a=blobdiff_plain;f=aces_1.0.0%2Fpython%2Faces_ocio%2Fgenerate_lut.py;h=66a0d6e8f2b1ea2bd54194050888673c28c69f7d;hb=24460c4f42d9e44101d414ef15579e5f7d250bb7;hp=605963651302faa5e9ed0ee8e54385e7e8f9bf8f;hpb=1ef6829d081edc2cdb9e7610f33ae52a0a7f0ee7;p=OpenColorIO-Configs.git diff --git a/aces_1.0.0/python/aces_ocio/generate_lut.py b/aces_1.0.0/python/aces_ocio/generate_lut.py index 6059636..66a0d6e 100755 --- a/aces_1.0.0/python/aces_ocio/generate_lut.py +++ b/aces_1.0.0/python/aces_ocio/generate_lut.py @@ -149,8 +149,8 @@ def write_CSP_1d(filename, fp.write('CSPLUTV100\n') fp.write('1D\n') fp.write('\n') - fp.write('BEGIN METADATA') - fp.write('END METADATA') + fp.write('BEGIN METADATA\n') + fp.write('END METADATA\n') fp.write('\n') @@ -181,6 +181,92 @@ def write_CSP_1d(filename, fp.write('%s\n' % entry) fp.write('\n') +def write_CTL_1d(filename, + from_min, + from_max, + data, + entries, + channels, + components=3): + """ + Object description. + + Parameters + ---------- + parameter : type + Parameter description. + + Returns + ------- + type + Return value description. + """ + + # May want to use fewer components than there are channels in the data + # Most commonly used for single channel LUTs + components = min(3, components, channels) + + with open(filename, 'w') as fp: + fp.write('// %d x %d LUT generated by "generate_lut"\n' % ( + entries, components)) + fp.write('\n') + fp.write('const float min1d = %3.9f;\n' % from_min) + fp.write('const float max1d = %3.9f;\n' % from_max) + fp.write('\n') + + # Write LUT + if components == 1: + fp.write('const float lut[] = {\n') + for i in range(0, entries): + fp.write('%s' % data[i * channels]) + if i != (entries-1): + fp.write(',') + fp.write('\n') + fp.write('};\n') + fp.write('\n') + else: + for j in range(components): + fp.write('const float lut%d[] = {\n' % j) + for i in range(0, entries): + fp.write('%s' % data[i * channels]) + if i != (entries-1): + fp.write(',') + fp.write('\n') + fp.write('};\n') + fp.write('\n') + + fp.write('void main\n') + fp.write('(\n') + fp.write(' input varying float rIn,\n') + fp.write(' input varying float gIn,\n') + fp.write(' input varying float bIn,\n') + fp.write(' input varying float aIn,\n') + fp.write(' output varying float rOut,\n') + fp.write(' output varying float gOut,\n') + fp.write(' output varying float bOut,\n') + fp.write(' output varying float aOut\n') + fp.write(')\n') + fp.write('{\n') + fp.write(' float r = rIn;\n') + fp.write(' float g = gIn;\n') + fp.write(' float b = bIn;\n') + fp.write('\n') + fp.write(' // Apply LUT\n') + if components == 1: + fp.write(' r = lookup1D(lut, min1d, max1d, r);\n') + fp.write(' g = lookup1D(lut, min1d, max1d, g);\n') + fp.write(' b = lookup1D(lut, min1d, max1d, b);\n') + elif components == 3: + fp.write(' r = lookup1D(lut0, min1d, max1d, r);\n') + fp.write(' g = lookup1D(lut1, min1d, max1d, g);\n') + fp.write(' b = lookup1D(lut2, min1d, max1d, b);\n') + fp.write('\n') + fp.write(' rOut = r;\n') + fp.write(' gOut = g;\n') + fp.write(' bOut = b;\n') + fp.write(' aOut = aIn;\n') + fp.write('}\n') + def write_1d(filename, from_min, from_max, @@ -207,7 +293,8 @@ def write_1d(filename, 'flame' : '3dl', 'icc' : 'icc', 'houdini' : 'lut', - 'lustre' : '3dl'} + 'lustre' : '3dl', + 'ctl' : 'ctl'} if format in ocioFormatsToExtensions: if ocioFormatsToExtensions[format] == 'csp': @@ -218,6 +305,14 @@ def write_1d(filename, data_entries, data_channels, lut_components) + elif ocioFormatsToExtensions[format] == 'ctl': + write_CTL_1d(filename, + from_min, + from_max, + data, + data_entries, + data_channels, + lut_components) else: write_SPI_1d(filename, from_min,