[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12644] trunk/blender/release/scripts/ wizard_curve2tree.py: initial support for leaves as duplifaces as well as some a bugfix for loading settings
Campbell Barton
ideasman42 at gmail.com
Wed Nov 21 17:07:48 CET 2007
Revision: 12644
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12644
Author: campbellbarton
Date: 2007-11-21 17:07:47 +0100 (Wed, 21 Nov 2007)
Log Message:
-----------
initial support for leaves as duplifaces as well as some a bugfix for 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 11:53:30 UTC (rev 12643)
+++ trunk/blender/release/scripts/wizard_curve2tree.py 2007-11-21 16:07:47 UTC (rev 12644)
@@ -123,6 +123,17 @@
return best
+IRATIONAL_NUM = 22.0/7.0
+def next_random_num(rnd):
+ '''
+ return a random number between 0.0 and 1.0
+ '''
+ rnd[0] += (rnd[0] * IRATIONAL_NUM) % 1
+ # prevent
+ if rnd[0] > 1000000:
+ rnd[0]-=1000000
+ return rnd[0] % 1
+
eul = 0.00001
class tree:
@@ -353,23 +364,13 @@
if do_variation:
irational_num = 22.0/7.0 # use to make the random number more odd
rnd = [variation_seed]
- def next_random_num():
- '''
- return a random number between 0.0 and 1.0
- '''
-
- rnd[0] += (rnd[0] * irational_num) % 1
- # prevent
- if rnd[0] > 1000000:
- rnd[0]-=1000000
- return rnd[0] % 1
# Add children temporarily
for brch in self.branches_all:
if brch.parent_pt:
- rnd_rot = ((next_random_num() * variation_orientation) - 0.5) * 720
+ rnd_rot = ((next_random_num(rnd) * variation_orientation) - 0.5) * 720
mat_orientation = RotationMatrix(rnd_rot, 3, 'r', brch.parent_pt.no)
- rnd_sca = 1 + ((next_random_num()-0.5)* variation_scale )
+ rnd_sca = 1 + ((next_random_num(rnd)-0.5)* variation_scale )
mat_scale = Matrix([rnd_sca,0,0],[0,rnd_sca,0],[0,0,rnd_sca])
# mat_orientation = RotationMatrix(0, 3, 'r', brch.parent_pt.no)
brch.transformRecursive(self, mat_scale * mat_orientation, brch.parent_pt.co)
@@ -1058,6 +1059,7 @@
def toLeafMesh(self, mesh_leaf,\
leaf_branch_limit = 0.5,\
+ leaf_branch_limit_rand = 0.8,\
leaf_size = 0.5,\
leaf_fill=True,\
@@ -1167,39 +1169,59 @@
co1,co2,co3,co4 = Vector(),Vector(),Vector(),Vector()
+ rnd_seed = [1.0] # could have seed as an input setting
+
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:
+ if leaf_branch_limit_rand:
+ # (-1 : +1) * leaf_branch_limit_rand
+ rnd = 1 + (((next_random_num(rnd_seed) - 0.5) * 2 ) * leaf_branch_limit_rand)
+ else:
+ rnd = 1.0
+
+ if pt.childCount == 0 and (pt.radius * rnd) < 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_leafdir.length = (leaf_size/2) ### * pt.radius
+
+ # Rotate the
+ # Align this with the existing branch
+ rotate = RotationMatrix( (next_random_num(rnd_seed)-0.5) * 360, 3, 'r', pt.no )
+
+ cross_leafdir = cross_leafdir * rotate
+
#cross_leafwidth = CrossVecs(pt.no, cross_leafdir)
# Facing up
- cross_leafwidth_up = CrossVecs(zup, cross_leafdir).normalize() * leaf_size
+ cross_leafwidth_up = CrossVecs(zup, cross_leafdir).normalize() * leaf_size * pt.radius
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
+ cross_leafwidth.length = (leaf_size/2) ### *pt.radius
+ # base width
co1 += cross_leafdir
co2 += cross_leafdir
+ co3 -= cross_leafdir
+ co4 -= cross_leafdir
+ # base hight allong the branch
co2 += cross_leafwidth
co3 += cross_leafwidth
@@ -1207,6 +1229,7 @@
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)])
@@ -2432,6 +2455,7 @@
PREFS['leaf_fill_ob_bounds'] = Draw.Create('')
PREFS['leaf_branch_limit'] = Draw.Create(0.25)
+PREFS['leaf_branch_limit_rand'] = Draw.Create(0.1)
PREFS['leaf_size'] = Draw.Create(0.5)
PREFS['leaf_dupliface'] = Draw.Create(0)
@@ -2451,6 +2475,8 @@
objects = []
ob_act = sce.objects.active
for ob in sce.objects.context:
+ if ob == ob_act: ob_act = None
+
if ob.type != 'Curve':
ob = ob.parent
if not ob or ob.type != 'Curve':
@@ -2458,7 +2484,7 @@
objects.append(ob)
# Alredy delt with
- if ob == ob_act: ob_act = None
+
# Add the active, important when using localview or local layers
if ob_act:
@@ -2516,12 +2542,14 @@
idprop[ID_SLOT_NAME] = new_prefs
def IDProp2Prefs(idprop, prefs):
- try: prefs = idprop[ID_SLOT_NAME]
- except: return False
+ prefs = idprop[ID_SLOT_NAME]
+ try:
+ prefs = idprop[ID_SLOT_NAME]
+ except:
+ return False
Dict2Prefs(prefs, PREFS)
return True
-
def buildTree(ob_curve, single=False):
'''
Must be a curve object, write to a child mesh
@@ -2530,6 +2558,7 @@
print 'Curve2Tree, starting...'
# if were only doing 1 object, just use the current prefs
prefs = {}
+
if single or not (IDProp2Prefs(ob_curve.properties, prefs)):
prefs = PREFS
@@ -2684,6 +2713,7 @@
mesh_leaf = t.toLeafMesh(mesh_leaf,\
leaf_branch_limit = PREFS['leaf_branch_limit'].val,\
+ leaf_branch_limit_rand = PREFS['leaf_branch_limit_rand'].val,\
leaf_size = PREFS['leaf_size'].val,\
leaf_fill = PREFS['leaf_fill'].val,\
@@ -2898,8 +2928,10 @@
if is_editmode:
Blender.Window.EditMode(0, '', 0)
Blender.Window.WaitCursor(1)
+
for ob in objects:
buildTree(ob, len(objects)==1)
+
Blender.Window.WaitCursor(0)
if is_editmode:
Blender.Window.EditMode(1, '', 0)
@@ -2965,7 +2997,6 @@
# ---------- ---------- ---------- ----------
-
Blender.Draw.BeginAlign()
PREFS['do_twigs'] = Draw.Toggle('Generate Twigs',EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['do_twigs'].val, 'Generate child branches based existing branches'); xtmp += but_width*2;
if PREFS['do_twigs'].val:
@@ -3002,7 +3033,7 @@
# ---------- ---------- ---------- ----------
- PREFS['twig_placement_maxradius'] = Draw.Number('Place Max Radius', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_placement_maxradius'].val, 0.0, 50.0, 'Limit twig placement to branches with this maximum radius'); xtmp += but_width*2;
+ PREFS['twig_placement_maxradius'] = Draw.Number('Place Max Radius', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_placement_maxradius'].val, 0.0, 50.0, 'Only place twigs on branches below this radius'); xtmp += but_width*2;
PREFS['twig_placement_maxtwig'] = Draw.Number('Place Max Count', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_placement_maxtwig'].val, 0.0, 50.0, 'Limit twig placement to this many per branch'); xtmp += but_width*2;
y-=but_height
@@ -3044,11 +3075,7 @@
if PREFS['do_leaf'].val:
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;
-
- # Dont use yet
- # PREFS['leaf_branch_limit'] = Draw.Number('Branch Limit', EVENT_UPDATE, xtmp, y, but_width*4, but_height, PREFS['leaf_branch_limit'].val, 0.1, 2.0, 'Maximum thichness where a branch can bare leaves'); xtmp += but_width*4;
-
if PREFS['leaf_fill'].val == 0:
but_width_tmp = but_width*2
else:
@@ -3078,7 +3105,10 @@
y-=but_height
xtmp = x
- '''
+
+
+
+
if PREFS['leaf_dupliface'].val == 1:
but_width_tmp = but_width*2
else:
@@ -3087,7 +3117,14 @@
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;
- '''
+
+ # ---------- ---------- ---------- ----------
+ y-=but_height
+ xtmp = x
+
+ # Dont use yet
+ PREFS['leaf_branch_limit'] = Draw.Number('Branch Limit', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['leaf_branch_limit'].val, 0.0, 1.0, 'Maximum thichness where a branch can bare leaves'); xtmp += but_width*2;
+ PREFS['leaf_branch_limit_rand'] = Draw.Number('Limit Random', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['leaf_branch_limit_rand'].val, 0.0, 1.0, 'Randomize the starting of leaves'); xtmp += but_width*2;
Blender.Draw.EndAlign()
More information about the Bf-blender-cvs
mailing list