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:
Diffstat (limited to 'mesh_tissue/tissue_properties.py')
-rw-r--r--mesh_tissue/tissue_properties.py1060
1 files changed, 1060 insertions, 0 deletions
diff --git a/mesh_tissue/tissue_properties.py b/mesh_tissue/tissue_properties.py
new file mode 100644
index 00000000..433e60ea
--- /dev/null
+++ b/mesh_tissue/tissue_properties.py
@@ -0,0 +1,1060 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# ---------------------------- ADAPTIVE DUPLIFACES --------------------------- #
+# ------------------------------- version 0.84 ------------------------------- #
+# #
+# Creates duplicates of selected mesh to active morphing the shape according #
+# to target faces. #
+# #
+# (c) Alessandro Zomparelli #
+# (2017) #
+# #
+# http://www.co-de-it.com/ #
+# #
+# ############################################################################ #
+
+import bpy
+from bpy.types import (
+ Operator,
+ Panel,
+ PropertyGroup,
+ )
+from bpy.props import (
+ BoolProperty,
+ EnumProperty,
+ FloatProperty,
+ IntProperty,
+ StringProperty,
+ PointerProperty
+)
+from . import config
+
+
+def update_dependencies(ob, objects):
+ type = ob.tissue.tissue_type
+ if type == 'NONE': return objects
+ if ob.tissue.bool_dependencies:
+ deps = get_deps(ob)
+ for o in deps:
+ if o.tissue.tissue_type == 'NONE' or o.tissue.bool_lock or o in objects:
+ continue
+ objects.append(o)
+ objects = update_dependencies(o, objects)
+ return objects
+
+def get_deps(ob):
+ type = ob.tissue.tissue_type
+ if type == 'TESSELLATE':
+ return [ob.tissue_tessellate.generator, ob.tissue_tessellate.component]
+ elif type == 'TO_CURVE':
+ return [ob.tissue_to_curve.object]
+ else: return []
+
+def anim_tessellate_active(self, context):
+ ob = context.object
+ props = ob.tissue_tessellate
+ if not (ob.tissue.bool_lock or props.bool_hold):
+ try:
+ props.generator.name
+ if props.component_mode == 'OBJECT':
+ props.component.name
+ elif props.component_mode == 'COLLECTION':
+ props.component_coll.name
+ bpy.ops.object.tissue_update_tessellate()
+ except: pass
+
+def anim_tessellate_object(ob):
+ try:
+ #bpy.context.view_layer.objects.active = ob
+ bpy.ops.object.tissue_update_tessellate()
+ except:
+ return None
+
+#from bpy.app.handlers import persistent
+
+
+def anim_tessellate(scene, depsgraph=None):
+ print('Tissue: animating tessellations...')
+
+ #config.evaluatedDepsgraph = depsgraph
+
+ try:
+ active_object = bpy.context.object
+ old_mode = bpy.context.object.mode
+ selected_objects = bpy.context.selected_objects
+ except: active_object = old_mode = selected_objects = None
+
+ if old_mode in ('OBJECT', 'PAINT_WEIGHT'):
+ update_objects = []
+ for ob in scene.objects:
+ if ob.tissue.bool_run and not ob.tissue.bool_lock:
+ if ob not in update_objects: update_objects.append(ob)
+ update_objects = list(reversed(update_dependencies(ob, update_objects)))
+ for ob in update_objects:
+ #override = {'object': ob}
+ for window in bpy.context.window_manager.windows:
+ screen = window.screen
+ for area in screen.areas:
+ if area.type == 'VIEW_3D':
+ override = bpy.context.copy()
+ override['window'] = window
+ override['screen'] = screen
+ override['area'] = area
+ override['selected_objects'] = [ob]
+ override['object'] = ob
+ override['active_object'] = ob
+ override['selected_editable_objects'] = [ob]
+ override['mode'] = 'OBJECT'
+ override['view_layer'] = scene.view_layers[0]
+ break
+ if ob.tissue.tissue_type == 'TESSELLATE':
+ bpy.ops.object.tissue_update_tessellate(override)
+ elif ob.tissue.tissue_type == 'TO_CURVE':
+ bpy.ops.object.tissue_convert_to_curve_update(override)
+
+ if old_mode != None:
+ objects = bpy.context.view_layer.objects
+ objects.active = active_object
+ for o in objects: o.select_set(o in selected_objects)
+ bpy.ops.object.mode_set(mode=old_mode)
+
+ config.evaluatedDepsgraph = None
+ print('end')
+ return
+'''
+def OLD_anim_tessellate(scene, depsgraph):
+ print('Tissue: animating tessellations...')
+
+ #global evaluatedDepsgraph
+ #print(evaluatedDepsgraph)
+ print(config.evaluatedDepsgraph)
+ config.evaluatedDepsgraph = depsgraph
+ print(config.evaluatedDepsgraph)
+
+ try:
+ active_object = bpy.context.object
+ old_mode = bpy.context.object.mode
+ selected_objects = bpy.context.selected_objects
+ except: active_object = old_mode = selected_objects = None
+
+ if old_mode in ('OBJECT', 'PAINT_WEIGHT') or True:
+ update_objects = []
+ for ob in scene.objects:
+ if ob.tissue.bool_run and not ob.tissue.bool_lock:
+ if ob not in update_objects: update_objects.append(ob)
+ update_objects = list(reversed(update_dependencies(ob, update_objects)))
+ for ob in update_objects:
+ for window in bpy.context.window_manager.windows:
+ screen = window.screen
+ for area in screen.areas:
+ if area.type == 'VIEW_3D':
+ override = bpy.context.copy()
+ override['window'] = window
+ override['screen'] = screen
+ override['area'] = area
+ override['selected_objects'] = [ob]
+ override['object'] = ob
+ override['active_object'] = ob
+ override['selected_editable_objects'] = [ob]
+ override['mode'] = 'OBJECT'
+ override['view_layer'] = scene.view_layers[0]
+ break
+ bpy.ops.object.tissue_update_tessellate(override)
+
+ config.evaluatedDepsgraph = None
+ print('end')
+ print(config.evaluatedDepsgraph)
+ return
+'''
+def remove_tessellate_handler():
+ tissue_handlers = []
+ blender_handlers = bpy.app.handlers.frame_change_post
+ for h in blender_handlers:
+ if "anim_tessellate" in str(h):
+ tissue_handlers.append(h)
+ for h in tissue_handlers: blender_handlers.remove(h)
+
+def set_tessellate_handler(self, context):
+
+ remove_tessellate_handler()
+ for o in context.scene.objects:
+ if o.tissue.bool_run:
+ blender_handlers = bpy.app.handlers.frame_change_post
+ blender_handlers.append(anim_tessellate)
+ break
+ return
+
+
+class tissue_prop(PropertyGroup):
+ bool_lock : BoolProperty(
+ name="Lock",
+ description="Prevent automatic update on settings changes or if other objects have it in the hierarchy.",
+ default=False
+ )
+ bool_dependencies : BoolProperty(
+ name="Update Dependencies",
+ description="Automatically updates source objects, when possible",
+ default=False
+ )
+ bool_run : BoolProperty(
+ name="Animatable",
+ description="Automatically recompute the geometry when the frame is changed. Tessellations may not work using the default Render Animation",
+ default = False,
+ update = set_tessellate_handler
+ )
+ tissue_type : EnumProperty(
+ items=(
+ ('NONE', "None", ""),
+ ('TESSELLATE', "Tessellate", ""),
+ ('TO_CURVE', "To Curve", "")
+ ),
+ default='NONE',
+ name=""
+ )
+
+class tissue_tessellate_prop(PropertyGroup):
+ bool_hold : BoolProperty(
+ name="Hold",
+ description="Wait...",
+ default=False
+ )
+ zscale : FloatProperty(
+ name="Scale", default=1, soft_min=0, soft_max=10,
+ description="Scale factor for the component thickness",
+ update = anim_tessellate_active
+ )
+ component_mode : EnumProperty(
+ items=(
+ ('OBJECT', "Object", "Use the same component object for all the faces"),
+ ('COLLECTION', "Collection", "Use multiple components from Collection"),
+ ('MATERIALS', "Materials", "Use multiple components by materials name")
+ ),
+ default='OBJECT',
+ name="Component Mode",
+ update = anim_tessellate_active
+ )
+ scale_mode : EnumProperty(
+ items=(
+ ('CONSTANT', "Constant", "Uniform thinkness"),
+ ('ADAPTIVE', "Relative", "Preserve component's proportions")
+ ),
+ default='ADAPTIVE',
+ name="Z-Scale according to faces size",
+ update = anim_tessellate_active
+ )
+ offset : FloatProperty(
+ name="Surface Offset",
+ default=1,
+ min=-1,
+ max=1,
+ soft_min=-1,
+ soft_max=1,
+ description="Surface offset",
+ update = anim_tessellate_active
+ )
+ mode : EnumProperty(
+ items=(
+ ('BOUNDS', "Bounds", "The component fits automatically the size of the target face"),
+ ('LOCAL', "Local", "Based on Local coordinates, from 0 to 1"),
+ ('GLOBAL', 'Global', "Based on Global coordinates, from 0 to 1")),
+ default='BOUNDS',
+ name="Component Mode",
+ update = anim_tessellate_active
+ )
+ rotation_mode : EnumProperty(
+ items=(('RANDOM', "Random", "Random faces rotation"),
+ ('UV', "Active UV", "Rotate according to UV coordinates"),
+ ('WEIGHT', "Weight Gradient", "Rotate according to Vertex Group gradient"),
+ ('DEFAULT', "Default", "Default rotation")),
+ default='DEFAULT',
+ name="Component Rotation",
+ update = anim_tessellate_active
+ )
+ rotation_direction : EnumProperty(
+ items=(('ORTHO', "Orthogonal", "Component main directions in XY"),
+ ('DIAG', "Diagonal", "Component main direction aligned with diagonal")),
+ default='ORTHO',
+ name="Direction",
+ update = anim_tessellate_active
+ )
+ rotation_shift : IntProperty(
+ name="Shift",
+ default=0,
+ soft_min=0,
+ soft_max=3,
+ description="Shift components rotation",
+ update = anim_tessellate_active
+ )
+ fill_mode : EnumProperty(
+ items=(
+ ('TRI', 'Tri', 'Triangulate the base mesh'),
+ ('QUAD', 'Quad', 'Regular quad tessellation. Uses only 3 or 4 vertices'),
+ ('FAN', 'Fan', 'Radial tessellation for polygonal faces'),
+ ('PATCH', 'Patch', 'Curved tessellation according to the last ' +
+ 'Subsurf\n(or Multires) modifiers. Works only with 4 sides ' +
+ 'patches.\nAfter the last Subsurf (or Multires) only ' +
+ 'deformation\nmodifiers can be used'),
+ ('FRAME', 'Frame', 'Tessellation along the edges of each face')),
+ default='QUAD',
+ name="Fill Mode",
+ update = anim_tessellate_active
+ )
+ combine_mode : EnumProperty(
+ items=(
+ ('LAST', 'Last', 'Show only the last iteration'),
+ ('UNUSED', 'Unused', 'Combine each iteration with the unused faces of the previous iteration. Used for branching systems'),
+ ('ALL', 'All', 'Combine the result of all iterations')),
+ default='LAST',
+ name="Combine Mode",
+ update = anim_tessellate_active
+ )
+ gen_modifiers : BoolProperty(
+ name="Generator Modifiers",
+ default=True,
+ description="Apply Modifiers and Shape Keys to the base object",
+ update = anim_tessellate_active
+ )
+ com_modifiers : BoolProperty(
+ name="Component Modifiers",
+ default=True,
+ description="Apply Modifiers and Shape Keys to the component object",
+ update = anim_tessellate_active
+ )
+ merge : BoolProperty(
+ name="Merge",
+ default=False,
+ description="Merge vertices in adjacent duplicates",
+ update = anim_tessellate_active
+ )
+ merge_open_edges_only : BoolProperty(
+ name="Open edges only",
+ default=False,
+ description="Merge only open edges",
+ update = anim_tessellate_active
+ )
+ merge_thres : FloatProperty(
+ name="Distance",
+ default=0.0001,
+ soft_min=0,
+ soft_max=10,
+ description="Limit below which to merge vertices",
+ update = anim_tessellate_active
+ )
+ generator : PointerProperty(
+ type=bpy.types.Object,
+ name="",
+ description="Base object for the tessellation",
+ update = anim_tessellate_active
+ )
+ component : PointerProperty(
+ type=bpy.types.Object,
+ name="",
+ description="Component object for the tessellation",
+ #default="",
+ update = anim_tessellate_active
+ )
+ component_coll : PointerProperty(
+ type=bpy.types.Collection,
+ name="",
+ description="Use objects inside the collection",
+ #default="",
+ update = anim_tessellate_active
+ )
+ target : PointerProperty(
+ type=bpy.types.Object,
+ name="",
+ description="Target object for custom direction",
+ #default="",
+ update = anim_tessellate_active
+ )
+ even_thickness : BoolProperty(
+ name="Even Thickness",
+ default=False,
+ description="Iterative sampling method for determine the correct length of the vectors (Experimental)",
+ update = anim_tessellate_active
+ )
+ even_thickness_iter : IntProperty(
+ name="Even Thickness Iterations",
+ default=3,
+ min = 1,
+ soft_max = 20,
+ description="More iterations produces more accurate results but make the tessellation slower",
+ update = anim_tessellate_active
+ )
+ bool_random : BoolProperty(
+ name="Randomize",
+ default=False,
+ description="Randomize component rotation",
+ update = anim_tessellate_active
+ )
+ rand_seed : IntProperty(
+ name="Seed",
+ default=0,
+ soft_min=0,
+ soft_max=50,
+ description="Random seed",
+ update = anim_tessellate_active
+ )
+ coll_rand_seed : IntProperty(
+ name="Seed",
+ default=0,
+ soft_min=0,
+ soft_max=50,
+ description="Random seed",
+ update = anim_tessellate_active
+ )
+ rand_step : IntProperty(
+ name="Steps",
+ default=1,
+ min=1,
+ soft_max=2,
+ description="Random step",
+ update = anim_tessellate_active
+ )
+ bool_vertex_group : BoolProperty(
+ name="Map Vertex Group",
+ default=False,
+ description="Transfer all Vertex Groups from Base object",
+ update = anim_tessellate_active
+ )
+ bool_selection : BoolProperty(
+ name="On selected Faces",
+ default=False,
+ description="Create Tessellation only on selected faces",
+ update = anim_tessellate_active
+ )
+ bool_shapekeys : BoolProperty(
+ name="Use Shape Keys",
+ default=False,
+ description="Transfer Component's Shape Keys. If the name of Vertex "
+ "Groups and Shape Keys are the same, they will be "
+ "automatically combined",
+ update = anim_tessellate_active
+ )
+ bool_smooth : BoolProperty(
+ name="Smooth Shading",
+ default=False,
+ description="Output faces with smooth shading rather than flat shaded",
+ update = anim_tessellate_active
+ )
+ bool_materials : BoolProperty(
+ name="Transfer Materials",
+ default=False,
+ description="Preserve component's materials",
+ update = anim_tessellate_active
+ )
+ bool_material_id : BoolProperty(
+ name="Tessellation on Material ID",
+ default=False,
+ description="Apply the component only on the selected Material",
+ update = anim_tessellate_active
+ )
+ material_id : IntProperty(
+ name="Index",
+ default=0,
+ min=0,
+ description="Only the faces with the chosen Material Index will be used",
+ update = anim_tessellate_active
+ )
+ bool_dissolve_seams : BoolProperty(
+ name="Dissolve Seams",
+ default=False,
+ description="Dissolve all seam edges",
+ update = anim_tessellate_active
+ )
+ iterations : IntProperty(
+ name="Iterations",
+ default=1,
+ min=1,
+ soft_max=5,
+ description="Automatically repeat the Tessellation using the "
+ + "generated geometry as new base object.\nUsefull for "
+ + "for branching systems. Dangerous!",
+ update = anim_tessellate_active
+ )
+ bool_combine : BoolProperty(
+ name="Combine unused",
+ default=False,
+ description="Combine the generated geometry with unused faces",
+ update = anim_tessellate_active
+ )
+ bool_advanced : BoolProperty(
+ name="Advanced Settings",
+ default=False,
+ description="Show more settings"
+ )
+ normals_mode : EnumProperty(
+ items=(
+ ('VERTS', 'Normals', 'Consistent direction based on vertices normal'),
+ ('FACES', 'Faces', 'Based on individual faces normal'),
+ ('CUSTOM', 'Custom', 'Custom split normals'),
+ ('SHAPEKEYS', 'Keys', "According to base object's shape keys"),
+ ('OBJECT', 'Object', "According to a target object")),
+ default='VERTS',
+ name="Direction",
+ update = anim_tessellate_active
+ )
+ error_message : StringProperty(
+ name="Error Message",
+ default=""
+ )
+ warning_message : StringProperty(
+ name="Warning Message",
+ default=""
+ )
+ warning_message_thickness : StringProperty(
+ name="Warning Message Thickness",
+ default=""
+ )
+ warning_message_merge : StringProperty(
+ name="Warning Message Merge",
+ default=""
+ )
+ bounds_x : EnumProperty(
+ items=(
+ ('EXTEND', 'Extend', 'Default X coordinates'),
+ ('CLIP', 'Clip', 'Trim out of bounds in X direction'),
+ ('CYCLIC', 'Cyclic', 'Cyclic components in X direction')),
+ default='EXTEND',
+ name="Bounds X",
+ update = anim_tessellate_active
+ )
+ bounds_y : EnumProperty(
+ items=(
+ ('EXTEND', 'Extend', 'Default Y coordinates'),
+ ('CLIP', 'Clip', 'Trim out of bounds in Y direction'),
+ ('CYCLIC', 'Cyclic', 'Cyclic components in Y direction')),
+ default='EXTEND',
+ name="Bounds Y",
+ update = anim_tessellate_active
+ )
+ close_mesh : EnumProperty(
+ items=(
+ ('NONE', 'None', 'Keep the mesh open'),
+ ('CAP', 'Cap Holes', 'Automatically cap open loops'),
+ ('BRIDGE', 'Bridge Open Loops', 'Automatically bridge loop pairs'),
+ ('BRIDGE_CAP', 'Custom', 'Bridge loop pairs and cap holes according to vertex groups')),
+ default='NONE',
+ name="Close Mesh",
+ update = anim_tessellate_active
+ )
+ cap_faces : BoolProperty(
+ name="Cap Holes",
+ default=False,
+ description="Cap open edges loops",
+ update = anim_tessellate_active
+ )
+ frame_boundary : BoolProperty(
+ name="Frame Boundary",
+ default=False,
+ description="Support face boundaries",
+ update = anim_tessellate_active
+ )
+ fill_frame : BoolProperty(
+ name="Fill Frame",
+ default=False,
+ description="Fill inner faces with Fan tessellation",
+ update = anim_tessellate_active
+ )
+ boundary_mat_offset : IntProperty(
+ name="Material Offset",
+ default=0,
+ description="Material Offset for boundaries (with Multi Components or Material ID)",
+ update = anim_tessellate_active
+ )
+ fill_frame_mat : IntProperty(
+ name="Material Offset",
+ default=0,
+ description="Material Offset for inner faces (with Multi Components or Material ID)",
+ update = anim_tessellate_active
+ )
+ open_edges_crease : FloatProperty(
+ name="Open Edges Crease",
+ default=0,
+ min=0,
+ max=1,
+ description="Automatically set crease for open edges",
+ update = anim_tessellate_active
+ )
+ bridge_edges_crease : FloatProperty(
+ name="Bridge Edges Crease",
+ default=0,
+ min=0,
+ max=1,
+ description="Automatically set crease for bridge edges",
+ update = anim_tessellate_active
+ )
+ bridge_smoothness : FloatProperty(
+ name="Smoothness",
+ default=1,
+ min=0,
+ max=1,
+ description="Bridge Smoothness",
+ update = anim_tessellate_active
+ )
+ frame_thickness : FloatProperty(
+ name="Frame Thickness",
+ default=0.2,
+ min=0,
+ soft_max=2,
+ description="Frame Thickness",
+ update = anim_tessellate_active
+ )
+ frame_mode : EnumProperty(
+ items=(
+ ('CONSTANT', 'Constant', 'Even thickness'),
+ ('RELATIVE', 'Relative', 'Frame offset depends on face areas')),
+ default='CONSTANT',
+ name="Offset",
+ update = anim_tessellate_active
+ )
+ bridge_cuts : IntProperty(
+ name="Cuts",
+ default=0,
+ min=0,
+ max=20,
+ description="Bridge Cuts",
+ update = anim_tessellate_active
+ )
+ cap_material_offset : IntProperty(
+ name="Material Offset",
+ default=0,
+ min=0,
+ description="Material index offset for the cap faces",
+ update = anim_tessellate_active
+ )
+ bridge_material_offset : IntProperty(
+ name="Material Offset",
+ default=0,
+ min=0,
+ description="Material index offset for the bridge faces",
+ update = anim_tessellate_active
+ )
+ patch_subs : IntProperty(
+ name="Patch Subdivisions",
+ default=0,
+ min=0,
+ description="Subdivisions levels for Patch tessellation after the first iteration",
+ update = anim_tessellate_active
+ )
+ use_origin_offset : BoolProperty(
+ name="Align to Origins",
+ default=False,
+ description="Define offset according to components origin and local Z coordinate",
+ update = anim_tessellate_active
+ )
+
+ vertex_group_thickness : StringProperty(
+ name="Thickness weight", default='',
+ description="Vertex Group used for thickness",
+ update = anim_tessellate_active
+ )
+ invert_vertex_group_thickness : BoolProperty(
+ name="Invert", default=False,
+ description="Invert the vertex group influence",
+ update = anim_tessellate_active
+ )
+ vertex_group_thickness_factor : FloatProperty(
+ name="Factor",
+ default=0,
+ min=0,
+ max=1,
+ description="Thickness factor to use for zero vertex group influence",
+ update = anim_tessellate_active
+ )
+
+ vertex_group_cap_owner : EnumProperty(
+ items=(
+ ('BASE', 'Base', 'Use base vertex group'),
+ ('COMP', 'Component', 'Use component vertex group')),
+ default='COMP',
+ name="Source",
+ update = anim_tessellate_active
+ )
+ vertex_group_cap : StringProperty(
+ name="Cap Vertex Group", default='',
+ description="Vertex Group used for cap open edges",
+ update = anim_tessellate_active
+ )
+ invert_vertex_group_cap : BoolProperty(
+ name="Invert", default=False,
+ description="Invert the vertex group influence",
+ update = anim_tessellate_active
+ )
+
+ vertex_group_bridge_owner : EnumProperty(
+ items=(
+ ('BASE', 'Base', 'Use base vertex group'),
+ ('COMP', 'Component', 'Use component vertex group')),
+ default='COMP',
+ name="Source",
+ update = anim_tessellate_active
+ )
+ vertex_group_bridge : StringProperty(
+ name="Bridge Vertex Group", default='',
+ description="Vertex Group used for bridge open edges",
+ update = anim_tessellate_active
+ )
+ invert_vertex_group_bridge : BoolProperty(
+ name="Invert", default=False,
+ description="Invert the vertex group influence",
+ update = anim_tessellate_active
+ )
+
+ vertex_group_rotation : StringProperty(
+ name="Rotation weight", default='',
+ description="Vertex Group used for rotation",
+ update = anim_tessellate_active
+ )
+ invert_vertex_group_rotation : BoolProperty(
+ name="Invert", default=False,
+ description="Invert the vertex group influence",
+ update = anim_tessellate_active
+ )
+ smooth_normals : BoolProperty(
+ name="Smooth Normals", default=False,
+ description="Smooth normals of the surface in order to reduce intersections",
+ update = anim_tessellate_active
+ )
+ smooth_normals_iter : IntProperty(
+ name="Iterations",
+ default=5,
+ min=0,
+ description="Smooth iterations",
+ update = anim_tessellate_active
+ )
+ smooth_normals_uv : FloatProperty(
+ name="UV Anisotropy",
+ default=0,
+ min=-1,
+ max=1,
+ description="0 means no anisotropy, -1 represent the U direction, while 1 represent the V direction",
+ update = anim_tessellate_active
+ )
+ vertex_group_smooth_normals : StringProperty(
+ name="Smooth normals weight", default='',
+ description="Vertex Group used for smooth normals",
+ update = anim_tessellate_active
+ )
+ invert_vertex_group_smooth_normals : BoolProperty(
+ name="Invert", default=False,
+ description="Invert the vertex group influence",
+ update = anim_tessellate_active
+ )
+
+ vertex_group_distribution : StringProperty(
+ name="Distribution weight", default='',
+ description="Vertex Group used for gradient distribution",
+ update = anim_tessellate_active
+ )
+ invert_vertex_group_distribution : BoolProperty(
+ name="Invert", default=False,
+ description="Invert the vertex group influence",
+ update = anim_tessellate_active
+ )
+ vertex_group_distribution_factor : FloatProperty(
+ name="Factor",
+ default=0,
+ min=0,
+ max=1,
+ description="Randomness factor to use for zero vertex group influence",
+ update = anim_tessellate_active
+ )
+ consistent_wedges : BoolProperty(
+ name="Consistent Wedges", default=True,
+ description="Use same component for the wedges generated by the Fan tessellation",
+ update = anim_tessellate_active
+ )
+ normals_x : FloatProperty(
+ name="X", default=1, min=0, max=1,
+ description="Scale X component of the normals",
+ update = anim_tessellate_active
+ )
+ normals_y : FloatProperty(
+ name="Y", default=1, min=0, max=1,
+ description="Scale Y component of the normals",
+ update = anim_tessellate_active
+ )
+ normals_z : FloatProperty(
+ name="Z", default=1, min=0, max=1,
+ description="Scale Z component of the normals",
+ update = anim_tessellate_active
+ )
+ vertex_group_scale_normals : StringProperty(
+ name="Scale normals weight", default='',
+ description="Vertex Group used for editing the normals directions",
+ update = anim_tessellate_active
+ )
+ invert_vertex_group_scale_normals : BoolProperty(
+ name="Invert", default=False,
+ description="Invert the vertex group influence",
+ update = anim_tessellate_active
+ )
+ boundary_variable_offset : BoolProperty(
+ name="Boundary Variable Offset", default=False,
+ description="Additional material offset based on the number of boundary vertices",
+ update = anim_tessellate_active
+ )
+ auto_rotate_boundary : BoolProperty(
+ name="Automatic Rotation", default=False,
+ description="Automatically rotate the boundary faces",
+ update = anim_tessellate_active
+ )
+
+def store_parameters(operator, ob):
+ ob.tissue_tessellate.bool_hold = True
+ if operator.generator in bpy.data.objects.keys():
+ ob.tissue_tessellate.generator = bpy.data.objects[operator.generator]
+ if operator.component in bpy.data.objects.keys():
+ ob.tissue_tessellate.component = bpy.data.objects[operator.component]
+ if operator.component_coll in bpy.data.collections.keys():
+ ob.tissue_tessellate.component_coll = bpy.data.collections[operator.component_coll]
+ if operator.target in bpy.data.objects.keys():
+ ob.tissue_tessellate.target = bpy.data.objects[operator.target]
+ ob.tissue_tessellate.even_thickness = operator.even_thickness
+ ob.tissue_tessellate.even_thickness_iter = operator.even_thickness_iter
+ ob.tissue_tessellate.zscale = operator.zscale
+ ob.tissue_tessellate.offset = operator.offset
+ ob.tissue_tessellate.gen_modifiers = operator.gen_modifiers
+ ob.tissue_tessellate.com_modifiers = operator.com_modifiers
+ ob.tissue_tessellate.mode = operator.mode
+ ob.tissue_tessellate.rotation_mode = operator.rotation_mode
+ ob.tissue_tessellate.rotation_shift = operator.rotation_shift
+ ob.tissue_tessellate.rotation_direction = operator.rotation_direction
+ ob.tissue_tessellate.merge = operator.merge
+ ob.tissue_tessellate.merge_open_edges_only = operator.merge_open_edges_only
+ ob.tissue_tessellate.merge_thres = operator.merge_thres
+ ob.tissue_tessellate.scale_mode = operator.scale_mode
+ ob.tissue_tessellate.bool_random = operator.bool_random
+ ob.tissue_tessellate.rand_seed = operator.rand_seed
+ ob.tissue_tessellate.coll_rand_seed = operator.coll_rand_seed
+ ob.tissue_tessellate.rand_step = operator.rand_step
+ ob.tissue_tessellate.fill_mode = operator.fill_mode
+ ob.tissue_tessellate.bool_vertex_group = operator.bool_vertex_group
+ ob.tissue_tessellate.bool_selection = operator.bool_selection
+ ob.tissue_tessellate.bool_shapekeys = operator.bool_shapekeys
+ ob.tissue_tessellate.bool_smooth = operator.bool_smooth
+ ob.tissue_tessellate.bool_materials = operator.bool_materials
+ ob.tissue_tessellate.bool_material_id = operator.bool_material_id
+ ob.tissue_tessellate.material_id = operator.material_id
+ ob.tissue_tessellate.bool_dissolve_seams = operator.bool_dissolve_seams
+ ob.tissue_tessellate.iterations = operator.iterations
+ ob.tissue_tessellate.bool_advanced = operator.bool_advanced
+ ob.tissue_tessellate.normals_mode = operator.normals_mode
+ ob.tissue_tessellate.bool_combine = operator.bool_combine
+ ob.tissue_tessellate.combine_mode = operator.combine_mode
+ ob.tissue_tessellate.bounds_x = operator.bounds_x
+ ob.tissue_tessellate.bounds_y = operator.bounds_y
+ ob.tissue_tessellate.cap_faces = operator.cap_faces
+ ob.tissue_tessellate.close_mesh = operator.close_mesh
+ ob.tissue_tessellate.bridge_cuts = operator.bridge_cuts
+ ob.tissue_tessellate.bridge_smoothness = operator.bridge_smoothness
+ ob.tissue_tessellate.frame_thickness = operator.frame_thickness
+ ob.tissue_tessellate.frame_mode = operator.frame_mode
+ ob.tissue_tessellate.frame_boundary = operator.frame_boundary
+ ob.tissue_tessellate.fill_frame = operator.fill_frame
+ ob.tissue_tessellate.boundary_mat_offset = operator.boundary_mat_offset
+ ob.tissue_tessellate.fill_frame_mat = operator.fill_frame_mat
+ ob.tissue_tessellate.cap_material_offset = operator.cap_material_offset
+ ob.tissue_tessellate.patch_subs = operator.patch_subs
+ ob.tissue_tessellate.use_origin_offset = operator.use_origin_offset
+ ob.tissue_tessellate.vertex_group_thickness = operator.vertex_group_thickness
+ ob.tissue_tessellate.invert_vertex_group_thickness = operator.invert_vertex_group_thickness
+ ob.tissue_tessellate.vertex_group_thickness_factor = operator.vertex_group_thickness_factor
+ ob.tissue_tessellate.vertex_group_distribution = operator.vertex_group_distribution
+ ob.tissue_tessellate.invert_vertex_group_distribution = operator.invert_vertex_group_distribution
+ ob.tissue_tessellate.vertex_group_distribution_factor = operator.vertex_group_distribution_factor
+ ob.tissue_tessellate.vertex_group_cap_owner = operator.vertex_group_cap_owner
+ ob.tissue_tessellate.vertex_group_cap = operator.vertex_group_cap
+ ob.tissue_tessellate.invert_vertex_group_cap = operator.invert_vertex_group_cap
+ ob.tissue_tessellate.vertex_group_bridge_owner = operator.vertex_group_bridge_owner
+ ob.tissue_tessellate.vertex_group_bridge = operator.vertex_group_bridge
+ ob.tissue_tessellate.invert_vertex_group_bridge = operator.invert_vertex_group_bridge
+ ob.tissue_tessellate.vertex_group_rotation = operator.vertex_group_rotation
+ ob.tissue_tessellate.invert_vertex_group_rotation = operator.invert_vertex_group_rotation
+ ob.tissue_tessellate.smooth_normals = operator.smooth_normals
+ ob.tissue_tessellate.smooth_normals_iter = operator.smooth_normals_iter
+ ob.tissue_tessellate.smooth_normals_uv = operator.smooth_normals_uv
+ ob.tissue_tessellate.vertex_group_smooth_normals = operator.vertex_group_smooth_normals
+ ob.tissue_tessellate.invert_vertex_group_smooth_normals = operator.invert_vertex_group_smooth_normals
+ ob.tissue_tessellate.component_mode = operator.component_mode
+ ob.tissue_tessellate.consistent_wedges = operator.consistent_wedges
+ ob.tissue_tessellate.normals_x = operator.normals_x
+ ob.tissue_tessellate.normals_y = operator.normals_y
+ ob.tissue_tessellate.normals_z = operator.normals_z
+ ob.tissue_tessellate.vertex_group_scale_normals = operator.vertex_group_scale_normals
+ ob.tissue_tessellate.invert_vertex_group_scale_normals = operator.invert_vertex_group_scale_normals
+ ob.tissue_tessellate.boundary_variable_offset = operator.boundary_variable_offset
+ ob.tissue_tessellate.auto_rotate_boundary = operator.auto_rotate_boundary
+ ob.tissue_tessellate.bool_hold = False
+ return ob
+
+def load_parameters(operator, ob):
+ operator.generator = ob.tissue_tessellate.generator.name
+ operator.component = ob.tissue_tessellate.component.name
+ operator.component_coll = ob.tissue_tessellate.component_coll.name
+ operator.zscale = ob.tissue_tessellate.zscale
+ operator.offset = ob.tissue_tessellate.offset
+ operator.gen_modifiers = ob.tissue_tessellate.gen_modifiers
+ operator.com_modifiers = ob.tissue_tessellate.com_modifiers
+ operator.mode = ob.tissue_tessellate.mode
+ operator.rotation_mode = ob.tissue_tessellate.rotation_mode
+ operator.rotation_shift = ob.tissue_tessellate.rotation_shift
+ operator.rotation_direction = ob.tissue_tessellate.rotation_direction
+ operator.merge = ob.tissue_tessellate.merge
+ operator.merge_open_edges_only = ob.tissue_tessellate.merge_open_edges_only
+ operator.merge_thres = ob.tissue_tessellate.merge_thres
+ operator.scale_mode = ob.tissue_tessellate.scale_mode
+ operator.bool_random = ob.tissue_tessellate.bool_random
+ operator.rand_seed = ob.tissue_tessellate.rand_seed
+ operator.coll_rand_seed = ob.tissue_tessellate.coll_rand_seed
+ operator.rand_step = ob.tissue_tessellate.rand_step
+ operator.fill_mode = ob.tissue_tessellate.fill_mode
+ operator.bool_vertex_group = ob.tissue_tessellate.bool_vertex_group
+ operator.bool_selection = ob.tissue_tessellate.bool_selection
+ operator.bool_shapekeys = ob.tissue_tessellate.bool_shapekeys
+ operator.bool_smooth = ob.tissue_tessellate.bool_smooth
+ operator.bool_materials = ob.tissue_tessellate.bool_materials
+ operator.bool_material_id = ob.tissue_tessellate.bool_material_id
+ operator.material_id = ob.tissue_tessellate.material_id
+ operator.bool_dissolve_seams = ob.tissue_tessellate.bool_dissolve_seams
+ operator.iterations = ob.tissue_tessellate.iterations
+ operator.bool_advanced = ob.tissue_tessellate.bool_advanced
+ operator.normals_mode = ob.tissue_tessellate.normals_mode
+ operator.bool_combine = ob.tissue_tessellate.bool_combine
+ operator.combine_mode = ob.tissue_tessellate.combine_mode
+ operator.bounds_x = ob.tissue_tessellate.bounds_x
+ operator.bounds_y = ob.tissue_tessellate.bounds_y
+ operator.cap_faces = ob.tissue_tessellate.cap_faces
+ operator.close_mesh = ob.tissue_tessellate.close_mesh
+ operator.bridge_cuts = ob.tissue_tessellate.bridge_cuts
+ operator.bridge_smoothness = ob.tissue_tessellate.bridge_smoothness
+ operator.cap_material_offset = ob.tissue_tessellate.cap_material_offset
+ operator.patch_subs = ob.tissue_tessellate.patch_subs
+ operator.frame_boundary = ob.tissue_tessellate.frame_boundary
+ operator.fill_frame = ob.tissue_tessellate.fill_frame
+ operator.boundary_mat_offset = ob.tissue_tessellate.boundary_mat_offset
+ operator.fill_frame_mat = ob.tissue_tessellate.fill_frame_mat
+ operator.frame_thickness = ob.tissue_tessellate.frame_thickness
+ operator.frame_mode = ob.tissue_tessellate.frame_mode
+ operator.use_origin_offset = ob.tissue_tessellate.use_origin_offset
+ operator.vertex_group_thickness = ob.tissue_tessellate.vertex_group_thickness
+ operator.invert_vertex_group_thickness = ob.tissue_tessellate.invert_vertex_group_thickness
+ operator.vertex_group_thickness_factor = ob.tissue_tessellate.vertex_group_thickness_factor
+ operator.vertex_group_distribution = ob.tissue_tessellate.vertex_group_distribution
+ operator.invert_vertex_group_distribution = ob.tissue_tessellate.invert_vertex_group_distribution
+ operator.vertex_group_distribution_factor = ob.tissue_tessellate.vertex_group_distribution_factor
+ operator.vertex_group_cap_owner = ob.tissue_tessellate.vertex_group_cap_owner
+ operator.vertex_group_cap = ob.tissue_tessellate.vertex_group_cap
+ operator.invert_vertex_group_cap = ob.tissue_tessellate.invert_vertex_group_cap
+ operator.vertex_group_bridge_owner = ob.tissue_tessellate.vertex_group_bridge_owner
+ operator.vertex_group_bridge = ob.tissue_tessellate.vertex_group_bridge
+ operator.invert_vertex_group_bridge = ob.tissue_tessellate.invert_vertex_group_bridge
+ operator.vertex_group_rotation = ob.tissue_tessellate.vertex_group_rotation
+ operator.invert_vertex_group_rotation = ob.tissue_tessellate.invert_vertex_group_rotation
+ operator.smooth_normals = ob.tissue_tessellate.smooth_normals
+ operator.smooth_normals_iter = ob.tissue_tessellate.smooth_normals_iter
+ operator.smooth_normals_uv = ob.tissue_tessellate.smooth_normals_uv
+ operator.vertex_group_smooth_normals = ob.tissue_tessellate.vertex_group_smooth_normals
+ operator.invert_vertex_group_smooth_normals = ob.tissue_tessellate.invert_vertex_group_smooth_normals
+ operator.component_mode = ob.tissue_tessellate.component_mode
+ operator.consistent_wedges = ob.tissue_tessellate.consistent_wedges
+ operator.normals_x = ob.tissue_tessellate.normals_x
+ operator.normals_y = ob.tissue_tessellate.normals_y
+ operator.normals_z = ob.tissue_tessellate.normals_z
+ operator.vertex_group_scale_normals = ob.tissue_tessellate.vertex_group_scale_normals
+ operator.invert_vertex_group_scale_normals = ob.tissue_tessellate.invert_vertex_group_scale_normals
+ operator.boundary_variable_offset = ob.tissue_tessellate.boundary_variable_offset
+ operator.auto_rotate_boundary = ob.tissue_tessellate.auto_rotate_boundary
+ return ob
+
+def props_to_dict(ob):
+ props = ob.tissue_tessellate
+ tessellate_dict = {}
+ tessellate_dict['self'] = ob
+ tessellate_dict['generator'] = props.generator
+ tessellate_dict['component'] = props.component
+ tessellate_dict['component_coll'] = props.component_coll
+ tessellate_dict['offset'] = props.offset
+ tessellate_dict['zscale'] = props.zscale
+ tessellate_dict['gen_modifiers'] = props.gen_modifiers
+ tessellate_dict['com_modifiers'] = props.com_modifiers
+ tessellate_dict['mode'] = props.mode
+ tessellate_dict['scale_mode'] = props.scale_mode
+ tessellate_dict['rotation_mode'] = props.rotation_mode
+ tessellate_dict['rotation_shift'] = props.rotation_shift
+ tessellate_dict['rotation_direction'] = props.rotation_direction
+ tessellate_dict['rand_seed'] = props.rand_seed
+ tessellate_dict['coll_rand_seed'] = props.coll_rand_seed
+ tessellate_dict['rand_step'] = props.rand_step
+ tessellate_dict['fill_mode'] = props.fill_mode
+ tessellate_dict['bool_vertex_group'] = props.bool_vertex_group
+ tessellate_dict['bool_selection'] = props.bool_selection
+ tessellate_dict['bool_shapekeys'] = props.bool_shapekeys
+ tessellate_dict['bool_material_id'] = props.bool_material_id
+ tessellate_dict['material_id'] = props.material_id
+ tessellate_dict['normals_mode'] = props.normals_mode
+ tessellate_dict['bounds_x'] = props.bounds_x
+ tessellate_dict['bounds_y'] = props.bounds_y
+ tessellate_dict['use_origin_offset'] = props.use_origin_offset
+ tessellate_dict['target'] = props.target
+ tessellate_dict['even_thickness'] = props.even_thickness
+ tessellate_dict['even_thickness_iter'] = props.even_thickness_iter
+ tessellate_dict['frame_thickness'] = props.frame_thickness
+ tessellate_dict['frame_mode'] = props.frame_mode
+ tessellate_dict['frame_boundary'] = props.frame_boundary
+ tessellate_dict['fill_frame'] = props.fill_frame
+ tessellate_dict['boundary_mat_offset'] = props.boundary_mat_offset
+ tessellate_dict['fill_frame_mat'] = props.fill_frame_mat
+ tessellate_dict['vertex_group_thickness'] = props.vertex_group_thickness
+ tessellate_dict['invert_vertex_group_thickness'] = props.invert_vertex_group_thickness
+ tessellate_dict['vertex_group_thickness_factor'] = props.vertex_group_thickness_factor
+ tessellate_dict['vertex_group_distribution'] = props.vertex_group_distribution
+ tessellate_dict['invert_vertex_group_distribution'] = props.invert_vertex_group_distribution
+ tessellate_dict['vertex_group_distribution_factor'] = props.vertex_group_distribution_factor
+ tessellate_dict['vertex_group_cap_owner'] = props.vertex_group_cap_owner
+ tessellate_dict['vertex_group_cap'] = props.vertex_group_cap
+ tessellate_dict['invert_vertex_group_cap'] = props.invert_vertex_group_cap
+ tessellate_dict['vertex_group_bridge_owner'] = props.vertex_group_bridge_owner
+ tessellate_dict['vertex_group_bridge'] = props.vertex_group_bridge
+ tessellate_dict['invert_vertex_group_bridge'] = props.invert_vertex_group_bridge
+ tessellate_dict['vertex_group_rotation'] = props.vertex_group_rotation
+ tessellate_dict['invert_vertex_group_rotation'] = props.invert_vertex_group_rotation
+ tessellate_dict['smooth_normals'] = props.smooth_normals
+ tessellate_dict['smooth_normals_iter'] = props.smooth_normals_iter
+ tessellate_dict['smooth_normals_uv'] = props.smooth_normals_uv
+ tessellate_dict['vertex_group_smooth_normals'] = props.vertex_group_smooth_normals
+ tessellate_dict['invert_vertex_group_smooth_normals'] = props.invert_vertex_group_smooth_normals
+ tessellate_dict['component_mode'] = props.component_mode
+ tessellate_dict['consistent_wedges'] = props.consistent_wedges
+ tessellate_dict["normals_x"] = props.normals_x
+ tessellate_dict["normals_y"] = props.normals_y
+ tessellate_dict["normals_z"] = props.normals_z
+ tessellate_dict["vertex_group_scale_normals"] = props.vertex_group_scale_normals
+ tessellate_dict["invert_vertex_group_scale_normals"] = props.invert_vertex_group_scale_normals
+ tessellate_dict["boundary_variable_offset"] = props.boundary_variable_offset
+ tessellate_dict["auto_rotate_boundary"] = props.auto_rotate_boundary
+ return tessellate_dict
+
+def copy_tessellate_props(source_ob, target_ob):
+ source_props = source_ob.tissue_tessellate
+ target_props = target_ob.tissue_tessellate
+ for key in source_props.keys():
+ target_props[key] = source_props[key]
+ return