252 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			252 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | """The Blender Material module
 | ||
|  | 
 | ||
|  |   This module provides access to *Material* datablocks | ||
|  | 
 | ||
|  |   Example:: | ||
|  | 
 | ||
|  |     from Blender import Material, NMesh, Object, Scene | ||
|  |     m = Material.New()                         # create free Material datablock | ||
|  |     m.rgbCol = (1.0, 0.0, 0.3)                    # assign RGB values | ||
|  |     mesh = NMesh.GetRaw()                      # get new mesh | ||
|  |     mesh.addMaterial(m)                        # add material to mesh | ||
|  |     object = Object.New('Mesh')                # create new object  | ||
|  |     object.link(mesh)                          # link mesh data to object | ||
|  |     Scene.getCurrent().link(ob)                # link object to current scene | ||
|  | """
 | ||
|  | 
 | ||
|  | import _Blender.Material as _Material | ||
|  | import shadow | ||
|  | #import Blender.Curve as Curve | ||
|  | 
 | ||
|  | # These are getters and setters needed for emulation | ||
|  | 
 | ||
|  | def _getRGB(obj): | ||
|  | 	return (obj.R, obj.G, obj.B) | ||
|  | 
 | ||
|  | def _getSpec(obj): | ||
|  | 	return (obj.specR, obj.specG, obj.specB) | ||
|  | 
 | ||
|  | def _getMir(obj): | ||
|  | 	return (obj.mirR, obj.mirG, obj.mirB) | ||
|  | 
 | ||
|  | def _setRGB(obj, rgb): | ||
|  | 	obj.R, obj.G, obj.B = rgb | ||
|  | 
 | ||
|  | def _setSpec(obj, rgb): | ||
|  | 	obj.specR, obj.specG, obj.specB = rgb | ||
|  | 
 | ||
|  | def _setMir(obj, rgb): | ||
|  | 	obj.mirR, obj.mirG, obj.mirB = rgb | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | class Material(shadow.hasIPO, shadow.hasModes): | ||
|  | 	"""Material DataBlock object
 | ||
|  | 
 | ||
|  |     See example in the Material module documentation on how to create | ||
|  |     an instance of a Material object. | ||
|  | 
 | ||
|  |   Attributes | ||
|  | 
 | ||
|  |     The following attributes are colour vectors (r, g, b) | ||
|  | 	 | ||
|  |     rgbCol     -- The color vector (R, G, B). | ||
|  | 	              The RGB values can be accessed individually as .R, .G and .B  | ||
|  | 
 | ||
|  |     specCol    -- Specularity color vector (specR, specG, specG) | ||
|  | 
 | ||
|  |     mirCol     -- Mirror color vector (mirR, mirG, mirB) | ||
|  | 
 | ||
|  |     The following are float values: | ||
|  | 	 | ||
|  |     alpha      -- The transparency | ||
|  | 
 | ||
|  |     ref        -- Reflectivity float value | ||
|  | 
 | ||
|  |     emit       -- Emit intensity value  | ||
|  | 
 | ||
|  |     amb        -- Ambient intensity value  | ||
|  | 
 | ||
|  |     spec       -- specularity value  | ||
|  | 
 | ||
|  |     specTransp -- Specular transpareny  | ||
|  | 
 | ||
|  |     haloSize   -- Halo size | ||
|  | 
 | ||
|  |     mode       -- The material mode bit vector - see Material.ModeFlags | ||
|  | 
 | ||
|  |     hard       -- The hardness value | ||
|  | 
 | ||
|  | """ 
 | ||
|  | 
 | ||
|  | 	_emulation = {'Mode'   : "mode", | ||
|  | 	              'Ref'    : "ref", | ||
|  | 				  'HaSize' : "haloSize", | ||
|  | 				  'SpTra'  : "specTransp", | ||
|  | 				  'Alpha'  : "alpha", | ||
|  | 				  'Spec'   : "spec", | ||
|  | 				  'Emit'   : "emit", | ||
|  | 				  'Hard'   : "hard", | ||
|  | 				  'Amb'    : "amb", | ||
|  | 				 }  | ||
|  | 
 | ||
|  | 	_getters   = {'rgbCol'  : _getRGB, | ||
|  | 	              'specCol' : _getSpec, | ||
|  | 				  'mirCol'  : _getMir, | ||
|  |                  }  | ||
|  | 
 | ||
|  | 	_setters   = {'rgbCol'  : _setRGB, | ||
|  | 	              'specCol' : _setSpec, | ||
|  | 				  'mirCol'  : _setMir, | ||
|  | 				  }  | ||
|  | 
 | ||
|  | 	t = _Material.Modes | ||
|  | 
 | ||
|  | 	Modes =         {'traceable' : t.TRACEABLE, | ||
|  | 					 'shadow'    : t.SHADOW, | ||
|  | 					 'shadeless' : t.SHADELESS, | ||
|  | 					 'wire'      : t.WIRE, | ||
|  | 					 'vcolLight' : t.VCOL_LIGHT, | ||
|  | 					 'vcolPaint' : t.VCOL_PAINT, | ||
|  | 					 'zTransp'   : t.ZTRANSP, | ||
|  | 					 'zInvert'   : t.ZINVERT, | ||
|  | 					 'onlyShadow': t.ONLYSHADOW, | ||
|  | 					 'star'      : t.STAR, | ||
|  | 					 'texFace'   : t.TEXFACE, | ||
|  | 					 'noMist'    : t.NOMIST, | ||
|  | 					}  | ||
|  | 
 | ||
|  | 	t = _Material.HaloModes | ||
|  | 
 | ||
|  | 	HaloModes =     { "rings"   : t.RINGS, | ||
|  | 					  "lines"   : t.LINES, | ||
|  | 					  "tex"     : t.TEX, | ||
|  | 					  "haloPuno": t.PUNO, | ||
|  | 					  "shade"   : t.SHADE, | ||
|  | 					  "flare"   : t.FLARE, | ||
|  | 					} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	del t | ||
|  | 
 | ||
|  | 	def setMode(self, *args): | ||
|  | 		"""Set the mode of 'self'. This function takes a variable number
 | ||
|  | of string arguments of the types listed in self.Modes. | ||
|  | 
 | ||
|  |   Example:: | ||
|  | 
 | ||
|  |     m = Material.New() | ||
|  |     m.setMode('shadow', 'wire') | ||
|  | """
 | ||
|  | 		flags = 0 | ||
|  | 		try: | ||
|  | 			for a in args: | ||
|  | 				flags |= self.Modes[a] | ||
|  | 		except: | ||
|  | 			raise TypeError, "mode must be one of" % self.Modes.keys() | ||
|  | 		self._object.mode = flags | ||
|  | 
 | ||
|  | 	def setHaloMode(self, *args): | ||
|  | 		"""Sets the material to Halo mode. 
 | ||
|  | This function takes a variable number of string arguments of the types  | ||
|  | listed in self.HaloModes"""
 | ||
|  | 		flags = _Material.Modes.HALO | ||
|  | 
 | ||
|  | 		try: | ||
|  | 			for a in args: | ||
|  | 				flags |= self.HaloModes[a] | ||
|  | 		except: | ||
|  | 			raise TypeError, "mode must be one of" % self.HaloModes.keys() | ||
|  | 		self._object.mode = flags | ||
|  | 
 | ||
|  | 	 | ||
|  | class ModeFlags: | ||
|  | 	"""Readonly dictionary
 | ||
|  | 
 | ||
|  | ...containing Material mode bitvectors: | ||
|  | 
 | ||
|  | |------------------------------------------| | ||
|  | | Name         |  Description              | | ||
|  | |==========================================| | ||
|  | | TRACEABLE    | visible for shadow lamps  | | ||
|  | |------------------------------------------| | ||
|  | | SHADOW       | cast shadow               | | ||
|  | |------------------------------------------| | ||
|  | | SHADELESS    | do not shade              | | ||
|  | |------------------------------------------| | ||
|  | | WIRE         | draw in wireframe         | | ||
|  | |------------------------------------------| | ||
|  | | VCOL_LIGHT   | use vertex colors         | | ||
|  | |              | with lighting             | | ||
|  | |------------------------------------------| | ||
|  | | VCOL_PAINT   | vertex colours            | | ||
|  | |------------------------------------------| | ||
|  | | HALO         | Halo material             | | ||
|  | |------------------------------------------| | ||
|  | | ZTRANSP      | Z transparency            | | ||
|  | |------------------------------------------| | ||
|  | | ZINVERT      | invert Z                  | | ||
|  | |------------------------------------------| | ||
|  | | ONLYSHADOW   | only shadow, but          | | ||
|  | |              | don't render              | | ||
|  | |------------------------------------------| | ||
|  | | STAR         |  ?                        | | ||
|  | |------------------------------------------| | ||
|  | | TEXFACE      | textured faces            | | ||
|  | |------------------------------------------| | ||
|  | | NOMIST       | disable mist              | | ||
|  | |------------------------------------------| | ||
|  | 
 | ||
|  | These mode flags directly represent the buttons in the Material parameters | ||
|  | window (EditButtons) | ||
|  | 
 | ||
|  | Example:: | ||
|  | 
 | ||
|  |   # be 'm' a material | ||
|  |   from Blender.Material.Modes import * | ||
|  |   m.mode |= (TRACEABLE + WIRE)    # Set 'wire' and 'traceable' flagsd | ||
|  |   m.mode &= ~SHADELESS            # clear 'shadeless' flag | ||
|  | """
 | ||
|  | 	 | ||
|  | 	t = _Material.Modes | ||
|  | 	TRACEABLE  = t.TRACEABLE | ||
|  | 	SHADOW     = t.SHADOW | ||
|  | 	SHADELESS  = t.SHADELESS | ||
|  | 	WIRE       = t.WIRE | ||
|  | 	VCOL_LIGHT = t.VCOL_LIGHT | ||
|  | 	VCOL_PAINT = t.VCOL_PAINT | ||
|  | 	HALO       = t.HALO | ||
|  | 	ZTRANSP    = t.ZTRANSP | ||
|  | 	ZINVERT    = t.ZINVERT | ||
|  | 	ONLYSHADOW = t.ONLYSHADOW | ||
|  | 	STAR       = t.STAR | ||
|  | 	TEXFACE    = t.TEXFACE | ||
|  | 	NOMIST     = t.NOMIST | ||
|  | 	del t | ||
|  | 	 | ||
|  | # override: | ||
|  | ModeFlags = _Material.Modes | ||
|  | 
 | ||
|  | def get(name = None): | ||
|  | 	"""If 'name' given, the Material 'name' is returned if existing, 'None' otherwise.
 | ||
|  | If no name is given, a list of all Materials is returned"""
 | ||
|  | 	if name: | ||
|  | 		return Material(_Material.get(name)) | ||
|  | 	else: | ||
|  | 		return shadow._List(_Material.get(), Material) | ||
|  | 	 | ||
|  | Get = get  # emulation | ||
|  | 
 | ||
|  | def New(name = None): | ||
|  | 	"""Creates a new, empty Material and returns it. 
 | ||
|  | 
 | ||
|  | Example:: | ||
|  | 
 | ||
|  |   from Blender import Material | ||
|  |   mat = Material.New() | ||
|  | """
 | ||
|  | 	mat = Material(_Material.New()) | ||
|  | 	if name: | ||
|  | 		mat.name = name | ||
|  | 	return mat |