[cgkit-commits] cgkit2/cgkit rmshader.py,1.6,1.7
Brought to you by:
mbaas
From: Matthias B. <mb...@us...> - 2006-01-28 18:33:52
|
Update of /cvsroot/cgkit/cgkit2/cgkit In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11255/cgkit Modified Files: rmshader.py Log Message: New constructor argument 'params' to pass a dictionary containing shader parameters (if no source file is available) Index: rmshader.py =================================================================== RCS file: /cvsroot/cgkit/cgkit2/cgkit/rmshader.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** rmshader.py 27 Jan 2006 22:12:33 -0000 1.6 --- rmshader.py 28 Jan 2006 18:33:44 -0000 1.7 *************** *** 63,66 **** --- 63,67 ---- cpp = None, cpperrstream = sys.stderr, + params = None, **keyargs): """Constructor. *************** *** 70,76 **** cpperrstream is used to output errors from the preprocessor (see the function slparams.slparams() for details). ! Any additional arguments are shader parameters. The parameters ! can be specified as in the ri module (either as token value ! pairs, as keyword args or as a dictionary). \param name (\c str) Shader file name or shader name --- 71,81 ---- cpperrstream is used to output errors from the preprocessor (see the function slparams.slparams() for details). ! params can be used to declare parameters if the shader source ! is not available. The value must be a dictionary that contains ! token/value pairs. The token may contain an inline declaration. ! Any additional keyword argument is also considered to be a shader ! parameter. However, this parameter cannot have an inline declaration, ! so it is recommended to declare the parameter afterwards using ! the declare() method. \param name (\c str) Shader file name or shader name *************** *** 83,95 **** # Shader type (surface, displacement, ...) self.shadertype = None # Shader parameters as dictionary. # Key:Parameter name Value:Declaration self.shaderparams = {} ! # Store the shader parameters as provided by the user ! self.initialparams = ri._paramlist2dict((), keyargs) ! # Shader transformation ! self.transform = transform # If there is no extension then name is just the shader name --- 88,116 ---- # Shader type (surface, displacement, ...) self.shadertype = None + # Shader transformation + self.transform = transform # Shader parameters as dictionary. # Key:Parameter name Value:Declaration self.shaderparams = {} ! # Params for which there is no declaration ! # Key: Param name Value:Value ! self.undeclared = keyargs ! if params!=None: ! for param in params: ! f = param.split() ! # Was the parameter an empty string? then ignore ! if len(f)==0: ! continue ! # Add the param to the 'undeclared' dict ! # (even if there is a declaration this will ensure that the ! # value is taken as default value during the declaration) ! paramname = f[-1] ! if paramname not in self.undeclared: ! self.undeclared[paramname] = params[param] ! if len(f)>1: ! self.declare(param) ! # If there is no extension then name is just the shader name *************** *** 101,104 **** --- 122,126 ---- self.filename = shader + # Read the shader parameters from the shader source file... if self.filename!=None: slinfo = slparams.slparams(shader, cpp=cpp, cpperrstream=cpperrstream) *************** *** 108,111 **** --- 130,134 ---- print "WARNING: There is more than one shader in %s"%shader + # Declare the variables... self.shadertype, self.shadername, params = slinfo[0] for p in params: *************** *** 115,155 **** name = p[4] default = p[6] - self.declare(name, type, cls, arraysize, default) ! # Create slots... ! ## initial = {} ! ## for k in self.initialparams.keys(): ! ## v = self.initialparams[k] ! ## p = k.split()[-1] ! ## initial[p] = v ! ## self.shadertype, self.shadername, params = slinfo[0] ! ## typelut = {"float":"double", ! ## "string":"str", ! ## "color":"vec3", ! ## "point":"vec3", ! ## "vector":"vec3", ! ## "normal":"vec3", ! ## "matrix":"mat4"} ! ## for p in params: ! ## ptype = p[2] ! ## parraylen = p[3] ! ## pname = p[4] ! ## if pname in initial: ! ## pdefault = initial[pname] ! ## del initial[pname] ! ## else: ! ## pdefault = slparams.convertdefault(p) ! ## self.createSlot(pname, typelut[ptype], parraylen, pdefault) ! ## if parraylen==None: ! ## decl = "%s %s"%(p[1], ptype) ! ## else: ! ## decl = "%s %s[%d]"%(p[1], ptype, parraylen) ! ## self.shaderparams[pname] = decl ! ! ## for p in initial: ! ## print >>sys.stderr, 'Warning: Shader "%s" has no parameter "%s"'%(self.shadername, p) ! ! def __getattr__(self, name): slot = self.__dict__.get("%s_slot"%name, None) --- 138,144 ---- name = p[4] default = p[6] self.declare(name, type, cls, arraysize, default) ! # getattr def __getattr__(self, name): slot = self.__dict__.get("%s_slot"%name, None) *************** *** 159,162 **** --- 148,152 ---- return slot.getValue() + # setattr def __setattr__(self, name, val): slot = self.__dict__.get("%s_slot"%name, None) *************** *** 190,200 **** """Return the parameter dictionary for the current time. ! The parameters will contain inline declarations, so no separate ! RiDeclare() call is necessary. \return Dictionary containing all parameters. """ ! res = copy.copy(self.initialparams) for name in self.shaderparams: --- 180,189 ---- """Return the parameter dictionary for the current time. ! If available the parameters will contain inline declarations. \return Dictionary containing all parameters. """ ! res = copy.copy(self.undeclared) for name in self.shaderparams: *************** *** 215,218 **** --- 204,210 ---- contain the entire declaration. + When a parameter is declared it is added to the list of known + parameters and a corresponding slot (<name>_slot) is created. + Examples: *************** *** 232,236 **** # Check if name is only a single name or if there was an attempt # to specify the entire declaration ! invalid = [" ", "[", "]", "(", ")", ":", ";", "'", '"'] for inv in invalid: if inv in name: --- 224,228 ---- # Check if name is only a single name or if there was an attempt # to specify the entire declaration ! invalid = " []():;'\"'" for inv in invalid: if inv in name: *************** *** 275,284 **** # Check if the parameter was specified in the constructor. # If so, use the value to initialize the slot ! if pname in self.initialparams: pytype = slottype if pytype=="double": pytype = "float" ! pdefault = eval("%s(%s)"%(pytype, repr(self.initialparams[pname]))) ! del self.initialparams[pname] # Create the slot and add the variable to the params dictionary --- 267,276 ---- # Check if the parameter was specified in the constructor. # If so, use the value to initialize the slot ! if pname in self.undeclared: pytype = slottype if pytype=="double": pytype = "float" ! pdefault = eval("%s(%s)"%(pytype, repr(self.undeclared[pname]))) ! del self.undeclared[pname] # Create the slot and add the variable to the params dictionary |