svn merge -r38814:38905 https://svn.blender.org/svnroot/bf-blender/trunk/blender .
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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())]
|
||||
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
Game Engine bge.events Module
|
||||
=============================
|
||||
Game Keys (bge.events)
|
||||
======================
|
||||
|
||||
*****
|
||||
Intro
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
|
||||
Game Engine bge.logic Module
|
||||
============================
|
||||
Game Logic (bge.logic)
|
||||
======================
|
||||
|
||||
*****
|
||||
Intro
|
||||
*****
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
Game Engine bge.types Module
|
||||
=============================
|
||||
Game Types (bge.types)
|
||||
======================
|
||||
|
||||
.. module:: bge.types
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
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 unclean_chars:
|
||||
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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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",
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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, )
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -26,7 +26,7 @@ __all__ = (
|
||||
"edge_loops_from_edges",
|
||||
"ngon_tesselate",
|
||||
"face_random_points",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def mesh_linked_faces(mesh):
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
int a;
|
||||
|
||||
t = aantal+order;
|
||||
if(type==0) {
|
||||
|
||||
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--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
id_us_min((ID *)ret);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/* decrease mat_nr index */
|
||||
data_delete_material_index_id(id, index);
|
||||
}
|
||||
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);
|
||||
}
|
||||
/* 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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--;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
float tmin; // used for raycasting, is how close bb is to the ray point
|
||||
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;
|
||||
|
||||
/* 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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
);
|
||||
|
||||
@@ -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__},
|
||||
{"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__},
|
||||
/// 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__},
|
||||
{"setNumTimeSubSteps",(PyCFunction) gPySetNumTimeSubSteps,
|
||||
METH_VARARGS, (const char *)gPySetNumTimeSubSteps__doc__},
|
||||
|
||||
{"setDeactivationTime",(PyCFunction) gPySetDeactivationTime,
|
||||
METH_VARARGS, (const char *)gPySetDeactivationTime__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__},
|
||||
{"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__},
|
||||
{"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__},
|
||||
{"setLinearAirDamping",(PyCFunction) gPySetLinearAirDamping,
|
||||
METH_VARARGS, (const char *)gPySetLinearAirDamping__doc__},
|
||||
|
||||
{"setUseEpa",(PyCFunction) gPySetUseEpa,
|
||||
METH_VARARGS, (const char *)gPySetUseEpa__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);
|
||||
// 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
|
||||
#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
|
||||
|
||||
// Check for errors
|
||||
if (PyErr_Occurred())
|
||||
{
|
||||
Py_FatalError("can't initialize module PhysicsConstraints");
|
||||
}
|
||||
//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);
|
||||
|
||||
return d;
|
||||
// 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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user