Merged 38568-38822
authorJason Hays <jason_hays22@mymail.eku.edu>
Fri, 29 Jul 2011 17:57:46 +0000 (17:57 +0000)
committerJason Hays <jason_hays22@mymail.eku.edu>
Fri, 29 Jul 2011 17:57:46 +0000 (17:57 +0000)
114 files changed:
CMakeLists.txt
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/examples/mathutils.Vector.py
doc/python_api/sphinx_doc_gen.sh
intern/audaspace/OpenAL/AUD_OpenALDevice.cpp
intern/audaspace/OpenAL/AUD_OpenALDevice.h
release/scripts/modules/addon_utils.py
release/scripts/modules/bpy/__init__.py
release/scripts/modules/bpy/path.py
release/scripts/modules/bpy_extras/io_utils.py
release/scripts/modules/bpy_extras/mesh_utils.py
release/scripts/modules/bpy_extras/view3d_utils.py
release/scripts/modules/bpy_types.py
release/scripts/startup/bl_operators/add_mesh_torus.py
release/scripts/startup/bl_operators/image.py
release/scripts/startup/bl_operators/mesh.py
release/scripts/startup/bl_operators/object.py
release/scripts/startup/bl_operators/object_align.py
release/scripts/startup/bl_operators/object_quick_effects.py
release/scripts/startup/bl_operators/object_randomize_transform.py
release/scripts/startup/bl_operators/presets.py
release/scripts/startup/bl_operators/screen_play_rendered_anim.py
release/scripts/startup/bl_operators/uvcalc_smart_project.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_image.py
release/scripts/startup/bl_ui/space_info.py
release/scripts/startup/bl_ui/space_node.py
release/scripts/startup/bl_ui/space_text.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 [new file with mode: 0644]
release/scripts/templates/ui_menu_simple.py [new file with mode: 0644]
release/scripts/templates/ui_panel_simple.py [moved from release/scripts/templates/panel_simple.py with 76% similarity]
source/blender/blenkernel/BKE_blender.h
source/blender/blenkernel/BKE_effect.h
source/blender/blenkernel/CMakeLists.txt
source/blender/blenkernel/SConscript
source/blender/blenkernel/intern/cdderivedmesh.c
source/blender/blenkernel/intern/customdata.c
source/blender/blenkernel/intern/effect.c
source/blender/blenkernel/intern/material.c
source/blender/blenkernel/intern/multires.c
source/blender/blenkernel/intern/seqeffects.c
source/blender/blenkernel/intern/text.c
source/blender/blenkernel/intern/writeavi.c
source/blender/blenkernel/intern/writeframeserver.c
source/blender/collada/MaterialExporter.cpp
source/blender/collada/MaterialExporter.h
source/blender/editors/armature/editarmature.c
source/blender/editors/include/ED_node.h
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_layout.c
source/blender/editors/interface/interface_panel.c
source/blender/editors/interface/interface_regions.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/interface/resources.c
source/blender/editors/object/object_add.c
source/blender/editors/object/object_edit.c
source/blender/editors/render/render_shading.c
source/blender/editors/space_node/drawnode.c
source/blender/editors/space_node/node_draw.c
source/blender/editors/space_node/node_edit.c
source/blender/editors/space_sequencer/sequencer_add.c
source/blender/editors/space_text/text_ops.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/editors/space_view3d/view3d_header.c
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform.h
source/blender/editors/transform/transform_conversions.c
source/blender/editors/transform/transform_generics.c
source/blender/editors/transform/transform_ops.c
source/blender/editors/transform/transform_snap.c
source/blender/editors/util/undo.c
source/blender/editors/uvedit/uvedit_ops.c
source/blender/gpu/intern/gpu_material.c
source/blender/imbuf/IMB_imbuf.h
source/blender/imbuf/intern/filter.c
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesdna/DNA_node_types.h
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/intern/CMakeLists.txt
source/blender/makesrna/intern/SConscript
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_modifier.c
source/blender/makesrna/intern/rna_object_api.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_wm.c
source/blender/python/mathutils/mathutils.h
source/blender/python/mathutils/mathutils_Matrix.c
source/blender/python/mathutils/mathutils_Quaternion.c
source/blender/python/mathutils/mathutils_Vector.c
source/blender/render/intern/source/convertblender.c
source/blender/render/intern/source/rendercore.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm.c
source/blender/windowmanager/intern/wm_init_exit.c
source/blenderplayer/bad_level_call_stubs/stubs.c
source/creator/creator.c
source/gameengine/Expressions/PyObjectPlus.cpp
source/gameengine/Expressions/PyObjectPlus.h
source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
source/gameengine/Ketsji/KX_KetsjiEngine.cpp
source/tests/CMakeLists.txt
source/tests/check_deprecated.py

index ebf7aa8a6c065bf7821955d8a192eaf68c1618ff..d4489a8c76b0983a8606b5a46d9241cd2b7dd0bd 100644 (file)
@@ -155,6 +155,7 @@ option(WITH_IMAGE_DDS           "Enable DDS Image Support" ON)
 option(WITH_IMAGE_CINEON        "Enable CINEON and DPX Image Support" ON)
 option(WITH_IMAGE_HDR           "Enable HDR Image Support" ON)
 option(WITH_IMAGE_REDCODE       "Enable RedCode Image Support" OFF)
+option(WITH_IMAGE_FRAMESERVER   "Enable image FrameServer Support for rendering" ON)
 
 # Audio/Video format support
 option(WITH_CODEC_FFMPEG        "Enable FFMPeg Support (http://ffmpeg.org)" OFF)
index 4b35e34a5cddf5bb35d176adc48adc60bcbc2868..ba71603b0070f6e59412596a1163a1418db7af3a 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 6afca8f3b6a1712daf0cfc2146198f9a8c0b78f4..8060574580c1f9cb3928eae0431d027ddc23cea2 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 3de15567727433787e5e997adecfee76690db74d..d8993c3197a7e65dd15c094d6505409247fff9a6 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 4cd967310ccb8a69c06ab9e5aef40367bc587720..de2f7e0a39daf5ab23586fb1727fa201481a034a 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 74b37e729943633d95c575086b2a940ea7ad97e8..faa0ae736e83eefc4e0ff3ec166f93d3820f0254 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 0ec9aa16bca050ba5d4ff18beefe8cc72bcb023c..70e4d6d9377f42d281d2fa2ab0f178940ca099c1 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 3ab7f789ce832999a25e6124855c6ab7edbdd777..f6e87cf488d73fb18fae641f0073393e0badd0f2 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 880b4ef2590185231f94419acb32aaa59e789349..bf1fc70353f52978b027243e79544c556118fd2e 100644 (file)
@@ -1,15 +1,15 @@
 import mathutils
 
 # zero length vector
-vec = mathutils.Vector((0, 0, 1))
+vec = mathutils.Vector((0.0, 0.0, 1.0))
 
 # unit length vector
 vec_a = vec.copy().normalize()
 
-vec_b = mathutils.Vector((0, 1, 2))
+vec_b = mathutils.Vector((0.0, 1.0, 2.0))
 
-vec2d = mathutils.Vector((1, 2))
-vec3d = mathutils.Vector((1, 0, 0))
+vec2d = mathutils.Vector((1.0, 2.0))
+vec3d = mathutils.Vector((1.0, 0.0, 0.0))
 vec4d = vec_a.to_4d()
 
 # other mathutuls types
@@ -34,9 +34,9 @@ vec_a + vec_b
 vec_a - vec_b
 vec_a * vec_b
 vec_a * 10.0
-vec_a * matrix
+matrix * vec_a
+quat * vec_a
 vec_a * vec_b
-vec_a * quat
 -vec_a
 
 
@@ -44,6 +44,7 @@ vec_a * quat
 x = vec_a[0]
 len(vec)
 vec_a[:] = vec_b
+vec_a[:] = 1.0, 2.0, 3.0
 vec2d[:] = vec3d[:2]
 
 
index 5f23ca395b6f7cafabd5e137d875b3e65892e523..a3befe1b7cb9d2928a177bed37a7299cd4364233 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 b9e30bbf62aa94897b901f29962de288a8820859..71e7b7677e888a7ae35d52b1a3223ef050526ed4 100644 (file)
@@ -105,12 +105,15 @@ void* AUD_openalRunThread(void* device)
        return NULL;
 }
 
-void AUD_OpenALDevice::start()
+void AUD_OpenALDevice::start(bool join)
 {
        lock();
 
        if(!m_playing)
        {
+               if(join)
+                       pthread_join(m_thread, NULL);
+
                pthread_attr_t attr;
                pthread_attr_init(&attr);
                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
@@ -271,8 +274,8 @@ void AUD_OpenALDevice::updateStreams()
                // stop thread
                if(m_playingSounds->empty() || (cerr != ALC_NO_ERROR))
                {
-                       unlock();
                        m_playing = false;
+                       unlock();
                        pthread_exit(NULL);
                }
 
@@ -366,6 +369,8 @@ AUD_OpenALDevice::AUD_OpenALDevice(AUD_DeviceSpecs specs, int buffersize)
        pthread_mutex_init(&m_mutex, &attr);
 
        pthread_mutexattr_destroy(&attr);
+
+       start(false);
 }
 
 AUD_OpenALDevice::~AUD_OpenALDevice()
@@ -414,13 +419,8 @@ AUD_OpenALDevice::~AUD_OpenALDevice()
        alcProcessContext(m_context);
 
        // wait for the thread to stop
-       if(m_playing)
-       {
-               unlock();
-               pthread_join(m_thread, NULL);
-       }
-       else
-               unlock();
+       unlock();
+       pthread_join(m_thread, NULL);
 
        delete m_playingSounds;
        delete m_pausedSounds;
index 3bbbe85d7e6480930f6e3b11a0723f2621c68a8c..127f69beca8bc5d3ef00bd88302f58de7204d2eb 100644 (file)
@@ -106,7 +106,7 @@ private:
        /**
         * Starts the streaming thread.
         */
-       void start();
+       void start(bool join = true);
 
        /**
         * Checks if a handle is valid.
index cf74282d06489a05d88f5b74ce8bd6fed181abc5..5aed0581ea933b0984e65f0d1928f193c5294d01 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 9c48dc89f83992265cb2b4f5507fb9dc135bee08..0add2b3e6cd29c50f6beda16f694ec4fb7c058d6 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 f6254efac2e2ab89d44c3203f43e2f5a0e355b6b..eb1a5ffc4551800e3c04591ae73a16e0cfb8fe44 100644 (file)
@@ -239,4 +239,4 @@ def basename(path):
 
     Use for Windows compatibility.
     """
-    return _os.path.basename(path[2:] if path.startswith("//") else path)
+    return _os.path.basename(path[2:] if path[:2] in {"//", b"//"} else path)
index 9545e20b025cccee97da5fdeee5bcc03fb45d2cb..0a3f1392653dff70c5cc5da1a051c497b5aa8397 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 c42d3d0236a6d92948755f04dabe5a72eb539c4d..ecd620ff2c954e363b3c2a81f82f397f9ac8735e 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 c0c0f9186bd22117dd5623ec54d1de2df517520b..5796abce72cc5d9b7ce6538bd460955a162b3747 100644 (file)
@@ -50,11 +50,11 @@ def region_2d_to_vector_3d(region, rv3d, coord):
                       -0.5
                     ))
 
-        w = (out[0] * persinv[0][3]) + \
-            (out[1] * persinv[1][3]) + \
-            (out[2] * persinv[2][3]) + persinv[3][3]
+        w = ((out[0] * persinv[0][3]) +
+             (out[1] * persinv[1][3]) +
+             (out[2] * persinv[2][3]) + persinv[3][3])
 
-        return ((out * persinv) / w) - rv3d.view_matrix.inverted()[3].xyz
+        return ((persinv * out) / w) - rv3d.view_matrix.inverted()[3].xyz
     else:
         return rv3d.view_matrix.inverted()[2].xyz.normalized()
 
@@ -116,7 +116,7 @@ def location_3d_to_region_2d(region, rv3d, coord):
     """
     from mathutils import Vector
 
-    prj = Vector((coord[0], coord[1], coord[2], 1.0)) * rv3d.perspective_matrix
+    prj = rv3d.perspective_matrix * Vector((coord[0], coord[1], coord[2], 1.0))
     if prj.w > 0.0:
         width_half = region.width / 2.0
         height_half = region.height / 2.0
index f2cd46b20ae7075ede531f6fe9501ff9031a61d8..8766c873dd810bf6265f112b16cbff77f09212db 100644 (file)
@@ -144,21 +144,21 @@ class _GenericBone:
         """ Vector pointing down the x-axis of the bone.
         """
         from mathutils import Vector
-        return Vector((1.0, 0.0, 0.0)) * self.matrix.to_3x3()
+        return self.matrix.to_3x3() * Vector((1.0, 0.0, 0.0))
 
     @property
     def y_axis(self):
         """ Vector pointing down the x-axis of the bone.
         """
         from mathutils import Vector
-        return Vector((0.0, 1.0, 0.0)) * self.matrix.to_3x3()
+        return self.matrix.to_3x3() * Vector((0.0, 1.0, 0.0))
 
     @property
     def z_axis(self):
         """ Vector pointing down the x-axis of the bone.
         """
         from mathutils import Vector
-        return Vector((0.0, 0.0, 1.0)) * self.matrix.to_3x3()
+        return self.matrix.to_3x3() * Vector((0.0, 0.0, 1.0))
 
     @property
     def basename(self):
@@ -294,9 +294,9 @@ class EditBone(StructRNA, _GenericBone, metaclass=StructMetaPropGroup):
         :type roll: bool
         """
         from mathutils import Vector
-        z_vec = Vector((0.0, 0.0, 1.0)) * self.matrix.to_3x3()
-        self.tail = self.tail * matrix
-        self.head = self.head * matrix
+        z_vec = self.matrix.to_3x3() * Vector((0.0, 0.0, 1.0))
+        self.tail = matrix * self.tail
+        self.head = matrix * self.head
 
         if scale:
             scalar = matrix.median_scale
@@ -304,7 +304,7 @@ class EditBone(StructRNA, _GenericBone, metaclass=StructMetaPropGroup):
             self.tail_radius *= scalar
 
         if roll:
-            self.align_roll(z_vec * matrix)
+            self.align_roll(matrix * z_vec)
 
 
 def ord_ind(i1, i2):
index 6ab803cc4696fc165275cd480c7e9ed6045f27a4..27a6d21d519f812b685cfd7ef9863ab97197bd0d 100644 (file)
@@ -16,7 +16,7 @@
 #
 # ##### END GPL LICENSE BLOCK #####
 
-# <pep8 compliant>
+# <pep8-80 compliant>
 import bpy
 import mathutils
 
@@ -40,8 +40,10 @@ def add_torus(major_rad, minor_rad, major_seg, minor_seg):
         for minor_index in range(minor_seg):
             angle = 2 * pi * minor_index / minor_seg
 
-            vec = Vector((major_rad + (cos(angle) * minor_rad), 0.0,
-                        (sin(angle) * minor_rad))) * quat
+            vec = quat * Vector((major_rad + (cos(angle) * minor_rad),
+                                0.0,
+                                (sin(angle) * minor_rad),
+                                ))
 
             verts.extend(vec[:])
 
@@ -72,7 +74,11 @@ def add_torus(major_rad, minor_rad, major_seg, minor_seg):
 
     return verts, faces
 
-from bpy.props import FloatProperty, IntProperty, BoolProperty, FloatVectorProperty
+from bpy.props import (FloatProperty,
+                       IntProperty,
+                       BoolProperty,
+                       FloatVectorProperty,
+                       )
 
 
 class AddTorus(bpy.types.Operator):
@@ -82,7 +88,8 @@ class AddTorus(bpy.types.Operator):
     bl_options = {'REGISTER', 'UNDO'}
 
     major_radius = FloatProperty(name="Major Radius",
-            description="Radius from the origin to the center of the cross sections",
+            description=("Radius from the origin to the "
+                         "center of the cross sections"),
             default=1.0, min=0.01, max=100.0)
     minor_radius = FloatProperty(name="Minor Radius",
             description="Radius of the torus' cross section",
index 4bb53f776baae7b305e3477010411a2a977bccd9..23bafe2eaae4bf39398c1afbf5f428648f4a8167 100644 (file)
@@ -16,7 +16,7 @@
 #
 # ##### END GPL LICENSE BLOCK #####
 
-# <pep8 compliant>
+# <pep8-80 compliant>
 
 import bpy
 from bpy.props import StringProperty
@@ -28,7 +28,11 @@ class EditExternally(bpy.types.Operator):
     bl_label = "Image Edit Externally"
     bl_options = {'REGISTER'}
 
-    filepath = StringProperty(name="File Path", description="Path to an image file", maxlen=1024, default="")
+    filepath = StringProperty(
+            name="File Path",
+            description="Path to an image file",
+            maxlen=1024,
+            )
 
     def _editor_guess(self, context):
         import sys
@@ -57,10 +61,13 @@ class EditExternally(bpy.types.Operator):
     def execute(self, context):
         import os
         import subprocess
-        filepath = bpy.path.abspath(self.filepath)
+        filepath = os.path.normpath(bpy.path.abspath(self.filepath))
 
         if not os.path.exists(filepath):
-            self.report({'ERROR'}, "Image path %r not found, image may be packed or unsaved." % filepath)
+            self.report({'ERROR'},
+                        "Image path %r not found, image may be packed or "
+                        "unsaved." % filepath)
+
             return {'CANCELLED'}
 
         cmd = self._editor_guess(context) + [filepath]
@@ -70,7 +77,10 @@ class EditExternally(bpy.types.Operator):
         except:
             import traceback
             traceback.print_exc()
-            self.report({'ERROR'}, "Image editor not found, please specify in User Preferences > File")
+            self.report({'ERROR'},
+                        "Image editor not found, "
+                        "please specify in User Preferences > File")
+
             return {'CANCELLED'}
 
         return {'FINISHED'}
@@ -104,7 +114,9 @@ class SaveDirty(bpy.types.Operator):
                 if "\\" not in filepath and "/" not in filepath:
                     self.report({'WARNING'}, "Invalid path: " + filepath)
                 elif filepath in unique_paths:
-                    self.report({'WARNING'}, "Path used by more then one image: " + filepath)
+                    self.report({'WARNING'},
+                                "Path used by more then one image: %r" %
+                                filepath)
                 else:
                     unique_paths.add(filepath)
                     image.save()
@@ -142,14 +154,14 @@ class ProjectEdit(bpy.types.Operator):
 
         filepath = os.path.basename(bpy.data.filepath)
         filepath = os.path.splitext(filepath)[0]
-        # filepath = bpy.path.clean_name(filepath) # fixes <memory> rubbish, needs checking
+        # fixes <memory> rubbish, needs checking
+        # filepath = bpy.path.clean_name(filepath)
 
-        if filepath.startswith(".") or filepath == "":
-            # TODO, have a way to check if the file is saved, assume startup.blend
+        if bpy.data.is_saved:
+            filepath = "//" + filepath
+        else:
             tmpdir = context.user_preferences.filepaths.temporary_directory
             filepath = os.path.join(tmpdir, "project_edit")
-        else:
-            filepath = "//" + filepath
 
         obj = context.object
 
index 03b0e4693106b9b206c60f960c7244397eb574c3..344b238709f9feb490626699a80a1019ffc28a65 100644 (file)
@@ -16,7 +16,7 @@
 #
 # ##### END GPL LICENSE BLOCK #####
 
-# <pep8 compliant>
+# <pep8-80 compliant>
 
 import bpy
 
@@ -111,7 +111,8 @@ class MeshMirrorUV(bpy.types.Operator):
 
         #for i, v in enumerate(mesh.vertices):
         vmap = {}
-        for mirror_a, mirror_b in (mirror_gt, mirror_lt), (mirror_lt, mirror_gt):
+        for mirror_a, mirror_b in ((mirror_gt, mirror_lt),
+                                   (mirror_lt, mirror_gt)):
             for co, i in mirror_a.items():
                 nco = (-co[0], co[1], co[2])
                 j = mirror_b.get(nco)
@@ -120,7 +121,8 @@ class MeshMirrorUV(bpy.types.Operator):
 
         active_uv_layer = mesh.uv_textures.active.data
         fuvs = [(uv.uv1, uv.uv2, uv.uv3, uv.uv4) for uv in active_uv_layer]
-        fuvs_cpy = [(uv[0].copy(), uv[1].copy(), uv[2].copy(), uv[3].copy()) for uv in fuvs]
+        fuvs_cpy = [(uv[0].copy(), uv[1].copy(), uv[2].copy(), uv[3].copy())
+                    for uv in fuvs]
 
         # as a list
         faces = mesh.faces[:]
index 0342a14a1b23c7e1fe4491222b0b010347b24004..627a1530fe15657c1bcf3aad7a7f93bd446faa28 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
@@ -28,9 +28,22 @@ class SelectPattern(bpy.types.Operator):
     bl_label = "Select Pattern"
     bl_options = {'REGISTER', 'UNDO'}
 
-    pattern = StringProperty(name="Pattern", description="Name filter using '*' and '?' wildcard chars", maxlen=32, default="*")
-    case_sensitive = BoolProperty(name="Case Sensitive", description="Do a case sensitive compare", default=False)
-    extend = BoolProperty(name="Extend", description="Extend the existing selection", default=True)
+    pattern = StringProperty(
+            name="Pattern",
+            description="Name filter using '*' and '?' wildcard chars",
+            maxlen=32,
+            default="*",
+            )
+    case_sensitive = BoolProperty(
+            name="Case Sensitive",
+            description="Do a case sensitive compare",
+            default=False,
+            )
+    extend = BoolProperty(
+            name="Extend",
+            description="Extend the existing selection",
+            default=True,
+            )
 
     def execute(self, context):
 
@@ -39,22 +52,37 @@ class SelectPattern(bpy.types.Operator):
         if self.case_sensitive:
             pattern_match = fnmatch.fnmatchcase
         else:
-            pattern_match = lambda a, b: fnmatch.fnmatchcase(a.upper(), b.upper())
-
+            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'}
 
@@ -93,19 +121,25 @@ 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'}
 
-    direction = EnumProperty(items=(
-                        ('PARENT', "Parent", ""),
-                        ('CHILD', "Child", "")),
-                name="Direction",
-                description="Direction to select in the hierarchy",
-                default='PARENT')
+    direction = EnumProperty(
+            items=(('PARENT', "Parent", ""),
+                   ('CHILD', "Child", ""),
+                   ),
+            name="Direction",
+            description="Direction to select in the hierarchy",
+            default='PARENT')
 
-    extend = BoolProperty(name="Extend", description="Extend the existing selection", default=False)
+    extend = BoolProperty(
+            name="Extend",
+            description="Extend the existing selection",
+            default=False,
+            )
 
     @classmethod
     def poll(cls, context):
@@ -163,7 +197,12 @@ class SubdivisionSet(bpy.types.Operator):
     level = IntProperty(name="Level",
             default=1, min=-100, max=100, soft_min=-6, soft_max=6)
 
-    relative = BoolProperty(name="Relative", description="Apply the subsurf level as an offset relative to the current level", default=False)
+    relative = BoolProperty(
+            name="Relative",
+            description=("Apply the subsurf level as an offset "
+                         "relative to the current level"),
+            default=False,
+            )
 
     @classmethod
     def poll(cls, context):
@@ -215,7 +254,8 @@ class SubdivisionSet(bpy.types.Operator):
                 mod = obj.modifiers.new("Subsurf", 'SUBSURF')
                 mod.levels = level
             except:
-                self.report({'WARNING'}, "Modifiers cannot be added to object: " + obj.name)
+                self.report({'WARNING'},
+                            "Modifiers cannot be added to object: " + obj.name)
 
         for obj in context.selected_editable_objects:
             set_object_subd(obj)
@@ -224,23 +264,37 @@ class SubdivisionSet(bpy.types.Operator):
 
 
 class ShapeTransfer(bpy.types.Operator):
-    '''Copy another selected objects active shape to this one by applying the relative offsets'''
+    '''Copy another selected objects active shape to this one by ''' \
+    '''applying the relative offsets'''
 
     bl_idname = "object.shape_key_transfer"
     bl_label = "Transfer Shape Key"
     bl_options = {'REGISTER', 'UNDO'}
 
-    mode = EnumProperty(items=(
-                        ('OFFSET', "Offset", "Apply the relative positional offset"),
-                        ('RELATIVE_FACE', "Relative Face", "Calculate the geometricly relative position (using faces)."),
-                        ('RELATIVE_EDGE', "Relative Edge", "Calculate the geometricly relative position (using edges).")),
-                name="Transformation Mode",
-                description="Method to apply relative shape positions to the new shape",
-                default='OFFSET')
-
-    use_clamp = BoolProperty(name="Clamp Offset",
-                description="Clamp the transformation to the distance each vertex moves in the original shape.",
-                default=False)
+    mode = EnumProperty(
+            items=(('OFFSET',
+                    "Offset",
+                    "Apply the relative positional offset",
+                    ),
+                   ('RELATIVE_FACE',
+                    "Relative Face",
+                    "Calculate relative position (using faces).",
+                    ),
+                   ('RELATIVE_EDGE',
+                   "Relative Edge",
+                   "Calculate relative position (using edges).",
+                   ),
+                   ),
+            name="Transformation Mode",
+            description="Relative shape positions to the new shape method",
+            default='OFFSET',
+            )
+    use_clamp = BoolProperty(
+            name="Clamp Offset",
+            description=("Clamp the transformation to the distance each "
+                         "vertex moves in the original shape."),
+            default=False,
+            )
 
     def _main(self, ob_act, objects, mode='OFFSET', use_clamp=False):
 
@@ -272,13 +326,16 @@ class ShapeTransfer(bpy.types.Operator):
         orig_shape_coords = me_cos(ob_act.active_shape_key.data)
 
         orig_normals = me_nos(me.vertices)
-        # orig_coords = me_cos(me.vertices) # the actual mverts location isnt as relyable as the base shape :S
+        # the actual mverts location isnt as relyable as the base shape :S
+        # orig_coords = me_cos(me.vertices)
         orig_coords = me_cos(me.shape_keys.key_blocks[0].data)
 
         for ob_other in objects:
             me_other = ob_other.data
             if len(me_other.vertices) != len(me.vertices):
-                self.report({'WARNING'}, "Skipping '%s', vertex count differs" % ob_other.name)
+                self.report({'WARNING'},
+                            ("Skipping '%s', "
+                             "vertex count differs") % ob_other.name)
                 continue
 
             target_normals = me_nos(me_other.vertices)
@@ -290,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':
@@ -374,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
@@ -395,7 +490,10 @@ class ShapeTransfer(bpy.types.Operator):
 
         if 1:  # swap from/to, means we cant copy to many at once.
             if len(objects) != 1:
-                self.report({'ERROR'}, "Expected one other selected mesh object to copy from")
+                self.report({'ERROR'},
+                            ("Expected one other selected "
+                             "mesh object to copy from"))
+
                 return {'CANCELLED'}
             ob_act, objects = objects[0], [ob_act]
 
@@ -429,11 +527,14 @@ class JoinUVs(bpy.types.Operator):
             bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
 
         if not mesh.uv_textures:
-            self.report({'WARNING'}, "Object: %s, Mesh: '%s' has no UVs\n" % (obj.name, mesh.name))
+            self.report({'WARNING'},
+                        "Object: %s, Mesh: '%s' has no UVs"
+                        % (obj.name, mesh.name))
         else:
             len_faces = len(mesh.faces)
 
-            uv_array = array.array('f', [0.0] * 8) * len_faces  # seems to be the fastest way to create an array
+            # seems to be the fastest way to create an array
+            uv_array = array.array('f', [0.0] * 8) * len_faces
             mesh.uv_textures.active.data.foreach_get("uv_raw", uv_array)
 
             objects = context.selected_editable_objects[:]
@@ -450,11 +551,18 @@ 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:
-                                    uv_other = mesh_other.uv_textures.new()  # should return the texture it adds
+                                    # should return the texture it adds
+                                    uv_other = mesh_other.uv_textures.new()
 
                                 # finally do the copy
                                 uv_other.data.foreach_set("uv_raw", uv_array)
@@ -482,14 +590,18 @@ class MakeDupliFace(bpy.types.Operator):
 
         SCALE_FAC = 0.01
         offset = 0.5 * SCALE_FAC
-        base_tri = Vector((-offset, -offset, 0.0)), Vector((offset, -offset, 0.0)), Vector((offset, offset, 0.0)), Vector((-offset, offset, 0.0))
+        base_tri = (Vector((-offset, -offset, 0.0)),
+                    Vector((+offset, -offset, 0.0)),
+                    Vector((+offset, +offset, 0.0)),
+                    Vector((-offset, +offset, 0.0)),
+                    )
 
         def matrix_to_quat(matrix):
             # scale = matrix.median_scale
             trans = matrix.to_translation()
             rot = matrix.to_3x3()  # also contains scale
 
-            return [(b * rot) + trans for b in base_tri]
+            return [(rot * b) + trans for b in base_tri]
         scene = bpy.context.scene
         linked = {}
         for obj in bpy.context.selected_objects:
@@ -498,7 +610,10 @@ class MakeDupliFace(bpy.types.Operator):
                 linked.setdefault(data, []).append(obj)
 
         for data, objects in linked.items():
-            face_verts = [axis for obj in objects for v in matrix_to_quat(obj.matrix_world) for axis in v]
+            face_verts = [axis for obj in objects
+                          for v in matrix_to_quat(obj.matrix_world)
+                          for axis in v]
+
             faces = list(range(len(face_verts) // 3))
 
             mesh = bpy.data.meshes.new(data.name + "_dupli")
@@ -535,7 +650,8 @@ class MakeDupliFace(bpy.types.Operator):
 
 
 class IsolateTypeRender(bpy.types.Operator):
-    '''Hide unselected render objects of same type as active by setting the hide render flag'''
+    '''Hide unselected render objects of same type as active ''' \
+    '''by setting the hide render flag'''
     bl_idname = "object.isolate_type_render"
     bl_label = "Restrict Render Unselected"
     bl_options = {'REGISTER', 'UNDO'}
index d215f3476cf5679f045a8c46bc6d8a9498bf010c..7fd769c40c9bbb44dc2a9da51b4944492bf76e41 100644 (file)
 #
 # ##### END GPL LICENSE BLOCK #####
 
-# <pep8 compliant>
+# <pep8-80 compliant>
 
 import bpy
 from mathutils import Vector
 
+
 def GlobalBB_LQ(bb_world):
-    
+
     # Initialize the variables with the 8th vertex
-    left, right, front, back, down, up =\
-    bb_world[7][0],\
-    bb_world[7][0],\
-    bb_world[7][1],\
-    bb_world[7][1],\
-    bb_world[7][2],\
-    bb_world[7][2]
-    
+    left, right, front, back, down, up = (bb_world[7][0],
+                                          bb_world[7][0],
+                                          bb_world[7][1],
+                                          bb_world[7][1],
+                                          bb_world[7][2],
+                                          bb_world[7][2],
+                                          )
+
     # Test against the other 7 verts
-    for i in range (7):
-        
+    for i in range(7):
+
         # X Range
         val = bb_world[i][0]
         if val < left:
             left = val
-            
+
         if val > right:
             right = val
-            
+
         # Y Range
         val = bb_world[i][1]
         if val < front:
             front = val
-            
+
         if val > back:
             back = val
-            
+
         # Z Range
         val = bb_world[i][2]
         if val < down:
             down = val
-            
+
         if val > up:
             up = val
-        
+
     return (Vector((left, front, up)), Vector((right, back, down)))
 
+
 def GlobalBB_HQ(obj):
-    
+
     matrix_world = obj.matrix_world.copy()
-    
+
     # Initialize the variables with the last vertex
-    
+
     verts = obj.data.vertices
-    
-    val = verts[-1].co * matrix_world
-    
-    left, right, front, back, down, up =\
-    val[0],\
-    val[0],\
-    val[1],\
-    val[1],\
-    val[2],\
-    val[2]
-    
+
+    val = matrix_world * verts[-1].co
+
+    left, right, front, back, down, up = (val[0],
+                                          val[0],
+                                          val[1],
+                                          val[1],
+                                          val[2],
+                                          val[2],
+                                          )
+
     # Test against all other verts
-    for i in range (len(verts)-1):
-        
-        vco = verts[i].co * matrix_world
-        
+    for i in range(len(verts) - 1):
+
+        vco = matrix_world * verts[i].co
+
         # X Range
         val = vco[0]
         if val < left:
             left = val
-            
+
         if val > right:
             right = val
-            
+
         # Y Range
         val = vco[1]
         if val < front:
             front = val
-            
+
         if val > back:
             back = val
-            
+
         # Z Range
         val = vco[2]
         if val < down:
             down = val
-            
+
         if val > up:
             up = val
-        
-    return (Vector((left, front, up)), Vector((right, back, down)))
 
+    return Vector((left, front, up)), Vector((right, back, down))
 
-def align_objects(align_x, align_y, align_z, align_mode, relative_to, bb_quality):
+
+def align_objects(align_x,
+                  align_y,
+                  align_z,
+                  align_mode,
+                  relative_to,
+                  bb_quality):
 
     cursor = bpy.context.scene.cursor_location
 
@@ -123,20 +130,20 @@ def align_objects(align_x, align_y, align_z, align_mode, relative_to, bb_quality
     objs = []
 
     for obj in bpy.context.selected_objects:
-        matrix_world = obj.matrix_world
-        bb_world = [Vector(v[:]) * matrix_world for v in obj.bound_box]
+        matrix_world = obj.matrix_world.copy()
+        bb_world = [matrix_world * Vector(v[:]) for v in obj.bound_box]
         objs.append((obj, bb_world))
 
     if not objs:
         return False
 
     for obj, bb_world in objs:
-        
+
         if bb_quality:
             GBB = GlobalBB_HQ(obj)
         else:
             GBB = GlobalBB_LQ(bb_world)
-            
+
         Left_Front_Up = GBB[0]
         Right_Back_Down = GBB[1]
 
@@ -193,13 +200,14 @@ def align_objects(align_x, align_y, align_z, align_mode, relative_to, bb_quality
     # Main Loop
 
     for obj, bb_world in objs:
-        bb_world = [Vector(v[:]) * obj.matrix_world for v in obj.bound_box]
-        
+        matrix_world = obj.matrix_world.copy()
+        bb_world = [matrix_world * Vector(v[:]) for v in obj.bound_box]
+
         if bb_quality:
             GBB = GlobalBB_HQ(obj)
         else:
             GBB = GlobalBB_LQ(bb_world)
-            
+
         Left_Front_Up = GBB[0]
         Right_Back_Down = GBB[1]
 
@@ -339,8 +347,10 @@ class AlignObjects(bpy.types.Operator):
 
     bb_quality = BoolProperty(
             name="High Quality",
-            description="Enables high quality calculation of the bounding box for perfect results on complex shape meshes with rotation/scale (Slow)",
-            default=False)
+            description=("Enables high quality calculation of the "
+                         "bounding box for perfect results on complex "
+                         "shape meshes with rotation/scale (Slow)"),
+            default=True)
 
     align_mode = EnumProperty(items=(
             ('OPT_1', "Negative Sides", ""),
@@ -374,10 +384,15 @@ class AlignObjects(bpy.types.Operator):
 
     def execute(self, context):
         align_axis = self.align_axis
-        ret = align_objects('X' in align_axis, 'Y' in align_axis, 'Z' in align_axis, self.align_mode, self.relative_to, self.bb_quality)
+        ret = align_objects('X' in align_axis,
+                            'Y' in align_axis,
+                            'Z' in align_axis,
+                            self.align_mode,
+                            self.relative_to,
+                            self.bb_quality)
 
         if not ret:
             self.report({'WARNING'}, "No objects with bound-box selected")
             return {'CANCELLED'}
         else:
-            return {'FINISHED'}
\ No newline at end of file
+            return {'FINISHED'}
index 074f204d50e6dea92067e8ed878d6920f91b8cfd..ef10bfd737db05693035bafa2797c9e7c09a2de3 100644 (file)
 #
 # ##### END GPL LICENSE BLOCK #####
 
-# <pep8 compliant>
+# <pep8-80 compliant>
 
 from mathutils import Vector
 import bpy
-from bpy.props import BoolProperty, EnumProperty, IntProperty, FloatProperty, FloatVectorProperty
+from bpy.props import (BoolProperty,
+                       EnumProperty,
+                       IntProperty,
+                       FloatProperty,
+                       FloatVectorProperty,
+                       )
 
 
 def object_ensure_material(obj, mat_name):
@@ -61,7 +66,8 @@ class QuickFur(bpy.types.Operator):
 
     def execute(self, context):
         fake_context = bpy.context.copy()
-        mesh_objects = [obj for obj in context.selected_objects if obj.type == 'MESH']
+        mesh_objects = [obj for obj in context.selected_objects
+                        if obj.type == 'MESH']
 
         if not mesh_objects:
             self.report({'ERROR'}, "Select at least one mesh object.")
@@ -92,7 +98,8 @@ class QuickFur(bpy.types.Operator):
             psys.settings.child_type = 'INTERPOLATED'
 
             obj.data.materials.append(mat)
-            obj.particle_systems[-1].settings.material = len(obj.data.materials)
+            obj.particle_systems[-1].settings.material = \
+                    len(obj.data.materials)
 
         return {'FINISHED'}
 
@@ -149,7 +156,10 @@ class QuickExplode(bpy.types.Operator):
 
         for obj in mesh_objects:
             if obj.particle_systems:
-                self.report({'ERROR'}, "Object %r already has a particle system" % obj.name)
+                self.report({'ERROR'},
+                            "Object %r already has a "
+                            "particle system" % obj.name)
+
                 return {'CANCELLED'}
 
         if self.fade:
@@ -184,9 +194,7 @@ class QuickExplode(bpy.types.Operator):
 
             if self.fade:
                 explode.show_dead = False
-                bpy.ops.mesh.uv_texture_add(fake_context)
-                uv = obj.data.uv_textures[-1]
-                uv.name = "Explode fade"
+                uv = obj.data.uv_textures.new("Explode fade")
                 explode.particle_uv = uv.name
 
                 mat = object_ensure_material(obj, "Explode Fade")
@@ -247,7 +255,7 @@ class QuickExplode(bpy.types.Operator):
 
 def obj_bb_minmax(obj, min_co, max_co):
     for i in range(0, 8):
-        bb_vec = Vector(obj.bound_box[i]) * obj.matrix_world
+        bb_vec = obj.matrix_world * Vector(obj.bound_box[i])
 
         min_co[0] = min(bb_vec[0], min_co[0])
         min_co[1] = min(bb_vec[1], min_co[1])
@@ -262,21 +270,26 @@ class QuickSmoke(bpy.types.Operator):
     bl_label = "Quick Smoke"
     bl_options = {'REGISTER', 'UNDO'}
 
-    style = EnumProperty(items=(
-                        ('STREAM', "Stream", ""),
-                        ('PUFF', "Puff", ""),
-                        ('FIRE', "Fire", "")),
-                name="Smoke Style",
-                description="",
-                default='STREAM')
-
-    show_flows = BoolProperty(name="Render Smoke Objects",
-                description="Keep the smoke objects visible during rendering.",
-                default=False)
+    style = EnumProperty(
+            items=(('STREAM', "Stream", ""),
+                   ('PUFF', "Puff", ""),
+                   ('FIRE', "Fire", ""),
+                   ),
+            name="Smoke Style",
+            description="",
+            default='STREAM',
+            )
+
+    show_flows = BoolProperty(
+            name="Render Smoke Objects",
+            description="Keep the smoke objects visible during rendering.",
+            default=False,
+            )
 
     def execute(self, context):
         fake_context = bpy.context.copy()
-        mesh_objects = [obj for obj in context.selected_objects if obj.type == 'MESH']
+        mesh_objects = [obj for obj in context.selected_objects
+                        if obj.type == 'MESH']
         min_co = Vector((100000.0, 100000.0, 100000.0))
         max_co = -min_co
 
@@ -336,21 +349,25 @@ class QuickSmoke(bpy.types.Operator):
         mat.volume.density = 0
         mat.volume.density_scale = 5
 
-        mat.texture_slots.add()
-        mat.texture_slots[0].texture = bpy.data.textures.new("Smoke Density", 'VOXEL_DATA')
-        mat.texture_slots[0].texture.voxel_data.domain_object = obj
-        mat.texture_slots[0].use_map_color_emission = False
-        mat.texture_slots[0].use_map_density = True
+        tex = bpy.data.textures.new("Smoke Density", 'VOXEL_DATA')
+        tex.voxel_data.domain_object = obj
+
+        tex_slot = mat.texture_slots.add()
+        tex_slot.texture = tex
+        tex_slot.use_map_color_emission = False
+        tex_slot.use_map_density = True
 
         # for fire add a second texture for emission and emission color
         if self.style == 'FIRE':
             mat.volume.emission = 5
-            mat.texture_slots.add()
-            mat.texture_slots[1].texture = bpy.data.textures.new("Smoke Heat", 'VOXEL_DATA')
-            mat.texture_slots[1].texture.voxel_data.domain_object = obj
-            mat.texture_slots[1].texture.use_color_ramp = True
+            tex = bpy.data.textures.new("Smoke Heat", 'VOXEL_DATA')
+            tex.voxel_data.domain_object = obj
+            tex.use_color_ramp = True
+
+            tex_slot = mat.texture_slots.add()
+            tex_slot.texture = tex
 
-            ramp = mat.texture_slots[1].texture.color_ramp
+            ramp = tex.color_ramp
 
             elem = ramp.elements.new(0.333)
             elem.color[0] = elem.color[3] = 1
@@ -371,28 +388,38 @@ class QuickFluid(bpy.types.Operator):
     bl_label = "Quick Fluid"
     bl_options = {'REGISTER', 'UNDO'}
 
-    style = EnumProperty(items=(
-                        ('INFLOW', "Inflow", ""),
-                        ('BASIC', "Basic", "")),
+    style = EnumProperty(
+            items=(('INFLOW', "Inflow", ""),
+                   ('BASIC', "Basic", ""),
+                   ),
                 name="Fluid Style",
                 description="",
-                default='BASIC')
-
-    initial_velocity = FloatVectorProperty(name="Initial Velocity",
-        description="Initial velocity of the fluid",
-        default=(0.0, 0.0, 0.0), min=-100.0, max=100.0, subtype='VELOCITY')
-
-    show_flows = BoolProperty(name="Render Fluid Objects",
-                description="Keep the fluid objects visible during rendering.",
-                default=False)
-
-    start_baking = BoolProperty(name="Start Fluid Bake",
-                description="Start baking the fluid immediately after creating the domain object.",
-                default=False)
+                default='BASIC',
+                )
+    initial_velocity = FloatVectorProperty(
+            name="Initial Velocity",
+            description="Initial velocity of the fluid",
+            default=(0.0, 0.0, 0.0),
+            min=-100.0,
+            max=100.0,
+            subtype='VELOCITY',
+            )
+    show_flows = BoolProperty(
+            name="Render Fluid Objects",
+            description="Keep the fluid objects visible during rendering.",
+            default=False,
+            )
+    start_baking = BoolProperty(
+            name="Start Fluid Bake",
+            description=("Start baking the fluid immediately "
+                         "after creating the domain object"),
+            default=False,
+            )
 
     def execute(self, context):
         fake_context = bpy.context.copy()
-        mesh_objects = [obj for obj in context.selected_objects if (obj.type == 'MESH' and not 0 in obj.dimensions)]
+        mesh_objects = [obj for obj in context.selected_objects
+                        if (obj.type == 'MESH' and not 0.0 in obj.dimensions)]
         min_co = Vector((100000, 100000, 100000))
         max_co = Vector((-100000, -100000, -100000))
 
@@ -405,7 +432,8 @@ class QuickFluid(bpy.types.Operator):
             # make each selected object a fluid
             bpy.ops.object.modifier_add(fake_context, type='FLUID_SIMULATION')
 
-            # fluid has to be before constructive modifiers, so it might not be the last modifier
+            # fluid has to be before constructive modifiers,
+            # so it might not be the last modifier
             for mod in obj.modifiers:
                 if mod.type == 'FLUID_SIMULATION':
                     break
@@ -429,10 +457,14 @@ class QuickFluid(bpy.types.Operator):
         obj = context.active_object
         obj.name = "Fluid Domain"
 
-        # give the fluid some room below the flows and scale with initial velocity
+        # give the fluid some room below the flows
+        # and scale with initial velocity
         v = 0.5 * self.initial_velocity
         obj.location = 0.5 * (max_co + min_co) + Vector((0.0, 0.0, -1.0)) + v
-        obj.scale = 0.5 * (max_co - min_co) + Vector((1.0, 1.0, 2.0)) + Vector((abs(v[0]), abs(v[1]), abs(v[2])))
+        obj.scale = (0.5 * (max_co - min_co) +
+                     Vector((1.0, 1.0, 2.0)) +
+                     Vector((abs(v[0]), abs(v[1]), abs(v[2])))
+                     )
 
         # setup smoke domain
         bpy.ops.object.modifier_add(type='FLUID_SIMULATION')
index 9dc5086086f479b0d70c50ce961c928bb05b747a..b94c4f06cd3260aa72a5f897043844640e068792 100644 (file)
@@ -16,7 +16,7 @@
 #
 # ##### END GPL LICENSE BLOCK #####
 
-# <pep8 compliant>
+# <pep8-80 compliant>
 
 import bpy
 
@@ -93,40 +93,69 @@ class RandomizeLocRotSize(bpy.types.Operator):
     bl_label = "Randomize Transform"
     bl_options = {'REGISTER', 'UNDO'}
 
-    random_seed = IntProperty(name="Random Seed",
-        description="Seed value for the random generator",
-        default=0, min=0, max=1000)
-
-    use_delta = BoolProperty(name="Transform Delta",
-        description="Randomize delta transform values instead of regular transform", default=False)
-
-    use_loc = BoolProperty(name="Randomize Location",
-        description="Randomize the location values", default=True)
-
-    loc = FloatVectorProperty(name="Location",
-        description="Maximun distance the objects can spread over each axis",
-        default=(0.0, 0.0, 0.0), min=-100.0, max=100.0, subtype='TRANSLATION')
-
-    use_rot = BoolProperty(name="Randomize Rotation",
-        description="Randomize the rotation values", default=True)
-
-    rot = FloatVectorProperty(name="Rotation",
-        description="Maximun rotation over each axis",
-        default=(0.0, 0.0, 0.0), min=-180.0, max=180.0, subtype='TRANSLATION')
-
-    use_scale = BoolProperty(name="Randomize Scale",
-        description="Randomize the scale values", default=True)
-
-    scale_even = BoolProperty(name="Scale Even",
-        description="Use the same scale value for all axis", default=False)
+    random_seed = IntProperty(
+            name="Random Seed",
+            description="Seed value for the random generator",
+            min=0,
+            max=1000,
+            default=0,
+            )
+    use_delta = BoolProperty(
+            name="Transform Delta",
+            description=("Randomize delta transform values "
+                         "instead of regular transform"),
+            default=False,
+            )
+    use_loc = BoolProperty(
+            name="Randomize Location",
+            description="Randomize the location values",
+            default=True,
+            )
+    loc = FloatVectorProperty(
+            name="Location",
+            description=("Maximun distance the objects "
+                         "can spread over each axis"),
+            min=-100.0,
+            max=100.0,
+            default=(0.0, 0.0, 0.0),
+            subtype='TRANSLATION',
+            )
+    use_rot = BoolProperty(
+            name="Randomize Rotation",
+            description="Randomize the rotation values",
+            default=True,
+            )
+    rot = FloatVectorProperty(
+            name="Rotation",
+            description="Maximun rotation over each axis",
+            min=-180.0,
+            max=180.0,
+            default=(0.0, 0.0, 0.0),
+            subtype='TRANSLATION',
+            )
+    use_scale = BoolProperty(
+            name="Randomize Scale",
+            description="Randomize the scale values",
+            default=True,
+            )
+    scale_even = BoolProperty(
+            name="Scale Even",
+            description="Use the same scale value for all axis",
+            default=False,
+            )
 
     '''scale_min = FloatProperty(name="Minimun Scale Factor",
         description="Lowest scale percentage possible",
         default=0.15, min=-1.0, max=1.0, precision=3)'''
 
-    scale = FloatVectorProperty(name="Scale",
-        description="Maximum scale randomization over each axis",
-        default=(0.0, 0.0, 0.0), min=-100.0, max=100.0, subtype='TRANSLATION')
+    scale = FloatVectorProperty(
+            name="Scale",
+            description="Maximum scale randomization over each axis",
+            min=-100.0,
+            max=100.0,
+            default=(0.0, 0.0, 0.0),
+            subtype='TRANSLATION',
+            )
 
     def execute(self, context):
         from math import radians
index f3c799c9ac28ed85035aef91d65c3cdcb5aa1a7b..fbcc327c3bdc0cdd426be5a15a3163908447f3e9 100644 (file)
@@ -16,7 +16,7 @@
 #
 # ##### END GPL LICENSE BLOCK #####
 
-# <pep8 compliant>
+# <pep8-80 compliant>
 
 import bpy
 
@@ -30,8 +30,15 @@ class AddPresetBase():
     # bl_label = "Add a Python Preset"
     bl_options = {'REGISTER'}  # only because invoke_props_popup requires.
 
-    name = bpy.props.StringProperty(name="Name", description="Name of the preset, used to make the path name", maxlen=64, default="")
-    remove_active = bpy.props.BoolProperty(default=False, options={'HIDDEN'})
+    name = bpy.props.StringProperty(
+            name="Name",
+            description="Name of the preset, used to make the path name",
+            maxlen=64,
+            )
+    remove_active = bpy.props.BoolProperty(
+            default=False,
+            options={'HIDDEN'},
+            )
 
     @staticmethod
     def as_filename(name):  # could reuse for other presets
@@ -54,7 +61,10 @@ class AddPresetBase():
 
             filename = self.as_filename(name)
 
-            target_path = bpy.utils.user_resource('SCRIPTS', os.path.join("presets", self.preset_subdir), create=True)
+            target_path = os.path.join("presets", self.preset_subdir)
+            target_path = bpy.utils.user_resource('SCRIPTS',
+                                                  target_path,
+                                                  create=True)
 
             if not target_path:
                 self.report({'WARNING'}, "Failed to create presets path")
@@ -95,7 +105,9 @@ class AddPresetBase():
             filepath = bpy.utils.preset_find(preset_active, self.preset_subdir)
 
             if not filepath:
-                filepath = bpy.utils.preset_find(preset_active, self.preset_subdir, display_name=True)
+                filepath = bpy.utils.preset_find(preset_active,
+                                                 self.preset_subdir,
+                                                 display_name=True)
 
             if not filepath:
                 return {'CANCELLED'}
@@ -133,8 +145,15 @@ class ExecutePreset(bpy.types.Operator):
     bl_idname = "script.execute_preset"
     bl_label = "Execute a Python Preset"
 
-    filepath = bpy.props.StringProperty(name="Path", description="Path of the Python file to execute", maxlen=512, default="")
-    menu_idname = bpy.props.StringProperty(name="Menu ID Name", description="ID name of the menu this was called from", default="")
+    filepath = bpy.props.StringProperty(
+            name="Path",
+            description="Path of the Python file to execute",
+            maxlen=512,
+            )
+    menu_idname = bpy.props.StringProperty(
+            name="Menu ID Name",
+            description="ID name of the menu this was called from",
+            )
 
     def execute(self, context):
         from os.path import basename
@@ -182,7 +201,10 @@ class AddPresetSSS(AddPresetBase, bpy.types.Operator):
     preset_menu = "MATERIAL_MT_sss_presets"
 
     preset_defines = [
-        "material = (bpy.context.material.active_node_material if bpy.context.material.active_node_material else bpy.context.material)"
+        ("material = "
+         "bpy.context.material.active_node_material "
+         "if bpy.context.material.active_node_material "
+         "else bpy.context.material")
     ]
 
     preset_values = [
@@ -306,7 +328,11 @@ class AddPresetOperator(AddPresetBase, bpy.types.Operator):
     bl_label = "Operator Preset"
     preset_menu = "WM_MT_operator_presets"
 
-    operator = bpy.props.StringProperty(name="Operator", maxlen=64, options={'HIDDEN'})
+    operator = bpy.props.StringProperty(
+            name="Operator",
+            maxlen=64,
+            options={'HIDDEN'},
+            )
 
     # XXX, not ideal
     preset_defines = [
@@ -322,12 +348,15 @@ class AddPresetOperator(AddPresetBase, bpy.types.Operator):
         properties_blacklist = bpy.types.Operator.bl_rna.properties.keys()
 
         prefix, suffix = self.operator.split("_OT_", 1)
-        operator_rna = getattr(getattr(bpy.ops, prefix.lower()), suffix).get_rna().bl_rna
+        op = getattr(getattr(bpy.ops, prefix.lower()), suffix)
+        operator_rna = op.get_rna().bl_rna
+        del op
 
         ret = []
         for prop_id, prop in operator_rna.properties.items():
-            if (not (prop.is_hidden or prop.is_skip_save)) and prop_id not in properties_blacklist:
-                ret.append("op.%s" % prop_id)
+            if not (prop.is_hidden or prop.is_skip_save):
+                if prop_id not in properties_blacklist:
+                    ret.append("op.%s" % prop_id)
 
         return ret
 
index 910ccf96c0e41e96cd3487d7bd8c687e52b07495..a38d817d738f281d9a99e4fe768afc79442f428c 100644 (file)
@@ -1,27 +1,23 @@
-# ***** BEGIN GPL LICENSE BLOCK *****
+# ##### BEGIN GPL LICENSE BLOCK #####
 #
-# Script copyright (C) Campbell J Barton
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
 #
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 #
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ***** END GPL LICENCE BLOCK *****
+# ##### END GPL LICENSE BLOCK #####
 
-# <pep8 compliant>
+# <pep8-80 compliant>
 
-# History
-#
 # Originally written by Matt Ebb
 
 import bpy
@@ -46,8 +42,10 @@ def guess_player_path(preset):
         player_path = "djv_view"
 
         if sys.platform == "darwin":
-            # TODO, crummy supporting only 1 version, could find the newest installed version
-            test_path = '/Applications/djv-0.8.2.app/Contents/Resources/bin/djv_view'
+            # TODO, crummy supporting only 1 version,
+            # could find the newest installed version
+            test_path = ("/Applications/djv-0.8.2.app"
+                         "/Contents/Resources/bin/djv_view")
             if os.path.exists(test_path):
                 player_path = test_path
 
@@ -60,6 +58,9 @@ def guess_player_path(preset):
     elif preset == 'MPLAYER':
         player_path = "mplayer"
 
+    else:
+        player_path = ""
+
     return player_path
 
 
@@ -82,10 +83,10 @@ class PlayRenderedAnim(bpy.types.Operator):
         is_movie = rd.is_movie_format
 
         # try and guess a command line if it doesn't exist
-        if player_path == '':
+        if player_path == "":
             player_path = guess_player_path(preset)
 
-        if is_movie == False and preset in ('FRAMECYCLER', 'RV', 'MPLAYER'):
+        if is_movie == False and preset in {'FRAMECYCLER', 'RV', 'MPLAYER'}:
             # replace the number with '#'
             file_a = rd.frame_path(frame=0)
 
@@ -95,11 +96,11 @@ class PlayRenderedAnim(bpy.types.Operator):
 
             while len(file_a) == len(file_b):
                 frame_tmp = (frame_tmp * 10) + 9
-                print(frame_tmp)
                 file_b = rd.frame_path(frame=frame_tmp)
             file_b = rd.frame_path(frame=int(frame_tmp / 10))
 
-            file = "".join((c if file_b[i] == c else "#") for i, c in enumerate(file_a))
+            file = ("".join((c if file_b[i] == c else "#")
+                    for i, c in enumerate(file_a)))
         else:
             # works for movies and images
             file = rd.frame_path(frame=scene.frame_start)
@@ -109,10 +110,35 @@ 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':
-            opts = [file, "-playback_speed", str(rd.fps)]
+            opts = [file, "-playback_speed", "%d" % int(rd.fps / rd.fps_base)]
             cmd.extend(opts)
         elif preset == 'FRAMECYCLER':
             opts = [file, "%d-%d" % (scene.frame_start, scene.frame_end)]
@@ -125,18 +151,26 @@ class PlayRenderedAnim(bpy.types.Operator):
             if is_movie:
                 opts.append(file)
             else:
-                opts.append("mf://%s" % file.replace("#", "?"))
-                opts += ["-mf", "fps=%.4f" % (rd.fps / rd.fps_base)]
+                opts += [("mf://%s" % file.replace("#", "?")),
+                         "-mf",
+                         "fps=%.4f" % (rd.fps / rd.fps_base),
+                         ]
+
             opts += ["-loop", "0", "-really-quiet", "-fs"]
             cmd.extend(opts)
         else:  # 'CUSTOM'
             cmd.append(file)
 
         # launch it
+        print("Executing command:\n  %r" % " ".join(cmd))
+
         try:
             process = subprocess.Popen(cmd)
-        except:
-            pass
-            #raise OSError("Couldn't find an external animation player.")
+        except Exception as e:
+            import traceback
+            self.report({'ERROR'},
+                        "Couldn't run external animation player with command "
+                        "%r\n%s" % (" ".join(cmd), str(e)))
+            return {'CANCELLED'}
 
         return {'FINISHED'}
index 9c3be84b807e29b94ce70eed87aef2adcc8b73ef..851f33bde115091a6d0b89c6ca9ca783d6b92e8b 100644 (file)
@@ -243,7 +243,7 @@ def testNewVecLs2DRotIsBetter(vecs, mat=-1, bestAreaSoFar = -1):
 
         # Do this allong the way
         if mat != -1:
-            v = vecs[i] = v*mat
+            v = vecs[i] = mat * v
             x= v.x
             y= v.y
             if x<minx: minx= x
@@ -1064,7 +1064,7 @@ def main(context,
                 f_uv = f.uv
                 for j, v in enumerate(f.v):
                     # XXX - note, between mathutils in 2.4 and 2.5 the order changed.
-                    f_uv[j][:] = (v.co * MatQuat).xy
+                    f_uv[j][:] = (MatQuat * v.co).xy
 
 
         if USER_SHARE_SPACE:
index 5a0d327f90d1064bd2da09b5dc73b9f8d11ed262..42b0af7eaf5de679b5d69d485d98f3fe9cbea34d 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 ce6d0990f05293a8dc713e3db01cf2b7fb3039b2..0a4d0b605140fb0f84a97641d709bb7b5cb20dd4 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 4f398c9fbd97daef2431bc37c12f3772bbf2ed10..c577af013744ed7d85325b1fb75a4c1124c89198 100644 (file)
@@ -20,8 +20,6 @@
 import bpy
 from rna_prop_ui import PropertyPanel
 
-# TODO, "color_range" not in the UI
-
 
 class WorldButtonsPanel():
     bl_space_type = 'PROPERTIES'
@@ -96,6 +94,10 @@ class WORLD_PT_world(WorldButtonsPanel, bpy.types.Panel):
         col.active = world.use_sky_blend
         row.column().prop(world, "ambient_color")
 
+        row = layout.row()
+        row.prop(world, "exposure")
+        row.prop(world, "color_range")
+
 
 class WORLD_PT_ambient_occlusion(WorldButtonsPanel, bpy.types.Panel):
     bl_label = "Ambient Occlusion"
index 722b46aba1178f13a2ad5c4a65c8688ebb952c80..fa5579ea2e0f5ad2ebb584c0562da3171453f7f7 100644 (file)
@@ -198,6 +198,10 @@ class IMAGE_MT_uvs_transform(bpy.types.Menu):
         layout.operator("transform.rotate")
         layout.operator("transform.resize")
 
+        layout.separator()
+
+        layout.operator("transform.shear")
+
 
 class IMAGE_MT_uvs_snap(bpy.types.Menu):
     bl_label = "Snap"
index 2b12e75564c0b4d4c01c37aa9e9e70348422b29e..f66cee7f431ba24516891a4c905f1d442a00f4d4 100644 (file)
@@ -61,7 +61,9 @@ class INFO_HT_header(bpy.types.Header):
 
         layout.template_reports_banner()
 
-        layout.label(text=scene.statistics())
+        row = layout.row(align=True)
+        row.operator("wm.splash", text="", icon='BLENDER', emboss=False)
+        row.label(text=scene.statistics())
 
         # XXX: this should be right-aligned to the RHS of the region
         layout.operator("wm.window_fullscreen_toggle", icon='FULLSCREEN_ENTER', text="")
index 831fd3597823d0de843c5bd61e86db33641cae4f..2088d8798f2959e962c706f353a36a67b0740113 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 0fc8d937f6683b05b9a067a84fcb21786bf80878..b787fc5cf75f26f197f6c3b79226b864d5ec1409 100644 (file)
@@ -16,7 +16,7 @@
 #
 # ##### END GPL LICENSE BLOCK #####
 
-# <pep8 compliant>
+# <pep8-80 compliant>
 import bpy
 
 
@@ -33,19 +33,21 @@ class TEXT_HT_header(bpy.types.Header):
         row.template_header()
 
         if context.area.show_menus:
-            sub = row.row(align=True)
-            sub.menu("TEXT_MT_view")
-            sub.menu("TEXT_MT_text")
+            row.menu("TEXT_MT_view")
+            row.menu("TEXT_MT_text")
+
             if text:
-                sub.menu("TEXT_MT_edit")
-                sub.menu("TEXT_MT_format")
+                row.menu("TEXT_MT_edit")
+                row.menu("TEXT_MT_format")
+
+            row.menu("TEXT_MT_templates")
 
         if text and text.is_modified:
-            row = layout.row()
-            row.alert = True
-            row.operator("text.resolve_conflict", text="", icon='HELP')
+            sub = row.row()
+            sub.alert = True
+            sub.operator("text.resolve_conflict", text="", icon='HELP')
 
-        layout.template_ID(st, "text", new="text.new", unlink="text.unlink")
+        row.template_ID(st, "text", new="text.new", unlink="text.unlink")
 
         row = layout.row(align=True)
         row.prop(st, "show_line_numbers", text="")
@@ -63,11 +65,13 @@ class TEXT_HT_header(bpy.types.Header):
             row = layout.row()
             if text.filepath:
                 if text.is_dirty:
-                    row.label(text="File: *%s (unsaved)" % text.filepath)
+                    row.label(text="File: *%r (unsaved)" % text.filepath)
                 else:
-                    row.label(text="File: %s" % text.filepath)
+                    row.label(text="File: %r" % text.filepath)
             else:
-                row.label(text="Text: External" if text.library else "Text: Internal")
+                row.label(text="Text: External"
+                          if text.library
+                          else "Text: Internal")
 
 
 class TEXT_PT_properties(bpy.types.Panel):
@@ -150,8 +154,12 @@ class TEXT_MT_view(bpy.types.Menu):
 
         layout.separator()
 
-        layout.operator("text.move", text="Top of File").type = 'FILE_TOP'
-        layout.operator("text.move", text="Bottom of File").type = 'FILE_BOTTOM'
+        layout.operator("text.move",
+                        text="Top of File",
+                        ).type = 'FILE_TOP'
+        layout.operator("text.move",
+                        text="Bottom of File",
+                        ).type = 'FILE_BOTTOM'
 
 
 class TEXT_MT_text(bpy.types.Menu):
@@ -185,19 +193,15 @@ class TEXT_MT_text(bpy.types.Menu):
             # XXX   uiMenuItemO(head, 0, "text.refresh_pyconstraints");
             #endif
 
-        layout.separator()
-
-        layout.menu("TEXT_MT_templates")
-
 
 class TEXT_MT_templates(bpy.types.Menu):
-    '''
-    Creates the menu items by scanning scripts/templates
-    '''
-    bl_label = "Script Templates"
+    bl_label = "Templates"
 
     def draw(self, context):
-        self.path_menu(bpy.utils.script_paths("templates"), "text.open", {"internal": True})
+        self.path_menu(bpy.utils.script_paths("templates"),
+                       "text.open",
+                       {"internal": True},
+                       )
 
 
 class TEXT_MT_edit_select(bpy.types.Menu):
@@ -246,8 +250,12 @@ class TEXT_MT_edit_to3d(bpy.types.Menu):
     def draw(self, context):
         layout = self.layout
 
-        layout.operator("text.to_3d_object", text="One Object").split_lines = False
-        layout.operator("text.to_3d_object", text="One Object Per Line").split_lines = True
+        layout.operator("text.to_3d_object",
+                        text="One Object",
+                        ).split_lines = False
+        layout.operator("text.to_3d_object",
+                        text="One Object Per Line",
+                        ).split_lines = True
 
 
 class TEXT_MT_edit(bpy.types.Menu):
index 139b3205835d3c7847e8f4418666cc3f20847514..576709c6072aca4346f2b00072f1652ce816c032 100644 (file)
@@ -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}
index a206ff3b274566219a0cc495881f1c58fce0ee40..7e523dfc422b38065239c6ccd1e904e44110c889 100644 (file)
@@ -54,21 +54,13 @@ class VIEW3D_HT_header(bpy.types.Header):
                 sub.menu("VIEW3D_MT_object")
 
         row = layout.row()
+        # Contains buttons like Mode, Pivot, Manipulator, Layer, Mesh Select Mode...
         row.template_header_3D()
 
-        # do in C for now since these buttons cant be both toggle AND exclusive.
-        '''
-        if obj and obj.mode == 'EDIT' and obj.type == 'MESH':
-            row_sub = row.row(align=True)
-            row_sub.prop(toolsettings, "mesh_select_mode", text="", index=0, icon='VERTEXSEL')
-            row_sub.prop(toolsettings, "mesh_select_mode", text="", index=1, icon='EDGESEL')
-            row_sub.prop(toolsettings, "mesh_select_mode", text="", index=2, icon='FACESEL')
-        '''
-
         if obj:
             # Particle edit
             if obj.mode == 'PARTICLE_EDIT':
-                row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True, toggle=True)
+                row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True)
 
             # Occlude geometry
             if view.viewport_shade in {'SOLID', 'SHADED', 'TEXTURED'} and (obj.mode == 'PARTICLE_EDIT' or (obj.mode == 'EDIT' and obj.type == 'MESH')):
@@ -87,19 +79,22 @@ class VIEW3D_HT_header(bpy.types.Header):
                     row.prop(toolsettings, "proportional_edit_falloff", text="", icon_only=True)
 
         # Snap
+        snap_element = toolsettings.snap_element
         row = layout.row(align=True)
         row.prop(toolsettings, "use_snap", text="")
         row.prop(toolsettings, "snap_element", text="", icon_only=True)
-        if toolsettings.snap_element != 'INCREMENT':
+        if snap_element != 'INCREMENT':
             row.prop(toolsettings, "snap_target", text="")
-            if obj and obj.mode == 'OBJECT':
-                row.prop(toolsettings, "use_snap_align_rotation", text="")
-        if toolsettings.snap_element == 'VOLUME':
+            if obj:
+                if obj.mode == 'OBJECT':
+                    row.prop(toolsettings, "use_snap_align_rotation", text="")
+                elif obj.mode == 'EDIT':
+                    row.prop(toolsettings, "use_snap_self", text="")
+
+        if snap_element == 'VOLUME':
             row.prop(toolsettings, "use_snap_peel_object", text="")
-        elif toolsettings.snap_element == 'FACE':
+        elif snap_element == 'FACE':
             row.prop(toolsettings, "use_snap_project", text="")
-            if toolsettings.use_snap_project and obj.mode == 'EDIT':
-                row.prop(toolsettings, "use_snap_project_self", text="")
 
         # OpenGL render
         row = layout.row(align=True)
index 85a6da35bea3d9395bafd19cffc27a6b367fdae7..67c595e4654c89079912ced9493b886f78d9d52a 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):
@@ -116,7 +117,8 @@ class VIEW3D_PT_tools_meshedit(View3DPanel, bpy.types.Panel):
         col.operator("transform.translate")
         col.operator("transform.rotate")
         col.operator("transform.resize", text="Scale")
-        col.operator("transform.shrink_fatten", text="Along Normal")
+        col.operator("transform.shrink_fatten", text="Shrink/Fatten")
+        col.operator("transform.push_pull", text="Push/Pull")
 
         col = layout.column(align=True)
         col.label(text="Deform:")
index aa0e601725bb739c7870a34d6e7f47b1a9d2f31e..45d26f4b525e05f7720ac4d60fec94a307a740a1 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:
diff --git a/release/scripts/templates/ui_menu.py b/release/scripts/templates/ui_menu.py
new file mode 100644 (file)
index 0000000..d3c94b8
--- /dev/null
@@ -0,0 +1,49 @@
+import bpy
+
+
+class CustomMenu(bpy.types.Menu):
+    bl_label = "Custom Menu"
+    bl_idname = "OBJECT_MT_custom_menu"
+
+    def draw(self, context):
+        layout = self.layout
+
+        layout.operator("wm.open_mainfile")
+        layout.operator("wm.save_as_mainfile").copy = True
+
+        layout.operator("object.shade_smooth")
+
+        layout.label(text="Hello world!", icon='WORLD_DATA')
+
+        # use an operator enum property to populate a submenu
+        layout.operator_menu_enum("object.select_by_type",
+                                  property="type",
+                                  text="Select All by Type...",
+                                  )
+
+        # call another menu
+        layout.operator("wm.call_menu", text="Unwrap").name = "VIEW3D_MT_uv_map"
+
+
+def draw_item(self, context):
+    layout = self.layout
+    layout.menu(CustomMenu.bl_idname)
+
+
+def register():
+    bpy.utils.register_class(CustomMenu)
+
+    # lets add ourselves to the main header
+    bpy.types.INFO_HT_header.append(draw_item)
+
+
+def unregister():
+    bpy.utils.unregister_class(CustomMenu)
+
+    bpy.types.INFO_HT_header.remove(draw_item)
+
+if __name__ == "__main__":
+    register()
+
+    # The menu can also be called from scripts
+    bpy.ops.wm.call_menu(name=CustomMenu.bl_idname)
diff --git a/release/scripts/templates/ui_menu_simple.py b/release/scripts/templates/ui_menu_simple.py
new file mode 100644 (file)
index 0000000..2129dfd
--- /dev/null
@@ -0,0 +1,26 @@
+import bpy
+
+
+class SimpleCustomMenu(bpy.types.Menu):
+    bl_label = "Simple Custom Menu"
+    bl_idname = "OBJECT_MT_simple_custom_menu"
+
+    def draw(self, context):
+        layout = self.layout
+
+        layout.operator("wm.open_mainfile")
+        layout.operator("wm.save_as_mainfile")
+
+
+def register():
+    bpy.utils.register_class(SimpleCustomMenu)
+
+
+def unregister():
+    bpy.utils.unregister_class(SimpleCustomMenu)
+
+if __name__ == "__main__":
+    register()
+
+    # The menu can also be called from scripts
+    bpy.ops.wm.call_menu(name=SimpleCustomMenu.bl_idname)
similarity index 76%
rename from release/scripts/templates/panel_simple.py
rename to release/scripts/templates/ui_panel_simple.py
index e5bf70cb6546743bbd6c1574b9b06d811efed9bf..cde6126b6262c26a7cf45c36fea3872559622261 100644 (file)
@@ -1,8 +1,9 @@
 import bpy
 
 
-class OBJECT_PT_hello(bpy.types.Panel):
+class HelloWorldPanel(bpy.types.Panel):
     bl_label = "Hello World Panel"
+    bl_idname = "OBJECT_PT_hello"
     bl_space_type = "PROPERTIES"
     bl_region_type = "WINDOW"
     bl_context = "object"
@@ -22,11 +23,11 @@ class OBJECT_PT_hello(bpy.types.Panel):
 
 
 def register():
-    bpy.utils.register_class(OBJECT_PT_hello)
+    bpy.utils.register_class(HelloWorldPanel)
 
 
 def unregister():
-    bpy.utils.unregister_class(OBJECT_PT_hello)
+    bpy.utils.unregister_class(HelloWorldPanel)
 
 
 if __name__ == "__main__":
index 25fb6f9f9ff00c19da1620250de0053b4b57f6ef..18f6ad21333b144ba7ae23d68cf43b9cc35eb16f 100644 (file)
@@ -53,7 +53,7 @@ extern "C" {
                /* can be left blank, otherwise a,b,c... etc with no quotes */
 #define BLENDER_VERSION_CHAR   a
                /* alpha/beta/rc/release, docs use this */
-#define BLENDER_VERSION_CYCLE  release
+#define BLENDER_VERSION_CYCLE  beta
 
 struct ListBase;
 struct MemFile;
index 97ac711651b6b3cb0d2d66c942d0d997af38b1c7..12f9383cefbf8d877eeb7747bc15cbb025a9a297 100644 (file)
@@ -105,6 +105,7 @@ typedef struct EffectorCache {
        /* precalculated for guides */
        struct GuideEffectorData *guide_data;
        float guide_loc[4], guide_dir[3], guide_radius;
+       float velocity[3];
 
        float frame;
        int flag;
index 9a384c40e24e02e1364ae35dee3bd03a1e6c73ff..defcef584637d4963b5a297c743fd92fecfec373 100644 (file)
@@ -279,6 +279,10 @@ if(WITH_IMAGE_CINEON)
        add_definitions(-DWITH_CINEON)
 endif()
 
+if(WITH_IMAGE_FRAMESERVER)
+       add_definitions(-DWITH_FRAMESERVER)
+endif()
+
 if(WITH_IMAGE_HDR)
        add_definitions(-DWITH_HDR)
 endif()
index 36afce7946c2358730320143d78ea9399f77bdab..5ea42ee65aea55cd67d87790fa0609a6d0bbf7eb 100644 (file)
@@ -22,6 +22,7 @@ incs += ' ' + env['BF_ZLIB_INC']
 defs = [ 'GLEW_STATIC' ]
 
 defs.append('WITH_SMOKE')  # TODO, make optional
+defs.append('WITH_FRAMESERVER')  # TODO, make optional
 
 if env['WITH_BF_PYTHON']:
     incs += ' ../python'
index edad8ee0dac7c8b7cd20e773bb465f541140c94a..47686c2626fd87cdf8ff49d65cf276869f4781c8 100644 (file)
@@ -1325,6 +1325,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) {
@@ -1365,6 +1366,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 45faba8439c728e72e16643cadf511d771edbb9f..8d19322c0db5b7355df04251fc6ef11fdbef3aaf 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 ee46bef6038469de9756b98ba635e1b9681b1bb4..4b95c44f55feb66b6d20dbf3b05295a913d7539c 100644 (file)
@@ -241,6 +241,16 @@ static void precalculate_effector(EffectorCache *eff)
        }
        else if(eff->psys)
                psys_update_particle_tree(eff->psys, eff->scene->r.cfra);
+
+       /* Store object velocity */
+       if(eff->ob) {
+               float old_vel[3];
+
+               where_is_object_time(eff->scene, eff->ob, cfra - 1.0f);
+               copy_v3_v3(old_vel, eff->ob->obmat[3]); 
+               where_is_object_time(eff->scene, eff->ob, cfra);
+               sub_v3_v3v3(eff->velocity, eff->ob->obmat[3], old_vel);
+       }
 }
 static EffectorCache *new_effector_cache(Scene *scene, Object *ob, ParticleSystem *psys, PartDeflect *pd)
 {
@@ -680,10 +690,6 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
                Object *ob = eff->ob;
                Object obcopy = *ob;
 
-               /* XXX this is not thread-safe, but used from multiple threads by
-                  particle system */
-               where_is_object_time(eff->scene, ob, cfra);
-
                /* use z-axis as normal*/
                normalize_v3_v3(efd->nor, ob->obmat[2]);
 
@@ -702,13 +708,8 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
                        VECCOPY(efd->loc, ob->obmat[3]);
                }
 
-               if(real_velocity) {
-                       VECCOPY(efd->vel, ob->obmat[3]);
-
-                       where_is_object_time(eff->scene, ob, cfra - 1.0f);
-
-                       sub_v3_v3v3(efd->vel, efd->vel, ob->obmat[3]);
-               }
+               if(real_velocity)
+                       copy_v3_v3(efd->vel, eff->velocity);
 
                *eff->ob = obcopy;
 
index 962c7fd5e863caf6b60aa7f80673b7d5304ce678..3f01c55e935bdba3be7115db0fd3556a7cc2bc24 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 d833c1842747b97c6c48f20af269eea8d2be2e12..88a670ecb220d4e9ff701cb13d148d7de7b04498 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 fbb5a77fa0409bd013de4b6d2c754f8ff6501e3a..8c19b0c15c3f8cb2b0dab7fab245dde31312b406 100644 (file)
@@ -2373,7 +2373,7 @@ static void RVBlurBitmap2_float ( float* map, int width,int height,
        /*      Blancmange (bmange@airdmhor.gen.nz) */
 
        k = -1.0f/(2.0f*(float)M_PI*blur*blur);
-       fval=0;
+
        for (ix = 0;ix< halfWidth;ix++){
                weight = (float)exp(k*(ix*ix));
                filter[halfWidth - ix] = weight;
index da329503c9f161b2fa6632ca4cee684797dc8fec..2c507370288a8d339ae7c0baa231eb7cac9299a6 100644 (file)
@@ -400,7 +400,13 @@ Text *add_text(const char *file, const char *relpath)
                llen++;
        }
 
-       if (llen!=0 || ta->nlines==0) {
+       /* create new line in cases:
+          - rest of line (if last line in file hasn't got \n terminator).
+            in this case content of such line would be used to fill text line buffer
+          - file is empty. in this case new line is needed to start editing from.
+          - last characted in buffer is \n. in this case new line is needed to
+            deal with newline at end of file. (see [#28087]) (sergey) */
+       if (llen!=0 || ta->nlines==0 || buffer[len-1]=='\n') {
                tmp= (TextLine*) MEM_mallocN(sizeof(TextLine), "textline");
                tmp->line= (char*) MEM_mallocN(llen+1, "textline_string");
                tmp->format= NULL;
@@ -1417,6 +1423,8 @@ void txt_insert_buf(Text *text, const char *in_buffer)
        }
 
        undoing= u;
+
+       (void)count;
 }
 
 /******************/
index ba7f9bdd41547bfae02ab76c25c92e04220cb4b9..769a3f9b11e5ea51066c698cdf6f549328a6371f 100644 (file)
@@ -105,13 +105,18 @@ bMovieHandle *BKE_get_movie_handle(int imtype)
                mh.get_movie_path = filepath_ffmpeg;
        }
 #endif
+#ifdef WITH_FRAMESERVER
        if (imtype == R_FRAMESERVER) {
                mh.start_movie = start_frameserver;
                mh.append_movie = append_frameserver;
                mh.end_movie = end_frameserver;
                mh.get_next_frame = frameserver_loop;
        }
-       
+#endif
+
+       /* incase all above are disabled */
+       (void)imtype;
+
        return &mh;
 }
 
index 2239f6d31474eaf471cee200980e81a82dee16f3..d13d15d1269e4fc2537fd72478b13d975a8c6f30 100644 (file)
@@ -22,6 +22,7 @@
  *
  */
 
+#ifdef WITH_FRAMESERVER
 
 #include <string.h>
 #include <stdio.h>
@@ -381,3 +382,4 @@ void end_frameserver(void)
        shutdown_socket_system();
 }
 
+#endif /* WITH_FRAMESERVER */
index a44fa6802f20a3a460d2007455d69e1f84abfa5d..9d29177578dbedc9290aa9a598ee807426807a30 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 0a7a276d8576c5cde574c81f7edbfaaa97bc0fa5..c080e4b05965fed78c68eb5b44a30053ec020bba 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 f5293948a7b890390d16622e3aa73d293cc551ca..cfe639578dc877bdf53f866cc34e5d56aec50136 100644 (file)
@@ -1478,10 +1478,8 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, wmEvent *e
        bArmature *arm;
        EditBone *bone, *curBone, *next;
        int extend= RNA_boolean_get(op->ptr, "extend");
-       ARegion *ar;
        Object *obedit= CTX_data_edit_object(C);
        arm= obedit->data;
-       ar= CTX_wm_region(C);
 
        view3d_operator_needs_opengl(C);
 
index 829ad3217a9d4f5285c41359e43a37940c47617e..dfa457c22ded58ab36c921c9fa6f95c143927a07 100644 (file)
@@ -39,6 +39,7 @@ struct Tex;
 struct bContext;
 struct bNode;
 struct ID;
+struct ScrArea;
 
 /* drawnode.c */
 void ED_init_node_butfuncs(void);
@@ -51,6 +52,8 @@ void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct
 void ED_node_shader_default(struct Material *ma);
 void ED_node_composit_default(struct Scene *sce);
 void ED_node_texture_default(struct Tex *tex);
+void ED_node_link_intersect_test(struct ScrArea *sa, int test);
+void ED_node_link_insert(struct ScrArea *sa);
 
 /* node ops.c */
 void ED_operatormacros_node(void);
index e9ec4ccc66d5bc74f5b95afb06681bc8fd9d123d..c5275ea98b57f4871d78e9f67b395f0bafca22b6 100644 (file)
@@ -1879,7 +1879,6 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
                                if(but->autocomplete_func || data->searchbox) {
                                        changed= ui_textedit_autocomplete(C, but, data);
                                        update= 1; /* do live update for tab key */
-                                       retval= WM_UI_HANDLER_BREAK;
                                }
                                /* the hotkey here is not well defined, was G.qual so we check all */
                                else if(event->shift || event->ctrl || event->alt || event->oskey) {
@@ -2325,8 +2324,8 @@ static float ui_numedit_apply_snapf(uiBut *but, float tempf, float softmin, floa
                if(fac != 1.0f) {
                        /* snap in unit-space */
                        tempf /= fac;
-                       softmin /= fac;
-                       softmax /= fac;
+                       /* softmin /= fac; */ /* UNUSED */
+                       /* softmax /= fac; */ /* UNUSED */
                        softrange /= fac;
                }
 
@@ -3469,13 +3468,13 @@ static int ui_numedit_but_CURVE(uiBut *but, uiHandleButtonData *data, int snap,
        CurveMapping *cumap= (CurveMapping*)but->poin;
        CurveMap *cuma= cumap->cm+cumap->cur;
        CurveMapPoint *cmp= cuma->curve;
-       float fx, fy, zoomx, zoomy, offsx, offsy;
+       float fx, fy, zoomx, zoomy /*, offsx, offsy */ /* UNUSED */;
        int a, changed= 0;
 
        zoomx= (but->x2-but->x1)/(cumap->curr.xmax-cumap->curr.xmin);
        zoomy= (but->y2-but->y1)/(cumap->curr.ymax-cumap->curr.ymin);
-       offsx= cumap->curr.xmin;
-       offsy= cumap->curr.ymin;
+       /* offsx= cumap->curr.xmin; */
+       /* offsy= cumap->curr.ymin; */
 
        if(snap) {
                float d[2];
index 79a90fb9d1dd11fd70e8381149a66e7a42c40b21..2f0bcc9d5b423282f7b415383e5943313e242f21 100644 (file)
@@ -149,10 +149,10 @@ typedef struct uiLayoutItemBx {
        uiBut *roundbox;
 } uiLayoutItemBx;
 
-typedef struct uiLayoutItemSplt {
+typedef struct uiLayoutItemSplit {
        uiLayout litem;
        float percentage;
-} uiLayoutItemSplt;
+} uiLayoutItemSplit;
 
 typedef struct uiLayoutItemRoot {
        uiLayout litem;
@@ -1615,7 +1615,7 @@ static void ui_litem_layout_row(uiLayout *litem)
        int x, y, w, tot, totw, neww, itemw, minw, itemh, offset;
        int fixedw, freew, fixedx, freex, flag= 0, lastw= 0;
 
-       x= litem->x;
+       /* x= litem->x; */ /* UNUSED */
        y= litem->y;
        w= litem->w;
        totw= 0;
@@ -2020,7 +2020,7 @@ static void ui_litem_estimate_split(uiLayout *litem)
 
 static void ui_litem_layout_split(uiLayout *litem)
 {
-       uiLayoutItemSplt *split= (uiLayoutItemSplt*)litem;
+       uiLayoutItemSplit *split= (uiLayoutItemSplit*)litem;
        uiItem *item;
        float percentage;
        const int tot= BLI_countlist(&litem->items);
@@ -2242,9 +2242,9 @@ uiLayout *uiLayoutOverlap(uiLayout *layout)
 
 uiLayout *uiLayoutSplit(uiLayout *layout, float percentage, int align)
 {
-       uiLayoutItemSplt *split;
+       uiLayoutItemSplit *split;
 
-       split= MEM_callocN(sizeof(uiLayoutItemSplt), "uiLayoutItemSplt");
+       split= MEM_callocN(sizeof(uiLayoutItemSplit), "uiLayoutItemSplit");
        split->litem.item.type= ITEM_LAYOUT_SPLIT;
        split->litem.root= layout->root;
        split->litem.align= align;
index 9ed3cabb4cb203b4bbabd9b82b9b45d51232d045..3b20533dcd4ab1989bfde490e5ed7915e72d8b8a 100644 (file)
@@ -575,8 +575,8 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, rcti *rect)
                ui_draw_tria_rect(&itemrect, 'h');
        else
                ui_draw_tria_rect(&itemrect, 'v');
-       
-       
+
+       (void)ofsx;
 }
 
 /************************** panel alignment *************************/
index 62043f240e453fb6c44b4e38578edbb196226cb8..9e7717260e6f50a7a39930d08b49a2ceee8b6b8d 100644 (file)
@@ -484,6 +484,17 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
                        }
                }
        }
+       else if (ELEM(but->type, MENU, PULLDOWN)) {
+               if ((U.flag & USER_TOOLTIPS_PYTHON) == 0) {
+                       if(but->menu_create_func && WM_menutype_contains((MenuType *)but->poin)) {
+                               MenuType *mt= (MenuType *)but->poin;
+                               BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s", mt->idname);
+                               data->color[data->totline]= 0x888888;
+                               data->totline++;
+                       }
+               }
+
+       }
 
        assert(data->totline < MAX_TOOLTIP_LINES);
        
index 8b03cf2787e6beb56bc6c169cc5197778fbf0976..f35102edcaf40078c36dbfc048a1dec8a50240c5 100644 (file)
@@ -851,7 +851,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
 
        /* verify we have valid data */
        if(!RNA_struct_is_a(ptr->type, &RNA_Modifier)) {
-               RNA_warning("uiTemplateModifier: expected modifier on object.\n");
+               RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
                return NULL;
        }
 
@@ -859,7 +859,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
        md= ptr->data;
 
        if(!ob || !(GS(ob->id.name) == ID_OB)) {
-               RNA_warning("uiTemplateModifier: expected modifier on object.\n");
+               RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
                return NULL;
        }
        
@@ -976,9 +976,6 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
        block= uiLayoutGetBlock(box);
 
        /* Draw constraint header */
-       
-       /* rounded header */
-       // rb_col= (con->flag & CONSTRAINT_ACTIVE)?50:20; // UNUSED
 
        /* open/close */
        uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -1083,7 +1080,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
 
        /* verify we have valid data */
        if(!RNA_struct_is_a(ptr->type, &RNA_Constraint)) {
-               RNA_warning("uiTemplateConstraint: expected constraint on object.\n");
+               RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
                return NULL;
        }
 
@@ -1091,7 +1088,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
        con= ptr->data;
 
        if(!ob || !(GS(ob->id.name) == ID_OB)) {
-               RNA_warning("uiTemplateConstraint: expected constraint on object.\n");
+               RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
                return NULL;
        }
        
@@ -1137,7 +1134,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
        PointerRNA texture_ptr;
 
        if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) {
-               RNA_warning("uiTemplatePreview: expected ID of type material, texture, lamp or world.\n");
+               RNA_warning("uiTemplatePreview: Expected ID of type material, texture, lamp or world.\n");
                return;
        }
 
@@ -2177,14 +2174,14 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
        if(prop) {
                type= RNA_property_type(prop);
                if(type != PROP_COLLECTION) {
-                       RNA_warning("uiTemplateList: expected collection property.\n");
+                       RNA_warning("uiTemplateList: Expected collection property.\n");
                        return;
                }
        }
 
        activetype= RNA_property_type(activeprop);
        if(activetype != PROP_INT) {
-               RNA_warning("uiTemplateList: expected integer property.\n");
+               RNA_warning("uiTemplateList: Expected integer property.\n");
                return;
        }
 
@@ -2206,7 +2203,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
                        /* create list items */
                        RNA_PROP_BEGIN(ptr, itemptr, prop) {
                                /* create button */
-                               if(i == 9)
+                               if(!(i % 9))
                                        row= uiLayoutRow(col, 0);
 
                                icon= list_item_icon_get(C, &itemptr, rnaicon, 1);
@@ -2221,7 +2218,6 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
        }
        else if(listtype == 'c') {
                /* compact layout */
-               found= 0;
 
                row= uiLayoutRow(layout, 1);
 
index 3f825762d74b41fba94dc0e78e47b0d5ac63aa61..56ef5e9e8cc15ed26c17faab1da0a804210d0295 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 7ca172c694575cb7a838e183ec634a5aa2563a9e..f5f97c6a5f6b2d0f7c14c4493675ccec7e32e3c5 100644 (file)
@@ -806,14 +806,14 @@ static int object_delete_exec(bContext *C, wmOperator *UNUSED(op))
 {
        Main *bmain= CTX_data_main(C);
        Scene *scene= CTX_data_scene(C);
-       int islamp= 0;
+       /* int islamp= 0; */ /* UNUSED */
        
        if(CTX_data_edit_object(C)) 
                return OPERATOR_CANCELLED;
        
        CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
 
-               if(base->object->type==OB_LAMP) islamp= 1;
+               /* if(base->object->type==OB_LAMP) islamp= 1; */
 
                /* deselect object -- it could be used in other scenes */
                base->object->flag &= ~SELECT;
index 29a740affc534051240f5303cda2208fd106211c..395705dc029c8b501d156d2cfaf79438cc16a707 100644 (file)
@@ -2162,16 +2162,20 @@ static int game_property_copy_exec(bContext *C, wmOperator *op)
                        } CTX_DATA_END;
                }
        }
-       else if (ELEM(type, COPY_PROPERTIES_REPLACE, COPY_PROPERTIES_MERGE)) {
+
+       else {
                CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
                        if (ob != ob_iter) {
                                if (ob->data != ob_iter->data){
-                                       if (type == 2) {/* merge */
+                                       if (type == COPY_PROPERTIES_REPLACE)
+                                               copy_properties( &ob_iter->prop, &ob->prop );
+
+                                       /* merge - the default when calling with no argument */
+                                       else {
                                                for(prop = ob->prop.first; prop; prop= prop->next ) {
                                                        set_ob_property(ob_iter, prop);
                                                }
-                                       } else /* replace */
-                                               copy_properties( &ob_iter->prop, &ob->prop );
+                                       }
                                }
                        }
                }
index fdd53d27b028bbea1f45e45222fbfac54c8000b4..cfed2750e18e14b3f99769f01d1e120008cb3548 100644 (file)
@@ -108,7 +108,7 @@ void OBJECT_OT_material_slot_add(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Add Material Slot";
        ot->idname= "OBJECT_OT_material_slot_add";
-       ot->description="Add a new material slot or duplicate the selected one";
+       ot->description="Add a new material slot";
        
        /* api callbacks */
        ot->exec= material_slot_add_exec;
index 1bf2c3d89bdd8bd2338ce2cb1dd6bc4606acc231..50e657bbb61d031d70d0305e7d5b51dbaefe3020 100644 (file)
@@ -1869,10 +1869,17 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
                else {
                        /* check cyclic */
                        if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) {
-                               if(link->fromnode->flag & SELECT)
-                                       th_col1= TH_EDGE_SELECT;
-                               if(link->tonode->flag & SELECT)
-                                       th_col2= TH_EDGE_SELECT;
+                               /* special indicated link, on drop-node */
+                               if(link->flag & NODE_LINKFLAG_HILITE) {
+                                       th_col1= th_col2= TH_ACTIVE;
+                               }
+                               else {
+                                       /* regular link */
+                                       if(link->fromnode->flag & SELECT)
+                                               th_col1= TH_EDGE_SELECT;
+                                       if(link->tonode->flag & SELECT)
+                                               th_col2= TH_EDGE_SELECT;
+                               }
                                do_shaded= 1;
                                do_triple= 1;
                        }                               
index cd1fa5c16a7a731277791c5f8dd5bcae958eee4a..950b3c72fe74002fe1dc00428964e007bf604d8a 100644 (file)
@@ -781,14 +781,15 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
                                         iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
        }
        {       /* always hide/reveal unused sockets */ 
-               int shade;
-
-               iconofs-=iconbutw;
                // XXX re-enable
-               /*if(node_has_hidden_sockets(node))
+               /* int shade;
+               if(node_has_hidden_sockets(node))
                        shade= -40;
-               else*/
-                       shade= -90;
+               else
+                       shade= -90; */
+
+               iconofs-=iconbutw;
+
                uiDefIconBut(node->block, LABEL, B_REDR, ICON_PLUS, iconofs, rct->ymax-NODE_DY,
                                                  iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
        }
index abc7b273ec991bc248be1a4f2c87ebe3686fa907..c719f7495828e4cc7d7a0bc782e84f7a511d2dcc 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 */
@@ -2492,6 +2498,151 @@ void NODE_OT_links_cut(wmOperatorType *ot)
        RNA_def_int(ot->srna, "cursor", BC_KNIFECURSOR, 0, INT_MAX, "Cursor", "", 0, INT_MAX);
 }
 
+/* *********************  automatic node insert on dragging ******************* */
+
+/* assumes sockets in list */
+static bNodeSocket *socket_best_match(ListBase *sockets, int type)
+{
+       bNodeSocket *sock;
+       
+       /* first, match type */
+       for(sock= sockets->first; sock; sock= sock->next)
+               if(!(sock->flag & SOCK_HIDDEN))
+                       if(type == sock->type)
+                               return sock;
+       
+       /* then just use first unhidden socket */
+       for(sock= sockets->first; sock; sock= sock->next)
+               if(!(sock->flag & SOCK_HIDDEN))
+                       return sock;
+
+       /* OK, let's unhide proper one */
+       for(sock= sockets->first; sock; sock= sock->next) {
+               if(type == sock->type) {
+                       sock->flag &= ~SOCK_HIDDEN;
+                       return sock;
+               }
+       }
+       
+       /* just the first */
+       sock= sockets->first;
+       sock->flag &= ~SOCK_HIDDEN;
+       
+       return sockets->first;
+}
+
+/* prevent duplicate testing code below */
+static SpaceNode *ed_node_link_conditions(ScrArea *sa, bNode **select)
+{
+       SpaceNode *snode= sa?sa->spacedata.first:NULL;
+       bNode *node;
+       bNodeLink *link;
+       
+       /* no unlucky accidents */
+       if(sa==NULL || sa->spacetype!=SPACE_NODE) return NULL;
+       
+       *select= NULL;
+       
+       for(node= snode->edittree->nodes.first; node; node= node->next) {
+               if(node->flag & SELECT) {
+                       if(*select)
+                               break;
+                       else
+                               *select= node;
+               }
+       }
+       /* only one selected */
+       if(node || *select==NULL) return NULL;
+       
+       /* correct node */
+       if((*select)->inputs.first==NULL || (*select)->outputs.first==NULL) return NULL;
+       
+       /* test node for links */
+       for(link= snode->edittree->links.first; link; link=link->next) {
+               if(link->tonode == *select || link->fromnode == *select)
+                       return NULL;
+       }
+       
+       return snode;
+}
+
+/* assumes link with NODE_LINKFLAG_HILITE set */
+void ED_node_link_insert(ScrArea *sa)
+{
+       bNode *node, *select;
+       SpaceNode *snode= ed_node_link_conditions(sa, &select);
+       bNodeLink *link;
+       bNodeSocket *sockto;
+       
+       if(snode==NULL) return;
+       
+       /* get the link */
+       for(link= snode->edittree->links.first; link; link=link->next)
+               if(link->flag & NODE_LINKFLAG_HILITE)
+                       break;
+       
+       if(link) {
+               node= link->tonode;
+               sockto= link->tosock;
+               
+               link->tonode= select;
+               link->tosock= socket_best_match(&select->inputs, link->fromsock->type);
+               link->flag &= ~NODE_LINKFLAG_HILITE;
+               
+               nodeAddLink(snode->edittree, select, socket_best_match(&select->outputs, sockto->type), node, sockto);
+               ntreeSolveOrder(snode->edittree);       /* needed for pointers */
+               snode_tag_changed(snode, select);
+               ED_node_changed_update(snode->id, select);
+       }
+}
+
+
+/* test == 0, clear all intersect flags */
+void ED_node_link_intersect_test(ScrArea *sa, int test)
+{
+       bNode *select;
+       SpaceNode *snode= ed_node_link_conditions(sa, &select);
+       bNodeLink *link, *selink=NULL;
+       float mcoords[6][2];
+       
+       if(snode==NULL) return;
+       
+       /* clear flags */
+       for(link= snode->edittree->links.first; link; link=link->next)
+               link->flag &= ~NODE_LINKFLAG_HILITE;
+       
+       if(test==0) return;
+       
+       /* okay, there's 1 node, without links, now intersect */
+       mcoords[0][0]= select->totr.xmin;
+       mcoords[0][1]= select->totr.ymin;
+       mcoords[1][0]= select->totr.xmax;
+       mcoords[1][1]= select->totr.ymin;
+       mcoords[2][0]= select->totr.xmax;
+       mcoords[2][1]= select->totr.ymax;
+       mcoords[3][0]= select->totr.xmin;
+       mcoords[3][1]= select->totr.ymax;
+       mcoords[4][0]= select->totr.xmin;
+       mcoords[4][1]= select->totr.ymin;
+       mcoords[5][0]= select->totr.xmax;
+       mcoords[5][1]= select->totr.ymax;
+       
+       /* we only tag a single link for intersect now */
+       /* idea; use header dist when more? */
+       for(link= snode->edittree->links.first; link; link=link->next) {
+               
+               if(cut_links_intersect(link, mcoords, 5)) { /* intersect code wants edges */
+                       if(selink) 
+                               break;
+                       selink= link;
+               }
+       }
+               
+       if(link==NULL && selink)
+               selink->flag |= NODE_LINKFLAG_HILITE;
+}
+
+
 /* ******************************** */
 // XXX some code needing updating to operators...
 
@@ -2914,7 +3065,8 @@ void NODE_OT_delete(wmOperatorType *ot)
 
 /* note: in cmp_util.c is similar code, for node_compo_pass_on() */
 /* used for disabling node  (similar code in node_draw.c for disable line) */
-static void node_delete_reconnect(bNodeTree* tree, bNode* node) {
+static void node_delete_reconnect(bNodeTree* tree, bNode* node) 
+{
        bNodeLink *link, *next;
        bNodeSocket *valsocket= NULL, *colsocket= NULL, *vecsocket= NULL;
        bNodeSocket *deliveringvalsocket= NULL, *deliveringcolsocket= NULL, *deliveringvecsocket= NULL;
@@ -3142,3 +3294,5 @@ void NODE_OT_add_file(wmOperatorType *ot)
        RNA_def_string(ot->srna, "name", "Image", 24, "Name", "Datablock name to assign.");
 }
 
+
+
index f6e3dc3dd0a01d5f23a9d50e34181e10a854edc3..b105b2507ab8aaca0f63feec3f1bbe9dab58b189 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;
@@ -305,6 +311,7 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad
        SeqLoadInfo seq_load;
        Sequence *seq;
        int tot_files;
+       const short overlap= RNA_boolean_get(op->ptr, "overlap");
 
        seq_load_operator_info(&seq_load, op);
 
@@ -325,12 +332,20 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad
                        BLI_join_dirfile(seq_load.path, sizeof(seq_load.path), dir_only, file_only);
 
                        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);
+
+               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 2bd6bd624df7783fc659ddd81477a1a7c27aa8a0..13eb24ed1f29e40f35315fe8a81ea70f4fef9aea 100644 (file)
@@ -36,6 +36,7 @@
 #include <string.h>
 #include <ctype.h> /* ispunct */
 #include <sys/stat.h>
+#include <errno.h>
 
 #include "MEM_guardedalloc.h"
 
@@ -449,15 +450,14 @@ static void txt_write_file(Text *text, ReportList *reports)
        FILE *fp;
        TextLine *tmp;
        struct stat st;
-       int res;
-       char file[FILE_MAXDIR+FILE_MAXFILE];
+       char filepath[FILE_MAXDIR+FILE_MAXFILE];
        
-       BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE);
-       BLI_path_abs(file, G.main->name);
+       BLI_strncpy(filepath, text->name, FILE_MAXDIR+FILE_MAXFILE);
+       BLI_path_abs(filepath, G.main->name);
        
-       fp= fopen(file, "w");
+       fp= fopen(filepath, "w");
        if(fp==NULL) {
-               BKE_report(reports, RPT_ERROR, "Unable to save file.");
+               BKE_reportf(reports, RPT_ERROR, "Unable to save \"%s\": %s.", filepath, errno ? strerror(errno) : "Unknown error writing file");
                return;
        }
 
@@ -471,8 +471,13 @@ static void txt_write_file(Text *text, ReportList *reports)
        
        fclose (fp);
 
-       res= stat(file, &st);
-       text->mtime= st.st_mtime;
+       if(stat(filepath, &st) == 0) {
+               text->mtime= st.st_mtime;
+       }
+       else {
+               text->mtime= 0;
+               BKE_reportf(reports, RPT_WARNING, "Unable to stat \"%s\": %s.", filepath, errno ? strerror(errno) : "Unknown error starrng file");
+       }
        
        if(text->flags & TXT_ISDIRTY)
                text->flags ^= TXT_ISDIRTY;
index 9ff73767b4c4753cd6d5aa89f7661ab69d43dcbd..d563c07baf3a196c5b68d959b2c8df7c302eb0ba 100644 (file)
@@ -129,7 +129,6 @@ void ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d)
                }
                else {
                        ED_view3d_to_object(v3d->camera, rv3d->ofs, rv3d->viewquat, rv3d->dist);
-                       root_parent= v3d->camera;
                        DAG_id_tag_update(&v3d->camera->id, OB_RECALC_OB);
                        WM_main_add_notifier(NC_OBJECT|ND_TRANSFORM, v3d->camera);
                }
index 4632e0897f28175c365d5aff23850bad68573170..ab8287ce3a5dd39c069b97f2524dc187b668ea6c 100644 (file)
@@ -511,17 +511,6 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
                uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
                uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
 
-               /* NDOF */
-               /* Not implemented yet
-               if (G.ndofdevice ==0 ) {
-                       uiDefIconTextButC(block, ICONTEXTROW,B_NDOF, ICON_NDOF_TURN, ndof_pup(), 0,0,UI_UNIT_X+10,UI_UNIT_Y, &(v3d->ndofmode), 0, 3.0, 0, 0, "Ndof mode");
-
-                       uiDefIconButC(block, TOG, B_NDOF,  ICON_NDOF_DOM,
-                                       0,0,UI_UNIT_X,UI_UNIT_Y,
-                                       &v3d->ndoffilter, 0, 1, 0, 0, "dominant axis");
-               }
-                */
-
                /* Transform widget / manipulators */
                row= uiLayoutRow(layout, 1);
                uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
index d3a30991aa62ee387199ea1d8815aa6aba134aac..eea77e36f7c5dc5475d671cea8f30b694a07c241 100644 (file)
@@ -969,7 +969,7 @@ int transformEvent(TransInfo *t, wmEvent *event)
                        break;
                case OKEY:
                        if (t->flag & T_PROP_EDIT && event->shift) {
-                               t->prop_mode = (t->prop_mode + 1) % 6;
+                               t->prop_mode = (t->prop_mode + 1) % PROP_MODE_MAX;
                                calculatePropRatio(t);
                                t->redraw |= TREDRAW_HARD;
                        }
index d8e750acb882b9fe4e6a69e22033d866bf460bf5..d8e424887871937c75504245c7f26ed21ed37a3c 100644 (file)
@@ -96,7 +96,7 @@ typedef struct TransSnap {
        short   modeSelect;
        short   align;
        char    project;
-       char    project_self;
+       char    snap_self;
        short   peel;
        short   status;
        float   snapPoint[3]; /* snapping from this point */
index 16bfc75c97979cf54b57069acd27261876bf4a92..0a5e290643af3f46806efc46905ca185ebeaade9 100644 (file)
@@ -87,6 +87,7 @@
 #include "ED_object.h"
 #include "ED_markers.h"
 #include "ED_mesh.h"
+#include "ED_node.h"
 #include "ED_types.h"
 #include "ED_uvedit.h"
 #include "ED_curve.h" /* for ED_curve_editnurbs */
@@ -2182,6 +2183,12 @@ void flushTransNodes(TransInfo *t)
                td->loc2d[0]= td->loc[0];
                td->loc2d[1]= td->loc[1];
        }
+       
+       /* handle intersection with noodles */
+       if(t->total==1) {
+               ED_node_link_intersect_test(t->sa, 1);
+       }
+       
 }
 
 /* *** SEQUENCE EDITOR *** */
@@ -4756,7 +4763,12 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
 
        }
        else if (t->spacetype == SPACE_NODE) {
-               /* pass */
+               if(cancelled == 0)
+                       ED_node_link_insert(t->sa);
+               
+               /* clear link line */
+               ED_node_link_intersect_test(t->sa, 0);
+               
        }
        else if (t->spacetype == SPACE_ACTION) {
                SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
index 20a26d8c58d43973333bfe9495cd04ab1f718575..6d0a978700fa2ff41e412ad7ce6060ee1707fce9 100644 (file)
@@ -1070,7 +1070,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
                }
        }
        // Need stuff to take it from edit mesh or whatnot here
-       else
+       else if (t->spacetype == SPACE_VIEW3D)
        {
                if (t->obedit && t->obedit->type == OB_MESH && (((Mesh *)t->obedit->data)->editflag & ME_EDIT_MIRROR_X))
                {
index 7bdf6c909d9775f5e281d25cd11d8e0b520199f3..2d0c1ac281803a50034e8647089f78b7f5be4588 100644 (file)
@@ -954,6 +954,8 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
 
                        WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
 
+                       WM_keymap_add_item(keymap, OP_SHEAR, SKEY, KM_PRESS, KM_ALT|KM_CTRL|KM_SHIFT, 0);
+
                        WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
 
                        km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
index d9d9b0f91028451135b210e5b5338e8bade3e24b..ca89670dedb308d85ca4fb9e3c241319bf230e8c 100644 (file)
@@ -392,7 +392,7 @@ static void initSnappingMode(TransInfo *t)
                        }
                        else
                        {
-                               t->tsnap.modeSelect = t->tsnap.project_self ? SNAP_ALL : SNAP_NOT_OBEDIT;
+                               t->tsnap.modeSelect = t->tsnap.snap_self ? SNAP_ALL : SNAP_NOT_OBEDIT;
                        }
                }
                /* Particles edit mode*/
@@ -458,23 +458,26 @@ void initSnapping(TransInfo *t, wmOperator *op)
                                t->tsnap.project = RNA_boolean_get(op->ptr, "use_snap_project");
                        }
 
-                       if (RNA_struct_find_property(op->ptr, "use_snap_project_self"))
+                       if (RNA_struct_find_property(op->ptr, "use_snap_self"))
                        {
-                               t->tsnap.project = RNA_boolean_get(op->ptr, "use_snap_project_self");
+                               t->tsnap.snap_self = RNA_boolean_get(op->ptr, "use_snap_self");
                        }
                }
        }
        /* 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.project_self = !((t->settings->snap_flag & SCE_SNAP_PROJECT_NO_SELF) == SCE_SNAP_PROJECT_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,6 +1947,11 @@ 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 > 2) {
+               printf("applyGrid: invalid index %d, clamping\n", max_index);
+               max_index= 2;
+       }
+
        // Early bailing out if no need to snap
        if (fac[action] == 0.0f)
                return;
index 8a6ec7f75dbe516dec1a5919bda48fd387ae733f..a2381a208ef015a452d0e73fa1eeb8a5a3ae62dd 100644 (file)
@@ -358,19 +358,25 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op)
                                ret= 1;
                        }
                }
+               else {
+                       if (G.f & G_DEBUG) {
+                               printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name);
+                       }
+               }
 
                /* set region back */
                CTX_wm_region_set(C, ar);
        }
        else {
                if (G.f & G_DEBUG) {
-                       printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name);
+                       printf("redo_cb: ED_undo_operator_repeat called with NULL 'op'\n");
                }
        }
 
        return ret;
 }
 
+
 void ED_undo_operator_repeat_cb(bContext *C, void *arg_op, void *UNUSED(arg_unused))
 {
        ED_undo_operator_repeat(C, (wmOperator *)arg_op);
index c09f8cff02d6990014bf8ad7e645f4d9f4e032ba..70659994c558fc863a841945731940a843cce225 100644 (file)
@@ -1057,6 +1057,134 @@ static void weld_align_uv(bContext *C, int tool)
                }
        }
 
+       if(tool == 's' || tool == 't' || tool == 'u') {
+                /* pass 1&2 variables */
+               int i, j;
+               int starttmpl= -1, connectedtostarttmpl= -1, startcorner;
+               int endtmpl= -1,   connectedtoendtmpl= -1,   endcorner;
+               MTFace *startface, *endface;
+               int itmpl, jtmpl;
+               EditVert *eve;
+               int pass; /* first 2 passes find endpoints, 3rd pass moves middle points, 4th pass is fail-on-face-selected */
+               EditFace *startefa, *endefa;
+
+                /* pass 3 variables */
+               float startx, starty, firstm,  firstb,  midx,      midy;
+               float endx,   endy,   secondm, secondb, midmovedx, midmovedy;
+               float IsVertical_check= -1;
+               float IsHorizontal_check= -1;
+
+               for(i= 0, eve= em->verts.first; eve; eve= eve->next, i++) /* give each point a unique name */
+                       eve->tmp.l= i;
+               for(pass= 1; pass <= 3; pass++) { /* do this for each endpoint */
+                       if(pass == 3){ /* calculate */
+                               startx= startface->uv[startcorner][0];
+                               starty= startface->uv[startcorner][1];
+                               endx= endface->uv[endcorner][0];
+                               endy= endface->uv[endcorner][1];
+                               firstm= (endy-starty)/(endx-startx);
+                               firstb= starty-(firstm*startx);
+                               secondm= -1.0f/firstm;
+                               if(startx == endx) IsVertical_check= startx;
+                               if(starty == endy) IsHorizontal_check= starty;
+                       }
+                       for(efa= em->faces.first; efa; efa= efa->next) { /* for each face */
+                               tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); /* get face */
+                               if(uvedit_face_visible(scene, ima, efa, tf)) { /* if you can see it */
+                                       if(uvedit_face_selected(scene, efa, tf)) { /* if the face is selected, get out now! */
+                                               pass= 4;
+                                               break;
+                                       }
+                                       for(i= 0; (i < 3 || (i == 3 && efa->v4)); i++) { /* for each point of the face */
+                                               itmpl= (*(&efa->v1 + i))->tmp.l; /* get unique name for points */
+                                               if(pass == 3) { /* move */
+                                                       if(uvedit_uv_selected(scene, efa, tf, i)) {
+                                                               if(!(itmpl == starttmpl || itmpl == endtmpl)) {
+                                                                       if(IsVertical_check != -1) tf->uv[i][0]= IsVertical_check;
+                                                                       if(IsHorizontal_check != -1) tf->uv[i][1]= IsHorizontal_check;
+                                                                       if((IsVertical_check == -1) && (IsHorizontal_check == -1)) {
+                                                                               midx= tf->uv[i][0];
+                                                                               midy= tf->uv[i][1];
+                                                                               if(tool == 's') {
+                                                                                       secondb= midy-(secondm*midx);
+                                                                                       midmovedx= (secondb-firstb)/(firstm-secondm);
+                                                                                       midmovedy= (secondm*midmovedx)+secondb;
+                                                                                       tf->uv[i][0]= midmovedx;
+                                                                                       tf->uv[i][1]= midmovedy;
+                                                                               }
+                                                                               else if(tool == 't') {
+                                                                                       tf->uv[i][0]= (midy-firstb)/firstm; /* midmovedx */
+                                                                               }
+                                                                               else if(tool == 'u') {
+                                                                                       tf->uv[i][1]= (firstm*midx)+firstb; /* midmovedy */
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                               else {
+                                                       for(j= 0; (j < 3 || (j == 3 && efa->v4)); j++) { /* also for each point on the face */
+                                                               jtmpl= (*(&efa->v1 + j))->tmp.l;
+                                                               if(i != j && (!efa->v4 || ABS(i-j) !=  2)) { /* if the points are connected */
+                                                                       /* quad   (0,1,2,3) 0,1 0,3 1,0 1,2 2,1 2,3 3,0 3,2
+                                                                        * triangle (0,1,2) 0,1 0,2 1,0 1,2 2,0 2,1 */
+                                                                       if(uvedit_uv_selected(scene, efa, tf, i) && uvedit_uv_selected(scene, efa, tf, j)) {
+                                                                                /* if the edge is selected */
+                                                                               if(pass == 1) { /* if finding first endpoint */
+                                                                                       if(starttmpl == -1) { /* if the first endpoint isn't found yet */
+                                                                                               starttmpl= itmpl; /* set unique name for endpoint */
+                                                                                               connectedtostarttmpl= jtmpl;
+                                                                                                /* get point that endpoint is connected to */
+                                                                                               startface= tf; /* get face it's on */
+                                                                                               startcorner= i; /* what corner of the face? */
+                                                                                               startefa= efa;
+                                                                                               efa= em->faces.first;
+                                                                                               tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+                                                                                               i= -1;
+                                                                                               break;
+                                                                                       }
+                                                                                       if(starttmpl == itmpl && jtmpl != connectedtostarttmpl) {
+                                                                                               starttmpl= -1; /* not an endpoint */
+                                                                                               efa= startefa;
+                                                                                               tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+                                                                                               i= startcorner;
+                                                                                               break;
+                                                                                       }
+                                                                               }
+                                                                               else if(pass == 2) { /* if finding second endpoint */
+                                                                                       if(endtmpl == -1 && itmpl != starttmpl) {
+                                                                                               endtmpl= itmpl;
+                                                                                               connectedtoendtmpl= jtmpl;
+                                                                                               endface= tf;
+                                                                                               endcorner= i;
+                                                                                               endefa= efa;
+                                                                                               efa= em->faces.first;
+                                                                                               tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+                                                                                               i= -1;
+                                                                                               break;
+                                                                                       }
+                                                                                       if(endtmpl == itmpl && jtmpl != connectedtoendtmpl) {
+                                                                                               endtmpl= -1;
+                                                                                               efa= endefa;
+                                                                                               tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+                                                                                               i= endcorner;
+                                                                                               break;
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       if(pass == 2 && (starttmpl == -1 || endtmpl == -1)) {
+                               /* if endpoints aren't found */
+                               pass=4;
+                       }
+               }
+       }
+
        uvedit_live_unwrap_update(sima, scene, obedit);
        DAG_id_tag_update(obedit->data, 0);
        WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -1074,6 +1202,9 @@ static int align_exec(bContext *C, wmOperator *op)
 static void UV_OT_align(wmOperatorType *ot)
 {
        static EnumPropertyItem axis_items[] = {
+               {'s', "ALIGN_S", 0, "Straighten", "Align UVs along the line defined by the endpoints"},
+               {'t', "ALIGN_T", 0, "Straighten X", "Align UVs along the line defined by the endpoints along the X axis"},
+               {'u', "ALIGN_U", 0, "Straighten Y", "Align UVs along the line defined by the endpoints along the Y axis"},
                {'a', "ALIGN_AUTO", 0, "Align Auto", "Automatically choose the axis on which there is most alignment already"},
                {'x', "ALIGN_X", 0, "Align X", "Align UVs on X axis"},
                {'y', "ALIGN_Y", 0, "Align Y", "Align UVs on Y axis"},
index 3804aad6848c0bf7bcc5568e334c768c7a90f8d8..274884000dbbc8314f92db764c4819e2572bcb50 100644 (file)
@@ -671,7 +671,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
        i = is;
        GPU_link(mat, "shade_visifac", i, visifac, shi->refl, &i);
 
-       vn = shi->vn;
+
        /*if(ma->mode & MA_TANGENT_VN)
                GPU_link(mat, "shade_tangent_v_spec", GPU_attribute(CD_TANGENT, ""), &vn);*/
 
@@ -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 ff01e3a8a1e7838a9a1118b7d9670e2ea7e7c00f..36123592c546e289f519a871c60d99b99b551dc2 100644 (file)
@@ -252,7 +252,7 @@ void IMB_filter(struct ImBuf *ibuf);
 void IMB_filterN(struct ImBuf *out, struct ImBuf *in);
 void IMB_mask_filter_extend(char *mask, int width, int height);
 void IMB_mask_clear(struct ImBuf *ibuf, char *mask, int val);
-void IMB_filter_extend(struct ImBuf *ibuf, char *mask);
+void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter);
 void IMB_makemipmap(struct ImBuf *ibuf, int use_filter);
 void IMB_remakemipmap(struct ImBuf *ibuf, int use_filter);
 struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level);
index d12360e5a7ead984f9436ec12f621018d9bdd6e6..1644e653df4aa87826999835ee81f3974d25f4cf 100644 (file)
@@ -21,7 +21,7 @@
  *
  * The Original Code is: all of this file.
  *
- * Contributor(s): none yet.
+ * Contributor(s): Morten Mikkelsen.
  *
  * ***** END GPL LICENSE BLOCK *****
  * filter.c
@@ -326,121 +326,132 @@ void IMB_mask_clear(ImBuf *ibuf, char *mask, int val)
        }
 }
 
-#define EXTEND_PIXEL(color, w) if((color)[3]) {r+= w*(color)[0]; g+= w*(color)[1]; b+= w*(color)[2]; a+= w*(color)[3]; tot+=w;}
+static int filter_make_index(const int x, const int y, const int w, const int h)
+{
+       if(x<0 || x>=w || y<0 || y>=h) return -1;       /* return bad index */
+       else return y*w+x;
+}
+
+static int check_pixel_assigned(const void *buffer, const char *mask, const int index, const int depth, const int is_float)
+{
+       int res = 0;
+
+       if(index>=0) {
+               const int alpha_index = depth*index+(depth-1);
+
+               if(mask!=NULL) {
+                       res = mask[index]!=0 ? 1 : 0;
+               }
+               else if( (is_float && ((const float *) buffer)[alpha_index]!=0.0f) ||
+                               (!is_float && ((const unsigned char *) buffer)[alpha_index]!=0) ) {
+                       res=1;
+               }
+       }
+
+       return res;
+}
 
 /* if alpha is zero, it checks surrounding pixels and averages color. sets new alphas to 1.0
  * 
  * When a mask is given, only effect pixels with a mask value of 1, defined as BAKE_MASK_MARGIN in rendercore.c
  * */
-void IMB_filter_extend(struct ImBuf *ibuf, char *mask)
+void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter)
 {
-       register char *row1, *row2, *row3;
-       register char *cp; 
-       int rowlen, x, y;
-       
-       rowlen= ibuf->x;
-       
-       
-       if (ibuf->rect_float) {
-               float *temprect;
-               float *row1f, *row2f, *row3f;
-               float *fp;
-               temprect= MEM_dupallocN(ibuf->rect_float);
-               
-               for(y=1; y<=ibuf->y; y++) {
-                       /* setup rows */
-                       row1f= (float *)(temprect + (y-2)*rowlen*4);
-                       row2f= row1f + 4*rowlen;
-                       row3f= row2f + 4*rowlen;
-                       if(y==1)
-                               row1f= row2f;
-                       else if(y==ibuf->y)
-                               row3f= row2f;
-                       
-                       fp= (float *)(ibuf->rect_float + (y-1)*rowlen*4);
-                               
-                       for(x=0; x<rowlen; x++) {
-                               if((mask==NULL && fp[3]==0.0f) || (mask && mask[((y-1)*rowlen)+x]==1)) {
-                                       int tot= 0;
-                                       float r=0.0f, g=0.0f, b=0.0f, a=0.0f;
-                                       
-                                       EXTEND_PIXEL(row1f, 1);
-                                       EXTEND_PIXEL(row2f, 2);
-                                       EXTEND_PIXEL(row3f, 1);
-                                       EXTEND_PIXEL(row1f+4, 2);
-                                       EXTEND_PIXEL(row3f+4, 2);
-                                       if(x!=rowlen-1) {
-                                               EXTEND_PIXEL(row1f+8, 1);
-                                               EXTEND_PIXEL(row2f+8, 2);
-                                               EXTEND_PIXEL(row3f+8, 1);
-                                       }                                       
-                                       if(tot) {
-                                               fp[0]= r/tot;
-                                               fp[1]= g/tot;
-                                               fp[2]= b/tot;
-                                               fp[3]= a/tot;
+       const int width= ibuf->x;
+       const int height= ibuf->y;
+       const int depth= 4;             /* always 4 channels */
+       const int chsize= ibuf->rect_float ? sizeof(float) : sizeof(unsigned char);
+       const int bsize= width*height*depth*chsize;
+       const int is_float= ibuf->rect_float!=NULL;
+       void *dstbuf= (void *) MEM_dupallocN(ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect);
+       char *dstmask= mask==NULL ? NULL : (char *) MEM_dupallocN(mask);
+       void *srcbuf= ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect;
+       char *srcmask= mask;
+       int cannot_early_out= 1, r, n, k, i, j, c;
+       float weight[25];
+
+       /* build a weights buffer */
+       n= 2;
+       k= 0;
+       for(i = -n; i <= n; i++)
+               for(j = -n; j <= n; j++)
+                       weight[k++] = sqrt((float) i * i + j * j);
+
+       /* run passes */
+       for(r = 0; cannot_early_out == 1 && r < filter; r++) {
+               int x, y;
+               cannot_early_out = 0;
+
+               for(y= 0; y<height; y++) {
+                       for(x= 0; x<width; x++) {
+                               const int index= filter_make_index(x, y, width, height);
+
+                               /* only update unassigned pixels */
+                               if(!check_pixel_assigned(srcbuf, srcmask, index, depth, is_float)) {
+                                       float tmp[4];
+                                       float wsum=0;
+                                       float acc[4]={0,0,0,0};
+                                       k = 0;
+
+                                       if (check_pixel_assigned(srcbuf, srcmask, filter_make_index(x-1, y, width, height), depth, is_float) ||
+                                               check_pixel_assigned(srcbuf, srcmask, filter_make_index(x+1, y, width, height), depth, is_float) ||
+                                               check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y-1, width, height), depth, is_float) ||
+                                               check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y+1, width, height), depth, is_float)) {
+                                               for(i= -n; i<=n; i++) {
+                                                       for(j=-n; j<=n; j++) {
+                                                               if(i != 0 || j != 0) {
+                                                                       const int tmpindex= filter_make_index(x+i, y+j, width, height);
+
+                                                                       if(check_pixel_assigned(srcbuf, srcmask, tmpindex, depth, is_float))    { 
+                                                                               if(is_float) {
+                                                                                       for(c=0; c<depth; c++)
+                                                                                               tmp[c] = ((const float *) srcbuf)[depth*tmpindex+c];
+                                                                               }
+                                                                               else {
+                                                                                       for(c=0; c<depth; c++)
+                                                                                               tmp[c] = (float) ((const unsigned char *) srcbuf)[depth*tmpindex+c];
+                                                                               }
+
+                                                                               wsum+= weight[k];
+
+                                                                               for(c=0; c<depth; c++)
+                                                                                       acc[c]+= weight[k] * tmp[c];
+                                                                       }
+                                                               }
+                                                               k++;
+                                                       }
+                                               }
+
+                                               if(wsum!=0) {
+                                                       for(c=0; c<depth; c++)
+                                                               acc[c]/= wsum;
+
+                                                       if(is_float) {
+                                                               for(c=0; c<depth; c++)
+                                                                       ((float *) dstbuf)[depth*index+c] = acc[c];
+                                                       }
+                                                       else {
+                                                               for(c=0; c<depth; c++) {
+                                                                       ((unsigned char *) dstbuf)[depth*index+c]= acc[c] > 255 ? 255 : (acc[c] < 0 ? 0 : ((unsigned char) (acc[c]+0.5f)));
+                                                               }
+                                                       }
+
+                                                       if(dstmask!=NULL) dstmask[index]=FILTER_MASK_MARGIN;    /* assigned */
+                                                       cannot_early_out = 1;
+                                               }
                                        }
                                }
-                               fp+=4; 
-                               
-                               if(x!=0) {
-                                       row1f+=4; row2f+=4; row3f+=4;
-                               }
                        }
                }
 
-               MEM_freeN(temprect);
-       }
-       else if(ibuf->rect) {
-               int *temprect;
-               
-               /* make a copy, to prevent flooding */
-               temprect= MEM_dupallocN(ibuf->rect);
-               
-               for(y=1; y<=ibuf->y; y++) {
-                       /* setup rows */
-                       row1= (char *)(temprect + (y-2)*rowlen);
-                       row2= row1 + 4*rowlen;
-                       row3= row2 + 4*rowlen;
-                       if(y==1)
-                               row1= row2;
-                       else if(y==ibuf->y)
-                               row3= row2;
-                       
-                       cp= (char *)(ibuf->rect + (y-1)*rowlen);
-                       
-                       for(x=0; x<rowlen; x++) {
-                               /*if(cp[3]==0) {*/
-                               if((mask==NULL && cp[3]==0) || (mask && mask[((y-1)*rowlen)+x]==1)) {
-                                       int tot= 0, r=0, g=0, b=0, a=0;
-                                       
-                                       EXTEND_PIXEL(row1, 1);
-                                       EXTEND_PIXEL(row2, 2);
-                                       EXTEND_PIXEL(row3, 1);
-                                       EXTEND_PIXEL(row1+4, 2);
-                                       EXTEND_PIXEL(row3+4, 2);
-                                       if(x!=rowlen-1) {
-                                               EXTEND_PIXEL(row1+8, 1);
-                                               EXTEND_PIXEL(row2+8, 2);
-                                               EXTEND_PIXEL(row3+8, 1);
-                                       }                                       
-                                       if(tot) {
-                                               cp[0]= r/tot;
-                                               cp[1]= g/tot;
-                                               cp[2]= b/tot;
-                                               cp[3]= a/tot;
-                                       }
-                               }
-                               cp+=4;
-                               
-                               if(x!=0) {
-                                       row1+=4; row2+=4; row3+=4;
-                               }
-                       }
-               }
-               
-               MEM_freeN(temprect);
+               /* keep the original buffer up to date. */
+               memcpy(srcbuf, dstbuf, bsize);
+               if(dstmask!=NULL) memcpy(srcmask, dstmask, width*height);
        }
+
+       /* free memory */
+       MEM_freeN(dstbuf);
+       if(dstmask!=NULL) MEM_freeN(dstmask);
 }
 
 /* threadsafe version, only recreates existing maps */
index d2d8e014015f84c4140add653450d8ff4ba001a4..3787675f339da4766981bf723ced730abf5164b8 100644 (file)
@@ -624,6 +624,7 @@ typedef struct MultiresModifierData {
 
 typedef enum {
        eMultiresModifierFlag_ControlEdges = (1<<0),
+       eMultiresModifierFlag_PlainUv = (1<<1),
 } MultiresModifierFlag;
 
 typedef struct FluidsimModifierData {
index 03387c3a63afa82ea64c49f6800c3c6c83fc6f5a..efaf30b02f617e6287e963f56aa472e5d10c6b5d 100644 (file)
@@ -179,6 +179,10 @@ typedef struct bNodeLink {
        
 } bNodeLink;
 
+
+/* link->flag */
+#define NODE_LINKFLAG_HILITE   1
+
 /* the basis for a Node tree, all links and nodes reside internal here */
 /* only re-usable node trees are in the library though, materials and textures allocate own tree struct */
 typedef struct bNodeTree {
index e9d7257d472b6b9285eca8de3d9026331b0e372b..dcf646532c49b822b89d601052499f3f0d870d8e 100644 (file)
@@ -1077,7 +1077,7 @@ typedef struct Scene {
 #define SCE_SNAP_ROTATE                        2
 #define SCE_SNAP_PEEL_OBJECT   4
 #define SCE_SNAP_PROJECT               8
-#define SCE_SNAP_PROJECT_NO_SELF       16
+#define SCE_SNAP_NO_SELF               16
 /* toolsettings->snap_target */
 #define SCE_SNAP_TARGET_CLOSEST        0
 #define SCE_SNAP_TARGET_CENTER 1
@@ -1110,7 +1110,8 @@ typedef struct Scene {
 #define PROP_SHARP             3
 #define PROP_LIN               4
 #define PROP_CONST             5
-#define PROP_RANDOM            6
+#define PROP_RANDOM            6
+#define PROP_MODE_MAX          7
 
 /* toolsettings->proportional */
 #define PROP_EDIT_OFF                  0
index c9865bf3df499fb06c5864bc7878c575a0e85b39..cb593e7deab26a2a6eae730df85fc6451de0e166 100644 (file)
@@ -171,6 +171,10 @@ if(WITH_IMAGE_HDR)
        add_definitions(-DWITH_HDR)
 endif()
 
+if(WITH_IMAGE_FRAMESERVER)
+       add_definitions(-DWITH_FRAMESERVER)
+endif()
+
 if(WITH_AUDASPACE)
        add_definitions(-DWITH_AUDASPACE)
 endif()
index 421c3a606918905fe561b9aeb2a37980a88b1405..5e43ed9b2fbcd039f70b0ad7535c11c30532f792 100644 (file)
@@ -54,6 +54,8 @@ if env['WITH_BF_CINEON']:
 if env['WITH_BF_HDR']:
     defs.append('WITH_HDR')
 
+defs.append('WITH_FRAMESERVER')  # TODO, make optional
+
 if env['WITH_BF_FFMPEG']:
     defs.append('WITH_FFMPEG')
     incs += ' ' + env['BF_FFMPEG_INC']
index d9fbdd7caf2f2dd24155a4d4b62536b01394a13f..e71be8c153e89fbc9366c9d337133ceb74789005 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'
@@ -4407,15 +4407,15 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
                if(!(parm->flag & PROP_REQUIRED) && !(parm->flag & PROP_DYNAMIC)) {
                        switch(parm->type) {
                                case PROP_BOOLEAN:
-                                       if(parm->arraydimension) memcpy(data, &((BooleanPropertyRNA*)parm)->defaultarray, size);
+                                       if(parm->arraydimension) memcpy(data, ((BooleanPropertyRNA*)parm)->defaultarray, size);
                                        else memcpy(data, &((BooleanPropertyRNA*)parm)->defaultvalue, size);
                                        break;
                                case PROP_INT:
-                                       if(parm->arraydimension) memcpy(data, &((IntPropertyRNA*)parm)->defaultarray, size);
+                                       if(parm->arraydimension) memcpy(data, ((IntPropertyRNA*)parm)->defaultarray, size);
                                        else memcpy(data, &((IntPropertyRNA*)parm)->defaultvalue, size);
                                        break;
                                case PROP_FLOAT:
-                                       if(parm->arraydimension) memcpy(data, &((FloatPropertyRNA*)parm)->defaultarray, size);
+                                       if(parm->arraydimension) memcpy(data, ((FloatPropertyRNA*)parm)->defaultarray, size);
                                        else memcpy(data, &((FloatPropertyRNA*)parm)->defaultvalue, size);
                                        break;
                                case PROP_ENUM:
index d2c1b862fee48783571f112f9b8da0a1ec1514aa..ba655915fb62a961c43bf94264d47655bafc7d25 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 9018fd8c71a41025491ea07dbde566b192b568ad..21fa28af01a5b830999579ac38354847af3b2f6e 100644 (file)
@@ -544,7 +544,7 @@ void RNA_api_object(StructRNA *srna)
        /* location of point for test and max distance */
        parm= RNA_def_float_vector(func, "point", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4);
        RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_float(func, "max_dist", sqrt(FLT_MAX), 0.0, FLT_MAX, "", "", 0.0, FLT_MAX);
+       RNA_def_float(func, "max_dist", sqrt(FLT_MAX), 0.0, FLT_MAX, "", "", 0.0, FLT_MAX);
 
        /* return location and normal */
        parm= RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location", "The location on the object closest to the point", -1e4, 1e4);
index 11a1c3a023de51d39de22709b40f00d49f75cb80..048afb594193b8cd88ade71770a74e647ca48083 100644 (file)
@@ -135,7 +135,9 @@ EnumPropertyItem image_type_items[] = {
 #endif
        {R_AVIJPEG, "AVI_JPEG", ICON_FILE_MOVIE, "AVI JPEG", "Output video in AVI JPEG format"},
        {R_AVIRAW, "AVI_RAW", ICON_FILE_MOVIE, "AVI Raw", "Output video in AVI Raw format"},
+#ifdef WITH_FRAMESERVER
        {R_FRAMESERVER, "FRAMESERVER", ICON_FILE_SCRIPT, "Frame Server", "Output image to a frameserver"},
+#endif
 #ifdef WITH_FFMPEG
        {R_H264, "H264", ICON_FILE_MOVIE, "H.264", "Output video in H.264 format"},
        {R_FFMPEG, "FFMPEG", ICON_FILE_MOVIE, "MPEG", "Output video in MPEG format"},
@@ -1184,9 +1186,9 @@ static void rna_def_tool_settings(BlenderRNA  *brna)
        RNA_def_property_ui_icon(prop, ICON_RETOPO, 0);
        RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
 
-       prop= RNA_def_property(srna, "use_snap_project_self", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_PROJECT_NO_SELF);
-       RNA_def_property_ui_text(prop, "Project to Self", "Project into its self (editmode)");
+       prop= RNA_def_property(srna, "use_snap_self", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_NO_SELF);
+       RNA_def_property_ui_text(prop, "Project to Self", "Snap onto its self (editmode)");
        RNA_def_property_ui_icon(prop, ICON_ORTHO, 0);
        RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
        
@@ -2821,7 +2823,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        
        prop= RNA_def_property(srna, "bake_margin", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "bake_filter");
-       RNA_def_property_range(prop, 0, 32);
+       RNA_def_property_range(prop, 0, 64);
        RNA_def_property_ui_text(prop, "Margin", "Amount of pixels to extend the baked result with, as post process filter");
 
        prop= RNA_def_property(srna, "bake_distance", PROP_FLOAT, PROP_NONE);
index 7ea4701dec3eb68432828227ebca614cea25c7e5..73221c47c90c3efa535744ad571bed647aaea2d2 100644 (file)
@@ -940,7 +940,7 @@ static StructRNA *rna_Operator_register(Main *bmain, ReportList *reports, void *
                        rna_Operator_unregister(bmain, ot->ext.srna);
        }
 
-       /* create a new menu type */
+       /* create a new operator type */
        dummyot.ext.srna= RNA_def_struct(&BLENDER_RNA, dummyot.idname, "Operator");
        RNA_def_struct_flag(dummyot.ext.srna, STRUCT_NO_IDPROPERTIES); /* operator properties are registered separately */
        dummyot.ext.data= data;
index 7454cfe78b3de481e0df632f7a5e04d1c9b0d67a..b798b5e7003ef85a5306e525fe74c8c75f02e346 100644 (file)
@@ -108,4 +108,6 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index);
 int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix);
 int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix);
 
+int column_vector_multiplication(float rvec[4], VectorObject *vec, MatrixObject *mat);
+
 #endif /* MATHUTILS_H */
index 76a0994c3aa0a7744e8d55310dc738f52fc0fb8d..3953171f263d7834c9c3a30e90811c101c599a79 100644 (file)
@@ -1612,8 +1612,20 @@ static PyObject *Matrix_mul(PyObject *m1, PyObject *m2)
                }
        }
        else if(mat1) {
+               /*VEC * MATRIX */
+               if(VectorObject_Check(m2)) {
+                       VectorObject *vec2= (VectorObject *)m2;
+                       float tvec[4];
+                       if(BaseMath_ReadCallback(vec2) == -1)
+                               return NULL;
+                       if(column_vector_multiplication(tvec, vec2, mat1) == -1) {
+                               return NULL;
+                       }
+
+                       return newVectorObject(tvec, vec2->size, Py_NEW, Py_TYPE(m2));
+               }
                /*FLOAT/INT * MATRIX */
-               if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) {
+               else if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) {
                        return matrix_mul_float(mat1, scalar);
                }
        }
index 3b05b9a250b91674c15d6f52019a9783b0a1b7bd..2be258a1ef0e73a2778f08b1faaa67b61686badb 100644 (file)
@@ -753,8 +753,30 @@ static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
                        return quat_mul_float(quat2, scalar);
                }
        }
-       else if (quat1) { /* QUAT*FLOAT */
-               if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) {
+       else if (quat1) {
+               /* QUAT * VEC */
+               if (VectorObject_Check(q2)) {
+                       VectorObject *vec2 = (VectorObject *)q2;
+                       float tvec[3];
+
+                       if(vec2->size != 3) {
+                               PyErr_SetString(PyExc_ValueError,
+                                                               "Vector multiplication: "
+                                                               "only 3D vector rotations (with quats) "
+                                               "currently supported");
+                               return NULL;
+                       }
+                       if(BaseMath_ReadCallback(vec2) == -1) {
+                               return NULL;
+                       }
+
+                       copy_v3_v3(tvec, vec2->vec);
+                       mul_qt_v3(quat1->quat, tvec);
+
+                       return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec2));
+               }
+               /* QUAT * FLOAT */
+               else if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) {
                        return quat_mul_float(quat1, scalar);
                }
        }
index e2c958adaa5a348b709988a58f95f01696a10165..a954c07c98d311aad85295fff70a79b723017024 100644 (file)
@@ -37,6 +37,8 @@
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
 
+extern void PyC_LineSpit(void);
+
 #define MAX_DIMENSIONS 4
 
 /* Swizzle axes get packed into a single value that is used as a closure. Each
@@ -1081,7 +1083,7 @@ static PyObject *Vector_isub(PyObject *v1, PyObject *v2)
  * note: vector/matrix multiplication IS NOT COMMUTATIVE!!!!
  * note: assume read callbacks have been done first.
  */
-static int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
+int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
 {
        float vec_cpy[MAX_DIMENSIONS];
        double dot = 0.0f;
@@ -1159,8 +1161,29 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
        }
        else if (vec1) {
                if (MatrixObject_Check(v2)) {
+                       extern void PyC_LineSpit(void);
+
                        /* VEC * MATRIX */
+                       /* this is deprecated!, use the reverse instead */
                        float tvec[MAX_DIMENSIONS];
+
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+                       PyErr_SetString(PyExc_ValueError,
+                                       "(Vector * Matrix) is now removed, reverse the "
+                                       "order (promoted to an Error for Debug builds)");
+                       return NULL;
+#else
+                       printf("Warning: (Vector * Matrix) is now deprecated, "
+                              "reverse the multiplication order in the script.\n");
+                       PyC_LineSpit();
+#endif
+#endif         /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
                        if(BaseMath_ReadCallback((MatrixObject *)v2) == -1)
                                return NULL;
                        if(column_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1) {
@@ -1183,6 +1206,24 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
                        if(BaseMath_ReadCallback(quat2) == -1) {
                                return NULL;
                        }
+
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+                       PyErr_SetString(PyExc_ValueError,
+                                       "(Vector * Quat) is now removed, reverse the "
+                                       "order (promoted to an Error for Debug builds)");
+                       return NULL;
+#else
+                       printf("Warning: (Vector * Quat) is now deprecated, "
+                              "reverse the multiplication order in the script.\n");
+                       PyC_LineSpit();
+#endif
+#endif         /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
                        copy_v3_v3(tvec, vec1->vec);
                        mul_qt_v3(quat2->quat, tvec);
                        return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec1));
@@ -1226,6 +1267,24 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
                if(column_vector_multiplication(rvec, vec, (MatrixObject*)v2) == -1)
                        return NULL;
 
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+                       PyErr_SetString(PyExc_ValueError,
+                                                       "(Vector *= Matrix) is now removed, reverse the "
+                                                       "order (promoted to an Error for Debug builds) "
+                                       "and uses the non in-place multiplication.");
+                       return NULL;
+#else
+                       printf("Warning: (Vector *= Matrix) is now deprecated, "
+                                  "reverse the (non in-place) multiplication order in the script.\n");
+                       PyC_LineSpit();
+#endif
+#endif         /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
                memcpy(vec->vec, rvec, sizeof(float) * vec->size);
        }
        else if (QuaternionObject_Check(v2)) {
@@ -1242,6 +1301,25 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
                if(BaseMath_ReadCallback(quat2) == -1) {
                        return NULL;
                }
+
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+                       PyErr_SetString(PyExc_ValueError,
+                                                       "(Vector *= Quat) is now removed, reverse the "
+                                                       "order (promoted to an Error for Debug builds) "
+                                       "and uses the non in-place multiplication.");
+                       return NULL;
+#else
+                       printf("Warning: (Vector *= Quat) is now deprecated, "
+                                  "reverse the (non in-place) multiplication order in the script.\n");
+                       PyC_LineSpit();
+#endif
+#endif         /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
                mul_qt_v3(quat2->quat, vec->vec);
        }
        else if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* VEC *= FLOAT */
index 583b792f24053941f897576c67c79463cfe4eea5..b385b507707876731d2dd3c8c28e42b487f8da48 100644 (file)
@@ -3375,7 +3375,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
                                
                                /* test for 100% transparant */
                                ok= 1;
-                               if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f && (ma->mode & MA_TRANSP)) { 
+                               if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f && (ma->mode & MA_TRANSP) && (ma->mode & MA_RAYMIRROR)==0) { 
                                        ok= 0;
                                        /* texture on transparency? */
                                        for(a=0; a<MAX_MTEX; a++) {
@@ -5685,7 +5685,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
        Object *camera;
        float mat[4][4];
        float amb[3];
-       const short onlyselected= !ELEM3(type, RE_BAKE_LIGHT, RE_BAKE_ALL, RE_BAKE_SHADOW);
+       const short onlyselected= !ELEM4(type, RE_BAKE_LIGHT, RE_BAKE_ALL, RE_BAKE_SHADOW, RE_BAKE_AO);
        const short nolamps= ELEM3(type, RE_BAKE_NORMALS, RE_BAKE_TEXTURE, RE_BAKE_DISPLACEMENT);
 
        re->main= bmain;
@@ -5778,6 +5778,14 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
                if(re->r.mode & R_RAYTRACE)
                        makeraytree(re);
        
+       /* point density texture */
+       if(!re->test_break(re->tbh))
+               make_pointdensities(re);
+
+       /* voxel data texture */
+       if(!re->test_break(re->tbh))
+               make_voxeldata(re);
+
        /* occlusion */
        if((re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && !re->test_break(re->tbh))
                if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
index 3aca334cffe096d74a57fd6a6d8e45a15f2972ee..a7e19c8db4f474123ee73f975aaf7e3847e43424 100644 (file)
@@ -2577,27 +2577,7 @@ void RE_bake_ibuf_filter(ImBuf *ibuf, char *mask, const int filter)
 
        /* Margin */
        if(filter) {
-               char *temprect;
-               int i;
-
-               /* extend the mask +2 pixels from the image,
-                * this is so colors dont blend in from outside */
-
-               for(i=0; i< filter; i++)
-                       IMB_mask_filter_extend(mask, ibuf->x, ibuf->y);
-
-               temprect = MEM_dupallocN(mask);
-
-               /* expand twice to clear this many pixels, so they blend back in */
-               IMB_mask_filter_extend(temprect, ibuf->x, ibuf->y);
-               IMB_mask_filter_extend(temprect, ibuf->x, ibuf->y);
-
-               /* clear all pixels in the margin */
-               IMB_mask_clear(ibuf, temprect, FILTER_MASK_MARGIN);
-               MEM_freeN(temprect);
-
-               for(i= 0; i < filter; i++)
-                       IMB_filter_extend(ibuf, mask);
+               IMB_filter_extend(ibuf, mask, filter);
        }
 
        /* if the bake results in new alpha then change the image setting */
index 67294a8eb53a6ed2b52514b8e1cec9ae7f5a50c7..e6325e2101a4bd356eff34234cd029d83080b56f 100644 (file)
@@ -272,6 +272,7 @@ void                WM_operator_py_idname(char *to, const char *from);
 /* *************** menu types ******************** */
 struct MenuType                *WM_menutype_find(const char *idname, int quiet);
 int                                    WM_menutype_add(struct MenuType* mt);
+int                                    WM_menutype_contains(struct MenuType* mt);
 void                           WM_menutype_freelink(struct MenuType* mt);
 void                           WM_menutype_free(void);
 
index bcd5cf38f8835740c1ec7dbe4101727db099f12b..a535c0bc1f8e783439e8aa0451de86ab4f81ba5a 100644 (file)
@@ -175,6 +175,12 @@ int WM_menutype_add(MenuType* mt)
        return 1;
 }
 
+/* inefficient but only used for tooltip code */
+int WM_menutype_contains(MenuType* mt)
+{
+       return (mt != NULL && BLI_findindex(&menutypes, mt) != -1);
+}
+
 void WM_menutype_freelink(MenuType* mt)
 {
        BLI_freelinkN(&menutypes, mt);
index ed28696ef69e291fe34bfbf2d39c0383d9d692b7..4c280fe43411f12d08c96aebe65bfe73408e29dc 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 7bf5fe9dde34f07e4934859f7bbf175786078497..548d272ffd2c1a8c36ab9a659099b0dfbcd035cd 100644 (file)
@@ -136,7 +136,6 @@ int RE_RenderInProgress(struct Render *re){return 0;}
 struct Scene *RE_GetScene(struct Render *re){return (struct Scene *) NULL;}
 void RE_Database_Free(struct Render *re){}
 void RE_FreeRender(struct Render *re){}
-void RE_shade_external(struct Render *re, struct ShadeInput *shi, struct ShadeResult *shr){}
 void RE_DataBase_GetView(struct Render *re, float mat[][4]){}
 int externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta){return 0;}
 float texture_value_blend(float tex, float out, float fact, float facg, int blendtype, int flip){return 0.0f;}
index fddd6d286dbd6533832121d7eb7210d73c84150f..36209dbda7817e90ffa6961cb5223fd6647bf87b 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 3a25df73f9b903de0316cbbb06c1e310f8b62dcb..92be769ed71bf241bd54da6f3a30c9618a9abed3 100644 (file)
@@ -1184,46 +1184,10 @@ void PyObjectPlus::SetDeprecationWarnings(bool ignoreDeprecationWarnings)
        m_ignore_deprecation_warnings = ignoreDeprecationWarnings;
 }
 
-void PyDebugLine()
-{
-       // import sys; print '\t%s:%d' % (sys._getframe(0).f_code.co_filename, sys._getframe(0).f_lineno)
-
-       PyObject *getframe, *frame;
-       PyObject *f_lineno, *f_code, *co_filename;
-
-       getframe = PySys_GetObject((char *)"_getframe"); // borrowed
-       if (getframe) {
-               frame = PyObject_CallObject(getframe, NULL);
-               if (frame) {
-                       f_lineno= PyObject_GetAttrString(frame, "f_lineno");
-                       f_code= PyObject_GetAttrString(frame, "f_code");
-                       if (f_lineno && f_code) {
-                               co_filename= ((PyCodeObject *)f_code)->co_filename; /* borrow */
-                               if (co_filename) {
-
-                                       printf("\t%s:%d\n", _PyUnicode_AsString(co_filename), (int)PyLong_AsSsize_t(f_lineno));
-
-                                       Py_DECREF(f_lineno);
-                                       Py_DECREF(f_code);
-                                       Py_DECREF(frame);
-                                       return;
-                               }
-                       }
-                       
-                       Py_XDECREF(f_lineno);
-                       Py_XDECREF(f_code);
-                       Py_DECREF(frame);
-               }
-
-       }
-       PyErr_Clear();
-       printf("\tERROR - Could not access sys._getframe(0).f_lineno or sys._getframe().f_code.co_filename\n");
-}
-
 void PyObjectPlus::ShowDeprecationWarning_func(const char* old_way,const char* new_way)
 {
        printf("Method %s is deprecated, please use %s instead.\n", old_way, new_way);
-       PyDebugLine();
+       PyC_LineSpit();
 }
 
 void PyObjectPlus::ClearDeprecationWarning()
index 587f3e4ef351c6379aa79b3e44c1bef5e4f39e1c..51cfb5471c062623a4f2417a78bfd8d27503550c 100644 (file)
@@ -55,6 +55,7 @@
 #ifdef USE_MATHUTILS
 extern "C" {
 #include "../../blender/python/mathutils/mathutils.h" /* so we can have mathutils callbacks */
+#include "../../blender/python/generic/py_capi_utils.h" /* for PyC_LineSpit only */
 }
 #endif
 
index 0e08f157a6a77374ba637a1b096b759f25343647..48ba09e67d284b44df015724cc57beaaa72b1797 100644 (file)
@@ -89,7 +89,7 @@ SCA_Joystick *SCA_Joystick::GetInstance( short int joyindex )
        {
                int i;
                // do this once only
-               if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1 ){
+               if(SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO) == -1 ){
                        echo("Error-Initializing-SDL: " << SDL_GetError());
                        return NULL;
                }
@@ -124,7 +124,7 @@ void SCA_Joystick::ReleaseInstance()
                        m_instance[i]= NULL;
                }
 
-               SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
+               SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO);
 #endif
        }
 }
index ea0b00e52fd53f6adb1f43c789a373d864d74f82..0aa36b4cd5f9df94226fc23924ab7ae3870bac07 100644 (file)
@@ -1220,7 +1220,7 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
                        projmat.setValue(m_overrideCamProjMat.getPointer());
                        cam->SetProjectionMatrix(projmat);
                }
-       } else if (cam->hasValidProjectionMatrix() && !cam->GetViewport() )
+       } else if (cam->hasValidProjectionMatrix())
        {
                m_rasterizer->SetProjectionMatrix(cam->GetProjectionMatrix());
        } else
index d1696223ec6115059eaa5ae4842e02c1c51cea08..8fd0d6e7099221ed4320b6abfe5f9f1a1500ecde 100644 (file)
@@ -196,7 +196,7 @@ add_test(export_x3d_cube ${TEST_BLENDER_EXE}
        --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
        --run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_cube.x3d',use_selection=False\)
        --md5_source=${TEST_OUT_DIR}/export_x3d_cube.x3d
-       --md5=6ae36be272d6f84c697e84a8b6463273 --md5_method=FILE
+       --md5=5e804c689896116331fa190a9fabbad4 --md5_method=FILE
 )
 
 add_test(export_x3d_nurbs ${TEST_BLENDER_EXE}
@@ -212,7 +212,7 @@ add_test(export_x3d_all_objects ${TEST_BLENDER_EXE}
        --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
        --run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_all_objects.x3d',use_selection=False\)
        --md5_source=${TEST_OUT_DIR}/export_x3d_all_objects.x3d
-       --md5=bba48ca191e8891adb27c59ed4ce4735 --md5_method=FILE
+       --md5=2809ec13a4cab55d265ce7525c5db1b7 --md5_method=FILE
 )
 
 
@@ -261,7 +261,7 @@ add_test(export_3ds_all_objects ${TEST_BLENDER_EXE}
        --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
        --run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_all_objects.3ds',use_selection=False\)
        --md5_source=${TEST_OUT_DIR}/export_3ds_all_objects.3ds
-       --md5=cdf8fa8475fda0b9ef565ac09339254b --md5_method=FILE
+       --md5=0940ea889498cd437d503670738639ae --md5_method=FILE
 )
 
 
@@ -273,7 +273,7 @@ add_test(export_fbx_cube ${TEST_BLENDER_EXE}
        --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
        --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_cube.fbx',use_selection=False,use_metadata=False\)
        --md5_source=${TEST_OUT_DIR}/export_fbx_cube.fbx
-       --md5=642a5a1fa199d5b9bbf1643519ae974d --md5_method=FILE
+       --md5=83dca99a0cb338852b8c85951a44c68a --md5_method=FILE
 )
 
 add_test(export_fbx_nurbs ${TEST_BLENDER_EXE}
@@ -281,7 +281,7 @@ add_test(export_fbx_nurbs ${TEST_BLENDER_EXE}
        --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
        --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_nurbs.fbx',use_selection=False,use_metadata=False\)
        --md5_source=${TEST_OUT_DIR}/export_fbx_nurbs.fbx
-       --md5=ec1e8965bdbc3bf70707d77f82c2cb9c --md5_method=FILE
+       --md5=c7d9491ffa6264e820ed1e12df63f871 --md5_method=FILE
 )
 
 add_test(export_fbx_all_objects ${TEST_BLENDER_EXE}
@@ -289,5 +289,5 @@ add_test(export_fbx_all_objects ${TEST_BLENDER_EXE}
        --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
        --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_all_objects.fbx',use_selection=False,use_metadata=False\)
        --md5_source=${TEST_OUT_DIR}/export_fbx_all_objects.fbx
-       --md5=af3b65665687ac92e4aba07b017d87fe --md5_method=FILE
+       --md5=22867f82e1615fd1eae18cfaac8ba035 --md5_method=FILE
 )
index 11c7ce646b9e3e5e118a9ec5cb150bb8606e6542..856e1f6d27201956dc0d26eea52bf47ab8785c59 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...")