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:
authorCansecoGPC <CansecoGPC>2018-12-18 13:11:40 +0300
committerJacques Lucke <mail@jlucke.com>2018-12-18 13:16:18 +0300
commit9aa6c8058b32675b2636632d6735f66baf6300b1 (patch)
tree6650153e6e4ca3a3dd34db557f9820bbda56b0fa /add_curve_sapling
parent91686697aad63a42d479ac62c6a39031c1827870 (diff)
Port 'Sapling Tree Gen' addon to Blender 2.8
Differential Revision: https://developer.blender.org/D4085
Diffstat (limited to 'add_curve_sapling')
-rw-r--r--add_curve_sapling/__init__.py257
-rw-r--r--add_curve_sapling/utils.py54
2 files changed, 157 insertions, 154 deletions
diff --git a/add_curve_sapling/__init__.py b/add_curve_sapling/__init__.py
index a63e55c1..a657264a 100644
--- a/add_curve_sapling/__init__.py
+++ b/add_curve_sapling/__init__.py
@@ -19,9 +19,9 @@
bl_info = {
"name": "Sapling Tree Gen",
- "author": "Andrew Hale (TrumanBlending), Aaron Buchler",
- "version": (0, 3, 3),
- "blender": (2, 77, 0),
+ "author": "Andrew Hale (TrumanBlending), Aaron Buchler, CansecoGPC",
+ "version": (0, 3, 4),
+ "blender": (2, 80, 0),
"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 "
@@ -110,14 +110,7 @@ def getPresetpath():
"""Support user defined scripts directory
Find the first occurrence of add_curve_sapling/presets in possible script paths
and return it as preset path"""
- # presetpath = ""
- # for p in bpy.utils.script_paths():
- # presetpath = os.path.join(p, 'addons', 'add_curve_sapling_3', 'presets')
- # if os.path.exists(presetpath):
- # break
- # return presetpath
-
- # why not just do this
+
script_file = os.path.realpath(__file__)
directory = os.path.dirname(script_file)
directory = os.path.join(directory, "presets")
@@ -145,7 +138,7 @@ class ExportData(Operator):
bl_idname = 'sapling.exportdata'
bl_label = 'Export Preset'
- data = StringProperty()
+ data: StringProperty()
def execute(self, context):
# Unpack some data from the input
@@ -196,7 +189,7 @@ class ImportData(Operator):
bl_idname = "sapling.importdata"
bl_label = "Import Preset"
- filename = StringProperty()
+ filename: StringProperty()
def execute(self, context):
# Make sure the operator knows about the global variables
@@ -276,49 +269,49 @@ class AddTree(Operator):
def no_update_tree(self, context):
self.do_update = False
- do_update = BoolProperty(
+ do_update: BoolProperty(
name='Do Update',
default=True, options={'HIDDEN'}
)
- chooseSet = EnumProperty(
+ chooseSet: EnumProperty(
name='Settings',
description='Choose the settings to modify',
items=settings,
default='0', update=no_update_tree
)
- bevel = BoolProperty(
+ bevel: BoolProperty(
name='Bevel',
description='Whether the curve is beveled',
default=False, update=update_tree
)
- prune = BoolProperty(
+ prune: BoolProperty(
name='Prune',
description='Whether the tree is pruned',
default=False, update=update_tree
)
- showLeaves = BoolProperty(
+ showLeaves: BoolProperty(
name='Show Leaves',
description='Whether the leaves are shown',
default=False, update=update_tree
)
- useArm = BoolProperty(
+ useArm: BoolProperty(
name='Use Armature',
description='Whether the armature is generated',
default=False, update=update_tree
)
- seed = IntProperty(
+ seed: IntProperty(
name='Random Seed',
description='The seed of the random number generator',
default=0, update=update_tree
)
- handleType = IntProperty(
+ handleType: IntProperty(
name='Handle Type',
description='The type of curve handles',
min=0,
max=1,
default=0, update=update_tree
)
- levels = IntProperty(
+ levels: IntProperty(
name='Levels',
description='Number of recursive branches (Levels)',
min=1,
@@ -326,14 +319,14 @@ class AddTree(Operator):
soft_max=4,
default=3, update=update_tree
)
- length = FloatVectorProperty(
+ length: FloatVectorProperty(
name='Length',
description='The relative lengths of each branch level (nLength)',
min=0.000001,
default=[1, 0.3, 0.6, 0.45],
size=4, update=update_tree
)
- lengthV = FloatVectorProperty(
+ lengthV: FloatVectorProperty(
name='Length Variation',
description='The relative length variations of each level (nLengthV)',
min=0.0,
@@ -341,52 +334,52 @@ class AddTree(Operator):
default=[0, 0, 0, 0],
size=4, update=update_tree
)
- taperCrown = FloatProperty(
+ taperCrown: FloatProperty(
name='Taper Crown',
description='Shorten trunk splits toward outside of tree',
min=0.0,
soft_max=1.0,
default=0, update=update_tree
)
- branches = IntVectorProperty(
+ branches: IntVectorProperty(
name='Branches',
description='The number of branches grown at each level (nBranches)',
min=0,
default=[50, 30, 10, 10],
size=4, update=update_tree
)
- curveRes = IntVectorProperty(
+ curveRes: IntVectorProperty(
name='Curve Resolution',
description='The number of segments on each branch (nCurveRes)',
min=1,
default=[3, 5, 3, 1],
size=4, update=update_tree
)
- curve = FloatVectorProperty(
+ curve: FloatVectorProperty(
name='Curvature',
description='The angle of the end of the branch (nCurve)',
default=[0, -40, -40, 0],
size=4, update=update_tree
)
- curveV = FloatVectorProperty(
+ curveV: FloatVectorProperty(
name='Curvature Variation',
description='Variation of the curvature (nCurveV)',
default=[20, 50, 75, 0],
size=4, update=update_tree
)
- curveBack = FloatVectorProperty(
+ curveBack: FloatVectorProperty(
name='Back Curvature',
description='Curvature for the second half of a branch (nCurveBack)',
default=[0, 0, 0, 0],
size=4, update=update_tree
)
- baseSplits = IntProperty(
+ baseSplits: IntProperty(
name='Base Splits',
description='Number of trunk splits at its base (nBaseSplits)',
min=0,
default=0, update=update_tree
)
- segSplits = FloatVectorProperty(
+ segSplits: FloatVectorProperty(
name='Segment Splits',
description='Number of splits per segment (nSegSplits)',
min=0,
@@ -394,45 +387,45 @@ class AddTree(Operator):
default=[0, 0, 0, 0],
size=4, update=update_tree
)
- splitByLen = BoolProperty(
+ splitByLen: BoolProperty(
name='Split relative to length',
description='Split proportional to branch length',
default=False, update=update_tree
)
- rMode = EnumProperty(
+ rMode: EnumProperty(
name="", # "Branching Mode"
description='Branching and Rotation Mode',
items=branchmodes,
default="rotate", update=update_tree
)
- splitAngle = FloatVectorProperty(
+ splitAngle: FloatVectorProperty(
name='Split Angle',
description='Angle of branch splitting (nSplitAngle)',
default=[0, 0, 0, 0],
size=4, update=update_tree
)
- splitAngleV = FloatVectorProperty(
+ splitAngleV: FloatVectorProperty(
name='Split Angle Variation',
description='Variation in the split angle (nSplitAngleV)',
default=[0, 0, 0, 0],
size=4, update=update_tree
)
- scale = FloatProperty(
+ scale: FloatProperty(
name='Scale',
description='The tree scale (Scale)',
min=0.0,
default=13.0, update=update_tree)
- scaleV = FloatProperty(name='Scale Variation',
+ scaleV: FloatProperty(name='Scale Variation',
description='The variation in the tree scale (ScaleV)',
default=3.0, update=update_tree
)
- attractUp = FloatVectorProperty(
+ attractUp: FloatVectorProperty(
name='Vertical Attraction',
description='Branch upward attraction',
default=[0, 0, 0, 0],
size=4, update=update_tree
)
- attractOut = FloatVectorProperty(
+ attractOut: FloatVectorProperty(
name='Outward Attraction',
description='Branch outward attraction',
default=[0, 0, 0, 0],
@@ -440,19 +433,19 @@ class AddTree(Operator):
max=1.0,
size=4, update=update_tree
)
- shape = EnumProperty(
+ shape: EnumProperty(
name='Shape',
description='The overall shape of the tree (Shape)',
items=shapeList3,
default='7', update=update_tree
)
- shapeS = EnumProperty(
+ shapeS: EnumProperty(
name='Secondary Branches Shape',
description='The shape of secondary splits',
items=shapeList4,
default='4', update=update_tree
)
- customShape = FloatVectorProperty(
+ customShape: FloatVectorProperty(
name='Custom Shape',
description='custom shape branch length at (Base, Middle, Middle Position, Top)',
size=4,
@@ -460,76 +453,76 @@ class AddTree(Operator):
max=1,
default=[.5, 1.0, .3, .5], update=update_tree
)
- branchDist = FloatProperty(
+ branchDist: FloatProperty(
name='Branch Distribution',
description='Adjust branch spacing to put more branches at the top or bottom of the tree',
min=0.1,
soft_max=10,
default=1.0, update=update_tree
)
- nrings = IntProperty(
+ nrings: IntProperty(
name='Branch Rings',
description='grow branches in rings',
min=0,
default=0, update=update_tree
)
- baseSize = FloatProperty(
+ baseSize: FloatProperty(
name='Trunk Height',
description='Fraction of tree height with no branches (Base Size)',
min=0.0,
max=1.0,
default=0.4, update=update_tree
)
- baseSize_s = FloatProperty(
+ baseSize_s: FloatProperty(
name='Secondary Base Size',
description='Factor to decrease base size for each level',
min=0.0,
max=1.0,
default=0.25, update=update_tree
)
- splitHeight = FloatProperty(
+ splitHeight: FloatProperty(
name='Split Height',
description='Fraction of tree height with no splits',
min=0.0,
max=1.0,
default=0.2, update=update_tree
)
- splitBias = FloatProperty(
+ splitBias: FloatProperty(
name='splitBias',
description='Put more splits at the top or bottom of the tree',
soft_min=-2.0,
soft_max=2.0,
default=0.0, update=update_tree
)
- ratio = FloatProperty(
+ ratio: FloatProperty(
name='Ratio',
description='Base radius size (Ratio)',
min=0.0,
default=0.015, update=update_tree
)
- minRadius = FloatProperty(
+ minRadius: FloatProperty(
name='Minimum Radius',
description='Minimum branch Radius',
min=0.0,
default=0.0, update=update_tree
)
- closeTip = BoolProperty(
+ closeTip: BoolProperty(
name='Close Tip',
description='Set radius at branch tips to zero',
default=False, update=update_tree
)
- rootFlare = FloatProperty(
+ rootFlare: FloatProperty(
name='Root Flare',
description='Root radius factor',
min=1.0,
default=1.0, update=update_tree
)
- autoTaper = BoolProperty(
+ autoTaper: BoolProperty(
name='Auto Taper',
description='Calculate taper automatically based on branch lengths',
default=True, update=update_tree
)
- taper = FloatVectorProperty(
+ taper: FloatVectorProperty(
name='Taper',
description='The fraction of tapering on each branch (nTaper)',
min=0.0,
@@ -537,7 +530,7 @@ class AddTree(Operator):
default=[1, 1, 1, 1],
size=4, update=update_tree
)
- radiusTweak = FloatVectorProperty(
+ radiusTweak: FloatVectorProperty(
name='Tweak Radius',
description='multiply radius by this factor',
min=0.0,
@@ -545,164 +538,164 @@ class AddTree(Operator):
default=[1, 1, 1, 1],
size=4, update=update_tree
)
- ratioPower = FloatProperty(
+ 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, update=update_tree
)
- downAngle = FloatVectorProperty(
+ 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, update=update_tree
)
- downAngleV = FloatVectorProperty(
+ downAngleV: FloatVectorProperty(
name='Down Angle Variation',
description="Angle to decrease Down Angle by towards end of parent branch "
"(negative values add random variation)",
default=[0, -50, 10, 10],
size=4, update=update_tree
)
- useOldDownAngle = BoolProperty(
+ useOldDownAngle: BoolProperty(
name='Use old down angle variation',
default=False, update=update_tree
)
- useParentAngle = BoolProperty(
+ useParentAngle: BoolProperty(
name='Use parent angle',
description='(first level) Rotate branch to match parent branch',
default=True, update=update_tree
)
- rotate = FloatVectorProperty(
+ rotate: FloatVectorProperty(
name='Rotate Angle',
description="The angle of a new branch around the one it grew from "
"(negative values rotate opposite from the previous)",
default=[137.5, 137.5, 137.5, 137.5],
size=4, update=update_tree
)
- rotateV = FloatVectorProperty(
+ rotateV: FloatVectorProperty(
name='Rotate Angle Variation',
description='Variation in the rotate angle (nRotateV)',
default=[0, 0, 0, 0],
size=4, update=update_tree
)
- scale0 = FloatProperty(
+ scale0: FloatProperty(
name='Radius Scale',
description='The scale of the trunk radius (0Scale)',
min=0.0,
default=1.0, update=update_tree
)
- scaleV0 = FloatProperty(
+ scaleV0: FloatProperty(
name='Radius Scale Variation',
description='Variation in the radius scale (0ScaleV)',
min=0.0,
max=1.0,
default=0.2, update=update_tree
)
- pruneWidth = FloatProperty(
+ pruneWidth: FloatProperty(
name='Prune Width',
description='The width of the envelope (PruneWidth)',
min=0.0,
default=0.4, update=update_tree
)
- pruneBase = FloatProperty(
+ pruneBase: FloatProperty(
name='Prune Base Height',
description='The height of the base of the envelope, bound by trunk height',
min=0.0,
max=1.0,
default=0.3, update=update_tree
)
- pruneWidthPeak = FloatProperty(
+ pruneWidthPeak: FloatProperty(
name='Prune Width Peak',
description=("Fraction of envelope height where the maximum width "
"occurs (PruneWidthPeak)"),
min=0.0,
default=0.6, update=update_tree
)
- prunePowerHigh = FloatProperty(
+ prunePowerHigh: FloatProperty(
name='Prune Power High',
description=('Power which determines the shape of the upper portion '
'of the envelope (PrunePowerHigh)'),
default=0.5, update=update_tree
)
- prunePowerLow = FloatProperty(
+ prunePowerLow: FloatProperty(
name='Prune Power Low',
description=('Power which determines the shape of the lower portion '
'of the envelope (PrunePowerLow)'),
default=0.001, update=update_tree
)
- pruneRatio = FloatProperty(
+ pruneRatio: FloatProperty(
name='Prune Ratio',
description='Proportion of pruned length (PruneRatio)',
min=0.0,
max=1.0,
default=1.0, update=update_tree
)
- leaves = IntProperty(
+ leaves: IntProperty(
name='Leaves',
description="Maximum number of leaves per branch (negative values grow "
"leaves from branch tip (palmate compound leaves))",
default=25, update=update_tree
)
- leafDownAngle = FloatProperty(
+ leafDownAngle: FloatProperty(
name='Leaf Down Angle',
description='The angle between a new leaf and the branch it grew from',
default=45, update=update_leaves
)
- leafDownAngleV = FloatProperty(
+ leafDownAngleV: FloatProperty(
name='Leaf Down Angle Variation',
description="Angle to decrease Down Angle by towards end of parent branch "
"(negative values add random variation)",
default=10, update=update_tree
)
- leafRotate = FloatProperty(
+ leafRotate: FloatProperty(
name='Leaf Rotate Angle',
description="The angle of a new leaf around the one it grew from "
"(negative values rotate opposite from previous)",
default=137.5, update=update_tree
)
- leafRotateV = FloatProperty(
+ leafRotateV: FloatProperty(
name='Leaf Rotate Angle Variation',
description='Variation in the rotate angle',
default=0.0, update=update_leaves
)
- leafScale = FloatProperty(
+ leafScale: FloatProperty(
name='Leaf Scale',
description='The scaling applied to the whole leaf (LeafScale)',
min=0.0,
default=0.17, update=update_leaves
)
- leafScaleX = FloatProperty(
+ leafScaleX: FloatProperty(
name='Leaf Scale X',
description=('The scaling applied to the x direction of the leaf '
'(LeafScaleX)'),
min=0.0,
default=1.0, update=update_leaves
)
- leafScaleT = FloatProperty(
+ leafScaleT: FloatProperty(
name='Leaf Scale Taper',
description='scale leaves toward the tip or base of the patent branch',
min=-1.0,
max=1.0,
default=0.0, update=update_leaves
)
- leafScaleV = FloatProperty(
+ leafScaleV: FloatProperty(
name='Leaf Scale Variation',
description='randomize leaf scale',
min=0.0,
max=1.0,
default=0.0, update=update_leaves
)
- leafShape = EnumProperty(
+ leafShape: EnumProperty(
name='Leaf Shape',
description='The shape of the leaves',
items=(('hex', 'Hexagonal', '0'), ('rect', 'Rectangular', '1'),
('dFace', 'DupliFaces', '2'), ('dVert', 'DupliVerts', '3')),
default='hex', update=update_leaves
)
- leafDupliObj = EnumProperty(
+ leafDupliObj: EnumProperty(
name='Leaf Object',
description='Object to use for leaf instancing if Leaf Shape is DupliFaces or DupliVerts',
items=objectList,
@@ -717,64 +710,64 @@ class AddTree(Operator):
default=0.0, update=update_leaves
)
"""
- leafangle = FloatProperty(
+ leafangle: FloatProperty(
name='Leaf Angle',
description='Leaf vertical attraction',
default=0.0, update=update_leaves
)
- horzLeaves = BoolProperty(
+ horzLeaves: BoolProperty(
name='Horizontal leaves',
description='Leaves face upwards',
default=True, update=update_leaves
)
- leafDist = EnumProperty(
+ leafDist: EnumProperty(
name='Leaf Distribution',
description='The way leaves are distributed on branches',
items=shapeList4,
default='6', update=update_tree
)
- bevelRes = IntProperty(
+ bevelRes: IntProperty(
name='Bevel Resolution',
description='The bevel resolution of the curves',
min=0,
max=32,
default=0, update=update_tree
)
- resU = IntProperty(
+ resU: IntProperty(
name='Curve Resolution',
description='The resolution along the curves',
min=1,
default=4, update=update_tree
)
- handleType = EnumProperty(
+ handleType: EnumProperty(
name='Handle Type',
description='The type of handles used in the spline',
items=handleList,
default='0', update=update_tree
)
- armAnim = BoolProperty(
+ armAnim: BoolProperty(
name='Armature Animation',
description='Whether animation is added to the armature',
default=False, update=update_tree
)
- previewArm = BoolProperty(
+ previewArm: BoolProperty(
name='Fast Preview',
description='Disable armature modifier, hide tree, and set bone display to wire, for fast playback',
# Disable skin modifier and hide tree and armature, for fast playback
default=False, update=update_tree
)
- leafAnim = BoolProperty(
+ leafAnim: BoolProperty(
name='Leaf Animation',
description='Whether animation is added to the leaves',
default=False, update=update_tree
)
- frameRate = FloatProperty(
+ frameRate: FloatProperty(
name='Animation Speed',
description=('Adjust speed of animation, relative to scene frame rate'),
min=0.001,
default=1, update=update_tree
)
- loopFrames = IntProperty(
+ loopFrames: IntProperty(
name='Loop Frames',
description='Number of frames to make the animation loop for, zero is disabled',
min=0,
@@ -792,66 +785,66 @@ class AddTree(Operator):
default=0.0, update=update_tree
)
"""
- wind = FloatProperty(
+ wind: FloatProperty(
name='Overall Wind Strength',
description='The intensity of the wind to apply to the armature',
default=1.0, update=update_tree
)
- gust = FloatProperty(
+ gust: FloatProperty(
name='Wind Gust Strength',
description='The amount of directional movement, (from the positive Y direction)',
default=1.0, update=update_tree
)
- gustF = FloatProperty(
+ gustF: FloatProperty(
name='Wind Gust Fequency',
description='The Frequency of directional movement',
default=0.075, update=update_tree
)
- af1 = FloatProperty(
+ af1: FloatProperty(
name='Amplitude',
description='Multiplier for noise amplitude',
default=1.0, update=update_tree
)
- af2 = FloatProperty(
+ af2: FloatProperty(
name='Frequency',
description='Multiplier for noise fequency',
default=1.0, update=update_tree
)
- af3 = FloatProperty(
+ af3: FloatProperty(
name='Randomness',
description='Random offset in noise',
default=4.0, update=update_tree
)
- makeMesh = BoolProperty(
+ makeMesh: BoolProperty(
name='Make Mesh',
description='Convert curves to mesh, uses skin modifier, enables armature simplification',
default=False, update=update_tree
)
- armLevels = IntProperty(
+ armLevels: IntProperty(
name='Armature Levels',
description='Number of branching levels to make bones for, 0 is all levels',
min=0,
default=2, update=update_tree
)
- boneStep = IntVectorProperty(
+ boneStep: IntVectorProperty(
name='Bone Length',
description='Number of stem segments per bone',
min=1,
default=[1, 1, 1, 1],
size=4, update=update_tree
)
- presetName = StringProperty(
+ presetName: StringProperty(
name='Preset Name',
description='The name of the preset to be saved',
default='',
subtype='FILE_NAME', update=no_update_tree
)
- limitImport = BoolProperty(
+ limitImport: BoolProperty(
name='Limit Import',
description='Limited imported tree to 2 levels & no leaves for speed',
default=True, update=no_update_tree
)
- overwrite = BoolProperty(
+ overwrite: BoolProperty(
name='Overwrite',
description='When checked, overwrite existing preset files when saving',
default=False, update=no_update_tree
@@ -881,7 +874,7 @@ class AddTree(Operator):
if self.chooseSet == '0':
box = layout.box()
- box.label("Geometry:")
+ box.label(text="Geometry:")
box.prop(self, 'bevel')
row = box.row()
@@ -900,7 +893,7 @@ class AddTree(Operator):
box.prop(self, 'nrings')
box.prop(self, 'seed')
- box.label("Tree Scale:")
+ box.label(text="Tree Scale:")
row = box.row()
row.prop(self, 'scale')
row.prop(self, 'scaleV')
@@ -927,7 +920,7 @@ class AddTree(Operator):
# Send the data dict and the file name to the exporter
row.operator('sapling.exportdata').data = repr([repr(data), self.presetName, self.overwrite])
row = box.row()
- row.label(" ")
+ row.label(text=" ")
row.prop(self, 'overwrite')
row = box.row()
row.menu('SAPLING_MT_preset', text='Load Preset')
@@ -935,7 +928,7 @@ class AddTree(Operator):
elif self.chooseSet == '1':
box = layout.box()
- box.label("Branch Radius:")
+ box.label(text="Branch Radius:")
row = box.row()
row.prop(self, 'bevel')
@@ -961,7 +954,7 @@ class AddTree(Operator):
elif self.chooseSet == '2':
box = layout.box()
- box.label("Branch Splitting:")
+ box.label(text="Branch Splitting:")
box.prop(self, 'levels')
box.prop(self, 'baseSplits')
row = box.row()
@@ -984,14 +977,14 @@ class AddTree(Operator):
col.prop(self, 'splitAngleV')
col.prop(self, 'rotateV')
- col.label("Branching Mode:")
+ col.label(text="Branching Mode:")
col.prop(self, 'rMode')
box.column().prop(self, 'curveRes')
elif self.chooseSet == '3':
box = layout.box()
- box.label("Branch Growth:")
+ box.label(text="Branch Growth:")
box.prop(self, 'taperCrown')
@@ -1014,7 +1007,7 @@ class AddTree(Operator):
elif self.chooseSet == '4':
box = layout.box()
- box.label("Prune:")
+ box.label(text="Prune:")
box.prop(self, 'prune')
box.prop(self, 'pruneRatio')
row = box.row()
@@ -1028,14 +1021,14 @@ class AddTree(Operator):
elif self.chooseSet == '5':
box = layout.box()
- box.label("Leaves:")
+ box.label(text="Leaves:")
box.prop(self, 'showLeaves')
box.prop(self, 'leafShape')
box.prop(self, 'leafDupliObj')
box.prop(self, 'leaves')
box.prop(self, 'leafDist')
- box.label("")
+ box.label(text="")
row = box.row()
row.prop(self, 'leafDownAngle')
row.prop(self, 'leafDownAngleV')
@@ -1043,7 +1036,7 @@ class AddTree(Operator):
row = box.row()
row.prop(self, 'leafRotate')
row.prop(self, 'leafRotateV')
- box.label("")
+ box.label(text="")
row = box.row()
row.prop(self, 'leafScale')
@@ -1056,22 +1049,22 @@ class AddTree(Operator):
box.prop(self, 'horzLeaves')
box.prop(self, 'leafangle')
- # box.label(" ")
+ # box.label(text=" ")
# box.prop(self, 'bend')
elif self.chooseSet == '6':
box = layout.box()
- box.label("Armature:")
+ box.label(text="Armature:")
row = box.row()
row.prop(self, 'useArm')
box.prop(self, 'makeMesh')
- box.label("Armature Simplification:")
+ box.label(text="Armature Simplification:")
box.prop(self, 'armLevels')
box.prop(self, 'boneStep')
elif self.chooseSet == '7':
box = layout.box()
- box.label("Finalize All Other Settings First!")
+ box.label(text="Finalize All Other Settings First!")
box.prop(self, 'armAnim')
box.prop(self, 'leafAnim')
box.prop(self, 'previewArm')
@@ -1082,13 +1075,13 @@ class AddTree(Operator):
# row.prop(self, 'windSpeed')
# row.prop(self, 'windGust')
- box.label('Wind Settings:')
+ box.label(text='Wind Settings:')
box.prop(self, 'wind')
row = box.row()
row.prop(self, 'gust')
row.prop(self, 'gustF')
- box.label('Leaf Wind Settings:')
+ box.label(text='Leaf Wind Settings:')
box.prop(self, 'af1')
box.prop(self, 'af2')
box.prop(self, 'af3')
@@ -1097,7 +1090,7 @@ class AddTree(Operator):
# Ensure the use of the global variables
global settings, useSet
start_time = time.time()
- # bpy.ops.ImportData.filename = "quaking_aspen"
+
# If we need to set the properties from a preset then do it here
if useSet:
for a, b in settings.items():
@@ -1115,23 +1108,31 @@ class AddTree(Operator):
return {'FINISHED'}
def invoke(self, context, event):
- bpy.ops.sapling.importdata(filename="quaking_aspen.py")
+ bpy.ops.sapling.importdata(filename="callistemon.py")
return self.execute(context)
def menu_func(self, context):
self.layout.operator(AddTree.bl_idname, text="Sapling Tree Gen", icon='CURVE_DATA')
+classes = (
+ AddTree,
+ PresetMenu,
+ ImportData,
+ ExportData,
+)
def register():
- bpy.utils.register_module(__name__)
-
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
bpy.types.VIEW3D_MT_curve_add.append(menu_func)
def unregister():
- bpy.utils.unregister_module(__name__)
-
+ from bpy.utils import unregister_class
+ for cls in reversed(classes):
+ unregister_class(cls)
bpy.types.VIEW3D_MT_curve_add.remove(menu_func)
diff --git a/add_curve_sapling/utils.py b/add_curve_sapling/utils.py
index 52139aec..66ee91f6 100644
--- a/add_curve_sapling/utils.py
+++ b/add_curve_sapling/utils.py
@@ -19,6 +19,7 @@
import bpy
+
import time
import copy
@@ -489,7 +490,7 @@ def growSpline(n, stem, numSplit, splitAng, splitAngV, splineList,
end_co = stem.p.co.copy()
# Add the new point and adjust its coords, handles and radius
- newSpline.bezier_points.add()
+ newSpline.bezier_points.add(1)
newPoint = newSpline.bezier_points[-1]
(newPoint.co, newPoint.handle_left_type, newPoint.handle_right_type) = (end_co + dirVec, hType, hType)
newPoint.radius = (
@@ -561,7 +562,7 @@ def growSpline(n, stem, numSplit, splitAng, splitAngV, splineList,
# Get the end point position
end_co = stem.p.co.copy()
- stem.spline.bezier_points.add()
+ stem.spline.bezier_points.add(1)
newPoint = stem.spline.bezier_points[-1]
(newPoint.co, newPoint.handle_left_type, newPoint.handle_right_type) = (end_co + dirVec, hType, hType)
newPoint.radius = stem.radS * (1 - (stem.seg + 1) / stem.segMax) + \
@@ -730,7 +731,7 @@ def create_armature(armAnim, leafP, cu, frameRate, leafMesh, leafObj, leafVertSi
leafAnim, loopFrames, previewArm, armLevels, makeMesh, boneStep):
arm = bpy.data.armatures.new('tree')
armOb = bpy.data.objects.new('treeArm', arm)
- bpy.context.scene.objects.link(armOb)
+ bpy.context.scene.collection.objects.link(armOb)
# Create a new action to store all animation
newAction = bpy.data.actions.new(name='windAction')
armOb.animation_data_create()
@@ -742,7 +743,7 @@ def create_armature(armAnim, leafP, cu, frameRate, leafMesh, leafObj, leafVertSi
if previewArm:
armMod.show_viewport = False
arm.display_type = 'WIRE'
- treeOb.hide = True
+ treeOb.hide_viewport = True
armMod.use_apply_on_spline = True
armMod.object = armOb
armMod.use_bone_envelopes = True
@@ -753,15 +754,16 @@ def create_armature(armAnim, leafP, cu, frameRate, leafMesh, leafObj, leafVertSi
armMod.object = armOb
armMod.use_bone_envelopes = False
armMod.use_vertex_groups = True
+
# Make sure all objects are deselected (may not be required?)
for ob in bpy.data.objects:
- ob.select = False
+ ob.select_set(state=False)
fps = bpy.context.scene.render.fps
animSpeed = (24 / fps) * frameRate
# Set the armature as active and go to edit mode to add bones
- bpy.context.scene.objects.active = armOb
+ bpy.context.view_layer.objects.active = armOb
bpy.ops.object.mode_set(mode='EDIT')
# For all the splines in the curve we need to add bones at each bezier point
for i, parBone in enumerate(splineToBone):
@@ -873,10 +875,10 @@ def create_armature(armAnim, leafP, cu, frameRate, leafMesh, leafObj, leafVertSi
# Add new fcurves for each sway as well as the modifiers
swayX = armOb.animation_data.action.fcurves.new(
- 'pose.bones["' + boneName + '"].rotation_euler', 0
+ 'pose.bones["' + boneName + '"].rotation_euler', index=0
)
swayY = armOb.animation_data.action.fcurves.new(
- 'pose.bones["' + boneName + '"].rotation_euler', 2
+ 'pose.bones["' + boneName + '"].rotation_euler', index=2
)
swayXMod1 = swayX.modifiers.new(type='FNGENERATOR')
swayXMod2 = swayX.modifiers.new(type='FNGENERATOR')
@@ -955,14 +957,14 @@ def create_armature(armAnim, leafP, cu, frameRate, leafMesh, leafObj, leafVertSi
# Add new fcurves for each sway as well as the modifiers
swayX = armOb.animation_data.action.fcurves.new(
- 'pose.bones["' + bname + '"].rotation_euler', 0
+ 'pose.bones["' + bname + '"].rotation_euler', index=0
)
swayY = armOb.animation_data.action.fcurves.new(
- 'pose.bones["' + bname + '"].rotation_euler', 2
+ 'pose.bones["' + bname + '"].rotation_euler', index=2
)
# Add keyframe so noise works
- swayX.keyframe_points.add()
- swayY.keyframe_points.add()
+ swayX.keyframe_points.add(1)
+ swayY.keyframe_points.add(1)
swayX.keyframe_points[0].co = (0, 0)
swayY.keyframe_points[0].co = (0, 0)
@@ -1257,7 +1259,7 @@ def fabricate_stems(addsplinetobone, addstem, baseSize, branches, childP, cu, cu
def perform_pruning(baseSize, baseSplits, childP, cu, currentMax, currentMin, currentScale, curve,
- curveBack, curveRes, deleteSpline, forceSprout, handles, n, oldMax, orginalSplineToBone,
+ curveBack, curveRes, deleteSpline, forceSprout, handles, n, oldMax, originalSplineToBone,
originalCo, originalCurv, originalCurvV, originalHandleL, originalHandleR, originalLength,
originalSeg, prune, prunePowerHigh, prunePowerLow, pruneRatio, pruneWidth, pruneBase,
pruneWidthPeak, randState, ratio, scaleVal, segSplits, splineToBone, splitAngle, splitAngleV,
@@ -1291,7 +1293,7 @@ def perform_pruning(baseSize, baseSplits, childP, cu, currentMax, currentMin, cu
st.seg = originalSeg
st.p = newPoint
newPoint.radius = st.radS
- splineToBone = orginalSplineToBone
+ splineToBone = originalSplineToBone
# Initialise the spline list for those contained in the current level of branching
splineList = [st]
@@ -1594,12 +1596,12 @@ def addTree(props):
handles = 'VECTOR'
for ob in bpy.data.objects:
- ob.select = False
+ ob.select_set(state=False)
# Initialise the tree object and curve and adjust the settings
cu = bpy.data.curves.new('tree', 'CURVE')
treeOb = bpy.data.objects.new('tree', cu)
- bpy.context.scene.objects.link(treeOb)
+ bpy.context.scene.collection.objects.link(treeOb)
# treeOb.location=bpy.context.scene.cursor_location attractUp
@@ -1621,14 +1623,14 @@ def addTree(props):
enCu = bpy.data.curves.new('envelope', 'CURVE')
enOb = bpy.data.objects.new('envelope', enCu)
enOb.parent = treeOb
- bpy.context.scene.objects.link(enOb)
+ bpy.context.scene.collection.objects.link(enOb)
newSpline = enCu.splines.new('BEZIER')
newPoint = newSpline.bezier_points[-1]
newPoint.co = Vector((0, 0, scaleVal))
(newPoint.handle_right_type, newPoint.handle_left_type) = (enHandle, enHandle)
# Set the coordinates by varying the z value, envelope will be aligned to the x-axis
for c in range(enNum):
- newSpline.bezier_points.add()
+ newSpline.bezier_points.add(1)
newPoint = newSpline.bezier_points[-1]
ratioVal = (c + 1) / (enNum)
zVal = scaleVal - scaleVal * (1 - pruneBase) * ratioVal
@@ -1646,7 +1648,7 @@ def addTree(props):
(newPoint.handle_right_type, newPoint.handle_left_type) = (enHandle, enHandle)
# Create a second envelope but this time on the y-axis
for c in range(enNum):
- newSpline.bezier_points.add()
+ newSpline.bezier_points.add(1)
newPoint = newSpline.bezier_points[-1]
ratioVal = (c + 1) / (enNum)
zVal = scaleVal - scaleVal * (1 - pruneBase) * ratioVal
@@ -1721,14 +1723,14 @@ def addTree(props):
currentScale = 1.0
oldMax = 1.0
deleteSpline = False
- orginalSplineToBone = copy.copy(splineToBone)
+ originalSplineToBone = copy.copy(splineToBone)
forceSprout = False
# Now do the iterative pruning, this uses a binary search and halts once the difference
# between upper and lower bounds of the search are less than 0.005
ratio, splineToBone = perform_pruning(
baseSize, baseSplits, childP, cu, currentMax, currentMin,
currentScale, curve, curveBack, curveRes, deleteSpline, forceSprout,
- handles, n, oldMax, orginalSplineToBone, originalCo, originalCurv,
+ handles, n, oldMax, originalSplineToBone, originalCo, originalCurv,
originalCurvV, originalHandleL, originalHandleR, originalLength,
originalSeg, prune, prunePowerHigh, prunePowerLow, pruneRatio,
pruneWidth, pruneBase, pruneWidthPeak, randState, ratio, scaleVal,
@@ -1787,7 +1789,7 @@ def addTree(props):
# edges are currently added by validating the mesh which isn't great
leafMesh = bpy.data.meshes.new('leaves')
leafObj = bpy.data.objects.new('leaves', leafMesh)
- bpy.context.scene.objects.link(leafObj)
+ bpy.context.scene.collection.objects.link(leafObj)
leafObj.parent = treeOb
leafMesh.from_pydata(leafVerts, (), leafFaces)
@@ -1816,7 +1818,7 @@ def addTree(props):
# add leaf UVs
if leafShape == 'rect':
- leafMesh.uv_textures.new("leafUV")
+ leafMesh.uv_layers.new(name='leafUV')
uvlayer = leafMesh.uv_layers.active.data
u1 = .5 * (1 - leafScaleX)
@@ -1829,7 +1831,7 @@ def addTree(props):
uvlayer[i * 4 + 3].uv = Vector((u1, 0))
elif leafShape == 'hex':
- leafMesh.uv_textures.new("leafUV")
+ leafMesh.uv_layers.new(name='leafUV')
uvlayer = leafMesh.uv_layers.active.data
u1 = .5 * (1 - leafScaleX)
@@ -1877,7 +1879,7 @@ def addTree(props):
treeMesh = bpy.data.meshes.new('treemesh')
treeObj = bpy.data.objects.new('treemesh', treeMesh)
- bpy.context.scene.objects.link(treeObj)
+ bpy.context.scene.collection.objects.link(treeObj)
treeVerts = []
treeEdges = []
@@ -1995,7 +1997,7 @@ def addTree(props):
if useArm:
armMod = treeObj.modifiers.new('windSway', 'ARMATURE')
if previewArm:
- bpy.data.objects['treeArm'].hide = True
+ bpy.data.objects['treeArm'].hide_viewport = True
bpy.data.armatures['tree'].display_type = 'STICK'
armMod.object = bpy.data.objects['treeArm']
armMod.use_bone_envelopes = False