merge from trunk at r31523
authorJoseph Eagar <joeedh@gmail.com>
Tue, 7 Sep 2010 05:47:34 +0000 (05:47 +0000)
committerJoseph Eagar <joeedh@gmail.com>
Tue, 7 Sep 2010 05:47:34 +0000 (05:47 +0000)
342 files changed:
1  2 
CMakeLists.txt
SConstruct
build_files/cmake/example_scripts/make_quicky.py
build_files/scons/config/freebsd7-config.py
build_files/scons/config/freebsd8-config.py
build_files/scons/config/freebsd9-config.py
build_files/scons/config/linux2-config.py
build_files/scons/tools/Blender.py
build_files/scons/tools/btools.py
doc/BL-license.txt
doc/bf-members.txt
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
extern/libopenjpeg/CMakeLists.txt
extern/lzma/CMakeLists.txt
extern/lzma/SConscript
extern/lzo/CMakeLists.txt
extern/lzo/SConscript
intern/boolop/CMakeLists.txt
intern/boolop/SConscript
intern/bsp/CMakeLists.txt
intern/bsp/SConscript
intern/container/CMakeLists.txt
intern/container/SConscript
intern/decimation/CMakeLists.txt
intern/decimation/SConscript
intern/elbeem/CMakeLists.txt
intern/elbeem/SConscript
intern/ghost/CMakeLists.txt
intern/ghost/SConscript
intern/ghost/intern/GHOST_WindowManager.cpp
intern/guardedalloc/CMakeLists.txt
intern/guardedalloc/SConscript
intern/iksolver/CMakeLists.txt
intern/iksolver/SConscript
intern/itasc/CMakeLists.txt
intern/itasc/SConscript
intern/memutil/CMakeLists.txt
intern/memutil/SConscript
intern/moto/CMakeLists.txt
intern/moto/SConscript
intern/opennl/CMakeLists.txt
intern/opennl/SConscript
intern/smoke/CMakeLists.txt
intern/smoke/SConscript
intern/string/CMakeLists.txt
intern/string/SConscript
release/scripts/io/export_ply.py
release/scripts/io/import_shape_mdd.py
release/scripts/io/netrender/__init__.py
release/scripts/keyingsets/keyingsets_utils.py
release/scripts/modules/bpy/ops.py
release/scripts/modules/bpy_types.py
release/scripts/modules/rigify/neck_flex.py
release/scripts/modules/rigify/palm_curl.py
release/scripts/modules/rigify/spine_pivot_flex.py
release/scripts/modules/rigify/tongue.py
release/scripts/modules/rigify_utils.py
release/scripts/modules/rna_prop_ui.py
release/scripts/op/add_mesh_torus.py
release/scripts/op/animsys_update.py
release/scripts/op/io_anim_bvh/__init__.py
release/scripts/op/io_anim_bvh/import_bvh.py
release/scripts/op/io_mesh_ply/__init__.py
release/scripts/op/io_mesh_ply/export_ply.py
release/scripts/op/io_scene_3ds/__init__.py
release/scripts/op/io_scene_3ds/export_3ds.py
release/scripts/op/io_scene_3ds/import_3ds.py
release/scripts/op/io_scene_fbx/__init__.py
release/scripts/op/io_scene_fbx/export_fbx.py
release/scripts/op/io_scene_obj/__init__.py
release/scripts/op/io_scene_obj/export_obj.py
release/scripts/op/io_scene_obj/import_obj.py
release/scripts/op/io_scene_x3d/__init__.py
release/scripts/op/io_scene_x3d/export_x3d.py
release/scripts/op/io_shape_mdd/__init__.py
release/scripts/op/io_shape_mdd/export_mdd.py
release/scripts/op/io_shape_mdd/import_mdd.py
release/scripts/op/nla.py
release/scripts/op/object.py
release/scripts/op/presets.py
release/scripts/op/uv.py
release/scripts/op/uvcalc_follow_active.py
release/scripts/op/uvcalc_smart_project.py
release/scripts/op/wm.py
release/scripts/presets/interaction/blender.py
release/scripts/presets/interaction/maya.py
release/scripts/templates/operator.py
release/scripts/templates/operator_modal.py
release/scripts/templates/operator_modal_draw.py
release/scripts/templates/operator_modal_view3d.py
release/scripts/templates/operator_uv.py
release/scripts/ui/properties_animviz.py
release/scripts/ui/properties_data_armature.py
release/scripts/ui/properties_data_armature_rigify.py
release/scripts/ui/properties_data_bone.py
release/scripts/ui/properties_data_camera.py
release/scripts/ui/properties_data_curve.py
release/scripts/ui/properties_data_lamp.py
release/scripts/ui/properties_data_lattice.py
release/scripts/ui/properties_data_mesh.py
release/scripts/ui/properties_data_metaball.py
release/scripts/ui/properties_data_modifier.py
release/scripts/ui/properties_game.py
release/scripts/ui/properties_material.py
release/scripts/ui/properties_object.py
release/scripts/ui/properties_object_constraint.py
release/scripts/ui/properties_particle.py
release/scripts/ui/properties_physics_cloth.py
release/scripts/ui/properties_physics_common.py
release/scripts/ui/properties_physics_field.py
release/scripts/ui/properties_physics_fluid.py
release/scripts/ui/properties_physics_smoke.py
release/scripts/ui/properties_physics_softbody.py
release/scripts/ui/properties_render.py
release/scripts/ui/properties_scene.py
release/scripts/ui/properties_texture.py
release/scripts/ui/properties_world.py
release/scripts/ui/space_dopesheet.py
release/scripts/ui/space_filebrowser.py
release/scripts/ui/space_graph.py
release/scripts/ui/space_image.py
release/scripts/ui/space_info.py
release/scripts/ui/space_nla.py
release/scripts/ui/space_outliner.py
release/scripts/ui/space_sequencer.py
release/scripts/ui/space_time.py
release/scripts/ui/space_userpref.py
release/scripts/ui/space_userpref_keymap.py
release/scripts/ui/space_view3d.py
release/scripts/ui/space_view3d_toolbar.py
source/blender/blenkernel/BKE_constraint.h
source/blender/blenkernel/BKE_customdata.h
source/blender/blenkernel/BKE_fcurve.h
source/blender/blenkernel/BKE_material.h
source/blender/blenkernel/BKE_mball.h
source/blender/blenkernel/BKE_particle.h
source/blender/blenkernel/BKE_sequencer.h
source/blender/blenkernel/BKE_texture.h
source/blender/blenkernel/intern/anim.c
source/blender/blenkernel/intern/blender.c
source/blender/blenkernel/intern/boids.c
source/blender/blenkernel/intern/constraint.c
source/blender/blenkernel/intern/context.c
source/blender/blenkernel/intern/customdata.c
source/blender/blenkernel/intern/fmodifier.c
source/blender/blenkernel/intern/font.c
source/blender/blenkernel/intern/image.c
source/blender/blenkernel/intern/library.c
source/blender/blenkernel/intern/material.c
source/blender/blenkernel/intern/mball.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/packedFile.c
source/blender/blenkernel/intern/particle.c
source/blender/blenkernel/intern/particle_system.c
source/blender/blenkernel/intern/report.c
source/blender/blenkernel/intern/sca.c
source/blender/blenkernel/intern/sequencer.c
source/blender/blenkernel/intern/sound.c
source/blender/blenkernel/intern/texture.c
source/blender/blenlib/BLI_math_color.h
source/blender/blenlib/BLI_math_vector.h
source/blender/blenlib/BLI_rect.h
source/blender/blenlib/BLI_sparsemap.h
source/blender/blenlib/BLI_string.h
source/blender/blenlib/intern/math_color.c
source/blender/blenlib/intern/math_vector.c
source/blender/blenlib/intern/rct.c
source/blender/blenlib/intern/string.c
source/blender/blenloader/BLO_readfile.h
source/blender/blenloader/intern/readblenentry.c
source/blender/blenloader/intern/readfile.c
source/blender/collada/CMakeLists.txt
source/blender/collada/DocumentExporter.cpp
source/blender/collada/SConscript
source/blender/editors/animation/anim_draw.c
source/blender/editors/animation/anim_ops.c
source/blender/editors/animation/fmodifier_ui.c
source/blender/editors/armature/armature_ops.c
source/blender/editors/armature/editarmature.c
source/blender/editors/armature/poselib.c
source/blender/editors/curve/curve_intern.h
source/blender/editors/curve/curve_ops.c
source/blender/editors/curve/editcurve.c
source/blender/editors/gpencil/drawgpencil.c
source/blender/editors/gpencil/gpencil_ops.c
source/blender/editors/gpencil/gpencil_paint.c
source/blender/editors/include/ED_gpencil.h
source/blender/editors/include/ED_mesh.h
source/blender/editors/include/ED_view3d.h
source/blender/editors/include/UI_icons.h
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_intern.h
source/blender/editors/interface/interface_templates.c
source/blender/editors/interface/interface_widgets.c
source/blender/editors/interface/resources.c
source/blender/editors/mesh/editbmesh_add.c
source/blender/editors/mesh/loopcut.c
source/blender/editors/mesh/mesh_data.c
source/blender/editors/mesh/mesh_intern.h
source/blender/editors/mesh/mesh_ops.c
source/blender/editors/metaball/mball_edit.c
source/blender/editors/object/object_add.c
source/blender/editors/object/object_modifier.c
source/blender/editors/object/object_relations.c
source/blender/editors/object/object_vgroup.c
source/blender/editors/physics/particle_edit.c
source/blender/editors/render/render_opengl.c
source/blender/editors/sculpt_paint/paint_image.c
source/blender/editors/space_buttons/space_buttons.c
source/blender/editors/space_file/Makefile
source/blender/editors/space_file/file_draw.c
source/blender/editors/space_image/image_ops.c
source/blender/editors/space_image/space_image.c
source/blender/editors/space_logic/logic_window.c
source/blender/editors/space_node/drawnode.c
source/blender/editors/space_outliner/outliner.c
source/blender/editors/space_time/space_time.c
source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/drawvolume.c
source/blender/editors/space_view3d/space_view3d.c
source/blender/editors/space_view3d/view3d_draw.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/editors/space_view3d/view3d_intern.h
source/blender/editors/space_view3d/view3d_view.c
source/blender/editors/transform/SConscript
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform_ops.c
source/blender/editors/util/undo.c
source/blender/gpu/intern/gpu_buffers.c
source/blender/gpu/intern/gpu_draw.c
source/blender/imbuf/intern/cineon/cineon_dpx.c
source/blender/imbuf/intern/scaling.c
source/blender/imbuf/intern/thumbs_blend.c
source/blender/makesdna/DNA_node_types.h
source/blender/makesdna/DNA_object_types.h
source/blender/makesdna/DNA_userdef_types.h
source/blender/makesdna/DNA_view3d_types.h
source/blender/makesdna/intern/SConscript
source/blender/makesdna/intern/makesdna.c
source/blender/makesrna/RNA_access.h
source/blender/makesrna/RNA_define.h
source/blender/makesrna/RNA_types.h
source/blender/makesrna/intern/SConscript
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_ID.c
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_action.c
source/blender/makesrna/intern/rna_action_api.c
source/blender/makesrna/intern/rna_animation.c
source/blender/makesrna/intern/rna_armature.c
source/blender/makesrna/intern/rna_cloth.c
source/blender/makesrna/intern/rna_color.c
source/blender/makesrna/intern/rna_constraint.c
source/blender/makesrna/intern/rna_context.c
source/blender/makesrna/intern/rna_curve.c
source/blender/makesrna/intern/rna_define.c
source/blender/makesrna/intern/rna_fcurve.c
source/blender/makesrna/intern/rna_image.c
source/blender/makesrna/intern/rna_internal.h
source/blender/makesrna/intern/rna_lamp.c
source/blender/makesrna/intern/rna_main.c
source/blender/makesrna/intern/rna_main_api.c
source/blender/makesrna/intern/rna_material.c
source/blender/makesrna/intern/rna_material_api.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_mesh_api.c
source/blender/makesrna/intern/rna_meta.c
source/blender/makesrna/intern/rna_nodetree.c
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_object_api.c
source/blender/makesrna/intern/rna_object_force.c
source/blender/makesrna/intern/rna_pose.c
source/blender/makesrna/intern/rna_render.c
source/blender/makesrna/intern/rna_rna.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_scene_api.c
source/blender/makesrna/intern/rna_sequencer.c
source/blender/makesrna/intern/rna_space.c
source/blender/makesrna/intern/rna_ui.c
source/blender/makesrna/intern/rna_ui_api.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/makesrna/intern/rna_wm.c
source/blender/makesrna/intern/rna_wm_api.c
source/blender/makesrna/intern/rna_world.c
source/blender/makesrna/rna_cleanup/rna_properties.txt
source/blender/makesrna/rna_cleanup/rna_update.sh
source/blender/modifiers/SConscript
source/blender/modifiers/intern/MOD_screw.c
source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
source/blender/nodes/intern/CMP_nodes/CMP_crop.c
source/blender/nodes/intern/CMP_nodes/CMP_displace.c
source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
source/blender/python/SConscript
source/blender/python/doc/epy/Geometry.py
source/blender/python/doc/epy/IDProp.py
source/blender/python/doc/examples/mathutils.Euler.py
source/blender/python/doc/examples/mathutils.Matrix.py
source/blender/python/doc/examples/mathutils.Quaternion.py
source/blender/python/doc/examples/mathutils.py
source/blender/python/doc/sphinx_doc_gen.py
source/blender/python/doc/sphinx_doc_gen.sh
source/blender/python/generic/CMakeLists.txt
source/blender/python/generic/IDProp.c
source/blender/python/generic/bpy_internal_import.c
source/blender/python/generic/mathutils_euler.c
source/blender/python/generic/mathutils_matrix.c
source/blender/python/generic/mathutils_vector.c
source/blender/python/generic/py_capi_utils.c
source/blender/python/generic/py_capi_utils.h
source/blender/python/intern/bpy.h
source/blender/python/intern/bpy_array.c
source/blender/python/intern/bpy_interface.c
source/blender/python/intern/bpy_operator.c
source/blender/python/intern/bpy_props.c
source/blender/python/intern/bpy_rna.c
source/blender/python/intern/bpy_rna.h
source/blender/python/intern/bpy_util.c
source/blender/python/intern/bpy_util.h
source/blender/quicktime/quicktime_import.h
source/blender/render/CMakeLists.txt
source/blender/render/intern/source/imagetexture.c
source/blender/render/intern/source/pipeline.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/WM_types.h
source/blender/windowmanager/intern/wm.c
source/blender/windowmanager/intern/wm_cursors.c
source/blender/windowmanager/intern/wm_draw.c
source/blender/windowmanager/intern/wm_event_system.c
source/blender/windowmanager/intern/wm_files.c
source/blender/windowmanager/intern/wm_keymap.c
source/blenderplayer/CMakeLists.txt
source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
source/blenderplayer/bad_level_call_stubs/SConscript
source/blenderplayer/bad_level_call_stubs/stubs.c
source/creator/CMakeLists.txt
source/creator/creator.c
source/gameengine/Converter/BL_BlenderDataConversion.cpp
source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
source/kernel/gen_system/GEN_HashedPtr.cpp

diff --cc CMakeLists.txt
index cb131c6e5e1cff978a523d48b5ff280be315f9f7,cb131c6e5e1cff978a523d48b5ff280be315f9f7..898254ef6c69e6264db2cf4f0892368b5f86c1a4
@@@ -294,9 -294,9 +294,9 @@@ IF(UNIX AND NOT APPLE
                SET(EXPAT_LIB expat)
        ENDIF (WITH_OPENCOLLADA)
  
++      FIND_PACKAGE(X11 REQUIRED)
  
--      # Could use ${X11_Xinput_LIB} ${X11_X11_LIB} too
--      SET(LLIBS "-lXi -lutil -lc -lm -lpthread -lstdc++ -lX11")
++      SET(LLIBS "-lutil -lc -lm -lpthread -lstdc++ ${X11_X11_LIB} ${X11_Xinput_LIB}")
  
        IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
                # BSD's dont use libdl.so
@@@ -415,11 -415,11 +415,19 @@@ IF(WIN32
                SET(CMAKE_CXX_FLAGS "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305" CACHE STRING "MSVC MT C++ flags " FORCE)
                SET(CMAKE_C_FLAGS   "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305" CACHE STRING "MSVC MT C++ flags " FORCE)
  
++              IF(CMAKE_CL_64)
++                      SET(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
++              ELSE(CMAKE_CL_64)
                SET(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE)
++              ENDIF(CMAKE_CL_64)
                SET(CMAKE_CXX_FLAGS_RELEASE "/O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
                SET(CMAKE_CXX_FLAGS_MINSIZEREL "/O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
                SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
++              IF(CMAKE_CL_64)
++                      SET(CMAKE_C_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
++              ELSE(CMAKE_CL_64)
                SET(CMAKE_C_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE)
++              ENDIF(CMAKE_CL_64)
                SET(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
                SET(CMAKE_C_FLAGS_MINSIZEREL "/O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE)
                SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE)
@@@ -873,7 -873,7 +881,7 @@@ ENDIF(WITH_RAYOPTIMIZATION
  IF(WITH_IMAGE_OPENJPEG)
        set(OPENJPEG ${CMAKE_SOURCE_DIR}/extern/libopenjpeg)
        set(OPENJPEG_INC ${OPENJPEG})
--      set(OPENJPEG_LIb extern_libopenjpeg)
++      set(OPENJPEG_LIb extern_openjpeg)
  ENDIF(WITH_IMAGE_OPENJPEG)
  
  #-----------------------------------------------------------------------------
diff --cc SConstruct
index 28f54252bfbaa748a319641535a50896002461c6,4715a955d7f86275e78ed6bd8689909dd71a4ea4..9a0b0bea26f7f45996fe5a7eab23568b1e8bd659
@@@ -406,12 -406,12 +406,12 @@@ thestatlibs, thelibincs = B.setup_stati
  thesyslibs = B.setup_syslibs(env)
  
  if 'blender' in B.targets or not env['WITH_BF_NOBLENDER']:
--      env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
++    env.BlenderProg(B.root_build_dir, "blender", mainlist + thestatlibs + dobj, thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
  if env['WITH_BF_PLAYER']:
        playerlist = B.create_blender_liblist(env, 'player')
        playerlist += B.create_blender_liblist(env, 'intern')
        playerlist += B.create_blender_liblist(env, 'extern')
--      env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
++    env.BlenderProg(B.root_build_dir, "blenderplayer",  playerlist, thestatlibs + dobj + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
  
  ##### Now define some targets
  
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..69f7604c8cc68065829a3d3aba3cb25b8bd2ebea
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,119 @@@
++#! /usr/bin/env python
++
++# ##### BEGIN GPL LICENSE BLOCK #####
++#
++#  This program is free software; you can redistribute it and/or
++#  modify it under the terms of the GNU General Public License
++#  as published by the Free Software Foundation; either version 2
++#  of the License, or (at your option) any later version.
++#
++#  This program is distributed in the hope that it will be useful,
++#  but WITHOUT ANY WARRANTY; without even the implied warranty of
++#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++#  GNU General Public License for more details.
++#
++#  You should have received a copy of the GNU General Public License
++#  along with this program; if not, write to the Free Software Foundation,
++#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
++#
++# ##### END GPL LICENSE BLOCK #####
++
++# <pep8 compliant>
++
++def print_help(targets):
++    print("CMake quicky wrapper, no valid targets given.")
++    print(" * targets can contain a subset of the full target name.")
++    print(" * arguments with a '-' prefix are passed onto make.")
++    print(" * this must run from the cmake build dir")
++    print(" * alias this with a short command for speedy access, in bash:")
++    print("   alias mk='../blender/build_files/cmake/example_scripts/make_quicky.py'")
++    print("")
++    print(" eg: make_quicky.py -j3 extern python")
++    print(" ...will execute")
++    print(" make -j3 extern_binreloc extern_glew bf_python bf_python_ext blender/fast")
++    print("")
++    print("Target List:")
++    for t in targets:
++        print("    %s" % t)
++    print("...exiting")
++    
++
++def main():
++    targets = set()
++    
++    # collect targets
++    file = open("Makefile", "r")
++    for line in file:
++        line = line.rstrip()
++        if not line or line[0] in ". \t@$#":
++            continue
++
++        line = line.split("#", 1)[0]
++        if ":" not in line:
++            continue
++
++        line = line.split(":", 1)[0]
++
++        if "/" in line: # cmake terget options, dont need these
++            continue
++
++        targets.add(line)
++    file.close()
++
++
++    # remove cmake targets
++    bad = set([
++        "help",
++        "clean",
++        "all",
++        "preinstall",
++        "install",
++        "default_target",
++        "edit_cache",
++        "cmake_force",
++        "rebuild_cache",
++        "depend",
++        "cmake_check_build_system",
++        ])
++        
++    targets -= set(bad)
++
++
++    # parse args
++    targets = list(targets)
++    targets.sort()
++
++    import sys
++    if len(sys.argv) == 1:
++        print_help(targets)
++        return
++
++    targets_new = []
++    args = []
++    for arg in sys.argv[1:]:
++        if arg[0] in "/-":
++            args.append(arg)
++        else:
++            found = False
++            for t in targets:
++                if arg in t and t not in targets_new:
++                    targets_new.append(t)
++                    found = True
++
++            if not found:
++                print("Error '%s' not found in...")
++                for t in targets:
++                    print("    %s" % t)
++                print("...aborting.")
++                return
++    
++    # execute
++    cmd = "make %s %s blender/fast" % (" ".join(args), " ".join(targets_new))
++    print("cmake building with targets: %s" % " ".join(targets_new))
++    print("executing: %s" % cmd)
++
++    import os
++    os.system(cmd)
++
++if __name__ == "__main__":
++    main()
index 7d66a69a2dca98b1e672eb9d7b87fcb1b768ef41,7d66a69a2dca98b1e672eb9d7b87fcb1b768ef41..5678b4bda0a51cc4ca2f92f6852f134c821e39e8
@@@ -57,7 -57,7 +57,6 @@@ BF_OPENEXR_LIB = 'Half IlmImf Iex Imat
  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 = True
  
  WITH_BF_JPEG = True
@@@ -87,7 -87,7 +86,7 @@@ BF_GETTEXT_INC = '${BF_GETTEXT}/include
  BF_GETTEXT_LIB = 'gettextlib'
  BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
  
--WITH_BF_GAMEENGINE = True
++WITH_BF_GAMEENGINE = False
  WITH_BF_PLAYER = True
  
  WITH_BF_BULLET = True
@@@ -100,7 -100,7 +99,8 @@@ BF_FREETYPE = '/usr/local
  BF_FREETYPE_INC = '${BF_FREETYPE}/include ${BF_FREETYPE}/include/freetype2'
  BF_FREETYPE_LIB = 'freetype'
  
--WITH_BF_QUICKTIME = True # -DWITH_QUICKTIME
++### XXX Find what this actually wants; it doesn't want libquicktime.
++WITH_BF_QUICKTIME = False # -DWITH_QUICKTIME
  BF_QUICKTIME = '/usr/local'
  BF_QUICKTIME_INC = '${BF_QUICKTIME}/include'
  
@@@ -195,7 -195,7 +195,7 @@@ CXX_WARN = ['-Wno-invalid-offsetof', '-
  
  ##FIX_STUBS_WARNINGS = -Wno-unused
  
--LLIBS = ['util', 'c', 'm', 'dl', 'pthread', 'stdc++']
++LLIBS = ['util', 'c', 'm', 'pthread', 'stdc++']
  ##LOPTS = --dynamic
  ##DYNLDFLAGS = -shared $(LDFLAGS)
  
index c0df29df335fa1858cfc98cb09e437e0f6be36b6,c0df29df335fa1858cfc98cb09e437e0f6be36b6..bc09e87d59f12b458bccce11d4095e8240f8df92
@@@ -57,7 -57,7 +57,6 @@@ BF_OPENEXR_LIB = 'Half IlmImf Iex Imat
  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 = True
  
  WITH_BF_JPEG = True
@@@ -87,7 -87,7 +86,7 @@@ BF_GETTEXT_INC = '${BF_GETTEXT}/include
  BF_GETTEXT_LIB = 'gettextlib'
  BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
  
--WITH_BF_GAMEENGINE = True
++WITH_BF_GAMEENGINE = False
  WITH_BF_PLAYER = True
  
  WITH_BF_BULLET = True
@@@ -100,7 -100,7 +99,8 @@@ BF_FREETYPE = '/usr/local
  BF_FREETYPE_INC = '${BF_FREETYPE}/include ${BF_FREETYPE}/include/freetype2'
  BF_FREETYPE_LIB = 'freetype'
  
--WITH_BF_QUICKTIME = True # -DWITH_QUICKTIME
++### XXX Find what this actually wants; it doesn't want libquicktime.
++WITH_BF_QUICKTIME = False # -DWITH_QUICKTIME
  BF_QUICKTIME = '/usr/local'
  BF_QUICKTIME_INC = '${BF_QUICKTIME}/include'
  
@@@ -195,7 -195,7 +195,7 @@@ CXX_WARN = ['-Wno-invalid-offsetof', '-
  
  ##FIX_STUBS_WARNINGS = -Wno-unused
  
--LLIBS = ['util', 'c', 'm', 'dl', 'pthread', 'stdc++']
++LLIBS = ['util', 'c', 'm', 'pthread', 'stdc++']
  ##LOPTS = --dynamic
  ##DYNLDFLAGS = -shared $(LDFLAGS)
  
index c344046d8cc08d1416ae754b7d845ee300b24758,c344046d8cc08d1416ae754b7d845ee300b24758..3fb4ebe7cd62f85a54184296132407dc79f821fa
@@@ -57,7 -57,7 +57,6 @@@ BF_OPENEXR_LIB = 'Half IlmImf Iex Imat
  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 = True
  
  WITH_BF_JPEG = True
@@@ -87,7 -87,7 +86,7 @@@ BF_GETTEXT_INC = '${BF_GETTEXT}/include
  BF_GETTEXT_LIB = 'gettextlib'
  BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
  
--WITH_BF_GAMEENGINE = True
++WITH_BF_GAMEENGINE = False
  WITH_BF_PLAYER = True
  
  WITH_BF_BULLET = True
@@@ -100,7 -100,7 +99,8 @@@ BF_FREETYPE = '/usr/local
  BF_FREETYPE_INC = '${BF_FREETYPE}/include ${BF_FREETYPE}/include/freetype2'
  BF_FREETYPE_LIB = 'freetype'
  
--WITH_BF_QUICKTIME = True # -DWITH_QUICKTIME
++### XXX Find what this actually wants; it doesn't want libquicktime.
++WITH_BF_QUICKTIME = False # -DWITH_QUICKTIME
  BF_QUICKTIME = '/usr/local'
  BF_QUICKTIME_INC = '${BF_QUICKTIME}/include'
  
@@@ -195,7 -195,7 +195,7 @@@ CXX_WARN = ['-Wno-invalid-offsetof', '-
  
  ##FIX_STUBS_WARNINGS = -Wno-unused
  
--LLIBS = ['util', 'c', 'm', 'dl', 'pthread', 'stdc++']
++LLIBS = ['util', 'c', 'm', 'pthread', 'stdc++']
  ##LOPTS = --dynamic
  ##DYNLDFLAGS = -shared $(LDFLAGS)
  
index 7a350a74ed5af2fa0445f9be788d8091d30c0009,7a350a74ed5af2fa0445f9be788d8091d30c0009..75428937b3980a0fdc8b5826fce955d240ec98d7
@@@ -84,6 -84,6 +84,8 @@@ BF_GETTEXT = '/usr
  BF_GETTEXT_INC = '${BF_GETTEXT}/include'
  BF_GETTEXT_LIB = 'gettextlib'
  BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
++#WITH_BF_GETTEXT_STATIC = True
++#BF_GETTEXT_LIB_STATIC = '${BF_GETTEXT}/lib/libgettextlib.a'
  
  WITH_BF_GAMEENGINE = True
  WITH_BF_PLAYER = False
@@@ -97,6 -97,6 +99,8 @@@ BF_BULLET_LIB = 'extern_bullet
  BF_FREETYPE = '/usr'
  BF_FREETYPE_INC = '${BF_FREETYPE}/include ${BF_FREETYPE}/include/freetype2'
  BF_FREETYPE_LIB = 'freetype'
++#WITH_BF_FREETYPE_STATIC = True
++#BF_FREETYPE_LIB_STATIC = '${BF_FREETYPE}/lib/libfreetype.a'
  
  WITH_BF_QUICKTIME = False # -DWITH_QUICKTIME
  BF_QUICKTIME = '/usr/local'
@@@ -116,6 -116,6 +120,8 @@@ BF_FFMPEG = '/usr
  BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice'
  BF_FFMPEG_INC = '${BF_FFMPEG}/include'
  BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib'
++#WITH_BF_STATICFFMPEG = True
++#BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libavformat.a ${BF_FFMPEG_LIBPATH/libavcodec.a ${BF_FFMPEG_LIBPATH}/libswscale.a ${BF_FFMPEG_LIBPATH}/libavutil.a ${BF_FFMPEG_LIBPATH}/libavdevice.a'
  
  # enable ogg, vorbis and theora in ffmpeg
  WITH_BF_OGG = False  # -DWITH_OGG 
index 89c4ef9cac9008ea0c375a6d609009bc74476297,89c4ef9cac9008ea0c375a6d609009bc74476297..b7804d663243c766dfb11119d296a744d7d38f01
@@@ -23,6 -23,6 +23,7 @@@ import sy
  import zipfile
  import shutil
  import cStringIO
++import platform
  
  from SCons.Script.SConscript import SConsEnvironment
  import SCons.Action
@@@ -153,8 -153,8 +154,14 @@@ def setup_staticlibs(lenv)
                libincs += Split(lenv['BF_TIFF_LIBPATH'])
        if lenv['WITH_BF_FFTW3']:
                libincs += Split(lenv['BF_FFTW3_LIBPATH'])
++    if lenv['WITH_BF_FFMPEG'] and lenv['WITH_BF_STATICFFMPEG']:
++        statlibs += Split(lenv['BF_FFMPEG_LIB_STATIC'])
        if lenv['WITH_BF_INTERNATIONAL']:
                libincs += Split(lenv['BF_GETTEXT_LIBPATH'])
++        if lenv['WITH_BF_GETTEXT_STATIC']:
++            statlibs += Split(lenv['BF_GETTEXT_LIB_STATIC'])
++        if lenv['WITH_BF_FREETYPE_STATIC']:
++            statlibs += Split(lenv['BF_FREETYPE_LIB_STATIC'])
        if lenv['WITH_BF_OPENAL']:
                libincs += Split(lenv['BF_OPENAL_LIBPATH'])
                if lenv['WITH_BF_STATICOPENAL']:
@@@ -195,13 -195,13 +202,14 @@@ def setup_syslibs(lenv)
                lenv['BF_LIBSAMPLERATE_LIB']
                ]
  
++    if not lenv['WITH_BF_FREETYPE_STATIC']:
        syslibs += Split(lenv['BF_FREETYPE_LIB'])
        if lenv['WITH_BF_PYTHON'] and not lenv['WITH_BF_STATICPYTHON']:
                if lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
                        syslibs.append(lenv['BF_PYTHON_LIB']+'_d')
                else:
                        syslibs.append(lenv['BF_PYTHON_LIB'])
--      if lenv['WITH_BF_INTERNATIONAL']:
++    if lenv['WITH_BF_INTERNATIONAL'] and not lenv['WITH_BF_GETTEXT_STATIC']:
                syslibs += Split(lenv['BF_GETTEXT_LIB'])
        if lenv['WITH_BF_OPENAL']:
                if not lenv['WITH_BF_STATICOPENAL']:
                        syslibs += Split(lenv['BF_OPENEXR_LIB'])
        if lenv['WITH_BF_TIFF']:
                        syslibs += Split(lenv['BF_TIFF_LIB'])
--      if lenv['WITH_BF_FFMPEG']:
++    if lenv['WITH_BF_FFMPEG'] and not lenv['WITH_BF_STATICFFMPEG']:
                syslibs += Split(lenv['BF_FFMPEG_LIB'])
                if lenv['WITH_BF_OGG']:
                        syslibs += Split(lenv['BF_OGG_LIB'])
@@@ -269,15 -269,15 +277,21 @@@ def buildinfo(lenv, build_type)
        build_date = time.strftime ("%Y-%m-%d")
        build_time = time.strftime ("%H:%M:%S")
        build_rev = os.popen('svnversion').read()[:-1] # remove \n
++    if build_rev == '': 
++        build_rev = '<UNKNOWN>'
++    if lenv['BF_DEBUG']:
++        build_type = "Debug"
++    else:
++        build_type = "Release"
  
        obj = []
        if lenv['BF_BUILDINFO']:
--              lenv.Append (CPPDEFINES = ['BUILD_TIME=\'"%s"\''%(build_time),
--                                                                      'BUILD_DATE=\'"%s"\''%(build_date),
--                                                                      'BUILD_TYPE=\'"dynamic"\'',
--                                                                      'BUILD_REV=\'"%s"\''%(build_rev),
++        lenv.Append (CPPDEFINES = ['BUILD_TIME="%s"'%(build_time),
++                                    'BUILD_DATE="%s"'%(build_date),
++                                    'BUILD_TYPE="%s"'%(build_type),
++                                    'BUILD_REV="%s"'%(build_rev),
                                                                        'NAN_BUILDINFO',
--                                                                      'BUILD_PLATFORM=\'"%s"\''%(sys.platform)])
++                                  'BUILD_PLATFORM="%s:%s"'%(platform.system(), platform.architecture()[0])])
                obj = [lenv.Object (root_build_dir+'source/creator/%s_buildinfo'%build_type,
                                                [root_build_dir+'source/creator/buildinfo.c'])]
        return obj
@@@ -463,6 -463,6 +477,9 @@@ def WinPyBundle(target=None, source=Non
        py_zip= env.subst( env['LCGDIR'] )
        if py_zip[0]=='#':
                py_zip= py_zip[1:]
++    if env['BF_DEBUG']:
++        py_zip+= '/release/python' + env['BF_PYTHON_VERSION'].replace('.','') + '_d.zip'
++    else:
        py_zip+= '/release/python' + env['BF_PYTHON_VERSION'].replace('.','') + '.zip'
  
        py_target = env.subst( env['BF_INSTALLDIR'] )
@@@ -722,7 -722,7 +739,7 @@@ class BlenderEnvironment(SConsEnvironme
                # note: libs is a global
                add_lib_to_dict(self, libs, libtype, libname, priority)
  
--      def BlenderProg(self=None, builddir=None, progname=None, sources=None, includes=None, libs=None, libpath=None, binarykind=''):
++    def BlenderProg(self=None, builddir=None, progname=None, sources=None, libs=None, libpath=None, binarykind=''):
                global vcp
                print bc.HEADER+'Configuring program '+bc.ENDC+bc.OKGREEN+progname+bc.ENDC
                lenv = self.Clone()
                        lenv.Append(LINKFLAGS = lenv['BF_OPENGL_LINKFLAGS'])
                if lenv['BF_PROFILE']:
                        lenv.Append(LINKFLAGS = lenv['BF_PROFILE_LINKFLAGS'])
--              lenv.Append(CPPPATH=includes)
                if root_build_dir[0]==os.sep or root_build_dir[1]==':':
                        lenv.Append(LIBPATH=root_build_dir + '/lib')
                lenv.Append(LIBPATH=libpath)
index c930c150cb6f8af29a9916615b18ea20e8c01c26,c930c150cb6f8af29a9916615b18ea20e8c01c26..894a32c14a133e903e9bd58cd0fa529e3f0cbb74
@@@ -38,6 -38,6 +38,7 @@@ def validate_arguments(args, bc)
              'WITH_BF_OPENEXR', 'BF_OPENEXR', 'BF_OPENEXR_INC', 'BF_OPENEXR_LIB', 'BF_OPENEXR_LIBPATH', 'WITH_BF_STATICOPENEXR', 'BF_OPENEXR_LIB_STATIC',
              'WITH_BF_DDS', 'WITH_BF_CINEON', 'WITH_BF_HDR',
              'WITH_BF_FFMPEG', 'BF_FFMPEG_LIB','BF_FFMPEG_EXTRA', 'BF_FFMPEG',  'BF_FFMPEG_INC',
++            'WITH_BF_STATICFFMPEG', 'BF_FFMPEG_LIB_STATIC',
              'WITH_BF_OGG', 'BF_OGG', 'BF_OGG_LIB',
              'WITH_BF_JPEG', 'BF_JPEG', 'BF_JPEG_INC', 'BF_JPEG_LIB', 'BF_JPEG_LIBPATH',
              'WITH_BF_OPENJPEG', 'BF_OPENJPEG', 'BF_OPENJPEG_INC', 'BF_OPENJPEG_LIB', 'BF_OPENJPEG_LIBPATH',
              'WITH_BF_TIFF', 'BF_TIFF', 'BF_TIFF_INC', 'BF_TIFF_LIB', 'BF_TIFF_LIBPATH',
              'WITH_BF_ZLIB', 'BF_ZLIB', 'BF_ZLIB_INC', 'BF_ZLIB_LIB', 'BF_ZLIB_LIBPATH',
              'WITH_BF_INTERNATIONAL',
--            'BF_GETTEXT', 'BF_GETTEXT_INC', 'BF_GETTEXT_LIB', 'BF_GETTEXT_LIBPATH',
++            'BF_GETTEXT', 'BF_GETTEXT_INC', 'BF_GETTEXT_LIB', 'WITH_BF_GETTEXT_STATIC', 'BF_GETTEXT_LIB_STATIC', 'BF_GETTEXT_LIBPATH',
              'WITH_BF_ICONV', 'BF_ICONV', 'BF_ICONV_INC', 'BF_ICONV_LIB', 'BF_ICONV_LIBPATH',
              'WITH_BF_GAMEENGINE', 'WITH_BF_BULLET', 'BF_BULLET', 'BF_BULLET_INC', 'BF_BULLET_LIB',
              'BF_WINTAB', 'BF_WINTAB_INC',
--            'WITH_BF_FREETYPE', 'BF_FREETYPE', 'BF_FREETYPE_INC', 'BF_FREETYPE_LIB', 'BF_FREETYPE_LIBPATH',
++            'WITH_BF_FREETYPE', 'BF_FREETYPE', 'BF_FREETYPE_INC', 'BF_FREETYPE_LIB', 'BF_FREETYPE_LIBPATH', 'BF_FREETYPE_LIB_STATIC', 'WITH_BF_FREETYPE_STATIC',
              'WITH_BF_QUICKTIME', 'BF_QUICKTIME', 'BF_QUICKTIME_INC', 'BF_QUICKTIME_LIB', 'BF_QUICKTIME_LIBPATH',
              'WITH_BF_FFTW3', 'BF_FFTW3', 'BF_FFTW3_INC', 'BF_FFTW3_LIB', 'BF_FFTW3_LIBPATH',
              'WITH_BF_STATICOPENGL', 'BF_OPENGL', 'BF_OPENGL_INC', 'BF_OPENGL_LIB', 'BF_OPENGL_LIBPATH', 'BF_OPENGL_LIB_STATIC',
@@@ -236,6 -236,6 +237,8 @@@ def read_opts(env, cfg, args)
  
          ('BF_FFMPEG_INC', 'FFMPEG includes', ''),
          ('BF_FFMPEG_LIBPATH', 'FFMPEG library path', ''),
++        (BoolVariable('WITH_BF_STATICFFMPEG', 'Use static FFMPEG if true', False)),
++        ('BF_FFMPEG_LIB_STATIC', 'Static FFMPEG libraries', ''),
          
          (BoolVariable('WITH_BF_OGG', 'Use OGG, THEORA, VORBIS in FFMPEG if true',
                      False)),
          ('BF_GETTEXT', 'gettext base path', ''),
          ('BF_GETTEXT_INC', 'gettext include path', ''),
          ('BF_GETTEXT_LIB', 'gettext library', ''),
++        (BoolVariable('WITH_BF_GETTEXT_STATIC', 'Use static gettext library if true', False)),
++        ('BF_GETTEXT_LIB_STATIC', 'static gettext library', ''),
          ('BF_GETTEXT_LIBPATH', 'gettext library path', ''),
          
          (BoolVariable('WITH_BF_ICONV', 'Use iconv if true', True)),
          ('BF_CXX', 'c++ base path for libstdc++, only used when static linking', ''),
          (BoolVariable('WITH_BF_STATICCXX', 'static link to stdc++', False)),
          ('BF_CXX_LIB_STATIC', 'static library path for stdc++', ''),
--##
--##WITH_BF_NSPR = True
--##BF_NSPR = $(LCGDIR)/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 = $(LCGDIR)/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
++
          (BoolVariable('WITH_BF_FREETYPE', 'Use FreeType2 if true', True)),
          ('BF_FREETYPE', 'Freetype base path', ''),
          ('BF_FREETYPE_INC', 'Freetype include path', ''),
          ('BF_FREETYPE_LIB', 'Freetype library', ''),
          ('BF_FREETYPE_LIBPATH', 'Freetype library path', ''),
++        (BoolVariable('WITH_BF_FREETYPE_STATIC', 'Use Static Freetype if true', False)),
++        ('BF_FREETYPE_LIB_STATIC', 'Static Freetype library', ''),
  
          (BoolVariable('WITH_BF_OPENMP', 'Use OpenMP if true', False)),
          ('BF_OPENMP', 'Base path to OpenMP (used when cross-compiling with older versions of WinGW)', ''),
index 2ba19e96ec30f6cddabdaa3b0a972d3d5ed8f8af,2ba19e96ec30f6cddabdaa3b0a972d3d5ed8f8af..3f079767198f8c81a6a6bdb891726d993621b640
@@@ -32,4 -32,4 +32,4 @@@ license@blender.org for further informa
  
  Ton Roosendaal
  Chairman Blender Foundation.
--June 2005
++June 2005
index 181ed152081618067aab51aaa3417b1e0ebe859f,181ed152081618067aab51aaa3417b1e0ebe859f..41aad8b7264d5fa5f6041de163537ce08d1cd14c
@@@ -1390,4 -1390,4 +1390,4 @@@ Radoslav Dejanovi
  James H. Cloos, Jr. 
  Karl Erlandsen (LethalSideParting)
  Kari Pulli
--Dave Shemano
++Dave Shemano
index 2b06736776769ff4daf7fdc1fc7024c5818243c8,2b06736776769ff4daf7fdc1fc7024c5818243c8..7b45fad12dfd29a6f9f2047b6e66fcd0e5f1ad67
@@@ -24,12 -24,12 +24,13 @@@ btConvexHullShape ::btConvexHullShape (
        m_shapeType = CONVEX_HULL_SHAPE_PROXYTYPE;
        m_unscaledPoints.resize(numPoints);
  
--      unsigned char* pointsBaseAddress = (unsigned char*)points;
++      unsigned char* pointsAddress = (unsigned char*)points;
  
        for (int i=0;i<numPoints;i++)
        {
--              btVector3* point = (btVector3*)(pointsBaseAddress + i*stride);
--              m_unscaledPoints[i] = point[0];
++              btScalar* point = (btScalar*)pointsAddress;
++              m_unscaledPoints[i] = btVector3(point[0], point[1], point[2]);
++              pointsAddress += stride;
        }
  
        recalcLocalAabb();
index 0a985aceb37b56a88928b3637c7c7cb5bb684332,0a985aceb37b56a88928b3637c7c7cb5bb684332..d7b25ed141282ffe02cfae6559b00a40be577266
@@@ -28,5 -28,5 +28,5 @@@ SET(INC . src
  
  FILE(GLOB SRC *.c except t1_generate_luts.c)
  ADD_DEFINITIONS(-DWITH_OPENJPEG)
--BLENDERLIB(extern_libopenjpeg "${SRC}" "${INC}")
++BLENDERLIB(extern_openjpeg "${SRC}" "${INC}")
  #, libtype=['international','player'], priority=[5, 210])
index 235cd8c7f8e2dca4ac402d426e1b0771eacb56ac,235cd8c7f8e2dca4ac402d426e1b0771eacb56ac..15aa5264e37be13b9319a0199be78d8906e72db5
@@@ -28,7 -28,7 +28,4 @@@ SET(INC . 
  
  FILE(GLOB SRC ./*.c)
  
--
--
--BLENDERLIB(bf_lzma "${SRC}" "${INC}")
--#, libtype='blender', priority = 0 )
++BLENDERLIB(extern_lzma "${SRC}" "${INC}")
index 015cdfe339f689527d01cdfd6ed76e8d9b2a0150,015cdfe339f689527d01cdfd6ed76e8d9b2a0150..d0cfed87cb6802cda2160c751f3e57f3f4b91eb5
@@@ -6,4 -6,4 +6,4 @@@ sources = env.Glob('./*.c'
  defs = ''
  incs = ' . ' 
  
--env.BlenderLib ('bf_lzma', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
++env.BlenderLib ('extern_lzma', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
index b640cf658da34f160492318ee389240ae6cc5a96,b640cf658da34f160492318ee389240ae6cc5a96..8bc887c923e620f9e1d4021f2d38a422ad735007
@@@ -30,5 -30,5 +30,5 @@@ FILE(GLOB SRC minilzo/*.c
  
  
  
--BLENDERLIB(bf_minilzo "${SRC}" "${INC}")
++BLENDERLIB(extern_minilzo "${SRC}" "${INC}")
  #, libtype='blender', priority = 0 )
index 81bedad25d8c106619269ac3696f74b728651a36,81bedad25d8c106619269ac3696f74b728651a36..a87034d197abda0cfd222ab0bcc6ec6ead1f17b9
@@@ -6,4 -6,4 +6,4 @@@ sources = env.Glob('minilzo/*.c'
  defs = ''
  incs = ' include ' 
  
--env.BlenderLib ('bf_minilzo', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
++env.BlenderLib ('extern_minilzo', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
index e06b19a5d39e55e361fdc5869cae6b81cabfa640,e06b19a5d39e55e361fdc5869cae6b81cabfa640..99923bc99dc21ae3476b7ec071f55f8418f3c7a7
@@@ -28,5 -28,5 +28,5 @@@ SET(INC . intern extern ../moto/includ
  
  FILE(GLOB SRC intern/*.cpp)
  
--BLENDERLIB(blender_bop "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_bop "${SRC}" "${INC}")
  #, libtype='common', priority=5 )
index 6a85b2d69bea34515e4407f3e4987958606964e7,6a85b2d69bea34515e4407f3e4987958606964e7..5cf32862f968b077d889d56e8358da5758e5db16
@@@ -8,7 -8,7 +8,7 @@@ incs += ' ../../source/blender/makesdn
  incs += ' ../../source/blender/blenlib'
  
  if (env['OURPLATFORM'] == 'win32-mingw'):
--    env.BlenderLib ('blender_bop', sources, Split(incs) , [], libtype='intern', priority = 5 )
++    env.BlenderLib ('bf_intern_bop', sources, Split(incs) , [], libtype='intern', priority = 5 )
  else:
--    env.BlenderLib ('blender_bop', sources, Split(incs) , [], libtype='intern', priority = 5 )
++    env.BlenderLib ('bf_intern_bop', sources, Split(incs) , [], libtype='intern', priority = 5 )
  
index c95752ed5edda37ccc3cb468e851209902e87839,c95752ed5edda37ccc3cb468e851209902e87839..4f87e161030005a27a5401edfd0147f0e12df072
@@@ -28,5 -28,5 +28,5 @@@ SET(INC intern ../container ../moto/inc
  
  FILE(GLOB SRC intern/*.cpp)
  
--BLENDERLIB(blender_BSP "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_bsp "${SRC}" "${INC}")
  #, libtype='core', priority=15 )
index ff5a213d7b80bfe7617aebbdf0b64b2f1aeca256,ff5a213d7b80bfe7617aebbdf0b64b2f1aeca256..705c31193f369bddf5ae0a4b61ce5076fb9c582b
@@@ -5,5 -5,5 +5,5 @@@ sources = env.Glob('intern/*.cpp'
  
  incs = 'intern ../container ../moto/include ../memutil'
  
--env.BlenderLib ('blender_BSP', sources, Split(incs), [], libtype='core', priority=200 )
++env.BlenderLib ('bf_intern_bsp', sources, Split(incs), [], libtype='core', priority=200 )
  
index 5835d561abde743524fd426e488fe864039de263,5835d561abde743524fd426e488fe864039de263..462b62ae8bb85fc9a0d7cd87b4ded21eb734da3e
@@@ -28,5 -28,5 +28,5 @@@ SET(INC .
  
  FILE(GLOB SRC intern/*.cpp)
  
--BLENDERLIB(blender_CTR "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_ctr "${SRC}" "${INC}")
  #, libtype=['intern'], priority = 10 )
index d05104da562fc688a0c2955fcfd54afb7ef4de09,d05104da562fc688a0c2955fcfd54afb7ef4de09..2d93e90b555df5aee467d741fd90366b16e0d940
@@@ -4,4 -4,4 +4,4 @@@ Import ('env'
  sources = env.Glob('intern/*.cpp')
  incs = '.'
  
--env.BlenderLib ('blender_CTR', sources, Split(incs) , [], libtype='intern', priority = 10 )
++env.BlenderLib ('bf_intern_ctr', sources, Split(incs) , [], libtype='intern', priority = 10 )
index e7aff161692f924451064ac5c46562978e1b0b48,e7aff161692f924451064ac5c46562978e1b0b48..7fdf08978a4057ec4fe0b2f0d1e22e6eaeb26e4b
@@@ -28,5 -28,5 +28,5 @@@ SET(INC . ../moto/include ../container 
  
  FILE(GLOB SRC intern/*.cpp)
  
--BLENDERLIB(bf_decimation "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_decimate "${SRC}" "${INC}")
  #, libtype=['core','common','player'], priority = [10, 20, 25] )
index 2dd86c44cf1b60620c9426d87d707e9389fa2110,2dd86c44cf1b60620c9426d87d707e9389fa2110..2fc7781bd596a0319985482d62f448af8719d05e
@@@ -5,4 -5,4 +5,4 @@@ sources = env.Glob('intern/*.cpp'
  
  incs = '. ../moto/include ../container ../memutil'
  
--env.BlenderLib ('bf_decimation', sources, Split(incs) , [], libtype=['core'], priority = [200] )
++env.BlenderLib ('bf_intern_decimate', sources, Split(incs) , [], libtype=['core'], priority = [200] )
index e45a210bd88ab697c142104ee11927334e3a8a37,e45a210bd88ab697c142104ee11927334e3a8a37..d0e100907b18d6fcac53ae6e70b8b73a1cf31e86
@@@ -37,5 -37,5 +37,5 @@@ IF(WITH_OPENMP
                ADD_DEFINITIONS(-DPARALLEL=1)
  ENDIF(WITH_OPENMP)
  
--BLENDERLIB_NOLIST(bf_elbeem "${SRC}" "${INC}")
++BLENDERLIB_NOLIST(bf_intern_elbeem "${SRC}" "${INC}")
  #, libtype='blender', priority=0 )
index f0417f7400162358f3dba66db145dacd50f093e3,f0417f7400162358f3dba66db145dacd50f093e3..9c035c0c2852509b06493b2f0559007d83fc1bdc
@@@ -19,4 -19,4 +19,4 @@@ if env['OURPLATFORM'] in ('win32-vc', '
  incs += ' ' + env['BF_PNG_INC'] + ' ' + env['BF_ZLIB_INC'] 
  incs += ' extern '
  
--env.BlenderLib ('bf_elbeem', sources, Split(incs), Split(defs), libtype='intern', priority=0 )
++env.BlenderLib ('bf_intern_elbeem', sources, Split(incs), Split(defs), libtype='intern', priority=0 )
index c262ea8aadde3ee70d1895c0e3135b728b65a4d5,c262ea8aadde3ee70d1895c0e3135b728b65a4d5..c6ffd4b19139b1bfebd32e6f7d56570a3729e892
@@@ -90,5 -90,5 +90,5 @@@ ELSEIF(UNIX
  
  ENDIF(APPLE)
  
--BLENDERLIB(bf_ghost "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_ghost "${SRC}" "${INC}")
  
index 9ecd61857cef66e7a0ede99b0307ec9f9d85c2f4,9ecd61857cef66e7a0ede99b0307ec9f9d85c2f4..8af1926efc8f99d2f4d4e70ed7de2e7212cecf5a
@@@ -60,4 -60,4 +60,4 @@@ if env['BF_GHOST_DEBUG']
  incs = '. ../string #extern/glew/include #source/blender/imbuf #source/blender/makesdna ' + env['BF_OPENGL_INC']
  if window_system in ('win32-vc', 'win32-mingw', 'cygwin', 'linuxcross', 'win64-vc'):
        incs = env['BF_WINTAB_INC'] + ' ' + incs
--env.BlenderLib ('bf_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15] ) 
++env.BlenderLib ('bf_intern_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15] ) 
index 1ac357ac97f235a19dc6536555193566c96125a9,1ac357ac97f235a19dc6536555193566c96125a9..aa932663e16326720a23beafeb19bcd5a964b0b3
@@@ -212,4 -212,4 +212,4 @@@ bool GHOST_WindowManager::getAnyModifie
        }
  
        return isAnyModified;
--}
++}
index 21f43b7320e63b191b9e57eb7ce5278c0fb388f8,21f43b7320e63b191b9e57eb7ce5278c0fb388f8..642b04fdb60fafeb33cf60940fb8f97aadbc6990
@@@ -28,10 -28,10 +28,10 @@@ SET(INC .
  
  FILE(GLOB SRC intern/*.c)
  
--BLENDERLIB(bf_guardedalloc "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_guardedalloc "${SRC}" "${INC}")
  
  # Override C++ alloc optional
  IF(WITH_CXX_GUARDEDALLOC)
        FILE(GLOB SRC cpp/*.cpp)
--      BLENDERLIB(bf_guardedalloc_cpp "${SRC}" "${INC}")
++      BLENDERLIB(bf_intern_guardedalloc_cpp "${SRC}" "${INC}")
  ENDIF(WITH_CXX_GUARDEDALLOC)
index 2ee0f84b464ec573675bdcc10b83bdf64013e85a,2ee0f84b464ec573675bdcc10b83bdf64013e85a..0c9c7d136080ac57df574e94c733578e875e99c3
@@@ -5,4 -5,4 +5,4 @@@ Import('env'
  sources = env.Glob('intern/*.c')
  incs = '.'
  
--env.BlenderLib ('bf_guardedalloc', sources, Split(incs), defines=[], libtype=['intern','player'], priority = [5,150] )
++env.BlenderLib ('bf_intern_guardedalloc', sources, Split(incs), defines=[], libtype=['intern','player'], priority = [5,150] )
index 3c345ae7e6a6e6054cad4f28f7f99120737200e8,3c345ae7e6a6e6054cad4f28f7f99120737200e8..8ea05ac994dc0e75877a54598efadbdc5767d656
@@@ -28,5 -28,5 +28,5 @@@ SET(INC intern ../moto/include ../memut
  
  FILE(GLOB SRC intern/*.cpp)
  
--BLENDERLIB(bf_IK "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_ik "${SRC}" "${INC}")
  #, libtype=['blender'], priority = [10] )
index 7adb2d5089362a784c0de45d01cda59a0c2e62ed,7adb2d5089362a784c0de45d01cda59a0c2e62ed..bdf7cd350ffc513e4ee0b9586ec6a483990c9f71
@@@ -5,5 -5,5 +5,5 @@@ sources = env.Glob('intern/*.cpp'
  
  incs = 'intern ../moto/include ../memutil'
  
--env.BlenderLib ('bf_IK', sources, Split(incs), [], libtype=['intern','player'], priority=[100,90] )
++env.BlenderLib ('bf_intern_ik', sources, Split(incs), [], libtype=['intern','player'], priority=[100,90] )
  
index 7b442446d624b4bba04468454e6a3c859fd65f42,7b442446d624b4bba04468454e6a3c859fd65f42..39443bd2b22921c5dd386f141289e7a30f2495f2
@@@ -28,5 -28,5 +28,5 @@@ SET(INC ../../extern/Eigen2
  
  FILE(GLOB SRC *.cpp kdl/*.cpp kdl/utilities/*.cpp)
  
--BLENDERLIB(bf_ITASC "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_itasc "${SRC}" "${INC}")
  #, libtype=['blender'], priority = [10] )
index 9e11b6c7119869543f3918ec92e12a0323339fab,9e11b6c7119869543f3918ec92e12a0323339fab..5fa4246d711b2aa1692db9c3d96ded64d396986b
@@@ -7,5 -7,5 +7,5 @@@ sources += env.Glob('kdl/utilities/*.cp
  
  incs = '. ../../extern/Eigen2'
  
--env.BlenderLib ('bf_ITASC', sources, Split(incs), [], libtype=['intern','player'], priority=[20,100] )
++env.BlenderLib ('bf_intern_itasc', sources, Split(incs), [], libtype=['intern','player'], priority=[20,100] )
  
index 51391bd3006168666d18c81213171b08189b61d7,51391bd3006168666d18c81213171b08189b61d7..3dc725acb506db8fbd9fa1c627e05d2fe93be43a
@@@ -28,5 -28,5 +28,5 @@@ SET(INC . ..
  
  FILE(GLOB SRC intern/*.cpp)
  
--BLENDERLIB(bf_memutil "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_memutil "${SRC}" "${INC}")
  #, libtype=['intern', 'player'], priority = [0, 180] )
index 318d4a3997ebd03ee9626ad177e43c67ec04b979,318d4a3997ebd03ee9626ad177e43c67ec04b979..c9a0398261580ffe254d021dabeacb4320fdee0b
@@@ -5,4 -5,4 +5,4 @@@ sources = env.Glob('intern/*.cpp'
  
  incs = '. ..'
  
--env.BlenderLib ('bf_memutil', sources, Split(incs), [], libtype=['intern','player'], priority = [0,155] )
++env.BlenderLib ('bf_intern_memutil', sources, Split(incs), [], libtype=['intern','player'], priority = [0,155] )
index a5ed0f729de313048496eed67398d5df518a71db,a5ed0f729de313048496eed67398d5df518a71db..3d6d3d1a783486b168df600de3e33bdd46f830e7
@@@ -28,5 -28,5 +28,5 @@@ SET(INC include
  
  FILE(GLOB SRC intern/*.cpp)
  
--BLENDERLIB(bf_moto "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_moto "${SRC}" "${INC}")
  #, libtype=['intern','game','game2','player'], priority = [15, 55, 100, 135] )
index d9bbafe4623e0b3b30108a1a379cb5cbc4f4e09a,d9bbafe4623e0b3b30108a1a379cb5cbc4f4e09a..ba257a33b142769f9119649a2ecc991ea60ea3eb
@@@ -5,4 -5,4 +5,4 @@@ sources = env.Glob('intern/*.cpp'
  
  incs = 'include'
  
--env.BlenderLib ('bf_moto', sources, Split(incs), [], libtype=['intern','player'], priority = [130,95] )
++env.BlenderLib ('bf_intern_moto', sources, Split(incs), [], libtype=['intern','player'], priority = [130,95] )
index d76abe12a00ee915505afcb47bce98b68396a2b2,d76abe12a00ee915505afcb47bce98b68396a2b2..0551c94e586c0c2650c4a49ef8ec98a8fc322b83
@@@ -28,6 -28,6 +28,6 @@@ SET(INC extern superlu
  
  FILE(GLOB SRC intern/*.c superlu/*.c)
  
--BLENDERLIB(blender_ONL "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_opennl "${SRC}" "${INC}")
  #, libtype='core', priority=55 )
  
index f68810d2f1665f78b5d391516e07b267c13eba3b,f68810d2f1665f78b5d391516e07b267c13eba3b..ff66b4ad6e15eda4a399f4c6376d99c236a0143a
@@@ -6,7 -6,7 +6,7 @@@ sources = env.Glob('intern/*.c') + env.
  incs = 'extern superlu'
  
  if (env['OURPLATFORM'] == 'win32-mingw'):
--    env.BlenderLib ('blender_ONL', sources, Split(incs), [], libtype=['core','intern'], priority=[1,80] )
++    env.BlenderLib ('bf_intern_opennl', sources, Split(incs), [], libtype=['core','intern'], priority=[1,80] )
  else:
--    env.BlenderLib ('blender_ONL', sources, Split(incs), [], libtype=['core'], priority=[55] )
++    env.BlenderLib ('bf_intern_opennl', sources, Split(incs), [], libtype=['core'], priority=[55] )
  
index 8579c76b3224f57704942cdd594f0ec1839e0ddc,8579c76b3224f57704942cdd594f0ec1839e0ddc..f099efd2bb8b20852eb75e7022a6a9c84fd64dea
@@@ -38,5 -38,5 +38,5 @@@ IF(WITH_FFTW3
  ENDIF(WITH_FFTW3)
  
  
--BLENDERLIB(bf_smoke "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_smoke "${SRC}" "${INC}")
  #, libtype='blender', priority = 0 )
index 2fc8798fc789b019933cf2dcbbe25210fc89b918,2fc8798fc789b019933cf2dcbbe25210fc89b918..fa32c5f36c3a04526a183960e1105fd7985d892b
@@@ -19,4 -19,4 +19,4 @@@ if env['WITH_BF_FFTW3']
      defs += ' FFTW3=1'
      incs += env['BF_FFTW3_INC'] 
  
--env.BlenderLib ('bf_smoke', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
++env.BlenderLib ('bf_intern_smoke', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
index c726f7483e55b0fb6f0c83e72c2d85f5c8367b3c,c726f7483e55b0fb6f0c83e72c2d85f5c8367b3c..7aeace4ca836613275e642f7146e1bd281a424b4
@@@ -28,5 -28,5 +28,5 @@@ SET(INC .
  
  FILE(GLOB SRC intern/*.cpp)
  
--BLENDERLIB(bf_string "${SRC}" "${INC}")
++BLENDERLIB(bf_intern_string "${SRC}" "${INC}")
  #, libtype=['core', 'player'], priority = [30,10] )
index 4aca220183c285765e001cb85014fa9324c381ee,4aca220183c285765e001cb85014fa9324c381ee..f8342bf12c2679a9e803a0eb3ea7ebfcc18c5d15
@@@ -4,4 -4,4 +4,4 @@@ Import ('env'
  sources = env.Glob('intern/*.cpp')
  incs = '.'
  
--env.BlenderLib ('bf_string', sources, Split(incs), [], libtype=['intern','player'], priority = [50,10] )
++env.BlenderLib ('bf_intern_string', sources, Split(incs), [], libtype=['intern','player'], priority = [50,10] )
diff --cc release/scripts/io/export_ply.py
index 1a4fd7a6ff99f366635a678b1838eddf6a1ff02d,1a4fd7a6ff99f366635a678b1838eddf6a1ff02d..0000000000000000000000000000000000000000
deleted file mode 100644,100644
+++ /dev/null
@@@ -1,327 -1,327 +1,0 @@@
--# ##### BEGIN GPL LICENSE BLOCK #####
--#
--#  This program is free software; you can redistribute it and/or
--#  modify it under the terms of the GNU General Public License
--#  as published by the Free Software Foundation; either version 2
--#  of the License, or (at your option) any later version.
--#
--#  This program is distributed in the hope that it will be useful,
--#  but WITHOUT ANY WARRANTY; without even the implied warranty of
--#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--#  GNU General Public License for more details.
--#
--#  You should have received a copy of the GNU General Public License
--#  along with this program; if not, write to the Free Software Foundation,
--#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
--#
--# ##### END GPL LICENSE BLOCK #####
--
--# <pep8 compliant>
--
--import bpy
--
--__author__ = "Bruce Merry"
--__version__ = "0.93"
--__bpydoc__ = """\
--This script exports Stanford PLY files from Blender. It supports normals,
--colours, and texture coordinates per face or per vertex.
--Only one mesh can be exported at a time.
--"""
--
--# Copyright (C) 2004, 2005: Bruce Merry, bmerry@cs.uct.ac.za
--#
--# This program is free software; you can redistribute it and/or
--# modify it under the terms of the GNU General Public License
--# as published by the Free Software Foundation; either version 2
--# of the License, or (at your option) any later version.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, write to the Free Software Foundation,
--# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
--# Vector rounding se we can use as keys
--#
--# Updated on Aug 11, 2008 by Campbell Barton
--#    - added 'comment' prefix to comments - Needed to comply with the PLY spec.
--#
--# Updated on Jan 1, 2007 by Gabe Ghearing
--#    - fixed normals so they are correctly smooth/flat
--#    - fixed crash when the model doesn't have uv coords or vertex colors
--#    - fixed crash when the model has vertex colors but doesn't have uv coords
--#    - changed float32 to float and uint8 to uchar for compatibility
--# Errata/Notes as of Jan 1, 2007
--#    - script exports texture coords if they exist even if TexFace isn't selected (not a big deal to me)
--#    - ST(R) should probably be renamed UV(T) like in most PLY files (importer needs to be updated to take either)
--#
--# Updated on Jan 3, 2007 by Gabe Ghearing
--#    - fixed "sticky" vertex UV exporting
--#    - added pupmenu to enable/disable exporting normals, uv coords, and colors
--# Errata/Notes as of Jan 3, 2007
--#    - ST(R) coords should probably be renamed UV(T) like in most PLY files (importer needs to be updated to take either)
--#    - edges should be exported since PLY files support them
--#    - code is getting spaghettish, it should be refactored...
--#
--
--
--def rvec3d(v):
--    return round(v[0], 6), round(v[1], 6), round(v[2], 6)
--
--
--def rvec2d(v):
--    return round(v[0], 6), round(v[1], 6)
--
--
--def write(filename, scene, ob, \
--        EXPORT_APPLY_MODIFIERS=True,\
--        EXPORT_NORMALS=True,\
--        EXPORT_UV=True,\
--        EXPORT_COLORS=True):
--
--    if not filename.lower().endswith('.ply'):
--        filename += '.ply'
--
--    if not ob:
--        raise Exception("Error, Select 1 active object")
--        return
--
--    file = open(filename, 'w')
--
--
--    #EXPORT_EDGES = Draw.Create(0)
--    """
--    is_editmode = Blender.Window.EditMode()
--    if is_editmode:
--        Blender.Window.EditMode(0, '', 0)
--
--    Window.WaitCursor(1)
--    """
--    if scene.objects.active:
--        bpy.ops.object.mode_set(mode='OBJECT')
--
--    #mesh = BPyMesh.getMeshFromObject(ob, None, EXPORT_APPLY_MODIFIERS, False, scn) # XXX
--    if EXPORT_APPLY_MODIFIERS:
--        mesh = ob.create_mesh(scene, True, 'PREVIEW')
--    else:
--        mesh = ob.data
--
--    if not mesh:
--        raise ("Error, could not get mesh data from active object")
--        return
--
--    # mesh.transform(ob.matrix_world) # XXX
--
--    faceUV = (len(mesh.uv_textures) > 0)
--    vertexUV = (len(mesh.sticky) > 0)
--    vertexColors = len(mesh.vertex_colors) > 0
--
--    if (not faceUV) and (not vertexUV):
--        EXPORT_UV = False
--    if not vertexColors:
--        EXPORT_COLORS = False
--
--    if not EXPORT_UV:
--        faceUV = vertexUV = False
--    if not EXPORT_COLORS:
--        vertexColors = False
--
--    if faceUV:
--        active_uv_layer = mesh.active_uv_texture
--        if not active_uv_layer:
--            EXPORT_UV = False
--            faceUV = None
--        else:
--            active_uv_layer = active_uv_layer.data
--
--    if vertexColors:
--        active_col_layer = mesh.active_vertex_color
--        if not active_col_layer:
--            EXPORT_COLORS = False
--            vertexColors = None
--        else:
--            active_col_layer = active_col_layer.data
--
--    # incase
--    color = uvcoord = uvcoord_key = normal = normal_key = None
--
--    mesh_verts = mesh.vertices # save a lookup
--    ply_verts = [] # list of dictionaries
--    # vdict = {} # (index, normal, uv) -> new index
--    vdict = [{} for i in range(len(mesh_verts))]
--    ply_faces = [[] for f in range(len(mesh.faces))]
--    vert_count = 0
--    for i, f in enumerate(mesh.faces):
--
--
--        smooth = f.use_smooth
--        if not smooth:
--            normal = tuple(f.normal)
--            normal_key = rvec3d(normal)
--
--        if faceUV:
--            uv = active_uv_layer[i]
--            uv = uv.uv1, uv.uv2, uv.uv3, uv.uv4 # XXX - crufty :/
--        if vertexColors:
--            col = active_col_layer[i]
--            col = col.color1, col.color2, col.color3, col.color4
--
--        f_verts = f.vertices
--
--        pf = ply_faces[i]
--        for j, vidx in enumerate(f_verts):
--            v = mesh_verts[vidx]
--
--            if smooth:
--                normal = tuple(v.normal)
--                normal_key = rvec3d(normal)
--
--            if faceUV:
--                uvcoord = uv[j][0], 1.0 - uv[j][1]
--                uvcoord_key = rvec2d(uvcoord)
--            elif vertexUV:
--                uvcoord = v.uvco[0], 1.0 - v.uvco[1]
--                uvcoord_key = rvec2d(uvcoord)
--
--            if vertexColors:
--                color = col[j]
--                color = int(color[0] * 255.0), int(color[1] * 255.0), int(color[2] * 255.0)
--
--
--            key = normal_key, uvcoord_key, color
--
--            vdict_local = vdict[vidx]
--            pf_vidx = vdict_local.get(key) # Will be None initially
--
--            if pf_vidx == None: # same as vdict_local.has_key(key)
--                pf_vidx = vdict_local[key] = vert_count
--                ply_verts.append((vidx, normal, uvcoord, color))
--                vert_count += 1
--
--            pf.append(pf_vidx)
--
--    file.write('ply\n')
--    file.write('format ascii 1.0\n')
--    file.write('comment Created by Blender %s - www.blender.org, source file: %s\n' % (bpy.app.version_string, bpy.data.filepath.split('/')[-1].split('\\')[-1]))
--
--    file.write('element vertex %d\n' % len(ply_verts))
--
--    file.write('property float x\n')
--    file.write('property float y\n')
--    file.write('property float z\n')
--
--    if EXPORT_NORMALS:
--        file.write('property float nx\n')
--        file.write('property float ny\n')
--        file.write('property float nz\n')
--    if EXPORT_UV:
--        file.write('property float s\n')
--        file.write('property float t\n')
--    if EXPORT_COLORS:
--        file.write('property uchar red\n')
--        file.write('property uchar green\n')
--        file.write('property uchar blue\n')
--
--    file.write('element face %d\n' % len(mesh.faces))
--    file.write('property list uchar uint vertex_indices\n')
--    file.write('end_header\n')
--
--    for i, v in enumerate(ply_verts):
--        file.write('%.6f %.6f %.6f ' % tuple(mesh_verts[v[0]].co)) # co
--        if EXPORT_NORMALS:
--            file.write('%.6f %.6f %.6f ' % v[1]) # no
--        if EXPORT_UV:
--            file.write('%.6f %.6f ' % v[2]) # uv
--        if EXPORT_COLORS:
--            file.write('%u %u %u' % v[3]) # col
--        file.write('\n')
--
--    for pf in ply_faces:
--        if len(pf) == 3:
--            file.write('3 %d %d %d\n' % tuple(pf))
--        else:
--            file.write('4 %d %d %d %d\n' % tuple(pf))
--
--    file.close()
--    print("writing", filename, "done")
--
--    if EXPORT_APPLY_MODIFIERS:
--        bpy.data.meshes.remove(mesh)
--
--    # XXX
--    """
--    if is_editmode:
--        Blender.Window.EditMode(1, '', 0)
--    """
--
--from bpy.props import *
--
--
--class ExportPLY(bpy.types.Operator):
--    '''Export a single object as a stanford PLY with normals, colours and texture coordinates.'''
--    bl_idname = "export.ply"
--    bl_label = "Export PLY"
--
--    # List of operator properties, the attributes will be assigned
--    # to the class instance from the operator settings before calling.
--
--
--    filepath = StringProperty(name="File Path", description="Filepath used for exporting the PLY file", maxlen=1024, default="")
--    check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
--    use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply Modifiers to the exported mesh", default=True)
--    use_normals = BoolProperty(name="Normals", description="Export Normals for smooth and hard shaded faces", default=True)
--    use_uvs = BoolProperty(name="UVs", description="Exort the active UV layer", default=True)
--    use_colors = BoolProperty(name="Vertex Colors", description="Exort the active vertex color layer", default=True)
--
--    @classmethod
--    def poll(cls, context):
--        return context.active_object != None
--
--    def execute(self, context):
--        filepath = self.properties.filepath
--        filepath = bpy.path.ensure_ext(filepath, ".ply")
--
--        write(filepath, context.scene, context.active_object,\
--            EXPORT_APPLY_MODIFIERS=self.properties.use_modifiers,
--            EXPORT_NORMALS=self.properties.use_normals,
--            EXPORT_UV=self.properties.use_uvs,
--            EXPORT_COLORS=self.properties.use_colors,
--        )
--
--        return {'FINISHED'}
--
--    def invoke(self, context, event):
--        import os
--        if not self.properties.is_property_set("filepath"):
--            self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".ply"
--
--        context.manager.add_fileselect(self)
--        return {'RUNNING_MODAL'}
--
--    def draw(self, context):
--        layout = self.layout
--        props = self.properties
--
--        row = layout.row()
--        row.prop(props, "use_modifiers")
--        row.prop(props, "use_normals")
--        row = layout.row()
--        row.prop(props, "use_uvs")
--        row.prop(props, "use_colors")
--
--
--def menu_func(self, context):
--    self.layout.operator(ExportPLY.bl_idname, text="Stanford (.ply)")
--
--
--def register():
--    bpy.types.INFO_MT_file_export.append(menu_func)
--
--
--def unregister():
--    bpy.types.INFO_MT_file_export.remove(menu_func)
--
--if __name__ == "__main__":
--    register()
diff --cc release/scripts/io/import_shape_mdd.py
index c7b199918a299f8f9716d1f888f36592d167aa84,c7b199918a299f8f9716d1f888f36592d167aa84..0000000000000000000000000000000000000000
deleted file mode 100644,100644
+++ /dev/null
@@@ -1,154 -1,154 +1,0 @@@
--# ***** BEGIN GPL LICENSE BLOCK *****
--#
--# This program is free software; you can redistribute it and/or
--# modify it under the terms of the GNU General Public License
--# as published by the Free Software Foundation; either version 2
--# of the License, or (at your option) any later version.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, write to the Free Software Foundation,
--# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
--#
--# ***** END GPL LICENCE BLOCK *****
--
--# <pep8 compliant>
--
--# mdd importer by Bill L.Nieuwendorp
--# conversion to blender 2.5: Ivo Grigull (loolarge)
--#
--# Warning if the vertex order or vertex count differs from the
--# origonal model the mdd was Baked out from their will be Strange
--# behavior
--#
--# vertex animation to ShapeKeys with ipo  and gives the frame a value of 1.0
--# A modifier to read mdd files would be Ideal but thats for another day :)
--#
--# Please send any fixes,updates,bugs to Slow67_at_Gmail.com
--# Bill Niewuendorp
--
--import bpy
--from struct import unpack
--
--
--def mdd_import(filepath, ob, scene, PREF_START_FRAME=0, PREF_JUMP=1):
--
--    print('\n\nimporting mdd "%s"' % filepath)
--
--    bpy.ops.object.mode_set(mode='OBJECT')
--
--    file = open(filepath, 'rb')
--    frames, points = unpack(">2i", file.read(8))
--    time = unpack((">%df" % frames), file.read(frames * 4))
--
--    print('\tpoints:%d frames:%d' % (points, frames))
--
--    # If target object doesn't have Basis shape key, create it.
--    try:
--        num_keys = len(ob.data.shape_keys.keys)
--    except:
--        basis = ob.add_shape_key()
--        basis.name = "Basis"
--        ob.data.update()
--
--    scene.frame_current = PREF_START_FRAME
--
--    def UpdateMesh(ob, fr):
--
--        # Insert new shape key
--        new_shapekey = ob.add_shape_key()
--        new_shapekey.name = ("frame_%.4d" % fr)
--        new_shapekey_name = new_shapekey.name
--
--        ob.active_shape_key_index = len(ob.data.shape_keys.keys)-1
--        index = len(ob.data.shape_keys.keys)-1
--        ob.show_shape_key = True
--
--        verts = ob.data.shape_keys.keys[len(ob.data.shape_keys.keys)-1].data
--
--
--        for v in verts: # 12 is the size of 3 floats
--            v.co[:] = unpack('>3f', file.read(12))
--        #me.update()
--        ob.show_shape_key = False
--
--
--        # insert keyframes
--        shape_keys = ob.data.shape_keys
--
--        scene.frame_current -= 1
--        ob.data.shape_keys.keys[index].value = 0.0
--        shape_keys.keys[len(ob.data.shape_keys.keys)-1].keyframe_insert("value")
--
--        scene.frame_current += 1
--        ob.data.shape_keys.keys[index].value = 1.0
--        shape_keys.keys[len(ob.data.shape_keys.keys)-1].keyframe_insert("value")
--
--        scene.frame_current += 1
--        ob.data.shape_keys.keys[index].value = 0.0
--        shape_keys.keys[len(ob.data.shape_keys.keys)-1].keyframe_insert("value")
--
--        ob.data.update()
--
--
--    for i in range(frames):
--        UpdateMesh(ob, i)
--
--
--from bpy.props import *
--
--
--class importMDD(bpy.types.Operator):
--    '''Import MDD vertex keyframe file to shape keys'''
--    bl_idname = "import_shape.mdd"
--    bl_label = "Import MDD"
--
--    # get first scene to get min and max properties for frames, fps
--
--    minframe = 1
--    maxframe = 300000
--    minfps = 1
--    maxfps = 120
--
--    # List of operator properties, the attributes will be assigned
--    # to the class instance from the operator settings before calling.
--    filepath = StringProperty(name="File Path", description="Filepath used for importing the MDD file", maxlen=1024)
--    #fps = IntProperty(name="Frames Per Second", description="Number of frames/second", min=minfps, max=maxfps, default=25)
--    frame_start = IntProperty(name="Start Frame", description="Start frame for inserting animation", min=minframe, max=maxframe, default=0)
--
--    @classmethod
--    def poll(cls, context):
--        ob = context.active_object
--        return (ob and ob.type == 'MESH')
--
--    def execute(self, context):
--        if not self.properties.filepath:
--            raise Exception("filename not set")
--
--        mdd_import(self.properties.filepath, bpy.context.active_object, context.scene, self.properties.frame_start, 1)
--
--        return {'FINISHED'}
--
--    def invoke(self, context, event):
--        wm = context.manager
--        wm.add_fileselect(self)
--        return {'RUNNING_MODAL'}
--
--
--def menu_func(self, context):
--    self.layout.operator(importMDD.bl_idname, text="Lightwave Point Cache (.mdd)")
--
--
--def register():
--    bpy.types.INFO_MT_file_import.append(menu_func)
--
--
--def unregister():
--    bpy.types.INFO_MT_file_import.remove(menu_func)
--
--if __name__ == "__main__":
--    register()
index 5a705e95aa82393030a3c00a3b6af3a1339f01d2,5a705e95aa82393030a3c00a3b6af3a1339f01d2..e4f6bf65fe24033815cadacec34a5adaa6809369
@@@ -19,9 -19,9 +19,7 @@@
  # This directory is a Python package.
  
  # To support reload properly, try to access a package var, if it's there, reload everything
--try:
--    init_data
--
++if "bpy" in locals():
      reload(model)
      reload(operators)
      reload(client)
@@@ -32,7 -32,7 +30,7 @@@
      reload(balancing)
      reload(ui)
      reload(repath)
--except:
++else:
      from netrender import model
      from netrender import operators
      from netrender import client
@@@ -49,7 -49,7 +47,6 @@@ slaves = [
  blacklist = []
  
  init_file = ""
--init_data = True
  init_address = True
  
  def register():
index a26483e57ce99ad36443f44625f7785075494003,a26483e57ce99ad36443f44625f7785075494003..901aa71529640b238557eb540ea475e10159e547
@@@ -116,7 -116,7 +116,7 @@@ def RKS_GEN_rotation(ksi, context, ks, 
      #   rotation mode affects the property used
      if data.rotation_mode == 'QUATERNION':
          path = path_add_property(base_path, "rotation_quaternion")
--    elif data.rotation_mode == 'AXISANGLE':
++    elif data.rotation_mode == 'AXIS_ANGLE':
          path = path_add_property(base_path, "rotation_axis_angle")
      else:
          path = path_add_property(base_path, "rotation_euler")
index 15e5df15246c9f31d78e0f991b75d1c7e87bfb5e,15e5df15246c9f31d78e0f991b75d1c7e87bfb5e..223a5a8947152faa308b4688bd65f604fbe29748
@@@ -23,6 -23,6 +23,7 @@@ from _bpy import ops as ops_modul
  
  # op_add = ops_module.add
  op_dir = ops_module.dir
++op_poll = ops_module.poll
  op_call = ops_module.call
  op_as_string = ops_module.as_string
  op_get_rna = ops_module.get_rna
@@@ -120,6 -120,6 +121,9 @@@ class bpy_ops_submodule_op(object)
          self.module = module
          self.func = func
  
++    def poll(self, context=None):
++        return op_poll(self.idname_py(), context)
++
      def idname(self):
          # submod.foo -> SUBMOD_OT_foo
          return self.module.upper() + "_OT_" + self.func
index 5030e9f4868abd76458ab5e986b5005efcdc1d36,5030e9f4868abd76458ab5e986b5005efcdc1d36..84d05a7a48db30e4a87de7b9d7a6e5f069ba3330
@@@ -306,7 -306,7 +306,9 @@@ class Mesh(bpy_types.ID)
          Make a mesh from a list of verts/edges/faces
          Until we have a nicer way to make geometry, use this.
          """
--        self.add_geometry(len(verts), len(edges), len(faces))
++        self.vertices.add(len(verts))
++        self.edges.add(len(edges))
++        self.faces.add(len(faces))
  
          verts_flat = [f for v in verts for f in v]
          self.vertices.foreach_set("co", verts_flat)
  
          def treat_face(f):
              if len(f) == 3:
--                return f[0], f[1], f[2], 0
--            elif f[3] == 0:
++                if f[2] == 0:
++                    return f[2], f[0], f[1], 0
++                else:
++                    return f[0], f[1], f[2], 0
++            elif f[2] == 0 or f[3] == 0:
                  return f[3], f[0], f[1], f[2]
              return f
  
index 1ab14e281b958c05f2a8eb8043d83a6f9eeb57c3,1ab14e281b958c05f2a8eb8043d83a6f9eeb57c3..7daf3d3bb4b4663959d8359fd54369746aaa6645
@@@ -262,7 -262,7 +262,7 @@@ def main(obj, bone_definition, base_nam
      fcurve = ex.head_ctrl_p.driver_add('["bend_tot"]')
      driver = fcurve.driver
      driver.type = 'SUM'
--    fcurve.modifiers.remove(0) # grr dont need a modifier
++    fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
  
      for i in range(len(neck_chain)):
          var = driver.variables.new()
          driver.type = 'SCRIPTED'
          driver.expression = "bend/bend_tot"
  
--        fcurve.modifiers.remove(0) # grr dont need a modifier
++        fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
  
  
          # add target
index 369d6928e45191764394cc678e67b0c4f340aab8,369d6928e45191764394cc678e67b0c4f340aab8..c063e2b31c94b578cbefecb92df6e30795852442
@@@ -194,7 -194,7 +194,7 @@@ def main(obj, bone_definition, base_nam
      driver.expression = "(1.0-cos(x))-s"
  
      for fcurve in driver_fcurves:
--        fcurve.modifiers.remove(0) # grr dont need a modifier
++        fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
  
      var = driver.variables.new()
      var.name = "x"
index 645ee4045cc5e91c2a99f4025162beb1070f7091,645ee4045cc5e91c2a99f4025162beb1070f7091..7782380eedb1aaa491bd9d669c408ab5b0d309cb
@@@ -353,7 -353,7 +353,7 @@@ def main(obj, bone_definition, base_nam
      fcurve = ex.ribcage_copy_p.driver_add('["bend_tot"]')
      driver = fcurve.driver
      driver.type = 'SUM'
--    fcurve.modifiers.remove(0) # grr dont need a modifier
++    fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
  
      for i in range(spine_chain_len - 1):
          var = driver.variables.new()
          driver.type = 'SCRIPTED'
          driver.expression = "bend/bend_tot"
  
--        fcurve.modifiers.remove(0) # grr dont need a modifier
++        fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
  
  
          # add target
index fd32f3d05560e0c327a81490fee9e37212804e9e,fd32f3d05560e0c327a81490fee9e37212804e9e..36c4316adc54b58e4ac2a3073df335ba4dc32020
@@@ -266,7 -266,7 +266,7 @@@ def main(obj, bone_definition, base_nam
      fcurve = ex.head_ctrl_p.driver_add('["bend_tot"]')
      driver = fcurve.driver
      driver.type = 'SUM'
--    fcurve.modifiers.remove(0) # grr dont need a modifier
++    fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
  
      for i in range(len(neck_chain)):
          var = driver.variables.new()
          driver.type = 'SCRIPTED'
          driver.expression = "bend/bend_tot"
  
--        fcurve.modifiers.remove(0) # grr dont need a modifier
++        fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
  
  
          # add target
index a270af949da4cc65c7c816466bb60eeedf18066f,a270af949da4cc65c7c816466bb60eeedf18066f..1ffe366e0d57f123809a7466136b53f3639de02d
@@@ -157,7 -157,7 +157,7 @@@ def blend_bone_list(obj, apply_bones, f
          fcurve = con.driver_add("influence")
          driver = fcurve.driver
          driver.type = 'AVERAGE'
--        fcurve.modifiers.remove(0) # grr dont need a modifier
++        fcurve.modifiers.remove(fcurve.modifiers[0]) # grr dont need a modifier
  
          blend_target(driver)
  
index 63762855737c69df47981ce4338fc402a80aa533,63762855737c69df47981ce4338fc402a80aa533..4a9460d82715f9d56bc438563a27b73db308d10b
@@@ -84,6 -84,6 +84,8 @@@ def draw(layout, context, context_membe
          props.data_path = context_member
          del row
  
++    rna_properties = {prop.identifier for prop in rna_item.bl_rna.properties if prop.is_runtime} if items else None
++
      for key, val in items:
  
          if key == '_RNA_UI':
          if convert_to_pyobject and not hasattr(val_orig, "len"):
              row.label(text=val_draw)
          else:
--            row.prop(rna_item, '["%s"]' % key, text="")
++            if key in rna_properties:
++                row.prop(rna_item, key, text="")
++            else:
++                row.prop(rna_item, '["%s"]' % key, text="")
  
          if use_edit:
              row = split.row(align=True)
@@@ -130,11 -130,11 +135,11 @@@ class PropertyPanel()
      and the variable '_context_path' MUST be set.
      """
      bl_label = "Custom Properties"
--    bl_default_closed = True
++    bl_options = {'DEFAULT_CLOSED'}
  
      @classmethod
      def poll(cls, context):
--        bool(eval("context.%s" % cls._context_path))
++        return bool(eval("context.%s" % cls._context_path))
  
      def draw(self, context):
          draw(self.layout, context, self._context_path)
index e19f2b4e18caa1c6ca929f001b10cbc699e97b2e,e19f2b4e18caa1c6ca929f001b10cbc699e97b2e..70e394671fef99ab364b2c5fa2144217522a4845
@@@ -121,7 -121,7 +121,9 @@@ class AddTorus(bpy.types.Operator)
  
          mesh = bpy.data.meshes.new("Torus")
  
--        mesh.add_geometry(int(len(verts_loc) / 3), 0, int(len(faces) / 4))
++        mesh.vertices.add(len(verts_loc) // 3)
++        mesh.faces.add(len(faces) // 4)
++
          mesh.vertices.foreach_set("co", verts_loc)
          mesh.faces.foreach_set("vertices_raw", faces)
          mesh.update()
  
  
  def menu_func(self, context):
--    self.layout.operator(AddTorus.bl_idname, text="Torus", icon='MESH_DONUT')
++    self.layout.operator(AddTorus.bl_idname, text="Torus", icon='MESH_TORUS')
  
  
  def register():
index 0fe03a0cc4d9e03f2526515e9c7ad9f87b2a014e,0fe03a0cc4d9e03f2526515e9c7ad9f87b2a014e..698021fca7fcabf33bf0b7ac2b968f9835812cd3
mode 100755,100644..100644
@@@ -681,7 -681,7 +681,7 @@@ import bp
  
  
  class UpdateAnimData(bpy.types.Operator):
--    ''''''
++    '''Update data paths from 2.53 to edited data paths of drivers and fcurves'''
      bl_idname = "anim.update_data_paths"
      bl_label = "Update Animation Data"
  
@@@ -696,4 -696,4 +696,4 @@@ if __name__ == "__main__"
      bpy.ops.anim.update_data_paths()
  
  def register():
--    pass
++    pass
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6b529f87dd7f58e844b7e933a6d8fb3936cdeac5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,74 @@@
++# ##### BEGIN GPL LICENSE BLOCK #####
++#
++#  This program is free software; you can redistribute it and/or
++#  modify it under the terms of the GNU General Public License
++#  as published by the Free Software Foundation; either version 2
++#  of the License, or (at your option) any later version.
++#
++#  This program is distributed in the hope that it will be useful,
++#  but WITHOUT ANY WARRANTY; without even the implied warranty of
++#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++#  GNU General Public License for more details.
++#
++#  You should have received a copy of the GNU General Public License
++#  along with this program; if not, write to the Free Software Foundation,
++#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
++#
++# ##### END GPL LICENSE BLOCK #####
++
++# <pep8 compliant>
++
++# To support reload properly, try to access a package var, if it's there, reload everything
++if "bpy" in locals():
++    # only reload if we alredy loaded, highly annoying
++    import sys
++    reload(sys.modules.get("io_mesh_ply.export_ply", sys))
++
++
++import bpy
++from bpy.props import *
++from io_utils import ImportHelper
++
++
++class BvhImporter(bpy.types.Operator, ImportHelper):
++    '''Load a OBJ Motion Capture File'''
++    bl_idname = "import_anim.bvh"
++    bl_label = "Import BVH"
++    
++    filename_ext = ".bvh"
++
++    scale = FloatProperty(name="Scale", description="Scale the BVH by this value", min=0.0001, max=1000000.0, soft_min=0.001, soft_max=100.0, default=0.1)
++    frame_start = IntProperty(name="Start Frame", description="Starting frame for the animation", default=1)
++    loop = BoolProperty(name="Loop", description="Loop the animation playback", default=False)
++    rotate_mode = EnumProperty(items=(
++            ('QUATERNION', "Quaternion", "Convert rotations to quaternions"),
++            ('NATIVE', "Euler (Native)", "Use the rotation order defined in the BVH file"),
++            ('XYZ', "Euler (XYZ)", "Convert rotations to euler XYZ"),
++            ('XZY', "Euler (XZY)", "Convert rotations to euler XZY"),
++            ('YXZ', "Euler (YXZ)", "Convert rotations to euler YXZ"),
++            ('YZX', "Euler (YZX)", "Convert rotations to euler YZX"),
++            ('ZXY', "Euler (ZXY)", "Convert rotations to euler ZXY"),
++            ('ZYX', "Euler (ZYX)", "Convert rotations to euler ZYX"),
++            ),
++                name="Rotation",
++                description="Rotation conversion.",
++                default='NATIVE')
++
++    def execute(self, context):
++        import io_anim_bvh.import_bvh
++        return io_anim_bvh.import_bvh.load(self, context, **self.properties)
++
++
++def menu_func(self, context):
++    self.layout.operator(BvhImporter.bl_idname, text="Motion Capture (.bvh)")
++
++
++def register():
++    bpy.types.INFO_MT_file_import.append(menu_func)
++
++
++def unregister():
++    bpy.types.INFO_MT_file_import.remove(menu_func)
++
++if __name__ == "__main__":
++    register()
index 04cae915a49e6fa80212c343bd9101d3137ede75,04cae915a49e6fa80212c343bd9101d3137ede75..5f9de6cbd90343a4d1ec2c2f2b1deec036ced2d0
@@@ -18,6 -18,6 +18,8 @@@
  
  # <pep8 compliant>
  
++# Script copyright (C) Campbell Barton
++
  import math
  from math import radians
  
@@@ -349,7 -349,7 +351,7 @@@ def bvh_node_dict2armature(context, bvh
      for ob in scn.objects:
          ob.select = False
  
--    scn.set_frame(IMPORT_START_FRAME)
++    scn.frame_set(IMPORT_START_FRAME)
  
      arm_data = bpy.data.armatures.new("MyBVH")
      arm_ob = bpy.data.objects.new("MyBVH", arm_data)
      return arm_ob
  
  
--from bpy.props import *
--
--
--class BvhImporter(bpy.types.Operator):
--    '''Load a OBJ Motion Capture File'''
--    bl_idname = "import_anim.bvh"
--    bl_label = "Import BVH"
--
--    filepath = StringProperty(name="File Path", description="Filepath used for importing the OBJ file", maxlen=1024, default="")
--    scale = FloatProperty(name="Scale", description="Scale the BVH by this value", min=0.0001, max=1000000.0, soft_min=0.001, soft_max=100.0, default=0.1)
--    frame_start = IntProperty(name="Start Frame", description="Starting frame for the animation", default=1)
--    loop = BoolProperty(name="Loop", description="Loop the animation playback", default=False)
--    rotate_mode = EnumProperty(items=(
--            ('QUATERNION', "Quaternion", "Convert rotations to quaternions"),
--            ('NATIVE', "Euler (Native)", "Use the rotation order defined in the BVH file"),
--            ('XYZ', "Euler (XYZ)", "Convert rotations to euler XYZ"),
--            ('XZY', "Euler (XZY)", "Convert rotations to euler XZY"),
--            ('YXZ', "Euler (YXZ)", "Convert rotations to euler YXZ"),
--            ('YZX', "Euler (YZX)", "Convert rotations to euler YZX"),
--            ('ZXY', "Euler (ZXY)", "Convert rotations to euler ZXY"),
--            ('ZYX', "Euler (ZYX)", "Convert rotations to euler ZYX"),
--            ),
--                name="Rotation",
--                description="Rotation conversion.",
--                default='NATIVE')
--
--    def execute(self, context):
--        # print("Selected: " + context.active_object.name)
--        import time
--        t1 = time.time()
--        print('\tparsing bvh...', end="")
--
--        bvh_nodes = read_bvh(context, self.properties.filepath,
--                ROT_MODE=self.properties.rotate_mode,
--                GLOBAL_SCALE=self.properties.scale)
--
--        print('%.4f' % (time.time() - t1))
--        t1 = time.time()
--        print('\timporting to blender...', end="")
--
--        bvh_node_dict2armature(context, bvh_nodes,
--                ROT_MODE=self.properties.rotate_mode,
--                IMPORT_START_FRAME=self.properties.frame_start,
--                IMPORT_LOOP=self.properties.loop)
--
--        print('Done in %.4f\n' % (time.time() - t1))
--        return {'FINISHED'}
--
--    def invoke(self, context, event):
--        wm = context.manager
--        wm.add_fileselect(self)
--        return {'RUNNING_MODAL'}
--
--
--def menu_func(self, context):
--    self.layout.operator(BvhImporter.bl_idname, text="Motion Capture (.bvh)")
--
++def load(operator, context, filepath="", rotate_mode='NATIVE', scale=1.0, use_cyclic=False, frame_start=1):
++    import time
++    t1 = time.time()
++    print('\tparsing bvh %r...' % filepath, end="")
  
--def register():
--    bpy.types.INFO_MT_file_import.append(menu_func)
++    bvh_nodes = read_bvh(context, filepath,
++            ROT_MODE=rotate_mode,
++            GLOBAL_SCALE=scale)
  
++    print('%.4f' % (time.time() - t1))
++    t1 = time.time()
++    print('\timporting to blender...', end="")
  
--def unregister():
--    bpy.types.INFO_MT_file_import.remove(menu_func)
++    bvh_node_dict2armature(context, bvh_nodes,
++            ROT_MODE=rotate_mode,
++            IMPORT_START_FRAME=frame_start,
++            IMPORT_LOOP=use_cyclic)
  
--if __name__ == "__main__":
--    register()
++    print('Done in %.4f\n' % (time.time() - t1))
++    
++    return {'FINISHED'}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c174b16f46c27b3670dad3af6bcb82d147fc457c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,76 @@@
++# ##### BEGIN GPL LICENSE BLOCK #####
++#
++#  This program is free software; you can redistribute it and/or
++#  modify it under the terms of the GNU General Public License
++#  as published by the Free Software Foundation; either version 2
++#  of the License, or (at your option) any later version.
++#
++#  This program is distributed in the hope that it will be useful,
++#  but WITHOUT ANY WARRANTY; without even the implied warranty of
++#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++#  GNU General Public License for more details.
++#
++#  You should have received a copy of the GNU General Public License
++#  along with this program; if not, write to the Free Software Foundation,
++#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
++#
++# ##### END GPL LICENSE BLOCK #####
++
++# To support reload properly, try to access a package var, if it's there, reload everything
++if "bpy" in locals():
++    import sys
++    reload(sys.modules.get("io_mesh_ply.export_ply", sys))
++
++
++import bpy
++from bpy.props import *
++from io_utils import ExportHelper
++
++
++class ExportPLY(bpy.types.Operator, ExportHelper):
++    '''Export a single object as a stanford PLY with normals, colours and texture coordinates.'''
++    bl_idname = "export.ply"
++    bl_label = "Export PLY"
++    
++    filename_ext = ".ply"
++
++    use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply Modifiers to the exported mesh", default=True)
++    use_normals = BoolProperty(name="Normals", description="Export Normals for smooth and hard shaded faces", default=True)
++    use_uv_coords = BoolProperty(name="UVs", description="Exort the active UV layer", default=True)
++    use_colors = BoolProperty(name="Vertex Colors", description="Exort the active vertex color layer", default=True)
++
++    @classmethod
++    def poll(cls, context):
++        return context.active_object != None
++
++    def execute(self, context):
++        filepath = self.properties.filepath
++        filepath = bpy.path.ensure_ext(filepath, self.filename_ext)
++        import io_mesh_ply.export_ply
++        return io_mesh_ply.export_ply.save(self, context, **self.properties)
++
++    def draw(self, context):
++        layout = self.layout
++        props = self.properties
++
++        row = layout.row()
++        row.prop(props, "use_modifiers")
++        row.prop(props, "use_normals")
++        row = layout.row()
++        row.prop(props, "use_uv_coords")
++        row.prop(props, "use_colors")
++
++
++def menu_func(self, context):
++    self.layout.operator(ExportPLY.bl_idname, text="Stanford (.ply)")
++
++
++def register():
++    bpy.types.INFO_MT_file_export.append(menu_func)
++
++
++def unregister():
++    bpy.types.INFO_MT_file_export.remove(menu_func)
++
++if __name__ == "__main__":
++    register()
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..aef4df43841f0763ebe10ec68e995d2dbb822b8f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,206 @@@
++# ##### BEGIN GPL LICENSE BLOCK #####
++#
++#  This program is free software; you can redistribute it and/or
++#  modify it under the terms of the GNU General Public License
++#  as published by the Free Software Foundation; either version 2
++#  of the License, or (at your option) any later version.
++#
++#  This program is distributed in the hope that it will be useful,
++#  but WITHOUT ANY WARRANTY; without even the implied warranty of
++#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++#  GNU General Public License for more details.
++#
++#  You should have received a copy of the GNU General Public License
++#  along with this program; if not, write to the Free Software Foundation,
++#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
++#
++# ##### END GPL LICENSE BLOCK #####
++
++# <pep8 compliant>
++
++# Copyright (C) 2004, 2005: Bruce Merry, bmerry@cs.uct.ac.za
++# Contributors: Bruce Merry, Campbell Barton
++
++"""
++This script exports Stanford PLY files from Blender. It supports normals,
++colours, and texture coordinates per face or per vertex.
++Only one mesh can be exported at a time.
++"""
++
++import bpy
++import os
++
++
++def save(operator, context, filepath="", use_modifiers=True, use_normals=True, use_uv_coords=True, use_colors=True):
++    
++    def rvec3d(v):
++        return round(v[0], 6), round(v[1], 6), round(v[2], 6)
++
++
++    def rvec2d(v):
++        return round(v[0], 6), round(v[1], 6)
++    
++    scene = context.scene
++    obj = context.object
++
++    if not obj:
++        raise Exception("Error, Select 1 active object")
++
++    file = open(filepath, 'w')
++
++    if scene.objects.active:
++        bpy.ops.object.mode_set(mode='OBJECT')
++
++    if use_modifiers:
++        mesh = obj.create_mesh(scene, True, 'PREVIEW')
++    else:
++        mesh = obj.data
++
++    if not mesh:
++        raise Exception("Error, could not get mesh data from active object")
++
++    # mesh.transform(obj.matrix_world) # XXX
++
++    faceUV = (len(mesh.uv_textures) > 0)
++    vertexUV = (len(mesh.sticky) > 0)
++    vertexColors = len(mesh.vertex_colors) > 0
++
++    if (not faceUV) and (not vertexUV):
++        use_uv_coords = False
++    if not vertexColors:
++        use_colors = False
++
++    if not use_uv_coords:
++        faceUV = vertexUV = False
++    if not use_colors:
++        vertexColors = False
++
++    if faceUV:
++        active_uv_layer = mesh.uv_textures.active
++        if not active_uv_layer:
++            use_uv_coords = False
++            faceUV = None
++        else:
++            active_uv_layer = active_uv_layer.data
++
++    if vertexColors:
++        active_col_layer = mesh.vertex_colors.active
++        if not active_col_layer:
++            use_colors = False
++            vertexColors = None
++        else:
++            active_col_layer = active_col_layer.data
++
++    # incase
++    color = uvcoord = uvcoord_key = normal = normal_key = None
++
++    mesh_verts = mesh.vertices # save a lookup
++    ply_verts = [] # list of dictionaries
++    # vdict = {} # (index, normal, uv) -> new index
++    vdict = [{} for i in range(len(mesh_verts))]
++    ply_faces = [[] for f in range(len(mesh.faces))]
++    vert_count = 0
++    for i, f in enumerate(mesh.faces):
++
++
++        smooth = f.use_smooth
++        if not smooth:
++            normal = tuple(f.normal)
++            normal_key = rvec3d(normal)
++
++        if faceUV:
++            uv = active_uv_layer[i]
++            uv = uv.uv1, uv.uv2, uv.uv3, uv.uv4 # XXX - crufty :/
++        if vertexColors:
++            col = active_col_layer[i]
++            col = col.color1, col.color2, col.color3, col.color4
++
++        f_verts = f.vertices
++
++        pf = ply_faces[i]
++        for j, vidx in enumerate(f_verts):
++            v = mesh_verts[vidx]
++
++            if smooth:
++                normal = tuple(v.normal)
++                normal_key = rvec3d(normal)
++
++            if faceUV:
++                uvcoord = uv[j][0], 1.0 - uv[j][1]
++                uvcoord_key = rvec2d(uvcoord)
++            elif vertexUV:
++                uvcoord = v.uvco[0], 1.0 - v.uvco[1]
++                uvcoord_key = rvec2d(uvcoord)
++
++            if vertexColors:
++                color = col[j]
++                color = int(color[0] * 255.0), int(color[1] * 255.0), int(color[2] * 255.0)
++
++
++            key = normal_key, uvcoord_key, color
++
++            vdict_local = vdict[vidx]
++            pf_vidx = vdict_local.get(key) # Will be None initially
++
++            if pf_vidx == None: # same as vdict_local.has_key(key)
++                pf_vidx = vdict_local[key] = vert_count
++                ply_verts.append((vidx, normal, uvcoord, color))
++                vert_count += 1
++
++            pf.append(pf_vidx)
++
++    file.write('ply\n')
++    file.write('format ascii 1.0\n')
++    file.write('comment Created by Blender %s - www.blender.org, source file: %r\n' % (bpy.app.version_string, os.path.basename(bpy.data.filepath)))
++
++    file.write('element vertex %d\n' % len(ply_verts))
++
++    file.write('property float x\n')
++    file.write('property float y\n')
++    file.write('property float z\n')
++
++    if use_normals:
++        file.write('property float nx\n')
++        file.write('property float ny\n')
++        file.write('property float nz\n')
++    if use_uv_coords:
++        file.write('property float s\n')
++        file.write('property float t\n')
++    if use_colors:
++        file.write('property uchar red\n')
++        file.write('property uchar green\n')
++        file.write('property uchar blue\n')
++
++    file.write('element face %d\n' % len(mesh.faces))
++    file.write('property list uchar uint vertex_indices\n')
++    file.write('end_header\n')
++
++    for i, v in enumerate(ply_verts):
++        file.write('%.6f %.6f %.6f ' % tuple(mesh_verts[v[0]].co)) # co
++        if use_normals:
++            file.write('%.6f %.6f %.6f ' % v[1]) # no
++        if use_uv_coords:
++            file.write('%.6f %.6f ' % v[2]) # uv
++        if use_colors:
++            file.write('%u %u %u' % v[3]) # col
++        file.write('\n')
++
++    for pf in ply_faces:
++        if len(pf) == 3:
++            file.write('3 %d %d %d\n' % tuple(pf))
++        else:
++            file.write('4 %d %d %d %d\n' % tuple(pf))
++
++    file.close()
++    print("writing %r done" % filepath)
++
++    if use_modifiers:
++        bpy.data.meshes.remove(mesh)
++
++    # XXX
++    """
++    if is_editmode:
++        Blender.Window.EditMode(1, '', 0)
++    """
++    
++    return {'FINISHED'}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..cff8feb7255c349c2b278d020852f703ebd8cba1
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,86 @@@
++# ##### BEGIN GPL LICENSE BLOCK #####
++#
++#  This program is free software; you can redistribute it and/or
++#  modify it under the terms of the GNU General Public License
++#  as published by the Free Software Foundation; either version 2
++#  of the License, or (at your option) any later version.
++#
++#  This program is distributed in the hope that it will be useful,
++#  but WITHOUT ANY WARRANTY; without even the implied warranty of
++#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++#  GNU General Public License for more details.
++#
++#  You should have received a copy of the GNU General Public License
++#  along with this program; if not, write to the Free Software Foundation,
++#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
++#
++# ##### END GPL LICENSE BLOCK #####
++
++# <pep8 compliant>
++
++# To support reload properly, try to access a package var, if it's there, reload everything
++if "bpy" in locals():
++    import sys
++    reload(sys.modules.get("io_scene_3ds.import_3ds", sys))
++    reload(sys.modules.get("io_scene_3ds.export_3ds", sys))
++
++
++import bpy
++from bpy.props import *
++from io_utils import ImportHelper, ExportHelper
++
++
++class Import3DS(bpy.types.Operator, ImportHelper):
++    '''Import from 3DS file format (.3ds)'''
++    bl_idname = "import_scene.autodesk_3ds"
++    bl_label = 'Import 3DS'
++
++    filename_ext = ".3ds"
++
++    constrain_size = FloatProperty(name="Size Constraint", description="Scale the model by 10 until it reacehs the size constraint. Zero Disables.", min=0.0, max=1000.0, soft_min=0.0, soft_max=1000.0, default=10.0)
++    use_image_search = BoolProperty(name="Image Search", description="Search subdirectories for any assosiated images (Warning, may be slow)", default=True)
++    use_apply_transform = BoolProperty(name="Apply Transform", description="Workaround for object transformations importing incorrectly", default=False)
++
++    def execute(self, context):
++        import io_scene_3ds.import_3ds
++        return io_scene_3ds.import_3ds.load(self, context, **self.properties)
++
++
++class Export3DS(bpy.types.Operator, ExportHelper):
++    '''Export to 3DS file format (.3ds)'''
++    bl_idname = "export_scene.autodesk_3ds"
++    bl_label = 'Export 3DS'
++
++    filename_ext = ".3ds"
++
++    def execute(self, context):
++        import io_scene_3ds.export_3ds
++        return io_scene_3ds.export_3ds.save(self, context, **self.properties)
++
++
++# Add to a menu
++def menu_func_export(self, context):
++    self.layout.operator(Export3DS.bl_idname, text="3D Studio (.3ds)")
++
++def menu_func_import(self, context):
++    self.layout.operator(Import3DS.bl_idname, text="3D Studio (.3ds)")
++
++def register():
++    bpy.types.INFO_MT_file_import.append(menu_func_import)
++    bpy.types.INFO_MT_file_export.append(menu_func_export)
++
++
++def unregister():
++    bpy.types.INFO_MT_file_import.remove(menu_func_import)
++    bpy.types.INFO_MT_file_export.remove(menu_func_export)
++
++if __name__ == "__main__":
++    register()
++
++# NOTES:
++# why add 1 extra vertex? and remove it when done? - "Answer - eekadoodle - would need to re-order UV's without this since face order isnt always what we give blender, BMesh will solve :D"
++# disabled scaling to size, this requires exposing bb (easy) and understanding how it works (needs some time)
++
++if __name__ == "__main__":
++    register()
++
index 4a5521bd9e933ee8d719081afbe5e3715aaf3a88,4a5521bd9e933ee8d719081afbe5e3715aaf3a88..3d1cc02a8d812c3bf4306576cee6a87ee040749a
@@@ -1,4 -1,4 +1,3 @@@
--# coding: utf-8
  # ##### BEGIN GPL LICENSE BLOCK #####
  #
  #  This program is free software; you can redistribute it and/or
  
  # <pep8 compliant>
  
--__author__ = ["Campbell Barton", "Bob Holcomb", "Richard Lärkäng", "Damien McGinnes", "Mark Stijnman"]
--__url__ = ("blenderartists.org", "www.blender.org", "www.gametutorials.com", "lib3ds.sourceforge.net/")
--__version__ = "0.90a"
--__bpydoc__ = """\
--
--3ds Exporter
--
--This script Exports a 3ds file.
++# Script copyright (C) Bob Holcomb
++# Contributors: Campbell Barton, Bob Holcomb, Richard Lärkäng, Damien McGinnes, Mark Stijnman
  
++"""
  Exporting is based on 3ds loader from www.gametutorials.com(Thanks DigiBen) and using information
  from the lib3ds project (http://lib3ds.sourceforge.net/) sourcecode.
  """
  
--# ***** BEGIN GPL LICENSE BLOCK *****
--#
--# Script copyright (C) Bob Holcomb
--#
--# This program is free software; you can redistribute it and/or
--# modify it under the terms of the GNU General Public License
--# as published by the Free Software Foundation; either version 2
--# of the License, or (at your option) any later version.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, write to the Free Software Foundation,
--# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
--#
--# ***** END GPL LICENCE BLOCK *****
--# --------------------------------------------------------------------------
--
--
--######################################################
--# Importing modules
--######################################################
--
--import struct
--import os
--import time
--
--import bpy
--
--# import Blender
--# from BPyMesh import getMeshFromObject
--# from BPyObject import getDerivedObjects
--# try:
--#     import struct
--# except:
--#     struct = None
--
--# also used by X3D exporter
--# return a tuple (free, object list), free is True if memory should be freed later with free_derived_objects()
--def create_derived_objects(scene, ob):
--    if ob.parent and ob.parent.dupli_type != 'NONE':
--        return False, None
--
--    if ob.dupli_type != 'NONE':
--        ob.create_dupli_list(scene)
--        return True, [(dob.object, dob.matrix) for dob in ob.dupli_list]
--    else:
--        return False, [(ob, ob.matrix_world)]
--
--# also used by X3D exporter
--def free_derived_objects(ob):
--    ob.free_dupli_list()
--
--# So 3ds max can open files, limit names to 12 in length
--# this is verry annoying for filenames!
--name_unique = []
--name_mapping = {}
--def sane_name(name):
--    name_fixed = name_mapping.get(name)
--    if name_fixed != None:
--        return name_fixed
--
--    if len(name) > 12:
--        new_name = name[:12]
--    else:
--        new_name = name
--
--    i = 0
--
--    while new_name in name_unique:
--        new_name = new_name[:-4] + '.%.3d' % i
--        i+=1
--
--    name_unique.append(new_name)
--    name_mapping[name] = new_name
--    return new_name
--
  ######################################################
  # Data Structures
  ######################################################
  
  #Some of the chunks that we will export
  #----- Primary Chunk, at the beginning of each file
--PRIMARY= int("0x4D4D",16)
++PRIMARY= 0x4D4D
  
  #------ Main Chunks
--OBJECTINFO   =      int("0x3D3D",16);      #This gives the version of the mesh and is found right before the material and object information
--VERSION      =      int("0x0002",16);      #This gives the version of the .3ds file
--KFDATA       =      int("0xB000",16);      #This is the header for all of the key frame info
++OBJECTINFO   =      0x3D3D      #This gives the version of the mesh and is found right before the material and object information
++VERSION      =      0x0002      #This gives the version of the .3ds file
++KFDATA       =      0xB000      #This is the header for all of the key frame info
  
  #------ sub defines of OBJECTINFO
  MATERIAL=45055                #0xAFFF                         // This stored the texture info
  OBJECT=16384          #0x4000                         // This stores the faces, vertices, etc...
  
  #>------ sub defines of MATERIAL
--MATNAME    =      int("0xA000",16);      # This holds the material name
--MATAMBIENT   =      int("0xA010",16);      # Ambient color of the object/material
--MATDIFFUSE   =      int("0xA020",16);      # This holds the color of the object/material
--MATSPECULAR   =      int("0xA030",16);      # SPecular color of the object/material
--MATSHINESS   =      int("0xA040",16);      # ??
--MATMAP       =      int("0xA200",16);      # This is a header for a new material
--MATMAPFILE    =      int("0xA300",16);      # This holds the file name of the texture
++MATNAME    =      0xA000      # This holds the material name
++MATAMBIENT   =      0xA010      # Ambient color of the object/material
++MATDIFFUSE   =      0xA020      # This holds the color of the object/material
++MATSPECULAR   =      0xA030      # SPecular color of the object/material
++MATSHINESS   =      0xA040      # ??
++MATMAP       =      0xA200      # This is a header for a new material
++MATMAPFILE    =      0xA300      # This holds the file name of the texture
  
--RGB1= int("0x0011",16)
--RGB2= int("0x0012",16)
++RGB1= 0x0011
++RGB2= 0x0012
  
  #>------ sub defines of OBJECT
--OBJECT_MESH  =      int("0x4100",16);      # This lets us know that we are reading a new object
--OBJECT_LIGHT =      int("0x4600",16);      # This lets un know we are reading a light object
--OBJECT_CAMERA=      int("0x4700",16);      # This lets un know we are reading a camera object
++OBJECT_MESH  =      0x4100      # This lets us know that we are reading a new object
++OBJECT_LIGHT =      0x4600      # This lets un know we are reading a light object
++OBJECT_CAMERA=      0x4700      # This lets un know we are reading a camera object
  
  #>------ sub defines of CAMERA
--OBJECT_CAM_RANGES=   int("0x4720",16);      # The camera range values
++OBJECT_CAM_RANGES=   0x4720      # The camera range values
  
  #>------ sub defines of OBJECT_MESH
--OBJECT_VERTICES =   int("0x4110",16);      # The objects vertices
--OBJECT_FACES    =   int("0x4120",16);      # The objects faces
--OBJECT_MATERIAL =   int("0x4130",16);      # This is found if the object has a material, either texture map or color
--OBJECT_UV       =   int("0x4140",16);      # The UV texture coordinates
--OBJECT_TRANS_MATRIX  =   int("0x4160",16); # The Object Matrix
++OBJECT_VERTICES =   0x4110      # The objects vertices
++OBJECT_FACES    =   0x4120      # The objects faces
++OBJECT_MATERIAL =   0x4130      # This is found if the object has a material, either texture map or color
++OBJECT_UV       =   0x4140      # The UV texture coordinates
++OBJECT_TRANS_MATRIX  =   0x4160 # The Object Matrix
  
  #>------ sub defines of KFDATA
--KFDATA_KFHDR            = int("0xB00A",16);
--KFDATA_KFSEG            = int("0xB008",16);
--KFDATA_KFCURTIME        = int("0xB009",16);
--KFDATA_OBJECT_NODE_TAG  = int("0xB002",16);
++KFDATA_KFHDR            = 0xB00A
++KFDATA_KFSEG            = 0xB008
++KFDATA_KFCURTIME        = 0xB009
++KFDATA_OBJECT_NODE_TAG  = 0xB002
  
  #>------ sub defines of OBJECT_NODE_TAG
--OBJECT_NODE_ID          = int("0xB030",16);
--OBJECT_NODE_HDR         = int("0xB010",16);
--OBJECT_PIVOT            = int("0xB013",16);
--OBJECT_INSTANCE_NAME    = int("0xB011",16);
--POS_TRACK_TAG                 = int("0xB020",16);
--ROT_TRACK_TAG                 = int("0xB021",16);
--SCL_TRACK_TAG                 = int("0xB022",16);
++OBJECT_NODE_ID          = 0xB030
++OBJECT_NODE_HDR         = 0xB010
++OBJECT_PIVOT            = 0xB013
++OBJECT_INSTANCE_NAME    = 0xB011
++POS_TRACK_TAG                 = 0xB020
++ROT_TRACK_TAG                 = 0xB021
++SCL_TRACK_TAG                 = 0xB022
++
++import struct
++
++# So 3ds max can open files, limit names to 12 in length
++# this is verry annoying for filenames!
++name_unique = []
++name_mapping = {}
++def sane_name(name):
++    name_fixed = name_mapping.get(name)
++    if name_fixed is not None:
++        return name_fixed
++
++    new_name = name[:12]
++
++    i = 0
++
++    while new_name in name_unique:
++        new_name = new_name[:-4] + '.%.3d' % i
++        i+=1
++
++    name_unique.append(new_name)
++    name_mapping[name] = new_name
++    return new_name
  
  def uv_key(uv):
      return round(uv[0], 6), round(uv[1], 6)
@@@ -379,7 -379,7 +316,7 @@@ class _3ds_named_variable(object)
          if (self.value!=None):
              spaces=""
              for i in range(indent):
--                spaces+="  ";
++                spaces += "  "
              if (self.name!=""):
                  print(spaces, self.name, " = ", self.value)
              else:
@@@ -444,7 -444,7 +381,7 @@@ class _3ds_chunk(object)
          Uses the dump function of the named variables and the subchunks to do the actual work.'''
          spaces=""
          for i in range(indent):
--            spaces+="  ";
++            spaces += "  "
          print(spaces, "ID=", hex(self.ID.value), "size=", self.get_size())
          for variable in self.variables:
              variable.dump(indent+1)
@@@ -479,11 -479,11 +416,11 @@@ def make_material_subchunk(id, color)
      Used for color subchunks, such as diffuse color or ambient color subchunks.'''
      mat_sub = _3ds_chunk(id)
      col1 = _3ds_chunk(RGB1)
--    col1.add_variable("color1", _3ds_rgb_color(color));
++    col1.add_variable("color1", _3ds_rgb_color(color))
      mat_sub.add_subchunk(col1)
  # optional:
  #     col2 = _3ds_chunk(RGB1)
--#     col2.add_variable("color2", _3ds_rgb_color(color));
++#     col2.add_variable("color2", _3ds_rgb_color(color))
  #     mat_sub.add_subchunk(col2)
      return mat_sub
  
@@@ -567,7 -567,7 +504,7 @@@ def extract_triangles(mesh)
          f_v = face.vertices
  #             f_v = face.v
  
--        uf = mesh.active_uv_texture.data[i] if do_uv else None
++        uf = mesh.uv_textures.active.data[i] if do_uv else None
  
          if do_uv:
              f_uv = uf.uv
@@@ -921,27 -921,27 +858,21 @@@ def make_kf_obj_node(obj, name_to_id)
      return kf_obj_node
  """
  
--# import BPyMessages
--def write(filename, context):
++
++def save(operator, context, filepath=""):
++    import bpy
++    import time
++    from io_utils import create_derived_objects, free_derived_objects
++    
      '''Save the Blender scene to a 3ds file.'''
++    
      # Time the export
--
--    if not filename.lower().endswith('.3ds'):
--        filename += '.3ds'
--
--    # XXX
--#     if not BPyMessages.Warning_SaveOver(filename):
--#             return
--
--    # XXX
      time1 = time.clock()
--#     time1= Blender.sys.time()
  #     Blender.Window.WaitCursor(1)
  
      sce = context.scene
--#     sce= bpy.data.scenes.active
  
--    if context.object:
++    if bpy.ops.object.mode_set.poll():
          bpy.ops.object.mode_set(mode='OBJECT')
  
      # Initialize the main chunk (primary):
                      if not mat_ls:
                          mat = mat_name = None
  
--                    for f, uf in zip(data.faces, data.active_uv_texture.data):
++                    for f, uf in zip(data.faces, data.uv_textures.active.data):
                          if mat_ls:
                              mat_index = f.material_index
  #                                                     mat_index = f.mat
      # Check the size:
      primary.get_size()
      # Open the file for writing:
--    file = open( filename, 'wb' )
++    file = open(filepath, 'wb')
  
      # Recursively write the chunks to file:
      primary.write(file)
      # Close the file:
      file.close()
  
++    # Clear name mapping vars, could make locals too
++    name_unique[:] = []
++    name_mapping.clear()
++
      # Debugging only: report the exporting time:
  #     Blender.Window.WaitCursor(0)
      print("3ds export time: %.2f" % (time.clock() - time1))
--#     print("3ds export time: %.2f" % (Blender.sys.time() - time1))
  
      # Debugging only: dump the chunk hierarchy:
      #primary.dump()
--
--
--# # write('/test_b.3ds')
--from bpy.props import *
--class Export3DS(bpy.types.Operator):
--    '''Export to 3DS file format (.3ds)'''
--    bl_idname = "export.autodesk_3ds"
--    bl_label = 'Export 3DS'
--
--    filepath = StringProperty(name="File Path", description="Filepath used for exporting the 3DS file", maxlen= 1024, default= "")
--    check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
--
--    @classmethod
--    def poll(cls, context): # Poll isnt working yet
--        return context.active_object != None
--
--    def execute(self, context):
--        filepath = self.properties.filepath
--        filepath = bpy.path.ensure_ext(filepath, ".3ds")
--
--        write(filepath, context)
--        return {'FINISHED'}
--
--    def invoke(self, context, event):
--        import os
--        if not self.properties.is_property_set("filepath"):
--            self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".3ds"
--
--        context.manager.add_fileselect(self)
--        return {'RUNNING_MODAL'}
--
--
--# Add to a menu
--def menu_func(self, context):
--    self.layout.operator(Export3DS.bl_idname, text="3D Studio (.3ds)")
--
--
--def register():
--    bpy.types.INFO_MT_file_export.append(menu_func)
--
--
--def unregister():
--    bpy.types.INFO_MT_file_export.remove(menu_func)
--
--if __name__ == "__main__":
--    register()
++    
++    return {'FINISHED'}
index 6378d93df62c361616e75e102f56e11bad83d519,6378d93df62c361616e75e102f56e11bad83d519..0eed3562b7b466cdafbe6285b9d9fe0ad9a896a4
  
  # <pep8 compliant>
  
--__author__= ['Bob Holcomb', 'Richard L?rk?ng', 'Damien McGinnes', 'Campbell Barton', 'Mario Lapin']
--__url__ = ("blenderartists.org", "www.blender.org", "www.gametutorials.com", "lib3ds.sourceforge.net/")
--__version__= '0.996'
--__bpydoc__= '''\
--
--3ds Importer
--
--This script imports a 3ds file and the materials into Blender for editing.
--
--Loader is based on 3ds loader from www.gametutorials.com (Thanks DigiBen).
--
--0.996 by Mario Lapin (mario.lapin@gmail.com) 13/04/200 <br>
-- - Implemented workaround to correct association between name, geometry and materials of
--   imported meshes.
--
--   Without this patch, version 0.995 of this importer would associate to each mesh object the
--   geometry and the materials of the previously parsed mesh object. By so, the name of the
--   first mesh object would be thrown away, and the name of the last mesh object would be
--   automatically merged with a '.001' at the end. No object would desappear, however object's
--   names and materials would be completely jumbled.
--
--0.995 by Campbell Barton<br>
--- workaround for buggy mesh vert delete
--- minor tweaks
--
--0.99 by Bob Holcomb<br>
--- added support for floating point color values that previously broke on import.
--
--0.98 by Campbell Barton<br>
--- import faces and verts to lists instead of a mesh, convert to a mesh later
--- use new index mapping feature of mesh to re-map faces that were not added.
--
--0.97 by Campbell Barton<br>
--- Strip material names of spaces
--- Added import as instance to import the 3ds into its own
--  scene and add a group instance to the current scene
--- New option to scale down imported objects so they are within a limited bounding area.
--
--0.96 by Campbell Barton<br>
--- Added workaround for bug in setting UV's for Zero vert index UV faces.
--- Removed unique name function, let blender make the names unique.
--
--0.95 by Campbell Barton<br>
--- Removed workarounds for Blender 2.41
--- Mesh objects split by material- many 3ds objects used more then 16 per mesh.
--- Removed a lot of unneeded variable creation.
--
--0.94 by Campbell Barton<br>
--- Face import tested to be about overall 16x speedup over 0.93.
--- Material importing speedup.
--- Tested with more models.
--- Support some corrupt models.
--
--0.93 by Campbell Barton<br>
--- Tested with 400 3ds files from turbosquid and samples.
--- Tactfully ignore faces that used the same verts twice.
--- Rollback to 0.83 sloppy un-reorganized code, this broke UV coord loading.
--- Converted from NMesh to Mesh.
--- Faster and cleaner new names.
--- Use external comprehensive image loader.
--- Re intergrated 0.92 and 0.9 changes
--- Fixes for 2.41 compat.
--- Non textured faces do not use a texture flag.
--
--0.92<br>
--- Added support for diffuse, alpha, spec, bump maps in a single material
--
--0.9<br>
--- Reorganized code into object/material block functions<br>
--- Use of Matrix() to copy matrix data<br>
--- added support for material transparency<br>
--
--0.83 2005-08-07: Campell Barton
---  Aggressive image finding and case insensitivy for posisx systems.
--
--0.82a 2005-07-22
--- image texture loading (both for face uv and renderer)
--
--0.82 - image texture loading (for face uv)
--
--0.81a (fork- not 0.9) Campbell Barton 2005-06-08
--- Simplified import code
--- Never overwrite data
--- Faster list handling
--- Leaves import selected
--
--0.81 Damien McGinnes 2005-01-09
--- handle missing images better
--
--0.8 Damien McGinnes 2005-01-08
--- copies sticky UV coords to face ones
--- handles images better
--- Recommend that you run 'RemoveDoubles' on each imported mesh after using this script
--
--'''
--
--# ***** BEGIN GPL LICENSE BLOCK *****
--#
  # Script copyright (C) Bob Holcomb
--#
--# This program is free software; you can redistribute it and/or
--# modify it under the terms of the GNU General Public License
--# as published by the Free Software Foundation; either version 2
--# of the License, or (at your option) any later version.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, write to the Free Software Foundation,
--# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
--#
--# ***** END GPL LICENCE BLOCK *****
--# --------------------------------------------------------------------------
--
--# Importing modules
++# Contributors: Bob Holcomb, Richard L?rk?ng, Damien McGinnes, Campbell Barton, Mario Lapin
  
  import os
  import time
  import struct
  
--from import_scene_obj import load_image
++from io_utils import load_image
  
  import bpy
  import mathutils
@@@ -158,9 -158,9 +42,9 @@@ BOUNDS_3DS = [
  PRIMARY = int('0x4D4D',16)
  
  #------ Main Chunks
--OBJECTINFO   =      int('0x3D3D',16);      #This gives the version of the mesh and is found right before the material and object information
--VERSION      =      int('0x0002',16);      #This gives the version of the .3ds file
--EDITKEYFRAME=      int('0xB000',16);      #This is the header for all of the key frame info
++OBJECTINFO   =     0x3D3D      #This gives the version of the mesh and is found right before the material and object information
++VERSION      =     0x0002      #This gives the version of the .3ds file
++EDITKEYFRAME=      0xB000      #This is the header for all of the key frame info
  
  #------ sub defines of OBJECTINFO
  MATERIAL = 45055              #0xAFFF                         // This stored the texture info
@@@ -168,62 -168,62 +52,62 @@@ OBJECT = 16384           #0x4000                         // This stor
  
  #>------ sub defines of MATERIAL
  #------ sub defines of MATERIAL_BLOCK
--MAT_NAME              =       int('0xA000',16)        # This holds the material name
--MAT_AMBIENT           =       int('0xA010',16)        # Ambient color of the object/material
--MAT_DIFFUSE           =       int('0xA020',16)        # This holds the color of the object/material
--MAT_SPECULAR  =       int('0xA030',16)        # SPecular color of the object/material
--MAT_SHINESS           =       int('0xA040',16)        # ??
--MAT_TRANSPARENCY=     int('0xA050',16)        # Transparency value of material
--MAT_SELF_ILLUM        =       int('0xA080',16)        # Self Illumination value of material
--MAT_WIRE              =       int('0xA085',16)        # Only render's wireframe
--
--MAT_TEXTURE_MAP       =       int('0xA200',16)        # This is a header for a new texture map
--MAT_SPECULAR_MAP=     int('0xA204',16)        # This is a header for a new specular map
--MAT_OPACITY_MAP       =       int('0xA210',16)        # This is a header for a new opacity map
--MAT_REFLECTION_MAP=   int('0xA220',16)        # This is a header for a new reflection map
--MAT_BUMP_MAP  =       int('0xA230',16)        # This is a header for a new bump map
--MAT_MAP_FILENAME =      int('0xA300',16)      # This holds the file name of the texture
--
--MAT_FLOAT_COLOR = int ('0x0010', 16) #color defined as 3 floats
--MAT_24BIT_COLOR       = int ('0x0011', 16) #color defined as 3 bytes
++MAT_NAME              =       0xA000  # This holds the material name
++MAT_AMBIENT           =       0xA010  # Ambient color of the object/material
++MAT_DIFFUSE           =       0xA020  # This holds the color of the object/material
++MAT_SPECULAR  =       0xA030  # SPecular color of the object/material
++MAT_SHINESS           =       0xA040  # ??
++MAT_TRANSPARENCY=     0xA050  # Transparency value of material
++MAT_SELF_ILLUM        =       0xA080  # Self Illumination value of material
++MAT_WIRE              =       0xA085  # Only render's wireframe
++
++MAT_TEXTURE_MAP       =       0xA200  # This is a header for a new texture map
++MAT_SPECULAR_MAP=     0xA204  # This is a header for a new specular map
++MAT_OPACITY_MAP       =       0xA210  # This is a header for a new opacity map
++MAT_REFLECTION_MAP=   0xA220  # This is a header for a new reflection map
++MAT_BUMP_MAP  =       0xA230  # This is a header for a new bump map
++MAT_MAP_FILEPATH =  0xA300  # This holds the file name of the texture
++
++MAT_FLOAT_COLOR = 0x0010  #color defined as 3 floats
++MAT_24BIT_COLOR       = 0x0011  #color defined as 3 bytes
  
  #>------ sub defines of OBJECT
--OBJECT_MESH  =      int('0x4100',16);      # This lets us know that we are reading a new object
--OBJECT_LAMP =      int('0x4600',16);      # This lets un know we are reading a light object
--OBJECT_LAMP_SPOT = int('0x4610',16);          # The light is a spotloght.
--OBJECT_LAMP_OFF = int('0x4620',16);           # The light off.
--OBJECT_LAMP_ATTENUATE = int('0x4625',16);
--OBJECT_LAMP_RAYSHADE = int('0x4627',16);
--OBJECT_LAMP_SHADOWED = int('0x4630',16);
--OBJECT_LAMP_LOCAL_SHADOW = int('0x4640',16);
--OBJECT_LAMP_LOCAL_SHADOW2 = int('0x4641',16);
--OBJECT_LAMP_SEE_CONE = int('0x4650',16);
--OBJECT_LAMP_SPOT_RECTANGULAR = int('0x4651',16);
--OBJECT_LAMP_SPOT_OVERSHOOT = int('0x4652',16);
--OBJECT_LAMP_SPOT_PROJECTOR = int('0x4653',16);
--OBJECT_LAMP_EXCLUDE = int('0x4654',16);
--OBJECT_LAMP_RANGE = int('0x4655',16);
--OBJECT_LAMP_ROLL = int('0x4656',16);
--OBJECT_LAMP_SPOT_ASPECT = int('0x4657',16);
--OBJECT_LAMP_RAY_BIAS = int('0x4658',16);
--OBJECT_LAMP_INNER_RANGE = int('0x4659',16);
--OBJECT_LAMP_OUTER_RANGE = int('0x465A',16);
--OBJECT_LAMP_MULTIPLIER = int('0x465B',16);
--OBJECT_LAMP_AMBIENT_LIGHT = int('0x4680',16);
--
--
--
--OBJECT_CAMERA=      int('0x4700',16);      # This lets un know we are reading a camera object
++OBJECT_MESH  =      0x4100      # This lets us know that we are reading a new object
++OBJECT_LAMP =      0x4600      # This lets un know we are reading a light object
++OBJECT_LAMP_SPOT = 0x4610             # The light is a spotloght.
++OBJECT_LAMP_OFF = 0x4620              # The light off.
++OBJECT_LAMP_ATTENUATE = 0x4625
++OBJECT_LAMP_RAYSHADE = 0x4627
++OBJECT_LAMP_SHADOWED = 0x4630
++OBJECT_LAMP_LOCAL_SHADOW = 0x4640
++OBJECT_LAMP_LOCAL_SHADOW2 = 0x4641
++OBJECT_LAMP_SEE_CONE = 0x4650
++OBJECT_LAMP_SPOT_RECTANGULAR = 0x4651
++OBJECT_LAMP_SPOT_OVERSHOOT = 0x4652
++OBJECT_LAMP_SPOT_PROJECTOR = 0x4653
++OBJECT_LAMP_EXCLUDE = 0x4654
++OBJECT_LAMP_RANGE = 0x4655
++OBJECT_LAMP_ROLL = 0x4656
++OBJECT_LAMP_SPOT_ASPECT = 0x4657
++OBJECT_LAMP_RAY_BIAS = 0x4658
++OBJECT_LAMP_INNER_RANGE = 0x4659
++OBJECT_LAMP_OUTER_RANGE = 0x465A
++OBJECT_LAMP_MULTIPLIER = 0x465B
++OBJECT_LAMP_AMBIENT_LIGHT = 0x4680
++
++
++
++OBJECT_CAMERA=      0x4700      # This lets un know we are reading a camera object
  
  #>------ sub defines of CAMERA
--OBJECT_CAM_RANGES=   int('0x4720',16);      # The camera range values
++OBJECT_CAM_RANGES=   0x4720      # The camera range values
  
  #>------ sub defines of OBJECT_MESH
--OBJECT_VERTICES =   int('0x4110',16);      # The objects vertices
--OBJECT_FACES    =   int('0x4120',16);      # The objects faces
--OBJECT_MATERIAL =   int('0x4130',16);      # This is found if the object has a material, either texture map or color
--OBJECT_UV       =   int('0x4140',16);      # The UV texture coordinates
--OBJECT_TRANS_MATRIX  =   int('0x4160',16); # The Object Matrix
++OBJECT_VERTICES =   0x4110      # The objects vertices
++OBJECT_FACES    =   0x4120      # The objects faces
++OBJECT_MATERIAL =   0x4130      # This is found if the object has a material, either texture map or color
++OBJECT_UV       =   0x4140      # The UV texture coordinates
++OBJECT_TRANS_MATRIX  =   0x4160 # The Object Matrix
  
  global scn
  scn = None
@@@ -266,12 -266,12 +150,10 @@@ def read_string(file)
          s += struct.unpack('<c', file.read(1))[0]
          #print 'string: ',s
  
++    #remove the null character from the string
      s = str(s[:-1], 'ASCII')
  #     print("read string", s)
--
--    #remove the null character from the string
      return s
--#     return s[:-1]
  
  ######################################################
  # IMPORT
@@@ -300,9 -300,9 +182,20 @@@ def add_texture_to_material(image, text
  
      if image:
          texture.image = image
--#     if image: texture.setImage(image) # double check its an image.
  
--    material.add_texture(texture, "UV", mapto)
++    mtex = material.texture_slots.add()
++    mtex.texture = texture
++    mtex.texture_coords = 'UV'
++    mtex.use_map_color_diffuse = False
++
++    if mapto == 'COLOR':
++        mtex.use_map_color_diffuse = True
++    elif mapto == 'SPECULARITY':
++        mtex.use_map_specular = True
++    elif mapto == 'ALPHA':
++        mtex.use_map_alpha = True
++    elif mapto == 'NORMAL':
++        mtex.use_map_normal = True
  
  
  def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
          bmesh = bpy.data.meshes.new(contextObName)
          if myContextMesh_vertls:
  
--            bmesh.add_geometry(len(myContextMesh_vertls)//3, 0, len(myContextMesh_facels))
++            bmesh.vertices.add(len(myContextMesh_vertls)//3)
++            bmesh.faces.add(len(myContextMesh_facels))
              bmesh.vertices.foreach_set("co", myContextMesh_vertls)
              
              eekadoodle_faces = []
              bmesh.faces.foreach_set("vertices_raw", eekadoodle_faces)
              
              if bmesh.faces and contextMeshUV:
--                bmesh.add_uv_texture()
--                uv_faces = bmesh.active_uv_texture.data[:]
++                bmesh.uv_textures.new()
++                uv_faces = bmesh.uv_textures.active.data[:]
              else:
                  uv_faces = None
  
              for mat_idx, (matName, faces) in enumerate(myContextMeshMaterials.items()):
                  if matName is None:
--                    bmesh.add_material(None)
++                    bmat = None
                  else:
                      bmat = MATDICT[matName][1]
--                    bmesh.add_material(bmat) # can be None
                      img = TEXTURE_DICT.get(bmat.name)
--                
++
++                bmesh.materials.append(bmat) # can be None
++
                  if uv_faces  and img:
                      for fidx in faces:
                          bmesh.faces[fidx].material_index = mat_idx
          return [float(col)/255 for col in struct.unpack('<3B', temp_data)] # data [0,1,2] == rgb
  
      def read_texture(new_chunk, temp_chunk, name, mapto):
--        new_texture = bpy.data.textures.new(name)
--        new_texture.type = 'IMAGE'
--        new_texture = new_texture.recast_type()
++        new_texture = bpy.data.textures.new(name, type='IMAGE')
  
          img = None
          while (new_chunk.bytes_read < new_chunk.length):
              #print 'MAT_TEXTURE_MAP..while', new_chunk.bytes_read, new_chunk.length
              read_chunk(file, temp_chunk)
  
--            if (temp_chunk.ID == MAT_MAP_FILENAME):
++            if (temp_chunk.ID == MAT_MAP_FILEPATH):
                  texture_name = read_string(file)
                  img = TEXTURE_DICT[contextMaterial.name] = load_image(texture_name, dirname)
                  new_chunk.bytes_read += (len(texture_name)+1) #plus one for the null character that gets removed
          if img:
              add_texture_to_material(img, new_texture, contextMaterial, mapto)
  
--    dirname = os.path.dirname(FILENAME)
++    dirname = os.path.dirname(file.name)
  
      #loop through all the data for this chunk (previous chunk) and see what it is
      while (previous_chunk.bytes_read < previous_chunk.length):
              #contextMatrix = contextMatrix * tx
              #contextMatrix = contextMatrix  *tx
  
--        elif  (new_chunk.ID == MAT_MAP_FILENAME):
++        elif  (new_chunk.ID == MAT_MAP_FILEPATH):
              texture_name = read_string(file)
              try:
                  TEXTURE_DICT[contextMaterial.name]
              except:
--                #img = TEXTURE_DICT[contextMaterial.name]= BPyImage.comprehensiveImageLoad(texture_name, FILENAME)
++                #img = TEXTURE_DICT[contextMaterial.name]= BPyImage.comprehensiveImageLoad(texture_name, FILEPATH)
                  img = TEXTURE_DICT[contextMaterial.name] = load_image(texture_name, dirname)
--#                             img = TEXTURE_DICT[contextMaterial.name]= BPyImage.comprehensiveImageLoad(texture_name, FILENAME, PLACE_HOLDER=False, RECURSIVE=IMAGE_SEARCH)
++#                             img = TEXTURE_DICT[contextMaterial.name]= BPyImage.comprehensiveImageLoad(texture_name, FILEPATH, PLACE_HOLDER=False, RECURSIVE=IMAGE_SEARCH)
  
              new_chunk.bytes_read += len(texture_name)+1 #plus one for the null character that gets removed
  
      if CreateBlenderObject:
          putContextMesh(contextMesh_vertls, contextMesh_facels, contextMeshMaterials)
  
--def load_3ds(filename, context, IMPORT_CONSTRAIN_BOUNDS=10.0, IMAGE_SEARCH=True, APPLY_MATRIX=False):
--    global FILENAME, SCN
--#     global FILENAME, SCN_OBJECTS
++def load_3ds(filepath, context, IMPORT_CONSTRAIN_BOUNDS=10.0, IMAGE_SEARCH=True, APPLY_MATRIX=False):
++    global SCN
  
      # XXX
--#     if BPyMessages.Error_NoFile(filename):
++#     if BPyMessages.Error_NoFile(filepath):
  #             return
  
--    print('\n\nImporting 3DS: "%s"' % (filename))
--#     print('\n\nImporting 3DS: "%s"' % (Blender.sys.expandpath(filename)))
++    print('\n\nImporting 3DS: %r' % (filepath))
  
      time1 = time.clock()
  #     time1 = Blender.sys.time()
  
--    FILENAME = filename
      current_chunk = chunk()
  
--    file = open(filename,'rb')
++    file = open(filepath, 'rb')
  
      #here we go!
      # print 'reading the first chunk'
      read_chunk(file, current_chunk)
      if (current_chunk.ID!=PRIMARY):
--        print('\tFatal Error:  Not a valid 3ds file: ', filename)
++        print('\tFatal Error:  Not a valid 3ds file: %r' % filepath)
          file.close()
          return
  
      # Done DUMMYVERT
      """
      if IMPORT_AS_INSTANCE:
--        name = filename.split('\\')[-1].split('/')[-1]
++        name = filepath.split('\\')[-1].split('/')[-1]
          # Create a group for this import.
          group_scn = Scene.New(name)
          for ob in importedObjects:
          # Done constraining to bounds.
  
      # Select all new objects.
--    print('finished importing: "%s" in %.4f sec.' % (filename, (time.clock()-time1)))
--#     print('finished importing: "%s" in %.4f sec.' % (filename, (Blender.sys.time()-time1)))
++    print('finished importing: %r in %.4f sec.' % (filepath, (time.clock()-time1)))
      file.close()
  
  
--DEBUG = False
--# For testing compatibility
--#load_3ds('/metavr/convert/vehicle/truck_002/TruckTanker1.3DS', False)
--#load_3ds('/metavr/archive/convert/old/arranged_3ds_to_hpx-2/only-need-engine-trains/Engine2.3DS', False)
--'''
--
--else:
--    import os
--    # DEBUG ONLY
--    TIME = Blender.sys.time()
--    import os
--    print 'Searching for files'
--    os.system('find /metavr/ -iname "*.3ds" > /tmp/temp3ds_list')
--    # os.system('find /storage/ -iname "*.3ds" > /tmp/temp3ds_list')
--    print '...Done'
--    file = open('/tmp/temp3ds_list', 'r')
--    lines = file.readlines()
--    file.close()
--    # sort by filesize for faster testing
--    lines_size = [(os.path.getsize(f[:-1]), f[:-1]) for f in lines]
--    lines_size.sort()
--    lines = [f[1] for f in lines_size]
--
--
--    def between(v,a,b):
--        if v <= max(a,b) and v >= min(a,b):
--            return True
--        return False
--
--    for i, _3ds in enumerate(lines):
--        if between(i, 650,800):
--            #_3ds= _3ds[:-1]
--            print 'Importing', _3ds, '\nNUMBER', i, 'of', len(lines)
--            _3ds_file= _3ds.split('/')[-1].split('\\')[-1]
--            newScn = Blender.Scene.New(_3ds_file)
--            newScn.makeCurrent()
--            load_3ds(_3ds, False)
--
--    print 'TOTAL TIME: %.6f' % (Blender.sys.time() - TIME)
--
--'''
--from bpy.props import *
--
--
--class IMPORT_OT_autodesk_3ds(bpy.types.Operator):
--    '''Import from 3DS file format (.3ds)'''
--    bl_idname = "import_scene.autodesk_3ds"
--    bl_label = 'Import 3DS'
--
--    # List of operator properties, the attributes will be assigned
--    # to the class instance from the operator settings before calling.
--    filepath = StringProperty(name="File Path", description="Filepath used for importing the 3DS file", maxlen= 1024, default= "")
--
--    constrain_size = FloatProperty(name="Size Constraint", description="Scale the model by 10 until it reacehs the size constraint. Zero Disables.", min=0.0, max=1000.0, soft_min=0.0, soft_max=1000.0, default=10.0)
--    search_images = BoolProperty(name="Image Search", description="Search subdirectories for any assosiated images (Warning, may be slow)", default=True)
--    apply_transform = BoolProperty(name="Apply Transform", description="Workaround for object transformations importing incorrectly", default=False)
--
--    def execute(self, context):
--        load_3ds(self.properties.filepath,
--                 context,
--                 IMPORT_CONSTRAIN_BOUNDS=self.properties.constrain_size,
--                 IMAGE_SEARCH=self.properties.search_images,
--                 APPLY_MATRIX=self.properties.apply_transform)
--
--        return {'FINISHED'}
--
--    def invoke(self, context, event):
--        wm = context.manager
--        wm.add_fileselect(self)
--        return {'RUNNING_MODAL'}
--
--
--def menu_func(self, context):
--    self.layout.operator(IMPORT_OT_autodesk_3ds.bl_idname, text="3D Studio (.3ds)")
--
--def register():
--    bpy.types.INFO_MT_file_import.append(menu_func)
--
--def unregister():
--    bpy.types.INFO_MT_file_import.remove(menu_func)
--
--# NOTES:
--# why add 1 extra vertex? and remove it when done? - "Answer - eekadoodle - would need to re-order UV's without this since face order isnt always what we give blender, BMesh will solve :D"
--# disabled scaling to size, this requires exposing bb (easy) and understanding how it works (needs some time)
--
--if __name__ == "__main__":
--    register()
--
++def load(operator, context, filepath="", constrain_size=0.0, use_image_search=True, use_apply_transform=True):
++    load_3ds(filepath, context, IMPORT_CONSTRAIN_BOUNDS=constrain_size, IMAGE_SEARCH=use_image_search, APPLY_MATRIX=use_apply_transform)
++    return {'FINISHED'}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..f7195600de57d39f37e3d447c50dd6036d80ff6c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,102 @@@
++# ##### BEGIN GPL LICENSE BLOCK #####
++#
++#  This program is free software; you can redistribute it and/or
++#  modify it under the terms of the GNU General Public License
++#  as published by the Free Software Foundation; either version 2
++#  of the License, or (at your option) any later version.
++#
++#  This program is distributed in the hope that it will be useful,
++#  but WITHOUT ANY WARRANTY; without even the implied warranty of
++#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++#  GNU General Public License for more details.
++#
++#  You should have received a copy of the GNU General Public License
++#  along with this program; if not, write to the Free Software Foundation,
++#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
++#
++# ##### END GPL LICENSE BLOCK #####
++
++# <pep8 compliant>
++
++# To support reload properly, try to access a package var, if it's there, reload everything
++if "bpy" in locals():
++    # only reload if we alredy loaded, highly annoying
++    import sys
++    reload(sys.modules.get("io_scene_fbx.export_fbx", sys))
++
++
++import bpy
++from bpy.props import *
++from io_utils import ExportHelper
++
++
++class ExportFBX(bpy.types.Operator, ExportHelper):
++    '''Selection to an ASCII Autodesk FBX'''
++    bl_idname = "export_scene.fbx"
++    bl_label = "Export FBX"
++    
++    filename_ext = ".fbx"
++
++    # List of operator properties, the attributes will be assigned
++    # to the class instance from the operator settings before calling.
++
++    EXP_OBS_SELECTED = BoolProperty(name="Selected Objects", description="Export selected objects on visible layers", default=True)
++#     EXP_OBS_SCENE = BoolProperty(name="Scene Objects", description="Export all objects in this scene", default=True)
++    TX_SCALE = FloatProperty(name="Scale", description="Scale all data, (Note! some imports dont support scaled armatures)", min=0.01, max=1000.0, soft_min=0.01, soft_max=1000.0, default=1.0)
++    TX_XROT90 = BoolProperty(name="Rot X90", description="Rotate all objects 90 degrees about the X axis", default=True)
++    TX_YROT90 = BoolProperty(name="Rot Y90", description="Rotate all objects 90 degrees about the Y axis", default=False)
++    TX_ZROT90 = BoolProperty(name="Rot Z90", description="Rotate all objects 90 degrees about the Z axis", default=False)
++    EXP_EMPTY = BoolProperty(name="Empties", description="Export empty objects", default=True)
++    EXP_CAMERA = BoolProperty(name="Cameras", description="Export camera objects", default=True)
++    EXP_LAMP = BoolProperty(name="Lamps", description="Export lamp objects", default=True)
++    EXP_ARMATURE = BoolProperty(name="Armatures", description="Export armature objects", default=True)
++    EXP_MESH = BoolProperty(name="Meshes", description="Export mesh objects", default=True)
++    EXP_MESH_APPLY_MOD = BoolProperty(name="Modifiers", description="Apply modifiers to mesh objects", default=True)
++    EXP_MESH_HQ_NORMALS = BoolProperty(name="HQ Normals", description="Generate high quality normals", default=True)
++    EXP_IMAGE_COPY = BoolProperty(name="Copy Image Files", description="Copy image files to the destination path", default=False)
++    # armature animation
++    ANIM_ENABLE = BoolProperty(name="Enable Animation", description="Export keyframe animation", default=True)
++    ANIM_OPTIMIZE = BoolProperty(name="Optimize Keyframes", description="Remove double keyframes", default=True)
++    ANIM_OPTIMIZE_PRECISSION = FloatProperty(name="Precision", description="Tolerence for comparing double keyframes (higher for greater accuracy)", min=1, max=16, soft_min=1, soft_max=16, default=6.0)
++#     ANIM_ACTION_ALL = BoolProperty(name="Current Action", description="Use actions currently applied to the armatures (use scene start/end frame)", default=True)
++    ANIM_ACTION_ALL = BoolProperty(name="All Actions", description="Use all actions for armatures, if false, use current action", default=False)
++    # batch
++    BATCH_ENABLE = BoolProperty(name="Enable Batch", description="Automate exporting multiple scenes or groups to files", default=False)
++    BATCH_GROUP = BoolProperty(name="Group > File", description="Export each group as an FBX file, if false, export each scene as an FBX file", default=False)
++    BATCH_OWN_DIR = BoolProperty(name="Own Dir", description="Create a dir for each exported file", default=True)
++    BATCH_FILE_PREFIX = StringProperty(name="Prefix", description="Prefix each file with this name", maxlen=1024, default="")
++
++
++    def execute(self, context):
++        import math
++        from mathutils import Matrix
++        if not self.properties.filepath:
++            raise Exception("filepath not set")
++
++        mtx4_x90n     = Matrix.Rotation(-math.pi/2.0, 4, 'X')
++        mtx4_y90n     = Matrix.Rotation(-math.pi/2.0, 4, 'Y')
++        mtx4_z90n     = Matrix.Rotation(-math.pi/2.0, 4, 'Z')
++
++        GLOBAL_MATRIX = Matrix()
++        GLOBAL_MATRIX[0][0] = GLOBAL_MATRIX[1][1] = GLOBAL_MATRIX[2][2] = self.properties.TX_SCALE
++        if self.properties.TX_XROT90: GLOBAL_MATRIX = mtx4_x90n * GLOBAL_MATRIX
++        if self.properties.TX_YROT90: GLOBAL_MATRIX = mtx4_y90n * GLOBAL_MATRIX
++        if self.properties.TX_ZROT90: GLOBAL_MATRIX = mtx4_z90n * GLOBAL_MATRIX
++
++        import io_scene_fbx.export_fbx
++        return io_scene_fbx.export_fbx.save(self, context, GLOBAL_MATRIX=GLOBAL_MATRIX, **self.properties)
++
++
++def menu_func(self, context):
++    self.layout.operator(ExportFBX.bl_idname, text="Autodesk FBX (.fbx)")
++
++
++def register():
++    bpy.types.INFO_MT_file_export.append(menu_func)
++
++
++def unregister():
++    bpy.types.INFO_MT_file_export.remove(menu_func)
++
++if __name__ == "__main__":
++    register()
index 60e9e90e11b0d7147cba91d8bbff28b3dc3002ec,60e9e90e11b0d7147cba91d8bbff28b3dc3002ec..51a5f86a5e4e1a4df29cce5b728b88eddf59de21
  
  # <pep8 compliant>
  
--__author__ = "Campbell Barton"
--__url__ = ['www.blender.org', 'blenderartists.org']
--__version__ = "1.2"
++# Script copyright (C) Campbell Barton
  
--__bpydoc__ = """\
++"""
  This script is an exporter to the FBX file format.
  
  http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_fbx
  """
--# --------------------------------------------------------------------------
--# FBX Export v0.1 by Campbell Barton (AKA Ideasman)
--# --------------------------------------------------------------------------
--# ***** BEGIN GPL LICENSE BLOCK *****
--#
--# This program is free software; you can redistribute it and/or
--# modify it under the terms of the GNU General Public License
--# as published by the Free Software Foundation; either version 2
--# of the License, or (at your option) any later version.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, write to the Free Software Foundation,
--# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
--#
--# ***** END GPL LICENCE BLOCK *****
--# --------------------------------------------------------------------------
  
  import os
  import time
@@@ -57,19 -57,19 +34,10 @@@ import shutil # for file copyin
  import bpy
  from mathutils import Vector, Euler, Matrix
  
--def copy_file(source, dest):
--    # XXX - remove, can use shutil
--    file = open(source, 'rb')
--    data = file.read()
--    file.close()
--
--    file = open(dest, 'wb')
--    file.write(data)
--    file.close()
--
--
  # XXX not used anymore, images are copied one at a time
  def copy_images(dest_dir, textures):
++    import shutil
++    
      if not dest_dir.endswith(os.sep):
          dest_dir += os.sep
  
              # Make a name for the target path.
              dest_image_path = dest_dir + image_path.split('\\')[-1].split('/')[-1]
              if not Blender.sys.exists(dest_image_path): # Image isnt already there
--                print('\tCopying "%s" > "%s"' % (image_path, dest_image_path))
++                print("\tCopying %r > %r" % (image_path, dest_image_path))
                  try:
--                    copy_file(image_path, dest_image_path)
++                    shutil.copy(image_path, dest_image_path)
                      copyCount+=1
                  except:
--                    print('\t\tWarning, file failed to copy, skipping.')
++                    print("\t\tWarning, file failed to copy, skipping.")
  
      print('\tCopied %d images' % copyCount)
  
@@@ -104,27 -104,27 +72,11 @@@ def eulerRadToDeg(eul)
  
      return ret
  
--mtx4_identity = Matrix()
--
--# testing
--mtx_x90               = Matrix.Rotation( math.pi/2, 3, 'X') # used
--#mtx_x90n     = Matrix.Rotation(-90, 3, 'x')
--#mtx_y90      = Matrix.Rotation( 90, 3, 'y')
--#mtx_y90n     = Matrix.Rotation(-90, 3, 'y')
--#mtx_z90      = Matrix.Rotation( 90, 3, 'z')
--#mtx_z90n     = Matrix.Rotation(-90, 3, 'z')
--
--#mtx4_x90     = Matrix.Rotation( 90, 4, 'x')
--mtx4_x90n     = Matrix.Rotation(-math.pi/2, 4, 'X') # used
--#mtx4_y90     = Matrix.Rotation( 90, 4, 'y')
--mtx4_y90n     = Matrix.Rotation(-math.pi/2, 4, 'Y') # used
--mtx4_z90      = Matrix.Rotation( math.pi/2, 4, 'Z') # used
--mtx4_z90n     = Matrix.Rotation(-math.pi/2, 4, 'Z') # used
  
  # def strip_path(p):
  #     return p.split('\\')[-1].split('/')[-1]
  
--# Used to add the scene name into the filename without using odd chars
++# Used to add the scene name into the filepath without using odd chars
  sane_name_mapping_ob = {}
  sane_name_mapping_mat = {}
  sane_name_mapping_tex = {}
@@@ -197,7 -197,7 +149,7 @@@ def sane_groupname(data):  return sane_n
  #     '''
  #     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.
++#     FORCE_CWD - dont use the basepath, just add a ./ to the filepath.
  #             use when we know the file will be in the basepath.
  #     '''
  #     fname = bpy.path.abspath(fname_orig)
@@@ -282,19 -282,19 +234,17 @@@ header_comment = 
  
  '''
  
--# This func can be called with just the filename
--def write(filename, batch_objects = None, \
--        context = None,
++# This func can be called with just the filepath
++def save(operator, context, filepath="", \
          EXP_OBS_SELECTED =                    True,
          EXP_MESH =                                    True,
          EXP_MESH_APPLY_MOD =          True,
--#             EXP_MESH_HQ_NORMALS =           False,
          EXP_ARMATURE =                                True,
          EXP_LAMP =                                    True,
          EXP_CAMERA =                          True,
          EXP_EMPTY =                                   True,
          EXP_IMAGE_COPY =                      False,
--        GLOBAL_MATRIX =                               Matrix(),
++        GLOBAL_MATRIX =                               None,
          ANIM_ENABLE =                         True,
          ANIM_OPTIMIZE =                               True,
          ANIM_OPTIMIZE_PRECISSION =    6,
          BATCH_OWN_DIR =                               False
      ):
  
--    if bpy.context.object:
++    #XXX, missing arg 
++    batch_objects = None
++
++    # testing
++    mtx_x90           = Matrix.Rotation( math.pi/2.0, 3, 'X') # used
++    mtx4_z90  = Matrix.Rotation( math.pi/2.0, 4, 'Z')
++
++    if GLOBAL_MATRIX is None:
++        GLOBAL_MATRIX = Matrix()
++
++    if bpy.ops.object.mode_set.poll():
          bpy.ops.object.mode_set(mode='OBJECT')
  
      # ----------------- Batch support!
      if BATCH_ENABLE:
          if os == None:        BATCH_OWN_DIR = False
  
--        fbxpath = filename
++        fbxpath = filepath
  
--        # get the path component of filename
++        # get the path component of filepath
          tmp_exists = bpy.utils.exists(fbxpath)
  #             tmp_exists = Blender.sys.exists(fbxpath)
  
  #                     while fbxpath and fbxpath[-1] not in ('/', '\\'):
  #                             fbxpath = fbxpath[:-1]
              if not fbxpath:
--#                     if not filename:
++#                     if not filepath:
                  # XXX
                  print('Error%t|Directory does not exist!')
  #                             Draw.PupMenu('Error%t|Directory does not exist!')
                      os.mkdir(new_fbxpath)
  
  
--            filename = new_fbxpath + newname + '.fbx'
++            filepath = new_fbxpath + newname + '.fbx'
  
--            print('\nBatch exporting %s as...\n\t"%s"' % (data, filename))
++            print('\nBatch exporting %s as...\n\t%r' % (data, filepath))
  
              # XXX don't know what to do with this, probably do the same? (Arystan)
              if BATCH_GROUP: #group
  
              # Call self with modified args
              # Dont pass batch options since we already usedt them
--            write(filename, data.objects,
++            write(filepath, data.objects,
                  context,
                  False,
                  EXP_MESH,
                  EXP_MESH_APPLY_MOD,
--#                             EXP_MESH_HQ_NORMALS,
                  EXP_ARMATURE,
                  EXP_LAMP,
                  EXP_CAMERA,
      # end batch support
  
      # Use this for working out paths relative to the export location
--    basepath = os.path.dirname(filename) or '.'
++    basepath = os.path.dirname(filepath) or '.'
      basepath += os.sep
--#     basepath = Blender.sys.dirname(filename)
++#     basepath = Blender.sys.dirname(filepath)
  
      # ----------------------------------------------
      # storage classes
  
  
  
--    print('\nFBX export starting...', filename)
++    print('\nFBX export starting... %r' % filepath)
      start_time = time.clock()
  #     start_time = Blender.sys.time()
      try:
--        file = open(filename, 'w')
++        file = open(filepath, 'w')
      except:
          return False
  
  #             if me.vertexColors:
              collayers = me.vertex_colors
  #                     collayers = me.getColorLayerNames()
--            collayer_orig = me.active_vertex_color
++            collayer_orig = me.vertex_colors.active
  #                     collayer_orig = me.activeColorLayer
              for colindex, collayer in enumerate(collayers):
  #                             me.activeColorLayer = collayer
          if do_uvs:
              uvlayers = me.uv_textures
  #                     uvlayers = me.getUVLayerNames()
--            uvlayer_orig = me.active_uv_texture
++            uvlayer_orig = me.uv_textures.active
  #                     uvlayer_orig = me.activeUVLayer
              for uvindex, uvlayer in enumerate(me.uv_textures):
  #                     for uvindex, uvlayer in enumerate(uvlayers):
  
                  mats = my_mesh.blenMaterialList
  
--                if me.active_uv_texture:
--                    uv_faces = me.active_uv_texture.data
++                if me.uv_textures.active:
++                    uv_faces = me.uv_textures.active.data
                  else:
                      uv_faces = [None] * len(me.faces)
  
                      ob_base.update(scene)
  
              # This causes the makeDisplayList command to effect the mesh
--            scene.set_frame(scene.frame_current)
++            scene.frame_set(scene.frame_current)
  #                     Blender.Set('curframe', Blender.Get('curframe'))
  
  
                      material_mapping_local = {}
                      if len(me.uv_textures) > 0:
  #                                     if me.faceUV:
--                        uvlayer_orig = me.active_uv_texture
++                        uvlayer_orig = me.uv_textures.active
  #                                             uvlayer_orig = me.activeUVLayer
                          for uvlayer in me.uv_textures:
  #                                             for uvlayer in me.getUVLayerNames():
                  if ob_base.type == 'ARMATURE':
                      ob_base.update(scene)
              # This causes the makeDisplayList command to effect the mesh
--            scene.set_frame(scene.frame_current)
++            scene.frame_set(scene.frame_current)
  #                     Blender.Set('curframe', Blender.Get('curframe'))
  
      del tmp_ob_type, tmp_objects
@@@ -2472,7 -2472,7 +2431,7 @@@ Objects:  {'''
          file.write('\n\t\tPoseNode:  {')
          file.write('\n\t\t\tNode: "Model::%s"' % fbxName )
          if matrix:            file.write('\n\t\t\tMatrix: %s' % mat4x4str(matrix))
--        else:                 file.write('\n\t\t\tMatrix: %s' % mat4x4str(mtx4_identity))
++        else:                 file.write('\n\t\t\tMatrix: %s' % mat4x4str(Matrix()))
          file.write('\n\t\t}')
  
      file.write('\n\t}')
@@@ -2760,7 -2760,7 +2719,9 @@@ Takes:  {'''
                  else:
                      file.write('\n\tTake: "%s" {' % sane_takename(blenAction))
  
--                act_start, act_end = blenAction.get_frame_range()
++                act_start, act_end = blenAction.frame_range
++                act_start = int(act_start)
++                act_end = int(act_end)
  #                             tmp = blenAction.getFrameNumbers()
  #                             if tmp:
  #                                     act_start =     min(tmp)
              '''
              i = act_start
              while i <= act_end:
--                scene.set_frame(i)
++                scene.frame_set(i)
  #                             Blender.Set('curframe', i)
                  for ob_generic in ob_anim_lists:
                      for my_ob in ob_generic:
  
          file.write('\n}')
  
--        scene.set_frame(frame_orig)
--#             Blender.Set('curframe', frame_orig)
++        scene.frame_set(frame_orig)
  
      else:
          # no animation
  
      # --------------------------- Footer
      if world:
--        m = world.mist
++        m = world.mist_settings
          has_mist = m.use_mist
          mist_intense = m.intensity
          mist_start = m.start
          mist_end = m.depth
          mist_height = m.height
--#             mist_intense, mist_start, mist_end, mist_height = world.mist
          world_hor = world.horizon_color
--#             world_hor = world.hor
      else:
          has_mist = mist_intense = mist_start = mist_end = mist_height = 0
--        world_hor = 0,0,0
++        world_hor = 0, 0, 0
  
      file.write('\n;Version 5 settings')
      file.write('\n;------------------------------------------------------------------')
  #             bpy.util.copy_images( [ tex[1] for tex in textures if tex[1] != None ], basepath)
  
      print('export finished in %.4f sec.' % (time.clock() - start_time))
--#     print 'export finished in %.4f sec.' % (Blender.sys.time() - start_time)
--    return True
--
--
--# --------------------------------------------
--# UI Function - not a part of the exporter.
--# this is to separate the user interface from the rest of the exporter.
--# from Blender import Draw, Window
--EVENT_NONE = 0
--EVENT_EXIT = 1
--EVENT_REDRAW = 2
--EVENT_FILESEL = 3
--
--GLOBALS = {}
--
--# export opts
--
--def do_redraw(e,v):           GLOBALS['EVENT'] = e
--
--# toggle between these 2, only allow one on at once
--def do_obs_sel(e,v):
--    GLOBALS['EVENT'] = e
--    GLOBALS['EXP_OBS_SCENE'].val = 0
--    GLOBALS['EXP_OBS_SELECTED'].val = 1
--
--def do_obs_sce(e,v):
--    GLOBALS['EVENT'] = e
--    GLOBALS['EXP_OBS_SCENE'].val = 1
--    GLOBALS['EXP_OBS_SELECTED'].val = 0
--
--def do_batch_type_grp(e,v):
--    GLOBALS['EVENT'] = e
--    GLOBALS['BATCH_GROUP'].val = 1
--    GLOBALS['BATCH_SCENE'].val = 0
--
--def do_batch_type_sce(e,v):
--    GLOBALS['EVENT'] = e
--    GLOBALS['BATCH_GROUP'].val = 0
--    GLOBALS['BATCH_SCENE'].val = 1
--
--def do_anim_act_all(e,v):
--    GLOBALS['EVENT'] = e
--    GLOBALS['ANIM_ACTION_ALL'][0].val = 1
--    GLOBALS['ANIM_ACTION_ALL'][1].val = 0
--
--def do_anim_act_cur(e,v):
--    if GLOBALS['BATCH_ENABLE'].val and GLOBALS['BATCH_GROUP'].val:
--        Draw.PupMenu('Warning%t|Cant use this with batch export group option')
--    else:
--        GLOBALS['EVENT'] = e
--        GLOBALS['ANIM_ACTION_ALL'][0].val = 0
--        GLOBALS['ANIM_ACTION_ALL'][1].val = 1
--
--def fbx_ui_exit(e,v):
--    GLOBALS['EVENT'] = e
--
--def do_help(e,v):
--    url = 'http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_fbx'
--    print('Trying to open web browser with documentation at this address...')
--    print('\t' + url)
--
--    try:
--        import webbrowser
--        webbrowser.open(url)
--    except:
--        Blender.Draw.PupMenu("Error%t|Opening a webbrowser requires a full python installation")
--        print('...could not open a browser window.')
--
--
--
--# run when export is pressed
--#def fbx_ui_write(e,v):
--def fbx_ui_write(filename, context):
--
--    # Dont allow overwriting files when saving normally
--    if not GLOBALS['BATCH_ENABLE'].val:
--        if not BPyMessages.Warning_SaveOver(filename):
--            return
--
--    GLOBALS['EVENT'] = EVENT_EXIT
--
--    # Keep the order the same as above for simplicity
--    # the [] is a dummy arg used for objects
--
--    Blender.Window.WaitCursor(1)
--
--    # Make the matrix
--    GLOBAL_MATRIX = mtx4_identity
--    GLOBAL_MATRIX[0][0] = GLOBAL_MATRIX[1][1] = GLOBAL_MATRIX[2][2] = GLOBALS['_SCALE'].val
--    if GLOBALS['_XROT90'].val:        GLOBAL_MATRIX = mtx4_x90n * GLOBAL_MATRIX
--    if GLOBALS['_YROT90'].val:        GLOBAL_MATRIX = mtx4_y90n * GLOBAL_MATRIX
--    if GLOBALS['_ZROT90'].val:        GLOBAL_MATRIX = mtx4_z90n * GLOBAL_MATRIX
--
--    ret = write(\
--        filename, None,\
--        context,
--        GLOBALS['EXP_OBS_SELECTED'].val,\
--        GLOBALS['EXP_MESH'].val,\
--        GLOBALS['EXP_MESH_APPLY_MOD'].val,\
--        GLOBALS['EXP_MESH_HQ_NORMALS'].val,\
--        GLOBALS['EXP_ARMATURE'].val,\
--        GLOBALS['EXP_LAMP'].val,\
--        GLOBALS['EXP_CAMERA'].val,\
--        GLOBALS['EXP_EMPTY'].val,\
--        GLOBALS['EXP_IMAGE_COPY'].val,\
--        GLOBAL_MATRIX,\
--        GLOBALS['ANIM_ENABLE'].val,\
--        GLOBALS['ANIM_OPTIMIZE'].val,\
--        GLOBALS['ANIM_OPTIMIZE_PRECISSION'].val,\
--        GLOBALS['ANIM_ACTION_ALL'][0].val,\
--        GLOBALS['BATCH_ENABLE'].val,\
--        GLOBALS['BATCH_GROUP'].val,\
--        GLOBALS['BATCH_SCENE'].val,\
--        GLOBALS['BATCH_FILE_PREFIX'].val,\
--        GLOBALS['BATCH_OWN_DIR'].val,\
--    )
--
--    Blender.Window.WaitCursor(0)
--    GLOBALS.clear()
--
--    if ret == False:
--        Draw.PupMenu('Error%t|Path cannot be written to!')
--
--
--def fbx_ui():
--    # Only to center the UI
--    x,y = GLOBALS['MOUSE']
--    x-=180; y-=0 # offset... just to get it centered
--
--    Draw.Label('Export Objects...', x+20,y+165, 200, 20)
--
--    if not GLOBALS['BATCH_ENABLE'].val:
--        Draw.BeginAlign()
--        GLOBALS['EXP_OBS_SELECTED'] = Draw.Toggle('Selected Objects', EVENT_REDRAW, x+20,  y+145, 160, 20, GLOBALS['EXP_OBS_SELECTED'].val,   'Export selected objects on visible layers', do_obs_sel)
--        GLOBALS['EXP_OBS_SCENE'] =            Draw.Toggle('Scene Objects',    EVENT_REDRAW, x+180,  y+145, 160, 20, GLOBALS['EXP_OBS_SCENE'].val,             'Export all objects in this scene', do_obs_sce)
--        Draw.EndAlign()
--
--    Draw.BeginAlign()
--    GLOBALS['_SCALE'] =               Draw.Number('Scale:',   EVENT_NONE, x+20, y+120, 140, 20, GLOBALS['_SCALE'].val,        0.01, 1000.0, 'Scale all data, (Note! some imports dont support scaled armatures)')
--    GLOBALS['_XROT90'] =      Draw.Toggle('Rot X90',  EVENT_NONE, x+160, y+120, 60, 20, GLOBALS['_XROT90'].val,               'Rotate all objects 90 degrees about the X axis')
--    GLOBALS['_YROT90'] =      Draw.Toggle('Rot Y90',  EVENT_NONE, x+220, y+120, 60, 20, GLOBALS['_YROT90'].val,               'Rotate all objects 90 degrees about the Y axis')
--    GLOBALS['_ZROT90'] =      Draw.Toggle('Rot Z90',  EVENT_NONE, x+280, y+120, 60, 20, GLOBALS['_ZROT90'].val,               'Rotate all objects 90 degrees about the Z axis')
--    Draw.EndAlign()
--
--    y -= 35
--
--    Draw.BeginAlign()
--    GLOBALS['EXP_EMPTY'] =            Draw.Toggle('Empty',    EVENT_NONE, x+20, y+120, 60, 20, GLOBALS['EXP_EMPTY'].val,              'Export empty objects')
--    GLOBALS['EXP_CAMERA'] =           Draw.Toggle('Camera',   EVENT_NONE, x+80, y+120, 60, 20, GLOBALS['EXP_CAMERA'].val,             'Export camera objects')
--    GLOBALS['EXP_LAMP'] =             Draw.Toggle('Lamp',             EVENT_NONE, x+140, y+120, 60, 20, GLOBALS['EXP_LAMP'].val,              'Export lamp objects')
--    GLOBALS['EXP_ARMATURE'] = Draw.Toggle('Armature', EVENT_NONE, x+200,  y+120, 60, 20, GLOBALS['EXP_ARMATURE'].val, 'Export armature objects')
--    GLOBALS['EXP_MESH'] =             Draw.Toggle('Mesh',             EVENT_REDRAW, x+260,  y+120, 80, 20, GLOBALS['EXP_MESH'].val,   'Export mesh objects', do_redraw) #, do_axis_z)
--    Draw.EndAlign()
--
--    if GLOBALS['EXP_MESH'].val:
--        # below mesh but
--        Draw.BeginAlign()
--        GLOBALS['EXP_MESH_APPLY_MOD'] =               Draw.Toggle('Modifiers',        EVENT_NONE, x+260,  y+100, 80, 20, GLOBALS['EXP_MESH_APPLY_MOD'].val,           'Apply modifiers to mesh objects') #, do_axis_z)
--        GLOBALS['EXP_MESH_HQ_NORMALS'] =      Draw.Toggle('HQ Normals',               EVENT_NONE, x+260,  y+80, 80, 20, GLOBALS['EXP_MESH_HQ_NORMALS'].val,           'Generate high quality normals') #, do_axis_z)
--        Draw.EndAlign()
--
--    GLOBALS['EXP_IMAGE_COPY'] =               Draw.Toggle('Copy Image Files', EVENT_NONE, x+20, y+80, 160, 20, GLOBALS['EXP_IMAGE_COPY'].val,         'Copy image files to the destination path') #, do_axis_z)
--
--
--    Draw.Label('Export Armature Animation...', x+20,y+45, 300, 20)
--
--    GLOBALS['ANIM_ENABLE'] =  Draw.Toggle('Enable Animation',         EVENT_REDRAW, x+20,  y+25, 160, 20, GLOBALS['ANIM_ENABLE'].val,         'Export keyframe animation', do_redraw)
--    if GLOBALS['ANIM_ENABLE'].val:
--        Draw.BeginAlign()
--        GLOBALS['ANIM_OPTIMIZE'] =                            Draw.Toggle('Optimize Keyframes',       EVENT_REDRAW, x+20,  y+0, 160, 20, GLOBALS['ANIM_OPTIMIZE'].val,        'Remove double keyframes', do_redraw)
--        if GLOBALS['ANIM_OPTIMIZE'].val:
--            GLOBALS['ANIM_OPTIMIZE_PRECISSION'] =     Draw.Number('Precission: ',                     EVENT_NONE, x+180,  y+0, 160, 20, GLOBALS['ANIM_OPTIMIZE_PRECISSION'].val,      1, 16, 'Tolerence for comparing double keyframes (higher for greater accuracy)')
--        Draw.EndAlign()
--
--        Draw.BeginAlign()
--        GLOBALS['ANIM_ACTION_ALL'][1] =       Draw.Toggle('Current Action',   EVENT_REDRAW, x+20, y-25, 160, 20, GLOBALS['ANIM_ACTION_ALL'][1].val,           'Use actions currently applied to the armatures (use scene start/end frame)', do_anim_act_cur)
--        GLOBALS['ANIM_ACTION_ALL'][0] =               Draw.Toggle('All Actions',      EVENT_REDRAW, x+180,y-25, 160, 20, GLOBALS['ANIM_ACTION_ALL'][0].val,           'Use all actions for armatures', do_anim_act_all)
--        Draw.EndAlign()
--
--
--    Draw.Label('Export Batch...', x+20,y-60, 300, 20)
--    GLOBALS['BATCH_ENABLE'] = Draw.Toggle('Enable Batch',             EVENT_REDRAW, x+20,  y-80, 160, 20, GLOBALS['BATCH_ENABLE'].val,                'Automate exporting multiple scenes or groups to files', do_redraw)
--
--    if GLOBALS['BATCH_ENABLE'].val:
--        Draw.BeginAlign()
--        GLOBALS['BATCH_GROUP'] =      Draw.Toggle('Group > File',     EVENT_REDRAW, x+20,  y-105, 160, 20, GLOBALS['BATCH_GROUP'].val,                'Export each group as an FBX file', do_batch_type_grp)
--        GLOBALS['BATCH_SCENE'] =      Draw.Toggle('Scene > File',     EVENT_REDRAW, x+180,  y-105, 160, 20, GLOBALS['BATCH_SCENE'].val,       'Export each scene as an FBX file', do_batch_type_sce)
--
--        # Own dir requires OS module
--        if os:
--            GLOBALS['BATCH_OWN_DIR'] =                Draw.Toggle('Own Dir',  EVENT_NONE, x+20,  y-125, 80, 20, GLOBALS['BATCH_OWN_DIR'].val,         'Create a dir for each exported file')
--            GLOBALS['BATCH_FILE_PREFIX'] =    Draw.String('Prefix: ', EVENT_NONE, x+100,  y-125, 240, 20, GLOBALS['BATCH_FILE_PREFIX'].val, 64,       'Prefix each file with this name ')
--        else:
--            GLOBALS['BATCH_FILE_PREFIX'] =    Draw.String('Prefix: ', EVENT_NONE, x+20,  y-125, 320, 20, GLOBALS['BATCH_FILE_PREFIX'].val, 64,        'Prefix each file with this name ')
--
--
--        Draw.EndAlign()
--
--    #y+=80
--
--    '''
--    Draw.BeginAlign()
--    GLOBALS['FILENAME'] =     Draw.String('path: ',   EVENT_NONE, x+20,  y-170, 300, 20, GLOBALS['FILENAME'].val, 64, 'Prefix each file with this name ')
--    Draw.PushButton('..',     EVENT_FILESEL, x+320,  y-170, 20, 20,           'Select the path', do_redraw)
--    '''
--    # Until batch is added
--    #
--
--
--    #Draw.BeginAlign()
--    Draw.PushButton('Online Help',    EVENT_REDRAW, x+20, y-160, 100, 20,     'Open online help in a browser window', do_help)
--    Draw.PushButton('Cancel',         EVENT_EXIT, x+130, y-160, 100, 20,      'Exit the exporter', fbx_ui_exit)
--    Draw.PushButton('Export',         EVENT_FILESEL, x+240, y-160, 100, 20,   'Export the fbx file', do_redraw)
--
--    #Draw.PushButton('Export',        EVENT_EXIT, x+180, y-160, 160, 20,      'Export the fbx file', fbx_ui_write)
--    #Draw.EndAlign()
--
--    # exit when mouse out of the view?
--    # GLOBALS['EVENT'] = EVENT_EXIT
--
--#def write_ui(filename):
--def write_ui():
--
--    # globals
--    GLOBALS['EVENT'] = EVENT_REDRAW
--    #GLOBALS['MOUSE'] = Window.GetMouseCoords()
--    GLOBALS['MOUSE'] = [i/2 for i in Window.GetScreenSize()]
--    GLOBALS['FILENAME'] = ''
--    '''
--    # IF called from the fileselector
--    if filename == None:
--        GLOBALS['FILENAME'] = filename # Draw.Create(Blender.sys.makename(ext='.fbx'))
--    else:
--        GLOBALS['FILENAME'].val = filename
--    '''
--    GLOBALS['EXP_OBS_SELECTED'] =                     Draw.Create(1) # dont need 2 variables but just do this for clarity
--    GLOBALS['EXP_OBS_SCENE'] =                                Draw.Create(0)
--
--    GLOBALS['EXP_MESH'] =                                     Draw.Create(1)
--    GLOBALS['EXP_MESH_APPLY_MOD'] =                   Draw.Create(1)
--    GLOBALS['EXP_MESH_HQ_NORMALS'] =          Draw.Create(0)
--    GLOBALS['EXP_ARMATURE'] =                         Draw.Create(1)
--    GLOBALS['EXP_LAMP'] =                                     Draw.Create(1)
--    GLOBALS['EXP_CAMERA'] =                                   Draw.Create(1)
--    GLOBALS['EXP_EMPTY'] =                                    Draw.Create(1)
--    GLOBALS['EXP_IMAGE_COPY'] =                               Draw.Create(0)
--    # animation opts
--    GLOBALS['ANIM_ENABLE'] =                          Draw.Create(1)
--    GLOBALS['ANIM_OPTIMIZE'] =                                Draw.Create(1)
--    GLOBALS['ANIM_OPTIMIZE_PRECISSION'] =     Draw.Create(4) # decimal places
--    GLOBALS['ANIM_ACTION_ALL'] =                      [Draw.Create(0), Draw.Create(1)] # not just the current action
--
--    # batch export options
--    GLOBALS['BATCH_ENABLE'] =                         Draw.Create(0)
--    GLOBALS['BATCH_GROUP'] =                          Draw.Create(1) # cant have both of these enabled at once.
--    GLOBALS['BATCH_SCENE'] =                          Draw.Create(0) # see above
--    GLOBALS['BATCH_FILE_PREFIX'] =                    Draw.Create(Blender.sys.makename(ext='_').split('\\')[-1].split('/')[-1])
--    GLOBALS['BATCH_OWN_DIR'] =                                Draw.Create(0)
--    # done setting globals
--
--    # Used by the user interface
--    GLOBALS['_SCALE'] =                                               Draw.Create(1.0)
--    GLOBALS['_XROT90'] =                                      Draw.Create(True)
--    GLOBALS['_YROT90'] =                                      Draw.Create(False)
--    GLOBALS['_ZROT90'] =                                      Draw.Create(False)
--
--    # best not do move the cursor
--    # Window.SetMouseCoords(*[i/2 for i in Window.GetScreenSize()])
--
--    # hack so the toggle buttons redraw. this is not nice at all
--    while GLOBALS['EVENT'] != EVENT_EXIT:
--
--        if GLOBALS['BATCH_ENABLE'].val and GLOBALS['BATCH_GROUP'].val and GLOBALS['ANIM_ACTION_ALL'][1].val:
--            #Draw.PupMenu("Warning%t|Cant batch export groups with 'Current Action' ")
--            GLOBALS['ANIM_ACTION_ALL'][0].val = 1
--            GLOBALS['ANIM_ACTION_ALL'][1].val = 0
--
--        if GLOBALS['EVENT'] == EVENT_FILESEL:
--            if GLOBALS['BATCH_ENABLE'].val:
--                txt = 'Batch FBX Dir'
--                name = Blender.sys.expandpath('//')
--            else:
--                txt = 'Export FBX'
--                name = Blender.sys.makename(ext='.fbx')
--
--            Blender.Window.FileSelector(fbx_ui_write, txt, name)
--            #fbx_ui_write('/test.fbx')
--            break
--
--        Draw.UIBlock(fbx_ui, 0)
--
--
--    # GLOBALS.clear()
--from bpy.props import *
--class ExportFBX(bpy.types.Operator):
--    '''Selection to an ASCII Autodesk FBX'''
--    bl_idname = "export.fbx"
--    bl_label = "Export FBX"
--
--    # List of operator properties, the attributes will be assigned
--    # to the class instance from the operator settings before calling.
--
--
--    filepath = StringProperty(name="File Path", description="Filepath used for exporting the FBX file", maxlen= 1024, default="")
--    check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
--
--    EXP_OBS_SELECTED = BoolProperty(name="Selected Objects", description="Export selected objects on visible layers", default=True)
--#     EXP_OBS_SCENE = BoolProperty(name="Scene Objects", description="Export all objects in this scene", default=True)
--    TX_SCALE = FloatProperty(name="Scale", description="Scale all data, (Note! some imports dont support scaled armatures)", min=0.01, max=1000.0, soft_min=0.01, soft_max=1000.0, default=1.0)
--    TX_XROT90 = BoolProperty(name="Rot X90", description="Rotate all objects 90 degrees about the X axis", default=True)
--    TX_YROT90 = BoolProperty(name="Rot Y90", description="Rotate all objects 90 degrees about the Y axis", default=False)
--    TX_ZROT90 = BoolProperty(name="Rot Z90", description="Rotate all objects 90 degrees about the Z axis", default=False)
--    EXP_EMPTY = BoolProperty(name="Empties", description="Export empty objects", default=True)
--    EXP_CAMERA = BoolProperty(name="Cameras", description="Export camera objects", default=True)
--    EXP_LAMP = BoolProperty(name="Lamps", description="Export lamp objects", default=True)
--    EXP_ARMATURE = BoolProperty(name="Armatures", description="Export armature objects", default=True)
--    EXP_MESH = BoolProperty(name="Meshes", description="Export mesh objects", default=True)
--    EXP_MESH_APPLY_MOD = BoolProperty(name="Modifiers", description="Apply modifiers to mesh objects", default=True)
--    EXP_MESH_HQ_NORMALS = BoolProperty(name="HQ Normals", description="Generate high quality normals", default=True)
--    EXP_IMAGE_COPY = BoolProperty(name="Copy Image Files", description="Copy image files to the destination path", default=False)
--    # armature animation
--    ANIM_ENABLE = BoolProperty(name="Enable Animation", description="Export keyframe animation", default=True)
--    ANIM_OPTIMIZE = BoolProperty(name="Optimize Keyframes", description="Remove double keyframes", default=True)
--    ANIM_OPTIMIZE_PRECISSION = FloatProperty(name="Precision", description="Tolerence for comparing double keyframes (higher for greater accuracy)", min=1, max=16, soft_min=1, soft_max=16, default=6.0)
--#     ANIM_ACTION_ALL = BoolProperty(name="Current Action", description="Use actions currently applied to the armatures (use scene start/end frame)", default=True)
--    ANIM_ACTION_ALL = BoolProperty(name="All Actions", description="Use all actions for armatures, if false, use current action", default=False)
--    # batch
--    BATCH_ENABLE = BoolProperty(name="Enable Batch", description="Automate exporting multiple scenes or groups to files", default=False)
--    BATCH_GROUP = BoolProperty(name="Group > File", description="Export each group as an FBX file, if false, export each scene as an FBX file", default=False)
--    BATCH_OWN_DIR = BoolProperty(name="Own Dir", description="Create a dir for each exported file", default=True)
--    BATCH_FILE_PREFIX = StringProperty(name="Prefix", description="Prefix each file with this name", maxlen=1024, default="")
--
--
--    @classmethod
--    def poll(cls, context):
--        return context.active_object
--
--    def execute(self, context):
--        if not self.properties.filepath:
--            raise Exception("filepath not set")
--
--        filepath = self.properties.filepath
--        filepath = bpy.path.ensure_ext(filepath, ".fbx")
--
--        GLOBAL_MATRIX = mtx4_identity
--        GLOBAL_MATRIX[0][0] = GLOBAL_MATRIX[1][1] = GLOBAL_MATRIX[2][2] = self.properties.TX_SCALE
--        if self.properties.TX_XROT90: GLOBAL_MATRIX = mtx4_x90n * GLOBAL_MATRIX
--        if self.properties.TX_YROT90: GLOBAL_MATRIX = mtx4_y90n * GLOBAL_MATRIX
--        if self.properties.TX_ZROT90: GLOBAL_MATRIX = mtx4_z90n * GLOBAL_MATRIX
--
--        write(filepath,
--              None, # XXX
--              context,
--              self.properties.EXP_OBS_SELECTED,
--              self.properties.EXP_MESH,
--              self.properties.EXP_MESH_APPLY_MOD,
--#                       self.properties.EXP_MESH_HQ_NORMALS,
--              self.properties.EXP_ARMATURE,
--              self.properties.EXP_LAMP,
--              self.properties.EXP_CAMERA,
--              self.properties.EXP_EMPTY,
--              self.properties.EXP_IMAGE_COPY,
--              GLOBAL_MATRIX,
--              self.properties.ANIM_ENABLE,
--              self.properties.ANIM_OPTIMIZE,
--              self.properties.ANIM_OPTIMIZE_PRECISSION,
--              self.properties.ANIM_ACTION_ALL,
--              self.properties.BATCH_ENABLE,
--              self.properties.BATCH_GROUP,
--              self.properties.BATCH_FILE_PREFIX,
--              self.properties.BATCH_OWN_DIR,
--              )
--
--        return {'FINISHED'}
--
--    def invoke(self, context, event):
--        import os
--        if not self.properties.is_property_set("filepath"):
--            self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".fbx"
--
--        context.manager.add_fileselect(self)
--        return {'RUNNING_MODAL'}
--
--
--
--
--# if __name__ == "__main__":
--#     bpy.ops.EXPORT_OT_ply(filepath="/tmp/test.ply")
++    return {'FINISHED'}
  
  
  # NOTES (all line numbers correspond to original export_fbx.py (under&nb