From 4395b3a289b251de409f32c4ac3635f59ac71b2c Mon Sep 17 00:00:00 2001 From: Cedric Launay Date: Wed, 17 Dec 2014 14:49:17 -0800 Subject: [PATCH] Added renderman shader metadata option "shaderTypeOverride". For example : #pragma annotation "shaderTypeOverride" "ri:shader" will force the Gaffer shader type to "ri:shader". --- .../RenderManShaderTest.py | 8 ++++ .../shaders/shaderTypeOverride.sl | 46 +++++++++++++++++++ src/GafferRenderMan/RenderManShader.cpp | 15 ++++++ 3 files changed, 69 insertions(+) create mode 100644 python/GafferRenderManTest/shaders/shaderTypeOverride.sl diff --git a/python/GafferRenderManTest/RenderManShaderTest.py b/python/GafferRenderManTest/RenderManShaderTest.py index 79ed6ba2965..b100454ae36 100644 --- a/python/GafferRenderManTest/RenderManShaderTest.py +++ b/python/GafferRenderManTest/RenderManShaderTest.py @@ -1608,5 +1608,13 @@ def testInputAcceptanceFromDots( self ) : self.assertTrue( shaderNode["parameters"]["coshaderParameter"].acceptsInput( dot["out"] ) ) + def testShaderTypeOverride( self ) : + + shader = self.compileShader( os.path.dirname( __file__ ) + "/shaders/shaderTypeOverride.sl" ) + shaderNode = GafferRenderMan.RenderManShader() + shaderNode.loadShader( shader ) + + self.assertEqual( shaderNode['type'].getValue(), "ri:overrideType" ) + if __name__ == "__main__": unittest.main() diff --git a/python/GafferRenderManTest/shaders/shaderTypeOverride.sl b/python/GafferRenderManTest/shaders/shaderTypeOverride.sl new file mode 100644 index 00000000000..abb88f1cf12 --- /dev/null +++ b/python/GafferRenderManTest/shaders/shaderTypeOverride.sl @@ -0,0 +1,46 @@ +////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2014, Image Engine Design Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above +// copyright notice, this list of conditions and the following +// disclaimer. +// +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided with +// the distribution. +// +// * Neither the name of John Haddon nor the names of +// any other contributors to this software may be used to endorse or +// promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////// + +#pragma annotation "shaderTypeOverride" "ri:overrideType" + +class shaderTypeOverride() +{ + public void surface( output color Ci, Oi) + { + Ci = ( 1, 1, 1 ); + Oi = 1; + } +} \ No newline at end of file diff --git a/src/GafferRenderMan/RenderManShader.cpp b/src/GafferRenderMan/RenderManShader.cpp index 12ea78e129f..21776f50dee 100644 --- a/src/GafferRenderMan/RenderManShader.cpp +++ b/src/GafferRenderMan/RenderManShader.cpp @@ -130,6 +130,21 @@ void RenderManShader::loadShader( const std::string &shaderName, bool keepExisti namePlug()->setValue( shaderName ); string type = "ri:" + shader->getType(); + + // A metadata option to override the shader type. + // This can be useful to work around some 3delight issues. + // For example, if you want to call illuminance() in a coshader, you need to add a + // dummy surface() method, but you still want the type to be "ri:shader". + ConstCompoundDataPtr annotations = shader->blindData()->member( "ri:annotations" ); + if( annotations ) + { + const StringData *shaderTypeOverride = annotations->member( "shaderTypeOverride" ); + if( shaderTypeOverride ) + { + type = shaderTypeOverride->readable(); + } + } + bool oldAndNewTypesCompatible = false; if( type == "ri:volume" ) {