This commit is contained in:
Campbell Barton
2011-09-13 10:05:30 +00:00
297 changed files with 20193 additions and 3151 deletions

View File

@@ -356,7 +356,7 @@ class Mesh(bpy_types.ID):
@property
def edge_keys(self):
return [edge_key for face in self.faces for edge_key in face.edge_keys]
return [ed.key for ed in self.edges]
class MeshEdge(StructRNA):
@@ -376,17 +376,31 @@ class MeshFace(StructRNA):
face_verts = self.vertices[:]
mesh_verts = self.id_data.vertices
if len(face_verts) == 3:
return (mesh_verts[face_verts[0]].co + mesh_verts[face_verts[1]].co + mesh_verts[face_verts[2]].co) / 3.0
return (mesh_verts[face_verts[0]].co +
mesh_verts[face_verts[1]].co +
mesh_verts[face_verts[2]].co
) / 3.0
else:
return (mesh_verts[face_verts[0]].co + mesh_verts[face_verts[1]].co + mesh_verts[face_verts[2]].co + mesh_verts[face_verts[3]].co) / 4.0
return (mesh_verts[face_verts[0]].co +
mesh_verts[face_verts[1]].co +
mesh_verts[face_verts[2]].co +
mesh_verts[face_verts[3]].co
) / 4.0
@property
def edge_keys(self):
verts = self.vertices[:]
if len(verts) == 3:
return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[0])
return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[3]), ord_ind(verts[3], verts[0])
return (ord_ind(verts[0], verts[1]),
ord_ind(verts[1], verts[2]),
ord_ind(verts[2], verts[0]),
)
else:
return (ord_ind(verts[0], verts[1]),
ord_ind(verts[1], verts[2]),
ord_ind(verts[2], verts[3]),
ord_ind(verts[3], verts[0]),
)
class Text(bpy_types.ID):

View File

@@ -685,7 +685,6 @@ data_path_update = [
]
import bpy
from bpy.types import Operator

View File

@@ -271,7 +271,8 @@ class BakeAction(Operator):
class ClearUselessActions(Operator):
'''Mark actions with no F-Curves for deletion after save+reload of file preserving "action libraries"'''
'''Mark actions with no F-Curves for deletion after save+reload of ''' \
'''file preserving "action libraries"'''
bl_idname = "anim.clear_useless_actions"
bl_label = "Clear Useless Actions"
bl_options = {'REGISTER', 'UNDO'}
@@ -292,12 +293,14 @@ class ClearUselessActions(Operator):
if ((self.only_unused is False) or
(action.use_fake_user and action.users == 1)):
# if it has F-Curves, then it's a "action library" (i.e. walk, wave, jump, etc.)
# if it has F-Curves, then it's a "action library"
# (i.e. walk, wave, jump, etc.)
# and should be left alone as that's what fake users are for!
if not action.fcurves:
# mark action for deletion
action.user_clear()
removed += 1
self.report({'INFO'}, "Removed %d empty and/or fake-user only Actions" % (removed))
self.report({'INFO'}, "Removed %d empty and/or fake-user only Actions"
% removed)
return {'FINISHED'}

View File

@@ -74,6 +74,7 @@ class DATA_PT_skeleton(ArmatureButtonsPanel, Panel):
if context.scene.render.engine == "BLENDER_GAME":
layout.row().prop(arm, "vert_deformer", expand=True)
class DATA_PT_display(ArmatureButtonsPanel, Panel):
bl_label = "Display"
@@ -185,11 +186,10 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
layout.template_ID(ob, "pose_library", new="poselib.new", unlink="poselib.unlink")
if poselib:
# list of poses in pose library
# list of poses in pose library
row = layout.row()
row.template_list(poselib, "pose_markers", poselib.pose_markers, "active_index", rows=5)
# column of operators for active pose
# - goes beside list
col = row.column(align=True)
@@ -206,9 +206,9 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
if pose_marker_active is not None:
col.operator("poselib.pose_remove", icon='ZOOMOUT', text="").pose = pose_marker_active.name
col.operator("poselib.apply_pose", icon='ZOOM_SELECTED', text="").pose_index = poselib.pose_markers.active_index
col.operator("poselib.action_sanitise", icon='HELP', text="") # XXX: put in menu?
col.operator("poselib.action_sanitise", icon='HELP', text="") # XXX: put in menu?
# properties for active marker
if pose_marker_active is not None:
layout.prop(pose_marker_active, "name")

View File

@@ -379,6 +379,10 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col.label(text="Mirror Object:")
col.prop(md, "mirror_object", text="")
def NAVMESH(self, layout, ob, md):
layout.operator("object.assign_navpolygon")
layout.operator("object.assign_new_navpolygon")
def MULTIRES(self, layout, ob, md):
layout.row().prop(md, "subdivision_type", expand=True)
@@ -608,32 +612,31 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
layout.label(text="Settings can be found inside the Physics context")
def UV_PROJECT(self, layout, ob, md):
if ob.type == 'MESH':
split = layout.split()
split = layout.split()
col = split.column()
col.label(text="Image:")
col.prop(md, "image", text="")
col = split.column()
col.label(text="Image:")
col.prop(md, "image", text="")
col = split.column()
col.label(text="UV Layer:")
col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
col = split.column()
col.label(text="UV Layer:")
col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
split = layout.split()
col = split.column()
col.prop(md, "use_image_override")
col.prop(md, "projector_count", text="Projectors")
for proj in md.projectors:
col.prop(proj, "object", text="")
split = layout.split()
col = split.column()
col.prop(md, "use_image_override")
col.prop(md, "projector_count", text="Projectors")
for proj in md.projectors:
col.prop(proj, "object", text="")
col = split.column()
sub = col.column(align=True)
sub.prop(md, "aspect_x", text="Aspect X")
sub.prop(md, "aspect_y", text="Aspect Y")
col = split.column()
sub = col.column(align=True)
sub.prop(md, "aspect_x", text="Aspect X")
sub.prop(md, "aspect_y", text="Aspect Y")
sub = col.column(align=True)
sub.prop(md, "scale_x", text="Scale X")
sub.prop(md, "scale_y", text="Scale Y")
sub = col.column(align=True)
sub.prop(md, "scale_x", text="Scale X")
sub.prop(md, "scale_y", text="Scale Y")
def WARP(self, layout, ob, md):
use_falloff = (md.falloff_type != 'NONE')
@@ -738,27 +741,29 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col.prop(md, "narrowness", slider=True)
@staticmethod
def weight_vg_mask(layout, ob, md):
def vertex_weight_mask(layout, ob, md):
layout.label(text="Influence/Mask Options:")
split = layout.split()
col1 = split.column()
col2 = split.column()
col1.label(text="Global Influence:")
col2.prop(md, "mask_constant", text="")
split = layout.split(percentage=0.4)
split.label(text="Global Influence:")
split.prop(md, "mask_constant", text="")
if not md.mask_texture:
col1.label(text="Vertex Group Mask:")
col2.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="")
split = layout.split(percentage=0.4)
split.label(text="Vertex Group Mask:")
split.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="")
if not md.mask_vertex_group:
col1.label(text="Texture Mask:")
col2.template_ID(md, "mask_texture", new="texture.new")
split = layout.split(percentage=0.4)
split.label(text="Texture Mask:")
split.template_ID(md, "mask_texture", new="texture.new")
if md.mask_texture:
split = layout.split()
col = split.column()
col.label(text="Texture Coordinates:")
col.prop(md, "mask_tex_mapping", text="")
col = split.column()
col.label(text="Use Channel:")
col.prop(md, "mask_tex_use_channel", text="")
@@ -769,88 +774,85 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures")
def VERTEX_WEIGHT_EDIT(self, layout, ob, md):
if ob.type == 'MESH':
split = layout.split()
col = split.column()
col.label(text="Vertex Group:")
col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
split = layout.split()
col = split.column()
col.label(text="Vertex Group:")
col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
col = split.column()
col.label(text="Default Weight:")
col.prop(md, "default_weight", text="")
col = split.column()
col.label(text="Default Weight:")
col.prop(md, "default_weight", text="")
layout.prop(md, "falloff_type")
if md.falloff_type == 'CURVE':
col = layout.column()
col.template_curve_mapping(md, "map_curve")
layout.prop(md, "falloff_type")
if md.falloff_type == 'CURVE':
col = layout.column()
col.template_curve_mapping(md, "map_curve")
split = layout.split(percentage=0.4)
split.prop(md, "use_add")
row = split.row()
row.active = md.use_add
row.prop(md, "add_threshold")
split = layout.split(percentage=0.4)
split.prop(md, "use_add")
row = split.row()
row.active = md.use_add
row.prop(md, "add_threshold")
split = layout.split(percentage=0.4)
split.prop(md, "use_remove")
row = split.row()
row.active = md.use_remove
row.prop(md, "remove_threshold")
split = layout.split(percentage=0.4)
split.prop(md, "use_remove")
row = split.row()
row.active = md.use_remove
row.prop(md, "remove_threshold")
# Common mask options
layout.separator()
self.weight_vg_mask(layout, ob, md)
# Common mask options
layout.separator()
self.vertex_weight_mask(layout, ob, md)
def VERTEX_WEIGHT_MIX(self, layout, ob, md):
if ob.type == 'MESH':
split = layout.split()
col = split.column()
col.label(text="Vertex Group A:")
col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
col.label(text="Default Weight A:")
col.prop(md, "default_weight_a", text="")
split = layout.split()
col.label(text="Mix Mode:")
col.prop(md, "mix_mode", text="")
col = split.column()
col.label(text="Vertex Group A:")
col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
col.label(text="Default Weight A:")
col.prop(md, "default_weight_a", text="")
col = split.column()
col.label(text="Vertex Group B:")
col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
col.label(text="Default Weight B:")
col.prop(md, "default_weight_b", text="")
col.label(text="Mix Mode:")
col.prop(md, "mix_mode", text="")
col.label(text="Mix Set:")
col.prop(md, "mix_set", text="")
col = split.column()
col.label(text="Vertex Group B:")
col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
col.label(text="Default Weight B:")
col.prop(md, "default_weight_b", text="")
# Common mask options…
layout.separator()
self.weight_vg_mask(layout, ob, md)
col.label(text="Mix Set:")
col.prop(md, "mix_set", text="")
# Common mask options
layout.separator()
self.vertex_weight_mask(layout, ob, md)
def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md):
if ob.type == 'MESH':
split = layout.split()
col = split.column()
col.label(text="Vertex Group:")
col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
split = layout.split()
col = split.column()
col.label(text="Target Object:")
col.prop(md, "target", text="")
col = split.column()
col.label(text="Vertex Group:")
col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
row = layout.row()
row.prop(md, "proximity_mode", expand=True)
if md.proximity_mode == 'GEOMETRY':
row = layout.row()
row.prop(md, "proximity_geometry", expand=True)
col = split.column()
col.label(text="Target Object:")
col.prop(md, "target", text="")
row = layout.split()
row.prop(md, "min_dist")
row.prop(md, "max_dist")
layout.row().prop(md, "proximity_mode", expand=True)
if md.proximity_mode == 'GEOMETRY':
layout.row().prop(md, "proximity_geometry", expand=True)
layout.prop(md, "falloff_type")
row = layout.row()
row.prop(md, "min_dist")
row.prop(md, "max_dist")
# Common mask options…
layout.separator()
self.weight_vg_mask(layout, ob, md)
layout.prop(md, "falloff_type")
# Common mask options
layout.separator()
self.vertex_weight_mask(layout, ob, md)
if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)

View File

@@ -81,7 +81,7 @@ class DATA_PT_distance(DataButtonsPanel, bpy.types.Panel):
speaker = context.speaker
split = layout.split()
col = split.column()
col.label("Volume:")
col.prop(speaker, "volume_min", text="Minimum")

View File

@@ -196,6 +196,33 @@ class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, Panel):
row.prop(game, "use_collision_compound", text="Compound")
class PHYSICS_PT_game_obstacles(PhysicsButtonsPanel, Panel):
bl_label = "Create Obstacle"
COMPAT_ENGINES = {'BLENDER_GAME'}
@classmethod
def poll(cls, context):
game = context.object.game
rd = context.scene.render
return (game.physics_type in ('DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC')) and (rd.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
game = context.active_object.game
self.layout.prop(game, "create_obstacle", text="")
def draw(self, context):
layout = self.layout
game = context.active_object.game
layout.active = game.create_obstacle
row = layout.row()
row.prop(game, "obstacle_radius", text="Radius")
row.label()
class RenderButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
@@ -344,7 +371,7 @@ class RENDER_PT_game_performance(RenderButtonsPanel, Panel):
row = col.row()
row.prop(gs, "use_frame_rate")
row.prop(gs, "use_display_lists")
col.prop(gs, "restrict_animation_updates")
@@ -364,6 +391,70 @@ class RENDER_PT_game_display(RenderButtonsPanel, Panel):
flow.prop(gs, "show_mouse", text="Mouse Cursor")
class SceneButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "scene"
class SCENE_PT_game_navmesh(SceneButtonsPanel, bpy.types.Panel):
bl_label = "Navigation mesh"
bl_default_closed = True
COMPAT_ENGINES = {'BLENDER_GAME'}
@classmethod
def poll(cls, context):
scene = context.scene
return (scene and scene.render.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
rd = context.scene.game_settings.recast_data
layout.operator("object.create_navmesh", text='Build navigation mesh')
col = layout.column()
col.label(text="Rasterization:")
row = col.row()
row.prop(rd, "cell_size")
row.prop(rd, "cell_height")
col = layout.column()
col.label(text="Agent:")
split = col.split()
col = split.column()
col.prop(rd, "agent_height", text="Height")
col.prop(rd, "agent_radius", text="Radius")
col = split.column()
col.prop(rd, "max_slope")
col.prop(rd, "max_climb")
col = layout.column()
col.label(text="Region:")
row = col.row()
row.prop(rd, "region_min_size")
row.prop(rd, "region_merge_size")
col = layout.column()
col.label(text="Polygonization:")
split = col.split()
col = split.column()
col.prop(rd, "edge_max_len")
col.prop(rd, "edge_max_error")
split.prop(rd, "verts_per_poly")
col = layout.column()
col.label(text="Detail Mesh:")
row = col.row()
row.prop(rd, "sample_dist")
row.prop(rd, "sample_max_error")
class WorldButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
@@ -487,5 +578,25 @@ class WORLD_PT_game_physics(WorldButtonsPanel, Panel):
col.label(text="Logic Steps:")
col.prop(gs, "logic_step_max", text="Max")
class WORLD_PT_game_physics_obstacles(WorldButtonsPanel, Panel):
bl_label = "Obstacle simulation"
COMPAT_ENGINES = {'BLENDER_GAME'}
@classmethod
def poll(cls, context):
scene = context.scene
return (scene.world and scene.render.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
gs = context.scene.game_settings
layout.prop(gs, "obstacle_simulation", text="Type")
if gs.obstacle_simulation != 'NONE':
layout.prop(gs, "level_height")
layout.prop(gs, "show_obstacle_simulation")
if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)

View File

@@ -46,7 +46,7 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel):
row = layout.row()
if fluid is None:
row.label("built without fluids")
row.label("Built without fluids")
return
row.prop(fluid, "type")

View File

@@ -773,7 +773,18 @@ class USERPREF_MT_ndof_settings(Menu):
layout.separator()
layout.label(text="orbit options")
layout.prop(input_prefs, "ndof_orbit_invert_axes")
if input_prefs.view_rotate_method == 'TRACKBALL':
layout.prop(input_prefs, "ndof_roll_invert_axis")
layout.prop(input_prefs, "ndof_tilt_invert_axis")
layout.prop(input_prefs, "ndof_rotate_invert_axis")
else:
layout.prop(input_prefs, "ndof_orbit_invert_axes")
layout.separator()
layout.label(text="pan options")
layout.prop(input_prefs, "ndof_panx_invert_axis")
layout.prop(input_prefs, "ndof_pany_invert_axis")
layout.prop(input_prefs, "ndof_panz_invert_axis")
layout.separator()
layout.label(text="fly options")

View File

@@ -770,9 +770,9 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, Panel):
col = row.column()
if brush.use_texture_overlay:
col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_OFF')
col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='RESTRICT_VIEW_OFF')
else:
col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_ON')
col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='RESTRICT_VIEW_ON')
col.active = tex_slot.map_mode in {'FIXED', 'TILED'}