[cgkit-commits] cgkit2/cgkit glmaterial.py,1.4,1.5
Brought to you by:
mbaas
From: Matthias B. <mb...@us...> - 2006-03-20 17:07:19
|
Update of /cvsroot/cgkit/cgkit2/cgkit In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27286 Modified Files: glmaterial.py Log Message: The GLShader class now extracts the shader parameters and creates slots when a value gets assigned to a parameter. Index: glmaterial.py =================================================================== RCS file: /cvsroot/cgkit/cgkit2/cgkit/glmaterial.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** glmaterial.py 10 Mar 2006 09:06:31 -0000 1.4 --- glmaterial.py 20 Mar 2006 17:07:16 -0000 1.5 *************** *** 29,34 **** from _OpenGL.GLU import * import math ! import os, os.path import _Image as Image # GLTexture --- 29,39 ---- from _OpenGL.GLU import * import math ! import sys, os, os.path import _Image as Image + import glslangparams + from slots import * + + GLSLANG_VERTEX = _core.GLShader.ShaderType.VERTEX + GLSLANG_FRAGMENT = _core.GLShader.ShaderType.FRAGMENT # GLTexture *************** *** 171,178 **** # GLShader class GLShader(_core.GLShader): - def __init__(self, filename): - _core.GLShader.__init__(self, filename) - # GLMaterial --- 176,290 ---- # GLShader class GLShader(_core.GLShader): + """OpenGL 2 shader source file. + + """ + + def __init__(self, + shadertype, + filename, + cpp = None, + cpperrstream = sys.stderr, + **shaderparams): + """Constructor. + """ + _core.GLShader.__init__(self, shadertype, filename) + + # Extract the shader parameters... + uniform,attribute,varying = glslangparams.glslangparams(filename, cpp=cpp, cpperrstream=cpperrstream) + + self._uniform = {} + for type,name,arraysize,structname,struct in uniform: + if type=="struct": + print "Warning: structs are not yet supported" + continue + self._uniform[name] = (type,name,arraysize,structname,struct) + + for paramname in shaderparams: + setattr(self, paramname, shaderparams[paramname]) + + def __str__(self): + if self.type==GLSLANG_VERTEX: + stype = "vertex" + else: + stype = "fragment" + return "<%s shader '%s'>"%(stype, os.path.basename(self.filename)) + + # getattr + def __getattr__(self, attr): + """Return slot value or None if the slot wasn't created yet. + + An attempt an unknwon attribute (i.e. no uniform var) results + in an error. + """ + slot = self.__dict__.get("%s_slot"%attr, None) + if slot!=None: + return slot.getValue() + + if attr in self._uniform: + return None + + raise AttributeError, "shader '%s' has no parameter '%s'"%(self.filename, attr) + + # setattr + def __setattr__(self, attr, value): + if attr in ["_uniform"] or attr[-5:]=="_slot": + _core.GLShader.__setattr__(self, attr, value) + return + + # Is attr a slot variable? + slot = self.__dict__.get("%s_slot"%attr, None) + if slot!=None: + slot.setValue(value) + return + + # Is it a parameter that has no value yet? then we must create + # a new slot... + uniform = getattr(self, "_uniform", []) + if attr in uniform: + slot = self._createSlot(attr, uniform[attr][0]) + slot.setValue(value) + else: + raise AttributeError, "shader '%s' has no parameter '%s'"%(self.filename, attr) + + # iterUniform + def iterUniform(self): + return self._uniform.itervalues() + + # _createSlot + def _createSlot(self, param, type): + """Create a slot for a parameter. + + param is the name of the parameter and type its OpenGL type (as str). + """ + slot_lut = {"bool" : "BoolSlot", + "float" : "DoubleSlot", + "int" : "IntSlot", + "bvec2" : "Vec3Slot", + "bvec3" : "Vec3Slot", + "bvec4" : "Vec4Slot", + "ivec2" : "Vec3Slot", + "ivec3" : "Vec3Slot", + "bvec4" : "Vec4Slot", + "vec2" : "Vec3Slot", + "vec3" : "Vec3Slot", + "vec4" : "Vec4Slot", + "mat2" : "Mat3Slot", + "mat3" : "Mat3Slot", + "mat4" : "Mat4Slot", + "sampler1D" : "IntSlot", + "sampler2D" : "IntSlot", + "sampler3D" : "IntSlot", + "samplerCube" : "IntSlot", + "sampler1DShadow" : "IntSlot", + "sampler2DShadow" : "IntSlot"} + slotname = slot_lut.get(type, None) + if slotname==None: + raise ValueError, "Invalid parameter type: %s"%type + exec "slot = %s()"%slotname + self.addSlot(param, slot) + # Store the slot as <param>_slot + setattr(self, "%s_slot"%param, slot) + return slot # GLMaterial |