[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12642] trunk/blender/release/scripts/ wizard_curve2tree.py: made twig taper a float rather then a bool, added type conversion when loading settings.

Campbell Barton ideasman42 at gmail.com
Wed Nov 21 10:46:08 CET 2007


Revision: 12642
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12642
Author:   campbellbarton
Date:     2007-11-21 10:46:08 +0100 (Wed, 21 Nov 2007)

Log Message:
-----------
made twig taper a float rather then a bool, added type conversion when loading settings.

Modified Paths:
--------------
    trunk/blender/release/scripts/wizard_curve2tree.py

Modified: trunk/blender/release/scripts/wizard_curve2tree.py
===================================================================
--- trunk/blender/release/scripts/wizard_curve2tree.py	2007-11-21 08:13:00 UTC (rev 12641)
+++ trunk/blender/release/scripts/wizard_curve2tree.py	2007-11-21 09:46:08 UTC (rev 12642)
@@ -102,9 +102,14 @@
 		except:	return None
 	else:
 		return None
-		
-	
 
+def getGroupFromName(name):
+	if name:
+		try:	return bpy.data.groups[name]
+		except:	return None
+	else:
+		return None	
+
 def closestVecIndex(vec, vecls):
 	best= -1
 	best_dist = 100000000
@@ -271,7 +276,7 @@
 							twig_recursive_limit=3,\
 							twig_ob_bounds=None,\
 							twig_ob_bounds_prune=True,\
-							twig_ob_bounds_prune_taper=True,\
+							twig_ob_bounds_prune_taper=1.0,\
 							twig_placement_maxradius=10.0,\
 							twig_placement_maxtwig=0,\
 							twig_follow_parent=0.0,\
@@ -282,7 +287,6 @@
 							variation_seed = 1,\
 							variation_orientation = 0.0,\
 							variation_scale = 0.0,\
-							
 						):
 		'''
 		build tree data - fromCurve must run first
@@ -507,10 +511,10 @@
 							# we would not have been but here if the bounds were outside
 							if twig_ob_bounds_prune:
 								brch_twig.boundsTrim()
-								if twig_ob_bounds_prune_taper:
+								if twig_ob_bounds_prune_taper != 1.0:
 									# taper to a point. we could use some nice taper algo here - just linear atm.
 									
-									brch_twig.taper()
+									brch_twig.taper(twig_ob_bounds_prune_taper)
 						
 						# Make sure this dosnt mess up anything else
 						
@@ -1054,7 +1058,17 @@
 		
 		return self.mesh
 	
-	def toLeafMesh(self, mesh_leaf, leaf_branch_limit = 0.5, leaf_size = 0.5, leaf_fill=True, leaf_fill_count=1000, leaf_fill_ob_bounds=None):
+	def toLeafMesh(self, mesh_leaf,\
+			leaf_branch_limit = 0.5,\
+			leaf_size = 0.5,\
+			
+			leaf_fill=True,\
+			leaf_fill_count=1000,\
+			leaf_fill_ob_bounds=None,\
+			
+			leaf_dupliface=False,\
+			leaf_dupliface_fromgroup=None,\
+		):
 		
 		'''
 		return a mesh with leaves seperate from the tree
@@ -1125,7 +1139,6 @@
 					vec3 += no_pt
 					vec4 += no_pt
 					'''
-					cross
 					
 					faces_extend.append([len(verts_extend), len(verts_extend)+1, len(verts_extend)+2, len(verts_extend)+3])
 					verts_extend.extend([vec1, vec2, vec3, vec4])
@@ -1133,8 +1146,91 @@
 			
 			self.mesh_leaf.verts.extend(verts_extend)
 			self.mesh_leaf.faces.extend(faces_extend)
+		
+		
+		elif leaf_dupliface and leaf_dupliface_fromgroup:
+			
+			totpoints = 0
+			radius = 0.0
+			max_radius = 0.0
+			for brch in self.branches_all:
+				for pt in brch.bpoints:
+					radius += pt.radius
+					if pt.radius > max_radius:
+						max_radius = pt.radius
+				
+				#totpoints += len(brch.bpoints)
+			
+			radius_max = max_radius * leaf_branch_limit
+			
+			
+			verts_extend = []
+			faces_extend = []
+			
+			co1,co2,co3,co4 = Vector(),Vector(),Vector(),Vector()
+			
+			for brch in self.branches_all:
+				
+				# quick test, do we need leaves on this branch?
+				if brch.bpoints[-1].radius > radius_max:
+					continue
+				
+				count = 0
+				for pt in brch.bpoints:
+					if pt.childCount == 0 and pt.radius < radius_max:
+						# Ok we can add a leaf here. set the co's correctly
+						co1[:] = pt.co
+						co2[:] = pt.co
+						co3[:] = pt.co
+						co4[:] = pt.co
+						
+						cross_leafdir = CrossVecs( zup, pt.no )
+						cross_leafdir.length = leaf_size
 
+						
+						#cross_leafwidth = CrossVecs(pt.no, cross_leafdir)
+						
+						# Facing up
+						cross_leafwidth_up = CrossVecs(zup, cross_leafdir).normalize() * leaf_size
+						cross_leafwidth_aligned = pt.no
+						
+						#cross_leafwidth = (cross_leafwidth_up + cross_leafwidth_aligned)/2
+						cross_leafwidth = cross_leafwidth_aligned
+						
+						cross_leafwidth.length = leaf_size/2
+						
+						if count % 2:
+							cross_leafwidth.negate()
+							cross_leafdir.negate()
+						
+						co1 += cross_leafdir
+						co2 += cross_leafdir
+						
+						co2 += cross_leafwidth
+						co3 += cross_leafwidth
+						
+						co1 -= cross_leafwidth
+						co4 -= cross_leafwidth
+						
+						
+						i = len(verts_extend)
+						faces_extend.append( (i,i+1,i+2,i+3) )
+						verts_extend.extend([tuple(co1), tuple(co2), tuple(co3), tuple(co4)])
+						count += 1
 			
+			# setup dupli's
+			
+			leaf_dupliface_fromgroup
+			
+			self.mesh_leaf.verts.extend(verts_extend)
+			self.mesh_leaf.faces.extend(faces_extend)
+			
+			
+			
+			
+			
+			
+			
 		
 		'''
 		if 0:
@@ -1860,14 +1956,12 @@
 		
 		# Shorten the point list
 		self.bpoints = self.bpoints[:i]
-			
 		self.bpoints[-1].makeLast()
 	
-	def taper(self):
+	def taper(self, twig_ob_bounds_prune_taper = 0.0):
 		l = float(len( self.bpoints ))
-		
 		for i, pt in enumerate(self.bpoints):
-			pt.radius *= (l-i)/l
+			pt.radius *= (((l-i)/l) + (twig_ob_bounds_prune_taper*(i/l)) )
 	
 	def getParentBranch(self):
 		if not self.parent_pt:
@@ -2326,7 +2420,7 @@
 PREFS['twig_recursive_limit'] = Draw.Create(3)
 PREFS['twig_ob_bounds'] = Draw.Create('')
 PREFS['twig_ob_bounds_prune'] = Draw.Create(1)
-PREFS['twig_ob_bounds_prune_taper'] = Draw.Create(1)
+PREFS['twig_ob_bounds_prune_taper'] = Draw.Create(1.0)
 PREFS['twig_placement_maxradius'] = Draw.Create(10.0)
 PREFS['twig_placement_maxtwig'] = Draw.Create(4)
 PREFS['twig_follow_parent'] = Draw.Create(0.0)
@@ -2342,6 +2436,9 @@
 PREFS['leaf_branch_limit'] = Draw.Create(0.25)
 PREFS['leaf_size'] = Draw.Create(0.5)
 
+PREFS['leaf_dupliface'] = Draw.Create(0)
+PREFS['leaf_dupliface_fromgroup'] = Draw.Create('')
+
 PREFS['do_variation'] = Draw.Create(0)
 PREFS['variation_seed'] = Draw.Create(1)
 PREFS['variation_orientation'] = Draw.Create(0.0)
@@ -2379,8 +2476,22 @@
 	'''
 	for key in prefs: # items would be nice for id groups
 		val = prefs[key]
-		try:	new_prefs[key] = Blender.Draw.Create( val )
-		except:	new_prefs[key] = val
+		ok = True
+		
+		try:
+			# If we have this setting allredy but its a different type, use the old setting (converting int's to floats for instance)
+			new_val = new_prefs[key] # this may fail, thats ok
+			if (type(new_val)==Blender.Types.ButtonType) and (type(new_val.val) != type(val)):
+				ok = False
+		except:
+			pass
+		
+		if ok:
+			try:
+				new_prefs[key] = Blender.Draw.Create( val )
+			except:
+				new_prefs[key] = val
+		
 	return new_prefs
 
 def Prefs2IDProp(idprop, prefs):
@@ -2554,8 +2665,10 @@
 			mesh_leaf = ob_leaf.getData(mesh=1)
 			ob_leaf.setMatrix(Matrix())
 		
+		leaf_dupliface_fromgroup = getGroupFromName(PREFS['leaf_dupliface_fromgroup'].val)
+		
 		leaf_fill_ob_bounds = getObFromName(PREFS['leaf_fill_ob_bounds'].val)
-		print "LEAF!!!"
+
 		mesh_leaf = t.toLeafMesh(mesh_leaf,\
 			leaf_branch_limit = PREFS['leaf_branch_limit'].val,\
 			leaf_size = PREFS['leaf_size'].val,\
@@ -2563,7 +2676,16 @@
 			leaf_fill = PREFS['leaf_fill'].val,\
 			leaf_fill_count = PREFS['leaf_fill_count'].val,\
 			leaf_fill_ob_bounds = leaf_fill_ob_bounds,\
+			
+			leaf_dupliface = PREFS['leaf_dupliface'].val,\
+			leaf_dupliface_fromgroup = leaf_dupliface_fromgroup,\
 		)
+		
+		if PREFS['leaf_dupliface'].val and leaf_dupliface_fromgroup:
+			ob_leaf.enableDupliFaces = True
+			
+			parent.makeParent([ob_new])
+		
 	
 	mesh.calcNormals()
 	
@@ -2726,10 +2848,19 @@
 	try:
 		bpy.data.objects[v]
 	except:
-		PREFS['twig_ob_bounds'].val = ''
+		# PREFS['twig_ob_bounds'].val = ''
 		Draw.PupMenu('Object dosnt exist!')
 		Draw.Redraw()
 
+def do_group_check(e,v):
+	if not v: return
+	try:
+		bpy.data.groups[v]
+	except:
+		# PREFS['leaf_dupliface_fromgroup'].val = ''
+		Draw.PupMenu('dosnt exist!')
+		Draw.Redraw()
+
 # Button callbacks
 def do_active_image(e,v):
 	img = bpy.data.images.active
@@ -2879,9 +3010,8 @@
 		
 		PREFS['twig_ob_bounds_prune'] =	Draw.Toggle('Prune',EVENT_UPDATE_AND_UI, xtmp, y, but_width_tmp, but_height, PREFS['twig_ob_bounds_prune'].val,	'Prune twigs to the mesh object bounds'); xtmp += but_width_tmp;
 		if PREFS['twig_ob_bounds_prune'].val:
-			PREFS['twig_ob_bounds_prune_taper'] =	Draw.Toggle('Taper',EVENT_UPDATE_AND_UI, xtmp, y, but_width, but_height, PREFS['twig_ob_bounds_prune_taper'].val,	'Taper pruned branches to a point'); xtmp += but_width;
+			PREFS['twig_ob_bounds_prune_taper'] =	Draw.Number('Taper',	EVENT_UPDATE_AND_UI, xtmp, y, but_width, but_height, PREFS['twig_ob_bounds_prune_taper'].val, 0.0, 1.0,	'Taper pruned branches to a point'); xtmp += but_width;
 		
-		
 		#PREFS['image_main'] =	Draw.String('IM: ',	EVENT_UPDATE, xtmp, y, but_width*3, but_height, PREFS['image_main'].val, 64,	'Image to apply to faces'); xtmp += but_width*3;
 		#Draw.PushButton('Use Active',	EVENT_UPDATE, xtmp, y, but_width, but_height,	'Get the image from the active image window', do_active_image); xtmp += but_width;
 	Blender.Draw.EndAlign()
@@ -2923,6 +3053,17 @@
 			PREFS['leaf_fill_count'] =	Draw.Number('Fill #',	EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['leaf_fill_count'].val, 10, 100000,	'Number of leaves to fill in'); xtmp += but_width*2;
 			PREFS['leaf_size'] =	Draw.Number('Size',	EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['leaf_size'].val, 0.001, 10.0,	'size of the leaf'); xtmp += but_width*2;
 		
+		# ---------- ---------- ---------- ----------
+		y-=but_height
+		xtmp = x
+		
+		'''
+		PREFS['leaf_dupliface'] =	Draw.Toggle('DupliLeaf', EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['leaf_dupliface'].val,		'Fill an object with leaves'); xtmp += but_width*2;
+		
+		if PREFS['leaf_dupliface'].val:
+			PREFS['leaf_dupliface_fromgroup'] =	Draw.String('group: ',	EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['leaf_dupliface_fromgroup'].val, 64,	'Pick objects from this group to use as leaves', do_group_check); xtmp += but_width*2;
+		'''
+		
 	Blender.Draw.EndAlign()
 	
 	y-=but_height+MARGIN
@@ -3115,6 +3256,6 @@
 
 if __name__ == '__main__':
 	# Read the active objects prefs on load. if they exist
-	do_pref_read(quiet=True)
+	do_pref_read(quiet=False)
 	
 	Draw.Register(gui, evt, bevt)





More information about the Bf-blender-cvs mailing list