diff options
author | Mike Erwin <significant.bit@gmail.com> | 2011-08-02 05:01:56 +0400 |
---|---|---|
committer | Mike Erwin <significant.bit@gmail.com> | 2011-08-02 05:01:56 +0400 |
commit | dc2609da3d08ff2dde1747201ef4e0ebb17d5bd9 (patch) | |
tree | b18b8fa9a8eba6a9de70514def129b53f4733aaa | |
parent | 19b38034f989089e359b9a4ea1e65fcbe8ffa18c (diff) | |
parent | c965d1d2ccfd57926476cb5c091afa35c6de217f (diff) |
svn merge -r38814:38905 https://svn.blender.org/svnroot/bf-blender/trunk/blender .merwin-spacenav
51 files changed, 1053 insertions, 482 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f833aef31e..d91d4a1349d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1069,20 +1069,34 @@ if(APPLE OR WIN32) endif() endif() +# See TEST_SSE_SUPPORT() for how this is defined. + if(WITH_RAYOPTIMIZATION) if(CMAKE_COMPILER_IS_GNUCC) - if(SUPPORT_SSE_BUILD) - set(PLATFORM_CFLAGS " -msse ${PLATFORM_CFLAGS}") - add_definitions(-D__SSE__ -D__MMX__) - endif() - if(SUPPORT_SSE2_BUILD) - set(PLATFORM_CFLAGS " -msse2 ${PLATFORM_CFLAGS}") - add_definitions(-D__SSE2__) - if(NOT SUPPORT_SSE_BUILD) # dont double up - add_definitions(-D__MMX__) - endif() + set(_sse "-msse") + set(_sse2 "-msse2") + elseif(MSVC) + set(_sse "/arch:SSE") + set(_sse2 "/arch:SSE2") + else() + message(WARNING "SSE flags for this compiler not known") + set(_sse) + set(_sse2) + endif() + + if(SUPPORT_SSE_BUILD) + set(PLATFORM_CFLAGS " ${_sse} ${PLATFORM_CFLAGS}") + add_definitions(-D__SSE__ -D__MMX__) + endif() + if(SUPPORT_SSE2_BUILD) + set(PLATFORM_CFLAGS " ${_sse2} ${PLATFORM_CFLAGS}") + add_definitions(-D__SSE2__) + if(NOT SUPPORT_SSE_BUILD) # dont double up + add_definitions(-D__MMX__) endif() endif() + unset(_sse) + unset(_sse2) endif() if(WITH_IMAGE_OPENJPEG) diff --git a/build_files/cmake/cmake_consistency_check.py b/build_files/cmake/cmake_consistency_check.py index ba71603b007..880cb582f1e 100755 --- a/build_files/cmake/cmake_consistency_check.py +++ b/build_files/cmake/cmake_consistency_check.py @@ -39,7 +39,7 @@ def replace_line(f, i, text, keep_indent=True): file_handle = open(f, 'r') data = file_handle.readlines() file_handle.close() - + l = data[i] ws = l[:len(l) - len(l.lstrip())] diff --git a/build_files/cmake/cmake_netbeans_project.py b/build_files/cmake/cmake_netbeans_project.py index 8060574580c..02dfec06c0b 100755 --- a/build_files/cmake/cmake_netbeans_project.py +++ b/build_files/cmake/cmake_netbeans_project.py @@ -37,7 +37,7 @@ from project_info import (SIMPLE_PROJECTFILE, source_list, is_project_file, is_c_header, - is_py, + # is_py, cmake_advanced_info, cmake_compiler_defines, ) diff --git a/build_files/cmake/cmake_qtcreator_project.py b/build_files/cmake/cmake_qtcreator_project.py index d8993c3197a..2a2774c9944 100755 --- a/build_files/cmake/cmake_qtcreator_project.py +++ b/build_files/cmake/cmake_qtcreator_project.py @@ -33,7 +33,7 @@ example linux usage from project_info import (SIMPLE_PROJECTFILE, SOURCE_DIR, - CMAKE_DIR, + # CMAKE_DIR, PROJECT_DIR, source_list, is_project_file, diff --git a/doc/python_api/rst/bge.constraints.rst b/doc/python_api/rst/bge.constraints.rst index 882bbc39b9f..12ce8617457 100644 --- a/doc/python_api/rst/bge.constraints.rst +++ b/doc/python_api/rst/bge.constraints.rst @@ -1,28 +1,47 @@ -Game Engine bge.constraints Module -================================== +Physics Constraints (bge.constraints) +===================================== -.. note:: - This documentation is still very weak, and needs some help! - -.. function:: createConstraint([obj1, [obj2, [restLength, [restitution, [damping]]]]]) +.. function:: createConstraint(physicsid, physicsid2, constrainttype, [pivotX, pivotY, pivotZ, [axisX, axisY, axisZ, [flag]]]]) Creates a constraint. - :arg obj1: first object on Constraint - :type obj1: :class:'bge.types.KX_GameObject' #I think, there is no error when I use one + :arg physicsid: the physics id of the first object in constraint + :type physicsid: int - :arg obj2: second object on Constraint - :type obj2: :class:'bge.types.KX_GameObject' #too + :arg physicsid2: the physics id of the second object in constraint + :type physicsid2: int - :arg restLength: #to be filled - :type restLength: float + :arg constrainttype: the type of the constraint. The constraint types are: - :arg restitution: #to be filled - :type restitution: float + - :class:`POINTTOPOINT_CONSTRAINT` + - :class:`LINEHINGE_CONSTRAINT` + - :class:`ANGULAR_CONSTRAINT` + - :class:`CONETWIST_CONSTRAINT` + - :class:`VEHICLE_CONSTRAINT` - :arg damping: #to be filled - :type damping: float + :type constrainttype: int + + :arg pivotX: pivot X position + :type pivotX: float + + :arg pivotY: pivot Y position + :type pivotY: float + + :arg pivotZ: pivot Z position + :type pivotZ: float + + :arg axisX: X axis + :type axisX: float + + :arg axisY: Y axis + :type axisY: float + + :arg axisZ: Z axis + :type axisZ: float + + :arg flag: .. to do + :type flag: int .. attribute:: error @@ -49,7 +68,7 @@ Game Engine bge.constraints Module :type constraintId: int :return: a vehicle constraint object. - :rtype: :class:'KX_VehicleWrapper' + :rtype: :class:`bge.types.KX_VehicleWrapper` .. function:: removeConstraint(constraintId) @@ -60,10 +79,10 @@ Game Engine bge.constraints Module .. function:: setCcdMode(ccdMode) - ..note:: + .. note:: Very experimental, not recommended - Sets the CCD mode in the Physics Environment. + Sets the CCD (Continous Colision Detection) mode in the Physics Environment. :arg ccdMode: The new CCD mode. :type ccdMode: int @@ -73,21 +92,21 @@ Game Engine bge.constraints Module .. note:: Reasonable default is 0.02 (if units are meters) - Sets the contact breaking treshold in the Physics Environment. + Sets tresholds to do with contact point management. :arg breakingTreshold: The new contact breaking treshold. :type breakingTreshold: float .. function:: setDeactivationAngularTreshold(angularTreshold) - Sets the deactivation angular treshold. + Sets the angular velocity treshold. :arg angularTreshold: New deactivation angular treshold. :type angularTreshold: float .. function:: setDeactivationLinearTreshold(linearTreshold) - Sets the deactivation linear treshold. + Sets the linear velocity treshold. :arg linearTreshold: New deactivation linear treshold. :type linearTreshold: float @@ -104,21 +123,20 @@ Game Engine bge.constraints Module Sets the debug mode. Debug modes: - - No debug: 0 - - Draw wireframe: 1 - - Draw Aabb: 2 #What's Aabb? - - Draw freatures text: 4 - - Draw contact points: 8 - - No deactivation: 16 - - No help text: 32 - - Draw text: 64 - - Profile timings: 128 - - Enable sat comparision: 256 - - Disable Bullet LCP: 512 - - Enable CCD: 1024 - - Draw Constraints: #(1 << 11) = ? - - Draw Constraint Limits: #(1 << 12) = ? - - Fast Wireframe: #(1 << 13) = ? + - :class:`DBG_NODEBUG` + - :class:`DBG_DRAWWIREFRAME` + - :class:`DBG_DRAWAABB` + - :class:`DBG_DRAWFREATURESTEXT` + - :class:`DBG_DRAWCONTACTPOINTS` + - :class:`DBG_NOHELPTEXT` + - :class:`DBG_DRAWTEXT` + - :class:`DBG_PROFILETIMINGS` + - :class:`DBG_ENABLESATCOMPARISION` + - :class:`DBG_DISABLEBULLETLCP` + - :class:`DBG_ENABLECCD` + - :class:`DBG_DRAWCONSTRAINTS` + - :class:`DBG_DRAWCONSTRAINTLIMITS` + - :class:`DBG_FASTWIREFRAME` :arg mode: The new debug mode. :type mode: int @@ -138,7 +156,10 @@ Game Engine bge.constraints Module .. function:: setLinearAirDamping(damping) - Not implemented. + .. note:: + Not implemented. + + Sets the linear air damping for rigidbodies. .. function:: setNumIterations(numiter) @@ -156,10 +177,10 @@ Game Engine bge.constraints Module .. function:: setSolverDamping(damping) - ..note:: + .. note:: Very experimental, not recommended - Sets the solver damping. + Sets the damper constant of a penalty based solver. :arg damping: New damping for the solver. :type damping: float @@ -169,7 +190,7 @@ Game Engine bge.constraints Module .. note:: Very experimental, not recommended - Sets the solver tau. + Sets the spring constant of a penalty based solver. :arg tau: New tau for the solver. :type tau: float @@ -189,7 +210,7 @@ Game Engine bge.constraints Module .. note:: Very experimental, not recommended - Sets the sor constant. + Sets the successive overrelaxation constant. :arg sor: New sor value. :type sor: float @@ -197,3 +218,136 @@ Game Engine bge.constraints Module .. function:: setUseEpa(epa) Not implemented. + +.. data:: DBG_NODEBUG + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + No debug. + +.. data:: DBG_DRAWWIREFRAME + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Draw wireframe in debug. + +.. data:: DBG_DRAWAABB + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Draw Axis Aligned Bounding Box in debug. + +.. data:: DBG_DRAWFREATURESTEXT + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Draw freatures text in debug. + +.. data:: DBG_DRAWCONTACTPOINTS + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Draw contact points in debug. + +.. data:: DBG_NOHELPTEXT + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Debug without help text. + +.. data:: DBG_DRAWTEXT + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Draw text in debug. + +.. data:: DBG_PROFILETIMINGS + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Draw profile timings in debug. + +.. data:: DBG_ENABLESATCOMPARISION + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Enable sat comparision in debug. + +.. data:: DBG_DISABLEBULLETLCP + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Disable Bullet LCP. + +.. data:: DBG_ENABLECCD + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Enable Continous Colision Detection in debug. + +.. data:: DBG_DRAWCONSTRAINTS + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Draw constraints in debug. + +.. data:: DBG_DRAWCONSTRAINTLIMITS + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Draw constraint limits in debug. + +.. data:: DBG_FASTWIREFRAME + + .. note:: + Debug mode to be used with function :class:`setDebugMode` + + Draw a fast wireframe in debug. + +.. data:: POINTTOPOINT_CONSTRAINT + + .. note:: + Constraint type to be used with function :class:`createConstraint` + + .. to do + +.. data:: LINEHINGE_CONSTRAINT + + .. note:: + Constraint type to be used with function :class:`createConstraint` + + .. to do + +.. data:: ANGULAR_CONSTRAINT + + .. note:: + Constraint type to be used with function :class:`createConstraint` + + .. to do + +.. data:: CONETWIST_CONSTRAINT + + .. note:: + Constraint type to be used with function :class:`createConstraint` + + .. to do + +.. data:: VEHICLE_CONSTRAINT + + .. note:: + Constraint type to be used with function :class:`createConstraint` + + .. to do diff --git a/doc/python_api/rst/bge.events.rst b/doc/python_api/rst/bge.events.rst index cc76ecded85..074e928f0d8 100644 --- a/doc/python_api/rst/bge.events.rst +++ b/doc/python_api/rst/bge.events.rst @@ -1,6 +1,6 @@ -Game Engine bge.events Module -============================= +Game Keys (bge.events) +====================== ***** Intro diff --git a/doc/python_api/rst/bge.logic.rst b/doc/python_api/rst/bge.logic.rst index f7163ea928e..128f87f76bd 100644 --- a/doc/python_api/rst/bge.logic.rst +++ b/doc/python_api/rst/bge.logic.rst @@ -1,6 +1,7 @@ -Game Engine bge.logic Module -============================ +Game Logic (bge.logic) +====================== + ***** Intro ***** diff --git a/doc/python_api/rst/bge.render.rst b/doc/python_api/rst/bge.render.rst index 9f17455601b..10514049a8a 100644 --- a/doc/python_api/rst/bge.render.rst +++ b/doc/python_api/rst/bge.render.rst @@ -1,6 +1,6 @@ -Game Engine bge.render Module -============================= +Rasterizer (bge.render) +======================= ***** Intro @@ -16,8 +16,8 @@ Intro import bge.render import bge.logic - # SCALE sets the speed of motion - SCALE=[1, 0.5] + # scale sets the speed of motion + scale = 1.0, 0.5 co = bge.logic.getCurrentController() obj = co.getOwner() @@ -27,8 +27,8 @@ Intro # Transform the mouse coordinates to see how far the mouse has moved. def mousePos(): - x = (bge.render.getWindowWidth()/2 - mouse.getXPosition())*SCALE[0] - y = (bge.render.getWindowHeight()/2 - mouse.getYPosition())*SCALE[1] + x = (bge.render.getWindowWidth() / 2 - mouse.getXPosition()) * scale[0] + y = (bge.render.getWindowHeight() / 2 - mouse.getYPosition()) * scale[1] return (x, y) pos = mousePos() @@ -43,7 +43,7 @@ Intro bge.logic.addActiveActuator(wmotion, True) # Centre the mouse - bge.render.setMousePosition(bge.render.getWindowWidth()/2, bge.render.getWindowHeight()/2) + bge.render.setMousePosition(bge.render.getWindowWidth() / 2, bge.render.getWindowHeight() / 2) ********* Constants diff --git a/doc/python_api/rst/bge.texture.rst b/doc/python_api/rst/bge.texture.rst index 996f79a313a..f3e9f98dded 100644 --- a/doc/python_api/rst/bge.texture.rst +++ b/doc/python_api/rst/bge.texture.rst @@ -1,10 +1,6 @@ -Game Engine bge.texture Module -============================== - -.. note:: - This documentation is still very weak, and needs some help! Right now they are mostly a collection - of the docstrings found in the bge.texture source code + some random places filled with text. +Video Texture (bge.texture) +=========================== ***** Intro diff --git a/doc/python_api/rst/bge.types.rst b/doc/python_api/rst/bge.types.rst index e42b362c771..36ef9154e17 100644 --- a/doc/python_api/rst/bge.types.rst +++ b/doc/python_api/rst/bge.types.rst @@ -1,6 +1,6 @@ -Game Engine bge.types Module -============================= +Game Types (bge.types) +====================== .. module:: bge.types diff --git a/doc/python_api/rst/bgl.rst b/doc/python_api/rst/bgl.rst index 76b7442f2c5..236bfafb295 100644 --- a/doc/python_api/rst/bgl.rst +++ b/doc/python_api/rst/bgl.rst @@ -1,6 +1,6 @@ -bgl module (OpenGL wrapper) -=========================== +OpenGL Wrapper (bgl) +==================== .. module:: bgl @@ -71,8 +71,8 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. .. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/begin.html>`_ :type mode: Enumerated constant - :arg mode: Specifies the primitive that will be create from vertices between glBegin and - glEnd. + :arg mode: Specifies the primitive that will be create from vertices between + glBegin and glEnd. .. function:: glBindTexture(target, texture): @@ -1886,4 +1886,3 @@ class Buffer: the Buffer. If a template is not passed in all fields will be initialized to 0. :rtype: Buffer object :return: The newly created buffer as a PyObject. - diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index 6b514cf9eb1..f8561c719bc 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -416,6 +416,7 @@ def pymodule2sphinx(BASEPATH, module_name, module, title): del key, descr classes = [] + submodules = [] for attribute in module_dir: if not attribute.startswith("_"): @@ -437,6 +438,8 @@ def pymodule2sphinx(BASEPATH, module_name, module, title): py_c_func2sphinx("", fw, module_name, None, attribute, value, is_class=False) elif value_type == type: classes.append((attribute, value)) + elif issubclass(value_type, types.ModuleType): + submodules.append((attribute, value)) elif value_type in (bool, int, float, str, tuple): # constant, not much fun we can do here except to list it. # TODO, figure out some way to document these! @@ -444,12 +447,26 @@ def pymodule2sphinx(BASEPATH, module_name, module, title): write_indented_lines(" ", fw, "constant value %s" % repr(value), False) fw("\n") else: - print("\tnot documenting %s.%s" % (module_name, attribute)) + print("\tnot documenting %s.%s of %r type" % (module_name, attribute, value_type.__name__)) continue attribute_set.add(attribute) # TODO, more types... + # TODO, bpy_extras does this already, mathutils not. + """ + if submodules: + fw("\n" + "**********\n" + "Submodules\n" + "**********\n" + "\n" + ) + for attribute, submod in submodules: + fw("* :mod:`%s.%s`\n" % (module_name, attribute)) + fw("\n") + """ + # write collected classes now for (type_name, value) in classes: # May need to be its own function diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index 5f27eab9d8c..8f2df4c396d 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -1568,6 +1568,8 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr) GHOST_TInt32 delta; double deltaF = [event deltaY]; + + if (deltaF == 0.0) deltaF = [event deltaX]; // make blender decide if it's horizontal scroll if (deltaF == 0.0) break; //discard trackpad delta=0 events delta = deltaF > 0.0 ? 1 : -1; diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 2a3eb74d1e2..1b43fa92bb2 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -52,6 +52,7 @@ #define _WIN32_IE 0x0501 /* shipped before XP, so doesn't impose additional requirements */ #endif #include <shlobj.h> +#include <tlhelp32.h> // win64 doesn't define GWL_USERDATA #ifdef WIN32 @@ -1056,11 +1057,16 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, * procedure of the top-level window being activated. If the windows use different input queues, * the message is sent asynchronously, so the window is activated immediately. */ + { + GHOST_ModifierKeys modifiers; + modifiers.clear(); + system->storeModifierKeys(modifiers); event = processWindowEvent(LOWORD(wParam) ? GHOST_kEventWindowActivate : GHOST_kEventWindowDeactivate, window); /* WARNING: Let DefWindowProc handle WM_ACTIVATE, otherwise WM_MOUSEWHEEL will not be dispatched to OUR active window if we minimize one of OUR windows. */ lResult = ::DefWindowProc(hwnd, msg, wParam, lParam); break; + } case WM_PAINT: /* An application sends the WM_PAINT message when the system or another application * makes a request to paint a portion of an application's window. The message is sent @@ -1284,8 +1290,32 @@ int GHOST_SystemWin32::toggleConsole(int action) { case 3: //hide if no console { - CONSOLE_SCREEN_BUFFER_INFO csbi = {{0}}; - if(!GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi) || csbi.dwCursorPosition.X || csbi.dwCursorPosition.Y>1) + DWORD sp = GetCurrentProcessId(); + HANDLE ptree = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + PROCESSENTRY32 e = {0}; e.dwSize = sizeof(PROCESSENTRY32); + + if( Process32First(ptree, &e)) { + do { //Searches for Blender's PROCESSENTRY32 + if (e.th32ProcessID == sp) { + sp = e.th32ParentProcessID; + Process32First(ptree, &e); + do { //Got parent id, searches for its PROCESSENTRY32 + if (e.th32ProcessID == sp) { + if(strcmp("explorer.exe",e.szExeFile)==0) + { //If explorer, hide cmd + ShowWindow(GetConsoleWindow(),SW_HIDE); + m_consoleStatus = 0; + } + break; + } + + } while( Process32Next(ptree, &e)); + break; + } + } while( Process32Next(ptree, &e)); + } + + CloseHandle(ptree); break; } case 0: //hide diff --git a/release/scripts/modules/addon_utils.py b/release/scripts/modules/addon_utils.py index 5aed0581ea9..22936f4c209 100644 --- a/release/scripts/modules/addon_utils.py +++ b/release/scripts/modules/addon_utils.py @@ -16,7 +16,7 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> __all__ = ( "paths", @@ -26,7 +26,7 @@ __all__ = ( "disable", "reset_all", "module_bl_info", -) + ) import bpy as _bpy @@ -129,7 +129,12 @@ def modules(module_cache): error_duplicates = True elif mod.__time__ != os.path.getmtime(mod_path): - print("reloading addon:", mod_name, mod.__time__, os.path.getmtime(mod_path), mod_path) + print("reloading addon:", + mod_name, + mod.__time__, + os.path.getmtime(mod_path), + mod_path, + ) del module_cache[mod_name] mod = None @@ -144,7 +149,9 @@ def modules(module_cache): del modules_stale mod_list = list(module_cache.values()) - mod_list.sort(key=lambda mod: (mod.bl_info['category'], mod.bl_info['name'])) + mod_list.sort(key=lambda mod: (mod.bl_info['category'], + mod.bl_info['name'], + )) return mod_list @@ -164,8 +171,9 @@ def check(module_name): loaded_state = mod and getattr(mod, "__addon_enabled__", Ellipsis) if loaded_state is Ellipsis: - print("Warning: addon-module %r found module but without" - " __addon_enabled__ field, possible name collision from file: %r" % + print("Warning: addon-module %r found module " + "but without __addon_enabled__ field, " + "possible name collision from file: %r" % (module_name, getattr(mod, "__file__", "<unknown>"))) loaded_state = False @@ -208,7 +216,8 @@ def enable(module_name, default_set=True): return None mod.__addon_enabled__ = False - # Split registering up into 3 steps so we can undo if it fails par way through + # Split registering up into 3 steps so we can undo + # if it fails par way through. # 1) try import try: mod = __import__(module_name) @@ -255,8 +264,9 @@ def disable(module_name, default_set=True): import sys mod = sys.modules.get(module_name) - # possible this addon is from a previous session and didnt load a module this time. - # so even if the module is not found, still disable the addon in the user prefs. + # possible this addon is from a previous session and didnt load a + # module this time. So even if the module is not found, still disable + # the addon in the user prefs. if mod: mod.__addon_enabled__ = False @@ -311,7 +321,22 @@ def reset_all(reload_scripts=False): disable(mod_name) -def module_bl_info(mod, info_basis={"name": "", "author": "", "version": (), "blender": (), "api": 0, "location": "", "description": "", "wiki_url": "", "tracker_url": "", "support": 'COMMUNITY', "category": "", "warning": "", "show_expanded": False}): +def module_bl_info(mod, info_basis={"name": "", + "author": "", + "version": (), + "blender": (), + "api": 0, + "location": "", + "description": "", + "wiki_url": "", + "tracker_url": "", + "support": 'COMMUNITY', + "category": "", + "warning": "", + "show_expanded": False, + } + ): + addon_info = getattr(mod, "bl_info", {}) # avoid re-initializing diff --git a/release/scripts/modules/bpy/__init__.py b/release/scripts/modules/bpy/__init__.py index 0add2b3e6cd..a43b42e49a1 100644 --- a/release/scripts/modules/bpy/__init__.py +++ b/release/scripts/modules/bpy/__init__.py @@ -16,7 +16,7 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> """ Give access to blender data and utility functions. @@ -31,7 +31,7 @@ __all__ = ( "props", "types", "utils", -) + ) # internal blender C module @@ -49,7 +49,8 @@ def _main(): # Possibly temp. addons path from os.path import join, dirname, normpath - _sys.path.append(normpath(join(dirname(__file__), "..", "..", "addons", "modules"))) + _sys.path.append(normpath(join(dirname(__file__), + "..", "..", "addons", "modules"))) # if "-d" in sys.argv: # Enable this to measure startup speed if 0: diff --git a/release/scripts/modules/bpy/path.py b/release/scripts/modules/bpy/path.py index eb1a5ffc455..a01745fec0a 100644 --- a/release/scripts/modules/bpy/path.py +++ b/release/scripts/modules/bpy/path.py @@ -16,26 +16,44 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> """ This module has a similar scope to os.path, containing utility functions for dealing with paths in Blender. """ +__all__ = ( + "abspath", + "basename", + "clean_name", + "display_name", + "display_name_from_filepath", + "ensure_ext", + "is_subdir", + "module_names", + "relpath", + "resolve_ncase", + ) + import bpy as _bpy import os as _os def abspath(path, start=None): """ - Returns the absolute path relative to the current blend file using the "//" prefix. + Returns the absolute path relative to the current blend file + using the "//" prefix. - :arg start: Relative to this path, when not set the current filename is used. + :arg start: Relative to this path, + when not set the current filename is used. :type start: string """ if path.startswith("//"): - return _os.path.join(_os.path.dirname(_bpy.data.filepath) if start is None else start, path[2:]) + return _os.path.join(_os.path.dirname(_bpy.data.filepath) + if start is None else start, + path[2:], + ) return path @@ -44,7 +62,8 @@ def relpath(path, start=None): """ Returns the path relative to the current blend file using the "//" prefix. - :arg start: Relative to this path, when not set the current filename is used. + :arg start: Relative to this path, + when not set the current filename is used. :type start: string """ if not path.startswith("//"): @@ -68,27 +87,28 @@ def is_subdir(path, directory): def clean_name(name, replace="_"): """ - Returns a name with characters replaced that may cause problems under various circumstances, such as writing to a file. + Returns a name with characters replaced that + may cause problems under various circumstances, + such as writing to a file. All characters besides A-Z/a-z, 0-9 are replaced with "_" or the replace argument if defined. """ - unclean_chars = \ - "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\ - \x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\ - \x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\ - \x2e\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x40\x5b\x5c\x5d\x5e\x60\x7b\ - \x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\ - \x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\ - \x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\ - \xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\ - \xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\ - \xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\ - \xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\ - \xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\ - \xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe" - - for ch in unclean_chars: + bad_chars = ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e" + "\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d" + "\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c" + "\x2e\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x40\x5b\x5c\x5d\x5e\x60\x7b" + "\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a" + "\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99" + "\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8" + "\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7" + "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6" + "\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5" + "\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4" + "\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3" + "\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe") + + for ch in bad_chars: name = name.replace(ch, replace) return name @@ -96,8 +116,9 @@ def clean_name(name, replace="_"): def display_name(name): """ Creates a display string from name to be used menus and the user interface. - Capitalize the first letter in all lowercase names, mixed case names are kept as is. - Intended for use with filenames and module names. + Capitalize the first letter in all lowercase names, + mixed case names are kept as is. Intended for use with + filenames and module names. """ name_base = _os.path.splitext(name)[0] @@ -115,9 +136,11 @@ def display_name(name): def display_name_from_filepath(name): """ - Returns the path stripped of directort and extension, ensured to be utf8 compatible. + Returns the path stripped of directort and extension, + ensured to be utf8 compatible. """ - return _os.path.splitext(basename(name))[0].encode("utf8", "replace").decode("utf8") + name = _os.path.splitext(basename(name))[0] + return name.encode("utf8", "replace").decode("utf8") def resolve_ncase(path): @@ -132,7 +155,8 @@ def resolve_ncase(path): if not path or os.path.exists(path): return path, True - filename = os.path.basename(path) # filename may be a directory or a file + # filename may be a directory or a file + filename = os.path.basename(path) dirpath = os.path.dirname(path) suffix = path[:0] # "" but ensure byte/str match @@ -190,7 +214,9 @@ def ensure_ext(filepath, ext, case_sensitive=False): import os fn_base, fn_ext = os.path.splitext(filepath) if fn_base and fn_ext: - if (case_sensitive and ext == fn_ext) or (ext.lower() == fn_ext.lower()): + if ((case_sensitive and ext == fn_ext) or + (ext.lower() == fn_ext.lower())): + return filepath else: return fn_base + ext @@ -228,7 +254,9 @@ def module_names(path, recursive=False): modules.append((filename, fullpath)) if recursive: for mod_name, mod_path in module_names(directory, True): - modules.append(("%s.%s" % (filename, mod_name), mod_path)) + modules.append(("%s.%s" % (filename, mod_name), + mod_path, + )) return modules diff --git a/release/scripts/modules/bpy/utils.py b/release/scripts/modules/bpy/utils.py index 57d3e6dd703..a6304378cc4 100644 --- a/release/scripts/modules/bpy/utils.py +++ b/release/scripts/modules/bpy/utils.py @@ -16,13 +16,33 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> """ This module contains utility functions specific to blender but not assosiated with blenders internal data. """ +__all__ = ( + "blend_paths", + "keyconfig_set", + "load_scripts", + "modules_from_path", + "preset_find", + "preset_paths", + "refresh_script_paths", + "register_class", + "register_module", + "resource_path", + "script_paths", + "smpte_from_frame", + "smpte_from_seconds", + "unregister_class", + "unregister_module", + "user_resource", + "user_script_path", + ) + from _bpy import register_class, unregister_class, blend_paths, resource_path from _bpy import script_paths as _bpy_script_paths from _bpy import user_resource as _user_resource @@ -42,7 +62,8 @@ def _test_import(module_name, loaded_modules): if module_name in loaded_modules: return None if "." in module_name: - print("Ignoring '%s', can't import files containing multiple periods." % module_name) + print("Ignoring '%s', can't import files containing " + "multiple periods." % module_name) return None if use_time: @@ -74,7 +95,8 @@ def modules_from_path(path, loaded_modules): :arg path: this path is scanned for scripts and packages. :type path: string - :arg loaded_modules: already loaded module names, files matching these names will be ignored. + :arg loaded_modules: already loaded module names, files matching these + names will be ignored. :type loaded_modules: set :return: all loaded modules. :rtype: list @@ -97,13 +119,17 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): """ Load scripts and run each modules register function. - :arg reload_scripts: Causes all scripts to have their unregister method called before loading. + :arg reload_scripts: Causes all scripts to have their unregister method + called before loading. :type reload_scripts: bool - :arg refresh_scripts: only load scripts which are not already loaded as modules. + :arg refresh_scripts: only load scripts which are not already loaded + as modules. :type refresh_scripts: bool """ use_time = _bpy.app.debug + prefs = _bpy.context.user_preferences + if use_time: import time t_main = time.time() @@ -116,10 +142,11 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): if reload_scripts: _bpy_types.TypeMap.clear() - # just unload, dont change user defaults, this means we can sync to reload. - # note that they will only actually reload of the modification time changes. - # this `wont` work for packages so... its not perfect. - for module_name in [ext.module for ext in _bpy.context.user_preferences.addons]: + # just unload, dont change user defaults, this means we can sync + # to reload. note that they will only actually reload of the + # modification time changes. This `wont` work for packages so... + # its not perfect. + for module_name in [ext.module for ext in prefs.addons]: _addon_utils.disable(module_name, default_set=False) def register_module_call(mod): @@ -131,7 +158,9 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): import traceback traceback.print_exc() else: - print("\nWarning! '%s' has no register function, this is now a requirement for registerable scripts." % mod.__file__) + print("\nWarning! '%s' has no register function, " + "this is now a requirement for registerable scripts." % + mod.__file__) def unregister_module_call(mod): unregister = getattr(mod, "unregister", None) @@ -172,7 +201,8 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): if reload_scripts: # module names -> modules - _global_loaded_modules[:] = [_sys.modules[mod_name] for mod_name in _global_loaded_modules] + _global_loaded_modules[:] = [_sys.modules[mod_name] + for mod_name in _global_loaded_modules] # loop over and unload all scripts _global_loaded_modules.reverse() @@ -201,7 +231,8 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): _addon_utils.reset_all(reload_scripts) # run the active integration preset - filepath = preset_find(_bpy.context.user_preferences.inputs.active_keyconfig, "keyconfig") + filepath = preset_find(prefs.inputs.active_keyconfig, "keyconfig") + if filepath: keyconfig_set(filepath) @@ -214,12 +245,16 @@ def load_scripts(reload_scripts=False, refresh_scripts=False): # base scripts -_scripts = _os.path.join(_os.path.dirname(__file__), _os.path.pardir, _os.path.pardir) +_scripts = _os.path.join(_os.path.dirname(__file__), + _os.path.pardir, + _os.path.pardir, + ) _scripts = (_os.path.normpath(_scripts), ) def user_script_path(): - path = _bpy.context.user_preferences.filepaths.script_directory + prefs = _bpy.context.user_preferences + path = prefs.filepaths.script_directory if path: path = _os.path.normpath(path) @@ -236,22 +271,25 @@ def script_paths(subdir=None, user_pref=True, all=False): :type subdir: string :arg user_pref: Include the user preference script path. :type user_pref: bool - :arg all: Include local, user and system paths rather just the paths blender uses. + :arg all: Include local, user and system paths rather just the paths + blender uses. :type all: bool :return: script paths. :rtype: list """ scripts = list(_scripts) + prefs = _bpy.context.user_preferences # add user scripts dir if user_pref: - user_script_path = _bpy.context.user_preferences.filepaths.script_directory + user_script_path = prefs.filepaths.script_directory else: user_script_path = None if all: # all possible paths - base_paths = tuple(_os.path.join(resource_path(res), "scripts") for res in ('LOCAL', 'USER', 'SYSTEM')) + base_paths = tuple(_os.path.join(resource_path(res), "scripts") + for res in ('LOCAL', 'USER', 'SYSTEM')) else: # only paths blender uses base_paths = _bpy_script_paths() @@ -426,7 +464,8 @@ def user_resource(type, path="", create=False): :type type: string :arg subdir: Optional subdirectory. :type subdir: string - :arg create: Treat the path as a directory and create it if its not existing. + :arg create: Treat the path as a directory and create + it if its not existing. :type create: boolean :return: a path. :rtype: string @@ -477,7 +516,8 @@ def register_module(module, verbose=False): try: register_class(cls) except: - print("bpy.utils.register_module(): failed to registering class %r" % cls) + print("bpy.utils.register_module(): " + "failed to registering class %r" % cls) import traceback traceback.print_exc() if verbose: @@ -495,7 +535,8 @@ def unregister_module(module, verbose=False): try: unregister_class(cls) except: - print("bpy.utils.unregister_module(): failed to unregistering class %r" % cls) + print("bpy.utils.unregister_module(): " + "failed to unregistering class %r" % cls) import traceback traceback.print_exc() if verbose: diff --git a/release/scripts/modules/bpy_extras/__init__.py b/release/scripts/modules/bpy_extras/__init__.py index 06d41fa670e..d853d5fda10 100644 --- a/release/scripts/modules/bpy_extras/__init__.py +++ b/release/scripts/modules/bpy_extras/__init__.py @@ -16,7 +16,7 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> """ Utility modules assosiated with the bpy module. @@ -28,4 +28,4 @@ __all__ = ( "image_utils", "mesh_utils", "view3d_utils", -) + ) diff --git a/release/scripts/modules/bpy_extras/image_utils.py b/release/scripts/modules/bpy_extras/image_utils.py index e56c1c651c4..eab75c3bd16 100644 --- a/release/scripts/modules/bpy_extras/image_utils.py +++ b/release/scripts/modules/bpy_extras/image_utils.py @@ -16,11 +16,11 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> __all__ = ( "load_image", -) + ) # limited replacement for BPyImage.comprehensiveImageLoad @@ -33,8 +33,8 @@ def load_image(imagepath, verbose=False, ): """ - Return an image from the file path with options to search multiple paths and - return a placeholder if its not found. + Return an image from the file path with options to search multiple paths + and return a placeholder if its not found. :arg filepath: The image filename If a path precedes it, this will be searched as well. @@ -51,9 +51,10 @@ def load_image(imagepath, :type recursive: bool :arg ncase_cmp: on non windows systems, find the correct case for the file. :type ncase_cmp: bool - :arg convert_callback: a function that takes an existing path and returns a new one. - Use this when loading image formats blender may not support, the CONVERT_CALLBACK - can take the path for a GIF (for example), convert it to a PNG and return the PNG's path. + :arg convert_callback: a function that takes an existing path and returns + a new one. Use this when loading image formats blender may not support, + the CONVERT_CALLBACK can take the path for a GIF (for example), + convert it to a PNG and return the PNG's path. For formats blender can read, simply return the path that is given. :type convert_callback: function :return: an image or None @@ -92,7 +93,9 @@ def load_image(imagepath, for filepath_test in variants: if ncase_cmp: - ncase_variants = filepath_test, bpy.path.resolve_ncase(filepath_test) + ncase_variants = (filepath_test, + bpy.path.resolve_ncase(filepath_test), + ) else: ncase_variants = (filepath_test, ) diff --git a/release/scripts/modules/bpy_extras/io_utils.py b/release/scripts/modules/bpy_extras/io_utils.py index 0a3f1392653..f476b371d0c 100644 --- a/release/scripts/modules/bpy_extras/io_utils.py +++ b/release/scripts/modules/bpy_extras/io_utils.py @@ -16,7 +16,7 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> __all__ = ( "ExportHelper", @@ -31,15 +31,25 @@ __all__ = ( "path_reference_copy", "path_reference_mode", "unique_name" -) + ) import bpy from bpy.props import StringProperty, BoolProperty, EnumProperty class ExportHelper: - filepath = StringProperty(name="File Path", description="Filepath used for exporting the file", maxlen=1024, default="", subtype='FILE_PATH') - check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'}) + filepath = StringProperty( + name="File Path", + description="Filepath used for exporting the file", + maxlen=1024, + subtype='FILE_PATH', + ) + check_existing = BoolProperty( + name="Check Existing", + description="Check and warn on overwriting existing files", + default=True, + options={'HIDDEN'}, + ) # subclasses can override with decorator # True == use ext, False == no ext, None == do nothing. @@ -65,7 +75,10 @@ class ExportHelper: if check_extension is None: return False - filepath = bpy.path.ensure_ext(self.filepath, self.filename_ext if check_extension else "") + filepath = bpy.path.ensure_ext(self.filepath, + self.filename_ext + if check_extension + else "") if filepath != self.filepath: self.filepath = filepath @@ -75,7 +88,12 @@ class ExportHelper: class ImportHelper: - filepath = StringProperty(name="File Path", description="Filepath used for importing the file", maxlen=1024, default="", subtype='FILE_PATH') + filepath = StringProperty( + name="File Path", + description="Filepath used for importing the file", + maxlen=1024, + subtype='FILE_PATH', + ) def invoke(self, context, event): context.window_manager.fileselect_add(self) @@ -116,29 +134,75 @@ _axis_convert_matrix = ( # where all 4 values are or'd into a single value... # (i1<<0 | i1<<3 | i1<<6 | i1<<9) _axis_convert_lut = ( - {0x8C8, 0x4D0, 0x2E0, 0xAE8, 0x701, 0x511, 0x119, 0xB29, 0x682, 0x88A, 0x09A, 0x2A2, 0x80B, 0x413, 0x223, 0xA2B, 0x644, 0x454, 0x05C, 0xA6C, 0x745, 0x94D, 0x15D, 0x365}, - {0xAC8, 0x8D0, 0x4E0, 0x2E8, 0x741, 0x951, 0x159, 0x369, 0x702, 0xB0A, 0x11A, 0x522, 0xA0B, 0x813, 0x423, 0x22B, 0x684, 0x894, 0x09C, 0x2AC, 0x645, 0xA4D, 0x05D, 0x465}, - {0x4C8, 0x2D0, 0xAE0, 0x8E8, 0x681, 0x291, 0x099, 0x8A9, 0x642, 0x44A, 0x05A, 0xA62, 0x40B, 0x213, 0xA23, 0x82B, 0x744, 0x354, 0x15C, 0x96C, 0x705, 0x50D, 0x11D, 0xB25}, - {0x2C8, 0xAD0, 0x8E0, 0x4E8, 0x641, 0xA51, 0x059, 0x469, 0x742, 0x34A, 0x15A, 0x962, 0x20B, 0xA13, 0x823, 0x42B, 0x704, 0xB14, 0x11C, 0x52C, 0x685, 0x28D, 0x09D, 0x8A5}, - {0x708, 0xB10, 0x120, 0x528, 0x8C1, 0xAD1, 0x2D9, 0x4E9, 0x942, 0x74A, 0x35A, 0x162, 0x64B, 0xA53, 0x063, 0x46B, 0x804, 0xA14, 0x21C, 0x42C, 0x885, 0x68D, 0x29D, 0x0A5}, - {0xB08, 0x110, 0x520, 0x728, 0x941, 0x151, 0x359, 0x769, 0x802, 0xA0A, 0x21A, 0x422, 0xA4B, 0x053, 0x463, 0x66B, 0x884, 0x094, 0x29C, 0x6AC, 0x8C5, 0xACD, 0x2DD, 0x4E5}, - {0x508, 0x710, 0xB20, 0x128, 0x881, 0x691, 0x299, 0x0A9, 0x8C2, 0x4CA, 0x2DA, 0xAE2, 0x44B, 0x653, 0xA63, 0x06B, 0x944, 0x754, 0x35C, 0x16C, 0x805, 0x40D, 0x21D, 0xA25}, - {0x108, 0x510, 0x720, 0xB28, 0x801, 0x411, 0x219, 0xA29, 0x882, 0x08A, 0x29A, 0x6A2, 0x04B, 0x453, 0x663, 0xA6B, 0x8C4, 0x4D4, 0x2DC, 0xAEC, 0x945, 0x14D, 0x35D, 0x765}, - {0x748, 0x350, 0x160, 0x968, 0xAC1, 0x2D1, 0x4D9, 0x8E9, 0xA42, 0x64A, 0x45A, 0x062, 0x68B, 0x293, 0x0A3, 0x8AB, 0xA04, 0x214, 0x41C, 0x82C, 0xB05, 0x70D, 0x51D, 0x125}, - {0x948, 0x750, 0x360, 0x168, 0xB01, 0x711, 0x519, 0x129, 0xAC2, 0x8CA, 0x4DA, 0x2E2, 0x88B, 0x693, 0x2A3, 0x0AB, 0xA44, 0x654, 0x45C, 0x06C, 0xA05, 0x80D, 0x41D, 0x225}, - {0x348, 0x150, 0x960, 0x768, 0xA41, 0x051, 0x459, 0x669, 0xA02, 0x20A, 0x41A, 0x822, 0x28B, 0x093, 0x8A3, 0x6AB, 0xB04, 0x114, 0x51C, 0x72C, 0xAC5, 0x2CD, 0x4DD, 0x8E5}, - {0x148, 0x950, 0x760, 0x368, 0xA01, 0x811, 0x419, 0x229, 0xB02, 0x10A, 0x51A, 0x722, 0x08B, 0x893, 0x6A3, 0x2AB, 0xAC4, 0x8D4, 0x4DC, 0x2EC, 0xA45, 0x04D, 0x45D, 0x665}, - {0x688, 0x890, 0x0A0, 0x2A8, 0x4C1, 0x8D1, 0xAD9, 0x2E9, 0x502, 0x70A, 0xB1A, 0x122, 0x74B, 0x953, 0x163, 0x36B, 0x404, 0x814, 0xA1C, 0x22C, 0x445, 0x64D, 0xA5D, 0x065}, - {0x888, 0x090, 0x2A0, 0x6A8, 0x501, 0x111, 0xB19, 0x729, 0x402, 0x80A, 0xA1A, 0x222, 0x94B, 0x153, 0x363, 0x76B, 0x444, 0x054, 0xA5C, 0x66C, 0x4C5, 0x8CD, 0xADD, 0x2E5}, - {0x288, 0x690, 0x8A0, 0x0A8, 0x441, 0x651, 0xA59, 0x069, 0x4C2, 0x2CA, 0xADA, 0x8E2, 0x34B, 0x753, 0x963, 0x16B, 0x504, 0x714, 0xB1C, 0x12C, 0x405, 0x20D, 0xA1D, 0x825}, - {0x088, 0x290, 0x6A0, 0x8A8, 0x401, 0x211, 0xA19, 0x829, 0x442, 0x04A, 0xA5A, 0x662, 0x14B, 0x353, 0x763, 0x96B, 0x4C4, 0x2D4, 0xADC, 0x8EC, 0x505, 0x10D, 0xB1D, 0x725}, - {0x648, 0x450, 0x060, 0xA68, 0x2C1, 0x4D1, 0x8D9, 0xAE9, 0x282, 0x68A, 0x89A, 0x0A2, 0x70B, 0x513, 0x123, 0xB2B, 0x204, 0x414, 0x81C, 0xA2C, 0x345, 0x74D, 0x95D, 0x165}, - {0xA48, 0x650, 0x460, 0x068, 0x341, 0x751, 0x959, 0x169, 0x2C2, 0xACA, 0x8DA, 0x4E2, 0xB0B, 0x713, 0x523, 0x12B, 0x284, 0x694, 0x89C, 0x0AC, 0x205, 0xA0D, 0x81D, 0x425}, - {0x448, 0x050, 0xA60, 0x668, 0x281, 0x091, 0x899, 0x6A9, 0x202, 0x40A, 0x81A, 0xA22, 0x50B, 0x113, 0xB23, 0x72B, 0x344, 0x154, 0x95C, 0x76C, 0x2C5, 0x4CD, 0x8DD, 0xAE5}, - {0x048, 0xA50, 0x660, 0x468, 0x201, 0xA11, 0x819, 0x429, 0x342, 0x14A, 0x95A, 0x762, 0x10B, 0xB13, 0x723, 0x52B, 0x2C4, 0xAD4, 0x8DC, 0x4EC, 0x285, 0x08D, 0x89D, 0x6A5}, - {0x808, 0xA10, 0x220, 0x428, 0x101, 0xB11, 0x719, 0x529, 0x142, 0x94A, 0x75A, 0x362, 0x8CB, 0xAD3, 0x2E3, 0x4EB, 0x044, 0xA54, 0x65C, 0x46C, 0x085, 0x88D, 0x69D, 0x2A5}, - {0xA08, 0x210, 0x420, 0x828, 0x141, 0x351, 0x759, 0x969, 0x042, 0xA4A, 0x65A, 0x462, 0xACB, 0x2D3, 0x4E3, 0x8EB, 0x084, 0x294, 0x69C, 0x8AC, 0x105, 0xB0D, 0x71D, 0x525}, - {0x408, 0x810, 0xA20, 0x228, 0x081, 0x891, 0x699, 0x2A9, 0x102, 0x50A, 0x71A, 0xB22, 0x4CB, 0x8D3, 0xAE3, 0x2EB, 0x144, 0x954, 0x75C, 0x36C, 0x045, 0x44D, 0x65D, 0xA65}, + {0x8C8, 0x4D0, 0x2E0, 0xAE8, 0x701, 0x511, 0x119, 0xB29, 0x682, 0x88A, + 0x09A, 0x2A2, 0x80B, 0x413, 0x223, 0xA2B, 0x644, 0x454, 0x05C, 0xA6C, + 0x745, 0x94D, 0x15D, 0x365}, + {0xAC8, 0x8D0, 0x4E0, 0x2E8, 0x741, 0x951, 0x159, 0x369, 0x702, 0xB0A, + 0x11A, 0x522, 0xA0B, 0x813, 0x423, 0x22B, 0x684, 0x894, 0x09C, 0x2AC, + 0x645, 0xA4D, 0x05D, 0x465}, + {0x4C8, 0x2D0, 0xAE0, 0x8E8, 0x681, 0x291, 0x099, 0x8A9, 0x642, 0x44A, + 0x05A, 0xA62, 0x40B, 0x213, 0xA23, 0x82B, 0x744, 0x354, 0x15C, 0x96C, + 0x705, 0x50D, 0x11D, 0xB25}, + {0x2C8, 0xAD0, 0x8E0, 0x4E8, 0x641, 0xA51, 0x059, 0x469, 0x742, 0x34A, + 0x15A, 0x962, 0x20B, 0xA13, 0x823, 0x42B, 0x704, 0xB14, 0x11C, 0x52C, + 0x685, 0x28D, 0x09D, 0x8A5}, + {0x708, 0xB10, 0x120, 0x528, 0x8C1, 0xAD1, 0x2D9, 0x4E9, 0x942, 0x74A, + 0x35A, 0x162, 0x64B, 0xA53, 0x063, 0x46B, 0x804, 0xA14, 0x21C, 0x42C, + 0x885, 0x68D, 0x29D, 0x0A5}, + {0xB08, 0x110, 0x520, 0x728, 0x941, 0x151, 0x359, 0x769, 0x802, 0xA0A, + 0x21A, 0x422, 0xA4B, 0x053, 0x463, 0x66B, 0x884, 0x094, 0x29C, 0x6AC, + 0x8C5, 0xACD, 0x2DD, 0x4E5}, + {0x508, 0x710, 0xB20, 0x128, 0x881, 0x691, 0x299, 0x0A9, 0x8C2, 0x4CA, + 0x2DA, 0xAE2, 0x44B, 0x653, 0xA63, 0x06B, 0x944, 0x754, 0x35C, 0x16C, + 0x805, 0x40D, 0x21D, 0xA25}, + {0x108, 0x510, 0x720, 0xB28, 0x801, 0x411, 0x219, 0xA29, 0x882, 0x08A, + 0x29A, 0x6A2, 0x04B, 0x453, 0x663, 0xA6B, 0x8C4, 0x4D4, 0x2DC, 0xAEC, + 0x945, 0x14D, 0x35D, 0x765}, + {0x748, 0x350, 0x160, 0x968, 0xAC1, 0x2D1, 0x4D9, 0x8E9, 0xA42, 0x64A, + 0x45A, 0x062, 0x68B, 0x293, 0x0A3, 0x8AB, 0xA04, 0x214, 0x41C, 0x82C, + 0xB05, 0x70D, 0x51D, 0x125}, + {0x948, 0x750, 0x360, 0x168, 0xB01, 0x711, 0x519, 0x129, 0xAC2, 0x8CA, + 0x4DA, 0x2E2, 0x88B, 0x693, 0x2A3, 0x0AB, 0xA44, 0x654, 0x45C, 0x06C, + 0xA05, 0x80D, 0x41D, 0x225}, + {0x348, 0x150, 0x960, 0x768, 0xA41, 0x051, 0x459, 0x669, 0xA02, 0x20A, + 0x41A, 0x822, 0x28B, 0x093, 0x8A3, 0x6AB, 0xB04, 0x114, 0x51C, 0x72C, + 0xAC5, 0x2CD, 0x4DD, 0x8E5}, + {0x148, 0x950, 0x760, 0x368, 0xA01, 0x811, 0x419, 0x229, 0xB02, 0x10A, + 0x51A, 0x722, 0x08B, 0x893, 0x6A3, 0x2AB, 0xAC4, 0x8D4, 0x4DC, 0x2EC, + 0xA45, 0x04D, 0x45D, 0x665}, + {0x688, 0x890, 0x0A0, 0x2A8, 0x4C1, 0x8D1, 0xAD9, 0x2E9, 0x502, 0x70A, + 0xB1A, 0x122, 0x74B, 0x953, 0x163, 0x36B, 0x404, 0x814, 0xA1C, 0x22C, + 0x445, 0x64D, 0xA5D, 0x065}, + {0x888, 0x090, 0x2A0, 0x6A8, 0x501, 0x111, 0xB19, 0x729, 0x402, 0x80A, + 0xA1A, 0x222, 0x94B, 0x153, 0x363, 0x76B, 0x444, 0x054, 0xA5C, 0x66C, + 0x4C5, 0x8CD, 0xADD, 0x2E5}, + {0x288, 0x690, 0x8A0, 0x0A8, 0x441, 0x651, 0xA59, 0x069, 0x4C2, 0x2CA, + 0xADA, 0x8E2, 0x34B, 0x753, 0x963, 0x16B, 0x504, 0x714, 0xB1C, 0x12C, + 0x405, 0x20D, 0xA1D, 0x825}, + {0x088, 0x290, 0x6A0, 0x8A8, 0x401, 0x211, 0xA19, 0x829, 0x442, 0x04A, + 0xA5A, 0x662, 0x14B, 0x353, 0x763, 0x96B, 0x4C4, 0x2D4, 0xADC, 0x8EC, + 0x505, 0x10D, 0xB1D, 0x725}, + {0x648, 0x450, 0x060, 0xA68, 0x2C1, 0x4D1, 0x8D9, 0xAE9, 0x282, 0x68A, + 0x89A, 0x0A2, 0x70B, 0x513, 0x123, 0xB2B, 0x204, 0x414, 0x81C, 0xA2C, + 0x345, 0x74D, 0x95D, 0x165}, + {0xA48, 0x650, 0x460, 0x068, 0x341, 0x751, 0x959, 0x169, 0x2C2, 0xACA, + 0x8DA, 0x4E2, 0xB0B, 0x713, 0x523, 0x12B, 0x284, 0x694, 0x89C, 0x0AC, + 0x205, 0xA0D, 0x81D, 0x425}, + {0x448, 0x050, 0xA60, 0x668, 0x281, 0x091, 0x899, 0x6A9, 0x202, 0x40A, + 0x81A, 0xA22, 0x50B, 0x113, 0xB23, 0x72B, 0x344, 0x154, 0x95C, 0x76C, + 0x2C5, 0x4CD, 0x8DD, 0xAE5}, + {0x048, 0xA50, 0x660, 0x468, 0x201, 0xA11, 0x819, 0x429, 0x342, 0x14A, + 0x95A, 0x762, 0x10B, 0xB13, 0x723, 0x52B, 0x2C4, 0xAD4, 0x8DC, 0x4EC, + 0x285, 0x08D, 0x89D, 0x6A5}, + {0x808, 0xA10, 0x220, 0x428, 0x101, 0xB11, 0x719, 0x529, 0x142, 0x94A, + 0x75A, 0x362, 0x8CB, 0xAD3, 0x2E3, 0x4EB, 0x044, 0xA54, 0x65C, 0x46C, + 0x085, 0x88D, 0x69D, 0x2A5}, + {0xA08, 0x210, 0x420, 0x828, 0x141, 0x351, 0x759, 0x969, 0x042, 0xA4A, + 0x65A, 0x462, 0xACB, 0x2D3, 0x4E3, 0x8EB, 0x084, 0x294, 0x69C, 0x8AC, + 0x105, 0xB0D, 0x71D, 0x525}, + {0x408, 0x810, 0xA20, 0x228, 0x081, 0x891, 0x699, 0x2A9, 0x102, 0x50A, + 0x71A, 0xB22, 0x4CB, 0x8D3, 0xAE3, 0x2EB, 0x144, 0x954, 0x75C, 0x36C, + 0x045, 0x44D, 0x65D, 0xA65}, ) _axis_convert_num = {'X': 0, 'Y': 1, 'Z': 2, '-X': 3, '-Y': 4, '-Z': 5} @@ -206,7 +270,8 @@ def axis_conversion_ensure(operator, forward_attr, up_attr): return False -# return a tuple (free, object list), free is True if memory should be freed later with free_derived_objects() +# 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 in {'VERTS', 'FACES'}: return False, None @@ -254,31 +319,45 @@ path_reference_mode = EnumProperty( description="Method used to reference paths", items=(('AUTO', "Auto", "Use Relative paths with subdirectories only"), ('ABSOLUTE', "Absolute", "Always write absolute paths"), - ('RELATIVE', "Relative", "Always write relative patsh (where possible)"), - ('MATCH', "Match", "Match Absolute/Relative setting with input path"), + ('RELATIVE', "Relative", "Always write relative patsh " + "(where possible)"), + ('MATCH', "Match", "Match Absolute/Relative " + "setting with input path"), ('STRIP', "Strip Path", "Filename only"), - ('COPY', "Copy", "copy the file to the destination path (or subdirectory)"), + ('COPY', "Copy", "copy the file to the destination path " + "(or subdirectory)"), ), default='AUTO' ) -def path_reference(filepath, base_src, base_dst, mode='AUTO', copy_subdir="", copy_set=None): +def path_reference(filepath, + base_src, + base_dst, + mode='AUTO', + copy_subdir="", + copy_set=None, + ): """ Return a filepath relative to a destination directory, for use with exporters. - :arg filepath: the file path to return, supporting blenders relative '//' prefix. + :arg filepath: the file path to return, + supporting blenders relative '//' prefix. :type filepath: string - :arg base_src: the directory the *filepath* is relative too (normally the blend file). + :arg base_src: the directory the *filepath* is relative too + (normally the blend file). :type base_src: string - :arg base_dst: the directory the *filepath* will be referenced from (normally the export path). + :arg base_dst: the directory the *filepath* will be referenced from + (normally the export path). :type base_dst: string - :arg mode: the method used get the path in ['AUTO', 'ABSOLUTE', 'RELATIVE', 'MATCH', 'STRIP', 'COPY'] + :arg mode: the method used get the path in + ['AUTO', 'ABSOLUTE', 'RELATIVE', 'MATCH', 'STRIP', 'COPY'] :type mode: string :arg copy_subdir: the subdirectory of *base_dst* to use when mode='COPY'. :type copy_subdir: string - :arg copy_set: collect from/to pairs when mode='COPY', pass to *path_reference_copy* when exportign is done. + :arg copy_set: collect from/to pairs when mode='COPY', + pass to *path_reference_copy* when exportign is done. :type copy_set: set :return: the new filepath. :rtype: string @@ -292,7 +371,9 @@ def path_reference(filepath, base_src, base_dst, mode='AUTO', copy_subdir="", co elif mode == 'MATCH': mode = 'RELATIVE' if is_relative else 'ABSOLUTE' elif mode == 'AUTO': - mode = 'RELATIVE' if bpy.path.is_subdir(filepath, base_dst) else 'ABSOLUTE' + mode = ('RELATIVE' + if bpy.path.is_subdir(filepath, base_dst) + else 'ABSOLUTE') elif mode == 'COPY': if copy_subdir: subdir_abs = os.path.join(os.path.normpath(base_dst), copy_subdir) @@ -367,7 +448,8 @@ def unique_name(key, name, name_dict, name_max=-1, clean_func=None): if name_new is None: count = 1 name_dict_values = name_dict.values() - name_new = name_new_orig = name if clean_func is None else clean_func(name) + name_new = name_new_orig = (name if clean_func is None + else clean_func(name)) if name_max == -1: while name_new in name_dict_values: @@ -377,7 +459,10 @@ def unique_name(key, name, name_dict, name_max=-1, clean_func=None): name_new = name_new[:name_max] while name_new in name_dict_values: count_str = "%03d" % count - name_new = "%.*s.%s" % (name_max - (len(count_str) + 1), name_new_orig, count_str) + name_new = "%.*s.%s" % (name_max - (len(count_str) + 1), + name_new_orig, + count_str, + ) count += 1 name_dict[key] = name_new diff --git a/release/scripts/modules/bpy_extras/mesh_utils.py b/release/scripts/modules/bpy_extras/mesh_utils.py index ecd620ff2c9..f9400674138 100644 --- a/release/scripts/modules/bpy_extras/mesh_utils.py +++ b/release/scripts/modules/bpy_extras/mesh_utils.py @@ -26,7 +26,7 @@ __all__ = ( "edge_loops_from_edges", "ngon_tesselate", "face_random_points", -) + ) def mesh_linked_faces(mesh): diff --git a/release/scripts/modules/bpy_extras/object_utils.py b/release/scripts/modules/bpy_extras/object_utils.py index 51a8d4b5e23..790f5ba48cb 100644 --- a/release/scripts/modules/bpy_extras/object_utils.py +++ b/release/scripts/modules/bpy_extras/object_utils.py @@ -16,12 +16,12 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> __all__ = ( "add_object_align_init", "object_data_add", -) + ) import bpy @@ -39,42 +39,49 @@ def add_object_align_init(context, operator): :return: the matrix from the context and settings. :rtype: :class:`Matrix` """ + + from mathutils import Matrix, Vector, Euler + properties = operator.properties if operator is not None else None + space_data = context.space_data if space_data.type != 'VIEW_3D': space_data = None # location - if operator and operator.properties.is_property_set("location"): - location = mathutils.Matrix.Translation(mathutils.Vector(operator.properties.location)) + if operator and properties.is_property_set("location"): + location = Matrix.Translation(Vector(properties.location)) else: if space_data: # local view cursor is detected below - location = mathutils.Matrix.Translation(space_data.cursor_location) + location = Matrix.Translation(space_data.cursor_location) else: - location = mathutils.Matrix.Translation(context.scene.cursor_location) + location = Matrix.Translation(context.scene.cursor_location) if operator: - operator.properties.location = location.to_translation() + properties.location = location.to_translation() # rotation view_align = (context.user_preferences.edit.object_align == 'VIEW') view_align_force = False if operator: - if operator.properties.is_property_set("view_align"): + if properties.is_property_set("view_align"): view_align = view_align_force = operator.view_align else: - operator.properties.view_align = view_align + properties.view_align = view_align - if operator and operator.properties.is_property_set("rotation") and not view_align_force: - rotation = mathutils.Euler(operator.properties.rotation).to_matrix().to_4x4() + if operator and (properties.is_property_set("rotation") and + not view_align_force): + + rotation = Euler(properties.rotation).to_matrix().to_4x4() else: if view_align and space_data: - rotation = space_data.region_3d.view_matrix.to_3x3().inverted().to_4x4() + rotation = space_data.region_3d.view_matrix.to_3x3().inverted() + rotation.resize_4x4() else: rotation = mathutils.Matrix() # set the operator properties if operator: - operator.properties.rotation = rotation.to_euler() + properties.rotation = rotation.to_euler() return location * rotation @@ -114,14 +121,18 @@ def object_data_add(context, obdata, operator=None): # XXX # caused because entering editmodedoes not add a empty undo slot! if context.user_preferences.edit.use_enter_edit_mode: - if not (obj_act and obj_act.mode == 'EDIT' and obj_act.type == obj_new.type): + if not (obj_act and + obj_act.mode == 'EDIT' and + obj_act.type == obj_new.type): + _obdata = bpy.data.meshes.new(obdata.name) obj_act = bpy.data.objects.new(_obdata.name, _obdata) obj_act.matrix_world = obj_new.matrix_world scene.objects.link(obj_act) scene.objects.active = obj_act bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.ed.undo_push(message="Enter Editmode") # need empty undo step + # need empty undo step + bpy.ops.ed.undo_push(message="Enter Editmode") # XXX if obj_act and obj_act.mode == 'EDIT' and obj_act.type == obj_new.type: diff --git a/release/scripts/modules/bpy_extras/view3d_utils.py b/release/scripts/modules/bpy_extras/view3d_utils.py index 5796abce72c..26325633a05 100644 --- a/release/scripts/modules/bpy_extras/view3d_utils.py +++ b/release/scripts/modules/bpy_extras/view3d_utils.py @@ -16,13 +16,13 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> __all__ = ( "region_2d_to_vector_3d", "region_2d_to_location_3d", "location_3d_to_region_2d", -) + ) def region_2d_to_vector_3d(region, rv3d, coord): @@ -90,15 +90,23 @@ def region_2d_to_location_3d(region, rv3d, coord, depth_location): origin_start = rv3d.view_matrix.inverted()[3].to_3d() origin_end = origin_start + coord_vec view_vec = rv3d.view_matrix.inverted()[2] - return intersect_line_plane(origin_start, origin_end, depth_location, view_vec, 1) + return intersect_line_plane(origin_start, + origin_end, + depth_location, + view_vec, 1, + ) else: dx = (2.0 * coord[0] / region.width) - 1.0 dy = (2.0 * coord[1] / region.height) - 1.0 persinv = persmat.inverted() viewinv = rv3d.view_matrix.inverted() - origin_start = (persinv[0].xyz * dx) + (persinv[1].xyz * dy) + viewinv[3].xyz + origin_start = ((persinv[0].xyz * dx) + + (persinv[1].xyz * dy) + viewinv[3].xyz) origin_end = origin_start + coord_vec - return intersect_point_line(depth_location, origin_start, origin_end)[0] + return intersect_point_line(depth_location, + origin_start, + origin_end, + )[0] def location_3d_to_region_2d(region, rv3d, coord): diff --git a/release/scripts/modules/keyingsets_utils.py b/release/scripts/modules/keyingsets_utils.py index dc61ce2a4af..03400edc904 100644 --- a/release/scripts/modules/keyingsets_utils.py +++ b/release/scripts/modules/keyingsets_utils.py @@ -16,14 +16,14 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> # This file defines a set of methods that are useful for various # Relative Keying Set (RKS) related operations, such as: callbacks # for polling, iterator callbacks, and also generate callbacks. # All of these can be used in conjunction with the others. -__all__ = [ +__all__ = ( "path_add_property", "RKS_POLL_selected_objects", "RKS_POLL_selected_bones", @@ -33,7 +33,7 @@ __all__ = [ "RKS_GEN_location", "RKS_GEN_rotation", "RKS_GEN_scaling", -] + ) import bpy @@ -75,7 +75,8 @@ def RKS_POLL_selected_bones(ksi, context): # selected bones or objects def RKS_POLL_selected_items(ksi, context): - return RKS_POLL_selected_bones(ksi, context) or RKS_POLL_selected_objects(ksi, context) + return (RKS_POLL_selected_bones(ksi, context) or + RKS_POLL_selected_objects(ksi, context)) ########################### # Iterator Callbacks diff --git a/release/scripts/templates/addon_add_object.py b/release/scripts/templates/addon_add_object.py index 67e033271f4..98517fd97a0 100644 --- a/release/scripts/templates/addon_add_object.py +++ b/release/scripts/templates/addon_add_object.py @@ -35,7 +35,7 @@ def add_object(self, context): mesh.from_pydata(verts, edges, faces) # useful for development when the mesh may be invalid. # mesh.validate(verbose=True) - add_object_data(context, mesh_data, operator=self) + add_object_data(context, mesh, operator=self) class OBJECT_OT_add_object(bpy.types.Operator, AddObjectHelper): diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 0491116d199..557ce417b14 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -115,5 +115,6 @@ int minmax_curve(struct Curve *cu, float min[3], float max[3]); int curve_center_median(struct Curve *cu, float cent[3]); int curve_center_bounds(struct Curve *cu, float cent[3]); void curve_translate(struct Curve *cu, float offset[3], int do_keys); +void curve_delete_material_index(struct Curve *cu, int index); #endif diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index c445408609c..88965d12e4a 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -78,7 +78,7 @@ int object_remove_material_slot(struct Object *ob); /* rna api */ void material_append_id(struct ID *id, struct Material *ma); -struct Material *material_pop_id(struct ID *id, int index); +struct Material *material_pop_id(struct ID *id, int index, int remove_material_slot); /* rendering */ diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index d9c98bc0200..62b8830de20 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -1883,7 +1883,9 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos /* set the DerivedMesh to only copy needed data */ mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link); - DM_set_only_copy(dm, mask); + /* needMapping check here fixes bug [#28112], otherwise its + * possible that it wont be copied */ + DM_set_only_copy(dm, mask | (needMapping ? CD_MASK_ORIGINDEX : 0)); /* add cloth rest shape key if need */ if(mask & CD_MASK_CLOTH_ORCO) diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 202a3f28d9a..eb364af6ff8 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -580,46 +580,47 @@ void addNurbPointsBezier(Nurb *nu, int number) /* ~~~~~~~~~~~~~~~~~~~~Non Uniform Rational B Spline calculations ~~~~~~~~~~~ */ -static void calcknots(float *knots, short aantal, short order, short type) -/* knots: number of pnts NOT corrected for cyclic */ -/* type; 0: uniform, 1: endpoints, 2: bezier */ +static void calcknots(float *knots, const short pnts, const short order, const short flag) { + /* knots: number of pnts NOT corrected for cyclic */ + const int pnts_order= pnts + order; float k; - int a, t; - - t = aantal+order; - if(type==0) { + int a; - for(a=0;a<t;a++) { - knots[a]= (float)a; - } - } - else if(type==1) { + switch(flag & (CU_NURB_ENDPOINT|CU_NURB_BEZIER)) { + case CU_NURB_ENDPOINT: k= 0.0; - for(a=1;a<=t;a++) { + for(a=1; a <= pnts_order; a++) { knots[a-1]= k; - if(a>=order && a<=aantal) k+= 1.0f; + if(a >= order && a <= pnts) k+= 1.0f; } - } - else if(type==2) { - /* Warning, the order MUST be 2 or 4, if this is not enforced, the displist will be corrupt */ + break; + case CU_NURB_BEZIER: + /* Warning, the order MUST be 2 or 4, + * if this is not enforced, the displist will be corrupt */ if(order==4) { k= 0.34; - for(a=0;a<t;a++) { + for(a=0; a < pnts_order; a++) { knots[a]= floorf(k); k+= (1.0f/3.0f); } } else if(order==3) { k= 0.6f; - for(a=0;a<t;a++) { - if(a>=order && a<=aantal) k+= 0.5f; + for(a=0; a < pnts_order; a++) { + if(a >= order && a <= pnts) k+= 0.5f; knots[a]= floorf(k); } } else { printf("bez nurb curve order is not 3 or 4, should never happen\n"); } + break; + default: + for(a=0; a < pnts_order; a++) { + knots[a]= (float)a; + } + break; } } @@ -662,7 +663,7 @@ static void makeknots(Nurb *nu, short uv) calcknots(nu->knotsu, nu->pntsu, nu->orderu, 0); /* cyclic should be uniform */ makecyclicknots(nu->knotsu, nu->pntsu, nu->orderu); } else { - calcknots(nu->knotsu, nu->pntsu, nu->orderu, nu->flagu>>1); + calcknots(nu->knotsu, nu->pntsu, nu->orderu, nu->flagu); } } else nu->knotsu= NULL; @@ -675,7 +676,7 @@ static void makeknots(Nurb *nu, short uv) calcknots(nu->knotsv, nu->pntsv, nu->orderv, 0); /* cyclic should be uniform */ makecyclicknots(nu->knotsv, nu->pntsv, nu->orderv); } else { - calcknots(nu->knotsv, nu->pntsv, nu->orderv, nu->flagv>>1); + calcknots(nu->knotsv, nu->pntsv, nu->orderv, nu->flagv); } } else nu->knotsv= NULL; @@ -3259,3 +3260,28 @@ void curve_translate(Curve *cu, float offset[3], int do_keys) } } } + +void curve_delete_material_index(Curve *cu, int index) +{ + const int curvetype= curve_type(cu); + + if(curvetype == OB_FONT) { + struct CharInfo *info= cu->strinfo; + int i; + for(i= cu->len-1; i >= 0; i--, info++) { + if (info->mat_nr && info->mat_nr>=index) { + info->mat_nr--; + } + } + } + else { + Nurb *nu; + + for (nu= cu->nurb.first; nu; nu= nu->next) { + if(nu->mat_nr && nu->mat_nr>=index) { + nu->mat_nr--; + if (curvetype == OB_CURVE) nu->charidx--; + } + } + } +} diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 4f921f005f4..104ce2b3b32 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -518,7 +518,7 @@ static const char *material_adrcodes_to_paths (int adrcode, int *array_index) return "alpha"; case MA_REF: - return "diffuse_reflection"; + return "diffuse_intensity"; case MA_EMIT: return "emit"; @@ -527,7 +527,7 @@ static const char *material_adrcodes_to_paths (int adrcode, int *array_index) return "ambient"; case MA_SPEC: - return "specular_reflection"; + return "specular_intensity"; case MA_HARD: return "specular_hardness"; @@ -551,13 +551,13 @@ static const char *material_adrcodes_to_paths (int adrcode, int *array_index) return "raytrace_mirror.fresnel"; case MA_FRESMIRI: - return "raytrace_mirror.fresnel_fac"; + return "raytrace_mirror.fresnel_factor"; case MA_FRESTRA: return "raytrace_transparency.fresnel"; case MA_FRESTRAI: - return "raytrace_transparency.fresnel_fac"; + return "raytrace_transparency.fresnel_factor"; case MA_ADD: return "halo.add"; diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index 8b0cfb1d156..0964c66fecd 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -474,20 +474,20 @@ static int setkeys(float fac, ListBase *lb, KeyBlock *k[], float *t, int cycl) } -static void flerp(int aantal, float *in, float *f0, float *f1, float *f2, float *f3, float *t) +static void flerp(int tot, float *in, float *f0, float *f1, float *f2, float *f3, float *t) { int a; - for(a=0; a<aantal; a++) { + for(a=0; a<tot; a++) { in[a]= t[0]*f0[a]+t[1]*f1[a]+t[2]*f2[a]+t[3]*f3[a]; } } -static void rel_flerp(int aantal, float *in, float *ref, float *out, float fac) +static void rel_flerp(int tot, float *in, float *ref, float *out, float fac) { int a; - for(a=0; a<aantal; a++) { + for(a=0; a<tot; a++) { in[a]-= fac*(ref[a]-out[a]); } } diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 3f01c55e935..9c455e84109 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -61,7 +61,7 @@ #include "BKE_material.h" #include "BKE_mesh.h" #include "BKE_node.h" - +#include "BKE_curve.h" #include "GPU_material.h" @@ -515,6 +515,21 @@ short *give_totcolp_id(ID *id) return NULL; } +void data_delete_material_index_id(ID *id, int index) +{ + switch(GS(id->name)) { + case ID_ME: + mesh_delete_material_index((Mesh *)id, index); + break; + case ID_CU: + curve_delete_material_index((Curve *)id, index); + break; + case ID_MB: + /* meta-elems dont have materials atm */ + break; + } +} + void material_append_id(ID *id, Material *ma) { Material ***matar; @@ -532,7 +547,7 @@ void material_append_id(ID *id, Material *ma) } } -Material *material_pop_id(ID *id, int index) +Material *material_pop_id(ID *id, int index, int remove_material_slot) { Material *ret= NULL; Material ***matar; @@ -540,27 +555,36 @@ Material *material_pop_id(ID *id, int index) short *totcol= give_totcolp_id(id); if(index >= 0 && index < (*totcol)) { ret= (*matar)[index]; - id_us_min((ID *)ret); - if(*totcol <= 1) { - *totcol= 0; - MEM_freeN(*matar); - *matar= NULL; - } - else { - Material **mat; - - if(index + 1 != (*totcol)) - memmove((*matar)+index, (*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1))); + id_us_min((ID *)ret); - (*totcol)--; - - mat= MEM_callocN(sizeof(void *) * (*totcol), "newmatar"); - memcpy(mat, *matar, sizeof(void *) * (*totcol)); - MEM_freeN(*matar); + if (remove_material_slot) { + if(*totcol <= 1) { + *totcol= 0; + MEM_freeN(*matar); + *matar= NULL; + } + else { + Material **mat; + if(index + 1 != (*totcol)) + memmove((*matar)+index, (*matar)+(index+1), sizeof(void *) * ((*totcol) - (index + 1))); + + (*totcol)--; + + mat= MEM_callocN(sizeof(void *) * (*totcol), "newmatar"); + memcpy(mat, *matar, sizeof(void *) * (*totcol)); + MEM_freeN(*matar); + + *matar= mat; + test_object_materials(id); + } - *matar= mat; - test_object_materials(id); + /* decrease mat_nr index */ + data_delete_material_index_id(id, index); } + + /* don't remove material slot, only clear it*/ + else + (*matar)[index]= NULL; } } @@ -1025,8 +1049,6 @@ int object_remove_material_slot(Object *ob) { Material *mao, ***matarar; Object *obt; - Curve *cu; - Nurb *nu; short *totcolp; int a, actcol; @@ -1086,23 +1108,8 @@ int object_remove_material_slot(Object *ob) } /* check indices from mesh */ - - if(ob->type==OB_MESH) { - Mesh *me= get_mesh(ob); - mesh_delete_material_index(me, actcol-1); - freedisplist(&ob->disp); - } - else if ELEM(ob->type, OB_CURVE, OB_SURF) { - cu= ob->data; - nu= cu->nurb.first; - - while(nu) { - if(nu->mat_nr && nu->mat_nr>=actcol-1) { - nu->mat_nr--; - if (ob->type == OB_CURVE) nu->charidx--; - } - nu= nu->next; - } + if (ELEM4(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT)) { + data_delete_material_index_id((ID *)ob->data, actcol-1); freedisplist(&ob->disp); } diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 45a60b842a7..32819226361 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -1254,10 +1254,10 @@ void mesh_to_curve(Scene *scene, Object *ob) void mesh_delete_material_index(Mesh *me, int index) { + MFace *mf; int i; - for (i=0; i<me->totface; i++) { - MFace *mf = &((MFace*) me->mface)[i]; + for (i=0, mf=me->mface; i<me->totface; i++, mf++) { if (mf->mat_nr && mf->mat_nr>=index) mf->mat_nr--; } diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c index 7bc93a3d3a0..5f31565d65b 100644 --- a/source/blender/blenlib/intern/BLI_args.c +++ b/source/blender/blenlib/intern/BLI_args.c @@ -290,8 +290,10 @@ void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void * } i += retval; } else if (retval == -1){ - if (a->key->pass != -1) - ba->passes[i] = pass; + if (a) { + if (a->key->pass != -1) + ba->passes[i] = pass; + } break; } } diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c index 85d79ae3b85..0613765b868 100644 --- a/source/blender/blenlib/intern/pbvh.c +++ b/source/blender/blenlib/intern/pbvh.c @@ -26,7 +26,6 @@ - #include "DNA_meshdata_types.h" #include "MEM_guardedalloc.h" @@ -85,25 +84,61 @@ struct PBVHNode { /* Opaque handle for drawing code */ void *draw_buffers; - int *vert_indices; - /* Voxel bounds */ BB vb; BB orig_vb; - /* For internal nodes */ + /* For internal nodes, the offset of the children in the PBVH + 'nodes' array. */ int children_offset; - /* Pointer into bvh prim_indices */ - int *prim_indices; - int *face_vert_indices; + /* Pointer into the PBVH prim_indices array and the number of + primitives used by this leaf node. + Used for leaf nodes in both mesh- and multires-based PBVHs. + */ + int *prim_indices; unsigned int totprim; + + /* Array of indices into the mesh's MVert array. Contains the + indices of all vertices used by faces that are within this + node's bounding box. + + Note that a vertex might be used by a multiple faces, and + these faces might be in different leaf nodes. Such a vertex + will appear in the vert_indices array of each of those leaf + nodes. + + In order to support cases where you want access to multiple + nodes' vertices without duplication, the vert_indices array + is ordered such that the first part of the array, up to + index 'uniq_verts', contains "unique" vertex indices. These + vertices might not be truly unique to this node, but if + they appear in another node's vert_indices array, they will + be above that node's 'uniq_verts' value. + + Used for leaf nodes in a mesh-based PBVH (not multires.) + */ + int *vert_indices; unsigned int uniq_verts, face_verts; - char flag; + /* An array mapping face corners into the vert_indices + array. The array is sized to match 'totprim', and each of + the face's corners gets an index into the vert_indices + array, in the same order as the corners in the original + MFace. The fourth value should not be used if the original + face is a triangle. + + Used for leaf nodes in a mesh-based PBVH (not multires.) + */ + int (*face_vert_indices)[4]; + + /* Indicates whether this node is a leaf or not; also used for + marking various updates that need to be applied. */ + PBVHNodeFlags flag : 8; - float tmin; // used for raycasting, is how close bb is to the ray point + /* Used for raycasting: how close bb is to the ray point. */ + float tmin; int proxy_count; PBVHProxyNode* proxies; @@ -339,15 +374,15 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) node->uniq_verts = node->face_verts = 0; totface= node->totprim; - node->face_vert_indices = MEM_callocN(sizeof(int) * - 4*totface, "bvh node face vert indices"); + node->face_vert_indices = MEM_callocN(sizeof(int) * 4*totface, + "bvh node face vert indices"); for(i = 0; i < totface; ++i) { MFace *f = bvh->faces + node->prim_indices[i]; int sides = f->v4 ? 4 : 3; for(j = 0; j < sides; ++j) { - node->face_vert_indices[i*4 + j]= + node->face_vert_indices[i][j]= map_insert_vert(bvh, map, &node->face_verts, &node->uniq_verts, (&f->v1)[j]); } @@ -373,9 +408,17 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) BLI_ghashIterator_free(iter); - for(i = 0; i < totface*4; ++i) - if(node->face_vert_indices[i] < 0) - node->face_vert_indices[i]= -node->face_vert_indices[i] + node->uniq_verts - 1; + for(i = 0; i < totface; ++i) { + MFace *f = bvh->faces + node->prim_indices[i]; + int sides = f->v4 ? 4 : 3; + + for(j = 0; j < sides; ++j) { + if(node->face_vert_indices[i][j] < 0) + node->face_vert_indices[i][j]= + -node->face_vert_indices[i][j] + + node->uniq_verts - 1; + } + } if(!G.background) { node->draw_buffers = @@ -1340,20 +1383,20 @@ int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3], if(bvh->faces) { MVert *vert = bvh->verts; int *faces= node->prim_indices; - int *face_verts= node->face_vert_indices; int totface= node->totprim; int i; for(i = 0; i < totface; ++i) { MFace *f = bvh->faces + faces[i]; + int *face_verts = node->face_vert_indices[i]; if(origco) { /* intersect with backuped original coordinates */ hit |= ray_face_intersection(ray_start, ray_normal, - origco[face_verts[i*4+0]], - origco[face_verts[i*4+1]], - origco[face_verts[i*4+2]], - f->v4? origco[face_verts[i*4+3]]: NULL, + origco[face_verts[0]], + origco[face_verts[1]], + origco[face_verts[2]], + f->v4? origco[face_verts[3]]: NULL, dist); } else { diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 4ad99c02b2d..0633794c6ed 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3162,7 +3162,7 @@ static void lib_link_particlesettings(FileData *fd, Main *main) if(part->effector_weights) part->effector_weights->group = newlibadr(fd, part->id.lib, part->effector_weights->group); - if(part->dupliweights.first) { + if(part->dupliweights.first && part->dup_group) { int index_ok = 0; /* check for old files without indices (all indexes 0) */ dw = part->dupliweights.first; @@ -3193,6 +3193,9 @@ static void lib_link_particlesettings(FileData *fd, Main *main) dw->ob = newlibadr(fd, part->id.lib, dw->ob); } } + else { + part->dupliweights.first = part->dupliweights.last = NULL; + } if(part->boids) { BoidState *state = part->boids->states.first; diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 06d88b16fa8..210f36ca074 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -3432,7 +3432,6 @@ static int convertspline(short type, Nurb *nu) nu->type = CU_NURBS; nu->orderu= 4; nu->flagu &= CU_NURB_CYCLIC; /* disable all flags except for cyclic */ - nu->flagu |= CU_NURB_BEZIER; nurbs_knot_calc_u(nu); a= nu->pntsu*nu->pntsv; bp= nu->bp; @@ -6544,12 +6543,15 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob) BLI_assert(!"invalid nurbs type"); return NULL; } - - /* always do: */ - nu->flag |= CU_SMOOTH; - - test2DNurb(nu); - + + BLI_assert(nu != NULL); + + if(nu) { /* should always be set */ + nu->flag |= CU_SMOOTH; + + test2DNurb(nu); + } + return nu; } diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 75e7ee701a2..d9691819b29 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -1,3 +1,27 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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. + * + * 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. + * + * Contributor(s): + * + * ***** END GPL LICENSE BLOCK ***** + */ + /** \file blender/editors/interface/interface_anim.c * \ingroup edinterface */ diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index cdc839e084a..16f3789ecb1 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -1,6 +1,3 @@ -/** \file blender/editors/interface/resources.c - * \ingroup edinterface - */ /* * $Id$ * @@ -33,6 +30,10 @@ * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ +/** \file blender/editors/interface/resources.c + * \ingroup edinterface + */ + #include <math.h> #include <stdlib.h> #include <string.h> diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index f21241b6e7a..0fb7cf8b640 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -1096,7 +1096,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); View3D *v3d= CTX_wm_view3d(C); unsigned int lay, local; - int islamp= 0; + /* int islamp= 0; */ /* UNUSED */ lay= move_to_layer_init(C, op); lay &= 0xFFFFFF; @@ -1112,7 +1112,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op) base->object->lay= lay; base->object->flag &= ~SELECT; base->flag &= ~SELECT; - if(base->object->type==OB_LAMP) islamp= 1; + /* if(base->object->type==OB_LAMP) islamp= 1; */ } CTX_DATA_END; } @@ -1124,7 +1124,7 @@ static int move_to_layer_exec(bContext *C, wmOperator *op) local= base->lay & 0xFF000000; base->lay= lay + local; base->object->lay= lay; - if(base->object->type==OB_LAMP) islamp= 1; + /* if(base->object->type==OB_LAMP) islamp= 1; */ } CTX_DATA_END; } diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 68326edfb11..1410331700f 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -301,7 +301,7 @@ int ED_operator_object_active_editable(bContext *C) int ED_operator_object_active_editable_mesh(bContext *C) { Object *ob = ED_object_active_context(C); - return ((ob != NULL) && !(ob->id.lib) && !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->type == OB_MESH); + return ((ob != NULL) && !(ob->id.lib) && !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->type == OB_MESH && !(((ID *)ob->data)->lib)); } int ED_operator_object_active_editable_font(bContext *C) diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index c9a6aa87cd0..32004fd4525 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -2187,7 +2187,7 @@ static int IsectPoly2Df_twoside(const float pt[2], float uv[][2], const int tot) /* One of the most important function for projectiopn painting, since it selects the pixels to be added into each bucket. * initialize pixels from this face where it intersects with the bucket_index, optionally initialize pixels for removing seams */ -static void project_paint_face_init(const ProjPaintState *ps, const int thread_index, const int bucket_index, const int face_index, const int image_index, rctf *bucket_bounds, const ImBuf *ibuf) +static void project_paint_face_init(const ProjPaintState *ps, const int thread_index, const int bucket_index, const int face_index, const int image_index, rctf *bucket_bounds, const ImBuf *ibuf, const short clamp_u, const short clamp_v) { /* Projection vars, to get the 3D locations into screen space */ MemArena *arena = ps->arena_mt[thread_index]; @@ -2304,14 +2304,24 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i if (pixel_bounds_array(uv_clip, &bounds_px, ibuf->x, ibuf->y, uv_clip_tot)) { - + + if(clamp_u) { + CLAMP(bounds_px.xmin, 0, ibuf->x); + CLAMP(bounds_px.xmax, 0, ibuf->x); + } + + if(clamp_v) { + CLAMP(bounds_px.ymin, 0, ibuf->y); + CLAMP(bounds_px.ymax, 0, ibuf->y); + } + /* clip face and */ has_isect = 0; for (y = bounds_px.ymin; y < bounds_px.ymax; y++) { //uv[1] = (((float)y) + 0.5f) / (float)ibuf->y; uv[1] = (float)y / ibuf_yf; /* use pixel offset UV coords instead */ - + has_x_isect = 0; for (x = bounds_px.xmin; x < bounds_px.xmax; x++) { //uv[0] = (((float)x) + 0.5f) / ibuf->x; @@ -2630,6 +2640,7 @@ static void project_bucket_init(const ProjPaintState *ps, const int thread_index LinkNode *node; int face_index, image_index=0; ImBuf *ibuf = NULL; + Image *ima = NULL; MTFace *tf; Image *tpage_last = NULL; @@ -2638,9 +2649,10 @@ static void project_bucket_init(const ProjPaintState *ps, const int thread_index if (ps->image_tot==1) { /* Simple loop, no context switching */ ibuf = ps->projImages[0].ibuf; - + ima = ps->projImages[0].ima; + for (node = ps->bucketFaces[bucket_index]; node; node= node->next) { - project_paint_face_init(ps, thread_index, bucket_index, GET_INT_FROM_POINTER(node->link), 0, bucket_bounds, ibuf); + project_paint_face_init(ps, thread_index, bucket_index, GET_INT_FROM_POINTER(node->link), 0, bucket_bounds, ibuf, ima->tpageflag & IMA_CLAMP_U, ima->tpageflag & IMA_CLAMP_V); } } else { @@ -2659,14 +2671,14 @@ static void project_bucket_init(const ProjPaintState *ps, const int thread_index for (image_index=0; image_index < ps->image_tot; image_index++) { if (ps->projImages[image_index].ima == tpage_last) { ibuf = ps->projImages[image_index].ibuf; + ima = ps->projImages[image_index].ima; break; } } } /* context switching done */ - project_paint_face_init(ps, thread_index, bucket_index, face_index, image_index, bucket_bounds, ibuf); - + project_paint_face_init(ps, thread_index, bucket_index, face_index, image_index, bucket_bounds, ibuf, ima->tpageflag & IMA_CLAMP_U, ima->tpageflag & IMA_CLAMP_V); } } diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index ae80a554e08..5b95ae63e56 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -280,7 +280,8 @@ static char *view3d_modeselect_pup(Scene *scene) str += sprintf(str, formatstr, "Object Mode", OB_MODE_OBJECT, ICON_OBJECT_DATA); - if(ob==NULL) return string; + if(ob==NULL || ob->data==NULL) return string; + if(ob->id.lib || ((ID *)ob->data)->lib) return string; /* if active object is editable */ if ( ((ob->type == OB_MESH) diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 9290e1fc631..c6835b0cad3 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -889,14 +889,14 @@ static unsigned int samplerect(unsigned int *buf, int size, unsigned int dontdo) { Base *base; unsigned int *bufmin,*bufmax; - int a,b,rc,tel,aantal,dirvec[4][2],maxob; + int a,b,rc,tel,len,dirvec[4][2],maxob; unsigned int retval=0; base= LASTBASE; if(base==0) return 0; maxob= base->selcol; - aantal= (size-1)/2; + len= (size-1)/2; rc= 0; dirvec[0][0]= 1; @@ -910,7 +910,7 @@ static unsigned int samplerect(unsigned int *buf, int size, unsigned int dontdo) bufmin= buf; bufmax= buf+ size*size; - buf+= aantal*size+ aantal; + buf+= len*size+ len; for(tel=1;tel<=size;tel++) { diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 7f8d5976e86..92ac8471172 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4596,7 +4596,7 @@ static int createSlideVerts(TransInfo *t) #define EDGE_SLIDE_MIN 30 if (len_squared_v2v2(start, end) < (EDGE_SLIDE_MIN * EDGE_SLIDE_MIN)) { if(ABS(start[0]-end[0]) + ABS(start[1]-end[1]) < 4.0f) { - /* even more exceptional case, points are ontop of eachother */ + /* even more exceptional case, points are ontop of each other */ end[0]= start[0]; end[1]= start[1] + EDGE_SLIDE_MIN; } diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index 3ce84e3a19f..8d57403ec35 100644 --- a/source/blender/makesrna/intern/rna_ID.c +++ b/source/blender/makesrna/intern/rna_ID.c @@ -35,6 +35,7 @@ #include "DNA_ID.h" #include "DNA_vfont_types.h" +#include "DNA_material_types.h" #include "DNA_object_types.h" #include "WM_types.h" @@ -416,8 +417,9 @@ static void rna_def_ID_materials(BlenderRNA *brna) func= RNA_def_function(srna, "pop", "material_pop_id"); RNA_def_function_ui_description(func, "Remove a material from the data block."); - parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "", "Index of material to remove.", 0, INT_MAX); + parm= RNA_def_int(func, "index", 0, 0, MAXMAT, "", "Index of material to remove.", 0, MAXMAT); RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_boolean(func, "update_data", 0, "", "Update data by re-adjusting the material slots assigned."); parm= RNA_def_pointer(func, "material", "Material", "", "Material to remove."); RNA_def_function_return(func, parm); } diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c index e250cc84aa3..d44b68950f7 100644 --- a/source/blender/makesrna/intern/rna_wm_api.c +++ b/source/blender/makesrna/intern/rna_wm_api.c @@ -205,7 +205,7 @@ void RNA_api_operator(StructRNA *srna) /* check */ func= RNA_def_function(srna, "check", NULL); - RNA_def_function_ui_description(func, "Check the operator settings."); + RNA_def_function_ui_description(func, "Check the operator settings, return True to signal a change to redraw."); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); parm= RNA_def_pointer(func, "context", "Context", "", ""); RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c index a5d2e0b38c7..922ae8c1e92 100644 --- a/source/blender/modifiers/intern/MOD_uvproject.c +++ b/source/blender/modifiers/intern/MOD_uvproject.c @@ -42,6 +42,7 @@ #include "DNA_object_types.h" #include "BLI_math.h" +#include "BLI_string.h" #include "BLI_uvproject.h" #include "BLI_utildefines.h" @@ -83,6 +84,7 @@ static void copyData(ModifierData *md, ModifierData *target) tumd->aspecty = umd->aspecty; tumd->scalex = umd->scalex; tumd->scaley = umd->scaley; + BLI_strncpy(tumd->uvlayer_name, umd->uvlayer_name, sizeof(umd->uvlayer_name)); } static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md)) diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 6e1b9c807f3..502b25842de 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -3262,11 +3262,15 @@ static PyObject *pyrna_prop_dir(BPy_PropertyRNA *self) * */ ret= PyList_New(0); - if (!BPy_PropertyRNA_CheckExact(self)) + if (!BPy_PropertyRNA_CheckExact(self)) { pyrna_dir_members_py(ret, (PyObject *)self); + } - if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) - pyrna_dir_members_rna(ret, &r_ptr); + if(RNA_property_type(self->prop) == PROP_COLLECTION) { + if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) { + pyrna_dir_members_rna(ret, &r_ptr); + } + } return ret; } @@ -6407,7 +6411,9 @@ PyDoc_STRVAR(pyrna_register_class_doc, " If the class has a *register* class method it will be called\n" " before registration.\n" "\n" -" .. note:: :exc:`ValueError` exception is raised if the class is not a\n" +" .. note::\n" +"\n" +" :exc:`ValueError` exception is raised if the class is not a\n" " subclass of a registerable blender class.\n" "\n" ); diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp index 12024657149..fde127b7ef5 100644 --- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp +++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp @@ -38,12 +38,20 @@ #include "KX_PhysicsObjectWrapper.h" #include "PHY_IPhysicsController.h" #include "PHY_IVehicle.h" +#include "PHY_DynamicTypes.h" #include "MT_Matrix3x3.h" #include "PyObjectPlus.h" +#ifdef USE_BULLET +# include "LinearMath/btIDebugDraw.h" +#endif + #ifdef WITH_PYTHON +// macro copied from KX_PythonInit.cpp +#define KX_MACRO_addTypesToDict(dict, name, name2) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name2)); Py_DECREF(item) + // nasty glob variable to connect scripting language // if there is a better way (without global), please do so! static PHY_IPhysicsEnvironment* g_CurrentActivePhysicsEnvironment = NULL; @@ -84,8 +92,8 @@ static char gPyGetAppliedImpulse__doc__[] = "getAppliedImpulse(int constraintId) static PyObject* gPySetGravity(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float x,y,z; if (PyArg_ParseTuple(args,"fff",&x,&y,&z)) @@ -101,8 +109,8 @@ static PyObject* gPySetGravity(PyObject* self, } static PyObject* gPySetDebugMode(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { int mode; if (PyArg_ParseTuple(args,"i",&mode)) @@ -124,8 +132,8 @@ static PyObject* gPySetDebugMode(PyObject* self, static PyObject* gPySetNumTimeSubSteps(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { int substep; if (PyArg_ParseTuple(args,"i",&substep)) @@ -143,8 +151,8 @@ static PyObject* gPySetNumTimeSubSteps(PyObject* self, static PyObject* gPySetNumIterations(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { int iter; if (PyArg_ParseTuple(args,"i",&iter)) @@ -161,10 +169,9 @@ static PyObject* gPySetNumIterations(PyObject* self, } - static PyObject* gPySetDeactivationTime(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float deactive_time; if (PyArg_ParseTuple(args,"f",&deactive_time)) @@ -182,8 +189,8 @@ static PyObject* gPySetDeactivationTime(PyObject* self, static PyObject* gPySetDeactivationLinearTreshold(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float linearDeactivationTreshold; if (PyArg_ParseTuple(args,"f",&linearDeactivationTreshold)) @@ -201,8 +208,8 @@ static PyObject* gPySetDeactivationLinearTreshold(PyObject* self, static PyObject* gPySetDeactivationAngularTreshold(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float angularDeactivationTreshold; if (PyArg_ParseTuple(args,"f",&angularDeactivationTreshold)) @@ -219,8 +226,8 @@ static PyObject* gPySetDeactivationAngularTreshold(PyObject* self, } static PyObject* gPySetContactBreakingTreshold(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float contactBreakingTreshold; if (PyArg_ParseTuple(args,"f",&contactBreakingTreshold)) @@ -238,8 +245,8 @@ static PyObject* gPySetContactBreakingTreshold(PyObject* self, static PyObject* gPySetCcdMode(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float ccdMode; if (PyArg_ParseTuple(args,"f",&ccdMode)) @@ -256,8 +263,8 @@ static PyObject* gPySetCcdMode(PyObject* self, } static PyObject* gPySetSorConstant(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float sor; if (PyArg_ParseTuple(args,"f",&sor)) @@ -274,8 +281,8 @@ static PyObject* gPySetSorConstant(PyObject* self, } static PyObject* gPySetSolverTau(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float tau; if (PyArg_ParseTuple(args,"f",&tau)) @@ -293,8 +300,8 @@ static PyObject* gPySetSolverTau(PyObject* self, static PyObject* gPySetSolverDamping(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float damping; if (PyArg_ParseTuple(args,"f",&damping)) @@ -311,8 +318,8 @@ static PyObject* gPySetSolverDamping(PyObject* self, } static PyObject* gPySetLinearAirDamping(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float damping; if (PyArg_ParseTuple(args,"f",&damping)) @@ -330,8 +337,8 @@ static PyObject* gPySetLinearAirDamping(PyObject* self, static PyObject* gPySetUseEpa(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { int epa; if (PyArg_ParseTuple(args,"i",&epa)) @@ -347,8 +354,8 @@ static PyObject* gPySetUseEpa(PyObject* self, Py_RETURN_NONE; } static PyObject* gPySetSolverType(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { int solverType; if (PyArg_ParseTuple(args,"i",&solverType)) @@ -367,8 +374,8 @@ static PyObject* gPySetSolverType(PyObject* self, static PyObject* gPyGetVehicleConstraint(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { #if defined(_WIN64) __int64 constraintid; @@ -398,9 +405,6 @@ static PyObject* gPyGetVehicleConstraint(PyObject* self, } - - - static PyObject* gPyCreateConstraint(PyObject* self, PyObject* args, PyObject* kwds) @@ -425,39 +429,39 @@ static PyObject* gPyCreateConstraint(PyObject* self, success = PyArg_ParseTuple(args,"lli",&physicsid,&physicsid2,&constrainttype); #endif } - else - if (len ==6) + else if (len == 6) { #if defined(_WIN64) success = PyArg_ParseTuple(args,"LLifff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ); + &pivotX,&pivotY,&pivotZ); #else success = PyArg_ParseTuple(args,"llifff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ); + &pivotX,&pivotY,&pivotZ); #endif } else if (len == 9) { #if defined(_WIN64) success = PyArg_ParseTuple(args,"LLiffffff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); #else success = PyArg_ParseTuple(args,"lliffffff",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); #endif - } else if (len == 10) { #if defined(_WIN64) success = PyArg_ParseTuple(args,"LLiffffffi",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); #else success = PyArg_ParseTuple(args,"lliffffffi",&physicsid,&physicsid2,&constrainttype, - &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag); #endif } - else if (len==4) + + /* XXX extrainfo seems to be nothing implemented. right now it works as a pivot with [X,0,0] */ + else if (len == 4) { #if defined(_WIN64) success = PyArg_ParseTuple(args,"LLii",&physicsid,&physicsid2,&constrainttype,&extrainfo); @@ -466,7 +470,7 @@ static PyObject* gPyCreateConstraint(PyObject* self, #endif pivotX=extrainfo; } - + if (success) { if (PHY_GetActiveEnvironment()) @@ -490,20 +494,18 @@ static PyObject* gPyCreateConstraint(PyObject* self, MT_Vector3 axis0 = localCFrame.getColumn(0); MT_Vector3 axis1 = localCFrame.getColumn(1); MT_Vector3 axis2 = localCFrame.getColumn(2); - - constraintid = PHY_GetActiveEnvironment()->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype, - pivotX,pivotY,pivotZ, - (float)axis0.x(),(float)axis0.y(),(float)axis0.z(), - (float)axis1.x(),(float)axis1.y(),(float)axis1.z(), - (float)axis2.x(),(float)axis2.y(),(float)axis2.z(),flag); - } else - { + constraintid = PHY_GetActiveEnvironment()->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype, + pivotX,pivotY,pivotZ, + (float)axis0.x(),(float)axis0.y(),(float)axis0.z(), + (float)axis1.x(),(float)axis1.y(),(float)axis1.z(), + (float)axis2.x(),(float)axis2.y(),(float)axis2.z(),flag); + } + else { constraintid = PHY_GetActiveEnvironment()->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype,pivotX,pivotY,pivotZ,axisX,axisY,axisZ,0); } KX_ConstraintWrapper* wrap = new KX_ConstraintWrapper((enum PHY_ConstraintType)constrainttype,constraintid,PHY_GetActiveEnvironment()); - return wrap->NewProxy(true); } @@ -522,8 +524,8 @@ static PyObject* gPyCreateConstraint(PyObject* self, static PyObject* gPyGetAppliedImpulse(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { float appliedImpulse = 0.f; @@ -549,8 +551,8 @@ static PyObject* gPyGetAppliedImpulse(PyObject* self, static PyObject* gPyRemoveConstraint(PyObject* self, - PyObject* args, - PyObject* kwds) + PyObject* args, + PyObject* kwds) { #if defined(_WIN64) __int64 constraintid; @@ -577,7 +579,7 @@ static PyObject* gPyExportBulletFile(PyObject*, PyObject* args) char* filename; if (!PyArg_ParseTuple(args,"s:exportBulletFile",&filename)) return NULL; - + if (PHY_GetActiveEnvironment()) { PHY_GetActiveEnvironment()->exportFile(filename); @@ -586,62 +588,61 @@ static PyObject* gPyExportBulletFile(PyObject*, PyObject* args) } static struct PyMethodDef physicsconstraints_methods[] = { - {"setGravity",(PyCFunction) gPySetGravity, - METH_VARARGS, (const char *)gPySetGravity__doc__}, - {"setDebugMode",(PyCFunction) gPySetDebugMode, - METH_VARARGS, (const char *)gPySetDebugMode__doc__}, - - /// settings that influence quality of the rigidbody dynamics - {"setNumIterations",(PyCFunction) gPySetNumIterations, - METH_VARARGS, (const char *)gPySetNumIterations__doc__}, - - {"setNumTimeSubSteps",(PyCFunction) gPySetNumTimeSubSteps, - METH_VARARGS, (const char *)gPySetNumTimeSubSteps__doc__}, - - {"setDeactivationTime",(PyCFunction) gPySetDeactivationTime, - METH_VARARGS, (const char *)gPySetDeactivationTime__doc__}, - - {"setDeactivationLinearTreshold",(PyCFunction) gPySetDeactivationLinearTreshold, - METH_VARARGS, (const char *)gPySetDeactivationLinearTreshold__doc__}, - {"setDeactivationAngularTreshold",(PyCFunction) gPySetDeactivationAngularTreshold, - METH_VARARGS, (const char *)gPySetDeactivationAngularTreshold__doc__}, - - {"setContactBreakingTreshold",(PyCFunction) gPySetContactBreakingTreshold, - METH_VARARGS, (const char *)gPySetContactBreakingTreshold__doc__}, - {"setCcdMode",(PyCFunction) gPySetCcdMode, - METH_VARARGS, (const char *)gPySetCcdMode__doc__}, - {"setSorConstant",(PyCFunction) gPySetSorConstant, - METH_VARARGS, (const char *)gPySetSorConstant__doc__}, - {"setSolverTau",(PyCFunction) gPySetSolverTau, - METH_VARARGS, (const char *)gPySetSolverTau__doc__}, - {"setSolverDamping",(PyCFunction) gPySetSolverDamping, - METH_VARARGS, (const char *)gPySetSolverDamping__doc__}, - - {"setLinearAirDamping",(PyCFunction) gPySetLinearAirDamping, - METH_VARARGS, (const char *)gPySetLinearAirDamping__doc__}, - - {"setUseEpa",(PyCFunction) gPySetUseEpa, - METH_VARARGS, (const char *)gPySetUseEpa__doc__}, + {"setGravity",(PyCFunction) gPySetGravity, + METH_VARARGS, (const char*)gPySetGravity__doc__}, + {"setDebugMode",(PyCFunction) gPySetDebugMode, + METH_VARARGS, (const char *)gPySetDebugMode__doc__}, + + /// settings that influence quality of the rigidbody dynamics + {"setNumIterations",(PyCFunction) gPySetNumIterations, + METH_VARARGS, (const char *)gPySetNumIterations__doc__}, + + {"setNumTimeSubSteps",(PyCFunction) gPySetNumTimeSubSteps, + METH_VARARGS, (const char *)gPySetNumTimeSubSteps__doc__}, + + {"setDeactivationTime",(PyCFunction) gPySetDeactivationTime, + METH_VARARGS, (const char *)gPySetDeactivationTime__doc__}, + + {"setDeactivationLinearTreshold",(PyCFunction) gPySetDeactivationLinearTreshold, + METH_VARARGS, (const char *)gPySetDeactivationLinearTreshold__doc__}, + {"setDeactivationAngularTreshold",(PyCFunction) gPySetDeactivationAngularTreshold, + METH_VARARGS, (const char *)gPySetDeactivationAngularTreshold__doc__}, + + {"setContactBreakingTreshold",(PyCFunction) gPySetContactBreakingTreshold, + METH_VARARGS, (const char *)gPySetContactBreakingTreshold__doc__}, + {"setCcdMode",(PyCFunction) gPySetCcdMode, + METH_VARARGS, (const char *)gPySetCcdMode__doc__}, + {"setSorConstant",(PyCFunction) gPySetSorConstant, + METH_VARARGS, (const char *)gPySetSorConstant__doc__}, + {"setSolverTau",(PyCFunction) gPySetSolverTau, + METH_VARARGS, (const char *)gPySetSolverTau__doc__}, + {"setSolverDamping",(PyCFunction) gPySetSolverDamping, + METH_VARARGS, (const char *)gPySetSolverDamping__doc__}, + + {"setLinearAirDamping",(PyCFunction) gPySetLinearAirDamping, + METH_VARARGS, (const char *)gPySetLinearAirDamping__doc__}, + + {"setUseEpa",(PyCFunction) gPySetUseEpa, + METH_VARARGS, (const char *)gPySetUseEpa__doc__}, {"setSolverType",(PyCFunction) gPySetSolverType, - METH_VARARGS, (const char *)gPySetSolverType__doc__}, + METH_VARARGS, (const char *)gPySetSolverType__doc__}, - {"createConstraint",(PyCFunction) gPyCreateConstraint, - METH_VARARGS, (const char *)gPyCreateConstraint__doc__}, - {"getVehicleConstraint",(PyCFunction) gPyGetVehicleConstraint, - METH_VARARGS, (const char *)gPyGetVehicleConstraint__doc__}, + {"createConstraint",(PyCFunction) gPyCreateConstraint, + METH_VARARGS, (const char *)gPyCreateConstraint__doc__}, + {"getVehicleConstraint",(PyCFunction) gPyGetVehicleConstraint, + METH_VARARGS, (const char *)gPyGetVehicleConstraint__doc__}, - {"removeConstraint",(PyCFunction) gPyRemoveConstraint, - METH_VARARGS, (const char *)gPyRemoveConstraint__doc__}, + {"removeConstraint",(PyCFunction) gPyRemoveConstraint, + METH_VARARGS, (const char *)gPyRemoveConstraint__doc__}, {"getAppliedImpulse",(PyCFunction) gPyGetAppliedImpulse, - METH_VARARGS, (const char *)gPyGetAppliedImpulse__doc__}, + METH_VARARGS, (const char *)gPyGetAppliedImpulse__doc__}, - {"exportBulletFile",(PyCFunction)gPyExportBulletFile, - METH_VARARGS, "export a .bullet file"}, + {"exportBulletFile",(PyCFunction)gPyExportBulletFile, + METH_VARARGS, "export a .bullet file"}, - - //sentinel - { NULL, (PyCFunction) NULL, 0, NULL } + //sentinel + { NULL, (PyCFunction) NULL, 0, NULL } }; static struct PyModuleDef PhysicsConstraints_module_def = { @@ -656,12 +657,13 @@ static struct PyModuleDef PhysicsConstraints_module_def = { 0, /* m_free */ }; -PyObject* initPythonConstraintBinding() +PyObject* initPythonConstraintBinding() { - PyObject* ErrorObject; - PyObject* m; - PyObject* d; + PyObject* ErrorObject; + PyObject* m; + PyObject* d; + PyObject* item; /* Use existing module where possible * be careful not to init any runtime vars after this */ @@ -677,21 +679,43 @@ PyObject* initPythonConstraintBinding() PyDict_SetItemString(PySys_GetObject("modules"), PhysicsConstraints_module_def.m_name, m); } - // Add some symbolic constants to the module - d = PyModule_GetDict(m); - ErrorObject = PyUnicode_FromString("PhysicsConstraints.error"); - PyDict_SetItemString(d, "error", ErrorObject); - Py_DECREF(ErrorObject); - - // XXXX Add constants here - - // Check for errors - if (PyErr_Occurred()) - { - Py_FatalError("can't initialize module PhysicsConstraints"); - } - - return d; + // Add some symbolic constants to the module + d = PyModule_GetDict(m); + ErrorObject = PyUnicode_FromString("PhysicsConstraints.error"); + PyDict_SetItemString(d, "error", ErrorObject); + Py_DECREF(ErrorObject); + +#ifdef USE_BULLET + //Debug Modes constants to be used with setDebugMode() python function + KX_MACRO_addTypesToDict(d, DBG_NODEBUG, btIDebugDraw::DBG_NoDebug); + KX_MACRO_addTypesToDict(d, DBG_DRAWWIREFRAME, btIDebugDraw::DBG_DrawWireframe); + KX_MACRO_addTypesToDict(d, DBG_DRAWAABB, btIDebugDraw::DBG_DrawAabb); + KX_MACRO_addTypesToDict(d, DBG_DRAWFREATURESTEXT, btIDebugDraw::DBG_DrawFeaturesText); + KX_MACRO_addTypesToDict(d, DBG_DRAWCONTACTPOINTS, btIDebugDraw::DBG_DrawContactPoints); + KX_MACRO_addTypesToDict(d, DBG_NOHELPTEXT, btIDebugDraw::DBG_NoHelpText); + KX_MACRO_addTypesToDict(d, DBG_DRAWTEXT, btIDebugDraw::DBG_DrawText); + KX_MACRO_addTypesToDict(d, DBG_PROFILETIMINGS, btIDebugDraw::DBG_ProfileTimings); + KX_MACRO_addTypesToDict(d, DBG_ENABLESATCOMPARISION, btIDebugDraw::DBG_EnableSatComparison); + KX_MACRO_addTypesToDict(d, DBG_DISABLEBULLETLCP, btIDebugDraw::DBG_DisableBulletLCP); + KX_MACRO_addTypesToDict(d, DBG_ENABLECDD, btIDebugDraw::DBG_EnableCCD); + KX_MACRO_addTypesToDict(d, DBG_DRAWCONSTRAINTS, btIDebugDraw::DBG_DrawConstraints); + KX_MACRO_addTypesToDict(d, DBG_DRAWCONSTRAINTLIMITS, btIDebugDraw::DBG_DrawConstraintLimits); + KX_MACRO_addTypesToDict(d, DBG_FASTWIREFRAME, btIDebugDraw::DBG_FastWireframe); +#endif // USE_BULLET + + //Constraint types to be used with createConstraint() python function + KX_MACRO_addTypesToDict(d, POINTTOPOINT_CONSTRAINT, PHY_POINT2POINT_CONSTRAINT); + KX_MACRO_addTypesToDict(d, LINEHINGE_CONSTRAINT, PHY_LINEHINGE_CONSTRAINT); + KX_MACRO_addTypesToDict(d, ANGULAR_CONSTRAINT, PHY_ANGULAR_CONSTRAINT); + KX_MACRO_addTypesToDict(d, CONETWIST_CONSTRAINT, PHY_CONE_TWIST_CONSTRAINT); + KX_MACRO_addTypesToDict(d, VEHICLE_CONSTRAINT, PHY_VEHICLE_CONSTRAINT); + + // Check for errors + if (PyErr_Occurred()) { + Py_FatalError("can't initialize module PhysicsConstraints"); + } + + return d; } @@ -709,7 +733,4 @@ PHY_IPhysicsEnvironment* PHY_GetActiveEnvironment() return g_CurrentActivePhysicsEnvironment; } - - #endif // WITH_PYTHON - |