From 22bb09d0187845fb1e60fd9281940711018b9f7a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Jul 2011 04:28:41 +0000 Subject: [PATCH 01/59] fix for error when moving module, broke fracture tools and select internal face operator. --- release/scripts/modules/bpy_extras/mesh_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release/scripts/modules/bpy_extras/mesh_utils.py b/release/scripts/modules/bpy_extras/mesh_utils.py index cf099016aee..8ed50972c54 100644 --- a/release/scripts/modules/bpy_extras/mesh_utils.py +++ b/release/scripts/modules/bpy_extras/mesh_utils.py @@ -105,9 +105,9 @@ def edge_face_count(mesh): :return: list face users for each item in mesh.edges. :rtype: list """ - edge_face_count_dict = edge_face_count_dict(mesh) + edge_face_count = edge_face_count_dict(mesh) get = dict.get - return [get(edge_face_count_dict, ed.key, 0) for ed in mesh.edges] + return [get(edge_face_count, ed.key, 0) for ed in mesh.edges] def edge_loops_from_faces(mesh, faces=None, seams=()): From abb21a4da06868bdb2ff37fd9e362a225aae35ec Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Jul 2011 07:21:33 +0000 Subject: [PATCH 02/59] fix for python error when pinning a non mesh object in mesh editmode. --- release/scripts/startup/bl_ui/properties_data_mesh.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py index 8c966825aee..618a88f0879 100644 --- a/release/scripts/startup/bl_ui/properties_data_mesh.py +++ b/release/scripts/startup/bl_ui/properties_data_mesh.py @@ -290,9 +290,8 @@ class DATA_PT_texface(MeshButtonsPanel, bpy.types.Panel): @classmethod def poll(cls, context): - ob = context.active_object - - return (context.mode == 'EDIT_MESH') and ob and ob.type == 'MESH' + obj = context.object + return (context.mode == 'EDIT_MESH') and obj and obj.type == 'MESH' def draw(self, context): layout = self.layout From 78c43d18fc47c3728a55e1710901c1e7f964195f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Jul 2011 07:37:33 +0000 Subject: [PATCH 03/59] fix [#27839] UV 'Project from view' ignores camera lens shift --- source/blender/blenlib/intern/uvproject.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c index d139fb1ab71..ecb42315ee3 100644 --- a/source/blender/blenlib/intern/uvproject.c +++ b/source/blender/blenlib/intern/uvproject.c @@ -169,8 +169,8 @@ UvCameraInfo *project_camera_info(Object *ob, float (*rotmat)[4], float winx, fl } /* include 0.5f here to move the UVs into the center */ - uci.shiftx = 0.5f - camera->shiftx; - uci.shifty = 0.5f - camera->shifty; + uci.shiftx = 0.5f - (camera->shiftx * uci.xasp); + uci.shifty = 0.5f - (camera->shifty * uci.yasp); uci_pt= MEM_mallocN(sizeof(UvCameraInfo), "UvCameraInfo"); *uci_pt= uci; From fe62b62cb0b61c03bea111d8fecb73b2166fcddf Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Jul 2011 10:48:18 +0000 Subject: [PATCH 04/59] fix 2 bugs in project from view from a camera object - panorama mode was scaled 2x too high. - scaled camera objects would incorrectly effect the result. --- source/blender/blenlib/intern/uvproject.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c index ecb42315ee3..be7682a63d4 100644 --- a/source/blender/blenlib/intern/uvproject.c +++ b/source/blender/blenlib/intern/uvproject.c @@ -70,7 +70,7 @@ void project_from_camera(float target[2], float source[3], UvCameraInfo *uci) vec2d[0]= pv4[0]; vec2d[1]= pv4[2]; target[0]= angle * ((float)M_PI / uci->camangle); - target[1]= pv4[1] / (len_v2(vec2d) * uci->camsize); + target[1]= pv4[1] / (len_v2(vec2d) * (uci->camsize * 2.0f)); } } else { @@ -146,7 +146,11 @@ UvCameraInfo *project_camera_info(Object *ob, float (*rotmat)[4], float winx, fl uci.camangle= lens_to_angle(camera->lens) / 2.0f; uci.camsize= uci.do_persp ? tanf(uci.camangle) : camera->ortho_scale; - if (invert_m4_m4(uci.caminv, ob->obmat)) { + /* account for scaled cameras */ + copy_m4_m4(uci.caminv, ob->obmat); + normalize_m4(uci.caminv); + + if (invert_m4(uci.caminv)) { UvCameraInfo *uci_pt; /* normal projection */ From 613e9b9926aed44aa904ce69c8d6bb6c3eecc40d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Jul 2011 13:20:21 +0000 Subject: [PATCH 05/59] changed the max decimal points to show from 7 to 6, since with float precision problems the median point of a selection could be 0.0000003 --- source/blender/editors/interface/interface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 30c0f552b72..8aed0d58a07 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -74,8 +74,8 @@ #define MENU_ITEM_HEIGHT 20 #define MENU_SEP_HEIGHT 6 -#define PRECISION_FLOAT_MAX 7 -#define PRECISION_FLOAT_MAX_POW 10000000 /* pow(10, PRECISION_FLOAT_MAX) */ +#define PRECISION_FLOAT_MAX 6 +#define PRECISION_FLOAT_MAX_POW 1000000 /* pow(10, PRECISION_FLOAT_MAX) */ /* avoid unneeded calls to ui_get_but_val */ #define UI_BUT_VALUE_UNSET DBL_MAX From 5913179f85c72b8107878516c77c52d898aa7999 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Jul 2011 16:17:38 +0000 Subject: [PATCH 06/59] CMake file to build ghost tests again. --- intern/ghost/test/CMakeLists.txt | 123 +++++++++++++++++++++++++ intern/ghost/test/gears/GHOST_C-Test.c | 2 + intern/ghost/test/gears/GHOST_Test.cpp | 4 +- 3 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 intern/ghost/test/CMakeLists.txt diff --git a/intern/ghost/test/CMakeLists.txt b/intern/ghost/test/CMakeLists.txt new file mode 100644 index 00000000000..b8630427b71 --- /dev/null +++ b/intern/ghost/test/CMakeLists.txt @@ -0,0 +1,123 @@ + +cmake_policy(SET CMP0003 NEW) +cmake_policy(SET CMP0005 NEW) + +cmake_minimum_required(VERSION 2.8) + +# ----------------------------------------------------------------------------- +# Macros + + +# stub macro, does nothing +macro(blender_add_lib + name + sources + includes + includes_sys + ) + +endmacro() + +# suffix relative paths so we can use external cmake files +macro(suffix_relpaths + new_files files prefix) + + set(${new_files}) + foreach(_file ${files}) + if(IS_ABSOLUTE _file) + list(APPEND ${new_files} ${_file}) + else() + list(APPEND ${new_files} "${prefix}${_file}") + endif() + endforeach() + unset(_file) +endmacro() + + +# ----------------------------------------------------------------------------- +# Libraries + +# ghost +include(${CMAKE_SOURCE_DIR}/../CMakeLists.txt) +suffix_relpaths(INC_NEW "${INC}" "../") +suffix_relpaths(SRC_NEW "${SRC}" "../") +include_directories(${INC_NEW}) +add_library(ghost_lib ${SRC_NEW}) + +# string +include(${CMAKE_SOURCE_DIR}/../../string/CMakeLists.txt) +suffix_relpaths(INC_NEW "${INC}" "../../string/") +suffix_relpaths(SRC_NEW "${SRC}" "../../string/") +include_directories(${INC_NEW}) +add_library(string_lib ${SRC_NEW}) + +# guardedalloc +include(${CMAKE_SOURCE_DIR}/../../guardedalloc/CMakeLists.txt) +suffix_relpaths(INC_NEW "${INC}" "../../guardedalloc/") +suffix_relpaths(SRC_NEW "${SRC}" "../../guardedalloc/") +include_directories(${INC_NEW}) +add_library(guardedalloc_lib ${SRC_NEW}) + + +find_package(OpenGL REQUIRED) + +include_directories(${CMAKE_SOURCE_DIR}/../) +include_directories(${OPENGL_INCLUDE_DIR}) + +if(UNIX AND NOT APPLE) + find_package(X11 REQUIRED) + + set(PLATFORM_LINKLIBS + ${X11_X11_LIB} + ${X11_Xinput_LIB} + ) +endif() + +# ----------------------------------------------------------------------------- +# Executables + + +# Gears (C) +add_executable(gears_c + ${CMAKE_SOURCE_DIR}/gears/GHOST_C-Test.c) + +target_link_libraries(gears_c + ghost_lib + string_lib + ${OPENGL_gl_LIBRARY} + ${OPENGL_glu_LIBRARY} + ${PLATFORM_LINKLIBS} + ) + + +# Gears (C++) +add_executable(gears_cpp + ${CMAKE_SOURCE_DIR}/gears/GHOST_Test.cpp) + +target_link_libraries(gears_cpp + ghost_lib + string_lib + ${OPENGL_gl_LIBRARY} + ${OPENGL_glu_LIBRARY} + ${PLATFORM_LINKLIBS} + ) + + +# MultiTest (C) +add_executable(multitest_c + ${CMAKE_SOURCE_DIR}/multitest/Basic.c + ${CMAKE_SOURCE_DIR}/multitest/EventToBuf.c + ${CMAKE_SOURCE_DIR}/multitest/MultiTest.c + ${CMAKE_SOURCE_DIR}/multitest/ScrollBar.c + ${CMAKE_SOURCE_DIR}/multitest/Util.c + ${CMAKE_SOURCE_DIR}/multitest/WindowData.c +) + +target_link_libraries(multitest_c + ghost_lib + string_lib + guardedalloc_lib + ${OPENGL_gl_LIBRARY} + ${OPENGL_glu_LIBRARY} + ${PLATFORM_LINKLIBS} + ) diff --git a/intern/ghost/test/gears/GHOST_C-Test.c b/intern/ghost/test/gears/GHOST_C-Test.c index b34a37132b6..c582d205258 100644 --- a/intern/ghost/test/gears/GHOST_C-Test.c +++ b/intern/ghost/test/gears/GHOST_C-Test.c @@ -474,6 +474,7 @@ int main(int argc, char** argv) 200, GHOST_kWindowStateNormal, GHOST_kDrawingContextTypeOpenGL, + FALSE, FALSE); if (!sMainWindow) { @@ -490,6 +491,7 @@ int main(int argc, char** argv) 200, GHOST_kWindowStateNormal, GHOST_kDrawingContextTypeOpenGL, + FALSE, FALSE); if (!sSecondaryWindow) { diff --git a/intern/ghost/test/gears/GHOST_Test.cpp b/intern/ghost/test/gears/GHOST_Test.cpp index 6e269e1cede..930faf463b6 100644 --- a/intern/ghost/test/gears/GHOST_Test.cpp +++ b/intern/ghost/test/gears/GHOST_Test.cpp @@ -428,7 +428,7 @@ Application::Application(GHOST_ISystem* system) // Create the main window STR_String title1 ("gears - main window"); m_mainWindow = system->createWindow(title1, 10, 64, 320, 200, GHOST_kWindowStateNormal, - GHOST_kDrawingContextTypeOpenGL, true /* stereo flag */); + GHOST_kDrawingContextTypeOpenGL, false, false); if (!m_mainWindow) { std::cout << "could not create main window\n"; @@ -438,7 +438,7 @@ Application::Application(GHOST_ISystem* system) // Create a secondary window STR_String title2 ("gears - secondary window"); m_secondaryWindow = system->createWindow(title2, 340, 64, 320, 200, GHOST_kWindowStateNormal, - GHOST_kDrawingContextTypeOpenGL, false /* stereo flag */); + GHOST_kDrawingContextTypeOpenGL, false, false); if (!m_secondaryWindow) { cout << "could not create secondary window\n"; exit(-1); From d40b9e2e1c7c9f0b063498afc3fde8322155217e Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Sun, 3 Jul 2011 18:21:37 +0000 Subject: [PATCH 07/59] As per discussion: allow bone transforms again for proxy'ed bones. --- source/blender/editors/transform/transform_conversions.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 669c3195dfd..d6095184a69 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -690,7 +690,7 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob) for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) { bone = pchan->bone; if (PBONE_VISIBLE(arm, bone)) { - if ((bone->flag & BONE_SELECTED) && !(ob->proxy && pchan->bone->layer & arm->layer_protected)) + if ((bone->flag & BONE_SELECTED)) bone->flag |= BONE_TRANSFORM; else bone->flag &= ~BONE_TRANSFORM; From d29d3a89e48fa709a3d683a88874ff8a4c68945a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 3 Jul 2011 19:15:46 +0000 Subject: [PATCH 08/59] fix for building WITH_PYTHON_MODULE --- source/blender/python/intern/bpy_interface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 51bf02ad37f..422d55ecefe 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -209,8 +209,6 @@ void BPY_python_start(int argc, const char **argv) Py_Initialize(); - bpy_intern_string_init(); - // PySys_SetArgv(argc, argv); // broken in py3, not a huge deal /* sigh, why do python guys not have a char** version anymore? :( */ { @@ -233,6 +231,8 @@ void BPY_python_start(int argc, const char **argv) PyImport_ExtendInittab(bpy_internal_modules); #endif + bpy_intern_string_init(); + /* bpy.* and lets us import it */ BPy_init_modules(); From 0e0eba9f79b122eeef613fbd3733b339a95094a4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Jul 2011 05:23:36 +0000 Subject: [PATCH 09/59] fix for crash when setting layers or saving when there is no active scene - only really happens when running python scripts on startup. --- source/blender/makesrna/intern/rna_object.c | 13 +++++++++---- source/blender/windowmanager/intern/wm_files.c | 5 +++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 6b925b42e06..dd66e49fdec 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -270,11 +270,16 @@ static void rna_Base_select_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Po static void rna_Object_layer_update__internal(Main *bmain, Scene *scene, Base *base, Object *ob) { /* try to avoid scene sort */ - if((ob->lay & scene->lay) && (base->lay & scene->lay)) { + if(scene == NULL) { + /* pass - unlikely but when running scripts on startup it happens */ + } + else if((ob->lay & scene->lay) && (base->lay & scene->lay)) { /* pass */ - } else if((ob->lay & scene->lay)==0 && (base->lay & scene->lay)==0) { + } + else if((ob->lay & scene->lay)==0 && (base->lay & scene->lay)==0) { /* pass */ - } else { + } + else { DAG_scene_sort(bmain, scene); } } @@ -284,7 +289,7 @@ static void rna_Object_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr) Object *ob= (Object*)ptr->id.data; Base *base; - base= object_in_scene(ob, scene); + base= scene ? object_in_scene(ob, scene) : NULL; if(!base) return; diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index e0cfb86ce05..aabaf6d4055 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -635,8 +635,9 @@ static ImBuf *blend_file_thumb(Scene *scene, int **thumb_pt) char err_out[256]= "unknown"; *thumb_pt= NULL; - - if(G.background || scene->camera==NULL) + + /* scene can be NULL if running a script at startup and calling the save operator */ + if(G.background || scene==NULL || scene->camera==NULL) return NULL; /* gets scaled to BLEN_THUMB_SIZE */ From aa1668c6f8a70e41b97b67f31647dbec382e19f7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Jul 2011 08:13:27 +0000 Subject: [PATCH 10/59] fix for own error in intersect_line_sphere_2d(), using 3d function on 2d vectors --- source/blender/blenlib/intern/math_geom.c | 2 +- source/blender/python/generic/mathutils_geometry.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 9d945e9baa3..fc329fe1bf1 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -430,7 +430,7 @@ int isect_line_sphere_v2(const float l1[2], const float l2[2], l2[1] - l1[1] }; - const float a= dot_v3v3(ldir, ldir); + const float a= dot_v2v2(ldir, ldir); const float b= 2.0f * (ldir[0] * (l1[0] - sp[0]) + diff --git a/source/blender/python/generic/mathutils_geometry.c b/source/blender/python/generic/mathutils_geometry.c index 55c1e69d558..26844a5003d 100644 --- a/source/blender/python/generic/mathutils_geometry.c +++ b/source/blender/python/generic/mathutils_geometry.c @@ -680,7 +680,7 @@ static PyObject *M_Geometry_intersect_line_sphere_2d(PyObject *UNUSED(self), PyO PyObject *ret= PyTuple_New(2); - switch(isect_line_sphere_v3(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) { + switch(isect_line_sphere_v2(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) { case 1: if(!(!clip || (((lambda= line_point_factor_v2(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a= FALSE; use_b= FALSE; From cf43e48fc781611c0850e09dae6f6fa1c95cc28b Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Mon, 4 Jul 2011 08:59:28 +0000 Subject: [PATCH 11/59] Apply patch 4636051. COLLADA: Export selection. Original patch by Jan Diederich, adapted by Pelle Johnsen. Review assistance by Daniel Tavares. This patch adds an option to export only the selection. --- source/blender/collada/ArmatureExporter.cpp | 11 +++++-- source/blender/collada/ArmatureExporter.h | 2 +- source/blender/collada/CameraExporter.cpp | 9 +++--- source/blender/collada/CameraExporter.h | 2 +- source/blender/collada/DocumentExporter.cpp | 29 ++++++++++--------- source/blender/collada/DocumentExporter.h | 2 +- source/blender/collada/EffectExporter.cpp | 4 +-- source/blender/collada/EffectExporter.h | 2 +- source/blender/collada/GeometryExporter.cpp | 4 +-- source/blender/collada/GeometryExporter.h | 7 +++-- source/blender/collada/ImageExporter.cpp | 4 +-- source/blender/collada/ImageExporter.h | 2 +- source/blender/collada/LightExporter.cpp | 9 +++--- source/blender/collada/LightExporter.h | 2 +- source/blender/collada/MaterialExporter.cpp | 4 +-- source/blender/collada/MaterialExporter.h | 6 ++-- source/blender/collada/collada.cpp | 4 +-- source/blender/collada/collada.h | 2 +- source/blender/collada/collada_internal.cpp | 2 +- .../blender/makesrna/intern/rna_scene_api.c | 5 ++-- .../windowmanager/intern/wm_operators.c | 8 ++++- 21 files changed, 69 insertions(+), 51 deletions(-) diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index 90c3cfbb001..ad9098db3d8 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -89,14 +89,14 @@ void ArmatureExporter::add_instance_controller(Object *ob) ins.add(); } -void ArmatureExporter::export_controllers(Scene *sce) +void ArmatureExporter::export_controllers(Scene *sce, bool export_selected) { scene = sce; openLibrary(); GeometryFunctor gf; - gf.forEachMeshObjectInScene(sce, *this); + gf.forEachMeshObjectInScene(sce, *this, export_selected); closeLibrary(); } @@ -351,12 +351,17 @@ std::string ArmatureExporter::add_inv_bind_mats_source(Object *ob_arm, ListBase bPoseChannel *pchan = get_pose_channel(pose, def->name); + float pose_mat[4][4]; float mat[4][4]; float world[4][4]; float inv_bind_mat[4][4]; + // pose_mat is the same as pchan->pose_mat, but without the rotation + unit_m4(pose_mat); + translate_m4(pose_mat, pchan->pose_head[0], pchan->pose_head[1], pchan->pose_head[2]); + // make world-space matrix, pose_mat is armature-space - mul_m4_m4m4(world, pchan->pose_mat, ob_arm->obmat); + mul_m4_m4m4(world, pose_mat, ob_arm->obmat); invert_m4_m4(mat, world); converter.mat4_to_dae(inv_bind_mat, mat); diff --git a/source/blender/collada/ArmatureExporter.h b/source/blender/collada/ArmatureExporter.h index f72e5244a36..f4488942f7b 100644 --- a/source/blender/collada/ArmatureExporter.h +++ b/source/blender/collada/ArmatureExporter.h @@ -65,7 +65,7 @@ public: void add_instance_controller(Object *ob); - void export_controllers(Scene *sce); + void export_controllers(Scene *sce, bool export_selected); void operator()(Object *ob); diff --git a/source/blender/collada/CameraExporter.cpp b/source/blender/collada/CameraExporter.cpp index f8fa0fd55c0..6ce9eb782d3 100644 --- a/source/blender/collada/CameraExporter.cpp +++ b/source/blender/collada/CameraExporter.cpp @@ -42,24 +42,25 @@ CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryCameras(sw){} template -void forEachCameraObjectInScene(Scene *sce, Functor &f) +void forEachCameraObjectInScene(Scene *sce, Functor &f, bool export_selected) { Base *base= (Base*) sce->base.first; while(base) { Object *ob = base->object; - if (ob->type == OB_CAMERA && ob->data) { + if (ob->type == OB_CAMERA && ob->data + && !(export_selected && !(ob->flag & SELECT))) { f(ob, sce); } base= base->next; } } -void CamerasExporter::exportCameras(Scene *sce) +void CamerasExporter::exportCameras(Scene *sce, bool export_selected) { openLibrary(); - forEachCameraObjectInScene(sce, *this); + forEachCameraObjectInScene(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/CameraExporter.h b/source/blender/collada/CameraExporter.h index 922eaf6b1d0..999a6ddd3e5 100644 --- a/source/blender/collada/CameraExporter.h +++ b/source/blender/collada/CameraExporter.h @@ -40,7 +40,7 @@ class CamerasExporter: COLLADASW::LibraryCameras { public: CamerasExporter(COLLADASW::StreamWriter *sw); - void exportCameras(Scene *sce); + void exportCameras(Scene *sce, bool export_selected); void operator()(Object *ob, Scene *sce); }; diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp index 00daac60281..e6e0953680c 100644 --- a/source/blender/collada/DocumentExporter.cpp +++ b/source/blender/collada/DocumentExporter.cpp @@ -170,7 +170,7 @@ public: SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm) : COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm) {} - void exportScene(Scene *sce) { + void exportScene(Scene *sce, bool export_selected) { // std::string id_naming = id_name(sce); openVisualScene(translate_id(id_naming), id_naming); @@ -179,7 +179,7 @@ public: //forEachMeshObjectInScene(sce, *this); //forEachCameraObjectInScene(sce, *this); //forEachLampObjectInScene(sce, *this); - exportHierarchy(sce); + exportHierarchy(sce, export_selected); // closeVisualScene(); @@ -187,7 +187,7 @@ public: closeLibrary(); } - void exportHierarchy(Scene *sce) + void exportHierarchy(Scene *sce, bool export_selected) { Base *base= (Base*) sce->base.first; while(base) { @@ -198,8 +198,11 @@ public: case OB_MESH: case OB_CAMERA: case OB_LAMP: - case OB_EMPTY: case OB_ARMATURE: + case OB_EMPTY: + if (export_selected && !(ob->flag & SELECT)) { + break; + } // write nodes.... writeNodes(ob, sce); break; @@ -929,7 +932,7 @@ protected: } }; -void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename) +void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool selected) { PointerRNA sceneptr, unit_settings; PropertyRNA *system; /* unused , *scale; */ @@ -1011,31 +1014,31 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename) // if(has_object_type(sce, OB_CAMERA)) { CamerasExporter ce(&sw); - ce.exportCameras(sce); + ce.exportCameras(sce, selected); } // if(has_object_type(sce, OB_LAMP)) { LightsExporter le(&sw); - le.exportLights(sce); + le.exportLights(sce, selected); } // ImagesExporter ie(&sw, filename); - ie.exportImages(sce); + ie.exportImages(sce, selected); // EffectsExporter ee(&sw); - ee.exportEffects(sce); + ee.exportEffects(sce, selected); // MaterialsExporter me(&sw); - me.exportMaterials(sce); + me.exportMaterials(sce, selected); // if(has_object_type(sce, OB_MESH)) { GeometryExporter ge(&sw); - ge.exportGeom(sce); + ge.exportGeom(sce, selected); } // @@ -1045,12 +1048,12 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename) // ArmatureExporter arm_exporter(&sw); if(has_object_type(sce, OB_ARMATURE)) { - arm_exporter.export_controllers(sce); + arm_exporter.export_controllers(sce, selected); } // SceneExporter se(&sw, &arm_exporter); - se.exportScene(sce); + se.exportScene(sce, selected); // std::string scene_name(translate_id(id_name(sce))); diff --git a/source/blender/collada/DocumentExporter.h b/source/blender/collada/DocumentExporter.h index 9d6d2114cd8..923313c4ed9 100644 --- a/source/blender/collada/DocumentExporter.h +++ b/source/blender/collada/DocumentExporter.h @@ -34,7 +34,7 @@ struct Scene; class DocumentExporter { public: - void exportCurrentScene(Scene *sce, const char* filename); + void exportCurrentScene(Scene *sce, const char* filename, bool selected); void exportScenes(const char* filename); }; diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp index 74756859d3b..f51330165f3 100644 --- a/source/blender/collada/EffectExporter.cpp +++ b/source/blender/collada/EffectExporter.cpp @@ -78,12 +78,12 @@ bool EffectsExporter::hasEffects(Scene *sce) return false; } -void EffectsExporter::exportEffects(Scene *sce) +void EffectsExporter::exportEffects(Scene *sce, bool export_selected) { if(hasEffects(sce)) { openLibrary(); MaterialFunctor mf; - mf.forEachMaterialInScene(sce, *this); + mf.forEachMaterialInScene(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/EffectExporter.h b/source/blender/collada/EffectExporter.h index 2b25d1b889f..86143ae4d07 100644 --- a/source/blender/collada/EffectExporter.h +++ b/source/blender/collada/EffectExporter.h @@ -47,7 +47,7 @@ class EffectsExporter: COLLADASW::LibraryEffects { public: EffectsExporter(COLLADASW::StreamWriter *sw); - void exportEffects(Scene *sce); + void exportEffects(Scene *sce, bool export_selected); void operator()(Material *ma, Object *ob); diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp index 5df5ab99b91..b724844b1ec 100644 --- a/source/blender/collada/GeometryExporter.cpp +++ b/source/blender/collada/GeometryExporter.cpp @@ -47,13 +47,13 @@ GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {} -void GeometryExporter::exportGeom(Scene *sce) +void GeometryExporter::exportGeom(Scene *sce, bool export_selected) { openLibrary(); mScene = sce; GeometryFunctor gf; - gf.forEachMeshObjectInScene(sce, *this); + gf.forEachMeshObjectInScene(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h index 0b9abaebc25..7f3426a1915 100644 --- a/source/blender/collada/GeometryExporter.h +++ b/source/blender/collada/GeometryExporter.h @@ -60,7 +60,7 @@ class GeometryExporter : COLLADASW::LibraryGeometries public: GeometryExporter(COLLADASW::StreamWriter *sw); - void exportGeom(Scene *sce); + void exportGeom(Scene *sce, bool export_selected); void operator()(Object *ob); @@ -102,14 +102,15 @@ struct GeometryFunctor { // f should have // void operator()(Object* ob) template - void forEachMeshObjectInScene(Scene *sce, Functor &f) + void forEachMeshObjectInScene(Scene *sce, Functor &f, bool export_selected) { Base *base= (Base*) sce->base.first; while(base) { Object *ob = base->object; - if (ob->type == OB_MESH && ob->data) { + if (ob->type == OB_MESH && ob->data + && !(export_selected && !(ob->flag && SELECT))) { f(ob); } base= base->next; diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp index b7a5ef4c4e4..8e426e9dba8 100644 --- a/source/blender/collada/ImageExporter.cpp +++ b/source/blender/collada/ImageExporter.cpp @@ -71,12 +71,12 @@ bool ImagesExporter::hasImages(Scene *sce) return false; } -void ImagesExporter::exportImages(Scene *sce) +void ImagesExporter::exportImages(Scene *sce, bool export_selected) { if(hasImages(sce)) { openLibrary(); MaterialFunctor mf; - mf.forEachMaterialInScene(sce, *this); + mf.forEachMaterialInScene(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/ImageExporter.h b/source/blender/collada/ImageExporter.h index 04e3010dc7a..6b81c099259 100644 --- a/source/blender/collada/ImageExporter.h +++ b/source/blender/collada/ImageExporter.h @@ -47,7 +47,7 @@ class ImagesExporter: COLLADASW::LibraryImages public: ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename); - void exportImages(Scene *sce); + void exportImages(Scene *sce, bool export_selected); void operator()(Material *ma, Object *ob); private: bool hasImages(Scene *sce); diff --git a/source/blender/collada/LightExporter.cpp b/source/blender/collada/LightExporter.cpp index 13eb62ca969..c2cc0c1e157 100644 --- a/source/blender/collada/LightExporter.cpp +++ b/source/blender/collada/LightExporter.cpp @@ -38,13 +38,14 @@ #include "collada_internal.h" template -void forEachLampObjectInScene(Scene *sce, Functor &f) +void forEachLampObjectInScene(Scene *sce, Functor &f, bool export_selected) { Base *base= (Base*) sce->base.first; while(base) { Object *ob = base->object; - if (ob->type == OB_LAMP && ob->data) { + if (ob->type == OB_LAMP && ob->data + && !(export_selected && !(ob->flag & SELECT))) { f(ob); } base= base->next; @@ -53,11 +54,11 @@ void forEachLampObjectInScene(Scene *sce, Functor &f) LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryLights(sw){} -void LightsExporter::exportLights(Scene *sce) +void LightsExporter::exportLights(Scene *sce, bool export_selected) { openLibrary(); - forEachLampObjectInScene(sce, *this); + forEachLampObjectInScene(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/LightExporter.h b/source/blender/collada/LightExporter.h index 3706582e52c..2ae1a19fdb1 100644 --- a/source/blender/collada/LightExporter.h +++ b/source/blender/collada/LightExporter.h @@ -41,7 +41,7 @@ class LightsExporter: COLLADASW::LibraryLights { public: LightsExporter(COLLADASW::StreamWriter *sw); - void exportLights(Scene *sce); + void exportLights(Scene *sce, bool export_selected); void operator()(Object *ob); private: bool exportBlenderProfile(COLLADASW::Light &cla, Lamp *la); diff --git a/source/blender/collada/MaterialExporter.cpp b/source/blender/collada/MaterialExporter.cpp index 0030f2a6285..a44fa6802f2 100644 --- a/source/blender/collada/MaterialExporter.cpp +++ b/source/blender/collada/MaterialExporter.cpp @@ -35,12 +35,12 @@ MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){} -void MaterialsExporter::exportMaterials(Scene *sce) +void MaterialsExporter::exportMaterials(Scene *sce, bool export_selected) { openLibrary(); MaterialFunctor mf; - mf.forEachMaterialInScene(sce, *this); + mf.forEachMaterialInScene(sce, *this, export_selected); closeLibrary(); } diff --git a/source/blender/collada/MaterialExporter.h b/source/blender/collada/MaterialExporter.h index 033c8526346..0a7a276d857 100644 --- a/source/blender/collada/MaterialExporter.h +++ b/source/blender/collada/MaterialExporter.h @@ -49,7 +49,7 @@ class MaterialsExporter: COLLADASW::LibraryMaterials { public: MaterialsExporter(COLLADASW::StreamWriter *sw); - void exportMaterials(Scene *sce); + void exportMaterials(Scene *sce, bool export_selected); void operator()(Material *ma, Object *ob); }; @@ -86,11 +86,11 @@ struct MaterialFunctor { // f should have // void operator()(Material* ma) template - void forEachMaterialInScene(Scene *sce, Functor &f) + void forEachMaterialInScene(Scene *sce, Functor &f, bool export_selected) { ForEachMaterialFunctor matfunc(&f); GeometryFunctor gf; - gf.forEachMeshObjectInScene >(sce, matfunc); + gf.forEachMeshObjectInScene >(sce, matfunc, export_selected); } }; diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp index 51caf62f6e7..c15e608c360 100644 --- a/source/blender/collada/collada.cpp +++ b/source/blender/collada/collada.cpp @@ -51,7 +51,7 @@ extern "C" return 1; } - int collada_export(Scene *sce, const char *filepath) + int collada_export(Scene *sce, const char *filepath, int selected) { DocumentExporter exp; @@ -64,7 +64,7 @@ extern "C" } /* end! */ - exp.exportCurrentScene(sce, filepath); + exp.exportCurrentScene(sce, filepath, selected); return 1; } diff --git a/source/blender/collada/collada.h b/source/blender/collada/collada.h index a167784e217..915a77354e3 100644 --- a/source/blender/collada/collada.h +++ b/source/blender/collada/collada.h @@ -39,7 +39,7 @@ extern "C" { * both return 1 on success, 0 on error */ int collada_import(bContext *C, const char *filepath); - int collada_export(Scene *sce, const char *filepath); + int collada_export(Scene *sce, const char *filepath, int selected); #ifdef __cplusplus } #endif diff --git a/source/blender/collada/collada_internal.cpp b/source/blender/collada/collada_internal.cpp index 9cb6a227fc9..27397c3008e 100644 --- a/source/blender/collada/collada_internal.cpp +++ b/source/blender/collada/collada_internal.cpp @@ -265,7 +265,7 @@ std::string get_light_id(Object *ob) std::string get_joint_id(Bone *bone, Object *ob_arm) { - return translate_id(bone->name); + return translate_id(/*id_name(ob_arm) + "_" +*/ bone->name); } std::string get_camera_id(Object *ob) diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c index c2194636cd3..1220c4f34a1 100644 --- a/source/blender/makesrna/intern/rna_scene_api.c +++ b/source/blender/makesrna/intern/rna_scene_api.c @@ -85,9 +85,9 @@ static void rna_SceneRender_get_frame_path(RenderData *rd, int frame, char *name /* don't remove this, as COLLADA exporting cannot be done through operators in render() callback. */ #include "../../collada/collada.h" -static void rna_Scene_collada_export(Scene *scene, const char *filepath) +static void rna_Scene_collada_export(Scene *scene, const char *filepath, int selected) { - collada_export(scene, filepath); + collada_export(scene, filepath, selected); } #endif @@ -112,6 +112,7 @@ void RNA_api_scene(StructRNA *srna) /* don't remove this, as COLLADA exporting cannot be done through operators in render() callback. */ func= RNA_def_function(srna, "collada_export", "rna_Scene_collada_export"); parm= RNA_def_string(func, "filepath", "", FILE_MAX, "File Path", "File path to write Collada file."); + parm= RNA_def_boolean(func, "selected", 0, "Export only selected", "Export only selected elements."); RNA_def_property_flag(parm, PROP_REQUIRED); RNA_def_property_subtype(parm, PROP_FILEPATH); /* allow non utf8 */ RNA_def_function_ui_description(func, "Export to collada file."); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index f65485b84dd..35afdf29b53 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -2004,6 +2004,8 @@ static void WM_OT_save_mainfile(wmOperatorType *ot) static int wm_collada_export_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) { + int selected = 0; + if(!RNA_property_is_set(op->ptr, "filepath")) { char filepath[FILE_MAX]; BLI_strncpy(filepath, G.main->name, sizeof(filepath)); @@ -2020,6 +2022,7 @@ static int wm_collada_export_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED static int wm_collada_export_exec(bContext *C, wmOperator *op) { char filename[FILE_MAX]; + int selected; if(!RNA_property_is_set(op->ptr, "filepath")) { BKE_report(op->reports, RPT_ERROR, "No filename given"); @@ -2027,7 +2030,8 @@ static int wm_collada_export_exec(bContext *C, wmOperator *op) } RNA_string_get(op->ptr, "filepath", filename); - if(collada_export(CTX_data_scene(C), filename)) { + selected = RNA_boolean_get(op->ptr, "selected"); + if(collada_export(CTX_data_scene(C), filename, selected)) { return OPERATOR_FINISHED; } else { @@ -2045,6 +2049,8 @@ static void WM_OT_collada_export(wmOperatorType *ot) ot->poll= WM_operator_winactive; WM_operator_properties_filesel(ot, FOLDERFILE|COLLADAFILE, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH); + RNA_def_boolean(ot->srna, "selected", 0, "Export only selected", + "Export only selected elements"); } /* function used for WM_OT_save_mainfile too */ From ca2c319649a1a7261f2d36b14d970b8bc711da28 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 4 Jul 2011 10:56:59 +0000 Subject: [PATCH 12/59] Fix #27850: keyboards with a comma instead of a dot on the numpad now get converted to a dot when typing into number buttons, for easier number entry. --- source/blender/editors/interface/interface_handlers.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 99a31e039c8..e9ec4ccc66d 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -1895,7 +1895,15 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle } if(event->ascii && (retval == WM_UI_HANDLER_CONTINUE)) { - changed= ui_textedit_type_ascii(but, data, event->ascii); + char ascii = event->ascii; + + /* exception that's useful for number buttons, some keyboard + numpads have a comma instead of a period */ + if(ELEM3(but->type, NUM, NUMABS, NUMSLI)) + if(event->type == PADPERIOD && ascii == ',') + ascii = '.'; + + changed= ui_textedit_type_ascii(but, data, ascii); retval= WM_UI_HANDLER_BREAK; } From 59185219593f5270cd1d5cfc13eea8a6e60bfca4 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Mon, 4 Jul 2011 11:28:39 +0000 Subject: [PATCH 13/59] Bug report (IRC) Knife cut with long mouse trails failed, increased max amount of input points 4 fold (1024). --- source/blender/editors/mesh/editmesh_loop.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/mesh/editmesh_loop.c b/source/blender/editors/mesh/editmesh_loop.c index 32971ca77ed..acbe5ef2144 100644 --- a/source/blender/editors/mesh/editmesh_loop.c +++ b/source/blender/editors/mesh/editmesh_loop.c @@ -608,9 +608,12 @@ static float seg_intersect(EditEdge *e, CutCurve *c, int len, char mode, struct return(perc); } - +/* for multicut */ #define MAX_CUTS 256 +/* for amount of edges */ +#define MAX_CUT_EDGES 1024 + static int knife_cut_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); @@ -618,7 +621,7 @@ static int knife_cut_exec(bContext *C, wmOperator *op) ARegion *ar= CTX_wm_region(C); EditEdge *eed; EditVert *eve; - CutCurve curve[MAX_CUTS]; + CutCurve curve[MAX_CUT_EDGES]; struct GHash *gh; float isect=0.0; float *scr, co[4]; @@ -642,7 +645,7 @@ static int knife_cut_exec(bContext *C, wmOperator *op) RNA_float_get_array(&itemptr, "loc", (float *)&curve[len]); len++; - if(len>= MAX_CUTS) break; + if(len>= MAX_CUT_EDGES) break; } RNA_END; From 398807e235c76a48e7759a1dedd6a3b051bb8822 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 4 Jul 2011 13:03:41 +0000 Subject: [PATCH 14/59] Fix #27785: blenderplayer + eltopo linking error. --- source/blenderplayer/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt index 5fe045fda10..9c60cdac22b 100644 --- a/source/blenderplayer/CMakeLists.txt +++ b/source/blenderplayer/CMakeLists.txt @@ -139,6 +139,10 @@ endif() bf_intern_mikktspace ) + if(WITH_MOD_CLOTH_ELTOPO) + list(APPEND BLENDER_SORTED_LIBS extern_eltopo) + endif() + if(WITH_BUILTIN_GLEW) list(APPEND BLENDER_SORTED_LIBS extern_glew) endif() From 7e36a75b459302b02fdc5b85743de83782d68fa7 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 4 Jul 2011 13:33:47 +0000 Subject: [PATCH 15/59] Paths: remove some temporary code that was only needed for 2.57. --- source/blender/blenlib/intern/path_util.c | 35 +---------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index af87707fb90..80b85661762 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -1024,26 +1024,6 @@ static int get_path_system(char *targetpath, const char *folder_name, const char } } -#if defined(WIN32) && BLENDER_VERSION < 258 - -static int path_have_257_script_install(void) -{ - const int ver= BLENDER_VERSION; - char path[FILE_MAX] = ""; - char system_pyfile[FILE_MAX]; - - if (get_path_user(path, "scripts", NULL, "BLENDER_USER_SCRIPTS", ver)) { - BLI_join_dirfile(system_pyfile, sizeof(system_pyfile), path, "modules/bpy_types.py"); - - if (BLI_exists(system_pyfile)) - return 1; - } - - return 0; -} - -#endif - /* get a folder out of the 'folder_id' presets for paths */ /* returns the path if found, NULL string if not */ char *BLI_get_folder(int folder_id, const char *subfolder) @@ -1076,20 +1056,7 @@ char *BLI_get_folder(int folder_id, const char *subfolder) return NULL; case BLENDER_USER_SCRIPTS: -#if defined(WIN32) && BLENDER_VERSION < 258 - /* if we have a 2.57 installation, then we may have system script - * files in the user configuration folder. avoid using that folder - * if they are there, until the version gets bumped to 2.58, so - * we can be sure that folder only has addons etc. */ - if (path_have_257_script_install()) { - if (get_path_local(path, "scripts", subfolder, ver)) break; - } - else -#endif - { - if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver)) break; - } - + if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver)) break; return NULL; case BLENDER_SYSTEM_SCRIPTS: From 796c6a946736e9c1f33c8224b23b0943bcd2ba2c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 4 Jul 2011 13:48:18 +0000 Subject: [PATCH 16/59] Fix #27849: 3D manipulator widget lost on mesh in edge mode. The manipulator was always using vertex selection flags, but those are only valid in vertex mode, as selection flag flushing only happens in the direction vertex -> edge -> face. Now use edge/face selection flags when needed. --- .../editors/transform/transform_manipulator.c | 63 +++++++++++++++++-- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index 65cd285cf48..d62227a122d 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -278,6 +278,7 @@ int calc_manipulator_stats(const bContext *C) ARegion *ar= CTX_wm_region(C); Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); + ToolSettings *ts = CTX_data_tool_settings(C); View3D *v3d= sa->spacedata.first; RegionView3D *rv3d= ar->regiondata; Base *base; @@ -309,11 +310,63 @@ int calc_manipulator_stats(const bContext *C) calc_tw_center(scene, vec); totsel= 1; } else { - /* do vertices for center, and if still no normal found, use vertex normals */ - for(eve= em->verts.first; eve; eve= eve->next) { - if(eve->f & SELECT) { - totsel++; - calc_tw_center(scene, eve->co); + /* do vertices/edges/faces for center depending on selection + mode. note we can't use just vertex selection flag because + it is not flush down on changes */ + if(ts->selectmode & SCE_SELECT_VERTEX) { + for(eve= em->verts.first; eve; eve= eve->next) { + if(eve->f & SELECT) { + totsel++; + calc_tw_center(scene, eve->co); + } + } + } + else if(ts->selectmode & SCE_SELECT_EDGE) { + EditEdge *eed; + + for(eve= em->verts.first; eve; eve= eve->next) eve->f1= 0; + for(eed= em->edges.first; eed; eed= eed->next) { + if(eed->h==0 && (eed->f & SELECT)) { + if(!eed->v1->f1) { + eed->v1->f1= 1; + totsel++; + calc_tw_center(scene, eed->v1->co); + } + if(!eed->v2->f1) { + eed->v2->f1= 1; + totsel++; + calc_tw_center(scene, eed->v2->co); + } + } + } + } + else { + EditFace *efa; + + for(eve= em->verts.first; eve; eve= eve->next) eve->f1= 0; + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->h==0 && (efa->f & SELECT)) { + if(!efa->v1->f1) { + efa->v1->f1= 1; + totsel++; + calc_tw_center(scene, efa->v1->co); + } + if(!efa->v2->f1) { + efa->v2->f1= 1; + totsel++; + calc_tw_center(scene, efa->v2->co); + } + if(!efa->v3->f1) { + efa->v3->f1= 1; + totsel++; + calc_tw_center(scene, efa->v3->co); + } + if(efa->v4 && !efa->v4->f1) { + efa->v4->f1= 1; + totsel++; + calc_tw_center(scene, efa->v4->co); + } + } } } } From 7c1514344911ff2c44f45111429726fd39ff4b74 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 4 Jul 2011 15:09:02 +0000 Subject: [PATCH 17/59] bind marker camera now uses active object rather then scene camera (was requested a few times) --- source/blender/editors/animation/anim_markers.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index c6e55427034..b3338396598 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -50,6 +50,7 @@ #include "BKE_main.h" #include "BKE_report.h" #include "BKE_scene.h" +#include "BKE_screen.h" #include "WM_api.h" #include "WM_types.h" @@ -1416,7 +1417,9 @@ static void MARKER_OT_make_links_scene(wmOperatorType *ot) static int ed_marker_camera_bind_exec(bContext *C, wmOperator *UNUSED(op)) { + bScreen *sc= CTX_wm_screen(C); Scene *scene= CTX_data_scene(C); + Object *ob = CTX_data_active_object(C); ListBase *markers= ED_context_get_markers(C); TimeMarker *marker; @@ -1424,10 +1427,15 @@ static int ed_marker_camera_bind_exec(bContext *C, wmOperator *UNUSED(op)) if(marker == NULL) return OPERATOR_CANCELLED; - marker->camera= scene->camera; + marker->camera= ob; + + /* camera may have changes */ + scene_camera_switch_update(scene); + BKE_screen_view3d_scene_sync(sc); WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL); WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL); + WM_event_add_notifier(C, NC_SCENE|NA_EDITED, scene); /* so we get view3d redraws */ return OPERATOR_FINISHED; } From c4491f558b77530ef45ef7a1b80ba7567e338bae Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 4 Jul 2011 18:14:41 +0000 Subject: [PATCH 18/59] Current situation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A mesh can consist out of multiple material. Take a character with clothing's. the skin can be a different material as the different clothing's. During compositing it is a common use-case to only do a part of the composit on only a specific material. Currently this can not be done. In blender movies this feature is known to be implemented, but until now it never got integrated into trunk. Proposal With material index the Blender internal renderer will be capable of creating a buffer containing the material indexes of the first pixel-hit. This will be implemented in the same manner as the object index. In the compositor the ID Mask node can be used to extract the information out of the Render pass. Impact User interface On the properties-space the next changes will be done Scene⇒Render layer⇒Passes⇒Material index will be added Material⇒Options⇒Pass index will be added DNA Material struct will get an new field called “index”. this will be a short-type. Material struct the field pad will be removed. A new Render-layer pass will be added (bit 1«18) RNA Material RNA is updated (based on “pass index” from object) Render layer RNA is updated (based on IndexOB) Blender internal renderer The Blender internal renderer will process the render pass as a copy of the Object index. Blender compositor The render layer input will get a new output socket called “IndexMA” Usage An example on how to use material index can be found at: https://svn.blender.org/svnroot/bf-blender/trunk/lib/tests/compositing/composite_materialindex.blend This is also example of a commit message longer than the commit itself :) --- .../scripts/startup/bl_ui/properties_material.py | 1 + release/scripts/startup/bl_ui/properties_render.py | 1 + source/blender/blenkernel/BKE_node.h | 7 ++++--- source/blender/blenkernel/intern/node.c | 4 +++- source/blender/editors/space_outliner/outliner.c | 6 +++++- source/blender/makesdna/DNA_material_types.h | 2 +- source/blender/makesdna/DNA_scene_types.h | 1 + source/blender/makesrna/intern/rna_material.c | 7 ++++++- source/blender/makesrna/intern/rna_render.c | 3 ++- source/blender/makesrna/intern/rna_scene.c | 8 +++++++- source/blender/nodes/intern/CMP_nodes/CMP_image.c | 11 ++++++++--- source/blender/render/intern/source/pipeline.c | 13 +++++++++++-- source/blender/render/intern/source/rendercore.c | 10 +++++++++- source/blender/render/intern/source/shadeinput.c | 2 +- source/blender/render/intern/source/zbuf.c | 13 ++++++++++--- 15 files changed, 70 insertions(+), 19 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 31da9598641..45c15bd1ce6 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -729,6 +729,7 @@ class MATERIAL_PT_options(MaterialButtonsPanel, bpy.types.Panel): col.prop(mat, "use_vertex_color_paint") col.prop(mat, "use_vertex_color_light") col.prop(mat, "use_object_color") + col.prop(mat, "pass_index") class MATERIAL_PT_shadow(MaterialButtonsPanel, bpy.types.Panel): diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 54ca18ef828..6d36db29a6c 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -141,6 +141,7 @@ class RENDER_PT_layers(RenderButtonsPanel, bpy.types.Panel): col.prop(rl, "use_pass_uv") col.prop(rl, "use_pass_mist") col.prop(rl, "use_pass_object_index") + col.prop(rl, "use_pass_material_index") col.prop(rl, "use_pass_color") col = split.column() diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index a126f405d09..c86080aa21f 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -319,9 +319,10 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat); #define RRES_OUT_REFRACT 12 #define RRES_OUT_INDIRECT 13 #define RRES_OUT_INDEXOB 14 -#define RRES_OUT_MIST 15 -#define RRES_OUT_EMIT 16 -#define RRES_OUT_ENV 17 +#define RRES_OUT_INDEXMA 15 +#define RRES_OUT_MIST 16 +#define RRES_OUT_EMIT 17 +#define RRES_OUT_ENV 18 /* note: types are needed to restore callbacks, don't change values */ #define CMP_NODE_VIEWER 201 diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 64e374fe4c0..4e76ab0727d 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -3156,7 +3156,9 @@ static void force_hidden_passes(bNode *node, int passflag) if(!(passflag & SCE_PASS_INDIRECT)) sock->flag |= SOCK_UNAVAIL; sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB); if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_MIST); + sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXMA); + if(!(passflag & SCE_PASS_INDEXMA)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_MIST); if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL; sock= BLI_findlink(&node->outputs, RRES_OUT_EMIT); if(!(passflag & SCE_PASS_EMIT)) sock->flag |= SOCK_UNAVAIL; diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 0ce6b5d2ce2..c3699e4b704 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -480,7 +480,11 @@ static void outliner_add_passes(SpaceOops *soops, TreeElement *tenla, ID *id, Sc te->name= "Index Object"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_RGBA)); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_INDEXMA)); + te->name= "Index Material"; + te->directdata= &srl->passflag; + + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_RGBA)); te->name= "Color"; te->directdata= &srl->passflag; diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 1489593f7f6..060b1bf42d1 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -161,7 +161,7 @@ typedef struct Material { int mapto_textured; /* render-time cache to optimise texture lookups */ short shadowonly_flag; /* "shadowsonly" type */ - short pad; + short index; /* custom index for render passes */ ListBase gpumaterial; /* runtime */ } Material; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 100a66d209f..f351a48b998 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -201,6 +201,7 @@ typedef struct SceneRenderLayer { #define SCE_PASS_RAYHITS (1<<15) #define SCE_PASS_EMIT (1<<16) #define SCE_PASS_ENVIRONMENT (1<<17) +#define SCE_PASS_INDEXMA (1<<18) /* note, srl->passflag is treestore element 'nr' in outliner, short still... */ diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index b86a91967a6..d90798e9b29 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -1675,7 +1675,12 @@ void RNA_def_material(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Light Group", "Limit lighting to lamps in this Group"); RNA_def_property_update(prop, 0, "rna_Material_update"); - + + prop= RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "index"); + RNA_def_property_ui_text(prop, "Pass Index", "Index # for the IndexMA render pass"); + RNA_def_property_update(prop, NC_OBJECT, NULL); + /* flags */ prop= RNA_def_property(srna, "use_light_group_exclusive", PROP_BOOLEAN, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 3a6cebef178..3074508d6a7 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -388,7 +388,8 @@ static void rna_def_render_pass(BlenderRNA *brna) {SCE_PASS_MIST, "MIST", 0, "Mist", ""}, {SCE_PASS_EMIT, "EMIT", 0, "Emit", ""}, {SCE_PASS_ENVIRONMENT, "ENVIRONMENT", 0, "Environment", ""}, - {0, NULL, 0, NULL, NULL}}; + {SCE_PASS_INDEXMA, "MATERIAL_INDEX", 0, "Material Index", ""}, + {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "RenderPass", NULL); RNA_def_struct_ui_text(srna, "Render Pass", ""); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 0c136fc429b..a496e24143b 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1515,7 +1515,13 @@ void rna_def_render_layer_common(StructRNA *srna, int scene) if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); - prop= RNA_def_property(srna, "use_pass_color", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_pass_material_index", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_INDEXMA); + RNA_def_property_ui_text(prop, "Material Index", "Deliver material index pass"); + if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); + else RNA_def_property_clear_flag(prop, PROP_EDITABLE); + + prop= RNA_def_property(srna, "use_pass_color", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_RGBA); RNA_def_property_ui_text(prop, "Color", "Deliver shade-less color pass"); if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c index 3caaad26bae..91800897cb3 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c @@ -53,7 +53,8 @@ static bNodeSocketType cmp_node_rlayers_out[]= { { SOCK_RGBA, 0, "Refract", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Indirect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VALUE, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "IndexMA", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Emit", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Environment",0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } @@ -211,7 +212,9 @@ static void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack * out[RRES_OUT_INDIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDIRECT); if(out[RRES_OUT_INDEXOB]->hasoutput) out[RRES_OUT_INDEXOB]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXOB); - if(out[RRES_OUT_MIST]->hasoutput) + if(out[RRES_OUT_INDEXMA]->hasoutput) + out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA); + if(out[RRES_OUT_MIST]->hasoutput) out[RRES_OUT_MIST]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_MIST); if(out[RRES_OUT_EMIT]->hasoutput) out[RRES_OUT_EMIT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_EMIT); @@ -326,7 +329,7 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in CompBuf *buf; int buftype= CB_VEC3; - if(ELEM3(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST)) + if(ELEM4(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST, SCE_PASS_INDEXMA)) buftype= CB_VAL; else if(passcode==SCE_PASS_VECTOR) buftype= CB_VEC4; @@ -373,6 +376,8 @@ static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStac out[RRES_OUT_INDIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDIRECT); if(out[RRES_OUT_INDEXOB]->hasoutput) out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB); + if(out[RRES_OUT_INDEXMA]->hasoutput) + out[RRES_OUT_INDEXMA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXMA); if(out[RRES_OUT_MIST]->hasoutput) out[RRES_OUT_MIST]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_MIST); if(out[RRES_OUT_EMIT]->hasoutput) diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 1d4014aac3e..37226018a91 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -383,7 +383,11 @@ static const char *get_pass_name(int passtype, int channel) if(channel==-1) return "IndexOB"; return "IndexOB.X"; } - if(passtype == SCE_PASS_MIST) { + if(passtype == SCE_PASS_INDEXMA) { + if(channel==-1) return "IndexMA"; + return "IndexMA.X"; + } + if(passtype == SCE_PASS_MIST) { if(channel==-1) return "Mist"; return "Mist.Z"; } @@ -448,6 +452,9 @@ static int passtype_from_name(char *str) if(strcmp(str, "IndexOB")==0) return SCE_PASS_INDEXOB; + if(strcmp(str, "IndexMA")==0) + return SCE_PASS_INDEXMA; + if(strcmp(str, "Mist")==0) return SCE_PASS_MIST; @@ -631,7 +638,9 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int render_layer_add_pass(rr, rl, 3, SCE_PASS_REFRACT); if(srl->passflag & SCE_PASS_INDEXOB) render_layer_add_pass(rr, rl, 1, SCE_PASS_INDEXOB); - if(srl->passflag & SCE_PASS_MIST) + if(srl->passflag & SCE_PASS_INDEXMA) + render_layer_add_pass(rr, rl, 1, SCE_PASS_INDEXMA); + if(srl->passflag & SCE_PASS_MIST) render_layer_add_pass(rr, rl, 1, SCE_PASS_MIST); if(rl->passflag & SCE_PASS_RAYHITS) render_layer_add_pass(rr, rl, 4, SCE_PASS_RAYHITS); diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 6747784b21a..11ae721ad95 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -515,7 +515,15 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset, *fp= (float)shi->obr->ob->index; } break; - case SCE_PASS_MIST: + case SCE_PASS_INDEXMA: + /* no filter */ + if(shi->vlr) { + fp= rpass->rect + offset; + if(*fp==0.0f) + *fp= (float)shi->mat->index; + } + break; + case SCE_PASS_MIST: /* */ col= &shr->mist; pixsize= 1; diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index 2702b7e5145..277cec1835a 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -1455,7 +1455,7 @@ int shade_samples(ShadeSample *ssamp, PixStr *ps, int x, int y) shade_samples_do_AO(ssamp); /* if shade (all shadepinputs have same passflag) */ - if(ssamp->shi[0].passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB)) { + if(ssamp->shi[0].passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB|SCE_PASS_INDEXMA)) { for(samp=0; samptot; samp++, shi++, shr++) { shade_input_set_shade_texco(shi); diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index 98dbb796f5b..3ac6d2c33ff 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -3497,7 +3497,7 @@ static void add_transp_obindex(RenderLayer *rl, int offset, Object *ob) RenderPass *rpass; for(rpass= rl->passes.first; rpass; rpass= rpass->next) { - if(rpass->passtype == SCE_PASS_INDEXOB) { + if(rpass->passtype == SCE_PASS_INDEXOB||rpass->passtype == SCE_PASS_INDEXMA) { float *fp= rpass->rect + offset; *fp= (float)ob->index; break; @@ -3820,7 +3820,7 @@ static int shade_tra_samples(ShadeSample *ssamp, StrandShadeCache *cache, int x, shade_samples_do_AO(ssamp); /* if shade (all shadepinputs have same passflag) */ - if(shi->passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB)) { + if(shi->passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB|SCE_PASS_INDEXMA)) { for(samp=0; samptot; samp++, shi++, shr++) { shade_input_set_shade_texco(shi); shade_input_do_shade(shi, shr); @@ -4115,7 +4115,14 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas add_transp_obindex(rlpp[a], od, obr->ob); } } - + if(addpassflag & SCE_PASS_INDEXMA) { + ObjectRen *obr= R.objectinstance[zrow[totface-1].obi].obr; + if(obr->ob) { + for(a= 0; aob); + } + } + /* for each mask-sample we alpha-under colors. then in end it's added using filter */ memset(samp_shr, 0, sizeof(ShadeResult)*osa); for(a=0; a Date: Mon, 4 Jul 2011 18:48:36 +0000 Subject: [PATCH 19/59] ====== Proposal: Nodes property windows enhancement ====== ===== Situation before this patch ===== in the current situation inside the node editor there is a properties panel (press 'n'-key). This pabel displays some information about the node, backdrop and grease pencil. The UI of the property panel is typically vertical oriented. Nodes in the other hand are not oriented in a direction. Both area's are draw via the same draw function. With some nodes this will create not user-friendly UI. Try the color-balance for instance). The 3 color circles are drawn next to each other, it would be better to draw them below each other. When creating more complex nodes you don't want to display all handles in the node-panel and in the properties panel. For instance fine-tuning handles you only want to appear in the property panel to reduce place in the node itself. ===== Situation after this patch ===== This patch separates the draw functions of the property panel and the node panel. When no special draw function is created for the property panel, the draw function of the node will be used as 'fallback' ===== Impact ===== ==== BKE_node.h ==== add a new uifunc (called uifuncbut) to the bNodeType struct. The definition is the same as the uifunc. ==== node_buttons.c ==== if the uifuncbut is set, call it. currently calls the uifunc method ==== drawnode.c ==== static void node_composit_set_butfunc(bNodeType *ntype). set the uifuncbut function where needed. When at the end of the method uifuncbut is still empty, set uifuncbut to the uifunc. ===== Final note ===== ! PS. this is not limited to the compositor it also works for Materials and Textures ! ! PPS. For other branching creating their own node-tree. Please make sure that your uifuncbut is set NULL or a valid draw function ! --- source/blender/blenkernel/BKE_node.h | 5 ++- source/blender/editors/space_node/drawnode.c | 41 ++++++++++++++++++- .../blender/editors/space_node/node_buttons.c | 4 +- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index c86080aa21f..f0ed7a6f5c8 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -87,8 +87,9 @@ typedef struct bNodeType { void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **); /* this line is set on startup of blender */ - void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); - const char *(*labelfunc)(struct bNode *); + void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); + void (*uifuncbut)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); + const char *(*labelfunc)(struct bNode *); void (*initfunc)(struct bNode *); void (*freestoragefunc)(struct bNode *); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 17cfc7d8f95..be46642b47d 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -423,6 +423,7 @@ static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA * /* only once called */ static void node_shader_set_butfunc(bNodeType *ntype) { + ntype->uifuncbut = NULL; switch(ntype->type) { /* case NODE_GROUP: note, typeinfo for group is generated... see "XXX ugly hack" */ @@ -472,6 +473,7 @@ static void node_shader_set_butfunc(bNodeType *ntype) default: ntype->uifunc= NULL; } + if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; } /* ****************** BUTTON CALLBACKS FOR COMPOSITE NODES ***************** */ @@ -1036,6 +1038,35 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *UNUSED(C } } +static void node_composit_buts_colorbalance_but(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "correction_method", 0, NULL, ICON_NONE); + + if (RNA_enum_get(ptr, "correction_method")== 0) { + + uiTemplateColorWheel(layout, ptr, "lift", 1, 1, 0, 1); + uiItemR(layout, ptr, "lift", 0, NULL, ICON_NONE); + + uiTemplateColorWheel(layout, ptr, "gamma", 1, 1, 1, 1); + uiItemR(layout, ptr, "gamma", 0, NULL, ICON_NONE); + + uiTemplateColorWheel(layout, ptr, "gain", 1, 1, 1, 1); + uiItemR(layout, ptr, "gain", 0, NULL, ICON_NONE); + + } else { + + uiTemplateColorWheel(layout, ptr, "offset", 1, 1, 0, 1); + uiItemR(layout, ptr, "offset", 0, NULL, ICON_NONE); + + uiTemplateColorWheel(layout, ptr, "power", 1, 1, 0, 1); + uiItemR(layout, ptr, "power", 0, NULL, ICON_NONE); + + uiTemplateColorWheel(layout, ptr, "slope", 1, 1, 0, 1); + uiItemR(layout, ptr, "slope", 0, NULL, ICON_NONE); + } + +} + static void node_composit_buts_huecorrect(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { @@ -1050,6 +1081,7 @@ static void node_composit_buts_ycc(uiLayout *layout, bContext *UNUSED(C), Pointe /* only once called */ static void node_composit_set_butfunc(bNodeType *ntype) { + ntype->uifuncbut = NULL; switch(ntype->type) { /* case NODE_GROUP: note, typeinfo for group is generated... see "XXX ugly hack" */ @@ -1183,8 +1215,9 @@ static void node_composit_set_butfunc(bNodeType *ntype) ntype->uifunc=node_composit_buts_view_levels; break; case CMP_NODE_COLORBALANCE: - ntype->uifunc=node_composit_buts_colorbalance; - break; + ntype->uifunc=node_composit_buts_colorbalance; + ntype->uifuncbut=node_composit_buts_colorbalance_but; + break; case CMP_NODE_HUECORRECT: ntype->uifunc=node_composit_buts_huecorrect; break; @@ -1198,6 +1231,8 @@ static void node_composit_set_butfunc(bNodeType *ntype) default: ntype->uifunc= NULL; } + if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; + } /* ****************** BUTTON CALLBACKS FOR TEXTURE NODES ***************** */ @@ -1308,6 +1343,7 @@ static void node_texture_buts_output(uiLayout *layout, bContext *UNUSED(C), Poin /* only once called */ static void node_texture_set_butfunc(bNodeType *ntype) { + ntype->uifuncbut = NULL; if( ntype->type >= TEX_NODE_PROC && ntype->type < TEX_NODE_PROC_MAX ) { ntype->uifunc = node_texture_buts_proc; } @@ -1352,6 +1388,7 @@ static void node_texture_set_butfunc(bNodeType *ntype) default: ntype->uifunc= NULL; } + if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; } /* ******* init draw callbacks for all tree types, only called in usiblender.c, once ************* */ diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index 684961f2606..5d2ed700266 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -118,8 +118,8 @@ static void active_node_panel(const bContext *C, Panel *pa) uiItemS(layout); /* draw this node's settings */ - if (node->typeinfo && node->typeinfo->uifunc) - node->typeinfo->uifunc(layout, (bContext *)C, &ptr); + if (node->typeinfo && node->typeinfo->uifuncbut) + node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr); } /* ******************* node buttons registration ************** */ From 830fe8af8449a441cf64a0095ef3f7ff3d8dc534 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 4 Jul 2011 19:22:37 +0000 Subject: [PATCH 20/59] Updated the indent, sorry! --- source/blender/blenkernel/BKE_node.h | 6 +-- source/blender/blenkernel/intern/node.c | 6 +-- source/blender/editors/space_node/drawnode.c | 49 +++++++++---------- .../blender/editors/space_node/node_buttons.c | 4 +- .../blender/editors/space_outliner/outliner.c | 8 +-- source/blender/makesrna/intern/rna_material.c | 8 +-- source/blender/makesrna/intern/rna_render.c | 4 +- source/blender/makesrna/intern/rna_scene.c | 12 ++--- .../nodes/intern/CMP_nodes/CMP_image.c | 16 +++--- .../blender/render/intern/source/pipeline.c | 14 +++--- .../blender/render/intern/source/rendercore.c | 18 +++---- .../blender/render/intern/source/shadeinput.c | 2 +- source/blender/render/intern/source/zbuf.c | 4 +- 13 files changed, 74 insertions(+), 77 deletions(-) diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index f0ed7a6f5c8..e44b5d96852 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -87,9 +87,9 @@ typedef struct bNodeType { void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **); /* this line is set on startup of blender */ - void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); - void (*uifuncbut)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); - const char *(*labelfunc)(struct bNode *); + void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); + void (*uifuncbut)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); + const char *(*labelfunc)(struct bNode *); void (*initfunc)(struct bNode *); void (*freestoragefunc)(struct bNode *); diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 4e76ab0727d..518ee3c341a 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -3156,9 +3156,9 @@ static void force_hidden_passes(bNode *node, int passflag) if(!(passflag & SCE_PASS_INDIRECT)) sock->flag |= SOCK_UNAVAIL; sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB); if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXMA); - if(!(passflag & SCE_PASS_INDEXMA)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_MIST); + sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXMA); + if(!(passflag & SCE_PASS_INDEXMA)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_MIST); if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL; sock= BLI_findlink(&node->outputs, RRES_OUT_EMIT); if(!(passflag & SCE_PASS_EMIT)) sock->flag |= SOCK_UNAVAIL; diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index be46642b47d..1bf2c3d89bd 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -423,7 +423,7 @@ static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA * /* only once called */ static void node_shader_set_butfunc(bNodeType *ntype) { - ntype->uifuncbut = NULL; + ntype->uifuncbut = NULL; switch(ntype->type) { /* case NODE_GROUP: note, typeinfo for group is generated... see "XXX ugly hack" */ @@ -473,7 +473,7 @@ static void node_shader_set_butfunc(bNodeType *ntype) default: ntype->uifunc= NULL; } - if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; + if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; } /* ****************** BUTTON CALLBACKS FOR COMPOSITE NODES ***************** */ @@ -1040,31 +1040,28 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *UNUSED(C } static void node_composit_buts_colorbalance_but(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { - uiItemR(layout, ptr, "correction_method", 0, NULL, ICON_NONE); + uiItemR(layout, ptr, "correction_method", 0, NULL, ICON_NONE); - if (RNA_enum_get(ptr, "correction_method")== 0) { + if (RNA_enum_get(ptr, "correction_method")== 0) { - uiTemplateColorWheel(layout, ptr, "lift", 1, 1, 0, 1); - uiItemR(layout, ptr, "lift", 0, NULL, ICON_NONE); + uiTemplateColorWheel(layout, ptr, "lift", 1, 1, 0, 1); + uiItemR(layout, ptr, "lift", 0, NULL, ICON_NONE); - uiTemplateColorWheel(layout, ptr, "gamma", 1, 1, 1, 1); - uiItemR(layout, ptr, "gamma", 0, NULL, ICON_NONE); + uiTemplateColorWheel(layout, ptr, "gamma", 1, 1, 1, 1); + uiItemR(layout, ptr, "gamma", 0, NULL, ICON_NONE); - uiTemplateColorWheel(layout, ptr, "gain", 1, 1, 1, 1); - uiItemR(layout, ptr, "gain", 0, NULL, ICON_NONE); + uiTemplateColorWheel(layout, ptr, "gain", 1, 1, 1, 1); + uiItemR(layout, ptr, "gain", 0, NULL, ICON_NONE); + } else { + uiTemplateColorWheel(layout, ptr, "offset", 1, 1, 0, 1); + uiItemR(layout, ptr, "offset", 0, NULL, ICON_NONE); - } else { - - uiTemplateColorWheel(layout, ptr, "offset", 1, 1, 0, 1); - uiItemR(layout, ptr, "offset", 0, NULL, ICON_NONE); - - uiTemplateColorWheel(layout, ptr, "power", 1, 1, 0, 1); - uiItemR(layout, ptr, "power", 0, NULL, ICON_NONE); - - uiTemplateColorWheel(layout, ptr, "slope", 1, 1, 0, 1); - uiItemR(layout, ptr, "slope", 0, NULL, ICON_NONE); - } + uiTemplateColorWheel(layout, ptr, "power", 1, 1, 0, 1); + uiItemR(layout, ptr, "power", 0, NULL, ICON_NONE); + uiTemplateColorWheel(layout, ptr, "slope", 1, 1, 0, 1); + uiItemR(layout, ptr, "slope", 0, NULL, ICON_NONE); + } } @@ -1081,7 +1078,7 @@ static void node_composit_buts_ycc(uiLayout *layout, bContext *UNUSED(C), Pointe /* only once called */ static void node_composit_set_butfunc(bNodeType *ntype) { - ntype->uifuncbut = NULL; + ntype->uifuncbut = NULL; switch(ntype->type) { /* case NODE_GROUP: note, typeinfo for group is generated... see "XXX ugly hack" */ @@ -1215,9 +1212,9 @@ static void node_composit_set_butfunc(bNodeType *ntype) ntype->uifunc=node_composit_buts_view_levels; break; case CMP_NODE_COLORBALANCE: - ntype->uifunc=node_composit_buts_colorbalance; - ntype->uifuncbut=node_composit_buts_colorbalance_but; - break; + ntype->uifunc=node_composit_buts_colorbalance; + ntype->uifuncbut=node_composit_buts_colorbalance_but; + break; case CMP_NODE_HUECORRECT: ntype->uifunc=node_composit_buts_huecorrect; break; @@ -1231,7 +1228,7 @@ static void node_composit_set_butfunc(bNodeType *ntype) default: ntype->uifunc= NULL; } - if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; + if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; } diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index 5d2ed700266..4b989a78fab 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -118,8 +118,8 @@ static void active_node_panel(const bContext *C, Panel *pa) uiItemS(layout); /* draw this node's settings */ - if (node->typeinfo && node->typeinfo->uifuncbut) - node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr); + if (node->typeinfo && node->typeinfo->uifuncbut) + node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr); } /* ******************* node buttons registration ************** */ diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index c3699e4b704..a1a6995d1bd 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -480,11 +480,11 @@ static void outliner_add_passes(SpaceOops *soops, TreeElement *tenla, ID *id, Sc te->name= "Index Object"; te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_INDEXMA)); - te->name= "Index Material"; - te->directdata= &srl->passflag; + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_INDEXMA)); + te->name= "Index Material"; + te->directdata= &srl->passflag; - te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_RGBA)); + te= outliner_add_element(soops, &tenla->subtree, id, tenla, TSE_R_PASS, LOG2I(SCE_PASS_RGBA)); te->name= "Color"; te->directdata= &srl->passflag; diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index d90798e9b29..f407aba82fb 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -1676,10 +1676,10 @@ void RNA_def_material(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Light Group", "Limit lighting to lamps in this Group"); RNA_def_property_update(prop, 0, "rna_Material_update"); - prop= RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED); - RNA_def_property_int_sdna(prop, NULL, "index"); - RNA_def_property_ui_text(prop, "Pass Index", "Index # for the IndexMA render pass"); - RNA_def_property_update(prop, NC_OBJECT, NULL); + prop= RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "index"); + RNA_def_property_ui_text(prop, "Pass Index", "Index # for the IndexMA render pass"); + RNA_def_property_update(prop, NC_OBJECT, NULL); /* flags */ diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 3074508d6a7..e3e3296cb70 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -388,8 +388,8 @@ static void rna_def_render_pass(BlenderRNA *brna) {SCE_PASS_MIST, "MIST", 0, "Mist", ""}, {SCE_PASS_EMIT, "EMIT", 0, "Emit", ""}, {SCE_PASS_ENVIRONMENT, "ENVIRONMENT", 0, "Environment", ""}, - {SCE_PASS_INDEXMA, "MATERIAL_INDEX", 0, "Material Index", ""}, - {0, NULL, 0, NULL, NULL}}; + {SCE_PASS_INDEXMA, "MATERIAL_INDEX", 0, "Material Index", ""}, + {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "RenderPass", NULL); RNA_def_struct_ui_text(srna, "Render Pass", ""); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index a496e24143b..662ce04552e 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1515,13 +1515,13 @@ void rna_def_render_layer_common(StructRNA *srna, int scene) if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); else RNA_def_property_clear_flag(prop, PROP_EDITABLE); - prop= RNA_def_property(srna, "use_pass_material_index", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_INDEXMA); - RNA_def_property_ui_text(prop, "Material Index", "Deliver material index pass"); - if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); - else RNA_def_property_clear_flag(prop, PROP_EDITABLE); + prop= RNA_def_property(srna, "use_pass_material_index", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_INDEXMA); + RNA_def_property_ui_text(prop, "Material Index", "Deliver material index pass"); + if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); + else RNA_def_property_clear_flag(prop, PROP_EDITABLE); - prop= RNA_def_property(srna, "use_pass_color", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_pass_color", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_RGBA); RNA_def_property_ui_text(prop, "Color", "Deliver shade-less color pass"); if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update"); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c index 91800897cb3..a5f256054cd 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c @@ -53,8 +53,8 @@ static bNodeSocketType cmp_node_rlayers_out[]= { { SOCK_RGBA, 0, "Refract", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Indirect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VALUE, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "IndexMA", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "IndexMA", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Emit", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Environment",0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } @@ -212,9 +212,9 @@ static void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack * out[RRES_OUT_INDIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDIRECT); if(out[RRES_OUT_INDEXOB]->hasoutput) out[RRES_OUT_INDEXOB]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXOB); - if(out[RRES_OUT_INDEXMA]->hasoutput) - out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA); - if(out[RRES_OUT_MIST]->hasoutput) + if(out[RRES_OUT_INDEXMA]->hasoutput) + out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA); + if(out[RRES_OUT_MIST]->hasoutput) out[RRES_OUT_MIST]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_MIST); if(out[RRES_OUT_EMIT]->hasoutput) out[RRES_OUT_EMIT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_EMIT); @@ -329,7 +329,7 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in CompBuf *buf; int buftype= CB_VEC3; - if(ELEM4(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST, SCE_PASS_INDEXMA)) + if(ELEM4(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST, SCE_PASS_INDEXMA)) buftype= CB_VAL; else if(passcode==SCE_PASS_VECTOR) buftype= CB_VEC4; @@ -376,8 +376,8 @@ static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStac out[RRES_OUT_INDIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDIRECT); if(out[RRES_OUT_INDEXOB]->hasoutput) out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB); - if(out[RRES_OUT_INDEXMA]->hasoutput) - out[RRES_OUT_INDEXMA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXMA); + if(out[RRES_OUT_INDEXMA]->hasoutput) + out[RRES_OUT_INDEXMA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXMA); if(out[RRES_OUT_MIST]->hasoutput) out[RRES_OUT_MIST]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_MIST); if(out[RRES_OUT_EMIT]->hasoutput) diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 37226018a91..b9006b390ab 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -383,11 +383,11 @@ static const char *get_pass_name(int passtype, int channel) if(channel==-1) return "IndexOB"; return "IndexOB.X"; } - if(passtype == SCE_PASS_INDEXMA) { - if(channel==-1) return "IndexMA"; - return "IndexMA.X"; - } - if(passtype == SCE_PASS_MIST) { + if(passtype == SCE_PASS_INDEXMA) { + if(channel==-1) return "IndexMA"; + return "IndexMA.X"; + } + if(passtype == SCE_PASS_MIST) { if(channel==-1) return "Mist"; return "Mist.Z"; } @@ -452,8 +452,8 @@ static int passtype_from_name(char *str) if(strcmp(str, "IndexOB")==0) return SCE_PASS_INDEXOB; - if(strcmp(str, "IndexMA")==0) - return SCE_PASS_INDEXMA; + if(strcmp(str, "IndexMA")==0) + return SCE_PASS_INDEXMA; if(strcmp(str, "Mist")==0) return SCE_PASS_MIST; diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 11ae721ad95..2fa6bed5aae 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -515,15 +515,15 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset, *fp= (float)shi->obr->ob->index; } break; - case SCE_PASS_INDEXMA: - /* no filter */ - if(shi->vlr) { - fp= rpass->rect + offset; - if(*fp==0.0f) - *fp= (float)shi->mat->index; - } - break; - case SCE_PASS_MIST: + case SCE_PASS_INDEXMA: + /* no filter */ + if(shi->vlr) { + fp= rpass->rect + offset; + if(*fp==0.0f) + *fp= (float)shi->mat->index; + } + break; + case SCE_PASS_MIST: /* */ col= &shr->mist; pixsize= 1; diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index 277cec1835a..a1b79346824 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -1455,7 +1455,7 @@ int shade_samples(ShadeSample *ssamp, PixStr *ps, int x, int y) shade_samples_do_AO(ssamp); /* if shade (all shadepinputs have same passflag) */ - if(ssamp->shi[0].passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB|SCE_PASS_INDEXMA)) { + if(ssamp->shi[0].passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB|SCE_PASS_INDEXMA)) { for(samp=0; samptot; samp++, shi++, shr++) { shade_input_set_shade_texco(shi); diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index 3ac6d2c33ff..13d9ead79e8 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -3497,7 +3497,7 @@ static void add_transp_obindex(RenderLayer *rl, int offset, Object *ob) RenderPass *rpass; for(rpass= rl->passes.first; rpass; rpass= rpass->next) { - if(rpass->passtype == SCE_PASS_INDEXOB||rpass->passtype == SCE_PASS_INDEXMA) { + if(rpass->passtype == SCE_PASS_INDEXOB||rpass->passtype == SCE_PASS_INDEXMA) { float *fp= rpass->rect + offset; *fp= (float)ob->index; break; @@ -3820,7 +3820,7 @@ static int shade_tra_samples(ShadeSample *ssamp, StrandShadeCache *cache, int x, shade_samples_do_AO(ssamp); /* if shade (all shadepinputs have same passflag) */ - if(shi->passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB|SCE_PASS_INDEXMA)) { + if(shi->passflag & ~(SCE_PASS_Z|SCE_PASS_INDEXOB|SCE_PASS_INDEXMA)) { for(samp=0; samptot; samp++, shi++, shr++) { shade_input_set_shade_texco(shi); shade_input_do_shade(shi, shr); From 355cb26ff389a480f11abafabce30dd6fa52d581 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Tue, 5 Jul 2011 00:30:27 +0000 Subject: [PATCH 21/59] blenderplayer bundle in OSX doesn't need script folder (untested) I can't test this here, somehow blender+scons is failing in my building env. but it should work. Basically it skips the copy of the script folder for the blenderplayer.app I will test it once buildbot get pass this review ;) --- build_files/scons/tools/Blender.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/build_files/scons/tools/Blender.py b/build_files/scons/tools/Blender.py index 50f43a03b8b..d8f5ba9e115 100644 --- a/build_files/scons/tools/Blender.py +++ b/build_files/scons/tools/Blender.py @@ -565,13 +565,16 @@ def AppIt(target=None, source=None, env=None): cmd = 'mkdir %s/%s.app/Contents/MacOS/%s/python/'%(installdir,binary, VERSION) commands.getoutput(cmd) cmd = 'unzip -q %s/release/%s -d %s/%s.app/Contents/MacOS/%s/python/'%(libdir,python_zip,installdir,binary,VERSION) - commands.getoutput(cmd) - cmd = 'cp -R %s/release/scripts %s/%s.app/Contents/MacOS/%s/'%(bldroot,installdir,binary,VERSION) - commands.getoutput(cmd) - cmd = 'cp -R %s/release/ui %s/%s.app/Contents/MacOS/%s/'%(bldroot,installdir,binary,VERSION) - commands.getoutput(cmd) - cmd = 'cp -R %s/release/io %s/%s.app/Contents/MacOS/%s/'%(bldroot,installdir,binary,VERSION) commands.getoutput(cmd) + + if binary == 'blender':#not copy everything for blenderplayer + cmd = 'cp -R %s/release/scripts %s/%s.app/Contents/MacOS/%s/'%(bldroot,installdir,binary,VERSION) + commands.getoutput(cmd) + cmd = 'cp -R %s/release/ui %s/%s.app/Contents/MacOS/%s/'%(bldroot,installdir,binary,VERSION) + commands.getoutput(cmd) + cmd = 'cp -R %s/release/io %s/%s.app/Contents/MacOS/%s/'%(bldroot,installdir,binary,VERSION) + commands.getoutput(cmd) + cmd = 'chmod +x %s/%s.app/Contents/MacOS/%s'%(installdir,binary, binary) commands.getoutput(cmd) cmd = 'find %s/%s.app -name .svn -prune -exec rm -rf {} \;'%(installdir, binary) From 0dcc370f3bc43dfe3a4cb2d6d9ccc56a585adb10 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Tue, 5 Jul 2011 01:49:34 +0000 Subject: [PATCH 22/59] Fix for [#27347] Particle x-axis mirror editing not working as expected. * The x-mirror editing didn't mirror strand lengths. --- source/blender/editors/physics/particle_edit.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index 9124bdaf41c..b8cdc18e739 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -827,6 +827,8 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys if(key->flag & PEK_TAG) mkey->flag |= PEK_TAG; + + mkey->length = key->length; } if(point->flag & PEP_TAG) From 35965308a85a1a2280c4e27eff7405a7ba7f0369 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Tue, 5 Jul 2011 02:18:55 +0000 Subject: [PATCH 23/59] Fix for [#27579] Particles Cache Problem * Horrors from the ancient world of deprecated code: object animation offset can't really work correctly with particles unless point cache takes full control of particle system timing. * Disabled the non-working offset control from effecting particles so that for now particles will work consistently and the offset is only applied to the object. --- source/blender/blenkernel/intern/pointcache.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index 64893bb0b5b..6b92c6e9540 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -2124,7 +2124,8 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra { Object *ob; PointCache *cache; - float offset, time, nexttime; + /* float offset; unused for now */ + float time, nexttime; /* TODO: this has to be sorter out once bsystem_time gets redone, */ /* now caches can handle interpolating etc. too - jahka */ @@ -2152,13 +2153,18 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra *startframe= cache->startframe; *endframe= cache->endframe; - // XXX ipoflag is depreceated - old animation system stuff - if (/*(ob->ipoflag & OB_OFFS_PARENT) &&*/ (ob->partype & PARSLOW)==0) { + /* TODO: time handling with object offsets and simulated vs. cached + * particles isn't particularly easy, so for now what you see is what + * you get. In the future point cache could handle the whole particle + * system timing. */ +#if 0 + if ((ob->partype & PARSLOW)==0) { offset= give_timeoffset(ob); *startframe += (int)(offset+0.5f); *endframe += (int)(offset+0.5f); } +#endif } /* verify cached_frames array is up to date */ From db2d737f0e646a49671f7645f22f24cf1cb28a7a Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Tue, 5 Jul 2011 02:56:14 +0000 Subject: [PATCH 24/59] Fix for [#27182] particle/collision kill interacting strangely * Particle die time wasn't taken correctly into account in certain situations when calculating dynamics. --- source/blender/blenkernel/intern/particle_system.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 4e3840832bb..b2e5c059edf 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3670,7 +3670,7 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra) pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1); birthtime = pa->time; - dietime = birthtime + pa->lifetime; + dietime = pa->dietime; /* store this, so we can do multiple loops over particles */ pa->state.time = dfra; From 61fc8392006c54bce2469616487e5f8fd5062456 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Jul 2011 07:46:25 +0000 Subject: [PATCH 25/59] fix [#27862] OpenGL render animation don't respect .png RGB option. --- source/blender/editors/render/render_opengl.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index a55f9101a0f..3256112426b 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -438,8 +438,6 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op) ibuf= BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock); if(ibuf) { - short ibuf_free= FALSE; - /* color -> greyscale */ /* editing directly would alter the render view */ if(scene->r.planes == 8) { @@ -447,8 +445,15 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op) IMB_color_to_bw(ibuf_bw); // IMB_freeImBuf(ibuf); /* owned by the image */ ibuf= ibuf_bw; - - ibuf_free= TRUE; + } + else { + /* this is lightweight & doesnt re-alloc the buffers, only do this + * to save the correct bit depth since the image is always RGBA */ + ImBuf *ibuf_cpy= IMB_allocImBuf(ibuf->x, ibuf->y, scene->r.planes, 0); + ibuf_cpy->rect= ibuf->rect; + ibuf_cpy->rect_float= ibuf->rect_float; + ibuf_cpy->zbuf_float= ibuf->zbuf_float; + ibuf= ibuf_cpy; } if(BKE_imtype_is_movie(scene->r.imtype)) { @@ -472,9 +477,8 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op) } } - if(ibuf_free) { - IMB_freeImBuf(ibuf); - } + /* imbuf knows which rects are not part of ibuf */ + IMB_freeImBuf(ibuf); } BKE_image_release_ibuf(oglrender->ima, lock); From 1ff54f91ff52c53d98cbecf9988ad051da10018d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 08:28:54 +0000 Subject: [PATCH 26/59] =?UTF-8?q?Fix:=20#27861=20bevel=20angle=20limit=20a?= =?UTF-8?q?t=2090=C2=B0=20wasn't=20working=20well=20on=20cube,=20tweaked?= =?UTF-8?q?=20epsilon=20value=20to=20be=20a=20bit=20smaller.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/blender/blenkernel/intern/BME_tools.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/BME_tools.c b/source/blender/blenkernel/intern/BME_tools.c index 7665b581d7e..99b6e7f9095 100644 --- a/source/blender/blenkernel/intern/BME_tools.c +++ b/source/blender/blenkernel/intern/BME_tools.c @@ -1002,7 +1002,7 @@ static BME_Mesh *BME_bevel_initialize(BME_Mesh *bm, int options, int UNUSED(defg } /* edge pass */ - threshold = (float)cos((angle + 0.00001) * M_PI / 180.0); + threshold = (float)cos((angle + 0.001) * M_PI / 180.0); for (e=bm->edges.first; e; e=e->next) { e->tflag1 = BME_BEVEL_ORIG; weight = 0.0; From 3d5ae95986268f693a0d3c98f875eb0c12b96be8 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 08:57:11 +0000 Subject: [PATCH 27/59] Fix #27863: converting curve spline type from python crashes. --- source/blender/editors/curve/editcurve.c | 5 +++++ source/blender/editors/include/ED_curve.h | 1 + source/blender/makesrna/intern/rna_curve.c | 4 +--- source/blenderplayer/bad_level_call_stubs/stubs.c | 4 +++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 99aebfffaee..06d88b16fa8 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -3535,6 +3535,11 @@ static int convertspline(short type, Nurb *nu) return 0; } +void ED_nurb_set_spline_type(Nurb *nu, int type) +{ + convertspline(type, nu); +} + static int set_spline_type_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h index 6a92ee2e056..d78d2846572 100644 --- a/source/blender/editors/include/ED_curve.h +++ b/source/blender/editors/include/ED_curve.h @@ -71,6 +71,7 @@ int mouse_nurb (struct bContext *C, const int mval[2], int extend); struct Nurb *add_nurbs_primitive(struct bContext *C, float mat[4][4], int type, int newob); int isNurbsel (struct Nurb *nu); +void ED_nurb_set_spline_type(struct Nurb *nu, int type); int join_curve_exec (struct bContext *C, struct wmOperator *op); diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index 594295ba817..f2811e7320b 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -281,8 +281,7 @@ static int rna_Nurb_length(PointerRNA *ptr) static void rna_Nurb_type_set(PointerRNA *ptr, int value) { Nurb *nu= (Nurb*)ptr->data; - nu->type = value; - // XXX - TODO change datatypes + ED_nurb_set_spline_type(nu, value); } static void rna_BPoint_array_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) @@ -1448,7 +1447,6 @@ static void rna_def_curve_nurb(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Radius Interpolation", "The type of radius interpolation for Bezier curves"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - // XXX - switching type probably needs comprehensive recalc of data like in 2.4x prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, curve_type_items); RNA_def_property_enum_funcs(prop, NULL, "rna_Nurb_type_set", NULL); diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index e496fa0fa8c..7bf5fe9dde3 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -68,6 +68,7 @@ struct Mesh; struct ModifierData; struct MultiresModifierData; struct NodeBlurData; +struct Nurb; struct Object; struct PBVHNode; struct Render; @@ -292,7 +293,8 @@ float ED_rollBoneToVector(struct EditBone *bone, float new_up_axis[3]){return 0. void ED_space_image_size(struct SpaceImage *sima, int *width, int *height){} struct ListBase *ED_curve_editnurbs(struct Curve *cu){return NULL;} -void free_curve_editNurb (struct Curve *cu){}; +void free_curve_editNurb (struct Curve *cu){} +void ED_nurb_set_spline_type(struct Nurb *nu, int type){} void EM_selectmode_set(struct EditMesh *em){} int EM_texFaceCheck(struct EditMesh *em){return 0;} From 962c1606fc913c88c4d20c8318126ef9e2315b75 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 09:35:38 +0000 Subject: [PATCH 28/59] Fix #27810: bones drawn blue in 2.49 file, was still checking stride bone flag for drawing even though that feature is no longer in 2.5. --- source/blender/editors/space_view3d/drawarmature.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index 02a7ea890f5..ad621257602 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -197,8 +197,7 @@ static short set_pchan_glColor (short colCode, int boneflag, int constflag) case PCHAN_COLOR_CONSTS: { if ( (bcolor == NULL) || (bcolor->flag & TH_WIRECOLOR_CONSTCOLS) ) { - if (constflag & PCHAN_HAS_STRIDE) glColor4ub(0, 0, 200, 80); - else if (constflag & PCHAN_HAS_TARGET) glColor4ub(255, 150, 0, 80); + if (constflag & PCHAN_HAS_TARGET) glColor4ub(255, 150, 0, 80); else if (constflag & PCHAN_HAS_IK) glColor4ub(255, 255, 0, 80); else if (constflag & PCHAN_HAS_SPLINEIK) glColor4ub(200, 255, 0, 80); else if (constflag & PCHAN_HAS_CONST) glColor4ub(0, 255, 120, 80); @@ -269,8 +268,7 @@ static short set_pchan_glColor (short colCode, int boneflag, int constflag) { /* inner part in background color or constraint */ if ( (constflag) && ((bcolor==NULL) || (bcolor->flag & TH_WIRECOLOR_CONSTCOLS)) ) { - if (constflag & PCHAN_HAS_STRIDE) glColor3ub(0, 0, 200); - else if (constflag & PCHAN_HAS_TARGET) glColor3ub(255, 150, 0); + if (constflag & PCHAN_HAS_TARGET) glColor3ub(255, 150, 0); else if (constflag & PCHAN_HAS_IK) glColor3ub(255, 255, 0); else if (constflag & PCHAN_HAS_SPLINEIK) glColor3ub(200, 255, 0); else if (constflag & PCHAN_HAS_CONST) glColor3ub(0, 255, 120); @@ -1865,9 +1863,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base, constflag= pchan->constflag; if (pchan->flag & (POSE_ROT|POSE_LOC|POSE_SIZE)) constflag |= PCHAN_HAS_ACTION; - if (pchan->flag & POSE_STRIDE) - constflag |= PCHAN_HAS_STRIDE; - + /* set color-set to use */ set_pchan_colorset(ob, pchan); From 7950ac791bb5b772b26354313cd19deece0175fc Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 09:47:09 +0000 Subject: [PATCH 29/59] Fix #27846: time extend / E key not work in sequence editor. --- source/blender/editors/transform/transform.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 181fb0f0aac..d3a30991aa6 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -5530,7 +5530,7 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d, void initTimeTranslate(TransInfo *t) { /* this tool is only really available in the Action Editor... */ - if (t->spacetype != SPACE_ACTION) { + if (!ELEM(t->spacetype, SPACE_ACTION, SPACE_SEQ)) { t->state = TRANS_CANCEL; } From ef0f475f207b3db1c7cb760180c2702c01f213a3 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 10:04:40 +0000 Subject: [PATCH 30/59] Fix #27826: bone envelope head/tail radius not dynamically updated in viewport. --- source/blender/makesrna/intern/rna_armature.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c index 2060f75f9de..0310ce917d4 100644 --- a/source/blender/makesrna/intern/rna_armature.c +++ b/source/blender/makesrna/intern/rna_armature.c @@ -509,6 +509,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone) prop= RNA_def_property(srna, "head_radius", PROP_FLOAT, PROP_UNSIGNED); if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update"); + else RNA_def_property_update(prop, 0, "rna_Armature_update_data"); RNA_def_property_float_sdna(prop, NULL, "rad_head"); //RNA_def_property_range(prop, 0, 1000); // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid); RNA_def_property_ui_range(prop, 0.01, 100, 0.1, 3); @@ -516,6 +517,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone) prop= RNA_def_property(srna, "tail_radius", PROP_FLOAT, PROP_UNSIGNED); if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update"); + else RNA_def_property_update(prop, 0, "rna_Armature_update_data"); RNA_def_property_float_sdna(prop, NULL, "rad_tail"); //RNA_def_property_range(prop, 0, 1000); // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid); RNA_def_property_ui_range(prop, 0.01, 100, 0.1, 3); From 495ce5c88b124637e3493c9759a7b6348362635a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 10:35:48 +0000 Subject: [PATCH 31/59] Fix part of #27858: crash trying to apply subsurf modifier as shape key, fix found by Bastian Schreiber. --- source/blender/editors/object/object_modifier.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index fca35683c6f..2ac9161ffa3 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -401,6 +401,8 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M { ModifierTypeInfo *mti= modifierType_getInfo(md->type); + md->scene= scene; + if (mti->isDisabled && mti->isDisabled(md, 0)) { BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply"); return 0; @@ -449,6 +451,8 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, { ModifierTypeInfo *mti= modifierType_getInfo(md->type); + md->scene= scene; + if (mti->isDisabled && mti->isDisabled(md, 0)) { BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping apply"); return 0; From ccd31900ab9659b6fdc035fd91bff9f508334e22 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 12:25:56 +0000 Subject: [PATCH 32/59] Fix #27855: crash on enabling high resolution smoke. Wavelet tile generation code was reading outside of array bounds, and as a result could give a noise.wavelets file with nan values. Now that problem is fixed, and existing files with nan are ignored. --- intern/smoke/intern/WAVELET_NOISE.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/intern/smoke/intern/WAVELET_NOISE.h b/intern/smoke/intern/WAVELET_NOISE.h index b556b4a2e66..edbf4254199 100644 --- a/intern/smoke/intern/WAVELET_NOISE.h +++ b/intern/smoke/intern/WAVELET_NOISE.h @@ -69,7 +69,7 @@ static void downsampleX(float *from, float *to, int n){ const float *a = &downCoeffs[16]; for (int i = 0; i < n / 2; i++) { to[i] = 0; - for (int k = 2 * i - 16; k <= 2 * i + 16; k++) + for (int k = 2 * i - 16; k < 2 * i + 16; k++) to[i] += a[k - 2 * i] * from[modFast128(k)]; } } @@ -79,7 +79,7 @@ static void downsampleY(float *from, float *to, int n){ const float *a = &downCoeffs[16]; for (int i = 0; i < n / 2; i++) { to[i * n] = 0; - for (int k = 2 * i - 16; k <= 2 * i + 16; k++) + for (int k = 2 * i - 16; k < 2 * i + 16; k++) to[i * n] += a[k - 2 * i] * from[modFast128(k) * n]; } } @@ -89,7 +89,7 @@ static void downsampleZ(float *from, float *to, int n){ const float *a = &downCoeffs[16]; for (int i = 0; i < n / 2; i++) { to[i * n * n] = 0; - for (int k = 2 * i - 16; k <= 2 * i + 16; k++) + for (int k = 2 * i - 16; k < 2 * i + 16; k++) to[i * n * n] += a[k - 2 * i] * from[modFast128(k) * n * n]; } } @@ -262,6 +262,14 @@ static bool loadTile(float* const noiseTileData, std::string filename) printf("loadTile: Noise tile '%s' is wrong size %d.\n", filename.c_str(), (int)bread); return false; } + + // check for invalid nan tile data that could be generated. bug is now + // fixed, but invalid files may still hang around + if (isnan(noiseTileData[0])) { + printf("loadTile: Noise tile '%s' contains nan values.\n", filename.c_str()); + return false; + } + return true; } From c78cee8e278e5c4ff27674c34b367575225afe05 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Tue, 5 Jul 2011 14:53:37 +0000 Subject: [PATCH 33/59] Fix compile for msvc (broken in r38119) --- intern/smoke/intern/WAVELET_NOISE.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/intern/smoke/intern/WAVELET_NOISE.h b/intern/smoke/intern/WAVELET_NOISE.h index edbf4254199..66dfb95d143 100644 --- a/intern/smoke/intern/WAVELET_NOISE.h +++ b/intern/smoke/intern/WAVELET_NOISE.h @@ -45,6 +45,11 @@ #include +#ifdef WIN32 +#include +#define isnan _isnan +#endif + // Tile file header, update revision upon any change done to the noise generator static const char tilefile_headerstring[] = "Noise Tile File rev. "; static const char tilefile_revision[] = "001"; From 33afa06412e3fed21c1afa806e9a8a7f91c18c9e Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 16:31:21 +0000 Subject: [PATCH 34/59] Fix #27848: sequencer strip hard cut looses soft trim on second strip. --- .../editors/space_sequencer/sequencer_edit.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index c8965c4d3db..4f45b84c08e 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -124,6 +124,7 @@ typedef struct TransSeq { int startstill, endstill; int startdisp, enddisp; int startofs, endofs; + int anim_startofs, anim_endofs; /* int final_left, final_right; */ /* UNUSED */ int len; } TransSeq; @@ -729,8 +730,10 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe) ts.endstill= seq->endstill; ts.startdisp= seq->startdisp; ts.enddisp= seq->enddisp; - ts.startofs= seq->anim_startofs; - ts.endofs= seq->anim_endofs; + ts.startofs= seq->startofs; + ts.endofs= seq->endofs; + ts.anim_startofs= seq->anim_startofs; + ts.anim_endofs= seq->anim_endofs; ts.len= seq->len; /* First Strip! */ @@ -780,7 +783,7 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe) if ((seqn->startstill) && (cutframe == seqn->start + 1)) { seqn->start = ts.start; seqn->startstill= ts.start- cutframe; - seqn->anim_endofs = ts.endofs; + seqn->anim_endofs = ts.anim_endofs; seqn->endstill = ts.endstill; } @@ -789,8 +792,9 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe) seqn->start = cutframe; seqn->startstill = 0; seqn->startofs = 0; + seqn->endofs = ts.endofs; seqn->anim_startofs += cutframe - ts.start; - seqn->anim_endofs = ts.endofs; + seqn->anim_endofs = ts.anim_endofs; seqn->endstill = ts.endstill; } @@ -825,6 +829,8 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe) ts.enddisp= seq->enddisp; ts.startofs= seq->startofs; ts.endofs= seq->endofs; + ts.anim_startofs= seq->anim_startofs; + ts.anim_endofs= seq->anim_endofs; ts.len= seq->len; /* First Strip! */ From 81ad6fa4e6e00fbf5f3e4d2c964e99f88a49148c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 18:54:16 +0000 Subject: [PATCH 35/59] Fix small part of #27815: recognize m2ts as video file extension. --- source/blender/imbuf/intern/util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c index fe85f63e109..6db8dcc06cf 100644 --- a/source/blender/imbuf/intern/util.c +++ b/source/blender/imbuf/intern/util.c @@ -113,6 +113,7 @@ const char *imb_ext_movie[] = { ".m4v", ".m2v", ".m2t", + ".m2ts", ".mts", ".mv", ".avs", From 87c2842630da30e76abb9aed3f3d448b6a4c9c1a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 19:04:38 +0000 Subject: [PATCH 36/59] Patch #27842: build fix for solaris, missing finite(). Patch by A. Hettinger. --- source/blender/blenlib/BLI_math_base.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h index 6ff57b08724..b5bab6f15be 100644 --- a/source/blender/blenlib/BLI_math_base.h +++ b/source/blender/blenlib/BLI_math_base.h @@ -39,6 +39,10 @@ #include #include "BLI_math_inline.h" +#ifdef __sun__ +#include /* for finite() */ +#endif + #ifndef M_PI #define M_PI 3.14159265358979323846 #endif From e15fd7df6c4670da76b8d434aff3999fd90bef30 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 19:10:28 +0000 Subject: [PATCH 37/59] Patch #27829: fix X11 compile problem due to missing XF86XK_AudioForward define on Debian Lenny. Patch by "dungeoneer". --- intern/ghost/intern/GHOST_SystemX11.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index c53bf7de36c..49c330dfd58 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -1175,7 +1175,9 @@ convertXKey( GXMAP(type,XF86XK_AudioPrev, GHOST_kKeyMediaFirst); GXMAP(type,XF86XK_AudioRewind, GHOST_kKeyMediaFirst); GXMAP(type,XF86XK_AudioNext, GHOST_kKeyMediaLast); +#ifdef XF86XK_AudioForward /* Debian lenny's XF86keysym.h has no XF86XK_AudioForward define */ GXMAP(type,XF86XK_AudioForward, GHOST_kKeyMediaLast); +#endif #endif /* some extra sun cruft (NICE KEYBOARD!) */ From 959cd0fe6957e41064e329db2ac168a9914d5f7c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 19:45:26 +0000 Subject: [PATCH 38/59] Fix #27777: vertex color disabled when in a reused node material. --- source/blender/blenkernel/intern/material.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 334f018efc9..2f29074834b 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -867,6 +867,10 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb) if(ma->strand_surfnor > 0.0f) ma->mode_l |= MA_STR_SURFDIFF; + + /* parses the geom+tex nodes */ + if(ma->nodetree && ma->use_nodes) + ntreeShaderGetTexcoMode(ma->nodetree, r_mode, &ma->texco, &ma->mode_l); } static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode, float *amb) @@ -887,8 +891,6 @@ static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode init_render_nodetree((bNodeTree *)node->id, basemat, r_mode, amb); } } - /* parses the geom+tex nodes */ - ntreeShaderGetTexcoMode(ntree, r_mode, &basemat->texco, &basemat->mode_l); } void init_render_material(Material *mat, int r_mode, float *amb) From e7878389bb8211f19fa6c767ae19e4b6be996d08 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 5 Jul 2011 20:15:29 +0000 Subject: [PATCH 39/59] Fix #27865: weird mouse warping with continuous grab on OS X. --- intern/ghost/intern/GHOST_SystemCocoa.mm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index 69423f2dfbf..bb3d6e3aee3 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -1498,15 +1498,18 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr) GHOST_TInt32 x_mouse= mousePos.x; GHOST_TInt32 y_mouse= mousePos.y; GHOST_TInt32 x_accum, y_accum, x_cur, y_cur, x, y; - GHOST_Rect bounds, correctedBounds; + GHOST_Rect bounds, windowBounds, correctedBounds; /* fallback to window bounds */ if(window->getCursorGrabBounds(bounds)==GHOST_kFailure) window->getClientBounds(bounds); //Switch back to Cocoa coordinates orientation (y=0 at botton,the same as blender internal btw!), and to client coordinates - window->screenToClient(bounds.m_l, bounds.m_b, correctedBounds.m_l, correctedBounds.m_b); - window->screenToClient(bounds.m_r, bounds.m_t, correctedBounds.m_r, correctedBounds.m_t); + window->getClientBounds(windowBounds); + window->screenToClient(bounds.m_l, bounds.m_b, correctedBounds.m_l, correctedBounds.m_t); + window->screenToClient(bounds.m_r, bounds.m_t, correctedBounds.m_r, correctedBounds.m_b); + correctedBounds.m_b = (windowBounds.m_b - windowBounds.m_t) - correctedBounds.m_b; + correctedBounds.m_t = (windowBounds.m_b - windowBounds.m_t) - correctedBounds.m_t; //Update accumulation counts window->getCursorGrabAccum(x_accum, y_accum); From 26d75618ef896b0ec125d0dbb5ad530a0b88dffe Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 6 Jul 2011 07:05:29 +0000 Subject: [PATCH 40/59] =?UTF-8?q?patch=20[#27871]=20bge.texture=20document?= =?UTF-8?q?ation=20from=20Solano=20Fel=C3=ADcio=20(+=20changes=20from=20me?= =?UTF-8?q?)=20it=20still=20needs=20work=20...=20and=20I=20can't=20test=20?= =?UTF-8?q?rst=20in=20windows=20so=20for=20now=20let's=20pretend=20it=20bu?= =?UTF-8?q?ilds.=20If=20someone=20can=20generate=20the=20docs=20and=20see?= =?UTF-8?q?=20how=20it=20goes=20please=20let=20me=20know.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (plus a small fix for bge.logic rst) --- doc/python_api/rst/bge.logic.rst | 2 +- doc/python_api/rst/bge.texture.rst | 480 +++++++++++++++++++++++++++++ 2 files changed, 481 insertions(+), 1 deletion(-) create mode 100644 doc/python_api/rst/bge.texture.rst diff --git a/doc/python_api/rst/bge.logic.rst b/doc/python_api/rst/bge.logic.rst index 0af4a1184d6..f7163ea928e 100644 --- a/doc/python_api/rst/bge.logic.rst +++ b/doc/python_api/rst/bge.logic.rst @@ -17,7 +17,7 @@ Module to access logic functions, imported automatically into the python control # To get the game object this controller is on: obj = cont.owner -:class:`~bge.types.KX_GameObject` and :class:`~bge.types.KX_Camera` or :class:`bge.types.~KX_LightObject` methods are available depending on the type of object +:class:`~bge.types.KX_GameObject` and :class:`~bge.types.KX_Camera` or :class:`~bge.types.KX_LightObject` methods are available depending on the type of object .. code-block:: python diff --git a/doc/python_api/rst/bge.texture.rst b/doc/python_api/rst/bge.texture.rst new file mode 100644 index 00000000000..b1ded95fc89 --- /dev/null +++ b/doc/python_api/rst/bge.texture.rst @@ -0,0 +1,480 @@ + +Game Engine bge.texture Module +============================== +.. note:: + This documentation is still very weak, and needs some help! Right now they are mostly a collection + of the docstrings found in the bge.texture source code + some random places filled with text. + +***** +Intro +***** + +The bge.texture module allows you to manipulate textures during the game. + +Several sources for texture are possible: video files, image files, video capture, memory buffer, camera render or a mix of that. + +The video and image files can be loaded from the internet using an URL instead of a file name. + +In addition, you can apply filters on the images before sending them to the GPU, allowing video effect: blue screen, color band, gray, normal map. + +bge.texture uses FFmpeg to load images and videos. All the formats and codecs that FFmpeg supports are supported by this module, including but not limited to:: + + * AVI + * Ogg + * Xvid + * Theora + * dv1394 camera + * video4linux capture card (this includes many webcams) + * videoForWindows capture card (this includes many webcams) + * JPG + +The principle is simple: first you identify a texture on an existing object using +the :materialID: function, then you create a new texture with dynamic content +and swap the two textures in the GPU. + +The GE is not aware of the substitution and continues to display the object as always, +except that you are now in control of the texture. + +When the texture object is deleted, the new texture is deleted and the old texture restored. + +.. module:: bge.texture + +.. code-block:: python + + import bge + from bge import texture + from bge import logic + + cont = logic.getCurrentController() + obj = cont.owner + + # the creation of the texture must be done once: save the + # texture object in an attribute of GameLogic module makes it persistent + if not hasattr(logic, 'video'): + + # identify a static texture by name + matID = texture.materialID(obj, 'IMvideo.png') + + # create a dynamic texture that will replace the static texture + logic.video = texture.Texture(obj, matID) + + # define a source of image for the texture, here a movie + movie = logic.expandPath('//trailer_400p.ogg') + logic.video.source = texture.VideoFFmpeg(movie) + logic.video.source.scale = True + + # quick off the movie, but it wont play in the background + logic.video.source.play() + + # you need to call this function every frame to ensure update of the texture. + logic.video.refresh(True) + +.. class:: VideoFFmpeg(file [, capture=-1, rate=25.0, width=0, height=0]) + + FFmpeg video source + + .. attribute:: status + video status + + .. attribute:: range + replay range + + .. attribute:: repeat + repeat count, -1 for infinite repeat + + :type: int + + .. attribute:: framerate + frame rate + + :type: float + + .. attribute:: valid + Tells if an image is available + + :type: bool + + .. attribute:: image + image data + + .. attribute:: size + image size + + .. attribute:: scale + fast scale of image (near neighbour) + + .. attribute:: flip + flip image vertically + + .. attribute:: filter + pixel filter + + .. attribute:: preseek + number of frames of preseek + + :type: int + + .. attribute:: deinterlace + deinterlace image + + :type: bool + + .. method:: play() + Play (restart) video + + .. method:: pause() + pause video + + .. method:: stop() + stop video (play will replay it from start) + + .. method:: refresh() + Refresh video - get its status + +.. class:: ImageFFmpeg(file) + + FFmpeg image source + + .. attribute:: status + video status + + .. attribute:: valid + Tells if an image is available + + :type: bool + + .. attribute:: image + image data + + .. attribute:: size + image size + + .. attribute:: scale + fast scale of image (near neighbour) + + .. attribute:: flip + flip image vertically + + .. attribute:: filter + pixel filter + + .. method:: refresh() + Refresh image, i.e. load it + + .. method:: reload([newname]) + Reload image, i.e. reopen it + +.. class:: ImageBuff() + + Image source from image buffer + + .. attribute:: filter + pixel filter + + .. attribute:: flip + flip image vertically + + .. attribute:: image + image data + + .. method:: load(imageBuffer, width, height) + Load image from buffer + + .. method:: plot(imageBuffer, width, height, positionX, positionY) + update image buffer + + .. attribute:: scale + fast scale of image (near neighbour) + + .. attribute:: size + image size + + .. attribute:: valid + bool to tell if an image is available + +.. class:: ImageMirror(scene) + + Image source from mirror + + .. attribute:: alpha + use alpha in texture + + .. attribute:: background + background color + + .. attribute:: capsize + size of render area + + .. attribute:: clip + clipping distance + + .. attribute:: filter + pixel filter + + .. attribute:: flip + flip image vertically + + .. attribute:: image + image data + + .. method:: refresh(imageMirror) + Refresh image - invalidate its current content + + .. attribute:: scale + fast scale of image (near neighbour) + + .. attribute:: size + image size + + .. attribute:: valid + bool to tell if an image is available + + .. attribute:: whole + use whole viewport to render + +.. class:: ImageMix() + + Image mixer + + .. attribute:: filter + pixel filter + + .. attribute:: flip + flip image vertically + + .. method:: getSource(imageMix) + get image source + + .. method:: getWeight(imageMix) + get image source weight + + .. attribute:: image + image data + + .. method:: refresh(imageMix) + Refresh image - invalidate its current content + + .. attribute:: scale + fast scale of image (near neighbour) + + .. method:: setSource(imageMix) + set image source + + .. method:: setWeight(imageMix) + set image source weight + + .. attribute:: valid + bool to tell if an image is available + +.. class:: ImageRender(scene, camera) + + Image source from render + + .. attribute:: alpha + use alpha in texture + + .. attribute:: background + background color + + .. attribute:: capsize + size of render area + + .. attribute:: filter + pixel filter + + .. attribute:: flip + flip image vertically + + .. attribute:: image + image data + + .. method:: refresh(imageRender) + Refresh image - invalidate its current content + + .. attribute:: scale + fast scale of image (near neighbour) + + .. attribute:: size + image size + + .. attribute:: valid + bool to tell if an image is available + + .. attribute:: whole + use whole viewport to render + +.. class:: ImageViewport() + + Image source from viewport + + .. attribute:: alpha + use alpha in texture + + .. attribute:: capsize + size of viewport area being captured + + .. attribute:: filter + pixel filter + + .. attribute:: flip + flip image vertically + + .. attribute:: image + image data + + .. attribute:: position + upper left corner of captured area + + .. method:: refresh(imageViewport) + Refresh image - invalidate its current content + + .. attribute:: scale + fast scale of image (near neighbour) + + .. attribute:: size + image size + + .. attribute:: valid + bool to tell if an image is available + + .. attribute:: whole + use whole viewport to capture + +.. class:: Texture(gameObj) + + Texture objects + + .. attribute:: bindId + OpenGL Bind Name + + .. method:: close(texture) + Close dynamic texture and restore original + + .. attribute:: mipmap + mipmap texture + + .. method:: refresh(texture) + Refresh texture from source + + .. attribute:: source + source of texture + +.. class:: FilterBGR24() + + Source filter BGR24 objects + +.. class:: FilterBlueScreen() + + Filter for Blue Screen objects + + .. attribute:: color + blue screen color + + .. attribute:: limits + blue screen color limits + + .. attribute:: previous + previous pixel filter + +.. class:: FilterColor() + + Filter for color calculations + + .. attribute:: matrix + matrix [4][5] for color calculation + + .. attribute:: previous + previous pixel filter + +.. class:: FilterGray() + + Filter for gray scale effect + + .. attribute:: previous + previous pixel filter + +.. class:: FilterLevel() + + Filter for levels calculations + + .. attribute:: levels + levels matrix [4] (min, max) + + .. attribute:: previous + previous pixel filter + +.. class:: FilterNormal() + + Filter for Blue Screen objects + + .. attribute:: colorIdx + index of color used to calculate normal (0 - red, 1 - green, 2 - blue) + + .. attribute:: depth + depth of relief + + .. attribute:: previous + previous pixel filter + +.. class:: FilterRGB24() + + Returns a new input filter object to be used with :class:'ImageBuff' object when the image passed + to the ImageBuff.load() function has the 3-bytes pixel format BGR. + +.. class:: FilterRGBA32() + + Source filter RGBA32 objects + +.. function:: getLastError() + Last error that occurred in a bge.texture function. + + :return: the description of the last error occurred in a bge.texture function. + :rtype: string + +.. function:: imageToArray(image,mode) + Returns a :class:`~bgl.buffer` corresponding to the current image stored in a texture source object. + + :arg image: Image source object. + :type image: object of type :class:'VideoFFmpeg', :class:'ImageFFmpeg', :class:'ImageBuff', :class:'ImageMix', :class:'ImageRender', :class:'ImageMirror' or :class:'ImageViewport' + :arg mode: optional argument representing the pixel format. +| You can use the characters R, G, B for the 3 color channels, A for the alpha channel, +| 0 to force a fixed 0 color channel and 1 to force a fixed 255 color channel. +| Example: "BGR" will return 3 bytes per pixel with the Blue, Green and Red channels in that order. +| "RGB1" will return 4 bytes per pixel with the Red, Green, Blue channels in that order and the alpha channel forced to 255. +| The default mode is "RGBA". + + :type mode: string + :rtype: :class:`~bgl.buffer` + :return: A object representing the image as one dimensional array of bytes of size (pixel_size*width*height), + line by line starting from the bottom of the image. The pixel size and format is determined by the mode + parameter. + +.. function materialID(object,name) + Returns a numeric value that can be used in :class:'Texture' to create a dynamic texture. + + The value corresponds to an internal material number that uses the texture identified + by name. name is a string representing a texture name with IM prefix if you want to + identify the texture directly. This method works for basic tex face and for material, + provided the material has a texture channel using that particular texture in first + position of the texture stack. name can also have MA prefix if you want to identify + the texture by material. In that case the material must have a texture channel in first + position. + + If the object has no material that matches name, it generates a runtime error. Use try/except to catch the exception. + + Ex: bge.texture.materialID(obj, 'IMvideo.png') + + :arg object: the game object that uses the texture you want to make dynamic + :type object: game object + :arg name: name of the texture/material you want to make dynamic. + :type name: string + :rtype: integer + +.. function setLogFile(filename) + Sets the name of a text file in which runtime error messages will be written, in addition to the printing + of the messages on the Python console. Only the runtime errors specific to the VideoTexture module + are written in that file, ordinary runtime time errors are not written. + + :arg filename: name of error log file + :type filename: string + :rtype: integer From b9810ffdde07b81f0fa934ca45124413e15fa38b Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 6 Jul 2011 07:15:56 +0000 Subject: [PATCH 41/59] moving bge.texture example to an external file --- doc/python_api/examples/bge.texture.py | 32 ++++++++++++++++++++++++++ doc/python_api/rst/bge.texture.rst | 31 +------------------------ 2 files changed, 33 insertions(+), 30 deletions(-) create mode 100644 doc/python_api/examples/bge.texture.py diff --git a/doc/python_api/examples/bge.texture.py b/doc/python_api/examples/bge.texture.py new file mode 100644 index 00000000000..b27c357b1ee --- /dev/null +++ b/doc/python_api/examples/bge.texture.py @@ -0,0 +1,32 @@ +""" +Basic Video Playback +++++++++++++++++++++++ +Example of how to replace a texture in game with a video. It needs to run everyframe +""" +import bge +from bge import texture +from bge import logic + +cont = logic.getCurrentController() +obj = cont.owner + +# the creation of the texture must be done once: save the +# texture object in an attribute of bge.logic module makes it persistent +if not hasattr(logic, 'video'): + + # identify a static texture by name + matID = texture.materialID(obj, 'IMvideo.png') + + # create a dynamic texture that will replace the static texture + logic.video = texture.Texture(obj, matID) + + # define a source of image for the texture, here a movie + movie = logic.expandPath('//trailer_400p.ogg') + logic.video.source = texture.VideoFFmpeg(movie) + logic.video.source.scale = True + + # quick off the movie, but it wont play in the background + logic.video.source.play() + +# you need to call this function every frame to ensure update of the texture. +logic.video.refresh(True) \ No newline at end of file diff --git a/doc/python_api/rst/bge.texture.rst b/doc/python_api/rst/bge.texture.rst index b1ded95fc89..49016d1e03d 100644 --- a/doc/python_api/rst/bge.texture.rst +++ b/doc/python_api/rst/bge.texture.rst @@ -1,6 +1,7 @@ Game Engine bge.texture Module ============================== + .. note:: This documentation is still very weak, and needs some help! Right now they are mostly a collection of the docstrings found in the bge.texture source code + some random places filled with text. @@ -38,36 +39,6 @@ except that you are now in control of the texture. When the texture object is deleted, the new texture is deleted and the old texture restored. .. module:: bge.texture - -.. code-block:: python - - import bge - from bge import texture - from bge import logic - - cont = logic.getCurrentController() - obj = cont.owner - - # the creation of the texture must be done once: save the - # texture object in an attribute of GameLogic module makes it persistent - if not hasattr(logic, 'video'): - - # identify a static texture by name - matID = texture.materialID(obj, 'IMvideo.png') - - # create a dynamic texture that will replace the static texture - logic.video = texture.Texture(obj, matID) - - # define a source of image for the texture, here a movie - movie = logic.expandPath('//trailer_400p.ogg') - logic.video.source = texture.VideoFFmpeg(movie) - logic.video.source.scale = True - - # quick off the movie, but it wont play in the background - logic.video.source.play() - - # you need to call this function every frame to ensure update of the texture. - logic.video.refresh(True) .. class:: VideoFFmpeg(file [, capture=-1, rate=25.0, width=0, height=0]) From 2691c6a84f213c69d956816bec4a8ec225c394d8 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 6 Jul 2011 07:26:04 +0000 Subject: [PATCH 42/59] new example for bge.texture, a basic texture replacement fresh simple and didactic example straight from my bge book, enjoy it ;) video texture documentation online ... tears dropping. --- doc/python_api/examples/bge.texture.1.py | 38 ++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 doc/python_api/examples/bge.texture.1.py diff --git a/doc/python_api/examples/bge.texture.1.py b/doc/python_api/examples/bge.texture.1.py new file mode 100644 index 00000000000..5b387c8659c --- /dev/null +++ b/doc/python_api/examples/bge.texture.1.py @@ -0,0 +1,38 @@ +""" +Texture replacement +++++++++++++++++++++++ +Example of how to replace a texture in game with an external image. +createTexture() and removeTexture() are to be called from a module Python +Controller. +""" +import bge +from bge import logic +from bge import texture + +def createTexture(cont): + """Create a new Dynamic Texture""" + object = cont.owner + + # get the reference pointer (ID) of the internal texture + ID = VT.materialID(obj, 'IMoriginal.png') + + # create a texture object + object_texture = texture.Texture(object, ID) + + # create a new source with an external image + url = logic.expandPath("//newtexture.jpg") + new_source = texture.ImageFFmpeg(url) + + # the texture has to be stored in a permanent Python object + logic.texture = object_texture + + # update/replace the texture + logic.texture.source = new_source + logic.texture.refresh(False) + +def removeTexture(cont): + """Delete the Dynamic Texture, reversing back the final to its original state.""" + try: + del logic.texture + except: + pass From 4260258bb301c91e4b37ec98297fa69f34ae044f Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 6 Jul 2011 08:29:20 +0000 Subject: [PATCH 43/59] an example for blf - a basic Hello World (for bge, not blender) --- doc/python_api/examples/blf.py | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 doc/python_api/examples/blf.py diff --git a/doc/python_api/examples/blf.py b/doc/python_api/examples/blf.py new file mode 100644 index 00000000000..c91b41bec36 --- /dev/null +++ b/doc/python_api/examples/blf.py @@ -0,0 +1,42 @@ +""" +Hello World Text Example +++++++++++++++++++++++++ +Blender Game Engine example of using the blf module. For this module to work we +need to use the OpenGL wrapper :class:`~bgl` as well. +""" +# import game engine modules +import bge +from bge import render +from bge import logic +# import stand alone modules +import bgl +import blf + +def init(): + """init function - runs once""" + # create a new font object, use external ttf file + font_path = logic.expandPath('//Zeyada.ttf') + # store the font indice - to use later + logic.font_id = blf.load(font_path) + + # set the font drawing routine to run every frame + scene = logic.getCurrentScene() + scene.post_draw=[write] + +def write(): + """write on screen""" + width = render.getWindowWidth() + height = render.getWindowHeight() + + # OpenGL setup + bgl.glMatrixMode(bgl.GL_PROJECTION) + bgl.glLoadIdentity() + bgl.gluOrtho2D(0, width, 0, height) + bgl.glMatrixMode(bgl.GL_MODELVIEW) + bgl.glLoadIdentity() + + # BLF drawing routine + font_id = logic.font_id + blf.position(font_id, (width*0.2), (height*0.3), 0) + blf.size(font_id, 50, 72) + blf.draw(font_id, "Hello World") From febce577ba577f2a3fa888f8f2922ed1898a3ef2 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 6 Jul 2011 09:15:18 +0000 Subject: [PATCH 44/59] Fix #27873: nan pixels in render with degenerate faces. --- source/blender/render/intern/source/shadeinput.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index a1b79346824..eab66aaf2ec 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -771,7 +771,8 @@ void shade_input_set_uv(ShadeInput *shi) t00= v3[axis1]-v1[axis1]; t01= v3[axis2]-v1[axis2]; t10= v3[axis1]-v2[axis1]; t11= v3[axis2]-v2[axis2]; - detsh= 1.0f/(t00*t11-t10*t01); + detsh= (t00*t11-t10*t01); + detsh= (detsh != 0.0f)? 1.0f/detsh: 0.0f; t00*= detsh; t01*=detsh; t10*=detsh; t11*=detsh; @@ -1272,8 +1273,9 @@ void shade_input_set_shade_texco(ShadeInput *shi) s11= ho3[1]/ho3[3] - ho2[1]/ho2[3]; detsh= s00*s11-s10*s01; - s00/= detsh; s01/=detsh; - s10/=detsh; s11/=detsh; + detsh= (detsh != 0.0f)? 1.0f/detsh: 0.0f; + s00*= detsh; s01*=detsh; + s10*=detsh; s11*=detsh; /* recalc u and v again */ hox= x/Zmulx -1.0f; From 5470326c3bc190fd1d2d02c97131818a5438f392 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 6 Jul 2011 09:58:29 +0000 Subject: [PATCH 45/59] Fix #27875: different texture nodes result after decompose/compose. --- source/blender/nodes/intern/TEX_nodes/TEX_texture.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c index d4d77b5fd5a..51c7c0ed341 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c @@ -51,7 +51,11 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor { static float red[] = {1,0,0,1}; static float white[] = {1,1,1,1}; - float *co = p->co; + float co[3], dxt[3], dyt[3]; + + copy_v3_v3(co, p->co); + copy_v3_v3(dxt, p->dxt); + copy_v3_v3(dyt, p->dyt); Tex *nodetex = (Tex *)node->id; @@ -70,9 +74,9 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor tex_input_rgba(col1, in[0], p, thread); tex_input_rgba(col2, in[1], p, thread); - + texres.nor = nor; - textype = multitex_nodes(nodetex, co, p->dxt, p->dyt, p->osatex, + textype = multitex_nodes(nodetex, co, dxt, dyt, p->osatex, &texres, thread, 0, p->shi, p->mtex); if(textype & TEX_RGB) { From 29f2cbdd8f9cd99b30b967af45304a64a317d05d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 6 Jul 2011 10:05:27 +0000 Subject: [PATCH 46/59] Fix #27876: particles instancing a whole group didn't take group offset into account. --- source/blender/blenkernel/intern/anim.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 0747d87a0ab..8aa816f9cb5 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -719,12 +719,13 @@ static void group_duplilist(ListBase *lb, Scene *scene, Object *ob, int level, i /* note, if you check on layer here, render goes wrong... it still deforms verts and uses parent imat */ if(go->ob!=ob) { - /* Group Dupli Offset, should apply after everything else */ - if (group->dupli_ofs[0] || group->dupli_ofs[1] || group->dupli_ofs[2]) { + /* group dupli offset, should apply after everything else */ + if(!is_zero_v3(group->dupli_ofs)) { copy_m4_m4(tmat, go->ob->obmat); sub_v3_v3v3(tmat[3], tmat[3], group->dupli_ofs); mul_m4_m4m4(mat, tmat, ob->obmat); - } else { + } + else { mul_m4_m4m4(mat, go->ob->obmat, ob->obmat); } @@ -1395,7 +1396,17 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p if(part->ren_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) { for(go= part->dup_group->gobject.first, b=0; go; go= go->next, b++) { - mul_m4_m4m4(tmat, oblist[b]->obmat, pamat); + + /* group dupli offset, should apply after everything else */ + if(!is_zero_v3(part->dup_group->dupli_ofs)) { + copy_m4_m4(tmat, oblist[b]->obmat); + sub_v3_v3v3(tmat[3], tmat[3], part->dup_group->dupli_ofs); + mul_m4_m4m4(tmat, tmat, pamat); + } + else { + mul_m4_m4m4(tmat, oblist[b]->obmat, pamat); + } + mul_mat3_m4_fl(tmat, size*scale); if(par_space_mat) mul_m4_m4m4(mat, tmat, par_space_mat); From 11645e7a3f482b24294f360985d60cd9b100f55f Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 6 Jul 2011 10:19:04 +0000 Subject: [PATCH 47/59] Fix #27877: writing .avi files > 4 GB not working on windows. Solution is to replace "long" by "int64_t" and "fseek" by "_fseeki64", because long on 64 bit windows is still 32 bit. --- source/blender/avi/AVI_avi.h | 11 ++++++----- source/blender/avi/CMakeLists.txt | 1 + source/blender/avi/SConscript | 2 +- source/blender/avi/intern/avi.c | 12 +++++++----- source/blender/avi/intern/options.c | 2 ++ source/blender/blenlib/BLI_winstuff.h | 9 +++++++++ source/blender/blenlib/intern/storage.c | 2 +- source/gameengine/Ketsji/KX_PythonInit.cpp | 4 ++-- 8 files changed, 29 insertions(+), 14 deletions(-) diff --git a/source/blender/avi/AVI_avi.h b/source/blender/avi/AVI_avi.h index 85685e2bd4c..1446971a8ac 100644 --- a/source/blender/avi/AVI_avi.h +++ b/source/blender/avi/AVI_avi.h @@ -55,11 +55,12 @@ #ifndef __AVI_H__ #define __AVI_H__ +#include "MEM_sys_types.h" #include /* for FILE */ typedef struct _AviChunk { int fcc; - int size; + int64_t size; } AviChunk; typedef struct _AviList { @@ -185,16 +186,16 @@ typedef struct _AviMovie { #define AVI_MOVIE_READ 0 #define AVI_MOVIE_WRITE 1 - unsigned long size; + int64_t size; AviMainHeader *header; AviStreamRec *streams; AviIndexEntry *entries; int index_entries; - int movi_offset; - int read_offset; - long *offset_table; + int64_t movi_offset; + int64_t read_offset; + int64_t *offset_table; /* Local data goes here */ int interlace; diff --git a/source/blender/avi/CMakeLists.txt b/source/blender/avi/CMakeLists.txt index b62e0cc5afd..bae61fd678b 100644 --- a/source/blender/avi/CMakeLists.txt +++ b/source/blender/avi/CMakeLists.txt @@ -27,6 +27,7 @@ set(INC . ../../../intern/guardedalloc + ../blenlib ) set(INC_SYS diff --git a/source/blender/avi/SConscript b/source/blender/avi/SConscript index 0bf8c3c74db..4d2ce8fd845 100644 --- a/source/blender/avi/SConscript +++ b/source/blender/avi/SConscript @@ -3,7 +3,7 @@ Import ('env') sources = env.Glob('intern/*.c') -incs = '. #/intern/guardedalloc' +incs = '. #/intern/guardedalloc ../blenlib' incs += ' ' + env['BF_JPEG_INC'] env.BlenderLib ('bf_avi', sources, Split(incs), [], libtype=['core','player'], priority = [190,120] ) diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c index 82bf3a3d21b..ff3aafbf065 100644 --- a/source/blender/avi/intern/avi.c +++ b/source/blender/avi/intern/avi.c @@ -42,6 +42,9 @@ #include #include "MEM_guardedalloc.h" +#include "MEM_sys_types.h" + +#include "BLI_winstuff.h" #include "AVI_avi.h" #include "avi_intern.h" @@ -593,7 +596,6 @@ AviError AVI_open_movie (const char *name, AviMovie *movie) { movie->movi_offset = ftell (movie->fp); movie->read_offset = movie->movi_offset; - if (AVI_DEBUG) printf ("movi_offset is %d\n", movie->movi_offset); /* Read in the index if the file has one, otherwise create one */ if (movie->header->Flags & AVIF_HASINDEX) { @@ -707,8 +709,8 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...) { AviList list; AviChunk chunk; int i; - int header_pos1, header_pos2; - int stream_pos1, stream_pos2; + int64_t header_pos1, header_pos2; + int64_t stream_pos1, stream_pos2; movie->type = AVI_MOVIE_WRITE; movie->fp = fopen (name, "wb"); @@ -718,7 +720,7 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...) { if (movie->fp == NULL) return AVI_ERROR_OPEN; - movie->offset_table = (long *) MEM_mallocN ((1+streams*2) * sizeof (long),"offsettable"); + movie->offset_table = (int64_t *) MEM_mallocN ((1+streams*2) * sizeof (int64_t),"offsettable"); for (i=0; i < 1 + streams*2; i++) movie->offset_table[i] = -1L; @@ -897,7 +899,7 @@ AviError AVI_write_frame (AviMovie *movie, int frame_num, ...) { AviIndexEntry *temp; va_list ap; int stream; - long rec_off; + int64_t rec_off; AviFormat format; void *buffer; int size; diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c index edb708d8a69..96c62843436 100644 --- a/source/blender/avi/intern/options.c +++ b/source/blender/avi/intern/options.c @@ -40,6 +40,8 @@ #include "avi_intern.h" #include "endian.h" +#include "BLI_winstuff.h" + /* avi_set_compress_options gets its own file... now don't WE feel important? */ AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data) { diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h index d0eb3c7d67d..e0c819c2dba 100644 --- a/source/blender/blenlib/BLI_winstuff.h +++ b/source/blender/blenlib/BLI_winstuff.h @@ -98,6 +98,15 @@ extern "C" { typedef unsigned int mode_t; #endif +/* use functions that take a 64 bit offset for files larger than 4GB */ +#ifndef FREE_WINDOWS +#include +#define fseek(stream, offset, origin) _fseeki64(stream, offset, origin) +#define ftell(stream) _ftelli64(stream) +#define lseek(fd, offset, origin) _lseeki64(fd, offset, origin) +#define tell(fd) _telli64(fd) +#endif + /* mingw using _SSIZE_T_ to declare ssize_t type */ #ifndef _SSIZE_T_ #define _SSIZE_T_ diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c index e9db148e992..41eedef8835 100644 --- a/source/blender/blenlib/intern/storage.c +++ b/source/blender/blenlib/intern/storage.c @@ -478,7 +478,7 @@ LinkNode *BLI_read_file_as_lines(const char *name) FILE *fp= fopen(name, "r"); LinkNode *lines= NULL; char *buf; - int size; + int64_t size; if (!fp) return NULL; diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index c8a6ae5a6d0..a927de60cd8 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -327,7 +327,7 @@ static PyObject* gPyLoadGlobalDict(PyObject*) { char marshal_path[512]; char *marshal_buffer = NULL; - unsigned int marshal_length; + size_t marshal_length; FILE *fp = NULL; int result; @@ -338,7 +338,7 @@ static PyObject* gPyLoadGlobalDict(PyObject*) if (fp) { // obtain file size: fseek (fp, 0, SEEK_END); - marshal_length = ftell(fp); + marshal_length = (size_t)ftell(fp); rewind(fp); marshal_buffer = (char*)malloc (sizeof(char)*marshal_length); From ed897750cae4d03a3069fde0b94caffa46119066 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 6 Jul 2011 10:58:23 +0000 Subject: [PATCH 48/59] Fix #27880: sequencer separate images operator lost strip properties like blend mode, opacity, etc. --- .../blender/editors/space_sequencer/sequencer_edit.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 4f45b84c08e..b7a7b6b5412 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -1784,19 +1784,21 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op) /* new seq */ se = give_stripelem(seq, cfra); - seq_new= alloc_sequence(ed->seqbasep, start_ofs, seq->machine); + seq_new= seq_dupli_recursive(scene, scene, seq, SEQ_DUPE_UNIQUE_NAME); + BLI_addtail(&ed->seqbase, seq_new); + + seq_new->start= start_ofs; seq_new->type= SEQ_IMAGE; seq_new->len = 1; seq_new->endstill = step-1; /* new strip */ - seq_new->strip= strip_new= MEM_callocN(sizeof(Strip)*1, "strip"); + strip_new= seq_new->strip; strip_new->len= 1; strip_new->us= 1; - strncpy(strip_new->dir, seq->strip->dir, FILE_MAXDIR-1); /* new stripdata */ - strip_new->stripdata= se_new= MEM_callocN(sizeof(StripElem)*1, "stripelem"); + se_new= strip_new->stripdata; BLI_strncpy(se_new->name, se->name, sizeof(se_new->name)); calc_sequence(scene, seq_new); @@ -1808,8 +1810,6 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op) } /* XXX, COPY FCURVES */ - strncpy(seq_new->name+2, seq->name+2, sizeof(seq->name)-2); - seqbase_unique_name_recursive(&scene->ed->seqbase, seq_new); cfra++; start_ofs += step; From 9f25b85168ca98c916276ef77644599138633c79 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Wed, 6 Jul 2011 11:44:27 +0000 Subject: [PATCH 49/59] Making Blender compile for C90 standard, var declared after code :) Also cleaned a line of code that was horribly spread over 4 lines. --- source/blender/nodes/intern/TEX_nodes/TEX_texture.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c index 51c7c0ed341..f0bc2bd4a7c 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c @@ -49,6 +49,7 @@ static bNodeSocketType outputs[]= { static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread) { + Tex *nodetex = (Tex *)node->id; static float red[] = {1,0,0,1}; static float white[] = {1,1,1,1}; float co[3], dxt[3], dyt[3]; @@ -57,14 +58,9 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor copy_v3_v3(dxt, p->dxt); copy_v3_v3(dyt, p->dyt); - Tex *nodetex = (Tex *)node->id; - if(node->custom2 || node->need_exec==0) { /* this node refers to its own texture tree! */ - QUATCOPY( - out, - (fabs(co[0] - co[1]) < .01) ? white : red - ); + QUATCOPY(out, (fabs(co[0] - co[1]) < .01) ? white : red ; } else if(nodetex) { TexResult texres; From 03b81a5c803a37f6f5306fe2b468d5d8b4891236 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Wed, 6 Jul 2011 12:22:36 +0000 Subject: [PATCH 50/59] Ergh! first compile and test then commit! --- source/blender/nodes/intern/TEX_nodes/TEX_texture.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c index f0bc2bd4a7c..c58595866af 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c @@ -60,7 +60,7 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor if(node->custom2 || node->need_exec==0) { /* this node refers to its own texture tree! */ - QUATCOPY(out, (fabs(co[0] - co[1]) < .01) ? white : red ; + QUATCOPY(out, (fabs(co[0] - co[1]) < .01) ? white : red ); } else if(nodetex) { TexResult texres; From cf71712bba2129680ecfe1fdf029f6526bf24a1d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 6 Jul 2011 12:33:33 +0000 Subject: [PATCH 51/59] Fix #27883: object actions did not get duplicated on full scene copy. --- source/blender/editors/object/object_relations.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index f3b67867d7f..285b08c521b 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -1660,6 +1660,7 @@ void ED_object_single_users(Main *bmain, Scene *scene, int full) if(full) { single_obdata_users(bmain, scene, 0); + single_object_action_users(scene, 0); single_mat_users_expand(bmain); single_tex_users_expand(bmain); } From e1b060486f0a315cc60c60be07783ab89056229d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 6 Jul 2011 13:15:22 +0000 Subject: [PATCH 52/59] Fix #27879: sequencer didn't draw overlapping strips well, selected were drawn under unselected, and active strips red border color for active strips was not clear enough. --- .../blender/editors/space_sequencer/sequencer_draw.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 119c5da309e..594d2942e8f 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -643,10 +643,12 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, Sequence *seq, int outline if (G.moving && (seq->flag & SELECT)) { if(seq->flag & SEQ_OVERLAP) { col[0]= 255; col[1]= col[2]= 40; - } else UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 120); + } + else + UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 120+outline_tint); } - - UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, outline_tint); + else + UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, outline_tint); glColor3ubv((GLubyte *)col); @@ -969,7 +971,7 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar) /* loop through strips, checking for those that are visible */ for (seq= ed->seqbasep->first; seq; seq= seq->next) { /* boundbox and selection tests for NOT drawing the strip... */ - if ((seq->flag & SELECT) == sel) continue; + if ((seq->flag & SELECT) != sel) continue; else if (seq == last_seq) continue; else if (MIN2(seq->startdisp, seq->start) > v2d->cur.xmax) continue; else if (MAX2(seq->enddisp, seq->start+seq->len) < v2d->cur.xmin) continue; From a83c3c0b1422713d8553965988c3096955eaa452 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 6 Jul 2011 16:08:24 +0000 Subject: [PATCH 53/59] The material index did not work when FSAA was turned on. The information was written in the temp exr files, but was not read back. After checking I saw that the pass was not merged back in the rendercore. After adding this it worked. tested with all FSAA settings. --- source/blender/render/intern/source/rendercore.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 2fa6bed5aae..3aca334cffe 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -627,6 +627,12 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult *fp= (float)shi->obr->ob->index; } break; + case SCE_PASS_INDEXMA: + if(shi->vlr) { + fp= rpass->rect + offset; + *fp= (float)shi->mat->index; + } + break; case SCE_PASS_MIST: fp= rpass->rect + offset; *fp= shr->mist; From 5b4bffba5234e3601b355adfa62bd57ff110903d Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Wed, 6 Jul 2011 21:37:31 +0000 Subject: [PATCH 54/59] [#27854] Collada import doesn't handle UVW mapping Reported by David Roy Patch by Brecht van Lommel UV import code wasn't taking possible stride into account (always assuming stride==2), thus reading UV coords totally wrong. --- source/blender/collada/MeshImporter.cpp | 63 ++++++++++--------------- source/blender/collada/MeshImporter.h | 2 +- 2 files changed, 25 insertions(+), 40 deletions(-) diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp index d1977d15fb2..760fb2359a4 100644 --- a/source/blender/collada/MeshImporter.cpp +++ b/source/blender/collada/MeshImporter.cpp @@ -144,15 +144,18 @@ void WVDataWrapper::print() } #endif -void UVDataWrapper::getUV(int uv_index[2], float *uv) +void UVDataWrapper::getUV(int uv_index, float *uv) { + int stride = mVData->getStride(0); + if(stride==0) stride = 2; + switch(mVData->getType()) { case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT: { COLLADAFW::ArrayPrimitiveType* values = mVData->getFloatValues(); if (values->empty()) return; - uv[0] = (*values)[uv_index[0]]; - uv[1] = (*values)[uv_index[1]]; + uv[0] = (*values)[uv_index*stride]; + uv[1] = (*values)[uv_index*stride + 1]; } break; @@ -160,8 +163,8 @@ void UVDataWrapper::getUV(int uv_index[2], float *uv) { COLLADAFW::ArrayPrimitiveType* values = mVData->getDoubleValues(); if (values->empty()) return; - uv[0] = (float)(*values)[uv_index[0]]; - uv[1] = (float)(*values)[uv_index[1]]; + uv[0] = (float)(*values)[uv_index*stride]; + uv[1] = (float)(*values)[uv_index*stride + 1]; } break; @@ -197,54 +200,36 @@ void MeshImporter::rotate_face_indices(MFace *mface) { void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs, COLLADAFW::IndexList& index_list, unsigned int *tris_indices) { - int uv_indices[4][2]; - // per face vertex indices, this means for quad we have 4 indices, not 8 COLLADAFW::UIntValuesArray& indices = index_list.getIndices(); - // make indices into FloatOrDoubleArray - for (int i = 0; i < 3; i++) { - int uv_index = indices[tris_indices[i]]; - uv_indices[i][0] = uv_index * 2; - uv_indices[i][1] = uv_index * 2 + 1; - } - - uvs.getUV(uv_indices[0], mtface->uv[0]); - uvs.getUV(uv_indices[1], mtface->uv[1]); - uvs.getUV(uv_indices[2], mtface->uv[2]); + uvs.getUV(indices[tris_indices[0]], mtface->uv[0]); + uvs.getUV(indices[tris_indices[1]], mtface->uv[1]); + uvs.getUV(indices[tris_indices[2]], mtface->uv[2]); } void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs, COLLADAFW::IndexList& index_list, int index, bool quad) { - int uv_indices[4][2]; - // per face vertex indices, this means for quad we have 4 indices, not 8 COLLADAFW::UIntValuesArray& indices = index_list.getIndices(); - // make indices into FloatOrDoubleArray - for (int i = 0; i < (quad ? 4 : 3); i++) { - int uv_index = indices[index + i]; - uv_indices[i][0] = uv_index * 2; - uv_indices[i][1] = uv_index * 2 + 1; - } + uvs.getUV(indices[index + 0], mtface->uv[0]); + uvs.getUV(indices[index + 1], mtface->uv[1]); + uvs.getUV(indices[index + 2], mtface->uv[2]); - uvs.getUV(uv_indices[0], mtface->uv[0]); - uvs.getUV(uv_indices[1], mtface->uv[1]); - uvs.getUV(uv_indices[2], mtface->uv[2]); - - if (quad) uvs.getUV(uv_indices[3], mtface->uv[3]); + if (quad) uvs.getUV(indices[index + 3], mtface->uv[3]); #ifdef COLLADA_DEBUG /*if (quad) { fprintf(stderr, "face uv:\n" - "((%d, %d), (%d, %d), (%d, %d), (%d, %d))\n" + "((%d, %d, %d, %d))\n" "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n", - uv_indices[0][0], uv_indices[0][1], - uv_indices[1][0], uv_indices[1][1], - uv_indices[2][0], uv_indices[2][1], - uv_indices[3][0], uv_indices[3][1], + indices[index + 0], + indices[index + 1], + indices[index + 2], + indices[index + 3], mtface->uv[0][0], mtface->uv[0][1], mtface->uv[1][0], mtface->uv[1][1], @@ -253,12 +238,12 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs, } else { fprintf(stderr, "face uv:\n" - "((%d, %d), (%d, %d), (%d, %d))\n" + "((%d, %d, %d))\n" "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n", - uv_indices[0][0], uv_indices[0][1], - uv_indices[1][0], uv_indices[1][1], - uv_indices[2][0], uv_indices[2][1], + indices[index + 0], + indices[index + 1], + indices[index + 2], mtface->uv[0][0], mtface->uv[0][1], mtface->uv[1][0], mtface->uv[1][1], diff --git a/source/blender/collada/MeshImporter.h b/source/blender/collada/MeshImporter.h index 20fdb0dcc6e..88ee0e46c33 100644 --- a/source/blender/collada/MeshImporter.h +++ b/source/blender/collada/MeshImporter.h @@ -69,7 +69,7 @@ public: void print(); #endif - void getUV(int uv_index[2], float *uv); + void getUV(int uv_index, float *uv); }; class MeshImporter : public MeshImporterBase From ccc56a65707bfac7140450ec339fc8d232a06e82 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Thu, 7 Jul 2011 09:56:06 +0000 Subject: [PATCH 55/59] Tiny tweak: hierarchy lines in outliner were nearly invisible. Color is blend between backdrop and text color (black), made it blend 0.4 instead of 0.2 --- source/blender/editors/space_outliner/outliner.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index a1a6995d1bd..93dc96cf9c0 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -4906,7 +4906,7 @@ static void outliner_draw_tree(bContext *C, uiBlock *block, Scene *scene, ARegio outliner_draw_selection(ar, soops, &soops->tree, &starty); // grey hierarchy lines - UI_ThemeColorBlend(TH_BACK, TH_TEXT, 0.2f); + UI_ThemeColorBlend(TH_BACK, TH_TEXT, 0.4f); starty= (int)ar->v2d.tot.ymax-UI_UNIT_Y/2-OL_Y_OFFSET; startx= 6; outliner_draw_hierarchy(soops, &soops->tree, startx, &starty); From 4e7417e9fd1c083ede40389537dc642ec6513025 Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Thu, 7 Jul 2011 10:37:46 +0000 Subject: [PATCH 56/59] The Blenderplayer wasn't freeing GPU_Textures since according to BLI_threads, GPU_free_image() was never being called from the main thread. Calling BLI_threadapi_init() when the Blenderplayer starts sets the current thread as the main thread and solves the problem. --- source/gameengine/GamePlayer/ghost/GPG_ghost.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp index 14048c70516..cbbeb9419d1 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp @@ -64,6 +64,7 @@ extern "C" #include "BKE_node.h" #include "BKE_report.h" #include "BKE_library.h" +#include "BLI_threads.h" #include "BLI_blenlib.h" #include "DNA_scene_types.h" #include "DNA_userdef_types.h" @@ -399,7 +400,11 @@ int main(int argc, char** argv) ::DisposeNibReference(nibRef); */ #endif // __APPLE__ - + + // We don't use threads directly in the BGE, but we need to call this so things like + // freeing up GPU_Textures works correctly. + BLI_threadapi_init(); + RNA_init(); init_nodesystem(); From 4d7449b3363d8154d7cddd7324f8b3355c4cb849 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 7 Jul 2011 11:01:36 +0000 Subject: [PATCH 57/59] Fix part of #26811: absolute shape keys should not show influence value in list. --- source/blender/editors/interface/interface_templates.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 32a20e82d2f..25dbb68a258 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -33,6 +33,7 @@ #include "MEM_guardedalloc.h" +#include "DNA_key_types.h" #include "DNA_scene_types.h" #include "DNA_userdef_types.h" @@ -2104,6 +2105,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe } else if(itemptr->type == &RNA_ShapeKey) { Object *ob= (Object*)activeptr->data; + Key *key= (Key*)itemptr->data; split= uiLayoutSplit(sub, 0.75f, 0); @@ -2111,7 +2113,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe uiBlockSetEmboss(block, UI_EMBOSSN); row= uiLayoutRow(split, 1); - if(i == 0) uiItemL(row, "", ICON_NONE); + if(i == 0 || (key->type != KEY_RELATIVE)) uiItemL(row, "", ICON_NONE); else uiItemR(row, itemptr, "value", 0, "", ICON_NONE); if(ob->mode == OB_MODE_EDIT && !((ob->shapeflag & OB_SHAPE_EDIT_MODE) && ob->type == OB_MESH)) From 5e6abb8004ad8750bc99f092b79b2bc6922c27eb Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Thu, 7 Jul 2011 13:57:20 +0000 Subject: [PATCH 58/59] Fix compile with scons, after thread commit in r38185 --- source/gameengine/GamePlayer/ghost/SConscript | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/gameengine/GamePlayer/ghost/SConscript b/source/gameengine/GamePlayer/ghost/SConscript index e3ffc1a406b..de063f5e297 100644 --- a/source/gameengine/GamePlayer/ghost/SConscript +++ b/source/gameengine/GamePlayer/ghost/SConscript @@ -40,6 +40,8 @@ incs = ['.', '#source/blender/gpu', '#extern/glew/include'] +incs.append(env['BF_PTHREADS_INC']) + defs = [ 'GLEW_STATIC' ] if env['WITH_BF_PYTHON']: From 99736f373c12e7ab91f962c738243bddf2d713c6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Jul 2011 16:09:57 +0000 Subject: [PATCH 59/59] Allow pose matrix to be set for Benjy Cook's GSOC project. this uses the same function as pose mode snapping. --- source/blender/makesrna/intern/rna_pose.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c index 949415fbf29..47c8435cc46 100644 --- a/source/blender/makesrna/intern/rna_pose.c +++ b/source/blender/makesrna/intern/rna_pose.c @@ -585,6 +585,25 @@ static void rna_PoseChannel_matrix_basis_set(PointerRNA *ptr, const float *value pchan_apply_mat4(pchan, (float (*)[4])values, FALSE); /* no compat for predictable result */ } +static void rna_PoseChannel_matrix_set(PointerRNA *ptr, const float *values) +{ + bPoseChannel *pchan= (bPoseChannel*)ptr->data; + Object *ob= (Object*)ptr->id.data; + float umat[4][4]= MAT4_UNITY; + float tmat[4][4]; + + /* recalculate pose matrix with only parent transformations, + * bone loc/sca/rot is ignored, scene and frame are not used. */ + where_is_pose_bone(NULL, ob, pchan, 0.0f, FALSE); + + /* find the matrix, need to remove the bone transforms first so this is + * calculated as a matrix to set rather then a difference ontop of whats + * already there. */ + pchan_apply_mat4(pchan, umat, FALSE); + armature_mat_pose_to_bone(pchan, (float (*)[4])values, tmat); + pchan_apply_mat4(pchan, tmat, FALSE); /* no compat for predictable result */ +} + #else static void rna_def_bone_group(BlenderRNA *brna) @@ -830,8 +849,9 @@ static void rna_def_pose_channel(BlenderRNA *brna) prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX); RNA_def_property_float_sdna(prop, NULL, "pose_mat"); RNA_def_property_multi_array(prop, 2, matrix_dimsize); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_float_funcs(prop, NULL, "rna_PoseChannel_matrix_set", NULL); RNA_def_property_ui_text(prop, "Pose Matrix", "Final 4x4 matrix after constraints and drivers are applied (object space)"); + RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update"); /* Head/Tail Coordinates (in Pose Space) - Automatically calculated... */ prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);