Package slumMaya :: Module delight
[hide private]
[frames] | no frames]

Source Code for Module slumMaya.delight

  1  # 
  2  # delight -     delight renderer class tha defines how slum will interact with 3delight 
  3  # 
  4  #    Copyright (C) 2008 - Roberto Hradec 
  5  # 
  6  # --------------------------------------------------------------------------- 
  7  #        This file is part of SLUM. 
  8  # 
  9  #    SLUM is free software: you can redistribute it and/or modify 
 10  #    it under the terms of the GNU General Public License as published by 
 11  #    the Free Software Foundation, either version 3 of the License, or 
 12  #    (at your option) any later version. 
 13  # 
 14  #    SLUM is distributed in the hope that it will be useful, 
 15  #    but WITHOUT ANY WARRANTY; without even the implied warranty of 
 16  #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 17  #    GNU General Public License for more details. 
 18  # 
 19  #    You should have received a copy of the GNU General Public License 
 20  #    along with SLUM.  If not, see <http://www.gnu.org/licenses/>. 
 21  # --------------------------------------------------------------------------- 
 22   
 23  import os 
 24  import slumMaya 
 25  import slum 
 26  import maya.cmds as m 
 27  from maya.mel import eval as meval 
 28  from maya.utils import executeInMainThreadWithResult 
29 30 31 -class delight:
32 ''' 33 this class defines all the static methods that shaderBase calls to correct implement 34 the 3delight support in slum nodes. 35 this class need to be registered in slumMaya.renderers, so shaderBase can know about it. 36 to register a new renderer class, just do : 37 slumMaya.renderers.append(class name) 38 '''
39 - def __init__(self, node):
40 ''' 41 initialize the delight class to be used in idle events, for example, 42 to render swatch using the _renderPreview method. 43 ''' 44 self.node = node
45 @staticmethod
46 - def slumInitializer(node):
47 ''' 48 This method is called by shaderBase when initializing parameters for a slum node. 49 slum is implemented in 3delight for maya as a rsl code node. 50 shadingParameters and shadingCode are the attributes that 3dfm looks for in an rsl code node. 51 we also set the attributes as "setInternal=True", which triggers maya to call our 52 getInternalValueInContext method everytime someone tries to read this parameters. 53 So, the only thing we do is hook some code into getInternalValueInContext to gather 54 parameters and code from the slum class and return to maya, dynamically. 55 ''' 56 node['shadingParameters'] = "" 57 node.setHidden('shadingParameters', True) 58 node.setInternal('shadingParameters', True) 59 node.setStorable('shadingParameters', False) # fixes crashing when saving 60 61 node['shadingCode'] = "" 62 node.setHidden('shadingCode', True) 63 node.setInternal('shadingCode', True) 64 node.setStorable('shadingCode', False) # fixes crashing when saving
65 66 @staticmethod
67 - def setInternalValueInContext(plugName, node, dataHandle):
68 ''' 69 This method is called by shaderBase when setting parameters of a slum node. 70 you can use this to automatically call the swatch method to render a swatch 71 when an attribute is changed. 72 ''' 73 ret = False 74 #renderSwatch = delight(node) 75 #maya.cmds.scriptJob( runOnce=True, idleEvent=renderSwatch._renderPreview) 76 #def dd(): 77 # print 'xxx' 78 #maya.cmds.scriptJob( runOnce=True, idleEvent=dd) 79 return ret
80 81 @staticmethod
82 - def getInternalValueInContext(plugName, node, dataHandle):
83 ''' 84 This method is called by shaderBase when querying parameters of a slum node. 85 slum is implemented in 3delight for maya as renderman shader code nodes. It 86 have a shadingParameters and shadingCode attributes that 3delight for maya 87 will query to get the rsl shader parameters and code for a shader. 88 This method grabs the parameters and code from the slum class and return to 89 3delight for maya dinamically. 90 ''' 91 ret = False 92 dlParameters = ['shadingParameters', 'shadingCode'] 93 if plugName in dlParameters: 94 import traceback 95 try: 96 delightShader = node.slum.delight( node ) 97 except: 98 raise Exception('slum template error: \n%s' % traceback.format_exc() ) 99 zcode = delightShader[ dlParameters.index(plugName) ] 100 # ==================================================================================================== 101 # hack to allow slum to work with 3delight 7.0.0 version 102 # must remove after new public is available 103 #if plugName == 'shadingParameters': 104 # zcode = [] 105 # for line in delightShader[ dlParameters.index(plugName) ]: 106 # zcode.append(line.split('=')[0]) # just use text before the '=' character, if any 107 # ==================================================================================================== 108 code = '\n'.join( zcode ).replace('\t',' ') 109 dataHandle.setString( code ) 110 ret = True 111 return ret
112 113 @staticmethod
114 - def swatchUI(node):
115 ''' 116 this method is called by slum node AETemplate to display a swatch images. 117 it should contain all the code to display swatch images inside slum node 118 AETemplate. Whith this method, its very easy to create diferent types of swatch 119 preview layouts, depending on the renderer. 120 ''' 121 ''' 122 m.scrollLayout(h=150) 123 m.gridLayout(cellWidthHeight=(128,150), nr=1) 124 125 for each in range(3): 126 m.image(w=128,h=128, enable=True, i='/tmp/xx.tif') 127 128 m.setParent('..') 129 m.setParent('..') 130 ''' 131 m.rowLayout( numberOfColumns=3, adj=3, columnWidth3=((400-128)/2,128,1) ) 132 m.text( label = ' ' ) 133 m.image( delight._imageControlName(node), w=120,h=128, enable=True, 134 image = os.path.join(slumMaya.__path__[0],'images','previewImage.tif') ) 135 m.setParent('..') 136 m.image( delight._imageControlName(node), e=True, w=128)
137 138 @staticmethod
139 - def _imageControlName(node):
140 return "__delightPreviewImageID_%s" % node.node
141
142 - def _translateShader(self, compile=True):
143 delete = [] 144 type = 'surface' 145 sdl = '/tmp/%s_preview' % node 146 nodeSG = m.listConnections( node, t='shadingEngine' ) 147 if nodeSG: 148 shadingGroup = nodeSG[0] 149 else: 150 shadingGroup = m.createNode('shadingEngine', name='%s_slumPreview' % node, ss=True) 151 m.connectAttr( '%s.outColor' % node, '%s.surfaceShader' % shadingGroup, f=True) 152 delete.append(shadingGroup) 153 154 if compile: 155 m.delightNodeWatch( f=True ) 156 meval( 'buildShader("%s", {"%s"}, "%s", "","%s","%s", 1)' % ( 157 os.path.basename(sdl), 158 shadingGroup, 159 type, 160 os.path.dirname(sdl), 161 os.path.dirname(sdl) 162 )) 163 else: 164 sdl=meval( 'DL_translateMayaToSl("%s", {"%s"}, "%s")' % ( 165 os.path.basename(sdl), 166 shadingGroup, 167 type 168 )) 169 170 m.delightNodeWatch( f=True ) 171 for each in delete: 172 m.delete(each) 173 return sdl
174
175 - def _renderPreview(self):
176 ''' 177 this method is called by slum node AETemplate to render a swatch image. 178 everytime an attribute is changed, shaderBase class will call this method 179 to render a new swatch for the node. 180 ''' 181 sdl = self._translateShader() 182 183 m.RiBegin(of=outputRib) 184 meval('RiOption -id false -n "rib" -p "format" "string" "ascii" ') 185 meval('RiOption -n "render" -p "bucketorder" "string" "spiral" ' ) 186 meval('RiOption -n "limits" -p "bucketsize" "integer[2]" "16 16" ' ) 187 188 m.RiPixelSamples( s=(3, 3) ) 189 m.RiShadingRate( s=shadingRate ) 190 m.RiDisplay( n = imagefile, t = display, m = "rgb") 191 m.RiFormat( r=resolution, pa=1 ) 192 m.RiProjection( p=45 ) 193 m.RiTranslate( 0, 0, 4) 194 195 m.RiWorldBegin() 196 197 m.RiTransformBegin() 198 m.RiArchiveRecord( m = "verbatim", t = "Translate 4 4 -4\n" ) 199 meval('RiLightSource -n "pointlight" -p "intensity" "float" "1" ;' ) 200 m.RiTransformEnd() 201 202 m.RiTransformBegin() 203 m.RiArchiveRecord( m = "verbatim", t = "Translate -4 4 -4\n" ) 204 meval('RiLightSource -n "pointlight" -p "intensity" "float" "0.5" ;' ) 205 m.RiTransformEnd() 206 207 m.RiTransformBegin() 208 m.RiArchiveRecord( m = "verbatim", t = "Translate 0 -4 -4\n" ) 209 meval('RiLightSource -n "pointlight" -p "intensity" "float" "0.25" ;' ) 210 m.RiTransformEnd() 211 212 # turn raytrace on 213 meval('RiAttribute -n "visibility" -p "trace" "integer" 1 -p "photon" "integer" 1 -p "transmission" "string " "opaque" ;') 214 215 if type == 'surface': 216 m.RiSurface( n = sdl+'.sdl' ) 217 elif type == 'displacement': 218 meval('RiAttribute -n "displacementbound" -p "sphere" "float" 2 -p "coordinatesystem" "string" "shader";') 219 m.RiDisplacement( n = sdl+'.sdl' ) 220 m.RiSurface( n = "plastic" ) 221 222 m.RiArchiveRecord( m = "verbatim", t = eval(model) ) 223 224 m.RiArchiveRecord( m = "verbatim", t = "Translate 0 0 0 \n" ) 225 m.RiArchiveRecord( m = "verbatim", t = groundRIB ) 226 227 m.RiWorldEnd() 228 m.RiEnd()
229 230 231 232 slumMaya.renderers.append(delight) 233