svn merge -r38753:38813 https://svn.blender.org/svnroot/bf-blender/trunk/blender .
authorNathan Letwory <nathan@letworyinteractive.com>
Fri, 29 Jul 2011 07:58:03 +0000 (07:58 +0000)
committerNathan Letwory <nathan@letworyinteractive.com>
Fri, 29 Jul 2011 07:58:03 +0000 (07:58 +0000)
42 files changed:
build_files/cmake/cmake_consistency_check.py
build_files/cmake/cmake_netbeans_project.py
build_files/cmake/cmake_qtcreator_project.py
doc/python_api/examples/bge.constraints.py
doc/python_api/examples/bge.texture.1.py
doc/python_api/examples/bge.texture.py
doc/python_api/examples/blf.py
doc/python_api/sphinx_doc_gen.sh
release/scripts/modules/addon_utils.py
release/scripts/modules/bpy/__init__.py
release/scripts/modules/bpy_extras/io_utils.py
release/scripts/modules/bpy_extras/mesh_utils.py
release/scripts/startup/bl_operators/object.py
release/scripts/startup/bl_operators/object_align.py
release/scripts/startup/bl_operators/screen_play_rendered_anim.py
release/scripts/startup/bl_ui/properties_data_empty.py
release/scripts/startup/bl_ui/properties_data_modifier.py
release/scripts/startup/bl_ui/properties_world.py
release/scripts/startup/bl_ui/space_info.py
release/scripts/startup/bl_ui/space_node.py
release/scripts/startup/bl_ui/space_userpref.py
release/scripts/startup/bl_ui/space_view3d.py
release/scripts/startup/bl_ui/space_view3d_toolbar.py
release/scripts/templates/batch_export.py
release/scripts/templates/ui_menu.py
source/blender/blenkernel/intern/cdderivedmesh.c
source/blender/blenkernel/intern/customdata.c
source/blender/blenkernel/intern/material.c
source/blender/blenkernel/intern/multires.c
source/blender/collada/MaterialExporter.cpp
source/blender/collada/MaterialExporter.h
source/blender/editors/interface/resources.c
source/blender/editors/space_node/node_edit.c
source/blender/editors/space_sequencer/sequencer_add.c
source/blender/editors/transform/transform_snap.c
source/blender/gpu/intern/gpu_material.c
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_modifier.c
source/blender/windowmanager/intern/wm_init_exit.c
source/creator/creator.c
source/tests/check_deprecated.py

index 4b35e34..ba71603 100755 (executable)
@@ -42,9 +42,9 @@ def replace_line(f, i, text, keep_indent=True):
     
     l = data[i]
     ws = l[:len(l) - len(l.lstrip())]
-    
+
     data[i] = "%s%s\n" % (ws, text)
-    
+
     file_handle = open(f, 'w')
     file_handle.writelines(data)
     file_handle.close()
@@ -182,13 +182,13 @@ def cmake_get_src(f):
 
                                 if new_path_rel != l:
                                     print("overly relative path:\n  %s:%d\n  %s\n  %s" % (f, i, l, new_path_rel))
-                                    
+
                                     ## Save time. just replace the line
                                     # replace_line(f, i - 1, new_path_rel)
-                                    
+
                             else:
                                 raise Exception("non existant include %s:%d -> %s" % (f, i, new_file))
-                            
+
                         # print(new_file)
 
             global_h.update(set(sources_h))
@@ -206,7 +206,7 @@ def cmake_get_src(f):
                 if ff not in sources_c:
                     print("  missing: " + ff)
             '''
-            
+
             # reset
             sources_h[:] = []
             sources_c[:] = []
index 6afca8f..8060574 100755 (executable)
@@ -30,7 +30,18 @@ Example linux usage
 Windows not supported so far
 """
 
-from project_info import *
+from project_info import (SIMPLE_PROJECTFILE,
+                          SOURCE_DIR,
+                          CMAKE_DIR,
+                          PROJECT_DIR,
+                          source_list,
+                          is_project_file,
+                          is_c_header,
+                          is_py,
+                          cmake_advanced_info,
+                          cmake_compiler_defines,
+                          )
+
 
 import os
 from os.path import join, dirname, normpath, relpath, exists
index 3de1556..d8993c3 100755 (executable)
@@ -31,7 +31,17 @@ example linux usage
  python .~/blenderSVN/blender/build_files/cmake/cmake_qtcreator_project.py ~/blenderSVN/cmake
 """
 
-from project_info import *
+from project_info import (SIMPLE_PROJECTFILE,
+                          SOURCE_DIR,
+                          CMAKE_DIR,
+                          PROJECT_DIR,
+                          source_list,
+                          is_project_file,
+                          is_c_header,
+                          is_py,
+                          cmake_advanced_info,
+                          cmake_compiler_defines,
+                          )
 
 import os
 import sys
index 4cd9673..de2f7e0 100644 (file)
@@ -8,11 +8,11 @@ from bge import constraints
 
 # get object list
 objects = logic.getCurrentScene().objects
+
 # get object named Object1 and Object 2
 object_1 = objects["Object1"]
 object_2 = objects["Object2"]
+
 # want to use Edge constraint type
 constraint_type = 2
 
@@ -31,7 +31,7 @@ edge_angle_y = 1.0
 edge_angle_z = 0.0
 
 # create an edge constraint
-constraints.createConstraint( physics_id_1, physics_id_2,
-                              constraint_type,
-                              edge_position_x, edge_position_y, edge_position_z,
-                              edge_angle_x, edge_angle_y, edge_angle_z )
+constraints.createConstraint(physics_id_1, physics_id_2,
+                             constraint_type,
+                             edge_position_x, edge_position_y, edge_position_z,
+                             edge_angle_x, edge_angle_y, edge_angle_z)
index 74b37e7..faa0ae7 100644 (file)
@@ -6,29 +6,31 @@ createTexture() and removeTexture() are to be called from a module Python
 Controller.
 """
 from bge import logic
-from bge import texture        
+from bge import texture
+
 
 def createTexture(cont):
     """Create a new Dynamic Texture"""
     object = cont.owner
-       
+
     # get the reference pointer (ID) of the internal texture
     ID = texture.materialID(obj, 'IMoriginal.png')
-       
-    # create a texture object 
+
+    # create a texture object
     object_texture = texture.Texture(object, ID)
-       
+
     # create a new source with an external image
     url = logic.expandPath("//newtexture.jpg")
     new_source = texture.ImageFFmpeg(url)
-       
+
     # the texture has to be stored in a permanent Python object
     logic.texture = object_texture
-       
+
     # update/replace the texture
     logic.texture.source = new_source
     logic.texture.refresh(False)
 
+
 def removeTexture(cont):
     """Delete the Dynamic Texture, reversing back the final to its original state."""
     try:
index 0ec9aa1..70e4d6d 100644 (file)
@@ -9,14 +9,14 @@ from bge import logic
 
 cont = logic.getCurrentController()
 obj = cont.owner
-       
-# the creation of the texture must be done once: save the 
+
+# the creation of the texture must be done once: save the
 # texture object in an attribute of bge.logic module makes it persistent
 if not hasattr(logic, 'video'):
-       
+
     # identify a static texture by name
     matID = texture.materialID(obj, 'IMvideo.png')
-               
+
     # create a dynamic texture that will replace the static texture
     logic.video = texture.Texture(obj, matID)
 
@@ -24,7 +24,7 @@ if not hasattr(logic, 'video'):
     movie = logic.expandPath('//trailer_400p.ogg')
     logic.video.source = texture.VideoFFmpeg(movie)
     logic.video.source.scale = True
-               
+
     # quick off the movie, but it wont play in the background
     logic.video.source.play()
 
index 3ab7f78..f6e87cf 100644 (file)
@@ -1,6 +1,7 @@
 """
 Hello World Text Example
 ++++++++++++++++++++++++
+
 Blender Game Engine example of using the blf module. For this module to work we
 need to use the OpenGL wrapper :class:`~bgl` as well.
 """
@@ -11,31 +12,33 @@ from bge import logic
 import bgl
 import blf
 
+
 def init():
     """init function - runs once"""
     # create a new font object, use external ttf file
     font_path = logic.expandPath('//Zeyada.ttf')
-       # store the font indice - to use later
+    # store the font indice - to use later
     logic.font_id = blf.load(font_path)
 
-    # set the font drawing routine to run every frame   
+    # set the font drawing routine to run every frame
     scene = logic.getCurrentScene()
-    scene.post_draw=[write]
+    scene.post_draw = [write]
+
 
 def write():
     """write on screen"""
     width = render.getWindowWidth()
     height = render.getWindowHeight()
-    
+
     # OpenGL setup
     bgl.glMatrixMode(bgl.GL_PROJECTION)
     bgl.glLoadIdentity()
     bgl.gluOrtho2D(0, width, 0, height)
     bgl.glMatrixMode(bgl.GL_MODELVIEW)
     bgl.glLoadIdentity()
-    
+
     # BLF drawing routine
     font_id = logic.font_id
-    blf.position(font_id, (width*0.2), (height*0.3), 0)
+    blf.position(font_id, (width * 0.2), (height * 0.3), 0)
     blf.size(font_id, 50, 72)
     blf.draw(font_id, "Hello World")
index 5f23ca3..a3befe1 100755 (executable)
@@ -38,8 +38,11 @@ cp $SPHINXBASE/sphinx-out/contents.html $SPHINXBASE/sphinx-out/index.html
 ssh $SSH_USER@emo.blender.org 'rm -rf '$SSH_UPLOAD_FULL'/*'
 rsync --progress -avze "ssh -p 22" $SPHINXBASE/sphinx-out/* $SSH_HOST:$SSH_UPLOAD_FULL/
 
-# symlink the dir to a static URL
-ssh $SSH_USER@emo.blender.org 'rm '$SSH_UPLOAD'/250PythonDoc && ln -s '$SSH_UPLOAD_FULL' '$SSH_UPLOAD'/250PythonDoc'
+## symlink the dir to a static URL
+#ssh $SSH_USER@emo.blender.org 'rm '$SSH_UPLOAD'/250PythonDoc && ln -s '$SSH_UPLOAD_FULL' '$SSH_UPLOAD'/250PythonDoc'
+
+# better redirect
+ssh $SSH_USER@emo.blender.org 'echo "<html><head><title>Redirecting...</title><meta http-equiv=\"REFRESH\" content=\"0;url=../blender_python_api_'$BLENDER_VERSION'/\"></head><body>Redirecting...</body></html>" > '$SSH_UPLOAD'/250PythonDoc/index.html'
 
 # pdf
 sphinx-build -b latex $SPHINXBASE/sphinx-in $SPHINXBASE/sphinx-out
index cf74282..5aed058 100644 (file)
@@ -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")
index 9c48dc8..0add2b3 100644 (file)
@@ -43,6 +43,7 @@ from . import utils, path, ops
 # fake operator module
 ops = ops.ops_fake_module
 
+
 def _main():
     import sys as _sys
 
index 9545e20..0a3f139 100644 (file)
@@ -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':
index c42d3d0..ecd620f 100644 (file)
@@ -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:
index 0f0491e..627a153 100644 (file)
@@ -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:
index 8fe6063..7fd769c 100644 (file)
@@ -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
 
index 4b3435e..a38d817 100644 (file)
@@ -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'}
index 5a0d327..42b0af7 100644 (file)
@@ -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)
index ce6d099..0a4d0b6 100644 (file)
@@ -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()
index 0272667..c577af0 100644 (file)
@@ -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")
index cda37b3..f66cee7 100644 (file)
@@ -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())
index 831fd35..2088d87 100644 (file)
@@ -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")
index f35ad71..933579f 100644 (file)
@@ -1017,7 +1017,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}
index ee0ca94..f96a758 100644 (file)
@@ -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
index 19c3224..91cfd22 100644 (file)
@@ -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):
index aa0e601..45d26f4 100644 (file)
@@ -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:
index d3923b5..d3c94b8 100644 (file)
@@ -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():
index 3abfa05..662c872 100644 (file)
@@ -1287,6 +1287,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
                                                QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
                                                offset += sizeof(float)*4;
                                        }
+                                       (void)offset;
                                }
                                curface++;
                                if(mface->v4) {
@@ -1327,6 +1328,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
                                                        QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
                                                        offset += sizeof(float)*4;
                                                }
+                                               (void)offset;
                                        }
                                        curface++;
                                        i++;
index 45faba8..8d19322 100644 (file)
@@ -466,7 +466,6 @@ static void layerInterp_mdisps(void **sources, float *UNUSED(weights),
                        MDisps tris[2];
                        int vindex[4] = {0};
 
-                       S = 0;
                        for(i = 0; i < 2; i++)
                                for(y = 0; y < 4; y++)
                                        for(x = 0; x < 4; x++)
index 962c7fd..3f01c55 100644 (file)
@@ -550,7 +550,7 @@ Material *material_pop_id(ID *id, int index)
                                Material **mat;
 
                                if(index + 1 != (*totcol))
-                                       memmove((*matar), (*matar) + 1, sizeof(void *) * ((*totcol) - (index + 1)));
+                                       memmove((*matar)+index, (*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1)));
 
                                (*totcol)--;
                                
index d833c18..88a670e 100644 (file)
@@ -465,12 +465,13 @@ static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lv
        return multires_dm_create_from_derived(&mmd, 1, dm, ob, 0, 0);
 }
 
-static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal)
+static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal, int plain_uv)
 {
        SubsurfModifierData smd= {{NULL}};
 
        smd.levels = smd.renderLevels = lvl;
-       smd.flags |= eSubsurfModifierFlag_SubsurfUv;
+       if(!plain_uv)
+               smd.flags |= eSubsurfModifierFlag_SubsurfUv;
        if(simple)
                smd.subdivType = ME_SIMPLE_SUBSURF;
        if(optimal)
@@ -591,7 +592,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
        /* subdivide the mesh to highest level without displacements */
        cddm = CDDM_from_mesh(me, NULL);
        DM_set_only_copy(cddm, CD_MASK_BAREMESH);
-       origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0);
+       origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
        cddm->release(cddm);
 
        /* calc disps */
@@ -626,7 +627,7 @@ static void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl
                /* create subsurf DM from original mesh at high level */
                cddm = CDDM_from_mesh(me, NULL);
                DM_set_only_copy(cddm, CD_MASK_BAREMESH);
-               highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0);
+               highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
 
                /* create multires DM from original mesh at low level */
                lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple);
@@ -830,7 +831,7 @@ static void multiresModifier_update(DerivedMesh *dm)
                        else cddm = CDDM_from_mesh(me, NULL);
                        DM_set_only_copy(cddm, CD_MASK_BAREMESH);
 
-                       highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0);
+                       highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
 
                        /* create multires DM from original mesh and displacements */
                        lowdm = multires_dm_create_local(ob, cddm, lvl, totlvl, mmd->simple);
@@ -884,7 +885,7 @@ static void multiresModifier_update(DerivedMesh *dm)
                        else cddm = CDDM_from_mesh(me, NULL);
                        DM_set_only_copy(cddm, CD_MASK_BAREMESH);
 
-                       subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0);
+                       subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
                        cddm->release(cddm);
 
                        multiresModifier_disp_run(dm, me, 1, 0, subdm->getGridData(subdm), mmd->totlvl);
@@ -927,7 +928,8 @@ DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int loca
                return dm;
 
        result = subsurf_dm_create_local(ob, dm, lvl,
-               mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges);
+               mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges,
+               mmd->flags & eMultiresModifierFlag_PlainUv);
 
        if(!local_mmd) {
                ccgdm = (CCGDerivedMesh*)result;
@@ -1633,7 +1635,7 @@ static void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3])
        MEM_freeN(vertCos);
 
        /* scaled ccgDM for tangent space of object with applied scale */
-       dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0);
+       dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
        cddm->release(cddm);
 
        /*numGrids= dm->getNumGrids(dm);*/ /*UNUSED*/
index a44fa68..9d29177 100644 (file)
@@ -37,12 +37,36 @@ MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::Li
 
 void MaterialsExporter::exportMaterials(Scene *sce, bool export_selected)
 {
-       openLibrary();
+       if(hasMaterials(sce)) {
+               openLibrary();
 
-       MaterialFunctor mf;
-       mf.forEachMaterialInScene<MaterialsExporter>(sce, *this, export_selected);
+               MaterialFunctor mf;
+               mf.forEachMaterialInScene<MaterialsExporter>(sce, *this, export_selected);
 
-       closeLibrary();
+               closeLibrary();
+       }
+}
+
+
+bool MaterialsExporter::hasMaterials(Scene *sce)
+{
+       Base *base = (Base *)sce->base.first;
+       
+       while(base) {
+               Object *ob= base->object;
+               int a;
+               for(a = 0; a < ob->totcol; a++)
+               {
+                       Material *ma = give_current_material(ob, a+1);
+
+                       // no material, but check all of the slots
+                       if (!ma) continue;
+
+                       return true;
+               }
+               base= base->next;
+       }
+       return false;
 }
 
 void MaterialsExporter::operator()(Material *ma, Object *ob)
index 0a7a276..c080e4b 100644 (file)
@@ -51,6 +51,9 @@ public:
        MaterialsExporter(COLLADASW::StreamWriter *sw);
        void exportMaterials(Scene *sce, bool export_selected);
        void operator()(Material *ma, Object *ob);
+
+private:
+       bool hasMaterials(Scene *sce);
 };
 
 // used in forEachMaterialInScene
index 5f405a5..cdc839e 100644 (file)
@@ -1115,10 +1115,11 @@ void init_userdef_do_versions(void)
        }
        if(U.pad_rot_angle==0)
                U.pad_rot_angle= 15;
-       
-       if(U.flag & USER_CUSTOM_RANGE) 
-               vDM_ColorBand_store(&U.coba_weight); /* signal for derivedmesh to use colorband */
-       
+
+       /* signal for derivedmesh to use colorband */
+       /* run incase this was on and is now off in the user prefs [#28096] */
+       vDM_ColorBand_store((U.flag & USER_CUSTOM_RANGE) ? (&U.coba_weight):NULL);
+
        if (bmain->versionfile <= 191) {
                strcpy(U.plugtexdir, U.textudir);
                strcpy(U.sounddir, "/");
index 4230a43..c719f74 100644 (file)
@@ -1101,7 +1101,7 @@ void NODE_OT_backimage_move(wmOperatorType *ot)
        ot->cancel= snode_bg_viewmove_cancel;
        
        /* flags */
-       ot->flag= OPTYPE_BLOCKING;
+       ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
 }
 
 static int backimage_zoom(bContext *C, wmOperator *op)
@@ -2216,6 +2216,12 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
                                /* we might need to remove a link */
                                if(in_out==SOCK_OUT)
                                        node_remove_extra_links(snode, link->tosock, link);
+                               
+                               /* when linking to group outputs, update the socket type */
+                               /* XXX this should all be part of a generic update system */
+                               if (!link->tonode) {
+                                       link->tosock->type = link->fromsock->type;
+                               }
                        }
                        else if (outside_group_rect(snode) && (link->tonode || link->fromnode)) {
                                /* automatically add new group socket */
index 36e3349..b105b25 100644 (file)
@@ -101,6 +101,8 @@ static void sequencer_generic_props__internal(wmOperatorType *ot, int flag)
        
        RNA_def_boolean(ot->srna, "replace_sel", 1, "Replace Selection", "replace the current selection");
 
+       RNA_def_boolean(ot->srna, "overlap", 0, "Allow Overlap", "Don't correct overlap on new sequence strips");
+
        if(flag & SEQPROP_FILES)
                RNA_def_collection_runtime(ot->srna, "files", &RNA_OperatorFileListElement, "Files", "");
 }
@@ -250,7 +252,11 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op)
                seq_active_set(scene, seq);
                seq->flag |= SELECT;
        }
-       
+
+       if(RNA_boolean_get(op->ptr, "overlap") == FALSE) {
+               if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+       }
+
        WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
        
        return OPERATOR_FINISHED;
@@ -303,8 +309,9 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad
        Scene *scene= CTX_data_scene(C); /* only for sound */
        Editing *ed= seq_give_editing(scene, TRUE);
        SeqLoadInfo seq_load;
-       /* Sequence *seq; */ /* UNUSED */
+       Sequence *seq;
        int tot_files;
+       const short overlap= RNA_boolean_get(op->ptr, "overlap");
 
        seq_load_operator_info(&seq_load, op);
 
@@ -324,13 +331,21 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad
                        RNA_string_get(&itemptr, "name", file_only);
                        BLI_join_dirfile(seq_load.path, sizeof(seq_load.path), dir_only, file_only);
 
-                       /* seq= */ seq_load_func(C, ed->seqbasep, &seq_load);
+                       seq= seq_load_func(C, ed->seqbasep, &seq_load);
+
+                       if(overlap == FALSE) {
+                               if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+                       }
                }
                RNA_END;
        }
        else {
                /* single file */
-               /* seq= */ seq_load_func(C, ed->seqbasep, &seq_load);
+               seq= seq_load_func(C, ed->seqbasep, &seq_load);
+
+               if(overlap == FALSE) {
+                       if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+               }
        }
 
        if (seq_load.tot_success==0) {
@@ -506,7 +521,11 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
 
        /* last active name */
        strncpy(ed->act_imagedir, strip->dir, FILE_MAXDIR-1);
-       
+
+       if(RNA_boolean_get(op->ptr, "overlap") == FALSE) {
+               if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+       }
+
        WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
 
        return OPERATOR_FINISHED;
@@ -656,7 +675,9 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op)
                }
        }
 
-       if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+       if(RNA_boolean_get(op->ptr, "overlap") == FALSE) {
+               if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
+       }
 
        update_changed_seq_and_deps(scene, seq, 1, 1); /* runs calc_sequence */
 
index 933d90e..ca89670 100644 (file)
@@ -467,14 +467,17 @@ void initSnapping(TransInfo *t, wmOperator *op)
        /* use scene defaults only when transform is modal */
        else if (t->flag & T_MODAL)
        {
-               if (ts->snap_flag & SCE_SNAP) {
-                       t->modifiers |= MOD_SNAP;
-               }
+               if(ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE))
+               {
+                       if (ts->snap_flag & SCE_SNAP) {
+                               t->modifiers |= MOD_SNAP;
+                       }
 
-               t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) == SCE_SNAP_ROTATE);
-               t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
-               t->tsnap.snap_self = !((t->settings->snap_flag & SCE_SNAP_NO_SELF) == SCE_SNAP_NO_SELF);
-               t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
+                       t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) == SCE_SNAP_ROTATE);
+                       t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
+                       t->tsnap.snap_self = !((t->settings->snap_flag & SCE_SNAP_NO_SELF) == SCE_SNAP_NO_SELF);
+                       t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
+               }
        }
        
        t->tsnap.target = snap_target;
@@ -1944,9 +1947,9 @@ static void applyGrid(TransInfo *t, float *val, int max_index, float fac[3], Gea
        int i;
        float asp[3] = {1.0f, 1.0f, 1.0f}; // TODO: Remove hard coded limit here (3)
 
-       if(max_index > 3) {
+       if(max_index > 2) {
                printf("applyGrid: invalid index %d, clamping\n", max_index);
-               max_index= 3;
+               max_index= 2;
        }
 
        // Early bailing out if no need to snap
index 806c70d..2748840 100644 (file)
@@ -1371,9 +1371,6 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
                mat->obcolalpha = 1;
                GPU_link(mat, "shade_alpha_obcolor", shr->combined, GPU_builtin(GPU_OBCOLOR), &shr->combined);
        }
-
-       if(gpu_do_color_management(mat))
-               GPU_link(mat, "linearrgb_to_srgb", shr->combined, &shr->combined);
 }
 
 static GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma)
@@ -1408,6 +1405,10 @@ GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
                GPU_material_output_link(mat, outlink);
        }
 
+       if(gpu_do_color_management(mat))
+               if(mat->outlink)
+                       GPU_link(mat, "linearrgb_to_srgb", mat->outlink, &mat->outlink);
+
        /*if(!GPU_material_construct_end(mat)) {
                GPU_material_free(mat);
                mat= NULL;
index d2d8e01..3787675 100644 (file)
@@ -624,6 +624,7 @@ typedef struct MultiresModifierData {
 
 typedef enum {
        eMultiresModifierFlag_ControlEdges = (1<<0),
+       eMultiresModifierFlag_PlainUv = (1<<1),
 } MultiresModifierFlag;
 
 typedef struct FluidsimModifierData {
index dcf2400..e71be8c 100644 (file)
@@ -1364,13 +1364,13 @@ static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerR
                if(prop->noteflag)
                        WM_main_add_notifier(prop->noteflag, ptr->id.data);
        }
-       else {
+       
+       if(!is_rna || (prop->flag & PROP_IDPROPERTY)) {
                /* WARNING! This is so property drivers update the display!
                 * not especially nice  */
                DAG_id_tag_update(ptr->id.data, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
                WM_main_add_notifier(NC_WINDOW, NULL);
        }
-
 }
 
 /* must keep in sync with 'rna_property_update'
index d2c1b86..ba65591 100644 (file)
@@ -805,6 +805,11 @@ static void rna_def_modifier_multires(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flags", eMultiresModifierFlag_ControlEdges);
        RNA_def_property_ui_text(prop, "Optimal Display", "Skip drawing/rendering of interior subdivided edges");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop= RNA_def_property(srna, "use_subsurf_uv", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "flags", eMultiresModifierFlag_PlainUv);
+       RNA_def_property_ui_text(prop, "Subdivide UVs", "Use subsurf to subdivide UVs");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_lattice(BlenderRNA *brna)
index 7dd8659..e228295 100644 (file)
@@ -155,7 +155,8 @@ void WM_init(bContext *C, int argc, const char **argv)
        BPY_python_start(argc, argv);
 
        BPY_driver_reset();
-       BPY_app_handlers_reset();
+       BPY_app_handlers_reset(); /* causes addon callbacks to be freed [#28068],
+                                  * but this is actually what we want. */
        BPY_modules_load_user(C);
 #else
        (void)argc; /* unused */
index fddd6d2..36209db 100644 (file)
@@ -434,9 +434,12 @@ static int playback_mode(int UNUSED(argc), const char **UNUSED(argv), void *UNUS
 {
        /* not if -b was given first */
        if (G.background == 0) {
-
-// XXX                         playanim(argc, argv); /* not the same argc and argv as before */
+#if 0  /* TODO, bring player back? */
+               playanim(argc, argv); /* not the same argc and argv as before */
+#else
+               fprintf(stderr, "Playback mode not supported in blender 2.5x\n");
                exit(0);
+#endif
        }
 
        return -2;
index 11c7ce6..856e1f6 100644 (file)
@@ -28,6 +28,7 @@ SKIP_DIRS = ("extern",
              os.path.join("source", "tests"),  # not this dir
              )
 
+
 def is_c_header(filename):
     ext = splitext(filename)[1]
     return (ext in (".h", ".hpp", ".hxx"))
@@ -41,13 +42,16 @@ def is_c(filename):
 def is_c_any(filename):
     return is_c(filename) or is_c_header(filename)
 
+
 def is_py(filename):
     ext = splitext(filename)[1]
     return (ext == ".py")
 
+
 def is_source_any(filename):
     return is_c_any(filename) or is_py(filename)
 
+
 def source_list(path, filename_check=None):
     for dirpath, dirnames, filenames in os.walk(path):
 
@@ -67,7 +71,7 @@ def deprecations():
     /* *DEPRECATED* 2011/7/17 bgl.Buffer.list info text */
 
     Or...
-    
+
     # *DEPRECATED* 2010/12/22 some.py.func more info */
 
     """
@@ -105,12 +109,12 @@ def deprecations():
                     if len(data) != 3:
                         print("    poorly formatting line:\n"
                               "    %r:%d\n"
-                              "    %s"%
+                              "    %s" %
                               (fn, i + 1, l)
                               )
                     else:
                         data = datetime.datetime(*tuple([int(w) for w in data]))
-                        
+
                         deprecations_ls.append((data, (fn, i + 1), info))
                 except:
                     print("Error file - %r:%d" % (fn, i + 1))
@@ -123,10 +127,11 @@ def deprecations():
 
     return deprecations_ls
 
+
 def main():
     import datetime
     now = datetime.datetime.now()\
-    
+
     deps = deprecations()
 
     print("\nAll deprecations...")