327 def generateOCIO(self, config, definitionDoc, implDoc, sourceColorSpace = 'acescg', targetColorSpace = 'lin_rec709',
328 type='color4', IN_PIXEL_STRING = 'in'):
330 Generate a MaterialX definition and implementation for a given color space transform.
331 Returns the definition, implementation, source code, extension and target.
332 @param config: The OCIO configuration.
333 @param definitionDoc: The MaterialX document to add the definition to.
334 @param implDoc: The MaterialX document to add the implementation to.
335 @param sourceColorSpace: The source color space.
336 @param targetColorSpace: The destination color space.
337 @param type: The type of the transform.
338 @param IN_PIXEL_STRING: The input pixel string.
339 @return: A tuple containing the definition, transform name, source code, extension
344 [
'genglsl',
'glsl', OCIO.GpuLanguage.GPU_LANGUAGE_GLSL_4_0]
350 for gen
in generationList:
355 code, textureCount = self.
generateShaderCode(config, sourceColorSpace, targetColorSpace, language)
359 print(
'- Skip generation for transform: "%s" to "%s" which requires %d texture resources' % (sourceColorSpace, targetColorSpace, textureCount))
367 IN_PIXEL_STRING, type)
374 return definition, transformName, code, extension, target
376 def generateOCIOGraph(self, config, sourceColorSpace = 'acescg', targetColorSpace = 'lin_rec709',
379 Generate a MaterialX nodegraph for a given color space transform.
380 @param config: The OCIO configuration.
381 @param sourceColorSpace: The source color space.
382 @param targetColorSpace: The destination color space.
383 @param type: The type of the transform.
384 Returns a MaterialX document containing a functional nodegraph and nodedef pair.
389 invalidTransforms = [ OCIO.TransformType.TRANSFORM_TYPE_LUT3D, OCIO.TransformType.TRANSFORM_TYPE_LUT1D,
390 OCIO.TransformType.TRANSFORM_TYPE_GRADING_PRIMARY ]
393 graphDoc = mx.createDocument()
394 outputType =
'color3'
397 nd = graphDoc.addNodeDef(
'ND_' + xformName )
398 nd.setNodeString(xformName)
399 ndInput = nd.addInput(
'in',
'color3')
400 ndInput.setValue([0.0, 0.0, 0.0],
'color3')
401 docString = f
'Generated color space {sourceColorSpace} to {targetColorSpace} transform.'
402 result = f
'{groupTransform}'
404 result = result.replace(
'<',
'(')
405 result = result.replace(
'>',
')')
406 result = re.sub(
r'[\r\n]+',
'', result)
409 docString = docString +
'. OCIO Transforms: ' + result
410 nd.setDocString(docString)
412 ng = graphDoc.addNodeGraph(
'NG_' + xformName)
413 ng.setNodeDefString(nd.getName())
414 convertNode = ng.addNode(
'convert',
'asVec',
'vector3')
415 converInput = convertNode.addInput(
'in',
'color3')
416 converInput.setInterfaceName(
'in')
419 if not groupTransform:
426 for i
in range(groupTransform.__len__()):
427 transform = groupTransform.__getitem__(i)
429 transformType = transform.getTransformType()
430 if transformType
in invalidTransforms:
431 print(f
'- WARNING: Transform[{i}]: {transformType} contains an unsupported transform type')
435 if transformType == OCIO.TransformType.TRANSFORM_TYPE_MATRIX:
436 matrixNode = ng.addNode(
'transform', ng.createValidChildName(f
'matrixTransform'),
'vector3')
439 inInput = matrixNode.addInput(
'in',
'vector3')
441 inInput.setConnectedNode(previousNode)
444 inInput.setConnectedNode(convertNode)
449 matInput = matrixNode.addInput(
'mat',
'matrix33')
450 matrixValue = transform.getMatrix()
452 matrixValue = matrixValue[0:3] + matrixValue[4:7] + matrixValue[8:11]
453 matrixValue =
', '.join([str(x)
for x
in matrixValue])
455 matInput.setAttribute(
'value', matrixValue)
458 offsetValue = transform.getOffset()
459 offsetValue =
', '.join([str(x)
for x
in offsetValue])
463 previousNode = matrixNode
466 elif transformType == OCIO.TransformType.TRANSFORM_TYPE_EXPONENT
or transformType == OCIO.TransformType.TRANSFORM_TYPE_EXPONENT_WITH_LINEAR:
468 hasOffset = (transformType == OCIO.TransformType.TRANSFORM_TYPE_EXPONENT_WITH_LINEAR)
471 exponentNode = ng.addNode(
'power', ng.createValidChildName(f
'exponent'),
'vector3')
472 exponentInput = exponentNode.addInput(
'in1',
'vector3')
474 exponentInput.setConnectedNode(previousNode)
477 exponentInput.setConnectedNode(convertNode)
479 exponentInput.setValue([0.0, 0.0, 0.0],
'vector3')
481 exponentInput2 = exponentNode.addInput(
'in2',
'vector3')
482 exponentInput2Value =
None
484 exponentInput2Value = transform.getValue()
486 exponentInput2Value = transform.getGamma()
488 exponentInput2Value = exponentInput2Value[0:3]
489 exponentInput2.setValue(exponentInput2Value,
'float')
491 previousNode = exponentNode
495 offsetNode = ng.addNode(
'add', ng.createValidChildName(f
'offset'),
'vector3')
496 offsetInput2 = offsetNode.addInput(
'in2',
'vector3')
497 offsetInput2.setConnectedNode(exponentNode)
498 offsetInput = offsetNode.addInput(
'in1',
'vector3')
499 offsetValue = transform.getOffset()
501 offsetValue = offsetValue[0:3]
502 offsetInput.setValue(offsetValue,
'vector3')
504 previousNode = offsetNode
507 elif transformType == OCIO.TransformType.TRANSFORM_TYPE_RANGE:
509 inMin = transform.getMinInValue()
510 inMax = transform.getMaxInValue()
511 outMin = transform.getMinOutValue()
514 outMax = transform.getMaxOutValue()
522 if inMin
and not inMax
and not outMax:
525 elif inMax
and not inMin
and not outMin:
530 if not clamp_min
and not clamp_max:
531 rangeNode = ng.addNode(
'range', ng.createValidChildName(f
'range'),
'vector3')
532 rangeInput = rangeNode.addInput(
'in',
'vector3')
534 rangeInput.setConnectedNode(previousNode)
537 rangeInput.setConnectedNode(convertNode)
539 rangeInput.setValue([0.0, 0.0, 0.0],
'vector3')
541 inMinInput = rangeNode.addInput(
'inlow',
'vector3')
542 inMinInput.setValue([inMin, inMin, inMin],
'vector3')
543 inMaxInput = rangeNode.addInput(
'inhigh',
'vector3')
544 inMaxInput.setValue([inMax, inMax, inMax],
'vector3')
545 outMinInput = rangeNode.addInput(
'outlow',
'vector3')
546 outMinInput.setValue([outMin, outMin, outMin],
'vector3')
547 outMaxInput = rangeNode.addInput(
'outhigh',
'vector3')
548 outMaxInput.setValue([outMax, outMax, outMax],
'vector3')
552 previousNode = rangeNode
555 clampNode = ng.addNode(
'min', ng.createValidChildName(f
'clamp_max'),
'vector3')
556 clampInput = clampNode.addInput(
'in1',
'vector3')
558 clampInput.setConnectedNode(previousNode)
561 clampInput.setConnectedNode(convertNode)
563 clampInput.setValue([0.0, 0.0, 0.0],
'vector3')
564 minInput = clampNode.addInput(
'in2',
'vector3')
565 minInput.setValue([inMax, inMax, inMax],
'vector3')
568 previousNode = clampNode
571 clampNode = ng.addNode(
'max', ng.createValidChildName(f
'clamp_min'),
'vector3')
572 clampInput = clampNode.addInput(
'in1',
'vector3')
574 clampInput.setConnectedNode(previousNode)
577 clampInput.setConnectedNode(convertNode)
579 clampInput.setValue([0.0, 0.0, 0.0],
'vector3')
580 maxInput = clampNode.addInput(
'in2',
'vector3')
581 maxInput.setValue([inMin, inMin, inMin],
'vector3')
584 previousNode = clampNode
587 elif transformType == OCIO.TransformType.TRANSFORM_TYPE_LOG_CAMERA:
588 print(f
'- WARNING. Transform[{i}]: {transformType} support has not been implemented yet')
591 print(f
'- WARNING. Transform[{i}]: {transformType} support has not been implemented yet')
596 convertNode2 = ng.addNode(
'convert',
'asColor',
'color3')
597 converInput2 = convertNode2.addInput(
'in',
'vector3')
599 converInput2.setConnectedNode(previousNode)
603 converInput2.setConnectedNode(convertNode)
604 out = ng.addOutput(ng.createValidChildName(
'out'),
'color3')
605 out.setConnectedNode(convertNode2)
611 Create a color3 variant of a color4 definition.
612 @param definition: The color4 definition.
613 @param definitionDoc: The MaterialX document.
614 @param IN_PIXEL_STRING: The input pixel string.
616 color4Name = definition.getName()
617 color3Name = color4Name.replace(
'color4',
'color3')
618 color3Def = definitionDoc.addNodeDef(color3Name)
619 color3Def.copyContentFrom(definition)
620 c3input = color3Def.getInput(IN_PIXEL_STRING)
621 c3input.setType(
'color3')
622 c3input.setValue([0.0, 0.0, 0.0],
'color3')
624 ngName = color3Def.getName().replace(
'ND_',
'NG_')
625 ng = definitionDoc.addNodeGraph(ngName)
626 c4instance = ng.addNodeInstance(definition)
627 c4instance.addInputsFromNodeDef()
628 c4instanceIn = c4instance.getInput(IN_PIXEL_STRING)
629 c3to4 = ng.addNode(
'convert',
'c3to4',
'color4')
630 c3to4Input = c3to4.addInput(
'in',
'color3')
631 c4to3 = ng.addNode(
'convert',
'c4to3',
'color3')
632 c4to3Input = c4to3.addInput(
'in',
'color4')
633 ngout = ng.addOutput(
'out',
'color3')
635 ng.setNodeDef(color3Def)
637 c4instanceIn.setConnectedNode(c3to4)
638 c4to3Input.setConnectedNode(c4instance)
639 ngout.setConnectedNode(c4to3)
640 c3to4Input.setInterfaceName(IN_PIXEL_STRING)