diff options
-rw-r--r-- | add_curve_sapling/__init__.py | 152 | ||||
-rw-r--r-- | add_curve_sapling/utils.py | 5 |
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 |