[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22286] branches/blender2.5/blender: Povray

Campbell Barton ideasman42 at gmail.com
Fri Aug 7 03:05:33 CEST 2009


Revision: 22286
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22286
Author:   campbellbarton
Date:     2009-08-07 03:05:33 +0200 (Fri, 07 Aug 2009)

Log Message:
-----------
Povray
* Sun lamp type export (known as parallel lights in povray)
* Native support for blenders metaballs, currently exports
 - ball and ellipsoid types
 - radius, stiffness
 - ellipsoid xyz scale
 - negative elements
 - single material (like blender)

Renamed rna props.
 elem.sizex -> size_x
 mball.last_selected_element ->  mball.active_element

minor changes to UI scripts.

Modified Paths:
--------------
    branches/blender2.5/blender/release/io/engine_render_pov.py
    branches/blender2.5/blender/release/ui/buttons_data_metaball.py
    branches/blender2.5/blender/release/ui/buttons_material.py
    branches/blender2.5/blender/release/ui/buttons_object_constraint.py
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_meta.c

Modified: branches/blender2.5/blender/release/io/engine_render_pov.py
===================================================================
--- branches/blender2.5/blender/release/io/engine_render_pov.py	2009-08-07 00:51:41 UTC (rev 22285)
+++ branches/blender2.5/blender/release/io/engine_render_pov.py	2009-08-07 01:05:33 UTC (rev 22286)
@@ -19,8 +19,9 @@
 	# Only for testing
 	if not scene:
 		scene = bpy.data.scenes[0]
-		
+	
 	render = scene.render_data
+	world = scene.world
 	materialTable = {}
 	
 	def saneName(name):
@@ -33,6 +34,39 @@
 		file.write('\tmatrix <%.6f, %.6f, %.6f,  %.6f, %.6f, %.6f,  %.6f, %.6f, %.6f,  %.6f, %.6f, %.6f>\n' %\
 		(matrix[0][0], matrix[0][1], matrix[0][2],  matrix[1][0], matrix[1][1], matrix[1][2],  matrix[2][0], matrix[2][1], matrix[2][2],  matrix[3][0], matrix[3][1], matrix[3][2]) )
 	
+	def blenderMaterialToPovString(material):
+		povstring = 'finish {'
+		if world != None:
+			povstring += 'ambient <%.6f, %.6f, %.6f> ' % tuple([c*material.ambient for c in world.ambient_color])
+		
+		povstring += 'diffuse %.6f ' % material.diffuse_reflection
+		povstring += 'specular %.6f ' % material.specular_reflection
+		
+		
+		if material.raytrace_mirror.enabled:
+			#povstring += 'interior { ior %.6f } ' % material.IOR
+			raytrace_mirror= material.raytrace_mirror
+			if raytrace_mirror.reflect:
+				povstring += 'reflection {'
+				povstring += '<%.6f, %.6f, %.6f>' % tuple(material.mirror_color) # Should ask for ray mirror flag
+				povstring += 'fresnel 1 falloff %.6f exponent %.6f metallic %.6f} ' % (raytrace_mirror.fresnel, raytrace_mirror.fresnel_fac, raytrace_mirror.reflect)
+			
+			
+				
+		if material.raytrace_transparency.enabled:
+			#povstring += 'interior { ior %.6f } ' % material.IOR
+			pass
+		
+		#file.write('\t\troughness %.6f\n' % (material.hard*0.5))
+		#file.write('\t\t\tcrand 0.0\n') # Sand granyness
+		#file.write('\t\t\tmetallic %.6f\n' % material.spec)
+		#file.write('\t\t\tphong %.6f\n' % material.spec)
+		#file.write('\t\t\tphong_size %.6f\n' % material.spec)
+		povstring += 'brilliance %.6f ' % (material.specular_hardness/256.0) # Like hardness
+		povstring += '}'
+		#file.write('\t}\n')
+		return povstring
+	
 	def exportCamera():
 		camera = scene.camera
 		matrix = camera.matrix
@@ -79,6 +113,10 @@
 				file.write('\ttightness 0\n') # 0:10f
 				
 				file.write('\tpoint_at  <0, 0, -1>\n')
+			elif lamp.type == 'SUN':
+				file.write('\tparallel\n')
+				file.write('\tpoint_at  <0, 0, -1>\n') # *must* be after 'parallel'
+				
 			elif lamp.type == 'AREA':
 				
 				size_x = lamp.size
@@ -109,48 +147,69 @@
 			
 			file.write('}\n')
 	
-	def exportMeshs(sel):
-		def bMat2PovString(material):
-			povstring = 'finish {'
-			if world != None:
-				povstring += 'ambient <%.6f, %.6f, %.6f> ' % tuple([c*material.ambient for c in world.ambient_color])
+	def exportMeta(metas):
+		
+		# TODO - blenders 'motherball' naming is not supported.
+		
+		for ob in metas:
+			meta = ob.data
 			
-			povstring += 'diffuse %.6f ' % material.diffuse_reflection
-			povstring += 'specular %.6f ' % material.specular_reflection
+			file.write('blob {\n')
+			file.write('\t\tthreshold %.4g\n' % meta.threshold)
 			
+			try:
+				material= meta.materials[0] # lame! - blender cant do enything else.
+			except:
+				material= None
 			
-			if material.raytrace_mirror.enabled:
-				#povstring += 'interior { ior %.6f } ' % material.IOR
-				raytrace_mirror= material.raytrace_mirror
-				if raytrace_mirror.reflect:
-					povstring += 'reflection {'
-					povstring += '<%.6f, %.6f, %.6f>' % tuple(material.mirror_color) # Should ask for ray mirror flag
-					povstring += 'fresnel 1 falloff %.6f exponent %.6f metallic %.6f} ' % (raytrace_mirror.fresnel, raytrace_mirror.fresnel_fac, raytrace_mirror.reflect)
+			for elem in meta.elements:
 				
+				if elem.type not in ('BALL', 'ELLIPSOID'):
+					continue # Not supported
 				
+				loc = elem.location
+				
+				stiffness= elem.stiffness
+				if elem.negative:
+					stiffness = -stiffness
+				
+				if elem.type == 'BALL':
 					
-			if material.raytrace_transparency.enabled:
-				#povstring += 'interior { ior %.6f } ' % material.IOR
-				pass
+					file.write('\tsphere { <%.6g, %.6g, %.6g>, %.4g, %.4g ' % (loc.x, loc.y, loc.z, elem.radius, stiffness))
+					
+					# After this wecould do something simple like...
+					# 	"pigment {Blue} }"
+					# except we'll write the color
+				
+				elif elem.type == 'ELLIPSOID':
+					# location is modified by scale
+					file.write('\tsphere { <%.6g, %.6g, %.6g>, %.4g, %.4g ' % (loc.x/elem.size_x, loc.y/elem.size_y, loc.z/elem.size_z, elem.radius, stiffness))
+					file.write(	'scale <%.6g, %.6g, %.6g> ' % (elem.size_x, elem.size_y, elem.size_z))
+				
+				if material:
+					# materialString = materialTable[material.name]
+					diffuse_color = material.diffuse_color
+					
+					file.write(
+						'pigment {rgbf<%.3g, %.3g, %.3g, %.3g>} }\n' % \
+						(diffuse_color[0], diffuse_color[1], diffuse_color[2], 1-material.alpha)
+					)
+				else:
+					file.write('}\n')
 			
-			#file.write('\t\troughness %.6f\n' % (material.hard*0.5))
-			#file.write('\t\t\tcrand 0.0\n') # Sand granyness
-			#file.write('\t\t\tmetallic %.6f\n' % material.spec)
-			#file.write('\t\t\tphong %.6f\n' % material.spec)
-			#file.write('\t\t\tphong_size %.6f\n' % material.spec)
-			povstring += 'brilliance %.6f ' % (material.specular_hardness/256.0) # Like hardness
-			povstring += '}'
-			#file.write('\t}\n')
-			return povstring
+			# Write the finish last.
+			if material:
+				file.write('\t%s\n' % materialTable[material.name])
+
+			writeMatrix(ob.matrix)
 			
+			file.write('}\n')
 		
-		world = scene.world
 		
-		# Convert all materials to strings we can access directly per vertex.
-		for material in bpy.data.materials:
-			materialTable[material.name] = bMat2PovString(material)
+	
+	
+	def exportMeshs(sel):
 		
-		
 		ob_num = 0
 		
 		for ob in sel:
@@ -452,11 +511,15 @@
 		file.write('}\n')
 	
 	
+	# Convert all materials to strings we can access directly per vertex.
+	for material in bpy.data.materials:
+		materialTable[material.name] = blenderMaterialToPovString(material)
+	
 	exportCamera()
 	#exportMaterials()
 	sel = scene.objects
-	lamps = [l for l in sel if l.type == 'LAMP']
-	exportLamps(lamps)
+	exportLamps([l for l in sel if l.type == 'LAMP'])
+	exportMeta([l for l in sel if l.type == 'META'])
 	exportMeshs(sel)
 	exportWorld(scene.world)
 	exportGlobalSettings(scene)

Modified: branches/blender2.5/blender/release/ui/buttons_data_metaball.py
===================================================================
--- branches/blender2.5/blender/release/ui/buttons_data_metaball.py	2009-08-07 00:51:41 UTC (rev 22285)
+++ branches/blender2.5/blender/release/ui/buttons_data_metaball.py	2009-08-07 01:05:33 UTC (rev 22286)
@@ -54,12 +54,12 @@
 	__label__ = "Active Element"
 	
 	def poll(self, context):
-		return (context.meta_ball and context.meta_ball.last_selected_element)
+		return (context.meta_ball and context.meta_ball.active_element)
 
 	def draw(self, context):
 		layout = self.layout
 		
-		metaelem = context.meta_ball.last_selected_element
+		metaelem = context.meta_ball.active_element
 		
 		split = layout.split(percentage=0.3)
 		split.itemL(text="Type:")	
@@ -81,30 +81,30 @@
 		
 			col = split.column(align=True)
 			col.itemL(text="Size:")	
-			col.itemR(metaelem, "sizex", text="X")
-			col.itemR(metaelem, "sizey", text="Y")
-			col.itemR(metaelem, "sizez", text="Z")
+			col.itemR(metaelem, "size_x", text="X")
+			col.itemR(metaelem, "size_y", text="Y")
+			col.itemR(metaelem, "size_z", text="Z")
 			
 		elif metaelem.type == 'TUBE':
 		
 			col = split.column(align=True)
 			col.itemL(text="Size:")	
-			col.itemR(metaelem, "sizex", text="X")
+			col.itemR(metaelem, "size_x", text="X")
 			
 		elif metaelem.type == 'PLANE':
 			
 			col = split.column(align=True)
 			col.itemL(text="Size:")	
-			col.itemR(metaelem, "sizex", text="X")
-			col.itemR(metaelem, "sizey", text="Y")
+			col.itemR(metaelem, "size_x", text="X")
+			col.itemR(metaelem, "size_y", text="Y")
 			
 		elif metaelem.type == 'ELLIPSOID':
 			
 			col = split.column(align=True)
 			col.itemL(text="Size:")	
-			col.itemR(metaelem, "sizex", text="X")
-			col.itemR(metaelem, "sizey", text="Y")
-			col.itemR(metaelem, "sizez", text="Z")
+			col.itemR(metaelem, "size_x", text="X")
+			col.itemR(metaelem, "size_y", text="Y")
+			col.itemR(metaelem, "size_z", text="Z")
 		
 
 bpy.types.register(DATA_PT_context_metaball)

Modified: branches/blender2.5/blender/release/ui/buttons_material.py
===================================================================
--- branches/blender2.5/blender/release/ui/buttons_material.py	2009-08-07 00:51:41 UTC (rev 22285)
+++ branches/blender2.5/blender/release/ui/buttons_material.py	2009-08-07 01:05:33 UTC (rev 22286)
@@ -207,7 +207,8 @@
 	COMPAT_ENGINES = set(['BLENDER_RENDER', 'BLENDER_GAME'])
 
 	def poll(self, context):
-		return (context.material.type != 'HALO') and (context.scene.render_data.engine in self.COMPAT_ENGINES)
+		mat = context.material
+		return mat and (mat.type != 'HALO') and (context.scene.render_data.engine in self.COMPAT_ENGINES)
 
 	def draw(self, context):
 		layout = self.layout
@@ -260,7 +261,8 @@
 	COMPAT_ENGINES = set(['BLENDER_RENDER', 'BLENDER_GAME'])
 
 	def poll(self, context):
-		return (context.material.type != 'HALO') and (context.scene.render_data.engine in self.COMPAT_ENGINES)
+		mat = context.material
+		return mat and (mat.type != 'HALO') and (context.scene.render_data.engine in self.COMPAT_ENGINES)
 
 	def draw(self, context):
 		layout = self.layout
@@ -311,7 +313,8 @@
 	COMPAT_ENGINES = set(['BLENDER_RENDER'])
 	
 	def poll(self, context):
-		return (context.material.type in ('SURFACE', 'WIRE')) and (context.scene.render_data.engine in self.COMPAT_ENGINES)
+		mat = context.material
+		return mat and (mat.type in ('SURFACE', 'WIRE')) and (context.scene.render_data.engine in self.COMPAT_ENGINES)
 
 	def draw_header(self, context):
 		layout = self.layout
@@ -352,7 +355,8 @@
 	COMPAT_ENGINES = set(['BLENDER_RENDER'])
 	
 	def poll(self, context):
-		return (context.material.type in 'SURFACE', 'WIRE') and (context.scene.render_data.engine in self.COMPAT_ENGINES)
+		mat = context.material
+		return mat and (mat.type in 'SURFACE', 'WIRE') and (context.scene.render_data.engine in self.COMPAT_ENGINES)
 	
 	def draw_header(self, context):
 		layout = self.layout
@@ -403,7 +407,8 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list