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