Merging r38765 through r38817 from trunk into vgroup_modifiers.
This commit is contained in:
@@ -33,6 +33,7 @@ import bpy as _bpy
|
||||
|
||||
error_duplicates = False
|
||||
|
||||
|
||||
def paths():
|
||||
# RELEASE SCRIPTS: official scripts distributed in Blender releases
|
||||
paths = _bpy.utils.script_paths("addons")
|
||||
|
||||
@@ -43,6 +43,7 @@ from . import utils, path, ops
|
||||
# fake operator module
|
||||
ops = ops.ops_fake_module
|
||||
|
||||
|
||||
def _main():
|
||||
import sys as _sys
|
||||
|
||||
|
||||
@@ -159,14 +159,19 @@ def axis_conversion(from_forward='Y', from_up='Z', to_forward='Y', to_up='Z'):
|
||||
raise Exception("invalid axis arguments passed, "
|
||||
"can't use up/forward on the same axis.")
|
||||
|
||||
value = reduce(int.__or__, (_axis_convert_num[a] << (i * 3) for i, a in enumerate((from_forward, from_up, to_forward, to_up))))
|
||||
value = reduce(int.__or__, (_axis_convert_num[a] << (i * 3)
|
||||
for i, a in enumerate((from_forward,
|
||||
from_up,
|
||||
to_forward,
|
||||
to_up,
|
||||
))))
|
||||
|
||||
for i, axis_lut in enumerate(_axis_convert_lut):
|
||||
if value in axis_lut:
|
||||
return Matrix(_axis_convert_matrix[i])
|
||||
assert(0)
|
||||
|
||||
|
||||
|
||||
def axis_conversion_ensure(operator, forward_attr, up_attr):
|
||||
"""
|
||||
Function to ensure an operator has valid axis conversion settings, intended
|
||||
@@ -174,9 +179,9 @@ def axis_conversion_ensure(operator, forward_attr, up_attr):
|
||||
|
||||
:arg operator: the operator to access axis attributes from.
|
||||
:type operator: :class:`Operator`
|
||||
:arg forward_attr:
|
||||
:arg forward_attr: attribute storing the forward axis
|
||||
:type forward_attr: string
|
||||
:arg up_attr: the directory the *filepath* will be referenced from (normally the export path).
|
||||
:arg up_attr: attribute storing the up axis
|
||||
:type up_attr: string
|
||||
:return: True if the value was modified.
|
||||
:rtype: boolean
|
||||
@@ -184,9 +189,9 @@ def axis_conversion_ensure(operator, forward_attr, up_attr):
|
||||
def validate(axis_forward, axis_up):
|
||||
if axis_forward[-1] == axis_up[-1]:
|
||||
axis_up = axis_up[0:-1] + 'XYZ'[('XYZ'.index(axis_up[-1]) + 1) % 3]
|
||||
|
||||
|
||||
return axis_forward, axis_up
|
||||
|
||||
|
||||
change = False
|
||||
|
||||
axis = getattr(operator, forward_attr), getattr(operator, up_attr)
|
||||
@@ -203,7 +208,7 @@ def axis_conversion_ensure(operator, forward_attr, up_attr):
|
||||
|
||||
# return a tuple (free, object list), free is True if memory should be freed later with free_derived_objects()
|
||||
def create_derived_objects(scene, ob):
|
||||
if ob.parent and ob.parent.dupli_type != 'NONE':
|
||||
if ob.parent and ob.parent.dupli_type in {'VERTS', 'FACES'}:
|
||||
return False, None
|
||||
|
||||
if ob.dupli_type != 'NONE':
|
||||
|
||||
@@ -170,8 +170,8 @@ def edge_loops_from_faces(mesh, faces=None, seams=()):
|
||||
# from knowing the last 2, look for th next.
|
||||
ed_adj = edges[context_loop[-1]]
|
||||
if len(ed_adj) != 2:
|
||||
|
||||
if other_dir and flipped == False: # the original edge had 2 other edges
|
||||
# the original edge had 2 other edges
|
||||
if other_dir and flipped == False:
|
||||
flipped = True # only flip the list once
|
||||
context_loop.reverse()
|
||||
ed_adj[:] = []
|
||||
@@ -259,13 +259,15 @@ def edge_loops_from_edges(mesh, edges=None):
|
||||
|
||||
def ngon_tesselate(from_data, indices, fix_loops=True):
|
||||
'''
|
||||
Takes a polyline of indices (fgon)
|
||||
and returns a list of face indicie lists.
|
||||
Designed to be used for importers that need indices for an fgon to create from existing verts.
|
||||
Takes a polyline of indices (fgon) and returns a list of face
|
||||
indicie lists. Designed to be used for importers that need indices for an
|
||||
fgon to create from existing verts.
|
||||
|
||||
from_data: either a mesh, or a list/tuple of vectors.
|
||||
indices: a list of indices to use this list is the ordered closed polyline to fill, and can be a subset of the data given.
|
||||
fix_loops: If this is enabled polylines that use loops to make multiple polylines are delt with correctly.
|
||||
indices: a list of indices to use this list is the ordered closed polyline
|
||||
to fill, and can be a subset of the data given.
|
||||
fix_loops: If this is enabled polylines that use loops to make multiple
|
||||
polylines are delt with correctly.
|
||||
'''
|
||||
|
||||
from mathutils.geometry import tesselate_polygon
|
||||
@@ -276,7 +278,8 @@ def ngon_tesselate(from_data, indices, fix_loops=True):
|
||||
return []
|
||||
|
||||
def mlen(co):
|
||||
return abs(co[0]) + abs(co[1]) + abs(co[2]) # manhatten length of a vector, faster then length
|
||||
# manhatten length of a vector, faster then length
|
||||
return abs(co[0]) + abs(co[1]) + abs(co[2])
|
||||
|
||||
def vert_treplet(v, i):
|
||||
return v, vector_to_tuple(v, 6), i, mlen(v)
|
||||
@@ -296,7 +299,8 @@ def ngon_tesselate(from_data, indices, fix_loops=True):
|
||||
else:
|
||||
verts = [from_data.vertices[i].co for ii, i in enumerate(indices)]
|
||||
|
||||
for i in range(len(verts) - 1, 0, -1): # same as reversed(xrange(1, len(verts))):
|
||||
# same as reversed(range(1, len(verts))):
|
||||
for i in range(len(verts) - 1, 0, -1):
|
||||
if verts[i][1] == verts[i - 1][0]:
|
||||
verts.pop(i - 1)
|
||||
|
||||
@@ -304,14 +308,16 @@ def ngon_tesselate(from_data, indices, fix_loops=True):
|
||||
|
||||
else:
|
||||
'''
|
||||
Seperate this loop into multiple loops be finding edges that are used twice
|
||||
This is used by lightwave LWO files a lot
|
||||
Seperate this loop into multiple loops be finding edges that are
|
||||
used twice. This is used by lightwave LWO files a lot
|
||||
'''
|
||||
|
||||
if type(from_data) in (tuple, list):
|
||||
verts = [vert_treplet(Vector(from_data[i]), ii) for ii, i in enumerate(indices)]
|
||||
verts = [vert_treplet(Vector(from_data[i]), ii)
|
||||
for ii, i in enumerate(indices)]
|
||||
else:
|
||||
verts = [vert_treplet(from_data.vertices[i].co, ii) for ii, i in enumerate(indices)]
|
||||
verts = [vert_treplet(from_data.vertices[i].co, ii)
|
||||
for ii, i in enumerate(indices)]
|
||||
|
||||
edges = [(i, i - 1) for i in range(len(verts))]
|
||||
if edges:
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
# <pep8-80 compliant>
|
||||
|
||||
import bpy
|
||||
from bpy.props import StringProperty, BoolProperty, EnumProperty, IntProperty
|
||||
@@ -54,21 +54,35 @@ class SelectPattern(bpy.types.Operator):
|
||||
else:
|
||||
pattern_match = (lambda a, b:
|
||||
fnmatch.fnmatchcase(a.upper(), b.upper()))
|
||||
|
||||
is_ebone = False
|
||||
obj = context.object
|
||||
if obj and obj.mode == 'POSE':
|
||||
items = obj.data.bones
|
||||
if not self.extend:
|
||||
bpy.ops.pose.select_all(action='DESELECT')
|
||||
elif obj and obj.type == 'ARMATURE' and obj.mode == 'EDIT':
|
||||
items = obj.data.edit_bones
|
||||
if not self.extend:
|
||||
bpy.ops.armature.select_all(action='DESELECT')
|
||||
is_ebone = True
|
||||
else:
|
||||
items = context.visible_objects
|
||||
if not self.extend:
|
||||
bpy.ops.object.select_all(action='DESELECT')
|
||||
|
||||
# Can be pose bones or objects
|
||||
for item in items:
|
||||
if pattern_match(item.name, self.pattern):
|
||||
item.select = True
|
||||
elif not self.extend:
|
||||
item.select = False
|
||||
|
||||
# hrmf, perhaps there should be a utility function for this.
|
||||
if is_ebone:
|
||||
item.select_head = True
|
||||
item.select_tail = True
|
||||
if item.use_connect:
|
||||
item_parent = item.parent
|
||||
if item_parent is not None:
|
||||
item_parent.select_tail = True
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
@@ -107,7 +121,8 @@ class SelectCamera(bpy.types.Operator):
|
||||
|
||||
|
||||
class SelectHierarchy(bpy.types.Operator):
|
||||
'''Select object relative to the active objects position in the hierarchy'''
|
||||
'''Select object relative to the active objects position''' \
|
||||
'''in the hierarchy'''
|
||||
bl_idname = "object.select_hierarchy"
|
||||
bl_label = "Select Hierarchy"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
@@ -332,53 +347,90 @@ class ShapeTransfer(bpy.types.Operator):
|
||||
ob_add_shape(ob_other, orig_key_name)
|
||||
|
||||
# editing the final coords, only list that stores wrapped coords
|
||||
target_shape_coords = [v.co for v in ob_other.active_shape_key.data]
|
||||
target_shape_coords = [v.co for v in
|
||||
ob_other.active_shape_key.data]
|
||||
|
||||
median_coords = [[] for i in range(len(me.vertices))]
|
||||
|
||||
# Method 1, edge
|
||||
if mode == 'OFFSET':
|
||||
for i, vert_cos in enumerate(median_coords):
|
||||
vert_cos.append(target_coords[i] + (orig_shape_coords[i] - orig_coords[i]))
|
||||
vert_cos.append(target_coords[i] +
|
||||
(orig_shape_coords[i] - orig_coords[i]))
|
||||
|
||||
elif mode == 'RELATIVE_FACE':
|
||||
for face in me.faces:
|
||||
i1, i2, i3, i4 = face.vertices_raw
|
||||
if i4 != 0:
|
||||
pt = barycentric_transform(orig_shape_coords[i1],
|
||||
orig_coords[i4], orig_coords[i1], orig_coords[i2],
|
||||
target_coords[i4], target_coords[i1], target_coords[i2])
|
||||
orig_coords[i4],
|
||||
orig_coords[i1],
|
||||
orig_coords[i2],
|
||||
target_coords[i4],
|
||||
target_coords[i1],
|
||||
target_coords[i2],
|
||||
)
|
||||
median_coords[i1].append(pt)
|
||||
|
||||
pt = barycentric_transform(orig_shape_coords[i2],
|
||||
orig_coords[i1], orig_coords[i2], orig_coords[i3],
|
||||
target_coords[i1], target_coords[i2], target_coords[i3])
|
||||
orig_coords[i1],
|
||||
orig_coords[i2],
|
||||
orig_coords[i3],
|
||||
target_coords[i1],
|
||||
target_coords[i2],
|
||||
target_coords[i3],
|
||||
)
|
||||
median_coords[i2].append(pt)
|
||||
|
||||
pt = barycentric_transform(orig_shape_coords[i3],
|
||||
orig_coords[i2], orig_coords[i3], orig_coords[i4],
|
||||
target_coords[i2], target_coords[i3], target_coords[i4])
|
||||
orig_coords[i2],
|
||||
orig_coords[i3],
|
||||
orig_coords[i4],
|
||||
target_coords[i2],
|
||||
target_coords[i3],
|
||||
target_coords[i4],
|
||||
)
|
||||
median_coords[i3].append(pt)
|
||||
|
||||
pt = barycentric_transform(orig_shape_coords[i4],
|
||||
orig_coords[i3], orig_coords[i4], orig_coords[i1],
|
||||
target_coords[i3], target_coords[i4], target_coords[i1])
|
||||
orig_coords[i3],
|
||||
orig_coords[i4],
|
||||
orig_coords[i1],
|
||||
target_coords[i3],
|
||||
target_coords[i4],
|
||||
target_coords[i1],
|
||||
)
|
||||
median_coords[i4].append(pt)
|
||||
|
||||
else:
|
||||
pt = barycentric_transform(orig_shape_coords[i1],
|
||||
orig_coords[i3], orig_coords[i1], orig_coords[i2],
|
||||
target_coords[i3], target_coords[i1], target_coords[i2])
|
||||
orig_coords[i3],
|
||||
orig_coords[i1],
|
||||
orig_coords[i2],
|
||||
target_coords[i3],
|
||||
target_coords[i1],
|
||||
target_coords[i2],
|
||||
)
|
||||
median_coords[i1].append(pt)
|
||||
|
||||
pt = barycentric_transform(orig_shape_coords[i2],
|
||||
orig_coords[i1], orig_coords[i2], orig_coords[i3],
|
||||
target_coords[i1], target_coords[i2], target_coords[i3])
|
||||
orig_coords[i1],
|
||||
orig_coords[i2],
|
||||
orig_coords[i3],
|
||||
target_coords[i1],
|
||||
target_coords[i2],
|
||||
target_coords[i3],
|
||||
)
|
||||
median_coords[i2].append(pt)
|
||||
|
||||
pt = barycentric_transform(orig_shape_coords[i3],
|
||||
orig_coords[i2], orig_coords[i3], orig_coords[i1],
|
||||
target_coords[i2], target_coords[i3], target_coords[i1])
|
||||
orig_coords[i2],
|
||||
orig_coords[i3],
|
||||
orig_coords[i1],
|
||||
target_coords[i2],
|
||||
target_coords[i3],
|
||||
target_coords[i1],
|
||||
)
|
||||
median_coords[i3].append(pt)
|
||||
|
||||
elif mode == 'RELATIVE_EDGE':
|
||||
@@ -416,7 +468,8 @@ class ShapeTransfer(bpy.types.Operator):
|
||||
if use_clamp:
|
||||
# clamp to the same movement as the original
|
||||
# breaks copy between different scaled meshes.
|
||||
len_from = (orig_shape_coords[i] - orig_coords[i]).length
|
||||
len_from = (orig_shape_coords[i] -
|
||||
orig_coords[i]).length
|
||||
ofs = co - target_coords[i]
|
||||
ofs.length = len_from
|
||||
co = target_coords[i] + ofs
|
||||
@@ -498,7 +551,13 @@ class JoinUVs(bpy.types.Operator):
|
||||
mesh_other.tag = True
|
||||
|
||||
if len(mesh_other.faces) != len_faces:
|
||||
self.report({'WARNING'}, "Object: %s, Mesh: '%s' has %d faces, expected %d\n" % (obj_other.name, mesh_other.name, len(mesh_other.faces), len_faces))
|
||||
self.report({'WARNING'}, "Object: %s, Mesh: "
|
||||
"'%s' has %d faces, expected %d\n"
|
||||
% (obj_other.name,
|
||||
mesh_other.name,
|
||||
len(mesh_other.faces),
|
||||
len_faces),
|
||||
)
|
||||
else:
|
||||
uv_other = mesh_other.uv_textures.active
|
||||
if not uv_other:
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
import bpy
|
||||
from mathutils import Vector
|
||||
|
||||
|
||||
def GlobalBB_LQ(bb_world):
|
||||
|
||||
# Initialize the variables with the 8th vertex
|
||||
@@ -33,7 +34,7 @@ def GlobalBB_LQ(bb_world):
|
||||
)
|
||||
|
||||
# Test against the other 7 verts
|
||||
for i in range (7):
|
||||
for i in range(7):
|
||||
|
||||
# X Range
|
||||
val = bb_world[i][0]
|
||||
@@ -61,6 +62,7 @@ def GlobalBB_LQ(bb_world):
|
||||
|
||||
return (Vector((left, front, up)), Vector((right, back, down)))
|
||||
|
||||
|
||||
def GlobalBB_HQ(obj):
|
||||
|
||||
matrix_world = obj.matrix_world.copy()
|
||||
@@ -80,7 +82,7 @@ def GlobalBB_HQ(obj):
|
||||
)
|
||||
|
||||
# Test against all other verts
|
||||
for i in range (len(verts)-1):
|
||||
for i in range(len(verts) - 1):
|
||||
|
||||
vco = matrix_world * verts[i].co
|
||||
|
||||
|
||||
@@ -110,6 +110,31 @@ class PlayRenderedAnim(bpy.types.Operator):
|
||||
cmd = [player_path]
|
||||
# extra options, fps controls etc.
|
||||
if preset == 'BLENDER24':
|
||||
# -----------------------------------------------------------------
|
||||
# Check blender is not 2.5x until it supports playback again
|
||||
try:
|
||||
process = subprocess.Popen([player_path, '--version'],
|
||||
stdout=subprocess.PIPE,
|
||||
)
|
||||
except:
|
||||
# ignore and allow the main execution to catch the problem.
|
||||
process = None
|
||||
|
||||
if process is not None:
|
||||
process.wait()
|
||||
out = process.stdout.read()
|
||||
process.stdout.close()
|
||||
out_split = out.strip().split()
|
||||
if out_split[0] == b'Blender':
|
||||
if not out_split[1].startswith(b'2.4'):
|
||||
self.report({'ERROR'},
|
||||
"Blender %s doesn't support playback: %r" %
|
||||
(out_split[1].decode(), player_path))
|
||||
return {'CANCELLED'}
|
||||
del out, out_split
|
||||
del process
|
||||
# -----------------------------------------------------------------
|
||||
|
||||
opts = ["-a", "-f", str(rd.fps), str(rd.fps_base), file]
|
||||
cmd.extend(opts)
|
||||
elif preset == 'DJV':
|
||||
@@ -146,5 +171,6 @@ class PlayRenderedAnim(bpy.types.Operator):
|
||||
self.report({'ERROR'},
|
||||
"Couldn't run external animation player with command "
|
||||
"%r\n%s" % (" ".join(cmd), str(e)))
|
||||
return {'CANCELLED'}
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
@@ -41,11 +41,9 @@ class DATA_PT_empty(DataButtonsPanel, bpy.types.Panel):
|
||||
layout.prop(ob, "empty_draw_type", text="Display")
|
||||
|
||||
if ob.empty_draw_type == 'IMAGE':
|
||||
# layout.template_image(ob, "data", None)
|
||||
layout.template_ID(ob, "data", open="image.open", unlink="image.unlink")
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.prop(ob, "color", text="Transparency", index=3, slider=True)
|
||||
layout.prop(ob, "color", text="Transparency", index=3, slider=True)
|
||||
row = layout.row(align=True)
|
||||
row.prop(ob, "empty_image_offset", text="Offset X", index=0)
|
||||
row.prop(ob, "empty_image_offset", text="Offset Y", index=1)
|
||||
|
||||
@@ -394,6 +394,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
|
||||
col.operator("object.multires_higher_levels_delete", text="Delete Higher")
|
||||
col.operator("object.multires_reshape", text="Reshape")
|
||||
col.operator("object.multires_base_apply", text="Apply Base")
|
||||
col.prop(md, "use_subsurf_uv")
|
||||
col.prop(md, "show_only_control_edges")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -93,7 +93,7 @@ class WORLD_PT_world(WorldButtonsPanel, bpy.types.Panel):
|
||||
col.prop(world, "zenith_color")
|
||||
col.active = world.use_sky_blend
|
||||
row.column().prop(world, "ambient_color")
|
||||
|
||||
|
||||
row = layout.row()
|
||||
row.prop(world, "exposure")
|
||||
row.prop(world, "color_range")
|
||||
|
||||
@@ -60,7 +60,7 @@ class INFO_HT_header(bpy.types.Header):
|
||||
layout.template_running_jobs()
|
||||
|
||||
layout.template_reports_banner()
|
||||
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.operator("wm.splash", text="", icon='BLENDER', emboss=False)
|
||||
row.label(text=scene.statistics())
|
||||
|
||||
@@ -135,7 +135,7 @@ class NODE_MT_node(bpy.types.Menu):
|
||||
layout.operator("transform.resize")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
layout.operator("node.duplicate_move")
|
||||
layout.operator("node.delete")
|
||||
layout.operator("node.delete_reconnect")
|
||||
|
||||
@@ -1020,7 +1020,6 @@ class USERPREF_PT_addons(bpy.types.Panel):
|
||||
for i in range(4 - tot_row):
|
||||
split.separator()
|
||||
|
||||
|
||||
# Append missing scripts
|
||||
# First collect scripts that are used but have no script file.
|
||||
module_names = {mod.__name__ for mod, info in addons}
|
||||
|
||||
@@ -55,7 +55,7 @@ class VIEW3D_HT_header(bpy.types.Header):
|
||||
|
||||
row = layout.row()
|
||||
# Contains buttons like Mode, Pivot, Manipulator, Layer, Mesh Select Mode...
|
||||
row.template_header_3D()
|
||||
row.template_header_3D()
|
||||
|
||||
if obj:
|
||||
# Particle edit
|
||||
|
||||
@@ -58,6 +58,7 @@ def draw_gpencil_tools(context, layout):
|
||||
row = col.row()
|
||||
row.prop(context.tool_settings, "use_grease_pencil_sessions")
|
||||
|
||||
|
||||
# ********** default tools for objectmode ****************
|
||||
|
||||
class VIEW3D_PT_tools_objectmode(View3DPanel, bpy.types.Panel):
|
||||
|
||||
@@ -26,7 +26,7 @@ for obj in selection:
|
||||
# bpy.ops.export_scene.x3d(filepath=fn + ".x3d", use_selection=True)
|
||||
|
||||
obj.select = False
|
||||
|
||||
|
||||
print("written:", fn)
|
||||
|
||||
for obj in selection:
|
||||
|
||||
@@ -26,8 +26,8 @@ class CustomMenu(bpy.types.Menu):
|
||||
|
||||
|
||||
def draw_item(self, context):
|
||||
layout = self.layout
|
||||
layout.menu(CustomMenu.bl_idname)
|
||||
layout = self.layout
|
||||
layout.menu(CustomMenu.bl_idname)
|
||||
|
||||
|
||||
def register():
|
||||
|
||||
Reference in New Issue
Block a user