Resolved the 'inconsistent newlines' merge error by updating my svn client. The error was caused by a bug in svn client (http://subversion.tigris.org/issues/show_bug.cgi?id=3262) that was fixed in 1.5.5. Fixed conflicts in image.c, object_edit.c, wm_operators.c, source/creator/CMakeLists.txt and CMakeLists.txt. Merge didn't remove some files that were moved/renamed in trunk, svn reported 'Skipped [filename]' on these files. I removed them with: svn --force remove release/io svn --force remove release/ui svn --force remove source/blender/editors/preview svn --force remove source/blender/editors/physics/ed_fluidsim.c svn --force remove source/blender/editors/physics/editparticle.c svn --force remove source/blender/editors/physics/ed_pointcache.c svn --force remove source/blender/editors/mesh/mesh_layers.c Now, before merging into trunk, need to update collada code so it builds ok and fix the possibility to build without collada.
536 lines
14 KiB
Python
536 lines
14 KiB
Python
|
|
import bpy
|
|
|
|
class ConstraintButtonsPanel(bpy.types.Panel):
|
|
__space_type__ = 'PROPERTIES'
|
|
__region_type__ = 'WINDOW'
|
|
__context__ = "constraint"
|
|
|
|
def draw_constraint(self, con):
|
|
layout = self.layout
|
|
|
|
box = layout.template_constraint(con)
|
|
|
|
if box:
|
|
# match enum type to our functions, avoids a lookup table.
|
|
getattr(self, con.type)(box, con)
|
|
|
|
# show/key buttons here are most likely obsolete now, with
|
|
# keyframing functionality being part of every button
|
|
if con.type not in ('RIGID_BODY_JOINT', 'NULL'):
|
|
box.itemR(con, "influence")
|
|
|
|
def space_template(self, layout, con, target=True, owner=True):
|
|
if target or owner:
|
|
row = layout.row()
|
|
|
|
row.itemL(text="Convert:")
|
|
|
|
if target:
|
|
row.itemR(con, "target_space", text="")
|
|
|
|
if target and owner:
|
|
row.itemL(icon='ICON_ARROW_LEFTRIGHT')
|
|
|
|
if owner:
|
|
row.itemR(con, "owner_space", text="")
|
|
|
|
def target_template(self, layout, con, subtargets=True):
|
|
layout.itemR(con, "target") # XXX limiting settings for only 'curves' or some type of object
|
|
|
|
if con.target and subtargets:
|
|
if con.target.type == 'ARMATURE':
|
|
layout.item_pointerR(con, "subtarget", con.target.data, "bones", text="Bone")
|
|
|
|
if con.type == 'COPY_LOCATION':
|
|
row = layout.row()
|
|
row.itemL(text="Head/Tail:")
|
|
row.itemR(con, "head_tail", text="")
|
|
elif con.target.type in ('MESH', 'LATTICE'):
|
|
layout.item_pointerR(con, "subtarget", con.target, "vertex_groups", text="Vertex Group")
|
|
|
|
def CHILD_OF(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.itemL(text="Location:")
|
|
col.itemR(con, "locationx", text="X")
|
|
col.itemR(con, "locationy", text="Y")
|
|
col.itemR(con, "locationz", text="Z")
|
|
|
|
col = split.column()
|
|
col.itemL(text="Rotation:")
|
|
col.itemR(con, "rotationx", text="X")
|
|
col.itemR(con, "rotationy", text="Y")
|
|
col.itemR(con, "rotationz", text="Z")
|
|
|
|
col = split.column()
|
|
col.itemL(text="Scale:")
|
|
col.itemR(con, "sizex", text="X")
|
|
col.itemR(con, "sizey", text="Y")
|
|
col.itemR(con, "sizez", text="Z")
|
|
|
|
row = layout.row()
|
|
row.itemO("constraint.childof_set_inverse")
|
|
row.itemO("constraint.childof_clear_inverse")
|
|
|
|
def TRACK_TO(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
row = layout.row()
|
|
row.itemL(text="To:")
|
|
row.itemR(con, "track", expand=True)
|
|
|
|
row = layout.row()
|
|
#row.itemR(con, "up", text="Up", expand=True) # XXX: up and expand don't play nice together
|
|
row.itemR(con, "up", text="Up")
|
|
row.itemR(con, "target_z")
|
|
|
|
self.space_template(layout, con)
|
|
|
|
def IK(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
layout.itemR(con, "pole_target")
|
|
|
|
if con.pole_target and con.pole_target.type == 'ARMATURE':
|
|
layout.item_pointerR(con, "pole_subtarget", con.pole_target.data, "bones", text="Bone")
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.itemR(con, "iterations")
|
|
col.itemR(con, "chain_length")
|
|
sub = col.column()
|
|
sub.active = con.pole_target
|
|
sub.itemR(con, "pole_angle")
|
|
col.itemL(text="Weight:")
|
|
col.itemR(con, "weight", text="Position", slider=True)
|
|
sub = col.column()
|
|
sub.active = con.rotation
|
|
sub.itemR(con, "orient_weight", text="Rotation", slider=True)
|
|
|
|
col = split.column()
|
|
col.itemR(con, "tail")
|
|
col.itemR(con, "rotation")
|
|
col.itemR(con, "targetless")
|
|
col.itemR(con, "stretch")
|
|
|
|
def FOLLOW_PATH(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.itemR(con, "curve_follow")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "fixed_position")
|
|
if con.fixed_position:
|
|
col.itemR(con, "offset_percentage", text="Offset")
|
|
else:
|
|
col.itemR(con, "offset")
|
|
|
|
row = layout.row()
|
|
row.itemL(text="Forward:")
|
|
row.itemR(con, "forward", expand=True)
|
|
|
|
row = layout.row()
|
|
row.itemR(con, "up", text="Up")
|
|
row.itemL()
|
|
|
|
def LIMIT_ROTATION(self, layout, con):
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.itemR(con, "use_limit_x")
|
|
sub = col.column()
|
|
sub.active = con.use_limit_x
|
|
sub.itemR(con, "minimum_x", text="Min")
|
|
sub.itemR(con, "maximum_x", text="Max")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "use_limit_y")
|
|
sub = col.column()
|
|
sub.active = con.use_limit_y
|
|
sub.itemR(con, "minimum_y", text="Min")
|
|
sub.itemR(con, "maximum_y", text="Max")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "use_limit_z")
|
|
sub = col.column()
|
|
sub.active = con.use_limit_z
|
|
sub.itemR(con, "minimum_z", text="Min")
|
|
sub.itemR(con, "maximum_z", text="Max")
|
|
|
|
row = layout.row()
|
|
row.itemR(con, "limit_transform")
|
|
row.itemL()
|
|
|
|
row = layout.row()
|
|
row.itemL(text="Convert:")
|
|
row.itemR(con, "owner_space", text="")
|
|
|
|
def LIMIT_LOCATION(self, layout, con):
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.itemR(con, "use_minimum_x")
|
|
sub = col.column()
|
|
sub.active = con.use_minimum_x
|
|
sub.itemR(con, "minimum_x", text="")
|
|
col.itemR(con, "use_maximum_x")
|
|
sub = col.column()
|
|
sub.active = con.use_maximum_x
|
|
sub.itemR(con, "maximum_x", text="")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "use_minimum_y")
|
|
sub = col.column()
|
|
sub.active = con.use_minimum_y
|
|
sub.itemR(con, "minimum_y", text="")
|
|
col.itemR(con, "use_maximum_y")
|
|
sub = col.column()
|
|
sub.active = con.use_maximum_y
|
|
sub.itemR(con, "maximum_y", text="")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "use_minimum_z")
|
|
sub = col.column()
|
|
sub.active = con.use_minimum_z
|
|
sub.itemR(con, "minimum_z", text="")
|
|
col.itemR(con, "use_maximum_z")
|
|
sub = col.column()
|
|
sub.active = con.use_maximum_z
|
|
sub.itemR(con, "maximum_z", text="")
|
|
|
|
row = layout.row()
|
|
row.itemR(con, "limit_transform")
|
|
row.itemL()
|
|
|
|
row = layout.row()
|
|
row.itemL(text="Convert:")
|
|
row.itemR(con, "owner_space", text="")
|
|
|
|
def LIMIT_SCALE(self, layout, con):
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.itemR(con, "use_minimum_x")
|
|
sub = col.column()
|
|
sub.active = con.use_minimum_x
|
|
sub.itemR(con, "minimum_x", text="")
|
|
col.itemR(con, "use_maximum_x")
|
|
sub = col.column()
|
|
sub.active = con.use_maximum_x
|
|
sub.itemR(con, "maximum_x", text="")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "use_minimum_y")
|
|
sub = col.column()
|
|
sub.active = con.use_minimum_y
|
|
sub.itemR(con, "minimum_y", text="")
|
|
col.itemR(con, "use_maximum_y")
|
|
sub = col.column()
|
|
sub.active = con.use_maximum_y
|
|
sub.itemR(con, "maximum_y", text="")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "use_minimum_z")
|
|
sub = col.column()
|
|
sub.active = con.use_minimum_z
|
|
sub.itemR(con, "minimum_z", text="")
|
|
col.itemR(con, "use_maximum_z")
|
|
sub = col.column()
|
|
sub.active = con.use_maximum_z
|
|
sub.itemR(con, "maximum_z", text="")
|
|
|
|
row = layout.row()
|
|
row.itemR(con, "limit_transform")
|
|
row.itemL()
|
|
|
|
row = layout.row()
|
|
row.itemL(text="Convert:")
|
|
row.itemR(con, "owner_space", text="")
|
|
|
|
def COPY_ROTATION(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.itemR(con, "rotate_like_x", text="X")
|
|
sub = col.column()
|
|
sub.active = con.rotate_like_x
|
|
sub.itemR(con, "invert_x", text="Invert")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "rotate_like_y", text="Y")
|
|
sub = col.column()
|
|
sub.active = con.rotate_like_y
|
|
sub.itemR(con, "invert_y", text="Invert")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "rotate_like_z", text="Z")
|
|
sub = col.column()
|
|
sub.active = con.rotate_like_z
|
|
sub.itemR(con, "invert_z", text="Invert")
|
|
|
|
layout.itemR(con, "offset")
|
|
|
|
self.space_template(layout, con)
|
|
|
|
def COPY_LOCATION(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.itemR(con, "locate_like_x", text="X")
|
|
sub = col.column()
|
|
sub.active = con.locate_like_x
|
|
sub.itemR(con, "invert_x", text="Invert")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "locate_like_y", text="Y")
|
|
sub = col.column()
|
|
sub.active = con.locate_like_y
|
|
sub.itemR(con, "invert_y", text="Invert")
|
|
|
|
col = split.column()
|
|
col.itemR(con, "locate_like_z", text="Z")
|
|
sub = col.column()
|
|
sub.active = con.locate_like_z
|
|
sub.itemR(con, "invert_z", text="Invert")
|
|
|
|
layout.itemR(con, "offset")
|
|
|
|
self.space_template(layout, con)
|
|
|
|
def COPY_SCALE(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
row = layout.row(align=True)
|
|
row.itemR(con, "size_like_x", text="X")
|
|
row.itemR(con, "size_like_y", text="Y")
|
|
row.itemR(con, "size_like_z", text="Z")
|
|
|
|
layout.itemR(con, "offset")
|
|
|
|
self.space_template(layout, con)
|
|
|
|
#def SCRIPT(self, layout, con):
|
|
|
|
def ACTION(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
layout.itemR(con, "action")
|
|
layout.itemR(con, "transform_channel")
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column(align=True)
|
|
col.itemR(con, "start_frame", text="Start")
|
|
col.itemR(con, "end_frame", text="End")
|
|
|
|
col = split.column(align=True)
|
|
col.itemR(con, "minimum", text="Min")
|
|
col.itemR(con, "maximum", text="Max")
|
|
|
|
row = layout.row()
|
|
row.itemL(text="Convert:")
|
|
row.itemR(con, "owner_space", text="")
|
|
|
|
def LOCKED_TRACK(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
row = layout.row()
|
|
row.itemL(text="To:")
|
|
row.itemR(con, "track", expand=True)
|
|
|
|
row = layout.row()
|
|
row.itemL(text="Lock:")
|
|
row.itemR(con, "locked", expand=True)
|
|
|
|
def LIMIT_DISTANCE(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
col = layout.column(align=True);
|
|
col.itemR(con, "distance")
|
|
col.itemO("constraint.limitdistance_reset")
|
|
|
|
row = layout.row()
|
|
row.itemL(text="Clamp Region:")
|
|
row.itemR(con, "limit_mode", text="")
|
|
|
|
def STRETCH_TO(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
row = layout.row()
|
|
row.itemR(con, "original_length", text="Rest Length")
|
|
row.itemO("constraint.stretchto_reset", text="Reset")
|
|
|
|
col = layout.column()
|
|
col.itemR(con, "bulge", text="Volume Variation")
|
|
|
|
row = layout.row()
|
|
row.itemL(text="Volume:")
|
|
row.itemR(con, "volume", expand=True)
|
|
row.itemL(text="Plane:")
|
|
row.itemR(con, "keep_axis", expand=True)
|
|
|
|
def FLOOR(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
row = layout.row()
|
|
row.itemR(con, "sticky")
|
|
row.itemR(con, "use_rotation")
|
|
|
|
layout.itemR(con, "offset")
|
|
|
|
row = layout.row()
|
|
row.itemL(text="Min/Max:")
|
|
row.itemR(con, "floor_location", expand=True)
|
|
|
|
def RIGID_BODY_JOINT(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
layout.itemR(con, "pivot_type")
|
|
layout.itemR(con, "child")
|
|
|
|
row = layout.row()
|
|
row.itemR(con, "disable_linked_collision", text="No Collision")
|
|
row.itemR(con, "draw_pivot", text="Display Pivot")
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column(align=True)
|
|
col.itemL(text="Pivot:")
|
|
col.itemR(con, "pivot_x", text="X")
|
|
col.itemR(con, "pivot_y", text="Y")
|
|
col.itemR(con, "pivot_z", text="Z")
|
|
|
|
col = split.column(align=True)
|
|
col.itemL(text="Axis:")
|
|
col.itemR(con, "axis_x", text="X")
|
|
col.itemR(con, "axis_y", text="Y")
|
|
col.itemR(con, "axis_z", text="Z")
|
|
|
|
#Missing: Limit arrays (not wrapped in RNA yet)
|
|
|
|
def CLAMP_TO(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
row = layout.row()
|
|
row.itemL(text="Main Axis:")
|
|
row.itemR(con, "main_axis", expand=True)
|
|
|
|
row = layout.row()
|
|
row.itemR(con, "cyclic")
|
|
|
|
def TRANSFORM(self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
layout.itemR(con, "extrapolate_motion", text="Extrapolate")
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.itemL(text="Source:")
|
|
col.row().itemR(con, "map_from", expand=True)
|
|
|
|
sub = col.row(align=True)
|
|
sub.itemL(text="X:")
|
|
sub.itemR(con, "from_min_x", text="")
|
|
sub.itemR(con, "from_max_x", text="")
|
|
|
|
sub = col.row(align=True)
|
|
sub.itemL(text="Y:")
|
|
sub.itemR(con, "from_min_y", text="")
|
|
sub.itemR(con, "from_max_y", text="")
|
|
|
|
sub = col.row(align=True)
|
|
sub.itemL(text="Z:")
|
|
sub.itemR(con, "from_min_z", text="")
|
|
sub.itemR(con, "from_max_z", text="")
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.itemL(text="Destination:")
|
|
col.row().itemR(con, "map_to", expand=True)
|
|
|
|
sub = col.row(align=True)
|
|
sub.itemR(con, "map_to_x_from", text="")
|
|
sub.itemR(con, "to_min_x", text="")
|
|
sub.itemR(con, "to_max_x", text="")
|
|
|
|
sub = col.row(align=True)
|
|
sub.itemR(con, "map_to_y_from", text="")
|
|
sub.itemR(con, "to_min_y", text="")
|
|
sub.itemR(con, "to_max_y", text="")
|
|
|
|
sub = col.row(align=True)
|
|
sub.itemR(con, "map_to_z_from", text="")
|
|
sub.itemR(con, "to_min_z", text="")
|
|
sub.itemR(con, "to_max_z", text="")
|
|
|
|
self.space_template(layout, con)
|
|
|
|
def SHRINKWRAP (self, layout, con):
|
|
self.target_template(layout, con)
|
|
|
|
layout.itemR(con, "distance")
|
|
layout.itemR(con, "shrinkwrap_type")
|
|
|
|
if con.shrinkwrap_type == 'PROJECT':
|
|
row = layout.row(align=True)
|
|
row.itemR(con, "axis_x")
|
|
row.itemR(con, "axis_y")
|
|
row.itemR(con, "axis_z")
|
|
|
|
class OBJECT_PT_constraints(ConstraintButtonsPanel):
|
|
__label__ = "Constraints"
|
|
__context__ = "constraint"
|
|
|
|
def poll(self, context):
|
|
return (context.object)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
ob = context.object
|
|
|
|
row = layout.row()
|
|
row.item_menu_enumO("object.constraint_add", "type")
|
|
row.itemL();
|
|
|
|
for con in ob.constraints:
|
|
self.draw_constraint(con)
|
|
|
|
class BONE_PT_constraints(ConstraintButtonsPanel):
|
|
__label__ = "Constraints"
|
|
__context__ = "bone"
|
|
|
|
def poll(self, context):
|
|
ob = context.object
|
|
return (ob and ob.type == 'ARMATURE' and context.bone)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
ob = context.object
|
|
pchan = ob.pose.pose_channels[context.bone.name]
|
|
|
|
row = layout.row()
|
|
row.item_menu_enumO("pose.constraint_add", "type")
|
|
row.itemL();
|
|
|
|
for con in pchan.constraints:
|
|
self.draw_constraint(con)
|
|
|
|
bpy.types.register(OBJECT_PT_constraints)
|
|
bpy.types.register(BONE_PT_constraints)
|