[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12581] trunk/blender/release/scripts/ wizard_curve2tree.py: - bounding meshes with loc/size/rot didnt work.
Campbell Barton
ideasman42 at gmail.com
Tue Nov 13 22:32:53 CET 2007
Revision: 12581
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12581
Author: campbellbarton
Date: 2007-11-13 22:32:53 +0100 (Tue, 13 Nov 2007)
Log Message:
-----------
- bounding meshes with loc/size/rot didnt work.
- better sorting of twigs (for recursive twigs)
- An option to lengthen child twigs.
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-13 19:15:10 UTC (rev 12580)
+++ trunk/blender/release/scripts/wizard_curve2tree.py 2007-11-13 21:32:53 UTC (rev 12581)
@@ -102,6 +102,7 @@
self.mesh = None
self.armature = None
self.objectCurve = None
+ self.objectCurveMat = None
self.objectTwigBounds = None # use for twigs only at the moment.
self.objectTwigBoundsIMat = None
self.objectTwigBoundsMesh = None
@@ -122,6 +123,7 @@
def fromCurve(self, objectCurve):
# Now calculate the normals
self.objectCurve = objectCurve
+ self.objectCurveMat = objectCurve.matrixWorld
curve = objectCurve.data
steps = curve.resolu # curve resolution
@@ -187,12 +189,13 @@
self.objectTwigBounds = objectMesh
self.objectTwigBoundsMesh = objectMesh.getData(mesh=1)
self.objectTwigBoundsIMat = objectMesh.matrixWorld.copy().invert()
+ #self.objectTwigBoundsIMat = objectMesh.matrixWorld.copy()
for brch in self.branches_all:
brch.calcTwigBounds(self)
def isPointInTwigBounds(self, co):
- return self.objectTwigBoundsMesh.pointInside(co ) #* self.objectTwigBoundsIMat)
+ return self.objectTwigBoundsMesh.pointInside(co * self.objectCurveMat * self.objectTwigBoundsIMat)
def resetTags(self, value):
for brch in self.branches_all:
@@ -204,7 +207,9 @@
do_twigs = False,\
twig_ratio = 2.0,\
twig_scale = 0.8,\
+ twig_lengthen = 1.0,\
twig_random_orientation = 180,\
+ twig_random_angle = 33,\
twig_recursive=True,\
twig_ob_bounds=None,\
twig_ob_bounds_prune=True,\
@@ -300,22 +305,28 @@
for tmp_sortval, twig_pt_index, brch_parent in branches_twig_sort: # tmp_sortval is not used.
if twig_pt_index != -1:
-
- ###print "\tFor",
- ###print brch_twig_index, len(self.branches_twigs)
if brch_twig_index >= len(self.branches_twigs):
break
brch_twig = self.branches_twigs[brch_twig_index]
-
parent_pt = brch_parent.bpoints[twig_pt_index]
- #if parent_pt.inTwigBounds == False:
- # raise "Error"
-
brch_twig.parent_pt = parent_pt
parent_pt.childCount += 1
+ # Scale this twig using this way...
+ # The size of the parent, scaled by the parent point's radius,
+ # ...compared to the parent branch;s root point radius.
+ # Also take into account the length of the parent branch
+ # Use this for pretend random numbers too.
+ scale = twig_scale * (parent_pt.branch.bpoints[0].radius / brch_twig.bpoints[0].radius) * (parent_pt.radius / parent_pt.branch.bpoints[0].radius)
+
+ # Random orientation
+ # THIS IS NOT RANDOM - Dont be real random so we can always get re-produceale results.
+ rnd1 = (((irational_num * scale * 10000000) % 360) - 180) * twig_random_orientation
+ rnd2 = (((irational_num * scale * 66666666) % 360) - 180) * twig_random_angle
+
+
# Align this with the existing branch
angle = AngleBetweenVecs(zup, parent_pt.no)
cross = CrossVecs(zup, parent_pt.no)
@@ -331,26 +342,18 @@
# Should add a UI for this... only happens when twigs come off a root branch
angle = 66
- mat_branch_angle = RotationMatrix(angle, 3, 'r', cross)
-
- # Scale this twig using this way...
- # The size of the parent, scaled by the parent point's radius,
- # ...compared to the parent branch;s root point radius.
- # Also take into account the length of the parent branch
- scale = twig_scale * (parent_pt.branch.bpoints[0].radius / brch_twig.bpoints[0].radius) * (parent_pt.radius / parent_pt.branch.bpoints[0].radius)
+ mat_branch_angle = RotationMatrix(angle+rnd1, 3, 'r', cross)
mat_scale = Matrix([scale,0,0],[0,scale,0],[0,0,scale])
- # Random orientation
- # THIS IS NOT RANDOM - Dont be real random so we can always get re-produceale results.
- # Number b
- rnd = (((irational_num * scale * 10000000) % 360) - 180) * twig_random_orientation
+ mat_orientation = RotationMatrix(rnd2, 3, 'r', parent_pt.no)
- mat_orientation = RotationMatrix(rnd, 3, 'r', parent_pt.no)
+ if twig_lengthen != 1.0:
+ # adjust length - no radius adjusting
+ for pt in brch_twig.bpoints:
+ pt.co *= twig_lengthen
brch_twig.transform(mat_scale * mat_branch_angle * mat_align * mat_orientation, parent_pt.co)
-
-
# When using a bounding mesh, clip and calculate points in bounds.
#print "Attempting to trim base"
brch_twig.baseTrim(base_trim)
@@ -363,15 +366,9 @@
brch_twig.boundsTrim()
if twig_ob_bounds_prune_taper:
- # taper to a point.
+ # taper to a point. we could use some nice taper algo here - just linear atm.
brch_twig.taper()
-
-
-
-
-
-
# Make sure this dosnt mess up anything else
brch_twig_index += 1
@@ -526,9 +523,13 @@
'''
if mesh:
self.mesh = mesh
+ materials = mesh.materials
mesh.verts = None
for group in mesh.getVertGroupNames():
mesh.removeVertGroup(group)
+
+ # Add materials back
+ mesh.materials = materials
else:
self.mesh = bpy.data.meshes.new()
@@ -1492,8 +1493,10 @@
return False
- def transform(self, mat, loc=None):
- scale = (xyzup * mat).length
+ def transform(self, mat, loc=None, scale=None):
+ if scale==None:
+ scale = (xyzup * mat).length
+
for pt in self.bpoints:
if loc:
pt.co = (pt.co * mat) + loc
@@ -1556,7 +1559,8 @@
# raise "Error"
# This value is only used for sorting, so the lower the value - the sooner it gets a twig.
- sort_val = -best_val + (1/self.getLength())
+ #sort_val = -best_val + (1/self.getLength())
+ sort_val=self.getLength()
return sort_val, best_index, self
@@ -1829,7 +1833,9 @@
PREFS['do_twigs'] = Draw.Create(1)
PREFS['twig_ratio'] = Draw.Create(2.0)
PREFS['twig_scale'] = Draw.Create(0.8)
+PREFS['twig_lengthen'] = Draw.Create(1.0)
PREFS['twig_random_orientation'] = Draw.Create(180)
+PREFS['twig_random_angle'] = Draw.Create(33)
PREFS['twig_recursive'] = Draw.Create(1)
PREFS['twig_ob_bounds'] = Draw.Create('')
PREFS['twig_ob_bounds_prune'] = Draw.Create(1)
@@ -1970,7 +1976,9 @@
do_twigs = PREFS['do_twigs'].val,\
twig_ratio = PREFS['twig_ratio'].val,\
twig_scale = PREFS['twig_scale'].val,\
+ twig_lengthen = PREFS['twig_lengthen'].val,\
twig_random_orientation = PREFS['twig_random_orientation'].val,\
+ twig_random_angle = PREFS['twig_random_angle'].val,\
twig_recursive = PREFS['twig_recursive'].val,\
twig_ob_bounds = twig_ob_bounds,\
twig_ob_bounds_prune = PREFS['twig_ob_bounds_prune'].val,\
@@ -2150,10 +2158,10 @@
is_editmode = Blender.Window.EditMode()
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)
@@ -2255,17 +2263,27 @@
if PREFS['do_twigs'].val:
PREFS['twig_recursive'] = Draw.Toggle('Recursive Twigs',EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['twig_recursive'].val, 'Recursively add twigs into eachother'); xtmp += but_width*2;
+ y-=but_height
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ PREFS['twig_ratio'] = Draw.Number('Twig Multiply', EVENT_UPDATE, xtmp, y, but_width*4, but_height, PREFS['twig_ratio'].val, 0.01, 500.0, 'How many twigs to generate per branch'); xtmp += but_width*4;
y-=but_height
xtmp = x
- PREFS['twig_ratio'] = Draw.Number('Twig Ratio', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_ratio'].val, 0.01, 100.0, 'How many twigs to generate per branch'); xtmp += but_width*2;
+ # ---------- ---------- ---------- ----------
+
PREFS['twig_scale'] = Draw.Number('Twig Scale', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_scale'].val, 0.01, 1.0, 'Scale down twigs in relation to their parents each generation'); xtmp += but_width*2;
+ PREFS['twig_lengthen'] = Draw.Number('Twig Lengthen', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_lengthen'].val, 0.01, 20.0, 'Scale the twig length only (not thickness)'); xtmp += but_width*2;
y-=but_height
xtmp = x
+
# ---------- ---------- ---------- ----------
- PREFS['twig_random_orientation'] = Draw.Number('Rand Orientation', EVENT_UPDATE, xtmp, y, but_width*4, but_height, PREFS['twig_random_orientation'].val, 0.0, 360.0, 'Random rotation around the parent'); xtmp += but_width*4;
+ PREFS['twig_random_orientation'] = Draw.Number('Rand Orientation', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_random_orientation'].val, 0.0, 360.0, 'Random rotation around the parent'); xtmp += but_width*2;
+ PREFS['twig_random_angle'] = Draw.Number('Rand Angle', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_random_angle'].val, 0.0, 360.0, 'Random rotation to the parent joint'); xtmp += but_width*2;
+
#PREFS['uv_y_scale'] = Draw.Number('Scale V', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['uv_y_scale'].val, 0.01, 10.0, 'Edge loop spacing around branch join, lower value for less webed joins'); xtmp += but_width*2;
y-=but_height
@@ -2357,14 +2375,14 @@
# ---------- ---------- ---------- ----------
Blender.Draw.BeginAlign()
- Draw.PushButton('Read Active Prefs', EVENT_REDRAW, xtmp, y, but_width*2, but_height, 'Read the ID Property settings from the active object', do_pref_read); xtmp += but_width*2;
- Draw.PushButton('Write Prefs to Sel', EVENT_NONE, xtmp, y, but_width*2, but_height, 'Save these settings in the ID Properties of all selected objects', do_pref_write); xtmp += but_width*2;
+ Draw.PushButton('Read Active Prefs', EVENT_REDRAW, xtmp, y, but_width*2, but_height, 'Read the ID Property settings from the active curve object', do_pref_read); xtmp += but_width*2;
+ Draw.PushButton('Write Prefs to Sel', EVENT_NONE, xtmp, y, but_width*2, but_height, 'Save these settings in the ID Properties of all selected curve objects', do_pref_write); xtmp += but_width*2;
y-=but_height
xtmp = x
# ---------- ---------- ---------- ----------
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list