merge from trunk - r17500 to HEAD
authorCampbell Barton <ideasman42@gmail.com>
Wed, 10 Dec 2008 09:45:48 +0000 (09:45 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 10 Dec 2008 09:45:48 +0000 (09:45 +0000)
70 files changed:
config/irix6-config.py [new file with mode: 0644]
extern/Makefile
intern/SoundSystem/Makefile
intern/elbeem/intern/utilities.h
projectfiles_vc9/blender/blender.sln
projectfiles_vc9/blender/nodes/nodes.vcproj
projectfiles_vc9/gameengine/gameplayer/ghost/GP_ghost.vcproj
release/Makefile
release/scripts/bpymodules/BPyImage.py
release/scripts/bpymodules/BPySys.py
release/scripts/export_fbx.py
source/Makefile
source/blender/blenkernel/BKE_node.h
source/blender/blenkernel/intern/node.c
source/blender/blenlib/intern/storage.c
source/blender/imbuf/intern/imageprocess.c
source/blender/include/BIF_editparticle.h
source/blender/include/BIF_outliner.h
source/blender/include/butspace.h
source/blender/include/transform.h
source/blender/makesdna/DNA_scriptlink_types.h
source/blender/nodes/TEX_node.h
source/blender/nodes/intern/TEX_nodes/TEX_coord.c [new file with mode: 0644]
source/blender/nodes/intern/TEX_nodes/TEX_distance.c [new file with mode: 0644]
source/blender/nodes/intern/TEX_util.c
source/blender/python/BPY_interface.c
source/blender/python/api2_2x/Blender.c
source/blender/python/api2_2x/Sys.c
source/blender/python/api2_2x/doc/API_related.py
source/blender/python/api2_2x/doc/Sys.py
source/blender/src/SConscript
source/blender/src/buttons_editing.c
source/blender/src/buttons_scene.c
source/blender/src/drawimage.c
source/blender/src/editparticle.c
source/blender/src/header_time.c
source/blender/src/header_view3d.c
source/blender/src/outliner.c
source/blender/src/playanim.c
source/blender/src/seqeffects.c
source/blender/src/space.c
source/blender/src/transform.c
source/blender/src/transform_constraints.c
source/blender/src/transform_generics.c
source/creator/creator.c
source/gameengine/BlenderRoutines/Makefile
source/gameengine/GamePlayer/common/unix/Makefile
source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
source/gameengine/Ketsji/KX_BulletPhysicsController.h
source/gameengine/Ketsji/KX_Camera.cpp
source/gameengine/Ketsji/KX_GameObject.cpp
source/gameengine/Ketsji/KX_GameObject.h
source/gameengine/Ketsji/KX_KetsjiEngine.h
source/gameengine/Ketsji/KX_Scene.cpp
source/gameengine/PyDoc/KX_GameObject.py
source/gameengine/Rasterizer/RAS_FramingManager.h
source/gameengine/Rasterizer/RAS_IRasterizer.h
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
source/gameengine/VideoTexture/Exception.cpp
source/gameengine/VideoTexture/Exception.h
source/gameengine/VideoTexture/ImageRender.cpp
source/gameengine/VideoTexture/ImageRender.h
source/gameengine/VideoTexture/ImageViewport.cpp
source/gameengine/VideoTexture/ImageViewport.h
source/gameengine/VideoTexture/Texture.h
source/gameengine/VideoTexture/blendVideoTex.cpp
source/nan_compile.mk
source/nan_definitions.mk
source/nan_link.mk

diff --git a/config/irix6-config.py b/config/irix6-config.py
new file mode 100644 (file)
index 0000000..b643aff
--- /dev/null
@@ -0,0 +1,231 @@
+import os
+
+LCGDIR = os.getcwd()+"/../lib/irix-6.5-mips"
+LIBDIR = LCGDIR
+print LCGDIR
+
+WITH_BF_VERSE = 'false'
+BF_VERSE_INCLUDE = "#extern/verse/dist"
+
+BF_PYTHON = LCGDIR+'/python'
+BF_PYTHON_VERSION = '2.5'
+WITH_BF_STATICPYTHON = 'true'
+BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
+BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}'
+BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}' #BF_PYTHON+'/lib/python'+BF_PYTHON_VERSION+'/config/libpython'+BF_PYTHON_VERSION+'.a'
+BF_PYTHON_LINKFLAGS = ['-Xlinker', '-export-dynamic']
+BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/python2.5/config/libpython${BF_PYTHON_VERSION}.a'
+
+WITH_BF_OPENAL = 'true'
+WITH_BF_STATICOPENAL = 'true'
+BF_OPENAL = LCGDIR+'/openal'
+BF_OPENAL_INC = '${BF_OPENAL}/include'
+BF_OPENAL_LIB = 'openal'
+BF_OPENAL_LIB_STATIC = '${BF_OPENAL}/lib/libopenal.a'
+BF_OPENAL_LIBPATH = LIBDIR + '/lib'
+
+# some distros have a separate libalut
+# if you get linker complaints, you need to uncomment the line below
+# BF_OPENAL_LIB = 'openal alut'  
+# BF_OPENAL_LIB_STATIC = '${BF_OPENAL}/lib/libopenal.a ${BF_OPENAL}/lib/libalut.a'
+
+BF_CXX = '/usr'
+WITH_BF_STATICCXX = 'false'
+BF_CXX_LIB_STATIC = '${BF_CXX}/lib/libstdc++.a'
+
+WITH_BF_SDL = 'true'
+BF_SDL = LCGDIR+'/SDL' #$(shell sdl-config --prefix)
+BF_SDL_INC = '${BF_SDL}/include/SDL' #$(shell $(BF_SDL)/bin/sdl-config --cflags)
+BF_SDL_LIB = 'SDL audio iconv charset' #BF_SDL #$(shell $(BF_SDL)/bin/sdl-config --libs) -lSDL_mixer
+BF_SDL_LIBPATH = '${BF_SDL}/lib'
+
+WITH_BF_FMOD = 'false'
+BF_FMOD = LIBDIR + '/fmod'
+
+WITH_BF_OPENEXR = 'false'
+WITH_BF_STATICOPENEXR = 'false'
+BF_OPENEXR = '/usr'
+# when compiling with your own openexr lib you might need to set...
+# BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR ${BF_OPENEXR}/include'
+
+BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR'
+BF_OPENEXR_LIB = 'Half IlmImf Iex Imath '
+BF_OPENEXR_LIB_STATIC = '${BF_OPENEXR}/lib/libHalf.a ${BF_OPENEXR}/lib/libIlmImf.a ${BF_OPENEXR}/lib/libIex.a ${BF_OPENEXR}/lib/libImath.a ${BF_OPENEXR}/lib/libIlmThread.a'
+# BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
+
+
+WITH_BF_DDS = 'false'
+
+WITH_BF_JPEG = 'false'
+BF_JPEG = LCGDIR+'/jpeg'
+BF_JPEG_INC = '${BF_JPEG}/include'
+BF_JPEG_LIB = 'jpeg'
+BF_JPEG_LIBPATH = '${BF_JPEG}/lib'
+
+WITH_BF_PNG = 'false'
+BF_PNG = LCGDIR+"/png"
+BF_PNG_INC = '${BF_PNG}/include'
+BF_PNG_LIB = 'png'
+BF_PNG_LIBPATH = '${BF_PNG}/lib'
+
+BF_TIFF = '/usr/nekoware'
+BF_TIFF_INC = '${BF_TIFF}/include'
+
+WITH_BF_ZLIB = 'true'
+BF_ZLIB = LCGDIR+"/zlib"
+BF_ZLIB_INC = '${BF_ZLIB}/include'
+BF_ZLIB_LIB = 'z'
+BF_ZLIB_LIBPATH = '${BF_ZLIB}/lib'
+
+WITH_BF_INTERNATIONAL = 'true'
+
+BF_GETTEXT = LCGDIR+'/gettext'
+BF_GETTEXT_INC = '${BF_GETTEXT}/include'
+BF_GETTEXT_LIB = 'gettextpo intl'
+BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
+
+WITH_BF_FTGL = 'true'
+BF_FTGL = '#extern/bFTGL'
+BF_FTGL_INC = '${BF_FTGL}/include'
+BF_FTGL_LIB = 'extern_ftgl'
+
+WITH_BF_GAMEENGINE='false'
+
+WITH_BF_ODE = 'false'
+BF_ODE = LIBDIR + '/ode'
+BF_ODE_INC = BF_ODE + '/include'
+BF_ODE_LIB = BF_ODE + '/lib/libode.a'
+
+WITH_BF_BULLET = 'true'
+BF_BULLET = '#extern/bullet2/src'
+BF_BULLET_INC = '${BF_BULLET}'
+BF_BULLET_LIB = 'extern_bullet'
+
+BF_SOLID = '#extern/solid'
+BF_SOLID_INC = '${BF_SOLID}'
+BF_SOLID_LIB = 'extern_solid'
+
+WITH_BF_YAFRAY = 'true'
+
+#WITH_BF_NSPR = 'true'
+#BF_NSPR = $(LIBDIR)/nspr
+#BF_NSPR_INC = -I$(BF_NSPR)/include -I$(BF_NSPR)/include/nspr
+#BF_NSPR_LIB = 
+
+# Uncomment the following line to use Mozilla inplace of netscape
+#CPPFLAGS += -DMOZ_NOT_NET
+# Location of MOZILLA/Netscape header files...
+#BF_MOZILLA = $(LIBDIR)/mozilla
+#BF_MOZILLA_INC = -I$(BF_MOZILLA)/include/mozilla/nspr -I$(BF_MOZILLA)/include/mozilla -I$(BF_MOZILLA)/include/mozilla/xpcom -I$(BF_MOZILLA)/include/mozilla/idl
+#BF_MOZILLA_LIB =
+# Will fall back to look in BF_MOZILLA_INC/nspr and BF_MOZILLA_LIB
+# if this is not set.
+#
+# Be paranoid regarding library creation (do not update archives)
+#BF_PARANOID = 'true'
+
+# enable freetype2 support for text objects
+BF_FREETYPE = LCGDIR+'/freetype'
+BF_FREETYPE_INC = '${BF_FREETYPE}/include ${BF_FREETYPE}/include/freetype2'
+BF_FREETYPE_LIB = 'freetype'
+BF_FREETYPE_LIBPATH = '${BF_FREETYPE}/lib'
+
+WITH_BF_QUICKTIME = 'false' # -DWITH_QUICKTIME
+BF_QUICKTIME = '/usr/local'
+BF_QUICKTIME_INC = '${BF_QUICKTIME}/include'
+
+WITH_BF_ICONV = 'true'
+BF_ICONV = LIBDIR + "/iconv"
+BF_ICONV_INC = '${BF_ICONV}/include'
+BF_ICONV_LIB = 'iconv charset'
+BF_ICONV_LIBPATH = '${BF_ICONV}/lib'
+
+WITH_BF_BINRELOC = 'false'
+
+# enable ffmpeg  support
+WITH_BF_FFMPEG = 'true'  # -DWITH_FFMPEG
+# Uncomment the following two lines to use system's ffmpeg
+BF_FFMPEG = LCGDIR+'/ffmpeg'
+BF_FFMPEG_LIB = 'avformat avcodec swscale avutil faad faac vorbis x264 ogg mp3lame z'
+BF_FFMPEG_INC = '${BF_FFMPEG}/include'
+BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib'
+
+# enable ogg, vorbis and theora in ffmpeg
+WITH_BF_OGG = 'false'  # -DWITH_OGG 
+BF_OGG = '/usr'
+BF_OGG_INC = '${BF_OGG}/include'
+BF_OGG_LIB = 'ogg vorbis theoraenc theoradec'
+
+WITH_BF_OPENJPEG = 'false' 
+BF_OPENJPEG = '#extern/libopenjpeg'
+BF_OPENJPEG_LIB = ''
+BF_OPENJPEG_INC = '${BF_OPENJPEG}/include'
+BF_OPENJPEG_LIBPATH='${BF_OPENJPEG}/lib'
+
+WITH_BF_REDCODE = 'false'  
+BF_REDCODE = '#extern/libredcode'
+BF_REDCODE_LIB = ''
+BF_REDCODE_INC = '${BF_REDCODE}/include'
+BF_REDCODE_LIBPATH='${BF_REDCODE}/lib'
+
+# Mesa Libs should go here if your using them as well....
+WITH_BF_STATICOPENGL = 'false'
+BF_OPENGL = '/usr'
+BF_OPENGL_INC = '${BF_OPENGL}/include'
+BF_OPENGL_LIB = 'GL GLU X11 Xi Xext'
+BF_OPENGL_LIBPATH = '/usr/X11R6/lib'
+BF_OPENGL_LIB_STATIC = '${BF_OPENGL}/libGL.a ${BF_OPENGL}/libGLU.a ${BF_OPENGL}/libXxf86vm.a ${BF_OPENGL}/libX11.a ${BF_OPENGL}/libXi.a ${BF_OPENGL}/libXext.a ${BF_OPENGL}/libXxf86vm.a'
+
+
+CC = 'c99'
+CXX = 'CC'
+
+
+CCFLAGS = ['-pipe','-fPIC', '-n32']
+
+CPPFLAGS = ['-DXP_UNIX']
+CXXFLAGS = ['-pipe','-fPIC', '-n32']
+REL_CFLAGS = ['-O2']
+REL_CCFLAGS = ['-O2']
+##BF_DEPEND = 'true'
+##
+##AR = ar
+##ARFLAGS = ruv
+##ARFLAGSQUIET = ru
+##
+C_WARN = '-no_prelink -ptused'
+
+CC_WARN = '-no_prelink -ptused'
+
+##FIX_STUBS_WARNINGS = -Wno-unused
+
+LLIBS = 'c m dl pthread dmedia movie'
+##LOPTS = --dynamic
+##DYNLDFLAGS = -shared $(LDFLAGS)
+
+BF_PROFILE_FLAGS = ['-pg','-g']
+BF_PROFILE = 'false'
+
+BF_DEBUG = 'false'
+BF_DEBUG_FLAGS = '-g'
+
+BF_BUILDDIR = '../build/irix6'
+BF_INSTALLDIR='../install/irix6'
+BF_DOCDIR='../install/doc'
+
+#Link against pthread
+LDIRS = []
+LDIRS.append(BF_FREETYPE_LIBPATH)
+LDIRS.append(BF_PNG_LIBPATH)
+LDIRS.append(BF_ZLIB_LIBPATH)
+LDIRS.append(BF_SDL_LIBPATH)
+LDIRS.append(BF_OPENAL_LIBPATH)
+LDIRS.append(BF_ICONV_LIBPATH)
+
+PLATFORM_LINKFLAGS = []
+for x in LDIRS:
+    PLATFORM_LINKFLAGS.append("-L"+x)
+    
+PLATFORM_LINKFLAGS += ['-L${LCGDIR}/jpeg/lib' , '-L/usr/lib32',  '-n32', '-v', '-no_prelink']
+print PLATFORM_LINKFLAGS
+LINKFLAGS= PLATFORM_LINKFLAGS
index 26ee25b608f0049f3777f5d57086f8ca5752ff98..51213698ebbfd83b88d7afaeab13090389279f52 100644 (file)
@@ -57,10 +57,7 @@ ifeq ($(WITH_BINRELOC), true)
     DIRS += binreloc
 endif
 
-TARGET =
-ifneq ($(OS),irix)
-  TARGET=solid
-endif
+TARGET = solid
 
 all::
        @[ -d $(OCGDIR)/extern ] || mkdir -p $(OCGDIR)/extern
index d00339f351c4957b86c5d063f92ef275dfcd2989..051e2643a87dd7a0a1cfe95c5bec69d8b7ffecf6 100644 (file)
@@ -47,6 +47,9 @@ ifneq ($(NAN_NO_OPENAL),true)
   ifeq ($(OS),$(findstring $(OS), "linux freebsd solaris"))
     DIRS += openal sdl
   endif
+  ifeq ($(OS), irix)
+    DIRS += sdl
+  endif
 else
   export CPPFLAGS += -DNO_SOUND
 endif
index 825e92251fe5d4d7705fb06b3878631ce3648730..a5f63e696a6db6de4b7d757e8391d1e1fbd8223c 100644 (file)
@@ -154,12 +154,18 @@ int writePng(const char *fileName, unsigned char **rowsp, int w, int h);
  */
 
 /* minimum */
+#ifdef MIN
+#undef MIN
+#endif
 template < class T >
 inline T
 MIN( T a, T b )
 { return (a < b) ? a : b ; }
 
 /* maximum */
+#ifdef MAX
+#undef MAX
+#endif
 template < class T >
 inline T
 MAX( T a, T b )
index 4a12fcb29630ddfb12084df79dc8bffa7601b13a..ac4c7f60c95c18a8d7bfe50a8ae581964d973b5a 100644 (file)
@@ -151,6 +151,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blenderplayer", "..\gameeng
                {415BFD6E-64CF-422B-AF88-C07F040A7292} = {415BFD6E-64CF-422B-AF88-C07F040A7292}\r
                {670EC17A-0548-4BBF-A27B-636C7C188139} = {670EC17A-0548-4BBF-A27B-636C7C188139}\r
                {4C3AB78A-52CA-4276-A041-39776E52D8C8} = {4C3AB78A-52CA-4276-A041-39776E52D8C8}\r
+               {E784098D-3ED8-433A-9353-9679415DDDC5} = {E784098D-3ED8-433A-9353-9679415DDDC5}\r
                {6B801390-5F95-4F07-81A7-97FBA046AACC} = {6B801390-5F95-4F07-81A7-97FBA046AACC}\r
                {CAE37E91-6570-43AC-A4B4-7A37A4B0FC94} = {CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}\r
                {76D90B92-ECC7-409C-9F98-A8814B90F3C0} = {76D90B92-ECC7-409C-9F98-A8814B90F3C0}\r
@@ -167,13 +168,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blenderplayer", "..\gameeng
                {E90C7BC2-CF30-4A60-A8F2-0050D592E358} = {E90C7BC2-CF30-4A60-A8F2-0050D592E358}\r
                {8B8D4FC3-3234-4E54-8376-5AB83D00D164} = {8B8D4FC3-3234-4E54-8376-5AB83D00D164}\r
                {4B6AFCC5-968C-424A-8F20-76E41B3BEF74} = {4B6AFCC5-968C-424A-8F20-76E41B3BEF74}\r
+               {0112CAD5-3584-412A-A2E5-1315A00437B4} = {0112CAD5-3584-412A-A2E5-1315A00437B4}\r
                {5A2EA6DC-1A53-4E87-9166-52870CE3B4EA} = {5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}\r
                {E86B7BDE-C33C-4E55-9433-E74C141D7538} = {E86B7BDE-C33C-4E55-9433-E74C141D7538}\r
                {32CC75E2-EE85-45E6-8E3D-513F58464F43} = {32CC75E2-EE85-45E6-8E3D-513F58464F43}\r
                {9A307EE5-CD77-47BC-BD87-62508C7E19D8} = {9A307EE5-CD77-47BC-BD87-62508C7E19D8}\r
                {AB590CED-F71F-4A17-A89B-18583ECD633D} = {AB590CED-F71F-4A17-A89B-18583ECD633D}\r
+               {B83C6BED-11EC-46C8-AFFA-121EEDE94373} = {B83C6BED-11EC-46C8-AFFA-121EEDE94373}\r
                {1CC733F1-6AB5-4904-8F63-C08C46B79DD9} = {1CC733F1-6AB5-4904-8F63-C08C46B79DD9}\r
                {B789C2F3-279E-4A85-8F0A-7F7AC068E598} = {B789C2F3-279E-4A85-8F0A-7F7AC068E598}\r
+               {524264F4-DF21-4B79-847F-E7CA643ECD0B} = {524264F4-DF21-4B79-847F-E7CA643ECD0B}\r
        EndProjectSection\r
 EndProject\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KX_blenderhook", "..\gameengine\blenderhook\KX_blenderhook.vcproj", "{8154A59A-CAED-403D-AB94-BC4E7C032666}"\r
@@ -621,19 +625,25 @@ Global
                {0112CAD5-3584-412A-A2E5-1315A00437B4}.Blender Release|Win32.ActiveCfg = Blender Release|Win32\r
                {0112CAD5-3584-412A-A2E5-1315A00437B4}.Blender Release|Win32.Build.0 = Blender Release|Win32\r
                {0112CAD5-3584-412A-A2E5-1315A00437B4}.BlenderPlayer Debug|Win32.ActiveCfg = Blender Debug|Win32\r
+               {0112CAD5-3584-412A-A2E5-1315A00437B4}.BlenderPlayer Debug|Win32.Build.0 = Blender Debug|Win32\r
                {0112CAD5-3584-412A-A2E5-1315A00437B4}.BlenderPlayer Release|Win32.ActiveCfg = Blender Release|Win32\r
+               {0112CAD5-3584-412A-A2E5-1315A00437B4}.BlenderPlayer Release|Win32.Build.0 = Blender Release|Win32\r
                {B83C6BED-11EC-46C8-AFFA-121EEDE94373}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32\r
                {B83C6BED-11EC-46C8-AFFA-121EEDE94373}.Blender Debug|Win32.Build.0 = Blender Debug|Win32\r
                {B83C6BED-11EC-46C8-AFFA-121EEDE94373}.Blender Release|Win32.ActiveCfg = Blender Release|Win32\r
                {B83C6BED-11EC-46C8-AFFA-121EEDE94373}.Blender Release|Win32.Build.0 = Blender Release|Win32\r
                {B83C6BED-11EC-46C8-AFFA-121EEDE94373}.BlenderPlayer Debug|Win32.ActiveCfg = Blender Debug|Win32\r
+               {B83C6BED-11EC-46C8-AFFA-121EEDE94373}.BlenderPlayer Debug|Win32.Build.0 = Blender Debug|Win32\r
                {B83C6BED-11EC-46C8-AFFA-121EEDE94373}.BlenderPlayer Release|Win32.ActiveCfg = Blender Release|Win32\r
+               {B83C6BED-11EC-46C8-AFFA-121EEDE94373}.BlenderPlayer Release|Win32.Build.0 = Blender Release|Win32\r
                {524264F4-DF21-4B79-847F-E7CA643ECD0B}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32\r
                {524264F4-DF21-4B79-847F-E7CA643ECD0B}.Blender Debug|Win32.Build.0 = Blender Debug|Win32\r
                {524264F4-DF21-4B79-847F-E7CA643ECD0B}.Blender Release|Win32.ActiveCfg = Blender Release|Win32\r
                {524264F4-DF21-4B79-847F-E7CA643ECD0B}.Blender Release|Win32.Build.0 = Blender Release|Win32\r
                {524264F4-DF21-4B79-847F-E7CA643ECD0B}.BlenderPlayer Debug|Win32.ActiveCfg = Blender Debug|Win32\r
+               {524264F4-DF21-4B79-847F-E7CA643ECD0B}.BlenderPlayer Debug|Win32.Build.0 = Blender Debug|Win32\r
                {524264F4-DF21-4B79-847F-E7CA643ECD0B}.BlenderPlayer Release|Win32.ActiveCfg = Blender Release|Win32\r
+               {524264F4-DF21-4B79-847F-E7CA643ECD0B}.BlenderPlayer Release|Win32.Build.0 = Blender Release|Win32\r
                {D696C86B-0B53-4471-A50D-5B983A6FA4AD}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32\r
                {D696C86B-0B53-4471-A50D-5B983A6FA4AD}.Blender Debug|Win32.Build.0 = Blender Debug|Win32\r
                {D696C86B-0B53-4471-A50D-5B983A6FA4AD}.Blender Release|Win32.ActiveCfg = Blender Release|Win32\r
@@ -669,6 +679,7 @@ Global
                {6461F05D-4698-47AB-A8E8-1CA2ACC9948B}.Blender Release|Win32.ActiveCfg = Blender Release|Win32\r
                {6461F05D-4698-47AB-A8E8-1CA2ACC9948B}.Blender Release|Win32.Build.0 = Blender Release|Win32\r
                {6461F05D-4698-47AB-A8E8-1CA2ACC9948B}.BlenderPlayer Debug|Win32.ActiveCfg = Blender Debug|Win32\r
+               {6461F05D-4698-47AB-A8E8-1CA2ACC9948B}.BlenderPlayer Debug|Win32.Build.0 = Blender Debug|Win32\r
                {6461F05D-4698-47AB-A8E8-1CA2ACC9948B}.BlenderPlayer Release|Win32.ActiveCfg = Blender Release|Win32\r
                {6461F05D-4698-47AB-A8E8-1CA2ACC9948B}.BlenderPlayer Release|Win32.Build.0 = Blender Release|Win32\r
                {531D4862-D0E7-4B9B-A0B6-B3A6A25B547A}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32\r
@@ -694,7 +705,9 @@ Global
                {E784098D-3ED8-433A-9353-9679415DDDC5}.Blender Release|Win32.ActiveCfg = Blender Release|Win32\r
                {E784098D-3ED8-433A-9353-9679415DDDC5}.Blender Release|Win32.Build.0 = Blender Release|Win32\r
                {E784098D-3ED8-433A-9353-9679415DDDC5}.BlenderPlayer Debug|Win32.ActiveCfg = Blender Debug|Win32\r
+               {E784098D-3ED8-433A-9353-9679415DDDC5}.BlenderPlayer Debug|Win32.Build.0 = Blender Debug|Win32\r
                {E784098D-3ED8-433A-9353-9679415DDDC5}.BlenderPlayer Release|Win32.ActiveCfg = Blender Release|Win32\r
+               {E784098D-3ED8-433A-9353-9679415DDDC5}.BlenderPlayer Release|Win32.Build.0 = Blender Release|Win32\r
                {EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32\r
                {EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.Blender Debug|Win32.Build.0 = Blender Debug|Win32\r
                {EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.Blender Release|Win32.ActiveCfg = Blender Release|Win32\r
index d32ef98da2fc5a4304e41b080fcc3336155bab1f..4b194c83c0055ee8246cf2a418b21da9d6577dfb 100644 (file)
                                        RelativePath="..\..\..\source\blender\nodes\intern\TEX_nodes\TEX_checker.c"\r
                                        >\r
                                </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\source\blender\nodes\intern\TEX_nodes\TEX_coord.c"\r
+                                       >\r
+                               </File>\r
                                <File\r
                                        RelativePath="..\..\..\source\blender\nodes\intern\TEX_nodes\TEX_curves.c"\r
                                        >\r
                                </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\source\blender\nodes\intern\TEX_nodes\TEX_distance.c"\r
+                                       >\r
+                               </File>\r
                                <File\r
                                        RelativePath="..\..\..\source\blender\nodes\intern\TEX_nodes\TEX_hueSatVal.c"\r
                                        >\r
index 43e692e9bad6572cf899be6f4aabb60bed4b32ff..ab0b05c208c9fe6055448dbc09234fa45e25f95c 100644 (file)
                        <Tool\r
                                Name="VCLinkerTool"\r
                                AdditionalOptions="/MACHINE:I386&#x0D;&#x0A;"\r
-                               AdditionalDependencies="odelib.lib fmodvc.lib libbmfont.lib ws2_32.lib vfw32.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib openal_static.lib libjpeg.lib dxguid.lib libeay32.lib libpng.lib libz.lib qtmlClient.lib SDL.lib freetype2ST.lib python25_d.lib pthreadVSE2.lib pthreadVC2.lib Half.lib Iex.lib IlmImf.lib IlmThread.lib Imath.lib avcodec-51.lib avformat-52.lib avutil-49.lib swscale-0.lib"\r
+                               AdditionalDependencies="odelib.lib fmodvc.lib ws2_32.lib vfw32.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib openal_static.lib libjpeg.lib dxguid.lib libeay32.lib libpng.lib libz.lib qtmlClient.lib SDL.lib freetype2ST.lib python25_d.lib pthreadVSE2.lib pthreadVC2.lib Half.lib Iex.lib IlmImf.lib IlmThread.lib Imath.lib avcodec-51.lib avformat-52.lib avutil-49.lib swscale-0.lib"\r
                                ShowProgress="0"\r
                                OutputFile="..\..\..\..\bin\debug\blenderplayer.exe"\r
                                LinkIncremental="2"\r
                                SuppressStartupBanner="true"\r
-                               AdditionalLibraryDirectories="..\..\..\..\..\lib\windows\sdl\lib;..\..\..\..\..\lib\windows\zlib\lib;..\..\..\..\..\lib\windows\ode\lib;..\..\..\..\..\lib\windows\png\lib;..\..\..\..\..\lib\windows\jpeg\lib;..\..\..\..\..\lib\windows\fmod\lib;..\..\..\..\..\lib\windows\openal\lib;..\..\..\..\..\lib\windows\freetype\lib;..\..\..\..\..\lib\windows\openexr\lib_vs2008;..\..\..\..\..\lib\windows\python\lib\lib25_vs2008;..\..\..\..\..\lib\windows\openssl\lib;..\..\..\..\..\lib\windows\QTDevWin\Libraries;..\..\..\..\..\build\msvc_9\libs\intern\debug;..\..\..\..\..\build\msvc_9\libs\extern\debug;..\..\..\..\..\lib\windows\pthreads\lib;..\..\..\..\..\lib\windows\ffmpeg\lib"\r
+                               AdditionalLibraryDirectories="..\..\..\..\..\lib\windows\sdl\lib;..\..\..\..\..\lib\windows\zlib\lib;..\..\..\..\..\lib\windows\ode\lib;..\..\..\..\..\lib\windows\png\lib;..\..\..\..\..\lib\windows\jpeg\lib;..\..\..\..\..\lib\windows\fmod\lib;..\..\..\..\..\lib\windows\openal\lib;..\..\..\..\..\lib\windows\freetype\lib;..\..\..\..\..\lib\windows\openexr\lib_vs2008;..\..\..\..\..\lib\windows\python\lib\lib25_vs2008;..\..\..\..\..\lib\windows\openssl\lib;..\..\..\..\..\lib\windows\QTDevWin\Libraries;..\..\..\..\..\lib\windows\pthreads\lib;..\..\..\..\..\lib\windows\ffmpeg\lib"\r
                                IgnoreDefaultLibraryNames="libc.lib;libcmt.lib;msvcrt.lib;libcd.lib;msvcrtd.lib"\r
                                GenerateDebugInformation="true"\r
                                ProgramDatabaseFile="..\..\..\..\..\build\msvc_9\libs\debug\blenderplayer.pdb"\r
                        <Tool\r
                                Name="VCLinkerTool"\r
                                AdditionalOptions="/MACHINE:I386"\r
-                               AdditionalDependencies="odelib.lib fmodvc.lib libbmfont.lib ws2_32.lib vfw32.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib openal_static.lib libjpeg.lib dxguid.lib libeay32.lib libpng.lib libz.lib qtmlClient.lib SDL.lib freetype2ST.lib python25.lib pthreadVSE2.lib pthreadVC2.lib Half.lib Iex.lib IlmImf.lib IlmThread.lib Imath.lib avcodec-51.lib avformat-52.lib avutil-49.lib swscale-0.lib"\r
+                               AdditionalDependencies="odelib.lib fmodvc.lib ws2_32.lib vfw32.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib openal_static.lib libjpeg.lib dxguid.lib libeay32.lib libpng.lib libz.lib qtmlClient.lib SDL.lib freetype2ST.lib python25_d.lib pthreadVSE2.lib pthreadVC2.lib Half.lib Iex.lib IlmImf.lib IlmThread.lib Imath.lib avcodec-51.lib avformat-52.lib avutil-49.lib swscale-0.lib"\r
                                OutputFile="..\..\..\..\bin\blenderplayer.exe"\r
                                LinkIncremental="1"\r
                                SuppressStartupBanner="true"\r
-                               AdditionalLibraryDirectories="..\..\..\..\..\lib\windows\sdl\lib;..\..\..\..\..\lib\windows\zlib\lib;..\..\..\..\..\lib\windows\ode\lib;..\..\..\..\..\lib\windows\png\lib;..\..\..\..\..\lib\windows\jpeg\lib;..\..\..\..\..\lib\windows\fmod\lib;..\..\..\..\..\lib\windows\openal\lib;..\..\..\..\..\lib\windows\freetype\lib;..\..\..\..\..\lib\windows\openexr\lib_vs2008;..\..\..\..\..\lib\windows\python\lib\lib25_vs2008;..\..\..\..\..\lib\windows\openssl\lib;..\..\..\..\..\lib\windows\QTDevWin\Libraries;..\..\..\..\..\build\msvc_9\libs\intern;..\..\..\..\..\build\msvc_9\libs\extern;..\..\..\..\..\lib\windows\pthreads\lib;..\..\..\..\..\lib\windows\ffmpeg\lib"\r
+                               AdditionalLibraryDirectories="..\..\..\..\..\lib\windows\sdl\lib;..\..\..\..\..\lib\windows\zlib\lib;..\..\..\..\..\lib\windows\ode\lib;..\..\..\..\..\lib\windows\png\lib;..\..\..\..\..\lib\windows\jpeg\lib;..\..\..\..\..\lib\windows\fmod\lib;..\..\..\..\..\lib\windows\openal\lib;..\..\..\..\..\lib\windows\freetype\lib;..\..\..\..\..\lib\windows\openexr\lib_vs2008;..\..\..\..\..\lib\windows\python\lib\lib25_vs2008;..\..\..\..\..\lib\windows\openssl\lib;..\..\..\..\..\lib\windows\QTDevWin\Libraries;..\..\..\..\..\lib\windows\pthreads\lib;..\..\..\..\..\lib\windows\ffmpeg\lib"\r
                                IgnoreDefaultLibraryNames="libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib"\r
                                ProgramDatabaseFile="..\..\..\..\..\build\msvc_9\libs\blenderplayer.pdb"\r
                                SubSystem="1"\r
index f440e2dface576b478221895a35c0be860c7118d..43a369d8f77f10377673ee62e029b67237062e8c 100644 (file)
@@ -57,6 +57,12 @@ ifeq ($(OS),$(findstring $(OS), "freebsd irix linux openbsd solaris"))
        NOPLUGINS?=true
      endif
    endif
+   # don"t build plugins on irix if using gcc
+   ifeq ($(OS), irix)
+     ifeq ($(IRIX_USE_GCC), true)
+       NOPLUGINS?=true
+     endif
+   endif
 endif
 
 ifeq ($(OS),windows)
index 2c342ddec39ceab2fad1098397a826b8a42f3801..504e4ee29ba6fe7118e99f3c8a1a212a1b03c533 100644 (file)
@@ -79,7 +79,7 @@ def addSlash(path):
        return path + sys.sep
 
 
-def comprehensiveImageLoad(imagePath, filePath, PLACE_HOLDER= True, RECURSIVE=True, VERBOSE=False):
+def comprehensiveImageLoad(imagePath, filePath, PLACE_HOLDER= True, RECURSIVE=True, VERBOSE=False, CONVERT_CALLBACK=None):
        '''
        imagePath: The image filename
                If a path precedes it, this will be searched as well.
@@ -93,13 +93,30 @@ def comprehensiveImageLoad(imagePath, filePath, PLACE_HOLDER= True, RECURSIVE=Tr
        
        RECURSIVE: If True, directories will be recursivly searched.
                Be carefull with this if you have files in your root directory because it may take a long time.
+       
+       CASE_INSENSITIVE: for non win32 systems, find the correct case for the file.
+       
+       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.
        '''
        
+       # VERBOSE = True
+       
        if VERBOSE: print 'img:', imagePath, 'file:', filePath
+       
+       if os == None and CASE_INSENSITIVE:
+               CASE_INSENSITIVE = True
+       
        # When we have the file load it with this. try/except niceness.
        def imageLoad(path):
                #if path.endswith('\\') or path.endswith('/'):
                #       raise 'INVALID PATH'
+               
+               if CONVERT_CALLBACK:
+                       path = CONVERT_CALLBACK(path)
+               
                try:
                        img = bpy.data.images.new(filename=path)
                        if VERBOSE: print '\t\tImage loaded "%s"' % path
index 594264fad847b04d6d4c50274adf229be3b547a3..a2d2120ebff8619063bb60ee8a3567ac99f9b628 100644 (file)
@@ -12,3 +12,63 @@ def cleanName(name):
        for ch in invalid:      name = name.replace(ch, '_')
        return name
 
+def caseInsensitivePath(path, RET_FOUND=False):
+       '''
+       Get a case insensitive path on a case sensitive system
+       
+       RET_FOUND is for internal use only, to avoid too many calls to os.path.exists
+       # Example usage
+       getCaseInsensitivePath('/hOmE/mE/sOmEpAtH.tXt')
+       '''
+       import os # todo, what happens with no os?
+       
+       if os==None:
+               if RET_FOUND:   ret = path, True
+               else:                   ret = path
+               return ret
+       
+       if path=='' or os.path.exists(path):
+               if RET_FOUND:   ret = path, True
+               else:                   ret = path
+               return ret
+       
+       f = os.path.basename(path) # f may be a directory or a file
+       d = os.path.dirname(path)
+       
+       suffix = ''
+       if not f: # dir ends with a slash?
+               if len(d) < len(path):
+                       suffix = path[:len(path)-len(d)]
+
+               f = os.path.basename(d)
+               d = os.path.dirname(d)
+       
+       if not os.path.exists(d):
+               d, found = caseInsensitivePath(d, True)
+               
+               if not found:
+                       if RET_FOUND:   ret = path, False
+                       else:                   ret = path
+                       return ret
+       
+       # at this point, the directory exists but not the file
+       
+       try: # we are expecting 'd' to be a directory, but it could be a file
+               files = os.listdir(d)
+       except:
+               if RET_FOUND:   ret = path, False
+               else:                   ret = path
+
+       f_low = f.lower()
+       
+       try:    f_nocase = [fl for fl in files if fl.lower() == f_low][0]
+       except: f_nocase = None
+       
+       if f_nocase:
+               if RET_FOUND:   ret = os.path.join(d, f_nocase) + suffix, True
+               else:                   ret = os.path.join(d, f_nocase) + suffix
+               return ret
+       else:
+               if RET_FOUND:   ret = path, False
+               else:                   ret = path
+               return ret # cant find the right one, just return the path as is.
\ No newline at end of file
index 3f02a71f95194f4ea63d1aa41490d1e67b791238..ce17f78c5e2ee8ce7aaa1a3c6e8111cc3b3d95ec 100644 (file)
@@ -66,8 +66,6 @@ import BPyMesh
 import BPySys
 import BPyMessages
 
-import sys
-
 ## This was used to make V, but faster not to do all that
 ##valid = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_,.()[]{}'
 ##v = range(255)
@@ -184,7 +182,19 @@ def sane_texname(data):            return sane_name(data, sane_name_mapping_tex)
 def sane_takename(data):       return sane_name(data, sane_name_mapping_take)
 def sane_groupname(data):      return sane_name(data, sane_name_mapping_group)
 
-
+def derived_paths(fname_orig, basepath, FORCE_CWD=False):
+       '''
+       fname_orig - blender path, can be relative
+       basepath - fname_rel will be relative to this
+       FORCE_CWD - dont use the basepath, just add a ./ to the filename.
+               use when we know the file will be in the basepath.
+       '''
+       fname = Blender.sys.expandpath(fname_orig)
+       fname_strip = strip_path(fname)
+       if FORCE_CWD:   fname_rel = '.' + Blender.sys.sep + fname_strip
+       else:                           fname_rel = Blender.sys.relpath(fname, basepath)
+       if fname_rel.startswith('//'): fname_rel = '.' + Blender.sys.sep + fname_rel[2:]
+       return fname, fname_strip, fname_rel
 
 
 def mat4x4str(mat):
@@ -342,6 +352,8 @@ def write(filename, batch_objects = None, \
        
        # end batch support
        
+       # Use this for working out paths relative to the export location
+       basepath = Blender.sys.dirname(filename)
        
        # ----------------------------------------------
        # storage classes
@@ -1141,10 +1153,9 @@ def write(filename, batch_objects = None, \
                        Property: "Width", "int", "",0
                        Property: "Height", "int", "",0''')
                if tex:
-                       fname = tex.filename
-                       fname_strip = strip_path(fname)
+                       fname, fname_strip, fname_rel = derived_paths(tex.filename, basepath, EXP_IMAGE_COPY)
                else:
-                       fname = fname_strip = ''
+                       fname = fname_strip = fname_rel = ''
                
                file.write('\n\t\t\tProperty: "Path", "charptr", "", "%s"' % fname_strip)
                
@@ -1163,7 +1174,7 @@ def write(filename, batch_objects = None, \
                
                file.write('\n\t\tFilename: "%s"' % fname_strip)
                if fname_strip: fname_strip = '/' + fname_strip
-               file.write('\n\t\tRelativeFilename: "fbx%s"' % fname_strip) # make relative
+               file.write('\n\t\tRelativeFilename: "%s"' % fname_rel) # make relative
                file.write('\n\t}')
 
        
@@ -1202,13 +1213,14 @@ def write(filename, batch_objects = None, \
                }''')
                
                file.write('\n\t\tMedia: "Video::%s"' % texname)
+               
                if tex:
-                       fname = tex.filename
-                       file.write('\n\t\tFileName: "%s"' % strip_path(fname))
-                       file.write('\n\t\tRelativeFilename: "fbx/%s"' % strip_path(fname)) # need some make relative command
+                       fname, fname_strip, fname_rel = derived_paths(tex.filename, basepath, EXP_IMAGE_COPY)
                else:
-                       file.write('\n\t\tFileName: ""')
-                       file.write('\n\t\tRelativeFilename: "fbx"')
+                       fname = fname_strip = fname_rel = ''
+               
+               file.write('\n\t\tFileName: "%s"' % fname_strip)
+               file.write('\n\t\tRelativeFilename: "%s"' % fname_rel) # need some make relative command
                
                file.write('''
                ModelUVTranslation: 0,0
@@ -2658,7 +2670,7 @@ Takes:  {''')
        
        # copy images if enabled
        if EXP_IMAGE_COPY:
-               copy_images( Blender.sys.dirname(filename),  [ tex[1] for tex in textures if tex[1] != None ])  
+               copy_images( basepath,  [ tex[1] for tex in textures if tex[1] != None ])       
        
        print 'export finished in %.4f sec.' % (Blender.sys.time() - start_time)
        return True
index 662cb1df0a6e28a8258e52487342f177d8bbf951..e9671cdae35e8877dbaadc147079d69014cdc044 100644 (file)
@@ -194,7 +194,7 @@ ifeq ($(WITH_FREETYPE2), true)
     else
       COMLIB += $(NAN_FTGL)/lib/libftgl.a
       ifeq ($(OS), irix)
-        COMLIB += $(NAN_FREETYPE)/lib32/libfreetype.a
+        COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
         else
             COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
       endif
@@ -395,9 +395,16 @@ else
         NAN_SND_LIBS += $(ALUT)
         NAN_SND_LIBS += $(SOUNDSYSTEM)
       else
-        NAN_SND_LIBS =  $(SOUNDSYSTEM)
-        NAN_SND_LIBS += $(DUMMYSOUND)
-        NAN_SND_LIBS += $(SOUNDSYSTEM)
+        ifeq ($(OS), irix)
+           NAN_SND_LIBS = $(SOUNDSYSTEM)
+           NAN_SND_LIBS += $(DUMMYSOUND)
+           NAN_SND_LIBS += $(SDLSOUND)
+           NAN_SND_LIBS += $(SOUNDSYSTEM)
+        else
+           NAN_SND_LIBS =  $(SOUNDSYSTEM)
+           NAN_SND_LIBS += $(DUMMYSOUND)
+           NAN_SND_LIBS += $(SOUNDSYSTEM)
+        endif
       endif
     endif
   endif
index fa3a654c1c271572c096b517d859716061ac97cf..1c5b6b124b288e228202e4d24ae1719e083321c1 100644 (file)
@@ -401,6 +401,8 @@ struct TexResult;
 #define TEX_NODE_ROTATE     114
 #define TEX_NODE_VIEWER     115
 #define TEX_NODE_TRANSLATE  116
+#define TEX_NODE_COORD      117
+#define TEX_NODE_DISTANCE   118
 
 /* 201-299 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
 #define TEX_NODE_PROC      200
index ae81a31c37365b825dbfd6737fe9a315602a9213..4c84c56180c0a65d6a4879aa9433ce9c1d874119 100644 (file)
@@ -2886,6 +2886,8 @@ static void registerTextureNodes(ListBase *ntypelist)
        nodeRegisterType(ntypelist, &tex_node_curve_time);
        nodeRegisterType(ntypelist, &tex_node_invert);
        nodeRegisterType(ntypelist, &tex_node_hue_sat);
+       nodeRegisterType(ntypelist, &tex_node_coord);
+       nodeRegisterType(ntypelist, &tex_node_distance);
        
        nodeRegisterType(ntypelist, &tex_node_output);
        nodeRegisterType(ntypelist, &tex_node_viewer);
index ca7a376d3a2bc96235d1f48e05e183022cbe68ff..8ba03ad1343ac7e593b353fd5233c02c021a7671 100644 (file)
@@ -47,9 +47,9 @@
 #include <time.h>
 #include <sys/stat.h>
 
-#if defined (__sun__) || defined (__sun)
+#if defined (__sun__) || defined (__sun) || defined (__sgi)
 #include <sys/statvfs.h> /* Other modern unix os's should probably use this also */
-#elif !defined(__FreeBSD__) && !defined(linux) && (defined(__sgi) || defined(__sparc) || defined(__sparc__))
+#elif !defined(__FreeBSD__) && !defined(linux) && (defined(__sparc) || defined(__sparc__))
 #include <sys/statfs.h>
 #endif
 
@@ -179,7 +179,7 @@ double BLI_diskfree(char *dir)
        return (double) (freec*bytesps*sectorspc);
 #else
 
-#if defined (__sun__) || defined (__sun)
+#if defined (__sun__) || defined (__sun) || defined (__sgi)
        struct statvfs disk;
 #else
        struct statfs disk;
@@ -204,9 +204,9 @@ double BLI_diskfree(char *dir)
        return -1;
 #endif
 
-#if defined (__sun__) || defined (__sun)
+#if defined (__sun__) || defined (__sun) || defined (__sgi)
        if (statvfs(name, &disk)) return(-1);   
-#elif !defined(__FreeBSD__) && !defined(linux) && (defined (__sgi) || defined(__sparc) || defined(__sparc__))
+#elif !defined(__FreeBSD__) && !defined(linux) && (defined(__sparc) || defined(__sparc__))
        /* WARNING - This may not be supported by geeneric unix os's - Campbell */
        if (statfs(name, &disk, sizeof(struct statfs), 0)) return(-1);
 #endif
index f25872538cfbab612efeebe5dc809eeef0110a8e..fe7e26eac2b427c15ab18811783d76e6b49f5c34 100644 (file)
@@ -80,16 +80,16 @@ void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf)
                }
        }
 }
-static void pixel_from_buffer(struct ImBuf *ibuf, unsigned char *outI, float *outF, int x, int y)
+static void pixel_from_buffer(struct ImBuf *ibuf, unsigned char **outI, float **outF, int x, int y)
 
 {
        int offset = ibuf->x * y * 4 + 4*x;
        
        if (ibuf->rect)
-               outI= (unsigned char *)ibuf->rect + offset;
+               *outI= (unsigned char *)ibuf->rect + offset;
        
        if (ibuf->rect_float)
-               outF= (float *)ibuf->rect_float + offset;
+               *outF= (float *)ibuf->rect_float + offset;
 }
 
 /**************************************************************************
@@ -226,7 +226,7 @@ void bicubic_interpolation(ImBuf *in, ImBuf *out, float u, float v, int xout, in
        
        if (in == NULL || (in->rect == NULL && in->rect_float == NULL)) return;
        
-       pixel_from_buffer(out, outI, outF, xout, yout); /* gcc warns these could be uninitialized, but its ok */
+       pixel_from_buffer(out, &outI, &outF, xout, yout); /* gcc warns these could be uninitialized, but its ok */
        
        bicubic_interpolation_color(in, outI, outF, u, v);
 }
@@ -309,7 +309,7 @@ void bilinear_interpolation(ImBuf *in, ImBuf *out, float u, float v, int xout, i
        
        if (in == NULL || (in->rect == NULL && in->rect_float == NULL)) return;
        
-       pixel_from_buffer(out, outI, outF, xout, yout); /* gcc warns these could be uninitialized, but its ok */
+       pixel_from_buffer(out, &outI, &outF, xout, yout); /* gcc warns these could be uninitialized, but its ok */
        
        bilinear_interpolation_color(in, outI, outF, u, v);
 }
@@ -370,7 +370,7 @@ void neareast_interpolation(ImBuf *in, ImBuf *out, float x, float y, int xout, i
 
        if (in == NULL || (in->rect == NULL && in->rect_float == NULL)) return;
        
-       pixel_from_buffer(out, outI, outF, xout, yout); /* gcc warns these could be uninitialized, but its ok */
+       pixel_from_buffer(out, &outI, &outF, xout, yout); /* gcc warns these could be uninitialized, but its ok */
        
        neareast_interpolation_color(in, outI, outF, x, y);
-}
\ No newline at end of file
+}
index aecaee31d5396b1a8ead69e597a8b15bc3451146..2db9aacc96b4399649367a808ec9b8bf748dcdbe 100644 (file)
@@ -46,6 +46,7 @@ void PE_create_particle_edit(struct Object *ob, struct ParticleSystem *psys);
 void PE_free_particle_edit(struct ParticleSystem *psys);
 
 void PE_change_act(void *ob_v, void *act_v);
+void PE_change_act_psys(struct Object *ob, struct ParticleSystem *psys);
 int PE_can_edit(struct ParticleSystem *psys);
 
 /* access */
index fcd206bb8282120c871a95fc58b3893d79875598..e357f37286c85167d03b1de0c4140d0814079c4b 100644 (file)
@@ -80,6 +80,7 @@ typedef struct TreeElement {
 #define TSE_SEQUENCE   26
 #define TSE_SEQ_STRIP  27
 #define TSE_SEQUENCE_DUP 28
+#define TSE_LINKED_PSYS                 29
 
 /* outliner search flags */
 #define OL_FIND                                        0
index 5612f56fee8c49b11af79d2cdb754622f9f97a4f..868d0c3e6c0db4a6d29ef8995f8f91f6bda54576 100644 (file)
@@ -103,6 +103,13 @@ extern void do_cambuts(unsigned short event);
 extern void do_armbuts(unsigned short event);
 extern void do_uvcalculationbuts(unsigned short event);
 extern void weight_paint_buttons(struct uiBlock *);
+
+extern void brush_buttons(struct uiBlock *block, short sima,
+                               int evt_nop, int evt_change,
+                               int evt_browse, int evt_local,
+                               int evt_del, int evt_keepdata,
+                               int evt_texbrowse, int evt_texdel);
+
 extern void particle_edit_buttons(struct uiBlock *);
 
 extern char *get_vertexgroup_menustr(struct Object *ob);       // used in object buttons
index fa7b8fc0a193dfd162af01da0b22b8516841b534..c96c5670ae63a01951c991014ec5f8be1db08d02 100644 (file)
@@ -468,6 +468,7 @@ int validSnappingNormal(TransInfo *t);
 
 void initTrans(TransInfo *t);
 void postTrans (TransInfo *t);
+void resetTransRestrictions(TransInfo *t);
 
 void drawLine(float *center, float *dir, char axis, short options);
 
index 95e20dd004d864984007d8bca0284b642e875dd0..9b50eb91a2060c2b77b1d8eee377c763cc852485 100644 (file)
@@ -65,10 +65,12 @@ typedef struct ScriptLink {
 /* these are special scriptlinks that can be assigned to
  * a given space in a given ScrArea to:
  * - (EVENT type) handle events sent to that space;
- * - (DRAW type) draw on the space after its own drawing function finishes
+ * - (EVENT_ALL type): handle release events, too;
+ * - (DRAW type) draw on the space after its own drawing function finishes.
  */
-#define SPACEHANDLER_VIEW3D_EVENT 1
-#define SPACEHANDLER_VIEW3D_DRAW 2
+#define SPACEHANDLER_VIEW3D_DRAW 1
+#define SPACEHANDLER_VIEW3D_EVENT 2
+#define SPACEHANDLER_VIEW3D_EVENT_ALL 3
 
 
 #ifdef __cplusplus
index 6be2123b96d09b4da9fce6c04f710c011220b739..40cb65eaccef8fe976a3f5f06414553b2cef06c3 100644 (file)
@@ -52,6 +52,8 @@ extern bNodeType tex_node_curve_rgb;
 extern bNodeType tex_node_curve_time;
 extern bNodeType tex_node_invert;
 extern bNodeType tex_node_hue_sat;
+extern bNodeType tex_node_coord;
+extern bNodeType tex_node_distance;
 
 extern bNodeType tex_node_rotate;
 extern bNodeType tex_node_translate;
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c b/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
new file mode 100644 (file)
index 0000000..da487c1
--- /dev/null
@@ -0,0 +1,66 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2005 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Mathias Panzenböck (panzi) <grosser.meister.morti@gmx.net>.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../TEX_util.h"
+
+static bNodeSocketType outputs[]= { 
+       { SOCK_VECTOR, 0, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+       { -1, 0, "" }
+};
+
+static void vectorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+{
+       out[0] = coord[0];
+       out[1] = coord[1];
+       out[2] = coord[2];
+}
+
+static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+       tex_output(node, in, out[0], &vectorfn);
+       
+       tex_do_preview(node, out[0], data);
+}
+
+bNodeType tex_node_coord= {
+       /* *next,*prev */       NULL, NULL,
+       /* type code   */       TEX_NODE_COORD,
+       /* name        */       "Coordinates",
+       /* width+range */       120, 110, 160,
+       /* class+opts  */       NODE_CLASS_INPUT, NODE_OPTIONS,
+       /* input sock  */       NULL,
+       /* output sock */       outputs,
+       /* storage     */       "node_coord",
+       /* execfunc    */       exec,
+       /* butfunc     */       NULL,
+       /* initfunc    */       NULL,
+       /* freestoragefunc    */        NULL,
+       /* copystoragefunc    */        NULL,
+       /* id          */       NULL
+};
+
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c b/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
new file mode 100644 (file)
index 0000000..ff9ec4d
--- /dev/null
@@ -0,0 +1,79 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2005 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Mathias Panzenböck (panzi) <grosser.meister.morti@gmx.net>.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include "BLI_arithb.h"
+#include "../TEX_util.h"
+
+static bNodeSocketType inputs[]= {
+       { SOCK_VECTOR, 1, "Coordinate 1", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+       { SOCK_VECTOR, 1, "Coordinate 2", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+       { -1, 0, "" } 
+};
+
+static bNodeSocketType outputs[]= {
+       { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+       { -1, 0, "" }
+};
+
+static void valuefn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+{
+       float coord1[3], coord2[3];
+       float x, y, z;
+
+       tex_input_vec(coord1, in[0], coord, thread);
+       tex_input_vec(coord2, in[1], coord, thread);
+
+       *out = VecLenf(coord2, coord1);
+}
+
+static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+       tex_output(node, in, out[0], &valuefn);
+       
+       tex_do_preview(node, out[0], data);
+}
+
+bNodeType tex_node_distance= {
+       /* *next,*prev */       NULL, NULL,
+       /* type code   */       TEX_NODE_DISTANCE,
+       /* name        */       "Distance",
+       /* width+range */       120, 110, 160,
+       /* class+opts  */       NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+       /* input sock  */       inputs,
+       /* output sock */       outputs,
+       /* storage     */       "node_distance",
+       /* execfunc    */       exec,
+       /* butfunc     */       NULL,
+       /* initfunc    */       NULL,
+       /* freestoragefunc    */        NULL,
+       /* copystoragefunc    */        NULL,
+       /* id          */       NULL
+};
+
+
index 10fe3bab26c4e30a0cf13e14bcbe25de6c6e59ae..562072328a86b02f43fae7078ab832968eb0ed8f 100644 (file)
@@ -46,25 +46,32 @@ void tex_call_delegate(TexDelegate *dg, float *out, float *coord, short thread)
        dg->fn(out, coord, dg->node, dg->in, thread);
 }
 
-void tex_input_vec(float *out, bNodeStack *in, float *coord, short thread)
+void tex_input(float *out, int sz, bNodeStack *in, float *coord, short thread)
 {
        TexDelegate *dg = in->data;
        if(dg) {
-               tex_call_delegate(dg, out, coord, thread);
+               tex_call_delegate(dg, in->vec, coord, thread);
        
-               if(in->hasoutput && in->sockettype == SOCK_VALUE) {
-                       out[1] = out[2] = out[0];
-                       out[3] = 1;
-               }
-       }
-       else {
-               QUATCOPY(out, in->vec);
+               if(in->hasoutput && in->sockettype == SOCK_VALUE)
+                       in->vec[1] = in->vec[2] = in->vec[0];
        }
+       memcpy(out, in->vec, sz * sizeof(float));
+}
+
+void tex_input_vec(float *out, bNodeStack *in, float *coord, short thread)
+{
+       tex_input(out, 3, in, coord, thread);
 }
 
 void tex_input_rgba(float *out, bNodeStack *in, float *coord, short thread)
 {
-       tex_input_vec(out, in, coord, thread);
+       tex_input(out, 4, in, coord, thread);
+       
+       if(in->hasoutput && in->sockettype == SOCK_VALUE)
+       {
+               out[1] = out[2] = out[0];
+               out[3] = 1;
+       }
        
        if(in->hasoutput && in->sockettype == SOCK_VECTOR) {
                out[0] = out[0] * .5f + .5f;
@@ -83,8 +90,8 @@ float tex_input_value(bNodeStack *in, float *coord, short thread)
 
 static void init_preview(bNode *node)
 {
-       int xsize = node->prvr.xmax - node->prvr.xmin;
-       int ysize = node->prvr.ymax - node->prvr.ymin;
+       int xsize = (int)(node->prvr.xmax - node->prvr.xmin);
+       int ysize = (int)(node->prvr.ymax - node->prvr.ymin);
        
        if(xsize == 0) {
                xsize = PREV_RES;
index 331f72021f27fa2627f89bdacb85c1b90d44eed9..ec81de1f5e89c695c6369a09f74473dcc403261b 100644 (file)
@@ -2403,7 +2403,7 @@ int BPY_is_spacehandler(Text *text, char spacetype)
                char *line = tline->line;
 
                /* Expected format: # SPACEHANDLER.SPACE.TYPE
-                * Ex: # SPACEHANDLER.VIEW3D.DRAW
+                * Exs: # SPACEHANDLER.VIEW3D.DRAW
                 * The actual checks are forgiving, so slight variations also work. */
                if (line && line[0] == '#' && strstr(line, "HANDLER")) {
                        line++; /* skip '#' */
@@ -2411,11 +2411,19 @@ int BPY_is_spacehandler(Text *text, char spacetype)
                        /* only done for 3D View right now, trivial to add for others: */
                        switch (spacetype) {
                                case SPACE_VIEW3D:
-                                       if (strstr(line, "3D")) { /* VIEW3D, 3DVIEW */
+                                       line = strstr(line, "3D"); /* VIEW3D, 3DVIEW */
+                                       if (line) {
                                                if (strstr(line, "DRAW")) type = SPACEHANDLER_VIEW3D_DRAW;
-                                               else if (strstr(line, "EVENT")) type = SPACEHANDLER_VIEW3D_EVENT;
+                                               else {
+                                                       line = strstr(line, "EVENT");
+                                                       if (line) {
+                                                               if (strstr(line, "ALL")) {
+                                                                       type = SPACEHANDLER_VIEW3D_EVENT_ALL;
+                                                               } else { type = SPACEHANDLER_VIEW3D_EVENT; }
+                                                       }
+                                               }
                                        }
-                                       break;
+                               break;
                        }
                }
        }
@@ -2464,7 +2472,6 @@ int BPY_add_spacehandler(Text *text, ScrArea *sa, char spacetype)
        if (handlertype) {
                ScriptLink *slink = &sa->scriptlink;
                void *stmp, *ftmp;
-               unsigned short space_event = SPACEHANDLER_VIEW3D_EVENT;
 
                /* extend slink */
 
@@ -2484,17 +2491,8 @@ int BPY_add_spacehandler(Text *text, ScrArea *sa, char spacetype)
                        MEM_freeN(ftmp);
                }
 
-               switch (spacetype) {
-                       case SPACE_VIEW3D:
-                               if (handlertype == 1) space_event = SPACEHANDLER_VIEW3D_EVENT;
-                               else space_event = SPACEHANDLER_VIEW3D_DRAW;
-                               break;
-                       default:
-                               break;
-               }
-
                slink->scripts[slink->totscript] = (ID *)text;
-               slink->flag[slink->totscript]= space_event;
+               slink->flag[slink->totscript]= handlertype;
 
                slink->totscript++;
                slink->actscript = slink->totscript;
@@ -2508,6 +2506,7 @@ int BPY_do_spacehandlers( ScrArea *sa, unsigned short event,
 {
        ScriptLink *scriptlink;
        int retval = 0;
+       short slink_event, spacehandlers_match;
        PyGILState_STATE gilstate;
        
        if (!sa || !(G.f & G_DOSCRIPTLINKS)) return 0;
@@ -2549,7 +2548,16 @@ int BPY_do_spacehandlers( ScrArea *sa, unsigned short event,
                EXPP_dict_set_item_str(g_blenderdict, "eventValue", PyInt_FromLong(eventValue));
                /* now run all assigned space handlers for this space and space_event */
                for( index = 0; index < scriptlink->totscript; index++ ) {
-                       
+
+                       spacehandlers_match = 0;
+
+                       slink_event = scriptlink->flag[index];
+                       if( slink_event == space_event )
+                               spacehandlers_match = 1;
+                       else if( ( space_event == SPACEHANDLER_VIEW3D_EVENT ) &&
+                                       ( slink_event == SPACEHANDLER_VIEW3D_EVENT_ALL ) )
+                               spacehandlers_match = 1;
+
                        /* for DRAW handlers: */
                        if (event == 0) {
                                glPushAttrib(GL_ALL_ATTRIB_BITS);
@@ -2558,8 +2566,8 @@ int BPY_do_spacehandlers( ScrArea *sa, unsigned short event,
                                glMatrixMode(GL_MODELVIEW);
                                glPushMatrix();
                        }
-                       
-                       if( ( scriptlink->flag[index] == space_event ) &&
+
+                       if( spacehandlers_match &&
                            ( scriptlink->scripts[index] != NULL ) ) {
                                dict = CreateGlobalDictionary();
                                ret = RunPython( ( Text * ) scriptlink->scripts[index], dict );
index 47e7bcb2007c68f4a0c18971cf8dcf5f79add7fd..d09506f731b751329d3f4296cb863a346fc3e665 100644 (file)
@@ -1047,8 +1047,11 @@ void M_Blender_Init(void)
        if (SpaceHandlers) {
                BPy_constant *d = (BPy_constant *)SpaceHandlers;
 
-               PyConstant_Insert(d,"VIEW3D_EVENT",PyInt_FromLong(SPACEHANDLER_VIEW3D_EVENT));
+               /* EVENT_ALL are reported as EVENT on key presses
+                * and EVENT_RELEASE on key releases */
                PyConstant_Insert(d,"VIEW3D_DRAW", PyInt_FromLong(SPACEHANDLER_VIEW3D_DRAW));
+               PyConstant_Insert(d,"VIEW3D_EVENT",PyInt_FromLong(SPACEHANDLER_VIEW3D_EVENT));
+               PyConstant_Insert(d,"VIEW3D_EVENT_RELEASE",PyInt_FromLong(SPACEHANDLER_VIEW3D_EVENT_ALL));
 
                PyModule_AddObject(module, "SpaceHandlers", SpaceHandlers);
        }
index 16d879c30324a76e7437dc9b02592e719fa7ff2c..c438d2c6e549a4de23e921be32a6d67242a9e32e 100644 (file)
@@ -59,6 +59,7 @@ static PyObject *M_sys_time( PyObject * self );
 static PyObject *M_sys_sleep( PyObject * self, PyObject * args );
 static PyObject *M_sys_expandpath( PyObject *self, PyObject *value);
 static PyObject *M_sys_cleanpath( PyObject *self, PyObject *value);
+static PyObject *M_sys_relpath( PyObject *self, PyObject *args);
 
 /*****************************************************************************/
 /* The following string definitions are used for documentation strings.      */
@@ -128,6 +129,9 @@ If the special chars are not found in the given path, it is simply returned.";
 static char M_sys_cleanpath_doc[] =
 "(path) - Removes parts of a path that are not needed paths such as '../foo/../bar/' and '//./././'";
 
+static char M_sys_relpath_doc[] =
+"(path, start=\"//\") - Returns the path relative to the current blend file or start if spesified";
+
 /*****************************************************************************/
 /* Python method structure definition for Blender.sys module:                */
 /*****************************************************************************/
@@ -144,6 +148,7 @@ struct PyMethodDef M_sys_methods[] = {
        {"time", ( PyCFunction ) M_sys_time, METH_NOARGS, M_sys_time_doc},
        {"expandpath", M_sys_expandpath, METH_O, M_sys_expandpath_doc},
        {"cleanpath", M_sys_cleanpath, METH_O, M_sys_cleanpath_doc},
+       {"relpath", M_sys_relpath, METH_VARARGS, M_sys_relpath_doc},
        {NULL, NULL, 0, NULL}
 };
 
@@ -231,9 +236,8 @@ static PyObject *M_sys_join( PyObject * self, PyObject * args )
        char filename[FILE_MAXDIR + FILE_MAXFILE];
        int pathlen = 0, namelen = 0;
 
-       if( !PyArg_ParseTuple( args, "ss", &path, &name ) )
-               return EXPP_ReturnPyObjError( PyExc_TypeError,
-                                             "expected string argument" );
+       if( !PyArg_ParseTuple( args, "ss:Blender.sys.join", &path, &name ) )
+               return NULL;
 
        pathlen = strlen( path ) + 1;
        namelen = strlen( name ) + 1;   /* + 1 to account for '\0' for BLI_strncpy */
@@ -300,10 +304,8 @@ static PyObject *M_sys_makename( PyObject * self, PyObject * args,
        char *dot = NULL, *p = NULL, basename[FILE_MAXDIR + FILE_MAXFILE];
        int n, len, lenext = 0;
 
-       if( !PyArg_ParseTupleAndKeywords( args, kw, "|ssi", kwlist,
-                                         &path, &ext, &strip ) )
-               return EXPP_ReturnPyObjError( PyExc_TypeError,
-                                             "expected one or two strings and an int (or nothing) as arguments" );
+       if( !PyArg_ParseTupleAndKeywords( args, kw, "|ssi:Blender.sys.makename", kwlist, &path, &ext, &strip ) )
+               return NULL;
 
        len = strlen( path ) + 1;       /* + 1 to consider ending '\0' */
        if( ext )
@@ -350,13 +352,12 @@ static PyObject *M_sys_sleep( PyObject * self, PyObject * args )
 {
        int millisecs = 10;
 
-       if( !PyArg_ParseTuple( args, "|i", &millisecs ) )
-               return EXPP_ReturnPyObjError( PyExc_TypeError,
-                                             "expected int argument" );
+       if( !PyArg_ParseTuple( args, "|i:Blender.sys.sleep", &millisecs ) )
+               return NULL;
 
        PIL_sleep_ms( millisecs );
-
-       return EXPP_incr_ret( Py_None );
+       
+       Py_RETURN_NONE;
 }
 
 static PyObject *M_sys_exists( PyObject * self, PyObject * value )
@@ -419,3 +420,22 @@ static PyObject *M_sys_cleanpath( PyObject * self, PyObject * value )
        
        return PyString_FromString(cleaned);
 }
+
+static PyObject *M_sys_relpath( PyObject * self, PyObject * args )
+{
+       char *base = G.sce;
+       char *path;
+       char relpath[FILE_MAXDIR + FILE_MAXFILE];
+       
+       char dir[FILE_MAXDIR];
+       char file[FILE_MAXFILE];
+       
+       if( !PyArg_ParseTuple( args, "s|s:Blender.sys.relpath", &path, &base ) )
+               return NULL;
+       
+       strncpy(relpath, path, sizeof(relpath));
+       BLI_makestringcode(base, relpath);
+       
+       return PyString_FromString(relpath);
+}
+
index dcd2bdd1e603a92d4594a2a3e85af0a8ce1d2618..c5b0aafe9f0dd349606fe2486328cdb8c8de048b 100644 (file)
@@ -184,11 +184,11 @@ Introduction:
  Space Handler script links:
  ---------------------------
 
- This is a new kind of script linked to spaces in a given window.  Right now
- only the 3D View has the necessary hooks, but the plan is to add access to
- other types, too.  Just to clarify naming conventions: in Blender, a screen
- is partitioned in windows (also called areas) and each window can show any
space.  Spaces are: 3D View, Text Editor, Scripts, Buttons, User Preferences,
+ These are scripts linked to spaces in a given window.  Right now
+ only the 3D View has the necessary hooks.  Just to clarify naming
+ conventions: in Blender, a screen is partitioned in windows (also
+ called areas) and each window can show any space.
+ Spaces are: 3D View, Text Editor, Scripts, Buttons, User Preferences,
  Oops, etc. 
 
  Space handlers are texts in the Text Editor, like other script links, but they
@@ -196,12 +196,16 @@ Introduction:
  text file}} must inform:
   1. that they are space handlers;
   2. the space they belong to;
-  3. whether they are EVENT or DRAW handlers.
+  3. whether they are EVENT, EVENT_RELEASE (EVENT ones reporting key release events) or DRAW handlers.
 
  Example header for a 3D View EVENT handler::
 
   # SPACEHANDLER.VIEW3D.EVENT
 
+ Example header for a 3D View EVENT handler that also receives release events::
+
+  # SPACEHANDLER.VIEW3D.EVENT.ALL
+
  Example header for a 3D View DRAW handler::
 
   # SPACEHANDLER.VIEW3D.DRAW
@@ -216,6 +220,10 @@ Introduction:
   - process it (the script must set Blender.event to None then);
   - ignore it.
 
+ EVENT ALL space handlers (header: # SPACEHANDLER.VIEW3D.EVENT.ALL) are executed
+ both for key presses (Blender.event = Blender.SpaceHandlers.VIEW3D_EVENT) and
+ for key releases (Blender.event = Blender.SpaceHandlers.VIEW3D_EVENT_RELEASE).
+
  Setting C{Blender.event = None} tells Blender not to go on processing itself
  the event, because it was grabbed by the script.
 
@@ -248,7 +256,7 @@ Introduction:
   - B{bylink} is the same: True if the script is running as a script link;
   - B{link}: integer from the L{Blender}.SpaceHandlers constant dictionary,
     tells what space this handler belongs to and the handler's type
-    (EVENT, DRAW);
+    (EVENT, EVENT_RELEASE, DRAW);
   - B{event}:
      - EVENT handlers: an input event (check keys and mouse events in
        L{Draw}) to be processed or ignored;
@@ -258,6 +266,7 @@ Introduction:
        presses (since we don't pass releases) as 1 and mouse movements
        (Draw.MOUSE.X and Draw.MOUSE.Y) as the current x or y coordinate,
        for example;
+     - EVENT_RELEASE handlers (EVENT handlers executed during key release events): 0;
      - DRAW handlers: 0 always.
 
  B{Guidelines (important)}:
index d7c62f2cb020cda4bac2d2a20007a3e536518da9..5801913646eec6b5828eeabb40b70f0c7769e933 100644 (file)
@@ -174,3 +174,15 @@ def cleanpath (path):
   @rtype: string
   @return: the cleaned (if necessary) path.
   """
+
+def relpath (path, start="//"):
+  """
+  Returns the path relative to the start, 
+  @note: If the path can be made relative it well start with "//", this is spesific to blender and should be converted to "./" for use as a system path.
+  @type path: string
+  @param path: a path name.
+  @type start: string
+  @param start: optional argument for the base path, the current blend files base path is used omitted
+  @rtype: string
+  @return: The path relative to start
+  """
\ No newline at end of file
index c5edd711d0a927cbceb443e096d963df78fd4c68..451afc9b244118a0213df7c8902c40594c57b162 100644 (file)
@@ -94,6 +94,9 @@ if env['WITH_BF_SDL']:
 else:
     defs.append('DISABLE_SDL')
 
+if env['WITH_BF_BULLET']:
+    defs.append('WITH_BULLET')
+
 if env['BF_SPLIT_SRC'] and (env['OURPLATFORM'] == 'win32-mingw'):       
        for i in range(numlibs):         
                env.BlenderLib ( libname = 'src%d' % (i), sources = subsources[i], includes = Split(incs), defines = defs, libtype=['core', 'intern'], priority = [5, 25] )      
index 3d8bdb749bc1356ccdb3c93cef8c298cb5938ec5..65b992682de16134a624d6a0a84996524a33e615 100644 (file)
@@ -948,7 +948,7 @@ static void editing_panel_mesh_type(Object *ob, Mesh *me)
        fdata= (G.obedit)? &G.editMesh->fdata: &me->fdata;
        yco= customdata_buttons(block, me, fdata, CD_MTFACE, &acttface, &acttface_rnd, (G.f & G_TEXTUREPAINT ? &acttface_clone : NULL), (G.f & G_TEXTUREPAINT ? &acttface_mask : NULL),
                B_SETTFACE, B_SETTFACE_RND, B_SETTFACE_CLONE, B_SETTFACE_MASK, B_NEWTFACE, "UV Texture", "UV Texture:",
-               "Set active UV texture", "Set rendering UV texture", "Set the layer used for texturepaint cloning", "Set the layer used for texturepaint masking", "Creates a new UV texture layer",
+               "Set active UV texture", "Set rendering UV texture", "Set the layer used for texturepaint cloning", "Set the texture paint stencil layer", "Creates a new UV texture layer",
                "Removes the current UV texture layer", 190, 130);
 
        yco= customdata_buttons(block, me, fdata, CD_MCOL, &actmcol, &actmcol_rnd, NULL, NULL,
@@ -5429,7 +5429,7 @@ char *get_vertexgroup_menustr(Object *ob)
                qsort_ptr = MEM_callocN (defCount * sizeof (qsort_ptr[0]),
                                                                 "qsort_ptr");
                for (index = 1, dg = ob->defbase.first; dg; index++, dg=dg->next) {
-                       printed = snprintf (qsort_ptr[index - 1], sizeof (dg->name), dg->name);
+                       printed = snprintf (qsort_ptr[index - 1], sizeof (dg->name), "%s", dg->name);
                        snprintf (qsort_ptr[index - 1]+printed, 6+1, "%%x%d|", index); // +1 to move the \0   see above 999 max here too
                }
                
@@ -6329,6 +6329,125 @@ void weight_paint_buttons(uiBlock *block)
        }
 }
 
+void brush_buttons(uiBlock *block, short sima,
+               int evt_nop, int evt_change,
+               int evt_browse, int evt_local,
+               int evt_del, int evt_keepdata,
+               int evt_texbrowse, int evt_texdel)
+{
+       ToolSettings *settings= G.scene->toolsettings;
+       Brush *brush= settings->imapaint.brush;
+       ID *id;
+       int yco, xco, butw, but_idx;
+
+       short *menupoin = sima ? &(G.sima->menunr) : &(G.buts->menunr);
+       short do_project = settings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE ? 0:1;
+       
+       yco= 160;
+
+       butw = sima ? 80 : 106;
+       
+       uiBlockBeginAlign(block);
+       but_idx = 0;
+       uiDefButS(block, ROW, evt_change, "Draw",               butw*(but_idx++),yco,butw,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_DRAW, 0, 0, "Draw brush");
+       if (sima || do_project==0)
+               uiDefButS(block, ROW, evt_change, "Soften",     butw*(but_idx++),       yco,butw,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SOFTEN, 0, 0, "Soften brush");
+       uiDefButS(block, ROW, evt_change, "Smear",              butw*(but_idx++),       yco,butw,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SMEAR, 0, 0, "Smear brush");
+       if (sima || do_project)
+               uiDefButS(block, ROW, evt_change, "Clone",      butw*(but_idx++),       yco,butw,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_CLONE, 0, 0, "Clone brush, use RMB to drag source image");
+       
+       uiBlockEndAlign(block);
+       yco -= 30;
+        
+       uiBlockSetCol(block, TH_BUT_SETTING2);
+       id= (ID*)settings->imapaint.brush;
+       xco= std_libbuttons(block, 0, yco, 0, NULL, evt_browse, ID_BR, 0, id, NULL, menupoin, 0, evt_local, evt_del, 0, evt_keepdata);
+       uiBlockSetCol(block, TH_AUTO);
+
+       if(brush && !brush->id.lib) {
+
+               butw= 320-(xco+10);
+
+               uiDefButS(block, MENU, evt_nop, "Mix %x0|Add %x1|Subtract %x2|Multiply %x3|Lighten %x4|Darken %x5|Erase Alpha %x6|Add Alpha %x7", xco+10,yco,butw,19, &brush->blend, 0, 0, 0, 0, "Blending method for applying brushes");
+       
+               uiBlockBeginAlign(block);
+               uiDefButBitS(block, TOG|BIT, BRUSH_AIRBRUSH, evt_change, "Airbrush",    xco+10,yco-25,butw/2,19, &brush->flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse (spray)");
+               uiDefButF(block, NUM, evt_nop, "", xco+10 + butw/2,yco-25,butw/2,19, &brush->rate, 0.01, 1.0, 0, 0, "Number of paints per second for Airbrush");
+               uiBlockEndAlign(block);
+               
+               if (sima) {
+                       uiDefButBitS(block, TOG|BIT, BRUSH_TORUS, evt_change, "Wrap",   xco+10,yco-45,butw,19, &brush->flag, 0, 0, 0, 0, "Enables torus wrapping");
+                       yco -= 25;
+               }
+               else {
+                       yco -= 25;
+                       uiBlockBeginAlign(block);
+                       uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_DISABLE, B_REDR, "Project Paint",      xco+10,yco-25,butw,19, &settings->imapaint.flag, 0, 0, 0, 0, "Use projection painting for improved consistency in the brush strokes");
+                       
+                       if ((settings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE)==0) {
+                               
+                               
+                               /* Projection Painting */
+                               
+                               uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_XRAY, B_NOP, "Occlude",        xco+10,yco-45,butw/2,19, &settings->imapaint.flag, 0, 0, 0, 0, "Only paint onto the faces directly under the brush (slower)");
+                               uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_BACKFACE, B_NOP, "Cull",       xco+10+butw/2,yco-45,butw/2,19, &settings->imapaint.flag, 0, 0, 0, 0, "Ignore faces pointing away from the view (faster)");
+                               
+                               uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_FLAT, B_NOP, "Normal", xco+10,yco-65,butw/2,19, &settings->imapaint.flag, 0, 0, 0, 0, "Paint most on faces pointing towards the view");
+                               uiDefButS(block, NUM, B_NOP, "", xco+10 +(butw/2),yco-65,butw/2,19, &settings->imapaint.normal_angle, 10.0, 90.0, 0, 0, "Paint most on faces pointing towards the view acording to this angle)");
+                               
+                               uiDefButS(block, NUM, B_NOP, "Bleed: ", xco+10,yco-85,butw,19, &settings->imapaint.seam_bleed, 0.0, 8.0, 0, 0, "Extend paint beyond the faces UVs to reduce seams (in pixels, slower)");
+                               uiBlockEndAlign(block);
+                               
+                               uiBlockBeginAlign(block);
+                               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_PROJECT_LAYER_MASK, B_NOP, "Stencil Layer",     xco+10,yco-110,butw-30,19, &settings->imapaint.flag, 0, 0, 0, 0, "Set the mask layer from the UV layer buttons");
+                               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_PROJECT_LAYER_MASK_INV, B_NOP, "Inv",   xco+10 + butw-30,yco-110,30,19, &settings->imapaint.flag, 0, 0, 0, 0, "Invert the mask");
+                               uiBlockEndAlign(block);
+                               
+                       }
+                       uiBlockEndAlign(block);
+               }
+               
+               uiBlockBeginAlign(block);
+               uiDefButF(block, COL, B_VPCOLSLI, "",                                   0,yco,200,19, brush->rgb, 0, 0, 0, 0, "");
+               uiDefButF(block, NUMSLI, evt_nop, "Opacity ",           0,yco-20,180,19, &brush->alpha, 0.0, 1.0, 0, 0, "The amount of pressure on the brush");
+               uiDefButBitS(block, TOG|BIT, BRUSH_ALPHA_PRESSURE, evt_nop, "P",        180,yco-20,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
+               uiDefButI(block, NUMSLI, evt_nop, "Size ",              0,yco-40,180,19, &brush->size, 1, 200, 0, 0, "The size of the brush");
+               uiDefButBitS(block, TOG|BIT, BRUSH_SIZE_PRESSURE, evt_nop, "P", 180,yco-40,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
+               uiDefButF(block, NUMSLI, evt_nop, "Falloff ",           0,yco-60,180,19, &brush->innerradius, 0.0, 1.0, 0, 0, "The fall off radius of the brush");
+               uiDefButBitS(block, TOG|BIT, BRUSH_RAD_PRESSURE, evt_nop, "P",  180,yco-60,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
+               uiDefButF(block, NUMSLI, evt_nop, "Spacing ",0,yco-80,180,19, &brush->spacing, 1.0, 100.0, 0, 0, "Repeating paint on %% of brush diameter");
+       uiDefButBitS(block, TOG|BIT, BRUSH_SPACING_PRESSURE, evt_nop, "P",      180,yco-80,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
+               uiBlockEndAlign(block);
+
+               yco -= 110;
+
+               if(sima && settings->imapaint.tool == PAINT_TOOL_CLONE) {
+                       id= (ID*)brush->clone.image;
+                       uiBlockSetCol(block, TH_BUT_SETTING2);
+                       xco= std_libbuttons(block, 0, yco, 0, NULL, B_SIMACLONEBROWSE, ID_IM, 0, id, 0, menupoin, 0, 0, B_SIMACLONEDELETE, 0, 0);
+                       uiBlockSetCol(block, TH_AUTO);
+                       if(id) {
+                               butw= 320-(xco+5);
+                               uiDefButF(block, NUMSLI, evt_change, "B ",xco+5,yco,butw,19, &brush->clone.alpha , 0.0, 1.0, 0, 0, "Opacity of clone image display");
+                       }
+               }
+               else {
+                       MTex *mtex= brush->mtex[brush->texact];
+                       
+                       uiBlockSetCol(block, TH_BUT_SETTING2);
+                       id= (mtex)? (ID*)mtex->tex: NULL;
+                       xco= std_libbuttons(block, 0, yco, 0, NULL, evt_texbrowse, ID_TE, 0, id, NULL, menupoin, 0, 0, evt_texdel, 0, 0);
+                       /*uiDefButBitS(block, TOG|BIT, BRUSH_FIXED_TEX, evt_change, "Fixed",    xco+5,yco,butw,19, &brush->flag, 0, 0, 0, 0, "Keep texture origin in fixed position");*/
+                       uiBlockSetCol(block, TH_AUTO);
+               }
+       }
+       
+#if 0
+               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_DRAW_TOOL_DRAWING, B_SIMABRUSHCHANGE, "TD", 0,1,50,19, &settings->imapaint.flag.flag, 0, 0, 0, 0, "Enables brush shape while drawing");
+               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_DRAW_TOOL, B_SIMABRUSHCHANGE, "TP", 50,1,50,19, &settings->imapaint.flag.flag, 0, 0, 0, 0, "Enables brush shape while not drawing");
+#endif
+}
+
 static void editing_panel_mesh_paint(void)
 {
        uiBlock *block;
@@ -6388,101 +6507,7 @@ static void editing_panel_mesh_paint(void)
                uiBlockEndAlign(block);
        }
        else { /* texture paint */
-               ToolSettings *settings= G.scene->toolsettings;
-               Brush *brush= settings->imapaint.brush;
-               ID *id;
-               int yco, xco, butw;
-
-               yco= 160;
-
-               uiBlockBeginAlign(block);
-               if ((settings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE)==0) {
-                       uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Draw",                0  ,yco,108,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_DRAW, 0, 0, "Draw brush");
-                       uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Smear",               108 ,yco,106,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SMEAR, 0, 0, "Smear brush"); 
-                       uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Clone",               214,yco,106,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_CLONE, 0, 0, "Clone brush, use RMB to drag source image");
-               }
-               else { 
-                       uiDefButS(block, ROW, B_BRUSHCHANGE, "Draw",            0  ,yco,108,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_DRAW, 0, 0, "Draw brush");
-                       uiDefButS(block, ROW, B_BRUSHCHANGE, "Soften",          108 ,yco,106,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SOFTEN, 0, 0, "Soften brush");
-                       uiDefButS(block, ROW, B_BRUSHCHANGE, "Smear",           214,yco,106,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SMEAR, 0, 0, "Smear brush");  
-               }       
-               
-               uiBlockEndAlign(block);
-               yco -= 30;
-
-               uiBlockSetCol(block, TH_BUT_SETTING2);
-               id= (ID*)settings->imapaint.brush;
-               xco= std_libbuttons(block, 0, yco, 0, NULL, B_BRUSHBROWSE, ID_BR, 0, id, NULL, &(G.buts->menunr), 0, B_BRUSHLOCAL, B_BRUSHDELETE, 0, B_BRUSHKEEPDATA);
-               uiBlockSetCol(block, TH_AUTO);
-
-               if(brush && !brush->id.lib) {
-                       MTex *mtex= brush->mtex[brush->texact];
-
-                       butw= 320-(xco+10);
-
-                       uiDefButS(block, MENU, B_NOP, "Mix %x0|Add %x1|Subtract %x2|Multiply %x3|Lighten %x4|Darken %x5|Erase Alpha %x6|Add Alpha %x7", xco+10,yco,butw,19, &brush->blend, 0, 0, 0, 0, "Blending method for applying brushes");
-
-                       // uiDefButBitS(block, TOG|BIT, BRUSH_TORUS, B_BRUSHCHANGE, "Wrap",     xco+10,yco-25,butw,19, &brush->flag, 0, 0, 0, 0, "Enables torus wrapping");
-
-                       uiBlockBeginAlign(block);
-                       uiDefButBitS(block, TOG|BIT, BRUSH_AIRBRUSH, B_BRUSHCHANGE, "Airbrush", xco+10,yco-25,butw,19, &brush->flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse (spray)");
-                       uiDefButF(block, NUM, B_NOP, "Rate ", xco+10,yco-45,butw,19, &brush->rate, 0.01, 1.0, 0, 0, "Number of paints per second for Airbrush");
-                       uiBlockEndAlign(block);
-                       
-                       uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_DISABLE, B_REDR, "Project Paint",      xco+10,yco-70,butw,19, &settings->imapaint.flag, 0, 0, 0, 0, "Use projection painting for improved consistency in the brush strokes");
-                       
-                       yco -= 50;
-                       
-                       if ((settings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE)==0) {
-                               //uiDefButBitS(block, TOG|BIT, BRUSH_TORUS, B_BRUSHCHANGE, "Wrap",      xco+10,yco-25,butw,19, &brush->flag, 0, 0, 0, 0, "Enables torus wrapping");
-                               
-                               /* Projection Painting */
-                               uiBlockBeginAlign(block);
-                               uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_XRAY, B_NOP, "Occlude",        xco+10,yco-45,butw/2,19, &settings->imapaint.flag, 0, 0, 0, 0, "Only paint onto the faces directly under the brush (slower)");
-                               uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_BACKFACE, B_NOP, "Cull",       xco+10+butw/2,yco-45,butw/2,19, &settings->imapaint.flag, 0, 0, 0, 0, "Ignore faces pointing away from the view (faster)");
-                               
-                               uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_FLAT, B_NOP, "Normal", xco+10,yco-65,butw/2,19, &settings->imapaint.flag, 0, 0, 0, 0, "Paint most on faces pointing towards the view");
-                               uiDefButC(block, NUM, B_NOP, "", xco+10 +(butw/2),yco-65,butw/2,19, &settings->imapaint.normal_angle, 10.0, 90.0, 0, 0, "Paint most on faces pointing towards the view acording to this angle)");
-                               
-                               uiDefButC(block, NUM, B_NOP, "Bleed: ", xco+10,yco-85,butw,19, &settings->imapaint.seam_bleed, 0.0, 8.0, 0, 0, "Extend paint beyond the faces UVs to reduce seams (in pixels, slower)");
-                               uiBlockEndAlign(block);
-                               
-                               uiBlockBeginAlign(block);
-                               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_PROJECT_LAYER_MASK, B_NOP, "Layer Mask",        xco+10,yco-110,butw-30,19, &settings->imapaint.flag, 0, 0, 0, 0, "Set the mask layer from the UV layer buttons");
-                               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_PROJECT_LAYER_MASK_INV, B_NOP, "Inv",   xco+10 + butw-30,yco-110,30,19, &settings->imapaint.flag, 0, 0, 0, 0, "Invert the mask");
-                               uiBlockEndAlign(block);
-                               
-                       }
-                       
-                       uiBlockBeginAlign(block);
-                       uiDefButF(block, COL, B_VPCOLSLI, "",                                   0,yco,200,19, brush->rgb, 0, 0, 0, 0, "");
-                       uiDefButF(block, NUMSLI, B_NOP, "Opacity ",             0,yco-20,180,19, &brush->alpha, 0.0, 1.0, 0, 0, "The amount of pressure on the brush");
-                       uiDefButBitS(block, TOG|BIT, BRUSH_ALPHA_PRESSURE, B_NOP, "P",  180,yco-20,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-                       uiDefButI(block, NUMSLI, B_NOP, "Size ",                0,yco-40,180,19, &brush->size, 1, 200, 0, 0, "The size of the brush");
-                       uiDefButBitS(block, TOG|BIT, BRUSH_SIZE_PRESSURE, B_NOP, "P",   180,yco-40,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-                       uiDefButF(block, NUMSLI, B_NOP, "Falloff ",             0,yco-60,180,19, &brush->innerradius, 0.0, 1.0, 0, 0, "The fall off radius of the brush");
-                       uiDefButBitS(block, TOG|BIT, BRUSH_RAD_PRESSURE, B_NOP, "P",    180,yco-60,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-                       uiDefButF(block, NUMSLI, B_NOP, "Spacing ",0,yco-80,180,19, &brush->spacing, 1.0, 100.0, 0, 0, "Repeating paint on %% of brush diameter");
-               uiDefButBitS(block, TOG|BIT, BRUSH_SPACING_PRESSURE, B_NOP, "P",        180,yco-80,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-                       uiBlockEndAlign(block);
-
-                       yco -= 110;
-
-                       if (settings->imapaint.tool == PAINT_TOOL_CLONE) {
-                               if ((settings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE)==0) {
-                                       butw = 130;
-                                       uiBlockBeginAlign(block);
-                                       uiDefButBitS(block, TOG|BIT, IMAGEPAINT_PROJECT_LAYER_CLONE, B_REDR, "Clone from Layer",        0,yco,butw,20, &settings->imapaint.flag, 0, 0, 0, 0, "Use another UV layer as clone source, otherwise use 3D the cursor as the source");
-                                       uiBlockEndAlign(block);
-                               }
-                       } else {
-                               uiBlockSetCol(block, TH_BUT_SETTING2);
-                               id= (mtex)? (ID*)mtex->tex: NULL;
-                               xco= std_libbuttons(block, 0, yco, 0, NULL, B_BTEXBROWSE, ID_TE, 0, id, NULL, &(G.buts->menunr), 0, 0, B_BTEXDELETE, 0, 0);
-                               /*uiDefButBitS(block, TOG|BIT, BRUSH_FIXED_TEX, B_BRUSHCHANGE, "Fixed", xco+5,yco,butw,19, &brush->flag, 0, 0, 0, 0, "Keep texture origin in fixed position");*/
-                               uiBlockSetCol(block, TH_AUTO);
-                       }
-               }
+               brush_buttons(block, 0, B_NOP, B_BRUSHCHANGE, B_BRUSHBROWSE, B_BRUSHLOCAL, B_BRUSHDELETE, B_BRUSHKEEPDATA, B_BTEXBROWSE, B_BTEXDELETE);
        }
 }
 
index 74725b99fea79408db778437bbc6ff241000def6..ea7411af621aa1cdf29beef26cf4effc8ba665d1 100644 (file)
@@ -1388,9 +1388,9 @@ static void run_playanim(char *file)
        calc_renderwin_rectangle((G.scene->r.xsch*G.scene->r.size)/100, 
                                                         (G.scene->r.ysch*G.scene->r.size)/100, G.winpos, pos, size);
 #ifdef WIN32
-       sprintf(str, "%s -a -s %d -e %d -p %d %d -f %d %g \"%s\"", bprogname, G.scene->r.sfra, G.scene->r.efra, pos[0], pos[1], G.scene->r.frs_sec, G.scene->r.frs_sec_base, file);
+       sprintf(str, "%s -a -s %d -e %d -p %d %d -f %d %g -j %d \"%s\"", bprogname, G.scene->r.sfra, G.scene->r.efra, pos[0], pos[1], G.scene->r.frs_sec, G.scene->r.frs_sec_base, G.scene->frame_step, file);
 #else
-       sprintf(str, "\"%s\" -a -s %d -e %d  -p %d %d -f %d %g \"%s\"", bprogname, G.scene->r.sfra, G.scene->r.efra, pos[0], pos[1], G.scene->r.frs_sec, G.scene->r.frs_sec_base, file);
+       sprintf(str, "\"%s\" -a -s %d -e %d  -p %d %d -f %d %g -j %d \"%s\"", bprogname, G.scene->r.sfra, G.scene->r.efra, pos[0], pos[1], G.scene->r.frs_sec, G.scene->r.frs_sec_base, G.scene->frame_step, file);
 #endif
        system(str);
 }
index 84236a0701a024093a6c93fcb5309fbe3b96eef8..d400af3c2bf98ae71c100f788689fcf8610eb8c5 100644 (file)
@@ -1483,15 +1483,7 @@ static void image_panel_view_properties(short cntrl)     // IMAGE_HANDLER_VIEW_PROPE
 
 static void image_panel_paint(short cntrl)     // IMAGE_HANDLER_PAINT
 {
-       /* B_SIMABRUSHCHANGE only redraws and eats the mouse messages  */
-       /* so that LEFTMOUSE does not 'punch' through the floating panel */
-       /* B_SIMANOTHING */
-       ToolSettings *settings= G.scene->toolsettings;
-       Brush *brush= settings->imapaint.brush;
        uiBlock *block;
-       ID *id;
-       int yco, xco, butw;
-       
        if ((G.sima->image && (G.sima->flag & SI_DRAWTOOL))==0) {
                return;
        }
@@ -1501,75 +1493,8 @@ static void image_panel_paint(short cntrl)       // IMAGE_HANDLER_PAINT
        uiSetPanelHandler(IMAGE_HANDLER_PAINT);  // for close and esc
        if(uiNewPanel(curarea, block, "Image Paint", "Image", 10, 230, 318, 204)==0)
                return;
-
-       yco= 160;
-
-       uiBlockBeginAlign(block);
-       uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Draw",                0  ,yco,80,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_DRAW, 0, 0, "Draw brush");
-       uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Soften",              80 ,yco,80,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SOFTEN, 0, 0, "Soften brush");
-       uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Smear",               160,yco,80,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SMEAR, 0, 0, "Smear brush");   
-       uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Clone",               240,yco,80,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_CLONE, 0, 0, "Clone brush, use RMB to drag source image");     
-       uiBlockEndAlign(block);
-       yco -= 30;
-
-       uiBlockSetCol(block, TH_BUT_SETTING2);
-       id= (ID*)settings->imapaint.brush;
-       xco= std_libbuttons(block, 0, yco, 0, NULL, B_SIMABRUSHBROWSE, ID_BR, 0, id, NULL, &(G.sima->menunr), 0, B_SIMABRUSHLOCAL, B_SIMABRUSHDELETE, 0, B_KEEPDATA);
-       uiBlockSetCol(block, TH_AUTO);
-
-       if(brush && !brush->id.lib) {
-               butw= 320-(xco+10);
-
-               uiDefButS(block, MENU, B_SIMANOTHING, "Mix %x0|Add %x1|Subtract %x2|Multiply %x3|Lighten %x4|Darken %x5|Erase Alpha %x6|Add Alpha %x7", xco+10,yco,butw,19, &brush->blend, 0, 0, 0, 0, "Blending method for applying brushes");
-
-               uiDefButBitS(block, TOG|BIT, BRUSH_TORUS, B_SIMABRUSHCHANGE, "Wrap",    xco+10,yco-25,butw,19, &brush->flag, 0, 0, 0, 0, "Enables torus wrapping");
-
-               uiBlockBeginAlign(block);
-               uiDefButBitS(block, TOG|BIT, BRUSH_AIRBRUSH, B_SIMABRUSHCHANGE, "Airbrush",     xco+10,yco-50,butw,19, &brush->flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse (spray)");
-               uiDefButF(block, NUM, B_SIMANOTHING, "Rate ", xco+10,yco-70,butw,19, &brush->rate, 0.01, 1.0, 0, 0, "Number of paints per second for Airbrush");
-               uiBlockEndAlign(block);
-
-               yco -= 25;
-
-               uiBlockBeginAlign(block);
-               uiDefButF(block, COL, B_VPCOLSLI, "",                                   0,yco,200,19, brush->rgb, 0, 0, 0, 0, "");
-               uiDefButF(block, NUMSLI, B_SIMANOTHING, "Opacity ",             0,yco-20,180,19, &brush->alpha, 0.0, 1.0, 0, 0, "The amount of pressure on the brush");
-               uiDefButBitS(block, TOG|BIT, BRUSH_ALPHA_PRESSURE, B_SIMANOTHING, "P",  180,yco-20,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-               uiDefButI(block, NUMSLI, B_SIMANOTHING, "Size ",                0,yco-40,180,19, &brush->size, 1, 200, 0, 0, "The size of the brush");
-               uiDefButBitS(block, TOG|BIT, BRUSH_SIZE_PRESSURE, B_SIMANOTHING, "P",   180,yco-40,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-               uiDefButF(block, NUMSLI, B_SIMANOTHING, "Falloff ",             0,yco-60,180,19, &brush->innerradius, 0.0, 1.0, 0, 0, "The fall off radius of the brush");
-               uiDefButBitS(block, TOG|BIT, BRUSH_RAD_PRESSURE, B_SIMANOTHING, "P",    180,yco-60,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-               uiDefButF(block, NUMSLI, B_SIMANOTHING, "Spacing ",0,yco-80,180,19, &brush->spacing, 1.0, 100.0, 0, 0, "Repeating paint on %% of brush diameter");
-               uiDefButBitS(block, TOG|BIT, BRUSH_SPACING_PRESSURE, B_SIMANOTHING, "P",        180,yco-80,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-               uiBlockEndAlign(block);
-
-               yco -= 110;
-
-               if(settings->imapaint.tool == PAINT_TOOL_CLONE) {
-                       id= (ID*)brush->clone.image;
-                       uiBlockSetCol(block, TH_BUT_SETTING2);
-                       xco= std_libbuttons(block, 0, yco, 0, NULL, B_SIMACLONEBROWSE, ID_IM, 0, id, 0, &G.sima->menunr, 0, 0, B_SIMACLONEDELETE, 0, 0);
-                       uiBlockSetCol(block, TH_AUTO);
-                       if(id) {
-                               butw= 320-(xco+5);
-                               uiDefButF(block, NUMSLI, B_SIMABRUSHCHANGE, "B ",xco+5,yco,butw,19, &brush->clone.alpha , 0.0, 1.0, 0, 0, "Opacity of clone image display");
-                       }
-               }
-               else {
-                       MTex *mtex= brush->mtex[brush->texact];
-
-                       uiBlockSetCol(block, TH_BUT_SETTING2);
-                       id= (mtex)? (ID*)mtex->tex: NULL;
-                       xco= std_libbuttons(block, 0, yco, 0, NULL, B_SIMABTEXBROWSE, ID_TE, 0, id, NULL, &(G.sima->menunr), 0, 0, B_SIMABTEXDELETE, 0, 0);
-                       /*uiDefButBitS(block, TOG|BIT, BRUSH_FIXED_TEX, B_SIMABRUSHCHANGE, "Fixed",     xco+5,yco,butw,19, &brush->flag, 0, 0, 0, 0, "Keep texture origin in fixed position");*/
-                       uiBlockSetCol(block, TH_AUTO);
-               }
-       }
-
-#if 0
-               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_DRAW_TOOL_DRAWING, B_SIMABRUSHCHANGE, "TD", 0,1,50,19, &settings->imapaint.flag.flag, 0, 0, 0, 0, "Enables brush shape while drawing");
-               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_DRAW_TOOL, B_SIMABRUSHCHANGE, "TP", 50,1,50,19, &settings->imapaint.flag.flag, 0, 0, 0, 0, "Enables brush shape while not drawing");
-#endif
+       
+       brush_buttons(block, 1, B_SIMANOTHING, B_SIMABRUSHCHANGE, B_SIMABRUSHBROWSE, B_SIMABRUSHLOCAL, B_SIMABRUSHDELETE, B_KEEPDATA, B_SIMABTEXBROWSE, B_SIMABTEXDELETE);
 }
 
 static void image_panel_curves_reset(void *cumap_v, void *ibuf_v)
index 21192d50333d9e9d5ea92d5ea7cb63f54dfa0788..0538bcb98d75192183664416d64b00c812e68330 100644 (file)
@@ -165,6 +165,22 @@ void PE_change_act(void *ob_v, void *act_v)
        }
 }
 
+void PE_change_act_psys(Object *ob, ParticleSystem *psys)
+{
+       ParticleSystem *p;
+       
+       if((p=psys_get_current(ob)))
+               p->flag &= ~PSYS_CURRENT;
+       
+       psys->flag |= PSYS_CURRENT;
+       
+       if(psys_check_enabled(ob, psys)) {
+               if(G.f & G_PARTICLEEDIT && !psys->edit)
+                       PE_create_particle_edit(ob, psys);
+               PE_recalc_world_cos(ob, psys);
+       }
+}
+
 /* always gets atleast the first particlesystem even if PSYS_CURRENT flag is not set */
 ParticleSystem *PE_get_current(Object *ob)
 {
index 574e0b3a9f1a58404a57a5e4ac522c9094920f57..02bdda86b4ecfb22b5044ae6edb183aa81bf2c42 100644 (file)
@@ -160,6 +160,9 @@ static void do_time_redrawmenu(void *arg, int event)
                if(event==1001) {
                        button(&G.scene->r.frs_sec,1,120,"FPS:");
                }
+               else if(event==1002) {
+                       G.scene->audio.flag ^= AUDIO_SYNC;
+               }
        }
 }
                        
@@ -202,7 +205,11 @@ static uiBlock *time_redrawmenu(void *arg_unused)
 
        uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
        
-       sprintf(str, "Set Frames/Sec (%d/%f)", G.scene->r.frs_sec, G.scene->r.frs_sec_base);
+       if(G.scene->audio.flag & AUDIO_SYNC) icon= ICON_CHECKBOX_HLT;
+       else icon= ICON_CHECKBOX_DEHLT;
+       uiDefIconTextBut(block, BUTM, 1, icon, "Sync Playback to Frames/Sec",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1002, "");
+       
+       sprintf(str, "Set Frames/Sec (%d/%2f)", G.scene->r.frs_sec, G.scene->r.frs_sec_base);
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str,       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1001, "");
 
        uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
index e2caf97df051342d8224b01d6a7e38a08a8c7dad..60c5854f1a5db8a49c75b5148b6c5061a5e282ee 100644 (file)
@@ -517,6 +517,8 @@ static uiBlock *view3d_view_spacehandlers(void *arg_unused)
 
                        if (handlertype == SPACEHANDLER_VIEW3D_EVENT)
                                BLI_strncpy(menustr, "Event: ", 8);
+                       else if (handlertype == SPACEHANDLER_VIEW3D_EVENT_ALL)
+                               BLI_strncpy(menustr, "Event+: ", 8);
                        else
                                BLI_strncpy(menustr, "Draw:  ", 8);
                        BLI_strncpy(menustr+7, text->id.name+2, 22);
index 8e3e44c06de794501cc69a196cbd6ea0871e0bf1..e6ffa1283106bd0943a13935faeae6f8939ca833 100644 (file)
@@ -50,6 +50,7 @@
 #include "DNA_nla_types.h"
 #include "DNA_object_types.h"
 #include "DNA_oops_types.h"
+#include "DNA_particle_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
@@ -87,6 +88,7 @@
 #include "BIF_editarmature.h"
 #include "BIF_editdeform.h"
 #include "BIF_editnla.h"
+#include "BIF_editparticle.h"
 #include "BIF_editview.h"
 #include "BIF_editconstraint.h"
 #include "BIF_gl.h"
@@ -715,6 +717,13 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
                                                        outliner_add_element(soops, &te->subtree, ((ArmatureModifierData*) md)->object, te, TSE_LINKED_OB, 0);
                                                } else if (md->type==eModifierType_Hook) {
                                                        outliner_add_element(soops, &te->subtree, ((HookModifierData*) md)->object, te, TSE_LINKED_OB, 0);
+                                               } else if (md->type==eModifierType_ParticleSystem) {
+                                                       TreeElement *ten;
+                                                       ParticleSystem *psys= ((ParticleSystemModifierData*) md)->psys;
+                                                       
+                                                       ten = outliner_add_element(soops, &te->subtree, ob, te, TSE_LINKED_PSYS, 0);
+                                                       ten->directdata = psys;
+                                                       ten->name = psys->part->id.name+2;
                                                }
                                        }
                                }
@@ -1965,6 +1974,19 @@ static int tree_element_active_modifier(TreeElement *te, TreeStoreElem *tselem,
        return 0;
 }
 
+static int tree_element_active_psys(TreeElement *te, TreeStoreElem *tselem, int set)
+{
+       if(set) {
+               Object *ob= (Object *)tselem->id;
+               ParticleSystem *psys= te->directdata;
+               
+               PE_change_act_psys(ob, psys);
+               extern_set_butspace(F7KEY, 0);
+       }
+       
+       return 0;
+}
+
 static int tree_element_active_constraint(TreeElement *te, TreeStoreElem *tselem, int set)
 {
        if(set) {
@@ -2094,6 +2116,9 @@ static int tree_element_type_active(SpaceOops *soops, TreeElement *te, TreeStore
                        if(set) tree_element_active_object(soops, te);
                        else if(tselem->id==(ID *)OBACT) return 1;
                        break;
+               case TSE_LINKED_PSYS:
+                       return tree_element_active_psys(te, tselem, set);
+                       break;
                case TSE_POSE_BASE:
                        return tree_element_active_pose(te, tselem, set);
                        break;
@@ -3203,6 +3228,8 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen
                                BIF_icon_draw(x, y, ICON_MODIFIER); break;
                        case TSE_LINKED_OB:
                                BIF_icon_draw(x, y, ICON_OBJECT); break;
+                       case TSE_LINKED_PSYS:
+                               BIF_icon_draw(x, y, ICON_PARTICLES); break;
                        case TSE_MODIFIER:
                        {
                                Object *ob= (Object *)tselem->id;
@@ -3230,6 +3257,9 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen
                                                BIF_icon_draw(x, y, ICON_MOD_SOFT); break;
                                        case eModifierType_Boolean: 
                                                BIF_icon_draw(x, y, ICON_MOD_BOOLEAN); break;
+                                       case eModifierType_ParticleSystem: 
+                                       case eModifierType_ParticleInstance:
+                                               BIF_icon_draw(x, y, ICON_PARTICLES); break;
                                        default:
                                                BIF_icon_draw(x, y, ICON_DOT); break;
                                }
index 8880380700db051cf602db94e9b1f440cae73f6c..b2851342cac374356f0c68f96f555dd2318ef37d 100644 (file)
@@ -169,6 +169,7 @@ typedef struct pict{
 static struct ListBase _picsbase = {0,0};
 static struct ListBase *picsbase = &_picsbase;
 static int fromdisk = FALSE;
+static int fstep = 1; 
 static float zoomx = 1.0 , zoomy = 1.0;
 static double ptottime = 0.0, swaptime = 0.04;
 
@@ -208,14 +209,14 @@ static void toscreen(Pict *picture, struct ImBuf *ibuf)
                char str[512];
                cpack(-1);
                glRasterPos2f(0.02f,  0.03f);
-               sprintf(str, "%s | %.2f frames/s\n", picture->name, 1.0 / swaptime);
+               sprintf(str, "%s | %.2f frames/s\n", picture->name, fstep / swaptime);
                BMF_DrawString(G.fonts, str);
        }
        
        window_swap_buffers(g_window);
 }
 
-static void build_pict_list(char * first, int totframes)
+static void build_pict_list(char * first, int totframes, int fstep)
 {
        int size,pic,file;
        char *mem, name[512];
@@ -322,7 +323,7 @@ static void build_pict_list(char * first, int totframes)
                                ptottime = 0.0;
                        }
                        
-                       BLI_newname(name, +1);
+                       BLI_newname(name, +fstep);
                        
                        while(qtest()){
                                switch(qreadN(&val)){
@@ -396,6 +397,12 @@ void playanim(int argc, char **argv)
                                        argc--;
                                        argv++;
                                        break;
+                               case 'j':
+                                       fstep= MIN2(MAXFRAME, MAX2(1, atoi(argv[2])));
+                                       swaptime*= fstep;
+                                       argc--;
+                                       argv++;
+                                       break;
                                default:
                                        printf("unknown option '%c': skipping\n", argv[1][1]);
                                        break;
@@ -486,11 +493,11 @@ void playanim(int argc, char **argv)
                efra = MAXFRAME;
        }
        
-       build_pict_list(name, (efra - sfra) + 1);
+       build_pict_list(name, (efra - sfra) + 1, fstep);
        
        for (i = 2; i < argc; i++){
                strcpy(name, argv[i]);
-               build_pict_list(name, (efra - sfra) + 1);
+               build_pict_list(name, (efra - sfra) + 1, fstep);
        }
 
        IMB_freeImBuf(ibuf); 
@@ -571,9 +578,9 @@ void playanim(int argc, char **argv)
                                        if (val) {
                                                if (qualN & SHIFT) {
                                                        if (ibuf)
-                                                               printf(" Name: %s | Speed: %.2f frames/s\n", ibuf->name, 1.0 / swaptime);
+                                                               printf(" Name: %s | Speed: %.2f frames/s\n", ibuf->name, fstep / swaptime);
                                                } else {
-                                                       swaptime = 1.0 / 5.0;
+                                                       swaptime = fstep / 5.0;
                                                }
                                        }
                                        break;
@@ -688,34 +695,34 @@ void playanim(int argc, char **argv)
                                        }
                                        break;
                                case PAD1:
-                                       swaptime = 1.0 / 60.0;
+                                       swaptime = fstep / 60.0;
                                        break;
                                case PAD2:
-                                       swaptime = 1.0 / 50.0;
+                                       swaptime = fstep / 50.0;
                                        break;
                                case PAD3:
-                                       swaptime = 1.0 / 30.0;
+                                       swaptime = fstep / 30.0;
                                        break;
                                case PAD4:
                                        if (qualN & SHIFT)
-                                               swaptime = 1.0 / 24.0;
+                                               swaptime = fstep / 24.0;
                                        else
-                                               swaptime = 1.0 / 25.0;
+                                               swaptime = fstep / 25.0;
                                        break;
                                case PAD5:
-                                       swaptime = 1.0 / 20.0;
+                                       swaptime = fstep / 20.0;
                                        break;
                                case PAD6:
-                                       swaptime = 1.0 / 15.0;
+                                       swaptime = fstep / 15.0;
                                        break;
                                case PAD7:
-                                       swaptime = 1.0 / 12.0;
+                                       swaptime = fstep / 12.0;
                                        break;
                                case PAD8:
-                                       swaptime = 1.0 / 10.0;
+                                       swaptime = fstep / 10.0;
                                        break;
                                case PAD9:
-                                       swaptime = 1.0 / 6.0;
+                                       swaptime = fstep / 6.0;
                                        break;
                                case PADPLUSKEY:
                                        if (val == 0) break;
index 05aff70dedfef19c79cd6f72d42973b7b7a99ee0..58554fbfebaddb2e3f68e2da06ac79f869f176e8 100644 (file)
@@ -2007,8 +2007,8 @@ static void do_transform(Sequence * seq,float facf0, int x, int y,
                tx = scale->xIni+(xo / 2.0f) + (scale->xFin-(xo / 2.0f) - scale->xIni+(xo / 2.0f)) * facf0;
                ty = scale->yIni+(yo / 2.0f) + (scale->yFin-(yo / 2.0f) - scale->yIni+(yo / 2.0f)) * facf0;
        }else{
-               tx = xo*(scale->xIni/100.0)+(xo / 2.0f) + (xo*(scale->xFin/100.0)-(xo / 2.0f) - xo*(scale->xIni/100.0)+(xo / 2.0f)) * facf0;
-               ty = yo*(scale->yIni/100.0)+(yo / 2.0f) + (yo*(scale->yFin/100.0)-(yo / 2.0f) - yo*(scale->yIni/100.0)+(yo / 2.0f)) * facf0;
+               tx = xo*(scale->xIni/100.0f)+(xo / 2.0f) + (xo*(scale->xFin/100.0f)-(xo / 2.0f) - xo*(scale->xIni/100.0f)+(xo / 2.0f)) * facf0;
+               ty = yo*(scale->yIni/100.0f)+(yo / 2.0f) + (yo*(scale->yFin/100.0f)-(yo / 2.0f) - yo*(scale->yIni/100.0f)+(yo / 2.0f)) * facf0;
        }
 
        //factor Rotate
@@ -2036,12 +2036,17 @@ static void do_transform(Sequence * seq,float facf0, int x, int y,
                        ys += (yo / 2.0f);
 
                        //interpolate
-                       if(scale->interpolation==0)
+                       switch(scale->interpolation) {
+                       case 0:
                                neareast_interpolation(ibuf1,out, xs,ys,xi,yi);
-                       if(scale->interpolation==1)
+                               break;
+                       case 1:
                                bilinear_interpolation(ibuf1,out, xs,ys,xi,yi);
-                       if(scale->interpolation==2)
+                               break;
+                       case 2:
                                bicubic_interpolation(ibuf1,out, xs,ys,xi,yi);
+                               break;
+                       }
                }
        }       
 
index cb31c3f29688f21486e7ee524c36b6a4e8215a94..4267159baee6983e8444542ade0830d10e7905df 100644 (file)
@@ -1247,18 +1247,19 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                if( uiDoBlocks(&curarea->uiblocks, event, 1)!=UI_NOTHING ) event= 0;
                
                if(event==UI_BUT_EVENT) do_butspace(val); /* temporal, view3d deserves own queue? */
-               
+
+#ifndef DISABLE_PYTHON
+                       /* run any view3d event handler script links */
+               if(sa->scriptlink.totscript) {
+                       if(BPY_do_spacehandlers(sa, event, val, SPACEHANDLER_VIEW3D_EVENT))
+                               return; /* return if event was processed (swallowed) by handler(s) */
+               }
+#endif
+
                /* - we consider manipulator a button, defaulting to leftmouse 
                 * - grease-pencil also defaults to leftmouse
                 */
                if(event==LEFTMOUSE) {
-#ifndef DISABLE_PYTHON
-                       /* run any view3d event handler script links */
-                       if (sa->scriptlink.totscript) {
-                               if (BPY_do_spacehandlers(sa, event, val, SPACEHANDLER_VIEW3D_EVENT))
-                                       return; /* return if event was processed (swallowed) by handler(s) */
-                       }
-#endif
                        if(gpencil_do_paint(sa, L_MOUSE)) return;
                        if(BIF_do_manipulator(sa)) return;
                }
@@ -2963,7 +2964,17 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                        }
                }
        }
-       
+
+#ifndef DISABLE_PYTHON
+       else { /* val= 0 */
+               /* run any view3d release event handler script links */
+               if(sa->scriptlink.totscript) {
+                       if(BPY_do_spacehandlers(sa, event, 0, SPACEHANDLER_VIEW3D_EVENT_ALL))
+                               return; /* return if event was processed (swallowed) by handler(s) */
+               }
+       }
+#endif
+
        if(doredraw) {
                scrarea_queue_winredraw(curarea);
                scrarea_queue_headredraw(curarea);
index 7a13943d0e01e908979f5aa5d844d94e7e8e17d9..a1abc5ea6bb550219474ba4a46dffbbaa226037f 100644 (file)
@@ -737,6 +737,7 @@ static void transformEvent(unsigned short event, short val) {
                case GKEY:
                        /* only switch when... */
                        if( ELEM3(Trans.mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL) ) { 
+                               resetTransRestrictions(&Trans); 
                                restoreTransObjects(&Trans);
                                initTranslation(&Trans);
                                Trans.redraw = 1;
@@ -745,6 +746,7 @@ static void transformEvent(unsigned short event, short val) {
                case SKEY:
                        /* only switch when... */
                        if( ELEM3(Trans.mode, TFM_ROTATION, TFM_TRANSLATION, TFM_TRACKBALL) ) { 
+                               resetTransRestrictions(&Trans); 
                                restoreTransObjects(&Trans);
                                initResize(&Trans);
                                Trans.redraw = 1;
@@ -752,7 +754,9 @@ static void transformEvent(unsigned short event, short val) {
                        break;
                case RKEY:
                        /* only switch when... */
-                       if( ELEM4(Trans.mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) { 
+                       if( ELEM4(Trans.mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
+                               
+                               resetTransRestrictions(&Trans); 
                                
                                if (Trans.mode == TFM_ROTATION) {
                                        restoreTransObjects(&Trans);
index 796b013cb886627d144af2b8ea703d94e6684385..438066fcfe2a010796b2f3240e32d2eb69e5ec6c 100644 (file)
@@ -685,6 +685,8 @@ void BIF_drawConstraint(void)
                return;
        if (t->flag & T_USES_MANIPULATOR)
                return;
+       if (t->flag & T_NO_CONSTRAINT)
+               return;
        
        /* nasty exception for Z constraint in camera view */
        if((t->flag & T_OBJECT) && G.vd->camera==OBACT && G.vd->persp==V3D_CAMOB) 
index 229889d15ffd2fd1c07b8becbe2f5e61905ccfa9..f2e90818f9def67b6a72a04062e854b6182059b3 100644 (file)
@@ -649,6 +649,11 @@ void drawLine(float *center, float *dir, char axis, short options)
        myloadmatrix(G.vd->viewmat);
 }
 
+void resetTransRestrictions(TransInfo *t)
+{
+       t->flag &= ~T_ALL_RESTRICTIONS;
+}
+
 void initTrans (TransInfo *t)
 {
        
index 872a5f4d4971d2e0da6f857a47c4a39fe3fc1110..a611121059311472358b5618f614858981faf248 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
+
+/* for setuid / getuid */
+#ifdef __sgi
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
 /* This little block needed for linking to Blender... */
 
 #include "MEM_guardedalloc.h"
@@ -201,7 +208,7 @@ static void print_help(void)
        printf ("    -t <threads>\tUse amount of <threads> for rendering (background mode only).\n");
        printf ("      [1-8], 0 for systems processor count.\n");
        printf ("\nAnimation playback options:\n");
-       printf ("  -a <file(s)>\tPlayback <file(s)>, only operates this way when -b is not used.\n");
+       printf ("  -a <options> <file(s)>\tPlayback <file(s)>, only operates this way when -b is not used.\n");
        printf ("    -p <sx> <sy>\tOpen with lower left corner at <sx>, <sy>\n");
        printf ("    -m\t\tRead from disk (Don't buffer)\n");
        printf ("    -f <fps> <fps-base>\t\tSpecify FPS to start with\n");
index 4b9a2a3af17958b61f9387e5ebb2206ce81b269f..c2f19ae1d8a61c15ce612517646b1d2deed74b8b 100644 (file)
@@ -35,6 +35,7 @@ include nan_compile.mk
 
 CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
 
+CPPFLAGS += -I$(NAN_GLEW)/include
 CPPFLAGS += -I$(NAN_SUMO)/include -I$(NAN_SOLID)/include
 CPPFLAGS += -I$(NAN_SOLID)
 CPPFLAGS += -I$(NAN_STRING)/include    
index a2bdb7225a0050775f083ac6ff071de596d0d531..3d44a41afee09931115d7bde2cf938d8ac5ce413 100644 (file)
@@ -35,6 +35,7 @@ include nan_compile.mk
 
 CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
 
+CPPFLAGS += -I$(NAN_GLEW)/include
 CPPFLAGS += -I$(OPENGL_HEADERS)
 CPPFLAGS += -I$(NAN_STRING)/include    
 
index bf838e60210744078c07bbdf60092e77a45b74f6..3a20bbfbb11393f589fd301744df41cbd085609f 100644 (file)
@@ -185,7 +185,8 @@ void        KX_BulletPhysicsController::SuspendDynamics(bool ghost)
                m_savedMass = GetMass();
                m_savedCollisionFilterGroup = handle->m_collisionFilterGroup;
                m_savedCollisionFilterMask = handle->m_collisionFilterMask;
-               body->setActivationState(DISABLE_SIMULATION);
+               m_savedActivationState = body->getActivationState();
+               body->forceActivationState(DISABLE_SIMULATION);
                GetPhysicsEnvironment()->updateCcdPhysicsController(this, 
                        0.0,
                        btCollisionObject::CF_STATIC_OBJECT|((ghost)?btCollisionObject::CF_NO_CONTACT_RESPONSE:(m_savedCollisionFlags&btCollisionObject::CF_NO_CONTACT_RESPONSE)),
@@ -204,7 +205,7 @@ void        KX_BulletPhysicsController::RestoreDynamics()
                        m_savedCollisionFlags,
                        m_savedCollisionFilterGroup,
                        m_savedCollisionFilterMask);
-               GetRigidBody()->forceActivationState(ACTIVE_TAG);
+               GetRigidBody()->forceActivationState(m_savedActivationState);
        }
 }
 
index cdcb82c87caf27dc658af5c0406f8f4481afcada..d5fca4ec6d30ea26ddcb83358063d39de4a50322 100644 (file)
@@ -9,6 +9,7 @@ class KX_BulletPhysicsController : public KX_IPhysicsController ,public CcdPhysi
 {
 private:
        int m_savedCollisionFlags;
+       int m_savedActivationState;
        short int m_savedCollisionFilterGroup;
        short int m_savedCollisionFilterMask;
        MT_Scalar m_savedMass;
index 53b3e348a36e3b6fbfddfe3e303e033e6457c467..fb91c793765f6976768c48c4d5d9b508a422ff1a 100644 (file)
@@ -259,10 +259,75 @@ void KX_Camera::ExtractFrustumSphere()
        if (m_set_frustum_center)
                return;
 
-       // The most extreme points on the near and far plane. (normalized device coords)
-       MT_Vector4 hnear(1., 1., 0., 1.), hfar(1., 1., 1., 1.);
+    // compute sphere for the general case and not only symmetric frustum:
+    // the mirror code in ImageRender can use very asymmetric frustum.
+    // We will put the sphere center on the line that goes from origin to the center of the far clipping plane
+    // This is the optimal position if the frustum is symmetric or very asymmetric and probably close
+    // to optimal for the general case. The sphere center position is computed so that the distance to 
+    // the near and far extreme frustum points are equal.
+
+    // get the transformation matrix from device coordinate to camera coordinate
        MT_Matrix4x4 clip_camcs_matrix = m_projection_matrix;
        clip_camcs_matrix.invert();
+
+    // detect which of the corner of the far clipping plane is the farthest to the origin
+       MT_Vector4 nfar;    // far point in device normalized coordinate
+    MT_Point3 farpoint; // most extreme far point in camera coordinate
+    MT_Point3 nearpoint;// most extreme near point in camera coordinate
+    MT_Point3 farcenter(0.,0.,0.);// center of far cliping plane in camera coordinate
+    MT_Scalar F=1.0, N; // square distance of far and near point to origin
+    MT_Scalar f, n;     // distance of far and near point to z axis. f is always > 0 but n can be < 0
+    MT_Scalar e, s;     // far and near clipping distance (<0)
+    MT_Scalar c;        // slope of center line = distance of far clipping center to z axis / far clipping distance
+    MT_Scalar z;        // projection of sphere center on z axis (<0)
+    // tmp value
+    MT_Vector4 npoint(1., 1., 1., 1.);
+    MT_Vector4 hpoint;
+    MT_Point3 point;
+    MT_Scalar len;
+    for (int i=0; i<4; i++)
+    {
+       hpoint = clip_camcs_matrix*npoint;
+        point.setValue(hpoint[0]/hpoint[3], hpoint[1]/hpoint[3], hpoint[2]/hpoint[3]);
+        len = point.dot(point);
+        if (len > F)
+        {
+            nfar = npoint;
+            farpoint = point;
+            F = len;
+        }
+        // rotate by 90 degree along the z axis to walk through the 4 extreme points of the far clipping plane
+        len = npoint[0];
+        npoint[0] = -npoint[1];
+        npoint[1] = len;
+        farcenter += point;
+    }
+    // the far center is the average of the far clipping points
+    farcenter *= 0.25;
+    // the extreme near point is the opposite point on the near clipping plane
+    nfar.setValue(-nfar[0], -nfar[1], -1., 1.);
+       nfar = clip_camcs_matrix*nfar;
+    nearpoint.setValue(nfar[0]/nfar[3], nfar[1]/nfar[3], nfar[2]/nfar[3]);
+    N = nearpoint.dot(nearpoint);
+    e = farpoint[2];
+    s = nearpoint[2];
+    // projection on XY plane for distance to axis computation
+    MT_Point2 farxy(farpoint[0], farpoint[1]);
+    // f is forced positive by construction
+    f = farxy.length();
+    // get corresponding point on the near plane
+    farxy *= s/e;
+    // this formula preserve the sign of n
+    n = f*s/e - MT_Point2(nearpoint[0]-farxy[0], nearpoint[1]-farxy[1]).length();
+    c = MT_Point2(farcenter[0], farcenter[1]).length()/e;
+    // the big formula, it simplifies to (F-N)/(2(e-s)) for the symmetric case
+    z = (F-N)/(2.0*(e-s+c*(f-n)));
+       m_frustum_center = MT_Point3(farcenter[0]*z/e, farcenter[1]*z/e, z);
+       m_frustum_radius = m_frustum_center.distance(farpoint);
+
+#if 0
+       // The most extreme points on the near and far plane. (normalized device coords)
+       MT_Vector4 hnear(1., 1., 0., 1.), hfar(1., 1., 1., 1.);
        
        // Transform to hom camera local space
        hnear = clip_camcs_matrix*hnear;
@@ -273,10 +338,12 @@ void KX_Camera::ExtractFrustumSphere()
        MT_Point3 farpoint(hfar[0]/hfar[3], hfar[1]/hfar[3], hfar[2]/hfar[3]);
        
        // Compute center
+    // don't use camera data in case the user specifies the matrix directly
        m_frustum_center = MT_Point3(0., 0.,
-               (nearpoint.dot(nearpoint) - farpoint.dot(farpoint))/(2.0*(m_camdata.m_clipend - m_camdata.m_clipstart)));
+               (nearpoint.dot(nearpoint) - farpoint.dot(farpoint))/(2.0*(nearpoint[2]-farpoint[2] /*m_camdata.m_clipend - m_camdata.m_clipstart*/)));
        m_frustum_radius = m_frustum_center.distance(farpoint);
-       
+#endif
+
        // Transform to world space.
        m_frustum_center = GetCameraToWorld()(m_frustum_center);
        m_frustum_radius /= fabs(NodeGetWorldScaling()[NodeGetWorldScaling().closestAxis()]);
index a168beb9a707a94119b9033430d4bfe23dcbf68d..e4a37b589a89d41771c8dbbd7b6098c1d19a3213 100644 (file)
@@ -615,6 +615,7 @@ void KX_GameObject::setAngularVelocity(const MT_Vector3& ang_vel,bool local)
                m_pPhysicsController1->SetAngularVelocity(ang_vel,local);
 }
 
+
 void KX_GameObject::ResolveCombinedVelocities(
        const MT_Vector3 & lin_vel,
        const MT_Vector3 & ang_vel,
@@ -969,6 +970,10 @@ PyMethodDef KX_GameObject::Methods[] = {
        {"getPosition", (PyCFunction) KX_GameObject::sPyGetPosition, METH_NOARGS},
        {"setPosition", (PyCFunction) KX_GameObject::sPySetPosition, METH_O},
        {"setWorldPosition", (PyCFunction) KX_GameObject::sPySetWorldPosition, METH_O},
+       {"applyForce", (PyCFunction)    KX_GameObject::sPyApplyForce, METH_VARARGS},
+       {"applyTorque", (PyCFunction)   KX_GameObject::sPyApplyTorque, METH_VARARGS},
+       {"applyRotation", (PyCFunction) KX_GameObject::sPyApplyRotation, METH_VARARGS},
+       {"applyMovement", (PyCFunction) KX_GameObject::sPyApplyMovement, METH_VARARGS},
        {"getLinearVelocity", (PyCFunction) KX_GameObject::sPyGetLinearVelocity, METH_VARARGS},
        {"setLinearVelocity", (PyCFunction) KX_GameObject::sPySetLinearVelocity, METH_VARARGS},
        {"getAngularVelocity", (PyCFunction) KX_GameObject::sPyGetAngularVelocity, METH_VARARGS},
@@ -1261,6 +1266,65 @@ int KX_GameObject::_setattr(const STR_String& attr, PyObject *value)     // _setattr
        return SCA_IObject::_setattr(attr, value);
 }
 
+PyObject* KX_GameObject::PyApplyForce(PyObject* self, PyObject* args)
+{
+       int local = 0;
+       PyObject* pyvect;
+
+       if (PyArg_ParseTuple(args, "O|i", &pyvect, &local)) {
+               MT_Vector3 force;
+               if (PyVecTo(pyvect, force)) {
+                       ApplyForce(force, (local!=0));
+                       Py_RETURN_NONE;
+               }
+       }
+       return NULL;
+}
+
+PyObject* KX_GameObject::PyApplyTorque(PyObject* self, PyObject* args)
+{
+       int local = 0;
+       PyObject* pyvect;
+
+       if (PyArg_ParseTuple(args, "O|i", &pyvect, &local)) {
+               MT_Vector3 torque;
+               if (PyVecTo(pyvect, torque)) {
+                       ApplyTorque(torque, (local!=0));
+                       Py_RETURN_NONE;
+               }
+       }
+       return NULL;
+}
+
+PyObject* KX_GameObject::PyApplyRotation(PyObject* self, PyObject* args)
+{
+       int local = 0;
+       PyObject* pyvect;
+
+       if (PyArg_ParseTuple(args, "O|i", &pyvect, &local)) {
+               MT_Vector3 rotation;
+               if (PyVecTo(pyvect, rotation)) {
+                       ApplyRotation(rotation, (local!=0));
+                       Py_RETURN_NONE;
+               }
+       }
+       return NULL;
+}
+
+PyObject* KX_GameObject::PyApplyMovement(PyObject* self, PyObject* args)
+{
+       int local = 0;
+       PyObject* pyvect;
+
+       if (PyArg_ParseTuple(args, "O|i", &pyvect, &local)) {
+               MT_Vector3 movement;
+               if (PyVecTo(pyvect, movement)) {
+                       ApplyMovement(movement, (local!=0));
+                       Py_RETURN_NONE;
+               }
+       }
+       return NULL;
+}
 
 PyObject* KX_GameObject::PyGetLinearVelocity(PyObject* self, PyObject* args)
 {
index 20b15787d27732da0332221c3b53c7f87127d749..4f26031356f6fbca3823c7ab982c52a3877578ea 100644 (file)
@@ -772,6 +772,10 @@ public:
        KX_PYMETHOD_NOARGS(KX_GameObject,GetPosition);
        KX_PYMETHOD_O(KX_GameObject,SetPosition);
        KX_PYMETHOD_O(KX_GameObject,SetWorldPosition);
+       KX_PYMETHOD_VARARGS(KX_GameObject, ApplyForce);
+       KX_PYMETHOD_VARARGS(KX_GameObject, ApplyTorque);
+       KX_PYMETHOD_VARARGS(KX_GameObject, ApplyRotation);
+       KX_PYMETHOD_VARARGS(KX_GameObject, ApplyMovement);
        KX_PYMETHOD_VARARGS(KX_GameObject,GetLinearVelocity);
        KX_PYMETHOD_VARARGS(KX_GameObject,SetLinearVelocity);
        KX_PYMETHOD_VARARGS(KX_GameObject,GetAngularVelocity);
index 4184202c51860265055a9840cf29224624a1e8ee..8516049f6d86c11df33db936cd61831e137c7589 100644 (file)
@@ -184,7 +184,6 @@ private:
        void                                    RenderDebugProperties();
        void                                    RenderShadowBuffers(KX_Scene *scene);
        void                                    SetBackGround(KX_WorldInfo* worldinfo);
-       void                                    SetWorldSettings(KX_WorldInfo* worldinfo);
        void                                    DoSound(KX_Scene* scene);
 
 public:
@@ -193,6 +192,7 @@ public:
        virtual ~KX_KetsjiEngine();
 
        // set the devices and stuff. the client must take care of creating these
+       void                    SetWorldSettings(KX_WorldInfo* worldinfo);
        void                    SetKeyboardDevice(SCA_IInputDevice* keyboarddevice);
        void                    SetMouseDevice(SCA_IInputDevice* mousedevice);
        void                    SetNetworkDevice(NG_NetworkDeviceInterface* networkdevice);
@@ -205,6 +205,8 @@ public:
        void                    SetGame2IpoMode(bool game2ipo,int startFrame);
 
        RAS_IRasterizer*                GetRasterizer(){return m_rasterizer;};
+       RAS_ICanvas*                GetCanvas(){return m_canvas;};
+       RAS_IRenderTools*           GetRenderTools(){return m_rendertools;};
 
        ///returns true if an update happened to indicate -> Render
        bool                    NextFrame();
index caa71441b1dc95a0346e0eba3fcbdfd075d88167..476a931355fdc2fd72e1c6c8601b507c1e22aabe 100644 (file)
@@ -1249,7 +1249,7 @@ void KX_Scene::MarkVisible(RAS_IRasterizer* rasty, KX_GameObject* gameobj,KX_Cam
        // If the camera is inside this node, then the object is visible.
        if (!vis)
        {
-               vis = gameobj->GetSGNode()->inside( GetActiveCamera()->GetCameraLocation() );
+               vis = gameobj->GetSGNode()->inside( cam->GetCameraLocation() );
        }
                
        // Test the object's bound sphere against the view frustum.
index 505ce253dd1ee2b36f14f58b4680557c6893afa4..efeffab2eedf3a7c24cf0333abfdda1b1f4b7b74 100644 (file)
@@ -123,6 +123,50 @@ class KX_GameObject:
                @return: The game object's rotation matrix
                @note: When using this matrix with Blender.Mathutils.Matrix() types, it will need to be transposed.
                """
+       def applyMovement(movement, local = 0):
+               """
+               Sets the game object's movement.
+               
+               @type movement: 3d vector.
+               @param movement: movement vector.
+               @type local: boolean
+               @param local: - False: you get the "global" movement ie: relative to world orientation (default).
+                             - True: you get the "local" movement ie: relative to object orientation.
+               """     
+       def applyRotation(movement, local = 0):
+               """
+               Sets the game object's rotation.
+               
+               @type rotation: 3d vector.
+               @param rotation: rotation vector.
+               @type local: boolean
+               @param local: - False: you get the "global" rotation ie: relative to world orientation (default).
+                                         - True: you get the "local" rotation ie: relative to object orientation.
+               """     
+       def applyForce(force, local = 0):
+               """
+               Sets the game object's force.
+               
+               This requires a dynamic object.
+               
+               @type force: 3d vector.
+               @param force: force vector.
+               @type local: boolean
+               @param local: - False: you get the "global" force ie: relative to world orientation (default).
+                                         - True: you get the "local" force ie: relative to object orientation.
+               """     
+       def applyTorque(torque, local = 0):
+               """
+               Sets the game object's torque.
+               
+               This requires a dynamic object.
+               
+               @type torque: 3d vector.
+               @param torque: torque vector.
+               @type local: boolean
+               @param local: - False: you get the "global" torque ie: relative to world orientation (default).
+                                         - True: you get the "local" torque ie: relative to object orientation.
+               """
        def getLinearVelocity(local = 0):
                """
                Gets the game object's linear velocity.
@@ -143,6 +187,8 @@ class KX_GameObject:
                This method sets game object's velocity through it's centre of mass,
                ie no angular velocity component.
                
+               This requires a dynamic object.
+               
                @type velocity: 3d vector.
                @param velocity: linear velocity vector.
                @type local: boolean
@@ -163,6 +209,8 @@ class KX_GameObject:
                """
                Sets the game object's angular velocity.
                
+               This requires a dynamic object.
+               
                @type velocity: 3d vector.
                @param velocity: angular velocity vector.
                @type local: boolean
index 9cb59f300f7487e8f1bf7256001b5aeb94ae0e23..610bd13ff122a19f80da379689987e736a3069de 100644 (file)
@@ -212,9 +212,6 @@ public :
                RAS_FrameFrustum &frustum
        );
 
-
-private :
-
        static
                void
        ComputeDefaultFrustum(
@@ -225,6 +222,8 @@ private :
                RAS_FrameFrustum & frustum
        );      
 
+private :
+
        static
                void
        ComputeBestFitViewRect(
index 411b28fa3b7c21ae691f5c8bcee73986657025b7..b4b90c3608b969d5b6f2bf64fd35aba70721f9d7 100644 (file)
@@ -200,6 +200,7 @@ public:
         * @return true if stereo mode is enabled.
         */
        virtual bool    Stereo()=0;
+    virtual StereoMode GetStereoMode()=0;
        virtual bool    InterlacedStereo()=0;
        /**
         * Sets which eye buffer subsequent primitives will be rendered to.
index 87a0a1d8b9ebf9cc0e7e8801440d22485d953174..3cad5fe74f2681fed096a612107cd1eaf820034e 100644 (file)
@@ -406,14 +406,16 @@ void RAS_OpenGLRasterizer::SetRenderArea()
                        break;
        }
 }
-
        
 void RAS_OpenGLRasterizer::SetStereoMode(const StereoMode stereomode)
 {
        m_stereomode = stereomode;
 }
 
-
+RAS_IRasterizer::StereoMode RAS_OpenGLRasterizer::GetStereoMode()
+{
+       return m_stereomode;
+}
 
 bool RAS_OpenGLRasterizer::Stereo()
 {
@@ -775,7 +777,7 @@ MT_Matrix4x4 RAS_OpenGLRasterizer::GetFrustumMatrix(
        float frustnear,
        float frustfar,
        float focallength,
-       bool
+       bool 
 ){
        MT_Matrix4x4 result;
        double mat[16];
index 0717cce0ce846861f1df5f4bdf57e081f6ce52ec..d39fd642f86093c422bc30eb2415ce7638a05f7c 100644 (file)
@@ -137,6 +137,7 @@ public:
        virtual void    SetRenderArea();
 
        virtual void    SetStereoMode(const StereoMode stereomode);
+    virtual RAS_IRasterizer::StereoMode GetStereoMode();
        virtual bool    Stereo();
        virtual bool    InterlacedStereo();
        virtual void    SetEye(const StereoEye eye);
index 3f939de6bc292bbf112321dfab05f9374843cb02..8704d49f2a7eb9079e009fdca927376e8dcac841 100644 (file)
@@ -204,6 +204,12 @@ void registerAllExceptions(void)
     ImageSizesNotMatchDesc.registerDesc();
     SceneInvalidDesc.registerDesc();
     CameraInvalidDesc.registerDesc();
+    ObserverInvalidDesc.registerDesc();
+    MirrorInvalidDesc.registerDesc();
+    MirrorSizeInvalidDesc.registerDesc();
+    MirrorNormalInvalidDesc.registerDesc();
+    MirrorHorizontalDesc.registerDesc();
+    MirrorTooSmallDesc.registerDesc();
     SourceVideoEmptyDesc.registerDesc();
     SourceVideoCreationDesc.registerDesc();
 }
index 5345e87f199663f1679563c5566e2650f9ff3859..1a3c25071b1a013c6cbb111a539a02b26dca41d9 100644 (file)
@@ -202,6 +202,12 @@ extern ExpDesc MaterialNotAvailDesc;
 extern ExpDesc ImageSizesNotMatchDesc;
 extern ExpDesc SceneInvalidDesc;
 extern ExpDesc CameraInvalidDesc;
+extern ExpDesc ObserverInvalidDesc;
+extern ExpDesc MirrorInvalidDesc;
+extern ExpDesc MirrorSizeInvalidDesc;
+extern ExpDesc MirrorNormalInvalidDesc;
+extern ExpDesc MirrorHorizontalDesc;
+extern ExpDesc MirrorTooSmallDesc;
 extern ExpDesc SourceVideoEmptyDesc;
 extern ExpDesc SourceVideoCreationDesc;
 
index a8f7871fa21818f92904671d8677101c1e536e8b..1bf970babf0440f914054dfe4179c8075fd356b5 100644 (file)
@@ -24,96 +24,238 @@ http://www.gnu.org/copyleft/lesser.txt.
 
 #include <PyObjectPlus.h>
 #include <structmember.h>
+#include <float.h>
+#include <math.h>
 
-#include <KX_BlenderCanvas.h>
-#include <KX_BlenderRenderTools.h>
-#include <RAS_IRasterizer.h>
-#include <RAS_OpenGLRasterizer.h>
-#include <KX_WorldInfo.h>
-#include <KX_Light.h>
 
-#include "ImageRender.h"
+#include <BIF_gl.h>
+
+#include "KX_PythonInit.h"
+#include "DNA_scene_types.h"
+#include "RAS_CameraData.h"
+#include "RAS_MeshObject.h"
+#include "BLI_arithb.h"
 
+#include "ImageRender.h"
 #include "ImageBase.h"
 #include "BlendType.h"
 #include "Exception.h"
+#include "Texture.h"
 
-ExceptionID SceneInvalid, CameraInvalid;
+ExceptionID SceneInvalid, CameraInvalid, ObserverInvalid;
+ExceptionID MirrorInvalid, MirrorSizeInvalid, MirrorNormalInvalid, MirrorHorizontal, MirrorTooSmall;
 ExpDesc SceneInvalidDesc (SceneInvalid, "Scene object is invalid");
 ExpDesc CameraInvalidDesc (CameraInvalid, "Camera object is invalid");
-
-#if 0   // not yet supported
+ExpDesc ObserverInvalidDesc (ObserverInvalid, "Observer object is invalid");
+ExpDesc MirrorInvalidDesc (MirrorInvalid, "Mirror object is invalid");
+ExpDesc MirrorSizeInvalidDesc (MirrorSizeInvalid, "Mirror has no vertex or no size");
+ExpDesc MirrorNormalInvalidDesc (MirrorNormalInvalid, "Cannot determine mirror plane");
+ExpDesc MirrorHorizontalDesc (MirrorHorizontal, "Mirror is horizontal in local space");
+ExpDesc MirrorTooSmallDesc (MirrorTooSmall, "Mirror is too small");
 
 // constructor
-ImageRender::ImageRender (KX_Scene * scene, KX_Camera * camera) : m_scene(scene),
-m_camera(camera)
+ImageRender::ImageRender (KX_Scene * scene, KX_Camera * camera) : 
+    ImageViewport(),
+    m_render(true),
+    m_scene(scene),
+    m_camera(camera),
+    m_owncamera(false),
+    m_observer(NULL),
+    m_mirror(NULL),
+       m_clip(100.f)
 {
-       // create screen area
-       m_area.winrct.xmin = m_upLeft[0];
-       m_area.winrct.ymin = m_upLeft[1];
-       m_area.winx = m_size[0];
-       m_area.winy = m_size[1];
-       // create canvas
-       m_canvas = new KX_BlenderCanvas(&m_area);
-       // create render tools
-       m_rendertools = new KX_BlenderRenderTools();
-       // create rasterizer
-       m_rasterizer = new RAS_OpenGLRasterizer(m_canvas);
-       m_rasterizer->Init();
        // initialize background colour
-       setBackground(0, 0, 255);
-       // refresh lights
-       refreshLights();
+       setBackground(0, 0, 255, 255);
+    // retrieve rendering objects
+    m_engine = KX_GetActiveEngine();
+    m_rasterizer = m_engine->GetRasterizer();
+    m_canvas = m_engine->GetCanvas();
+    m_rendertools = m_engine->GetRenderTools();
 }
 
 // destructor
 ImageRender::~ImageRender (void)
 {
-       // release allocated objects
-       delete m_rasterizer;
-       delete m_rendertools;
-       delete m_canvas;
+    if (m_owncamera)
+        m_camera->Release();
 }
 
 
 // set background color
-void ImageRender::setBackground (unsigned char red, unsigned char green, unsigned char blue)
+void ImageRender::setBackground (int red, int green, int blue, int alpha)
 {
-       m_background[0] = red;
-       m_background[1] = green;
-       m_background[2] = blue;
-       m_rasterizer->SetBackColor(m_background[0], m_background[1], m_background[2], 1.0);
+    m_background[0] = (red < 0) ? 0.f : (red > 255) ? 1.f : float(red)/255.f;
+       m_background[1] = (green < 0) ? 0.f : (green > 255) ? 1.f : float(green)/255.f;
+       m_background[2] = (blue < 0) ? 0.f : (blue > 255) ? 1.f : float(blue)/255.f;
+       m_background[3] = (alpha < 0) ? 0.f : (alpha > 255) ? 1.f : float(alpha)/255.f;
 }
 
 
 // capture image from viewport
 void ImageRender::calcImage (unsigned int texId)
 {
-       // setup camera
-       bool cameraPasive = !m_camera->GetViewport();
-       // render scene
-       Render();
-       // reset camera
-       if (cameraPasive) m_camera->EnableViewport(false);
+    if (m_rasterizer->GetDrawingMode() != RAS_IRasterizer::KX_TEXTURED ||   // no need for texture
+        m_camera->GetViewport() ||        // camera must be inactive
+        m_camera == m_scene->GetActiveCamera())
+    {
+        // no need to compute texture in non texture rendering
+        m_avail = false;
+        return;
+    }
+    // render the scene from the camera
+    Render();
        // get image from viewport
        ImageViewport::calcImage(texId);
+    // restore OpenGL state
+    m_canvas->EndFrame();
 }
 
 void ImageRender::Render()
 {
-    //
-}
+       RAS_FrameFrustum frustrum;
+
+    if (!m_render)
+        return;
+
+    if (m_mirror)
+    {
+        // mirror mode, compute camera frustrum, position and orientation
+        // convert mirror position and normal in world space
+        const MT_Matrix3x3 & mirrorObjWorldOri = m_mirror->GetSGNode()->GetWorldOrientation();
+        const MT_Point3 & mirrorObjWorldPos = m_mirror->GetSGNode()->GetWorldPosition();
+        const MT_Vector3 & mirrorObjWorldScale = m_mirror->GetSGNode()->GetWorldScaling();
+        MT_Point3 mirrorWorldPos = 
+            mirrorObjWorldPos + mirrorObjWorldScale * (mirrorObjWorldOri * m_mirrorPos);
+        MT_Vector3 mirrorWorldZ = mirrorObjWorldOri * m_mirrorZ;
+        // get observer world position
+        const MT_Point3 & observerWorldPos = m_observer->GetSGNode()->GetWorldPosition();
+        // get plane D term = mirrorPos . normal
+        MT_Scalar mirrorPlaneDTerm = mirrorWorldPos.dot(mirrorWorldZ);
+        // compute distance of observer to mirror = D - observerPos . normal
+        MT_Scalar observerDistance = mirrorPlaneDTerm - observerWorldPos.dot(mirrorWorldZ);
+        // if distance < 0.01 => observer is on wrong side of mirror, don't render
+        if (observerDistance < 0.01f)
+            return;
+        // set camera world position = observerPos + normal * 2 * distance
+        MT_Point3 cameraWorldPos = observerWorldPos + (MT_Scalar(2.0)*observerDistance)*mirrorWorldZ;
+        m_camera->GetSGNode()->SetLocalPosition(cameraWorldPos);
+        // set camera orientation: z=normal, y=mirror_up in world space, x= y x z
+        MT_Vector3 mirrorWorldY = mirrorObjWorldOri * m_mirrorY;
+        MT_Vector3 mirrorWorldX = mirrorObjWorldOri * m_mirrorX;
+        MT_Matrix3x3 cameraWorldOri(
+            mirrorWorldX[0], mirrorWorldY[0], mirrorWorldZ[0],
+            mirrorWorldX[1], mirrorWorldY[1], mirrorWorldZ[1], 
+            mirrorWorldX[2], mirrorWorldY[2], mirrorWorldZ[2]);
+        m_camera->GetSGNode()->SetLocalOrientation(cameraWorldOri);
+        m_camera->GetSGNode()->UpdateWorldData(0.0);
+        // compute camera frustrum:
+        //   get position of mirror relative to camera: offset = mirrorPos-cameraPos
+        MT_Vector3 mirrorOffset = mirrorWorldPos - cameraWorldPos;
+        //   convert to camera orientation
+        mirrorOffset = mirrorOffset * cameraWorldOri;
+        //   scale mirror size to world scale: 
+        //     get closest local axis for mirror Y and X axis and scale height and width by local axis scale
+        MT_Scalar x, y;
+        x = fabs(m_mirrorY[0]);
+        y = fabs(m_mirrorY[1]);
+        float height = (x > y) ? 
+            ((x > fabs(m_mirrorY[2])) ? mirrorObjWorldScale[0] : mirrorObjWorldScale[2]):
+            ((y > fabs(m_mirrorY[2])) ? mirrorObjWorldScale[1] : mirrorObjWorldScale[2]);
+        x = fabs(m_mirrorX[0]);
+        y = fabs(m_mirrorX[1]);
+        float width = (x > y) ? 
+            ((x > fabs(m_mirrorX[2])) ? mirrorObjWorldScale[0] : mirrorObjWorldScale[2]):
+            ((y > fabs(m_mirrorX[2])) ? mirrorObjWorldScale[1] : mirrorObjWorldScale[2]);
+        width *= m_mirrorHalfWidth;
+        height *= m_mirrorHalfHeight;
+        //   left = offsetx-width
+        //   right = offsetx+width
+        //   top = offsety+height
+        //   bottom = offsety-height
+        //   near = -offsetz
+        //   far = near+100
+        frustrum.x1 = mirrorOffset[0]-width;
+        frustrum.x2 = mirrorOffset[0]+width;
+        frustrum.y1 = mirrorOffset[1]-height;
+        frustrum.y2 = mirrorOffset[1]+height;
+        frustrum.camnear = -mirrorOffset[2];
+        frustrum.camfar = -mirrorOffset[2]+m_clip;
+    }
+    const float ortho = 100.0;
+    const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
+
+    // The screen area that ImageViewport will copy is also the rendering zone
+    m_canvas->SetViewPort(m_position[0], m_position[1], m_position[0]+m_capSize[0]-1, m_position[1]+m_capSize[1]-1);
+    m_canvas->ClearColor(m_background[0], m_background[1], m_background[2], m_background[3]);
+    m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
+    m_rasterizer->BeginFrame(RAS_IRasterizer::KX_TEXTURED,m_engine->GetClockTime());
+    m_rendertools->BeginFrame(m_rasterizer);
+    m_engine->SetWorldSettings(m_scene->GetWorldInfo());
+    m_rendertools->SetAuxilaryClientInfo(m_scene);
+    m_rasterizer->DisplayFog();
+    // matrix calculation, don't apply any of the stereo mode
+    m_rasterizer->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO);
+    if (m_mirror)
+    {
+        // frustrum was computed above
+        // get frustrum matrix and set projection matrix
+               MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
+                       frustrum.x1, frustrum.x2, frustrum.y1, frustrum.y2, frustrum.camnear, frustrum.camfar);
+
+               m_camera->SetProjectionMatrix(projmat);
+    } else if (m_camera->hasValidProjectionMatrix())
+       {
+               m_rasterizer->SetProjectionMatrix(m_camera->GetProjectionMatrix());
+    } else 
+    {
+               float lens = m_camera->GetLens();
+               bool orthographic = !m_camera->GetCameraData()->m_perspective;
+               float nearfrust = m_camera->GetCameraNear();
+               float farfrust = m_camera->GetCameraFar();
+        float aspect_ratio = 1.0f;
+        Scene *blenderScene = m_scene->GetBlenderScene();
+
+        if (orthographic) {
+                       lens *= ortho;
+                       nearfrust = (nearfrust + 1.0)*ortho;
+                       farfrust *= ortho;
+               }
+               // compute the aspect ratio from frame blender scene settings so that render to texture
+        // works the same in Blender and in Blender player
+        if (blenderScene->r.ysch != 0)
+            aspect_ratio = float(blenderScene->r.xsch) / float(blenderScene->r.ysch);
+
+        RAS_FramingManager::ComputeDefaultFrustum(
+            nearfrust,
+            farfrust,
+            lens,
+            aspect_ratio,
+            frustrum);
+               
+               MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
+                       frustrum.x1, frustrum.x2, frustrum.y1, frustrum.y2, frustrum.camnear, frustrum.camfar);
+
+               m_camera->SetProjectionMatrix(projmat);
+       }
 
-// refresh lights
-void ImageRender::refreshLights (void)
-{
-       // clear lights list
-       //m_rendertools->RemoveAllLights();
-       // set lights
-       //for (int idx = 0; idx < scene->GetLightList()->GetCount(); ++idx)
-       //  m_rendertools->AddLight(((KX_LightObject*)(scene->GetLightList()->GetValue(idx)))->GetLightData());
-}
+       MT_Transform camtrans(m_camera->GetWorldToCamera());
+       if (!m_camera->GetCameraData()->m_perspective)
+               camtrans.getOrigin()[2] *= ortho;
+       MT_Matrix4x4 viewmat(camtrans);
+       
+       m_rasterizer->SetViewMatrix(viewmat, m_camera->NodeGetWorldPosition(),
+               m_camera->GetCameraLocation(), m_camera->GetCameraOrientation());
+       m_camera->SetModelviewMatrix(viewmat);
+    // restore the stereo mode now that the matrix is computed
+    m_rasterizer->SetStereoMode(stereomode);
 
+    // do not update the mesh, we don't want to do it more than once per frame
+    //m_scene->UpdateMeshTransformations();
+
+       m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera);
+
+       m_scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+}
 
 
 // cast Image pointer to ImageRender
@@ -174,26 +316,31 @@ static int ImageRender_init (PyObject * pySelf, PyObject * args, PyObject * kwds
 // get background color
 PyObject * getBackground (PyImage * self, void * closure)
 {
-       return Py_BuildValue("[BBB]", getImageRender(self)->getBackground()[0],
-               getImageRender(self)->getBackground()[1], getImageRender(self)->getBackground()[2]);
+       return Py_BuildValue("[BBBB]", 
+        getImageRender(self)->getBackground(0),
+               getImageRender(self)->getBackground(1), 
+        getImageRender(self)->getBackground(2),
+        getImageRender(self)->getBackground(3));
 }
 
 // set color
 static int setBackground (PyImage * self, PyObject * value, void * closure)
 {
        // check validity of parameter
-       if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 3
+       if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 4
                || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 0))
                || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 1))
-               || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 2)))
+               || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 2))
+               || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 3)))
        {
-               PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 3 ints");
+               PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 4 integer between 0 and 255");
                return -1;
        }
        // set background color
        getImageRender(self)->setBackground((unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 0))),
                (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 1))),
-               (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2))));
+               (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2))),
+        (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 3))));
        // success
        return 0;
 }
@@ -209,6 +356,10 @@ static PyMethodDef imageRenderMethods[] =
 static PyGetSetDef imageRenderGetSets[] =
 { 
        {(char*)"background", (getter)getBackground, (setter)setBackground, (char*)"background color", NULL},
+    // attribute from ImageViewport
+       {(char*)"capsize", (getter)ImageViewport_getCaptureSize, (setter)ImageViewport_setCaptureSize, (char*)"size of render area", NULL},
+       {(char*)"alpha", (getter)ImageViewport_getAlpha, (setter)ImageViewport_setAlpha, (char*)"use alpha in texture", NULL},
+       {(char*)"whole", (getter)ImageViewport_getWhole, (setter)ImageViewport_setWhole, (char*)"use whole viewport to render", NULL},
        // attributes from ImageBase class
        {(char*)"image", (getter)Image_getImage, NULL, (char*)"image data", NULL},
        {(char*)"size", (getter)Image_getSize, NULL, (char*)"image size", NULL},
@@ -263,5 +414,315 @@ PyTypeObject ImageRenderType =
        Image_allocNew,           /* tp_new */
 };
 
+// object initialization
+static int ImageMirror_init (PyObject * pySelf, PyObject * args, PyObject * kwds)
+{
+       // parameters - scene object
+       PyObject * scene;
+       // reference object for mirror
+       PyObject * observer;
+    // object holding the mirror
+    PyObject * mirror;
+    // material of the mirror
+    short materialID = 0;
+       // parameter keywords
+       static char *kwlist[] = {"scene", "observer", "mirror", "material", NULL};
+       // get parameters
+       if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOO|h", kwlist, &scene, &observer, &mirror, &materialID))
+               return -1;
+       try
+       {
+               // get scene pointer
+               KX_Scene * scenePtr (NULL);
+        if (scene != NULL && PyObject_TypeCheck(scene, &KX_Scene::Type)) 
+            scenePtr = static_cast<KX_Scene*>(scene);
+        else
+            THRWEXCP(SceneInvalid, S_OK);
+
+               // get observer pointer
+               KX_GameObject * observerPtr (NULL);
+               if (observer != NULL && PyObject_TypeCheck(observer, &KX_GameObject::Type))
+            observerPtr = static_cast<KX_GameObject*>(observer);
+        else if (observer != NULL && PyObject_TypeCheck(observer, &KX_Camera::Type))
+            observerPtr = static_cast<KX_Camera*>(observer);
+               else
+            THRWEXCP(ObserverInvalid, S_OK);
+
+               // get mirror pointer
+               KX_GameObject * mirrorPtr (NULL);
+               if (mirror != NULL && PyObject_TypeCheck(mirror, &KX_GameObject::Type))
+            mirrorPtr = static_cast<KX_GameObject*>(mirror);
+               else
+            THRWEXCP(MirrorInvalid, S_OK);
+
+        // locate the material in the mirror
+               RAS_IPolyMaterial * material = getMaterial(mirror, materialID);
+               if (material == NULL)
+            THRWEXCP(MaterialNotAvail, S_OK);
+
+               // get pointer to image structure
+               PyImage * self = reinterpret_cast<PyImage*>(pySelf);
+
+               // create source object
+               if (self->m_image != NULL) 
+        {
+            delete self->m_image;
+            self->m_image = NULL;
+        }
+               self->m_image = new ImageRender(scenePtr, observerPtr, mirrorPtr, material);
+       }
+       catch (Exception & exp)
+       {
+               exp.report();
+               return -1;
+       }
+       // initialization succeded
+       return 0;
+}
+
+// get background color
+PyObject * getClip (PyImage * self, void * closure)
+{
+       return PyFloat_FromDouble(getImageRender(self)->getClip());
+}
+
+// set clip
+static int setClip (PyImage * self, PyObject * value, void * closure)
+{
+       // check validity of parameter
+       double clip;
+       if (value == NULL || !PyFloat_Check(value) || (clip = PyFloat_AsDouble(value)) < 0.01 || clip > 5000.0)
+       {
+               PyErr_SetString(PyExc_TypeError, "The value must be an float between 0.01 and 5000");
+               return -1;
+       }
+       // set background color
+       getImageRender(self)->setClip(float(clip));
+       // success
+       return 0;
+}
+
+// attributes structure
+static PyGetSetDef imageMirrorGetSets[] =
+{ 
+       {(char*)"clip", (getter)getClip, (setter)setClip, (char*)"clipping distance", NULL},
+       // attribute from ImageRender
+       {(char*)"background", (getter)getBackground, (setter)setBackground, (char*)"background color", NULL},
+    // attribute from ImageViewport
+       {(char*)"capsize", (getter)ImageViewport_getCaptureSize, (setter)ImageViewport_setCaptureSize, (char*)"size of render area", NULL},
+       {(char*)"alpha", (getter)ImageViewport_getAlpha, (setter)ImageViewport_setAlpha, (char*)"use alpha in texture", NULL},
+       {(char*)"whole", (getter)ImageViewport_getWhole, (setter)ImageViewport_setWhole, (char*)"use whole viewport to render", NULL},
+       // attributes from ImageBase class
+       {(char*)"image", (getter)Image_getImage, NULL, (char*)"image data", NULL},
+       {(char*)"size", (getter)Image_getSize, NULL, (char*)"image size", NULL},
+       {(char*)"scale", (getter)Image_getScale, (setter)Image_setScale, (char*)"fast scale of image (near neighbour)", NULL},
+       {(char*)"flip", (getter)Image_getFlip, (setter)Image_setFlip, (char*)"flip image vertically", NULL},
+       {(char*)"filter", (getter)Image_getFilter, (setter)Image_setFilter, (char*)"pixel filter", NULL},
+       {NULL}
+};
+
+
+// constructor
+ImageRender::ImageRender (KX_Scene * scene, KX_GameObject * observer, KX_GameObject * mirror, RAS_IPolyMaterial * mat) :
+    ImageViewport(),
+    m_render(false),
+    m_scene(scene),
+    m_observer(observer),
+    m_mirror(mirror),
+       m_clip(100.f)
+{
+    // this constructor is used for automatic planar mirror
+    // create a camera, take all data by default, in any case we will recompute the frustrum on each frame
+       RAS_CameraData camdata;
+    vector<RAS_TexVert*> mirrorVerts;
+    vector<RAS_TexVert*>::iterator it;
+    float mirrorArea = 0.f;
+    float mirrorNormal[3] = {0.f, 0.f, 0.f};
+    float mirrorUp[3];
+    float dist, vec[3];
+    float zaxis[3] = {0.f, 0.f, 1.f};
+    float mirrorMat[3][3];
+    float left, right, top, bottom, back;
+       
+       m_camera= new KX_Camera(scene, KX_Scene::m_callbacks, camdata);
+       m_camera->SetName("__mirror__cam__");
+    // don't add the camera to the scene object list, it doesn't need to be accessible
+    m_owncamera = true;
+    // retrieve rendering objects
+    m_engine = KX_GetActiveEngine();
+    m_rasterizer = m_engine->GetRasterizer();
+    m_canvas = m_engine->GetCanvas();
+    m_rendertools = m_engine->GetRenderTools();
+    // locate the vertex assigned to mat and do following calculation in mesh coordinates
+    for (int meshIndex = 0; meshIndex < mirror->GetMeshCount(); meshIndex++)
+    {
+        RAS_MeshObject*        mesh = mirror->GetMesh(meshIndex);
+        int numPolygons = mesh->NumPolygons();
+        for (int polygonIndex=0; polygonIndex < numPolygons; polygonIndex++)
+        {
+            RAS_Polygon* polygon = mesh->GetPolygon(polygonIndex);
+            if (polygon->GetMaterial()->GetPolyMaterial() == mat)
+            {
+                RAS_TexVert *v1, *v2, *v3, *v4;
+                float normal[3];
+                float area;
+                // this polygon is part of the mirror,
+                v1 = polygon->GetVertex(0);
+                v2 = polygon->GetVertex(1);
+                v3 = polygon->GetVertex(2);
+                mirrorVerts.push_back(v1);
+                mirrorVerts.push_back(v2);
+                mirrorVerts.push_back(v3);
+                if (polygon->VertexCount() == 4) 
+                {
+                    v4 = polygon->GetVertex(3);
+                    mirrorVerts.push_back(v4);
+                    area = CalcNormFloat4((float*)v1->getXYZ(), (float*)v2->getXYZ(), (float*)v3->getXYZ(), (float*)v4->getXYZ(), normal);
+                } else
+                {
+                    area = CalcNormFloat((float*)v1->getXYZ(), (float*)v2->getXYZ(), (float*)v3->getXYZ(), normal);
+                }
+                area = fabs(area);
+                mirrorArea += area;
+                VecMulf(normal, area);
+                VecAddf(mirrorNormal, mirrorNormal, normal);
+            }
+        }
+    }
+    if (mirrorVerts.size() == 0 || mirrorArea < FLT_EPSILON)
+    {
+        // no vertex or zero size mirror
+       THRWEXCP(MirrorSizeInvalid, S_OK);
+    }
+    // compute average normal of mirror faces
+    VecMulf(mirrorNormal, 1.0f/mirrorArea);
+    if (Normalize(mirrorNormal) == 0.f)
+    {
+        // no normal
+        THRWEXCP(MirrorNormalInvalid, S_OK);
+    }
+    // the mirror plane has an equation of the type ax+by+cz = d where (a,b,c) is the normal vector
+    // mirror up direction is the projection of Z on the plane
+    // scalar product between normal and Z axis
+    dist = Inpf(mirrorNormal, zaxis);
+    if (dist < FLT_EPSILON)
+    {
+        // the mirror is already vertical
+        VecCopyf(mirrorUp, zaxis);
+    }
+    else
+    {
+        // projection of Z to normal
+        VecCopyf(vec, mirrorNormal);
+        VecMulf(vec, dist);
+        VecSubf(mirrorUp, zaxis, mirrorNormal);
+        if (Normalize(mirrorUp) == 0.f)
+        {
+            // mirror is horizontal
+            THRWEXCP(MirrorHorizontal, S_OK);
+            return;
+        }
+    }
+    // compute rotation matrix between local coord and mirror coord
+    // to match camera orientation, we select mirror z = -normal, y = up, x = y x z
+    VecCopyf(mirrorMat[2], mirrorNormal);
+    VecMulf(mirrorMat[2], -1.0f);
+    VecCopyf(mirrorMat[1], mirrorUp);
+    Crossf(mirrorMat[0], mirrorMat[1], mirrorMat[2]);
+    // transpose to make it a orientation matrix from local space to mirror space
+    Mat3Transp(mirrorMat);
+    // transform all vertex to plane coordinates and determine mirror position
+    left = FLT_MAX; 
+    right = -FLT_MAX;
+    bottom = FLT_MAX;
+    top = -FLT_MAX;
+    back = -FLT_MAX; // most backward vertex (=highest Z coord in mirror space)
+    for (it = mirrorVerts.begin(); it != mirrorVerts.end(); it++)
+    {   
+        VecCopyf(vec, (float*)(*it)->getXYZ());
+        Mat3MulVecfl(mirrorMat, vec);
+        if (vec[0] < left)
+            left = vec[0];
+        if (vec[0] > right)
+            right = vec[0];
+        if (vec[1] < bottom)
+            bottom = vec[1];
+        if (vec[1] > top)
+            top = vec[1];
+        if (vec[2] > back)
+            back = vec[2];
+    }
+    // now store this information in the object for later rendering
+    m_mirrorHalfWidth = (right-left)*0.5f;
+    m_mirrorHalfHeight = (top-bottom)*0.5f;
+    if (m_mirrorHalfWidth < 0.01f || m_mirrorHalfHeight < 0.01f)
+    {
+        // mirror too small
+        THRWEXCP(MirrorTooSmall, S_OK);
+    }
+    // mirror position in mirror coord
+    vec[0] = (left+right)*0.5f;
+    vec[1] = (top+bottom)*0.5f;
+    vec[2] = back;
+    // convert it in local space: transpose again the matrix to get back to mirror to local transform
+    Mat3Transp(mirrorMat);
+    Mat3MulVecfl(mirrorMat, vec);
+    // mirror position in local space
+    m_mirrorPos.setValue(vec[0], vec[1], vec[2]);
+    // mirror normal vector (pointed towards the back of the mirror) in local space
+    m_mirrorZ.setValue(-mirrorNormal[0], -mirrorNormal[1], -mirrorNormal[2]);
+    m_mirrorY.setValue(mirrorUp[0], mirrorUp[1], mirrorUp[2]);
+    m_mirrorX = m_mirrorY.cross(m_mirrorZ);
+    m_render = true;
+
+       setBackground(0, 0, 255, 255);
+}
+
+
+
+
+// define python type
+PyTypeObject ImageMirrorType =
+{ 
+       PyObject_HEAD_INIT(NULL)
+       0,                         /*ob_size*/
+       "VideoTexture.ImageMirror",   /*tp_name*/
+       sizeof(PyImage),          /*tp_basicsize*/
+       0,                         /*tp_itemsize*/
+       (destructor)Image_dealloc, /*tp_dealloc*/
+       0,                         /*tp_print*/
+       0,                         /*tp_getattr*/
+       0,                         /*tp_setattr*/
+       0,                         /*tp_compare*/
+       0,                         /*tp_repr*/
+       0,                         /*tp_as_number*/
+       0,                         /*tp_as_sequence*/
+       0,                         /*tp_as_mapping*/
+       0,                         /*tp_hash */
+       0,                         /*tp_call*/
+       0,                         /*tp_str*/
+       0,                         /*tp_getattro*/
+       0,                         /*tp_setattro*/
+       0,                         /*tp_as_buffer*/
+       Py_TPFLAGS_DEFAULT,        /*tp_flags*/
+       "Image source from mirror",       /* tp_doc */
+       0,                             /* tp_traverse */
+       0,                             /* tp_clear */
+       0,                             /* tp_richcompare */
+       0,                             /* tp_weaklistoffset */
+       0,                             /* tp_iter */
+       0,                             /* tp_iternext */
+       imageRenderMethods,    /* tp_methods */
+       0,                   /* tp_members */
+       imageMirrorGetSets,          /* tp_getset */
+       0,                         /* tp_base */
+       0,                         /* tp_dict */
+       0,                         /* tp_descr_get */
+       0,                         /* tp_descr_set */
+       0,                         /* tp_dictoffset */
+       (initproc)ImageMirror_init,     /* tp_init */
+       0,                         /* tp_alloc */
+       Image_allocNew,           /* tp_new */
+};
+
 
-#endif  // #if 0
index 66255f04d2c152fd0bd4c2e2653e1ee57601350f..c94e2f1e718348035977f3ae208fa6553b26a52a 100644 (file)
@@ -42,42 +42,56 @@ class ImageRender : public ImageViewport
 public:
        /// constructor
        ImageRender (KX_Scene * scene, KX_Camera * camera);
+       ImageRender (KX_Scene * scene, KX_GameObject * observer, KX_GameObject * mirror, RAS_IPolyMaterial * mat);
 
        /// destructor
        virtual ~ImageRender (void);
 
        /// get background color
-       unsigned char * getBackground (void) { return m_background; }
+    int getBackground (int idx) { return (idx < 0 || idx > 3) ? 0 : int(m_background[idx]*255.f); }
        /// set background color
-       void setBackground (unsigned char red, unsigned char green, unsigned char blue);
+       void setBackground (int red, int green, int blue, int alpha);
+
+       /// clipping distance
+       float getClip (void) { return m_clip; }
+       /// set whole buffer use
+    void setClip (float clip) { m_clip = clip; }
 
 protected:
+    /// true if ready to render
+    bool m_render;
        /// rendered scene
        KX_Scene * m_scene;
        /// camera for render
        KX_Camera * m_camera;
-
-       /// screen area for rendering
-       ScrArea m_area;
-       /// rendering device
-       RAS_ICanvas * m_canvas;
-       /// rasterizer
-       RAS_IRasterizer * m_rasterizer;
-       /// render tools
-       RAS_IRenderTools * m_rendertools;
+    /// do we own the camera?
+    bool m_owncamera;
+    /// for mirror operation
+    KX_GameObject * m_observer;
+    KX_GameObject * m_mirror;
+       float m_clip;                                           // clipping distance
+    float m_mirrorHalfWidth;            // mirror width in mirror space
+    float m_mirrorHalfHeight;           // mirror height in mirror space
+    MT_Point3 m_mirrorPos;              // mirror center position in local space
+    MT_Vector3 m_mirrorZ;               // mirror Z axis in local space
+    MT_Vector3 m_mirrorY;               // mirror Y axis in local space
+    MT_Vector3 m_mirrorX;               // mirror X axis in local space
+    /// canvas
+    RAS_ICanvas* m_canvas;
+    /// rasterizer
+    RAS_IRasterizer* m_rasterizer;
+    /// render tools
+    RAS_IRenderTools* m_rendertools;
+    /// engine
+    KX_KetsjiEngine* m_engine;
 
        /// background colour
-       unsigned char m_background[3];
+       float  m_background[4];
 
 
        /// render 3d scene to image
        virtual void calcImage (unsigned int texId);
 
-       /// refresh lights
-       void refreshLights (void);
-       /// methods from KX_KetsjiEngine
-       bool BeginFrame();
-       void EndFrame();
        void Render();
        void SetupRenderFrame(KX_Scene *scene, KX_Camera* cam);
        void RenderFrame(KX_Scene* scene, KX_Camera* cam);
index deb66ffb6ba4500d783dae579b38f02ed8d89756..4c2c81e2208b599407dc5907dfff6fdb4fd1f1fd 100644 (file)
@@ -34,12 +34,12 @@ http://www.gnu.org/copyleft/lesser.txt.
 
 
 // constructor
-ImageViewport::ImageViewport (void) : m_texInit(false)
+ImageViewport::ImageViewport (void) : m_alpha(false), m_texInit(false)
 {
        // get viewport rectangle
        glGetIntegerv(GL_VIEWPORT, m_viewport);
        // create buffer for viewport image
-       m_viewportImage = new BYTE [3 * getViewportSize()[0] * getViewportSize()[1]];
+       m_viewportImage = new BYTE [4 * getViewportSize()[0] * getViewportSize()[1]];
        // set attributes
        setWhole(false);
 }
@@ -62,7 +62,7 @@ void ImageViewport::setWhole (bool whole)
                m_capSize[idx] = whole ? short(getViewportSize()[idx])
                        : calcSize(short(getViewportSize()[idx]));
                // position
-               m_position[idx] = whole ? 0 : (getViewportSize()[idx] - m_capSize[idx]) >> 1;
+               m_position[idx] = whole ? 0 : ((getViewportSize()[idx] - m_capSize[idx]) >> 1);
        }
        // init image
        init(m_capSize[0], m_capSize[1]);
@@ -123,20 +123,31 @@ void ImageViewport::calcImage (unsigned int texId)
                && m_capSize[1] == calcSize(m_capSize[1]) && !m_flip)
        {
                // just copy current viewport to texture
-               glBindTexture(GL_TEXTURE_2D, texId);
-               glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_upLeft[0], m_upLeft[1], (GLsizei)m_capSize[0], (GLsizei)m_capSize[1]);
-               // image is not available
-               m_avail = false;
+           glBindTexture(GL_TEXTURE_2D, texId);
+           glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_upLeft[0], m_upLeft[1], (GLsizei)m_capSize[0], (GLsizei)m_capSize[1]);
+           // image is not available
+           m_avail = false;
        }
        // otherwise copy viewport to buffer, if image is not available
        else if (!m_avail)
        {
                // get frame buffer data
-               glReadPixels(m_upLeft[0], m_upLeft[1], (GLsizei)m_capSize[0], (GLsizei)m_capSize[1], GL_RGB,
-                       GL_UNSIGNED_BYTE, m_viewportImage);
-               // filter loaded data
-               FilterRGB24 filt;
-               filterImage(filt, m_viewportImage, m_capSize);
+        if (m_alpha)
+        {
+               glReadPixels(m_upLeft[0], m_upLeft[1], (GLsizei)m_capSize[0], (GLsizei)m_capSize[1], GL_RGBA,
+                           GL_UNSIGNED_BYTE, m_viewportImage);
+                   // filter loaded data
+                   FilterRGBA32 filt;
+                   filterImage(filt, m_viewportImage, m_capSize);
+        } 
+        else
+        {
+               glReadPixels(m_upLeft[0], m_upLeft[1], (GLsizei)m_capSize[0], (GLsizei)m_capSize[1], GL_RGB,
+                       GL_UNSIGNED_BYTE, m_viewportImage);
+               // filter loaded data
+                   FilterRGB24 filt;
+                   filterImage(filt, m_viewportImage, m_capSize);
+        }
        }
 }
 
@@ -151,14 +162,14 @@ inline ImageViewport * getImageViewport (PyImage * self)
 
 
 // get whole
-static PyObject * ImageViewport_getWhole (PyImage * self, void * closure)
+PyObject * ImageViewport_getWhole (PyImage * self, void * closure)
 {
        if (self->m_image != NULL && getImageViewport(self)->getWhole()) Py_RETURN_TRUE;
        else Py_RETURN_FALSE;
 }
 
 // set whole
-static int ImageViewport_setWhole (PyImage * self, PyObject * value, void * closure)
+int ImageViewport_setWhole (PyImage * self, PyObject * value, void * closure)
 {
        // check parameter, report failure
        if (value == NULL || !PyBool_Check(value))
@@ -172,6 +183,28 @@ static int ImageViewport_setWhole (PyImage * self, PyObject * value, void * clos
        return 0;
 }
 
+// get alpha
+PyObject * ImageViewport_getAlpha (PyImage * self, void * closure)
+{
+       if (self->m_image != NULL && getImageViewport(self)->getAlpha()) Py_RETURN_TRUE;
+       else Py_RETURN_FALSE;
+}
+
+// set whole
+int ImageViewport_setAlpha (PyImage * self, PyObject * value, void * closure)
+{
+       // check parameter, report failure
+       if (value == NULL || !PyBool_Check(value))
+       {
+               PyErr_SetString(PyExc_TypeError, "The value must be a bool");
+               return -1;
+       }
+       // set alpha
+       if (self->m_image != NULL) getImageViewport(self)->setAlpha(value == Py_True);
+       // success
+       return 0;
+}
+
 
 // get position
 static PyObject * ImageViewport_getPosition (PyImage * self, void * closure)
@@ -202,14 +235,14 @@ static int ImageViewport_setPosition (PyImage * self, PyObject * value, void * c
 }
 
 // get capture size
-static PyObject * ImageViewport_getCaptureSize (PyImage * self, void * closure)
+PyObject * ImageViewport_getCaptureSize (PyImage * self, void * closure)
 {
        return Py_BuildValue("(ii)", getImageViewport(self)->getCaptureSize()[0],
                getImageViewport(self)->getCaptureSize()[1]);
 }
 
 // set capture size
-static int ImageViewport_setCaptureSize (PyImage * self, PyObject * value, void * closure)
+int ImageViewport_setCaptureSize (PyImage * self, PyObject * value, void * closure)
 {
        // check validity of parameter
        if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
@@ -242,6 +275,7 @@ static PyGetSetDef imageViewportGetSets[] =
        {(char*)"whole", (getter)ImageViewport_getWhole, (setter)ImageViewport_setWhole, (char*)"use whole viewport to capture", NULL},
        {(char*)"position", (getter)ImageViewport_getPosition, (setter)ImageViewport_setPosition, (char*)"upper left corner of captured area", NULL},
        {(char*)"capsize", (getter)ImageViewport_getCaptureSize, (setter)ImageViewport_setCaptureSize, (char*)"size of viewport area being captured", NULL},
+       {(char*)"alpha", (getter)ImageViewport_getAlpha, (setter)ImageViewport_setAlpha, (char*)"use alpha in texture", NULL},
        // attributes from ImageBase class
        {(char*)"image", (getter)Image_getImage, NULL, (char*)"image data", NULL},
        {(char*)"size", (getter)Image_getSize, NULL, (char*)"image size", NULL},
index 4265906b8f57d4143b74c564b69fcb6bfdcd69d6..0449249cf952802ef13db7c439e84b575dc8a59d 100644 (file)
@@ -43,6 +43,12 @@ public:
        bool getWhole (void) { return m_whole; }
        /// set whole buffer use
        void setWhole (bool whole);
+
+       /// is alpha channel used
+       bool getAlpha (void) { return m_alpha; }
+       /// set whole buffer use
+    void setAlpha (bool alpha) { m_alpha = alpha; }
+
        /// get capture size in viewport
        short * getCaptureSize (void) { return m_capSize; }
        /// set capture size in viewport
@@ -61,6 +67,8 @@ protected:
        short m_capSize[2];
        /// use whole viewport
        bool m_whole;
+    /// use alpha channel
+    bool m_alpha;
 
        /// position of capture rectangle in viewport
        GLint m_position[2];
@@ -79,6 +87,12 @@ protected:
        GLint * getViewportSize (void) { return m_viewport + 2; }
 };
 
+PyObject * ImageViewport_getCaptureSize (PyImage * self, void * closure);
+int ImageViewport_setCaptureSize (PyImage * self, PyObject * value, void * closure);
+PyObject * ImageViewport_getWhole (PyImage * self, void * closure);
+int ImageViewport_setWhole (PyImage * self, PyObject * value, void * closure);
+PyObject * ImageViewport_getAlpha (PyImage * self, void * closure);
+int ImageViewport_setAlpha (PyImage * self, PyObject * value, void * closure);
 
 #endif
 
index 3c371e51537c31bc8299f21a7a950ada996fdfa8..1bbef8f0f9e323d87a264ded69978ee775798e32 100644 (file)
@@ -32,6 +32,7 @@ http://www.gnu.org/copyleft/lesser.txt.
 
 #include "ImageBase.h"
 #include "BlendType.h"
+#include "Exception.h"
 
 
 // type Texture declaration
@@ -82,5 +83,10 @@ RAS_IPolyMaterial * getMaterial (PyObject *obj, short matID);
 // get material ID
 short getMaterialID (PyObject * obj, char * name);
 
+// Exceptions
+extern ExceptionID MaterialNotAvail;
+
+// object type
+extern BlendType<KX_GameObject> gameObjectType;
 
 #endif
index b38882f8164ac632ed6afe40a8d61a90708b16e7..ec066811a52c5a4c44d1e9f36193042e6d18cf29 100644 (file)
@@ -132,6 +132,7 @@ extern PyTypeObject FilterBGR24Type;
 extern PyTypeObject ImageBuffType;
 extern PyTypeObject ImageMixType;
 extern PyTypeObject ImageRenderType;
+extern PyTypeObject ImageMirrorType;
 extern PyTypeObject ImageViewportType;
 extern PyTypeObject ImageViewportType;
 
@@ -144,7 +145,8 @@ static void registerAllTypes(void)
 #endif
        pyImageTypes.add(&ImageBuffType, "ImageBuff");
        pyImageTypes.add(&ImageMixType, "ImageMix");
-       //pyImageTypes.add(&ImageRenderType, "ImageRender");
+       pyImageTypes.add(&ImageRenderType, "ImageRender");
+       pyImageTypes.add(&ImageMirrorType, "ImageMirror");
        pyImageTypes.add(&ImageViewportType, "ImageViewport");
 
        pyFilterTypes.add(&FilterBlueScreenType, "FilterBlueScreen");
index 4b13ef8f678de04c6a3508fff18fb27bcf39f2fd..19d833b5b0dc85c8850dda4344c228d60dc1f6fb 100644 (file)
@@ -120,22 +120,34 @@ ifeq ($(OS),freebsd)
 endif
 
 ifeq ($(OS),irix)
-    CC = cc
-    CCC        = CC
-    CFLAGS     += -n32 -mips3 -Xcpluscomm
-    CCFLAGS    += -n32 -mips3 -Xcpluscomm -LANG:std
-ifdef MIPS73_ISOHEADERS
-    CCFLAGS    += -LANG:libc_in_namespace_std=off -I$(MIPS73_ISOHEADERS)
-else
-    CCFLAGS    += -LANG:libc_in_namespace_std=off
-endif
-    REL_CFLAGS += -n32 -mips3 -O2 -OPT:Olimit=0
-    REL_CCFLAGS += -n32 -mips3 -O2 -OPT:Olimit=0
+    ifeq ($(IRIX_USE_GCC),true)
+        CC = gcc
+        CCC = g++
+        CFLAGS += -fPIC -funsigned-char -fno-strict-aliasing -mabi=n32 -mips4
+        CCFLAGS += -fPIC -fpermissive -funsigned-char -fno-strict-aliasing -mabi=n32 -mips4
+        REL_CFLAGS += -O2
+        REL_CCFLAGS += -O2
+        CPPFLAGS += -DXP_UNIX
+        DBG_CFLAGS += -g3 -gdwarf-2 -ggdb
+        DBG_CCFLAGS += -g3 -gdwarf-2 -ggdb
+    else
+        CC = cc
+        CCC = CC
+        CFLAGS += -n32 -mips3 -Xcpluscomm
+        CCFLAGS        += -n32 -mips3 -Xcpluscomm -LANG:std
+        ifdef MIPS73_ISOHEADERS
+            CCFLAGS    += -LANG:libc_in_namespace_std=off -I$(MIPS73_ISOHEADERS)
+        else
+            CCFLAGS    += -LANG:libc_in_namespace_std=off
+        endif
+        REL_CFLAGS     += -n32 -mips3 -O2 -OPT:Olimit=0
+        REL_CCFLAGS += -n32 -mips3 -O2 -OPT:Olimit=0
+    endif
     OPENGL_HEADERS = /usr/include
     NAN_DEPEND = true
     AR = CC
     ARFLAGS = -ar -o
-       ARFLAGSQUIET = -ar -o
+    ARFLAGSQUIET = -ar -o
 endif
 
 ifeq ($(OS),linux)
index 424a7c558d7993bc26a34b2c175e05123c8623fe..04a1d10793156e4f1b12277f488b70c2bac2f6ee 100644 (file)
@@ -75,6 +75,7 @@ else
     export NAN_SOLID ?= $(LCGDIR)/solid
     export NAN_QHULL ?= $(LCGDIR)/qhull
 endif
+    export NAN_USE_BULLET ?= true
     export NAN_BULLET2 ?= $(LCGDIR)/bullet2
     export NAN_SUMO ?= $(SRCHOME)/gameengine/Physics/Sumo
     export NAN_FUZZICS ?= $(SRCHOME)/gameengine/Physics/Sumo/Fuzzics
@@ -83,7 +84,7 @@ endif
     export NAN_GUARDEDALLOC ?= $(LCGDIR)/guardedalloc
     export NAN_IKSOLVER ?= $(LCGDIR)/iksolver
     export NAN_BSP ?= $(LCGDIR)/bsp
-       export NAN_BOOLOP ?= $(LCGDIR)/boolop
+    export NAN_BOOLOP ?= $(LCGDIR)/boolop
     export NAN_SOUNDSYSTEM ?= $(LCGDIR)/SoundSystem
     export NAN_STRING ?= $(LCGDIR)/string
     export NAN_MEMUTIL ?= $(LCGDIR)/memutil
@@ -116,7 +117,7 @@ endif
     export WITH_DDS ?= true
 
     ifeq ($(OS),windows)
-       export NAN_WINTAB ?= $(LCGDIR)/wintab
+      export NAN_WINTAB ?= $(LCGDIR)/wintab
       ifeq ($(FREE_WINDOWS), true)
         export NAN_PTHREADS ?= $(LCGDIR)/pthreads
         export NAN_OPENEXR ?= $(LCGDIR)/gcc/openexr
@@ -129,28 +130,34 @@ endif
       endif
     else
       ifeq ($(OS),darwin)
-          export NAN_OPENEXR ?= $(LCGDIR)/openexr
-         ifeq ($(CPU),powerpc)
-             export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a
-         else
-             export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a
-         endif
+        export NAN_OPENEXR ?= $(LCGDIR)/openexr
+        ifeq ($(CPU),powerpc)
+          export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a
+        else
+          export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a
+        endif
       else
         ifeq ($(OS),linux)
-                       ifeq ($(WITH_OPENEXR), true)
-                       NAN_OPENEXR?=$(shell pkg-config --variable=prefix OpenEXR )
-                       NAN_OPENEXR_INC?=$(shell pkg-config --cflags OpenEXR )
-                       NAN_OPENEXR_LIBS?=$(addprefix ${NAN_OPENEXR}/lib/lib,$(addsuffix .a,$(shell pkg-config --libs-only-l OpenEXR | sed -s "s/-l//g" )))
-                       endif
+          ifeq ($(WITH_OPENEXR), true)
+            NAN_OPENEXR?=$(shell pkg-config --variable=prefix OpenEXR )
+            NAN_OPENEXR_INC?=$(shell pkg-config --cflags OpenEXR )
+            NAN_OPENEXR_LIBS?=$(addprefix ${NAN_OPENEXR}/lib/lib,$(addsuffix .a,$(shell pkg-config --libs-only-l OpenEXR | sed -s "s/-l//g" )))
+          endif
         else
           ifeq ($(OS), solaris)
               # this only exists at the moment for i386-64 CPU Types at the moment
               export NAN_OPENEXR ?= $(LCGDIR)/openexr
-
               export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a -lrt
           else
-            export NAN_OPENEXR ?= /usr/local
-           export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a
+            ifeq ($(OS), irix)
+              ifeq ($(IRIX_USE_GCC), true)
+                  export NAN_OPENEXR ?= $(LCGDIR)/openexr/gcc
+             else
+                  export NAN_OPENEXR ?= $(LCGDIR)/openexr
+             endif
+            endif
+            export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR
+            export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a
           endif
         endif
       endif
@@ -331,23 +338,27 @@ endif
     export NAN_PYTHON ?= $(LCGDIR)/python
     export NAN_PYTHON_VERSION ?= 2.3
     export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
-    export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
+    export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a -lpthread
     export NAN_OPENAL ?= $(LCGDIR)/openal
     export NAN_FMOD ?= $(LCGDIR)/fmod
     export NAN_JPEG ?= $(LCGDIR)/jpeg
     export NAN_PNG ?= $(LCGDIR)/png
-    export NAN_TIFF ?= /usr/freeware
+    export NAN_TIFF ?= $(LCGDIR)/tiff
     export NAN_ODE ?= $(LCGDIR)/ode
     export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
     export NAN_MESA ?= /usr/src/Mesa-3.1
-    export NAN_ZLIB ?= /usr/freeware
+    export NAN_ZLIB ?= $(LCGDIR)/zlib
     export NAN_NSPR ?= $(LCGDIR)/nspr
-    export NAN_FREETYPE ?= /usr/freeware
-    export NAN_GETTEXT ?= /usr/freeware
-    export NAN_GETTEXT_LIB ?= $(NAN_GETTEXT)/lib32/libintl.a
+    export NAN_FREETYPE ?= $(LCGDIR)/freetype
+    export NAN_ICONV ?= $(LCGDIR)/iconv
+    export NAN_GETTEXT ?= $(LCGDIR)/gettext
+    export NAN_GETTEXT_LIB ?= $(NAN_GETTEXT)/lib/libintl.a $(NAN_ICONV)/lib/libiconv.a
     export NAN_SDL ?= $(LCGDIR)/sdl
-    export NAN_SDLLIBS ?= -L$(NAN_SDL)/lib -lSDL
+    export NAN_SDLLIBS ?= $(NAN_SDL)/lib/libSDL.a
     export NAN_SDLCFLAGS ?= -I$(NAN_SDL)/include/SDL
+    export NAN_FFMPEG ?= $(LCGDIR)/ffmpeg
+    export NAN_FFMPEGLIBS = $(NAN_FFMPEG)/lib/libavformat.a $(NAN_FFMPEG)/lib/libavcodec.a $(NAN_FFMPEG)/lib/libswscale.a $(NAN_FFMPEG)/lib/libavutil.a $(NAN_FFMPEG)/lib/libogg.a $(NAN_FFMPEG)/lib/libfaad.a $(NAN_FFMPEG)/lib/libmp3lame.a $(NAN_FFMPEG)/lib/libvorbis.a $(NAN_FFMPEG)/lib/libx264.a $(NAN_FFMPEG)/lib/libfaac.a $(NAN_ZLIB)/lib/libz.a
+    export NAN_FFMPEGCFLAGS ?= -I$(NAN_FFMPEG)/include
  
     # Uncomment the following line to use Mozilla inplace of netscape
     # CPPFLAGS +=-DMOZ_NOT_NET
index 8dda3b8c2df79334afd30031ca52d6db30145a69..186fe07e09ae84d7662b079e3989acafc28cfe09 100644 (file)
@@ -72,11 +72,19 @@ ifeq ($(OS),freebsd)
 endif
 
 ifeq ($(OS),irix)
-    LDFLAGS += -mips3
-    LLIBS = -lmovieGL -lGLU -lGL -lXmu -lXext -lX11 -lc -lm -ldmedia
-    LLIBS += -lcl -laudio -ldb -lCio -lz
-    LLIBS += -lpthread
-    LLIBS += -woff 84,171
+    ifeq ($(IRIX_USE_GCC), true)
+        LDFLAGS += -mabi=n32 -mips4 
+        DBG_LDFLAGS += -LD_LAYOUT:lgot_buffer=40
+    else
+        LDFLAGS += -n32 -mips3
+        LDFLAGS += -woff 84,171
+    endif
+    LLIBS = -lmovieGL -lGLU -lGL -lXmu -lXext -lXi -lX11 -lc -lm -ldmedia
+    LLIBS += -lcl -laudio
+    ifneq ($(IRIX_USE_GCC), true)
+        LLIBS += -lCio -ldb
+    endif
+    LLIBS += -lz -lpthread
     DYNLDFLAGS = -shared $(LDFLAGS)
 endif
 
@@ -90,7 +98,7 @@ ifeq ($(OS),linux)
   ifeq ($(CPU),$(findstring $(CPU), "i386 x86_64 ia64 parisc64 powerpc sparc64"))
     COMMENT = "MESA 3.1"
     LLIBS = -L$(NAN_MESA)/lib -L/usr/X11R6/lib -lXmu -lXext -lX11 -lXi
-    LLIBS += -lutil -lc -lm -ldl -lpthread 
+    LLIBS += -lutil -lc -lm -ldl -lpthread
 #    LLIBS += -L$(NAN_ODE)/lib -lode
     LOPTS = -export-dynamic
     DADD = -lGL -lGLU