Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Hale <TrumanBlending@gmail.com>2011-08-22 11:56:27 +0400
committerAndrew Hale <TrumanBlending@gmail.com>2011-08-22 11:56:27 +0400
commite8b28e4d5ad91500e201e014465a03c5ba2b6261 (patch)
treeb4331fe83419ed2923af5f64c10a51749ba3cb1e /add_curve_sapling
parent2bc0a0df5bb18c4b41a22fbde5ffb9d92c9f0109 (diff)
Version 0.2.5:
- Fixed the assignment of vertex groups for rectangular leaves. Fix thanks to pawel_xx - Compressed the UI to make accessing the different parameters easier. Also, the tree is not rebuilt every time a new menu section is accessed.
Diffstat (limited to 'add_curve_sapling')
-rw-r--r--add_curve_sapling/__init__.py152
-rw-r--r--add_curve_sapling/utils.py5
2 files changed, 86 insertions, 71 deletions
diff --git a/add_curve_sapling/__init__.py b/add_curve_sapling/__init__.py
index 00247beb..6b5667cd 100644
--- a/add_curve_sapling/__init__.py
+++ b/add_curve_sapling/__init__.py
@@ -19,9 +19,9 @@
bl_info = {
"name": "Sapling",
"author": "Andrew Hale (TrumanBlending)",
- "version": (0, 2, 4),
- "blender": (2, 5, 8),
- "api": 38479,
+ "version": (0, 2, 5),
+ "blender": (2, 5, 9),
+ "api": 39307,
"location": "View3D > Add > Curve",
"description": ("Adds a parametric tree. The method is presented by "
"Jason Weber & Joseph Penn in their paper 'Creation and Rendering of "
@@ -156,231 +156,241 @@ class AddTree(bpy.types.Operator):
bl_label = "Sapling"
bl_options = {'REGISTER', 'UNDO'}
+
+ def update_tree(self, context):
+ self.do_update = True
+
+ def no_update_tree(self, context):
+ self.do_update = False
+
+ do_update = BoolProperty(name='Do Update',
+ default=True, options={'HIDDEN'})
+
chooseSet = EnumProperty(name='Settings',
description='Choose the settings to modify',
items=settings,
- default='0')
+ default='0', update=no_update_tree)
bevel = BoolProperty(name='Bevel',
description='Whether the curve is bevelled',
- default=False)
+ default=False, update=update_tree)
prune = BoolProperty(name='Prune',
description='Whether the tree is pruned',
- default=False)
+ default=False, update=update_tree)
showLeaves = BoolProperty(name='Show Leaves',
description='Whether the leaves are shown',
- default=False)
+ default=False, update=update_tree)
useArm = BoolProperty(name='Use Armature',
description='Whether the armature is generated',
- default=False)
+ default=False, update=update_tree)
seed = IntProperty(name='Random Seed',
description='The seed of the random number generator',
- default=0)
+ default=0, update=update_tree)
handleType = IntProperty(name='Handle Type',
description='The type of curve handles',
min=0,
max=1,
- default=0)
+ default=0, update=update_tree)
levels = IntProperty(name='Levels',
description='Number of recursive branches (Levels)',
min=1,
max=6,
- default=3)
+ default=3, update=update_tree)
length = FloatVectorProperty(name='Length',
description='The relative lengths of each branch level (nLength)',
min=0.0,
default=[1, 0.3, 0.6, 0.45],
- size=4)
+ size=4, update=update_tree)
lengthV = FloatVectorProperty(name='Length Variation',
description='The relative length variations of each level (nLengthV)',
min=0.0,
default=[0, 0, 0, 0],
- size=4)
+ size=4, update=update_tree)
branches = IntVectorProperty(name='Branches',
description='The number of branches grown at each level (nBranches)',
min=0,
default=[50, 30, 10, 10],
- size=4)
+ size=4, update=update_tree)
curveRes = IntVectorProperty(name='Curve Resolution',
description='The number of segments on each branch (nCurveRes)',
min=1,
default=[3, 5, 3, 1],
- size=4)
+ size=4, update=update_tree)
curve = FloatVectorProperty(name='Curvature',
description='The angle of the end of the branch (nCurve)',
default=[0, -40, -40, 0],
- size=4)
+ size=4, update=update_tree)
curveV = FloatVectorProperty(name='Curvature Variation',
description='Variation of the curvature (nCurveV)',
default=[20, 50, 75, 0],
- size=4)
+ size=4, update=update_tree)
curveBack = FloatVectorProperty(name='Back Curvature',
description='Curvature for the second half of a branch (nCurveBack)',
default=[0, 0, 0, 0],
- size=4)
+ size=4, update=update_tree)
baseSplits = IntProperty(name='Base Splits',
description='Number of trunk splits at its base (nBaseSplits)',
min=0,
- default=0)
+ default=0, update=update_tree)
segSplits = FloatVectorProperty(name='Segment Splits',
description='Number of splits per segment (nSegSplits)',
min=0,
default=[0, 0, 0, 0],
- size=4)
+ size=4, update=update_tree)
splitAngle = FloatVectorProperty(name='Split Angle',
description='Angle of branch splitting (nSplitAngle)',
default=[0, 0, 0, 0],
- size=4)
+ size=4, update=update_tree)
splitAngleV = FloatVectorProperty(name='Split Angle Variation',
description='Variation in the split angle (nSplitAngleV)',
default=[0, 0, 0, 0],
- size=4)
+ size=4, update=update_tree)
scale = FloatProperty(name='Scale',
description='The tree scale (Scale)',
min=0.0,
- default=13.0)
+ default=13.0, update=update_tree)
scaleV = FloatProperty(name='Scale Variation',
description='The variation in the tree scale (ScaleV)',
- default=3.0)
+ default=3.0, update=update_tree)
attractUp = FloatProperty(name='Vertical Attraction',
description='Branch upward attraction',
- default=0.0)
+ default=0.0, update=update_tree)
shape = EnumProperty(name='Shape',
description='The overall shape of the tree (Shape)',
items=shapeList,
- default='7')
+ default='7', update=update_tree)
baseSize = FloatProperty(name='Base Size',
description='Fraction of tree height with no branches (BaseSize)',
min=0.0,
max=1.0,
- default=0.4)
+ default=0.4, update=update_tree)
ratio = FloatProperty(name='Ratio',
description='Base radius size (Ratio)',
min=0.0,
- default=0.015)
+ default=0.015, update=update_tree)
taper = FloatVectorProperty(name='Taper',
description='The fraction of tapering on each branch (nTaper)',
min=0.0,
max=1.0,
default=[1, 1, 1, 1],
- size=4)
+ size=4, update=update_tree)
ratioPower = FloatProperty(name='Branch Radius Ratio',
description=('Power which defines the radius of a branch compared to '
'the radius of the branch it grew from (RatioPower)'),
min=0.0,
- default=1.2)
+ default=1.2, update=update_tree)
downAngle = FloatVectorProperty(name='Down Angle',
description=('The angle between a new branch and the one it grew '
'from (nDownAngle)'),
default=[90, 60, 45, 45],
- size=4)
+ size=4, update=update_tree)
downAngleV = FloatVectorProperty(name='Down Angle Variation',
description='Variation in the down angle (nDownAngleV)',
default=[0, -50, 10, 10],
- size=4)
+ size=4, update=update_tree)
rotate = FloatVectorProperty(name='Rotate Angle',
description=('The angle of a new branch around the one it grew from '
'(nRotate)'),
default=[140, 140, 140, 77],
- size=4)
+ size=4, update=update_tree)
rotateV = FloatVectorProperty(name='Rotate Angle Variation',
description='Variation in the rotate angle (nRotateV)',
default=[0, 0, 0, 0],
- size=4)
+ size=4, update=update_tree)
scale0 = FloatProperty(name='Radius Scale',
description='The scale of the trunk radius (0Scale)',
min=0.0,
- default=1.0)
+ default=1.0, update=update_tree)
scaleV0 = FloatProperty(name='Radius Scale Variation',
description='Variation in the radius scale (0ScaleV)',
- default=0.2)
+ default=0.2, update=update_tree)
pruneWidth = FloatProperty(name='Prune Width',
description='The width of the envelope (PruneWidth)',
min=0.0,
- default=0.4)
+ default=0.4, update=update_tree)
pruneWidthPeak = FloatProperty(name='Prune Width Peak',
description=('Fraction of envelope height where the maximum width '
'occurs (PruneWidthPeak)'),
min=0.0,
- default=0.6)
+ default=0.6, update=update_tree)
prunePowerHigh = FloatProperty(name='Prune Power High',
description=('Power which determines the shape of the upper portion '
'of the envelope (PrunePowerHigh)'),
- default=0.5)
+ default=0.5, update=update_tree)
prunePowerLow = FloatProperty(name='Prune Power Low',
description=('Power which determines the shape of the lower portion '
'of the envelope (PrunePowerLow)'),
- default=0.001)
+ default=0.001, update=update_tree)
pruneRatio = FloatProperty(name='Prune Ratio',
description='Proportion of pruned length (PruneRatio)',
min=0.0,
max=1.0,
- default=1.0)
+ default=1.0, update=update_tree)
leaves = IntProperty(name='Leaves',
description='Maximum number of leaves per branch (Leaves)',
- default=25)
+ default=25, update=update_tree)
leafScale = FloatProperty(name='Leaf Scale',
description='The scaling applied to the whole leaf (LeafScale)',
min=0.0,
- default=0.17)
+ default=0.17, update=update_tree)
leafScaleX = FloatProperty(name='Leaf Scale X',
description=('The scaling applied to the x direction of the leaf '
'(LeafScaleX)'),
min=0.0,
- default=1.0)
+ default=1.0, update=update_tree)
leafShape = leafDist = EnumProperty(name='Leaf Shape',
description='The shape of the leaves, rectangular are UV mapped',
items=(('hex', 'Hexagonal', '0'), ('rect', 'Rectangular', '1')),
- default='hex')
+ default='hex', update=update_tree)
bend = FloatProperty(name='Leaf Bend',
description='The proportion of bending applied to the leaf (Bend)',
min=0.0,
max=1.0,
- default=0.0)
+ default=0.0, update=update_tree)
leafDist = EnumProperty(name='Leaf Distribution',
description='The way leaves are distributed on branches',
items=shapeList,
- default='4')
+ default='4', update=update_tree)
bevelRes = IntProperty(name='Bevel Resolution',
description='The bevel resolution of the curves',
min=0,
- default=0)
+ default=0, update=update_tree)
resU = IntProperty(name='Curve Resolution',
description='The resolution along the curves',
min=1,
- default=4)
+ default=4, update=update_tree)
handleType = EnumProperty(name='Handle Type',
description='The type of handles used in the spline',
items=handleList,
- default='1')
+ default='1', update=update_tree)
frameRate = FloatProperty(name='Frame Rate',
description=('The number of frames per second which can be used to '
'adjust the speed of animation'),
min=0.001,
- default=1)
+ default=1, update=update_tree)
windSpeed = FloatProperty(name='Wind Speed',
description='The wind speed to apply to the armature (WindSpeed)',
- default=2.0)
+ default=2.0, update=update_tree)
windGust = FloatProperty(name='Wind Gust',
description='The greatest increase over Wind Speed (WindGust)',
- default=0.0)
+ default=0.0, update=update_tree)
armAnim = BoolProperty(name='Armature Animation',
description='Whether animation is added to the armature',
- default=False)
+ default=False, update=update_tree)
presetName = StringProperty(name='Preset Name',
description='The name of the preset to be saved',
default='',
- subtype='FILENAME')
+ subtype='FILENAME', update=no_update_tree)
limitImport = BoolProperty(name='Limit Import',
description='Limited imported tree to 2 levels & no leaves for speed',
- default=True)
+ default=True, update=no_update_tree)
startCurv = FloatProperty(name='Trunk Starting Angle',
description=('The angle between vertical and the starting direction '
'of the trunk'),
min=0.0,
max=360,
- default=0.0)
+ default=0.0, update=update_tree)
@classmethod
def poll(cls, context):
@@ -388,15 +398,15 @@ class AddTree(bpy.types.Operator):
def draw(self, context):
- layout = self.layout
+ layout = self.layout
- # Branch specs
- #layout.label('Tree Definition')
+ # Branch specs
+ #layout.label('Tree Definition')
-# row = layout.row()
-# row.prop(self, 'chooseSet')
+ row = layout.row(align=True)
+ row.prop(self, 'chooseSet')
-# if self.chooseSet == '0':
+ if self.chooseSet == '0':
box = layout.box()
box.label('Geometry')
row = box.row()
@@ -427,7 +437,7 @@ class AddTree(bpy.types.Operator):
# Unfortunately as_keyword doesn't work with vector properties,
# so we need something custom. This is it
data = []
- for a, b in (self.as_keywords(ignore=("presetName", "limitImport"))).items():
+ for a, b in (self.as_keywords(ignore=("chooseSet", "presetName", "limitImport", "do_update"))).items():
# If the property is a vector property then evaluate it and
# convert to a string
if (repr(b))[:3] == 'bpy':
@@ -447,7 +457,7 @@ class AddTree(bpy.types.Operator):
row.menu('sapling.presetmenu', text='Load Preset')
row.prop(self, 'limitImport')
-# if self.chooseSet == '1':
+ if self.chooseSet == '1':
box = layout.box()
box.label('Branch Splitting')
row = box.row()
@@ -480,7 +490,7 @@ class AddTree(bpy.types.Operator):
col = row.column()
col.prop(self, 'ratioPower')
-# if self.chooseSet == '2':
+ if self.chooseSet == '2':
box = layout.box()
box.label('Branch Growth')
row = box.row()
@@ -506,7 +516,7 @@ class AddTree(bpy.types.Operator):
col = row.column()
col.prop(self, 'curveRes')
-# if self.chooseSet == '3':
+ if self.chooseSet == '3':
box = layout.box()
box.label('Pruning')
row = box.row()
@@ -521,7 +531,7 @@ class AddTree(bpy.types.Operator):
row.prop(self, 'prunePowerHigh')
row.prop(self, 'prunePowerLow')
-# if self.chooseSet == '4':
+ if self.chooseSet == '4':
box = layout.box()
box.label('Leaves')
row = box.row()
@@ -540,7 +550,7 @@ class AddTree(bpy.types.Operator):
row = box.row()
row.prop(self, 'bend')
-# if self.chooseSet == '5':
+ if self.chooseSet == '5':
box = layout.box()
box.label('Armature and Animation')
row = box.row()
@@ -565,6 +575,8 @@ class AddTree(bpy.types.Operator):
setattr(self, 'levels', 2)
setattr(self, 'showLeaves', False)
useSet = False
+ if not self.do_update:
+ return {'PASS_THROUGH'}
addTree(self)
print("Tree creation in %0.1fs" %(time.time()-start_time))
return {'FINISHED'}
@@ -592,4 +604,4 @@ def unregister():
bpy.types.INFO_MT_curve_add.remove(menu_func)
if __name__ == "__main__":
- register()
+ register() \ No newline at end of file
diff --git a/add_curve_sapling/utils.py b/add_curve_sapling/utils.py
index 14401a02..75dd1bcd 100644
--- a/add_curve_sapling/utils.py
+++ b/add_curve_sapling/utils.py
@@ -914,8 +914,11 @@ def addTree(props):
# If there are leaves we need to assign vertices to their vertex groups
if leaves:
offsetVal = 0
+ leafVertSize = 6
+ if leafShape == 'rect':
+ leafVertSize = 4
for i,cp in enumerate(childP):
- for v in leafMesh.vertices[6*i:(6*i+6)]:
+ for v in leafMesh.vertices[leafVertSize*i:(leafVertSize*i+leafVertSize)]:
leafObj.vertex_groups[cp.parBone].add([v.index],1.0,'ADD')
# Now we need the rotation mode to be 'XYZ' to ensure correct rotation