Merging r38765 through r38817 from trunk into vgroup_modifiers.
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user