From f261a22263414520d7a6ad6e0d674f828b0c0373 Mon Sep 17 00:00:00 2001 From: Matt Ebb Date: Sun, 17 Apr 2011 22:11:23 +0000 Subject: [PATCH 01/88] Committing patch [#26960] bu MiikaH, fixes bug: [#26945] Hue Correct doesn't Hue But Rather Saturate thanks! --- source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c index ce5092e2859..edf6c454285 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c @@ -53,7 +53,7 @@ static void do_huecorrect(bNode *node, float *out, float *in) /* adjust hue, scaling returned default 0.5 up to 1 */ f = curvemapping_evaluateF(node->storage, 0, hsv[0]); - hsv[0] *= (f * 2.f); + hsv[0] += f-0.5f; /* adjust saturation, scaling returned default 0.5 up to 1 */ f = curvemapping_evaluateF(node->storage, 1, hsv[0]); @@ -63,7 +63,7 @@ static void do_huecorrect(bNode *node, float *out, float *in) f = curvemapping_evaluateF(node->storage, 2, hsv[0]); hsv[2] *= (f * 2.f); - CLAMP(hsv[0], 0.f, 1.f); + hsv[0] = hsv[0] - floor(hsv[0]); /* mod 1.0 */ CLAMP(hsv[1], 0.f, 1.f); /* convert back to rgb */ @@ -81,7 +81,7 @@ static void do_huecorrect_fac(bNode *node, float *out, float *in, float *fac) /* adjust hue, scaling returned default 0.5 up to 1 */ f = curvemapping_evaluateF(node->storage, 0, hsv[0]); - hsv[0] *= (f * 2.f); + hsv[0] += f-0.5f; /* adjust saturation, scaling returned default 0.5 up to 1 */ f = curvemapping_evaluateF(node->storage, 1, hsv[0]); @@ -91,7 +91,7 @@ static void do_huecorrect_fac(bNode *node, float *out, float *in, float *fac) f = curvemapping_evaluateF(node->storage, 2, hsv[0]); hsv[2] *= (f * 2.f); - CLAMP(hsv[0], 0.f, 1.f); + hsv[0] = hsv[0] - floor(hsv[0]); /* mod 1.0 */ CLAMP(hsv[1], 0.f, 1.f); /* convert back to rgb */ From 8b2a3c250a7faf59c7f8549960737ef40f4ff29c Mon Sep 17 00:00:00 2001 From: Matt Ebb Date: Sun, 17 Apr 2011 22:47:23 +0000 Subject: [PATCH 02/88] Fix [#26896] Displace Node crashes Blender when connected to Z-Buffer Clamped the maximum displacement distance to 4 x the input image dimensions - prevents hanging when vary large values are mistakenly plugged in, such as Z buffers, --- .../blender/nodes/intern/CMP_nodes/CMP_displace.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c index d52a47993d2..9139edf8560 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c @@ -53,7 +53,7 @@ static bNodeSocketType cmp_node_displace_out[]= { * in order to take effect */ #define DISPLACE_EPSILON 0.01 -static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *UNUSED(veccol), CompBuf *xbuf, CompBuf *ybuf, float *xscale, float *yscale) +static void do_displace(bNode *node, CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *UNUSED(veccol), CompBuf *xbuf, CompBuf *ybuf, float *xscale, float *yscale) { ImBuf *ibuf; int x, y; @@ -83,6 +83,10 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float else ys = yscale[0]; + /* clamp x and y displacement to triple image resolution - + * to prevent hangs from huge values mistakenly plugged in eg. z buffers */ + CLAMP(xs, -stackbuf->x*4, stackbuf->x*4); + CLAMP(ys, -stackbuf->y*4, stackbuf->y*4); p_dx = vec[0] * xs; p_dy = vec[1] * ys; @@ -114,7 +118,11 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float ibuf_sample(ibuf, u, v, dxt, dyt, col); qd_setPixel(stackbuf, x, y, col); + + if(node->exec & NODE_BREAK) break; } + + if(node->exec & NODE_BREAK) break; } IMB_freeImBuf(ibuf); @@ -145,7 +153,7 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float } -static void node_composit_exec_displace(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out) +static void node_composit_exec_displace(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) { if(out[0]->hasoutput==0) return; @@ -164,7 +172,7 @@ static void node_composit_exec_displace(void *UNUSED(data), bNode *UNUSED(node), stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - do_displace(stackbuf, cbuf, vecbuf, in[1]->vec, xbuf, ybuf, in[2]->vec, in[3]->vec); + do_displace(node, stackbuf, cbuf, vecbuf, in[1]->vec, xbuf, ybuf, in[2]->vec, in[3]->vec); out[0]->data= stackbuf; From d95e572227418c3119a7dc91a605dcc2c10c5237 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 18 Apr 2011 01:40:45 +0000 Subject: [PATCH 03/88] fix [#26995] Crash on bpy.context.object.collision use object.collision rather then object.modifiers[...].settings --- source/blender/makesrna/intern/rna_object_force.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c index 9aedcab1301..13fac68bf9f 100644 --- a/source/blender/makesrna/intern/rna_object_force.c +++ b/source/blender/makesrna/intern/rna_object_force.c @@ -322,10 +322,21 @@ static void rna_PointCache_frame_step_range(PointerRNA *ptr, int *min, int *max) static char *rna_CollisionSettings_path(PointerRNA *ptr) { + /* both methods work ok, but return the shorter path */ +#if 0 Object *ob= (Object*)ptr->id.data; ModifierData *md = (ModifierData *)modifiers_findByType(ob, eModifierType_Collision); - - return BLI_sprintfN("modifiers[\"%s\"].settings", md->name); + + if(md) { + return BLI_sprintfN("modifiers[\"%s\"].settings", md->name); + } + else { + return BLI_strdup(""); + } +#else + /* more reliable */ + return BLI_strdup("collision"); +#endif } static int rna_SoftBodySettings_use_edges_get(PointerRNA *ptr) From 66bf6487dfc624c1423053cd570bbe720ae20cf2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 18 Apr 2011 01:45:28 +0000 Subject: [PATCH 04/88] object.collision was allocating on access for all object types - camera could get collision data for eg. now check for mesh types only. any other type will return None. --- source/blender/makesrna/intern/rna_object.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index babc413e274..a30b5d4eb05 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -1059,6 +1059,9 @@ static PointerRNA rna_Object_collision_get(PointerRNA *ptr) { Object *ob= (Object*)ptr->id.data; + if(ob->type != OB_MESH) + return PointerRNA_NULL; + /* weak */ if(!ob->pd) ob->pd= object_add_collision_fields(0); From ea5baccbf8bfe737d6f5d4bd17faa2ff7ab9e8bd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 18 Apr 2011 03:27:15 +0000 Subject: [PATCH 05/88] fix for own mistake in recent commit: [#27000] Spotlight spot shape size, lamp object data - numerical entries are interpreted as radians though displayed in degrees in SVN 36199 now apply units after python evaluation for unit buttons. --- source/blender/editors/interface/interface.c | 73 +++++++++++++------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 5b59baf9ea2..29e8bf756f3 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -1541,6 +1541,52 @@ void ui_get_but_string(uiBut *but, char *str, int maxlen) } } +#ifdef WITH_PYTHON + +static int ui_set_but_string_eval_num_unit(bContext *C, uiBut *but, const char *str, double *value) +{ + char str_unit_convert[256]; + const int unit_type= uiButGetUnitType(but); + Scene *scene= CTX_data_scene((bContext *)but->block->evil_C); + + BLI_strncpy(str_unit_convert, str, sizeof(str_unit_convert)); + + /* ugly, use the draw string to get the value, this could cause problems if it includes some text which resolves to a unit */ + bUnit_ReplaceString(str_unit_convert, sizeof(str_unit_convert), but->drawstr, ui_get_but_scale_unit(but, 1.0), scene->unit.system, unit_type>>16); + + return (BPY_button_exec(C, str_unit_convert, value, TRUE) != -1); +} + +static int ui_set_but_string_eval_num(bContext *C, uiBut *but, const char *str, double *value) +{ + int ok= FALSE; + + if(str[0] != '\0') { + int is_unit_but= ui_is_but_unit(but); + /* only enable verbose if we won't run again with units */ + if(BPY_button_exec(C, str, value, is_unit_but==FALSE) != -1) { + /* if the value parsed ok without unit conversion this button may still need a unit multiplier */ + if(is_unit_but) { + char str_new[128]; + + BLI_snprintf(str_new, sizeof(str_new), "%f", *value); + ok= ui_set_but_string_eval_num_unit(C, but, str_new, value); + } + else { + ok= TRUE; /* parse normal string via py (no unit conversion needed) */ + } + } + else if(is_unit_but) { + /* parse failed, this is a unit but so run replacements and parse again */ + ok= ui_set_but_string_eval_num_unit(C, but, str, value); + } + } + + return ok; +} + +#endif // WITH_PYTHON + int ui_set_but_string(bContext *C, uiBut *but, const char *str) { if(but->rnaprop && ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) { @@ -1601,32 +1647,7 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str) double value; #ifdef WITH_PYTHON - int ok= FALSE; - - if(str[0] != '\0') { - int is_unit_but= ui_is_but_unit(but); - /* only enable verbose if we won't run again with units */ - if(BPY_button_exec(C, str, &value, is_unit_but==FALSE) != -1) { - ok= TRUE; /* parse normal string via py (no unit conversion needed) */ - } - else if(is_unit_but) { - /* parse failed, this is a unit but so run replacements and parse again */ - char str_unit_convert[256]; - const int unit_type= uiButGetUnitType(but); - Scene *scene= CTX_data_scene((bContext *)but->block->evil_C); - - BLI_strncpy(str_unit_convert, str, sizeof(str_unit_convert)); - - /* ugly, use the draw string to get the value, this could cause problems if it includes some text which resolves to a unit */ - bUnit_ReplaceString(str_unit_convert, sizeof(str_unit_convert), but->drawstr, ui_get_but_scale_unit(but, 1.0), scene->unit.system, unit_type>>16); - - if(BPY_button_exec(C, str_unit_convert, &value, TRUE) != -1) { - ok= TRUE; - } - } - } - - if(ok == FALSE) { + if(ui_set_but_string_eval_num(C, but, str, &value) == FALSE) { return 0; } #else From 75e1104d92002a79a5363d27f151c45574f93ecc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 18 Apr 2011 07:11:40 +0000 Subject: [PATCH 06/88] cmake - allow building blenderplayer with redcode. - when ffmpeg is enabled remove strict compiler errors for imbuf and blenkernel since its hard to avoid these warnings across ffmpeg versions. --- source/blender/blenkernel/CMakeLists.txt | 5 +++++ source/blender/imbuf/CMakeLists.txt | 5 +++++ source/blenderplayer/CMakeLists.txt | 3 ++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index aaa596862c5..47d393559f4 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -24,6 +24,11 @@ # # ***** END GPL LICENSE BLOCK ***** +if(WITH_CODEC_FFMPEG) + # FFMPEG gives warnigns which are hard to avoid across multiple versions. + remove_strict_flags() +endif() + set(INC . ../avi diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt index c2c9c89ad10..6404ae3de75 100644 --- a/source/blender/imbuf/CMakeLists.txt +++ b/source/blender/imbuf/CMakeLists.txt @@ -24,6 +24,11 @@ # # ***** END GPL LICENSE BLOCK ***** +if(WITH_CODEC_FFMPEG) + # FFMPEG gives warnigns which are hard to avoid across multiple versions. + remove_strict_flags() +endif() + set(INC . ../avi diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt index 5b7a08be2fd..1f796e86693 100644 --- a/source/blenderplayer/CMakeLists.txt +++ b/source/blenderplayer/CMakeLists.txt @@ -113,7 +113,8 @@ endif() bf_blenlib bf_imbuf_cineon bf_imbuf_openexr - extern_openjpeg + extern_openjpeg + extern_redcode bf_imbuf_dds bf_readblenfile bf_dna From 0814cdf54ec9a0440c82d0d7ec81b8dc9ecc93ea Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 18 Apr 2011 08:27:50 +0000 Subject: [PATCH 07/88] fix [#26951] blenderplayer and runtimes will not load blenderplayer wasn't finding bundled python, eg: ./2.57/python/lib --- source/blender/python/generic/py_capi_utils.c | 44 +++++++++++++++++ source/blender/python/generic/py_capi_utils.h | 2 + source/blender/python/intern/bpy_interface.c | 49 +------------------ source/gameengine/Ketsji/KX_PythonInit.cpp | 4 ++ 4 files changed, 52 insertions(+), 47 deletions(-) diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index 7182d5f75d0..de9bfb4013b 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -30,6 +30,8 @@ #include "py_capi_utils.h" +#include "BKE_font.h" /* only for utf8towchar, should replace with py funcs but too late in release now */ + #define PYC_INTERPRETER_ACTIVE (((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) != NULL) /* for debugging */ @@ -284,6 +286,48 @@ void PyC_MainModule_Restore(PyObject *main_mod) Py_XDECREF(main_mod); } +/* must be called before Py_Initialize, expects output of BLI_get_folder(BLENDER_PYTHON, NULL) */ +void PyC_SetHomePath(const char *py_path_bundle) +{ + if(py_path_bundle==NULL) { + /* Common enough to have bundled *nix python but complain on OSX/Win */ +#if defined(__APPLE__) || defined(_WIN32) + fprintf(stderr, "Warning! bundled python not found and is expected on this platform. (if you built with CMake: 'install' target may have not been built)\n"); +#endif + return; + } + /* set the environment path */ + printf("found bundled python: %s\n", py_path_bundle); + +#ifdef __APPLE__ + /* OSX allow file/directory names to contain : character (represented as / in the Finder) + but current Python lib (release 3.1.1) doesn't handle these correctly */ + if(strchr(py_path_bundle, ':')) + printf("Warning : Blender application is located in a path containing : or / chars\ + \nThis may make python import function fail\n"); +#endif + +#ifdef _WIN32 + /* cmake/MSVC debug build crashes without this, why only + in this case is unknown.. */ + { + BLI_setenv("PYTHONPATH", py_path_bundle); + } +#endif + + { + static wchar_t py_path_bundle_wchar[1024]; + + /* cant use this, on linux gives bug: #23018, TODO: try LANG="en_US.UTF-8" /usr/bin/blender, suggested 22008 */ + /* mbstowcs(py_path_bundle_wchar, py_path_bundle, FILE_MAXDIR); */ + + utf8towchar(py_path_bundle_wchar, py_path_bundle); + + Py_SetPythonHome(py_path_bundle_wchar); + // printf("found python (wchar_t) '%ls'\n", py_path_bundle_wchar); + } +} + /* Would be nice if python had this built in */ void PyC_RunQuicky(const char *filepath, int n, ...) { diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h index 0b821759bec..1730ad71721 100644 --- a/source/blender/python/generic/py_capi_utils.h +++ b/source/blender/python/generic/py_capi_utils.h @@ -48,4 +48,6 @@ void PyC_RunQuicky(const char *filepath, int n, ...); void PyC_MainModule_Backup(PyObject **main_mod); void PyC_MainModule_Restore(PyObject *main_mod); +void PyC_SetHomePath(const char *py_path_bundle); + #endif // PY_CAPI_UTILS_H diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 555b42eb6fb..0afbe9a7003 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -164,52 +164,6 @@ void BPY_modules_update(bContext *C) bpy_context_module->ptr.data= (void *)C; } -/* must be called before Py_Initialize */ -#ifndef WITH_PYTHON_MODULE -static void bpy_python_start_path(void) -{ - char *py_path_bundle= BLI_get_folder(BLENDER_PYTHON, NULL); - - if(py_path_bundle==NULL) { - /* Common enough to have bundled *nix python but complain on OSX/Win */ -#if defined(__APPLE__) || defined(_WIN32) - fprintf(stderr, "Warning! bundled python not found and is expected on this platform. (if you built with CMake: 'install' target may have not been built)\n"); -#endif - return; - } - /* set the environment path */ - printf("found bundled python: %s\n", py_path_bundle); - -#ifdef __APPLE__ - /* OSX allow file/directory names to contain : character (represented as / in the Finder) - but current Python lib (release 3.1.1) doesn't handle these correctly */ - if(strchr(py_path_bundle, ':')) - printf("Warning : Blender application is located in a path containing : or / chars\ - \nThis may make python import function fail\n"); -#endif - -#ifdef _WIN32 - /* cmake/MSVC debug build crashes without this, why only - in this case is unknown.. */ - { - BLI_setenv("PYTHONPATH", py_path_bundle); - } -#endif - - { - static wchar_t py_path_bundle_wchar[FILE_MAX]; - - /* cant use this, on linux gives bug: #23018, TODO: try LANG="en_US.UTF-8" /usr/bin/blender, suggested 22008 */ - /* mbstowcs(py_path_bundle_wchar, py_path_bundle, FILE_MAXDIR); */ - - utf8towchar(py_path_bundle_wchar, py_path_bundle); - - Py_SetPythonHome(py_path_bundle_wchar); - // printf("found python (wchar_t) '%ls'\n", py_path_bundle_wchar); - } -} -#endif - void BPY_context_set(bContext *C) { BPy_SetContext(C); @@ -242,7 +196,8 @@ void BPY_python_start(int argc, const char **argv) /* must run before python initializes */ PyImport_ExtendInittab(bpy_internal_modules); - bpy_python_start_path(); /* allow to use our own included python */ + /* allow to use our own included python */ + PyC_SetHomePath(BLI_get_folder(BLENDER_PYTHON, NULL)); /* Python 3.2 now looks for '2.57/python/include/python3.2d/pyconfig.h' to parse * from the 'sysconfig' module which is used by 'site', so for now disable site. diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index ba698d79fdd..a3738995db3 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -1758,6 +1758,7 @@ static struct _inittab bge_internal_modules[]= { /** * Python is not initialised. + * see bpy_interface.c's BPY_python_start() which shares the same functionality in blender. */ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecurityLevel level, Main *maggie, int argc, char** argv) { @@ -1779,6 +1780,9 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur /* must run before python initializes */ PyImport_ExtendInittab(bge_internal_modules); + /* find local python installation */ + PyC_SetHomePath(BLI_get_folder(BLENDER_PYTHON, NULL)); + Py_Initialize(); if(argv && first_time) { /* browser plugins dont currently set this */ From fae253a428e37c1e2c2c8ad30fdf01914cec4dda Mon Sep 17 00:00:00 2001 From: Joerg Mueller Date: Mon, 18 Apr 2011 10:04:28 +0000 Subject: [PATCH 08/88] Fix for [#26949] problems opening 2.49 files with audio (relative path problems?) When I wrote that code main.name wasn't set correctly and I had to use G.main.name; now it seems to be the other way round :-) --- source/blender/blenloader/intern/readfile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 7ad157f89e8..4ff65aeb213 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -9974,7 +9974,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) { char str[FILE_MAX]; BLI_join_dirfile(str, sizeof(str), seq->strip->dir, seq->strip->stripdata->name); - BLI_path_abs(str, G.main->name); + BLI_path_abs(str, main->name); seq->sound = sound_new_file(main, str); } /* don't know, if anybody used that From 9dda11e0f1c0393145c4738f4e8d1050cceb6c3a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 18 Apr 2011 10:18:35 +0000 Subject: [PATCH 09/88] correction for windows. --- source/blender/python/generic/py_capi_utils.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index de9bfb4013b..ec774f44075 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -32,6 +32,10 @@ #include "BKE_font.h" /* only for utf8towchar, should replace with py funcs but too late in release now */ +#ifdef _WIN32 /* BLI_setenv */ +#include "BLI_path_util.h" +#endif + #define PYC_INTERPRETER_ACTIVE (((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) != NULL) /* for debugging */ From c84e26cb9144406fbcc4063567c21f2de0ab2227 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 18 Apr 2011 10:40:06 +0000 Subject: [PATCH 10/88] fix for part of this report [#27006] Apply Scale at a B-Bone Skeleton causes rescale of B-Bones and offset of attached objects bbones now get scaled too, but the attached objects still get offset. --- source/blender/editors/armature/editarmature.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 4e77cebf27d..76a6cd8c998 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -504,6 +504,10 @@ void ED_armature_apply_transform(Object *ob, float mat[4][4]) ebone->rad_head *= scale; ebone->rad_tail *= scale; ebone->dist *= scale; + + /* we could be smarter and scale by the matrix along the x & z axis */ + ebone->xwidth *= scale; + ebone->zwidth *= scale; } /* Turn the list into an armature */ From 54f31672701fae259dc28477e6b5ae323641c395 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Mon, 18 Apr 2011 11:22:01 +0000 Subject: [PATCH 11/88] Bugfix #26901 Compositing, lens distortion node: it delivered RGBA out with alpha zero, making it not draw previews, violates both premul or straight alpha usage. Now it just sets alpha to 1 for entire output. Cleaned code readability a bit as well. --- .../nodes/intern/CMP_nodes/CMP_lensdist.c | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c b/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c index 37c28514679..3a005210c6a 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c @@ -44,29 +44,36 @@ static bNodeSocketType cmp_node_lensdist_out[]= { { -1, 0, "" } }; - -static void lensDistort(CompBuf* dst, CompBuf* src, float kr, float kg, float kb, int jit, int proj, int fit) +/* assumes *dst is type RGBA */ +static void lensDistort(CompBuf *dst, CompBuf *src, float kr, float kg, float kb, int jit, int proj, int fit) { int x, y, z; const float cx = 0.5f*(float)dst->x, cy = 0.5f*(float)dst->y; if (proj) { // shift - CompBuf* tsrc = dupalloc_compbuf(src); + CompBuf *tsrc = dupalloc_compbuf(src); + for (z=0; ztype; ++z) IIR_gauss(tsrc, (kr+0.5f)*(kr+0.5f), z, 1); kr *= 20.f; + for (y=0; yy; y++) { - fRGB* colp = (fRGB*)&dst->rect[y*dst->x*dst->type]; + fRGB *colp = (fRGB*)&dst->rect[y*dst->x*dst->type]; const float v = (y + 0.5f)/(float)dst->y; + for (x=0; xx; x++) { const float u = (x + 0.5f)/(float)dst->x; + qd_getPixelLerpChan(tsrc, (u*dst->x + kr) - 0.5f, v*dst->y - 0.5f, 0, colp[x]); if (tsrc->type == CB_VAL) colp[x][1] = tsrc->rect[x + y*tsrc->x]; else colp[x][1] = tsrc->rect[(x + y*tsrc->x)*tsrc->type + 1]; qd_getPixelLerpChan(tsrc, (u*dst->x - kr) - 0.5f, v*dst->y - 0.5f, 2, colp[x]+2); + + /* set alpha */ + colp[x][3]= 1.0f; } } free_compbuf(tsrc); @@ -80,17 +87,20 @@ static void lensDistort(CompBuf* dst, CompBuf* src, float kr, float kg, float kb const float mk = MAX3(kr, kg, kb); const float sc = (fit && (mk > 0.f)) ? (1.f/(1.f + 2.f*mk)) : (1.f/(1.f + mk)); const float drg = 4.f*(kg - kr), dgb = 4.f*(kb - kg); + kr *= 4.f, kg *= 4.f, kb *= 4.f; for (y=0; yy; y++) { - fRGB* colp = (fRGB*)&dst->rect[y*dst->x*dst->type]; + fRGB *colp = (fRGB*)&dst->rect[y*dst->x*dst->type]; const float v = sc*((y + 0.5f) - cy)/cy; + for (x=0; xx; x++) { int dr = 0, dg = 0, db = 0; float d, t, ln[6] = {0, 0, 0, 0, 0, 0}; fRGB c1, tc = {0, 0, 0, 0}; const float u = sc*((x + 0.5f) - cx)/cx; int sta = 0, mid = 0, end = 0; + if ((t = 1.f - kr*(u*u + v*v)) >= 0.f) { d = 1.f/(1.f + sqrtf(t)); ln[0] = (u*d + 0.5f)*dst->x - 0.5f, ln[1] = (v*d + 0.5f)*dst->y - 0.5f; @@ -113,6 +123,7 @@ static void lensDistort(CompBuf* dst, CompBuf* src, float kr, float kg, float kb const float dsf = sqrtf(dx*dx + dy*dy) + 1.f; const int ds = (int)(jit ? ((dsf < 4.f) ? 2.f : sqrtf(dsf)) : dsf); const float sd = 1.f/(float)ds; + for (z=0; zdata; - NodeLensDist* nld = node->storage; + NodeLensDist *nld = node->storage; const float k = MAX2(MIN2(in[1]->vec[0], 1.f), -0.999f); // smaller dispersion range for somewhat more control const float d = 0.25f*MAX2(MIN2(in[2]->vec[0], 1.f), 0.f); From 5f08bfd46c31bb67780ee4081428be0d22f703ae Mon Sep 17 00:00:00 2001 From: Joerg Mueller Date: Mon, 18 Apr 2011 14:24:36 +0000 Subject: [PATCH 12/88] Fix for [#26990] Loading file w packed audio crashes FFMPEG was reallocating buffers it didn't own and wasn't allowed to. This workaround should work now flawlessly. Also fixing a bug regarding unpacking sounds, the UI stated unpacking to //audio/filename while it was unpacking to //sounds/filename --- intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp | 50 +++++++++++++++++--- intern/audaspace/ffmpeg/AUD_FFMPEGReader.h | 15 +++++- source/blender/editors/sound/sound_ops.c | 2 +- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp index 0dc525b0e5a..ea6e0c549fa 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp @@ -172,7 +172,8 @@ static const char* fileopen_error = "AUD_FFMPEGReader: File couldn't be " AUD_FFMPEGReader::AUD_FFMPEGReader(std::string filename) : m_pkgbuf(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1), - m_byteiocontext(NULL) + m_byteiocontext(NULL), + m_membuf(NULL) { // open file if(av_open_input_file(&m_formatCtx, filename.c_str(), NULL, 0, NULL)!=0) @@ -194,12 +195,15 @@ static const char* streamopen_error = "AUD_FFMPEGReader: Stream couldn't be " AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference buffer) : m_pkgbuf(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1), - m_membuffer(buffer) + m_membuffer(buffer), + m_membufferpos(0) { - m_byteiocontext = (ByteIOContext*)av_mallocz(sizeof(ByteIOContext)); + m_membuf = reinterpret_cast(av_malloc(FF_MIN_BUFFER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE)); - if(init_put_byte(m_byteiocontext, (data_t*)buffer.get()->getBuffer(), - buffer.get()->getSize(), 0, NULL, NULL, NULL, NULL) != 0) + m_byteiocontext = av_alloc_put_byte(m_membuf, FF_MIN_BUFFER_SIZE, 0, this, + read_packet, NULL, seek_packet); + + if(!m_byteiocontext) { av_free(m_byteiocontext); AUD_THROW(AUD_ERROR_FILE, fileopen_error); @@ -207,7 +211,7 @@ AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference buffer) : AVProbeData probe_data; probe_data.filename = ""; - probe_data.buf = (data_t*)buffer.get()->getBuffer(); + probe_data.buf = reinterpret_cast(buffer.get()->getBuffer()); probe_data.buf_size = buffer.get()->getSize(); AVInputFormat* fmt = av_probe_input_format(&probe_data, 1); @@ -243,6 +247,40 @@ AUD_FFMPEGReader::~AUD_FFMPEGReader() av_close_input_file(m_formatCtx); } +int AUD_FFMPEGReader::read_packet(void* opaque, uint8_t* buf, int buf_size) +{ + AUD_FFMPEGReader* reader = reinterpret_cast(opaque); + + int size = AUD_MIN(buf_size, reader->m_membuffer.get()->getSize() - reader->m_membufferpos); + + if(size < 0) + return -1; + + memcpy(buf, ((data_t*)reader->m_membuffer.get()->getBuffer()) + reader->m_membufferpos, size); + reader->m_membufferpos += size; + + return size; +} + +int64_t AUD_FFMPEGReader::seek_packet(void* opaque, int64_t offset, int whence) +{ + AUD_FFMPEGReader* reader = reinterpret_cast(opaque); + + switch(whence) + { + case SEEK_SET: + reader->m_membufferpos = 0; + break; + case SEEK_END: + reader->m_membufferpos = reader->m_membuffer.get()->getSize(); + break; + case AVSEEK_SIZE: + return reader->m_membuffer.get()->getSize(); + } + + return (reader->m_membufferpos += offset); +} + bool AUD_FFMPEGReader::isSeekable() const { return true; diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h index 4d8c5e4c462..26e66859451 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h @@ -106,10 +106,20 @@ private: AUD_convert_f m_convert; /** - * The memory file to read from, only saved to keep the buffer alive. + * The memory file to read from. */ AUD_Reference m_membuffer; + /** + * The buffer to read with. + */ + data_t* m_membuf; + + /** + * Reading position of the buffer. + */ + int64_t m_membufferpos; + /** * Decodes a packet into the given buffer. * \param packet The AVPacket to decode. @@ -149,6 +159,9 @@ public: */ virtual ~AUD_FFMPEGReader(); + static int read_packet(void* opaque, uint8_t* buf, int buf_size); + static int64_t seek_packet(void* opaque, int64_t offset, int whence); + virtual bool isSeekable() const; virtual void seek(int position); virtual int getLength() const; diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index a07f4ff0f5f..74dbb8f6d12 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -254,7 +254,7 @@ static int sound_unpack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(even if(G.fileflags & G_AUTOPACK) BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save."); - unpack_menu(C, "SOUND_OT_unpack", sound->id.name+2, sound->name, "audio", sound->packedfile); + unpack_menu(C, "SOUND_OT_unpack", sound->id.name+2, sound->name, "sounds", sound->packedfile); return OPERATOR_FINISHED; } From 6bdb5e75cea1b57c0f1426ca49641d2e1e2ffefe Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 18 Apr 2011 15:20:19 +0000 Subject: [PATCH 13/88] fix [#27015] RNA Bug: Unpacking sounds with a long ID name fails: sound ID length wrong?! also fix for OBJECT_OT_proxy_make and RENDER_OT_render using incorrect lengths for ID names. --- source/blender/editors/object/object_relations.c | 2 +- source/blender/editors/render/render_internal.c | 2 +- source/blender/editors/sound/sound_ops.c | 2 +- source/blender/editors/space_image/image_ops.c | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 1aa6de18bad..42f858d37a6 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -402,7 +402,7 @@ void OBJECT_OT_proxy_make (wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_string(ot->srna, "object", "", 19, "Proxy Object", "Name of lib-linked/grouped object to make a proxy for."); + RNA_def_string(ot->srna, "object", "", sizeof(((ID *)NULL)->name)-2, "Proxy Object", "Name of lib-linked/grouped object to make a proxy for."); prop= RNA_def_enum(ot->srna, "type", DummyRNA_DEFAULT_items, 0, "Type", "Group object"); /* XXX, relies on hard coded ID at the moment */ RNA_def_enum_funcs(prop, proxy_group_object_itemf); ot->prop= prop; diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 857a36c3029..ddab9fae96f 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -823,7 +823,7 @@ void RENDER_OT_render(wmOperatorType *ot) RNA_def_boolean(ot->srna, "animation", 0, "Animation", "Render files from the animation range of this scene"); RNA_def_boolean(ot->srna, "write_still", 0, "Write Image", "Save rendered the image to the output path (used only when animation is disabled)"); RNA_def_string(ot->srna, "layer", "", RE_MAXNAME, "Render Layer", "Single render layer to re-render"); - RNA_def_string(ot->srna, "scene", "", 19, "Scene", "Re-render single layer in this scene"); + RNA_def_string(ot->srna, "scene", "", sizeof(((ID *)NULL)->name)-2, "Scene", "Re-render single layer in this scene"); } /* ****************************** opengl render *************************** */ diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index 74dbb8f6d12..7a5495208bf 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -276,7 +276,7 @@ static void SOUND_OT_unpack(wmOperatorType *ot) /* properties */ RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack."); - RNA_def_string(ot->srna, "id", "", 21, "Sound Name", "Sound datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */ + RNA_def_string(ot->srna, "id", "", sizeof(((ID *)NULL)->name)-2, "Sound Name", "Sound datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */ } /* ******************************************************* */ diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 41939969fa4..a092895c39e 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1352,7 +1352,7 @@ void IMAGE_OT_new(wmOperatorType *ot) ot->flag= OPTYPE_UNDO; /* properties */ - RNA_def_string(ot->srna, "name", "untitled", 21, "Name", "Image datablock name."); + RNA_def_string(ot->srna, "name", "untitled", sizeof(((ID *)NULL)->name)-2, "Name", "Image datablock name."); RNA_def_int(ot->srna, "width", 1024, 1, INT_MAX, "Width", "Image width.", 1, 16384); RNA_def_int(ot->srna, "height", 1024, 1, INT_MAX, "Height", "Image height.", 1, 16384); prop= RNA_def_float_color(ot->srna, "color", 4, NULL, 0.0f, FLT_MAX, "Color", "Default fill color.", 0.0f, 1.0f); @@ -1604,7 +1604,7 @@ void IMAGE_OT_unpack(wmOperatorType *ot) /* properties */ RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack."); - RNA_def_string(ot->srna, "id", "", 21, "Image Name", "Image datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */ + RNA_def_string(ot->srna, "id", "", sizeof(((ID *)NULL)->name)-2, "Image Name", "Image datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */ } /******************** sample image operator ********************/ From ba229e38597cec9a784742be44d4cc827def3850 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 19 Apr 2011 04:19:09 +0000 Subject: [PATCH 14/88] fix [#27011] executing a script crashes Blender --- .../editors/transform/transform_generics.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index a527472e50d..cf169dd587e 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -964,7 +964,22 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) t->options |= CTX_EDGE; } - t->spacetype = sa ? sa->spacetype : SPACE_EMPTY; /* background mode */ + + /* Assign the space type, some exceptions for running in different mode */ + if(sa == NULL) { + /* background mode */ + t->spacetype= SPACE_EMPTY; + } + else if ((ar == NULL) && (sa->spacetype == SPACE_VIEW3D)) { + /* running in the text editor */ + t->spacetype= SPACE_EMPTY; + } + else { + /* normal operation */ + t->spacetype= sa->spacetype; + } + + if(t->spacetype == SPACE_VIEW3D) { View3D *v3d = sa->spacedata.first; From 1d536da57e34a7e611747b12d6a43e5392c29580 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 19 Apr 2011 05:34:05 +0000 Subject: [PATCH 15/88] fix [#27016] Add new vertex at wrong position ( bpy.ops.mesh.dupli_extrude_cursor() ) also found curve click-extrude was always aligning the new points depth to (0,0,0), now work the same as mesh edit - align to the selected point or the cursor if none are seleted. --- source/blender/editors/curve/editcurve.c | 53 ++++++++++++------- source/blender/editors/mesh/editmesh_add.c | 14 ++--- .../editors/space_view3d/view3d_snap.c | 8 +-- 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 4ef5f80dcf6..d8748c7ad76 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -4413,11 +4413,10 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) Nurb *nu, *newnu= NULL; BezTriple *bezt, *newbezt = NULL; BPoint *bp, *newbp = NULL; - float mat[3][3],imat[3][3], temp[3]; + float imat[4][4], temp[3]; int ok= 0; - copy_m3_m4(mat, obedit->obmat); - invert_m3_m3(imat,mat); + invert_m4_m4(imat, obedit->obmat); findselectedNurbvert(&editnurb->nurbs, &nu, &bezt, &bp); @@ -4451,10 +4450,14 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) temp[0] = 1; temp[1] = 0; temp[2] = 0; + copy_v3_v3(newbezt->vec[1], location); - sub_v3_v3(newbezt->vec[1], obedit->obmat[3]); - sub_v3_v3v3(newbezt->vec[0], newbezt->vec[1],temp); - add_v3_v3v3(newbezt->vec[2], newbezt->vec[1],temp); + sub_v3_v3v3(newbezt->vec[0], newbezt->vec[1], temp); + add_v3_v3v3(newbezt->vec[2], newbezt->vec[1], temp); + + mul_m4_v3(imat, newbezt->vec[0]); + mul_m4_v3(imat, newbezt->vec[1]); + mul_m4_v3(imat, newbezt->vec[2]); ok= 1; nu= newnu; @@ -4473,9 +4476,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) newnu->orderu= 2; newnu->pntsu= 1; - copy_v3_v3(newbp->vec, location); - sub_v3_v3(newbp->vec, obedit->obmat[3]); - mul_m3_v3(imat,newbp->vec); + mul_v3_m4v3(newbp->vec, imat, location); newbp->vec[3]= 1.0; newnu->knotsu= newnu->knotsv= NULL; @@ -4555,9 +4556,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) copy_v3_v3(newbezt->vec[2], bezt->vec[2]); } else { - copy_v3_v3(newbezt->vec[1], location); - sub_v3_v3(newbezt->vec[1], obedit->obmat[3]); - mul_m3_v3(imat,newbezt->vec[1]); + mul_v3_m4v3(newbezt->vec[1], imat, location); sub_v3_v3v3(temp, newbezt->vec[1],temp); add_v3_v3v3(newbezt->vec[0], bezt->vec[0],temp); add_v3_v3v3(newbezt->vec[2], bezt->vec[2],temp); @@ -4622,9 +4621,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) copy_v3_v3(newbp->vec, bp->vec); } else { - copy_v3_v3(newbp->vec, location); - sub_v3_v3(newbp->vec, obedit->obmat[3]); - mul_m3_v3(imat,newbp->vec); + mul_v3_m4v3(newbp->vec, imat, location); newbp->vec[3]= 1.0; if(!newnu && nu->orderu<4 && nu->orderu<=nu->pntsu) @@ -4666,13 +4663,33 @@ static int add_vertex_exec(bContext *C, wmOperator *op) static int add_vertex_invoke(bContext *C, wmOperator *op, wmEvent *event) { RegionView3D *rv3d= CTX_wm_region_view3d(C); - ViewContext vc; - float location[3] = {0.0f, 0.0f, 0.0f}; - short mval[2]; if(rv3d && !RNA_property_is_set(op->ptr, "location")) { + Curve *cu; + ViewContext vc; + float location[3]; + short mval[2]; + + Nurb *nu; + BezTriple *bezt; + BPoint *bp; + view3d_set_viewcontext(C, &vc); + cu= vc.obedit->data; + + findselectedNurbvert(&cu->editnurb->nurbs, &nu, &bezt, &bp); + + if(bezt) { + mul_v3_m4v3(location, vc.obedit->obmat, bezt->vec[1]); + } + else if (bp) { + mul_v3_m4v3(location, vc.obedit->obmat, bp->vec); + } + else { + copy_v3_v3(location, give_cursor(vc.scene, vc.v3d)); + } + mval[0]= event->x - vc.ar->winrct.xmin; mval[1]= event->y - vc.ar->winrct.ymin; diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index ec84d7f830f..2609a745398 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -139,7 +139,7 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event) /* call extrude? */ if(done) { - short rot_src= RNA_boolean_get(op->ptr, "rotate_source"); + const short rot_src= RNA_boolean_get(op->ptr, "rotate_source"); EditEdge *eed; float vec[3], cent[3], mat[3][3]; float nor[3]= {0.0, 0.0, 0.0}; @@ -246,20 +246,16 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event) } else if(vc.em->selectmode & SCE_SELECT_VERTEX) { - float mat[3][3],imat[3][3]; - float *curs= give_cursor(vc.scene, vc.v3d); + float imat[4][4]; + const float *curs= give_cursor(vc.scene, vc.v3d); copy_v3_v3(min, curs); view3d_get_view_aligned_coordinate(&vc, min, event->mval); eve= addvertlist(vc.em, 0, NULL); - copy_m3_m4(mat, vc.obedit->obmat); - invert_m3_m3(imat, mat); - - copy_v3_v3(eve->co, min); - mul_m3_v3(imat, eve->co); - sub_v3_v3v3(eve->co, eve->co, vc.obedit->obmat[3]); + invert_m4_m4(imat, vc.obedit->obmat); + mul_v3_m4v3(eve->co, imat, min); eve->f= SELECT; } diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index f007b46dd95..a3d42aa5579 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -788,9 +788,7 @@ static int snap_curs_to_sel(bContext *C, wmOperator *UNUSED(op)) VECCOPY(curs, centroid); } else { - curs[0]= (min[0]+max[0])/2; - curs[1]= (min[1]+max[1])/2; - curs[2]= (min[2]+max[2])/2; + mid_v3_v3v3(curs, min, max); } MEM_freeN(transvmain); transvmain= NULL; @@ -828,9 +826,7 @@ static int snap_curs_to_sel(bContext *C, wmOperator *UNUSED(op)) VECCOPY(curs, centroid); } else { - curs[0]= (min[0]+max[0])/2; - curs[1]= (min[1]+max[1])/2; - curs[2]= (min[2]+max[2])/2; + mid_v3_v3v3(curs, min, max); } } } From 217d1aa4613bb604b2da6364971965044592d35f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 19 Apr 2011 06:15:13 +0000 Subject: [PATCH 16/88] fix [#26900] Problem with active camera between scenes --- source/blender/render/intern/source/pipeline.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 866d17200e1..3e5b0b5a37b 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -2170,7 +2170,9 @@ static void render_scene(Render *re, Scene *sce, int cfra) int winx= re->winx, winy= re->winy; sce->r.cfra= cfra; - + + scene_camera_switch_update(sce); + /* exception: scene uses own size (unfinished code) */ if(0) { winx= (sce->r.size*sce->r.xsch)/100; From 6a91cf9adb750810d942104cf6ce5fef5a7bf999 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 19 Apr 2011 06:37:29 +0000 Subject: [PATCH 17/88] noticed a problem with rendering non-active scenes in the node editor. - the frame from the current scene wasn't used - whereas with rendering it is, set the current frame as is done when node rendering. - camera switching also failed, added a call to it. --- source/blender/editors/render/render_internal.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index ddab9fae96f..71c88ae9e8f 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -54,6 +54,7 @@ #include "BKE_report.h" #include "BKE_sequencer.h" #include "BKE_screen.h" +#include "BKE_scene.h" #include "WM_api.h" #include "WM_types.h" @@ -744,6 +745,10 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) rl = (SceneRenderLayer *)BLI_findstring(&scene->r.layers, rl_name, offsetof(SceneRenderLayer, name)); if (scn && rl) { + /* camera switch wont have updated */ + scn->r.cfra= scene->r.cfra; + scene_camera_switch_update(scn); + scene = scn; srl = rl; } From 5b920bc2ff1e78767842b13f6997298b7e438204 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 19 Apr 2011 06:59:49 +0000 Subject: [PATCH 18/88] Some strings to store ID names were too small, could cause stack corruption. corrected these and replaced 'sizeof(((ID *)NULL)->name)-2' with 'MAX_ID_NAME-2'. --- source/blender/blenkernel/intern/library.c | 2 +- source/blender/editors/interface/interface.c | 2 +- source/blender/editors/interface/interface_utils.c | 2 +- source/blender/editors/object/object_relations.c | 2 +- source/blender/editors/render/render_internal.c | 4 ++-- source/blender/editors/screen/screen_edit.c | 2 +- source/blender/editors/sound/sound_ops.c | 4 ++-- source/blender/editors/space_image/image_ops.c | 8 ++++---- source/blender/editors/space_node/drawnode.c | 2 +- source/blender/editors/space_outliner/outliner.c | 2 +- source/blender/makesrna/intern/rna_ID.c | 2 +- source/blender/makesrna/intern/rna_curve.c | 2 +- source/blender/python/generic/bpy_internal_import.c | 4 ++-- 13 files changed, 19 insertions(+), 19 deletions(-) diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index b2e0bb20f55..e2d64a78c18 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -1157,7 +1157,7 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name) int new_id(ListBase *lb, ID *id, const char *tname) { int result; - char name[22]; + char name[MAX_ID_NAME-2]; /* if library, don't rename */ if(id->lib) return 0; diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 29e8bf756f3..1495d2b00ba 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -1390,7 +1390,7 @@ int ui_get_but_string_max_length(uiBut *but) if(ELEM(but->type, TEX, SEARCH_MENU)) return but->hardmax; else if(but->type == IDPOIN) - return sizeof(((ID*)NULL)->name)-2; + return MAX_ID_NAME-2; else return UI_MAX_DRAW_STR; } diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index f22c8eb4bfe..1ec125c2f26 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -52,7 +52,7 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind { uiBut *but=NULL; const char *propname= RNA_property_identifier(prop); - char prop_item[sizeof(((IDProperty *)NULL)->name)+4]; /* size of the ID prop name + room for [""] */ + char prop_item[MAX_IDPROP_NAME+4]; /* size of the ID prop name + room for [""] */ int arraylen= RNA_property_array_length(ptr, prop); /* support for custom props */ diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 42f858d37a6..086d458f3e0 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -402,7 +402,7 @@ void OBJECT_OT_proxy_make (wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_string(ot->srna, "object", "", sizeof(((ID *)NULL)->name)-2, "Proxy Object", "Name of lib-linked/grouped object to make a proxy for."); + RNA_def_string(ot->srna, "object", "", MAX_ID_NAME-2, "Proxy Object", "Name of lib-linked/grouped object to make a proxy for."); prop= RNA_def_enum(ot->srna, "type", DummyRNA_DEFAULT_items, 0, "Type", "Group object"); /* XXX, relies on hard coded ID at the moment */ RNA_def_enum_funcs(prop, proxy_group_object_itemf); ot->prop= prop; diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 71c88ae9e8f..ce434413a5f 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -736,7 +736,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) if(RNA_property_is_set(op->ptr, "layer")) { SceneRenderLayer *rl; Scene *scn; - char scene_name[19], rl_name[RE_MAXNAME]; + char scene_name[MAX_ID_NAME-2], rl_name[RE_MAXNAME]; RNA_string_get(op->ptr, "layer", rl_name); RNA_string_get(op->ptr, "scene", scene_name); @@ -828,7 +828,7 @@ void RENDER_OT_render(wmOperatorType *ot) RNA_def_boolean(ot->srna, "animation", 0, "Animation", "Render files from the animation range of this scene"); RNA_def_boolean(ot->srna, "write_still", 0, "Write Image", "Save rendered the image to the output path (used only when animation is disabled)"); RNA_def_string(ot->srna, "layer", "", RE_MAXNAME, "Render Layer", "Single render layer to re-render"); - RNA_def_string(ot->srna, "scene", "", sizeof(((ID *)NULL)->name)-2, "Scene", "Re-render single layer in this scene"); + RNA_def_string(ot->srna, "scene", "", MAX_ID_NAME-2, "Scene", "Re-render single layer in this scene"); } /* ****************************** opengl render *************************** */ diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 39da86b1962..a0a2ede11ef 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1627,7 +1627,7 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa) } else { ScrArea *newa; - char newname[20]; + char newname[MAX_ID_NAME-2]; oldscreen= win->screen; diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index 7a5495208bf..3716baad474 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -219,7 +219,7 @@ static int sound_unpack_exec(bContext *C, wmOperator *op) /* find the suppplied image by name */ if (RNA_property_is_set(op->ptr, "id")) { - char sndname[22]; + char sndname[MAX_ID_NAME-2]; RNA_string_get(op->ptr, "id", sndname); sound = BLI_findstring(&CTX_data_main(C)->sound, sndname, offsetof(ID, name) + 2); } @@ -276,7 +276,7 @@ static void SOUND_OT_unpack(wmOperatorType *ot) /* properties */ RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack."); - RNA_def_string(ot->srna, "id", "", sizeof(((ID *)NULL)->name)-2, "Sound Name", "Sound datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */ + RNA_def_string(ot->srna, "id", "", MAX_ID_NAME-2, "Sound Name", "Sound datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */ } /* ******************************************************* */ diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index a092895c39e..9cea8d4f220 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1279,7 +1279,7 @@ static int image_new_exec(bContext *C, wmOperator *op) Image *ima; PointerRNA ptr, idptr; PropertyRNA *prop; - char name[22]; + char name[MAX_ID_NAME-2]; float color[4]; int width, height, floatbuf, uvtestgrid, alpha; @@ -1352,7 +1352,7 @@ void IMAGE_OT_new(wmOperatorType *ot) ot->flag= OPTYPE_UNDO; /* properties */ - RNA_def_string(ot->srna, "name", "untitled", sizeof(((ID *)NULL)->name)-2, "Name", "Image datablock name."); + RNA_def_string(ot->srna, "name", "untitled", MAX_ID_NAME-2, "Name", "Image datablock name."); RNA_def_int(ot->srna, "width", 1024, 1, INT_MAX, "Width", "Image width.", 1, 16384); RNA_def_int(ot->srna, "height", 1024, 1, INT_MAX, "Height", "Image height.", 1, 16384); prop= RNA_def_float_color(ot->srna, "color", 4, NULL, 0.0f, FLT_MAX, "Color", "Default fill color.", 0.0f, 1.0f); @@ -1538,7 +1538,7 @@ static int image_unpack_exec(bContext *C, wmOperator *op) /* find the suppplied image by name */ if (RNA_property_is_set(op->ptr, "id")) { - char imaname[22]; + char imaname[MAX_ID_NAME-2]; RNA_string_get(op->ptr, "id", imaname); ima = BLI_findstring(&CTX_data_main(C)->image, imaname, offsetof(ID, name) + 2); if (!ima) ima = CTX_data_edit_image(C); @@ -1604,7 +1604,7 @@ void IMAGE_OT_unpack(wmOperatorType *ot) /* properties */ RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack."); - RNA_def_string(ot->srna, "id", "", sizeof(((ID *)NULL)->name)-2, "Image Name", "Image datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */ + RNA_def_string(ot->srna, "id", "", MAX_ID_NAME-2, "Image Name", "Image datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */ } /******************** sample image operator ********************/ diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index ff135fbe464..ba15e47ba04 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -518,7 +518,7 @@ static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, Point PointerRNA scn_ptr; PropertyRNA *prop; const char *layer_name; - char scene_name[19]; + char scene_name[MAX_ID_NAME-2]; uiTemplateID(layout, C, ptr, "scene", NULL, NULL, NULL); diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 765cd360f96..ed26440d37d 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -5665,7 +5665,7 @@ static void outliner_buttons(const bContext *C, uiBlock *block, ARegion *ar, Spa if(tselem->type==TSE_EBONE) len = sizeof(((EditBone*) 0)->name); else if (tselem->type==TSE_MODIFIER) len = sizeof(((ModifierData*) 0)->name); else if(tselem->id && GS(tselem->id->name)==ID_LI) len = sizeof(((Library*) 0)->name); - else len= sizeof(((ID*) 0)->name)-2; + else len= MAX_ID_NAME-2; dx= (int)UI_GetStringWidth(te->name); diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index ae62ef55c01..bde7c99c7df 100644 --- a/source/blender/makesrna/intern/rna_ID.c +++ b/source/blender/makesrna/intern/rna_ID.c @@ -443,7 +443,7 @@ static void rna_def_ID(BlenderRNA *brna) prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Name", "Unique datablock ID name"); RNA_def_property_string_funcs(prop, "rna_ID_name_get", "rna_ID_name_length", "rna_ID_name_set"); - RNA_def_property_string_maxlength(prop, sizeof(((ID*)NULL)->name)-2); + RNA_def_property_string_maxlength(prop, MAX_ID_NAME-2); RNA_def_property_editable_func(prop, "rna_ID_name_editable"); RNA_def_property_update(prop, NC_ID|NA_RENAME, NULL); RNA_def_struct_name_property(srna, prop); diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index ec0f9277653..ec640531fa0 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -947,7 +947,7 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna) /* strings */ prop= RNA_def_property(srna, "family", PROP_STRING, PROP_NONE); - RNA_def_property_string_maxlength(prop, (sizeof((ID *)NULL)->name)-2); + RNA_def_property_string_maxlength(prop, MAX_ID_NAME-2); RNA_def_property_ui_text(prop, "Object Font", "Use Blender Objects as font characters. Give font objects a common name followed by the character it represents, eg. familya, familyb etc, and turn on Verts Duplication"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c index 0ea4e083e3e..f2514af20b4 100644 --- a/source/blender/python/generic/bpy_internal_import.c +++ b/source/blender/python/generic/bpy_internal_import.c @@ -132,7 +132,7 @@ PyObject *bpy_text_import(Text *text) PyObject *bpy_text_import_name(char *name, int *found) { Text *text; - char txtname[22]; /* 21+NULL */ + char txtname[MAX_ID_NAME-2]; int namelen= strlen(name); //XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main; Main *maggie= bpy_import_main; @@ -144,7 +144,7 @@ PyObject *bpy_text_import_name(char *name, int *found) return NULL; } - if (namelen>21-3) return NULL; /* we know this cant be importable, the name is too long for blender! */ + if (namelen >= (MAX_ID_NAME-2) - 3) return NULL; /* we know this cant be importable, the name is too long for blender! */ memcpy(txtname, name, namelen); memcpy(&txtname[namelen], ".py", 4); From a8185f4cc8a162e2bdb4c9da211af65f2821ec2b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 19 Apr 2011 10:35:24 +0000 Subject: [PATCH 19/88] patch [#26978] Minor Spelling Mistakes in Editor Operators + some errors I noticed. --- source/blender/blenkernel/intern/unit.c | 2 +- source/blender/editors/armature/poseobject.c | 2 +- source/blender/editors/curve/editcurve.c | 2 +- source/blender/editors/mesh/editmesh_mods.c | 6 +++--- source/blender/editors/mesh/editmesh_tools.c | 2 +- source/blender/editors/space_action/action_edit.c | 2 +- source/blender/editors/space_logic/logic_ops.c | 2 +- source/blender/editors/space_nla/nla_edit.c | 6 +++--- source/blender/editors/space_outliner/outliner.c | 2 +- source/blender/editors/space_view3d/view3d_edit.c | 2 +- source/blender/editors/uvedit/uvedit_ops.c | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c index 37e604fa0cb..b89e576a562 100644 --- a/source/blender/blenkernel/intern/unit.c +++ b/source/blender/blenkernel/intern/unit.c @@ -95,7 +95,7 @@ typedef struct bUnitDef { /* define a single unit */ typedef struct bUnitCollection { struct bUnitDef *units; - int base_unit; /* basic unit index (when user desn't specify unit explicitly) */ + int base_unit; /* basic unit index (when user doesn't specify unit explicitly) */ int flag; /* options for this system */ int length; /* to quickly find the last item */ } bUnitCollection; diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c index e9892c62a68..719362d82c5 100644 --- a/source/blender/editors/armature/poseobject.c +++ b/source/blender/editors/armature/poseobject.c @@ -1509,7 +1509,7 @@ static int pose_group_deselect_exec (bContext *C, wmOperator *UNUSED(op)) void POSE_OT_group_deselect (wmOperatorType *ot) { /* identifiers */ - ot->name= "Deselecte Bone Group"; + ot->name= "Deselect Bone Group"; ot->idname= "POSE_OT_group_deselect"; ot->description= "Deselect bones of active Bone Group"; diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index d8748c7ad76..a273630ff91 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -3581,7 +3581,7 @@ void CURVE_OT_spline_type_set(wmOperatorType *ot) /* identifiers */ ot->name= "Set Spline Type"; - ot->description = "Set type of actibe spline"; + ot->description = "Set type of active spline"; ot->idname= "CURVE_OT_spline_type_set"; /* api callbacks */ diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index a5042f1d6d8..050832cf8f6 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -2452,7 +2452,7 @@ static int select_linked_limited_invoke(ViewContext *vc, short all, short sel) if (!change) return OPERATOR_CANCELLED; - if (!sel) /* make sure de-selecting faces didnt de-select the verts/edges connected to selected faces, this is common with boundries */ + if (!sel) /* make sure de-selecting faces didnt de-select the verts/edges connected to selected faces, this is common with boundaries */ for(efa= em->faces.first; efa; efa= efa->next) if (efa->f & SELECT) EM_select_face(efa, 1); @@ -2582,7 +2582,7 @@ void MESH_OT_select_linked_pick(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", ""); - RNA_def_boolean(ot->srna, "limit", 0, "Limit by Seams", "Limit selection by seam boundries (faces only)"); + RNA_def_boolean(ot->srna, "limit", 0, "Limit by Seams", "Limit selection by seam boundaries (faces only)"); } @@ -2671,7 +2671,7 @@ void MESH_OT_select_linked(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - RNA_def_boolean(ot->srna, "limit", 0, "Limit by Seams", "Limit selection by seam boundries (faces only)"); + RNA_def_boolean(ot->srna, "limit", 0, "Limit by Seams", "Limit selection by seam boundaries (faces only)"); } diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 4741f3c7723..dc1023952a6 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -5414,7 +5414,7 @@ static void freecollections(ListBase *allcollections) /*Begin UV Edge Collapse Code Like Edge subdivide, Edge Collapse should handle UV's intelligently, but since UV's are a per-face attribute, normal edge collapse will fail - in areas such as the boundries of 'UV islands'. So for each edge collection we need to build a set of 'welded' UV vertices and edges for it. + in areas such as the boundaries of 'UV islands'. So for each edge collection we need to build a set of 'welded' UV vertices and edges for it. The welded UV edges can then be sorted and collapsed. */ typedef struct wUV{ diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c index b3aa9349da8..b30db6680e5 100644 --- a/source/blender/editors/space_action/action_edit.c +++ b/source/blender/editors/space_action/action_edit.c @@ -1220,7 +1220,7 @@ void ACTION_OT_keyframe_type (wmOperatorType *ot) /* identifiers */ ot->name= "Set Keyframe Type"; ot->idname= "ACTION_OT_keyframe_type"; - ot->description= "Set type of keyframe for the seleced keyframes"; + ot->description= "Set type of keyframe for the selected keyframes"; /* api callbacks */ ot->invoke= WM_menu_invoke; diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c index dc730e961fc..638bfe57608 100644 --- a/source/blender/editors/space_logic/logic_ops.c +++ b/source/blender/editors/space_logic/logic_ops.c @@ -581,7 +581,7 @@ static void LOGIC_OT_sensor_move(wmOperatorType *ot) { /* identifiers */ ot->name= "Move Sensor"; - ot->description = "Move Densor"; + ot->description = "Move Sensor"; ot->idname= "LOGIC_OT_sensor_move"; /* api callbacks */ diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index d058ea746b6..0bcf84c1870 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -1002,7 +1002,7 @@ void NLA_OT_mute_toggle (wmOperatorType *ot) /* identifiers */ ot->name= "Toggle Muting"; ot->idname= "NLA_OT_mute_toggle"; - ot->description= "Mute or un-muted selected strips"; + ot->description= "Mute or un-mute selected strips"; /* api callbacks */ ot->exec= nlaedit_toggle_mute_exec; @@ -1384,7 +1384,7 @@ void NLA_OT_action_sync_length (wmOperatorType *ot) /* identifiers */ ot->name= "Sync Action Length"; ot->idname= "NLA_OT_action_sync_length"; - ot->description= "Sychronise the length of the referenced Action with the lengths used in the strip"; + ot->description= "Synchronise the length of the referenced Action with the lengths used in the strip"; /* api callbacks */ ot->exec= nlaedit_sync_actlen_exec; @@ -1803,7 +1803,7 @@ void NLA_OT_fmodifier_add (wmOperatorType *ot) /* identifiers */ ot->name= "Add F-Modifier"; ot->idname= "NLA_OT_fmodifier_add"; - ot->description= "Add F-Modifier of the secified type to the selected NLA-Strips"; + ot->description= "Add F-Modifier of the specified type to the selected NLA-Strips"; /* api callbacks */ ot->invoke= nla_fmodifier_add_invoke; diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index ed26440d37d..8fdd62f7412 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -1729,7 +1729,7 @@ void OUTLINER_OT_renderability_toggle(wmOperatorType *ot) /* identifiers */ ot->name= "Toggle Renderability"; ot->idname= "OUTLINER_OT_renderability_toggle"; - ot->description= "Toggle the renderbility of selected items"; + ot->description= "Toggle the renderability of selected items"; /* callbacks */ ot->exec= outliner_toggle_renderability_exec; diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index ca5213e357b..66043d495ea 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1678,7 +1678,7 @@ void VIEW3D_OT_render_border(wmOperatorType *ot) { /* identifiers */ ot->name= "Set Render Border"; - ot->description = "Set the boundries of the border render and enables border render "; + ot->description = "Set the boundaries of the border render and enables border render "; ot->idname= "VIEW3D_OT_render_border"; /* api callbacks */ diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index af6efcea5fc..b38f8412524 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -1787,7 +1787,7 @@ static void UV_OT_select(wmOperatorType *ot) { /* identifiers */ ot->name= "Select"; - ot->description= "Select UV vertice"; + ot->description= "Select UV vertices"; ot->idname= "UV_OT_select"; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; From c4debb1c642af4f97818d1e33986223b69b0aa6d Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 19 Apr 2011 11:17:29 +0000 Subject: [PATCH 20/88] Bugfix #26977 + Patch by Harley Acheson Using search for operators showed ambigious names like "Duplicate" or "Delete". Default names should give at least a descriptive label. In case operators are collected in a group name-shortening should be handled separaly. --- source/blender/editors/animation/keyframing.c | 2 +- source/blender/editors/curve/editcurve.c | 4 ++-- source/blender/editors/curve/editfont.c | 2 +- source/blender/editors/interface/view2d_ops.c | 2 +- source/blender/editors/mesh/editmesh_add.c | 2 +- source/blender/editors/metaball/mball_edit.c | 2 +- source/blender/editors/object/object_add.c | 2 +- source/blender/editors/object/object_ops.c | 2 +- source/blender/editors/space_sequencer/sequencer_edit.c | 2 +- source/blender/editors/space_text/text_ops.c | 2 +- source/blender/editors/space_view3d/view3d_edit.c | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 278fa4ccab4..cb93d2bf70b 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -1287,7 +1287,7 @@ void ANIM_OT_keyframe_delete (wmOperatorType *ot) PropertyRNA *prop; /* identifiers */ - ot->name= "Delete Keyframe"; + ot->name= "Delete Keying-Set Keyframe"; ot->idname= "ANIM_OT_keyframe_delete"; ot->description= "Delete keyframes on the current frame for all properties in the specified Keying Set"; diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index a273630ff91..08f8496eb8a 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -5639,7 +5639,7 @@ static int duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) void CURVE_OT_duplicate(wmOperatorType *ot) { /* identifiers */ - ot->name= "Duplicate"; + ot->name= "Duplicate Curve"; ot->description = "Duplicate selected control points and segments between them"; ot->idname= "CURVE_OT_duplicate"; @@ -6664,7 +6664,7 @@ static int add_primitive_bezier_circle_exec(bContext *C, wmOperator *op) void CURVE_OT_primitive_bezier_circle_add(wmOperatorType *ot) { /* identifiers */ - ot->name= "Add Circle"; + ot->name= "Add Bezier Circle"; ot->description= "Construct a Bezier Circle"; ot->idname= "CURVE_OT_primitive_bezier_circle_add"; diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c index 88842f36efd..649ff9e953a 100644 --- a/source/blender/editors/curve/editfont.c +++ b/source/blender/editors/curve/editfont.c @@ -1715,7 +1715,7 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) void FONT_OT_open(wmOperatorType *ot) { /* identifiers */ - ot->name= "Open"; + ot->name= "Open Font"; ot->idname= "FONT_OT_open"; /* api callbacks */ diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index 123f9e2044f..62b191c2c6e 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -1048,7 +1048,7 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, wmEvent *event) static void VIEW2D_OT_zoom(wmOperatorType *ot) { /* identifiers */ - ot->name= "Zoom View"; + ot->name= "Zoom 2D View"; ot->description= "Zoom in/out the view"; ot->idname= "VIEW2D_OT_zoom"; diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index 2609a745398..1b77797d19b 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -1754,7 +1754,7 @@ static int mesh_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(ev void MESH_OT_duplicate(wmOperatorType *ot) { /* identifiers */ - ot->name= "Duplicate"; + ot->name= "Duplicate Mesh"; ot->description= "Duplicate selected vertices, edges or faces"; ot->idname= "MESH_OT_duplicate"; diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c index d47e02dc63c..d3e1401b20e 100644 --- a/source/blender/editors/metaball/mball_edit.c +++ b/source/blender/editors/metaball/mball_edit.c @@ -314,7 +314,7 @@ static int duplicate_metaelems_invoke(bContext *C, wmOperator *op, wmEvent *UNUS void MBALL_OT_duplicate_metaelems(wmOperatorType *ot) { /* identifiers */ - ot->name= "Duplicate"; + ot->name= "Duplicate Metaelements"; ot->description= "Delete selected metaelement(s)"; ot->idname= "MBALL_OT_duplicate_metaelems"; diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 39e3f47eb6e..c425ef5a36a 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -1704,7 +1704,7 @@ void OBJECT_OT_duplicate(wmOperatorType *ot) PropertyRNA *prop; /* identifiers */ - ot->name= "Duplicate"; + ot->name= "Duplicate Objects"; ot->description = "Duplicate selected objects"; ot->idname= "OBJECT_OT_duplicate"; diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 197634941f8..04152369a7e 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -220,7 +220,7 @@ void ED_operatormacros_object(void) wmOperatorType *ot; wmOperatorTypeMacro *otmacro; - ot= WM_operatortype_append_macro("OBJECT_OT_duplicate_move", "Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER); + ot= WM_operatortype_append_macro("OBJECT_OT_duplicate_move", "Duplicate Objects", OPTYPE_UNDO|OPTYPE_REGISTER); if(ot) { WM_operatortype_macro_define(ot, "OBJECT_OT_duplicate"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 115d1ad7bae..d1b23dced26 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -1666,7 +1666,7 @@ static int sequencer_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent * void SEQUENCER_OT_duplicate(wmOperatorType *ot) { /* identifiers */ - ot->name= "Duplicate"; + ot->name= "Duplicate Strips"; ot->idname= "SEQUENCER_OT_duplicate"; ot->description="Duplicate the selected strips"; diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index 5325bed15fd..31edfd522a3 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -290,7 +290,7 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) void TEXT_OT_open(wmOperatorType *ot) { /* identifiers */ - ot->name= "Open"; + ot->name= "Open Text Block"; ot->idname= "TEXT_OT_open"; ot->description= "Open a new text data block"; diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 66043d495ea..7cbb56e2fd6 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1310,7 +1310,7 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event) void VIEW3D_OT_zoom(wmOperatorType *ot) { /* identifiers */ - ot->name= "Zoom view"; + ot->name= "Zoom View"; ot->description = "Zoom in/out in the view"; ot->idname= "VIEW3D_OT_zoom"; From 94b99b5d4a7c20cf2f4488b599e74619a7c860a6 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 19 Apr 2011 13:01:50 +0000 Subject: [PATCH 21/88] Bugfix [#25960] Action/NLA Editor issues with animdata context Actions now get tagged with an ID-code, which is used to determine what ID-blocks they can be assigned to. This ensures that material actions cannot be assigned to the object-level for example. * Action lists in general will now show only the actions that can be set for that particular slot. This prevents selection of invalid actions, and helps cut down the list of actions. ** An exception here is the Add Action Clip in NLA Editor, which will show all actions but will only add where appropriate. This is because it's not easy/possible to tell in advance which blocktypes to filter for when building this list. (TODO?) * The "Action Editor" is now strictly for object-level action editing+setting now. This avoids repeateded confusion by people who try using this to view their shapekey actions, which should go to the Shape Key Editor instead! ** A context switcher for the legitimate times where this capability might come in handy is still being investigated. * "Floating" actions (i.e. actions in some action_library.blend) are NOT able to be automatically tagged until they are assigned to some datablocks (i.e. loaded onto the rig + played back once). It is possible to write scripts that check for certain RNA-paths and "guess" what datablocks they work on, but it is recommended that you load up the Datablocks Viewer, and go through such actions by hand, setting the "ID Root Type" property as appropriate per action. --- source/blender/blenkernel/intern/anim_sys.c | 48 +++++++++++++ source/blender/blenkernel/intern/ipo.c | 43 ++++++++++- source/blender/blenloader/intern/readfile.c | 10 +++ source/blender/editors/space_nla/nla_edit.c | 16 +++++ source/blender/makesdna/DNA_action_types.h | 3 + source/blender/makesrna/intern/rna_action.c | 72 +++++++++++++++++-- .../blender/makesrna/intern/rna_animation.c | 36 ++++++++++ source/blender/makesrna/intern/rna_internal.h | 3 + source/blender/makesrna/intern/rna_nla.c | 1 + source/blender/makesrna/intern/rna_space.c | 29 +++++++- 10 files changed, 252 insertions(+), 9 deletions(-) diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 2708239a4c3..f7eaff475fa 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -1199,6 +1199,39 @@ static void animsys_evaluate_drivers (PointerRNA *ptr, AnimData *adt, float ctim /* ***************************************** */ /* Actions Evaluation */ +/* strictly not necessary for actual "evaluation", but it is a useful safety check + * to reduce the amount of times that users end up having to "revive" wrongly-assigned + * actions + */ +static void action_idcode_patch_check (ID *id, bAction *act) +{ + int idcode = 0; + + /* just in case */ + if (ELEM(NULL, id, act)) + return; + else + idcode = GS(id->name); + + /* the actual checks... hopefully not too much of a performance hit in the long run... */ + if (act->idroot == 0) { + /* use the current root if not set already (i.e. newly created actions and actions from 2.50-2.57 builds) + * - this has problems if there are 2 users, and the first one encountered is the invalid one + * in which case, the user will need to manually fix this (?) + */ + act->idroot = idcode; + } + else if (act->idroot != idcode) { + /* only report this error if debug mode is enabled (to save performance everywhere else) */ + if (G.f & G_DEBUG) { + printf("AnimSys Safety Check Failed: Action '%s' is not meant to be used from ID-Blocks of type %d such as '%s'\n", + act->id.name+2, idcode, id->name); + } + } +} + +/* ----------------------------------------- */ + /* Evaluate Action Group */ void animsys_evaluate_action_group (PointerRNA *ptr, bAction *act, bActionGroup *agrp, AnimMapper *remap, float ctime) { @@ -1208,6 +1241,8 @@ void animsys_evaluate_action_group (PointerRNA *ptr, bAction *act, bActionGroup if ELEM(NULL, act, agrp) return; if ((remap) && (remap->target != act)) remap= NULL; + action_idcode_patch_check(ptr->id.data, act); + /* if group is muted, don't evaluated any of the F-Curve */ if (agrp->flag & AGRP_MUTED) return; @@ -1231,6 +1266,8 @@ void animsys_evaluate_action (PointerRNA *ptr, bAction *act, AnimMapper *remap, if (act == NULL) return; if ((remap) && (remap->target != act)) remap= NULL; + action_idcode_patch_check(ptr->id.data, act); + /* calculate then execute each curve */ animsys_evaluate_fcurves(ptr, &act->curves, remap, ctime); } @@ -1630,6 +1667,17 @@ static void nlastrip_evaluate_actionclip (PointerRNA *ptr, ListBase *channels, L FCurve *fcu; float evaltime; + /* sanity checks for action */ + if (strip == NULL) + return; + + if (strip->act == NULL) { + printf("NLA-Strip Eval Error: Strip '%s' has no Action\n", strip->name); + return; + } + + action_idcode_patch_check(ptr->id.data, strip->act); + /* join this strip's modifiers to the parent's modifiers (own modifiers first) */ nlaeval_fmodifiers_join_stacks(&tmp_modifiers, &strip->modifiers, modifiers); diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 08e0ad4f3ff..689e17958fe 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -1372,7 +1372,7 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve * * This does not assume that any ID or AnimData uses it, but does assume that * it is given two lists, which it will perform driver/animation-data separation. */ -static void ipo_to_animato (ID *id, Ipo *ipo, char actname[], char constname[], Sequence * seq, ListBase *animgroups, ListBase *anim, ListBase *drivers) +static void ipo_to_animato (ID *id, Ipo *ipo, char actname[], char constname[], Sequence *seq, ListBase *animgroups, ListBase *anim, ListBase *drivers) { IpoCurve *icu; @@ -1804,6 +1804,10 @@ void do_versions_ipos_to_animato(Main *main) BLI_freelinkN(&ob->constraintChannels, conchan); } } + + /* object's action will always be object-rooted */ + if (adt->action) + adt->action->idroot = ID_OB; } /* shapekeys */ @@ -1822,6 +1826,10 @@ void do_versions_ipos_to_animato(Main *main) /* Convert Shapekey data... */ ipo_to_animdata(id, key->ipo, NULL, NULL, NULL); + + if (adt->action) + adt->action->idroot = key->ipo->blocktype; + key->ipo->id.us--; key->ipo= NULL; } @@ -1840,6 +1848,10 @@ void do_versions_ipos_to_animato(Main *main) /* Convert Material data... */ ipo_to_animdata(id, ma->ipo, NULL, NULL, NULL); + + if (adt->action) + adt->action->idroot = ma->ipo->blocktype; + ma->ipo->id.us--; ma->ipo= NULL; } @@ -1858,6 +1870,10 @@ void do_versions_ipos_to_animato(Main *main) /* Convert World data... */ ipo_to_animdata(id, wo->ipo, NULL, NULL, NULL); + + if (adt->action) + adt->action->idroot = wo->ipo->blocktype; + wo->ipo->id.us--; wo->ipo= NULL; } @@ -1904,6 +1920,10 @@ void do_versions_ipos_to_animato(Main *main) /* convert IPO */ ipo_to_animdata((ID *)scene, seq->ipo, NULL, NULL, seq); + + if (adt->action) + adt->action->idroot = ID_SCE; /* scene-rooted */ + seq->ipo->id.us--; seq->ipo = NULL; } @@ -1925,6 +1945,10 @@ void do_versions_ipos_to_animato(Main *main) /* Convert Texture data... */ ipo_to_animdata(id, te->ipo, NULL, NULL, NULL); + + if (adt->action) + adt->action->idroot = te->ipo->blocktype; + te->ipo->id.us--; te->ipo= NULL; } @@ -1943,6 +1967,10 @@ void do_versions_ipos_to_animato(Main *main) /* Convert Camera data... */ ipo_to_animdata(id, ca->ipo, NULL, NULL, NULL); + + if (adt->action) + adt->action->idroot = ca->ipo->blocktype; + ca->ipo->id.us--; ca->ipo= NULL; } @@ -1961,6 +1989,10 @@ void do_versions_ipos_to_animato(Main *main) /* Convert Lamp data... */ ipo_to_animdata(id, la->ipo, NULL, NULL, NULL); + + if (adt->action) + adt->action->idroot = la->ipo->blocktype; + la->ipo->id.us--; la->ipo= NULL; } @@ -1979,6 +2011,10 @@ void do_versions_ipos_to_animato(Main *main) /* Convert Curve data... */ ipo_to_animdata(id, cu->ipo, NULL, NULL, NULL); + + if (adt->action) + adt->action->idroot = cu->ipo->blocktype; + cu->ipo->id.us--; cu->ipo= NULL; } @@ -2001,6 +2037,10 @@ void do_versions_ipos_to_animato(Main *main) if (G.f & G_DEBUG) printf("\tconverting action %s \n", id->name+2); + /* if old action, it will be object-only... */ + if (act->chanbase.first) + act->idroot = ID_OB; + /* be careful! some of the actions we encounter will be converted ones... */ action_to_animato(NULL, act, &act->groups, &act->curves, &drivers); } @@ -2018,6 +2058,7 @@ void do_versions_ipos_to_animato(Main *main) /* add a new action for this, and convert all data into that action */ new_act= add_empty_action("ConvIPO_Action"); // XXX need a better name... ipo_to_animato(NULL, ipo, NULL, NULL, NULL, NULL, &new_act->curves, &drivers); + new_act->idroot = ipo->blocktype; } /* clear fake-users, and set user-count to zero to make sure it is cleared on file-save */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 4ff65aeb213..a87d993bc15 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -1863,6 +1863,10 @@ static void lib_link_nladata_strips(FileData *fd, ID *id, ListBase *list) /* reassign the counted-reference to action */ strip->act = newlibadr_us(fd, id->lib, strip->act); + + /* fix action id-root (i.e. if it comes from a pre 2.57 .blend file) */ + if ((strip->act) && (strip->act->idroot == 0)) + strip->act->idroot = GS(id->name); } } @@ -1956,6 +1960,12 @@ static void lib_link_animdata(FileData *fd, ID *id, AnimData *adt) adt->action= newlibadr_us(fd, id->lib, adt->action); adt->tmpact= newlibadr_us(fd, id->lib, adt->tmpact); + /* fix action id-roots (i.e. if they come from a pre 2.57 .blend file) */ + if ((adt->action) && (adt->action->idroot == 0)) + adt->action->idroot = GS(id->name); + if ((adt->tmpact) && (adt->tmpact->idroot == 0)) + adt->tmpact->idroot = GS(id->name); + /* link drivers */ lib_link_fcurves(fd, id, &adt->drivers); diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index 0bcf84c1870..77c91b28a63 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -271,6 +271,12 @@ static int nlaedit_add_actionclip_exec (bContext *C, wmOperator *op) //printf("Add strip - actname = '%s' \n", actname); return OPERATOR_CANCELLED; } + else if (act->idroot == 0) { + /* hopefully in this case (i.e. library of userless actions), the user knows what they're doing... */ + BKE_reportf(op->reports, RPT_WARNING, + "Action '%s' does not specify what datablocks it can be used on. Try setting the 'ID Root Type' setting from the Datablocks Editor for this Action to avoid future problems", + act->id.name+2); + } /* get a list of the editable tracks being shown in the NLA * - this is limited to active ones for now, but could be expanded to @@ -289,6 +295,16 @@ static int nlaedit_add_actionclip_exec (bContext *C, wmOperator *op) AnimData *adt= ale->adt; NlaStrip *strip= NULL; + /* sanity check: only apply actions of the right type for this ID + * NOTE: in the case that this hasn't been set, we've already warned the user about this already + */ + if ((act->idroot) && (act->idroot != GS(ale->id->name))) { + BKE_reportf(op->reports, RPT_ERROR, + "Couldn't add action '%s' as it cannot be used relative to ID-blocks of type '%s'", + act->id.name+2, ale->id->name); + continue; + } + /* create a new strip, and offset it to start on the current frame */ strip= add_nlastrip(act); diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 412b9bc56f6..0716d1ddbf2 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -487,6 +487,9 @@ typedef struct bAction { int flag; /* settings for this action */ int active_marker; /* index of the active marker */ + + int idroot; /* type of ID-blocks that action can be assigned to (if 0, will be set to whatever ID first evaluates it) */ + int pad; } bAction; diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c index 418451801ca..7fdb96fda6e 100644 --- a/source/blender/makesrna/intern/rna_action.c +++ b/source/blender/makesrna/intern/rna_action.c @@ -30,6 +30,7 @@ #include #include "RNA_define.h" +#include "RNA_enum_types.h" #include "rna_internal.h" @@ -194,6 +195,56 @@ static void rna_Action_frame_range_get(PointerRNA *ptr,float *values) calc_action_range(ptr->id.data, values, values+1, 1); } + +/* used to check if an action (value pointer) is suitable to be assigned to the ID-block that is ptr */ +int rna_Action_id_poll(PointerRNA *ptr, PointerRNA value) +{ + ID *srcId = (ID *)ptr->id.data; + bAction *act = (bAction *)value.id.data; + + if (act) { + /* there can still be actions that will have undefined id-root + * (i.e. floating "action-library" members) which we will not + * be able to resolve an idroot for automatically, so let these through + */ + if (act->idroot == 0) + return 1; + else if (srcId) + return GS(srcId->name) == act->idroot; + } + + return 0; +} + +/* used to check if an action (value pointer) can be assigned to Action Editor given current mode */ +int rna_Action_actedit_assign_poll(PointerRNA *ptr, PointerRNA value) +{ + SpaceAction *saction = (SpaceAction *)ptr->data; + bAction *act = (bAction *)value.id.data; + + if (act) { + /* there can still be actions that will have undefined id-root + * (i.e. floating "action-library" members) which we will not + * be able to resolve an idroot for automatically, so let these through + */ + if (act->idroot == 0) + return 1; + + if (saction) { + if (saction->mode == SACTCONT_ACTION) { + /* this is only Object-level for now... */ + return act->idroot == ID_OB; + } + else if (saction->mode == SACTCONT_SHAPEKEY) { + /* obviously shapekeys only */ + return act->idroot == ID_KE; + } + } + } + + return 0; +} + #else static void rna_def_dopesheet(BlenderRNA *brna) @@ -515,34 +566,43 @@ static void rna_def_action(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - + srna= RNA_def_struct(brna, "Action", "ID"); RNA_def_struct_sdna(srna, "bAction"); RNA_def_struct_ui_text(srna, "Action", "A collection of F-Curves for animation"); RNA_def_struct_ui_icon(srna, ICON_ACTION); - + + /* collections */ prop= RNA_def_property(srna, "fcurves", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "curves", NULL); RNA_def_property_struct_type(prop, "FCurve"); RNA_def_property_ui_text(prop, "F-Curves", "The individual F-Curves that make up the Action"); rna_def_action_fcurves(brna, prop); - + prop= RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "groups", NULL); RNA_def_property_struct_type(prop, "ActionGroup"); RNA_def_property_ui_text(prop, "Groups", "Convenient groupings of F-Curves"); rna_def_action_groups(brna, prop); - + prop= RNA_def_property(srna, "pose_markers", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "markers", NULL); RNA_def_property_struct_type(prop, "TimelineMarker"); RNA_def_property_ui_text(prop, "Pose Markers", "Markers specific to this Action, for labeling poses"); rna_def_action_pose_markers(brna, prop); - + + /* properties */ prop= RNA_def_float_vector(srna, "frame_range" , 2 , NULL , 0, 0, "Frame Range" , "The final frame range of all fcurves within this action" , 0 , 0); RNA_def_property_float_funcs(prop, "rna_Action_frame_range_get" , NULL, NULL); RNA_def_property_clear_flag(prop, PROP_EDITABLE); - + + /* special "type" limiter - should not really be edited in general, but is still available/editable in 'emergencies' */ + prop= RNA_def_property(srna, "id_root", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "idroot"); + RNA_def_property_enum_items(prop, id_type_items); + RNA_def_property_ui_text(prop, "ID Root Type", "Type of ID-block that action can be used on. DO NOT CHANGE UNLESS YOU KNOW WHAT YOU'RE DOING"); + + /* API calls */ RNA_api_action(srna); } diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c index 17d2e27c462..8e210a7a4cb 100644 --- a/source/blender/makesrna/intern/rna_animation.c +++ b/source/blender/makesrna/intern/rna_animation.c @@ -70,6 +70,41 @@ static int rna_AnimData_action_editable(PointerRNA *ptr) return 1; } +static void rna_AnimData_action_set(PointerRNA *ptr, PointerRNA value) +{ + ID *ownerId = (ID *)ptr->id.data; + AnimData *adt = (AnimData *)ptr->data; + + /* assume that AnimData's action can in fact be edited... */ + if ((value.data) && (ownerId)) { + bAction *act = (bAction *)value.data; + + /* action must have same type as owner */ + if (ownerId) { + if (ELEM(act->idroot, 0, GS(ownerId->name))) { + /* can set */ + adt->action = act; + } + else { + /* cannot set */ + printf("ERROR: Couldn't set Action '%s' onto ID '%s', as it doesn't have suitably rooted paths for this purpose\n", + act->id.name+2, ownerId->name); + } + } + else { + /* cannot tell if we can set, so let's just be generous... */ + printf("Warning: Set Action '%s' onto AnimData block with an unknown ID-owner. May have attached invalid data\n", + act->id.name+2); + + adt->action = act; + } + } + else { + /* just clearing the action... */ + adt->action = NULL; + } +} + /* ****************************** */ /* wrapper for poll callback */ @@ -739,6 +774,7 @@ void rna_def_animdata(BlenderRNA *brna) /* Active Action */ prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_EDITABLE); /* this flag as well as the dynamic test must be defined for this to be editable... */ + RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Action_id_poll"); RNA_def_property_editable_func(prop, "rna_AnimData_action_editable"); RNA_def_property_ui_text(prop, "Action", "Active Action for this datablock"); RNA_def_property_update(prop, NC_ANIMATION, NULL); /* this will do? */ diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 4dc98ceb0a4..1d060c8a362 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -222,6 +222,9 @@ int rna_Curve_object_poll(struct PointerRNA *ptr, struct PointerRNA value); int rna_Lattice_object_poll(struct PointerRNA *ptr, struct PointerRNA value); int rna_Mesh_object_poll(struct PointerRNA *ptr, struct PointerRNA value); +/* basic poll functions for actions (to prevent actions getting set in wrong places) */ +int rna_Action_id_poll(struct PointerRNA *ptr, struct PointerRNA value); +int rna_Action_actedit_assign_poll(struct PointerRNA *ptr, struct PointerRNA value); char *rna_TextureSlot_path(struct PointerRNA *ptr); diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c index 09837579949..9bf5f53f8b7 100644 --- a/source/blender/makesrna/intern/rna_nla.c +++ b/source/blender/makesrna/intern/rna_nla.c @@ -426,6 +426,7 @@ static void rna_def_nlastrip(BlenderRNA *brna) /* Action */ prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "act"); + RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Action_id_poll"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Action", "Action referenced by this strip"); RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */ diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 3d9d8a8e9f4..52fae14a023 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -644,7 +644,32 @@ static void rna_ConsoleLine_cursor_index_range(PointerRNA *ptr, int *min, int *m static void rna_SpaceDopeSheetEditor_action_set(PointerRNA *ptr, PointerRNA value) { SpaceAction *saction= (SpaceAction*)(ptr->data); - saction->action= value.data; + bAction *act = (bAction*)value.data; + + if ((act == NULL) || (act->idroot == 0)) { + /* just set if we're clearing the action or if the action is "amorphous" still */ + saction->action= act; + } + else { + /* action to set must strictly meet the mode criteria... */ + if (saction->mode == SACTCONT_ACTION) { + /* currently, this is "object-level" only, until we have some way of specifying this */ + if (act->idroot == ID_OB) + saction->action = act; + else + printf("ERROR: cannot assign Action '%s' to Action Editor, as action is not object-level animation\n", act->id.name+2); + } + else if (saction->mode == SACTCONT_SHAPEKEY) { + /* as the name says, "shapekey-level" only... */ + if (act->idroot == ID_KE) + saction->action = act; + else + printf("ERROR: cannot assign Action '%s' to Shape Key Editor, as action doesn't animate Shape Keys\n", act->id.name+2); + } + else { + printf("ACK: who's trying to set an action while not in a mode displaying a single Action only?\n"); + } + } } static void rna_SpaceDopeSheetEditor_action_update(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -1771,7 +1796,7 @@ static void rna_def_space_dopesheet(BlenderRNA *brna) /* data */ prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceDopeSheetEditor_action_set", NULL, NULL); + RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceDopeSheetEditor_action_set", NULL, "rna_Action_actedit_assign_poll"); RNA_def_property_ui_text(prop, "Action", "Action displayed and edited in this space"); RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, "rna_SpaceDopeSheetEditor_action_update"); From aa00bbe484f832f5001883f24fa5dee262baa888 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 19 Apr 2011 13:02:49 +0000 Subject: [PATCH 22/88] Whitespace/typos --- source/blender/editors/gpencil/gpencil_buttons.c | 8 +++++--- source/blender/makesrna/intern/rna_gpencil.c | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_buttons.c b/source/blender/editors/gpencil/gpencil_buttons.c index 79fcbb0e49d..d95f64c31e1 100644 --- a/source/blender/editors/gpencil/gpencil_buttons.c +++ b/source/blender/editors/gpencil/gpencil_buttons.c @@ -219,9 +219,11 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl, con subcol= uiLayoutColumn(col, 1); uiItemR(subcol, &ptr, "use_onion_skinning", 0, "Onion Skinning", ICON_NONE); uiItemR(subcol, &ptr, "ghost_range_max", 0, "Frames", ICON_NONE); // XXX shorter name here? i.e. GStep - - if(is_v3d) { - uiItemR(subcol, &ptr, "show_x_ray", 0, "X-Ray", ICON_NONE); + + /* 3d-view specific drawing options */ + if (is_v3d) { + subcol= uiLayoutColumn(col, 0); + uiItemR(subcol, &ptr, "show_x_ray", 0, "X-Ray", ICON_NONE); } } diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c index 228b00e7937..423b4e4f76b 100644 --- a/source/blender/makesrna/intern/rna_gpencil.c +++ b/source/blender/makesrna/intern/rna_gpencil.c @@ -309,7 +309,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna) static EnumPropertyItem draw_mode_items[] = { {GP_DATA_VIEWALIGN, "CURSOR", 0, "Cursor", "Draw stroke at the 3D cursor"}, - {0, "VIEW", 0, "View", "Stick stroke to the view "}, /* weired, GP_DATA_VIEWALIGN is inverted */ + {0, "VIEW", 0, "View", "Stick stroke to the view "}, /* weird, GP_DATA_VIEWALIGN is inverted */ {GP_DATA_VIEWALIGN|GP_DATA_DEPTH_VIEW, "SURFACE", 0, "Surface", "Stick stroke to surfaces"}, {GP_DATA_VIEWALIGN|GP_DATA_DEPTH_STROKE, "STROKE", 0, "Stroke", "Stick stroke to other strokes"}, {0, NULL, 0, NULL, NULL}}; From b282655088817a055cac73385d1bec4efa75d387 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Tue, 19 Apr 2011 13:06:08 +0000 Subject: [PATCH 23/88] Fix for [#27008] Replacing particle hair with group objects - viewport does not match renderoutput. * Object size was determined from the first and second last cache key by accident, when it should have been first and last cache keys that were used. --- source/blender/blenkernel/intern/particle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 662929f95fc..52b8cc194f7 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -4371,7 +4371,7 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa float loc[3], nor[3], vec[3], side[3], len, obrotmat[4][4], qmat[4][4]; float xvec[3] = {-1.0, 0.0, 0.0}, q[4], nmat[3][3]; - sub_v3_v3v3(vec, (cache+cache->steps-1)->co, cache->co); + sub_v3_v3v3(vec, (cache+cache->steps)->co, cache->co); len= normalize_v3(vec); if(psys->part->rotmode) { From 8266c602b48563c2afdea51059b7e06a15ae6c0d Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 19 Apr 2011 13:17:16 +0000 Subject: [PATCH 24/88] Bugfix [#25960] .1 Action Editor header doesn't update when entering tweakmode on NLA Strips --- source/blender/editors/space_action/space_action.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c index 06ff061f5ea..e8731391352 100644 --- a/source/blender/editors/space_action/space_action.c +++ b/source/blender/editors/space_action/space_action.c @@ -365,8 +365,13 @@ static void action_listener(ScrArea *sa, wmNotifier *wmn) } break; case NC_ANIMATION: + /* for NLA tweakmode enter/exit, need complete refresh */ + if (wmn->data == ND_NLA_ACTCHANGE) { + saction->flag |= SACTION_TEMP_NEEDCHANSYNC; + ED_area_tag_refresh(sa); + } /* for selection changes of animation data, we can just redraw... otherwise autocolor might need to be done again */ - if (ELEM(wmn->data, ND_KEYFRAME, ND_ANIMCHAN) && (wmn->action == NA_SELECTED)) + else if (ELEM(wmn->data, ND_KEYFRAME, ND_ANIMCHAN) && (wmn->action == NA_SELECTED)) ED_area_tag_redraw(sa); else ED_area_tag_refresh(sa); @@ -416,9 +421,9 @@ static void action_listener(ScrArea *sa, wmNotifier *wmn) static void action_header_area_listener(ARegion *ar, wmNotifier *wmn) { /* context changes */ - switch(wmn->category) { + switch (wmn->category) { case NC_SCENE: - switch(wmn->data) { + switch (wmn->data) { case ND_OB_ACTIVE: ED_region_tag_redraw(ar); break; From 9abd7113049fdef0baf37201b1264a7fa8c50acb Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Tue, 19 Apr 2011 14:36:26 +0000 Subject: [PATCH 25/88] Bugfix 26936 EditMode mesh: tool "Mesh Rip Move" shouldnt be in the toolbar. The tool was coded to use the mouse position next to the selection. The rip then happens correctly after pressing V and move mouse away from selection. --- release/scripts/startup/bl_ui/space_view3d_toolbar.py | 1 - 1 file changed, 1 deletion(-) diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index b021dbb4160..bd258fa18f6 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -122,7 +122,6 @@ class VIEW3D_PT_tools_meshedit(View3DPanel, bpy.types.Panel): col = layout.column(align=True) col.label(text="Deform:") col.operator("transform.edge_slide") - col.operator("mesh.rip_move") col.operator("mesh.noise") col.operator("mesh.vertices_smooth") From 6cb761f10ce22349b9d0a74744ab28c85ea768f4 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Tue, 19 Apr 2011 15:15:50 +0000 Subject: [PATCH 26/88] Corrected updating inside edited groups, fix for #27018. This was caused by edit updates being restricted to the actual node. Edit functions now should use the generic snode_tag_changed, which also updates all instances of the currently edited group. --- source/blender/blenkernel/intern/node.c | 1 - source/blender/editors/space_node/node_edit.c | 37 +++++++++++-------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index dc1f80ce1d4..272df18c73d 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -56,7 +56,6 @@ #include "BKE_fcurve.h" #include "BKE_node.h" #include "BKE_utildefines.h" -#include "BKE_node.h" #include "PIL_time.h" diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 3877e7abf5e..4b193011467 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -460,6 +460,19 @@ void snode_set_context(SpaceNode *snode, Scene *scene) node_tree_from_ID(snode->id, &snode->nodetree, &snode->edittree, NULL); } +static void snode_tag_changed(SpaceNode *snode, bNode *node) +{ + bNode *gnode; + + if (node) + NodeTagChanged(snode->edittree, node); + + /* if inside group, tag entire group */ + gnode= node_tree_get_editgroup(snode->nodetree); + if(gnode) + NodeTagIDChanged(snode->nodetree, gnode->id); +} + void node_set_active(SpaceNode *snode, bNode *node) { nodeSetActive(snode->edittree, node); @@ -508,14 +521,7 @@ void node_set_active(SpaceNode *snode, bNode *node) node->flag |= NODE_DO_OUTPUT; if(was_output==0) { - bNode *gnode; - - NodeTagChanged(snode->edittree, node); - - /* if inside group, tag entire group */ - gnode= node_tree_get_editgroup(snode->nodetree); - if(gnode) - NodeTagIDChanged(snode->nodetree, gnode->id); + snode_tag_changed(snode, node); ED_node_changed_update(snode->id, node); } @@ -1553,7 +1559,7 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode) link->fromsock= sock; } ntreeSolveOrder(snode->edittree); - NodeTagChanged(snode->edittree, node); + snode_tag_changed(snode, node); } } } @@ -1896,7 +1902,7 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace) if (replace) nodeRemSocketLinks(snode->edittree, sock_to); nodeAddLink(snode->edittree, node_fr, sock_fr, node_to, sock_to); - NodeTagChanged(snode->edittree, node_to); + snode_tag_changed(snode, node_to); ++numlinks; break; } @@ -1960,7 +1966,7 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float if(node->id) id_us_plus(node->id); - NodeTagChanged(snode->edittree, node); + snode_tag_changed(snode, node); } if(snode->nodetree->type==NTREE_TEXTURE) { @@ -2135,8 +2141,7 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) case MIDDLEMOUSE: if(link->tosock && link->fromsock) { /* send changed events for original tonode and new */ - if(link->tonode) - NodeTagChanged(snode->edittree, link->tonode); + snode_tag_changed(snode, link->tonode); /* we might need to remove a link */ if(in_out==SOCK_OUT) @@ -2209,7 +2214,7 @@ static int node_link_init(SpaceNode *snode, bNodeLinkDrag *nldrag) if(link) { /* send changed event to original tonode */ if(link->tonode) - NodeTagChanged(snode->edittree, link->tonode); + snode_tag_changed(snode, link->tonode); nldrag->node= link->fromnode; nldrag->sock= link->fromsock; @@ -2363,7 +2368,7 @@ static int cut_links_exec(bContext *C, wmOperator *op) next= link->next; if(cut_links_intersect(link, mcoords, i)) { - NodeTagChanged(snode->edittree, link->tonode); + snode_tag_changed(snode, link->tonode); nodeRemLink(snode->edittree, link); } } @@ -2746,7 +2751,7 @@ static int node_mute_exec(bContext *C, wmOperator *UNUSED(op)) if(node->flag & SELECT) { if(node->inputs.first && node->outputs.first) { node->flag ^= NODE_MUTED; - NodeTagChanged(snode->edittree, node); + snode_tag_changed(snode, node); } } } From be1746694217efa4bbf7121d92f84db74d9e419d Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Tue, 19 Apr 2011 16:30:55 +0000 Subject: [PATCH 27/88] Fix for [#27038] Bugs when linking particles/collision/softbody modifiers * Collision modifiers are disabled here by intention, but particles and softbody were copied the wrong way over :) * On a further note I don't really get this whole "link modifiers" thing as it just copies the modifiers. As modifiers aren't ID blocks there's no sense in calling this linking! * Secondly I don't think particles, smoke etc should be considered as modifiers here at all, meaning they shouldn't be linked/copied. These "modifiers" only read the mesh data at a certain location of the stack, but don't actually modify the mesh in any way (more info here http://wiki.blender.org/index.php/User:Jhk#Modifier_Stack_proposal). --- source/blender/blenkernel/intern/object.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 58d8cde7cb3..74f66837b44 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -208,8 +208,8 @@ void object_link_modifiers(struct Object *ob, struct Object *from) BLI_addtail(&ob->modifiers, nmd); } - copy_object_particlesystems(from, ob); - copy_object_softbody(from, ob); + copy_object_particlesystems(ob, from); + copy_object_softbody(ob, from); // TODO: smoke?, cloth? } From fde9ecbfbd40b321cc5d0779d4bb5690419aaaea Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 19 Apr 2011 23:52:14 +0000 Subject: [PATCH 28/88] fix [#26967] separate mesh with p crashes blender copying ID properties assumed each property was allocated separately which isnt the case for IDP_Arrays. --- source/blender/blenkernel/intern/idprop.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c index 67be3e71101..80962de9730 100644 --- a/source/blender/blenkernel/intern/idprop.c +++ b/source/blender/blenkernel/intern/idprop.c @@ -78,9 +78,12 @@ IDProperty *IDP_NewIDPArray(const char *name) IDProperty *IDP_CopyIDPArray(IDProperty *array) { - IDProperty *narray = MEM_dupallocN(array), *tmp; + /* dont use MEM_dupallocN because this may be part of an array */ + IDProperty *narray = MEM_mallocN(sizeof(IDProperty), "IDP_CopyIDPArray"), *tmp; int i; - + + *narray= *array; + narray->data.pointer = MEM_dupallocN(array->data.pointer); for (i=0; ilen; i++) { /*ok, the copy functions always allocate a new structure, From 6931decd23cd298e26e0599f828158ddf0d6bacb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 01:21:55 +0000 Subject: [PATCH 29/88] fix for crash when loading testfile from report [#27002]. error in r36222, also move AnimData *adt definitions inline to ensure they don't get mis-used across different ID types. --- source/blender/blenkernel/intern/ipo.c | 28 ++++++++++++++------------ 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 689e17958fe..7f8f9b5bb4b 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -1668,7 +1668,6 @@ void do_versions_ipos_to_animato(Main *main) { ListBase drivers = {NULL, NULL}; ID *id; - AnimData *adt; if (main == NULL) { printf("Argh! Main is NULL in do_versions_ipos_to_animato() \n"); @@ -1697,7 +1696,7 @@ void do_versions_ipos_to_animato(Main *main) /* check if object has any animation data */ if (ob->nlastrips.first) { /* Add AnimData block */ - adt= BKE_id_add_animdata(id); + BKE_id_add_animdata(id); /* IPO first to take into any non-NLA'd Object Animation */ if (ob->ipo) { @@ -1720,7 +1719,7 @@ void do_versions_ipos_to_animato(Main *main) } else if ((ob->ipo) || (ob->action)) { /* Add AnimData block */ - adt= BKE_id_add_animdata(id); + AnimData *adt= BKE_id_add_animdata(id); /* Action first - so that Action name get conserved */ if (ob->action) { @@ -1806,8 +1805,11 @@ void do_versions_ipos_to_animato(Main *main) } /* object's action will always be object-rooted */ - if (adt->action) - adt->action->idroot = ID_OB; + { + AnimData *adt= BKE_animdata_from_id(id); + if (adt && adt->action) + adt->action->idroot = ID_OB; + } } /* shapekeys */ @@ -1822,7 +1824,7 @@ void do_versions_ipos_to_animato(Main *main) */ if (key->ipo) { /* Add AnimData block */ - adt= BKE_id_add_animdata(id); + AnimData *adt= BKE_id_add_animdata(id); /* Convert Shapekey data... */ ipo_to_animdata(id, key->ipo, NULL, NULL, NULL); @@ -1844,7 +1846,7 @@ void do_versions_ipos_to_animato(Main *main) /* we're only interested in the IPO */ if (ma->ipo) { /* Add AnimData block */ - adt= BKE_id_add_animdata(id); + AnimData *adt= BKE_id_add_animdata(id); /* Convert Material data... */ ipo_to_animdata(id, ma->ipo, NULL, NULL, NULL); @@ -1866,7 +1868,7 @@ void do_versions_ipos_to_animato(Main *main) /* we're only interested in the IPO */ if (wo->ipo) { /* Add AnimData block */ - adt= BKE_id_add_animdata(id); + AnimData *adt= BKE_id_add_animdata(id); /* Convert World data... */ ipo_to_animdata(id, wo->ipo, NULL, NULL, NULL); @@ -1886,7 +1888,7 @@ void do_versions_ipos_to_animato(Main *main) if (ed && ed->seqbasep) { Sequence * seq; - adt= BKE_id_add_animdata(id); + AnimData *adt= BKE_id_add_animdata(id); SEQ_BEGIN(ed, seq) { IpoCurve *icu = (seq->ipo) ? seq->ipo->curve.first : NULL; @@ -1941,7 +1943,7 @@ void do_versions_ipos_to_animato(Main *main) /* we're only interested in the IPO */ if (te->ipo) { /* Add AnimData block */ - adt= BKE_id_add_animdata(id); + AnimData *adt= BKE_id_add_animdata(id); /* Convert Texture data... */ ipo_to_animdata(id, te->ipo, NULL, NULL, NULL); @@ -1963,7 +1965,7 @@ void do_versions_ipos_to_animato(Main *main) /* we're only interested in the IPO */ if (ca->ipo) { /* Add AnimData block */ - adt= BKE_id_add_animdata(id); + AnimData *adt= BKE_id_add_animdata(id); /* Convert Camera data... */ ipo_to_animdata(id, ca->ipo, NULL, NULL, NULL); @@ -1985,7 +1987,7 @@ void do_versions_ipos_to_animato(Main *main) /* we're only interested in the IPO */ if (la->ipo) { /* Add AnimData block */ - adt= BKE_id_add_animdata(id); + AnimData *adt= BKE_id_add_animdata(id); /* Convert Lamp data... */ ipo_to_animdata(id, la->ipo, NULL, NULL, NULL); @@ -2007,7 +2009,7 @@ void do_versions_ipos_to_animato(Main *main) /* we're only interested in the IPO */ if (cu->ipo) { /* Add AnimData block */ - adt= BKE_id_add_animdata(id); + AnimData *adt= BKE_id_add_animdata(id); /* Convert Curve data... */ ipo_to_animdata(id, cu->ipo, NULL, NULL, NULL); From 33b8d53224071f1b491b18cec77461797e28ce71 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 02:56:51 +0000 Subject: [PATCH 30/88] minor cleanup & replace inline armature separate pchan searches with BLI_findstring(), no functional changes. --- source/blender/blenkernel/intern/ipo.c | 3 +- source/blender/blenkernel/intern/object.c | 2 +- .../blender/editors/armature/editarmature.c | 90 ++++++------------- source/gameengine/Ketsji/KX_GameObject.cpp | 2 +- 4 files changed, 28 insertions(+), 69 deletions(-) diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 7f8f9b5bb4b..4f921f005f4 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -1416,8 +1416,7 @@ static void ipo_to_animato (ID *id, Ipo *ipo, char actname[], char constname[], /* if this IPO block doesn't have any users after this one, free... */ ipo->id.us--; - if ( (ipo->id.us == 0) || ((ipo->id.us == 1) && (ipo->id.flag & LIB_FAKEUSER)) ) - { + if (ID_REAL_USERS(ipo) <= 0) { IpoCurve *icn; for (icu= ipo->curve.first; icu; icu= icn) { diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 74f66837b44..488ede5c072 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -2271,7 +2271,7 @@ void what_does_parent(Scene *scene, Object *ob, Object *workob) workob->constraints.first = ob->constraints.first; workob->constraints.last = ob->constraints.last; - strcpy(workob->parsubstr, ob->parsubstr); + BLI_strncpy(workob->parsubstr, ob->parsubstr, sizeof(workob->parsubstr)); where_is_object(scene, workob); } diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 76a6cd8c998..b81b6a79c32 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -997,7 +997,7 @@ int join_armature_exec(bContext *C, wmOperator *UNUSED(op)) static void separated_armature_fix_links(Object *origArm, Object *newArm) { Object *ob; - bPoseChannel *pchan, *pcha, *pchb; + bPoseChannel *pchan; bConstraint *con; ListBase *opchans, *npchans; @@ -1024,38 +1024,23 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm) * - the target isn't origArm/newArm itself * - the target is one that can be found in newArm/origArm */ - if ((ct->tar == origArm) && (ct->subtarget[0] != 0)) { - for (pcha=npchans->first, pchb=npchans->last; pcha && pchb; pcha=pcha->next, pchb=pchb->prev) { - /* check if either one matches */ - if ( (strcmp(pcha->name, ct->subtarget)==0) || - (strcmp(pchb->name, ct->subtarget)==0) ) - { + if (ct->subtarget[0] != 0) { + if (ct->tar == origArm) { + if(BLI_findstring(npchans, ct->subtarget, offsetof(bPoseChannel, name))) { ct->tar= newArm; - break; } - - /* check if both ends have met (to stop checking) */ - if (pcha == pchb) break; - } - } - else if ((ct->tar == newArm) && (ct->subtarget[0] != 0)) { - for (pcha=opchans->first, pchb=opchans->last; pcha && pchb; pcha=pcha->next, pchb=pchb->prev) { - /* check if either one matches */ - if ( (strcmp(pcha->name, ct->subtarget)==0) || - (strcmp(pchb->name, ct->subtarget)==0) ) - { + } + else if (ct->tar == newArm) { + if(BLI_findstring(opchans, ct->subtarget, offsetof(bPoseChannel, name))) { ct->tar= origArm; - break; } - - /* check if both ends have met (to stop checking) */ - if (pcha == pchb) break; - } + } } } - - if (cti->flush_constraint_targets) + + if (cti->flush_constraint_targets) { cti->flush_constraint_targets(con, &targets, 0); + } } } } @@ -1077,58 +1062,33 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm) * - the target isn't origArm/newArm itself * - the target is one that can be found in newArm/origArm */ - if ((ct->tar == origArm) && (ct->subtarget[0] != 0)) { - for (pcha=npchans->first, pchb=npchans->last; pcha && pchb; pcha=pcha->next, pchb=pchb->prev) { - /* check if either one matches */ - if ( (strcmp(pcha->name, ct->subtarget)==0) || - (strcmp(pchb->name, ct->subtarget)==0) ) - { + if(ct->subtarget[0] != '\0') { + if (ct->tar == origArm) { + if(BLI_findstring(npchans, ct->subtarget, offsetof(bPoseChannel, name))) { ct->tar= newArm; - break; } - - /* check if both ends have met (to stop checking) */ - if (pcha == pchb) break; - } - } - else if ((ct->tar == newArm) && (ct->subtarget[0] != 0)) { - for (pcha=opchans->first, pchb=opchans->last; pcha && pchb; pcha=pcha->next, pchb=pchb->prev) { - /* check if either one matches */ - if ( (strcmp(pcha->name, ct->subtarget)==0) || - (strcmp(pchb->name, ct->subtarget)==0) ) - { + } + else if (ct->tar == newArm) { + if(BLI_findstring(opchans, ct->subtarget, offsetof(bPoseChannel, name))) { ct->tar= origArm; - break; } - - /* check if both ends have met (to stop checking) */ - if (pcha == pchb) break; - } + } } } - - if (cti->flush_constraint_targets) + + if (cti->flush_constraint_targets) { cti->flush_constraint_targets(con, &targets, 0); + } } } } /* See if an object is parented to this armature */ - if ((ob->parent) && (ob->parent == origArm)) { + if (ob->parent && (ob->parent == origArm)) { /* Is object parented to a bone of this src armature? */ - if (ob->partype==PARBONE) { - /* bone name in object */ - for (pcha=npchans->first, pchb=npchans->last; pcha && pchb; pcha=pcha->next, pchb=pchb->prev) { - /* check if either one matches */ - if ( (strcmp(pcha->name, ob->parsubstr)==0) || - (strcmp(pchb->name, ob->parsubstr)==0) ) - { - ob->parent= newArm; - break; - } - - /* check if both ends have met (to stop checking) */ - if (pcha == pchb) break; + if ((ob->partype == PARBONE) && (ob->parsubstr[0] != '\0')) { + if(BLI_findstring(npchans, ob->parsubstr, offsetof(bPoseChannel, name))) { + ob->parent= newArm; } } } diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index 85d09d9f5d5..d8bc7510c7b 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -156,7 +156,7 @@ KX_GameObject::~KX_GameObject() } #ifdef WITH_PYTHON if (m_attr_dict) { - PyDict_Clear(m_attr_dict); /* incase of circular refs or other weired cases */ + PyDict_Clear(m_attr_dict); /* incase of circular refs or other weird cases */ /* Py_CLEAR: Py_DECREF's and NULL's */ Py_CLEAR(m_attr_dict); } From 791aa327e1c7d19d0814ab10cc294013b8193aee Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 03:05:19 +0000 Subject: [PATCH 31/88] bugfix where separating the armature would also separate the active-unselected bone because editmode enabled the selection when toggled. --- source/blender/editors/armature/editarmature.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index b81b6a79c32..adfc9ee8113 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -416,7 +416,9 @@ void ED_armature_from_edit(Object *obedit) newBone->flag= eBone->flag; if (eBone == arm->act_edbone) { - newBone->flag |= BONE_SELECTED; /* important, editbones can be active with only 1 point selected */ + /* don't change active selection, this messes up separate which uses + * editmode toggle and can separate active bone which is de-selected originally */ + /* newBone->flag |= BONE_SELECTED; */ /* important, editbones can be active with only 1 point selected */ arm->act_edbone= NULL; arm->act_bone= newBone; } From 37fcffd0ac190dffb03c899d5c9868ac3cfbc52d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 04:11:12 +0000 Subject: [PATCH 32/88] fix [#27006] Apply Scale at a B-Bone Skeleton causes rescale of B-Bones and offset of attached objects --- .../blender/editors/object/object_transform.c | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index e6bb65b1a84..04600080eb8 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -54,6 +54,7 @@ #include "BKE_object.h" #include "BKE_report.h" #include "BKE_multires.h" +#include "BKE_armature.h" #include "RNA_define.h" #include "RNA_access.h" @@ -389,13 +390,6 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); - bArmature *arm; - Mesh *me; - Curve *cu; - Nurb *nu; - BPoint *bp; - BezTriple *bezt; - MVert *mvert; float rsmat[3][3], tmat[3][3], obmat[3][3], iobmat[3][3], mat[4][4], scale; int a, change = 0; @@ -403,28 +397,27 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { if(ob->type==OB_MESH) { - me= ob->data; - - if(ID_REAL_USERS(me) > 1) { + if(ID_REAL_USERS(ob->data) > 1) { BKE_report(reports, RPT_ERROR, "Can't apply to a multi user mesh, doing nothing."); return OPERATOR_CANCELLED; } } else if(ob->type==OB_ARMATURE) { - arm= ob->data; - - if(ID_REAL_USERS(arm) > 1) { + if(ID_REAL_USERS(ob->data) > 1) { BKE_report(reports, RPT_ERROR, "Can't apply to a multi user armature, doing nothing."); return OPERATOR_CANCELLED; } } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) { - cu= ob->data; - - if(ID_REAL_USERS(cu) > 1) { + Curve *cu; + + if(ID_REAL_USERS(ob->data) > 1) { BKE_report(reports, RPT_ERROR, "Can't apply to a multi user curve, doing nothing."); return OPERATOR_CANCELLED; } + + cu= ob->data; + if(!(cu->flag & CU_3D) && (apply_rot || apply_loc)) { BKE_report(reports, RPT_ERROR, "Neither rotation nor location could be applied to a 2d curve, doing nothing."); return OPERATOR_CANCELLED; @@ -477,8 +470,9 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo /* apply to object data */ if(ob->type==OB_MESH) { - me= ob->data; - + Mesh *me= ob->data; + MVert *mvert; + multiresModifier_scale_disp(scene, ob); /* adjust data */ @@ -504,7 +498,11 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo ED_armature_apply_transform(ob, mat); } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) { - cu= ob->data; + Curve *cu= ob->data; + + Nurb *nu; + BPoint *bp; + BezTriple *bezt; scale = mat3_to_scale(rsmat); @@ -539,6 +537,10 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo } where_is_object(scene, ob); + if(ob->type==OB_ARMATURE) { + where_is_pose(scene, ob); /* needed for bone parents */ + } + ignore_parent_tx(bmain, scene, ob); DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA); @@ -864,6 +866,8 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) /* do_inverse_offset= TRUE; */ /* docenter_armature() handles this */ where_is_object(scene, ob); + where_is_pose(scene, ob); /* needed for bone parents */ + ignore_parent_tx(bmain, scene, ob); if(obedit) @@ -880,6 +884,10 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) add_v3_v3(ob->loc, centn); where_is_object(scene, ob); + if(ob->type==OB_ARMATURE) { + where_is_pose(scene, ob); /* needed for bone parents */ + } + ignore_parent_tx(bmain, scene, ob); /* other users? */ @@ -896,6 +904,9 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) add_v3_v3(ob_other->loc, centn); where_is_object(scene, ob_other); + if(ob_other->type==OB_ARMATURE) { + where_is_pose(scene, ob_other); /* needed for bone parents */ + } ignore_parent_tx(bmain, scene, ob_other); } } From b5a2d7f15e2ae60d51c049e56346d058d7c5cb0f Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Wed, 20 Apr 2011 04:55:58 +0000 Subject: [PATCH 33/88] Bugfix for #26795 and #26917, Fix a bug that cause the radar sensor to break Never memset(&ob, 0,sizeof(class)) when there is a constructor, it overrides all memory. The problem was that the memset(0) was setting the scaling to (0,0,0), the height of the cone became 'infinity' so GJK would iterate 'MAX_ITER' without converging due to this #NAN value --- .../Physics/Bullet/CcdPhysicsController.h | 34 ++++++++++++++++++- .../Physics/Bullet/CcdPhysicsEnvironment.cpp | 6 +++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index 00ecc64c41e..97dc65c5850 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -252,8 +252,40 @@ struct CcdConstructionInfo m_inertiaFactor(1.f), m_do_anisotropic(false), m_anisotropicFriction(1.f,1.f,1.f), - m_contactProcessingThreshold(1e10) + m_contactProcessingThreshold(1e10f), + m_soft_linStiff(1.f), + m_soft_angStiff(1.f), + m_soft_volume(1.f), + m_soft_viterations(0), + m_soft_piterations(1), + m_soft_diterations(0), + m_soft_citerations(4), + m_do_fh(false), + m_do_rot_fh(false), + m_fh_spring(0.f), + m_fh_damping(0.f), + m_fh_distance(1.f), + m_fh_normal(false), + m_soft_kVCF(1.f), + m_soft_kDG(0.f), + m_soft_kLF(0.f), + m_soft_kDP(0.f), + m_soft_kPR(0.f), + m_soft_kVC(0.f), + m_soft_kDF(0.2f), + m_soft_kMT(0), + m_soft_kCHR(1.0f), + m_soft_kKHR(0.1f), + m_soft_kSHR(1.0f), + m_soft_kAHR(0.7f), + m_soft_kSRHR_CL(0.1f), + m_soft_kSKHR_CL(1.f), + m_soft_kSSHR_CL(0.5f), + m_soft_kSR_SPLT_CL(0.5f), + m_soft_kSK_SPLT_CL(0.5f), + m_soft_kSS_SPLT_CL(0.5f) { + } btVector3 m_localInertiaTensor; diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index c87157ee993..416cef71067 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -592,6 +592,9 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep,float float subStep = timeStep / float(m_numTimeSubSteps); i = m_dynamicsWorld->stepSimulation(interval,25,subStep);//perform always a full simulation step +//uncomment next line to see where Bullet spend its time (printf in console) +//CProfileManager::dumpAll(); + processFhSprings(curTime,i*subStep); for (it=m_controllers.begin(); it!=m_controllers.end(); it++) @@ -2759,7 +2762,8 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl PHY_IPhysicsController* CcdPhysicsEnvironment::CreateConeController(float coneradius,float coneheight) { CcdConstructionInfo cinfo; - memset(&cinfo, 0, sizeof(cinfo)); /* avoid uninitialized values */ +//don't memset cinfo: this is C++ and values should be set in the constructor! + // we don't need a CcdShapeConstructionInfo for this shape: // it is simple enough for the standard copy constructor (see CcdPhysicsController::GetReplica) cinfo.m_collisionShape = new btConeShape(coneradius,coneheight); From 66f5ac408e168acecbc39ad671103697952d314c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 06:47:16 +0000 Subject: [PATCH 34/88] edit definitions to use const for non modified args, also correct incorrect definition for clip_line_plane(). --- source/blender/blenlib/BLI_math_geom.h | 108 +++++++++--------- source/blender/blenlib/intern/math_geom.c | 103 +++++++++-------- .../blender/blenlib/intern/math_geom_inline.c | 14 +-- 3 files changed, 112 insertions(+), 113 deletions(-) diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h index 3174c65beac..eb69ddc26eb 100644 --- a/source/blender/blenlib/BLI_math_geom.h +++ b/source/blender/blenlib/BLI_math_geom.h @@ -44,8 +44,8 @@ extern "C" { /********************************** Polygons *********************************/ -void cent_tri_v3(float r[3], float a[3], float b[3], float c[3]); -void cent_quad_v3(float r[3], float a[3], float b[3], float c[3], float d[3]); +void cent_tri_v3(float r[3], const float a[3], const float b[3], const float c[3]); +void cent_quad_v3(float r[3], const float a[3], const float b[3], const float c[3], const float d[3]); float normal_tri_v3(float r[3], const float a[3], const float b[3], const float c[3]); float normal_quad_v3(float r[3], const float a[3], const float b[3], const float c[3], const float d[3]); @@ -54,17 +54,17 @@ float area_tri_v2(const float a[2], const float b[2], const float c[2]); float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2]); float area_tri_v3(const float a[3], const float b[3], const float c[3]); float area_quad_v3(const float a[3], const float b[3], const float c[3], const float d[3]); -float area_poly_v3(int nr, float verts[][3], float normal[3]); +float area_poly_v3(int nr, float verts[][3], const float normal[3]); /********************************* Distance **********************************/ -float dist_to_line_v2(float p[2], float l1[2], float l2[2]); -float dist_to_line_segment_v2(float p[2], float l1[2], float l2[2]); +float dist_to_line_v2(const float p[2], const float l1[2], const float l2[2]); +float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]); -float dist_to_line_segment_v3(float p[3], float l1[3], float l2[3]); +float dist_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3]); float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const float l2[3]); float closest_to_line_v2(float r[2], const float p[2], const float l1[2], const float l2[2]); -void closest_to_line_segment_v3(float r[3], float p[3], float l1[3], float l2[3]); +void closest_to_line_segment_v3(float r[3], const float p[3], const float l1[3], const float l2[3]); /******************************* Intersection ********************************/ @@ -78,7 +78,7 @@ void closest_to_line_segment_v3(float r[3], float p[3], float l1[3], float l2[3] int isect_line_line_v2(const float a1[2], const float a2[2], const float b1[2], const float b2[2]); int isect_line_line_v2_short(const short a1[2], const short a2[2], const short b1[2], const short b2[2]); -int isect_seg_seg_v2_point(const float *v1, const float *v2, const float *v3, const float *v4, float vi[2]); +int isect_seg_seg_v2_point(const float v1[2], const float v2[2], const float v3[2], const float v4[2], float vi[2]); /* Returns the number of point of interests * 0 - lines are colinear @@ -92,51 +92,51 @@ int isect_line_line_strict_v3(float v1[3], float v2[3], float v3[3], float v4[3], float vi[3], float *lambda); /* line/ray triangle */ -int isect_line_tri_v3(float p1[3], float p2[3], - float v0[3], float v1[3], float v2[3], float *lambda, float *uv); -int isect_ray_tri_v3(float p1[3], float d[3], - float v0[3], float v1[3], float v2[3], float *lambda, float *uv); -int isect_ray_tri_threshold_v3(float p1[3], float d[3], - float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float threshold); -int isect_ray_tri_epsilon_v3(float p1[3], float d[3], - float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float epsilon); +int isect_line_tri_v3(const float p1[3], const float p2[3], + const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2]); +int isect_ray_tri_v3(const float p1[3], const float d[3], + const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2]); +int isect_ray_tri_threshold_v3(const float p1[3], const float d[3], + const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2], const float threshold); +int isect_ray_tri_epsilon_v3(const float p1[3], const float d[3], + const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2], const float epsilon); /* point in polygon */ -int isect_point_quad_v2(float p[2], float a[2], float b[2], float c[2], float d[2]); +int isect_point_quad_v2(const float p[2], const float a[2], const float b[2], const float c[2], const float d[2]); -int isect_point_tri_v2(float v1[2], float v2[2], float v3[2], float pt[2]); -int isect_point_tri_v2_int(int x1, int y1, int x2, int y2, int a, int b); -int isect_point_tri_prism_v3(float p[3], float v1[3], float v2[3], float v3[3]); +int isect_point_tri_v2(const float v1[2], const float v2[2], const float v3[2], const float pt[2]); +int isect_point_tri_v2_int(const int x1, const int y1, const int x2, const int y2, const int a, const int b); +int isect_point_tri_prism_v3(const float p[3], const float v1[3], const float v2[3], const float v3[3]); -void isect_point_quad_uv_v2(float v0[2], float v1[2], float v2[2], float v3[2], - float pt[2], float *uv); -void isect_point_face_uv_v2(int isquad, float v0[2], float v1[2], float v2[2], - float v3[2], float pt[2], float *uv); +void isect_point_quad_uv_v2(const float v0[2], const float v1[2], const float v2[2], const float v3[2], + const float pt[2], float *uv); +void isect_point_face_uv_v2(const int isquad, const float v0[2], const float v1[2], const float v2[2], + const float v3[2], const float pt[2], float *uv); /* other */ -int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, - float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint); +int isect_sweeping_sphere_tri_v3(const float p1[3], const float p2[3], const float radius, + const float v0[3], const float v1[3], const float v2[3], float *lambda, float ipoint[3]); -int isect_axial_line_tri_v3(int axis, float co1[3], float co2[3], - float v0[3], float v1[3], float v2[3], float *lambda); +int isect_axial_line_tri_v3(const int axis, const float co1[3], const float co2[3], + const float v0[3], const float v1[3], const float v2[3], float *lambda); -int isect_aabb_aabb_v3(float min1[3], float max1[3], float min2[3], float max2[3]); +int isect_aabb_aabb_v3(const float min1[3], const float max1[3], const float min2[3], const float max2[3]); -int clip_line_plane(float clipco[3], float plane[4], float co[3]); +int clip_line_plane(float p1[3], float p2[3], const float plane[4]); -void plot_line_v2v2i(int p1[2], int p2[2], int (*callback)(int, int, void *), void *userData); +void plot_line_v2v2i(const int p1[2], const int p2[2], int (*callback)(int, int, void *), void *userData); /****************************** Interpolation ********************************/ /* tri or quad, d can be NULL */ void interp_weights_face_v3(float w[4], - float a[3], float b[3], float c[3], float d[3], float p[3]); -void interp_weights_poly_v3(float w[], float v[][3], int n, float p[3]); + const float a[3], const float b[3], const float c[3], const float d[3], const float p[3]); +void interp_weights_poly_v3(float w[], float v[][3], const int n, const float p[3]); void interp_cubic_v3(float x[3], float v[3], - float x1[3], float v1[3], float x2[3], float v2[3], float t); + const float x1[3], const float v1[3], const float x2[3], const float v2[3], const float t); -int interp_sparse_array(float *array, int list_size, float invalid); +int interp_sparse_array(float *array, const int list_size, const float invalid); void barycentric_transform(float pt_tar[3], float const pt_src[3], const float tri_tar_p1[3], const float tri_tar_p2[3], const float tri_tar_p3[3], @@ -152,22 +152,22 @@ void lookat_m4(float mat[4][4], float vx, float vy, void polarview_m4(float mat[4][4], float dist, float azimuth, float incidence, float twist); -void perspective_m4(float mat[4][4], float left, float right, - float bottom, float top, float nearClip, float farClip); -void orthographic_m4(float mat[4][4], float left, float right, - float bottom, float top, float nearClip, float farClip); +void perspective_m4(float mat[4][4], const float left, const float right, + const float bottom, const float top, const float nearClip, const float farClip); +void orthographic_m4(float mat[4][4], const float left, const float right, + const float bottom, const float top, const float nearClip, const float farClip); void window_translate_m4(float winmat[][4], float perspmat[][4], - float x, float y); + const float x, const float y); int box_clip_bounds_m4(float boundbox[2][3], - float bounds[4], float winmat[4][4]); + const float bounds[4], float winmat[4][4]); void box_minmax_bounds_m4(float min[3], float max[3], float boundbox[2][3], float mat[4][4]); /********************************** Mapping **********************************/ -void map_to_tube(float *u, float *v, float x, float y, float z); -void map_to_sphere(float *u, float *v, float x, float y, float z); +void map_to_tube(float *u, float *v, const float x, const float y, const float z); +void map_to_sphere(float *u, float *v, const float x, const float y, const float z); /********************************** Normals **********************************/ @@ -182,11 +182,11 @@ typedef struct VertexTangent { float tang[3], uv[2]; } VertexTangent; -float *find_vertex_tangent(VertexTangent *vtang, float *uv); +float *find_vertex_tangent(VertexTangent *vtang, const float uv[2]); void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, - float *tang, float *uv); -void tangent_from_uv(float *uv1, float *uv2, float *uv3, - float *co1, float *co2, float *co3, float *n, float *tang); + const float tang[3], const float uv[2]); +void tangent_from_uv(float uv1[2], float uv2[2], float uv3[2], + float co1[3], float co2[3], float co3[3], float n[3], float tang[3]); /******************************** Vector Clouds ******************************/ @@ -202,14 +202,14 @@ void vcloud_estimate_transform(int list_size, float (*pos)[3], float *weight, 4 = (2,-2), 5 = (2,-1), 6 = (2,0), 7 = (2,1), 8 = (2,2) */ MINLINE void zero_sh(float r[9]); -MINLINE void copy_sh_sh(float r[9], float a[9]); -MINLINE void mul_sh_fl(float r[9], float f); -MINLINE void add_sh_shsh(float r[9], float a[9], float b[9]); +MINLINE void copy_sh_sh(float r[9], const float a[9]); +MINLINE void mul_sh_fl(float r[9], const float f); +MINLINE void add_sh_shsh(float r[9], const float a[9], const float b[9]); -MINLINE float eval_shv3(float r[9], float v[3]); -MINLINE float diffuse_shv3(float r[9], float v[3]); -MINLINE void vec_fac_to_sh(float r[9], float v[3], float f); -MINLINE void madd_sh_shfl(float r[9], float sh[3], float f); +MINLINE float eval_shv3(float r[9], const float v[3]); +MINLINE float diffuse_shv3(float r[9], const float v[3]); +MINLINE void vec_fac_to_sh(float r[9], const float v[3], const float f); +MINLINE void madd_sh_shfl(float r[9], const float sh[3], const float f); /********************************* Form Factor *******************************/ diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 9fa5775c6a1..79c07819ac1 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -41,14 +41,14 @@ /********************************** Polygons *********************************/ -void cent_tri_v3(float *cent, float *v1, float *v2, float *v3) +void cent_tri_v3(float cent[3], const float v1[3], const float v2[3], const float v3[3]) { cent[0]= 0.33333f*(v1[0]+v2[0]+v3[0]); cent[1]= 0.33333f*(v1[1]+v2[1]+v3[1]); cent[2]= 0.33333f*(v1[2]+v2[2]+v3[2]); } -void cent_quad_v3(float *cent, float *v1, float *v2, float *v3, float *v4) +void cent_quad_v3(float cent[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3]) { cent[0]= 0.25f*(v1[0]+v2[0]+v3[0]+v4[0]); cent[1]= 0.25f*(v1[1]+v2[1]+v3[1]+v4[1]); @@ -131,7 +131,7 @@ float area_tri_v3(const float v1[3], const float v2[3], const float v3[3]) /* T return (len/2.0f); } -float area_poly_v3(int nr, float verts[][3], float *normal) +float area_poly_v3(int nr, float verts[][3], const float normal[3]) { float x, y, z, area, max; float *cur, *prev; @@ -165,7 +165,7 @@ float area_poly_v3(int nr, float verts[][3], float *normal) /* distance v1 to line v2-v3 */ /* using Hesse formula, NO LINE PIECE! */ -float dist_to_line_v2(float *v1, float *v2, float *v3) +float dist_to_line_v2(const float v1[2], const float v2[2], const float v3[2]) { float a[2],deler; @@ -179,7 +179,7 @@ float dist_to_line_v2(float *v1, float *v2, float *v3) } /* distance v1 to line-piece v2-v3 */ -float dist_to_line_segment_v2(float *v1, float *v2, float *v3) +float dist_to_line_segment_v2(const float v1[2], const float v2[2], const float v3[2]) { float labda, rc[2], pt[2], len; @@ -208,11 +208,11 @@ float dist_to_line_segment_v2(float *v1, float *v2, float *v3) rc[0]= pt[0]-v1[0]; rc[1]= pt[1]-v1[1]; - return (float)sqrt(rc[0]*rc[0]+ rc[1]*rc[1]); + return sqrtf(rc[0]*rc[0]+ rc[1]*rc[1]); } /* point closest to v1 on line v2-v3 in 3D */ -void closest_to_line_segment_v3(float *closest, float v1[3], float v2[3], float v3[3]) +void closest_to_line_segment_v3(float closest[3], const float v1[3], const float v2[3], const float v3[3]) { float lambda, cp[3]; @@ -227,7 +227,7 @@ void closest_to_line_segment_v3(float *closest, float v1[3], float v2[3], float } /* distance v1 to line-piece v2-v3 in 3D */ -float dist_to_line_segment_v3(float *v1, float *v2, float *v3) +float dist_to_line_segment_v3(const float v1[3], const float v2[3], const float v3[3]) { float closest[3]; @@ -239,7 +239,7 @@ float dist_to_line_segment_v3(float *v1, float *v2, float *v3) /******************************* Intersection ********************************/ /* intersect Line-Line, shorts */ -int isect_line_line_v2_short(const short *v1, const short *v2, const short *v3, const short *v4) +int isect_line_line_v2_short(const short v1[2], const short v2[2], const short v3[2], const short v4[2]) { float div, labda, mu; @@ -258,7 +258,7 @@ int isect_line_line_v2_short(const short *v1, const short *v2, const short *v3, } /* intersect Line-Line, floats */ -int isect_line_line_v2(const float *v1, const float *v2, const float *v3, const float *v4) +int isect_line_line_v2(const float v1[2], const float v2[2], const float v3[2], const float v4[2]) { float div, labda, mu; @@ -279,7 +279,7 @@ int isect_line_line_v2(const float *v1, const float *v2, const float *v3, const /* get intersection point of two 2D segments and return intersection type: -1: colliniar 1: intersection */ -int isect_seg_seg_v2_point(const float *v1, const float *v2, const float *v3, const float *v4, float vi[2]) +int isect_seg_seg_v2_point(const float v1[2], const float v2[2], const float v3[2], const float v4[2], float vi[2]) { float a1, a2, b1, b2, c1, c2, d; float u, v; @@ -354,8 +354,8 @@ int isect_seg_seg_v2_point(const float *v1, const float *v2, const float *v3, co 1: intersection */ -static short IsectLLPt2Df(float x0,float y0,float x1,float y1, - float x2,float y2,float x3,float y3, float *xi,float *yi) +static short IsectLLPt2Df(const float x0, const float y0, const float x1, const float y1, + const float x2, const float y2, const float x3, const float y3, float *xi,float *yi) { /* @@ -405,7 +405,7 @@ static short IsectLLPt2Df(float x0,float y0,float x1,float y1, /* point in tri */ -int isect_point_tri_v2(float pt[2], float v1[2], float v2[2], float v3[2]) +int isect_point_tri_v2(const float pt[2], const float v1[2], const float v2[2], const float v3[2]) { if (line_point_side_v2(v1,v2,pt)>=0.0f) { if (line_point_side_v2(v2,v3,pt)>=0.0f) { @@ -424,7 +424,7 @@ int isect_point_tri_v2(float pt[2], float v1[2], float v2[2], float v3[2]) return 0; } /* point in quad - only convex quads */ -int isect_point_quad_v2(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2]) +int isect_point_quad_v2(const float pt[2], const float v1[2], const float v2[2], const float v3[2], const float v4[2]) { if (line_point_side_v2(v1,v2,pt)>=0.0f) { if (line_point_side_v2(v2,v3,pt)>=0.0f) { @@ -451,7 +451,7 @@ int isect_point_quad_v2(float pt[2], float v1[2], float v2[2], float v3[2], floa test if the line starting at p1 ending at p2 intersects the triangle v0..v2 return non zero if it does */ -int isect_line_tri_v3(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv) +int isect_line_tri_v3(const float p1[3], const float p2[3], const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2]) { float p[3], s[3], d[3], e1[3], e2[3], q[3]; @@ -491,7 +491,7 @@ int isect_line_tri_v3(float p1[3], float p2[3], float v0[3], float v1[3], float test if the ray starting at p1 going in d direction intersects the triangle v0..v2 return non zero if it does */ -int isect_ray_tri_v3(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv) +int isect_ray_tri_v3(const float p1[3], const float d[3], const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2]) { float p[3], s[3], e1[3], e2[3], q[3]; float a, f, u, v; @@ -527,7 +527,7 @@ int isect_ray_tri_v3(float p1[3], float d[3], float v0[3], float v1[3], float v2 return 1; } -int isect_ray_tri_epsilon_v3(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float epsilon) +int isect_ray_tri_epsilon_v3(const float p1[3], const float d[3], const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2], const float epsilon) { float p[3], s[3], e1[3], e2[3], q[3]; float a, f, u, v; @@ -561,7 +561,7 @@ int isect_ray_tri_epsilon_v3(float p1[3], float d[3], float v0[3], float v1[3], return 1; } -int isect_ray_tri_threshold_v3(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float threshold) +int isect_ray_tri_threshold_v3(const float p1[3], const float d[3], const float v0[3], const float v1[3], const float v2[3], float *lambda, float *uv, const float threshold) { float p[3], s[3], e1[3], e2[3], q[3]; float a, f, u, v; @@ -614,7 +614,7 @@ int isect_ray_tri_threshold_v3(float p1[3], float d[3], float v0[3], float v1[3] /* Adapted from the paper by Kasper Fauerby */ /* "Improved Collision detection and Response" */ -static int getLowestRoot(float a, float b, float c, float maxR, float* root) +static int getLowestRoot(const float a, const float b, const float c, const float maxR, float *root) { // Check if a solution exists float determinant = b*b - 4.0f*a*c; @@ -651,7 +651,7 @@ static int getLowestRoot(float a, float b, float c, float maxR, float* root) return 0; } -int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint) +int isect_sweeping_sphere_tri_v3(const float p1[3], const float p2[3], const float radius, const float v0[3], const float v1[3], const float v2[3], float *lambda, float ipoint[3]) { float e1[3], e2[3], e3[3], point[3], vel[3], /*dist[3],*/ nor[3], temp[3], bv[3]; float a, b, c, d, e, x, y, z, radius2=radius*radius; @@ -848,7 +848,7 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v return found_by_sweep; } -int isect_axial_line_tri_v3(int axis, float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda) +int isect_axial_line_tri_v3(const int axis, const float p1[3], const float p2[3], const float v0[3], const float v1[3], const float v2[3], float *lambda) { float p[3], e1[3], e2[3]; float u, v, f; @@ -1014,7 +1014,7 @@ int isect_line_line_strict_v3(float v1[3], float v2[3], float v3[3], float v4[3] } } -int isect_aabb_aabb_v3(float min1[3], float max1[3], float min2[3], float max2[3]) +int isect_aabb_aabb_v3(const float min1[3], const float max1[3], const float min2[3], const float max2[3]) { return (min1[0] (x,v)(t) */ -void interp_cubic_v3(float *x, float *v,float *x1, float *v1, float *x2, float *v2, float t) +void interp_cubic_v3(float x[3], float v[3], const float x1[3], const float v1[3], const float x2[3], const float v2[3], const float t) { float a[3],b[3]; float t2= t*t; @@ -1742,7 +1742,7 @@ void interp_cubic_v3(float *x, float *v,float *x1, float *v1, float *x2, float * /***************************** View & Projection *****************************/ -void orthographic_m4(float matrix[][4],float left, float right, float bottom, float top, float nearClip, float farClip) +void orthographic_m4(float matrix[][4], const float left, const float right, const float bottom, const float top, const float nearClip, const float farClip) { float Xdelta, Ydelta, Zdelta; @@ -1761,7 +1761,7 @@ void orthographic_m4(float matrix[][4],float left, float right, float bottom, fl matrix[3][2] = -(farClip + nearClip)/Zdelta; } -void perspective_m4(float mat[][4],float left, float right, float bottom, float top, float nearClip, float farClip) +void perspective_m4(float mat[][4],float left, const float right, const float bottom, const float top, const float nearClip, const float farClip) { float Xdelta, Ydelta, Zdelta; @@ -1786,7 +1786,7 @@ void perspective_m4(float mat[][4],float left, float right, float bottom, float } /* translate a matrix created by orthographic_m4 or perspective_m4 in XY coords (used to jitter the view) */ -void window_translate_m4(float winmat[][4], float perspmat[][4], float x, float y) +void window_translate_m4(float winmat[][4], float perspmat[][4], const float x, const float y) { if(winmat[2][3] == -1.0f) { /* in the case of a win-matrix, this means perspective always */ @@ -1890,7 +1890,7 @@ void lookat_m4(float mat[][4],float vx, float vy, float vz, float px, float py, translate_m4(mat,-vx,-vy,-vz); /* translate viewpoint to origin */ } -int box_clip_bounds_m4(float boundbox[2][3], float bounds[4], float winmat[4][4]) +int box_clip_bounds_m4(float boundbox[2][3], const float bounds[4], float winmat[4][4]) { float mat[4][4], vec[4]; int a, fl, flag= -1; @@ -1950,7 +1950,7 @@ void box_minmax_bounds_m4(float min[3], float max[3], float boundbox[2][3], floa /********************************** Mapping **********************************/ -void map_to_tube(float *u, float *v,float x, float y, float z) +void map_to_tube(float *u, float *v, const float x, const float y, const float z) { float len; @@ -1963,7 +1963,7 @@ void map_to_tube(float *u, float *v,float x, float y, float z) *v = *u = 0.0f; /* to avoid un-initialized variables */ } -void map_to_sphere(float *u, float *v,float x, float y, float z) +void map_to_sphere(float *u, float *v, const float x, const float y, const float z) { float len; @@ -1971,9 +1971,8 @@ void map_to_sphere(float *u, float *v,float x, float y, float z) if(len > 0.0f) { if(x==0.0f && y==0.0f) *u= 0.0f; /* othwise domain error */ else *u = (1.0f - atan2f(x,y) / (float)M_PI) / 2.0f; - - z/=len; - *v = 1.0f - (float)saacos(z)/(float)M_PI; + + *v = 1.0f - (float)saacos(z/len)/(float)M_PI; } else { *v = *u = 0.0f; /* to avoid un-initialized variables */ } @@ -2033,7 +2032,7 @@ void accumulate_vertex_normals(float n1[3], float n2[3], float n3[3], /* from BKE_mesh.h */ #define STD_UV_CONNECT_LIMIT 0.0001f -void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, float *tang, float *uv) +void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, const float tang[3], const float uv[2]) { VertexTangent *vt; @@ -2056,7 +2055,7 @@ void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, float *tang, *vtang= vt; } -float *find_vertex_tangent(VertexTangent *vtang, float *uv) +float *find_vertex_tangent(VertexTangent *vtang, const float uv[2]) { VertexTangent *vt; static float nulltang[3] = {0.0f, 0.0f, 0.0f}; @@ -2068,7 +2067,7 @@ float *find_vertex_tangent(VertexTangent *vtang, float *uv) return nulltang; /* shouldn't happen, except for nan or so */ } -void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, float *co3, float *n, float *tang) +void tangent_from_uv(float uv1[2], float uv2[2], float uv3[3], float co1[3], float co2[3], float co3[3], float n[3], float tang[3]) { float s1= uv2[0] - uv1[0]; float s2= uv3[0] - uv1[0]; @@ -2262,14 +2261,14 @@ void vcloud_estimate_transform(int list_size, float (*pos)[3], float *weight,flo /******************************* Form Factor *********************************/ -static void vec_add_dir(float r[3], float v1[3], float v2[3], float fac) +static void vec_add_dir(float r[3], const float v1[3], const float v2[3], const float fac) { r[0]= v1[0] + fac*(v2[0] - v1[0]); r[1]= v1[1] + fac*(v2[1] - v1[1]); r[2]= v1[2] + fac*(v2[2] - v1[2]); } -static int ff_visible_quad(float p[3], float n[3], float v0[3], float v1[3], float v2[3], float q0[3], float q1[3], float q2[3], float q3[3]) +static int ff_visible_quad(const float p[3], const float n[3], const float v0[3], const float v1[3], const float v2[3], float q0[3], float q1[3], float q2[3], float q3[3]) { static const float epsilon = 1e-6f; float c, sd[3]; @@ -2628,7 +2627,7 @@ static void ff_normalize(float n[3]) } } -static float ff_quad_form_factor(float *p, float *n, float *q0, float *q1, float *q2, float *q3) +static float ff_quad_form_factor(const float p[3], const float n[3], const float q0[3], const float q1[3], const float q2[3], const float q3[3]) { float r0[3], r1[3], r2[3], r3[3], g0[3], g1[3], g2[3], g3[3]; float a1, a2, a3, a4, dot1, dot2, dot3, dot4, result; diff --git a/source/blender/blenlib/intern/math_geom_inline.c b/source/blender/blenlib/intern/math_geom_inline.c index 48fcbcfe140..41dce131c17 100644 --- a/source/blender/blenlib/intern/math_geom_inline.c +++ b/source/blender/blenlib/intern/math_geom_inline.c @@ -42,12 +42,12 @@ MINLINE void zero_sh(float r[9]) memset(r, 0, sizeof(float)*9); } -MINLINE void copy_sh_sh(float r[9], float a[9]) +MINLINE void copy_sh_sh(float r[9], const float a[9]) { memcpy(r, a, sizeof(float)*9); } -MINLINE void mul_sh_fl(float r[9], float f) +MINLINE void mul_sh_fl(float r[9], const float f) { int i; @@ -55,7 +55,7 @@ MINLINE void mul_sh_fl(float r[9], float f) r[i] *= f; } -MINLINE void add_sh_shsh(float r[9], float a[9], float b[9]) +MINLINE void add_sh_shsh(float r[9], const float a[9], const float b[9]) { int i; @@ -74,7 +74,7 @@ MINLINE float dot_shsh(float a[9], float b[9]) return r; } -MINLINE float diffuse_shv3(float sh[9], float v[3]) +MINLINE float diffuse_shv3(float sh[9], const float v[3]) { /* See formula (13) in: "An Efficient Representation for Irradiance Environment Maps" */ @@ -96,7 +96,7 @@ MINLINE float diffuse_shv3(float sh[9], float v[3]) return sum; } -MINLINE void vec_fac_to_sh(float r[9], float v[3], float f) +MINLINE void vec_fac_to_sh(float r[9], const float v[3], const float f) { /* See formula (3) in: "An Efficient Representation for Irradiance Environment Maps" */ @@ -122,7 +122,7 @@ MINLINE void vec_fac_to_sh(float r[9], float v[3], float f) copy_sh_sh(r, sh); } -MINLINE float eval_shv3(float sh[9], float v[3]) +MINLINE float eval_shv3(float sh[9], const float v[3]) { float tmp[9]; @@ -130,7 +130,7 @@ MINLINE float eval_shv3(float sh[9], float v[3]) return dot_shsh(tmp, sh); } -MINLINE void madd_sh_shfl(float r[9], float sh[3], float f) +MINLINE void madd_sh_shfl(float r[9], const float sh[3], const float f) { float tmp[9]; From 661d6ff7e5f5135c35029e87ce95029449b6c52c Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 20 Apr 2011 07:44:42 +0000 Subject: [PATCH 35/88] Fix #27014: ctrl-A, ctrl-C, ctrl-V breaks formatting of script This bug was caused by tabs->spaces conversion. Change pate-ing logic to paste buffer AS-IS (without any conversions). This commit also fixes undo-ing block deletion which contains tabs when "Tabs as spaces" is toggled on. Also, markes shouldn't be moved after pasteing new buffer. --- source/blender/blenkernel/BKE_text.h | 1 + source/blender/blenkernel/intern/text.c | 44 +++++++++++++++++++++---- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h index a6b98b8ea88..136ce416037 100644 --- a/source/blender/blenkernel/BKE_text.h +++ b/source/blender/blenkernel/BKE_text.h @@ -89,6 +89,7 @@ void txt_split_curline (struct Text *text); void txt_backspace_char (struct Text *text); void txt_backspace_word (struct Text *text); int txt_add_char (struct Text *text, char add); +int txt_add_raw_char (struct Text *text, char add); int txt_replace_char (struct Text *text, char add); void txt_export_to_object (struct Text *text); void txt_export_to_objects(struct Text *text); diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index e7b85ec9b17..5a8106b23e3 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -1348,9 +1348,19 @@ char *txt_sel_to_buf (Text *text) return buf; } +static void txt_shift_markers(Text *text, int lineno, int count) +{ + TextMarker *marker; + + for (marker=text->markers.first; marker; marker= marker->next) + if (marker->lineno>=lineno) { + marker->lineno+= count; + } +} + void txt_insert_buf(Text *text, const char *in_buffer) { - int i=0, l=0, j, u, len; + int i=0, l=0, j, u, len, lineno= -1, count= 0; TextLine *add; if (!text) return; @@ -1365,7 +1375,7 @@ void txt_insert_buf(Text *text, const char *in_buffer) /* Read the first line (or as close as possible */ while (in_buffer[i] && in_buffer[i]!='\n') { - txt_add_char(text, in_buffer[i]); + txt_add_raw_char(text, in_buffer[i]); i++; } @@ -1375,6 +1385,7 @@ void txt_insert_buf(Text *text, const char *in_buffer) /* Read as many full lines as we can */ len= strlen(in_buffer); + lineno= txt_get_span(text->lines.first, text->curl); while (ilines, text->curl, add); i++; + count++; } else { + if(count) { + txt_shift_markers(text, lineno, count); + count= 0; + } + for (j= i-l; jflags & TXT_TABSTOSPACES) { + if (add == '\t' && replace_tabs) { txt_convert_tab_to_spaces(text); return 1; } @@ -2428,6 +2450,16 @@ int txt_add_char (Text *text, char add) return 1; } +int txt_add_char (Text *text, char add) +{ + return txt_add_char_intern(text, add, text->flags & TXT_TABSTOSPACES); +} + +int txt_add_raw_char (Text *text, char add) +{ + return txt_add_char_intern(text, add, 0); +} + void txt_delete_selected(Text *text) { txt_delete_sel(text); From e0a81dd1a836f9191685889b72ab01d12d5619c2 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Wed, 20 Apr 2011 09:41:44 +0000 Subject: [PATCH 36/88] This was causing too many problems. Better to just not enable this for now. There are really many good uses for this anyway. --- source/blender/makesrna/intern/rna_scene.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 0ac310d233b..acb0ffa3be2 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -3201,6 +3201,7 @@ void RNA_def_scene(BlenderRNA *brna) /* Layers */ prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); // this seems to be too much trouble with depsgraph updates/etc. currently (20110420) RNA_def_property_boolean_sdna(prop, NULL, "lay", 1); RNA_def_property_array(prop, 20); RNA_def_property_boolean_funcs(prop, NULL, "rna_Scene_layer_set"); From 0da889dff5515ebd2201874c7272398f5dc156b2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 09:46:45 +0000 Subject: [PATCH 37/88] while looking into [#27057] noticed when the view and the transform center are 0,0,0 it gives NAN values. --- source/blender/editors/transform/transform_constraints.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index 0012334cf92..e5e31a8e319 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -243,7 +243,13 @@ static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3 sub_v3_v3v3(v, i2, v); - sub_v3_v3v3(out, i1, t->con.center); + sub_v3_v3v3(out, i1, t->con.center); + + /* possible some values become nan when + * viewpoint and object are both zero */ + if(!finite(out[0])) out[0]= 0.0f; + if(!finite(out[1])) out[1]= 0.0f; + if(!finite(out[2])) out[2]= 0.0f; } } } From 38a192031ffa1a9183d0a4f1d9bb5e03ebd7e2c3 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 20 Apr 2011 09:49:32 +0000 Subject: [PATCH 38/88] Upgrade for pixel color info in image editor and compositor backdrop. Next to the RGB color values there is now a small rectangle displaying the actual color under the mouse cursor. In addition to that the HSV and luminance values are also displayed. --- .../blender/editors/space_image/image_draw.c | 194 ++++++++++++++--- source/blender/editors/space_node/drawnode.c | 203 +++++++++++++++--- 2 files changed, 343 insertions(+), 54 deletions(-) diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index d76374ec3f4..8030bffae2d 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -45,6 +45,7 @@ #include "PIL_time.h" +#include "BLI_math_color.h" #include "BLI_threads.h" #include "BLI_string.h" #include "BLI_utildefines.h" @@ -135,26 +136,19 @@ static void draw_render_info(Scene *scene, Image *ima, ARegion *ar) void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf) { char str[256]; - int ofs= 0; - - ofs += BLI_snprintf(str + ofs, sizeof(str)-ofs, "X: %4d Y: %4d ", x, y); - if(cp) - ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %3d G: %3d B: %3d A: %3d ", cp[0], cp[1], cp[2], cp[3]); - - if(fp) { - if(channels==4) - ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %.4f G: %.4f B: %.4f A: %.4f ", fp[0], fp[1], fp[2], fp[3]); - else if(channels==1) - ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Val: %.4f ", fp[0]); - else if(channels==3) - ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %.4f G: %.4f B: %.4f ", fp[0], fp[1], fp[2]); - } - - if(zp) - ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Z: %.4f ", 0.5f+0.5f*(((float)*zp)/(float)0x7fffffff)); - if(zpf) - ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Z: %.3f ", *zpf); - (void)ofs; /* quiet clang */ + float dx= 6; + /* text colors */ + /* XXX colored text not allowed in Blender UI */ + #if 0 + unsigned char red[3] = {255, 50, 50}; + unsigned char green[3] = {0, 255, 0}; + unsigned char blue[3] = {100, 100, 255}; + #else + unsigned char red[3] = {255, 255, 255}; + unsigned char green[3] = {255, 255, 255}; + unsigned char blue[3] = {255, 255, 255}; + #endif + float hue=0, sat=0, val=0, lum=0, u=0, v=0; glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); @@ -163,14 +157,164 @@ void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *f glColor4ub(0, 0, 0, 190); glRecti(0.0, 0.0, ar->winrct.xmax - ar->winrct.xmin + 1, 20); glDisable(GL_BLEND); - - glColor3ub(255, 255, 255); - - // UI_DrawString(6, 6, str); // works ok but fixed width is nicer. + BLF_size(blf_mono_font, 11, 72); - BLF_position(blf_mono_font, 6, 6, 0); + + glColor3ub(255, 255, 255); + sprintf(str, "X:%-4d Y:%-4d |", x, y); + // UI_DrawString(6, 6, str); // works ok but fixed width is nicer. + BLF_position(blf_mono_font, dx, 6, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + if(zp) { + glColor3ub(255, 255, 255); + sprintf(str, " Z:%-.4f |", 0.5f+0.5f*(((float)*zp)/(float)0x7fffffff)); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + } + if(zpf) { + glColor3ub(255, 255, 255); + sprintf(str, " Z:%-.3f |", *zpf); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + } + + if(channels >= 3) { + glColor3ubv(red); + if (fp) + sprintf(str, " R:%-.4f", fp[0]); + else if (cp) + sprintf(str, " R:%-3d", cp[0]); + else + sprintf(str, " R:-"); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + glColor3ubv(green); + if (fp) + sprintf(str, " G:%-.4f", fp[1]); + else if (cp) + sprintf(str, " G:%-3d", cp[1]); + else + sprintf(str, " G:-"); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + glColor3ubv(blue); + if (fp) + sprintf(str, " B:%-.4f", fp[2]); + else if (cp) + sprintf(str, " B:%-3d", cp[2]); + else + sprintf(str, " B:-"); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + if(channels == 4) { + glColor3ub(255, 255, 255); + if (fp) + sprintf(str, " A:%-.4f", fp[3]); + else if (cp) + sprintf(str, " A:%-3d", cp[3]); + else + sprintf(str, "- "); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + } + } + glDisable(GL_BLEND); + if (channels==1) { + if (fp) + glColor3f(fp[0], fp[0], fp[0]); + else if (cp) + glColor3ub(cp[0], cp[0], cp[0]); + else + glColor3ub(0, 0, 0); + } + else if (channels==3) { + if (fp) + glColor3fv(fp); + else if (cp) + glColor3ub(cp[0], cp[1], cp[2]); + else + glColor3ub(0, 0, 0); + } + else if (channels==4) { + if (fp) + glColor4fv(fp); + else if (cp) + glColor4ub(cp[0], cp[1], cp[2], cp[3]); + else + glColor3ub(0, 0, 0); + } + dx += 5; + glBegin(GL_QUADS); + glVertex2f(dx, 3); + glVertex2f(dx, 17); + glVertex2f(dx+30, 17); + glVertex2f(dx+30, 3); + glEnd(); + dx += 35; + + glColor3ub(255, 255, 255); + if(channels == 1) { + if (fp) { + rgb_to_hsv(fp[0], fp[0], fp[0], &hue, &sat, &val); + rgb_to_yuv(fp[0], fp[0], fp[0], &lum, &u, &v); + } + else if (cp) { + rgb_to_hsv((float)cp[0]/255.0f, (float)cp[0]/255.0f, (float)cp[0]/255.0f, &hue, &sat, &val); + rgb_to_yuv((float)cp[0]/255.0f, (float)cp[0]/255.0f, (float)cp[0]/255.0f, &lum, &u, &v); + } + + sprintf(str, "V:%-.4f", val); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + sprintf(str, " L:%-.4f", lum); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + } + else if(channels >= 3) { + if (fp) { + rgb_to_hsv(fp[0], fp[1], fp[2], &hue, &sat, &val); + rgb_to_yuv(fp[0], fp[1], fp[2], &lum, &u, &v); + } + else if (cp) { + rgb_to_hsv((float)cp[0]/255.0f, (float)cp[1]/255.0f, (float)cp[2]/255.0f, &hue, &sat, &val); + rgb_to_yuv((float)cp[0]/255.0f, (float)cp[1]/255.0f, (float)cp[2]/255.0f, &lum, &u, &v); + } + + sprintf(str, "H:%-.4f", hue); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + sprintf(str, " S:%-.4f", sat); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + sprintf(str, " V:%-.4f", val); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + sprintf(str, " L:%-.4f", lum); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + } } /* image drawing */ diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index ba15e47ba04..db6e4640d5f 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1445,42 +1445,187 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage) void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp) { char str[256]; - int ofs; - - ofs= sprintf(str, "X: %4d Y: %4d ", x, y); - - if(channels==4) { - if(cp) - ofs+= sprintf(str+ofs, "| R: %3d G: %3d B: %3d A: %3d ", cp[0], cp[1], cp[2], cp[3]); - if (fp) - ofs+= sprintf(str+ofs, "| R: %.4f G: %.4f B: %.4f A: %.4f ", fp[0], fp[1], fp[2], fp[3]); - } - else if(channels==1) { - if(cp) - ofs+= sprintf(str+ofs, "| Val: %3d ", cp[0]); - if (fp) - ofs+= sprintf(str+ofs, "| Val: %.4f ", fp[0]); - } - else if(channels==3) { - if(cp) - ofs+= sprintf(str+ofs, "| R: %3d G: %3d B: %3d ", cp[0], cp[1], cp[2]); - if (fp) - ofs+= sprintf(str+ofs, "| R: %.4f G: %.4f B: %.4f ", fp[0], fp[1], fp[2]); - } + float dx= 6; + /* text colors */ + /* XXX colored text not allowed in Blender UI */ + #if 0 + unsigned char red[3] = {255, 50, 50}; + unsigned char green[3] = {0, 255, 0}; + unsigned char blue[3] = {100, 100, 255}; + #else + unsigned char red[3] = {255, 255, 255}; + unsigned char green[3] = {255, 255, 255}; + unsigned char blue[3] = {255, 255, 255}; + #endif + float hue=0, sat=0, val=0, lum=0, u=0, v=0; glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); - - glColor4f(.0,.0,.0,.25); + + /* noisy, high contrast make impossible to read if lower alpha is used. */ + glColor4ub(0, 0, 0, 190); glRecti(0.0, 0.0, ar->winrct.xmax - ar->winrct.xmin + 1, 20); glDisable(GL_BLEND); - - glColor3ub(255, 255, 255); - - // UI_DrawString(6, 6, str); // works ok but fixed width is nicer. + BLF_size(blf_mono_font, 11, 72); - BLF_position(blf_mono_font, 6, 6, 0); + + glColor3ub(255, 255, 255); + sprintf(str, "X:%-4d Y:%-4d |", x, y); + // UI_DrawString(6, 6, str); // works ok but fixed width is nicer. + BLF_position(blf_mono_font, dx, 6, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + #if 0 /* XXX no Z value in compo backdrop atm */ + if(zp) { + glColor3ub(255, 255, 255); + sprintf(str, " Z:%-.4f |", 0.5f+0.5f*(((float)*zp)/(float)0x7fffffff)); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + } + if(zpf) { + glColor3ub(255, 255, 255); + sprintf(str, " Z:%-.3f |", *zpf); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + } + #endif + + if(channels >= 3) { + glColor3ubv(red); + if (fp) + sprintf(str, " R:%-.4f", fp[0]); + else if (cp) + sprintf(str, " R:%-3d", cp[0]); + else + sprintf(str, " R:-"); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + glColor3ubv(green); + if (fp) + sprintf(str, " G:%-.4f", fp[1]); + else if (cp) + sprintf(str, " G:%-3d", cp[1]); + else + sprintf(str, " G:-"); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + glColor3ubv(blue); + if (fp) + sprintf(str, " B:%-.4f", fp[2]); + else if (cp) + sprintf(str, " B:%-3d", cp[2]); + else + sprintf(str, " B:-"); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + if(channels == 4) { + glColor3ub(255, 255, 255); + if (fp) + sprintf(str, " A:%-.4f", fp[3]); + else if (cp) + sprintf(str, " A:%-3d", cp[3]); + else + sprintf(str, "- "); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + } + } + + glDisable(GL_BLEND); + if (channels==1) { + if (fp) + glColor3f(fp[0], fp[0], fp[0]); + else if (cp) + glColor3ub(cp[0], cp[0], cp[0]); + else + glColor3ub(0, 0, 0); + } + else if (channels==3) { + if (fp) + glColor3fv(fp); + else if (cp) + glColor3ub(cp[0], cp[1], cp[2]); + else + glColor3ub(0, 0, 0); + } + else if (channels==4) { + if (fp) + glColor4fv(fp); + else if (cp) + glColor4ub(cp[0], cp[1], cp[2], cp[3]); + else + glColor3ub(0, 0, 0); + } + dx += 5; + glBegin(GL_QUADS); + glVertex2f(dx, 3); + glVertex2f(dx, 17); + glVertex2f(dx+30, 17); + glVertex2f(dx+30, 3); + glEnd(); + dx += 35; + + glColor3ub(255, 255, 255); + if(channels == 1) { + if (fp) { + rgb_to_hsv(fp[0], fp[0], fp[0], &hue, &sat, &val); + rgb_to_yuv(fp[0], fp[0], fp[0], &lum, &u, &v); + } + else if (cp) { + rgb_to_hsv((float)cp[0]/255.0f, (float)cp[0]/255.0f, (float)cp[0]/255.0f, &hue, &sat, &val); + rgb_to_yuv((float)cp[0]/255.0f, (float)cp[0]/255.0f, (float)cp[0]/255.0f, &lum, &u, &v); + } + + sprintf(str, "V:%-.4f", val); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + sprintf(str, " L:%-.4f", lum); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + } + else if(channels >= 3) { + if (fp) { + rgb_to_hsv(fp[0], fp[1], fp[2], &hue, &sat, &val); + rgb_to_yuv(fp[0], fp[1], fp[2], &lum, &u, &v); + } + else if (cp) { + rgb_to_hsv((float)cp[0]/255.0f, (float)cp[1]/255.0f, (float)cp[2]/255.0f, &hue, &sat, &val); + rgb_to_yuv((float)cp[0]/255.0f, (float)cp[1]/255.0f, (float)cp[2]/255.0f, &lum, &u, &v); + } + + sprintf(str, "H:%-.4f", hue); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + sprintf(str, " S:%-.4f", sat); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + sprintf(str, " V:%-.4f", val); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + + sprintf(str, " L:%-.4f", lum); + BLF_position(blf_mono_font, dx, 6, 0); + BLF_draw_ascii(blf_mono_font, str, sizeof(str)); + dx += BLF_width(blf_mono_font, str); + } } #if 0 From a4ebe848d93af22956386a980febb9726b654f0e Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Wed, 20 Apr 2011 10:10:07 +0000 Subject: [PATCH 39/88] Bugfix [#27054] 2.57 icons and buttons aren't perfectly centered This seems to make things look a bit better. What a difference 1px makes... --- source/blender/editors/screen/area.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 5a80799fc3b..1882d849116 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -1457,7 +1457,7 @@ void ED_region_header(const bContext *C, ARegion *ar) UI_view2d_view_ortho(&ar->v2d); xco= maxco= 8; - yco= HEADERY-3; + yco= HEADERY-4; /* draw all headers types */ for(ht= ar->type->headertypes.first; ht; ht= ht->next) { From 141be02c90cbdb2f1d8cd2702ea79e3b3e9590f7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 10:50:56 +0000 Subject: [PATCH 40/88] tested with a very large blend file 600mb. - from [#27002]. without this check the file took 4m, 40sec to load, with the check it takes ~3.3sec. --- source/blender/blenloader/intern/readfile.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index a87d993bc15..1673cbf8458 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -290,6 +290,8 @@ static void *oldnewmap_lookup_and_inc(OldNewMap *onm, void *addr) { int i; + if(addr==NULL) return NULL; + if (onm->lasthitnentries-1) { OldNew *entry= &onm->entries[++onm->lasthit]; From 069a3c193c19842d126579e22237da3880333ac5 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Wed, 20 Apr 2011 11:15:58 +0000 Subject: [PATCH 41/88] Bugfix #27058 Top bar: Add -> Mesh -> UV Sphere + Enter crashed. It didn't crash with leftmouse, but that was coincidentally working. Menus were freeing modal handlers in Window, while handlers were still in use. Fix provides to tag handlers for being freed now. Will add on my attention list for more elaborate checking work here, for upcoming 2.57a I rather stick to minimal change in code here. --- .../editors/interface/interface_handlers.c | 6 ++-- .../editors/interface/interface_panel.c | 2 +- source/blender/windowmanager/WM_api.h | 2 +- .../windowmanager/intern/wm_event_system.c | 29 +++++++++++++++---- .../blender/windowmanager/wm_event_system.h | 2 ++ 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index d3aa5bc9132..cf11effc57b 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -4898,7 +4898,7 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s } else { if(button_modal_state(data->state)) - WM_event_remove_ui_handler(&data->window->modalhandlers, ui_handler_region_menu, NULL, data); + WM_event_remove_ui_handler(&data->window->modalhandlers, ui_handler_region_menu, NULL, data, 1); /* 1 = postpone free */ } } @@ -6154,7 +6154,7 @@ static void ui_handler_remove_popup(bContext *C, void *userdata) void UI_add_region_handlers(ListBase *handlers) { - WM_event_remove_ui_handler(handlers, ui_handler_region, ui_handler_remove_region, NULL); + WM_event_remove_ui_handler(handlers, ui_handler_region, ui_handler_remove_region, NULL, 0); WM_event_add_ui_handler(NULL, handlers, ui_handler_region, ui_handler_remove_region, NULL); } @@ -6165,7 +6165,7 @@ void UI_add_popup_handlers(bContext *C, ListBase *handlers, uiPopupBlockHandle * void UI_remove_popup_handlers(ListBase *handlers, uiPopupBlockHandle *popup) { - WM_event_remove_ui_handler(handlers, ui_handler_popup, ui_handler_remove_popup, popup); + WM_event_remove_ui_handler(handlers, ui_handler_popup, ui_handler_remove_popup, popup, 0); } diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index b47194ba1b4..6677f2b1bae 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -1211,7 +1211,7 @@ static void panel_activate_state(const bContext *C, Panel *pa, uiHandlePanelStat MEM_freeN(data); pa->activedata= NULL; - WM_event_remove_ui_handler(&win->modalhandlers, ui_handler_panel, ui_handler_remove_panel, pa); + WM_event_remove_ui_handler(&win->modalhandlers, ui_handler_panel, ui_handler_remove_panel, pa, 0); } else { if(!data) { diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index dafa05fd974..1b4fff8cd13 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -173,7 +173,7 @@ struct wmEventHandler *WM_event_add_ui_handler(const struct bContext *C, ListBas void (*remove)(struct bContext *C, void *userdata), void *userdata); void WM_event_remove_ui_handler(ListBase *handlers, int (*func)(struct bContext *C, struct wmEvent *event, void *userdata), - void (*remove)(struct bContext *C, void *userdata), void *userdata); + void (*remove)(struct bContext *C, void *userdata), void *userdata, int postpone); void WM_event_remove_area_handler(struct ListBase *handlers, void *area); struct wmEventHandler *WM_event_add_modal_handler(struct bContext *C, struct wmOperator *op); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 2b74d35d59e..c9e2567a45b 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1452,10 +1452,13 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) /* modal handlers can get removed in this loop, we keep the loop this way */ for(handler= handlers->first; handler; handler= nexthandler) { + nexthandler= handler->next; - - /* optional boundbox */ - if(handler_boundbox_test(handler, event)) { + + /* during this loop, ui handlers for nested menus can tag multiple handlers free */ + if(handler->flag & WM_HANDLER_DO_FREE); + /* optional boundbox */ + else if(handler_boundbox_test(handler, event)) { /* in advance to avoid access to freed event on window close */ always_pass= wm_event_always_pass(event); @@ -1534,6 +1537,13 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) } } + /* modal ui handler can be tagged to be freed */ + if(handler->flag & WM_HANDLER_DO_FREE) { + BLI_remlink(handlers, handler); + wm_event_free_handler(handler); + } + + /* XXX fileread case */ if(CTX_wm_window(C)==NULL) return action; @@ -2067,14 +2077,21 @@ wmEventHandler *WM_event_add_ui_handler(const bContext *C, ListBase *handlers, w return handler; } -void WM_event_remove_ui_handler(ListBase *handlers, wmUIHandlerFunc func, wmUIHandlerRemoveFunc remove, void *userdata) +/* set "postpone" for win->modalhandlers, this is in a running for() loop in wm_handlers_do() */ +void WM_event_remove_ui_handler(ListBase *handlers, wmUIHandlerFunc func, wmUIHandlerRemoveFunc remove, void *userdata, int postpone) { wmEventHandler *handler; for(handler= handlers->first; handler; handler= handler->next) { if(handler->ui_handle == func && handler->ui_remove == remove && handler->ui_userdata == userdata) { - BLI_remlink(handlers, handler); - wm_event_free_handler(handler); + /* handlers will be freed in wm_handlers_do() */ + if(postpone) { + handler->flag |= WM_HANDLER_DO_FREE; + } + else { + BLI_remlink(handlers, handler); + wm_event_free_handler(handler); + } break; } } diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index 6ad9d1daede..cd110d3bc1a 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -78,6 +78,8 @@ typedef struct wmEventHandler { /* handler flag */ /* after this handler all others are ignored */ #define WM_HANDLER_BLOCKING 1 + /* handler tagged to be freed in wm_handlers_do() */ +#define WM_HANDLER_DO_FREE 2 From 01fced7e3545dbc379ef470973415eed2993a014 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Wed, 20 Apr 2011 12:04:07 +0000 Subject: [PATCH 42/88] Fix [#26884] Console is not hidden when start blender reported by Michael R Don't print the error message, as it isn't very useful. If there is no Quicktime in Blender GUI in a build that has support enabled, it means that the user hasn't installed Quicktime. --- source/blender/quicktime/apple/quicktime_import.c | 1 - 1 file changed, 1 deletion(-) diff --git a/source/blender/quicktime/apple/quicktime_import.c b/source/blender/quicktime/apple/quicktime_import.c index 192fd3c4332..2f8cf242697 100644 --- a/source/blender/quicktime/apple/quicktime_import.c +++ b/source/blender/quicktime/apple/quicktime_import.c @@ -101,7 +101,6 @@ void quicktime_init(void) nerr = InitializeQTML(0); if (nerr != noErr) { G.have_quicktime = FALSE; - printf("Error initializing quicktime\n"); } else G.have_quicktime = TRUE; From 7a7df3bfe821ab5faafa12094713f215440d555e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 12:06:23 +0000 Subject: [PATCH 43/88] avoid calling newdataadr() on NULL vertex groups, gives a small speedup on loading with files that have many empty groups. --- source/blender/blenloader/intern/readfile.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 1673cbf8458..93d266668e2 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3412,15 +3412,19 @@ static void lib_link_mesh(FileData *fd, Main *main) static void direct_link_dverts(FileData *fd, int count, MDeformVert *mdverts) { - int i; + int i; - if (!mdverts) + if (mdverts == NULL) { return; + } - for (i=0; i 0; i--, mdverts++) { + if(mdverts->dw) { + mdverts->dw= newdataadr(fd, mdverts->dw); + } + if (mdverts->dw == NULL) { + mdverts->totweight= 0; + } } } From 85480f320fd4c58301f4de50eb9ef5e386371690 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Wed, 20 Apr 2011 12:30:13 +0000 Subject: [PATCH 44/88] Bugfix #27044 Enter or exit localview changes bitflags (layers) in Objects, and should get an undo push for that reason. --- source/blender/editors/space_view3d/view3d_view.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index f98b2dc934f..c97833aea4b 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -1670,6 +1670,7 @@ void VIEW3D_OT_localview(wmOperatorType *ot) /* api callbacks */ ot->exec= localview_exec; + ot->flag= OPTYPE_UNDO; /* localview changes object layer bitflags */ ot->poll= ED_operator_view3d_active; } From 7e3d044bdd398c712bd65094b0f1d444580e8011 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 12:55:42 +0000 Subject: [PATCH 45/88] fix [#27072] Calling bpy.utils.blend_paths(True) results in segmantaion fault since 2.56 --- source/blender/python/intern/bpy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c index c10340f6ff9..7a7fd2b23b6 100644 --- a/source/blender/python/intern/bpy.c +++ b/source/blender/python/intern/bpy.c @@ -46,7 +46,7 @@ #include "BLI_bpath.h" #include "BLI_utildefines.h" - +#include "BKE_main.h" #include "BKE_global.h" /* XXX, G.main only */ #include "BKE_blender.h" @@ -111,7 +111,7 @@ static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObjec list= PyList_New(0); - for(BLI_bpathIterator_init(&bpi, G.main, NULL, 0); !BLI_bpathIterator_isDone(bpi); BLI_bpathIterator_step(bpi)) { + for(BLI_bpathIterator_init(&bpi, G.main, G.main->name, 0); !BLI_bpathIterator_isDone(bpi); BLI_bpathIterator_step(bpi)) { /* build the list */ if (absolute) { BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded); From 8a7dce5301f5448dd3c754d42acddd8f2b556615 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 14:47:00 +0000 Subject: [PATCH 46/88] update tooltip since this fixes paths from newer versions. --- release/scripts/startup/bl_operators/animsys_update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_operators/animsys_update.py b/release/scripts/startup/bl_operators/animsys_update.py index 8fa7d5cd93e..63d438a5066 100644 --- a/release/scripts/startup/bl_operators/animsys_update.py +++ b/release/scripts/startup/bl_operators/animsys_update.py @@ -689,7 +689,7 @@ import bpy class UpdateAnimData(bpy.types.Operator): - '''Update data paths from 2.53 to edited data paths of drivers and fcurves''' + """Update data paths from 2.56 and previous versions, modifying data paths of drivers and fcurves""" bl_idname = "anim.update_data_paths" bl_label = "Update Animation Data" From 5bd110c6baca4ec080190967a9503121eaef541e Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Wed, 20 Apr 2011 16:19:49 +0000 Subject: [PATCH 47/88] Bugfix #27026 Outliner objects showed "active" or "selected" in confusing ways. Now the display is simply binary, and more in line with how other items in outliner draw: - text is white = item is active - color circle behind icon: shows selection state --- .../blender/editors/space_outliner/outliner.c | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 8fdd62f7412..fce9c883c84 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -4667,16 +4667,24 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene Object *ob= (Object *)tselem->id; if(ob==OBACT || (ob->flag & SELECT)) { - char col[4]; + char col[4]= {0, 0, 0, 0}; - active= 2; + /* outliner active ob: always white text, circle color now similar to view3d */ + + active= 2; /* means it draws a color circle */ if(ob==OBACT) { - UI_GetThemeColorType4ubv(TH_ACTIVE, SPACE_VIEW3D, col); - /* so black text is drawn when active and not selected */ - if (ob->flag & SELECT) active= 1; + if(ob->flag & SELECT) { + UI_GetThemeColorType4ubv(TH_ACTIVE, SPACE_VIEW3D, col); + col[3]= 100; + } + + active= 1; /* means it draws white text */ } - else UI_GetThemeColorType4ubv(TH_SELECT, SPACE_VIEW3D, col); - col[3]= 100; + else if(ob->flag & SELECT) { + UI_GetThemeColorType4ubv(TH_SELECT, SPACE_VIEW3D, col); + col[3]= 100; + } + glColor4ubv((GLubyte *)col); } From 66b605ec933a2d53f5a7596328fac8baed86a3e4 Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Wed, 20 Apr 2011 17:15:33 +0000 Subject: [PATCH 48/88] Fix for [#27075] Explode Modifier - Apply as Shape impossible * Explode modifier was flagged as "nonconstructive", so the "apply as shape" option was shown. And yes I know exploding things probably isn't usually considered as very constructive, but.. :P --- source/blender/modifiers/intern/MOD_explode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c index 924035538da..00ab5d027fb 100644 --- a/source/blender/modifiers/intern/MOD_explode.c +++ b/source/blender/modifiers/intern/MOD_explode.c @@ -1019,7 +1019,7 @@ ModifierTypeInfo modifierType_Explode = { /* name */ "Explode", /* structName */ "ExplodeModifierData", /* structSize */ sizeof(ExplodeModifierData), - /* type */ eModifierTypeType_Nonconstructive, + /* type */ eModifierTypeType_Constructive, /* flags */ eModifierTypeFlag_AcceptsMesh, /* copyData */ copyData, /* deformVerts */ NULL, From 290a641c32dd00317df0a8fc0075e54c3c356f2f Mon Sep 17 00:00:00 2001 From: Janne Karhu Date: Wed, 20 Apr 2011 17:51:56 +0000 Subject: [PATCH 49/88] Bug fix: "make fur" gave errors with multiple selected objects. * Also some code changes for "make smoke" and "make fluid" to suppress some python messages that were printed to the console. --- .../bl_operators/object_quick_effects.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py index 94074a52cd6..21640fa3ee6 100644 --- a/release/scripts/startup/bl_operators/object_quick_effects.py +++ b/release/scripts/startup/bl_operators/object_quick_effects.py @@ -55,7 +55,7 @@ class MakeFur(bpy.types.Operator): mat.strand.blend_distance = 0.5 for obj in mesh_objects: - fake_context["active_object"] = obj + fake_context["object"] = obj bpy.ops.object.particle_system_add(fake_context) psys = obj.particle_systems[-1] @@ -110,6 +110,7 @@ class MakeSmoke(bpy.types.Operator): default=False) def execute(self, context): + fake_context = bpy.context.copy() mesh_objects = [obj for obj in context.selected_objects if obj.type == 'MESH'] min_co = Vector((100000, 100000, 100000)) max_co = Vector((-100000, -100000, -100000)) @@ -119,8 +120,9 @@ class MakeSmoke(bpy.types.Operator): return {'CANCELLED'} for obj in mesh_objects: + fake_context["object"] = obj # make each selected object a smoke flow - bpy.ops.object.modifier_add({"object": obj}, type='SMOKE') + bpy.ops.object.modifier_add(fake_context, type='SMOKE') obj.modifiers[-1].smoke_type = 'FLOW' psys = obj.particle_systems[-1] @@ -153,7 +155,7 @@ class MakeSmoke(bpy.types.Operator): obj.scale = 0.5 * (max_co - min_co) + Vector((1.0, 1.0, 2.0)) # setup smoke domain - bpy.ops.object.modifier_add({"object": obj}, type='SMOKE') + bpy.ops.object.modifier_add(type='SMOKE') obj.modifiers[-1].smoke_type = 'DOMAIN' if self.style == 'FIRE': obj.modifiers[-1].domain_settings.use_dissolve_smoke = True @@ -161,7 +163,7 @@ class MakeSmoke(bpy.types.Operator): obj.modifiers[-1].domain_settings.use_high_resolution = True # create a volume material with a voxel data texture for the domain - bpy.ops.object.material_slot_add({"object": obj}) + bpy.ops.object.material_slot_add() mat = bpy.data.materials.new("Smoke Domain Material") obj.material_slots[0].material = mat @@ -224,6 +226,7 @@ class MakeFluid(bpy.types.Operator): default=False) def execute(self, context): + fake_context = bpy.context.copy() mesh_objects = [obj for obj in context.selected_objects if (obj.type == 'MESH' and not 0 in obj.dimensions)] min_co = Vector((100000, 100000, 100000)) max_co = Vector((-100000, -100000, -100000)) @@ -233,8 +236,9 @@ class MakeFluid(bpy.types.Operator): return {'CANCELLED'} for obj in mesh_objects: + fake_context["object"] = obj # make each selected object a fluid - bpy.ops.object.modifier_add({"object": obj}, type='FLUID_SIMULATION') + bpy.ops.object.modifier_add(fake_context, type='FLUID_SIMULATION') # fluid has to be before constructive modifiers, so it might not be the last modifier for mod in obj.modifiers: @@ -266,14 +270,14 @@ class MakeFluid(bpy.types.Operator): obj.scale = 0.5 * (max_co - min_co) + Vector((1.0, 1.0, 2.0)) + Vector((abs(v[0]), abs(v[1]), abs(v[2]))) # setup smoke domain - bpy.ops.object.modifier_add({"object": obj}, type='FLUID_SIMULATION') + bpy.ops.object.modifier_add(type='FLUID_SIMULATION') obj.modifiers[-1].settings.type = 'DOMAIN' # make the domain smooth so it renders nicely bpy.ops.object.shade_smooth() # create a ray-transparent material for the domain - bpy.ops.object.material_slot_add({"object": obj}) + bpy.ops.object.material_slot_add() mat = bpy.data.materials.new("Fluid Domain Material") obj.material_slots[0].material = mat From a6c2d8680bd0288d00cc4728e67535a69e8fccfa Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 20 Apr 2011 20:31:43 +0000 Subject: [PATCH 50/88] Internal need_exec tagging for group nodes, fixes #27034. Non-compositor node trees (texture and material) only use the need_exec flag to exclude cyclic dependencies, ugly double use of that flag. Oh well, hopefully can replace this altogether one day ;) --- source/blender/blenkernel/intern/node.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 272df18c73d..18268d72609 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -2235,6 +2235,10 @@ static void group_tag_used_outputs(bNode *gnode, bNodeStack *stack, bNodeStack * if (ns) ns->sockettype = sock->type; } + + /* non-composite trees do all nodes by default */ + if (ntree->type!=NTREE_COMPOSIT) + node->need_exec = 1; } } @@ -2320,7 +2324,7 @@ void ntreeBeginExecTree(bNodeTree *ntree) for(node= ntree->nodes.first; node; node= node->next) { bNodeSocket *sock; - /* composite has own need_exec tag handling */ + /* non-composite trees do all nodes by default */ if(ntree->type!=NTREE_COMPOSIT) node->need_exec= 1; From 2d9c94604a375505f076da157875afc4186be35f Mon Sep 17 00:00:00 2001 From: Andrea Weikert Date: Wed, 20 Apr 2011 20:46:02 +0000 Subject: [PATCH 51/88] fix crash with lots of operators when running "blender -d". Easy case to reproduce, just try to delete default cube. Temporary hack to prevent crasher, likely caused by rev. 36242. --- .../blender/windowmanager/intern/wm_event_system.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index c9e2567a45b..b2ed914ea2b 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1538,12 +1538,19 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) } /* modal ui handler can be tagged to be freed */ + /* XXX TODO - handler was free'd in wm_handler_ui_call + and memory could be written to in BLI_remlink. + As temporary solution preventing this by + making sure handler is still in the list. + */ + if(handler->flag & WM_HANDLER_DO_FREE) { - BLI_remlink(handlers, handler); - wm_event_free_handler(handler); + if (BLI_findindex(handlers, handler) >= 0) { + BLI_remlink(handlers, handler); + wm_event_free_handler(handler); + } } - /* XXX fileread case */ if(CTX_wm_window(C)==NULL) return action; From 831cc31482aa3dc7293ea131d3ba0434bdd08d0d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 20 Apr 2011 23:21:26 +0000 Subject: [PATCH 52/88] fix [#27083] Crash on setting Voxel resolution below -3 in 8bit raw texture settings --- source/blender/makesrna/intern/rna_texture.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c index 82eb5d1d0c9..0bab914d3d0 100644 --- a/source/blender/makesrna/intern/rna_texture.c +++ b/source/blender/makesrna/intern/rna_texture.c @@ -1638,6 +1638,7 @@ static void rna_def_texture_voxeldata(BlenderRNA *brna) prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "resol"); + RNA_def_property_range(prop, 1, INT_MAX); RNA_def_property_ui_text(prop, "Resolution", "Resolution of the voxel grid"); RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update"); From 26916206f80bb55d1ea71ef8108336109cebd90b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 00:28:05 +0000 Subject: [PATCH 53/88] fix [#27084] Crash when chosing non-voxel data file in voxel data texture input also found loading voxel textures wasn't closing files it opened. --- source/blender/makesrna/intern/rna_texture.c | 2 +- .../blender/render/intern/source/voxeldata.c | 74 +++++++++++++------ 2 files changed, 52 insertions(+), 24 deletions(-) diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c index 0bab914d3d0..d8eec152831 100644 --- a/source/blender/makesrna/intern/rna_texture.c +++ b/source/blender/makesrna/intern/rna_texture.c @@ -1638,7 +1638,7 @@ static void rna_def_texture_voxeldata(BlenderRNA *brna) prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "resol"); - RNA_def_property_range(prop, 1, INT_MAX); + RNA_def_property_range(prop, 1, 100000); RNA_def_property_ui_text(prop, "Resolution", "Resolution of the voxel grid"); RNA_def_property_update(prop, 0, "rna_Texture_voxeldata_update"); diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c index 4cb18c8cdcc..b8cb5c21337 100644 --- a/source/blender/render/intern/source/voxeldata.c +++ b/source/blender/render/intern/source/voxeldata.c @@ -64,13 +64,32 @@ #include "texture.h" #include "voxeldata.h" +static int is_vd_res_ok(VoxelData *vd) +{ + /* arbitrary large value so corrupt headers dont break */ + const int min= 1, max= 100000; + return (vd->resol[0] >= min && vd->resol[0] <= max) && + (vd->resol[1] >= min && vd->resol[1] <= max) && + (vd->resol[2] >= min && vd->resol[2] <= max); +} + +/* use size_t because the result may exceed INT_MAX */ +static size_t vd_resol_size(VoxelData *vd) +{ + return (size_t)vd->resol[0] * (size_t)vd->resol[1] * (size_t)vd->resol[2]; +} + static int load_frame_blendervoxel(VoxelData *vd, FILE *fp, int frame) { + const size_t size = vd_resol_size(vd); size_t offset = sizeof(VoxelDataHeader); - int size = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]); + if(is_vd_res_ok(vd) == FALSE) + return 0; + vd->dataset = MEM_mapallocN(sizeof(float)*size, "voxel dataset"); - + if(vd->dataset == NULL) return 0; + if(fseek(fp, frame*size*sizeof(float)+offset, 0) == -1) return 0; if(fread(vd->dataset, sizeof(float), size, fp) != size) @@ -83,19 +102,32 @@ static int load_frame_blendervoxel(VoxelData *vd, FILE *fp, int frame) static int load_frame_raw8(VoxelData *vd, FILE *fp, int frame) { - int size = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]); + const size_t size = vd_resol_size(vd); char *data_c; int i; - + + if(is_vd_res_ok(vd) == FALSE) + return 0; + vd->dataset = MEM_mapallocN(sizeof(float)*size, "voxel dataset"); + if(vd->dataset == NULL) return 0; data_c = (char *)MEM_mallocN(sizeof(char)*size, "temporary voxel file reading storage"); - + if(data_c == NULL) { + MEM_freeN(vd->dataset); + vd->dataset= NULL; + return 0; + } + if(fseek(fp,(frame-1)*size*sizeof(char),0) == -1) { MEM_freeN(data_c); + MEM_freeN(vd->dataset); + vd->dataset= NULL; return 0; } if(fread(data_c, sizeof(char), size, fp) != size) { MEM_freeN(data_c); + MEM_freeN(vd->dataset); + vd->dataset= NULL; return 0; } @@ -138,7 +170,7 @@ static void load_frame_image_sequence(VoxelData *vd, Tex *tex) vd->resol[0] = ibuf->x; vd->resol[1] = ibuf->y; vd->resol[2] = iuser.frames; - vd->dataset = MEM_mapallocN(sizeof(float)*(vd->resol[0])*(vd->resol[1])*(vd->resol[2]), "voxel dataset"); + vd->dataset = MEM_mapallocN(sizeof(float)*vd_resol_size(vd), "voxel dataset"); for (z=0; z < iuser.frames; z++) { @@ -205,12 +237,12 @@ static void init_frame_smoke(VoxelData *vd, float cfra) if(cfra < smd->domain->point_cache[0]->startframe) ; /* don't show smoke before simulation starts, this could be made an option in the future */ else if (vd->smoked_type == TEX_VD_SMOKEHEAT) { - int totRes; + size_t totRes; + size_t i; float *heat; - int i; VECCOPY(vd->resol, smd->domain->res); - totRes = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]); + totRes= vd_resol_size(vd); // scaling heat values from -2.0-2.0 to 0.0-1.0 vd->dataset = MEM_mapallocN(sizeof(float)*(totRes), "smoke data"); @@ -226,12 +258,12 @@ static void init_frame_smoke(VoxelData *vd, float cfra) //vd->dataset = smoke_get_heat(smd->domain->fluid); } else if (vd->smoked_type == TEX_VD_SMOKEVEL) { - int totRes; + size_t totRes; + size_t i; float *xvel, *yvel, *zvel; - int i; VECCOPY(vd->resol, smd->domain->res); - totRes = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]); + totRes= vd_resol_size(vd); // scaling heat values from -2.0-2.0 to 0.0-1.0 vd->dataset = MEM_mapallocN(sizeof(float)*(totRes), "smoke data"); @@ -247,7 +279,7 @@ static void init_frame_smoke(VoxelData *vd, float cfra) } else { - int totRes; + size_t totRes; float *density; if (smd->domain->flags & MOD_SMOKE_HIGHRES) { @@ -258,8 +290,8 @@ static void init_frame_smoke(VoxelData *vd, float cfra) density = smoke_get_density(smd->domain->fluid); } - totRes = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]); - + /* TODO: is_vd_res_ok(rvd) doesnt check this resolution */ + totRes= vd_resol_size(vd); /* always store copy, as smoke internal data can change */ vd->dataset = MEM_mapallocN(sizeof(float)*(totRes), "smoke data"); memcpy(vd->dataset, density, sizeof(float)*totRes); @@ -310,9 +342,8 @@ static void cache_voxeldata(struct Render *re, Tex *tex) if(read_voxeldata_header(fp, vd)) load_frame_blendervoxel(vd, fp, curframe-1); - else - fclose(fp); - + + fclose(fp); return; case TEX_VD_RAW_8BIT: BLI_path_abs(path, G.main->name); @@ -320,11 +351,8 @@ static void cache_voxeldata(struct Render *re, Tex *tex) fp = fopen(path,"rb"); if (!fp) return; - if (load_frame_raw8(vd, fp, curframe)) - ; - else - fclose(fp); - + load_frame_raw8(vd, fp, curframe); + fclose(fp); return; } } From 18e4f7de4f9e4a59b9123df5b2025776b11bb11d Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 21 Apr 2011 01:21:28 +0000 Subject: [PATCH 54/88] Bugfix [#27090] Available keying set fails in armature pose mode A change in the poll callback that Available KeyingSet used to use restricted its use to Object-mode only, while this could also be useful in Pose Mode (though it would only affect all channels there). Made this use a custom poll callback now that tests for whether the active object has an action. This does mean that if you select a bunch of objects with animation data, but the active object doesn't have it, then the keyingset will fail to fire, but that's been marked as a todo in the code. --- release/scripts/startup/keyingsets_builtins.py | 12 ++++++++---- source/blender/blenkernel/intern/armature.c | 8 ++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/release/scripts/startup/keyingsets_builtins.py b/release/scripts/startup/keyingsets_builtins.py index 0775d38c437..8cb63ea48cf 100644 --- a/release/scripts/startup/keyingsets_builtins.py +++ b/release/scripts/startup/keyingsets_builtins.py @@ -215,10 +215,14 @@ class BUILTIN_KSI_VisualLocRot(bpy.types.KeyingSetInfo): class BUILTIN_KSI_Available(bpy.types.KeyingSetInfo): bl_label = "Available" - # poll - use predefined callback for selected objects - # TODO: this should really check whether the selected object (or datablock) - # has any animation data defined yet - poll = keyingsets_utils.RKS_POLL_selected_objects + # poll - selected objects or selected object with animation data + def poll(ksi, context): + ob = context.active_object + if ob: + # TODO: this fails if one animation-less object is active, but many others are selected + return ob.animation_data and ob.animation_data.action + else: + return bool(context.selected_objects) # iterator - use callback for selected bones/objects iterator = keyingsets_utils.RKS_ITER_selected_item diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index ddfa738449d..a0511f5da2e 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -1226,10 +1226,10 @@ void pchan_apply_mat4(bPoseChannel *pchan, float mat[][4], short use_compat) */ void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4]) { - float imat[4][4]; - - invert_m4_m4(imat, arm_mat); - mul_m4_m4m4(delta_mat, pose_mat, imat); + float imat[4][4]; + + invert_m4_m4(imat, arm_mat); + mul_m4_m4m4(delta_mat, pose_mat, imat); } /* **************** Rotation Mode Conversions ****************************** */ From 6bb626f2532757873ff2ea9f6d2571cc5f344201 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 05:49:47 +0000 Subject: [PATCH 55/88] minor changes - remove some warnings - fix typos - cmake allow in-source build (when WITH_IN_SOURCE_BUILD is defined) - cmake, use an explicit list of rna files (don't glob) --- CMakeLists.txt | 23 +++-- source/blender/blenkernel/intern/mball.c | 22 ++--- source/blender/blenkernel/intern/text.c | 2 +- source/blender/blenlib/BLI_math_geom.h | 8 +- source/blender/blenlib/intern/math_geom.c | 4 +- .../editors/animation/keyframes_edit.c | 2 +- .../blender/editors/space_node/space_node.c | 2 +- source/blender/editors/util/crazyspace.c | 2 +- source/blender/makesrna/intern/CMakeLists.txt | 85 +++++++++++++++++-- .../intern/CMP_nodes/CMP_distanceMatte.c | 4 +- .../python/generic/bpy_internal_import.c | 6 +- source/blender/python/intern/bpy_props.c | 4 +- source/blender/python/intern/bpy_rna.c | 66 +++++++------- source/blender/python/intern/bpy_util.c | 2 +- 14 files changed, 156 insertions(+), 76 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 74fbff513c1..3711227fdef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,15 +31,20 @@ # build the libs and objects in it. if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) -message(FATAL_ERROR "CMake generation for blender is not allowed within the source directory! -Remove the CMakeCache.txt file and try again from another folder, e.g.: - - rm CMakeCache.txt - cd .. - mkdir cmake-make - cd cmake-make - cmake ../blender -") + if(NOT DEFINED WITH_IN_SOURCE_BUILD) + message(FATAL_ERROR + "CMake generation for blender is not allowed within the source directory!" + "\n Remove the CMakeCache.txt file and try again from another folder, e.g.:" + "\n " + "\n rm CMakeCache.txt" + "\n cd .." + "\n mkdir cmake-make" + "\n cd cmake-make" + "\n cmake ../blender" + "\n " + "\n Alternately define WITH_IN_SOURCE_BUILD to force this option (not recommended!)" + ) + endif() endif() cmake_minimum_required(VERSION 2.8) diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index e6e32be9634..74e31238b96 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -187,7 +187,7 @@ void make_local_mball(MetaBall *mb) } /* most simple meta-element adding function - * dont do context menipulation here (rna uses) */ + * don't do context manipulation here (rna uses) */ MetaElem *add_metaball_element(MetaBall *mb, const int type) { MetaElem *ml= MEM_callocN(sizeof(MetaElem), "metaelem"); @@ -237,14 +237,14 @@ MetaElem *add_metaball_element(MetaBall *mb, const int type) /** Compute bounding box of all MetaElems/MetaBalls. * * Bounding box is computed from polygonized surface. Object *ob is - * basic MetaBall (usaualy with name Meta). All other MetaBalls (whith + * basic MetaBall (usually with name Meta). All other MetaBalls (with * names Meta.001, Meta.002, etc) are included in this Bounding Box. */ void tex_space_mball(Object *ob) { DispList *dl; BoundBox *bb; - float *data, min[3], max[3], loc[3], size[3]; + float *data, min[3], max[3] /*, loc[3], size[3] */; int tot, doit=0; if(ob->bb==NULL) ob->bb= MEM_callocN(sizeof(BoundBox), "mb boundbox"); @@ -272,7 +272,7 @@ void tex_space_mball(Object *ob) min[0] = min[1] = min[2] = -1.0f; max[0] = max[1] = max[2] = 1.0f; } - + /* loc[0]= (min[0]+max[0])/2.0f; loc[1]= (min[1]+max[1])/2.0f; loc[2]= (min[2]+max[2])/2.0f; @@ -280,7 +280,7 @@ void tex_space_mball(Object *ob) size[0]= (max[0]-min[0])/2.0f; size[1]= (max[1]-min[1])/2.0f; size[2]= (max[2]-min[2])/2.0f; - + */ boundbox_set_from_min_max(bb, min, max); } @@ -320,14 +320,14 @@ float *make_orco_mball(Object *ob, ListBase *dispbase) } /* Note on mball basis stuff 2.5x (this is a can of worms) - * This really needs a rewrite/refactorm its totally broken in anything other then basic cases + * This really needs a rewrite/refactor its totally broken in anything other then basic cases * Multiple Scenes + Set Scenes & mixing mball basis SHOULD work but fails to update the depsgraph on rename * and linking into scenes or removal of basis mball. so take care when changing this code. * * Main idiot thing here is that the system returns find_basis_mball() objects which fail a is_basis_mball() test. * - * Not only that but the depsgraph and ther areas depend on this behavior!, so making small fixes here isnt worth it. - * - campbell + * Not only that but the depsgraph and their areas depend on this behavior!, so making small fixes here isn't worth it. + * - Campbell */ @@ -725,7 +725,7 @@ void accum_mballfaces(int i1, int i2, int i3, int i4) cur= indices+4*curindex; - /* diplists now support array drawing, we treat trias as fake quad */ + /* displists now support array drawing, we treat tri's as fake quad */ cur[0]= i1; cur[1]= i2; @@ -1315,7 +1315,7 @@ void converge (MB_POINT *p1, MB_POINT *p2, float v1, float v2, dy = pos.y - neg.y; dz = pos.z - neg.z; -/* Aproximation by linear interpolation is faster then binary subdivision, +/* Approximation by linear interpolation is faster then binary subdivision, * but it results sometimes (mb->thresh < 0.2) into the strange results */ if((mb->thresh > 0.2f) && (f==1)){ if((dy == 0.0f) && (dz == 0.0f)){ @@ -1625,7 +1625,7 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */ } } - /* when metaball object hase zero scale, then MetaElem ot this MetaBall + /* when metaball object has zero scale, then MetaElem to this MetaBall * will not be put to mainb array */ if(bob->size[0]==0.0f || bob->size[1]==0.0f || bob->size[2]==0.0f) { zero_size= 1; diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 5a8106b23e3..db07fae9245 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -2627,7 +2627,7 @@ void comment(Text *text) if (!text) return; if (!text->curl) return; - if (!text->sell) return;// Need to change this need to check if only one line is selected ot more then one + if (!text->sell) return;// Need to change this need to check if only one line is selected to more then one num = 0; while (TRUE) diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h index eb69ddc26eb..8937612b41b 100644 --- a/source/blender/blenlib/BLI_math_geom.h +++ b/source/blender/blenlib/BLI_math_geom.h @@ -86,10 +86,10 @@ int isect_seg_seg_v2_point(const float v1[2], const float v2[2], const float v3[ * 2 - i1 and i2 are the nearest points on line 1 (v1, v2) and line 2 (v3, v4) respectively * */ -int isect_line_line_v3(float v1[3], float v2[3], - float v3[3], float v4[3], float i1[3], float i2[3]); -int isect_line_line_strict_v3(float v1[3], float v2[3], - float v3[3], float v4[3], float vi[3], float *lambda); +int isect_line_line_v3(const float v1[3], const float v2[3], + const float v3[3], const float v4[3], float i1[3], float i2[3]); +int isect_line_line_strict_v3(const float v1[3], const float v2[3], + const float v3[3], const float v4[3], float vi[3], float *lambda); /* line/ray triangle */ int isect_line_tri_v3(const float p1[3], const float p2[3], diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 79c07819ac1..744a15f4711 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -897,7 +897,7 @@ int isect_axial_line_tri_v3(const int axis, const float p1[3], const float p2[3] * 1 - lines are coplanar, i1 is set to intersection * 2 - i1 and i2 are the nearest points on line 1 (v1, v2) and line 2 (v3, v4) respectively * */ -int isect_line_line_v3(float v1[3], float v2[3], float v3[3], float v4[3], float i1[3], float i2[3]) +int isect_line_line_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3], float i1[3], float i2[3]) { float a[3], b[3], c[3], ab[3], cb[3], dir1[3], dir2[3]; float d; @@ -961,7 +961,7 @@ int isect_line_line_v3(float v1[3], float v2[3], float v3[3], float v4[3], float /* Intersection point strictly between the two lines * 0 when no intersection is found * */ -int isect_line_line_strict_v3(float v1[3], float v2[3], float v3[3], float v4[3], float vi[3], float *lambda) +int isect_line_line_strict_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3], float vi[3], float *lambda) { float a[3], b[3], c[3], ab[3], cb[3], ca[3], dir1[3], dir2[3]; float d; diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c index 1ce05573e85..e50203cbc28 100644 --- a/source/blender/editors/animation/keyframes_edit.c +++ b/source/blender/editors/animation/keyframes_edit.c @@ -515,7 +515,7 @@ void ANIM_editkeyframes_refresh(bAnimContext *ac) /* run the given check on the 3 handles * - check should be a macro, which takes the handle index as its single arg, which it substitutes later - * - requires that a var, of type short, is named 'ok', and has been initialised ot 0 + * - requires that a var, of type short, is named 'ok', and has been initialized to 0 */ #define KEYFRAME_OK_CHECKS(check) \ { \ diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index c0e9e8e22e1..1c2f604a650 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -232,7 +232,7 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn) if(type==NTREE_COMPOSIT) { Scene *scene= wmn->window->screen->scene; - /* note that NodeTagIDChanged is alredy called by BKE_image_signal() on all + /* note that NodeTagIDChanged is already called by BKE_image_signal() on all * scenes so really this is just to know if the images is used in the compo else * painting on images could become very slow when the compositor is open. */ if(NodeTagIDChanged(scene->nodetree, wmn->reference)) diff --git a/source/blender/editors/util/crazyspace.c b/source/blender/editors/util/crazyspace.c index 8008d76344d..a2b32ec7cf8 100644 --- a/source/blender/editors/util/crazyspace.c +++ b/source/blender/editors/util/crazyspace.c @@ -400,7 +400,7 @@ void crazyspace_build_sculpt(Scene *scene, Object *ob, float (**deformmats)[3][3 if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue; if(mti->type==eModifierTypeType_OnlyDeform) { - /* skip leading modifiers which have been alredy + /* skip leading modifiers which have been already handled in sculpt_get_first_deform_matrices */ if(mti->deformMatrices && !deformed) continue; diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index 9f44c0acad3..9cafca3532f 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -30,11 +30,86 @@ remove_strict_flags() # message(STATUS "Configuring makesrna") -file(GLOB DEFSRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c") -file(GLOB APISRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*_api.c") -list(REMOVE_ITEM DEFSRC rna_access.c rna_define.c makesrna.c) -list(REMOVE_ITEM DEFSRC ${APISRC}) - +# files rna_access.c rna_define.c makesrna.c intentionally excluded. +set(DEFSRC + rna_ID.c + rna_action.c + rna_actuator.c + rna_animation.c + rna_animviz.c + rna_armature.c + rna_boid.c + rna_brush.c + rna_camera.c + rna_cloth.c + rna_color.c + rna_constraint.c + rna_context.c + rna_controller.c + rna_curve.c + rna_fcurve.c + rna_fluidsim.c + rna_gpencil.c + rna_group.c + rna_image.c + rna_key.c + rna_lamp.c + rna_lattice.c + rna_main.c + rna_material.c + rna_mesh.c + rna_meta.c + rna_modifier.c + rna_nla.c + rna_nodetree.c + rna_object.c + rna_object_force.c + rna_packedfile.c + rna_particle.c + rna_pose.c + rna_property.c + rna_render.c + rna_rna.c + rna_scene.c + rna_screen.c + rna_sculpt_paint.c + rna_sensor.c + rna_sequencer.c + rna_smoke.c + rna_sound.c + rna_space.c + rna_test.c + rna_text.c + rna_texture.c + rna_timeline.c + rna_ui.c + rna_userdef.c + rna_vfont.c + rna_wm.c + rna_world.c +) + +set(APISRC + rna_action_api.c + rna_actuator_api.c + rna_animation_api.c + rna_armature_api.c + rna_controller_api.c + rna_fcurve_api.c + rna_image_api.c + rna_main_api.c + rna_material_api.c + rna_mesh_api.c + rna_object_api.c + rna_pose_api.c + rna_scene_api.c + rna_sensor_api.c + rna_sequencer_api.c + rna_text_api.c + rna_ui_api.c + rna_wm_api.c +) + string(REGEX REPLACE "rna_([a-zA-Z0-9_-]*).c" "${CMAKE_CURRENT_BINARY_DIR}/rna_\\1_gen.c" GENSRC "${DEFSRC}") set_source_files_properties(GENSRC PROPERTIES GENERATED true) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c index 3eb38465c4f..2694c0559d7 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c @@ -87,8 +87,8 @@ static void do_distance_matte(bNode *node, float *out, float *in) static void node_composit_exec_distance_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { /* - Losely based on the Sequencer chroma key plug-in, but enhanced to work in other color spaces and - uses a differnt difference function (suggested in forums of vfxtalk.com). + Loosely based on the Sequencer chroma key plug-in, but enhanced to work in other color spaces and + uses a different difference function (suggested in forums of vfxtalk.com). */ CompBuf *workbuf; CompBuf *inbuf; diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c index f2514af20b4..96fe13bf6fc 100644 --- a/source/blender/python/generic/bpy_internal_import.c +++ b/source/blender/python/generic/bpy_internal_import.c @@ -304,7 +304,7 @@ static PyObject *blender_reload(PyObject *UNUSED(self), PyObject * module) } else { /* no blender text was found that could import the module - * rause the original error from PyImport_ImportModuleEx */ + * reuse the original error from PyImport_ImportModuleEx */ PyErr_Restore(exception, err, tb); } @@ -326,8 +326,8 @@ PyMethodDef bpy_reload_meth= {"bpy_reload_meth", (PyCFunction)blender_reload, ME * it wont reload scripts between loading different blend files or while making the game. * - use 'clear_all' arg in this case. * - * Since pythons bultins include a full path even for win32. - * even if we remove a python module a reimport will bring it back again. + * Since pythons built-ins include a full path even for win32. + * even if we remove a python module a re-import will bring it back again. */ #if 0 // not used anymore but may still come in handy later diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index e51ea048b92..c4663482592 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -129,7 +129,7 @@ static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw) } /* this define runs at the start of each function and deals with - * returning a deferred property (to be registed later) */ + * returning a deferred property (to be registered later) */ #define BPY_PROPDEF_HEAD(_func) \ if (PyTuple_GET_SIZE(args) == 1) { \ PyObject *ret; \ @@ -948,7 +948,7 @@ PyObject *BPY_rna_props( void ) /* INCREF since its its assumed that all these functions return the * module with a new ref like PyDict_New, since they are passed to - * PyModule_AddObject which steals a ref */ + * PyModule_AddObject which steals a ref */ Py_INCREF(submodule); /* api needs the PyObjects internally */ diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 61ccd0d9310..e254f80b0e8 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -144,7 +144,7 @@ struct GHash *id_weakref_pool= NULL; static PyObject *id_free_weakref_cb(PyObject *weakinfo_pair, PyObject *weakref); static PyMethodDef id_free_weakref_cb_def= {"id_free_weakref_cb", (PyCFunction)id_free_weakref_cb, METH_O, NULL}; -/* adds a reference to the list, remember ot decref */ +/* adds a reference to the list, remember to decref */ static GHash *id_weakref_pool_get(ID *id) { GHash *weakinfo_hash= NULL; @@ -548,7 +548,7 @@ static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_ #endif // USE_MATHUTILS /* note that PROP_NONE is included as a vector subtype. this is because its handy to - * have x/y access to fcurve keyframes and other fixed size float arrayas of length 2-4. */ + * have x/y access to fcurve keyframes and other fixed size float arrays of length 2-4. */ #define PROP_ALL_VECTOR_SUBTYPES PROP_COORDS: case PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ_LENGTH PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop) @@ -573,7 +573,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop) if (totdim == 1 || (totdim == 2 && subtype == PROP_MATRIX)) { if(!is_thick) - ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */ + ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the mathutils PyObject */ switch(RNA_property_subtype(prop)) { case PROP_ALL_VECTOR_SUBTYPES: @@ -668,7 +668,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop) ret= pyrna_prop_array_subscript_slice(NULL, ptr, prop, 0, len, len); } else { - ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */ + ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the mathutils PyObject */ } } #else // USE_MATHUTILS @@ -1670,7 +1670,7 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P } } else { - /* see if we can coorce into a python type - PropertyType */ + /* see if we can coerce into a python type - PropertyType */ switch (RNA_property_type(prop)) { case PROP_BOOLEAN: { @@ -1744,7 +1744,7 @@ static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self) return RNA_property_collection_length(&self->ptr, self->prop); } -/* bool funcs are for speed, so we can avoid getting the length +/* bool functions are for speed, so we can avoid getting the length * of 1000's of items in a linked list for eg. */ static int pyrna_prop_array_bool(BPy_PropertyRNA *self) { @@ -1885,7 +1885,7 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po tuple= PyTuple_New(stop - start); - /* PYRNA_PROP_CHECK_OBJ(self) isnt needed, internal use only */ + /* PYRNA_PROP_CHECK_OBJ(self) isn't needed, internal use only */ totdim= RNA_property_array_dimension(ptr, prop, NULL); @@ -2177,7 +2177,7 @@ static int prop_subscript_ass_array_int(BPy_PropertyArrayRNA *self, Py_ssize_t k if(keynum >= 0 && keynum < len) return pyrna_py_to_prop_array_index(self, keynum, value); - PyErr_SetString(PyExc_IndexError, "bpy_prop_array[index]= value: index out of range"); + PyErr_SetString(PyExc_IndexError, "bpy_prop_array[index] = value: index out of range"); return -1; } @@ -2309,7 +2309,7 @@ static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value) } if(RNA_struct_idprops_check(self->ptr.type)==0) { - PyErr_SetString(PyExc_TypeError, "bpy_struct: this type doesnt support IDProperties"); + PyErr_SetString(PyExc_TypeError, "bpy_struct: this type doesn't support IDProperties"); return -1; } @@ -2965,7 +2965,7 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr * >>> bpy.types.Scene.foo= BoolProperty() * >>> bpy.types.Scene.foo * - * ...rather then returning the defered class register tuple as checked by pyrna_is_deferred_prop() + * ...rather then returning the deferred class register tuple as checked by pyrna_is_deferred_prop() * * Disable for now, this is faking internal behavior in a way thats too tricky to maintain well. */ #if 0 @@ -3024,9 +3024,9 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb * but gets confusing from script writers POV if the assigned value cant be read back. */ } else { - /* remove existing property if its set or we also end up with confusement */ + /* remove existing property if its set or we also end up with confusion */ const char *attr_str= _PyUnicode_AsString(attr); - RNA_def_property_free_identifier(srna, attr_str); /* ignore on failier */ + RNA_def_property_free_identifier(srna, attr_str); /* ignore on failure */ } } else { /* __delattr__ */ @@ -3540,7 +3540,7 @@ static int foreach_parse_args( } /* check 'attr_tot' otherwise we dont know if any values were set - * this isnt ideal because it means running on an empty list may fail silently when its not compatible. */ + * this isn't ideal because it means running on an empty list may fail silently when its not compatible. */ if (*size == 0 && *attr_tot != 0) { PyErr_SetString(PyExc_AttributeError, "attribute does not support foreach method"); return -1; @@ -3705,7 +3705,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set) if(PyErr_Occurred()) { /* Maybe we could make our own error */ PyErr_Print(); - PyErr_SetString(PyExc_TypeError, "could not access the py sequence"); + PyErr_SetString(PyExc_TypeError, "couldn't access the py sequence"); return NULL; } if (!ok) { @@ -3719,13 +3719,13 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set) static char pyrna_prop_collection_foreach_get_doc[] = ".. method:: foreach_get(attr, seq)\n" "\n" -" This is a function to give fast access to attribites within a collection.\n" +" This is a function to give fast access to attributes within a collection.\n" "\n" " .. code-block:: python\n" "\n" " collection.foreach_get(someseq, attr)\n" "\n" -" # Python equivelent\n" +" # Python equivalent\n" " for i in range(len(seq)): someseq[i]= getattr(collection, attr)\n" "\n" ; @@ -3739,13 +3739,13 @@ static PyObject *pyrna_prop_collection_foreach_get(BPy_PropertyRNA *self, PyObje static char pyrna_prop_collection_foreach_set_doc[] = ".. method:: foreach_set(attr, seq)\n" "\n" -" This is a function to give fast access to attribites within a collection.\n" +" This is a function to give fast access to attributes within a collection.\n" "\n" " .. code-block:: python\n" "\n" " collection.foreach_set(seq, attr)\n" "\n" -" # Python equivelent\n" +" # Python equivalent\n" " for i in range(len(seq)): setattr(collection[i], attr, seq[i])\n" "\n" ; @@ -3872,7 +3872,7 @@ static PyObject *pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject * } else if (PyType_IsSubtype(Py_TYPE(base), &pyrna_struct_Type)) { /* this almost never runs, only when using user defined subclasses of built-in object. - * this isnt common since its NOT related to registerable subclasses. eg: + * this isn't common since its NOT related to registerable subclasses. eg: >>> class MyObSubclass(bpy.types.Object): ... def test_func(self): @@ -4196,7 +4196,7 @@ static PyObject *pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw) err= pyrna_py_to_prop(&funcptr, parm, iter.data, item, ""); if(err!=0) { - /* the error generated isnt that useful, so generate it again with a useful prefix + /* the error generated isn't that useful, so generate it again with a useful prefix * could also write a function to prepend to error messages */ char error_prefix[512]; PyErr_Clear(); /* re-raise */ @@ -4214,7 +4214,7 @@ static PyObject *pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw) RNA_parameter_list_end(&iter); - /* Check if we gave args that dont exist in the function + /* Check if we gave args that don't exist in the function * printing the error is slow but it should only happen when developing. * the if below is quick, checking if it passed less keyword args then we gave. * (Dont overwrite the error if we have one, otherwise can skip important messages and confuse with args) @@ -5018,7 +5018,7 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna) /* Not 100% needed but useful, * having an instance within a type looks wrong however this instance IS an rna type */ - /* python deals with the curcular ref */ + /* python deals with the circular ref */ RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr); item= pyrna_struct_CreatePyObject(&ptr); @@ -5116,7 +5116,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna) /* stupid/simple case */ if (srna == NULL) { newclass= NULL; /* Nothing to do */ - } /* the class may have alredy been declared & allocated */ + } /* the class may have already been declared & allocated */ else if ((newclass= RNA_struct_py_type_get(srna))) { Py_INCREF(newclass); } /* check if bpy_types.py module has the class defined in it */ @@ -5124,9 +5124,9 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna) pyrna_subtype_set_rna(newclass, srna); Py_INCREF(newclass); } /* create a new class instance with the C api - * maintly for the purposing of matching the C/rna type hierarchy */ + * mainly for the purposing of matching the C/rna type hierarchy */ else { - /* subclass equivelents + /* subclass equivalents - class myClass(myBase): some='value' # or ... - myClass= type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'}) @@ -5356,7 +5356,7 @@ PyObject *BPY_rna_doc(void) #endif -/* pyrna_basetype_* - BPy_BaseTypeRNA is just a BPy_PropertyRNA struct with a differnt type +/* pyrna_basetype_* - BPy_BaseTypeRNA is just a BPy_PropertyRNA struct with a different type * the self->ptr and self->prop are always set to the "structs" collection */ //---------------getattr-------------------------------------------- static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname) @@ -5614,7 +5614,7 @@ static int pyrna_deferred_register_class_recursive(StructRNA *srna, PyTypeObject PyTypeObject *py_superclass= (PyTypeObject *)PyTuple_GET_ITEM(py_class->tp_bases, i); /* the rules for using these base classes are not clear, - * 'object' is ofcourse not worth looking into and + * 'object' is of course not worth looking into and * existing subclasses of RNA would cause a lot more dictionary * looping then is needed (SomeOperator would scan Operator.__dict__) * which is harmless but not at all useful. @@ -5875,7 +5875,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param * Although this is annoying to have to impliment a part of pythons typeobject.c:type_call(). */ if(py_class->tp_init) { - /* true in most cases even when the class its self doesnt define an __init__ function. */ + /* true in most cases even when the class its self doesn't define an __init__ function. */ args= PyTuple_New(0); if (py_class->tp_init(py_srna, args, NULL) < 0) { Py_DECREF(py_srna); @@ -5888,7 +5888,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param py_class_instance= py_srna; #else - /* 'almost' all the time calling the class isnt needed. + /* 'almost' all the time calling the class isn't needed. * We could just do... py_class_instance= py_srna; Py_INCREF(py_class_instance); @@ -5977,7 +5977,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param } } else { - /* the error may be alredy set if the class instance couldnt be created */ + /* the error may be already set if the class instance couldn't be created */ if(err != -1) { PyErr_Format(PyExc_RuntimeError, "could not create instance of %.200s to call callback function %.200s", RNA_struct_identifier(ptr->type), RNA_function_identifier(func)); err= -1; @@ -6140,7 +6140,7 @@ void pyrna_free_types(void) * There is currently a bug where moving registering a python class does * not properly manage refcounts from the python class, since the srna owns * the python class this should not be so tricky but changing the references as - * youd expect when changing ownership crashes blender on exit so I had to comment out + * you'd expect when changing ownership crashes blender on exit so I had to comment out * the decref. This is not so bad because the leak only happens when re-registering (hold F8) * - Should still be fixed - Campbell * */ @@ -6178,7 +6178,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class /* fails in cases, cant use this check but would like to :| */ /* if(RNA_struct_py_type_get(srna)) { - PyErr_Format(PyExc_ValueError, "register_class(...): %.200s's parent class %.200s is alredy registered, this is not allowed", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna)); + PyErr_Format(PyExc_ValueError, "register_class(...): %.200s's parent class %.200s is already registered, this is not allowed", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna)); return NULL; } */ @@ -6214,7 +6214,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class /* old srna still references us, keep the check incase registering somehow can free it */ if(RNA_struct_py_type_get(srna)) { RNA_struct_py_type_set(srna, NULL); - // Py_DECREF(py_class); // shuld be able to do this XXX since the old rna adds a new ref. + // Py_DECREF(py_class); // should be able to do this XXX since the old rna adds a new ref. } /* Can't use this because it returns a dict proxy diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c index 0d3b036850d..0b5dacac4b2 100644 --- a/source/blender/python/intern/bpy_util.c +++ b/source/blender/python/intern/bpy_util.c @@ -98,7 +98,7 @@ short BPy_errors_to_report(ReportList *reports) pystring= PyC_ExceptionBuffer(); if(pystring==NULL) { - BKE_report(reports, RPT_ERROR, "unknown py-exception, could not convert"); + BKE_report(reports, RPT_ERROR, "unknown py-exception, couldn't convert"); return 0; } From 817c6eebe4d854828bbb43fc31578c8a70060015 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 06:27:39 +0000 Subject: [PATCH 56/88] patch from Jakub Steiner for freedesktop icons [#27086] install a high resolution launcher icon --- release/freedesktop/icons/128x128/blender.png | Bin 11167 -> 0 bytes release/freedesktop/icons/128x128/blender.svg | 249 ----- release/freedesktop/icons/16x16/blender.png | Bin 845 -> 977 bytes release/freedesktop/icons/16x16/blender.svg | 250 ----- release/freedesktop/icons/192x192/blender.png | Bin 18534 -> 0 bytes release/freedesktop/icons/192x192/blender.svg | 249 ----- release/freedesktop/icons/22x22/blender.png | Bin 1236 -> 1451 bytes release/freedesktop/icons/22x22/blender.svg | 250 ----- release/freedesktop/icons/24x24/blender.png | Bin 0 -> 1681 bytes release/freedesktop/icons/256x256/blender.png | Bin 0 -> 32907 bytes release/freedesktop/icons/32x32/blender.png | Bin 1955 -> 2126 bytes release/freedesktop/icons/32x32/blender.svg | 250 ----- release/freedesktop/icons/48x48/blender.png | Bin 3243 -> 3289 bytes release/freedesktop/icons/48x48/blender.svg | 240 ----- release/freedesktop/icons/64x64/blender.png | Bin 4797 -> 0 bytes release/freedesktop/icons/64x64/blender.svg | 246 ----- release/freedesktop/icons/96x96/blender.png | Bin 7773 -> 0 bytes release/freedesktop/icons/96x96/blender.svg | 249 ----- .../freedesktop/icons/blender_icon_source.svg | 855 ++++++++++++++++++ 19 files changed, 855 insertions(+), 1983 deletions(-) delete mode 100644 release/freedesktop/icons/128x128/blender.png delete mode 100644 release/freedesktop/icons/128x128/blender.svg delete mode 100644 release/freedesktop/icons/16x16/blender.svg delete mode 100644 release/freedesktop/icons/192x192/blender.png delete mode 100644 release/freedesktop/icons/192x192/blender.svg delete mode 100644 release/freedesktop/icons/22x22/blender.svg create mode 100644 release/freedesktop/icons/24x24/blender.png create mode 100644 release/freedesktop/icons/256x256/blender.png delete mode 100644 release/freedesktop/icons/32x32/blender.svg delete mode 100644 release/freedesktop/icons/48x48/blender.svg delete mode 100644 release/freedesktop/icons/64x64/blender.png delete mode 100644 release/freedesktop/icons/64x64/blender.svg delete mode 100644 release/freedesktop/icons/96x96/blender.png delete mode 100644 release/freedesktop/icons/96x96/blender.svg create mode 100644 release/freedesktop/icons/blender_icon_source.svg diff --git a/release/freedesktop/icons/128x128/blender.png b/release/freedesktop/icons/128x128/blender.png deleted file mode 100644 index d2046c91bd9e450d487750b13db646c50ade19ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11167 zcmaKSWmFtZu=cQca0nh?ae}+MI|N7|xVr^+*xk4C6Vf?au{z&-T(lAp&&1<0jq=lD=0{?d!MMuD6B$ol~m9|fn9zm z<`J-GRA>3muCVqC{}nh%hAc1GOJX+}9XCxUOE*sw7Yo4C)05T4(azP(#My$?$;B$` zM3@BD=D#6FYZPu%?@ZjiZIj?&B>R>^tTEC*tm6W&v2cxj756vDw-< zIGC8RI=H*qm|2_H+q0Va*jR2E0st6Lke1N$%0ABV&eqp<-|N2ZTxu(?Xg>6xnYL9( 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 kQQ49vtMaoknVNyNn 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/release/freedesktop/icons/16x16/blender.png b/release/freedesktop/icons/16x16/blender.png index 2ddf0deff2175ef16d9256d102a4e1b60882f371..a80352540fa25fc13aee4d10c0293f9751764eb4 100644 GIT binary patch delta 805 zcmV+=1KRw}2GIwQZWRo4MObuHX>@F507h?YWMy*WSudZFYfpawQglUFbVF}&d2(rI zXmkKWLm)wPbaH88b#!TOZY@)2VRB_bY-wv{AZT=Sa5^t9V{&C-bZK^FV{dJ3Z*Frg zZ*pfZY-wXQiv z`7w2-!(7eH5v_kLK_l-hYZ`up5T$|IMX`&zh^U0_`%tfhz-z^@x-kWZDF|g?Q8J+m zC(hh1M4N1WZO3iroPSpd3qh*q_Idfi`@GLf+-^7iN5WwP-L|h|;JiwuqPr{L^8M-4 z!vF-hRDAAofkr31?Xmf4{~DmmDX3ek5!?A%JJTCp_mqF7L&)z8dMy*x3N;L+nOc1b zPsT%3j)iUYw<<}70ZZP&5Mf%+!{rKZ8lc-cD?96383+TR6d(+WoC4G80C0dX@Z=7X zd&$(2cMybYIcHz zJ}|wxIJtirTx`3TyE?L;!CimV&6LbLpeSmd<5UhM0Cl)AzHCJ0ogp+n8N>LZ2HN@_ zh|-E^wpzEb7kji1cyat&1CsH9vc^ur#4L(f7^L6?`bXyh0PB%B`bX!%#eDE=D@>U% z0ca8cpw~Q6t@4}^XG1%SN5c}?j0z%)Yrqe>3x|KA$$|g{gis^xvrJs)M$<=U-3{jV zzEW4Fh7+mS<~F1#62ULr3FnEfBVr5fw^f;edad_&oUokP}xyg)5JP zRWpB2kItMX328E`)Rkc|#IkuLkiLON56N^!4$aLf@}7E(9P~`jEz`|hmiv%hs4H>U z@(dZAfvZR<6zgk|-L0UXd|y-BIwvu9AOHZK**{ycyL&I0Qrol)MVv!XIHGZxjKBP( j+}}Rwj-)m5U-b)d&IUto;~(V!0000idI3$zM2_lt~w9z zo%y#g#79Wj2WNGDe4KOm4xyCdf5fcTbe|Jz#xLi-{C<`kUXuY6e^Y~Eie-y=^R9-0 z^ZJ`0ge+&s!U}|t-a7UqpU7t|2Gm&Gk(yV0Krd$`dB3*53k?6Pc0Q&PD-3#1aYwU? z%AT-B3qyDb-~@o-0hXU9wFsyhLZI(cf3W|{8T&o@c8S5a<3ul643}6@FlbsV)95JQ zqqEvYCUpZCOCi8Ze~1r%KA8 zUbTDB(KC)TgMd5rr69K*h(Jhii>)$1GujRv!|cy2a; zseKPHF+<^>R*|1=fUfl_1lL{6>g z!oUQjG)n&VOk_T?i2#H@MF2zrgaJe;rSX+fUZYlh7^Z*GZ>E6*$uIxUC;$Ke07*qo IM6N<$g3L-iYybcN diff --git a/release/freedesktop/icons/16x16/blender.svg b/release/freedesktop/icons/16x16/blender.svg deleted file mode 100644 index 7835b312a6c..00000000000 --- a/release/freedesktop/icons/16x16/blender.svg +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/release/freedesktop/icons/192x192/blender.png b/release/freedesktop/icons/192x192/blender.png deleted file mode 100644 index b0687e324978a2cac879e62c9a635ac7beddd013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18534 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 z 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 diff --git a/release/freedesktop/icons/192x192/blender.svg b/release/freedesktop/icons/192x192/blender.svg deleted file mode 100644 index ddd25da70cf..00000000000 --- a/release/freedesktop/icons/192x192/blender.svg +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/release/freedesktop/icons/22x22/blender.png b/release/freedesktop/icons/22x22/blender.png index fad6f88526f8b353361bf80cb5b461babd8c2fd6..cc79979d428704923bdd127955c55d8e0039baf4 100644 GIT binary patch delta 1282 zcmV+d1^xQe39Ac`ZWRo4MObuHX>@F507h?YWMy*WSudZFYfpawQglUFbVF}&d2(rI zXmkKWLm)wPbaH88b#!TOZY@)2VRB_bY-wv{AZT=Sa5^t9V{&C-bZK^FV{dJ3Z*Frg zZ*pfZY-wX zQXLNQ63yPY7mI)Hrh75(+ccS*xQ)T+)V3;G*f0x1V!TWoVRH)$E*PEBI9)d51;tCW zqL6`N1bU%Z5h);>*kPHamvbro?SGDk0?|2NY)wABKIfbNc}~-^g$oz5|HBh4y1qWy zXfwv$w62QhE&AB%rq9RC`%l8HTc+aA%02L1-3M=FNyvY?GRF09@h1w~KV=0jiU-X( z;7_fAuXZi{m#!4$vD3=C&_;!Cm9mw`U&VL znhsyNDa@V827hfIYzFoHhE$gMxUiddmVk@bJwxkz+L-cej{X-8LA7rZ-X!k-@nchO4& z6WfjIki4g5I_V29*fLlyg?HTjVO}?1_6fM16Vbi@L%3WnS=Chs%r%X;)!K&kb_$z| zdvhpT_K z9L>$mvQ}FS?*5VqUw*Xwd2sIn*fO;N>)NCuIZV^JiU0CPY$8QRktiwt^CGs(u}&KZ z?tU{8m-seo;N7Yn@?NlX796HAe4R1A@|rOrF>>*w5E)LMB2SZel6+_pYqYG669Wg{ zN1$jD#Z-})6b=+7A-Mlt*w<;rE6aa1ZKrkPW=SojDNiU(`iv6Pk{8IU#9(-lU93)3 z1?^dhA$Rd?cuM9Va9}Ci-_M0}!&I?OuMtnC#$BhiuaW1K;iCGdjUmsG1m#g$FoVn` zrnG4zOLs5U)E-&PIxnWM-pXaH*PIgNDPI=Tp7%yGMPr+Chw7@iX~(bd5g>@FO!K%W0>4j_CtzCD^!DC4^vJ}+NL;#bXH@?SmjaL sKDBa2zlP`9BvWDpCn9Som$e&3m4FdEax+CrT+E#nB!K6)+xFe;D84{>~G5Vty{! zH=Mqm+t~b->U)s>;a{wkM!c1kv#VO$R#ZkKr@A)F%MX&vfARR*HvRoj{j%-e$7lP; z`@7P~?${UgpV_Z74dfp1FYCn>tT6YMxqMO31i42FK*1{2h8v%pR~8Iwh15;^*5#jn zDvsn{YB;P?{|fHfe`nuaEt>8)Mp(@ZB~IKUM|d=Uh&N8_m5*TF85ieE{L z#Je^%9Z*N7_4rhq7=c>6dI8bBu04^~XE%DP>Vjgr&>LPvf2(c<1f>)rf<4%dbzvV& zrWwB4(Vy;Y3@w0f{cB>w1cgo?&u%i@DW) z+L~)n{bwm0c@=SZ>AxC3H1Ff_4fnNM*H(GHx_-&oNb}0oIwgZr0f17Zl~iVeW9;`Xse|m;9u>lI<7L@71PIlo5MVi~Ui}}}pyd_%qkom#PC9Af0e4c=^irBiT zbSp1-!W69%w=Vz@j;R3E2N1GuR7Q{ABJx)_L@ zU5BfB?yL);XrzfkmPsQxk+^c^pzg@O;j3BJ69`q*U|VD>TNqos0}-8FuZt!As%SlSj``tBa z@FHdLf8$tVNye7$Vs_Y#h)|r&;q5$tyM6DJos|n1yVi5EWxtw`o}D5-T(T`pT?4H%wR9o(_+=fhrXW1IrqA@nu(;a{J=;+RGd-)wmE2So;9S{-G z??SzR2PgxaYwM_4JBQXel}3}Uq54OyOF#5-@^BB=f$UwV1rM<{MMMJ}fC=bK?Qk0? mA^}C9sFW(*SNFgB^Zo!ys!0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/release/freedesktop/icons/24x24/blender.png b/release/freedesktop/icons/24x24/blender.png new file mode 100644 index 0000000000000000000000000000000000000000..86e8248e7862ea366540770ec7441176089273c5 GIT binary patch literal 1681 zcmV;C25$L@P)bY*F7Wpd{G_b&hd03mcmSaefwb#h~60BCe{a5^t9YH4k4VPh_Bb#rNBXklz@ zE@OIWX5(G}002^SMObu0Z*X~XX=iA307F9{L3DI-X<~JBX>V>VQ)ppwWkGCdYh@s4 zbaZe!FE3+qWnpw_c4cF4ZEbIEb1rXkXD@7NV`Xl0WpgiLc`b8cFEcJMFJ6OMyZ`_N zOG!jQR7l6QmP>3~MHGhrGjm_Q*Nz>haU4Tlikm(NRE5y02n2NF1(gsR7A%mE*s)?! zxfdof7i_tmr ze{)9XXohmR9R5#Z|EoFx<)0?LbKpiswA@2}=Mw_d#5S-$c9>4S5h-V5@N0ik0XT0-_mGZ`}yi%0DKJ^q zPfp&>-MJ^=RDXV)BK$B{%~5U`8e>}_1~A4#7g?|T8@l8`8QD!{JRM2Z+XhN2R2T^|ZuJJW5}YDd}4(s?)Q-VKNs8nV7xv@4}+-P%UMuC2$& zN)4Ff2T6%U2}}WtkAe*yK$zSIH#!EyM!=&f!0$knEvD*}5}`=OZJpA&& z^pUBErOTjI0SS+orbF-uY)@kTRt*=gl~Jy?&~XAl1en>KL`F5iJQu3B0gbCMn`CUe zi%t#a$2sZ8qEm-oOzuCFC8s9WfBjadeSd;#wH(mwf})b6S7;yonI~#TIHoud}9BI88=4ZuWMrI zO91`YfBz7kc{GDcy^ENs;o)o&gS-w|{sGjfzztOCc<4xh?lwTP`o_)Su?hILs9&A^ zsZ}n1;JSXTQ(JxBtR^z5W^1(cGn9HAquFOMFg*!dB%yPGn7;yJ{v4FTXCTJmGgG)- zX9bd1{v5Q>_uGp)AAtdBu69#m4+nBlaTQ8)|MScIP3hlCyn z1rC(v0<_8%@Sp=nOUaJo*F)c*4M|+v2DIxNU-9~e@FlK%d<(O0Uw{XIUOz1IGomsj z{N!_);dCq_+hkNO1LavrrUEhq5d)b6aP+jS)$DGgX9e{PM3Q??!HauIB@4*!+Ile-+&tr<0tHtJ}Pks;1zWGi2(rnpo0PqThg4{W1a)%259)LE0)wvB^4hvW-+5Y&L zwKkYge9KV4i4X=-^;R6d`c+BH|4{ap0N4P6Em7Kf^z->V>s7(GVw;Zv)SkxxSiKzD zaVXIfbOCe#v;a5&!dxyVXy>n@cU9Eeh#jCU7~ip`zktFXNC1$zTu$Cq!N0ZMVYY2c b@UQjf0cj#ihtLERAvEc|ccgbhM?@(iMY__FBE1uOZ%PrQ zO7Fe5U*3D~_ZNIwD>=!@Ui-|M{mjgsXXd;|DajEN+$R74fLK9ZMil@+*smY}hKoJu zIp5!2ZT}lGk>@j-UMR4U%F@@x-2_b(Pg}Rdcj(^)Ple2RuAH zxUC&*T}+Lg%()$%EmL+y?_&oM{WnP6+SSe+cRhC zTU#s{UY6=WpUJ*T(*yc+4v zznr?v>G(8V#f5OP#y;Fe^yG#-gandxkG^|}CvNH13Z;N|j%u3$WKPC2w3ZZZ*RI#} zkS<&FJ5BX2XgGsZwa@2<)3@WZRgHURawkpt`uZBP0(F6q&1?VO9bJuC4gH!Smm#mA z!(Xd|DY5d*?;8a}$pLxRSO`F_@c;W$=zN(+Gy24=PcW2bnWCG=F?CinZRQJhZm+<; zzdqe_o%p3I^iT8xnV4drERJ~qp#Ct-8s8)pWZ2MDcCpl}{~AEV25T8qcq?jacU^6A zb9+d(^O?r5;&;%PDS#s|G&t128n|Q$v%;;HD9!w|q;ETnaIf;t>u7b5xh@4CV0DJ~ zid=PxtGm3*L2QmvKnv4@(v_rNn=@I{_Sg_8#)0AxkZ{w#3rfV#e~0LoW*Iy)8n=O$ zJWn5W>dfVtXz^-=QnMms032X3RNQlUZ``;9+^4ig z!4^2~il2w; z7v%l!IU_-Q*$T|fW7-lbQzvoGWz1ehunWtpfJ}f`JYWV|!{y}AUOb6v{I8ihJn)Ed2OY4(8*&Jh4bd(s@tJZc>AmCqhQ}VxNCA|?lV;RcNE@RsSR2v zE9LS8X6OFGG@@0EB!&h6)8O>p4@nI(3Yng9NUCTsrpi-Eo+ZxXf0nm#{`*K=?5GI> z!Gd8Kh^;9y-T12HQlS2Fkd#O&oLD0^^OP~@c=Iz;0XwW8?ZgGkBXOb&YB-`rcm0+` zz>$22Cq_EB@tfi14ZOM4SfSgK804zTx>aVT<%V0nJL!{?vjQH=4#-GfK#|MZccFO@KmkxdJcO?M!ELC6__UzoMCt;pXv&|GKwm7ol6rq? zf-JmP7;A+(ZZ;S$juu`G8q#2B5JiaRq}h0==Y70+HSKJQS$xk(@%% zLQFTc)mJTyhLkdeYyPS}yt+vd7jx77-nY}@rr z1v;5W z7Z@DU!iz<;@i&`zRNCC9 zSH=WgW8Af03ha{un>CyNq}WAW-9!7)Tn93|HIK5#atzi$&mmn>#)MEuKE z36wwgs=!i(OX)k`vrn5dAq9N5r$^$?4;&Tb|3_zmdQIDb zpPy7;FU^cF6}G)$t76Y@3mOAJ4@E)-E}yl=tN$?J;b29qn&bb%S+F5l-4=|h6XUgf zj7pyFrOdnjawINtLJiFPFUW5=_wM^HFnmhA^(+a9H){aKzlMV8$i3USYwVwWxRpvCs@%w*}TJD z>18O3YXZ^hso9xilV&l&deKwRdZJLrt8M63d~WRaP^VV4_9yW7tRn zL+DuFJrjQaQ8vJY2&IO!0ZQTnpEeMV*RiXwb{Q+}IcZFuFAHT%`?>uuQ2a^pcCR$U zbGZADqhm^58FjI$*MMocX^uF+V{?@9r2#_nsw~H8!aspqGyq5%iN7Af%R2dHLt#9$ z9i;Ln_;8sdQ~2tGMv+p}e#Dud?F&#K)&);RAEw80Ilc%zJy3T*^_w}zY^ud<$+DHT zu6lvQqPG{<&^g}B6peJs$jZ;qIIyYcW zIWFcu+?;;b6FS7OyM@oPSYF|}h~c18!P%PwU>*d>s62AuwE?K^EQaJ#=^&C(G~p?- z7bx(rjl*IF5;esh&6+xAy)|%o^^tMjU+sVI{1y@@-F2Dv)my@PYN_Ie1tmMX1ofok zs}&#zLdFX3Wfconi_GqA!od(pc>=cIF#JB*qzVz^0WWRv*lP6;&soD3i}o&3T71}l z?&fwG8n$~S5T3&`c#73zUrdx3Dz&_uP(EF35_gihX;(3ZmFE`1>>CVtHKM=bDW9~K zGpOfzVA$S#=c~hcYkfAbu_xb;BxY5U|U)MH!Her|c7hf{HmK#C2MhMt8 z%K+I&gmCHbGSYEp9Dd|00W&i2`6*9~N#IwvbZ<>f3B#^<)f9t<2GyR>RzjXcMhFBO z6v`P_zQ+DkBhqY;8#*Rl^~TGpmz7`TH&bz(Ak1esix#AI_IEu9W3*Do4-Lg7ig^xe zqShPyZZXiB^dMaO500r#c&7J3%9g=ZPXC16jF$5MnDgml9+V~{g3Cv*#F2tvGiE>x z&a~GH^b0HK$khy}X68}^Ev2TndDTkKkx5z^Lql|$PEtkb1 zH^;wU|34ukv#y%$UT+AjUdky88()nsXK$|3GZXq%`(`PwcZ@)ze zZ2zx8OY~|4o90bq`pNa460cr1ih~P;q1t0iu>dIMn6sRY8y(NEJ=BI5$V3DW*)PO< zNIT-T<2|OmpL?!muVh7 zNX!}hh*N&mA%7-BW~PYVjPF-?29BFknsSqAd&#$F3xkui@VK zKmMp>e67&5io(J>_Llw6q;@m4Px0}wG1jc*0Nj2yyHR#bcZl;nyMVyVRDdE6QZOn9 z00kP4nW`=+Iy7KaVChEc5l>Mj7&;z&EK1KFY-4?Yb=v{!+OR8?nyTKAwKlwWxgSPM z_kZ@7BEVa}a#%Rxps*rWY4-xJ;03hK0KHvAjl!My51j_jRN_zacpVW0H21Z^l5j=b zg0PM1_xB?6k*#`CMfOZ9$q6gItJN3JePU&_ippI_;r6cu>XJl zyqoY^V582|`R4mb54dPMkVCQOs1f~x$z|Ds?WSn@pFf%DMtc)@v^)g|oeHjeP^(Jt zrA{n=XeSWs+NO_(zLrGV4qx|}W`Gy|H%MPeD$&uI<{9MrPUVhetm5520TcQ`K6Mkq znVL?C*27cL)s^#7Ak;k~wsp#LG_n#11TaX&u%flr6?&U-zNn3~d@4&L#T|+t2Is>w z7a6`w3e<*rucdNa|qY);p&F>L(htsFj?n2=u!P}b)k z2S%x-hoZwYAz|i_5EuwD`e%E-8^KB|HQ4^;*T`RJm8`MctUnKUFfich zvf*W33}5glcMCj=Ns10$nN1QZU>`vil8s|Sx)~#?Y~+B2fx@58_fn1qeoL?K4q~6O z7PS4RN(txjol`&10!;&l6aK{yq6zsL`ot1dW0SuTc1YLtMEsnmVI=F z$2Q(SlKRUWpfWku{5Ic8D8Y9vyGvO%A$E&SYIuQn`I0_<2KI}NJ0!ahErhqIo??t- z+mZ-KUoS(fOGaSUoB&qqg;yjb1^HBuRg%-tDoK*|4sEacuZ3@j4e!ns9;Y3DBg7|p z1$a*O{K5b9FG8|@0UB0?AkHT-X3+8<=w4^jxMIkoiZJkta3%f>EgO|5drX!` zEm=S3R)WgClcWgya6Mn!dfD54yjk{{{j-~qF3q);(}l-rwbbS|7{GaS*X;C>7zKuk zSG*exbm2rIp10&#t<%QdH3+m=qI#R`zZq|Y?$w6*?_dk7Ke*K&3GQ@Tjym_eoVuvV|Cevc!6|MSUd5wXwHA&aD1Dn#t zZUy(%+T>C;wdTo!BouJeeVXuD(Kl=NUo;JiLM*FQJ?Gv?19|dSIVs$6{&QQ9*s(G*KzyMvv@ni4Lh5gtet@sGjp|8cu z!C_lH&3l}%sGng$amvZG5g;kv0Uu$)wG_i|DZUH8P_BpiMes_%%zr^E;v>X2%diZgU<0}u-xr~t8P7?n=AK$P=$7^Tcqew0a^DPiUXo*+J0&VV zfb$`<%kp_^@N;opPG9$XsOi>h5d9BO^!${=;v9^iz8_n3k6U6UlFj-~k1Xko5=|Pg94KaWo<0jc=&o{tD z<$TL{1ict5duu0dbk?Q%yfN6zX#eHX3kr9G*wy0mHe2Obu}o{W+iP(fodf6sla64z zZ%44!K2aIw)lf#oM(24u&E1;784r4>&8z1KpaEJJ+!lE={?(8pvh;%CA8oBTd{Y|c zV3aU=I5)-~Qy~3EBgR(J=`r(ZG)|z=%zPg-qUVMgiSSk|Md0fx1om6g>dtz#|{J<}(6Do{>h9jB&>c?xQ_hk~P?4++aP>edD0B zn*G}cGe`6gM-B^QY-q$k9I1MUY)IRO2|HvGHR3)~pb-&D)hUUj-`z;jK{`i}u!0x= zZN`<~-E=#T;BMcQVcB>v9zXD(|Km|VfUs2aeeVC3=Lm4%m}!GQYp^vvVcM|9R59t% zvDOaD+Os_hQSM!+IKQo}Rk*C$J0kNudPR@e?kP1of~1fN>QFL(LhZ#I`%j=hytjn@ zo{@nuflkh3Am*Q;TZjPnwr=x|Y#g>2S^L-QA(T5XG8oT4B;toEuhWn9FbX2z{k|_v zD*&R@>&5&dT0M4;C;XkCkZVkt7g?viIjq#M^8T)VA&77W0;EfOS4hOVIq@+fxv`sVFI+vElRZfcw##KxsDe+BD&xsjHqMSpBp0wAqW2mKv@S< zi32a}jo{AB)qCTfZ>ljO(KCvty`3<&Gvf$H2VJh!x7k|4LYjo z2)`D^Wm14U6C{inQ=MgE`IHKNyo$2!H~pu@Ja>Oe&RRx1197N;l7Z+GIvEi)cCqol z0%(egEMBx3<*PmCo(*yIU-%61&mMo-EL_l@+88g?S|wrOopIlany4X1^taRS&P}FQ zugRzydc|B-odODZF29OAX<@8vix-b#fbAWT#(7Z`ZKuTxIt22CY#_SbIOMF|L0Py}6PSp@Wu zIC$9y7<-#!XWq4>61pwz?k!QolNtPuO~SvPjZfx#|8>6uTKUb{Y8Es|oq-sBK~;k4 zewC>T%9qwu7VmJC%q_|Va#}9q|EBxxhhhln%Yglfxu2G-+9H(!POz`KK~gVR6@uf3 zr0Mk5$P_|iYNzucS+5=#Crek?a2OzzNJI=#$?V@SkAJn*G>1=neu$`*=*WpCd?P-iSfNa{rK6d_^AKVyBxLo8}$&KM8qyZP~~XOVo#~m zSH)o@0?05hvaa_Ge+p-_Vsq+X)22YkblxpS-rr&G(7tmTc@KiM99|7ifpJyHkTRqJ zW|2dC(?_4E3=p5Ri12xIs*jRPapnL#j2TQLTpG)hqhaVkl=fAk@dIJ;}y zjhUR)5z&$k!XXDr=pQtURj%-yoDw5g{-V;zSv~74g(SfCR{H$x-C#RUjF^Gvpw!GB zN|xZ~r9G=r)R&JHJru2PLYl*6b*|)xm?-|-H&$eI46;)G&IP5V!gobnwax4)m3S+< z8T#t*+A)$2lgs1~HszATa$CQssE746uoFO>!1gPP!bsYe)l6$3Fl8Ci;5dAAWYYdJ$rT zW(|C8t(A(JKH`sR<1Ad!9_x3pP-y1L8KX^<(cG5# z21NbB^TZ=yxkp{nyLaL7X!UDClL(*{WwJ*IxOTGuU~)Zn;uH!juZ&8c3biSKeHU&2 zoj)(+wYzrv&*&eNM4fb@v`Ft(Zyv*|+DP<<#z=~jVtnJtC+O=F&gISa-bUm*Wki@G zDWg_Vx%;bomz0ek8P~ypltPDlPV^Bo+c$YOs_c=#Xc*J8@8$T*MZ!@<^;<);q+S1* z_I4tdrDe385&`(vM|QbzC|*bhklPyTnuHBhy~X+Q1iY^+GQBUz9)AAYcyLd|gMo;t z6@(9H5=S#=yD!Umd*j6#Ygjoz37(5RiBn%MQUcWYWme954I}QE5EpPIkSK3;f&p3f z`yVVe**$mj?WBo@;h)#?YR3$<4phh7T%o|xUUYTiKQA!)bnA}@DWWkfbCk1-0&CxH z{Zd~4*lAY41OMn#ZGI-juDl+;9vGX&6Nb^3Sz~IBXD!W~{WgBQloxV|=?QH)3$@m^ z3f{u}YFgZGDph$r5QGat=SzPvfCJ25;8{7HSr2<+BfCvhzZ|UPMhqZrX`QIGBVZ1h zH~xqh@0BVt*H*D6aO}S-fhGq`~4Z4?U7hJ)j~`!wc{-x8^?dh*I3m{ z+m6n-srxmK$H(J@0b@jPcN@a{r$hakZbo)!+42SWK*h)R)Kp{maL_-{3LI8hCzHzR zv3uG%@K8zJFLYJQjRnPIc?w}QEg4du&KRX*J0$>CXk0qp?<0h^t~w7gKgc~_W?N4z z0yfOd%0Sb5>Tw9J?}3E4A45UrWZLM31BSNnd|NEe<1h-LEE~K8_t=zo(JJg&Ivhy% zfsB5!;L^r}(RM<7fKzJjnW+2Q&V-hXy$v~?#gR0ynKP5DdR7QkUa0f9xa`icHWS@a zq)~o*IO>`fO#32erh$I5+!S$E`ss~O*Xot@d^>ZzXe5oyn!3@4@@`9r3@2OVy`XQw zYa{m8Jkvh{@P?TmL9C1E_AQ9u1!ZQGZtY0y(j|Q%=g0wvXw1d-XAg_t-1A8n8j%XZ zsi$3MxH%JJGuw$zzXj!=(5~l8T726X-BP+>ml_pjyK^Zy-}zQ7_~7!Z+V|O`B&UZI z6egbN^(2V}GN=l_NrD8}03EThZTsZUd(LZZVF!#)uWn=TpAlwUB0*|&Hs*`#7z1_J z`DeC70^UAZL5sSv&z}ulrn~bP1!Is47zexu^di{{ebISGHyf2*ncC2NGcVgAm3~Cg z?w32E%FC<5^IQFb#8hJQ^Zjaqmz!E!(LKDGrdLktN#x$4i%)<({gwdBNfC~Ty+ZX` zF8+0sfH6Mv#v9R88ok`sz>vOWcXf+LsHc7Tny=m(Q0<8>RfG;Rupyi|U&y7G1%#!j}xyE^REznz0&DX&NpcI8e(BzEl%s1>$VBEC5O zec(RI@HenM;g&phP_j6(NBRp_{Z!s-53zDjtDjRL=bO^4AbFx7bwO5asfR9S_Alx= zG0hip<<`sPE*|v~Q8;oTlLr5ExAmt7&4_ry;7NIWp_DsEOf7z>9`9l95X$tDRORd~ zEhrM#yMeXKZMqeG0W>!kyctU zI+3Z5ytSR&eOOsPNU`}MhR02T>wE22;fc+c&uVa2Ct4R?h|+^i`9iXpJo?N(k~JaK zb+{c?C5v9q&)xo|h17$}W2%iF1sBl9B!CLE%es_*m4DosvyD^7*5>jPTWu+wiilL6 z1Wz_)d@}%-Y9fBTG9~g#Y)9(U24<=rq4p%V&8^5%g%AiJZc!>wh5cLOm9;v@qo`N- z1f|h8o+r<#Z?`Qamhb^rCe7$5V!@K@mHU4zv`3Q)a}Y(stO}=L!F;P+xa52z-%P#x z^YXQlpbX|1|->WFPy zEV`A;Zm)2ktzPFRA!eP|j&*t|DMMypLF#3(#ka~WeDwj2z7=wHmAl<&O?{WqBPbYe zr42E8`mwlxeS4N9k^7zAkL<9CXD^M1O@H_(Wj(nF`SGVB;`ke!iMA$lD8hX$Sb@M9 zr$46u44Hf@re2OHvPR6}?TkEQT6+o9kdTWy4;e4BX6Dz2B}lQ$_&^T?h*XCOdV+ZZ z`D!1i?nUnNG-t?YQU39H5Z<(=BIxq~RQlz#I88800QLk-uHr|u12Bi6Uqh7mwrwaw z4<4fm)K#8x#LP}Nt=)WhcW^{TLVs+F<1Zlb=tjPC@zJ6@b9H1#n@b})pKI$9n)~*0 za^t8a{Nj_XcK>idV`hR2hFB=!NT&XZk@LbQ~>O zwD!T}^fR;$z7yBETv|8D74kSzT4h5#^5K;)Z=n_HW%S{X>jm$aIANo7{F++A(_J|u zL8WkD%DhHfAxhJ&uVbx^_pS1{w z5jZSq@8Zuv8kRb5#Q7>qgiX*xy-xAj3c=<^#K&%yfvqP1y1}a8y#wt88QEm`+v89m zL_+3009I8UArWKP-29D<^vBHWT3S4@iJl|$xn6`r4F>32*GIl_(ZPk|q69o}oFLLo zZ)M+2erKbjQv41M-Mo9Z%TP5bmWVCaVvacX^q;!xRlS@iQ#42(JTWqwy1&kWQ$(40 z${p6`<)gFgg4qxkl0Ungs)#lGiog7D9lE3k<@+ldL!2$4oy$0VS&>EWOdg@YQ`-V6 zRm?hFZz`+4?a)faQ6okFGi%t^#I(U-lfi2{*6AzRiUzul>3K9RX3|-ru>_?k>ZqZ*J z-BCnMF14dQ;Z}HH`+(OtfAgT@NYR2tvS_WvFgM zBMP%h|K)uiifyPhU&m>)svtIf?)%(X$2&EApb_=&W|WJO-_94Qq498DAnJO756e%~ zX;?M&XVH5LCncQ3&lLjh{={ygeqBQVm?>Zi2!6KUgc-JYiggkdXARu-OGbR?6S2R+02pJ>XI|bQ@sEiAw=6 zlAHknf3%tfNPAA$m zUwkN@R%H5>1d5)MXDj*QB&7$8-lqMqCv7|Lqz3&ZVhgDKLaMor0QRdnrQUsCUI(!kuFm^3~!jqv(Q zik=%=$wrcLB2u8XsSM(g@-6)NIYj@4ty-eCOwKgf^(JC)#K3uuIpvW-CX=K&c~`V! zxJU&h*OyR+AHE-|91lq97YKa~LbnK#Iu$6oYO=IkP{k9ozDnX}mzG24l2{2+`X$O& zSSaZ<3%_!l9g}2P8bLTXd20xSBw#lq&m;>(lk~&OI1t?~7tpoh52;~nu9FCO+@|jS z!(VP#b$)A<+aD>dO|c(Zzu!S*Mpm_AEq;x3(kO4t_M-2Q|2}bUvQ8qzEI1fBdi~5(Y+#`a<~f zZitbuyANAXt!>G^6f0Mbhp);S*cnN-_=s>|WD*L=E}v}b&{Jv3nJ5>PqQ9ani{k={ zcGpT+#pmliD_>Egq;piV=IB2mVV2+}`l8A7?jE+yXnIqP$vhm$BN!_}7=$|Mm$IXw zgx>I`pm(SO5$^RV-{_eZ+>K}4XSkolqorgPq%iqY`RexZg;agd>8b}~->~=OQY^bs z*2RN0y!?O1o(_ehE?Vsk7Eyna_D9@EL`WqmnV#d`9+;4Q0Dzu79U zIP7{qSOoz{5Emmoe&KEsYyKQ$voG5X-uhy}`VYbYKW_ z;ivOqR&~#M0(_rkiBLEh#3Ahe$b1y}1ZlJCRj1srrYQPUJpA#a$Uo230<~-CiX1O2 zc7}_>huz+?hTZ=7bkgth?)*@^(aej~Rn}jrbk_SaoY()9HuFHhmJvdJ>$5B>En&?D zpB@?zG7`Zq4Bv&qr$>+;n874MN}f?$1I)&|HU zc5LVjs@}HZ{kPzTvpj~F@iujT58E5tlG%lR_4xP7i<(MG;e^R=qM=o_X*gNev4Ngc zLL|7m+wx#phU`n>PQbOU;fIJx|F|DNqsfd+J`&;k?r+{z`4Jmn>(P>+wV| zHLcNwUrvktqNMyPvLhQ0y5?)qSD^6 zUriQ%5ZEm2JM_cpIVD1_J)$X<`c*NanFdZUB-s}>(!g5(;)_?_3PviOA{5fsvO(yY zj~m+AhW-z=9L!o8P5@LD{q^=w{Oj{k{CHdUzwhinw^KLgS>b`0bS559fJi~WCxh|m zqffe_RV)`x&8rSMms=CrQw;W2?n2qTxk!}HHcX~~iWt5W9I zB8*dhyG7)HXS2!8=ufwV*Jt&q3<*k>Bflj=6kkB6IHZ_&xs01P&9NP2ZG|8u$_}p5 zLY{?mIqrLN#6Q;rk^?09}O2j)T^{RbJP|1+MTOP^Y~p8*w_#JEhRa; z1fb?Fth&EiEfy8Dh^eei>0ew9nD!njy$5)f=-)10-IkjiDfdLC4y}5}>@fy$H^dZ^ zC$UP?i4*l5nl{Nz7fAhij{ch&s&nfO-IKrV%sy_TCa`vRo%T*>d6DI;=)*uAwr^{% za#Wy6>kZN1&^GR#kS2w`rF|y7T)Q^Ic4QQ^ufG9 z``m56)5_VCN@S)+lANNzOV)Qit&3XReH9H)MGiP4pMz-sB{HUop2cHvz*6UblEkN( zQ>ww>{jsDVevbj!oQFpsz*P5$^&#;|%sr;F;zQxHRE`BLcnQPE{63AC_r*`P&ghI4 zWgxz)6zzW9ocC!7FwNC#pY%V6q^EIY**iNCQlWfcXf&Dq5=4fM{g26oUpH)YlbDUK z-BwvQT$8@a;e2Z$cW}qxwuI@epMhvst|2kxjU$&IK#$VZvBp10<&T2|Ba8_4W>3-pxUm@M`!U z(fXLr%Qoxq@YK-74o`I|0K#k? zTMHxcT?Zx-y6zQKf;sQjQ7wV`z2EOcTjYWpk{WJY|17l-k1r^(_)+0Nj^-N3Ynz1t5`>gwq6{1~&2BxBZ~7;8l~Wf^7|0WF_fE9Y{*hTM zd{0NT{=1hxc=2;cXv7dnWgci$Diz;Q!CsvP;Tw`#B42w*`lhVrq|r8N0|(Cmxh_!#js;j;9c zXunWk_quf{eI;58nUe-&Qwbwd39Xbt)!In1!P_fsk2__u{B~tqg1Mu@rJv5cbheAs zTa+5NOI-Q4oAbgp7tKImfMj_+ar`FOMI-PlP7zOM;?2#_Up5r8Ow!AP>ZR7fsUfNW739dL5Ix`%pxBRtR%MW9KR^F? zFQr5tFk)PG)QnnD{IFYCSE-_@aeREr{CQBy?a3UuSsam{r&#u4dy^Z?D|mdxp`z?D zZ)D2pmt|W}+&aqm)(_iL>VGTYxlq}0IG7>!F+=2hT0?ZaL2=y_2~3I%vTEo zMY*6=#|feI+_@4j{BBWTz=wU3i&3OV4_kS&V@p$Fng1JJ*@yW1P<}b6fIYweQ*bJy zzWff{1E@s=o~z6lw~I>6tb9tB(sH~LHR7KuO25{Od7ECYOzNB@TJJ)YaW%&RB4n(w zapH$ZyckBXa{aLYZbFQF>IYktGGWUT{ThUSb6@>=su8GCL6y2u@q)8kpww$6&J3sV zo->7`1jFubxJd2k2b`cXY=?=HUZx%XKr;9t;ri%0kGQD+9Q8dwOSJz^`AdDRj*7WZ z;viFEzw~3eay8t~K*DCYe-A$TD|X*!8XU4j_lwqHR2SAlLq38B;$k%c~i|Iy)l$+lUTthAini?x-f8QNbE4itqsXXX+i(gGc!q;adQG5j*Sun3dCXafeW8BEB})3 zb)%8pRTom9h>ze>7eT8pR(d4R<%@9-Ta@R|H`LC1zuybo8{NId>s2HhO)LYzL0~s9 z1uAUfJduUBT(?qb-A$;wBlZ1`nz`aYGCb&elSfO{KkkgT``@?jVEw+7!B_vFu)i`J ztL>PgP_2*D43&*^2)I<{E`JYFEps#TMcm58R<(WgJz%}#FnZ>!uY9njjkSR1^RL+c zGej{tMG+A`Nu~`dj3j)zzS!AQ6Uw~&Y3v9!)Wm2IIcSr0`avwB6Dr&J5+}GxBpkQpf(}EdI}$<6mTUzo5+i)U6gpx){#nvy2VsMN<{#O)VVY?vu@X0 z28Mo1VP&6auXAKG+qtv^wM*k{b*oc$X|p(%;~^q|&3JV_vJ-Y#i9_d!oCtDc_*!%3 z{ZvOTIAv~nPN7XSkQV>uqPKgxhI=HAIl|70xx5Z zSWt4GAfMG8t7vw?ZT3~ovr!A5tp4F2;hM;Ka;>Wh;__$>F$Io$A~_c;Dd74QkJ!3^6(h=6a=Q?A=gwJtnO z=rSL@x*N0F&(X3^E=|ygN1O}bGQCXHy`*PCHlNshO;)d)ApqEU=kUtFcI=#iRpCPM zl^l1X^eZZq9uA)epdG~L#D?t#qw|gw)=03qh^n1{XOD>&G|qn;1LLT znom8CtLk#)n{iEgl-P1d<9{$_2K&w^|N5oI6Wo%9s`WhlIIir)>-OdafM0v>)nJ=x zL*$%80j>{MCyhIi?h0*r(|_=cZjSGz;fwuroI_iULDVHn)T=X45N3g2 z&wuf^A%P0ItgtzPMyPUpl3JvD{7SBC`lJ0#xRlTp&WCbTTDFbQIY#qA$n!m&E5cae zA42f-;>=u=?`gl`K|!&YASLQIgwY?Vf4WQ~D?TWNJiD3=0YD^1w@GJu&Y~s$C+}bX zgVyQ>z>W-gcDaXJ<05qSIey6&y6=c-hk)b{+}$|yt{vy?QR;f z+$plcIi6M5jU>qstwQR)^;q`u}B8(8$rbSGVwr5=_&z5;RBdcV4h>z zOy#XCF)&Fof0i5B?wCl^pZ#07JelZMB>EqXQCnySP+$pNZmmLeHCDgbEv?S2{v&c9 zYfI>nPLT#HyxlSrM?yHiL4Rp2m7Uf6#37;hwt(*z({^e}Wz+7%sJ{2IA-k3K32Ly6t6>>W9M+z%wJ9%%yI z@f6$WM2*r|T~@eOgR0E)eN?!Hw~qb>4FXYVr^(&SkZqp0{Xn<`^X2Z4#VK%KC^+_a zIJF8hQE7{qyp>o}Lx`LQ<)ZUw$qR-q%TC?9eLqQ{?lSJ4(@N1NLvr%*`aS8gH7_)B zq(uM;hk|E@anzx&o(JB>AD6exdkygzr~~`Ai$7VOr0y=JlDygCa8Bm`RSyZpatwq~ zf=OQk`CO9(ibw$n9?sFO8ETZBb$A~7dma}o1L_vbT@fI+1NTV`Q?C2P@YLHY%-niS zJvUvrbiD2JV1KHO?un8|wXV&x=*&snp_Hj?&v&YY)NNkqJPNN8yHznj%4@+bZ&=#G zUn>bwWcc@YvNgHH%gZ`sLb z-G1*LaeKAmAWf~h1&Ty56OLT}nCuun@J&$AhznRV=^E(eXen~ZyVB!Jp0P2G3H(tmZR89&-y5Cc@QuAs|+ zT6#}s4>D!Nc&eEjEx^h;$}r^6PBM~{VCPd*Vrsbml_K0Rvz z3U4ydTDy{X5hmJUU$pbG$AnpAF@BFegs7<9GdFX|d^ zHG1|Z96zgi_27gDu|iupL?b!o@Y5<7pEtke*Sm%dGxfytnBl;QANZSRp6Xm=UJWYM z5>=kgJUjs$t|z2D-3zy`NJg_6tEw)-Jh?sw57Y;T*9@C@WKBPq>+lAcb?$vjn6|-* z*zIi(XxRj(dMzJ5?9CsO@Di1IC%2~M&nOjy%_PEoc3Pi>X~M@6W0lUsch;^~p->>8 z=;I29(4}&J=Ttp2)8~oUQ3|VpFfgHFErMD8f=vFxJo6>dTj$I*0<@o4C3lMriV*aA$h%6CVC5qX_2v2U#9t%*1| z<(&|LIErD|3W(xx_}Nl8S01I>&$WO*Ue@$OGu2%LKLh35Z;u{A4;Q?n9bqnOEaB!I zu9r;S5+XYUMpO7#*O`|qzvumETKwE|-}DBbaoeq1qmsE2mlo}x(PRv7$Wg&M1JSUL z$)=PoI1=y`S{N{Y*DcX;Y2M`HcXu6tvo@p|=y+${{bD``0M*3eCl!0kO4fJHc`TK< zIQmKg7>)0`;&v0AK9uj5qe_@ler3L;Doz29nLy|dj3AU zx|lTo`;C0G4yDt40D7!}{MW+e$VjGsGCWQj#zfpMg-$diBy#-oI8lP_&iRhTbN{^< zgM2@N{m<@@a$?c>$pkHyw-ZYtr#(``+nV15MU>qS?BobAIv6sXJ@k$`&Q4tRub=nC zIakwdOG^|){2_$@mlunY7?nKAd~)7Fyp%HMhQh&wlhAJQjITTNcUpfPh(PlD%gpDgCE-=r(}yB~fT zd?mBm4aZm0yUPbXx^y-z722yAa4y(b6VSdriE z5jO}l-DX13XVG&3{=LpEuQ2G6zMfq5Y>glSI=;G(=P8mq+KXIX3>vL93w?O14h$SO zA?9sq-ZOO9w3150!7##xpK)NfL2H9eGBRng>k#b-A9||r8Z)R;9lhZ4*hBrTy}zX5 zAAK07spbGmo12tA{Suw?lV`u#CV#9uF?FBC|7|un3Ziw+3Phsom0PhY+oN_UA%ka5L*y{?+K_(X|Vh=H8$nTgo5CuXZcI z?~n+o#y|=2rH8c_Z!Edf@b-JZ11|L}MPyJ2gCyFDY1@qsKo#OE($RmyeA0a^P%LZ( zEcmgU-55{(Gi1$tob$TJicggw6CVC*H>iQjGQ5@V#=hVM0n;g)-KA3e3N`)E_S^kU zJzfI)j%uP8)@9igQC~mk%;G8#{HhNk;$eC?6|-s`?nS^nj^{P?G>aWm7WA!*>DwqN zBS@~1;9tJP+~Ztf{_D#_<)_+(mlP6>-yBO+yGt{YLss^yoj7`k5oUfEzeB*J92~)f zCrc!Bo?Me2teIZxZT-M%S8Apj*J;PI(;!L!4he(;2&Wlx zx}jq=xO){B{|a~^W`UPjBP+{fLght~lb%81!@BgL)g!;ck3F+Zf#?4I`waK{`fv3Wy-xf^^qLBhnx# z-O?c~j8IUdkxmgox_jHl@A~$~`^OvC8|OTG?sLw4?#D$g2y~5hQ&ln^N`L#pUb@Zu zTizMzZK!13lU6EqxTvw75?qnWc>TJYhcwK4nJ(qmhfvT2W==5e%>d2&qa!m49Fjl_ zfu84dZ-3Qk-{KNxPGRnq3&d?t;uUu!+uR-YB ztYX8jY2g4t92<*#yq!i@s;??IR-M#+Z{N(s|3_YCq`4QKDbW>H5G@z7GsJbK)XS;7 zsXcAf{3olH6CU@$cVO`>8V}l6PE51XpGed3HNS4FPe3j-b0dX7b60>tVNpQ8dNCy@ zpjLH@POjDVyuhDm&GLssOJ_d;vnD&mH#2&R>EI$Bsc%#b(I(!ob3KnIPyqrQZX&^s ztcUmQBDZ8gz_!uT@d-3Z+kP8o?JNJ2JV$o@YSUA1V#U=5H%-`eIGDib;Yd9Ey7zB+ zz$oT0k2($};G$(2UKj!O5!1`FS`ufa5zL8mv zMY?=-%&&R7h;QO$F~6|YA0vIMH?*fuyU*ujxOa{VM`l9!`4b~wRxA|^->!V(r7$Tg zeeJJbZ>V1w}hOc6^ zvE7cgc3u-tbvt|yg!6}@1s^u9yPt#=^5q2FEINyS95xHUbAF#>7+^|ECeUcflSV&l zL?hRMddxSd^DcUiABEwc+?a1#+Ezp1Z0*K%cUcdI53c89Zg1jXN%3STT#T+NycV9V> zOix<(x;XhJFINzQ4=dr9x>y72=X{F#+Jx8RWM z?%lQv|6?^M=_u|{Y9wOWB9N!vbO<`>cGPsyna=#9yQHt*01ilpra*8!%&B~rPt~Br zfUY;VVdH>}+)ZBh>V@CNDr)6+kUG+7Jo%^4Olb@quz(D9CZma-T|CXel*LmjgHvpt z0PKP4!TeP$aC~sw-m4`+7XytR~# zl^s*ae3kNQAF7|p5F^qmYe%b>^1jG}O3p_n!Z`Z(s7_Syl9A@s#@+V5Tp$_K?OcO^ zxk#z3VA~QuH+|6;EO=uCHR&&>b^TLdkyz>GJyRIrW1;0=-0Z($X4tJ~ZlPC51{#iR2fn=xx1*krC%0`xIy`l_GZA|ZZPCT^Kp=oumu93;Q1!~hUM%!ug5&G!bZE8uA3w(5EJf_mB?UOJ!7t5RnCs#jH$*| zFv_n9uJ$B;s{W`Y5n=b)Tpl!6X!;uM^tX@ZUTmcIjE#i)mKO(rO+Qj4ulyCntwLxt z8qW8wP?BV4U9xi#=iZI!wcolWmHAa?c!6|K8Mja~;Zr^GpFuC7N9Htf+f>fCgUx_& z?0$)@(2c?2gO;z?&-%8+Nfb7OZTp7n{E-!ApBM1w3ZGyDRvj>ZW9>h;du2&`jT~fB zNH2d%SojAWAmcQwt0+GD6bxkHfA-DJohN(i(P#p;UO#g|2~)|k&G$VorQHD@zjiZg zeslplDE zL@iVv)tUKz+WScBc752pb6ry(?9x^FY5#t%z4!Cgl2P3*QzS+3YhVDVY6+|g5OvoK z!vOsqgG*gnNURY40s6v9WRLnZm|qfS|1GF*DEjfU*Uh)c)W9UQWOB>UVd3Dy6lmlD;g78wl=o(8AhM-X9TVJZshzU0Y`F5Ve zY@TRYascz6&X-9avC5qBxa`;O`%tB&9jLl?R;@o27c3tz(AmQ?u)UC;e~VekusMms zI^^0jdChgEA4baRka@uDD@^#S3S#K9AiVbN+&1;jrCE2oG|Ce z_1WA0;WXA+`Z1-!Yx0|S5sv%BmfQQE{}z-C|NhMqdLc>r>si6)!57(^xKWdI4j3us z-;FW+D*3-m7j$`V_KYc}u9M7$+4*cUDU2bNHu;<8Xw}o8SKX%i`S$ zccqU=GNX%d3AXu!#cWJaZ0DpxR;S0J^SO4h;~ydRH7bl|(mgJ2{#-HX@L)yXKATdI zr+%KBF6NZS#8KKO?x2#-tSFd+*@u^9PX}-Ao#J5+_0$%u!LWB73zk!L-TzqWL2V$> zO}%&?`1Ep@@YS1{9T}qY=Z>zWB4T$;4|prYvR{zVd3?CF+h{*ypc=_AX=cbf)?Ssg zJq*}uD+YuK*kh}H8MTmn`92zcBCgk@-RthCEmNy)_!=JA0{Q(VFl0w)Rr*%0Y@hhC zCtR=Qx=#CO5elHyizji3DD)8dO;Kkeuen+q=!4Y0KDZs$hp)@J1-IQiq554C{R#1r zvVYT@7Y%W+_)F4a6i<+f$qB_By}w$(KN*g7?~%&byHJN3@t1`NJFqgYN3gVL`3K2-)hCLQemuoU3yKHv4648bM3o>46MQXEF5WdYzC}J3m#v!@AYI^-~2_w zAGqUq`l~znV+z6_JnRBHHF)j)FVHqGIFe|8|2X>m-#SyMzAh8qh!Jp+%!;h-6}W;e zOaGv^(3^A%}*;7k7)h94e3zXeh{I=aLDYo#` z?Pss+A*w5N{yBX*Fw}q8S|Uj-D1~!2EX|Dr`D%DNN2f@W`HcrZJa8l%Wq@s5+x=3eq8n9 z6N_t`wwfrG z!r1FmI_9IhNvruVYTOKU%s85JU2z8@C>e7S3(qZA(j9GBNoftM5$~HfR4nk91x*28 zHK0se;0Bw#vjRt;@!Ud-!;&|?-OKs2`+~OB-bksb<*!-oC#ugl(VRZCm$MU}MWg#n zKw&nb>L;v(<)ne47I)u*uTk678^`zAX7yXD(!;ryC)5tL6qy1l8?;KD@P$xM6n9@w z8q>Dez0U`rC@1a@3G?SL-~&ew5yW`u9}_lYeW@>@J?z5e=BL>4s^P|QRd+!D8un&R z@)tmx)eGj%BgK__WkdA8rPl*_Y`Cs^z=X&sj4=kM^5Pj1d5St;z?)sE^$?HaNPILC z5i5LM!v8d(obry{HoImCI>yrR1k(Hp?2>-Ni_P}&HCJCf0Inc)_NNog9qr11;j@&k z=>jkSHBCFQM;VuGZ~&Y`Ti=`(cK_QjDx?$qO&q#1TsS62IL;(xNt)e49$@ojvpV!B zWCzpA?=$qMa9vI}RP4`zD5=<^+ojNvd<-?>I?=_0Sfct#dv+|32X>CTh~+=(5Z+J~ z2)^f#+k5@`Itp9Mt^l?eF4ly!N?vv+MRNs?992=39Q<} z#FH&2ZSzbE=QZTaa5IM|x2oXPY7xFqk8j3q*gT@!_0~;TVAMQMOCe)^e_S*-B=8mu zxMp&G^hw(N)$1s?C%huix{g5nUJ_}qAZBnaO2rIn!tSVIm2}~;MGv| zKp*T{He@gF`gi)eI6QI`WdfUdLXh11So-xm&FT34TiEljf-m=u%&gVJ-tuPX<`{Q3BEy4{cT`vCd{!H`Z9*TfXGgi2_)3owxbNR)^_)1?}lL z-1ye6VhehV?yqjfRN=4ee?BZ2m)o0pm=SDof9qIqwCePnq!J1tyg{0!dHCCjzAZ*_E(B=|g`8n@; zkbBzb{q1XgSL}>~jP&k7;Oi^+jK1ekMS*wnJ~~p_P!5&mTBs(I0#?z*^!fzSf_LDX zBrVRe5s|2nW+Ew6n;+2l=$A%E3+=jz+JJ^^Giey*1#j%&r|zg+Oz{sHMGt&XCj zeD|QgXZ}}xj(wM0XkX$Z!%aLNGB<=;uxuYFr3_x^bkn5r3`mCis^uisy~F+ZSexdC zjuFj2e`-JR{67cE1`zl=nGcMtF zScas%$PUDS?W8Q2bT`cdWJeb22DJx?0}htkb(56={H7h3>1002V^|I!U0tcfEFD1M zuGqDQ2RmBp$_2mee?1msU*iB=IleB?e=Ch*J9vs1x{FoH^9o zpzpuvE_cN6FNPsJmQV; z-$U`pu`KWS{>q;5Kuo^_xhgX8cKt&0aZ|Q|1JTB0+-Ia;Ni)s3h}uO;D45lbR{Vv7 zv@+${QZxbltAWeiHt%-k7zVVI5iOlGzv_M(PaM+1{Bs)om9hi@Vj)f4?T1G_+A5R! z_%dTMi`cnN5G_C-A&SC70-49sxuZ*T=%P(}6M5Cl4(QmH^h>rq%|B-x?5Wu>AxMz) z`!$8v<40T7<&B_9?ZU#?PF`A@M3c}*ns#E(u5~o7<2s^wQIYkk=YkDOSibKRTZyc$ z3L7xbi3#Io)0x9p=Glc3<%}_hFb&CA6HQMdT|s(9%+#`B+uhr1^2e;nI9|9L^E>V` zoZ|Vi`$9hr85T0_OJKB)bA98BY|Zn3_C)|w^MId9US!Zpd3SGOEpOeDaENnWD3qtz zJlwx`dva}uD()^FBzxJ7`s2M|ITT+Y^^$a9liScW!iwiyjQ~hOwIMZrd>H1+Bsi2|vlU;x2b(}HvEkUxZ5I`y- zn6gcS34neB{+=9ulk(fC?V;Uf=DBV_)`N#!{XbQZ%p=5gexLkC<>Kon#q4wN8zbV( ztq5n#4=S(Lzlf4@xHswO(z%Ztt`h<#RR%tly_3hFM~n#(V?Ybyd#3w5dMm;5scxY8CD0?vl4a;{}|LeTWK+5u+|gGTbv0a zV0eBdc#ZYvMDH;KggkVet>`8STZL-KM z{!}S$d^K`=xVPT$okvS}XwS$%@6Jp%^5?Vuf$}u-5OPDH5}@PVLmM_+{;TYCN3_bL zMP67-%z9v=?r@LO`00J(k#R*?0Kb*1akYPR4zCA7eubOmhnwdMH#`w7`pw>|(PIAn zK4I6wY%Nc&oC@OfG|TFj4U=jdDqrmTU5-iE zgBi(j&~6(sV8+uFeO6fFwbLycb39P73N``=zL0F=hBp>ZgC*ZG<0%L~l$K9vv>Lp- zOqaXw-3`WAGxj7uQO0i%GjM(_xJCNcg>PkvzII7R;9K#45hn~+BL-48m+o`nHuc$o z;I9_qmr%6M;2P=bV(bSE$jC<&MEG8sj%k&Ax3D|Nx9}t2rW(S0ff07JRp2Suvm^5{ zbe*!cSr6!79^vRIFy2os%-d-SN>Kc{3bP$FJmM5MuWThKro$$*_A5Myn}TgEdW$fk zY()5bt!wf6jX4O`R+4XZS8?`F=Dk>b8Ph7tK|ag3RE#5^KuRf1$s(=;$z=3zY0i^{ zk=qK&geDb8`b^~yKuc|Y_ZOkWg zqEQ?zQ$1>L*rLFBk$#Nbq{7C$PxNIo5&OC~NUc}yU6m#H1_RgnGzg_Sc^BBiHy9GF z=bwEF>JYG+Bhw@Md4_Np-@EA%?LvYh=J2|FsU=O^u4ReX;LTHgd5{ue{^6!!6mv$m z$27cacM~~(n0>!;9P#^GK*cI2H^hI7*unT=(TK$V(K_7D5IhhMHdoRu?UTp|MP4+C-g_g^-`K8ck3QwH;VB7I>ZUIQOJF=oFyX{zL%KQP=^H(>@PpHCNo>Cy>Z=Zm@TsI!Ph=oagHj3$+_>zGM-gEIy&6mAq7MbL# z`04+Rf1lyEFiLggLzilHgLu{W&%sqs(Ey}K3xn^uz@I%JCyYiiu~~TDj}istPba$||vndl(E ze@kiQDZoC*4T=F1gr_x*u@LhXr%xKb>f!)>NI)t7fvx|=`Zg(vc6O5f^T?W>Sn(?2 zyI3+EygwZlJTHV1x!m6Gr|>owIqq@8JySf24|8ALIg{AjMAp4F#m0r;0h(j|B3K@V0uEhyDAlD<}4%J+4*JLuLQ?j_LAqPq5snU9H7KNSW}? z?*JxpW`a6B@5t1M{8mi32R^$Ty72T@SWpHL*n{ zMtUkBtHbb+Al@!t81r&Fr~QwRFq@!Tq!O!6vHAP8OV!vbl-GSAE4+_sa#RUvK*~h- zH$P`I7WVGTH=6*|N6qX8fmwR2<=<8-LY8*r1h`NK8A=H~hQ=Hn2@oec`o5Qa>ttdz z_7^r9FKzL>i89Hp8N#dIdC!{t<(z?}M(%)h`0}Q_+jAOz)dQ=s5&gdX#E{-$N)FLn z_}i&ylHjur;!1YgeR{%|6e>naaE|HY#<8LK#0_az;;Fo9on5_9HO7lD7pJ=#kg)m? z2xU(h8&rFFr6`&NRV8$ysZ+iuOjK9}Pfo3nx8?;KBr35yhR)4mtKHZ9>;P1=K8y^p zesca)YP0wB&DGPa7jNqoOipm>zxMOu^DI*+Kf|pWGBng6L9nf$Q`MqLA6l-hF8leR z(y*yH2yhHMZhOggtzyjFOg$3o7;#(w7q+_}?JzRm~yzrlyI;I>&Je1TQ02Rz=>^?r` zj&<@WY4pE19hgXlk<2FC{drj250tL$-(?ua5fcyR{O}8)Eh&H$n(2wm@1nUOy-(TX zet--#^EXj&-n`3{|8XUKcsva|#yBzHl3(9O{D(TnQfKFlcm@)l>D3u+{_-Ell_4w< za@3&Uj*h3DLA;r`cSDPIv|B8<^221 zTwEn7e))jE_Bay(JSDf-ehIMUp2)8?Cq!Yuwf>1gsT+5aItM= zo(g6esof-$x@{8Y1-%PbZ4_<9mivEJv%WI?rFyjw{09{T-HgpVsqxhCe-rI36RYP7 z{`3LwK!ecF_sKwgL=<7&b56oyTPAL2dF5VxkTYI2TgF^UwaTZl=~YP0c_rD8&%2TM z1wnJi4^EcN?>6{pFYi^Zm^aovmTL+T{GAW3NHn*o=ZhzH9=t&7oP6_lB9IqOA9AYm zt7nvOtbRVoaoka}}6cNIFssZ1&)xK~gvd)klO*IUDxh66s3S%6flA713 z*vj!MB}a_NLfht;{1_T*9B$q&K*>b47AM5^k>vxSVxjV~HokDL|FR0JZ`iobjP zx57#ZzjNY!_mln>8tLJfeQ}5I6#Kj!IKyqN2J5a!Oa@n)A&U{7X9;Qfw?kd6Wi;u8 z^+fRbm)q{FBnWaCD7T-!PZfU_>b8E8O>91D`I7YRpKokq=?^_`oHqMNT>J#bYPc34 z$5jOEEQz%d(4gK~peSdc{&!sUwH)@3Ros6^@C!eME~(TmsiGbRwN-}6mBVn-WMjl& zDaoe($p(&+4+T&6UzD}@@DW%umqzb$x4fGSJZbrtN*5yt~%(HYucR6E8ww zNaGRxX_nHsP?iV$eGcPrKaNA$rXwb+5q&|A^#O({4zlQ2e0dM?ep0Zehe<@Fe%tS{ zNui7kJq?8lyr$W|Y20d=}A zeQ!jaW(st|cQaAmqUrvM&NMYBeR|=mgggm^I$ThAs0sOrd-VE6T`@%pH=z@lGEWxL z5v076u_lOXWw60dH+3%)Ho3J+Trk9VzAJp%=klbf6VH0i-s5dL9!Y!4l9P>=;fE4i zl8Zmw0P=BkY#JWnEioJI_*q8s9pgq~5h#Wf!4?AVRk4yfZkI;n0A084YKp?eoe;#V z>DSnJO#{<~p*pe$gL3fo)N9=cuupYezni50lxgA(q5h{ZK@E>;cEc|J8aMxI+!)p; zgIPQ}Oum`Fx-F>=T?m4ar2TU0FAFc3Bdq19x(*fR&+@nxj`KZny%`4+91VcXJaDs$ zXL{_5JW4sfCX6r;XD&LK42k_ESw4qTE1!&E$Ql@+S(y!$o1#z z!)43Amns6N_%tXDHq7K=;{DyAn^`yVfcBu>a!}Sua7kh-+puU)V4;n0oB@tML!P2C zDGAJww#Tu`t}Kd8Lp)&tWJk-|%|nj}M93#S@uw~2|J<7pz2LdUOVo>ub6X7deiQ>Q zVp0NqienNG0&3l5r(N)Gt?eKS@c#g(!WKdgI2k2J1EYv_HjxQ;Uph$@yb#5c!bF$7seyJTXR6Yw||_Qd7iO4<271tsw%Z zFjzg_DZl6?ra?G)B!Ha)8S8sYId+qO+ z0Pt>IitfMQ!W4f+2@ST@tpRyC07s*B$VWUdJtv_xlr~%`CU_!c17~BFslo0jtfPHE z+aAVU&qzaj8Hhs&n30H5Hub&Vei%f^i8K>;HmEB1>^NW4RKEPzH}5*oqndpx{(3l~ z@#i<O znObik^*r)#$-^~~-cBlX=dCh)y%f~O0;G6{Qhsx#Tq;HhxKXjPIjGm0`;UO9RvXpFM-YGp(FJ`H@XKhNmFIo z+LG-@!x`}0(}vYvdOa?2@E3df+DAFy*QKzR+x`ybF1;7Rgnc6ex5(*&Y3}C>iVI~g zR9Nyvu(pMg_DAFJ`})e$J|7941__6Nk%VU(t?F>IzuF@K`QWA12=W6A>ZgR+LoR=- z;nr+L_bZZ}^M@hqSG2C zwWeZ zUw_O?g}dY}h99ah(_lC|^#FbN7`asei_Xg>5Q~ zg1Jo|zd3{;q&8+cGwpXZ`1B+Xqk(f+%cO`gMp7wABNa-@ zGJ+lE7T>s71AOOOdr$)$=YjC-ii8urOu5xEXdi^!n+vftOK&5qq{7t}D>0zuQ3yefPJ} za~noF*x&?as=&I5!?PK*E%0KNx{l78J`Q+GHX;q27uA5{Vr${FSnv{#iCPO;XyUSe zz)JW8irMx|X9KP7d<#z((2RgVfUT+l_*5Qy75%CK4%)C;C0ZV4!rYTVoJ2jFr;{h- ziE4Z9ukU3q2UH{tuSP)@h(-#axx*$c^G6=A0N1Uh;qR=}2iEc@a^A91_sUsQ?#uKa z;+3;KafJC|_e~pls8+n>GX=3fC&;T?8AM!B{AI*>RP&(z1X5uO7qTmgT@mzwpaB0Y z+3xb5nHFxi1Wq2+zM7bz7p7u;9Zir)f+_m|QD7Az4}DN#O}%rO@3lm#upXu&k!-M> zbS72{4j98oyP(2F+vDaFVT4jkwW{XUMruYg}h)U8BFCtDZ%xW_`mb# zs>DI{ZzClN7UgtsQVbrEF0&79xKEe$+{Tb0G}W*OfSaHV?t*h? zv)!~bt!}jCEbY(A>oAyhIDAo=jkw5yL}EP%K!tUh_MVB@CJHD&9I{@_Wv!)!*%1_t zl7_&;RW^({;6h(eTYu4|53--KCeJ_0b>_-lhD&*T=0Lom!JTCwT5f{4PF&#QENkWH zJO9Pc2G+TBll=D$xX7{rD13}Q{u^vrzVv&o?1#1L9Nb5|qjjv!0(q@WTc1rRJ%BUz z=nx_sS$LyN51C=x%V@<_Ba#s>E&E1ofGr7>v@z)u!M9J4o{iLlV%=cKs+DKQ^E`nq zvQK=GF0UHt=~g~vKm9r&WMHHMp#iCPyF+t*xhB&+54o7`L^fatj zKSjOP^PgXax>eZhSK-psLZh|8;mHu4CR*C>Ol-8NL)UIS=4%1-p-wuS)9&PmY7GEj zVQ|8(vhND-jxgCa)|PaSNY9)45e(Xzk+fkr7$JCu4`cu@_*^S7^_)fh1@4Iwa_}hF z!?jsJGEhbeY`MC(6JIRm8}i;82~NDj*ma^5GLffmB~cN~)sI&xn~J9_p)h&panIjl z*;{TmRG0}8=aPZHV8^@#bF&ks;QGwM z2{Ol4P@GXrWlmqoYEng6k10(pWz}G}pO&YW*P`hYZpn2YM-%%bN$|!MBLruHBtj$cJ5?Pty5?6dMo#< zi)IGa^SkY0Y+WkG0jO6Kk=j=qu{)1F*`nsuO(4#wHq1=Ojq`Bzbq~<@0m(4x(74{5 zjQok=H?8;<%eV>0clal*&s(6G2}u%$LonnhB1(Y2vRn{nUL&?CN4~1%IBkxcBfOZj zP=)aRYbmPh&&1jNbMFZt4{_tZgRM@D&5s~%OcpteFmmTv1qzi%##pZP^5(o6r7`L< z_HJVR=9TX-xCB`hU!?XD;z8yIDi}$GZu#M~mBKiHac)8ZzdH|Vvn*6}>rJw+!5fQF zxnmoP;9=8i?2$L*;fu*|A!PuKeU@vgez#XjAf~;Vl`BiO5_bySrSs|(hg)ty6ut># ztGVz@5YNO42l=izM%W~j_AYJ9$m0K&5X+XIgWo6q))P!fAe85C&{Axaa6PqpyVT_%$;c%0|R(Ozle74)lh zl?iy6tdSSU=jyQuccn_`hPHWf0cLb~(p~>~ems1gVMOX9rM;^~=@a%++wF}2E@8^{ znalJVd=0Snov(f|eE1VJ*~nU+2D#pE#bLscMogOalqg^to5lMZ`DTX`W+SJtZGh}) zcVS99H$?R4AMNf8ABeL%-koBA^BKB(3~?9^$sUKMSmPBR-1?|I41gz5w*w3!_h+LE zw&OX&IT7I!uiiX5p02>c6L}o`Hj<4@LNdM)ud&aK(1ZrGu3a9YK9MI2H|4EOiPQ|{ zYO#p#Fz20)S5Zl0Wl}{{TVPhG^kI-p&a^q*NuxAI&}Qy(3-9P>4Q*S)=?FaI;o=lUSkAo)+z@&y`9byiO?{eY;yP8d>2Z7xCPedCS@bDE+KW0dc~o^ znu^mKgyY}yckArRgz2@~>ZPiwGMc6Gr zA7pIy--V|YiNvGbt;YUC~BQG%W=kw)S zI4qT}yZ^HIZN3s-V5ZLg3V2E4D(?Z_z`=S?%JW{{gNRwYqY=>|K>j`&1BWi*)hi`Y zua5z-uh&m3vuR@T?HV)rTKCU-FfMu`ahw##-3uxb1-ZzbDCM6P1B1yFz5)&DnbmE} z)Z^Jc#Jz~td!zJD^vojHiAl4yH<(}@)dHI@M5FXS&jK%ws@9LY>PTk6{c?MD8$Bz1 z_t)gPfN%Oh#L0Jrp@2-bDDGoveH96i9;Tq*#rOm73$+F)t;Qe+RGaYmzcA$s+m^l& zgnLJf0rJRQiA*9kOu_v$;L-#Va2!6#*5c<*0c(r_P^!J3q|Kw;p>NhurA}udQY-%! zRzcDF!%sI8HzT2V+OAHc_=UGwF1y+^*qMh^Gg{mzjvQi)*911eEHhB#9#I5dq0h~4 zlKapx4{lVu_C%BS;d0-r(feG0*U8Mt_LVjG%mOU|1|n--R*N+aQD!Ii!3poTgnhp} z;@IChc|rSpUN(cT15MBSbD;_c%La_2(g@!0h}amJ1}kDocMGUkC4}Px$H5SB9MI5w zxwIfrqiYb~P6cr|b*rcmxV*U)%C&oS<6T!&4oXqb#Qngo=Nzw8k)olXj>+}hpghHa zbWO=GkqxtKTJ3p?)6l4F(n=uMzwhw3wqx`0FH_NhTnGUW2?KZ0BW+Q*X1Nh|#Ig7)S>nB4;q%DOc=)rCDvW+WfjQ3{ zYV|d~j@1xCB0N0dl{*R;4owJ;3varb02AhKTF5IZa-}m?x$ZR?&}!@x?9ys*muawm zV26oOLAlSn4WXZkb4fG%`pT~P!z^Jt>Hhl|3|3i~{p)q0-}QwYm_Do4ppvr1mqCsj zm1nj8RCbT&*pabl&P6WQuqYAl*QvJgNukRqtLi`2OFDhy3# z1?a(d*7n2l*HpJ(?n45@$*km9tjv=)CCar#%X)IU>4W_#$93}u{Xbg#`p`vKV>9>( zm#l!$`usC~JGHp2m4Q4vmt9F}6q$221lJ(H)n;gnTA#J#B=*@S&*9|DV#vSm-S+bn z&HIjv*bjp^kbioh{E256vz~6xFi;ACFb>?0dSHRChE@ijinQ$bO331SjY-R=SNRcM zBXB|p+->6=1Wr+P4J@qWo7|V;EZJ6`IKmXMSBD&yf+g+y4p<^Q5oT9m1f0ho5+8O; z!EGYI1WgdN4OylUmi?^4;to-FUH7zL?S+`yoxkM^9Z3XU0Wn?*)XmM5ga=uI79iUN zx9`2#_-BmqJ#H#+GUP3ap48t7R7l+EK`H5cEiY2hA6`08np#!w7$;B|>qy|_G6?-f(77*!! z@+HDZp(Rkm;q0j|PW5tHS3Bl~3t#~oBY>hB;3?Eni7-KvWENYxRGJ9$?Bqx@wRydf zA$4*Gd8s)%`2la2jN6L(<~}u?Ck5}Kro5ER<9!fyWL&u=K0iAlio70AKwhrM@())o zSpuE2>SNYJV2O%Z{11tO7!5&QoJa!T4AmF&n6H8uV*W&gSwQ1A_x}h&9~TR(j_kQt zd3W|Hxk-%dM%M{bK!sZ`6C6(+C4y-~T_$t}_^R=dDTdlBGE6l#Rb1_^MYeaS=%Fws zg!%l;$fzi+fC~9Eh-0&gEKE^uGOKzpi7oSS$jY51uk>a^FTRkX!fcN)u?OK1qO)&j`Acx8fuJr7AJ( zSt{G6L}>+L6L5a6mx-hD{X6z8vHcPM{hFRZ*G!y-){b=L`Dj&43P7NzO=g6YiM=|O zbU*;Rx3-IVJLJ6*a$sX!2rTfFjJg6#07OdgeonbG@RbJ@Z{VXI6$R%yAqX~A92OLZ z4QKXhvlLNMFRgXGV3_lG5o7fO1Y2+vAiHU&0BXU(@t=SM)wBs12z8}1b>(30liLiM zdE=`|#omvRy$fAzKr668_7HLlz=SbUL~wGy*6zM8`=uPmihzu>6f6Eu^Hv$j3?!AM zow%D2V=XvmqJ1{25l%a)XsDQ)InR>TrIs-amVYEdD6gSMHrBoH{)_W#uvDIc5^!d% z?cjp;q59qpwf;hhrCL7E_Hm0KDIA1B2`QtxlsEYs>&;*Rc3cW048%!AW;3ZjeU8P& z<$LjaW%UguX1KKxhWQDKrHJXP8T9*(t=5Jv_`xg}AgWJD@h)DOa**@e78^^5evV}( zz)1nlbg|7xjyakgWB+qVh|M4>0B-Z;PFcN4FZUNADm?3M z6{?@^ZkmKHQ+ssLOOg+IW%??~IKNrmyZ=a;EnDV&R}U))ZBk2xU-T{TsZv;|ugx1z}+VZW7BE=5*gpfe!w2sXXHqZUti zO8piS6&RH*TX-g&L4{^h{9ZXB{$ynWcpGAL7cYP)E=52d6ugzv&p91JHuYsUnC9Ah z$~G;6?=;B%4o83mK03Q~8Fy^^0uK8@ipYqwG8Cd#jhVp(U6C_0P-DW=GXC3;9U)0mf3np!U+<>>zlyWlc4JX|tPjmx8*+QfgiS;7PLdCcr zM_bR3o_!BN3Ck+Ly^b9r{YhQ?n`N+oBxwR(jQWUs?(}|AFi|=d(jgEh2(O{@DZEb` zkj@;Tp4!ib2rf~*B{yQw+WM>#Htqlq%LC}}2vK9!rc3kZp55oNK`+>##$*dYKaT%( z0AP853Qcf2fKZ!sa+v(!1;$hqv`%b4B$;Zr9oOpoyOjYVSH*G5SmxU$$pw4{Sx}-;Jb&76?-EtE$6g$0rJZxD<{Qt+T`H6mf=M zG&42y)wKU!U*U%Tw@Vj?!;G)b9@n8J;=k*36c*THxjx0E0}qzL9&geIzC+3Kum;j8 zPnN-r+IV^DoMs@UO1y=~XUe12`L|_=btejRO&=6Rv?sp>Ey%X9tGh-9=K@F507h?YWMy*WSudZFYfpawQglUFbVF}&d2(rI zXmkKWLm)wPbaH88b#!TOZY@)2VRB_bY-wv{AZT=Sa5^t9V{&C-bZK^FV{dJ3Z*Frg zZ*pfZY-wXniA@2 z-q=FNbX8LFg64k)mKB<5reTQ840xfo&8&{=Djm>0YMOu}Dx*c>r7aCz+KXaM^Tc$?Mwoj|E&$suEGiv*j_3y zn@P*WZe)M@tawRa4*I@LP$=FLn3KNipm&rk?*qOo3d-(BV9kCI=bj7U^!uH3BmuW< zfKqp?@}*#>ZR6eGuMYuF9|oQ=0^BePd}}y()>!cE&?@UO!kE3FB7^j%Ur{Y-XEg7JlNY-_OAZ33Hg}j9d%rFviRygGC5s-I`hir_5 zyz2oHdk{*_R48vvBhg1mbUKMX4rSjHQ1;J;^7b4kf0_&B-TA2BGNqlmq{S4^qP{r; zTK2c9SMKcK8TWRIZ~I?yN^{Ob?%n1-rV2X_JOjtE)o^~g6>Y~>L3vNBiYo`=pycV$ znmd07MM(j+f&_Mdmj(*-Y^XSfLY+^WS?8+|vY<%sCkehx4(e#m9P1X|69dN~JvypB z$Jbsi7uw4{f#WaF!I7thBR?4}xpQ0;tC@;Z^Nn5bWi0Da9M5{4)UiIIr6@CBT=-ot zo6Q*I7SAQ|4}K4qLn1AgN{d~=nGy@Q;_QF)q1b5MN;nS2lZhp0Fih#7;yr)MZD`W5 z$!4uj-IX+rLw<|SdiON90ZOgYS_h}oiJJNrY(8`XOS6uuykIY4Hs6DyMSBgH36CjI1+dHGP;7;#>EXz<71+RbZ zJ&whOBS8IeFqq4RUi%2{%^Y56jJQu<9GE{LvpZQzR(9{gO z-46aQgKB`U>4DbGzXomY`u{a>M$3O<%t`(&wd+PXMVrY~?Y5j4RHqJy^3K!l-BYXC zs)}H>T5+}RIvz=R7k%RlUg5785Wf{oWT3gZ8P=2g-3C&8)NV3qeLBQ|>a2eHqe#yT zXP@sSwPa0F+fDR%Yjzaq7?iRVgRBarQ5`ar4VyWif;XYQz8+7mIq)@c!7G0||AB^v z29?(QWo`qhfvN#9MK3O5J-sO}*883T#M_|_be0VigaTwh%x`u3G8s~YY}bomJ!}y_E!U7dH)Y6y?ha+rKNu=Wo2bvDlVNv z!@+00>(%t z#U`2(e<549M^Yu<(HWFz-8>AnhgYEbcn-=>9>tZ9jIiXr2?xm+_GVG2krj& z4TFd-i8%VQhNz(ad;x!JnJe9)rhoV}D?Imnh+^CI5Ct8j2JcE- zTGv~h8`pPCbrmn}CLei`2RIrHlU&Na zne;p`iHb|3R=BjbC!|fGYN4ug+v`bs3Sa*4?#_gjCujOgVf7JGg)*prQs#8{7+2WD$nY2IB x!Jmpfwc_V7=kNLKdo!^g<+1$x^0R^e0P`DrqGEX1t^f-F002ovPDHLkV1i+%!s!42 delta 1792 zcmV+b2mkoa5Tg%}Zjpvee+JV@L_t(og~gY7Y*g13#((E6GoHmZ;{`9+*bXS{4u&`+ zfFWs0+6oD^N<~`*0&dgNMUg;JqyAT-Mo|^1ic&RFTUDV6PFvA56%w?hZ6Z>IKta?7 z+h7BBz=I85@G|yzX5M!D$BZXt3)D@;kv{1y_nz;2=bU@)eWH}&e_on)PuT(Ef0=yx zX$iR=58FB|551wT&BVuyBXD|)ROo(RM|pMG{zxd$+O}O@oQaqll>gd)a-=^s9{TPUETE-PW+|ITMDX9y z2{f2Ffvq(SUo6%GA(ZPdeC9}OI2!%CKbNQG|6Ha1D*^4><%M8z`M1Nxr4ijU4MY&p zKm^cGB9gwA>*ksHrMf>H2G<4=lF>G&x9#5@w&iWAeN%mWe^&y|Y!;th61iCY(AqNW z1ZXDcCg?uUO=Rj`Gtv+(4HPI3JQq9%JR1<)SU=GdAM_^U@tw7AsJCwvaMLneyiZxK zl^C%TafKNG!=E8c4^;x<3uQ%#;m-oy4~8!@-UQ{Lg(6g~-!!M7V$QElH_8w1Dh18o zka8o3-MX+8e}yPPP>AbMX3Q!osebfpKEr1sQ&A~fj#j!136~(gT+~EAYAlM|c@Q<+ zjdE?!P5Mv%<63O6f9KNIRnw;mxRtdx%Ff)H+8>oX&`=_pmL?7sVm$B^5~<3LQ%WI{ zsSV}fcK!vYc`tYtqWQRd{BQlS!Oo3V7mcX%e_N948vcDH^-rwJn=>znmjdyD zGSHT8#>=a~wH?kyN9l}?aCJCNRY@L8stc$t%ST(V5pB2|x8*IA=TNq|t|WEz@Qc7> zcZ@*$7O6KPk>6LW+E8QU;NsO7&um=6 zy4rGZe=Xcs7ocK&$gH{a4O)FeSFSEv)udv#-3!_p<;S`679OZ-*f`I?(y-zv&q-If z>)=K1!*yLo$CI4x8NsqWhR2h9c)FMOPWI5%JIb5yp22Y(9HpV=u1#lU{0foM^4URy zt+!0U@oiEVG>mu3R<3_ATu>Y&-j9UKam9ybe~+SE5T$T~rQo`ZCoC+>r87EAN6!e; zBRV>f!nSQh1g&UEddayqfq-df!dHOTt`l%-n>>~m%749b)%q&KofH)xL?YD;oH{bB znWj;+xIRy%CQ!;ljYaWt3ds-Xv|k+J{N>S`qF6V-5XW&45zL{E>~l#k=^U8q10vGi ze<(kTRMzaPS^c?ceWF)zlBjSQJs%#pGJNU63$Ei%Dy6`+z)8YDE4FQ8r4np=yqdhA zc^&z}%6ztcejbkFU|T69`cd|sLPNn=HU+Iu^L)wT6+7|^3qoFhE0SA=Ov)?Ew6`tgR&5gz#-BO88=8<|hgC#+diknI7k>j02*?i~UrUdevFR=$FPf3qEZ zDUH3^6e#5+JR=O14>R09G~RRK{Xe!(xNB;E$Eb(|MWpDZW9;rdb!-4Pg*Vs%%EO3V zqUg^X2_1hKZRjkXox*V(+{7qy`6&4Zw~}}Gx%3_ZNT7hEquJKj(BAqz>MCUVK+6_c zWBQGk1!X&)`_tMz>X3+-KnMsX$1hLQ3B-Z8Qp&z|{!#x+qFLi(X{^tGc9J|GDsfJvo3 zIilUwb}S+~;GafrW}s& - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/release/freedesktop/icons/48x48/blender.png b/release/freedesktop/icons/48x48/blender.png index 3b3a77a91940d99d09dd4c95813935a191473813..9caed661fbadab2fe849ed3c3aa98a2e127e544f 100644 GIT binary patch delta 3135 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 diff --git a/release/freedesktop/icons/48x48/blender.svg b/release/freedesktop/icons/48x48/blender.svg deleted file mode 100644 index 7d899af3ce5..00000000000 --- a/release/freedesktop/icons/48x48/blender.svg +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/release/freedesktop/icons/64x64/blender.png b/release/freedesktop/icons/64x64/blender.png deleted file mode 100644 index 78db4457e86a8d3d39a1ab7311031f3a6b5f02d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4797 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/release/freedesktop/icons/96x96/blender.png b/release/freedesktop/icons/96x96/blender.png deleted file mode 100644 index 2ddc4a674108ab3f6d4e2cd825ed76107ddf4e5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7773 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/release/freedesktop/icons/blender_icon_source.svg b/release/freedesktop/icons/blender_icon_source.svg new file mode 100644 index 00000000000..362536d8fd8 --- /dev/null +++ b/release/freedesktop/icons/blender_icon_source.svg @@ -0,0 +1,855 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + Folder + + + dir + folder + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c3d1e1f3e90a8ec56521ba42913763fb81c54f53 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 06:37:54 +0000 Subject: [PATCH 57/88] cmake - install icons into $PREFIX/share/icons/hicolor/ rather then $PREFIX/share/pixmaps/, also move blender icon into 'apps' dir. --- .../icons/16x16/{ => apps}/blender.png | Bin .../icons/22x22/{ => apps}/blender.png | Bin .../icons/24x24/{ => apps}/blender.png | Bin .../icons/256x256/{ => apps}/blender.png | Bin .../icons/32x32/{ => apps}/blender.png | Bin .../icons/48x48/{ => apps}/blender.png | Bin .../icons/scalable/{ => apps}/blender.svg | 0 source/creator/CMakeLists.txt | 18 +++++++++++++++--- 8 files changed, 15 insertions(+), 3 deletions(-) rename release/freedesktop/icons/16x16/{ => apps}/blender.png (100%) rename release/freedesktop/icons/22x22/{ => apps}/blender.png (100%) rename release/freedesktop/icons/24x24/{ => apps}/blender.png (100%) rename release/freedesktop/icons/256x256/{ => apps}/blender.png (100%) rename release/freedesktop/icons/32x32/{ => apps}/blender.png (100%) rename release/freedesktop/icons/48x48/{ => apps}/blender.png (100%) rename release/freedesktop/icons/scalable/{ => apps}/blender.svg (100%) diff --git a/release/freedesktop/icons/16x16/blender.png b/release/freedesktop/icons/16x16/apps/blender.png similarity index 100% rename from release/freedesktop/icons/16x16/blender.png rename to release/freedesktop/icons/16x16/apps/blender.png diff --git a/release/freedesktop/icons/22x22/blender.png b/release/freedesktop/icons/22x22/apps/blender.png similarity index 100% rename from release/freedesktop/icons/22x22/blender.png rename to release/freedesktop/icons/22x22/apps/blender.png diff --git a/release/freedesktop/icons/24x24/blender.png b/release/freedesktop/icons/24x24/apps/blender.png similarity index 100% rename from release/freedesktop/icons/24x24/blender.png rename to release/freedesktop/icons/24x24/apps/blender.png diff --git a/release/freedesktop/icons/256x256/blender.png b/release/freedesktop/icons/256x256/apps/blender.png similarity index 100% rename from release/freedesktop/icons/256x256/blender.png rename to release/freedesktop/icons/256x256/apps/blender.png diff --git a/release/freedesktop/icons/32x32/blender.png b/release/freedesktop/icons/32x32/apps/blender.png similarity index 100% rename from release/freedesktop/icons/32x32/blender.png rename to release/freedesktop/icons/32x32/apps/blender.png diff --git a/release/freedesktop/icons/48x48/blender.png b/release/freedesktop/icons/48x48/apps/blender.png similarity index 100% rename from release/freedesktop/icons/48x48/blender.png rename to release/freedesktop/icons/48x48/apps/blender.png diff --git a/release/freedesktop/icons/scalable/blender.svg b/release/freedesktop/icons/scalable/apps/blender.svg similarity index 100% rename from release/freedesktop/icons/scalable/blender.svg rename to release/freedesktop/icons/scalable/apps/blender.svg diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 8bf28d272e9..92455e88246 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -253,7 +253,7 @@ if(UNIX AND NOT APPLE) install( FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop - ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/blender.svg + ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/apps/blender.svg ${CMAKE_SOURCE_DIR}/doc/manpage/blender.1 DESTINATION ${TARGETDIR} ) @@ -290,8 +290,20 @@ if(UNIX AND NOT APPLE) DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications ) install( - FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/blender.svg - DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps + DIRECTORY + ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/16x16 + ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/22x22 + ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/24x24 + ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/32x32 + ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/48x48 + ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/256x256 + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/ + PATTERN ".svn" EXCLUDE + PATTERN "*.svg" EXCLUDE + ) + install( + FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/apps/blender.svg + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps ) install( PROGRAMS ${CMAKE_SOURCE_DIR}/release/bin/blender-thumbnailer.py From cb06c4eee17a9724cf39f9694c1e68581dcb1a12 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 08:55:10 +0000 Subject: [PATCH 58/88] remove checks on deprecated multires pointer. --- source/blender/blenkernel/intern/particle.c | 6 ------ source/blender/editors/mesh/editmesh_mods.c | 3 +-- source/blender/makesdna/DNA_mesh_types.h | 2 +- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 52b8cc194f7..ac9c46511a6 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -269,12 +269,6 @@ int psys_check_enabled(Object *ob, ParticleSystem *psys) if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE || !psys->part) return 0; - if(ob->type == OB_MESH) { - me= (Mesh*)ob->data; - if(me->mr && me->mr->current != 1) - return 0; - } - psmd= psys_get_modifier(ob, psys); if(psys->renderdata || G.rendering) { if(!(psmd->modifier.mode & eModifierMode_Render)) diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 050832cf8f6..789c5c9c749 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -140,8 +140,7 @@ void EM_automerge(Scene *scene, Object *obedit, int update) int len; if ((scene->toolsettings->automerge) && - (obedit && obedit->type==OB_MESH && (obedit->mode & OB_MODE_EDIT)) && - (me->mr==NULL) + (obedit && obedit->type==OB_MESH && (obedit->mode & OB_MODE_EDIT)) ) { EditMesh *em= me->edit_mesh; diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index ae7f5e65316..6ad60ac2df9 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -100,7 +100,7 @@ typedef struct Mesh { short totcol; - struct Multires *mr; /* Multiresolution modeling data */ + struct Multires *mr; /* deprecated multiresolution modeling data, only keep for loading old files */ struct PartialVisibility *pv; } Mesh; From 62a02764abea8c73f14f36a5b45058ce8a7e4f36 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 09:03:04 +0000 Subject: [PATCH 59/88] fix [#27096] Segmentation Fault trying to export DirectX with specific model copying a mesh in editmode didnt NULL the edit_mesh pointer. --- source/blender/blenkernel/intern/mesh.c | 2 ++ source/blender/blenkernel/intern/particle.c | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 29ddd3a55e5..ebbc18cdce9 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -236,6 +236,8 @@ Mesh *copy_mesh(Mesh *me) } men->mselect= NULL; + men->edit_mesh= NULL; + men->pv= NULL; /* looks like this is no-longer supported but NULL just incase */ men->bb= MEM_dupallocN(men->bb); diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index ac9c46511a6..927f4863e2d 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -264,7 +264,6 @@ static void psys_create_frand(ParticleSystem *psys) int psys_check_enabled(Object *ob, ParticleSystem *psys) { ParticleSystemModifierData *psmd; - Mesh *me; if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE || !psys->part) return 0; From 20d3022076d842d51d620ab725e3d8eed18e95da Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 09:38:09 +0000 Subject: [PATCH 60/88] following on from last commit r36263. copying metaball, lattice and armature datablocks while in editmode could segfault when they were freed, NULL these pointers on copy. --- source/blender/blenkernel/intern/armature.c | 5 +++++ source/blender/blenkernel/intern/curve.c | 1 + source/blender/blenkernel/intern/lattice.c | 4 +++- source/blender/blenkernel/intern/mball.c | 3 +++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index a0511f5da2e..a79637eea73 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -214,6 +214,11 @@ bArmature *copy_armature(bArmature *arm) }; newArm->act_bone= newActBone; + + newArm->edbo= NULL; + newArm->act_edbone= NULL; + newArm->sketch= NULL; + return newArm; } diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 7a5e0d5c33d..f68533803e7 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -201,6 +201,7 @@ Curve *copy_curve(Curve *cu) cun->editnurb= NULL; cun->editfont= NULL; + cun->selboxes= NULL; #if 0 // XXX old animation system /* single user ipo too */ diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 9d93bb1c25d..d308ccbf876 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -219,7 +219,9 @@ Lattice *copy_lattice(Lattice *lt) ltn->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert"); copy_dverts(ltn->dvert, lt->dvert, tot); } - + + ltn->editlatt= NULL; + return ltn; } diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 74e31238b96..6fe9e378290 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -132,6 +132,9 @@ MetaBall *copy_mball(MetaBall *mb) id_us_plus((ID *)mbn->mat[a]); } mbn->bb= MEM_dupallocN(mb->bb); + + mbn->editelems= NULL; + mbn->lastelem= NULL; return mbn; } From c605091b09be47e7f921bab12946989dc3c6bc61 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Thu, 21 Apr 2011 09:43:38 +0000 Subject: [PATCH 61/88] Fix for fix for the bugfix :) Just cleaned the code/order here and added comments why this works. I should have known it... thanks Andrea for quick action! --- .../blender/windowmanager/intern/wm_event_system.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index b2ed914ea2b..b75ef359204 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1537,20 +1537,16 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) } } - /* modal ui handler can be tagged to be freed */ - /* XXX TODO - handler was free'd in wm_handler_ui_call - and memory could be written to in BLI_remlink. - As temporary solution preventing this by - making sure handler is still in the list. - */ + /* XXX code this for all modal ops, and ensure free only happens here */ - if(handler->flag & WM_HANDLER_DO_FREE) { - if (BLI_findindex(handlers, handler) >= 0) { + /* modal ui handler can be tagged to be freed */ + if(BLI_findindex(handlers, handler) != -1) { /* could be free'd already by regular modal ops */ + if(handler->flag & WM_HANDLER_DO_FREE) { BLI_remlink(handlers, handler); wm_event_free_handler(handler); } } - + /* XXX fileread case */ if(CTX_wm_window(C)==NULL) return action; From 96d04bd9ea8fd1f8cf24c8f15e5f8a8065fc0dc5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 10:03:45 +0000 Subject: [PATCH 62/88] re-compress png's (save some space) optipng -o7 -zw 512 -zm 9 -i0 *.png --- release/datafiles/brushicons/add.png | Bin 10948 -> 8154 bytes release/datafiles/brushicons/blob.png | Bin 10703 -> 8149 bytes release/datafiles/brushicons/blur.png | Bin 9327 -> 7019 bytes release/datafiles/brushicons/clay.png | Bin 11181 -> 8124 bytes release/datafiles/brushicons/clone.png | Bin 10774 -> 8425 bytes release/datafiles/brushicons/crease.png | Bin 8638 -> 6591 bytes release/datafiles/brushicons/darken.png | Bin 9653 -> 7280 bytes release/datafiles/brushicons/draw.png | Bin 11349 -> 8450 bytes release/datafiles/brushicons/fill.png | Bin 16892 -> 12244 bytes release/datafiles/brushicons/flatten.png | Bin 9114 -> 6971 bytes release/datafiles/brushicons/grab.png | Bin 8045 -> 6015 bytes release/datafiles/brushicons/inflate.png | Bin 8840 -> 6791 bytes release/datafiles/brushicons/layer.png | Bin 11004 -> 8715 bytes release/datafiles/brushicons/lighten.png | Bin 9437 -> 7025 bytes release/datafiles/brushicons/mix.png | Bin 10448 -> 7841 bytes release/datafiles/brushicons/multiply.png | Bin 10039 -> 7456 bytes release/datafiles/brushicons/nudge.png | Bin 18012 -> 14292 bytes release/datafiles/brushicons/pinch.png | Bin 9880 -> 7605 bytes release/datafiles/brushicons/scrape.png | Bin 13055 -> 10025 bytes release/datafiles/brushicons/smear.png | Bin 9358 -> 7037 bytes release/datafiles/brushicons/smooth.png | Bin 16428 -> 13520 bytes release/datafiles/brushicons/snake_hook.png | Bin 9710 -> 7421 bytes release/datafiles/brushicons/soften.png | Bin 9219 -> 6892 bytes release/datafiles/brushicons/subtract.png | Bin 10173 -> 7510 bytes release/datafiles/brushicons/texdraw.png | Bin 9462 -> 6944 bytes release/datafiles/brushicons/thumb.png | Bin 9098 -> 6754 bytes release/datafiles/brushicons/twist.png | Bin 10889 -> 8373 bytes release/datafiles/brushicons/vertexdraw.png | Bin 10253 -> 7697 bytes 28 files changed, 0 insertions(+), 0 deletions(-) diff --git a/release/datafiles/brushicons/add.png b/release/datafiles/brushicons/add.png index ad041bed130cc3d476b82bbe8295d60f978bf43a..1343f7542b85aa038dbdfcce71cbc71ff7ca0480 100644 GIT binary patch delta 8130 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 literal 10948 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 ms0)y?6I^~7mtcJMtNdSqgVF0aBZ+VT0000_C diff --git a/release/datafiles/brushicons/blob.png b/release/datafiles/brushicons/blob.png index 1d63d1e873c5ebb0c1b3ea42404b2538f736ea08..2deb42c9dad709acb7a54c74366b3f604098ef3e 100644 GIT binary patch delta 8125 zcmV;uA41^IQ`J9^90dSv`rvPoArp~CCy_G}e;-mwL_t(|+U;CvY+ToMzVFQpcT(I* zQKTqpS1iZ-R@;*7x^}!NwvpJ0H`Fc=6ljtrMbNbU(I!oS=2sE8El{NYg0#Py7D1Y{ zMH?VNf}+`q^hW|Tc5PXWZt@7{j*o^$R!Z%A9IW5-IP;WnJ*&3oTF%XhwW zf9}f;9Xez#-(LS##n1fw{Q2|evn;y|N4z=b`uqC_1_nGpKgwv+ z+S=06(#pyTe*ba-)YjH^-SyYseACU7e^Zm=TetT0ZRzRi%JPaawy@6GqA08_nrrLp zbLY;@&7C_ld*&z4|Kx{1{Nb@yW5bOO#rQ94eYDGS8#sKHs+3P4TLARPE0=Y?6dEG z-~0aVOJDl__kS=qKmY&1#U>`UeeB~OyY2QvKE41DXL0C&#+wgp20-932T1Us1u!oB z7`{ih9RE}*c~SV6b@lW-{=^e^e;hgdt#5z(Yyb2wzt~yq@h6`A@>jlc_>Nz#wzXM0 zY;PCS@?PC9lvyyAl>Y`Z%&9y2B57=L`Nv5As8Xe;?;sD0rts z`a5*{ZP>|IPn`I9LbGMd7UbVIZ$VdHdF5Yy{;%)7@BS?JH<*r-v(JhF9sOoXLV5)m zkqdY_!%qmtnaADRSFNq>vB%#3@Iw#&!noLh0|)->bI(mqPGRqHIL@)>SjUI&_-Ms6 z#E8f~oJ(NPk7HMi4<=6pfBFEbQmG!g{q~Rk)^BE)K0x~q9QfRG&-D-Vd&A)~4U94u zaB|{RCSrqoma(zvAqFWLlq>mGpU?fulJ zKLc8fPF9|?hF?u~Vk3_7 zP(Whdu$^ctsM(#)2VL?!N0ttyX>K0YZU(`0x?u6G|re#;Id+8~$pOaWQMLwM3A_%GeSk z+zhNWt??_eE8Z~(OgCSD?K=<9b=O_Db=x-U3XU=UaOj{&wxIv{nAuqL!3!K#S(jBn zwgBoR+LJGvf5;x9kx_-`vwnWyz&?m@?=V1*J@y#cb#fwCVmT!QHrS5BNn467c_*j6 zR=?GTrRp>7tOZVmU&)XhN=>uuAAepR&Y+Y=Y88 z&q{Y3Z;-dm(Vn+M@DQu^WxvO$+S%E)b7uPOXQZ$>QWImF_aD(vF-QCvH(*p^qR%`#y|N7DL@(QF$ zuS+%>KUaWmyy-@m56&4l8g|`lJzPx2S~DhPqvLdpwnl?w6|44-6dcwHYusk!K(@fA zAjk#Xe?5Jpk>geo32tRuCp(96*eDRBa^PTU0?@e3NMPl33

(&N9dH-ZH%r~yoR%V ze@goTU^z;UW$mjT=WYah6Atp-Pm8#3~ z?(W`af8*IteByU@zFE$F5rD?V$1*y*5rW8O{9_Th5$y;iP;DaZ&O+jo4!akQ~ zzN%vn7ne`>7(sl43SeW^YVGN#pBft*{l~BU^IHZG+!&RP-`C8>459&w7^$yBe|V)} zkYZMI!$`N40Y$SSlcSCMhLN>f`Ul3hPViX~X`m!a`dF@|Uh0wXcksB1YvhLyA3l5T z+<$!Mdv6Uulr;jU@h8`lv7kOvJ4>f|QxX-+IvG_}q9bxtmLL_wR}9Y*>b!!BkH-r^ zmuGhEhQEZ(X3;`zSxzCEV4@VRe>7VC*WrX@CKf9>R{pUHx-#YUq^ImMABh(*x7UgS`fIQL zSuN_BDUuHI%MYE1m zf*bk8z~E4=RttrWDGLUwY)h_Nw8$>H>{Zggqn`Ngojbd`I+s^g-wZ%ow{HE@&wh5_ z{{5#;yt=TsNJ%p{er$#8z%d&sml_+BSa_QJ2{uFi0|V*X(%0A92m7&Nk$yI)T5mRC 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 X3Z~R<;pE(H00000NkvXXu0mjf)ELj$ literal 10703 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 B^7Q}! diff --git a/release/datafiles/brushicons/blur.png b/release/datafiles/brushicons/blur.png index 6b8fc4b6053dcd37f523f09a7382e14a60cfb1a2..93636abbe56fbb88af5e8ef8a3310f8e0f3f2320 100644 GIT binary patch delta 6986 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%0A_6zkr89+>?uZ+b&HqInYd~Tf)ujD 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 bKMDT_4&bC+2RS*u00000NkvXXu0mjft1&U^ diff --git a/release/datafiles/brushicons/clay.png b/release/datafiles/brushicons/clay.png index dab73b7cbdd312d69f3f5aab4d2f1754ce367197..27ea974a833d7071f943449012e0058b801425e0 100644 GIT binary patch delta 8100 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 literal 10774 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 diff --git a/release/datafiles/brushicons/crease.png b/release/datafiles/brushicons/crease.png index ac057e081c18776a9510f11c27d11aedecbe0bc4..b2be546ac030660c3f5268e381a0ab8c534badb8 100644 GIT binary patch delta 6555 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 JPDHLkV1i4pw6_2N diff --git a/release/datafiles/brushicons/darken.png b/release/datafiles/brushicons/darken.png index ee312c7a04fa611cd202661342809abe3405a881..b129bd7bbea2186c94e952452ab91a8ef5e18bbd 100644 GIT binary patch delta 7249 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 diff --git a/release/datafiles/brushicons/draw.png b/release/datafiles/brushicons/draw.png index 2cbc80523129ec5c63fe0ae5fa4e242168905732..6d0666a6586f97c36ca2e6e591f1ba36b88803ca 100644 GIT binary patch delta 8428 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 z z*TH2WNJU-A%`Brw(*<8{PKzQ4U0W?fb6o7EbRX+1!Q8Ml@Ej`Xa2d?mnsnl0$Ybw? z4`c?Zl{tXef5fa%@9Xm}wr~14EmjW5*~kqS^1%E-`rvEWM^eySro zgLufqa zQ&=c?eYfa7Z#Rmjs_R(H~IP^nMJWLE)1Jk$V7xpx?1Dq|u* zM*xC6W9iiLq5R@~yjUSi-qz&WTcH}-Wniqsp=&q|FNvE>jIuoz`BgexSM~c;e+5@w zWXBLC2n=QQEfsN@8MW)L>e(Tb!M=6{pq0~^LEuj#&j)dunXIR(XGR#x58SkwUgd+! zJ?6Wp%Nkt+C|_a8UzdUawUv!-&_Yy$=fnJB`<#oUr2QB*So%0#4I&a@8AeX)gGEL< zTP7w(hz)^00?;xtXsL*HlaD-;e@~@yb-0kjT&B^r?{WbhSyevB3taUw6&6(vlUo~W z%U{`xmld4m$e4RZ)&}vi#%j#S5(RqK$>{5AslLnrefK0><99)4YIW0Mud`okW!=mpevwt2^F)6FV)2* zF{>g*nOw*%H9M1jbS{=IyvlKLl}}$)biSmhl&`Ypu8omv(e_;K#{lgC9R+9^7_?Nd zB{#TzWKt|DYCJe%+BQ#4f8!Mc?1CHG@Z!LA5QmyKWSbIJsq)66*p$kZO-{Nim#9V) zUKrO-a;-wg(5Pi%zh2o#v1xY?Het}p;^NZbigaU_4uy}0#LQmSWh{572CMmxQ*jkJ_0OLeQe{5MHC3X`&2M7>E zi2#tLxbE;0UwBG8iIJD9aHy`os>&F4vOwY^%W_O3)(yoZLLntO zgKKM*+-jAizMtGg3ztK*=Yk+sGt%r;-0e*(LyK_mU*_+u%{Ug%Q!#-&?rwoQXw5Mf|tJBxofPf?#qv{i8g zbd*7-mQOA%H43DMOI#^5ZO0kjA%t98*mY|J--;&=+nu(q28I!j7R?U_v#6kvo9l<>O7UMFdxBz!@8CT$gktFg1mDV$#s*9D7lg6#;lCIgeC@Eyd_!@e7S>%7r2hH zPphaApruo%7Edmwa=N2gz^|$X2#4eTf=Gv6kX(e9J6IMB@O6`D!wXjwRSRb@je1dT z`sS`w86Pz=f3G1`wRygv64scBITx1D#JU0yniyzMqiJ*4s~xcx-nBUjgDS8nM|%pL z@e3*B!U81WdL7to-FB2kt;LVC7N+m;jKLK%WR+UbNtQ-}Y8NX3C;^@QgB~$xiA>Cj zJ1I3`I?BC!;xraKT1xA`r{*QI3X`qeHI?xq1B6s9f7k2I7f9mtE2PRr?MHM0lCD6N zkSI0U?>NF0@G_!7+J_2IkPsf1ZQ)f4x;?y>E9?byIIdjH+x4sX(>1tV!yn;ZZ`bf1 zp1F>X;O_eMtNH+LaChwne!G4HZ}`lO8+5yV{pJnaZr-2=H?QBk36F2W{jFO!@dgj^ z{?@H`e{bD>_uV^p?%ch5PyUmgEo{GV69&Fu0G^)QlK-U$|DPiKcZW8(F6|xs!iV@K z@HX&k+VH*LJ+^nD(!7n;!o6)w*mt(^4r^l+8Sb(3VsxN}+=6Nu><0YjM_1m-w|C$Q zmUg?+xLvv0xLx(PtAcD3)@u$&f->VsH^h+)a~1Fc!m<*aO!Ide!fTl zm(|^S85%~XxiMA@621|3leaMoJpe?oEWgc_)m=(WG5KP2_6Z%}?|%XE9tNG4A)%%K O0000)vnb@X$jh(6o08vdla#0(b%K4M^U?i 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 LNkvXXu0mjfidE>0 diff --git a/release/datafiles/brushicons/flatten.png b/release/datafiles/brushicons/flatten.png index 401226be862d25817ba56bf7a3f19effc3987103..53e807cf8119fc87ec062eb658daa3d70260220d 100644 GIT binary patch delta 6938 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 delta 9110 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 U6=~nk0000007*qoM6N<$f_CD)YybcN diff --git a/release/datafiles/brushicons/grab.png b/release/datafiles/brushicons/grab.png index d3ebbef31ad3afcf3cbca9c55b2bd8a6cf3c83b6..d564fb4222b6be423f02667d5921ca463c34377b 100644 GIT binary patch delta 5974 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 Ef)2=Sq5uE@ delta 8033 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 diff --git a/release/datafiles/brushicons/inflate.png b/release/datafiles/brushicons/inflate.png index f3ad313add81581cd7486d77c5fb310ac7cc8428..5faba1f8de4276c48786f970b679d6738ca63214 100644 GIT binary patch delta 6756 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 VCP3~*FjN2l002ovPDHLkV1kOG@4f&4 literal 11004 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 N002ovPDHLkV1h%b-6jA4 diff --git a/release/datafiles/brushicons/nudge.png b/release/datafiles/brushicons/nudge.png index 84964e91f30b25fb6d732d06baa82a7357e2dbdb..ced9f96602b5871e765f42a52bb5edc6e73a5afc 100644 GIT binary patch literal 14292 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

6eSmFQO0=@WqHo{rmRe&5@;=pl2<#D{Y$w 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 N002ovPDHLkV1k3DyVC#w diff --git a/release/datafiles/brushicons/smear.png b/release/datafiles/brushicons/smear.png index 4cdc2205c46f67c3344af8fab9479d52aacf27e9..5d42b3b24eea80e271f3e619e4e334cf9211b609 100644 GIT binary patch delta 7004 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 KMNUMnLSTabel&jo literal 16428 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 st-0nx2q`+%1sE2$(=1v3f$AJ=q!2LJ#7 diff --git a/release/datafiles/brushicons/snake_hook.png b/release/datafiles/brushicons/snake_hook.png index f8351d909eead260defcb64673de4e4704553cda..961c54ec4883eeff2aca02fdae162f5cc8b56948 100644 GIT binary patch delta 7391 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 RuN(jX002ovPDHLkV1fbC@x1^5 literal 9710 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 Dr313e literal 10173 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 diff --git a/release/datafiles/brushicons/texdraw.png b/release/datafiles/brushicons/texdraw.png index 1241349a15e8fad8b32e5cbef8de76ffda3c2d0a..94faa584c195c218e458aad67e0cd44e4bdfee21 100644 GIT binary patch delta 6910 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 Ef{h`9bN~PV diff --git a/release/datafiles/brushicons/twist.png b/release/datafiles/brushicons/twist.png index 539044276608c90ac0a92033e239fdda78d16019..84024f07937efb8d5cd251f7e751155a27a0db10 100644 GIT binary patch delta 8351 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 literal 10889 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 diff --git a/release/datafiles/brushicons/vertexdraw.png b/release/datafiles/brushicons/vertexdraw.png index 8bd2dc1be8ade09be40c3fd80cbc2a4633513813..88a9fbb2b6049fc29a3f0a71470b87f1fb7c0fa0 100644 GIT binary patch delta 7669 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

{R6Etu6H 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 TFuNJb00000NkvXXu0mjfF Date: Thu, 21 Apr 2011 12:07:40 +0000 Subject: [PATCH 63/88] patch [#27070] cmake fix for nmake builds --- source/creator/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 92455e88246..87850528648 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -217,7 +217,7 @@ endif() # Post build steps for bundling/packaging. -if(MSVC) +if(MSVC_IDE) # ${CMAKE_CFG_INTDIR} should replace \${BUILD_TYPE} when using add_command set(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/\${BUILD_TYPE}) elseif(APPLE) From c7536d558b397e1b3d5f514f1e241b8344894900 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 12:14:10 +0000 Subject: [PATCH 64/88] patch [#27094] Fix for property names in sunsky presets from Ejner Fergo (ejnersan) --- release/scripts/startup/bl_operators/presets.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py index 1cef67dc710..30fc802356c 100644 --- a/release/scripts/startup/bl_operators/presets.py +++ b/release/scripts/startup/bl_operators/presets.py @@ -242,10 +242,10 @@ class AddPresetSunSky(AddPresetBase, bpy.types.Operator): "sky.sun_brightness", "sky.sun_intensity", "sky.sun_size", - "sky.use_sky_blend", - "sky.use_sky_blend_type", - "sky.use_sky_color_space", - "sky.use_sky_exposure", + "sky.sky_blend", + "sky.sky_blend_type", + "sky.sky_color_space", + "sky.sky_exposure", ] preset_subdir = "sunsky" From 2e9982f420cab3b2ecf4648c0a91403f757ef9fe Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Thu, 21 Apr 2011 12:48:07 +0000 Subject: [PATCH 65/88] =?UTF-8?q?Bugfix=20[#27095]=20B-Bone=20doesn=C2=B4t?= =?UTF-8?q?=20resize=20correctly=20with=20numeric=20input?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit B-Bone resizing was acting more like translation than resizing when using numeric input. Added the flag to set all xyz values to same value when using numeric input --- source/blender/editors/transform/transform.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 13564ffce26..d0c93116cb2 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4101,6 +4101,7 @@ void initBoneSize(TransInfo *t) t->idx_max = 2; t->num.idx_max = 2; t->num.flag |= NUM_NULL_ONE; + t->num.flag |= NUM_AFFECT_ALL; t->snap[0] = 0.0f; t->snap[1] = 0.1f; t->snap[2] = t->snap[1] * 0.1f; @@ -5452,7 +5453,7 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d, /* snap key to nearest frame? */ if (autosnap == SACTSNAP_FRAME) { const Scene *scene= t->scene; - const short doTime= 0; //XXX doesn't work - getAnimEdit_DrawTime(t); + const short doTime= 0; //getAnimEdit_DrawTime(t); // NOTE: this works, but may be confusing behaviour given the option's label, hence disabled const double secf= FPS; double val; From 210ee1ade4b4ec5b6f2d3710986171a21a4b8604 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 13:11:51 +0000 Subject: [PATCH 66/88] whitespace only, no functional change mixed tabs/spaces --> tabs. --- intern/guardedalloc/intern/mallocn.c | 30 ++-- intern/guardedalloc/intern/mmap_win.c | 38 ++-- .../plugins/sequence/color-correction-hsv.c | 2 +- .../plugins/sequence/color-correction-yuv.c | 2 +- release/plugins/sequence/dnr.c | 2 +- release/plugins/sequence/scatter.c | 6 +- release/windows/contrib/vfapi/vfapi-plugin.c | 26 +-- source/blender/avi/intern/avi.c | 2 +- source/blender/avi/intern/codecs.c | 166 +++++++++--------- source/blender/blenkernel/intern/brush.c | 10 +- source/blender/blenkernel/intern/colortools.c | 2 +- source/blender/blenkernel/intern/deform.c | 1 - source/blender/blenkernel/intern/depsgraph.c | 2 +- source/blender/blenkernel/intern/exotic.c | 4 +- source/blender/blenkernel/intern/image_gen.c | 18 +- source/blender/blenkernel/intern/material.c | 4 +- source/blender/blenkernel/intern/mball.c | 8 +- source/blender/blenkernel/intern/mesh.c | 2 +- source/blender/blenkernel/intern/particle.c | 30 ++-- .../blenkernel/intern/particle_system.c | 2 +- source/blender/blenkernel/intern/pointcache.c | 4 +- source/blender/blenkernel/intern/report.c | 2 +- source/blender/blenkernel/intern/sca.c | 12 +- source/blender/blenkernel/intern/scene.c | 28 +-- .../blender/blenkernel/intern/subsurf_ccg.c | 2 +- source/blender/blenlib/intern/math_color.c | 4 +- source/blender/blenlib/intern/math_geom.c | 48 ++--- source/blender/blenlib/intern/pbvh.c | 126 ++++++------- source/blender/blenlib/intern/string.c | 96 +++++----- source/blender/blenloader/intern/readfile.c | 2 +- .../editors/animation/keyframes_general.c | 2 +- .../blender/editors/armature/meshlaplacian.c | 2 +- source/blender/editors/curve/editcurve.c | 2 +- source/blender/editors/interface/interface.c | 4 +- .../editors/interface/interface_layout.c | 4 +- source/blender/editors/object/object_group.c | 8 +- source/blender/editors/object/object_vgroup.c | 6 +- .../blender/editors/physics/particle_edit.c | 6 +- source/blender/editors/sculpt_paint/sculpt.c | 24 +-- .../editors/space_console/space_console.c | 4 +- source/blender/editors/space_file/file_ops.c | 2 +- source/blender/editors/space_file/filesel.c | 2 +- .../editors/space_logic/logic_window.c | 10 +- source/blender/editors/space_node/drawnode.c | 26 +-- source/blender/editors/space_node/node_edit.c | 2 +- .../editors/space_sequencer/sequencer_edit.c | 2 +- .../editors/space_view3d/view3d_draw.c | 2 +- .../editors/space_view3d/view3d_edit.c | 4 +- .../blender/editors/space_view3d/view3d_fly.c | 2 +- .../editors/space_view3d/view3d_select.c | 2 +- .../editors/transform/transform_conversions.c | 2 +- source/blender/editors/uvedit/uvedit_ops.c | 2 +- .../editors/uvedit/uvedit_parametrizer.c | 2 +- .../editors/uvedit/uvedit_unwrap_ops.c | 2 +- source/blender/gpu/intern/gpu_draw.c | 2 +- source/blender/gpu/intern/gpu_extensions.c | 12 +- source/blender/imbuf/intern/anim_movie.c | 2 +- source/blender/imbuf/intern/scaling.c | 4 +- source/blender/makesdna/intern/makesdna.c | 2 +- source/blender/makesrna/intern/rna_actuator.c | 20 +-- .../blender/makesrna/intern/rna_constraint.c | 3 +- source/blender/makesrna/intern/rna_fcurve.c | 6 +- source/blender/makesrna/intern/rna_object.c | 2 +- .../makesrna/intern/rna_object_force.c | 2 +- source/blender/makesrna/intern/rna_sensor.c | 6 +- source/blender/makesrna/intern/rna_space.c | 8 +- source/blender/makesrna/intern/rna_userdef.c | 2 +- source/blender/makesrna/intern/rna_wm.c | 2 +- .../nodes/intern/CMP_nodes/CMP_chromaMatte.c | 46 ++--- .../blender/nodes/intern/CMP_nodes/CMP_crop.c | 14 +- .../blender/nodes/intern/CMP_nodes/CMP_math.c | 16 +- .../nodes/intern/CMP_nodes/CMP_rotate.c | 83 ++++----- .../nodes/intern/CMP_nodes/CMP_sepcombHSVA.c | 2 +- .../blender/nodes/intern/TEX_nodes/TEX_math.c | 12 +- source/blender/nodes/intern/TEX_util.c | 2 +- source/blender/python/generic/bgl.c | 4 +- source/blender/python/intern/bpy.c | 4 +- source/blender/python/intern/bpy_driver.c | 2 +- source/blender/python/intern/bpy_interface.c | 4 +- source/blender/python/intern/bpy_traceback.c | 102 +++++------ .../render/intern/source/convertblender.c | 2 +- .../render/intern/source/pixelblending.c | 4 +- .../render/intern/source/render_texture.c | 2 +- .../blender/render/intern/source/shadeinput.c | 2 +- source/blender/render/intern/source/sunsky.c | 11 +- .../render/intern/source/volume_precache.c | 2 +- source/creator/creator.c | 14 +- 87 files changed, 602 insertions(+), 604 deletions(-) diff --git a/intern/guardedalloc/intern/mallocn.c b/intern/guardedalloc/intern/mallocn.c index f1c9f9e6363..caf551c84d8 100644 --- a/intern/guardedalloc/intern/mallocn.c +++ b/intern/guardedalloc/intern/mallocn.c @@ -373,7 +373,7 @@ void *MEM_mapallocN(size_t len, const char *str) fd = open("/dev/zero", O_RDWR); memh= mmap(0, len+sizeof(MemHead)+sizeof(MemTail), - PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); close(fd); } #else @@ -698,26 +698,26 @@ static void remlink(volatile localListBase *listbase, void *vlink) static void rem_memblock(MemHead *memh) { - remlink(membase,&memh->next); - if (memh->prev) { - if (memh->next) + remlink(membase,&memh->next); + if (memh->prev) { + if (memh->next) MEMNEXT(memh->prev)->nextname = MEMNEXT(memh->next)->name; - else + else MEMNEXT(memh->prev)->nextname = NULL; - } + } - totblock--; - mem_in_use -= memh->len; - - if(memh->mmap) { - mmap_in_use -= memh->len; - if (munmap(memh, memh->len + sizeof(MemHead) + sizeof(MemTail))) - printf("Couldn't unmap memory %s\n", memh->name); - } + totblock--; + mem_in_use -= memh->len; + + if(memh->mmap) { + mmap_in_use -= memh->len; + if (munmap(memh, memh->len + sizeof(MemHead) + sizeof(MemTail))) + printf("Couldn't unmap memory %s\n", memh->name); + } else { if(malloc_debug_memset && memh->len) memset(memh+1, 255, memh->len); - free(memh); + free(memh); } } diff --git a/intern/guardedalloc/intern/mmap_win.c b/intern/guardedalloc/intern/mmap_win.c index 3b366ae7674..24b48d713ef 100644 --- a/intern/guardedalloc/intern/mmap_win.c +++ b/intern/guardedalloc/intern/mmap_win.c @@ -114,7 +114,7 @@ void *mmap(void *UNUSED(start), size_t len, int prot, int flags, int fd, off_t o /* if ( fd == -1 ) { _set_errno( EBADF ); - return MAP_FAILED; + return MAP_FAILED; } */ @@ -128,16 +128,16 @@ void *mmap(void *UNUSED(start), size_t len, int prot, int flags, int fd, off_t o } } else { if ( !DuplicateHandle( GetCurrentProcess(), fhandle, GetCurrentProcess(), - &fhandle, 0, FALSE, DUPLICATE_SAME_ACCESS ) ) { + &fhandle, 0, FALSE, DUPLICATE_SAME_ACCESS ) ) { return MAP_FAILED; } } maphandle = CreateFileMapping(fhandle, NULL, prot_flags, 0, len, NULL); if ( maphandle == 0 ) { - errno = EBADF; + errno = EBADF; return MAP_FAILED; - } + } ptr = MapViewOfFile(maphandle, access_flags, 0, offset, 0); if ( ptr == NULL ) { @@ -159,7 +159,7 @@ void *mmap(void *UNUSED(start), size_t len, int prot, int flags, int fd, off_t o mm->mmap = ptr; mmap_addtail(mmapbase, mm); - return ptr; + return ptr; } /* munmap for windows */ @@ -168,14 +168,14 @@ intptr_t munmap(void *ptr, intptr_t UNUSED(size)) MemMap *mm = mmap_findlink(mmapbase, ptr); if (!mm) { errno=EINVAL; - return -1; + return -1; } UnmapViewOfFile( mm->mmap ); CloseHandle( mm->maphandle ); CloseHandle( mm->fhandle); mmap_remlink(mmapbase, mm); free(mm); - return 0; + return 0; } /* --------------------------------------------------------------------- */ @@ -233,16 +233,16 @@ static int mmap_get_prot_flags (int flags) int prot = PAGE_NOACCESS; if ( ( flags & PROT_READ ) == PROT_READ ) { - if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { - prot = (flags & PROT_EXEC) ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; + if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { + prot = (flags & PROT_EXEC) ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; } else { prot = (flags & PROT_EXEC) ? PAGE_EXECUTE_READ : PAGE_READONLY; } - } else if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { + } else if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { prot = (flags & PROT_EXEC) ? PAGE_EXECUTE_READ : PAGE_WRITECOPY; - } else if ( ( flags & PROT_EXEC ) == PROT_EXEC ) { - prot = PAGE_EXECUTE_READ; - } + } else if ( ( flags & PROT_EXEC ) == PROT_EXEC ) { + prot = PAGE_EXECUTE_READ; + } return prot; } @@ -251,16 +251,16 @@ static int mmap_get_access_flags (int flags) int access = 0; if ( ( flags & PROT_READ ) == PROT_READ ) { - if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { - access = FILE_MAP_WRITE; + if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { + access = FILE_MAP_WRITE; } else { access = (flags & PROT_EXEC) ? FILE_MAP_EXECUTE : FILE_MAP_READ; } - } else if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { + } else if ( ( flags & PROT_WRITE ) == PROT_WRITE ) { access = FILE_MAP_COPY; - } else if ( ( flags & PROT_EXEC ) == PROT_EXEC ) { - access = FILE_MAP_EXECUTE; - } + } else if ( ( flags & PROT_EXEC ) == PROT_EXEC ) { + access = FILE_MAP_EXECUTE; + } return access; } diff --git a/release/plugins/sequence/color-correction-hsv.c b/release/plugins/sequence/color-correction-hsv.c index cff2f1aad82..1ee58e256d2 100644 --- a/release/plugins/sequence/color-correction-hsv.c +++ b/release/plugins/sequence/color-correction-hsv.c @@ -196,7 +196,7 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int width, src1f= ibuf1->rect_float; for (y = 0; y < 256; y++) { - float v = 1.0 * y / 255; + float v = 1.0 * y / 255; v += cast->setup_y; v *= cast->gain_y; v = pow(v, cast->gamma_y); diff --git a/release/plugins/sequence/color-correction-yuv.c b/release/plugins/sequence/color-correction-yuv.c index b80489f3b0b..1a78fc7d4b6 100644 --- a/release/plugins/sequence/color-correction-yuv.c +++ b/release/plugins/sequence/color-correction-yuv.c @@ -129,7 +129,7 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int width, src1f= ibuf1->rect_float; for (y = 0; y < 256; y++) { - float v = 1.0 * y / 255; + float v = 1.0 * y / 255; v += cast->setup_y; v *= cast->gain_y; v = pow(v, cast->gamma_y); diff --git a/release/plugins/sequence/dnr.c b/release/plugins/sequence/dnr.c index b6a99de0622..606ec19ef41 100644 --- a/release/plugins/sequence/dnr.c +++ b/release/plugins/sequence/dnr.c @@ -66,7 +66,7 @@ static void precalculate(unsigned char * table, int level) } *table++ = ap; - } + } } } diff --git a/release/plugins/sequence/scatter.c b/release/plugins/sequence/scatter.c index ac4346c1a44..4741b33ce0e 100644 --- a/release/plugins/sequence/scatter.c +++ b/release/plugins/sequence/scatter.c @@ -193,9 +193,9 @@ static void fill_out(ImBuf *out, float r, float g, float b, float a) } else { for (x=0;x < tot;x++) { rect[0] = (int)(r * 255); - rect[1] = (int)(g * 255); - rect[2] = (int)(b * 255); - rect[3] = (int)(a * 255); + rect[1] = (int)(g * 255); + rect[2] = (int)(b * 255); + rect[3] = (int)(a * 255); rect += 4; } } diff --git a/release/windows/contrib/vfapi/vfapi-plugin.c b/release/windows/contrib/vfapi/vfapi-plugin.c index c54f8234d2d..81547b8bb1a 100644 --- a/release/windows/contrib/vfapi/vfapi-plugin.c +++ b/release/windows/contrib/vfapi/vfapi-plugin.c @@ -114,17 +114,17 @@ __declspec(dllexport) HRESULT vfGetPluginInfo( static unsigned long getipaddress(const char * ipaddr) { - struct hostent *host; - unsigned long ip; + struct hostent *host; + unsigned long ip; - if (((ip = inet_addr(ipaddr)) == INADDR_NONE) - && strcmp(ipaddr, "255.255.255.255") != 0) { - if ((host = gethostbyname(ipaddr)) != NULL) { - memcpy(&ip, host->h_addr, sizeof(ip)); - } - } + if (((ip = inet_addr(ipaddr)) == INADDR_NONE) + && strcmp(ipaddr, "255.255.255.255") != 0) { + if ((host = gethostbyname(ipaddr)) != NULL) { + memcpy(&ip, host->h_addr, sizeof(ip)); + } + } - return (ip); + return (ip); } static void my_send(SOCKET sock, char * str) @@ -363,12 +363,12 @@ HRESULT __stdcall VF_ReadDataFunc_Blen( } while (strcmp(buf, "P6\n") != 0); do { - rval = my_gets(s_in, buf, 256); - } while ( (buf[0] == '#' || buf[0] == '\n') && rval >= 0); + rval = my_gets(s_in, buf, 256); + } while ( (buf[0] == '#' || buf[0] == '\n') && rval >= 0); - if (sscanf(buf, "%d %d\n", &width, &height) != 2) { + if (sscanf(buf, "%d %d\n", &width, &height) != 2) { goto errout; - } + } if (width != c->width || height != c->height) { goto errout; diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c index ce414cd15fe..82bf3a3d21b 100644 --- a/source/blender/avi/intern/avi.c +++ b/source/blender/avi/intern/avi.c @@ -402,7 +402,7 @@ int AVI_is_avi (const char *name) { /* at least one video track is needed */ return (movie_tracks != 0); - + } AviError AVI_open_movie (const char *name, AviMovie *movie) { diff --git a/source/blender/avi/intern/codecs.c b/source/blender/avi/intern/codecs.c index 47a5fc192fd..9d3da333957 100644 --- a/source/blender/avi/intern/codecs.c +++ b/source/blender/avi/intern/codecs.c @@ -42,102 +42,102 @@ #include "rgb32.h" void *avi_format_convert (AviMovie *movie, int stream, void *buffer, AviFormat from, AviFormat to, int *size) { - if (from == to) - return buffer; - - if (from != AVI_FORMAT_RGB24 && - to != AVI_FORMAT_RGB24) - return avi_format_convert(movie, stream, - avi_format_convert (movie, stream, buffer, from, AVI_FORMAT_RGB24, size), - AVI_FORMAT_RGB24, to, size); - - switch (to) { - case AVI_FORMAT_RGB24: - switch (from) { - case AVI_FORMAT_AVI_RGB: - buffer = avi_converter_from_avi_rgb (movie, stream, buffer, size); - break; - case AVI_FORMAT_MJPEG: - buffer = avi_converter_from_mjpeg (movie, stream, buffer, size); - break; - case AVI_FORMAT_RGB32: - buffer = avi_converter_from_rgb32 (movie, stream, buffer, size); - break; - default: - break; - } - break; - case AVI_FORMAT_AVI_RGB: - buffer = avi_converter_to_avi_rgb (movie, stream, buffer, size); - break; - case AVI_FORMAT_MJPEG: - buffer = avi_converter_to_mjpeg (movie, stream, buffer, size); - break; - case AVI_FORMAT_RGB32: - buffer = avi_converter_to_rgb32 (movie, stream, buffer, size); - break; - default: - break; - } + if (from == to) + return buffer; - return buffer; + if (from != AVI_FORMAT_RGB24 && + to != AVI_FORMAT_RGB24) + return avi_format_convert(movie, stream, + avi_format_convert (movie, stream, buffer, from, AVI_FORMAT_RGB24, size), + AVI_FORMAT_RGB24, to, size); + + switch (to) { + case AVI_FORMAT_RGB24: + switch (from) { + case AVI_FORMAT_AVI_RGB: + buffer = avi_converter_from_avi_rgb (movie, stream, buffer, size); + break; + case AVI_FORMAT_MJPEG: + buffer = avi_converter_from_mjpeg (movie, stream, buffer, size); + break; + case AVI_FORMAT_RGB32: + buffer = avi_converter_from_rgb32 (movie, stream, buffer, size); + break; + default: + break; + } + break; + case AVI_FORMAT_AVI_RGB: + buffer = avi_converter_to_avi_rgb (movie, stream, buffer, size); + break; + case AVI_FORMAT_MJPEG: + buffer = avi_converter_to_mjpeg (movie, stream, buffer, size); + break; + case AVI_FORMAT_RGB32: + buffer = avi_converter_to_rgb32 (movie, stream, buffer, size); + break; + default: + break; + } + + return buffer; } int avi_get_data_id (AviFormat format, int stream) { - char fcc[5]; + char fcc[5]; - if (avi_get_format_type (format) == FCC("vids")) - sprintf (fcc,"%2.2ddc",stream); - else if (avi_get_format_type (format) == FCC("auds")) - sprintf (fcc,"%2.2ddc",stream); - else - return 0; + if (avi_get_format_type (format) == FCC("vids")) + sprintf (fcc,"%2.2ddc",stream); + else if (avi_get_format_type (format) == FCC("auds")) + sprintf (fcc,"%2.2ddc",stream); + else + return 0; - return FCC(fcc); + return FCC(fcc); } int avi_get_format_type (AviFormat format) { - switch (format) { - case AVI_FORMAT_RGB24: - case AVI_FORMAT_RGB32: - case AVI_FORMAT_AVI_RGB: - case AVI_FORMAT_MJPEG: - return FCC("vids"); - break; - default: - return 0; - break; - } + switch (format) { + case AVI_FORMAT_RGB24: + case AVI_FORMAT_RGB32: + case AVI_FORMAT_AVI_RGB: + case AVI_FORMAT_MJPEG: + return FCC("vids"); + break; + default: + return 0; + break; + } } int avi_get_format_fcc (AviFormat format) { - switch (format) { - case AVI_FORMAT_RGB24: - case AVI_FORMAT_RGB32: - case AVI_FORMAT_AVI_RGB: - return FCC("DIB "); - break; - case AVI_FORMAT_MJPEG: - return FCC("MJPG"); - break; - default: - return 0; - break; - } + switch (format) { + case AVI_FORMAT_RGB24: + case AVI_FORMAT_RGB32: + case AVI_FORMAT_AVI_RGB: + return FCC("DIB "); + break; + case AVI_FORMAT_MJPEG: + return FCC("MJPG"); + break; + default: + return 0; + break; + } } int avi_get_format_compression (AviFormat format) { - switch (format) { - case AVI_FORMAT_RGB24: - case AVI_FORMAT_RGB32: - case AVI_FORMAT_AVI_RGB: - return 0; - break; - case AVI_FORMAT_MJPEG: - return FCC("MJPG"); - break; - default: - return 0; - break; - } + switch (format) { + case AVI_FORMAT_RGB24: + case AVI_FORMAT_RGB32: + case AVI_FORMAT_AVI_RGB: + return 0; + break; + case AVI_FORMAT_MJPEG: + return FCC("MJPG"); + break; + default: + return 0; + break; + } } diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 96b6ec357f9..ac532cca7c6 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -1119,12 +1119,12 @@ float brush_curve_strength_clamp(Brush *br, float p, const float len) * used for sculpt only */ float brush_curve_strength(Brush *br, float p, const float len) { - if(p >= len) - p= 1.0f; - else - p= p/len; + if(p >= len) + p= 1.0f; + else + p= p/len; - return curvemapping_evaluateF(br->curve, 0, p); + return curvemapping_evaluateF(br->curve, 0, p); } /* TODO: should probably be unified with BrushPainter stuff? */ diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c index 46f3e124bcc..1d7481b365a 100644 --- a/source/blender/blenkernel/intern/colortools.c +++ b/source/blender/blenkernel/intern/colortools.c @@ -793,7 +793,7 @@ void curvemapping_evaluate_premulRGBF(CurveMapping *cumap, float *vecout, const /* basic error handler, if we dont do this blender will exit */ static int ErrorReportingFunction(int ErrorCode, const char *ErrorText) { - fprintf(stderr, "%s:%d\n", ErrorText, ErrorCode); + fprintf(stderr, "%s:%d\n", ErrorText, ErrorCode); return 1; } #endif diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index a81dcfb990f..884d6313c26 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -254,7 +254,6 @@ int defgroup_find_index (Object *ob, bDeformGroup *dg) if (eg == NULL) return -1; return def_nr; - } /* note, must be freed */ diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index ff49c64ebf4..170b4c23446 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -492,7 +492,7 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O } } } - + /* softbody collision */ if ((ob->type==OB_MESH) || (ob->type==OB_CURVE) || (ob->type==OB_LATTICE)) { if(modifiers_isSoftbodyEnabled(ob) || modifiers_isClothEnabled(ob) || ob->particlesystem.first) diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c index 7cb3adf96bf..16f47f3cc59 100644 --- a/source/blender/blenkernel/intern/exotic.c +++ b/source/blender/blenkernel/intern/exotic.c @@ -889,7 +889,7 @@ void write_dxf(struct Scene *scene, char *str) write_group(0, "SECTION"); write_group(2, "BLOCKS"); - + /* only write meshes we're using in this scene */ flag_listbase_ids(&G.main->mesh, LIB_DOIT, 0); @@ -1608,7 +1608,7 @@ static void dxf_read_arc(Scene *scene, int noob) dia = (float) atof(val); } else if (id==62) { int colorid= atoi(val); - + CLAMP(colorid, 1, 255); dxf_col_to_rgb(colorid, &color[0], &color[1], &color[2]); } else if (id==67) { diff --git a/source/blender/blenkernel/intern/image_gen.c b/source/blender/blenkernel/intern/image_gen.c index 8f6408f1939..5b237665290 100644 --- a/source/blender/blenkernel/intern/image_gen.c +++ b/source/blender/blenkernel/intern/image_gen.c @@ -80,10 +80,10 @@ void BKE_image_buf_fill_checker(unsigned char *rect, float *rect_float, int widt int checkerwidth= 32, dark= 1; int x, y; - + unsigned char *rect_orig= rect; float *rect_float_orig= rect_float; - + float h=0.0, hoffs=0.0, hue=0.0, s=0.9, v=0.9, r, g, b; @@ -191,7 +191,7 @@ static void checker_board_color_fill(unsigned char *rect, float *rect_float, int for(y= 0; y < height; y++) { - + val= 0.1 + (y * (0.4 / height)); /* use a number lower then 1.0 else its too bright */ for(x= 0; x < width; x++) { @@ -316,17 +316,17 @@ static void checker_board_text(unsigned char *rect, float *rect_float, int width BLF_size(mono, 54, 72); /* hard coded size! */ BLF_buffer(mono, rect_float, rect, width, height, 4); - + for(y= 0; y < height; y+=step) { text[1]= '1'; - + for(x= 0; x < width; x+=step) { /* hard coded offset */ pen_x = x + 33; pen_y = y + 44; - + /* terribly crappy outline font! */ BLF_buffer_col(mono, 1.0, 1.0, 1.0, 1.0); @@ -338,7 +338,7 @@ static void checker_board_text(unsigned char *rect, float *rect_float, int width BLF_draw_buffer(mono, text); BLF_position(mono, pen_x, pen_y+outline, 0.0); BLF_draw_buffer(mono, text); - + BLF_position(mono, pen_x-outline, pen_y-outline, 0.0); BLF_draw_buffer(mono, text); BLF_position(mono, pen_x+outline, pen_y+outline, 0.0); @@ -351,12 +351,12 @@ static void checker_board_text(unsigned char *rect, float *rect_float, int width BLF_buffer_col(mono, 0.0, 0.0, 0.0, 1.0); BLF_position(mono, pen_x, pen_y, 0.0); BLF_draw_buffer(mono, text); - + text[1]++; } text[0]++; } - + /* cleanup the buffer. */ BLF_buffer(mono, NULL, NULL, 0, 0, 0); } diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index fa7709e3b33..130bc798ff1 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -1314,12 +1314,12 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col) case MA_RAMP_SOFT: if (g){ float scr, scg, scb; - + /* first calculate non-fac based Screen mix */ scr = 1.0f - (1.0f - col[0]) * (1.0f - *r); scg = 1.0f - (1.0f - col[1]) * (1.0f - *g); scb = 1.0f - (1.0f - col[2]) * (1.0f - *b); - + *r = facm*(*r) + fac*(((1.0f - *r) * col[0] * (*r)) + (*r * scr)); *g = facm*(*g) + fac*(((1.0f - *g) * col[1] * (*g)) + (*g * scg)); *b = facm*(*b) + fac*(((1.0f - *b) * col[2] * (*b)) + (*b * scb)); diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 6fe9e378290..e19a508658e 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -1376,7 +1376,7 @@ void converge (MB_POINT *p1, MB_POINT *p2, float v1, float v2, p->x = 0.5f*(pos.x + neg.x); p->y = 0.5f*(pos.y + neg.y); p->z = 0.5f*(pos.z + neg.z); - + if (i++ == RES) return; if ((function(p->x, p->y, p->z)) > 0.0f){ @@ -1691,11 +1691,11 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */ mul_m4_m4m4(temp2, bob->obmat, obinv); /* MetaBall transformation */ mul_m4_m4m4(mat, temp1, temp2); - + invert_m4_m4(imat,mat); - + mainb[a]->rad2= ml->rad*ml->rad; - + mainb[a]->mat= (float*) mat; mainb[a]->imat= (float*) imat; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index ebbc18cdce9..532e96f3031 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -1465,7 +1465,7 @@ void create_vert_edge_map(ListBase **map, IndexNode **mem, const MEdge *medge, c (*map) = MEM_callocN(sizeof(ListBase) * totvert, "vert edge map"); (*mem) = MEM_callocN(sizeof(IndexNode) * totedge * 2, "vert edge map mem"); node = *mem; - + /* Find the users */ for(i = 0; i < totedge; ++i){ for(j = 0; j < 2; ++j, ++node) { diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 927f4863e2d..e80289c75ae 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -4424,22 +4424,22 @@ void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3] xvec[0] = 1.0f; xvec[1] = 0.0f; xvec[2] = 0.0f; yvec[0] = 0.0f; yvec[1] = 1.0f; yvec[2] = 0.0f; - /* can happen with bad pointcache or physics calculation - * since this becomes geometry, nan's and inf's crash raytrace code. - * better not allow this. */ - if( !finite(bb->vec[0]) || !finite(bb->vec[1]) || !finite(bb->vec[2]) || - !finite(bb->vel[0]) || !finite(bb->vel[1]) || !finite(bb->vel[2]) ) - { - zero_v3(bb->vec); - zero_v3(bb->vel); - - zero_v3(xvec); - zero_v3(yvec); - zero_v3(zvec); - zero_v3(center); + /* can happen with bad pointcache or physics calculation + * since this becomes geometry, nan's and inf's crash raytrace code. + * better not allow this. */ + if( !finite(bb->vec[0]) || !finite(bb->vec[1]) || !finite(bb->vec[2]) || + !finite(bb->vel[0]) || !finite(bb->vel[1]) || !finite(bb->vel[2]) ) + { + zero_v3(bb->vec); + zero_v3(bb->vel); - return; - } + zero_v3(xvec); + zero_v3(yvec); + zero_v3(zvec); + zero_v3(center); + + return; + } if(bb->align < PART_BB_VIEW) onevec[bb->align]=1.0f; diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 1c05b854ef7..666ba31faed 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -644,7 +644,7 @@ static void hammersley_create(float *out, int n, int seed, float amount) for (p = 0.5, kk = k; kk; p *= 0.5, kk >>= 1) if (kk & 1) /* kk mod 2 = 1 */ t += p; - + out[2*k + 0]= fmod((double)k/(double)n + offs[0], 1.0); out[2*k + 1]= fmod(t + offs[1], 1.0); } diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index a8447e2a12a..45cb6254887 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -1308,8 +1308,8 @@ static void ptcache_data_copy(void *from[], void *to[]) { int i; for(i=0; iflag & RPT_PRINT) && (type >= reports->printlevel))) { printf("%s: %s\n", report_type_str(type), message); diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c index 38dc7fd5106..16cef67ea6d 100644 --- a/source/blender/blenkernel/intern/sca.c +++ b/source/blender/blenkernel/intern/sca.c @@ -333,12 +333,12 @@ void free_actuator(bActuator *act) if(act->data) { switch (act->type) { - case ACT_SOUND: - sa = (bSoundActuator *) act->data; - if(sa->sound) - id_us_min((ID *) sa->sound); - break; - } + case ACT_SOUND: + sa = (bSoundActuator *) act->data; + if(sa->sound) + id_us_min((ID *) sa->sound); + break; + } MEM_freeN(act->data); } diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index c4eefb16348..791d572d385 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1080,23 +1080,23 @@ float get_render_aosss_error(RenderData *r, float error) /* helper function for the SETLOOPER macro */ Base *_setlooper_base_step(Scene **sce_iter, Base *base) { - if(base && base->next) { - /* common case, step to the next */ - return base->next; - } + if(base && base->next) { + /* common case, step to the next */ + return base->next; + } else if(base==NULL && (*sce_iter)->base.first) { - /* first time looping, return the scenes first base */ + /* first time looping, return the scenes first base */ return (Base *)(*sce_iter)->base.first; - } - else { - /* reached the end, get the next base in the set */ + } + else { + /* reached the end, get the next base in the set */ while((*sce_iter= (*sce_iter)->set)) { base= (Base *)(*sce_iter)->base.first; - if(base) { - return base; - } - } - } + if(base) { + return base; + } + } + } - return NULL; + return NULL; } diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 3041a4c59e6..b9bf10bdf39 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -2696,7 +2696,7 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) int numFaces = ccgSubSurf_getVertNumFaces(v); float *co; int i; - + edge_sum[0]= edge_sum[1]= edge_sum[2]= 0.0; face_sum[0]= face_sum[1]= face_sum[2]= 0.0; diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c index 85636d23f6f..512086f0e17 100644 --- a/source/blender/blenlib/intern/math_color.c +++ b/source/blender/blenlib/intern/math_color.c @@ -463,14 +463,14 @@ int constrain_rgb(float *r, float *g, float *b) float w; /* Amount of white needed is w = - min(0, *r, *g, *b) */ - + w = (0 < *r) ? 0 : *r; w = (w < *g) ? w : *g; w = (w < *b) ? w : *b; w = -w; /* Add just enough white to make r, g, b all positive. */ - + if (w > 0) { *r += w; *g += w; *b += w; return 1; /* Color modified to fit RGB gamut */ diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 744a15f4711..42a9587596e 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -473,7 +473,7 @@ int isect_line_tri_v3(const float p1[3], const float p2[3], const float v0[3], c cross_v3_v3v3(q, s, e1); - v = f * dot_v3v3(d, q); + v = f * dot_v3v3(d, q); if ((v < 0.0f)||((u + v) > 1.0f)) return 0; *lambda = f * dot_v3v3(e2, q); @@ -519,7 +519,7 @@ int isect_ray_tri_v3(const float p1[3], const float d[3], const float v0[3], con *lambda = f * dot_v3v3(e2, q); if ((*lambda < 0.0f)) return 0; - if(uv) { + if(uv) { uv[0]= u; uv[1]= v; } @@ -529,36 +529,36 @@ int isect_ray_tri_v3(const float p1[3], const float d[3], const float v0[3], con int isect_ray_tri_epsilon_v3(const float p1[3], const float d[3], const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2], const float epsilon) { - float p[3], s[3], e1[3], e2[3], q[3]; - float a, f, u, v; + float p[3], s[3], e1[3], e2[3], q[3]; + float a, f, u, v; - sub_v3_v3v3(e1, v1, v0); - sub_v3_v3v3(e2, v2, v0); + sub_v3_v3v3(e1, v1, v0); + sub_v3_v3v3(e2, v2, v0); - cross_v3_v3v3(p, d, e2); - a = dot_v3v3(e1, p); - if (a == 0.0f) return 0; - f = 1.0f/a; + cross_v3_v3v3(p, d, e2); + a = dot_v3v3(e1, p); + if (a == 0.0f) return 0; + f = 1.0f/a; - sub_v3_v3v3(s, p1, v0); + sub_v3_v3v3(s, p1, v0); - u = f * dot_v3v3(s, p); - if ((u < -epsilon)||(u > 1.0f+epsilon)) return 0; + u = f * dot_v3v3(s, p); + if ((u < -epsilon)||(u > 1.0f+epsilon)) return 0; - cross_v3_v3v3(q, s, e1); + cross_v3_v3v3(q, s, e1); - v = f * dot_v3v3(d, q); - if ((v < -epsilon)||((u + v) > 1.0f+epsilon)) return 0; + v = f * dot_v3v3(d, q); + if ((v < -epsilon)||((u + v) > 1.0f+epsilon)) return 0; - *lambda = f * dot_v3v3(e2, q); - if ((*lambda < 0.0f)) return 0; + *lambda = f * dot_v3v3(e2, q); + if ((*lambda < 0.0f)) return 0; - if(uv) { - uv[0]= u; - uv[1]= v; - } + if(uv) { + uv[0]= u; + uv[1]= v; + } - return 1; + return 1; } int isect_ray_tri_threshold_v3(const float p1[3], const float d[3], const float v0[3], const float v1[3], const float v2[3], float *lambda, float *uv, const float threshold) @@ -2604,7 +2604,7 @@ static float ff_quad_form_factor(float *p, float *n, float *q0, float *q1, float aresult = (_mm_set_ps1(n[0])*gx + _mm_set_ps1(n[1])*gy + _mm_set_ps1(n[2])*gz)*angle; /* sum together */ - result= (fresult[0] + fresult[1] + fresult[2] + fresult[3])*(0.5f/(float)M_PI); + result= (fresult[0] + fresult[1] + fresult[2] + fresult[3])*(0.5f/(float)M_PI); result= MAX2(result, 0.0f); return result; diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c index a2fa69bfcd9..95a43a998d3 100644 --- a/source/blender/blenlib/intern/pbvh.c +++ b/source/blender/blenlib/intern/pbvh.c @@ -672,7 +672,7 @@ static PBVHNode *pbvh_iter_next(PBVHIter *iter) parents, this order is necessary for e.g. computing bounding boxes */ while(iter->stacksize) { - /* pop node */ + /* pop node */ iter->stacksize--; node= iter->stack[iter->stacksize].node; @@ -709,30 +709,30 @@ static PBVHNode *pbvh_iter_next(PBVHIter *iter) static PBVHNode *pbvh_iter_next_occluded(PBVHIter *iter) { - PBVHNode *node; + PBVHNode *node; - while(iter->stacksize) { - /* pop node */ - iter->stacksize--; - node= iter->stack[iter->stacksize].node; + while(iter->stacksize) { + /* pop node */ + iter->stacksize--; + node= iter->stack[iter->stacksize].node; - /* on a mesh with no faces this can happen - * can remove this check if we know meshes have at least 1 face */ - if(node==NULL) return NULL; + /* on a mesh with no faces this can happen + * can remove this check if we know meshes have at least 1 face */ + if(node==NULL) return NULL; - if(iter->scb && !iter->scb(node, iter->search_data)) continue; /* don't traverse, outside of search zone */ + if(iter->scb && !iter->scb(node, iter->search_data)) continue; /* don't traverse, outside of search zone */ - if(node->flag & PBVH_Leaf) { - /* immediately hit leaf node */ - return node; - } - else { - pbvh_stack_push(iter, iter->bvh->nodes+node->children_offset+1, 0); - pbvh_stack_push(iter, iter->bvh->nodes+node->children_offset, 0); - } - } + if(node->flag & PBVH_Leaf) { + /* immediately hit leaf node */ + return node; + } + else { + pbvh_stack_push(iter, iter->bvh->nodes+node->children_offset+1, 0); + pbvh_stack_push(iter, iter->bvh->nodes+node->children_offset, 0); + } + } - return NULL; + return NULL; } void BLI_pbvh_search_gather(PBVH *bvh, @@ -793,59 +793,59 @@ void BLI_pbvh_search_callback(PBVH *bvh, } typedef struct node_tree { - PBVHNode* data; + PBVHNode* data; - struct node_tree* left; - struct node_tree* right; + struct node_tree* left; + struct node_tree* right; } node_tree; static void node_tree_insert(node_tree* tree, node_tree* new_node) { - if (new_node->data->tmin < tree->data->tmin) { - if (tree->left) { - node_tree_insert(tree->left, new_node); - } - else { - tree->left = new_node; - } - } - else { - if (tree->right) { - node_tree_insert(tree->right, new_node); - } - else { - tree->right = new_node; - } - } + if (new_node->data->tmin < tree->data->tmin) { + if (tree->left) { + node_tree_insert(tree->left, new_node); + } + else { + tree->left = new_node; + } + } + else { + if (tree->right) { + node_tree_insert(tree->right, new_node); + } + else { + tree->right = new_node; + } + } } static void traverse_tree(node_tree* tree, BLI_pbvh_HitOccludedCallback hcb, void* hit_data, float* tmin) { - if (tree->left) traverse_tree(tree->left, hcb, hit_data, tmin); + if (tree->left) traverse_tree(tree->left, hcb, hit_data, tmin); - hcb(tree->data, hit_data, tmin); + hcb(tree->data, hit_data, tmin); - if (tree->right) traverse_tree(tree->right, hcb, hit_data, tmin); + if (tree->right) traverse_tree(tree->right, hcb, hit_data, tmin); } static void free_tree(node_tree* tree) { - if (tree->left) { - free_tree(tree->left); - tree->left = 0; - } + if (tree->left) { + free_tree(tree->left); + tree->left = 0; + } - if (tree->right) { - free_tree(tree->right); - tree->right = 0; - } + if (tree->right) { + free_tree(tree->right); + tree->right = 0; + } - free(tree); + free(tree); } float BLI_pbvh_node_get_tmin(PBVHNode* node) { - return node->tmin; + return node->tmin; } static void BLI_pbvh_search_callback_occluded(PBVH *bvh, @@ -1129,7 +1129,7 @@ void BLI_pbvh_get_grid_updates(PBVH *bvh, int clear, void ***gridfaces, int *tot GHash *map; void *face, **faces; unsigned i; - int tot; + int tot; map = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "pbvh_get_grid_updates gh"); @@ -1318,17 +1318,17 @@ static int ray_face_intersection(float ray_start[3], float ray_normal[3], float *t0, float *t1, float *t2, float *t3, float *fdist) { - float dist; + float dist; - if ((isect_ray_tri_epsilon_v3(ray_start, ray_normal, t0, t1, t2, &dist, NULL, 0.1f) && dist < *fdist) || - (t3 && isect_ray_tri_epsilon_v3(ray_start, ray_normal, t0, t2, t3, &dist, NULL, 0.1f) && dist < *fdist)) - { - *fdist = dist; - return 1; - } - else { - return 0; - } + if ((isect_ray_tri_epsilon_v3(ray_start, ray_normal, t0, t1, t2, &dist, NULL, 0.1f) && dist < *fdist) || + (t3 && isect_ray_tri_epsilon_v3(ray_start, ray_normal, t0, t2, t3, &dist, NULL, 0.1f) && dist < *fdist)) + { + *fdist = dist; + return 1; + } + else { + return 0; + } } int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3], diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index d626ca4bf09..ee5bd17c901 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -381,64 +381,64 @@ static const char trailingBytesForUTF8[256] = { int BLI_utf8_invalid_byte(const char *str, int length) { - const unsigned char *p, *pend = (unsigned char*)str + length; - unsigned char c; - int ab; + const unsigned char *p, *pend = (unsigned char*)str + length; + unsigned char c; + int ab; - for (p = (unsigned char*)str; p < pend; p++) { - c = *p; - if (c < 128) - continue; - if ((c & 0xc0) != 0xc0) - goto utf8_error; - ab = trailingBytesForUTF8[c]; - if (length < ab) - goto utf8_error; - length -= ab; + for (p = (unsigned char*)str; p < pend; p++) { + c = *p; + if (c < 128) + continue; + if ((c & 0xc0) != 0xc0) + goto utf8_error; + ab = trailingBytesForUTF8[c]; + if (length < ab) + goto utf8_error; + length -= ab; - p++; - /* Check top bits in the second byte */ - if ((*p & 0xc0) != 0x80) - goto utf8_error; + p++; + /* Check top bits in the second byte */ + if ((*p & 0xc0) != 0x80) + goto utf8_error; - /* Check for overlong sequences for each different length */ - switch (ab) { - /* Check for xx00 000x */ - case 1: - if ((c & 0x3e) == 0) goto utf8_error; - continue; /* We know there aren't any more bytes to check */ + /* Check for overlong sequences for each different length */ + switch (ab) { + /* Check for xx00 000x */ + case 1: + if ((c & 0x3e) == 0) goto utf8_error; + continue; /* We know there aren't any more bytes to check */ - /* Check for 1110 0000, xx0x xxxx */ - case 2: - if (c == 0xe0 && (*p & 0x20) == 0) goto utf8_error; - break; + /* Check for 1110 0000, xx0x xxxx */ + case 2: + if (c == 0xe0 && (*p & 0x20) == 0) goto utf8_error; + break; - /* Check for 1111 0000, xx00 xxxx */ - case 3: - if (c == 0xf0 && (*p & 0x30) == 0) goto utf8_error; - break; + /* Check for 1111 0000, xx00 xxxx */ + case 3: + if (c == 0xf0 && (*p & 0x30) == 0) goto utf8_error; + break; - /* Check for 1111 1000, xx00 0xxx */ - case 4: - if (c == 0xf8 && (*p & 0x38) == 0) goto utf8_error; - break; + /* Check for 1111 1000, xx00 0xxx */ + case 4: + if (c == 0xf8 && (*p & 0x38) == 0) goto utf8_error; + break; - /* Check for leading 0xfe or 0xff, - and then for 1111 1100, xx00 00xx */ - case 5: - if (c == 0xfe || c == 0xff || - (c == 0xfc && (*p & 0x3c) == 0)) goto utf8_error; - break; - } + /* Check for leading 0xfe or 0xff, + and then for 1111 1100, xx00 00xx */ + case 5: + if (c == 0xfe || c == 0xff || + (c == 0xfc && (*p & 0x3c) == 0)) goto utf8_error; + break; + } - /* Check for valid bytes after the 2nd, if any; all must start 10 */ - while (--ab > 0) { - if ((*(p+1) & 0xc0) != 0x80) goto utf8_error; + /* Check for valid bytes after the 2nd, if any; all must start 10 */ + while (--ab > 0) { + if ((*(p+1) & 0xc0) != 0x80) goto utf8_error; p++; /* do this after so we get usable offset - campbell */ - } - } + } + } - return -1; + return -1; utf8_error: diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 93d266668e2..e4e61e49e90 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3694,7 +3694,7 @@ static void lib_link_object(FileData *fd, Main *main) ob->gpd= newlibadr_us(fd, ob->id.lib, ob->gpd); ob->duplilist= NULL; - + ob->id.flag -= LIB_NEEDLINK; /* if id.us==0 a new base will be created later on */ diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c index 07069a69c40..f111339b963 100644 --- a/source/blender/editors/animation/keyframes_general.c +++ b/source/blender/editors/animation/keyframes_general.c @@ -113,7 +113,7 @@ void delete_fcurve_keys(FCurve *fcu) if(fcu->bezt==NULL) /* ignore baked curves */ return; - + /* Delete selected BezTriples */ for (i=0; i < fcu->totvert; i++) { if (fcu->bezt[i].f2 & SELECT) { diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c index 67773d358d0..566ccd7cd3f 100644 --- a/source/blender/editors/armature/meshlaplacian.c +++ b/source/blender/editors/armature/meshlaplacian.c @@ -471,7 +471,7 @@ static void heat_ray_tree_create(LaplacianSystem *sys) static int heat_ray_source_visible(LaplacianSystem *sys, int vertex, int source) { - BVHTreeRayHit hit; + BVHTreeRayHit hit; BVHCallbackUserData data; MFace *mface; float end[3]; diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 08f8496eb8a..68f45c5fdb4 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -3031,7 +3031,7 @@ static void subdividenurb(Object *obedit, int number_cuts) /* This is a very strange test ... */ /** Subdivide NURB surfaces - nzc 30-5-'00 - - + Subdivision of a NURB curve can be effected by adding a control point (insertion of a knot), or by raising the degree of the functions used to build the NURB. The diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 1495d2b00ba..b07baf45d23 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -370,7 +370,7 @@ static void ui_popup_bounds_block(const bContext *C, uiBlock *block, int bounds_ /* and we adjust the position to fit within window */ width= block->maxx - block->minx; height= block->maxy - block->miny; - + /* avoid divide by zero below, caused by calling with no UI, but better not crash */ oldwidth= oldwidth > 0 ? oldwidth : MAX2(1, width); oldheight= oldheight > 0 ? oldheight : MAX2(1, height); @@ -1284,7 +1284,7 @@ double ui_get_but_val(uiBut *but) else if( but->pointype == FLO ) { value= *(float *)but->poin; } - + return value; } diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index a208eee1649..7dc27805b40 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1196,10 +1196,10 @@ static void rna_search_cb(const struct bContext *C, void *arg_but, const char *s #endif name= BLI_strdup(name_ui); iconid= ui_id_icon_get((bContext*)C, id, 1); - } + } else { name= RNA_struct_name_get_alloc(&itemptr, NULL, 0); - iconid = 0; + iconid = 0; } if(name) { diff --git a/source/blender/editors/object/object_group.c b/source/blender/editors/object/object_group.c index 1fa17c34dd0..b1ab68ff087 100644 --- a/source/blender/editors/object/object_group.c +++ b/source/blender/editors/object/object_group.c @@ -238,8 +238,8 @@ static int group_add_exec(bContext *C, wmOperator *UNUSED(op)) if(ob == NULL) return OPERATOR_CANCELLED; - group= add_group("Group"); - add_to_group(group, ob, scene, NULL); + group= add_group("Group"); + add_to_group(group, ob, scene, NULL); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); @@ -264,12 +264,12 @@ static int group_link_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; - Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group")); + Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group")); if(ELEM(NULL, ob, group)) return OPERATOR_CANCELLED; - add_to_group(group, ob, scene, NULL); + add_to_group(group, ob, scene, NULL); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 76c917291a8..d1315001f9e 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -348,7 +348,7 @@ static void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum) */ if(dvert->dw[i].def_nr == def_nr) { dvert->totweight--; - + /* if there are still other deform weights * attached to this vert then remove this * deform weight, and reshuffle the others @@ -457,10 +457,10 @@ static void ED_vgroup_nr_vert_add(Object *ob, int def_nr, int vertnum, float wei MEM_freeN(dv->dw); } dv->dw=newdw; - + dv->dw[dv->totweight].weight=weight; dv->dw[dv->totweight].def_nr=def_nr; - + dv->totweight++; break; } diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index 3f2fcaab94a..d7df329816d 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -2445,7 +2445,7 @@ static int weight_set_exec(bContext *C, wmOperator *op) HairKey *hkey; float weight; ParticleBrushData *brush= &pset->brush[pset->brushtype]; - float factor= RNA_float_get(op->ptr, "factor"); + float factor= RNA_float_get(op->ptr, "factor"); weight= brush->strength; edit= psys->edit; @@ -2477,8 +2477,8 @@ void PARTICLE_OT_weight_set(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - RNA_def_float(ot->srna, "factor", 1, 0, 1, "Factor", "", 0, 1); + + RNA_def_float(ot->srna, "factor", 1, 0, 1, "Factor", "", 0, 1); } /************************ cursor drawing *******************************/ diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index ad1d55c336b..05e60fe8f9c 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -1882,9 +1882,9 @@ static void calc_sculpt_plane(Sculpt *sd, Object *ob, PBVHNode **nodes, int totn /* Projects a point onto a plane along the plane's normal */ static void point_plane_project(float intr[3], float co[3], float plane_normal[3], float plane_center[3]) { - sub_v3_v3v3(intr, co, plane_center); - mul_v3_v3fl(intr, plane_normal, dot_v3v3(plane_normal, intr)); - sub_v3_v3v3(intr, co, intr); + sub_v3_v3v3(intr, co, plane_center); + mul_v3_v3fl(intr, plane_normal, dot_v3v3(plane_normal, intr)); + sub_v3_v3v3(intr, co, intr); } static int plane_trim(StrokeCache *cache, Brush *brush, float val[3]) @@ -1894,23 +1894,23 @@ static int plane_trim(StrokeCache *cache, Brush *brush, float val[3]) static int plane_point_side_flip(float co[3], float plane_normal[3], float plane_center[3], int flip) { - float delta[3]; - float d; + float delta[3]; + float d; - sub_v3_v3v3(delta, co, plane_center); - d = dot_v3v3(plane_normal, delta); + sub_v3_v3v3(delta, co, plane_center); + d = dot_v3v3(plane_normal, delta); - if (flip) d = -d; + if (flip) d = -d; - return d <= 0.0f; + return d <= 0.0f; } static int plane_point_side(float co[3], float plane_normal[3], float plane_center[3]) { - float delta[3]; + float delta[3]; - sub_v3_v3v3(delta, co, plane_center); - return dot_v3v3(plane_normal, delta) <= 0.0f; + sub_v3_v3v3(delta, co, plane_center); + return dot_v3v3(plane_normal, delta) <= 0.0f; } static float get_offset(Sculpt *sd, SculptSession *ss) diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c index 22170bb439f..890a6cf545a 100644 --- a/source/blender/editors/space_console/space_console.c +++ b/source/blender/editors/space_console/space_console.c @@ -182,8 +182,8 @@ static int path_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(eve static void path_drop_copy(wmDrag *drag, wmDropBox *drop) { - char pathname[FILE_MAXDIR+FILE_MAXFILE+2]; - snprintf(pathname, sizeof(pathname), "\"%s\"", drag->path); + char pathname[FILE_MAXDIR+FILE_MAXFILE+2]; + snprintf(pathname, sizeof(pathname), "\"%s\"", drag->path); RNA_string_set(drop->ptr, "text", pathname); } diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 775f06ea7a4..4eddeaaaf9f 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -363,7 +363,7 @@ static int file_select_all_exec(bContext *C, wmOperator *UNUSED(op)) int numfiles = filelist_numfiles(sfile->files); int i; int is_selected = 0; - + sel.first = 0; sel.last = numfiles-1; diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index ea3512b456d..04fe2ebf828 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -493,7 +493,7 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar) layout->tile_h = textheight*3/2; layout->height= (int)(v2d->cur.ymax - v2d->cur.ymin - 2*layout->tile_border_y); layout->rows = layout->height / (layout->tile_h + 2*layout->tile_border_y); - + column_widths(sfile->files, layout); if (params->display == FILE_SHORTDISPLAY) { diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 66e19cf0400..db8eff11498 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -2201,12 +2201,12 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo case ACT_CAMERA: ysize= 48; - + glRects(xco, yco-ysize, xco+width, yco); uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); ca= act->data; - + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+10, yco-24, (width-20)/2, 19, &(ca->ob), "Look at this Object"); uiDefButF(block, NUM, 0, "Height:", xco+10+(width-20)/2, yco-24, (width-20)/2, 19, &ca->height, 0.0, 20.0, 0, 0, ""); @@ -2219,7 +2219,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo uiDefButF(block, NUM, 0, "Max:", xco+20+(width)/2, yco-44, (width-60)/2, 19, &ca->max, 0.0, 20.0, 0, 0, ""); yco-= ysize; - + break; case ACT_EDIT_OBJECT: @@ -2311,7 +2311,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo uiDefButS(block, MENU, B_REDR, str, xco+40, yco-24, (width-80), 19, &eoa->type, 0.0, 0.0, 0, 0, ""); yco-= ysize; - + break; case ACT_CONSTRAINT: @@ -2319,7 +2319,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo if (coa->type == ACT_CONST_TYPE_LOC) { ysize= 69; - + glRects(xco, yco-ysize, xco+width, yco); uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index db6e4640d5f..a310b309d84 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -730,22 +730,22 @@ static void node_composit_buts_flip(uiLayout *layout, bContext *UNUSED(C), Point static void node_composit_buts_crop(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { uiLayout *col; - + uiItemR(layout, ptr, "use_crop_size", 0, NULL, ICON_NONE); - uiItemR(layout, ptr, "relative", 0, NULL, ICON_NONE); + uiItemR(layout, ptr, "relative", 0, NULL, ICON_NONE); col= uiLayoutColumn(layout, 1); - if (RNA_boolean_get(ptr, "relative")){ - uiItemR(col, ptr, "rel_min_x", 0, "Left", ICON_NONE); - uiItemR(col, ptr, "rel_max_x", 0, "Right", ICON_NONE); - uiItemR(col, ptr, "rel_min_y", 0, "Up", ICON_NONE); - uiItemR(col, ptr, "rel_max_y", 0, "Down", ICON_NONE); - } else { - uiItemR(col, ptr, "min_x", 0, "Left", ICON_NONE); - uiItemR(col, ptr, "max_x", 0, "Right", ICON_NONE); - uiItemR(col, ptr, "min_y", 0, "Up", ICON_NONE); - uiItemR(col, ptr, "max_y", 0, "Down", ICON_NONE); - } + if (RNA_boolean_get(ptr, "relative")){ + uiItemR(col, ptr, "rel_min_x", 0, "Left", ICON_NONE); + uiItemR(col, ptr, "rel_max_x", 0, "Right", ICON_NONE); + uiItemR(col, ptr, "rel_min_y", 0, "Up", ICON_NONE); + uiItemR(col, ptr, "rel_max_y", 0, "Down", ICON_NONE); + } else { + uiItemR(col, ptr, "min_x", 0, "Left", ICON_NONE); + uiItemR(col, ptr, "max_x", 0, "Right", ICON_NONE); + uiItemR(col, ptr, "min_y", 0, "Up", ICON_NONE); + uiItemR(col, ptr, "max_y", 0, "Down", ICON_NONE); + } } static void node_composit_buts_splitviewer(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 4b193011467..ed70e2b05f1 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -1035,7 +1035,7 @@ static int snode_bg_viewmove_modal(bContext *C, wmOperator *op, wmEvent *event) MEM_freeN(nvm); op->customdata= NULL; - + WM_event_add_notifier(C, NC_SPACE|ND_SPACE_NODE, NULL); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index d1b23dced26..88d83b55788 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -614,7 +614,7 @@ int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequen } } } - + /* make sequence selection a little bit more intuitive for 3 strips: the last-strip should be sequence3 */ if (seq3 != NULL && seq2 != NULL) { diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 1c830b7022a..345b3746100 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -993,7 +993,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) cpack(0x4040FF); glRectf(x3, y3, x4, y4); } - + /* safety border */ if (ca && (ca->flag & CAM_SHOWTITLESAFE)) { fac= 0.1; diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 7cbb56e2fd6..98742bd0c7c 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -2565,10 +2565,10 @@ void VIEW3D_OT_cursor3d(wmOperatorType *ot) ot->invoke= set_3dcursor_invoke; ot->poll= ED_operator_view3d_active; - + /* flags */ // ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - + /* rna later */ } diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c index 7d84a47bddf..ce770aaae6a 100644 --- a/source/blender/editors/space_view3d/view3d_fly.c +++ b/source/blender/editors/space_view3d/view3d_fly.c @@ -793,7 +793,7 @@ static int flyApply(bContext *C, FlyInfo *fly) /* transform the parent or the camera? */ if(fly->root_parent) { Object *ob_update; - + float view_mat[4][4]; float prev_view_imat[4][4]; float diff_mat[4][4]; diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index bd19112f924..39a18d31d7e 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -2234,7 +2234,7 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op) int select; select= (gesture_mode==GESTURE_MODAL_SELECT); - + if( CTX_data_edit_object(C) || paint_facesel_test(obact) || (obact && (obact->mode & (OB_MODE_PARTICLE_EDIT|OB_MODE_POSE))) ) { diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 04783cce634..5e960593bd7 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -3745,7 +3745,7 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count } } #endif - + /* for extend we need to do some tricks */ if (t->mode == TFM_TIME_EXTEND) { diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index b38f8412524..494cf7dee83 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -2331,7 +2331,7 @@ static int circle_select_exec(bContext *C, wmOperator *op) int x, y, radius, width, height, select; float zoomx, zoomy, offset[2], ellipse[2]; int gesture_mode= RNA_int_get(op->ptr, "gesture_mode"); - + /* get operator properties */ select= (gesture_mode == GESTURE_MODAL_SELECT); x= RNA_int_get(op->ptr, "x"); diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c index 23af1eafdb7..7ba85d30763 100644 --- a/source/blender/editors/uvedit/uvedit_parametrizer.c +++ b/source/blender/editors/uvedit/uvedit_parametrizer.c @@ -1142,7 +1142,7 @@ static void p_chart_boundaries(PChart *chart, int *nboundaries, PEdge **outer) (*nboundaries)++; len = 0.0f; - + be = e; do { be->flag |= PEDGE_DONE; diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index cc5efd9a6ca..eece7fba91c 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -629,7 +629,7 @@ static void uv_map_rotation_matrix(float result[][4], RegionView3D *rv3d, Object rotside[1][0]= (float)sin(sideangle); rotside[1][1]= (float)cos(sideangle); rotside[2][2]= 1.0f; - + upangle= (float)M_PI*upangledeg/180.0f; rotup[1][1]= (float)cos(upangle)/radius; rotup[1][2]= -(float)sin(upangle)/radius; diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index d87fe865826..323ca6ab78b 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -793,7 +793,7 @@ static ListBase image_free_queue = {NULL, NULL}; static void gpu_queue_image_for_free(Image *ima) { - Image *cpy = MEM_dupallocN(ima); + Image *cpy = MEM_dupallocN(ima); BLI_lock_thread(LOCK_OPENGL); BLI_addtail(&image_free_queue, cpy); diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index 453eb995113..c0bed18d89b 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -119,8 +119,8 @@ void GPU_extensions_init(void) glGetIntegerv(GL_RED_BITS, &r); glGetIntegerv(GL_GREEN_BITS, &g); glGetIntegerv(GL_BLUE_BITS, &b); - GG.colordepth = r+g+b; /* assumes same depth for RGB */ - + GG.colordepth = r+g+b; /* assumes same depth for RGB */ + vendor = (const char*)glGetString(GL_VENDOR); renderer = (const char*)glGetString(GL_RENDERER); @@ -141,7 +141,7 @@ void GPU_extensions_init(void) else if(strstr(vendor, "Intel") || /* src/mesa/drivers/dri/intel/intel_context.c */ strstr(renderer, "Mesa DRI Intel") || - strstr(renderer, "Mesa DRI Mobile Intel")) { + strstr(renderer, "Mesa DRI Mobile Intel")) { GG.device = GPU_DEVICE_INTEL; GG.driver = GPU_DRIVER_OFFICIAL; } @@ -210,7 +210,7 @@ int GPU_non_power_of_two_support(void) int GPU_color_depth(void) { - return GG.colordepth; + return GG.colordepth; } int GPU_print_error(const char *str) @@ -1223,10 +1223,10 @@ void GPU_pixelbuffer_texture(GPUTexture *tex, GPUPixelBuffer *pb) glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, pb->bindcode[pb->current]); glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_EXT, pb->datasize, NULL, GL_STREAM_DRAW_ARB); - + pixels = glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, GL_WRITE_ONLY); /*memcpy(pixels, _oImage.data(), pb->datasize);*/ - + if (!glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT)) { fprintf(stderr, "Could not unmap opengl PBO\n"); break; diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c index a964f345b2b..4de96bb17bc 100644 --- a/source/blender/imbuf/intern/anim_movie.c +++ b/source/blender/imbuf/intern/anim_movie.c @@ -185,7 +185,7 @@ static ImBuf * movie_fetchibuf(struct anim * anim, int position) { if (anim->interlacing == DM_IMAGE_INTERLACED_EVEN) { rect1 = ibuf->rect + (ibuf->x * ibuf->y) - 1; rect2 = rect1 - ibuf->x; - + for (size = ibuf->x * (ibuf->y - 1); size > 0; size--){ *rect1-- = *rect2--; } diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c index 6ebb86f646d..e59cf77a871 100644 --- a/source/blender/imbuf/intern/scaling.c +++ b/source/blender/imbuf/intern/scaling.c @@ -74,7 +74,7 @@ struct ImBuf *IMB_half_x(struct ImBuf *ibuf1) _p1 = (uchar *) ibuf1->rect; dest=(uchar *) ibuf2->rect; - + _p1f = ibuf1->rect_float; destf= ibuf2->rect_float; @@ -600,7 +600,7 @@ static void enlarge_picture_float( if ((int) y_src == src_height - 1) { line2 = line1; } - + x_src = 0; for (x_dst = 0; x_dst < dst_width; x_dst++) { const float weight1x = (float)(1.0 - (x_src - (int) x_src)); diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c index 15f63883191..07ee084f976 100644 --- a/source/blender/makesdna/intern/makesdna.c +++ b/source/blender/makesdna/intern/makesdna.c @@ -1065,7 +1065,7 @@ int make_structDNA(char *baseDirectory, FILE *file) MEM_freeN(names); MEM_freeN(types); MEM_freeN(typelens); - MEM_freeN(alphalens); + MEM_freeN(alphalens); MEM_freeN(structs); if (debugSDNA > -1) printf("done.\n"); diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 863c30f8ef2..2afba954be3 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -497,18 +497,18 @@ static void rna_Actuator_Armature_update(Main *bmain, Scene *scene, PointerRNA * /* note: the following set functions exists only to avoid id refcounting */ static void rna_Actuator_editobject_mesh_set(PointerRNA *ptr, PointerRNA value) { - bActuator *act = (bActuator *)ptr->data; - bEditObjectActuator *eoa = (bEditObjectActuator *) act->data; + bActuator *act = (bActuator *)ptr->data; + bEditObjectActuator *eoa = (bEditObjectActuator *) act->data; - eoa->me = value.data; + eoa->me = value.data; } static void rna_Actuator_action_action_set(PointerRNA *ptr, PointerRNA value) { - bActuator *act = (bActuator *)ptr->data; - bActionActuator *aa = (bActionActuator *) act->data; + bActuator *act = (bActuator *)ptr->data; + bActionActuator *aa = (bActionActuator *) act->data; - aa->act = value.data; + aa->act = value.data; } #else @@ -579,8 +579,8 @@ static void rna_def_action_actuator(BlenderRNA *brna) RNA_def_property_struct_type(prop, "Action"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Action", ""); - /* note: custom set function is ONLY to avoid rna setting a user for this. */ - RNA_def_property_pointer_funcs(prop, NULL, "rna_Actuator_action_action_set", NULL, NULL); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_Actuator_action_action_set", NULL, NULL); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "use_continue_last_frame", PROP_BOOLEAN, PROP_NONE); @@ -1811,8 +1811,8 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna) RNA_def_property_struct_type(prop, "Action"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Action", ""); - /* note: custom set function is ONLY to avoid rna setting a user for this. */ - RNA_def_property_pointer_funcs(prop, NULL, "rna_Actuator_action_action_set", NULL, NULL); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_Actuator_action_action_set", NULL, NULL); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "use_continue_last_frame", PROP_BOOLEAN, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c index d8f0abfd7e2..e57491dc36d 100644 --- a/source/blender/makesrna/intern/rna_constraint.c +++ b/source/blender/makesrna/intern/rna_constraint.c @@ -1329,7 +1329,7 @@ static void rna_def_constraint_rigid_body_joint(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", 4); RNA_def_property_ui_text(prop, "Limit Z", "Use minimum/maximum z limit"); RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); - + prop= RNA_def_property(srna, "use_angular_limit_x", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", 8); RNA_def_property_ui_text(prop, "Angular X Limit", "Use minimum/maximum x angular limit"); @@ -1344,7 +1344,6 @@ static void rna_def_constraint_rigid_body_joint(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", 32); RNA_def_property_ui_text(prop, "Angular Z Limit", "Use minimum/maximum z angular limit"); RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); - } static void rna_def_constraint_clamp_to(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index efb5bf0244c..1b18f88efcc 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -164,8 +164,8 @@ static void rna_DriverTarget_update_name(Main *bmain, Scene *scene, PointerRNA * /* note: this function exists only to avoid id refcounting */ static void rna_DriverTarget_id_set(PointerRNA *ptr, PointerRNA value) { - DriverTarget *dtar= (DriverTarget*)ptr->data; - dtar->id= value.data; + DriverTarget *dtar= (DriverTarget*)ptr->data; + dtar->id= value.data; } static StructRNA *rna_DriverTarget_id_typef(PointerRNA *ptr) @@ -1044,7 +1044,7 @@ static void rna_def_drivertarget(BlenderRNA *brna) RNA_def_property_struct_type(prop, "ID"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_editable_func(prop, "rna_DriverTarget_id_editable"); - /* note: custom set function is ONLY to avoid rna setting a user for this. */ + /* note: custom set function is ONLY to avoid rna setting a user for this. */ RNA_def_property_pointer_funcs(prop, NULL, "rna_DriverTarget_id_set", "rna_DriverTarget_id_typef", NULL); RNA_def_property_ui_text(prop, "ID", "ID-block that the specific property used can be found from (id_type property must be set first)"); RNA_def_property_update(prop, 0, "rna_DriverTarget_update_data"); diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index a30b5d4eb05..436418324e2 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -101,7 +101,7 @@ EnumPropertyItem metaelem_type_items[] = { #define OBTYPE_CU_CURVE {OB_CURVE, "CURVE", 0, "Curve", ""} #define OBTYPE_CU_SURF {OB_SURF, "SURFACE", 0, "Surface", ""} #define OBTYPE_CU_FONT {OB_FONT, "FONT", 0, "Font", ""} - + EnumPropertyItem object_type_items[] = { {OB_MESH, "MESH", 0, "Mesh", ""}, OBTYPE_CU_CURVE, diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c index 13fac68bf9f..0619f5e19b6 100644 --- a/source/blender/makesrna/intern/rna_object_force.c +++ b/source/blender/makesrna/intern/rna_object_force.c @@ -820,7 +820,7 @@ static void rna_def_pointcache(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_EXTERNAL); RNA_def_property_ui_text(prop, "External", "Read cache from an external location"); RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change"); - + prop= RNA_def_property(srna, "use_library_path", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", PTCACHE_IGNORE_LIBPATH); RNA_def_property_ui_text(prop, "Library Path", "Use this files path when library linked into another file."); diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c index e19816a42f6..5bf398ae3a7 100644 --- a/source/blender/makesrna/intern/rna_sensor.c +++ b/source/blender/makesrna/intern/rna_sensor.c @@ -243,10 +243,10 @@ static void rna_Sensor_Armature_update(Main *bmain, Scene *scene, PointerRNA *pt /* note: the following set functions exists only to avoid id refcounting */ static void rna_Sensor_touch_material_set(PointerRNA *ptr, PointerRNA value) { - bSensor *sens = (bSensor *)ptr->data; - bTouchSensor *ts = (bTouchSensor *) sens->data; + bSensor *sens = (bSensor *)ptr->data; + bTouchSensor *ts = (bTouchSensor *) sens->data; - ts->ma = value.data; + ts->ma = value.data; } #else diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 52fae14a023..2e947039c16 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -544,8 +544,8 @@ static void rna_SpaceTextEditor_text_set(PointerRNA *ptr, PointerRNA value) /* note: this function exists only to avoid id refcounting */ static void rna_SpaceProperties_pin_id_set(PointerRNA *ptr, PointerRNA value) { - SpaceButs *sbuts= (SpaceButs*)(ptr->data); - sbuts->pinid= value.data; + SpaceButs *sbuts= (SpaceButs*)(ptr->data); + sbuts->pinid= value.data; } static StructRNA *rna_SpaceProperties_pin_id_typef(PointerRNA *ptr) @@ -1443,7 +1443,7 @@ static void rna_def_space_buttons(BlenderRNA *brna) prop= RNA_def_property(srna, "pin_id", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "pinid"); RNA_def_property_struct_type(prop, "ID"); - /* note: custom set function is ONLY to avoid rna setting a user for this. */ + /* note: custom set function is ONLY to avoid rna setting a user for this. */ RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceProperties_pin_id_set", "rna_SpaceProperties_pin_id_typef", NULL); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, "rna_SpaceProperties_pin_id_update"); @@ -2380,7 +2380,7 @@ static void rna_def_space_node(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "zoom"); RNA_def_property_float_default(prop, 1.0f); RNA_def_property_range(prop, 0.01f, FLT_MAX); - RNA_def_property_ui_range(prop, 0.01, 100, 1, 2); + RNA_def_property_ui_range(prop, 0.01, 100, 1, 2); RNA_def_property_ui_text(prop, "Backdrop Zoom", "Backdrop zoom factor"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL); diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 84a6725807a..c21feead18f 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -1988,7 +1988,7 @@ static void rna_def_userdef_view(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_SHOW_VIEWPORTNAME); RNA_def_property_ui_text(prop, "Show View Name", "Show the name of the view's direction in each 3D View"); RNA_def_property_update(prop, 0, "rna_userdef_update"); - + prop= RNA_def_property(srna, "show_splash", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "uiflag", USER_SPLASH_DISABLE); RNA_def_property_ui_text(prop, "Show Splash", "Display splash screen on startup"); diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index a6b6ae26ca5..4c79c27e0de 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -1232,7 +1232,7 @@ static void rna_def_macro_operator(BlenderRNA *brna) #ifdef WITH_PYTHON RNA_def_struct_register_funcs(srna, "rna_MacroOperator_register", "rna_Operator_unregister"); #endif - + prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_string_funcs(prop, "rna_Operator_name_get", "rna_Operator_name_length", NULL); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c index fc0e9b3ee4b..94b086f1ba0 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c @@ -88,41 +88,41 @@ static void do_ycca_to_rgba_normalized(bNode *UNUSED(node), float *out, float *i static void do_chroma_key(bNode *node, float *out, float *in) { NodeChroma *c; - float x, z, alpha; - float theta, beta, angle, angle2; - float kfg; + float x, z, alpha; + float theta, beta, angle, angle2; + float kfg; c=node->storage; - /* Algorithm from book "Video Demistified," does not include the spill reduction part */ + /* Algorithm from book "Video Demistified," does not include the spill reduction part */ /* find theta, the angle that the color space should be rotated based on key*/ - theta=atan2(c->key[2], c->key[1]); + theta=atan2(c->key[2], c->key[1]); /*rotate the cb and cr into x/z space */ - x=in[1]*cos(theta)+in[2]*sin(theta); - z=in[2]*cos(theta)-in[1]*sin(theta); + x=in[1]*cos(theta)+in[2]*sin(theta); + z=in[2]*cos(theta)-in[1]*sin(theta); - /*if within the acceptance angle */ - angle=c->t1*M_PI/180.0; /* convert to radians */ - - /* if kfg is <0 then the pixel is outside of the key color */ - kfg=x-(fabs(z)/tan(angle/2.0)); + /*if within the acceptance angle */ + angle=c->t1*M_PI/180.0; /* convert to radians */ - out[0]=in[0]; - out[1]=in[1]; - out[2]=in[2]; + /* if kfg is <0 then the pixel is outside of the key color */ + kfg=x-(fabs(z)/tan(angle/2.0)); - if(kfg>0.0) { /* found a pixel that is within key color */ - alpha=(1.0-kfg)*(c->fstrength); + out[0]=in[0]; + out[1]=in[1]; + out[2]=in[2]; - beta=atan2(z,x); - angle2=c->t2*M_PI/180.0; + if(kfg>0.0) { /* found a pixel that is within key color */ + alpha=(1.0-kfg)*(c->fstrength); - /* if beta is within the cutoff angle */ - if(fabs(beta)<(angle2/2.0)) { - alpha=0.0; - } + beta=atan2(z,x); + angle2=c->t2*M_PI/180.0; + + /* if beta is within the cutoff angle */ + if(fabs(beta)<(angle2/2.0)) { + alpha=0.0; + } /* don't make something that was more transparent less transparent */ if (alphacustom2) { - ntxy->x1= cbuf->x* ntxy->fac_x1; - ntxy->x2= cbuf->x* ntxy->fac_x2; - ntxy->y1= cbuf->y* ntxy->fac_y1; - ntxy->y2= cbuf->y* ntxy->fac_y2; - } + if(node->custom2) { + ntxy->x1= cbuf->x* ntxy->fac_x1; + ntxy->x2= cbuf->x* ntxy->fac_x2; + ntxy->y1= cbuf->y* ntxy->fac_y1; + ntxy->y2= cbuf->y* ntxy->fac_y2; + } /* check input image size */ if(cbuf->x <= ntxy->x1 + 1) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_math.c b/source/blender/nodes/intern/CMP_nodes/CMP_math.c index 039f7e6fab1..4348fd18759 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_math.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_math.c @@ -102,15 +102,15 @@ static void do_math(bNode *node, float *out, float *in, float *in2) /* Only raise negative numbers by full integers */ if( in[0] >= 0 ) { out[0]= pow(in[0], in2[0]); - } else { - float y_mod_1 = fmod(in2[0], 1); + } else { + float y_mod_1 = fmod(in2[0], 1); /* if input value is not nearly an integer, fall back to zero, nicer than straight rounding */ - if (y_mod_1 > 0.999 || y_mod_1 < 0.001) { - out[0]= pow(in[0], floor(in2[0] + 0.5)); - } else { - out[0] = 0.0; - } - } + if (y_mod_1 > 0.999 || y_mod_1 < 0.001) { + out[0]= pow(in[0], floor(in2[0] + 0.5)); + } else { + out[0] = 0.0; + } + } } break; case 11: /* Logarithm */ diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c index 14f25aa442b..b6b1764ff0f 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c @@ -49,80 +49,81 @@ static bNodeSocketType cmp_node_rotate_out[]= { /* only supports RGBA nodes now */ static void node_composit_exec_rotate(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) { - + if(out[0]->hasoutput==0) return; - + if(in[0]->data) { CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* note, this returns zero'd image */ float rad, u, v, s, c, centx, centy, miny, maxy, minx, maxx; int x, y, yo, xo; - ImBuf *ibuf, *obuf; - + ImBuf *ibuf, *obuf; + rad= (M_PI*in[1]->vec[0])/180.0f; - + s= sin(rad); c= cos(rad); centx= cbuf->x/2; centy= cbuf->y/2; - + minx= -centx; maxx= -centx + (float)cbuf->x; miny= -centy; maxy= -centy + (float)cbuf->y; - - ibuf=IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); - obuf=IMB_allocImBuf(stackbuf->x, stackbuf->y, 32, 0); - if(ibuf && obuf){ - ibuf->rect_float=cbuf->rect; - obuf->rect_float=stackbuf->rect; + ibuf=IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); + obuf=IMB_allocImBuf(stackbuf->x, stackbuf->y, 32, 0); - for(y=miny; yrect_float=cbuf->rect; + obuf->rect_float=stackbuf->rect; - switch(node->custom1) { - case 0: - neareast_interpolation(ibuf, obuf, u, v, xo, yo); - break ; - case 1: - bilinear_interpolation(ibuf, obuf, u, v, xo, yo); - break; - case 2: - bicubic_interpolation(ibuf, obuf, u, v, xo, yo); - } - + for(y=miny; ycustom1) { + case 0: + neareast_interpolation(ibuf, obuf, u, v, xo, yo); + break ; + case 1: + bilinear_interpolation(ibuf, obuf, u, v, xo, yo); + break; + case 2: + bicubic_interpolation(ibuf, obuf, u, v, xo, yo); + } + + } } - } - - /* rotate offset vector too, but why negative rad, ehh?? Has to be replaced with [3][3] matrix once (ton) */ - s= sin(-rad); - c= cos(-rad); - centx= (float)cbuf->xof; centy= (float)cbuf->yof; - stackbuf->xof= (int)( c*centx + s*centy); - stackbuf->yof= (int)(-s*centx + c*centy); + + /* rotate offset vector too, but why negative rad, ehh?? Has to be replaced with [3][3] matrix once (ton) */ + s= sin(-rad); + c= cos(-rad); + centx= (float)cbuf->xof; centy= (float)cbuf->yof; + stackbuf->xof= (int)( c*centx + s*centy); + stackbuf->yof= (int)(-s*centx + c*centy); IMB_freeImBuf(ibuf); IMB_freeImBuf(obuf); } - + /* pass on output and free */ out[0]->data= stackbuf; - if(cbuf!=in[0]->data) + if(cbuf!=in[0]->data) { free_compbuf(cbuf); + } } } static void node_composit_init_rotate(bNode *node) { - node->custom1= 1; /* Bilinear Filter*/ + node->custom1= 1; /* Bilinear Filter*/ } void register_node_type_cmp_rotate(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c index 4e338c73c39..653e3f4211b 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c @@ -69,7 +69,7 @@ static void node_composit_exec_sephsva(void *UNUSED(data), bNode *node, bNodeSta if(in[0]->data==NULL) { float h, s, v; - rgb_to_hsv(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &h, &s, &v); + rgb_to_hsv(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &h, &s, &v); out[0]->vec[0] = h; out[1]->vec[0] = s; diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_math.c b/source/blender/nodes/intern/TEX_nodes/TEX_math.c index e00781741a0..18468bdd55c 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_math.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_math.c @@ -114,14 +114,14 @@ static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor /* Only raise negative numbers by full integers */ if( in0 >= 0 ) { out[0]= pow(in0, in1); - } else { - float y_mod_1 = fmod(in1, 1); + } else { + float y_mod_1 = fmod(in1, 1); if (y_mod_1 > 0.999f || y_mod_1 < 0.001f) { *out = pow(in0, floor(in1 + 0.5f)); - } else { - *out = 0.0; - } - } + } else { + *out = 0.0; + } + } } break; case 11: /* Logarithm */ diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/intern/TEX_util.c index 51b3c6d909f..b5e27ca2ccb 100644 --- a/source/blender/nodes/intern/TEX_util.c +++ b/source/blender/nodes/intern/TEX_util.c @@ -41,7 +41,7 @@ retrieve the color from the delegate. comments: (ton) - + This system needs recode, a node system should rely on the stack, and callbacks for nodes only should evaluate own node, not recursively go over other previous ones. diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c index 2c15755a642..5be3282d6e6 100644 --- a/source/blender/python/generic/bgl.c +++ b/source/blender/python/generic/bgl.c @@ -293,7 +293,7 @@ static PyObject *Buffer_item(PyObject *self, int i) size= BGL_typeSize(buf->type); newbuf= (Buffer *) PyObject_NEW(Buffer, &BGL_bufferType); - + Py_INCREF(self); newbuf->parent= self; @@ -1641,7 +1641,7 @@ PyObject *BPyInit_bgl(void) EXPP_ADDCONST(GL_TEXTURE_RESIDENT); EXPP_ADDCONST(GL_TEXTURE_BINDING_1D); EXPP_ADDCONST(GL_TEXTURE_BINDING_2D); - + return submodule; } diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c index 7a7fd2b23b6..340e3f4ac57 100644 --- a/source/blender/python/intern/bpy.c +++ b/source/blender/python/intern/bpy.c @@ -76,12 +76,12 @@ static PyObject *bpy_script_paths(PyObject *UNUSED(self)) { PyObject *ret= PyTuple_New(2); char *path; - + path= BLI_get_folder(BLENDER_USER_SCRIPTS, NULL); PyTuple_SET_ITEM(ret, 0, PyUnicode_FromString(path?path:"")); path= BLI_get_folder(BLENDER_SYSTEM_SCRIPTS, NULL); PyTuple_SET_ITEM(ret, 1, PyUnicode_FromString(path?path:"")); - + return ret; } diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index 27260aed8d2..df31fab6bde 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -255,7 +255,7 @@ float BPY_driver_exec(ChannelDriver *driver) if(use_gil) PyGILState_Release(gilstate); - + if(finite(result)) { return (float)result; } diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 0afbe9a7003..284686048d3 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -668,8 +668,8 @@ static struct PyModuleDef bpy_proxy_def= { }; typedef struct { - PyObject_HEAD - /* Type-specific fields go here. */ + PyObject_HEAD + /* Type-specific fields go here. */ PyObject *mod; } dealloc_obj; diff --git a/source/blender/python/intern/bpy_traceback.c b/source/blender/python/intern/bpy_traceback.c index b5dec7205a6..1a6caa02b0c 100644 --- a/source/blender/python/intern/bpy_traceback.c +++ b/source/blender/python/intern/bpy_traceback.c @@ -38,68 +38,68 @@ static const char *traceback_filepath(PyTracebackObject *tb) /* copied from pythonrun.c, 3.2.0 */ static int parse_syntax_error(PyObject *err, PyObject **message, const char **filename, - int *lineno, int *offset, const char **text) + int *lineno, int *offset, const char **text) { - long hold; - PyObject *v; + long hold; + PyObject *v; - /* old style errors */ - if (PyTuple_Check(err)) - return PyArg_ParseTuple(err, "O(ziiz)", message, filename, - lineno, offset, text); + /* old style errors */ + if (PyTuple_Check(err)) + return PyArg_ParseTuple(err, "O(ziiz)", message, filename, + lineno, offset, text); - /* new style errors. `err' is an instance */ + /* new style errors. `err' is an instance */ - if (! (v = PyObject_GetAttrString(err, "msg"))) - goto finally; - *message = v; + if (! (v = PyObject_GetAttrString(err, "msg"))) + goto finally; + *message = v; - if (!(v = PyObject_GetAttrString(err, "filename"))) - goto finally; - if (v == Py_None) - *filename = NULL; - else if (! (*filename = _PyUnicode_AsString(v))) - goto finally; + if (!(v = PyObject_GetAttrString(err, "filename"))) + goto finally; + if (v == Py_None) + *filename = NULL; + else if (! (*filename = _PyUnicode_AsString(v))) + goto finally; - Py_DECREF(v); - if (!(v = PyObject_GetAttrString(err, "lineno"))) - goto finally; - hold = PyLong_AsLong(v); - Py_DECREF(v); - v = NULL; - if (hold < 0 && PyErr_Occurred()) - goto finally; - *lineno = (int)hold; + Py_DECREF(v); + if (!(v = PyObject_GetAttrString(err, "lineno"))) + goto finally; + hold = PyLong_AsLong(v); + Py_DECREF(v); + v = NULL; + if (hold < 0 && PyErr_Occurred()) + goto finally; + *lineno = (int)hold; - if (!(v = PyObject_GetAttrString(err, "offset"))) - goto finally; - if (v == Py_None) { - *offset = -1; - Py_DECREF(v); - v = NULL; + if (!(v = PyObject_GetAttrString(err, "offset"))) + goto finally; + if (v == Py_None) { + *offset = -1; + Py_DECREF(v); + v = NULL; } else { - hold = PyLong_AsLong(v); - Py_DECREF(v); - v = NULL; - if (hold < 0 && PyErr_Occurred()) - goto finally; - *offset = (int)hold; - } + hold = PyLong_AsLong(v); + Py_DECREF(v); + v = NULL; + if (hold < 0 && PyErr_Occurred()) + goto finally; + *offset = (int)hold; + } - if (!(v = PyObject_GetAttrString(err, "text"))) - goto finally; - if (v == Py_None) - *text = NULL; - else if (!PyUnicode_Check(v) || - !(*text = _PyUnicode_AsString(v))) - goto finally; - Py_DECREF(v); - return 1; + if (!(v = PyObject_GetAttrString(err, "text"))) + goto finally; + if (v == Py_None) + *text = NULL; + else if (!PyUnicode_Check(v) || + !(*text = _PyUnicode_AsString(v))) + goto finally; + Py_DECREF(v); + return 1; finally: - Py_XDECREF(v); - return 0; + Py_XDECREF(v); + return 0; } /* end copied function! */ @@ -122,7 +122,7 @@ void python_script_error_jump(const char *filepath, int *lineno, int *offset) if(value) { /* should always be true */ PyObject *message; - const char *filename, *text; + const char *filename, *text; if(parse_syntax_error(value, &message, &filename, lineno, offset, &text)) { /* python adds a '/', prefix, so check for both */ diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index c1aea4c90fc..93062bfb59a 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -3726,7 +3726,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) VECCOPY(vec,ob->obmat[2]); normalize_v3(vec); - + InitSunSky(lar->sunsky, la->atm_turbidity, vec, la->horizon_brightness, la->spread, la->sun_brightness, la->sun_size, la->backscattered_light, la->skyblendfac, la->skyblendtype, la->sky_exposure, la->sky_colorspace); diff --git a/source/blender/render/intern/source/pixelblending.c b/source/blender/render/intern/source/pixelblending.c index a22680c7085..d66f40225fa 100644 --- a/source/blender/render/intern/source/pixelblending.c +++ b/source/blender/render/intern/source/pixelblending.c @@ -81,7 +81,7 @@ void addAlphaOverFloat(float *dest, float *source) { /* d = s + (1-alpha_s)d*/ float mul; - + mul= 1.0 - source[3]; dest[0]= (mul*dest[0]) + source[0]; @@ -131,7 +131,7 @@ void addalphaAddfacFloat(float *dest, float *source, char addfac) else #endif dest[1]= c; - + c= (m * dest[2]) + source[2]; #ifdef RE_FLOAT_COLOR_CLIPPING if(c >= RE_FULL_COLOR_FLOAT) dest[2] = RE_FULL_COLOR_FLOAT; diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index 2b98e7a3f96..f7bf370c0be 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -3198,7 +3198,7 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef if(la->type==LA_SPOT) { tempvec[0]*= la->spottexfac; tempvec[1]*= la->spottexfac; - /* project from 3d to 2d */ + /* project from 3d to 2d */ tempvec[0] /= -tempvec[2]; tempvec[1] /= -tempvec[2]; } diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index d34ef85baa4..e575776ec79 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -138,7 +138,7 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr) /* depth >= 1 when ray-shading */ if(shi->depth==0 || shi->volume_depth > 0) { if(R.r.mode & R_RAYTRACE) { - if(shi->ray_mirror!=0.0f || ((shi->mode & MA_TRANSP) && (shi->mode & MA_RAYTRANSP) && shr->alpha!=1.0f)) { + if(shi->ray_mirror!=0.0f || ((shi->mode & MA_TRANSP) && (shi->mode & MA_RAYTRANSP) && shr->alpha!=1.0f)) { /* ray trace works on combined, but gives pass info */ ray_trace(shi, shr); } diff --git a/source/blender/render/intern/source/sunsky.c b/source/blender/render/intern/source/sunsky.c index f10398388c1..919c06d81f7 100644 --- a/source/blender/render/intern/source/sunsky.c +++ b/source/blender/render/intern/source/sunsky.c @@ -142,13 +142,12 @@ void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_b float spread,float sun_brightness, float sun_size, float back_scatter, float skyblendfac, short skyblendtype, float sky_exposure, float sky_colorspace) { - - float theta2; + float theta2; float theta3; float T; float T2; float chi; - + sunsky->turbidity = turb; sunsky->horizon_brightness = horizon_brightness; @@ -247,8 +246,8 @@ void GetSkyXYZRadiance(struct SunSky* sunsky, float theta, float phi, float colo float gamma; float x,y,Y,X,Z; float hfade=1, nfade=1; - - + + if (theta>(0.5*M_PI)) { hfade = 1.0-(theta*M_1_PI-0.5)*2.0; hfade = hfade*hfade*(3.0-2.0*hfade); @@ -320,7 +319,7 @@ void ComputeAttenuatedSunlight(float theta, int turbidity, float fTau[3]) float fTauR, fTauA; float m ; float fAlpha; - + int i; float fLambda[3]; fLambda[0] = 0.65f; diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c index 54a8ba99db5..e75ee6ed469 100644 --- a/source/blender/render/intern/source/volume_precache.c +++ b/source/blender/render/intern/source/volume_precache.c @@ -414,7 +414,7 @@ void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Material *ma) SWAP(float *,sr,sr0); SWAP(float *,sg,sg0); SWAP(float *,sb,sb0); - + /* main diffusion simulation */ ms_diffuse(sr0, sr, diff, n); ms_diffuse(sg0, sg, diff, n); diff --git a/source/creator/creator.c b/source/creator/creator.c index cb2214ee42d..b7d1a30048f 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -186,13 +186,13 @@ static void blender_esc(int sig) #ifdef BUILD_DATE static void strip_quotes(char *str) { - if(str[0] == '"') { - int len= strlen(str) - 1; - memmove(str, str+1, len); - if(str[len-1] == '"') { - str[len-1]= '\0'; - } - } + if(str[0] == '"') { + int len= strlen(str) - 1; + memmove(str, str+1, len); + if(str[len-1] == '"') { + str[len-1]= '\0'; + } + } } #endif From f9f771cd01b626be30a85a533ea622bcedd981f5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 15:53:30 +0000 Subject: [PATCH 67/88] converted more mixed tab/space indentations to tabs. only whitespace changes. --- intern/guardedalloc/intern/mallocn.c | 14 +- intern/guardedalloc/test/simpletest/memtest.c | 2 +- release/plugins/sequence/blur.c | 2 +- release/plugins/sequence/gamma.c | 2 +- source/blender/avi/intern/options.c | 124 +-- source/blender/blenkernel/intern/collision.c | 8 +- source/blender/blenkernel/intern/curve.c | 20 +- source/blender/blenkernel/intern/deform.c | 2 +- source/blender/blenkernel/intern/depsgraph.c | 16 +- source/blender/blenkernel/intern/displist.c | 6 +- source/blender/blenkernel/intern/exotic.c | 32 +- source/blender/blenkernel/intern/pointcache.c | 10 +- source/blender/blenkernel/intern/seqeffects.c | 80 +- source/blender/blenkernel/intern/sequencer.c | 2 +- source/blender/blenkernel/intern/smoke.c | 20 +- source/blender/blenkernel/intern/softbody.c | 86 +-- source/blender/blenkernel/intern/writeavi.c | 2 +- source/blender/blenlib/intern/BLI_ghash.c | 2 +- source/blender/blenlib/intern/boxpack2d.c | 20 +- source/blender/blenlib/intern/fileops.c | 6 +- source/blender/blenlib/intern/math_geom.c | 28 +- .../blenlib/intern/math_vector_inline.c | 2 +- source/blender/blenlib/intern/noise.c | 16 +- source/blender/blenlib/intern/path_util.c | 12 +- source/blender/blenlib/intern/winstuff.c | 30 +- source/blender/blenloader/intern/readfile.c | 4 +- .../blender/editors/armature/editarmature.c | 4 +- .../editors/armature/editarmature_retarget.c | 6 +- .../blender/editors/armature/meshlaplacian.c | 6 +- source/blender/editors/armature/reeb.c | 2 +- source/blender/editors/curve/editcurve.c | 9 +- .../editors/interface/interface_widgets.c | 30 +- source/blender/editors/mesh/editmesh_tools.c | 68 +- source/blender/editors/screen/screen_ops.c | 2 +- .../editors/sculpt_paint/paint_image.c | 28 +- .../editors/space_action/space_action.c | 2 +- .../editors/space_graph/graph_buttons.c | 2 +- .../editors/space_image/image_buttons.c | 2 +- .../blender/editors/space_image/image_draw.c | 6 +- .../blender/editors/space_image/image_ops.c | 8 +- .../editors/space_logic/logic_window.c | 188 ++--- .../blender/editors/space_nla/nla_buttons.c | 2 +- source/blender/editors/space_nla/space_nla.c | 2 +- source/blender/editors/space_node/drawnode.c | 80 +- .../blender/editors/space_outliner/outliner.c | 14 +- source/blender/editors/space_text/text_ops.c | 2 +- .../editors/space_view3d/view3d_header.c | 10 +- .../editors/space_view3d/view3d_select.c | 8 +- .../editors/space_view3d/view3d_view.c | 34 +- source/blender/editors/transform/transform.c | 50 +- .../editors/transform/transform_constraints.c | 2 +- source/blender/editors/uvedit/uvedit_draw.c | 2 +- .../editors/uvedit/uvedit_parametrizer.c | 2 +- source/blender/gpu/intern/gpu_draw.c | 8 +- source/blender/gpu/intern/gpu_extensions.c | 6 +- source/blender/imbuf/intern/jpeg.c | 4 +- source/blender/imbuf/intern/scaling.c | 2 +- source/blender/imbuf/intern/thumbs.c | 26 +- source/blender/imbuf/intern/tiff.c | 2 +- source/blender/makesdna/intern/dna_genfile.c | 50 +- source/blender/makesrna/intern/rna_brush.c | 2 +- .../blender/makesrna/intern/rna_controller.c | 36 +- .../blender/makesrna/intern/rna_image_api.c | 2 +- source/blender/makesrna/intern/rna_nodetree.c | 54 +- .../blender/makesrna/intern/rna_object_api.c | 20 +- source/blender/makesrna/intern/rna_particle.c | 116 +-- source/blender/modifiers/intern/MOD_array.c | 720 +++++++++--------- source/blender/modifiers/intern/MOD_build.c | 18 +- .../blender/modifiers/intern/MOD_edgesplit.c | 126 +-- source/blender/modifiers/intern/MOD_explode.c | 24 +- .../nodes/intern/CMP_nodes/CMP_alphaOver.c | 2 +- .../blender/nodes/intern/CMP_nodes/CMP_blur.c | 2 +- .../nodes/intern/CMP_nodes/CMP_channelMatte.c | 100 ++- .../nodes/intern/CMP_nodes/CMP_chromaMatte.c | 48 +- .../nodes/intern/CMP_nodes/CMP_colorMatte.c | 28 +- .../nodes/intern/CMP_nodes/CMP_colorSpill.c | 193 +++-- .../blender/nodes/intern/CMP_nodes/CMP_crop.c | 12 +- .../nodes/intern/CMP_nodes/CMP_curves.c | 10 +- .../nodes/intern/CMP_nodes/CMP_defocus.c | 26 +- .../nodes/intern/CMP_nodes/CMP_diffMatte.c | 72 +- .../intern/CMP_nodes/CMP_distanceMatte.c | 56 +- .../nodes/intern/CMP_nodes/CMP_hueSatVal.c | 10 +- .../nodes/intern/CMP_nodes/CMP_image.c | 130 ++-- .../nodes/intern/CMP_nodes/CMP_invert.c | 2 +- .../nodes/intern/CMP_nodes/CMP_levels.c | 2 +- .../nodes/intern/CMP_nodes/CMP_lummaMatte.c | 8 +- .../nodes/intern/CMP_nodes/CMP_mapValue.c | 2 +- .../nodes/intern/CMP_nodes/CMP_sepcombHSVA.c | 60 +- .../nodes/intern/CMP_nodes/CMP_splitViewer.c | 12 +- .../nodes/intern/CMP_nodes/CMP_valToRgb.c | 2 +- .../nodes/intern/CMP_nodes/CMP_vecBlur.c | 8 +- .../nodes/intern/CMP_nodes/CMP_viewer.c | 10 +- source/blender/nodes/intern/CMP_util.c | 122 +-- .../nodes/intern/SHD_nodes/SHD_curves.c | 4 +- .../blender/nodes/intern/SHD_nodes/SHD_geom.c | 2 +- .../nodes/intern/SHD_nodes/SHD_mapping.c | 2 +- .../nodes/intern/SHD_nodes/SHD_material.c | 2 +- .../nodes/intern/SHD_nodes/SHD_valToRgb.c | 8 +- .../nodes/intern/TEX_nodes/TEX_curves.c | 6 +- .../nodes/intern/TEX_nodes/TEX_image.c | 10 +- .../nodes/intern/TEX_nodes/TEX_valToRgb.c | 8 +- source/blender/python/generic/IDProp.c | 8 +- source/blender/python/generic/bgl.c | 26 +- .../python/generic/mathutils_geometry.c | 8 +- source/blender/python/intern/bpy_props.c | 6 +- source/blender/python/intern/bpy_rna.c | 14 +- .../render/intern/source/imagetexture.c | 8 +- .../render/intern/source/pixelblending.c | 2 +- .../render/intern/source/pixelshading.c | 16 +- .../render/intern/source/render_texture.c | 2 +- .../blender/render/intern/source/rendercore.c | 14 +- source/blender/render/intern/source/shadbuf.c | 2 +- source/blender/render/intern/source/strand.c | 2 +- source/blender/render/intern/source/zbuf.c | 2 +- .../windowmanager/intern/wm_event_system.c | 2 +- source/blender/windowmanager/intern/wm_jobs.c | 4 +- source/creator/creator.c | 2 +- 117 files changed, 1704 insertions(+), 1708 deletions(-) diff --git a/intern/guardedalloc/intern/mallocn.c b/intern/guardedalloc/intern/mallocn.c index caf551c84d8..55340d6011d 100644 --- a/intern/guardedalloc/intern/mallocn.c +++ b/intern/guardedalloc/intern/mallocn.c @@ -369,16 +369,16 @@ void *MEM_mapallocN(size_t len, const char *str) { #include - int fd; - fd = open("/dev/zero", O_RDWR); + int fd; + fd = open("/dev/zero", O_RDWR); - memh= mmap(0, len+sizeof(MemHead)+sizeof(MemTail), - PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - close(fd); + memh= mmap(0, len+sizeof(MemHead)+sizeof(MemTail), + PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + close(fd); } #else memh= mmap(NULL, len+sizeof(MemHead)+sizeof(MemTail), - PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0); + PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0); #endif if(memh!=(MemHead *)-1) { @@ -792,7 +792,7 @@ static const char *check_memlist(MemHead *memh) forwok->nextname = backok->name; } else{ forwok->next = NULL; - membase->last = (struct localLink *) &forwok->next; + membase->last = (struct localLink *) &forwok->next; /* membase->last = (struct Link *) &forwok->next; */ } } else{ diff --git a/intern/guardedalloc/test/simpletest/memtest.c b/intern/guardedalloc/test/simpletest/memtest.c index 98f943f0d7d..6b3af8b310c 100644 --- a/intern/guardedalloc/test/simpletest/memtest.c +++ b/intern/guardedalloc/test/simpletest/memtest.c @@ -60,7 +60,7 @@ int main (int argc, char *argv[]) int i = 0; /* ----------------------------------------------------------------- */ - switch (argc) { + switch (argc) { case 2: verbose = atoi(argv[1]); if (verbose < 0) verbose = 0; diff --git a/release/plugins/sequence/blur.c b/release/plugins/sequence/blur.c index c23a924ac65..cec3351e976 100644 --- a/release/plugins/sequence/blur.c +++ b/release/plugins/sequence/blur.c @@ -41,7 +41,7 @@ char name[24]= "Blur"; VarStruct varstr[]= { LABEL, "Input: 1 strip", 0.0, 0.0, 0.0, "", - NUMSLI|FLO, "Blur", 0.5, 0.0, 10.0, "Maximum filtersize", + NUMSLI|FLO, "Blur", 0.5, 0.0, 10.0, "Maximum filtersize", NUMSLI|FLO, "Gamma", 1.0, 0.4, 2.0, "Gamma correction", TOG|INT, "Animated", 0.0, 0.0, 1.0, "For (Ipo) animated blur", NUM|INT, "debug", 0.0, 0.0, 2.0, diff --git a/release/plugins/sequence/gamma.c b/release/plugins/sequence/gamma.c index e1380746cea..7ce86fff347 100644 --- a/release/plugins/sequence/gamma.c +++ b/release/plugins/sequence/gamma.c @@ -85,7 +85,7 @@ static void make_gamma_table(float setup, float gain, float gamma, int y; for (y = 0; y < 256; y++) { - float v = 1.0 * y / 255; + float v = 1.0 * y / 255; v += setup; v *= gain; v = pow(v, gamma); diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c index 533bce2c8ea..edb708d8a69 100644 --- a/source/blender/avi/intern/options.c +++ b/source/blender/avi/intern/options.c @@ -53,77 +53,77 @@ AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream, switch (option_type) { case AVI_OPTION_TYPE_MAIN: switch (option) { - case AVI_OPTION_WIDTH: - movie->header->Width = *((int *) opt_data); - movie->header->SuggestedBufferSize = movie->header->Width*movie->header->Height*3; + case AVI_OPTION_WIDTH: + movie->header->Width = *((int *) opt_data); + movie->header->SuggestedBufferSize = movie->header->Width*movie->header->Height*3; - for (i=0; i < movie->header->Streams; i++) { - if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { - ((AviBitmapInfoHeader *) movie->streams[i].sf)->Width = *((int *) opt_data); - movie->streams[i].sh.SuggestedBufferSize = movie->header->SuggestedBufferSize; - movie->streams[i].sh.right = *((int *) opt_data); - ((AviBitmapInfoHeader *) movie->streams[i].sf)->SizeImage = movie->header->SuggestedBufferSize; - fseek (movie->fp, movie->offset_table[1+i*2+1], SEEK_SET); - awrite (movie, movie->streams[i].sf, 1, movie->streams[i].sf_size, movie->fp, AVI_BITMAPH); - } + for (i=0; i < movie->header->Streams; i++) { + if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { + ((AviBitmapInfoHeader *) movie->streams[i].sf)->Width = *((int *) opt_data); + movie->streams[i].sh.SuggestedBufferSize = movie->header->SuggestedBufferSize; + movie->streams[i].sh.right = *((int *) opt_data); + ((AviBitmapInfoHeader *) movie->streams[i].sf)->SizeImage = movie->header->SuggestedBufferSize; + fseek (movie->fp, movie->offset_table[1+i*2+1], SEEK_SET); + awrite (movie, movie->streams[i].sf, 1, movie->streams[i].sf_size, movie->fp, AVI_BITMAPH); } + } - break; - - case AVI_OPTION_HEIGHT: - movie->header->Height = *((int *) opt_data); - movie->header->SuggestedBufferSize = movie->header->Width*movie->header->Height*3; - - for (i=0; i < movie->header->Streams; i++) { - if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { - ((AviBitmapInfoHeader *) movie->streams[i].sf)->Height = *((int *) opt_data); - movie->streams[i].sh.SuggestedBufferSize = movie->header->SuggestedBufferSize; - movie->streams[i].sh.bottom = *((int *) opt_data); - ((AviBitmapInfoHeader *) movie->streams[i].sf)->SizeImage = movie->header->SuggestedBufferSize; - fseek (movie->fp, movie->offset_table[1+i*2+1], SEEK_SET); - awrite (movie, movie->streams[i].sf, 1, movie->streams[i].sf_size, movie->fp, AVI_BITMAPH); - } - } + break; - break; - - case AVI_OPTION_QUALITY: - for (i=0; i < movie->header->Streams; i++) { - if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { - movie->streams[i].sh.Quality = (*((int *) opt_data))*100; - fseek (movie->fp, movie->offset_table[1+i*2+1], SEEK_SET); - awrite (movie, movie->streams[i].sf, 1, movie->streams[i].sf_size, movie->fp, AVI_BITMAPH); - } - } - break; - - case AVI_OPTION_FRAMERATE: - if (1000000/(*((double *) opt_data))) - movie->header->MicroSecPerFrame = 1000000/(*((double *) opt_data)); + case AVI_OPTION_HEIGHT: + movie->header->Height = *((int *) opt_data); + movie->header->SuggestedBufferSize = movie->header->Width*movie->header->Height*3; - for (i=0; i < movie->header->Streams; i++) { - if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { - movie->streams[i].sh.Scale = movie->header->MicroSecPerFrame; - fseek (movie->fp, movie->offset_table[1+i*2+1], SEEK_SET); - awrite (movie, movie->streams[i].sf, 1, movie->streams[i].sf_size, movie->fp, AVI_BITMAPH); - } + for (i=0; i < movie->header->Streams; i++) { + if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { + ((AviBitmapInfoHeader *) movie->streams[i].sf)->Height = *((int *) opt_data); + movie->streams[i].sh.SuggestedBufferSize = movie->header->SuggestedBufferSize; + movie->streams[i].sh.bottom = *((int *) opt_data); + ((AviBitmapInfoHeader *) movie->streams[i].sf)->SizeImage = movie->header->SuggestedBufferSize; + fseek (movie->fp, movie->offset_table[1+i*2+1], SEEK_SET); + awrite (movie, movie->streams[i].sf, 1, movie->streams[i].sf_size, movie->fp, AVI_BITMAPH); } - + } + + break; + + case AVI_OPTION_QUALITY: + for (i=0; i < movie->header->Streams; i++) { + if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { + movie->streams[i].sh.Quality = (*((int *) opt_data))*100; + fseek (movie->fp, movie->offset_table[1+i*2+1], SEEK_SET); + awrite (movie, movie->streams[i].sf, 1, movie->streams[i].sf_size, movie->fp, AVI_BITMAPH); + } + } + break; + + case AVI_OPTION_FRAMERATE: + if (1000000/(*((double *) opt_data))) + movie->header->MicroSecPerFrame = 1000000/(*((double *) opt_data)); + + for (i=0; i < movie->header->Streams; i++) { + if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) { + movie->streams[i].sh.Scale = movie->header->MicroSecPerFrame; + fseek (movie->fp, movie->offset_table[1+i*2+1], SEEK_SET); + awrite (movie, movie->streams[i].sf, 1, movie->streams[i].sf_size, movie->fp, AVI_BITMAPH); + } + } + } - fseek (movie->fp, movie->offset_table[0], SEEK_SET); - awrite (movie, movie->header, 1, sizeof(AviMainHeader), movie->fp, AVI_MAINH); + fseek (movie->fp, movie->offset_table[0], SEEK_SET); + awrite (movie, movie->header, 1, sizeof(AviMainHeader), movie->fp, AVI_MAINH); - break; - case AVI_OPTION_TYPE_STRH: - break; - case AVI_OPTION_TYPE_STRF: - break; - default: - return AVI_ERROR_OPTION; - break; - } + break; + case AVI_OPTION_TYPE_STRH: + break; + case AVI_OPTION_TYPE_STRF: + break; + default: + return AVI_ERROR_OPTION; + break; + } - return AVI_ERROR_NONE; + return AVI_ERROR_NONE; } diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index 88b6ca296c7..ebdbbfcf7b4 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -856,10 +856,10 @@ static int cloth_collision_response_moving( ClothModifierData *clmd, CollisionMo #if 0 static float projectPointOntoLine(float *p, float *a, float *b) { - float ba[3], pa[3]; - VECSUB(ba, b, a); - VECSUB(pa, p, a); - return INPR(pa, ba) / INPR(ba, ba); + float ba[3], pa[3]; + VECSUB(ba, b, a); + VECSUB(pa, p, a); + return INPR(pa, ba) / INPR(ba, ba); } static void calculateEENormal(float *np1, float *np2, float *np3, float *np4,float *out_normal) diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index f68533803e7..34e5fef8074 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -1026,19 +1026,19 @@ void forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int i rt2= 3.0f*(q0-2.0f*q1+q2)/f; f*= it; rt3= (q3-q0+3.0f*(q1-q2))/f; - - q0= rt0; + + q0= rt0; q1= rt1+rt2+rt3; q2= 2*rt2+6*rt3; q3= 6*rt3; - - for(a=0; a<=it; a++) { + + for(a=0; a<=it; a++) { *p= q0; p = (float *)(((char *)p)+stride); q0+= q1; - q1+= q2; - q2+= q3; - } + q1+= q2; + q2+= q3; + } } static void forward_diff_bezier_cotangent(float *p0, float *p1, float *p2, float *p3, float *p, int it, int stride) @@ -1048,7 +1048,7 @@ static void forward_diff_bezier_cotangent(float *p0, float *p1, float *p2, float * * This could also be optimized like forward_diff_bezier */ int a; - for(a=0; a<=it; a++) { + for(a=0; a<=it; a++) { float t = (float)a / (float)it; int i; @@ -1057,7 +1057,7 @@ static void forward_diff_bezier_cotangent(float *p0, float *p1, float *p2, float } normalize_v3(p); p = (float *)(((char *)p)+stride); - } + } } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @@ -1092,7 +1092,7 @@ float *make_orco_surf(Object *ob) sizev = nu->pntsv*resolv; if (nu->flagu & CU_NURB_CYCLIC) sizeu++; if (nu->flagv & CU_NURB_CYCLIC) sizev++; - if(nu->pntsv>1) tot+= sizeu * sizev; + if(nu->pntsv>1) tot+= sizeu * sizev; nu= nu->next; } diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index 884d6313c26..0696653d2e4 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -360,7 +360,7 @@ void flip_side_name (char name[MAX_VGROUP_NAME], const char from_name[MAX_VGROUP index= strrchr(name, '.'); // last occurrence if (index && isdigit(index[1]) ) { // doesnt handle case bone.1abc2 correct..., whatever! if(strip_number==0) - BLI_strncpy(number, index, sizeof(number)); + BLI_strncpy(number, index, sizeof(number)); *index= 0; len= BLI_strnlen(name, MAX_VGROUP_NAME); } diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 170b4c23446..94fbcd9ccb4 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -1092,10 +1092,10 @@ void graph_bfs(void) push_queue(nqueue,itA->node); } - else { + else { fprintf(stderr,"bfs not dag tree edge color :%i \n",itA->node->color); } - + itA = itA->next; } @@ -1225,7 +1225,7 @@ DagNodeQueue * graph_dfs(void) while(nqueue->count) { //graph_print_queue(nqueue); - skip = 0; + skip = 0; node = get_top_node_queue(nqueue); minheight = pos[node->DFS_dist]; @@ -1253,7 +1253,7 @@ DagNodeQueue * graph_dfs(void) */ /*if (node->DFS_dist >= itA->node->DFS_dist) itA->node->DFS_dist = node->DFS_dist + 1; - + fprintf(stderr,"dfs forward or cross edge :%15s %i-%i %15s %i-%i \n", ((ID *) node->ob)->name, node->DFS_dvtm, @@ -1287,17 +1287,17 @@ DagNodeQueue * graph_dfs(void) /* fprintf(stderr,"DFS node : %20s %i %i %i %i\n",((ID *) node->ob)->name,node->BFS_dist, node->DFS_dist, node->DFS_dvtm, node->DFS_fntm ); */ - push_stack(retqueue,node); + push_stack(retqueue,node); } } } node = node->next; } while (node); -// fprintf(stderr,"i size : %i \n", maxpos); - +// fprintf(stderr,"i size : %i \n", maxpos); + queue_delete(nqueue); - return(retqueue); + return(retqueue); } /* unused */ diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index c8e5998774d..b5194ca2f89 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1869,9 +1869,9 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba already applied, thats how it worked for years, so keep for compatibility (sergey) */ copy_displist(&cu->disp, dispbase); - if (!forRender) { - tex_space_curve(cu); - } + if (!forRender) { + tex_space_curve(cu); + } if(!forOrco) curve_calc_modifiers_post(scene, ob, dispbase, derivedFinal, forRender, originalVerts, deformedVerts); diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c index 16f47f3cc59..ae773818438 100644 --- a/source/blender/blenkernel/intern/exotic.c +++ b/source/blender/blenkernel/intern/exotic.c @@ -138,22 +138,22 @@ static int is_stl(const char *str) return 1; } -#define READSTLVERT { \ - if (fread(mvert->co, sizeof(float), 3, fpSTL) != 3) { \ - char error_msg[255]; \ - MEM_freeN(vertdata); \ - MEM_freeN(facedata); \ - fclose(fpSTL); \ - sprintf(error_msg, "Problems reading face %d!", i); \ - return; \ - } \ - else { \ - if (ENDIAN_ORDER==B_ENDIAN) { \ - SWITCH_INT(mvert->co[0]); \ - SWITCH_INT(mvert->co[1]); \ - SWITCH_INT(mvert->co[2]); \ - } \ - } \ +#define READSTLVERT { \ + if (fread(mvert->co, sizeof(float), 3, fpSTL) != 3) { \ + char error_msg[255]; \ + MEM_freeN(vertdata); \ + MEM_freeN(facedata); \ + fclose(fpSTL); \ + sprintf(error_msg, "Problems reading face %d!", i); \ + return; \ + } \ + else { \ + if (ENDIAN_ORDER==B_ENDIAN) { \ + SWITCH_INT(mvert->co[0]); \ + SWITCH_INT(mvert->co[1]); \ + SWITCH_INT(mvert->co[2]); \ + } \ + } \ } static void simple_vertex_normal_blend(short *no, short *ble) diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index 45cb6254887..a8c7266b3fa 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -1003,15 +1003,15 @@ static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra) fp = fopen(filename, "rb+"); } - if (!fp) - return NULL; - + if (!fp) + return NULL; + pf= MEM_mallocN(sizeof(PTCacheFile), "PTCacheFile"); pf->fp= fp; pf->old_format = 0; pf->frame = cfra; - - return pf; + + return pf; } static void ptcache_file_close(PTCacheFile *pf) { diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c index 3dfef2e9d78..aa91cff03b9 100644 --- a/source/blender/blenkernel/intern/seqeffects.c +++ b/source/blender/blenkernel/intern/seqeffects.c @@ -1675,15 +1675,15 @@ float hyp3,hyp4,b4,b5 output = in_band(wipezone,width,hyp,facf0,1,1); else output = in_band(wipezone,width,hyp,facf0,0,1); - } + } else { if(b1 < b2) output = in_band(wipezone,width,hyp,facf0,0,1); else output = in_band(wipezone,width,hyp,facf0,1,1); - } + } break; - + case DO_DOUBLE_WIPE: if(!wipe->forward) facf0 = 1.0f-facf0; // Go the other direction @@ -1726,45 +1726,45 @@ float hyp3,hyp4,b4,b5 output = in_band(wipezone,hwidth,hyp2,facf0,1,1) * in_band(wipezone,hwidth,hyp,facf0,1,1); } if(!wipe->forward)output = 1-output; - break; - case DO_CLOCK_WIPE: + break; + case DO_CLOCK_WIPE: /* temp1: angle of effect center in rads temp2: angle of line through (halfx,halfy) and (x,y) in rads temp3: angle of low side of blur temp4: angle of high side of blur */ - output = 1.0f - facf0; - widthf = wipe->edgeWidth*2.0f*(float)M_PI; - temp1 = 2.0f * (float)M_PI * facf0; - - if(wipe->forward){ - temp1 = 2.0f*(float)M_PI - temp1; - } - - x = x - halfx; - y = y - halfy; + output = 1.0f - facf0; + widthf = wipe->edgeWidth*2.0f*(float)M_PI; + temp1 = 2.0f * (float)M_PI * facf0; - temp2 = asin(abs(y)/sqrt(x*x + y*y)); - if(x <= 0 && y >= 0) temp2 = (float)M_PI - temp2; - else if(x<=0 && y <= 0) temp2 += (float)M_PI; - else if(x >= 0 && y <= 0) temp2 = 2.0f*(float)M_PI - temp2; - - if(wipe->forward){ - temp3 = temp1-(widthf*0.5f)*facf0; - temp4 = temp1+(widthf*0.5f)*(1-facf0); - } else{ - temp3 = temp1-(widthf*0.5f)*(1-facf0); - temp4 = temp1+(widthf*0.5f)*facf0; + if(wipe->forward){ + temp1 = 2.0f*(float)M_PI - temp1; } - if (temp3 < 0) temp3 = 0; - if (temp4 > 2.0f*(float)M_PI) temp4 = 2.0f*(float)M_PI; - - - if(temp2 < temp3) output = 0; - else if (temp2 > temp4) output = 1; - else output = (temp2-temp3)/(temp4-temp3); - if(x == 0 && y == 0) output = 1; + + x = x - halfx; + y = y - halfy; + + temp2 = asin(abs(y)/sqrt(x*x + y*y)); + if(x <= 0 && y >= 0) temp2 = (float)M_PI - temp2; + else if(x<=0 && y <= 0) temp2 += (float)M_PI; + else if(x >= 0 && y <= 0) temp2 = 2.0f*(float)M_PI - temp2; + + if(wipe->forward){ + temp3 = temp1-(widthf*0.5f)*facf0; + temp4 = temp1+(widthf*0.5f)*(1-facf0); + } else{ + temp3 = temp1-(widthf*0.5f)*(1-facf0); + temp4 = temp1+(widthf*0.5f)*facf0; + } + if (temp3 < 0) temp3 = 0; + if (temp4 > 2.0f*(float)M_PI) temp4 = 2.0f*(float)M_PI; + + + if(temp2 < temp3) output = 0; + else if (temp2 > temp4) output = 1; + else output = (temp2-temp3)/(temp4-temp3); + if(x == 0 && y == 0) output = 1; if(output != output) output = 1; if(wipe->forward) output = 1 - output; break; @@ -1840,12 +1840,12 @@ float hyp3,hyp4,b4,b5 hwidth = width*0.5f; temp1 = (halfx-(halfx)*facf0); - pointdist = sqrt(temp1*temp1 + temp1*temp1); - - temp2 = sqrt((halfx-x)*(halfx-x) + (halfy-y)*(halfy-y)); - if(temp2 > pointdist) output = in_band(wipezone,hwidth,fabs(temp2-pointdist),facf0,0,1); - else output = in_band(wipezone,hwidth,fabs(temp2-pointdist),facf0,1,1); - + pointdist = sqrt(temp1*temp1 + temp1*temp1); + + temp2 = sqrt((halfx-x)*(halfx-x) + (halfy-y)*(halfy-y)); + if(temp2 > pointdist) output = in_band(wipezone,hwidth,fabs(temp2-pointdist),facf0,0,1); + else output = in_band(wipezone,hwidth,fabs(temp2-pointdist),facf0,1,1); + if(!wipe->forward) output = 1-output; break; diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index a765c9ee8f0..b2e6f5290c3 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -845,7 +845,7 @@ typedef struct SeqUniqueInfo { /* static void seqbase_unique_name(ListBase *seqbasep, Sequence *seq) { - BLI_uniquename(seqbasep, seq, "Sequence", '.', offsetof(Sequence, name), SEQ_NAME_MAXSTR); + BLI_uniquename(seqbasep, seq, "Sequence", '.', offsetof(Sequence, name), SEQ_NAME_MAXSTR); }*/ static void seqbase_unique_name(ListBase *seqbasep, SeqUniqueInfo *sui) diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index 90581870070..4405bce3d51 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -1470,20 +1470,20 @@ static float calc_voxel_transp(float *result, float *input, int res[3], int *pix long long smoke_get_mem_req(int xres, int yres, int zres, int amplify) { - int totalCells = xres * yres * zres; - int amplifiedCells = totalCells * amplify * amplify * amplify; + int totalCells = xres * yres * zres; + int amplifiedCells = totalCells * amplify * amplify * amplify; - // print out memory requirements - long long int coarseSize = sizeof(float) * totalCells * 22 + - sizeof(unsigned char) * totalCells; + // print out memory requirements + long long int coarseSize = sizeof(float) * totalCells * 22 + + sizeof(unsigned char) * totalCells; - long long int fineSize = sizeof(float) * amplifiedCells * 7 + // big grids - sizeof(float) * totalCells * 8 + // small grids - sizeof(float) * 128 * 128 * 128; // noise tile + long long int fineSize = sizeof(float) * amplifiedCells * 7 + // big grids + sizeof(float) * totalCells * 8 + // small grids + sizeof(float) * 128 * 128 * 128; // noise tile - long long int totalMB = (coarseSize + fineSize) / (1024 * 1024); + long long int totalMB = (coarseSize + fineSize) / (1024 * 1024); - return totalMB; + return totalMB; } static void bresenham_linie_3D(int x1, int y1, int z1, int x2, int y2, int z2, float *tRay, bresenham_callback cb, float *result, float *input, int res[3], float correct) diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index 0578b155272..30d2816769c 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -1648,12 +1648,12 @@ static void _scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow, static void scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow) { - SoftBody *sb = ob->soft; - ListBase *do_effector = NULL; + SoftBody *sb = ob->soft; + ListBase *do_effector = NULL; - do_effector = pdInitEffectors(scene, ob, NULL, sb->effector_weights); - _scan_for_ext_spring_forces(scene, ob, timenow, 0, sb->totspring, do_effector); - pdEndEffectors(&do_effector); + do_effector = pdInitEffectors(scene, ob, NULL, sb->effector_weights); + _scan_for_ext_spring_forces(scene, ob, timenow, 0, sb->totspring, do_effector); + pdEndEffectors(&do_effector); } static void *exec_scan_for_ext_spring_forces(void *data) @@ -2216,50 +2216,50 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo /* naive ball self collision */ /* needs to be done if goal snaps or not */ if(do_selfcollision){ - int attached; - BodyPoint *obp; - BodySpring *bs; - int c,b; - float velcenter[3],dvel[3],def[3]; - float distance; - float compare; - float bstune = sb->ballstiff; + int attached; + BodyPoint *obp; + BodySpring *bs; + int c,b; + float velcenter[3],dvel[3],def[3]; + float distance; + float compare; + float bstune = sb->ballstiff; - for(c=sb->totpoint, obp= sb->bpoint; c>=ifirst+bb; c--, obp++) { - compare = (obp->colball + bp->colball); - sub_v3_v3v3(def, bp->pos, obp->pos); - /* rather check the AABBoxes before ever calulating the real distance */ - /* mathematically it is completly nuts, but performace is pretty much (3) times faster */ - if ((ABS(def[0]) > compare) || (ABS(def[1]) > compare) || (ABS(def[2]) > compare)) continue; - distance = normalize_v3(def); - if (distance < compare ){ - /* exclude body points attached with a spring */ - attached = 0; - for(b=obp->nofsprings;b>0;b--){ - bs = sb->bspring + obp->springs[b-1]; - if (( ilast-bb == bs->v2) || ( ilast-bb == bs->v1)){ - attached=1; - continue;} - } - if (!attached){ - float f = bstune/(distance) + bstune/(compare*compare)*distance - 2.0f*bstune/compare ; + for(c=sb->totpoint, obp= sb->bpoint; c>=ifirst+bb; c--, obp++) { + compare = (obp->colball + bp->colball); + sub_v3_v3v3(def, bp->pos, obp->pos); + /* rather check the AABBoxes before ever calulating the real distance */ + /* mathematically it is completly nuts, but performace is pretty much (3) times faster */ + if ((ABS(def[0]) > compare) || (ABS(def[1]) > compare) || (ABS(def[2]) > compare)) continue; + distance = normalize_v3(def); + if (distance < compare ){ + /* exclude body points attached with a spring */ + attached = 0; + for(b=obp->nofsprings;b>0;b--){ + bs = sb->bspring + obp->springs[b-1]; + if (( ilast-bb == bs->v2) || ( ilast-bb == bs->v1)){ + attached=1; + continue;} + } + if (!attached){ + float f = bstune/(distance) + bstune/(compare*compare)*distance - 2.0f*bstune/compare ; - mid_v3_v3v3(velcenter, bp->vec, obp->vec); - sub_v3_v3v3(dvel,velcenter,bp->vec); - mul_v3_fl(dvel,_final_mass(ob,bp)); + mid_v3_v3v3(velcenter, bp->vec, obp->vec); + sub_v3_v3v3(dvel,velcenter,bp->vec); + mul_v3_fl(dvel,_final_mass(ob,bp)); - Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def); - Vec3PlusStVec(bp->force,sb->balldamp,dvel); + Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def); + Vec3PlusStVec(bp->force,sb->balldamp,dvel); - /* exploit force(a,b) == -force(b,a) part2/2 */ - sub_v3_v3v3(dvel,velcenter,obp->vec); - mul_v3_fl(dvel,_final_mass(ob,bp)); + /* exploit force(a,b) == -force(b,a) part2/2 */ + sub_v3_v3v3(dvel,velcenter,obp->vec); + mul_v3_fl(dvel,_final_mass(ob,bp)); - Vec3PlusStVec(obp->force,sb->balldamp,dvel); - Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def); - } + Vec3PlusStVec(obp->force,sb->balldamp,dvel); + Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def); } } + } } /* naive ball self collision done */ @@ -2930,7 +2930,7 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float * /* now we have individual masses */ /* claim a minimum mass for vertex */ if (_final_mass(ob,bp) > 0.009999f) timeovermass = forcetime/_final_mass(ob,bp); - else timeovermass = forcetime/0.009999f; + else timeovermass = forcetime/0.009999f; if(_final_goal(ob,bp) < SOFTGOALSNAP){ diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c index 73e23bd2a05..ba7f9bdd415 100644 --- a/source/blender/blenkernel/intern/writeavi.c +++ b/source/blender/blenkernel/intern/writeavi.c @@ -158,7 +158,7 @@ static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportL avi = MEM_mallocN (sizeof(AviMovie), "avimovie"); /* RPW 11-21-2002 - if (rd->imtype != AVI_FORMAT_MJPEG) format = AVI_FORMAT_AVI_RGB; + if (rd->imtype != AVI_FORMAT_MJPEG) format = AVI_FORMAT_AVI_RGB; */ if (rd->imtype != R_AVIJPEG ) format = AVI_FORMAT_AVI_RGB; else format = AVI_FORMAT_MJPEG; diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c index 0144dea3960..ff08ef4dba9 100644 --- a/source/blender/blenlib/intern/BLI_ghash.c +++ b/source/blender/blenlib/intern/BLI_ghash.c @@ -175,7 +175,7 @@ unsigned int BLI_ghashutil_inthash(const void *ptr) { key += ~(key << 9); key ^= (key >> 17); - return (unsigned int)(key & 0xffffffff); + return (unsigned int)(key & 0xffffffff); } int BLI_ghashutil_intcmp(const void *a, const void *b) { diff --git a/source/blender/blenlib/intern/boxpack2d.c b/source/blender/blenlib/intern/boxpack2d.c index 4c16363f6d3..8c7e097d239 100644 --- a/source/blender/blenlib/intern/boxpack2d.c +++ b/source/blender/blenlib/intern/boxpack2d.c @@ -174,7 +174,7 @@ void boxPack2D(boxPack *boxarray, const int len, float *tot_width, float *tot_he vertex_pack_indices = MEM_mallocN( len*3*sizeof(int), "boxPack Indices"); for (box=boxarray, box_index=0, i=0; box_index < len; box_index++, box++) { - + vert->blb = vert->brb = vert->tlb =\ vert->isect_cache[0] = vert->isect_cache[1] =\ vert->isect_cache[2] = vert->isect_cache[3] = NULL; @@ -260,17 +260,17 @@ void boxPack2D(boxPack *boxarray, const int len, float *tot_width, float *tot_he if (vert->free & quad_flags[j]) { switch (j) { case BL: - SET_BOXRIGHT(box, vert->x); - SET_BOXTOP(box, vert->y); - break; + SET_BOXRIGHT(box, vert->x); + SET_BOXTOP(box, vert->y); + break; case TR: - SET_BOXLEFT(box, vert->x); - SET_BOXBOTTOM(box, vert->y); - break; + SET_BOXLEFT(box, vert->x); + SET_BOXBOTTOM(box, vert->y); + break; case TL: - SET_BOXRIGHT(box, vert->x); - SET_BOXBOTTOM(box, vert->y); - break; + SET_BOXRIGHT(box, vert->x); + SET_BOXBOTTOM(box, vert->y); + break; case BR: SET_BOXLEFT(box, vert->x); SET_BOXTOP(box, vert->y); diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c index 2407078fc76..2e0f4b483b1 100644 --- a/source/blender/blenlib/intern/fileops.c +++ b/source/blender/blenlib/intern/fileops.c @@ -133,13 +133,13 @@ int BLI_is_writable(const char *filename) int BLI_touch(const char *file) { - FILE *f = fopen(file,"r+b"); - if (f != NULL) { + FILE *f = fopen(file,"r+b"); + if (f != NULL) { char c = getc(f); rewind(f); putc(c,f); } else { - f = fopen(file,"wb"); + f = fopen(file,"wb"); } if (f) { fclose(f); diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 42a9587596e..4af56c66dde 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -99,7 +99,7 @@ float area_tri_v2(const float v1[2], const float v2[2], const float v3[2]) float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2]) { - return 0.5f * ((v1[0]-v2[0])*(v2[1]-v3[1]) + (v1[1]-v2[1])*(v3[0]-v2[0])); + return 0.5f * ((v1[0]-v2[0])*(v2[1]-v3[1]) + (v1[1]-v2[1])*(v3[0]-v2[0])); } float area_quad_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3]) /* only convex Quadrilaterals */ @@ -1524,22 +1524,22 @@ void interp_weights_face_v3(float w[4], const float v1[3], const float v2[3], co * note: using area_tri_signed_v2 means locations outside the triangle are correctly weighted */ void barycentric_weights_v2(const float v1[2], const float v2[2], const float v3[2], const float co[2], float w[3]) { - float wtot_inv, wtot; + float wtot_inv, wtot; - w[0] = area_tri_signed_v2(v2, v3, co); - w[1] = area_tri_signed_v2(v3, v1, co); - w[2] = area_tri_signed_v2(v1, v2, co); - wtot = w[0]+w[1]+w[2]; + w[0] = area_tri_signed_v2(v2, v3, co); + w[1] = area_tri_signed_v2(v3, v1, co); + w[2] = area_tri_signed_v2(v1, v2, co); + wtot = w[0]+w[1]+w[2]; - if (wtot != 0.0f) { - wtot_inv = 1.0f/wtot; + if (wtot != 0.0f) { + wtot_inv = 1.0f/wtot; - w[0] = w[0]*wtot_inv; - w[1] = w[1]*wtot_inv; - w[2] = w[2]*wtot_inv; - } - else /* dummy values for zero area face */ - w[0] = w[1] = w[2] = 1.0f/3.0f; + w[0] = w[0]*wtot_inv; + w[1] = w[1]*wtot_inv; + w[2] = w[2]*wtot_inv; + } + else /* dummy values for zero area face */ + w[0] = w[1] = w[2] = 1.0f/3.0f; } /* given 2 triangles in 3D space, and a point in relation to the first triangle. diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c index 9a36f000624..75520bb8ba0 100644 --- a/source/blender/blenlib/intern/math_vector_inline.c +++ b/source/blender/blenlib/intern/math_vector_inline.c @@ -315,7 +315,7 @@ MINLINE float dot_v3v3(const float a[3], const float b[3]) MINLINE float cross_v2v2(const float a[2], const float b[2]) { - return a[0]*b[1] - a[1]*b[0]; + return a[0]*b[1] - a[1]*b[0]; } MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3]) diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c index 49a09dd7b15..5d80edebbef 100644 --- a/source/blender/blenlib/intern/noise.c +++ b/source/blender/blenlib/intern/noise.c @@ -1098,7 +1098,7 @@ static float dist_Minkovsky4(float x, float y, float z, float e) /* Minkovsky, general case, slow, maybe too slow to be useful */ static float dist_Minkovsky(float x, float y, float z, float e) { - return pow(pow(fabs(x), e) + pow(fabs(y), e) + pow(fabs(z), e), 1.0/e); + return pow(pow(fabs(x), e) + pow(fabs(y), e) + pow(fabs(z), e), 1.0/e); } @@ -1275,18 +1275,18 @@ static float voronoi_CrS(float x, float y, float z) /* returns unsigned cellnoise */ static float cellNoiseU(float x, float y, float z) { - int xi = (int)(floor(x)); - int yi = (int)(floor(y)); - int zi = (int)(floor(z)); - unsigned int n = xi + yi*1301 + zi*314159; - n ^= (n<<13); - return ((float)(n*(n*n*15731 + 789221) + 1376312589) / 4294967296.0); + int xi = (int)(floor(x)); + int yi = (int)(floor(y)); + int zi = (int)(floor(z)); + unsigned int n = xi + yi*1301 + zi*314159; + n ^= (n<<13); + return ((float)(n*(n*n*15731 + 789221) + 1376312589) / 4294967296.0); } /* idem, signed */ float cellNoise(float x, float y, float z) { - return (2.0*cellNoiseU(x, y, z)-1.0); + return (2.0*cellNoiseU(x, y, z)-1.0); } /* returns a vector/point/color in ca, using point hasharray directly */ diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index f7115b4d46f..73d6588b97f 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -324,8 +324,8 @@ void BLI_cleanup_path(const char *relabase, char *dir) /* Note, this should really be moved to the file selector, * since this function is used in many areas */ if(strcmp(dir, ".")==0) { /* happens for example in FILE_MAIN */ - get_default_root(dir); - return; + get_default_root(dir); + return; } while ( (start = strstr(dir, "\\..\\")) ) { @@ -353,9 +353,9 @@ void BLI_cleanup_path(const char *relabase, char *dir) } #else if(dir[0]=='.') { /* happens, for example in FILE_MAIN */ - dir[0]= '/'; - dir[1]= 0; - return; + dir[0]= '/'; + dir[1]= 0; + return; } /* support for odd paths: eg /../home/me --> /home/me @@ -525,7 +525,7 @@ int BLI_parent_dir(char *path) BLI_add_slash(tmp); strcat(tmp, parent_dir); BLI_cleanup_dir(NULL, tmp); - + if (!BLI_testextensie(tmp, parent_dir)) { BLI_strncpy(path, tmp, sizeof(tmp)); return 1; diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c index 90754e7d2bb..596ab2b0470 100644 --- a/source/blender/blenlib/intern/winstuff.c +++ b/source/blender/blenlib/intern/winstuff.c @@ -307,21 +307,21 @@ int check_file_chars(char *filename) #include char* dirname(char *path) { - char *p; - if( path == NULL || *path == '\0' ) - return "."; - p = path + strlen(path) - 1; - while( *p == '/' ) { - if( p == path ) - return path; - *p-- = '\0'; - } - while( p >= path && *p != '/' ) - p--; - return - p < path ? "." : - p == path ? "/" : - (*p = '\0', path); + char *p; + if( path == NULL || *path == '\0' ) + return "."; + p = path + strlen(path) - 1; + while( *p == '/' ) { + if( p == path ) + return path; + *p-- = '\0'; + } + while( p >= path && *p != '/' ) + p--; + return + p < path ? "." : + p == path ? "/" : + (*p = '\0', path); } /* End of copied part */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index e4e61e49e90..08f9b655fac 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -1206,7 +1206,7 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain) /* used entries were restored, so we put them to zero */ for (i=0; iimamap->nentries; i++, entry++) { - if (entry->nr>0) + if (entry->nr>0) entry->newp= NULL; } @@ -6516,7 +6516,7 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb) ar->v2d.max[0]= MAXFRAMEF; ar->v2d.max[1]= FLT_MAX; - + ar->v2d.minzoom= 0.01f; ar->v2d.maxzoom= 50; ar->v2d.scroll = (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL); diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index adfc9ee8113..23f91f88c8d 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -2724,7 +2724,7 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *UNUSED(op)) /* cancel if nothing selected */ if (CTX_DATA_COUNT(C, selected_bones) == 0) - return OPERATOR_CANCELLED; + return OPERATOR_CANCELLED; ED_armature_sync_selection(arm->edbo); // XXX why is this needed? @@ -5806,7 +5806,7 @@ EditBone * test_subdivideByCorrelation(Scene *scene, Object *obedit, ReebArc *ar lastBone = subdivideArcBy(arm, arm->edbo, iter, invmat, tmat, nextAdaptativeSubdivision); } - return lastBone; + return lastBone; } float arcLengthRatio(ReebArc *arc) diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c index bd05f7f6581..b750bd5ef1c 100644 --- a/source/blender/editors/armature/editarmature_retarget.c +++ b/source/blender/editors/armature/editarmature_retarget.c @@ -1536,7 +1536,7 @@ RigGraph *RIG_graphFromArmature(const bContext *C, Object *ob, bArmature *arm) Scene *scene = CTX_data_scene(C); EditBone *ebone; RigGraph *rg; - + rg = newRigGraph(); if (obedit == ob) @@ -1588,7 +1588,7 @@ static RigGraph *armatureSelectedToGraph(bContext *C, Object *ob, bArmature *arm Scene *scene = CTX_data_scene(C); EditBone *ebone; RigGraph *rg; - + rg = newRigGraph(); if (obedit == ob) @@ -2829,7 +2829,7 @@ void BIF_retargetArmature(bContext *C) { RigGraph *rigg; bArmature *arm; - + arm = ob->data; /* Put the armature into editmode */ diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c index 566ccd7cd3f..b99605e65c1 100644 --- a/source/blender/editors/armature/meshlaplacian.c +++ b/source/blender/editors/armature/meshlaplacian.c @@ -1123,7 +1123,7 @@ static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3], det = INPR(edge1, pvec); if (det == 0.0f) - return 0; + return 0; inv_det = 1.0f / det; /* calculate distance from vert0 to ray origin */ @@ -1132,7 +1132,7 @@ static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3], /* calculate U parameter and test bounds */ u = INPR(tvec, pvec) * inv_det; if (u < -EPSILON || u > 1.0f+EPSILON) - return 0; + return 0; /* prepare to test V parameter */ cross_v3_v3v3(qvec, tvec, edge1); @@ -1140,7 +1140,7 @@ static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3], /* calculate V parameter and test bounds */ v = INPR(dir, qvec) * inv_det; if (v < -EPSILON || u + v > 1.0f+EPSILON) - return 0; + return 0; isectco[0]= (1.0f - u - v)*vert0[0] + u*vert1[0] + v*vert2[0]; isectco[1]= (1.0f - u - v)*vert0[1] + u*vert1[1] + v*vert2[1]; diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c index 490d4c587f9..04501243acb 100644 --- a/source/blender/editors/armature/reeb.c +++ b/source/blender/editors/armature/reeb.c @@ -2572,7 +2572,7 @@ ReebGraph * generateReebGraph(EditMesh *em, int subdivisions) int totfaces; int countfaces = 0; #endif - + rg = newReebGraph(); rg->resolution = subdivisions; diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 68f45c5fdb4..bea5a729f31 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -2855,7 +2855,7 @@ static void subdividenurb(Object *obedit, int number_cuts) int a, b, sel, amount, *usel, *vsel, i; float factor; - // printf("*** subdivideNurb: entering subdivide\n"); + // printf("*** subdivideNurb: entering subdivide\n"); for(nu= editnurb->nurbs.first; nu; nu= nu->next) { amount= 0; @@ -3231,8 +3231,7 @@ static void subdividenurb(Object *obedit, int number_cuts) MEM_freeN(nu->bp); nu->bp= bpnew; nu->pntsu+= sel; - nurbs_knot_calc_u(nu); /* shift knots - forward */ + nurbs_knot_calc_u(nu); /* shift knots forward */ } } } @@ -4997,8 +4996,8 @@ static int select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *event int a, location[2], deselect; deselect= RNA_boolean_get(op->ptr, "deselect"); - location[0]= event->x - ar->winrct.xmin; - location[1]= event->y - ar->winrct.ymin; + location[0]= event->x - ar->winrct.xmin; + location[1]= event->y - ar->winrct.ymin; view3d_operator_needs_opengl(C); view3d_set_viewcontext(C, &vc); diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index fc29a18154a..90a83009c4d 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -1171,13 +1171,13 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB /* uiWidgetStateColors - char inner_anim[4]; - char inner_anim_sel[4]; - char inner_key[4]; - char inner_key_sel[4]; - char inner_driven[4]; - char inner_driven_sel[4]; - float blend; + char inner_anim[4]; + char inner_anim_sel[4]; + char inner_key[4]; + char inner_key_sel[4]; + char inner_driven[4]; + char inner_driven_sel[4]; + float blend; */ @@ -1192,15 +1192,15 @@ static struct uiWidgetStateColors wcol_state_colors= { }; /* uiWidgetColors - float outline[3]; - float inner[4]; - float inner_sel[4]; - float item[3]; - float text[3]; - float text_sel[3]; + float outline[3]; + float inner[4]; + float inner_sel[4]; + float item[3]; + float text[3]; + float text_sel[3]; - short shaded; - float shadetop, shadedown; + short shaded; + float shadetop, shadedown; */ static struct uiWidgetColors wcol_num= { diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index dc1023952a6..83840f0f4cb 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -2755,7 +2755,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float // Beauty Long Edges else { - for(j=0;j<2;j++) { + for(j=0;j<2;j++) { hold = -1; for(i=0;i<4;i++) { if(length[i] < 0) { @@ -2969,8 +2969,8 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float } } } - if(em->selectmode & SCE_SELECT_VERTEX) { - for(eed = em->edges.first;eed;eed = eed->next) { + if(em->selectmode & SCE_SELECT_VERTEX) { + for(eed = em->edges.first;eed;eed = eed->next) { if(eed->f & SELECT) { eed->v1->f |= SELECT; eed->v2->f |= SELECT; @@ -3643,7 +3643,7 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed, int dir) return; /* how many edges does each face have */ - if(face[0]->e4) fac1= 4; + if(face[0]->e4) fac1= 4; else fac1= 3; if(face[1]->e4) fac2= 4; @@ -4061,8 +4061,8 @@ useless: } // Make sure loop is not 2 edges of same face if(ct > 1) { - BKE_report(op->reports, RPT_ERROR, "Loop crosses itself"); - return 0; + BKE_report(op->reports, RPT_ERROR, "Loop crosses itself"); + return 0; } } // Get # of selected verts @@ -4179,11 +4179,11 @@ useless: for(eed=em->edges.first;eed;eed=eed->next) { if(editedge_containsVert(eed, ev)) { if(!(eed->f & SELECT)) { - if(!tempsv->up) { - tempsv->up = eed; - } else if (!(tempsv->down)) { - tempsv->down = eed; - } + if(!tempsv->up) { + tempsv->up = eed; + } else if (!(tempsv->down)) { + tempsv->down = eed; + } } } } @@ -4195,33 +4195,33 @@ useless: for(efa = em->faces.first;efa;efa=efa->next) { if(editface_containsEdge(efa, eed)) { if(editedge_containsVert(efa->e1, ev) && efa->e1 != eed) { - if(!tempsv->up) { - tempsv->up = efa->e1; - } else if (!(tempsv->down)) { - tempsv->down = efa->e1; - } + if(!tempsv->up) { + tempsv->up = efa->e1; + } else if (!(tempsv->down)) { + tempsv->down = efa->e1; + } } if(editedge_containsVert(efa->e2, ev) && efa->e2 != eed) { - if(!tempsv->up) { - tempsv->up = efa->e2; - } else if (!(tempsv->down)) { - tempsv->down = efa->e2; - } + if(!tempsv->up) { + tempsv->up = efa->e2; + } else if (!(tempsv->down)) { + tempsv->down = efa->e2; + } } if(editedge_containsVert(efa->e3, ev) && efa->e3 != eed) { - if(!tempsv->up) { - tempsv->up = efa->e3; - } else if (!(tempsv->down)) { - tempsv->down = efa->e3; - } + if(!tempsv->up) { + tempsv->up = efa->e3; + } else if (!(tempsv->down)) { + tempsv->down = efa->e3; + } } if(efa->e4) { if(editedge_containsVert(efa->e4, ev) && efa->e4 != eed) { - if(!tempsv->up) { - tempsv->up = efa->e4; - } else if (!(tempsv->down)) { - tempsv->down = efa->e4; - } + if(!tempsv->up) { + tempsv->up = efa->e4; + } else if (!(tempsv->down)) { + tempsv->down = efa->e4; + } } } @@ -4665,7 +4665,7 @@ useless: mvalo[0] = -1; } else if(ELEM(event, RIGHTARROWKEY, WHEELUPMOUSE)) { // Scroll through Control Edges look = vertlist; - while(look) { + while(look) { if(nearest == (EditVert*)look->link) { if(look->next == NULL) { nearest = (EditVert*)vertlist->link; @@ -4679,7 +4679,7 @@ useless: } } else if(ELEM(event, LEFTARROWKEY, WHEELDOWNMOUSE)) { // Scroll through Control Edges look = vertlist; - while(look) { + while(look) { if(look->next) { if(look->next->link == nearest) { nearest = (EditVert*)look->link; @@ -4817,7 +4817,7 @@ void mesh_set_face_flags(EditMesh *em, short mode) add_numbut(12, TOG|SHO, "Sort", 0, 0, &m_sort, NULL); if (!do_clever_numbuts((mode ? "Set Flags" : "Clear Flags"), 13, REDRAW)) - return; + return; /* these 2 cant both be on */ if (mode) /* are we seeting*/ diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 901f3d7c5f1..56a27da54df 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -3346,7 +3346,7 @@ static int open_file_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSE { if(drag->type==WM_DRAG_PATH) { if(drag->icon==ICON_FILE_BLEND) - return 1; + return 1; } return 0; } diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index 01a9a75ca13..5caf72a4a2f 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -486,22 +486,22 @@ static int project_bucket_offset_safe(const ProjPaintState *ps, const float proj /* still use 2D X,Y space but this works for verts transformed by a perspective matrix, using their 4th component as a weight */ static void barycentric_weights_v2_persp(float v1[4], float v2[4], float v3[4], float co[2], float w[3]) { - float wtot_inv, wtot; + float wtot_inv, wtot; - w[0] = area_tri_signed_v2(v2, v3, co) / v1[3]; - w[1] = area_tri_signed_v2(v3, v1, co) / v2[3]; - w[2] = area_tri_signed_v2(v1, v2, co) / v3[3]; - wtot = w[0]+w[1]+w[2]; + w[0] = area_tri_signed_v2(v2, v3, co) / v1[3]; + w[1] = area_tri_signed_v2(v3, v1, co) / v2[3]; + w[2] = area_tri_signed_v2(v1, v2, co) / v3[3]; + wtot = w[0]+w[1]+w[2]; - if (wtot != 0.0f) { - wtot_inv = 1.0f/wtot; + if (wtot != 0.0f) { + wtot_inv = 1.0f/wtot; - w[0] = w[0]*wtot_inv; - w[1] = w[1]*wtot_inv; - w[2] = w[2]*wtot_inv; - } - else /* dummy values for zero area face */ - w[0] = w[1] = w[2] = 1.0f/3.0f; + w[0] = w[0]*wtot_inv; + w[1] = w[1]*wtot_inv; + w[2] = w[2]*wtot_inv; + } + else /* dummy values for zero area face */ + w[0] = w[1] = w[2] = 1.0f/3.0f; } static float VecZDepthOrtho(float pt[2], float v1[3], float v2[3], float v3[3], float w[3]) @@ -1740,7 +1740,7 @@ static int project_bucket_isect_circle(const float cent[2], const float radius_s */ if((bucket_bounds->xmin <= cent[0] && bucket_bounds->xmax >= cent[0]) || (bucket_bounds->ymin <= cent[1] && bucket_bounds->ymax >= cent[1]) ) { - return 1; + return 1; } /* out of bounds left */ diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c index e8731391352..10a1fe62cca 100644 --- a/source/blender/editors/space_action/space_action.c +++ b/source/blender/editors/space_action/space_action.c @@ -112,7 +112,7 @@ static SpaceLink *action_new(const bContext *C) ar->v2d.max[0]= MAXFRAMEF; ar->v2d.max[1]= FLT_MAX; - + ar->v2d.minzoom= 0.01f; ar->v2d.maxzoom= 50; ar->v2d.scroll = (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL); diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index 17e7b1b5b18..fb1144b4fa8 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -766,7 +766,7 @@ void GRAPH_OT_properties(wmOperatorType *ot) ot->exec= graph_properties; ot->poll= ED_operator_graphedit_active; - + /* flags */ ot->flag= 0; } diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index 3dffb924434..52b48e1f9fd 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -447,7 +447,7 @@ static int is_preview_allowed(ScrArea *cur) for(sa=G.curscreen->areabase.first; sa; sa= sa->next) { if(sa!=cur && sa->spacetype==SPACE_IMAGE) { if(image_preview_active(sa, NULL, NULL)) - return 0; + return 0; } } /* check image type */ diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 8030bffae2d..85d36ea9b29 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -188,7 +188,7 @@ void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *f sprintf(str, " R:%-.4f", fp[0]); else if (cp) sprintf(str, " R:%-3d", cp[0]); - else + else sprintf(str, " R:-"); BLF_position(blf_mono_font, dx, 6, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); @@ -199,7 +199,7 @@ void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *f sprintf(str, " G:%-.4f", fp[1]); else if (cp) sprintf(str, " G:%-3d", cp[1]); - else + else sprintf(str, " G:-"); BLF_position(blf_mono_font, dx, 6, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); @@ -210,7 +210,7 @@ void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *f sprintf(str, " B:%-.4f", fp[2]); else if (cp) sprintf(str, " B:%-3d", cp[2]); - else + else sprintf(str, " B:-"); BLF_position(blf_mono_font, dx, 6, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 9cea8d4f220..61c999f51ab 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -768,13 +768,13 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) Image *ima= NULL; if(sima) { - ima= sima->image; + ima= sima->image; } if (ima==NULL) { - Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data; - if(tex && tex->type==TEX_IMAGE) - ima= tex->ima; + Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data; + if(tex && tex->type==TEX_IMAGE) + ima= tex->ima; } if(ima) diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index db8eff11498..bce492f5a04 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -2200,28 +2200,28 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo } case ACT_CAMERA: - ysize= 48; + ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - ca= act->data; + ca= act->data; - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+10, yco-24, (width-20)/2, 19, &(ca->ob), "Look at this Object"); - uiDefButF(block, NUM, 0, "Height:", xco+10+(width-20)/2, yco-24, (width-20)/2, 19, &ca->height, 0.0, 20.0, 0, 0, ""); + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+10, yco-24, (width-20)/2, 19, &(ca->ob), "Look at this Object"); + uiDefButF(block, NUM, 0, "Height:", xco+10+(width-20)/2, yco-24, (width-20)/2, 19, &ca->height, 0.0, 20.0, 0, 0, ""); - uiDefButF(block, NUM, 0, "Min:", xco+10, yco-44, (width-60)/2, 19, &ca->min, 0.0, 20.0, 0, 0, ""); + uiDefButF(block, NUM, 0, "Min:", xco+10, yco-44, (width-60)/2, 19, &ca->min, 0.0, 20.0, 0, 0, ""); - if(ca->axis==0) ca->axis= 'x'; - uiDefButS(block, ROW, 0, "X", xco+10+(width-60)/2, yco-44, 20, 19, &ca->axis, 4.0, (float)'x', 0, 0, "Camera tries to get behind the X axis"); - uiDefButS(block, ROW, 0, "Y", xco+30+(width-60)/2, yco-44, 20, 19, &ca->axis, 4.0, (float)'y', 0, 0, "Camera tries to get behind the Y axis"); + if(ca->axis==0) ca->axis= 'x'; + uiDefButS(block, ROW, 0, "X", xco+10+(width-60)/2, yco-44, 20, 19, &ca->axis, 4.0, (float)'x', 0, 0, "Camera tries to get behind the X axis"); + uiDefButS(block, ROW, 0, "Y", xco+30+(width-60)/2, yco-44, 20, 19, &ca->axis, 4.0, (float)'y', 0, 0, "Camera tries to get behind the Y axis"); - uiDefButF(block, NUM, 0, "Max:", xco+20+(width)/2, yco-44, (width-60)/2, 19, &ca->max, 0.0, 20.0, 0, 0, ""); + uiDefButF(block, NUM, 0, "Max:", xco+20+(width)/2, yco-44, (width-60)/2, 19, &ca->max, 0.0, 20.0, 0, 0, ""); - yco-= ysize; + yco-= ysize; + + break; - break; - case ACT_EDIT_OBJECT: eoa= act->data; @@ -2230,7 +2230,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo ysize = 92; glRects(xco, yco-ysize, xco+width, yco); uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+10, yco-44, (width-20)/2, 19, &(eoa->ob), "Add this Object and all its children (cant be on an visible layer)"); uiDefButI(block, NUM, 0, "Time:", xco+10+(width-20)/2, yco-44, (width-20)/2, 19, &eoa->time, 0.0, 2000.0, 0, 0, "Duration the new Object lives"); @@ -2313,8 +2313,8 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo yco-= ysize; break; - - case ACT_CONSTRAINT: + + case ACT_CONSTRAINT: coa= act->data; if (coa->type == ACT_CONST_TYPE_LOC) { @@ -2451,69 +2451,69 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo break; case ACT_SCENE: - sca= act->data; + sca= act->data; - if(sca->type==ACT_SCENE_RESTART) { - ysize= 28; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - } - else if(sca->type==ACT_SCENE_CAMERA) { + if(sca->type==ACT_SCENE_RESTART) { + ysize= 28; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + } + else if(sca->type==ACT_SCENE_CAMERA) { + + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+40, yco-44, (width-80), 19, &(sca->camera), "Set this Camera. Leave empty to refer to self object"); + } + else if(sca->type==ACT_SCENE_SET) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+40, yco-44, (width-80), 19, &(sca->camera), "Set this Camera. Leave empty to refer to self object"); - } - else if(sca->type==ACT_SCENE_SET) { - - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Set this Scene"); - } + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Set this Scene"); + } else if(sca->type==ACT_SCENE_ADD_FRONT) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Add an Overlay Scene"); - } + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Add an Overlay Scene"); + } else if(sca->type==ACT_SCENE_ADD_BACK) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Add a Background Scene"); - } + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Add a Background Scene"); + } else if(sca->type==ACT_SCENE_REMOVE) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Remove a Scene"); - } + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Remove a Scene"); + } else if(sca->type==ACT_SCENE_SUSPEND) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Pause a Scene"); - } + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Pause a Scene"); + } else if(sca->type==ACT_SCENE_RESUME) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - - uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Unpause a Scene"); - } + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + + uiDefIDPoinBut(block, test_scenepoin_but, ID_SCE, 1, "SCE:", xco+40, yco-44, (width-80), 19, &(sca->scene), "Unpause a Scene"); + } str= "Scene %t|Restart %x0|Set Scene %x1|Set Camera %x2|Add OverlayScene %x3|Add BackgroundScene %x4|Remove Scene %x5|Suspend Scene %x6|Resume Scene %x7"; uiDefButS(block, MENU, B_REDR, str, xco+40, yco-24, (width-80), 19, &sca->type, 0.0, 0.0, 0, 0, ""); @@ -2850,41 +2850,41 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo yco -= ysize; break; case ACT_PARENT: - parAct = act->data; + parAct = act->data; - if(parAct->type==ACT_PARENT_SET) { + if(parAct->type==ACT_PARENT_SET) { - ysize= 48; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+95, yco-24, (width-100), 19, &(parAct->ob), "Set this object as parent"); + ysize= 48; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "OB:", xco+95, yco-24, (width-100), 19, &(parAct->ob), "Set this object as parent"); uiBlockBeginAlign(block); uiDefButBitS(block, TOGN, ACT_PARENT_COMPOUND, B_REDR, - "Compound", - xco + 5, yco - 44, (width - 10)/2, 19, &parAct->flag, - 0.0, 0.0, 0, 0, - "Add this object shape to the parent shape (only if the parent shape is already compound)"); + "Compound", + xco + 5, yco - 44, (width - 10)/2, 19, &parAct->flag, + 0.0, 0.0, 0, 0, + "Add this object shape to the parent shape (only if the parent shape is already compound)"); uiDefButBitS(block, TOGN, ACT_PARENT_GHOST, B_REDR, - "Ghost", - xco + 5 + ((width - 10)/2), yco - 44, (width - 10)/2, 19, &parAct->flag, - 0.0, 0.0, 0, 0, - "Make this object ghost while parented (only if not compound)"); + "Ghost", + xco + 5 + ((width - 10)/2), yco - 44, (width - 10)/2, 19, &parAct->flag, + 0.0, 0.0, 0, 0, + "Make this object ghost while parented (only if not compound)"); uiBlockEndAlign(block); - } - else if(parAct->type==ACT_PARENT_REMOVE) { - - ysize= 28; - glRects(xco, yco-ysize, xco+width, yco); - uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - } + } + else if(parAct->type==ACT_PARENT_REMOVE) { + + ysize= 28; + glRects(xco, yco-ysize, xco+width, yco); + uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); + } str= "Parent %t|Set Parent %x0|Remove Parent %x1"; uiDefButI(block, MENU, B_REDR, str, xco+5, yco-24, parAct->type==1?(width-80):90, 19, &parAct->type, 0.0, 0.0, 0, 0, ""); - yco-= ysize; - break; + yco-= ysize; + break; case ACT_ARMATURE: - armAct = act->data; + armAct = act->data; if (ob->type == OB_ARMATURE) { str= "Constraint %t|Run armature %x0|Enable %x1|Disable %x2|Set target %x3|Set weight %x4"; @@ -2922,8 +2922,8 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo } glRects(xco, yco-ysize, xco+width, yco); uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - yco-= ysize; - break; + yco-= ysize; + break; default: ysize= 4; diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c index 3e6e75fc7ec..94232699c30 100644 --- a/source/blender/editors/space_nla/nla_buttons.c +++ b/source/blender/editors/space_nla/nla_buttons.c @@ -504,7 +504,7 @@ void NLA_OT_properties(wmOperatorType *ot) ot->exec= nla_properties; ot->poll= ED_operator_nla_active; - + /* flags */ ot->flag= 0; } diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c index 941a88c5c40..90f9996e392 100644 --- a/source/blender/editors/space_nla/space_nla.c +++ b/source/blender/editors/space_nla/space_nla.c @@ -159,7 +159,7 @@ static SpaceLink *nla_new(const bContext *C) ar->v2d.max[0]= MAXFRAMEF; ar->v2d.max[1]= 10000.0f; - + ar->v2d.minzoom= 0.01f; ar->v2d.maxzoom= 50; ar->v2d.scroll = (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index a310b309d84..db9a052fdbd 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -834,26 +834,26 @@ static void node_composit_buts_color_spill(uiLayout *layout, bContext *UNUSED(C) { uiLayout *row, *col; - uiItemL(layout, "Despill Channel:", ICON_NONE); - row =uiLayoutRow(layout,0); + uiItemL(layout, "Despill Channel:", ICON_NONE); + row =uiLayoutRow(layout,0); uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE); - col= uiLayoutColumn(layout, 0); - uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NONE); + col= uiLayoutColumn(layout, 0); + uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NONE); - if(RNA_enum_get(ptr, "limit_method")==0) { - uiItemL(col, "Limiting Channel:", ICON_NONE); - row=uiLayoutRow(col,0); - uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE); - } + if(RNA_enum_get(ptr, "limit_method")==0) { + uiItemL(col, "Limiting Channel:", ICON_NONE); + row=uiLayoutRow(col,0); + uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + } - uiItemR(col, ptr, "ratio", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(col, ptr, "use_unspill", 0, NULL, ICON_NONE); - if (RNA_enum_get(ptr, "use_unspill")== 1) { - uiItemR(col, ptr, "unspill_red", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(col, ptr, "unspill_green", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - uiItemR(col, ptr, "unspill_blue", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - } + uiItemR(col, ptr, "ratio", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(col, ptr, "use_unspill", 0, NULL, ICON_NONE); + if (RNA_enum_get(ptr, "use_unspill")== 1) { + uiItemR(col, ptr, "unspill_red", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(col, ptr, "unspill_green", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + uiItemR(col, ptr, "unspill_blue", UI_ITEM_R_SLIDER, NULL, ICON_NONE); + } } static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) @@ -865,9 +865,9 @@ static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *UNUSED(C uiItemR(col, ptr, "threshold", 0, NULL, ICON_NONE); col= uiLayoutColumn(layout, 1); - /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); Removed for now */ + /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); Removed for now */ uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE); - /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, ICON_NONE); Removed for now*/ + /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, ICON_NONE); Removed for now*/ } static void node_composit_buts_color_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) @@ -884,24 +884,24 @@ static void node_composit_buts_channel_matte(uiLayout *layout, bContext *UNUSED( { uiLayout *col, *row; - uiItemL(layout, "Color Space:", ICON_NONE); + uiItemL(layout, "Color Space:", ICON_NONE); row= uiLayoutRow(layout, 0); uiItemR(row, ptr, "color_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE); - col=uiLayoutColumn(layout, 0); - uiItemL(col, "Key Channel:", ICON_NONE); + col=uiLayoutColumn(layout, 0); + uiItemL(col, "Key Channel:", ICON_NONE); row= uiLayoutRow(col, 0); uiItemR(row, ptr, "matte_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE); col =uiLayoutColumn(layout, 0); - uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NONE); - if(RNA_enum_get(ptr, "limit_method")==0) { - uiItemL(col, "Limiting Channel:", ICON_NONE); - row=uiLayoutRow(col,0); - uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE); - } - + uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NONE); + if(RNA_enum_get(ptr, "limit_method")==0) { + uiItemL(col, "Limiting Channel:", ICON_NONE); + row=uiLayoutRow(col,0); + uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE); + } + uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, ICON_NONE); uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, ICON_NONE); } @@ -957,7 +957,7 @@ static void node_composit_buts_scale(uiLayout *layout, bContext *UNUSED(C), Poin static void node_composit_buts_rotate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { - uiItemR(layout, ptr, "filter_type", 0, "", ICON_NONE); + uiItemR(layout, ptr, "filter_type", 0, "", ICON_NONE); } static void node_composit_buts_invert(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) @@ -1123,7 +1123,7 @@ static void node_composit_set_butfunc(bNodeType *ntype) break; case CMP_NODE_OUTPUT_FILE: ntype->uifunc= node_composit_buts_file_output; - break; + break; case CMP_NODE_DIFF_MATTE: ntype->uifunc=node_composit_buts_diff_matte; break; @@ -1142,9 +1142,9 @@ static void node_composit_set_butfunc(bNodeType *ntype) case CMP_NODE_SCALE: ntype->uifunc= node_composit_buts_scale; break; - case CMP_NODE_ROTATE: - ntype->uifunc=node_composit_buts_rotate; - break; + case CMP_NODE_ROTATE: + ntype->uifunc=node_composit_buts_rotate; + break; case CMP_NODE_CHANNEL_MATTE: ntype->uifunc= node_composit_buts_channel_matte; break; @@ -1168,16 +1168,16 @@ static void node_composit_set_butfunc(bNodeType *ntype) break; case CMP_NODE_VIEW_LEVELS: ntype->uifunc=node_composit_buts_view_levels; - break; + break; case CMP_NODE_COLORBALANCE: ntype->uifunc=node_composit_buts_colorbalance; - break; + break; case CMP_NODE_HUECORRECT: ntype->uifunc=node_composit_buts_huecorrect; - break; + break; case CMP_NODE_ZCOMBINE: ntype->uifunc=node_composit_buts_zcombine; - break; + break; case CMP_NODE_COMBYCCA: case CMP_NODE_SEPYCCA: ntype->uifunc=node_composit_buts_ycc; @@ -1499,7 +1499,7 @@ void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp sprintf(str, " R:%-.4f", fp[0]); else if (cp) sprintf(str, " R:%-3d", cp[0]); - else + else sprintf(str, " R:-"); BLF_position(blf_mono_font, dx, 6, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); @@ -1510,7 +1510,7 @@ void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp sprintf(str, " G:%-.4f", fp[1]); else if (cp) sprintf(str, " G:%-3d", cp[1]); - else + else sprintf(str, " G:-"); BLF_position(blf_mono_font, dx, 6, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); @@ -1521,7 +1521,7 @@ void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp sprintf(str, " B:%-.4f", fp[2]); else if (cp) sprintf(str, " B:%-3d", cp[2]); - else + else sprintf(str, " B:-"); BLF_position(blf_mono_font, dx, 6, 0); BLF_draw_ascii(blf_mono_font, str, sizeof(str)); diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index fce9c883c84..0e574ca5ffb 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -1340,8 +1340,8 @@ static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops) int show_opened= (soops->treestore==NULL); /* on first view, we open scenes */ if(soops->tree.first && (soops->storeflag & SO_TREESTORE_REDRAW)) - return; - + return; + outliner_free_tree(&soops->tree); outliner_storage_cleanup(soops); @@ -3533,8 +3533,8 @@ static EnumPropertyItem prop_group_op_types[] = { {2, "LOCAL", 0, "Make Local", ""}, {3, "LINK", 0, "Link Group Objects to Scene", ""}, {4, "TOGVIS", 0, "Toggle Visible", ""}, - {5, "TOGSEL", 0, "Toggle Selectable", ""}, - {6, "TOGREN", 0, "Toggle Renderable", ""}, + {5, "TOGSEL", 0, "Toggle Selectable", ""}, + {6, "TOGREN", 0, "Toggle Renderable", ""}, {0, NULL, 0, NULL, NULL} }; @@ -3561,7 +3561,7 @@ static int outliner_group_operation_exec(bContext *C, wmOperator *op) else if(event==3) { outliner_do_libdata_operation(C, scene, soops, &soops->tree, group_linkobs2scene_cb); ED_undo_push(C, "Link Group Objects to Scene"); - } + } WM_event_add_notifier(C, NC_GROUP, NULL); @@ -5255,7 +5255,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar if(tselem->type==0 && te->idcode==ID_GR){ int restrict_bool; gr = (Group *)tselem->id; - + uiBlockSetEmboss(block, UI_EMBOSSN); restrict_bool= group_restrict_flag(gr, OB_RESTRICT_VIEW); @@ -5271,7 +5271,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar uiButSetFunc(bt, restrictbutton_gr_restrict_render, scene, gr); uiBlockSetEmboss(block, UI_EMBOSS); - } + } /* scene render layers and passes have toggle-able flags too! */ else if(tselem->type==TSE_R_LAYER) { uiBlockSetEmboss(block, UI_EMBOSSN); diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index 31edfd522a3..091018670ba 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -1483,7 +1483,7 @@ static int text_get_cursor_rel(SpaceText* st, ARegion *ar, TextLine *linein, int } } - return selc; + return selc; } static int cursor_skip_find_line(SpaceText* st, ARegion *ar, diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 246ed853cc8..445d2f434fa 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -485,12 +485,12 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C) /* NDOF */ /* Not implemented yet - if (G.ndofdevice ==0 ) { + if (G.ndofdevice ==0 ) { uiDefIconTextButC(block, ICONTEXTROW,B_NDOF, ICON_NDOF_TURN, ndof_pup(), 0,0,XIC+10,YIC, &(v3d->ndofmode), 0, 3.0, 0, 0, "Ndof mode"); - + uiDefIconButC(block, TOG, B_NDOF, ICON_NDOF_DOM, - 0,0,XIC,YIC, - &v3d->ndoffilter, 0, 1, 0, 0, "dominant axis"); + 0,0,XIC,YIC, + &v3d->ndoffilter, 0, 1, 0, 0, "dominant axis"); } */ @@ -513,7 +513,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C) uiDefButS(block, MENU, B_MAN_MODE, str_menu,0,0,70,YIC, &v3d->twmode, 0, 0, 0, 0, "Transform Orientation"); MEM_freeN((void *)str_menu); } - + if(obedit==NULL && v3d->localvd==NULL) { unsigned int ob_lay = ob ? ob->lay : 0; diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 39a18d31d7e..75999fdeb6d 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -669,10 +669,10 @@ static void do_lasso_select_armature(ViewContext *vc, short mcords[][2], short m change= TRUE; } if(lasso_inside(mcords, moves, sco2[0], sco2[1])) { - if(select) ebone->flag |= BONE_TIPSEL; - else ebone->flag &= ~BONE_TIPSEL; - didpoint= 1; - change= TRUE; + if(select) ebone->flag |= BONE_TIPSEL; + else ebone->flag &= ~BONE_TIPSEL; + didpoint= 1; + change= TRUE; } /* if one of points selected, we skip the bone itself */ if(didpoint==0 && lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) { diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index c97833aea4b..1fdc2d9cad7 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -939,25 +939,25 @@ void project_float_noclip(ARegion *ar, float *vec, float *adr) int get_view3d_ortho(View3D *v3d, RegionView3D *rv3d) { - Camera *cam; - - if(rv3d->persp==RV3D_CAMOB) { - if(v3d->camera && v3d->camera->type==OB_CAMERA) { - cam= v3d->camera->data; + Camera *cam; - if(cam && cam->type==CAM_ORTHO) - return 1; - else - return 0; - } - else - return 0; - } - - if(rv3d->persp==RV3D_ORTHO) - return 1; + if(rv3d->persp==RV3D_CAMOB) { + if(v3d->camera && v3d->camera->type==OB_CAMERA) { + cam= v3d->camera->data; - return 0; + if(cam && cam->type==CAM_ORTHO) + return 1; + else + return 0; + } + else + return 0; + } + + if(rv3d->persp==RV3D_ORTHO) + return 1; + + return 0; } /* copies logic of get_view3d_viewplane(), keep in sync */ diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index d0c93116cb2..c710312606d 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4485,11 +4485,11 @@ static int createSlideVerts(TransInfo *t) for(eed=em->edges.first;eed;eed=eed->next) { if(editedge_containsVert(eed, ev)) { if(!(eed->f & SELECT)) { - if(!tempsv->up) { - tempsv->up = eed; - } else if (!(tempsv->down)) { - tempsv->down = eed; - } + if(!tempsv->up) { + tempsv->up = eed; + } else if (!(tempsv->down)) { + tempsv->down = eed; + } } } } @@ -4501,33 +4501,33 @@ static int createSlideVerts(TransInfo *t) for(efa = em->faces.first;efa;efa=efa->next) { if(editface_containsEdge(efa, eed)) { if(editedge_containsVert(efa->e1, ev) && efa->e1 != eed) { - if(!tempsv->up) { - tempsv->up = efa->e1; - } else if (!(tempsv->down)) { - tempsv->down = efa->e1; - } + if(!tempsv->up) { + tempsv->up = efa->e1; + } else if (!(tempsv->down)) { + tempsv->down = efa->e1; + } } if(editedge_containsVert(efa->e2, ev) && efa->e2 != eed) { - if(!tempsv->up) { - tempsv->up = efa->e2; - } else if (!(tempsv->down)) { - tempsv->down = efa->e2; - } + if(!tempsv->up) { + tempsv->up = efa->e2; + } else if (!(tempsv->down)) { + tempsv->down = efa->e2; + } } if(editedge_containsVert(efa->e3, ev) && efa->e3 != eed) { - if(!tempsv->up) { - tempsv->up = efa->e3; - } else if (!(tempsv->down)) { - tempsv->down = efa->e3; - } + if(!tempsv->up) { + tempsv->up = efa->e3; + } else if (!(tempsv->down)) { + tempsv->down = efa->e3; + } } if(efa->e4) { if(editedge_containsVert(efa->e4, ev) && efa->e4 != eed) { - if(!tempsv->up) { - tempsv->up = efa->e4; - } else if (!(tempsv->down)) { - tempsv->down = efa->e4; - } + if(!tempsv->up) { + tempsv->up = efa->e4; + } else if (!(tempsv->down)) { + tempsv->down = efa->e4; + } } } diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index e5e31a8e319..5793b1c6579 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -876,7 +876,7 @@ static void setNearestAxis3d(TransInfo *t) axis[1] = (float)(icoord[1] - t->center2d[1]); axis[2] = 0.0f; - if (normalize_v3(axis) != 0.0f) { + if (normalize_v3(axis) != 0.0f) { project_v3_v3v3(proj, mvec, axis); sub_v3_v3v3(axis, mvec, proj); len[i] = normalize_v3(axis); diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index b2a76681bff..8d73da0063c 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -434,7 +434,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) float pointsize; int drawfaces, interpedges; Image *ima= sima->image; - + em= BKE_mesh_get_editmesh(me); activetf= EM_get_active_mtface(em, &efa_act, NULL, 0); /* will be set to NULL if hidden */ diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c index 7ba85d30763..a9ee65b027b 100644 --- a/source/blender/editors/uvedit/uvedit_parametrizer.c +++ b/source/blender/editors/uvedit/uvedit_parametrizer.c @@ -595,7 +595,7 @@ static void p_vert_load_pin_select_uvs(PHandle *handle, PVert *v) if (e->flag & PEDGE_SELECT) v->flag |= PVERT_SELECT; - if (e->flag & PEDGE_PIN) { + if (e->flag & PEDGE_PIN) { pinuv[0] += e->orig_uv[0]*handle->aspx; pinuv[1] += e->orig_uv[1]*handle->aspy; npins++; diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 323ca6ab78b..25be2e2aeb4 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -210,8 +210,8 @@ static int is_pow2_limit(int num) /* take texture clamping into account */ /* XXX: texturepaint not global! - if (G.f & G_TEXTUREPAINT) - return 1;*/ + if (G.f & G_TEXTUREPAINT) + return 1;*/ if (U.glreslimit != 0 && num > U.glreslimit) return 0; @@ -222,8 +222,8 @@ static int is_pow2_limit(int num) static int smaller_pow2_limit(int num) { /* XXX: texturepaint not global! - if (G.f & G_TEXTUREPAINT) - return 1;*/ + if (G.f & G_TEXTUREPAINT) + return 1;*/ /* take texture clamping into account */ if (U.glreslimit != 0 && num > U.glreslimit) diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index c0bed18d89b..f6352a96878 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -1218,11 +1218,11 @@ void GPU_pixelbuffer_texture(GPUTexture *tex, GPUPixelBuffer *pb) int i; glBindTexture(GL_TEXTURE_RECTANGLE_EXT, tex->bindcode); - - for (i = 0; i < pb->numbuffers; i++) { + + for (i = 0; i < pb->numbuffers; i++) { glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, pb->bindcode[pb->current]); glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_EXT, pb->datasize, NULL, - GL_STREAM_DRAW_ARB); + GL_STREAM_DRAW_ARB); pixels = glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, GL_WRITE_ONLY); /*memcpy(pixels, _oImage.data(), pb->datasize);*/ diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c index 32dae3c982e..0759d97e69f 100644 --- a/source/blender/imbuf/intern/jpeg.c +++ b/source/blender/imbuf/intern/jpeg.c @@ -95,9 +95,9 @@ int imb_is_a_jpeg(unsigned char *mem) { //---------------------------------------------------------- typedef struct my_error_mgr { - struct jpeg_error_mgr pub; /* "public" fields */ + struct jpeg_error_mgr pub; /* "public" fields */ - jmp_buf setjmp_buffer; /* for return to caller */ + jmp_buf setjmp_buffer; /* for return to caller */ } my_error_mgr; typedef my_error_mgr * my_error_ptr; diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c index e59cf77a871..9bc4ba6776c 100644 --- a/source/blender/imbuf/intern/scaling.c +++ b/source/blender/imbuf/intern/scaling.c @@ -271,7 +271,7 @@ struct ImBuf *IMB_double_fast_y(struct ImBuf *ibuf1) for(x = ibuf2->x ; x>0 ; x--) *dest1++ = *dest2++ = *p1++; dest1 = dest2; } - if (do_float) { + if (do_float) { dest2f = dest1f + (4*ibuf2->x); for(x = ibuf2->x*4 ; x>0 ; x--) *dest1f++ = *dest2f++ = *p1f++; dest1f = dest2f; diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c index 1f2eebbedc0..3e17665fa39 100644 --- a/source/blender/imbuf/intern/thumbs.c +++ b/source/blender/imbuf/intern/thumbs.c @@ -108,19 +108,19 @@ typedef enum { } UnsafeCharacterSet; static const unsigned char acceptable[96] = { - /* A table of the ASCII chars from space (32) to DEL (127) */ - /* ! " # $ % & ' ( ) * + , - . / */ - 0x00,0x3F,0x20,0x20,0x28,0x00,0x2C,0x3F,0x3F,0x3F,0x3F,0x2A,0x28,0x3F,0x3F,0x1C, - /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ - 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x38,0x20,0x20,0x2C,0x20,0x20, - /* @ A B C D E F G H I J K L M N O */ - 0x38,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, - /* P Q R S T U V W X Y Z [ \ ] ^ _ */ - 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x20,0x3F, - /* ` a b c d e f g h i j k l m n o */ - 0x20,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, - /* p q r s t u v w x y z { | } ~ DEL */ - 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x3F,0x20 + /* A table of the ASCII chars from space (32) to DEL (127) */ + /* ! " # $ % & ' ( ) * + , - . / */ + 0x00,0x3F,0x20,0x20,0x28,0x00,0x2C,0x3F,0x3F,0x3F,0x3F,0x2A,0x28,0x3F,0x3F,0x1C, + /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x38,0x20,0x20,0x2C,0x20,0x20, + /* @ A B C D E F G H I J K L M N O */ + 0x38,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, + /* P Q R S T U V W X Y Z [ \ ] ^ _ */ + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x20,0x3F, + /* ` a b c d e f g h i j k l m n o */ + 0x20,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, + /* p q r s t u v w x y z { | } ~ DEL */ + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x3F,0x20 }; static const char hex[17] = "0123456789abcdef"; diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c index 155696fb199..746649e27ca 100644 --- a/source/blender/imbuf/intern/tiff.c +++ b/source/blender/imbuf/intern/tiff.c @@ -605,7 +605,7 @@ void imb_loadtiletiff(ImBuf *ibuf, unsigned char *mem, size_t size, int tx, int return; } - if(TIFFSetDirectory(image, ibuf->miplevel)) { + if(TIFFSetDirectory(image, ibuf->miplevel)) { /* allocate the image buffer */ TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height); diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c index e0e521a81d5..4e9b023b326 100644 --- a/source/blender/makesdna/intern/dna_genfile.c +++ b/source/blender/makesdna/intern/dna_genfile.c @@ -576,33 +576,33 @@ char *DNA_struct_get_compareflags(SDNA *sdna, SDNA *newsdna) /* compare length and amount of elems */ if( spcur[1] == spold[1]) { - if( newsdna->typelens[spcur[0]] == sdna->typelens[spold[0]] ) { - - /* same length, same amount of elems, now per type and name */ - b= spold[1]; - spold+= 2; - spcur+= 2; - while(b > 0) { - str1= newsdna->types[spcur[0]]; - str2= sdna->types[spold[0]]; - if(strcmp(str1, str2)!=0) break; + if( newsdna->typelens[spcur[0]] == sdna->typelens[spold[0]] ) { - str1= newsdna->names[spcur[1]]; - str2= sdna->names[spold[1]]; - if(strcmp(str1, str2)!=0) break; - - /* same type and same name, now pointersize */ - if(ispointer(str1)) { - if(sdna->pointerlen!=newsdna->pointerlen) break; - } - - b--; - spold+= 2; - spcur+= 2; - } - if(b==0) compflags[a]= 1; + /* same length, same amount of elems, now per type and name */ + b= spold[1]; + spold+= 2; + spcur+= 2; + while(b > 0) { + str1= newsdna->types[spcur[0]]; + str2= sdna->types[spold[0]]; + if(strcmp(str1, str2)!=0) break; - } + str1= newsdna->names[spcur[1]]; + str2= sdna->names[spold[1]]; + if(strcmp(str1, str2)!=0) break; + + /* same type and same name, now pointersize */ + if(ispointer(str1)) { + if(sdna->pointerlen!=newsdna->pointerlen) break; + } + + b--; + spold+= 2; + spcur+= 2; + } + if(b==0) compflags[a]= 1; + + } } } diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c index 74857115bc5..f3f79cde617 100644 --- a/source/blender/makesrna/intern/rna_brush.c +++ b/source/blender/makesrna/intern/rna_brush.c @@ -111,7 +111,7 @@ static void rna_Brush_reset_icon(Brush *br, const char *UNUSED(type)) if(id->icon_id >= BIFICONID_LAST) { BKE_icon_delete(id); BKE_previewimg_free_id(id); - } + } id->icon_id = 0; } diff --git a/source/blender/makesrna/intern/rna_controller.c b/source/blender/makesrna/intern/rna_controller.c index 12d27bc80c2..92c762098c7 100644 --- a/source/blender/makesrna/intern/rna_controller.c +++ b/source/blender/makesrna/intern/rna_controller.c @@ -56,24 +56,24 @@ static struct StructRNA* rna_Controller_refine(struct PointerRNA *ptr) bController *controller= (bController*)ptr->data; switch(controller->type) { - case CONT_LOGIC_AND: - return &RNA_AndController; - case CONT_LOGIC_OR: - return &RNA_OrController; - case CONT_LOGIC_NAND: - return &RNA_NandController; - case CONT_LOGIC_NOR: - return &RNA_NorController; - case CONT_LOGIC_XOR: - return &RNA_XorController; - case CONT_LOGIC_XNOR: - return &RNA_XnorController; - case CONT_EXPRESSION: - return &RNA_ExpressionController; - case CONT_PYTHON: - return &RNA_PythonController; - default: - return &RNA_Controller; + case CONT_LOGIC_AND: + return &RNA_AndController; + case CONT_LOGIC_OR: + return &RNA_OrController; + case CONT_LOGIC_NAND: + return &RNA_NandController; + case CONT_LOGIC_NOR: + return &RNA_NorController; + case CONT_LOGIC_XOR: + return &RNA_XorController; + case CONT_LOGIC_XNOR: + return &RNA_XnorController; + case CONT_EXPRESSION: + return &RNA_ExpressionController; + case CONT_PYTHON: + return &RNA_PythonController; + default: + return &RNA_Controller; } } diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c index 091ec073f61..2d5c26199d6 100644 --- a/source/blender/makesrna/intern/rna_image_api.c +++ b/source/blender/makesrna/intern/rna_image_api.c @@ -155,7 +155,7 @@ static int rna_Image_gl_load(Image *image, ReportList *reports, int filter, int ibuf= BKE_image_get_ibuf(image, NULL); - if(ibuf == NULL || ibuf->rect == NULL ) { + if(ibuf == NULL || ibuf->rect == NULL ) { BKE_reportf(reports, RPT_ERROR, "Image \"%s\" does not have any image data", image->id.name+2); return (int)GL_INVALID_OPERATION; } diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 0dd536b64c2..b6d0f77c5a5 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -462,7 +462,7 @@ static bNode *rna_NodeTree_node_new(bNodeTree *ntree, bContext *C, ReportList *r node = nodeAddNodeType(ntree, type, group, NULL); if (node == NULL) { - BKE_reportf(reports, RPT_ERROR, "Unable to create node"); + BKE_reportf(reports, RPT_ERROR, "Unable to create node"); } else { nodeGroupVerify(ntree); /* update group node socket links*/ @@ -1668,8 +1668,8 @@ static void def_cmp_channel_matte(StructRNA *srna) prop = RNA_def_property(srna, "limit_channel", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "channel"); - RNA_def_property_enum_items(prop, prop_tri_channel_items); - RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_channel_itemf"); + RNA_def_property_enum_items(prop, prop_tri_channel_items); + RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_channel_itemf"); RNA_def_property_ui_text(prop, "Limit Channel", "Limit by this channels value"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); @@ -1843,10 +1843,10 @@ static void def_cmp_crop(StructRNA *srna) RNA_def_property_ui_text(prop, "Crop Image Size", "Whether to crop the size of the input image"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "custom2", 1); - RNA_def_property_ui_text(prop, "Relative", "Use relative values to crop image"); - RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + prop = RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "custom2", 1); + RNA_def_property_ui_text(prop, "Relative", "Use relative values to crop image"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); RNA_def_struct_sdna_from(srna, "NodeTwoXYs", "storage"); @@ -1874,29 +1874,29 @@ static void def_cmp_crop(StructRNA *srna) RNA_def_property_ui_text(prop, "Y2", ""); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "rel_min_x", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "fac_x1"); - RNA_def_property_range(prop, 0.0, 1.0); - RNA_def_property_ui_text(prop, "X1", ""); - RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + prop = RNA_def_property(srna, "rel_min_x", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "fac_x1"); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_ui_text(prop, "X1", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "rel_max_x", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "fac_x2"); - RNA_def_property_range(prop, 0.0, 1.0); - RNA_def_property_ui_text(prop, "X2", ""); - RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + prop = RNA_def_property(srna, "rel_max_x", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "fac_x2"); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_ui_text(prop, "X2", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "rel_min_y", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "fac_y1"); - RNA_def_property_range(prop, 0.0, 1.0); - RNA_def_property_ui_text(prop, "Y1", ""); - RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + prop = RNA_def_property(srna, "rel_min_y", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "fac_y1"); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_ui_text(prop, "Y1", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "rel_max_y", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "fac_y2"); - RNA_def_property_range(prop, 0.0, 1.0); - RNA_def_property_ui_text(prop, "Y2", ""); - RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + prop = RNA_def_property(srna, "rel_max_y", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "fac_y2"); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_ui_text(prop, "Y2", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } static void def_cmp_dblur(StructRNA *srna) diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 2a369ba9044..d6af04f2475 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -87,10 +87,10 @@ static Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int int cage = !apply_modifiers; /* perform the mesh extraction based on type */ - switch (ob->type) { - case OB_FONT: - case OB_CURVE: - case OB_SURF: + switch (ob->type) { + case OB_FONT: + case OB_CURVE: + case OB_SURF: /* copies object and modifiers (but not the data) */ tmpobj= copy_object(ob); @@ -130,7 +130,7 @@ static Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int free_libblock_us( &G.main->object, tmpobj ); break; - case OB_MBALL: + case OB_MBALL: /* metaballs don't have modifiers, so just convert to mesh */ ob = find_basis_mball( sce, ob ); /* todo, re-generatre for render-res */ @@ -138,9 +138,9 @@ static Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int tmpmesh = add_mesh("Mesh"); mball_to_mesh( &ob->disp, tmpmesh ); - break; + break; - case OB_MESH: + case OB_MESH: /* copies object and modifiers (but not the data) */ if (cage) { /* copies the data */ @@ -165,10 +165,10 @@ static Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int } break; - default: + default: BKE_report(reports, RPT_ERROR, "Object does not have geometry data"); - return NULL; - } + return NULL; + } /* Copy materials to new mesh */ switch (ob->type) { diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index fe164cbd3c1..9fd5fafc712 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -1092,24 +1092,24 @@ static void rna_def_fluid_settings(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "SPH Fluid Settings", "Settings for particle fluids physics"); /* Fluid settings */ - prop= RNA_def_property(srna, "spring_force", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "spring_force", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "spring_k"); - RNA_def_property_range(prop, 0.0f, 100.0f); + RNA_def_property_range(prop, 0.0f, 100.0f); RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3); - RNA_def_property_ui_text(prop, "Spring Force", "Spring force"); + RNA_def_property_ui_text(prop, "Spring Force", "Spring force"); RNA_def_property_update(prop, 0, "rna_Particle_reset"); - - prop= RNA_def_property(srna, "fluid_radius", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "radius"); - RNA_def_property_range(prop, 0.0f, 20.0f); + + prop= RNA_def_property(srna, "fluid_radius", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "radius"); + RNA_def_property_range(prop, 0.0f, 20.0f); RNA_def_property_ui_range(prop, 0.0f, 2.0f, 1, 3); RNA_def_property_ui_text(prop, "Interaction Radius", "Fluid interaction radius"); - RNA_def_property_update(prop, 0, "rna_Particle_reset"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); - prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, 0.0f, 2.0f); + prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, 0.0f, 2.0f); RNA_def_property_ui_text(prop, "Rest Length", "Spring rest length (factor of particle radius)"); - RNA_def_property_update(prop, 0, "rna_Particle_reset"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); prop= RNA_def_property(srna, "use_viscoelastic_springs", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_VISCOELASTIC_SPRINGS); @@ -1121,70 +1121,70 @@ static void rna_def_fluid_settings(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Initial Rest Length", "Use the initial length as spring rest length instead of 2 * particle size"); RNA_def_property_update(prop, 0, "rna_Particle_reset"); - prop= RNA_def_property(srna, "plasticity", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "plasticity_constant"); - RNA_def_property_range(prop, 0.0f, 100.0f); - RNA_def_property_ui_text(prop, "Plasticity", "How much the spring rest length can change after the elastic limit is crossed"); - RNA_def_property_update(prop, 0, "rna_Particle_reset"); - - prop= RNA_def_property(srna, "yield_ratio", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "yield_ratio"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Elastic Limit", "How much the spring has to be stretched/compressed in order to change it's rest length"); - RNA_def_property_update(prop, 0, "rna_Particle_reset"); - - prop= RNA_def_property(srna, "spring_frames", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 0.0f, 100.0f); - RNA_def_property_ui_text(prop, "Spring Frames", "Create springs for this number of frames since particles birth (0 is always)"); - RNA_def_property_update(prop, 0, "rna_Particle_reset"); - - /* Viscosity */ - prop= RNA_def_property(srna, "linear_viscosity", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "viscosity_omega"); - RNA_def_property_range(prop, 0.0f, 100.0f); - RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3); - RNA_def_property_ui_text(prop, "Viscosity", "Linear viscosity"); + prop= RNA_def_property(srna, "plasticity", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "plasticity_constant"); + RNA_def_property_range(prop, 0.0f, 100.0f); + RNA_def_property_ui_text(prop, "Plasticity", "How much the spring rest length can change after the elastic limit is crossed"); RNA_def_property_update(prop, 0, "rna_Particle_reset"); - - prop= RNA_def_property(srna, "stiff_viscosity", PROP_FLOAT, PROP_NONE); + + prop= RNA_def_property(srna, "yield_ratio", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "yield_ratio"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Elastic Limit", "How much the spring has to be stretched/compressed in order to change it's rest length"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + prop= RNA_def_property(srna, "spring_frames", PROP_INT, PROP_NONE); + RNA_def_property_range(prop, 0.0f, 100.0f); + RNA_def_property_ui_text(prop, "Spring Frames", "Create springs for this number of frames since particles birth (0 is always)"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + /* Viscosity */ + prop= RNA_def_property(srna, "linear_viscosity", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "viscosity_omega"); + RNA_def_property_range(prop, 0.0f, 100.0f); + RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3); + RNA_def_property_ui_text(prop, "Viscosity", "Linear viscosity"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + prop= RNA_def_property(srna, "stiff_viscosity", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "viscosity_beta"); RNA_def_property_range(prop, 0.0f, 100.0f); RNA_def_property_ui_range(prop, 0.0f, 2.0f, 1, 3); - RNA_def_property_ui_text(prop, "Stiff viscosity", "Creates viscosity for expanding fluid)"); - RNA_def_property_update(prop, 0, "rna_Particle_reset"); + RNA_def_property_ui_text(prop, "Stiff viscosity", "Creates viscosity for expanding fluid)"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); /* Double density relaxation */ - prop= RNA_def_property(srna, "stiffness", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "stiffness_k"); - RNA_def_property_range(prop, 0.0f, 100.0f); + prop= RNA_def_property(srna, "stiffness", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "stiffness_k"); + RNA_def_property_range(prop, 0.0f, 100.0f); RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3); - RNA_def_property_ui_text(prop, "Stiffness", "How incompressible the fluid is"); + RNA_def_property_ui_text(prop, "Stiffness", "How incompressible the fluid is"); RNA_def_property_update(prop, 0, "rna_Particle_reset"); - - prop= RNA_def_property(srna, "repulsion", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "stiffness_knear"); + + prop= RNA_def_property(srna, "repulsion", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "stiffness_knear"); RNA_def_property_range(prop, 0.0f, 100.0f); RNA_def_property_ui_range(prop, 0.0f, 2.0f, 1, 3); - RNA_def_property_ui_text(prop, "Repulsion Factor", "How strongly the fluid tries to keep from clustering (factor of stiffness)"); - RNA_def_property_update(prop, 0, "rna_Particle_reset"); - - prop= RNA_def_property(srna, "rest_density", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_text(prop, "Repulsion Factor", "How strongly the fluid tries to keep from clustering (factor of stiffness)"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + + prop= RNA_def_property(srna, "rest_density", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rest_density"); - RNA_def_property_range(prop, 0.0f, 100.0f); + RNA_def_property_range(prop, 0.0f, 100.0f); RNA_def_property_ui_range(prop, 0.0f, 2.0f, 1, 3); - RNA_def_property_ui_text(prop, "Rest Density", "Fluid rest density"); - RNA_def_property_update(prop, 0, "rna_Particle_reset"); - + RNA_def_property_ui_text(prop, "Rest Density", "Fluid rest density"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); + /* Buoyancy */ prop= RNA_def_property(srna, "buoyancy", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "buoyancy"); - RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_float_sdna(prop, NULL, "buoyancy"); + RNA_def_property_range(prop, 0.0f, 10.0f); RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 3); - RNA_def_property_ui_text(prop, "Buoyancy", "Artificial buoyancy force in negative gravity direction based on pressure differences inside the fluid"); - RNA_def_property_update(prop, 0, "rna_Particle_reset"); + RNA_def_property_ui_text(prop, "Buoyancy", "Artificial buoyancy force in negative gravity direction based on pressure differences inside the fluid"); + RNA_def_property_update(prop, 0, "rna_Particle_reset"); /* Factor flags */ - + prop= RNA_def_property(srna, "factor_repulsion", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_FAC_REPULSION); RNA_def_property_ui_text(prop, "Factor Repulsion", "Repulsion is a factor of stiffness"); diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c index 3a34b048aa3..90954fef1c7 100644 --- a/source/blender/modifiers/intern/MOD_array.c +++ b/source/blender/modifiers/intern/MOD_array.c @@ -313,60 +313,60 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, else /* if the offset has no translation, just make one copy */ count = 1; - } + } - if(count < 1) - count = 1; + if(count < 1) + count = 1; /* allocate memory for count duplicates (including original) plus * start and end caps */ - finalVerts = dm->getNumVerts(dm) * count; - finalEdges = dm->getNumEdges(dm) * count; - finalFaces = dm->getNumFaces(dm) * count; - if(start_cap) { - finalVerts += start_cap->getNumVerts(start_cap); - finalEdges += start_cap->getNumEdges(start_cap); - finalFaces += start_cap->getNumFaces(start_cap); - } - if(end_cap) { - finalVerts += end_cap->getNumVerts(end_cap); - finalEdges += end_cap->getNumEdges(end_cap); - finalFaces += end_cap->getNumFaces(end_cap); - } - result = CDDM_from_template(dm, finalVerts, finalEdges, finalFaces); + finalVerts = dm->getNumVerts(dm) * count; + finalEdges = dm->getNumEdges(dm) * count; + finalFaces = dm->getNumFaces(dm) * count; + if(start_cap) { + finalVerts += start_cap->getNumVerts(start_cap); + finalEdges += start_cap->getNumEdges(start_cap); + finalFaces += start_cap->getNumFaces(start_cap); + } + if(end_cap) { + finalVerts += end_cap->getNumVerts(end_cap); + finalEdges += end_cap->getNumEdges(end_cap); + finalFaces += end_cap->getNumFaces(end_cap); + } + result = CDDM_from_template(dm, finalVerts, finalEdges, finalFaces); - /* calculate the offset matrix of the final copy (for merging) */ - unit_m4(final_offset); + /* calculate the offset matrix of the final copy (for merging) */ + unit_m4(final_offset); - for(j=0; j < count - 1; j++) { - mul_m4_m4m4(tmp_mat, final_offset, offset); - copy_m4_m4(final_offset, tmp_mat); - } + for(j=0; j < count - 1; j++) { + mul_m4_m4m4(tmp_mat, final_offset, offset); + copy_m4_m4(final_offset, tmp_mat); + } - numVerts = numEdges = numFaces = 0; - mvert = CDDM_get_verts(result); + numVerts = numEdges = numFaces = 0; + mvert = CDDM_get_verts(result); - for (i = 0; i < maxVerts; i++) { - indexMap[i].merge = -1; /* default to no merge */ - indexMap[i].merge_final = 0; /* default to no merge */ - } + for (i = 0; i < maxVerts; i++) { + indexMap[i].merge = -1; /* default to no merge */ + indexMap[i].merge_final = 0; /* default to no merge */ + } - for (i = 0; i < maxVerts; i++) { - MVert *inMV; - MVert *mv = &mvert[numVerts]; - MVert *mv2; - float co[3]; + for (i = 0; i < maxVerts; i++) { + MVert *inMV; + MVert *mv = &mvert[numVerts]; + MVert *mv2; + float co[3]; - inMV = &src_mvert[i]; + inMV = &src_mvert[i]; - DM_copy_vert_data(dm, result, i, numVerts, 1); - *mv = *inMV; - numVerts++; + DM_copy_vert_data(dm, result, i, numVerts, 1); + *mv = *inMV; + numVerts++; - indexMap[i].new = numVerts - 1; + indexMap[i].new = numVerts - 1; - copy_v3_v3(co, mv->co); + copy_v3_v3(co, mv->co); /* Attempts to merge verts from one duplicate with verts from the * next duplicate which are closer than amd->merge_dist. @@ -374,405 +374,405 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd, * If verts are merged in the first duplicate pair, they are merged * in all pairs. */ - if((count > 1) && (amd->flags & MOD_ARR_MERGE)) { - float tmp_co[3]; - mul_v3_m4v3(tmp_co, offset, mv->co); + if((count > 1) && (amd->flags & MOD_ARR_MERGE)) { + float tmp_co[3]; + mul_v3_m4v3(tmp_co, offset, mv->co); - for(j = 0; j < maxVerts; j++) { - /* if vertex already merged, don't use it */ - if( indexMap[j].merge != -1 ) continue; + for(j = 0; j < maxVerts; j++) { + /* if vertex already merged, don't use it */ + if( indexMap[j].merge != -1 ) continue; - inMV = &src_mvert[j]; - /* if this vert is within merge limit, merge */ - if(compare_len_v3v3(tmp_co, inMV->co, amd->merge_dist)) { - indexMap[i].merge = j; + inMV = &src_mvert[j]; + /* if this vert is within merge limit, merge */ + if(compare_len_v3v3(tmp_co, inMV->co, amd->merge_dist)) { + indexMap[i].merge = j; - /* test for merging with final copy of merge target */ - if(amd->flags & MOD_ARR_MERGEFINAL) { - copy_v3_v3(tmp_co, inMV->co); - inMV = &src_mvert[i]; - mul_m4_v3(final_offset, tmp_co); - if(compare_len_v3v3(tmp_co, inMV->co, amd->merge_dist)) - indexMap[i].merge_final = 1; - } - break; - } - } - } + /* test for merging with final copy of merge target */ + if(amd->flags & MOD_ARR_MERGEFINAL) { + copy_v3_v3(tmp_co, inMV->co); + inMV = &src_mvert[i]; + mul_m4_v3(final_offset, tmp_co); + if(compare_len_v3v3(tmp_co, inMV->co, amd->merge_dist)) + indexMap[i].merge_final = 1; + } + break; + } + } + } - /* if no merging, generate copies of this vert */ - if(indexMap[i].merge < 0) { - for(j=0; j < count - 1; j++) { - mv2 = &mvert[numVerts]; + /* if no merging, generate copies of this vert */ + if(indexMap[i].merge < 0) { + for(j=0; j < count - 1; j++) { + mv2 = &mvert[numVerts]; - DM_copy_vert_data(result, result, numVerts - 1, numVerts, 1); - *mv2 = *mv; - numVerts++; + DM_copy_vert_data(result, result, numVerts - 1, numVerts, 1); + *mv2 = *mv; + numVerts++; - mul_m4_v3(offset, co); - copy_v3_v3(mv2->co, co); - } - } else if(indexMap[i].merge != i && indexMap[i].merge_final) { + mul_m4_v3(offset, co); + copy_v3_v3(mv2->co, co); + } + } else if(indexMap[i].merge != i && indexMap[i].merge_final) { /* if this vert is not merging with itself, and it is merging * with the final copy of its merge target, remove the first copy */ - numVerts--; - DM_free_vert_data(result, numVerts, 1); - } - } + numVerts--; + DM_free_vert_data(result, numVerts, 1); + } + } - /* make a hashtable so we can avoid duplicate edges from merging */ - edges = BLI_edgehash_new(); + /* make a hashtable so we can avoid duplicate edges from merging */ + edges = BLI_edgehash_new(); - maxEdges = dm->getNumEdges(dm); - medge = CDDM_get_edges(result); - for(i = 0; i < maxEdges; i++) { - MEdge inMED; - MEdge med; - MEdge *med2; - int vert1, vert2; + maxEdges = dm->getNumEdges(dm); + medge = CDDM_get_edges(result); + for(i = 0; i < maxEdges; i++) { + MEdge inMED; + MEdge med; + MEdge *med2; + int vert1, vert2; - dm->getEdge(dm, i, &inMED); + dm->getEdge(dm, i, &inMED); - med = inMED; - med.v1 = indexMap[inMED.v1].new; - med.v2 = indexMap[inMED.v2].new; + med = inMED; + med.v1 = indexMap[inMED.v1].new; + med.v2 = indexMap[inMED.v2].new; /* if vertices are to be merged with the final copies of their * merge targets, calculate that final copy */ - if(indexMap[inMED.v1].merge_final) { - med.v1 = calc_mapping(indexMap, indexMap[inMED.v1].merge, - count - 1); - } - if(indexMap[inMED.v2].merge_final) { - med.v2 = calc_mapping(indexMap, indexMap[inMED.v2].merge, - count - 1); - } + if(indexMap[inMED.v1].merge_final) { + med.v1 = calc_mapping(indexMap, indexMap[inMED.v1].merge, + count - 1); + } + if(indexMap[inMED.v2].merge_final) { + med.v2 = calc_mapping(indexMap, indexMap[inMED.v2].merge, + count - 1); + } - if(med.v1 == med.v2) continue; - - /* XXX Unfortunately the calc_mapping returns sometimes numVerts... leads to bad crashes */ - if(med.v1 >= numVerts) - med.v1= numVerts-1; - if(med.v2 >= numVerts) - med.v2= numVerts-1; - - if (initFlags) { - med.flag |= ME_EDGEDRAW | ME_EDGERENDER; - } + if(med.v1 == med.v2) continue; - if(!BLI_edgehash_haskey(edges, med.v1, med.v2)) { - DM_copy_edge_data(dm, result, i, numEdges, 1); - medge[numEdges] = med; - numEdges++; + /* XXX Unfortunately the calc_mapping returns sometimes numVerts... leads to bad crashes */ + if(med.v1 >= numVerts) + med.v1= numVerts-1; + if(med.v2 >= numVerts) + med.v2= numVerts-1; - BLI_edgehash_insert(edges, med.v1, med.v2, NULL); - } + if (initFlags) { + med.flag |= ME_EDGEDRAW | ME_EDGERENDER; + } - for(j = 1; j < count; j++) - { - vert1 = calc_mapping(indexMap, inMED.v1, j); - vert2 = calc_mapping(indexMap, inMED.v2, j); - - /* edge could collapse to single point after mapping */ - if(vert1 == vert2) continue; - - /* XXX Unfortunately the calc_mapping returns sometimes numVerts... leads to bad crashes */ - if(vert1 >= numVerts) - vert1= numVerts-1; - if(vert2 >= numVerts) - vert2= numVerts-1; + if(!BLI_edgehash_haskey(edges, med.v1, med.v2)) { + DM_copy_edge_data(dm, result, i, numEdges, 1); + medge[numEdges] = med; + numEdges++; - /* avoid duplicate edges */ - if(!BLI_edgehash_haskey(edges, vert1, vert2)) { - med2 = &medge[numEdges]; + BLI_edgehash_insert(edges, med.v1, med.v2, NULL); + } - DM_copy_edge_data(dm, result, i, numEdges, 1); - *med2 = med; - numEdges++; + for(j = 1; j < count; j++) + { + vert1 = calc_mapping(indexMap, inMED.v1, j); + vert2 = calc_mapping(indexMap, inMED.v2, j); - med2->v1 = vert1; - med2->v2 = vert2; + /* edge could collapse to single point after mapping */ + if(vert1 == vert2) continue; - BLI_edgehash_insert(edges, med2->v1, med2->v2, NULL); - } - } - } + /* XXX Unfortunately the calc_mapping returns sometimes numVerts... leads to bad crashes */ + if(vert1 >= numVerts) + vert1= numVerts-1; + if(vert2 >= numVerts) + vert2= numVerts-1; - maxFaces = dm->getNumFaces(dm); - mface = CDDM_get_faces(result); - for (i=0; i < maxFaces; i++) { - MFace inMF; - MFace *mf = &mface[numFaces]; + /* avoid duplicate edges */ + if(!BLI_edgehash_haskey(edges, vert1, vert2)) { + med2 = &medge[numEdges]; - dm->getFace(dm, i, &inMF); + DM_copy_edge_data(dm, result, i, numEdges, 1); + *med2 = med; + numEdges++; - DM_copy_face_data(dm, result, i, numFaces, 1); - *mf = inMF; + med2->v1 = vert1; + med2->v2 = vert2; - mf->v1 = indexMap[inMF.v1].new; - mf->v2 = indexMap[inMF.v2].new; - mf->v3 = indexMap[inMF.v3].new; - if(inMF.v4) - mf->v4 = indexMap[inMF.v4].new; + BLI_edgehash_insert(edges, med2->v1, med2->v2, NULL); + } + } + } + + maxFaces = dm->getNumFaces(dm); + mface = CDDM_get_faces(result); + for (i=0; i < maxFaces; i++) { + MFace inMF; + MFace *mf = &mface[numFaces]; + + dm->getFace(dm, i, &inMF); + + DM_copy_face_data(dm, result, i, numFaces, 1); + *mf = inMF; + + mf->v1 = indexMap[inMF.v1].new; + mf->v2 = indexMap[inMF.v2].new; + mf->v3 = indexMap[inMF.v3].new; + if(inMF.v4) + mf->v4 = indexMap[inMF.v4].new; /* if vertices are to be merged with the final copies of their * merge targets, calculate that final copy */ - if(indexMap[inMF.v1].merge_final) - mf->v1 = calc_mapping(indexMap, indexMap[inMF.v1].merge, count-1); - if(indexMap[inMF.v2].merge_final) - mf->v2 = calc_mapping(indexMap, indexMap[inMF.v2].merge, count-1); - if(indexMap[inMF.v3].merge_final) - mf->v3 = calc_mapping(indexMap, indexMap[inMF.v3].merge, count-1); - if(inMF.v4 && indexMap[inMF.v4].merge_final) - mf->v4 = calc_mapping(indexMap, indexMap[inMF.v4].merge, count-1); + if(indexMap[inMF.v1].merge_final) + mf->v1 = calc_mapping(indexMap, indexMap[inMF.v1].merge, count-1); + if(indexMap[inMF.v2].merge_final) + mf->v2 = calc_mapping(indexMap, indexMap[inMF.v2].merge, count-1); + if(indexMap[inMF.v3].merge_final) + mf->v3 = calc_mapping(indexMap, indexMap[inMF.v3].merge, count-1); + if(inMF.v4 && indexMap[inMF.v4].merge_final) + mf->v4 = calc_mapping(indexMap, indexMap[inMF.v4].merge, count-1); - if(test_index_face_maxvert(mf, &result->faceData, numFaces, inMF.v4?4:3, numVerts) < 3) - continue; + if(test_index_face_maxvert(mf, &result->faceData, numFaces, inMF.v4?4:3, numVerts) < 3) + continue; - numFaces++; + numFaces++; - /* if the face has fewer than 3 vertices, don't create it */ - if(mf->v3 == 0 || (mf->v1 && (mf->v1 == mf->v3 || mf->v1 == mf->v4))) { - numFaces--; - DM_free_face_data(result, numFaces, 1); - } + /* if the face has fewer than 3 vertices, don't create it */ + if(mf->v3 == 0 || (mf->v1 && (mf->v1 == mf->v3 || mf->v1 == mf->v4))) { + numFaces--; + DM_free_face_data(result, numFaces, 1); + } - for(j = 1; j < count; j++) - { - MFace *mf2 = &mface[numFaces]; + for(j = 1; j < count; j++) + { + MFace *mf2 = &mface[numFaces]; - DM_copy_face_data(dm, result, i, numFaces, 1); - *mf2 = *mf; + DM_copy_face_data(dm, result, i, numFaces, 1); + *mf2 = *mf; - mf2->v1 = calc_mapping(indexMap, inMF.v1, j); - mf2->v2 = calc_mapping(indexMap, inMF.v2, j); - mf2->v3 = calc_mapping(indexMap, inMF.v3, j); - if (inMF.v4) - mf2->v4 = calc_mapping(indexMap, inMF.v4, j); + mf2->v1 = calc_mapping(indexMap, inMF.v1, j); + mf2->v2 = calc_mapping(indexMap, inMF.v2, j); + mf2->v3 = calc_mapping(indexMap, inMF.v3, j); + if (inMF.v4) + mf2->v4 = calc_mapping(indexMap, inMF.v4, j); - numFaces++; + numFaces++; - /* if the face has fewer than 3 vertices, don't create it */ - if(test_index_face_maxvert(mf2, &result->faceData, numFaces-1, inMF.v4?4:3, numVerts) < 3) { - numFaces--; - DM_free_face_data(result, numFaces, 1); - } - } - } + /* if the face has fewer than 3 vertices, don't create it */ + if(test_index_face_maxvert(mf2, &result->faceData, numFaces-1, inMF.v4?4:3, numVerts) < 3) { + numFaces--; + DM_free_face_data(result, numFaces, 1); + } + } + } - /* add start and end caps */ - if(start_cap) { - float startoffset[4][4]; - MVert *cap_mvert; - MEdge *cap_medge; - MFace *cap_mface; - int *origindex; - int *vert_map; - int capVerts, capEdges, capFaces; + /* add start and end caps */ + if(start_cap) { + float startoffset[4][4]; + MVert *cap_mvert; + MEdge *cap_medge; + MFace *cap_mface; + int *origindex; + int *vert_map; + int capVerts, capEdges, capFaces; - capVerts = start_cap->getNumVerts(start_cap); - capEdges = start_cap->getNumEdges(start_cap); - capFaces = start_cap->getNumFaces(start_cap); - cap_mvert = start_cap->getVertArray(start_cap); - cap_medge = start_cap->getEdgeArray(start_cap); - cap_mface = start_cap->getFaceArray(start_cap); + capVerts = start_cap->getNumVerts(start_cap); + capEdges = start_cap->getNumEdges(start_cap); + capFaces = start_cap->getNumFaces(start_cap); + cap_mvert = start_cap->getVertArray(start_cap); + cap_medge = start_cap->getEdgeArray(start_cap); + cap_mface = start_cap->getFaceArray(start_cap); - invert_m4_m4(startoffset, offset); + invert_m4_m4(startoffset, offset); - vert_map = MEM_callocN(sizeof(*vert_map) * capVerts, - "arrayModifier_doArray vert_map"); + vert_map = MEM_callocN(sizeof(*vert_map) * capVerts, + "arrayModifier_doArray vert_map"); - origindex = result->getVertDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capVerts; i++) { - MVert *mv = &cap_mvert[i]; - short merged = 0; + origindex = result->getVertDataArray(result, CD_ORIGINDEX); + for(i = 0; i < capVerts; i++) { + MVert *mv = &cap_mvert[i]; + short merged = 0; - if(amd->flags & MOD_ARR_MERGE) { - float tmp_co[3]; - MVert *in_mv; - int j; + if(amd->flags & MOD_ARR_MERGE) { + float tmp_co[3]; + MVert *in_mv; + int j; - copy_v3_v3(tmp_co, mv->co); - mul_m4_v3(startoffset, tmp_co); + copy_v3_v3(tmp_co, mv->co); + mul_m4_v3(startoffset, tmp_co); - for(j = 0; j < maxVerts; j++) { - in_mv = &src_mvert[j]; - /* if this vert is within merge limit, merge */ - if(compare_len_v3v3(tmp_co, in_mv->co, amd->merge_dist)) { - vert_map[i] = calc_mapping(indexMap, j, 0); - merged = 1; - break; - } - } - } + for(j = 0; j < maxVerts; j++) { + in_mv = &src_mvert[j]; + /* if this vert is within merge limit, merge */ + if(compare_len_v3v3(tmp_co, in_mv->co, amd->merge_dist)) { + vert_map[i] = calc_mapping(indexMap, j, 0); + merged = 1; + break; + } + } + } - if(!merged) { - DM_copy_vert_data(start_cap, result, i, numVerts, 1); - mvert[numVerts] = *mv; - mul_m4_v3(startoffset, mvert[numVerts].co); - origindex[numVerts] = ORIGINDEX_NONE; + if(!merged) { + DM_copy_vert_data(start_cap, result, i, numVerts, 1); + mvert[numVerts] = *mv; + mul_m4_v3(startoffset, mvert[numVerts].co); + origindex[numVerts] = ORIGINDEX_NONE; - vert_map[i] = numVerts; + vert_map[i] = numVerts; - numVerts++; - } - } - origindex = result->getEdgeDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capEdges; i++) { - int v1, v2; + numVerts++; + } + } + origindex = result->getEdgeDataArray(result, CD_ORIGINDEX); + for(i = 0; i < capEdges; i++) { + int v1, v2; - v1 = vert_map[cap_medge[i].v1]; - v2 = vert_map[cap_medge[i].v2]; + v1 = vert_map[cap_medge[i].v1]; + v2 = vert_map[cap_medge[i].v2]; - if(!BLI_edgehash_haskey(edges, v1, v2)) { - DM_copy_edge_data(start_cap, result, i, numEdges, 1); - medge[numEdges] = cap_medge[i]; - medge[numEdges].v1 = v1; - medge[numEdges].v2 = v2; - origindex[numEdges] = ORIGINDEX_NONE; + if(!BLI_edgehash_haskey(edges, v1, v2)) { + DM_copy_edge_data(start_cap, result, i, numEdges, 1); + medge[numEdges] = cap_medge[i]; + medge[numEdges].v1 = v1; + medge[numEdges].v2 = v2; + origindex[numEdges] = ORIGINDEX_NONE; - numEdges++; - } - } - origindex = result->getFaceDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capFaces; i++) { - DM_copy_face_data(start_cap, result, i, numFaces, 1); - mface[numFaces] = cap_mface[i]; - mface[numFaces].v1 = vert_map[mface[numFaces].v1]; - mface[numFaces].v2 = vert_map[mface[numFaces].v2]; - mface[numFaces].v3 = vert_map[mface[numFaces].v3]; - if(mface[numFaces].v4) { - mface[numFaces].v4 = vert_map[mface[numFaces].v4]; + numEdges++; + } + } + origindex = result->getFaceDataArray(result, CD_ORIGINDEX); + for(i = 0; i < capFaces; i++) { + DM_copy_face_data(start_cap, result, i, numFaces, 1); + mface[numFaces] = cap_mface[i]; + mface[numFaces].v1 = vert_map[mface[numFaces].v1]; + mface[numFaces].v2 = vert_map[mface[numFaces].v2]; + mface[numFaces].v3 = vert_map[mface[numFaces].v3]; + if(mface[numFaces].v4) { + mface[numFaces].v4 = vert_map[mface[numFaces].v4]; - test_index_face_maxvert(&mface[numFaces], &result->faceData, - numFaces, 4, numVerts); - } - else - { - test_index_face(&mface[numFaces], &result->faceData, - numFaces, 3); - } + test_index_face_maxvert(&mface[numFaces], &result->faceData, + numFaces, 4, numVerts); + } + else + { + test_index_face(&mface[numFaces], &result->faceData, + numFaces, 3); + } - origindex[numFaces] = ORIGINDEX_NONE; + origindex[numFaces] = ORIGINDEX_NONE; - numFaces++; - } + numFaces++; + } - MEM_freeN(vert_map); - start_cap->release(start_cap); - } + MEM_freeN(vert_map); + start_cap->release(start_cap); + } - if(end_cap) { - float endoffset[4][4]; - MVert *cap_mvert; - MEdge *cap_medge; - MFace *cap_mface; - int *origindex; - int *vert_map; - int capVerts, capEdges, capFaces; + if(end_cap) { + float endoffset[4][4]; + MVert *cap_mvert; + MEdge *cap_medge; + MFace *cap_mface; + int *origindex; + int *vert_map; + int capVerts, capEdges, capFaces; - capVerts = end_cap->getNumVerts(end_cap); - capEdges = end_cap->getNumEdges(end_cap); - capFaces = end_cap->getNumFaces(end_cap); - cap_mvert = end_cap->getVertArray(end_cap); - cap_medge = end_cap->getEdgeArray(end_cap); - cap_mface = end_cap->getFaceArray(end_cap); + capVerts = end_cap->getNumVerts(end_cap); + capEdges = end_cap->getNumEdges(end_cap); + capFaces = end_cap->getNumFaces(end_cap); + cap_mvert = end_cap->getVertArray(end_cap); + cap_medge = end_cap->getEdgeArray(end_cap); + cap_mface = end_cap->getFaceArray(end_cap); - mul_m4_m4m4(endoffset, final_offset, offset); + mul_m4_m4m4(endoffset, final_offset, offset); - vert_map = MEM_callocN(sizeof(*vert_map) * capVerts, - "arrayModifier_doArray vert_map"); + vert_map = MEM_callocN(sizeof(*vert_map) * capVerts, + "arrayModifier_doArray vert_map"); - origindex = result->getVertDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capVerts; i++) { - MVert *mv = &cap_mvert[i]; - short merged = 0; + origindex = result->getVertDataArray(result, CD_ORIGINDEX); + for(i = 0; i < capVerts; i++) { + MVert *mv = &cap_mvert[i]; + short merged = 0; - if(amd->flags & MOD_ARR_MERGE) { - float tmp_co[3]; - MVert *in_mv; - int j; + if(amd->flags & MOD_ARR_MERGE) { + float tmp_co[3]; + MVert *in_mv; + int j; - copy_v3_v3(tmp_co, mv->co); - mul_m4_v3(offset, tmp_co); + copy_v3_v3(tmp_co, mv->co); + mul_m4_v3(offset, tmp_co); - for(j = 0; j < maxVerts; j++) { - in_mv = &src_mvert[j]; - /* if this vert is within merge limit, merge */ - if(compare_len_v3v3(tmp_co, in_mv->co, amd->merge_dist)) { - vert_map[i] = calc_mapping(indexMap, j, count - 1); - merged = 1; - break; - } - } - } + for(j = 0; j < maxVerts; j++) { + in_mv = &src_mvert[j]; + /* if this vert is within merge limit, merge */ + if(compare_len_v3v3(tmp_co, in_mv->co, amd->merge_dist)) { + vert_map[i] = calc_mapping(indexMap, j, count - 1); + merged = 1; + break; + } + } + } - if(!merged) { - DM_copy_vert_data(end_cap, result, i, numVerts, 1); - mvert[numVerts] = *mv; - mul_m4_v3(endoffset, mvert[numVerts].co); - origindex[numVerts] = ORIGINDEX_NONE; + if(!merged) { + DM_copy_vert_data(end_cap, result, i, numVerts, 1); + mvert[numVerts] = *mv; + mul_m4_v3(endoffset, mvert[numVerts].co); + origindex[numVerts] = ORIGINDEX_NONE; - vert_map[i] = numVerts; + vert_map[i] = numVerts; - numVerts++; - } - } - origindex = result->getEdgeDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capEdges; i++) { - int v1, v2; + numVerts++; + } + } + origindex = result->getEdgeDataArray(result, CD_ORIGINDEX); + for(i = 0; i < capEdges; i++) { + int v1, v2; - v1 = vert_map[cap_medge[i].v1]; - v2 = vert_map[cap_medge[i].v2]; + v1 = vert_map[cap_medge[i].v1]; + v2 = vert_map[cap_medge[i].v2]; - if(!BLI_edgehash_haskey(edges, v1, v2)) { - DM_copy_edge_data(end_cap, result, i, numEdges, 1); - medge[numEdges] = cap_medge[i]; - medge[numEdges].v1 = v1; - medge[numEdges].v2 = v2; - origindex[numEdges] = ORIGINDEX_NONE; + if(!BLI_edgehash_haskey(edges, v1, v2)) { + DM_copy_edge_data(end_cap, result, i, numEdges, 1); + medge[numEdges] = cap_medge[i]; + medge[numEdges].v1 = v1; + medge[numEdges].v2 = v2; + origindex[numEdges] = ORIGINDEX_NONE; - numEdges++; - } - } - origindex = result->getFaceDataArray(result, CD_ORIGINDEX); - for(i = 0; i < capFaces; i++) { - DM_copy_face_data(end_cap, result, i, numFaces, 1); - mface[numFaces] = cap_mface[i]; - mface[numFaces].v1 = vert_map[mface[numFaces].v1]; - mface[numFaces].v2 = vert_map[mface[numFaces].v2]; - mface[numFaces].v3 = vert_map[mface[numFaces].v3]; - if(mface[numFaces].v4) { - mface[numFaces].v4 = vert_map[mface[numFaces].v4]; + numEdges++; + } + } + origindex = result->getFaceDataArray(result, CD_ORIGINDEX); + for(i = 0; i < capFaces; i++) { + DM_copy_face_data(end_cap, result, i, numFaces, 1); + mface[numFaces] = cap_mface[i]; + mface[numFaces].v1 = vert_map[mface[numFaces].v1]; + mface[numFaces].v2 = vert_map[mface[numFaces].v2]; + mface[numFaces].v3 = vert_map[mface[numFaces].v3]; + if(mface[numFaces].v4) { + mface[numFaces].v4 = vert_map[mface[numFaces].v4]; - test_index_face(&mface[numFaces], &result->faceData, - numFaces, 4); - } - else - { - test_index_face(&mface[numFaces], &result->faceData, - numFaces, 3); - } - origindex[numFaces] = ORIGINDEX_NONE; + test_index_face(&mface[numFaces], &result->faceData, + numFaces, 4); + } + else + { + test_index_face(&mface[numFaces], &result->faceData, + numFaces, 3); + } + origindex[numFaces] = ORIGINDEX_NONE; - numFaces++; - } + numFaces++; + } - MEM_freeN(vert_map); - end_cap->release(end_cap); - } + MEM_freeN(vert_map); + end_cap->release(end_cap); + } - BLI_edgehash_free(edges, NULL); - MEM_freeN(indexMap); + BLI_edgehash_free(edges, NULL); + MEM_freeN(indexMap); - CDDM_lower_num_verts(result, numVerts); - CDDM_lower_num_edges(result, numEdges); - CDDM_lower_num_faces(result, numFaces); + CDDM_lower_num_verts(result, numVerts); + CDDM_lower_num_edges(result, numEdges); + CDDM_lower_num_faces(result, numFaces); - return result; + return result; } static DerivedMesh *applyModifier(ModifierData *md, Object *ob, diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c index 1cf67ac8cae..e293be5886d 100644 --- a/source/blender/modifiers/intern/MOD_build.c +++ b/source/blender/modifiers/intern/MOD_build.c @@ -212,17 +212,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, !BLI_ghashIterator_isDone(hashIter); BLI_ghashIterator_step(hashIter) ) { - MVert source; - MVert *dest; - int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); - int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); + MVert source; + MVert *dest; + int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); + int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); - dm->getVert(dm, oldIndex, &source); - dest = CDDM_get_vert(result, newIndex); + dm->getVert(dm, oldIndex, &source); + dest = CDDM_get_vert(result, newIndex); - DM_copy_vert_data(dm, result, oldIndex, newIndex, 1); - *dest = source; - } + DM_copy_vert_data(dm, result, oldIndex, newIndex, 1); + *dest = source; + } BLI_ghashIterator_free(hashIter); /* copy the edges across, remapping indices */ diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c index 09e29d9ed8e..22ba1447d20 100644 --- a/source/blender/modifiers/intern/MOD_edgesplit.c +++ b/source/blender/modifiers/intern/MOD_edgesplit.c @@ -175,11 +175,11 @@ static SmoothMesh *smoothmesh_new(int num_verts, int num_edges, int num_faces, { SmoothMesh *mesh = MEM_callocN(sizeof(*mesh), "smoothmesh"); mesh->verts = MEM_callocN(sizeof(*mesh->verts) * max_verts, - "SmoothMesh.verts"); + "SmoothMesh.verts"); mesh->edges = MEM_callocN(sizeof(*mesh->edges) * max_edges, - "SmoothMesh.edges"); + "SmoothMesh.edges"); mesh->faces = MEM_callocN(sizeof(*mesh->faces) * max_faces, - "SmoothMesh.faces"); + "SmoothMesh.faces"); mesh->num_verts = num_verts; mesh->num_edges = num_edges; @@ -280,8 +280,8 @@ static void smoothmesh_print(SmoothMesh *mesh) dm->getVert(dm, vert->oldIndex, &mv); printf("%3d: ind={%3d, %3d}, pos={% 5.1f, % 5.1f, % 5.1f}", - i, vert->oldIndex, vert->newIndex, - mv.co[0], mv.co[1], mv.co[2]); + i, vert->oldIndex, vert->newIndex, + mv.co[0], mv.co[1], mv.co[2]); printf(", faces={"); for(node = vert->faces; node != NULL; node = node->next) { printf(" %d", ((SmoothFace *)node->link)->newIndex); @@ -296,8 +296,8 @@ static void smoothmesh_print(SmoothMesh *mesh) printf("%4d: indices={%4d, %4d}, verts={%4d, %4d}", i, - edge->oldIndex, edge->newIndex, - edge->verts[0]->newIndex, edge->verts[1]->newIndex); + edge->oldIndex, edge->newIndex, + edge->verts[0]->newIndex, edge->verts[1]->newIndex); if(edge->verts[0] == edge->verts[1]) printf(" <- DUPLICATE VERTEX"); printf(", faces={"); for(node = edge->faces; node != NULL; node = node->next) { @@ -311,7 +311,7 @@ static void smoothmesh_print(SmoothMesh *mesh) SmoothFace *face = &mesh->faces[i]; printf("%4d: indices={%4d, %4d}, edges={", i, - face->oldIndex, face->newIndex); + face->oldIndex, face->newIndex); for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) { if(face->flip[j]) printf(" -%-2d", face->edges[j]->newIndex); @@ -339,7 +339,7 @@ static SmoothMesh *smoothmesh_from_derivedmesh(DerivedMesh *dm) totface = dm->getNumFaces(dm); mesh = smoothmesh_new(totvert, totedge, totface, - totvert, totedge, totface); + totvert, totedge, totface); mesh->dm = dm; @@ -410,8 +410,8 @@ static DerivedMesh *CDDM_from_smoothmesh(SmoothMesh *mesh) { DerivedMesh *result = CDDM_from_template(mesh->dm, mesh->num_verts, - mesh->num_edges, - mesh->num_faces); + mesh->num_edges, + mesh->num_faces); MVert *new_verts = CDDM_get_verts(result); MEdge *new_edges = CDDM_get_edges(result); MFace *new_faces = CDDM_get_faces(result); @@ -422,7 +422,7 @@ static DerivedMesh *CDDM_from_smoothmesh(SmoothMesh *mesh) MVert *newMV = &new_verts[vert->newIndex]; DM_copy_vert_data(mesh->dm, result, - vert->oldIndex, vert->newIndex, 1); + vert->oldIndex, vert->newIndex, 1); mesh->dm->getVert(mesh->dm, vert->oldIndex, newMV); } @@ -431,7 +431,7 @@ static DerivedMesh *CDDM_from_smoothmesh(SmoothMesh *mesh) MEdge *newME = &new_edges[edge->newIndex]; DM_copy_edge_data(mesh->dm, result, - edge->oldIndex, edge->newIndex, 1); + edge->oldIndex, edge->newIndex, 1); mesh->dm->getEdge(mesh->dm, edge->oldIndex, newME); newME->v1 = edge->verts[0]->newIndex; newME->v2 = edge->verts[1]->newIndex; @@ -442,7 +442,7 @@ static DerivedMesh *CDDM_from_smoothmesh(SmoothMesh *mesh) MFace *newMF = &new_faces[face->newIndex]; DM_copy_face_data(mesh->dm, result, - face->oldIndex, face->newIndex, 1); + face->oldIndex, face->newIndex, 1); mesh->dm->getFace(mesh->dm, face->oldIndex, newMF); newMF->v1 = face->edges[0]->verts[face->flip[0]]->newIndex; @@ -666,7 +666,7 @@ static void edge_replace_vert(void *ptr, void *userdata) #ifdef EDGESPLIT_DEBUG_3 printf("replacing vert %4d with %4d in edge %4d", - find->newIndex, replace->newIndex, edge->newIndex); + find->newIndex, replace->newIndex, edge->newIndex); printf(": {%4d, %4d}", edge->verts[0]->newIndex, edge->verts[1]->newIndex); #endif @@ -702,15 +702,15 @@ static void face_replace_edge(void *ptr, void *userdata) #ifdef EDGESPLIT_DEBUG_3 printf("replacing edge %4d with %4d in face %4d", - find->newIndex, replace->newIndex, face->newIndex); + find->newIndex, replace->newIndex, face->newIndex); if(face->edges[3]) printf(": {%2d %2d %2d %2d}", - face->edges[0]->newIndex, face->edges[1]->newIndex, - face->edges[2]->newIndex, face->edges[3]->newIndex); + face->edges[0]->newIndex, face->edges[1]->newIndex, + face->edges[2]->newIndex, face->edges[3]->newIndex); else printf(": {%2d %2d %2d}", - face->edges[0]->newIndex, face->edges[1]->newIndex, - face->edges[2]->newIndex); + face->edges[0]->newIndex, face->edges[1]->newIndex, + face->edges[2]->newIndex); #endif for(i = 0; i < SMOOTHFACE_MAX_EDGES && face->edges[i]; i++) { @@ -724,12 +724,12 @@ static void face_replace_edge(void *ptr, void *userdata) #ifdef EDGESPLIT_DEBUG_3 if(face->edges[3]) printf(" -> {%2d %2d %2d %2d}\n", - face->edges[0]->newIndex, face->edges[1]->newIndex, - face->edges[2]->newIndex, face->edges[3]->newIndex); + face->edges[0]->newIndex, face->edges[1]->newIndex, + face->edges[2]->newIndex, face->edges[3]->newIndex); else printf(" -> {%2d %2d %2d}\n", - face->edges[0]->newIndex, face->edges[1]->newIndex, - face->edges[2]->newIndex); + face->edges[0]->newIndex, face->edges[1]->newIndex, + face->edges[2]->newIndex); #endif } @@ -776,7 +776,7 @@ static SmoothEdge *find_other_sharp_edge(SmoothVert *vert, SmoothEdge *edge, Lin LinkNode *visited_edges = NULL; #ifdef EDGESPLIT_DEBUG_1 printf("=== START === find_other_sharp_edge(edge = %4d, vert = %4d)\n", - edge->newIndex, vert->newIndex); + edge->newIndex, vert->newIndex); #endif /* get a face on which to start */ @@ -800,7 +800,7 @@ static SmoothEdge *find_other_sharp_edge(SmoothVert *vert, SmoothEdge *edge, Lin && !linklist_contains(visited_edges, edge2)) { #ifdef EDGESPLIT_DEBUG_3 printf("current face %4d; current edge %4d\n", face->newIndex, - edge2->newIndex); + edge2->newIndex); #endif /* get the next face */ face = other_face(edge2, face); @@ -818,26 +818,26 @@ static SmoothEdge *find_other_sharp_edge(SmoothVert *vert, SmoothEdge *edge, Lin edge2 = other_edge(face, vert, edge2); #ifdef EDGESPLIT_DEBUG_3 printf("next face %4d; next edge %4d\n", - face->newIndex, edge2->newIndex); + face->newIndex, edge2->newIndex); } else { printf("loose edge: %4d\n", edge2->newIndex); #endif } - } + } - /* either we came back to the start edge or we found a sharp/loose edge */ - if(linklist_contains(visited_edges, edge2)) - /* we came back to the start edge */ - edge2 = NULL; + /* either we came back to the start edge or we found a sharp/loose edge */ + if(linklist_contains(visited_edges, edge2)) + /* we came back to the start edge */ + edge2 = NULL; - BLI_linklist_free(visited_edges, NULL); + BLI_linklist_free(visited_edges, NULL); #ifdef EDGESPLIT_DEBUG_1 - printf("=== END === find_other_sharp_edge(edge = %4d, vert = %4d), " - "returning edge %d\n", - edge->newIndex, vert->newIndex, edge2 ? edge2->newIndex : -1); + printf("=== END === find_other_sharp_edge(edge = %4d, vert = %4d), " + "returning edge %d\n", + edge->newIndex, vert->newIndex, edge2 ? edge2->newIndex : -1); #endif - return edge2; + return edge2; } static void split_single_vert(SmoothVert *vert, SmoothFace *face, @@ -911,7 +911,7 @@ static void propagate_split(SmoothEdge *edge, SmoothVert *vert, LinkNode *visited_faces = NULL; #ifdef EDGESPLIT_DEBUG_1 printf("=== START === propagate_split(edge = %4d, vert = %4d)\n", - edge->newIndex, vert->newIndex); + edge->newIndex, vert->newIndex); #endif edge2 = find_other_sharp_edge(vert, edge, &visited_faces); @@ -956,7 +956,7 @@ static void propagate_split(SmoothEdge *edge, SmoothVert *vert, BLI_linklist_free(visited_faces, NULL); #ifdef EDGESPLIT_DEBUG_1 printf("=== END === propagate_split(edge = %4d, vert = %4d)\n", - edge->newIndex, vert->newIndex); + edge->newIndex, vert->newIndex); #endif } @@ -969,7 +969,7 @@ static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh) LinkNode *visited_faces = NULL; #ifdef EDGESPLIT_DEBUG_1 printf("=== START === split_edge(edge = %4d, vert = %4d)\n", - edge->newIndex, vert->newIndex); + edge->newIndex, vert->newIndex); #endif edge2 = find_other_sharp_edge(vert, edge, &visited_faces); @@ -1042,7 +1042,7 @@ static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh) BLI_linklist_free(visited_faces, NULL); #ifdef EDGESPLIT_DEBUG_1 printf("=== END === split_edge(edge = %4d, vert = %4d)\n", - edge->newIndex, vert->newIndex); + edge->newIndex, vert->newIndex); #endif } @@ -1078,31 +1078,31 @@ static void tag_and_count_extra_edges(SmoothMesh *mesh, float split_angle, /* (the edge can only be sharp if we're checking angle or flag, * and it has at least 2 faces) */ - /* if we're checking the sharp flag and it's set, good */ - if((flags & MOD_EDGESPLIT_FROMFLAG) && (edge->flag & ME_SHARP)) { - /* this edge is sharp */ - sharp = 1; + /* if we're checking the sharp flag and it's set, good */ + if((flags & MOD_EDGESPLIT_FROMFLAG) && (edge->flag & ME_SHARP)) { + /* this edge is sharp */ + sharp = 1; - (*extra_edges)++; - } else if(flags & MOD_EDGESPLIT_FROMANGLE) { - /* we know the edge has 2 faces, so check the angle */ - SmoothFace *face1 = edge->faces->link; - SmoothFace *face2 = edge->faces->next->link; - float edge_angle_cos = dot_v3v3(face1->normal, - face2->normal); + (*extra_edges)++; + } else if(flags & MOD_EDGESPLIT_FROMANGLE) { + /* we know the edge has 2 faces, so check the angle */ + SmoothFace *face1 = edge->faces->link; + SmoothFace *face2 = edge->faces->next->link; + float edge_angle_cos = dot_v3v3(face1->normal, + face2->normal); - if(edge_angle_cos < threshold) { - /* this edge is sharp */ - sharp = 1; + if(edge_angle_cos < threshold) { + /* this edge is sharp */ + sharp = 1; - (*extra_edges)++; - } - } - } + (*extra_edges)++; + } + } + } - /* set/clear sharp flag appropriately */ - if(sharp) edge->flag |= ME_SHARP; - else edge->flag &= ~ME_SHARP; + /* set/clear sharp flag appropriately */ + if(sharp) edge->flag |= ME_SHARP; + else edge->flag &= ~ME_SHARP; } } @@ -1244,7 +1244,7 @@ static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd, DerivedMesh #ifdef EDGESPLIT_DEBUG_0 printf("Edgesplit: Estimated %d verts & %d edges, " "found %d verts & %d edges\n", max_verts, max_edges, - mesh->num_verts, mesh->num_edges); + mesh->num_verts, mesh->num_edges); #endif result = CDDM_from_smoothmesh(mesh); diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c index 00ab5d027fb..f1bc0d33fd8 100644 --- a/source/blender/modifiers/intern/MOD_explode.c +++ b/source/blender/modifiers/intern/MOD_explode.c @@ -997,19 +997,19 @@ static DerivedMesh * applyModifier(ModifierData *md, Object *ob, createFacepa(emd,psmd,derivedData); } - /* 2. create new mesh */ - if(emd->flag & eExplodeFlag_EdgeCut){ - int *facepa = emd->facepa; - DerivedMesh *splitdm=cutEdges(emd,dm); - DerivedMesh *explode=explodeMesh(emd, psmd, md->scene, ob, splitdm); + /* 2. create new mesh */ + if(emd->flag & eExplodeFlag_EdgeCut){ + int *facepa = emd->facepa; + DerivedMesh *splitdm=cutEdges(emd,dm); + DerivedMesh *explode=explodeMesh(emd, psmd, md->scene, ob, splitdm); - MEM_freeN(emd->facepa); - emd->facepa=facepa; - splitdm->release(splitdm); - return explode; - } - else - return explodeMesh(emd, psmd, md->scene, ob, derivedData); + MEM_freeN(emd->facepa); + emd->facepa=facepa; + splitdm->release(splitdm); + return explode; + } + else + return explodeMesh(emd, psmd, md->scene, ob, derivedData); } return derivedData; } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c b/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c index cba7e150633..9dcdfaf21e6 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c @@ -142,7 +142,7 @@ static void node_composit_exec_alphaover(void *UNUSED(data), bNode *node, bNodeS static void node_alphaover_init(bNode* node) { - node->storage= MEM_callocN(sizeof(NodeTwoFloats), "NodeTwoFloats"); + node->storage= MEM_callocN(sizeof(NodeTwoFloats), "NodeTwoFloats"); } void register_node_type_cmp_alphaover(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c index 1031ab3d360..2b33126b3a7 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c @@ -715,7 +715,7 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN static void node_composit_init_blur(bNode* node) { - node->storage= MEM_callocN(sizeof(NodeBlurData), "node blur data"); + node->storage= MEM_callocN(sizeof(NodeBlurData), "node blur data"); } void register_node_type_cmp_blur(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c index cdd360dc0fe..b32c531d8f9 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c @@ -74,34 +74,34 @@ static void do_channel_matte(bNode *node, float *out, float *in) float alpha=0.0; switch(c->algorithm) { - case 0: { /* Alpha=key_channel-limit channel */ - int key_channel=node->custom2-1; - int limit_channel=c->channel-1; - alpha=in[key_channel]-in[limit_channel]; - break; - } - case 1: { /* Alpha=G-MAX(R, B) */ - switch(node->custom2) { + case 0: { /* Alpha=key_channel-limit channel */ + int key_channel=node->custom2-1; + int limit_channel=c->channel-1; + alpha=in[key_channel]-in[limit_channel]; + break; + } + case 1: { /* Alpha=G-MAX(R, B) */ + switch(node->custom2) { case 1: { - alpha=in[0]-MAX2(in[1],in[2]); - break; - } + alpha=in[0]-MAX2(in[1],in[2]); + break; + } case 2: { - alpha=in[1]-MAX2(in[0],in[2]); - break; - } + alpha=in[1]-MAX2(in[0],in[2]); + break; + } case 3: { - alpha=in[2]-MAX2(in[0],in[1]); - break; - } + alpha=in[2]-MAX2(in[0],in[1]); + break; + } default: break; - } - } - default: - break; - } - + } + } + default: + break; + } + /*flip because 0.0 is transparent, not 1.0*/ alpha=1-alpha; @@ -124,7 +124,6 @@ static void do_channel_matte(bNode *node, float *out, float *in) else { out[3]=in[3]; } - } static void node_composit_exec_channel_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out) @@ -132,7 +131,7 @@ static void node_composit_exec_channel_matte(void *data, bNode *node, bNodeStack CompBuf *cbuf; CompBuf *outbuf; - if(in[0]->hasinput==0) return; + if(in[0]->hasinput==0) return; if(in[0]->data==NULL) return; if(out[0]->hasoutput==0 && out[1]->hasoutput==0) return; @@ -142,24 +141,24 @@ static void node_composit_exec_channel_matte(void *data, bNode *node, bNodeStack /*convert to colorspace*/ switch(node->custom1) { - case CMP_NODE_CHANNEL_MATTE_CS_RGB: - break; - case CMP_NODE_CHANNEL_MATTE_CS_HSV: /*HSV*/ - composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_hsva, CB_RGBA); - break; - case CMP_NODE_CHANNEL_MATTE_CS_YUV: /*YUV*/ - composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_yuva, CB_RGBA); - break; - case CMP_NODE_CHANNEL_MATTE_CS_YCC: /*YCC*/ - composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_normalized_rgba_to_ycca2, CB_RGBA); - break; - default: - break; + case CMP_NODE_CHANNEL_MATTE_CS_RGB: + break; + case CMP_NODE_CHANNEL_MATTE_CS_HSV: /*HSV*/ + composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_hsva, CB_RGBA); + break; + case CMP_NODE_CHANNEL_MATTE_CS_YUV: /*YUV*/ + composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_yuva, CB_RGBA); + break; + case CMP_NODE_CHANNEL_MATTE_CS_YCC: /*YCC*/ + composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_normalized_rgba_to_ycca2, CB_RGBA); + break; + default: + break; } /*use the selected channel information to do the key */ composit1_pixel_processor(node, outbuf, outbuf, in[1]->vec, do_channel_matte, CB_RGBA); - + /*convert back to RGB colorspace in place*/ switch(node->custom1) { case CMP_NODE_CHANNEL_MATTE_CS_RGB: /*RGB*/ @@ -189,17 +188,17 @@ static void node_composit_exec_channel_matte(void *data, bNode *node, bNodeStack static void node_composit_init_channel_matte(bNode *node) { - NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); - node->storage=c; - c->t1= 1.0f; - c->t2= 0.0f; - c->t3= 0.0f; - c->fsize= 0.0f; - c->fstrength= 0.0f; - c->algorithm=1; /*max channel limiting */ - c->channel=1; /* limit by red */ - node->custom1= 1; /* RGB channel */ - node->custom2= 2; /* Green Channel */ + NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); + node->storage=c; + c->t1= 1.0f; + c->t2= 0.0f; + c->t3= 0.0f; + c->fsize= 0.0f; + c->fstrength= 0.0f; + c->algorithm=1; /*max channel limiting */ + c->channel=1; /* limit by red */ + node->custom1= 1; /* RGB channel */ + node->custom2= 2; /* Green Channel */ } void register_node_type_cmp_channel_matte(ListBase *lb) @@ -215,4 +214,3 @@ void register_node_type_cmp_channel_matte(ListBase *lb) nodeRegisterType(lb, &ntype); } - diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c index 94b086f1ba0..03230f2e212 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c @@ -49,17 +49,17 @@ static bNodeSocketType cmp_node_chroma_out[]={ static void do_rgba_to_ycca_normalized(bNode *UNUSED(node), float *out, float *in) { - rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); + rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); - //normalize to 0..1.0 - out[0]=out[0]/255.0; - out[1]=out[1]/255.0; - out[2]=out[2]/255.0; + //normalize to 0..1.0 + out[0]=out[0]/255.0; + out[1]=out[1]/255.0; + out[2]=out[2]/255.0; - //rescale to -1.0..1.0 - out[0]=(out[0]*2.0)-1.0; - out[1]=(out[1]*2.0)-1.0; - out[2]=(out[2]*2.0)-1.0; + //rescale to -1.0..1.0 + out[0]=(out[0]*2.0)-1.0; + out[1]=(out[1]*2.0)-1.0; + out[2]=(out[2]*2.0)-1.0; // out[0]=((out[0])-16)/255.0; // out[1]=((out[1])-128)/255.0; @@ -69,16 +69,16 @@ static void do_rgba_to_ycca_normalized(bNode *UNUSED(node), float *out, float *i static void do_ycca_to_rgba_normalized(bNode *UNUSED(node), float *out, float *in) { - /*un-normalize the normalize from above */ - in[0]=(in[0]+1.0)/2.0; - in[1]=(in[1]+1.0)/2.0; - in[2]=(in[2]+1.0)/2.0; + /*un-normalize the normalize from above */ + in[0]=(in[0]+1.0)/2.0; + in[1]=(in[1]+1.0)/2.0; + in[2]=(in[2]+1.0)/2.0; - in[0]=(in[0]*255.0); - in[1]=(in[1]*255.0); - in[2]=(in[2]*255.0); + in[0]=(in[0]*255.0); + in[1]=(in[1]*255.0); + in[2]=(in[2]*255.0); -// in[0]=(in[0]*255.0)+16; + // in[0]=(in[0]*255.0)+16; // in[1]=(in[1]*255.0)+128; // in[2]=(in[2]*255.0)+128; ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); @@ -180,13 +180,13 @@ static void node_composit_exec_chroma_matte(void *data, bNode *node, bNodeStack static void node_composit_init_chroma_matte(bNode *node) { - NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); - node->storage= c; - c->t1= 30.0f; - c->t2= 10.0f; - c->t3= 0.0f; - c->fsize= 0.0f; - c->fstrength= 1.0f; + NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); + node->storage= c; + c->t1= 30.0f; + c->t2= 10.0f; + c->t3= 0.0f; + c->fsize= 0.0f; + c->fstrength= 1.0f; } void register_node_type_cmp_chroma_matte(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c index 90916284f1e..151850105b7 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c @@ -53,14 +53,14 @@ static void do_color_key(bNode *node, float *out, float *in) c=node->storage; - VECCOPY(out, in); + VECCOPY(out, in); - if(fabs(in[0]-c->key[0]) < c->t1 && - fabs(in[1]-c->key[1]) < c->t2 && - fabs(in[2]-c->key[2]) < c->t3) - { - out[3]=0.0; /*make transparent*/ - } + if(fabs(in[0]-c->key[0]) < c->t1 && + fabs(in[1]-c->key[1]) < c->t2 && + fabs(in[2]-c->key[2]) < c->t3) + { + out[3]=0.0; /*make transparent*/ + } else { /*pixel is outside key color */ out[3]=in[3]; /* make pixel just as transparent as it was before */ @@ -108,13 +108,13 @@ static void node_composit_exec_color_matte(void *data, bNode *node, bNodeStack * static void node_composit_init_color_matte(bNode *node) { - NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node color"); - node->storage= c; - c->t1= 0.01f; - c->t2= 0.1f; - c->t3= 0.1f; - c->fsize= 0.0f; - c->fstrength= 1.0f; + NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node color"); + node->storage= c; + c->t1= 0.01f; + c->t2= 0.1f; + c->t3= 0.1f; + c->fsize= 0.0f; + c->fstrength= 1.0f; } void register_node_type_cmp_color_matte(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c index c9997ba8a75..905d97709c3 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c @@ -39,8 +39,8 @@ /* ******************* Color Spill Supression ********************************* */ static bNodeSocketType cmp_node_color_spill_in[]={ - {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, + {SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, {-1,0,""} }; @@ -51,17 +51,17 @@ static bNodeSocketType cmp_node_color_spill_out[]={ static void do_simple_spillmap_red(bNode *node, float* out, float *in) { - NodeColorspill *ncs; + NodeColorspill *ncs; ncs=node->storage; out[0]=in[0]-( ncs->limscale * in[ncs->limchan] ); } static void do_simple_spillmap_red_fac(bNode *node, float* out, float *in, float *fac) { - NodeColorspill *ncs; - ncs=node->storage; + NodeColorspill *ncs; + ncs=node->storage; - out[0] = *fac * (in[0]-( ncs->limscale * in[ncs->limchan])); + out[0] = *fac * (in[0]-( ncs->limscale * in[ncs->limchan])); } static void do_simple_spillmap_green(bNode *node, float* out, float *in) @@ -73,10 +73,10 @@ static void do_simple_spillmap_green(bNode *node, float* out, float *in) static void do_simple_spillmap_green_fac(bNode *node, float* out, float *in, float *fac) { - NodeColorspill *ncs; - ncs=node->storage; + NodeColorspill *ncs; + ncs=node->storage; - out[0] = *fac * (in[1]-( ncs->limscale * in[ncs->limchan])); + out[0] = *fac * (in[1]-( ncs->limscale * in[ncs->limchan])); } static void do_simple_spillmap_blue(bNode *node, float* out, float *in) @@ -88,10 +88,10 @@ static void do_simple_spillmap_blue(bNode *node, float* out, float *in) static void do_simple_spillmap_blue_fac(bNode *node, float* out, float *in, float *fac) { - NodeColorspill *ncs; - ncs=node->storage; + NodeColorspill *ncs; + ncs=node->storage; - out[0] = *fac * (in[2]-( ncs->limscale * in[ncs->limchan])); + out[0] = *fac * (in[2]-( ncs->limscale * in[ncs->limchan])); } static void do_average_spillmap_red(bNode *node, float* out, float *in) @@ -103,10 +103,10 @@ static void do_average_spillmap_red(bNode *node, float* out, float *in) static void do_average_spillmap_red_fac(bNode *node, float* out, float *in, float *fac) { - NodeColorspill *ncs; - ncs=node->storage; + NodeColorspill *ncs; + ncs=node->storage; - out[0] = *fac * (in[0]-(ncs->limscale * avg(in[1], in[2]) )); + out[0] = *fac * (in[0]-(ncs->limscale * avg(in[1], in[2]) )); } static void do_average_spillmap_green(bNode *node, float* out, float *in) @@ -118,10 +118,10 @@ static void do_average_spillmap_green(bNode *node, float* out, float *in) static void do_average_spillmap_green_fac(bNode *node, float* out, float *in, float *fac) { - NodeColorspill *ncs; - ncs=node->storage; + NodeColorspill *ncs; + ncs=node->storage; - out[0] = *fac * (in[0]-(ncs->limscale * avg(in[0], in[2]) )); + out[0] = *fac * (in[0]-(ncs->limscale * avg(in[0], in[2]) )); } static void do_average_spillmap_blue(bNode *node, float* out, float *in) @@ -133,10 +133,10 @@ static void do_average_spillmap_blue(bNode *node, float* out, float *in) static void do_average_spillmap_blue_fac(bNode *node, float* out, float *in, float *fac) { - NodeColorspill *ncs; - ncs=node->storage; + NodeColorspill *ncs; + ncs=node->storage; - out[0] = *fac * (in[0]-(ncs->limscale * avg(in[0], in[1]) )); + out[0] = *fac * (in[0]-(ncs->limscale * avg(in[0], in[1]) )); } static void do_apply_spillmap_red(bNode *node, float* out, float *in, float *map) @@ -189,48 +189,47 @@ static void do_apply_spillmap_blue(bNode *node, float* out, float *in, float *ma static void node_composit_exec_color_spill(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) { - /* - Originally based on the information from the book "The Art and Science of Digital Composition" and - discussions from vfxtalk.com.*/ - CompBuf *cbuf; - CompBuf *mask; + /* Originally based on the information from the book "The Art and Science of Digital Composition" and + * discussions from vfxtalk.com .*/ + CompBuf *cbuf; + CompBuf *mask; CompBuf *rgbbuf; CompBuf *spillmap; NodeColorspill *ncs; ncs=node->storage; - /* early out for missing connections */ - if(out[0]->hasoutput==0 ) return; - if(in[0]->hasinput==0) return; - if(in[0]->data==NULL) return; + /* early out for missing connections */ + if(out[0]->hasoutput==0 ) return; + if(in[0]->hasinput==0) return; + if(in[0]->data==NULL) return; - cbuf=typecheck_compbuf(in[0]->data, CB_RGBA); - mask=typecheck_compbuf(in[1]->data, CB_VAL); + cbuf=typecheck_compbuf(in[0]->data, CB_RGBA); + mask=typecheck_compbuf(in[1]->data, CB_VAL); spillmap=alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); rgbbuf=dupalloc_compbuf(cbuf); switch(node->custom1) { - case 1: /*red spill*/ + case 1: /*red spill*/ { switch(node->custom2) { - case 0: /* simple limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_red, CB_RGBA); - } else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_red_fac, CB_RGBA, CB_VAL); - } + case 0: /* simple limit */ + { + if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_red, CB_RGBA); + } else { + composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_red_fac, CB_RGBA, CB_VAL); + } break; } - case 1: /* average limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_red, CB_RGBA); - } else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_red_fac, CB_RGBA, CB_VAL); - } + case 1: /* average limit */ + { + if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_red, CB_RGBA); + } else { + composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_red_fac, CB_RGBA, CB_VAL); + } break; } } @@ -242,59 +241,59 @@ static void node_composit_exec_color_spill(void *UNUSED(data), bNode *node, bNod composit2_pixel_processor(node, rgbbuf, cbuf, in[0]->vec, spillmap, NULL, do_apply_spillmap_red, CB_RGBA, CB_VAL); break; } - case 2: /*green spill*/ + case 2: /*green spill*/ { switch(node->custom2) { - case 0: /* simple limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_green, CB_RGBA); - } else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_green_fac, CB_RGBA, CB_VAL); - } - break; - } - case 1: /* average limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_green, CB_RGBA); - } else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_green_fac, CB_RGBA, CB_VAL); - } - break; - } + case 0: /* simple limit */ + { + if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_green, CB_RGBA); + } else { + composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_green_fac, CB_RGBA, CB_VAL); + } + break; + } + case 1: /* average limit */ + { + if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_green, CB_RGBA); + } else { + composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_green_fac, CB_RGBA, CB_VAL); + } + break; + } } if(ncs->unspill==0) { ncs->uspillr=0.0f; ncs->uspillg=1.0f; ncs->uspillb=0.0f; - } + } composit2_pixel_processor(node, rgbbuf, cbuf, in[0]->vec, spillmap, NULL, do_apply_spillmap_green, CB_RGBA, CB_VAL); break; } - case 3: /*blue spill*/ + case 3: /*blue spill*/ { switch(node->custom2) { - case 0: /* simple limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_blue, CB_RGBA); - } else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_blue_fac, CB_RGBA, CB_VAL); - } - break; - } - case 1: /* average limit */ - { - if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { - composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_blue, CB_RGBA); - } else { - composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_blue_fac, CB_RGBA, CB_VAL); - } - break; - } + case 0: /* simple limit */ + { + if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_simple_spillmap_blue, CB_RGBA); + } else { + composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_simple_spillmap_blue_fac, CB_RGBA, CB_VAL); + } + break; + } + case 1: /* average limit */ + { + if ((in[1]->data==NULL) && (in[1]->vec[0] >= 1.f)) { + composit1_pixel_processor(node, spillmap, cbuf, in[0]->vec, do_average_spillmap_blue, CB_RGBA); + } else { + composit2_pixel_processor(node, spillmap, cbuf, in[0]->vec, in[1]->data, in[1]->vec, do_average_spillmap_blue_fac, CB_RGBA, CB_VAL); + } + break; + } } if(ncs->unspill==0) { ncs->uspillr=0.0f; @@ -304,27 +303,27 @@ static void node_composit_exec_color_spill(void *UNUSED(data), bNode *node, bNod composit2_pixel_processor(node, rgbbuf, cbuf, in[0]->vec, spillmap, NULL, do_apply_spillmap_blue, CB_RGBA, CB_VAL); break; } - default: - break; + default: + break; } out[0]->data=rgbbuf; if(cbuf!=in[0]->data) free_compbuf(cbuf); - - free_compbuf(spillmap); + + free_compbuf(spillmap); } static void node_composit_init_color_spill(bNode *node) { - NodeColorspill *ncs= MEM_callocN(sizeof(NodeColorspill), "node colorspill"); - node->storage=ncs; - node->custom1= 2; /* green channel */ - node->custom2= 0; /* simple limit algo*/ - ncs->limchan= 0; /* limit by red */ - ncs->limscale= 1.0f; /* limit scaling factor */ - ncs->unspill=0; /* do not use unspill */ + NodeColorspill *ncs= MEM_callocN(sizeof(NodeColorspill), "node colorspill"); + node->storage=ncs; + node->custom1= 2; /* green channel */ + node->custom2= 0; /* simple limit algo*/ + ncs->limchan= 0; /* limit by red */ + ncs->limscale= 1.0f; /* limit scaling factor */ + ncs->unspill=0; /* do not use unspill */ } void register_node_type_cmp_color_spill(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c index 08913575fcf..0331217f0cb 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c @@ -105,12 +105,12 @@ static void node_composit_exec_crop(void *UNUSED(data), bNode *node, bNodeStack static void node_composit_init_crop(bNode* node) { - NodeTwoXYs *nxy= MEM_callocN(sizeof(NodeTwoXYs), "node xy data"); - node->storage= nxy; - nxy->x1= 0; - nxy->x2= 0; - nxy->y1= 0; - nxy->y2= 0; + NodeTwoXYs *nxy= MEM_callocN(sizeof(NodeTwoXYs), "node xy data"); + node->storage= nxy; + nxy->x1= 0; + nxy->x2= 0; + nxy->y1= 0; + nxy->y2= 0; } void register_node_type_cmp_crop(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c index f0b399ae1e8..921c5e21fea 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c @@ -59,9 +59,9 @@ static void node_composit_exec_curves_time(void *data, bNode *node, bNodeStack * static void node_composit_init_curves_time(bNode* node) { - node->custom1= 1; - node->custom2= 250; - node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); + node->custom1= 1; + node->custom2= 250; + node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); } void register_node_type_cmp_curve_time(ListBase *lb) @@ -102,7 +102,7 @@ static void node_composit_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeS static void node_composit_init_curve_vec(bNode* node) { - node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f); + node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f); } void register_node_type_cmp_curve_vec(ListBase *lb) @@ -189,7 +189,7 @@ static void node_composit_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeS static void node_composit_init_curve_rgb(bNode* node) { - node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f); + node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f); } void register_node_type_cmp_curve_rgb(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c index 303d5ee01aa..f249e2cff6c 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c @@ -859,19 +859,19 @@ static void node_composit_exec_defocus(void *UNUSED(data), bNode *node, bNodeSta static void node_composit_init_defocus(bNode* node) { - /* qdn: defocus node */ - NodeDefocus *nbd = MEM_callocN(sizeof(NodeDefocus), "node defocus data"); - nbd->bktype = 0; - nbd->rotation = 0.f; - nbd->preview = 1; - nbd->gamco = 0; - nbd->samples = 16; - nbd->fstop = 128.f; - nbd->maxblur = 0; - nbd->bthresh = 1.f; - nbd->scale = 1.f; - nbd->no_zbuf = 1; - node->storage = nbd; + /* qdn: defocus node */ + NodeDefocus *nbd = MEM_callocN(sizeof(NodeDefocus), "node defocus data"); + nbd->bktype = 0; + nbd->rotation = 0.f; + nbd->preview = 1; + nbd->gamco = 0; + nbd->samples = 16; + nbd->fstop = 128.f; + nbd->maxblur = 0; + nbd->bthresh = 1.f; + nbd->scale = 1.f; + nbd->no_zbuf = 1; + node->storage = nbd; } void register_node_type_cmp_defocus(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c index f0e112761e3..296053298da 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c @@ -51,35 +51,35 @@ static void do_diff_matte(bNode *node, float *outColor, float *inColor1, float * { NodeChroma *c= (NodeChroma *)node->storage; float tolerence=c->t1; - float falloff=c->t2; + float falloff=c->t2; float difference; - float alpha; - - difference=fabs(inColor2[0]-inColor1[0])+ + float alpha; + + difference= fabs(inColor2[0]-inColor1[0])+ fabs(inColor2[1]-inColor1[1])+ fabs(inColor2[2]-inColor1[2]); - /*average together the distances*/ - difference=difference/3.0; + /*average together the distances*/ + difference=difference/3.0; - VECCOPY(outColor, inColor1); + VECCOPY(outColor, inColor1); - /*make 100% transparent*/ - if(difference < tolerence){ - outColor[3]=0.0; + /*make 100% transparent*/ + if(difference < tolerence) { + outColor[3]=0.0; + } + /*in the falloff region, make partially transparent */ + else if(difference < falloff+tolerence) { + difference=difference-tolerence; + alpha=difference/falloff; + /*only change if more transparent than before */ + if(alpha < inColor1[3]) { + outColor[3]=alpha; + } + else { /* leave as before */ + outColor[3]=inColor1[3]; + } } - /*in the falloff region, make partially transparent */ - else if(difference < falloff+tolerence){ - difference=difference-tolerence; - alpha=difference/falloff; - /*only change if more transparent than before */ - if(alpha < inColor1[3]) { - outColor[3]=alpha; - } - else { /* leave as before */ - outColor[3]=inColor1[3]; - } - } else { /*foreground object*/ outColor[3]= inColor1[3]; @@ -90,29 +90,29 @@ static void node_composit_exec_diff_matte(void *data, bNode *node, bNodeStack ** { CompBuf *outbuf=0; CompBuf *imbuf1=0; - CompBuf *imbuf2=0; + CompBuf *imbuf2=0; NodeChroma *c; - + /*is anything connected?*/ if(out[0]->hasoutput==0 && out[1]->hasoutput==0) return; /*must have an image imput*/ if(in[0]->data==NULL) return; - + imbuf1=typecheck_compbuf(in[0]->data, CB_RGBA); - /* if there's an image, use that, if not use the color */ - if(in[1]->data) { - imbuf2=typecheck_compbuf(in[1]->data, CB_RGBA); - } - + /* if there's an image, use that, if not use the color */ + if(in[1]->data) { + imbuf2=typecheck_compbuf(in[1]->data, CB_RGBA); + } + c=node->storage; outbuf=dupalloc_compbuf(imbuf1); - + /* note, processor gets a keyvals array passed on as buffer constant */ composit2_pixel_processor(node, outbuf, imbuf1, in[0]->vec, imbuf2, in[1]->vec, do_diff_matte, CB_RGBA, CB_RGBA); - + out[0]->data=outbuf; if(out[1]->hasoutput) out[1]->data=valbuf_from_rgbabuf(outbuf, CHAN_A); @@ -127,10 +127,10 @@ static void node_composit_exec_diff_matte(void *data, bNode *node, bNodeStack ** static void node_composit_init_diff_matte(bNode *node) { - NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); - node->storage= c; - c->t1= 0.1f; - c->t2= 0.1f; + NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); + node->storage= c; + c->t1= 0.1f; + c->t2= 0.1f; } void register_node_type_cmp_diff_matte(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c index 2694c0559d7..5f7613464c1 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c @@ -53,35 +53,35 @@ static void do_distance_matte(bNode *node, float *out, float *in) { NodeChroma *c= (NodeChroma *)node->storage; float tolerence=c->t1; - float falloff=c->t2; + float falloff=c->t2; float distance; - float alpha; - - distance=sqrt((c->key[0]-in[0])*(c->key[0]-in[0]) + + float alpha; + + distance=sqrt((c->key[0]-in[0])*(c->key[0]-in[0]) + (c->key[1]-in[1])*(c->key[1]-in[1]) + (c->key[2]-in[2])*(c->key[2]-in[2])); - VECCOPY(out, in); + VECCOPY(out, in); - /*make 100% transparent */ - if(distance < tolerence) { - out[3]=0.0; - } - /*in the falloff region, make partially transparent */ - else if(distance < falloff+tolerence){ - distance=distance-tolerence; - alpha=distance/falloff; - /*only change if more transparent than before */ - if(alpha < in[3]) { - out[3]=alpha; - } - else { /* leave as before */ - out[3]=in[3]; - } - } - else { - out[3]=in[3]; - } + /*make 100% transparent */ + if(distance < tolerence) { + out[3]=0.0; + } + /*in the falloff region, make partially transparent */ + else if(distance < falloff+tolerence){ + distance=distance-tolerence; + alpha=distance/falloff; + /*only change if more transparent than before */ + if(alpha < in[3]) { + out[3]=alpha; + } + else { /* leave as before */ + out[3]=in[3]; + } + } + else { + out[3]=in[3]; + } } static void node_composit_exec_distance_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out) @@ -124,10 +124,10 @@ static void node_composit_exec_distance_matte(void *data, bNode *node, bNodeStac static void node_composit_init_distance_matte(bNode *node) { - NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); - node->storage= c; - c->t1= 0.1f; - c->t2= 0.1f; + NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); + node->storage= c; + c->t1= 0.1f; + c->t2= 0.1f; } void register_node_type_cmp_distance_matte(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c b/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c index 238f9b063c2..7b5511c699c 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c @@ -97,11 +97,11 @@ static void node_composit_exec_hue_sat(void *UNUSED(data), bNode *node, bNodeSta static void node_composit_init_hue_sat(bNode* node) { - NodeHueSat *nhs= MEM_callocN(sizeof(NodeHueSat), "node hue sat"); - node->storage= nhs; - nhs->hue= 0.5f; - nhs->sat= 1.0f; - nhs->val= 1.0f; + NodeHueSat *nhs= MEM_callocN(sizeof(NodeHueSat), "node hue sat"); + node->storage= nhs; + nhs->hue= 0.5f; + nhs->sat= 1.0f; + nhs->val= 1.0f; } void register_node_type_cmp_hue_sat(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c index 1ea3cf96ad0..3caaad26bae 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c @@ -294,12 +294,12 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE static void node_composit_init_image(bNode* node) { - ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); - node->storage= iuser; - iuser->frames= 1; - iuser->sfra= 1; - iuser->fie_ima= 2; - iuser->ok= 1; + ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); + node->storage= iuser; + iuser->frames= 1; + iuser->sfra= 1; + iuser->fie_ima= 2; + iuser->ok= 1; } void register_node_type_cmp_image(ListBase *lb) @@ -321,27 +321,27 @@ void register_node_type_cmp_image(ListBase *lb) static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, int recty, int passcode) { - float *fp= RE_RenderLayerGetPass(rl, passcode); - if(fp) { - CompBuf *buf; - int buftype= CB_VEC3; + float *fp= RE_RenderLayerGetPass(rl, passcode); + if(fp) { + CompBuf *buf; + int buftype= CB_VEC3; - if(ELEM3(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST)) - buftype= CB_VAL; - else if(passcode==SCE_PASS_VECTOR) - buftype= CB_VEC4; - else if(ELEM(passcode, SCE_PASS_COMBINED, SCE_PASS_RGBA)) - buftype= CB_RGBA; + if(ELEM3(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB, SCE_PASS_MIST)) + buftype= CB_VAL; + else if(passcode==SCE_PASS_VECTOR) + buftype= CB_VEC4; + else if(ELEM(passcode, SCE_PASS_COMBINED, SCE_PASS_RGBA)) + buftype= CB_RGBA; - if(rd->scemode & R_COMP_CROP) - buf= get_cropped_compbuf(&rd->disprect, fp, rectx, recty, buftype); - else { - buf= alloc_compbuf(rectx, recty, buftype, 0); - buf->rect= fp; - } - return buf; - } - return NULL; + if(rd->scemode & R_COMP_CROP) + buf= get_cropped_compbuf(&rd->disprect, fp, rectx, recty, buftype); + else { + buf= alloc_compbuf(rectx, recty, buftype, 0); + buf->rect= fp; + } + return buf; + } + return NULL; } static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out, int rectx, int recty) @@ -383,51 +383,51 @@ static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStac static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) { - Scene *sce= (Scene *)node->id; - Render *re= (sce)? RE_GetRender(sce->id.name): NULL; - RenderData *rd= data; - RenderResult *rr= NULL; + Scene *sce= (Scene *)node->id; + Render *re= (sce)? RE_GetRender(sce->id.name): NULL; + RenderData *rd= data; + RenderResult *rr= NULL; - if(re) - rr= RE_AcquireResultRead(re); + if(re) + rr= RE_AcquireResultRead(re); - if(rr) { - SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1); - if(srl) { - RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); - if(rl && rl->rectf) { - CompBuf *stackbuf; + if(rr) { + SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1); + if(srl) { + RenderLayer *rl= RE_GetRenderLayer(rr, srl->name); + if(rl && rl->rectf) { + CompBuf *stackbuf; - /* we put render rect on stack, cbuf knows rect is from other ibuf when freed! */ - if(rd->scemode & R_COMP_CROP) - stackbuf= get_cropped_compbuf(&rd->disprect, rl->rectf, rr->rectx, rr->recty, CB_RGBA); - else { - stackbuf= alloc_compbuf(rr->rectx, rr->recty, CB_RGBA, 0); - stackbuf->rect= rl->rectf; + /* we put render rect on stack, cbuf knows rect is from other ibuf when freed! */ + if(rd->scemode & R_COMP_CROP) + stackbuf= get_cropped_compbuf(&rd->disprect, rl->rectf, rr->rectx, rr->recty, CB_RGBA); + else { + stackbuf= alloc_compbuf(rr->rectx, rr->recty, CB_RGBA, 0); + stackbuf->rect= rl->rectf; + } + if(stackbuf==NULL) { + printf("Error; Preview Panel in UV Window returns zero sized image\n"); + } + else { + stackbuf->xof= rr->xof; + stackbuf->yof= rr->yof; + + /* put on stack */ + out[RRES_OUT_IMAGE]->data= stackbuf; + + if(out[RRES_OUT_ALPHA]->hasoutput) + out[RRES_OUT_ALPHA]->data= valbuf_from_rgbabuf(stackbuf, CHAN_A); + + node_composit_rlayers_out(rd, rl, out, rr->rectx, rr->recty); + + generate_preview(data, node, stackbuf); + } } - if(stackbuf==NULL) { - printf("Error; Preview Panel in UV Window returns zero sized image\n"); - } - else { - stackbuf->xof= rr->xof; - stackbuf->yof= rr->yof; + } + } - /* put on stack */ - out[RRES_OUT_IMAGE]->data= stackbuf; - - if(out[RRES_OUT_ALPHA]->hasoutput) - out[RRES_OUT_ALPHA]->data= valbuf_from_rgbabuf(stackbuf, CHAN_A); - - node_composit_rlayers_out(rd, rl, out, rr->rectx, rr->recty); - - generate_preview(data, node, stackbuf); - } - } - } - } - - if(re) - RE_ReleaseResult(re); + if(re) + RE_ReleaseResult(re); } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c index f42bcb576fd..27b0324dfe0 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c @@ -116,7 +116,7 @@ static void node_composit_exec_invert(void *UNUSED(data), bNode *node, bNodeStac static void node_composit_init_invert(bNode *node) { - node->custom1 |= CMP_CHAN_RGB; + node->custom1 |= CMP_CHAN_RGB; } /* custom1 = mix type */ diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c b/source/blender/nodes/intern/CMP_nodes/CMP_levels.c index 4436be14b5c..2c9f7d97f09 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_levels.c @@ -330,7 +330,7 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack * static void node_composit_init_view_levels(bNode* node) { - node->custom1=1; /*All channels*/ + node->custom1=1; /*All channels*/ } void register_node_type_cmp_view_levels(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c index 7ed38996cf8..34e58791932 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c @@ -102,10 +102,10 @@ static void node_composit_exec_luma_matte(void *data, bNode *node, bNodeStack ** static void node_composit_init_luma_matte(bNode *node) { - NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); - node->storage=c; - c->t1= 1.0f; - c->t2= 0.0f; + NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); + node->storage=c; + c->t1= 1.0f; + c->t2= 0.0f; } void register_node_type_cmp_luma_matte(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c b/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c index b4af253ac3a..f14e0fbd804 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c @@ -81,7 +81,7 @@ static void node_composit_exec_map_value(void *UNUSED(data), bNode *node, bNodeS static void node_composit_init_map_value(bNode* node) { - node->storage= add_mapping(); + node->storage= add_mapping(); } void register_node_type_cmp_map_value(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c index 653e3f4211b..87c4ed1dac0 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c @@ -129,46 +129,46 @@ static bNodeSocketType cmp_node_combhsva_out[]= { static void do_comb_hsva(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4) { - float r,g,b; - hsv_to_rgb(in1[0], in2[0], in3[0], &r, &g, &b); + float r,g,b; + hsv_to_rgb(in1[0], in2[0], in3[0], &r, &g, &b); - out[0] = r; - out[1] = g; - out[2] = b; - out[3] = in4[0]; + out[0] = r; + out[1] = g; + out[2] = b; + out[3] = in4[0]; } static void node_composit_exec_combhsva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) { - /* stack order out: 1 rgba channels */ - /* stack order in: 4 value channels */ + /* stack order out: 1 rgba channels */ + /* stack order in: 4 value channels */ - /* input no image? then only color operation */ - if((in[0]->data==NULL) && (in[1]->data==NULL) && (in[2]->data==NULL) && (in[3]->data==NULL)) { - out[0]->vec[0] = in[0]->vec[0]; - out[0]->vec[1] = in[1]->vec[0]; - out[0]->vec[2] = in[2]->vec[0]; - out[0]->vec[3] = in[3]->vec[0]; - } - else { - /* make output size of first available input image */ - CompBuf *cbuf; - CompBuf *stackbuf; + /* input no image? then only color operation */ + if((in[0]->data==NULL) && (in[1]->data==NULL) && (in[2]->data==NULL) && (in[3]->data==NULL)) { + out[0]->vec[0] = in[0]->vec[0]; + out[0]->vec[1] = in[1]->vec[0]; + out[0]->vec[2] = in[2]->vec[0]; + out[0]->vec[3] = in[3]->vec[0]; + } + else { + /* make output size of first available input image */ + CompBuf *cbuf; + CompBuf *stackbuf; - /* allocate a CompBuf the size of the first available input */ - if (in[0]->data) cbuf = in[0]->data; - else if (in[1]->data) cbuf = in[1]->data; - else if (in[2]->data) cbuf = in[2]->data; - else cbuf = in[3]->data; + /* allocate a CompBuf the size of the first available input */ + if (in[0]->data) cbuf = in[0]->data; + else if (in[1]->data) cbuf = in[1]->data; + else if (in[2]->data) cbuf = in[2]->data; + else cbuf = in[3]->data; - stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ + stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, - in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, - do_comb_hsva, CB_VAL, CB_VAL, CB_VAL, CB_VAL); + composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, + in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, + do_comb_hsva, CB_VAL, CB_VAL, CB_VAL, CB_VAL); - out[0]->data= stackbuf; - } + out[0]->data= stackbuf; + } } void register_node_type_cmp_combhsva(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c index 69499f25b39..13cb3bcfed5 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c @@ -143,12 +143,12 @@ static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack * static void node_composit_init_splitviewer(bNode* node) { - ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); - node->storage= iuser; - iuser->sfra= 1; - iuser->fie_ima= 2; - iuser->ok= 1; - node->custom1= 50; /* default 50% split */ + ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); + node->storage= iuser; + iuser->sfra= 1; + iuser->fie_ima= 2; + iuser->ok= 1; + node->custom1= 50; /* default 50% split */ } void register_node_type_cmp_splitviewer(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c index fa6b5db89f6..1e1c8c61b46 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c @@ -82,7 +82,7 @@ static void node_composit_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeSt static void node_composit_init_valtorgb(bNode* node) { - node->storage= add_colorband(1); + node->storage= add_colorband(1); } void register_node_type_cmp_valtorgb(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c b/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c index b21418f6698..c43bfa2435a 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c @@ -89,10 +89,10 @@ static void node_composit_exec_vecblur(void *UNUSED(data), bNode *node, bNodeSta static void node_composit_init_vecblur(bNode* node) { - NodeBlurData *nbd= MEM_callocN(sizeof(NodeBlurData), "node blur data"); - node->storage= nbd; - nbd->samples= 32; - nbd->fac= 1.0f; + NodeBlurData *nbd= MEM_callocN(sizeof(NodeBlurData), "node blur data"); + node->storage= nbd; + nbd->samples= 32; + nbd->fac= 1.0f; } /* custom1: itterations, custom2: maxspeed (0 = nolimit) */ diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c index b3629eb1e16..c4e719efbf9 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c @@ -126,11 +126,11 @@ static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, static void node_composit_init_viewer(bNode* node) { - ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); - node->storage= iuser; - iuser->sfra= 1; - iuser->fie_ima= 2; - iuser->ok= 1; + ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); + node->storage= iuser; + iuser->sfra= 1; + iuser->fie_ima= 2; + iuser->ok= 1; } void register_node_type_cmp_viewer(ListBase *lb) diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/intern/CMP_util.c index 45e7cf9d3e7..78025f4d964 100644 --- a/source/blender/nodes/intern/CMP_util.c +++ b/source/blender/nodes/intern/CMP_util.c @@ -673,116 +673,116 @@ void generate_preview(void *data, bNode *node, CompBuf *stackbuf) void do_rgba_to_yuva(bNode *UNUSED(node), float *out, float *in) { - rgb_to_yuv(in[0],in[1],in[2], &out[0], &out[1], &out[2]); - out[3]=in[3]; + rgb_to_yuv(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + out[3]=in[3]; } void do_rgba_to_hsva(bNode *UNUSED(node), float *out, float *in) { - rgb_to_hsv(in[0],in[1],in[2], &out[0], &out[1], &out[2]); - out[3]=in[3]; + rgb_to_hsv(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + out[3]=in[3]; } void do_rgba_to_ycca(bNode *UNUSED(node), float *out, float *in) { - rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); - out[3]=in[3]; + rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); + out[3]=in[3]; } void do_yuva_to_rgba(bNode *UNUSED(node), float *out, float *in) { - yuv_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]); - out[3]=in[3]; + yuv_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + out[3]=in[3]; } void do_hsva_to_rgba(bNode *UNUSED(node), float *out, float *in) { - hsv_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]); - out[3]=in[3]; + hsv_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]); + out[3]=in[3]; } void do_ycca_to_rgba(bNode *UNUSED(node), float *out, float *in) { - ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); - out[3]=in[3]; + ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601); + out[3]=in[3]; } void do_copy_rgba(bNode *UNUSED(node), float *out, float *in) { - QUATCOPY(out, in); + QUATCOPY(out, in); } void do_copy_rgb(bNode *UNUSED(node), float *out, float *in) { - VECCOPY(out, in); - out[3]= 1.0f; + VECCOPY(out, in); + out[3]= 1.0f; } void do_copy_value(bNode *UNUSED(node), float *out, float *in) { - out[0]= in[0]; + out[0]= in[0]; } void do_copy_a_rgba(bNode *UNUSED(node), float *out, float *in, float *fac) { - VECCOPY(out, in); - out[3]= *fac; + VECCOPY(out, in); + out[3]= *fac; } /* only accepts RGBA buffers */ void gamma_correct_compbuf(CompBuf *img, int inversed) { - float *drect; - int x; + float *drect; + int x; - if(img->type!=CB_RGBA) return; + if(img->type!=CB_RGBA) return; - drect= img->rect; - if(inversed) { - for(x=img->x*img->y; x>0; x--, drect+=4) { - if(drect[0]>0.0f) drect[0]= sqrt(drect[0]); else drect[0]= 0.0f; - if(drect[1]>0.0f) drect[1]= sqrt(drect[1]); else drect[1]= 0.0f; - if(drect[2]>0.0f) drect[2]= sqrt(drect[2]); else drect[2]= 0.0f; - } - } - else { - for(x=img->x*img->y; x>0; x--, drect+=4) { - if(drect[0]>0.0f) drect[0]*= drect[0]; else drect[0]= 0.0f; - if(drect[1]>0.0f) drect[1]*= drect[1]; else drect[1]= 0.0f; - if(drect[2]>0.0f) drect[2]*= drect[2]; else drect[2]= 0.0f; - } - } + drect= img->rect; + if(inversed) { + for(x=img->x*img->y; x>0; x--, drect+=4) { + if(drect[0]>0.0f) drect[0]= sqrt(drect[0]); else drect[0]= 0.0f; + if(drect[1]>0.0f) drect[1]= sqrt(drect[1]); else drect[1]= 0.0f; + if(drect[2]>0.0f) drect[2]= sqrt(drect[2]); else drect[2]= 0.0f; + } + } + else { + for(x=img->x*img->y; x>0; x--, drect+=4) { + if(drect[0]>0.0f) drect[0]*= drect[0]; else drect[0]= 0.0f; + if(drect[1]>0.0f) drect[1]*= drect[1]; else drect[1]= 0.0f; + if(drect[2]>0.0f) drect[2]*= drect[2]; else drect[2]= 0.0f; + } + } } void premul_compbuf(CompBuf *img, int inversed) { - float *drect; - int x; + float *drect; + int x; - if(img->type!=CB_RGBA) return; + if(img->type!=CB_RGBA) return; - drect= img->rect; - if(inversed) { - for(x=img->x*img->y; x>0; x--, drect+=4) { - if(fabs(drect[3]) < 1e-5f) { - drect[0]= 0.0f; - drect[1]= 0.0f; - drect[2]= 0.0f; - } - else { - drect[0] /= drect[3]; - drect[1] /= drect[3]; - drect[2] /= drect[3]; - } - } - } - else { - for(x=img->x*img->y; x>0; x--, drect+=4) { - drect[0] *= drect[3]; - drect[1] *= drect[3]; - drect[2] *= drect[3]; - } - } + drect= img->rect; + if(inversed) { + for(x=img->x*img->y; x>0; x--, drect+=4) { + if(fabs(drect[3]) < 1e-5f) { + drect[0]= 0.0f; + drect[1]= 0.0f; + drect[2]= 0.0f; + } + else { + drect[0] /= drect[3]; + drect[1] /= drect[3]; + drect[2] /= drect[3]; + } + } + } + else { + for(x=img->x*img->y; x>0; x--, drect+=4) { + drect[0] *= drect[3]; + drect[1] *= drect[3]; + drect[2] *= drect[3]; + } + } } diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c b/source/blender/nodes/intern/SHD_nodes/SHD_curves.c index 78b5e4c1e56..a39a639897e 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_curves.c @@ -59,7 +59,7 @@ static void node_shader_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeSta static void node_shader_init_curve_vec(bNode* node) { - node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f); + node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f); } static int gpu_shader_curve_vec(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) @@ -114,7 +114,7 @@ static void node_shader_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeSta static void node_shader_init_curve_rgb(bNode *node) { - node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f); + node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f); } static int gpu_shader_curve_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c index c08d5f3548d..379f54bec57 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c @@ -120,7 +120,7 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **UNUSED(i static void node_shader_init_geometry(bNode *node) { - node->storage= MEM_callocN(sizeof(NodeGeometry), "NodeGeometry"); + node->storage= MEM_callocN(sizeof(NodeGeometry), "NodeGeometry"); } static int gpu_shader_geom(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c b/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c index 528b43ae56e..eb300301ce2 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c @@ -71,7 +71,7 @@ static void node_shader_exec_mapping(void *UNUSED(data), bNode *node, bNodeStack static void node_shader_init_mapping(bNode *node) { - node->storage= add_mapping(); + node->storage= add_mapping(); } static int gpu_shader_mapping(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_material.c b/source/blender/nodes/intern/SHD_nodes/SHD_material.c index 317dd07f8fe..40dfbc0edea 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_material.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_material.c @@ -195,7 +195,7 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, static void node_shader_init_material(bNode* node) { - node->custom1= SH_NODE_MAT_DIFF|SH_NODE_MAT_SPEC; + node->custom1= SH_NODE_MAT_DIFF|SH_NODE_MAT_SPEC; } static int gpu_shader_material(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c b/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c index d2538f4c819..86f832c12ee 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c @@ -61,7 +61,7 @@ static void node_shader_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeStac static void node_shader_init_valtorgb(bNode *node) { - node->storage= add_colorband(1); + node->storage= add_colorband(1); } static int gpu_shader_valtorgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) @@ -102,10 +102,10 @@ static bNodeSocketType sh_node_rgbtobw_out[]= { static void node_shader_exec_rgbtobw(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out) { - /* stack order out: bw */ - /* stack order in: col */ + /* stack order out: bw */ + /* stack order in: col */ - out[0]->vec[0]= in[0]->vec[0]*0.35f + in[0]->vec[1]*0.45f + in[0]->vec[2]*0.2f; + out[0]->vec[0]= in[0]->vec[0]*0.35f + in[0]->vec[1]*0.45f + in[0]->vec[2]*0.2f; } static int gpu_shader_rgbtobw(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out) diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c b/source/blender/nodes/intern/TEX_nodes/TEX_curves.c index e388efd17c0..b7af6c748ff 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_curves.c @@ -62,9 +62,9 @@ static void time_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out static void time_init(bNode* node) { - node->custom1= 1; - node->custom2= 250; - node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); + node->custom1= 1; + node->custom2= 250; + node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); } void register_node_type_tex_curve_time(ListBase *lb) diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_image.c b/source/blender/nodes/intern/TEX_nodes/TEX_image.c index fcb18ab3342..a54ca4bb119 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_image.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_image.c @@ -90,11 +90,11 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out) static void init(bNode* node) { - ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); - node->storage= iuser; - iuser->sfra= 1; - iuser->fie_ima= 2; - iuser->ok= 1; + ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); + node->storage= iuser; + iuser->sfra= 1; + iuser->fie_ima= 2; + iuser->ok= 1; } void register_node_type_tex_image(ListBase *lb) diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c b/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c index 19fa6c67c09..8f59828081c 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c @@ -80,12 +80,12 @@ void register_node_type_tex_valtorgb(ListBase *lb) /* **************** RGBTOBW ******************** */ static bNodeSocketType rgbtobw_in[]= { - { SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f}, - { -1, 0, "" } + { SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } }; static bNodeSocketType rgbtobw_out[]= { - { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { -1, 0, "" } + { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } }; diff --git a/source/blender/python/generic/IDProp.c b/source/blender/python/generic/IDProp.c index 36dc6fca503..ccf498f1550 100644 --- a/source/blender/python/generic/IDProp.c +++ b/source/blender/python/generic/IDProp.c @@ -513,15 +513,15 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop) for (i=0; ilen; i++) { if (prop->subtype == IDP_FLOAT) { PyList_SET_ITEM(seq, i, - PyFloat_FromDouble(((float*)prop->data.pointer)[i])); + PyFloat_FromDouble(((float*)prop->data.pointer)[i])); } else if (prop->subtype == IDP_DOUBLE) { PyList_SET_ITEM(seq, i, - PyFloat_FromDouble(((double*)prop->data.pointer)[i])); + PyFloat_FromDouble(((double*)prop->data.pointer)[i])); } else { PyList_SET_ITEM(seq, i, - PyLong_FromLong(((int*)prop->data.pointer)[i])); + PyLong_FromLong(((int*)prop->data.pointer)[i])); } } return seq; @@ -588,7 +588,7 @@ static PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value) /*ok something bad happened with the pyobject, so don't remove the prop from the group. if pyform is NULL, then it already should have raised an exception.*/ - return NULL; + return NULL; } IDP_RemFromGroup(self->prop, idprop); diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c index 5be3282d6e6..730db73e685 100644 --- a/source/blender/python/generic/bgl.c +++ b/source/blender/python/generic/bgl.c @@ -132,16 +132,16 @@ static PyObject *Method_##funcname (PyObject *UNUSED(self), PyObject *args) {\ int BGL_typeSize(int type) { switch (type) { - case GL_BYTE: - return sizeof(char); - case GL_SHORT: - return sizeof(short); - case GL_INT: - return sizeof(int); - case GL_FLOAT: - return sizeof(float); - case GL_DOUBLE: - return sizeof(double); + case GL_BYTE: + return sizeof(char); + case GL_SHORT: + return sizeof(short); + case GL_INT: + return sizeof(int); + case GL_FLOAT: + return sizeof(float); + case GL_DOUBLE: + return sizeof(double); } return -1; } @@ -307,7 +307,7 @@ static PyObject *Buffer_item(PyObject *self, int i) return (PyObject *) newbuf; } - + return NULL; } @@ -435,7 +435,7 @@ static PyObject *Buffer_dimensions(PyObject *self) Buffer *buffer= (Buffer *) self; PyObject *list= PyList_New(buffer->ndimensions); int i; - + for (i= 0; indimensions; i++) { PyList_SET_ITEM(list, i, PyLong_FromLong(buffer->dimensions[i])); } @@ -804,7 +804,7 @@ BGLU_Wrap(9, UnProject, GLint, (GLdouble, GLdouble, GLdouble, GLdoubleP, GLdo * {"glAccum", Method_Accumfunc, METH_VARARGS} */ static struct PyMethodDef BGL_methods[] = { - {"Buffer", Method_Buffer, METH_VARARGS, Method_Buffer_doc}, + {"Buffer", Method_Buffer, METH_VARARGS, Method_Buffer_doc}, /* #ifndef __APPLE__ */ MethodDef(Accum), diff --git a/source/blender/python/generic/mathutils_geometry.c b/source/blender/python/generic/mathutils_geometry.c index 51b1a9754c9..6031c716807 100644 --- a/source/blender/python/generic/mathutils_geometry.c +++ b/source/blender/python/generic/mathutils_geometry.c @@ -841,10 +841,10 @@ static PyObject *M_Geometry_barycentric_transform(PyObject *UNUSED(self), PyObje vec_t1_tar->size != 3 || vec_t2_tar->size != 3 || vec_t3_tar->size != 3) - { - PyErr_SetString(PyExc_ValueError, "One of more of the vector arguments wasnt a 3D vector"); - return NULL; - } + { + PyErr_SetString(PyExc_ValueError, "One of more of the vector arguments wasnt a 3D vector"); + return NULL; + } barycentric_transform(vec, vec_pt->vec, vec_t1_tar->vec, vec_t2_tar->vec, vec_t3_tar->vec, diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index c4663482592..53d28621ae8 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -140,7 +140,7 @@ static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw) return ret; \ } \ else if (PyTuple_GET_SIZE(args) > 1) { \ - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \ + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \ return NULL; \ } \ srna= srna_from_self(self, #_func"(...):"); \ @@ -762,7 +762,7 @@ static StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix } if(!RNA_struct_is_a(srna, &RNA_PropertyGroup)) { - PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from PropertyGroup", error_prefix); + PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from PropertyGroup", error_prefix); return NULL; } @@ -884,7 +884,7 @@ static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw return ret; } else if (PyTuple_GET_SIZE(args) > 1) { - PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \ + PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \ return NULL; } diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index e254f80b0e8..19cd9df9403 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -2942,9 +2942,9 @@ static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname) #if 0 static int pyrna_struct_pydict_contains(PyObject *self, PyObject *pyname) { - PyObject *dict= *(_PyObject_GetDictPtr((PyObject *)self)); - if (dict==NULL) /* unlikely */ - return 0; + PyObject *dict= *(_PyObject_GetDictPtr((PyObject *)self)); + if (dict==NULL) /* unlikely */ + return 0; return PyDict_Contains(dict, pyname); } @@ -5463,19 +5463,19 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr } if(py_srna==NULL) { - PyErr_Format(PyExc_RuntimeError, "%.200s, missing bl_rna attribute from '%.200s' instance (may not be registered)", error_prefix, Py_TYPE(self)->tp_name); + PyErr_Format(PyExc_RuntimeError, "%.200s, missing bl_rna attribute from '%.200s' instance (may not be registered)", error_prefix, Py_TYPE(self)->tp_name); return NULL; } if(!BPy_StructRNA_Check(py_srna)) { - PyErr_Format(PyExc_TypeError, "%.200s, bl_rna attribute wrong type '%.200s' on '%.200s'' instance", error_prefix, Py_TYPE(py_srna)->tp_name, Py_TYPE(self)->tp_name); - Py_DECREF(py_srna); + PyErr_Format(PyExc_TypeError, "%.200s, bl_rna attribute wrong type '%.200s' on '%.200s'' instance", error_prefix, Py_TYPE(py_srna)->tp_name, Py_TYPE(self)->tp_name); + Py_DECREF(py_srna); return NULL; } if(py_srna->ptr.type != &RNA_Struct) { PyErr_Format(PyExc_TypeError, "%.200s, bl_rna attribute not a RNA_Struct, on '%.200s'' instance", error_prefix, Py_TYPE(self)->tp_name); - Py_DECREF(py_srna); + Py_DECREF(py_srna); return NULL; } diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c index 264c82e4f47..7d2c7b35247 100644 --- a/source/blender/render/intern/source/imagetexture.c +++ b/source/blender/render/intern/source/imagetexture.c @@ -959,7 +959,7 @@ static void alpha_clip_aniso(ImBuf *ibuf, float minx, float miny, float maxx, fl rf.xmax= maxx*(ibuf->x); rf.ymin= miny*(ibuf->y); rf.ymax= maxy*(ibuf->y); - + alphaclip = clipx_rctf(&rf, 0.0, (float)(ibuf->x)); alphaclip*= clipy_rctf(&rf, 0.0, (float)(ibuf->y)); alphaclip= MAX2(alphaclip, 0.0f); @@ -1421,7 +1421,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f ibuf= BKE_image_get_ibuf(ima, &tex->iuser); } if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) - return retval; + return retval; /* mipmap test */ image_mipmap_test(tex, ibuf); @@ -1467,8 +1467,8 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f if(tex->imaflag & TEX_FILTER_MIN) { /* make sure the filtersize is minimal in pixels (normal, ref map can have miniature pixel dx/dy) */ - float addval= (0.5f * tex->filtersize) / (float) MIN2(ibuf->x, ibuf->y); - + float addval= (0.5f * tex->filtersize) / (float) MIN2(ibuf->x, ibuf->y); + if(addval > minx) minx= addval; if(addval > miny) diff --git a/source/blender/render/intern/source/pixelblending.c b/source/blender/render/intern/source/pixelblending.c index d66f40225fa..c2e34e2a70d 100644 --- a/source/blender/render/intern/source/pixelblending.c +++ b/source/blender/render/intern/source/pixelblending.c @@ -144,7 +144,7 @@ void addalphaAddfacFloat(float *dest, float *source, char addfac) if(c >= RE_FULL_COLOR_FLOAT) dest[3] = RE_FULL_COLOR_FLOAT; else #endif - dest[3]= c; + dest[3]= c; } diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c index 84523975589..2d42938f6ac 100644 --- a/source/blender/render/intern/source/pixelshading.c +++ b/source/blender/render/intern/source/pixelshading.c @@ -290,14 +290,14 @@ int shadeHaloFloat(HaloRen *har, float *col, int zz, int a; if(R.wrld.mode & WO_MIST) { - if(har->type & HA_ONLYSKY) { - /* stars but no mist */ - alpha= har->alfa; - } - else { - /* a bit patchy... */ - alpha= mistfactor(-har->co[2], har->co)*har->alfa; - } + if(har->type & HA_ONLYSKY) { + /* stars but no mist */ + alpha= har->alfa; + } + else { + /* a bit patchy... */ + alpha= mistfactor(-har->co[2], har->co)*har->alfa; + } } else alpha= har->alfa; diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index f7bf370c0be..d8b5055effd 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -2269,7 +2269,7 @@ void do_material_tex(ShadeInput *shi) if(use_compat_bump) { rgbnor = compatible_bump_compute(&compat_bump, shi, mtex, tex, &texres, Tnor*stencilTin, co, dx, dy, texvec, dxt, dyt); - } + } else if(use_ntap_bump) { rgbnor = ntap_bump_compute(&ntap_bump, shi, mtex, tex, &texres, Tnor*stencilTin, co, dx, dy, texvec, dxt, dyt); diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 6d19846d80a..7a34fc0af50 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -1058,14 +1058,14 @@ static void reset_sky_speed(RenderPart *pa, RenderLayer *rl) static unsigned short *make_solid_mask(RenderPart *pa) { - intptr_t *rd= pa->rectdaps; - unsigned short *solidmask, *sp; - int x; - + intptr_t *rd= pa->rectdaps; + unsigned short *solidmask, *sp; + int x; + if(rd==NULL) return NULL; - + sp=solidmask= MEM_mallocN(sizeof(short)*pa->rectx*pa->recty, "solidmask"); - + for(x=pa->rectx*pa->recty; x>0; x--, rd++, sp++) { if(*rd) { PixStr *ps= (PixStr *)*rd; @@ -1077,7 +1077,7 @@ static unsigned short *make_solid_mask(RenderPart *pa) else *sp= 0; } - + return solidmask; } diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c index 038d1bd40cb..dcb9a3063e1 100644 --- a/source/blender/render/intern/source/shadbuf.c +++ b/source/blender/render/intern/source/shadbuf.c @@ -952,7 +952,7 @@ static int firstreadshadbuf(ShadBuf *shb, ShadSampleBuf *shsample, int **rz, int /* always test borders of shadowbuffer */ if(xs<0) xs= 0; else if(xs>=shb->size) xs= shb->size-1; if(ys<0) ys= 0; else if(ys>=shb->size) ys= shb->size-1; - + /* calc z */ ofs= (ys>>4)*(shb->size>>4) + (xs>>4); ct= shsample->cbuf+ofs; diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c index f7ec0050c5d..12e85af7575 100644 --- a/source/blender/render/intern/source/strand.c +++ b/source/blender/render/intern/source/strand.c @@ -690,7 +690,7 @@ static void strand_render(Render *re, StrandSegment *sseg, float winmat[][4], St } } } - + static int strand_segment_recursive(Render *re, float winmat[][4], StrandPart *spart, ZSpan *zspan, int totzspan, StrandSegment *sseg, StrandPoint *p1, StrandPoint *p2, int depth) { StrandPoint p; diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index 79ee3994386..174b1378f67 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -3856,7 +3856,7 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf ShadeInput *shi= ssamp->shi; ShadeResult *shr= ssamp->shr; - for(sample=0; sampletot; sample++, shi++, shr++) { + for(sample=0; sampletot; sample++, shi++, shr++) { if(shi->mask & (1<combined[3])*shr->combined[3]; diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index b75ef359204..6b074029984 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1602,7 +1602,7 @@ static int wm_event_inside_i(wmEvent *event, rcti *rect) if(wm_event_always_pass(event)) return 1; if(BLI_in_rcti(rect, event->x, event->y)) - return 1; + return 1; if(event->type==MOUSEMOVE) { if( BLI_in_rcti(rect, event->prevx, event->prevy)) { return 1; diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 4a8553e16f6..4ab4eebdfe1 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -270,8 +270,8 @@ static void wm_jobs_test_suspend_stop(wmWindowManager *wm, wmJob *test) /* if new job is render, any render job should be stopped */ if(test->flag & WM_JOB_EXCL_RENDER) - if(0==(steve->flag & WM_JOB_EXCL_RENDER)) - continue; + if(0==(steve->flag & WM_JOB_EXCL_RENDER)) + continue; suspend= 1; diff --git a/source/creator/creator.c b/source/creator/creator.c index b7d1a30048f..758989b3eb0 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -404,7 +404,7 @@ static int set_fpe(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(dat /* OSX uses SSE for floating point by default, so here * use SSE instructions to throw floating point exceptions */ _MM_SET_EXCEPTION_MASK(_MM_MASK_MASK &~ - (_MM_MASK_OVERFLOW|_MM_MASK_INVALID|_MM_MASK_DIV_ZERO)); + (_MM_MASK_OVERFLOW|_MM_MASK_INVALID|_MM_MASK_DIV_ZERO)); # endif /* OSX_SSE_FPE */ # if defined(_WIN32) && defined(_MSC_VER) _controlfp_s(NULL, 0, _MCW_EM); /* enables all fp exceptions */ From 9646f8e5b15f55e2172411922a6849945d27739c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 16:16:12 +0000 Subject: [PATCH 68/88] ack, should have done this before tagging else bpy.app.version_char will be incorrect. --- source/blender/blenkernel/BKE_blender.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 3365ebd6bfe..83d65f3b1f4 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -51,7 +51,7 @@ extern "C" { /* used by packaging tools */ /* can be left blank, otherwise a,b,c... etc with no quotes */ -#define BLENDER_VERSION_CHAR +#define BLENDER_VERSION_CHAR a /* alpha/beta/rc/release, docs use this */ #define BLENDER_VERSION_CYCLE release From 284a0d3610b50ff45a7acdc084c21003c9af0d41 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 17:25:58 +0000 Subject: [PATCH 69/88] pass even mouse coords value as const so its not edited, view3d_get_view_aligned_coordinate() could modify the event->mval. --- source/blender/blenkernel/BKE_sketch.h | 2 +- source/blender/blenkernel/intern/sketch.c | 2 +- .../editors/armature/armature_intern.h | 2 +- .../blender/editors/armature/editarmature.c | 4 +- .../editors/armature/editarmature_sketch.c | 4 +- source/blender/editors/curve/editcurve.c | 2 +- .../blender/editors/gpencil/gpencil_paint.c | 2 +- source/blender/editors/include/ED_armature.h | 2 +- source/blender/editors/include/ED_curve.h | 2 +- source/blender/editors/include/ED_mball.h | 2 +- source/blender/editors/include/ED_mesh.h | 4 +- source/blender/editors/include/ED_object.h | 2 +- source/blender/editors/include/ED_particle.h | 4 +- source/blender/editors/include/ED_view3d.h | 36 ++++++------- source/blender/editors/mesh/editface.c | 4 +- source/blender/editors/mesh/editmesh_mods.c | 6 +-- source/blender/editors/mesh/editmesh_tools.c | 2 +- source/blender/editors/metaball/mball_edit.c | 2 +- .../blender/editors/object/object_lattice.c | 4 +- .../blender/editors/physics/particle_edit.c | 6 +-- .../blender/editors/space_node/node_select.c | 2 +- .../blender/editors/space_node/node_state.c | 2 +- .../editors/space_sequencer/sequencer_edit.c | 2 +- .../space_sequencer/sequencer_intern.h | 2 +- source/blender/editors/space_text/text_ops.c | 4 +- .../editors/space_view3d/view3d_draw.c | 6 +-- .../editors/space_view3d/view3d_edit.c | 10 ++-- .../editors/space_view3d/view3d_select.c | 46 ++++++++-------- .../editors/space_view3d/view3d_view.c | 42 +++++++-------- source/blender/editors/transform/transform.c | 50 ++++++++--------- source/blender/editors/transform/transform.h | 54 +++++++++---------- .../editors/transform/transform_input.c | 20 +++---- .../editors/transform/transform_manipulator.c | 2 +- source/blender/imbuf/intern/tiff.c | 3 +- 34 files changed, 169 insertions(+), 170 deletions(-) diff --git a/source/blender/blenkernel/BKE_sketch.h b/source/blender/blenkernel/BKE_sketch.h index f42d733d583..360a95bfb24 100644 --- a/source/blender/blenkernel/BKE_sketch.h +++ b/source/blender/blenkernel/BKE_sketch.h @@ -152,7 +152,7 @@ void sk_endContinuousStroke(SK_Stroke *stk); void sk_updateNextPoint(SK_Sketch *sketch, SK_Stroke *stk); -void sk_initDrawData(SK_DrawData *dd, short mval[2]); +void sk_initDrawData(SK_DrawData *dd, const short mval[2]); void sk_deleteSelectedStrokes(SK_Sketch *sketch); void sk_selectAllSketch(SK_Sketch *sketch, int mode); diff --git a/source/blender/blenkernel/intern/sketch.c b/source/blender/blenkernel/intern/sketch.c index 6e234a9d115..ec0f5d1316b 100644 --- a/source/blender/blenkernel/intern/sketch.c +++ b/source/blender/blenkernel/intern/sketch.c @@ -543,7 +543,7 @@ int sk_stroke_filtermval(SK_DrawData *dd) return retval; } -void sk_initDrawData(SK_DrawData *dd, short mval[2]) +void sk_initDrawData(SK_DrawData *dd, const short mval[2]) { dd->mval[0] = mval[0]; dd->mval[1] = mval[1]; diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index 7a6141540bd..86dc2182e03 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -206,7 +206,7 @@ void POSE_OT_propagate(struct wmOperatorType *ot); /* editarmature.c */ EditBone *make_boneList(struct ListBase *edbo, struct ListBase *bones, struct EditBone *parent, struct Bone *actBone); -void BIF_sk_selectStroke(struct bContext *C, short mval[2], short extend); +void BIF_sk_selectStroke(struct bContext *C, const short mval[2], short extend); /* duplicate method */ void preEditBoneDuplicate(struct ListBase *editbones); diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 23f91f88c8d..f0f33ec3258 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -1698,7 +1698,7 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot) /* does bones and points */ /* note that BONE ROOT only gets drawn for root bones (or without IK) */ -static EditBone *get_nearest_editbonepoint (ViewContext *vc, short mval[2], ListBase *edbo, int findunsel, int *selmask) +static EditBone *get_nearest_editbonepoint (ViewContext *vc, const short mval[2], ListBase *edbo, int findunsel, int *selmask) { EditBone *ebone; rcti rect; @@ -1958,7 +1958,7 @@ static int ebone_select_flag(EditBone *ebone) } /* context: editmode armature in view3d */ -int mouse_armature(bContext *C, short mval[2], int extend) +int mouse_armature(bContext *C, const short mval[2], int extend) { Object *obedit= CTX_data_edit_object(C); bArmature *arm= obedit->data; diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c index 4b83af30799..158c0d23ddc 100644 --- a/source/blender/editors/armature/editarmature_sketch.c +++ b/source/blender/editors/armature/editarmature_sketch.c @@ -2157,7 +2157,7 @@ static void sk_applyGesture(bContext *C, SK_Sketch *sketch) /********************************************/ -static int sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend) +static int sk_selectStroke(bContext *C, SK_Sketch *sketch, const short mval[2], int extend) { ViewContext vc; rcti rect; @@ -2473,7 +2473,7 @@ static int sketch_delete(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(ev return OPERATOR_FINISHED; } -void BIF_sk_selectStroke(bContext *C, short mval[2], short extend) +void BIF_sk_selectStroke(bContext *C, const short mval[2], short extend) { ToolSettings *ts = CTX_data_tool_settings(C); SK_Sketch *sketch = contextSketch(C, 0); diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index bea5a729f31..4365bf69308 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -4170,7 +4170,7 @@ void CURVE_OT_make_segment(wmOperatorType *ot) /***************** pick select from 3d view **********************/ -int mouse_nurb(bContext *C, short mval[2], int extend) +int mouse_nurb(bContext *C, const short mval[2], int extend) { Object *obedit= CTX_data_edit_object(C); Curve *cu= obedit->data; diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 17e7c0c221b..04391d0c531 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -239,7 +239,7 @@ static short gp_stroke_filtermval (tGPsdata *p, int mval[2], int pmval[2]) /* convert screen-coordinates to buffer-coordinates */ // XXX this method needs a total overhaul! -static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[], float *depth) +static void gp_stroke_convertcoords (tGPsdata *p, short mval[2], float out[3], float *depth) { bGPdata *gpd= p->gpd; diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h index fcd56277b87..36923736068 100644 --- a/source/blender/editors/include/ED_armature.h +++ b/source/blender/editors/include/ED_armature.h @@ -117,7 +117,7 @@ void ED_armature_deselect_all_visible(struct Object *obedit); int ED_do_pose_selectbuffer(struct Scene *scene, struct Base *base, unsigned int *buffer, short hits, short extend); -int mouse_armature(struct bContext *C, short mval[2], int extend); +int mouse_armature(struct bContext *C, const short mval[2], int extend); int join_armature_exec(struct bContext *C, struct wmOperator *op); struct Bone *get_indexed_bone (struct Object *ob, int index); float ED_rollBoneToVector(EditBone *bone, const float new_up_axis[3], const short axis_only); diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h index 08a63a470c1..cfafd38ed15 100644 --- a/source/blender/editors/include/ED_curve.h +++ b/source/blender/editors/include/ED_curve.h @@ -66,7 +66,7 @@ void free_editNurb (struct Object *obedit); void free_curve_editNurb (struct Curve *cu); -int mouse_nurb (struct bContext *C, short mval[2], int extend); +int mouse_nurb (struct bContext *C, const short mval[2], int extend); struct Nurb *add_nurbs_primitive(struct bContext *C, float mat[4][4], int type, int newob); diff --git a/source/blender/editors/include/ED_mball.h b/source/blender/editors/include/ED_mball.h index 504cc4e2d52..a742be7337c 100644 --- a/source/blender/editors/include/ED_mball.h +++ b/source/blender/editors/include/ED_mball.h @@ -42,7 +42,7 @@ void ED_keymap_metaball(struct wmKeyConfig *keyconf); struct MetaElem *add_metaball_primitive(struct bContext *C, float mat[4][4], int type, int newname); -int mouse_mball(struct bContext *C, short mval[2], int extend); +int mouse_mball(struct bContext *C, const short mval[2], int extend); void free_editMball(struct Object *obedit); void make_editMball(struct Object *obedit); diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 054e46971b5..c3c843154e5 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -169,7 +169,7 @@ void EM_project_snap_verts(struct bContext *C, struct ARegion *ar, struct Object extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs; void EM_cache_x_mirror_vert(struct Object *ob, struct EditMesh *em); -int mouse_mesh(struct bContext *C, short mval[2], short extend); +int mouse_mesh(struct bContext *C, const short mval[2], short extend); int EM_check_backbuf(unsigned int index); int EM_mask_init_backbuf_border(struct ViewContext *vc, short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax); void EM_free_backbuf(void); @@ -187,7 +187,7 @@ void EM_automerge(struct Scene *scene, struct Object *obedit, int update); /* editface.c */ void paintface_flush_flags(struct Object *ob); struct MTFace *EM_get_active_mtface(struct EditMesh *em, struct EditFace **act_efa, struct MCol **mcol, int sloppy); -int paintface_mouse_select(struct bContext *C, struct Object *ob, short mval[2], int extend); +int paintface_mouse_select(struct bContext *C, struct Object *ob, const short mval[2], int extend); int do_paintface_box_select(struct ViewContext *vc, struct rcti *rect, int select, int extend); void paintface_deselect_all_visible(struct Object *ob, int action, short flush_flags); void paintface_select_linked(struct bContext *C, struct Object *ob, short mval[2], int mode); diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index ce6a9d609db..3b27fb45f5d 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -126,7 +126,7 @@ void ED_object_constraint_update(struct Object *ob); void ED_object_constraint_dependency_update(struct Main *bmain, struct Scene *scene, struct Object *ob); /* object_lattice.c */ -int mouse_lattice(struct bContext *C, short mval[2], int extend); +int mouse_lattice(struct bContext *C, const short mval[2], int extend); void undo_push_lattice(struct bContext *C, const char *name); /* object_lattice.c */ diff --git a/source/blender/editors/include/ED_particle.h b/source/blender/editors/include/ED_particle.h index 7b4a2e6fe16..f29284fe64d 100644 --- a/source/blender/editors/include/ED_particle.h +++ b/source/blender/editors/include/ED_particle.h @@ -60,9 +60,9 @@ void PE_hide_keys_time(struct Scene *scene, struct PTCacheEdit *edit, float cfra void PE_update_object(struct Scene *scene, struct Object *ob, int useflag); /* selection tools */ -int PE_mouse_particles(struct bContext *C, short *mval, int extend); +int PE_mouse_particles(struct bContext *C, const short mval[2], int extend); int PE_border_select(struct bContext *C, struct rcti *rect, int select, int extend); -int PE_circle_select(struct bContext *C, int selecting, short *mval, float rad); +int PE_circle_select(struct bContext *C, int selecting, const short mval[2], float rad); int PE_lasso_select(struct bContext *C, short mcords[][2], short moves, short extend, short select); void PE_deselect_all_visible(struct PTCacheEdit *edit); diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index c741c41ff5e..3903cfa19a3 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -80,9 +80,9 @@ typedef struct ViewDepths { float *give_cursor(struct Scene *scene, struct View3D *v3d); int initgrabz(struct RegionView3D *rv3d, float x, float y, float z); -void window_to_3d(struct ARegion *ar, float *vec, short mx, short my); -void window_to_3d_delta(struct ARegion *ar, float *vec, short mx, short my); -void window_to_3d_vector(struct ARegion *ar, float *vec, short mx, short my); +void window_to_3d(struct ARegion *ar, float out[3], short mx, short my); +void window_to_3d_delta(struct ARegion *ar, float out[3], short mx, short my); +void window_to_3d_vector(struct ARegion *ar, float out[3], short mx, short my); void view3d_unproject(struct bglMats *mats, float out[3], const short x, const short y, const float z); /* Depth buffer */ @@ -95,14 +95,14 @@ void request_depth_update(struct RegionView3D *rv3d); void view3d_calculate_clipping(struct BoundBox *bb, float planes[4][4], struct bglMats *mats, struct rcti *rect); -void project_short(struct ARegion *ar, float *vec, short *adr); -void project_short_noclip(struct ARegion *ar, float *vec, short *adr); +void project_short(struct ARegion *ar, const float vec[3], short adr[2]); +void project_short_noclip(struct ARegion *ar, const float vec[3], short adr[2]); -void project_int(struct ARegion *ar, float *vec, int *adr); -void project_int_noclip(struct ARegion *ar, float *vec, int *adr); +void project_int(struct ARegion *ar, const float vec[3], int adr[2]); +void project_int_noclip(struct ARegion *ar, const float vec[3], int adr[2]); -void project_float(struct ARegion *ar, float *vec, float *adr); -void project_float_noclip(struct ARegion *ar, float *vec, float *adr); +void project_float(struct ARegion *ar, const float vec[3], float adr[2]); +void project_float_noclip(struct ARegion *ar, const float vec[3], float adr[2]); void viewvector(struct RegionView3D *rv3d, float coord[3], float vec[3]); @@ -113,7 +113,7 @@ int get_view3d_cliprange(struct View3D *v3d, struct RegionView3D *rv3d, float *c int get_view3d_viewplane(struct View3D *v3d, struct RegionView3D *rv3d, int winxi, int winyi, struct rctf *viewplane, float *clipsta, float *clipend, float *pixsize); int get_view3d_ortho(struct View3D *v3d, struct RegionView3D *rv3d); void view3d_get_object_project_mat(struct RegionView3D *v3d, struct Object *ob, float pmat[4][4]); -void view3d_project_float(struct ARegion *a, float *vec, float *adr, float mat[4][4]); +void view3d_project_float(struct ARegion *a, const float vec[3], float adr[2], float mat[4][4]); void view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struct RegionView3D *rv3d, struct View3D *v3d, struct rctf *viewborder_r, short do_shift); /* drawobject.c iterators */ @@ -124,7 +124,7 @@ void nurbs_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData void lattice_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct BPoint *bp, int x, int y), void *userData); void ED_view3d_local_clipping(struct RegionView3D *rv3d, float mat[][4]); -int view3d_test_clipping(struct RegionView3D *rv3d, float *vec, int local); +int view3d_test_clipping(struct RegionView3D *rv3d, const float vec[3], const int local); void view3d_align_axis_to_vector(struct View3D *v3d, struct RegionView3D *rv3d, int axisidx, float vec[3]); float view3d_pixel_size(struct RegionView3D *rv3d, const float co[3]); @@ -133,18 +133,18 @@ void drawcircball(int mode, const float cent[3], float rad, float tmat[][4]); /* backbuffer select and draw support */ void view3d_validate_backbuf(struct ViewContext *vc); struct ImBuf *view3d_read_backbuf(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax); -unsigned int view3d_sample_backbuf_rect(struct ViewContext *vc, short mval[2], int size, unsigned int min, unsigned int max, int *dist, short strict, +unsigned int view3d_sample_backbuf_rect(struct ViewContext *vc, const short mval[2], int size, unsigned int min, unsigned int max, int *dist, short strict, void *handle, unsigned int (*indextest)(void *handle, unsigned int index)); unsigned int view3d_sample_backbuf(struct ViewContext *vc, int x, int y); /* draws and does a 4x4 sample */ -int view_autodist(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, short *mval, float mouse_worldloc[3]); +int view_autodist(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, const short mval[2], float mouse_worldloc[3]); /* only draw so view_autodist_simple can be called many times after */ int view_autodist_init(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, int mode); -int view_autodist_simple(struct ARegion *ar, short mval[2], float mouse_worldloc[3], int margin, float *force_depth); -int view_autodist_depth(struct ARegion *ar, short mval[2], int margin, float *depth); -int view_autodist_depth_segment(struct ARegion *ar, short mval_sta[2], short mval_end[2], int margin, float *depth); +int view_autodist_simple(struct ARegion *ar, const short mval[2], float mouse_worldloc[3], int margin, float *force_depth); +int view_autodist_depth(struct ARegion *ar, const short mval[2], int margin, float *depth); +int view_autodist_depth_segment(struct ARegion *ar, const short mval_sta[2], const short mval_end[2], int margin, float *depth); /* select */ #define MAXPICKBUF 10000 @@ -153,7 +153,7 @@ short view3d_opengl_select(struct ViewContext *vc, unsigned int *buffer, unsigne void view3d_set_viewcontext(struct bContext *C, struct ViewContext *vc); void view3d_operator_needs_opengl(const struct bContext *C); void view3d_region_operator_needs_opengl(struct wmWindow *win, struct ARegion *ar); -void view3d_get_view_aligned_coordinate(struct ViewContext *vc, float *fp, short mval[2]); +void view3d_get_view_aligned_coordinate(struct ViewContext *vc, float fp[3], const short mval[2]); void view3d_get_transformation(struct ARegion *ar, struct RegionView3D *rv3d, struct Object *ob, struct bglMats *mats); /* XXX should move to BLI_math */ @@ -176,7 +176,7 @@ struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype, char err_out[256]); -Base *ED_view3d_give_base_under_cursor(struct bContext *C, short *mval); +Base *ED_view3d_give_base_under_cursor(struct bContext *C, const short mval[2]); void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, short do_clip); int ED_view3d_lock(struct RegionView3D *rv3d); diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index af3716b4677..9cec034af28 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -98,7 +98,7 @@ void paintface_flush_flags(Object *ob) } /* returns 0 if not found, otherwise 1 */ -static int facesel_face_pick(struct bContext *C, Mesh *me, short *mval, unsigned int *index, short rect) +static int facesel_face_pick(struct bContext *C, Mesh *me, const short mval[2], unsigned int *index, short rect) { ViewContext vc; view3d_set_viewcontext(C, &vc); @@ -716,7 +716,7 @@ void seam_mark_clear_tface(Scene *scene, short mode) } #endif -int paintface_mouse_select(struct bContext *C, Object *ob, short mval[2], int extend) +int paintface_mouse_select(struct bContext *C, Object *ob, const short mval[2], int extend) { Mesh *me; MFace *mface, *msel; diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 789c5c9c749..1ae6fb0bd98 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -2061,7 +2061,7 @@ void MESH_OT_loop_multi_select(wmOperatorType *ot) /* ***************** loop select (non modal) ************** */ -static void mouse_mesh_loop(bContext *C, short mval[2], short extend, short ring) +static void mouse_mesh_loop(bContext *C, const short mval[2], short extend, short ring) { ViewContext vc; EditMesh *em; @@ -2149,7 +2149,7 @@ void MESH_OT_loop_select(wmOperatorType *ot) /* ******************* mesh shortest path select, uses prev-selected edge ****************** */ /* since you want to create paths with multiple selects, it doesn't have extend option */ -static void mouse_mesh_shortest_path(bContext *C, short mval[2]) +static void mouse_mesh_shortest_path(bContext *C, const short mval[2]) { ViewContext vc; EditMesh *em; @@ -2282,7 +2282,7 @@ void MESH_OT_select_shortest_path(wmOperatorType *ot) /* here actual select happens */ /* gets called via generic mouse select operator */ -int mouse_mesh(bContext *C, short mval[2], short extend) +int mouse_mesh(bContext *C, const short mval[2], short extend) { ViewContext vc; EditVert *eve; diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 83840f0f4cb..5901a36980c 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -4857,7 +4857,7 @@ void mesh_set_face_flags(EditMesh *em, short mode) /********************** Rip Operator *************************/ /* helper to find edge for edge_rip */ -static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, short *mval) +static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, const short mval[2]) { float vec1[3], vec2[3], mvalf[2]; diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c index d3e1401b20e..b67f9d6de29 100644 --- a/source/blender/editors/metaball/mball_edit.c +++ b/source/blender/editors/metaball/mball_edit.c @@ -455,7 +455,7 @@ void MBALL_OT_reveal_metaelems(wmOperatorType *ot) /* Select MetaElement with mouse click (user can select radius circle or * stiffness circle) */ -int mouse_mball(bContext *C, short mval[2], int extend) +int mouse_mball(bContext *C, const short mval[2], int extend) { static MetaElem *startelem=NULL; Object *obedit= CTX_data_edit_object(C); diff --git a/source/blender/editors/object/object_lattice.c b/source/blender/editors/object/object_lattice.c index 72bf3b52b74..198c8cab7fa 100644 --- a/source/blender/editors/object/object_lattice.c +++ b/source/blender/editors/object/object_lattice.c @@ -318,7 +318,7 @@ static void findnearestLattvert__doClosest(void *userData, BPoint *bp, int x, in } } -static BPoint *findnearestLattvert(ViewContext *vc, short mval[2], int sel) +static BPoint *findnearestLattvert(ViewContext *vc, const short mval[2], int sel) { /* sel==1: selected gets a disadvantage */ /* in nurb and bezt or bp the nearest is written */ @@ -336,7 +336,7 @@ static BPoint *findnearestLattvert(ViewContext *vc, short mval[2], int sel) return data.bp; } -int mouse_lattice(bContext *C, short mval[2], int extend) +int mouse_lattice(bContext *C, const short mval[2], int extend) { ViewContext vc; BPoint *bp= NULL; diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index d7df329816d..1c9f9e60e14 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -338,7 +338,7 @@ typedef struct PEData { DerivedMesh *dm; PTCacheEdit *edit; - short *mval; + const short *mval; rcti *rect; float rad; float dist; @@ -1369,7 +1369,7 @@ void PARTICLE_OT_select_all(wmOperatorType *ot) /************************ pick select operator ************************/ -int PE_mouse_particles(bContext *C, short *mval, int extend) +int PE_mouse_particles(bContext *C, const short mval[2], int extend) { PEData data; Scene *scene= CTX_data_scene(C); @@ -1574,7 +1574,7 @@ int PE_border_select(bContext *C, rcti *rect, int select, int extend) /************************ circle select operator ************************/ -int PE_circle_select(bContext *C, int selecting, short *mval, float rad) +int PE_circle_select(bContext *C, int selecting, const short mval[2], float rad) { Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_active_object(C); diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index 4aa56ef370d..78368d91378 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -70,7 +70,7 @@ static bNode *node_under_mouse(bNodeTree *ntree, int mx, int my) /* ****** Click Select ****** */ -static bNode *node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short extend) +static bNode *node_mouse_select(SpaceNode *snode, ARegion *ar, const short mval[2], short extend) { bNode *node; float mx, my; diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c index 6172f212aef..1ae36b077af 100644 --- a/source/blender/editors/space_node/node_state.c +++ b/source/blender/editors/space_node/node_state.c @@ -158,7 +158,7 @@ static int do_header_hidden_node(bNode *node, float mx, float my) return 0; } -static int node_toggle_visibility(SpaceNode *snode, ARegion *ar, short *mval) +static int node_toggle_visibility(SpaceNode *snode, ARegion *ar, const short mval[2]) { bNode *node; float mx, my; diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 88d83b55788..92fae3d4820 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -284,7 +284,7 @@ static Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, i } -Sequence *find_nearest_seq(Scene *scene, View2D *v2d, int *hand, short mval[2]) +Sequence *find_nearest_seq(Scene *scene, View2D *v2d, int *hand, const short mval[2]) { Sequence *seq; Editing *ed= seq_give_editing(scene, FALSE); diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h index f29919476cc..9a4796ced5e 100644 --- a/source/blender/editors/space_sequencer/sequencer_intern.h +++ b/source/blender/editors/space_sequencer/sequencer_intern.h @@ -61,7 +61,7 @@ void seq_reset_imageofs(struct SpaceSeq *sseq); struct View2D; void seq_rectf(struct Sequence *seq, struct rctf *rectf); void boundbox_seq(struct Scene *scene, struct rctf *rect); -struct Sequence *find_nearest_seq(struct Scene *scene, struct View2D *v2d, int *hand, short mval[2]); +struct Sequence *find_nearest_seq(struct Scene *scene, struct View2D *v2d, int *hand, const short mval[2]); struct Sequence *find_neighboring_sequence(struct Scene *scene, struct Sequence *test, int lr, int sel); void deselect_all_seq(struct Scene *scene); void recurs_sel_seq(struct Sequence *seqm); diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index 091018670ba..c0c928dcb24 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -2283,7 +2283,7 @@ static int scroll_bar_invoke(bContext *C, wmOperator *op, wmEvent *event) SpaceText *st= CTX_wm_space_text(C); ARegion *ar= CTX_wm_region(C); TextScroll *tsc; - short *mval= event->mval; + const short *mval= event->mval; int zone= -1; if(RNA_property_is_set(op->ptr, "lines")) @@ -2694,7 +2694,7 @@ static int line_number_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *even SpaceText *st= CTX_wm_space_text(C); Text *text= CTX_data_edit_text(C); ARegion *ar= CTX_wm_region(C); - short *mval= event->mval; + const short *mval= event->mval; double time; static int jump_to= 0; static double last_jump= 0; diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 345b3746100..78538a6f16d 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -189,7 +189,7 @@ void view3d_clr_clipping(void) } } -static int test_clipping(float *vec, float clip[][4]) +static int test_clipping(const float vec[3], float clip[][4]) { float view[3]; copy_v3_v3(view, vec); @@ -205,7 +205,7 @@ static int test_clipping(float *vec, float clip[][4]) /* for 'local' ED_view3d_local_clipping must run first * then all comparisons can be done in localspace */ -int view3d_test_clipping(RegionView3D *rv3d, float *vec, int local) +int view3d_test_clipping(RegionView3D *rv3d, const float vec[3], const int local) { return test_clipping(vec, local ? rv3d->clip_local : rv3d->clip); } @@ -1172,7 +1172,7 @@ ImBuf *view3d_read_backbuf(ViewContext *vc, short xmin, short ymin, short xmax, } /* smart function to sample a rect spiralling outside, nice for backbuf selection */ -unsigned int view3d_sample_backbuf_rect(ViewContext *vc, short mval[2], int size, +unsigned int view3d_sample_backbuf_rect(ViewContext *vc, const short mval[2], int size, unsigned int min, unsigned int max, int *dist, short strict, void *handle, unsigned int (*indextest)(void *handle, unsigned int index)) { diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 98742bd0c7c..67576c188af 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -2650,7 +2650,7 @@ void VIEW3D_OT_enable_manipulator(wmOperatorType *ot) /* ************************* below the line! *********************** */ -static float view_autodist_depth_margin(ARegion *ar, short mval[2], int margin) +static float view_autodist_depth_margin(ARegion *ar, const short mval[2], int margin) { ViewDepths depth_temp= {0}; rcti rect; @@ -2678,7 +2678,7 @@ static float view_autodist_depth_margin(ARegion *ar, short mval[2], int margin) } /* XXX todo Zooms in on a border drawn by the user */ -int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mouse_worldloc[3] ) //, float *autodist ) +int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, const short mval[2], float mouse_worldloc[3] ) //, float *autodist ) { bglMats mats; /* ZBuffer depth vars */ float depth_close= FLT_MAX; @@ -2721,7 +2721,7 @@ int view_autodist_init(Scene *scene, ARegion *ar, View3D *v3d, int mode) //, flo } // no 4x4 sampling, run view_autodist_init first -int view_autodist_simple(ARegion *ar, short *mval, float mouse_worldloc[3], int margin, float *force_depth) //, float *autodist ) +int view_autodist_simple(ARegion *ar, const short mval[2], float mouse_worldloc[3], int margin, float *force_depth) //, float *autodist ) { bglMats mats; /* ZBuffer depth vars, could cache? */ float depth; @@ -2749,7 +2749,7 @@ int view_autodist_simple(ARegion *ar, short *mval, float mouse_worldloc[3], int return 1; } -int view_autodist_depth(struct ARegion *ar, short mval[2], int margin, float *depth) +int view_autodist_depth(struct ARegion *ar, const short mval[2], int margin, float *depth) { *depth= view_autodist_depth_margin(ar, mval, margin); @@ -2776,7 +2776,7 @@ static int depth_segment_cb(int x, int y, void *userData) } } -int view_autodist_depth_segment(struct ARegion *ar, short mval_sta[2], short mval_end[2], int margin, float *depth) +int view_autodist_depth_segment(struct ARegion *ar, const short mval_sta[2], const short mval_end[2], int margin, float *depth) { struct { struct ARegion *ar; int margin; float depth; } data = {NULL}; int p1[2]; diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 75999fdeb6d..e8fbb3542fa 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -93,20 +93,20 @@ void view3d_set_viewcontext(bContext *C, ViewContext *vc) vc->obedit= CTX_data_edit_object(C); } -void view3d_get_view_aligned_coordinate(ViewContext *vc, float *fp, short mval[2]) +void view3d_get_view_aligned_coordinate(ViewContext *vc, float fp[3], const short mval[2]) { float dvec[3]; - short mx, my; - - mx= mval[0]; - my= mval[1]; - - project_short_noclip(vc->ar, fp, mval); - + short mval_cpy[2]; + + mval_cpy[0]= mval[0]; + mval_cpy[1]= mval[1]; + + project_short_noclip(vc->ar, fp, mval_cpy); + initgrabz(vc->rv3d, fp[0], fp[1], fp[2]); - - if(mval[0]!=IS_CLIPPED) { - window_to_3d_delta(vc->ar, dvec, mval[0]-mx, mval[1]-my); + + if(mval_cpy[0]!=IS_CLIPPED) { + window_to_3d_delta(vc->ar, dvec, mval_cpy[0]-mval[0], mval_cpy[1]-mval[1]); sub_v3_v3(fp, dvec); } } @@ -941,7 +941,7 @@ static void deselectall_except(Scene *scene, Base *b) /* deselect all except b } } -static Base *mouse_select_menu(bContext *C, ViewContext *vc, unsigned int *buffer, int hits, short *mval, short extend) +static Base *mouse_select_menu(bContext *C, ViewContext *vc, unsigned int *buffer, int hits, const short mval[2], short extend) { short baseCount = 0; short ok; @@ -1027,7 +1027,7 @@ static Base *mouse_select_menu(bContext *C, ViewContext *vc, unsigned int *buffe /* we want a select buffer with bones, if there are... */ /* so check three selection levels and compare */ -static short mixed_bones_object_selectbuffer(ViewContext *vc, unsigned int *buffer, short *mval) +static short mixed_bones_object_selectbuffer(ViewContext *vc, unsigned int *buffer, const short mval[2]) { rcti rect; int offs; @@ -1084,7 +1084,7 @@ static short mixed_bones_object_selectbuffer(ViewContext *vc, unsigned int *buff } /* returns basact */ -static Base *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffer, int hits, short *mval, Base *startbase, int has_bones) +static Base *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffer, int hits, const short mval[2], Base *startbase, int has_bones) { Scene *scene= vc->scene; View3D *v3d= vc->v3d; @@ -1177,7 +1177,7 @@ static Base *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffer, int } /* mval comes from event->mval, only use within region handlers */ -Base *ED_view3d_give_base_under_cursor(bContext *C, short *mval) +Base *ED_view3d_give_base_under_cursor(bContext *C, const short mval[2]) { ViewContext vc; Base *basact= NULL; @@ -1202,7 +1202,7 @@ Base *ED_view3d_give_base_under_cursor(bContext *C, short *mval) } /* mval is region coords */ -static int mouse_select(bContext *C, short *mval, short extend, short obcenter, short enumerate) +static int mouse_select(bContext *C, const short mval[2], short extend, short obcenter, short enumerate) { ViewContext vc; ARegion *ar= CTX_wm_region(C); @@ -1920,7 +1920,7 @@ static void mesh_circle_doSelectFace(void *userData, EditFace *efa, int x, int y } } -static void mesh_circle_select(ViewContext *vc, int select, short *mval, float rad) +static void mesh_circle_select(ViewContext *vc, int select, const short mval[2], float rad) { ToolSettings *ts= vc->scene->toolsettings; int bbsel; @@ -1965,7 +1965,7 @@ static void mesh_circle_select(ViewContext *vc, int select, short *mval, float r EM_selectmode_flush(vc->em); } -static void paint_facesel_circle_select(ViewContext *vc, int select, short *mval, float rad) +static void paint_facesel_circle_select(ViewContext *vc, int select, const short mval[2], float rad) { Object *ob= vc->obact; Mesh *me = ob?ob->data:NULL; @@ -2012,7 +2012,7 @@ static void nurbscurve_circle_doSelect(void *userData, Nurb *UNUSED(nu), BPoint } } } -static void nurbscurve_circle_select(ViewContext *vc, int select, short *mval, float rad) +static void nurbscurve_circle_select(ViewContext *vc, int select, const short mval[2], float rad) { struct {ViewContext *vc; short select, mval[2]; float radius; } data; @@ -2039,7 +2039,7 @@ static void latticecurve_circle_doSelect(void *userData, BPoint *bp, int x, int bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT); } } -static void lattice_circle_select(ViewContext *vc, int select, short *mval, float rad) +static void lattice_circle_select(ViewContext *vc, int select, const short mval[2], float rad) { struct {ViewContext *vc; short select, mval[2]; float radius; } data; @@ -2071,7 +2071,7 @@ static short pchan_circle_doSelectJoint(void *userData, bPoseChannel *pchan, int } return 0; } -static void pose_circle_select(ViewContext *vc, int select, short *mval, float rad) +static void pose_circle_select(ViewContext *vc, int select, const short mval[2], float rad) { struct {ViewContext *vc; short select, mval[2]; float radius; } data; bPose *pose = vc->obact->pose; @@ -2139,7 +2139,7 @@ static short armature_circle_doSelectJoint(void *userData, EditBone *ebone, int } return 0; } -static void armature_circle_select(ViewContext *vc, int select, short *mval, float rad) +static void armature_circle_select(ViewContext *vc, int select, const short mval[2], float rad) { struct {ViewContext *vc; short select, mval[2]; float radius; } data; bArmature *arm= vc->obedit->data; @@ -2198,7 +2198,7 @@ static void armature_circle_select(ViewContext *vc, int select, short *mval, flo /** Callbacks for circle selection in Editmode */ -static void obedit_circle_select(ViewContext *vc, short select, short *mval, float rad) +static void obedit_circle_select(ViewContext *vc, short select, const short mval[2], float rad) { switch(vc->obedit->type) { case OB_MESH: diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 1fdc2d9cad7..6dae0938f54 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -646,25 +646,25 @@ int initgrabz(RegionView3D *rv3d, float x, float y, float z) } /* always call initgrabz */ -void window_to_3d(ARegion *ar, float *vec, short mx, short my) +void window_to_3d(ARegion *ar, float out[3], short mx, short my) { RegionView3D *rv3d= ar->regiondata; float dx= ((float)(mx-(ar->winx/2)))*rv3d->zfac/(ar->winx/2); float dy= ((float)(my-(ar->winy/2)))*rv3d->zfac/(ar->winy/2); - float fz= rv3d->persmat[0][3]*vec[0]+ rv3d->persmat[1][3]*vec[1]+ rv3d->persmat[2][3]*vec[2]+ rv3d->persmat[3][3]; + float fz= rv3d->persmat[0][3]*out[0]+ rv3d->persmat[1][3]*out[1]+ rv3d->persmat[2][3]*out[2]+ rv3d->persmat[3][3]; fz= fz/rv3d->zfac; - vec[0]= (rv3d->persinv[0][0]*dx + rv3d->persinv[1][0]*dy+ rv3d->persinv[2][0]*fz)-rv3d->ofs[0]; - vec[1]= (rv3d->persinv[0][1]*dx + rv3d->persinv[1][1]*dy+ rv3d->persinv[2][1]*fz)-rv3d->ofs[1]; - vec[2]= (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy+ rv3d->persinv[2][2]*fz)-rv3d->ofs[2]; + out[0]= (rv3d->persinv[0][0]*dx + rv3d->persinv[1][0]*dy+ rv3d->persinv[2][0]*fz)-rv3d->ofs[0]; + out[1]= (rv3d->persinv[0][1]*dx + rv3d->persinv[1][1]*dy+ rv3d->persinv[2][1]*fz)-rv3d->ofs[1]; + out[2]= (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy+ rv3d->persinv[2][2]*fz)-rv3d->ofs[2]; } /* always call initgrabz */ /* only to detect delta motion */ -void window_to_3d_delta(ARegion *ar, float *vec, short mx, short my) +void window_to_3d_delta(ARegion *ar, float out[3], short mx, short my) { RegionView3D *rv3d= ar->regiondata; float dx, dy; @@ -672,15 +672,15 @@ void window_to_3d_delta(ARegion *ar, float *vec, short mx, short my) dx= 2.0f*mx*rv3d->zfac/ar->winx; dy= 2.0f*my*rv3d->zfac/ar->winy; - vec[0]= (rv3d->persinv[0][0]*dx + rv3d->persinv[1][0]*dy); - vec[1]= (rv3d->persinv[0][1]*dx + rv3d->persinv[1][1]*dy); - vec[2]= (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy); + out[0]= (rv3d->persinv[0][0]*dx + rv3d->persinv[1][0]*dy); + out[1]= (rv3d->persinv[0][1]*dx + rv3d->persinv[1][1]*dy); + out[2]= (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy); } /* doesn't rely on initgrabz */ /* for perspective view, get the vector direction to * the mouse cursor as a normalized vector */ -void window_to_3d_vector(ARegion *ar, float *vec, short mx, short my) +void window_to_3d_vector(ARegion *ar, float out[3], short mx, short my) { RegionView3D *rv3d= ar->regiondata; float dx, dy; @@ -692,11 +692,11 @@ void window_to_3d_vector(ARegion *ar, float *vec, short mx, short my) /* normalize here so vecs are proportional to eachother */ normalize_v3_v3(viewvec, rv3d->viewinv[2]); - vec[0]= viewvec[0] - (rv3d->persinv[0][0]*dx + rv3d->persinv[1][0]*dy); - vec[1]= viewvec[1] - (rv3d->persinv[0][1]*dx + rv3d->persinv[1][1]*dy); - vec[2]= viewvec[2] - (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy); + out[0]= viewvec[0] - (rv3d->persinv[0][0]*dx + rv3d->persinv[1][0]*dy); + out[1]= viewvec[1] - (rv3d->persinv[0][1]*dx + rv3d->persinv[1][1]*dy); + out[2]= viewvec[2] - (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy); - normalize_v3(vec); + normalize_v3(out); } float read_cached_depth(ViewContext *vc, int x, int y) @@ -740,7 +740,7 @@ void view3d_unproject(bglMats *mats, float out[3], const short x, const short y, } /* use above call to get projecting mat */ -void view3d_project_float(ARegion *ar, float *vec, float *adr, float mat[4][4]) +void view3d_project_float(ARegion *ar, const float vec[3], float adr[2], float mat[4][4]) { float vec4[4]; @@ -793,7 +793,7 @@ int boundbox_clip(RegionView3D *rv3d, float obmat[][4], BoundBox *bb) return 0; } -void project_short(ARegion *ar, float *vec, short *adr) /* clips */ +void project_short(ARegion *ar, const float vec[3], short adr[2]) /* clips */ { RegionView3D *rv3d= ar->regiondata; float fx, fy, vec4[4]; @@ -824,7 +824,7 @@ void project_short(ARegion *ar, float *vec, short *adr) /* clips */ } } -void project_int(ARegion *ar, float *vec, int *adr) +void project_int(ARegion *ar, const float vec[3], int adr[2]) { RegionView3D *rv3d= ar->regiondata; float fx, fy, vec4[4]; @@ -849,7 +849,7 @@ void project_int(ARegion *ar, float *vec, int *adr) } } -void project_int_noclip(ARegion *ar, float *vec, int *adr) +void project_int_noclip(ARegion *ar, const float vec[3], int adr[2]) { RegionView3D *rv3d= ar->regiondata; float fx, fy, vec4[4]; @@ -873,7 +873,7 @@ void project_int_noclip(ARegion *ar, float *vec, int *adr) } } -void project_short_noclip(ARegion *ar, float *vec, short *adr) +void project_short_noclip(ARegion *ar, const float vec[3], short adr[2]) { RegionView3D *rv3d= ar->regiondata; float fx, fy, vec4[4]; @@ -899,7 +899,7 @@ void project_short_noclip(ARegion *ar, float *vec, short *adr) } } -void project_float(ARegion *ar, float *vec, float *adr) +void project_float(ARegion *ar, const float vec[3], float adr[2]) { RegionView3D *rv3d= ar->regiondata; float vec4[4]; @@ -916,7 +916,7 @@ void project_float(ARegion *ar, float *vec, float *adr) } } -void project_float_noclip(ARegion *ar, float *vec, float *adr) +void project_float_noclip(ARegion *ar, const float vec[3], float adr[2]) { RegionView3D *rv3d= ar->regiondata; float vec4[4]; diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index c710312606d..ae863efa9f7 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -2283,7 +2283,7 @@ int handleEventWarp(TransInfo *t, wmEvent *event) return status; } -int Warp(TransInfo *t, short UNUSED(mval[2])) +int Warp(TransInfo *t, const short UNUSED(mval[2])) { TransData *td = t->data; float vec[3], circumfac, dist, phi0, co, si, *curs, cursor[3], gcursor[3]; @@ -2431,7 +2431,7 @@ int handleEventShear(TransInfo *t, wmEvent *event) } -int Shear(TransInfo *t, short UNUSED(mval[2])) +int Shear(TransInfo *t, const short UNUSED(mval[2])) { TransData *td = t->data; float vec[3]; @@ -2697,7 +2697,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) { constraintTransLim(t, td); } -int Resize(TransInfo *t, short mval[2]) +int Resize(TransInfo *t, const short mval[2]) { TransData *td; float size[3], mat[3][3]; @@ -2802,7 +2802,7 @@ void initToSphere(TransInfo *t) t->val /= (float)t->total; } -int ToSphere(TransInfo *t, short UNUSED(mval[2])) +int ToSphere(TransInfo *t, const short UNUSED(mval[2])) { float vec[3]; float ratio, radius; @@ -3149,7 +3149,7 @@ static void applyRotation(TransInfo *t, float angle, float axis[3]) } } -int Rotation(TransInfo *t, short UNUSED(mval[2])) +int Rotation(TransInfo *t, const short UNUSED(mval[2])) { char str[128]; @@ -3255,7 +3255,7 @@ static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float a } } -int Trackball(TransInfo *t, short UNUSED(mval[2])) +int Trackball(TransInfo *t, const short UNUSED(mval[2])) { char str[128]; float axis1[3], axis2[3]; @@ -3477,7 +3477,7 @@ static void applyTranslation(TransInfo *t, float vec[3]) { } /* uses t->vec to store actual translation in */ -int Translation(TransInfo *t, short UNUSED(mval[2])) +int Translation(TransInfo *t, const short UNUSED(mval[2])) { char str[250]; @@ -3544,7 +3544,7 @@ void initShrinkFatten(TransInfo *t) -int ShrinkFatten(TransInfo *t, short UNUSED(mval[2])) +int ShrinkFatten(TransInfo *t, const short UNUSED(mval[2])) { float vec[3]; float distance; @@ -3619,7 +3619,7 @@ void initTilt(TransInfo *t) -int Tilt(TransInfo *t, short UNUSED(mval[2])) +int Tilt(TransInfo *t, const short UNUSED(mval[2])) { TransData *td = t->data; int i; @@ -3691,7 +3691,7 @@ void initCurveShrinkFatten(TransInfo *t) t->flag |= T_NO_CONSTRAINT; } -int CurveShrinkFatten(TransInfo *t, short UNUSED(mval[2])) +int CurveShrinkFatten(TransInfo *t, const short UNUSED(mval[2])) { TransData *td = t->data; float ratio; @@ -3759,7 +3759,7 @@ void initPushPull(TransInfo *t) } -int PushPull(TransInfo *t, short UNUSED(mval[2])) +int PushPull(TransInfo *t, const short UNUSED(mval[2])) { float vec[3], axis[3]; float distance; @@ -3892,7 +3892,7 @@ int handleEventBevel(TransInfo *t, wmEvent *event) return 0; } -int Bevel(TransInfo *t, short UNUSED(mval[2])) +int Bevel(TransInfo *t, const short UNUSED(mval[2])) { float distance,d; int i; @@ -3960,7 +3960,7 @@ void initBevelWeight(TransInfo *t) t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT; } -int BevelWeight(TransInfo *t, short UNUSED(mval[2])) +int BevelWeight(TransInfo *t, const short UNUSED(mval[2])) { TransData *td = t->data; float weight; @@ -4033,7 +4033,7 @@ void initCrease(TransInfo *t) t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT; } -int Crease(TransInfo *t, short UNUSED(mval[2])) +int Crease(TransInfo *t, const short UNUSED(mval[2])) { TransData *td = t->data; float crease; @@ -4152,7 +4152,7 @@ static void ElementBoneSize(TransInfo *t, TransData *td, float mat[3][3]) td->loc[1]= oldy; } -int BoneSize(TransInfo *t, short mval[2]) +int BoneSize(TransInfo *t, const short mval[2]) { TransData *td = t->data; float size[3], mat[3][3]; @@ -4228,7 +4228,7 @@ void initBoneEnvelope(TransInfo *t) t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT; } -int BoneEnvelope(TransInfo *t, short UNUSED(mval[2])) +int BoneEnvelope(TransInfo *t, const short UNUSED(mval[2])) { TransData *td = t->data; float ratio; @@ -4962,7 +4962,7 @@ int doEdgeSlide(TransInfo *t, float perc) return 1; } -int EdgeSlide(TransInfo *t, short UNUSED(mval[2])) +int EdgeSlide(TransInfo *t, const short UNUSED(mval[2])) { char str[50]; float final; @@ -5021,7 +5021,7 @@ void initBoneRoll(TransInfo *t) t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT; } -int BoneRoll(TransInfo *t, short UNUSED(mval[2])) +int BoneRoll(TransInfo *t, const short UNUSED(mval[2])) { TransData *td = t->data; int i; @@ -5082,7 +5082,7 @@ void initBakeTime(TransInfo *t) t->num.increment = t->snap[1]; } -int BakeTime(TransInfo *t, short mval[2]) +int BakeTime(TransInfo *t, const short mval[2]) { TransData *td = t->data; float time; @@ -5157,7 +5157,7 @@ void initMirror(TransInfo *t) } } -int Mirror(TransInfo *t, short UNUSED(mval[2])) +int Mirror(TransInfo *t, const short UNUSED(mval[2])) { TransData *td; float size[3], mat[3][3]; @@ -5234,7 +5234,7 @@ void initAlign(TransInfo *t) initMouseInputMode(t, &t->mouse, INPUT_NONE); } -int Align(TransInfo *t, short UNUSED(mval[2])) +int Align(TransInfo *t, const short UNUSED(mval[2])) { TransData *td = t->data; float center[3]; @@ -5337,7 +5337,7 @@ static void applySeqSlide(TransInfo *t, float val[2]) { } } -int SeqSlide(TransInfo *t, short UNUSED(mval[2])) +int SeqSlide(TransInfo *t, const short UNUSED(mval[2])) { char str[200]; @@ -5627,7 +5627,7 @@ static void applyTimeTranslate(TransInfo *t, float UNUSED(sval)) } } -int TimeTranslate(TransInfo *t, short mval[2]) +int TimeTranslate(TransInfo *t, const short mval[2]) { View2D *v2d = (View2D *)t->view; float cval[2], sval[2]; @@ -5757,7 +5757,7 @@ static void applyTimeSlide(TransInfo *t, float sval) } } -int TimeSlide(TransInfo *t, short mval[2]) +int TimeSlide(TransInfo *t, const short mval[2]) { View2D *v2d = (View2D *)t->view; float cval[2], sval[2]; @@ -5882,7 +5882,7 @@ static void applyTimeScale(TransInfo *t) { } } -int TimeScale(TransInfo *t, short UNUSED(mval[2])) +int TimeScale(TransInfo *t, const short UNUSED(mval[2])) { char str[200]; diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index b0bd4ccc5eb..b94f2cc525a 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -242,7 +242,7 @@ typedef struct TransData { } TransData; typedef struct MouseInput { - void (*apply)(struct TransInfo *, struct MouseInput *, short [2], float [3]); + void (*apply)(struct TransInfo *, struct MouseInput *, const short [2], float [3]); void (*post)(struct TransInfo *, float [3]); short imval[2]; /* initial mouse position */ @@ -261,7 +261,7 @@ typedef struct TransInfo { int options; /* current context/options for transform */ float val; /* init value for some transformations (and rotation angle) */ float fac; /* factor for distance based transform */ - int (*transform)(struct TransInfo *, short *); + int (*transform)(struct TransInfo *, const short *); /* transform function pointer */ int (*handleEvent)(struct TransInfo *, struct wmEvent *); /* event handler function pointer RETURN 1 if redraw is needed */ @@ -467,81 +467,81 @@ void removeAspectRatio(TransInfo *t, float *vec); void initWarp(TransInfo *t); int handleEventWarp(TransInfo *t, struct wmEvent *event); -int Warp(TransInfo *t, short mval[2]); +int Warp(TransInfo *t, const short mval[2]); void initShear(TransInfo *t); int handleEventShear(TransInfo *t, struct wmEvent *event); -int Shear(TransInfo *t, short mval[2]); +int Shear(TransInfo *t, const short mval[2]); void initResize(TransInfo *t); -int Resize(TransInfo *t, short mval[2]); +int Resize(TransInfo *t, const short mval[2]); void initTranslation(TransInfo *t); -int Translation(TransInfo *t, short mval[2]); +int Translation(TransInfo *t, const short mval[2]); void initToSphere(TransInfo *t); -int ToSphere(TransInfo *t, short mval[2]); +int ToSphere(TransInfo *t, const short mval[2]); void initRotation(TransInfo *t); -int Rotation(TransInfo *t, short mval[2]); +int Rotation(TransInfo *t, const short mval[2]); void initShrinkFatten(TransInfo *t); -int ShrinkFatten(TransInfo *t, short mval[2]); +int ShrinkFatten(TransInfo *t, const short mval[2]); void initTilt(TransInfo *t); -int Tilt(TransInfo *t, short mval[2]); +int Tilt(TransInfo *t, const short mval[2]); void initCurveShrinkFatten(TransInfo *t); -int CurveShrinkFatten(TransInfo *t, short mval[2]); +int CurveShrinkFatten(TransInfo *t, const short mval[2]); void initTrackball(TransInfo *t); -int Trackball(TransInfo *t, short mval[2]); +int Trackball(TransInfo *t, const short mval[2]); void initPushPull(TransInfo *t); -int PushPull(TransInfo *t, short mval[2]); +int PushPull(TransInfo *t, const short mval[2]); void initBevel(TransInfo *t); int handleEventBevel(TransInfo *t, struct wmEvent *event); -int Bevel(TransInfo *t, short mval[2]); +int Bevel(TransInfo *t, const short mval[2]); void initBevelWeight(TransInfo *t); -int BevelWeight(TransInfo *t, short mval[2]); +int BevelWeight(TransInfo *t, const short mval[2]); void initCrease(TransInfo *t); -int Crease(TransInfo *t, short mval[2]); +int Crease(TransInfo *t, const short mval[2]); void initBoneSize(TransInfo *t); -int BoneSize(TransInfo *t, short mval[2]); +int BoneSize(TransInfo *t, const short mval[2]); void initBoneEnvelope(TransInfo *t); -int BoneEnvelope(TransInfo *t, short mval[2]); +int BoneEnvelope(TransInfo *t, const short mval[2]); void initBoneRoll(TransInfo *t); -int BoneRoll(TransInfo *t, short mval[2]); +int BoneRoll(TransInfo *t, const short mval[2]); void initEdgeSlide(TransInfo *t); -int EdgeSlide(TransInfo *t, short mval[2]); +int EdgeSlide(TransInfo *t, const short mval[2]); void initTimeTranslate(TransInfo *t); -int TimeTranslate(TransInfo *t, short mval[2]); +int TimeTranslate(TransInfo *t, const short mval[2]); void initTimeSlide(TransInfo *t); -int TimeSlide(TransInfo *t, short mval[2]); +int TimeSlide(TransInfo *t, const short mval[2]); void initTimeScale(TransInfo *t); -int TimeScale(TransInfo *t, short mval[2]); +int TimeScale(TransInfo *t, const short mval[2]); void initBakeTime(TransInfo *t); -int BakeTime(TransInfo *t, short mval[2]); +int BakeTime(TransInfo *t, const short mval[2]); void initMirror(TransInfo *t); -int Mirror(TransInfo *t, short mval[2]); +int Mirror(TransInfo *t, const short mval[2]); void initAlign(TransInfo *t); -int Align(TransInfo *t, short mval[2]); +int Align(TransInfo *t, const short mval[2]); void initSeqSlide(TransInfo *t); -int SeqSlide(TransInfo *t, short mval[2]); +int SeqSlide(TransInfo *t, const short mval[2]); void drawPropCircle(const struct bContext *C, TransInfo *t); diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index 45ed983fce5..5097c12d785 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -43,7 +43,7 @@ /* ************************** INPUT FROM MOUSE *************************** */ -static void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) +static void InputVector(TransInfo *t, MouseInput *mi, const short mval[2], float output[3]) { float vec[3], dvec[3]; if(mi->precision) @@ -61,7 +61,7 @@ static void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float outpu } -static void InputSpring(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) +static void InputSpring(TransInfo *UNUSED(t), MouseInput *mi, const short mval[2], float output[3]) { float ratio, precise_ratio, dx, dy; if(mi->precision) @@ -87,7 +87,7 @@ static void InputSpring(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], flo output[0] = ratio; } -static void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) +static void InputSpringFlip(TransInfo *t, MouseInput *mi, const short mval[2], float output[3]) { InputSpring(t, mi, mval, output); @@ -100,7 +100,7 @@ static void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float o } } -static void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) +static void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, const short mval[2], float output[3]) { if(mi->precision) @@ -118,7 +118,7 @@ static void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], output[1] *= mi->factor; } -static void InputHorizontalRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { +static void InputHorizontalRatio(TransInfo *t, MouseInput *mi, const short mval[2], float output[3]) { float x, pad; pad = t->ar->winx / 10; @@ -135,7 +135,7 @@ static void InputHorizontalRatio(TransInfo *t, MouseInput *mi, short mval[2], fl output[0] = (x - pad) / (t->ar->winx - 2 * pad); } -static void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { +static void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, const short mval[2], float output[3]) { float vec[3]; InputVector(t, mi, mval, vec); @@ -144,7 +144,7 @@ static void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], output[0] = dot_v3v3(t->viewinv[0], vec) * 2.0f; } -static void InputVerticalRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { +static void InputVerticalRatio(TransInfo *t, MouseInput *mi, const short mval[2], float output[3]) { float y, pad; pad = t->ar->winy / 10; @@ -160,7 +160,7 @@ static void InputVerticalRatio(TransInfo *t, MouseInput *mi, short mval[2], floa output[0] = (y - pad) / (t->ar->winy - 2 * pad); } -static void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { +static void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, const short mval[2], float output[3]) { float vec[3]; InputVector(t, mi, mval, vec); @@ -185,7 +185,7 @@ void setCustomPoints(TransInfo *UNUSED(t), MouseInput *mi, short start[2], short data[3] = end[1]; } -static void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) +static void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, const short mval[2], float output[3]) { float length; float distance; @@ -218,7 +218,7 @@ static void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, short mval[2] } } -static void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) +static void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, const short mval[2], float output[3]) { double dx2 = mval[0] - mi->center[0]; double dy2 = mval[1] - mi->center[1]; diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index da1a1b91654..2fa094c6b8b 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -1487,7 +1487,7 @@ void BIF_draw_manipulator(const bContext *C) } } -static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, short *mval, float hotspot) +static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, const short mval[2], float hotspot) { View3D *v3d= sa->spacedata.first; RegionView3D *rv3d= ar->regiondata; diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c index 746649e27ca..67d20d56466 100644 --- a/source/blender/imbuf/intern/tiff.c +++ b/source/blender/imbuf/intern/tiff.c @@ -605,8 +605,7 @@ void imb_loadtiletiff(ImBuf *ibuf, unsigned char *mem, size_t size, int tx, int return; } - if(TIFFSetDirectory(image, ibuf->miplevel)) { - /* allocate the image buffer */ + if(TIFFSetDirectory(image, ibuf->miplevel)) { /* allocate the image buffer */ TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height); From b52637270d776db4845a32718272e0cc1deff3a8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 21 Apr 2011 18:33:30 +0000 Subject: [PATCH 70/88] bugfix [#27091] Add new vertex at wrong position ( bpy.ops.mesh.dupli_extrude_cursor() ) 2 Ctrl+Click on mesh or curve view was using the selected points location or the cursors. if either of these was behind the view it would add the point at (0, 0, 0). now fallback to the view orbit pivot, added this option as an argument to view3d_get_view_aligned_coordinate(). --- source/blender/editors/curve/editcurve.c | 2 +- source/blender/editors/include/ED_view3d.h | 2 +- source/blender/editors/mesh/editmesh_add.c | 6 +++--- .../blender/editors/space_view3d/view3d_select.c | 14 +++++++++++++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 4365bf69308..1ab7acef861 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -4692,7 +4692,7 @@ static int add_vertex_invoke(bContext *C, wmOperator *op, wmEvent *event) mval[0]= event->x - vc.ar->winrct.xmin; mval[1]= event->y - vc.ar->winrct.ymin; - view3d_get_view_aligned_coordinate(&vc, location, mval); + view3d_get_view_aligned_coordinate(&vc, location, mval, TRUE); RNA_float_set_array(op->ptr, "location", location); } diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index 3903cfa19a3..a3e99e6358e 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -153,7 +153,7 @@ short view3d_opengl_select(struct ViewContext *vc, unsigned int *buffer, unsigne void view3d_set_viewcontext(struct bContext *C, struct ViewContext *vc); void view3d_operator_needs_opengl(const struct bContext *C); void view3d_region_operator_needs_opengl(struct wmWindow *win, struct ARegion *ar); -void view3d_get_view_aligned_coordinate(struct ViewContext *vc, float fp[3], const short mval[2]); +int view3d_get_view_aligned_coordinate(struct ViewContext *vc, float fp[3], const short mval[2], const short do_fallback); void view3d_get_transformation(struct ARegion *ar, struct RegionView3D *rv3d, struct Object *ob, struct bglMats *mats); /* XXX should move to BLI_math */ diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index 1b77797d19b..b3492a5fb09 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -198,7 +198,7 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event) copy_v3_v3(min, cent); mul_m4_v3(vc.obedit->obmat, min); // view space - view3d_get_view_aligned_coordinate(&vc, min, event->mval); + view3d_get_view_aligned_coordinate(&vc, min, event->mval, TRUE); mul_m4_v3(vc.obedit->imat, min); // back in object space sub_v3_v3(min, cent); @@ -250,8 +250,8 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event) const float *curs= give_cursor(vc.scene, vc.v3d); copy_v3_v3(min, curs); - view3d_get_view_aligned_coordinate(&vc, min, event->mval); - + view3d_get_view_aligned_coordinate(&vc, min, event->mval, TRUE); + eve= addvertlist(vc.em, 0, NULL); invert_m4_m4(imat, vc.obedit->obmat); diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index e8fbb3542fa..f51a780787e 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -93,7 +93,7 @@ void view3d_set_viewcontext(bContext *C, ViewContext *vc) vc->obedit= CTX_data_edit_object(C); } -void view3d_get_view_aligned_coordinate(ViewContext *vc, float fp[3], const short mval[2]) +int view3d_get_view_aligned_coordinate(ViewContext *vc, float fp[3], const short mval[2], const short do_fallback) { float dvec[3]; short mval_cpy[2]; @@ -108,6 +108,18 @@ void view3d_get_view_aligned_coordinate(ViewContext *vc, float fp[3], const shor if(mval_cpy[0]!=IS_CLIPPED) { window_to_3d_delta(vc->ar, dvec, mval_cpy[0]-mval[0], mval_cpy[1]-mval[1]); sub_v3_v3(fp, dvec); + + return TRUE; + } + else { + /* fallback to the view center */ + if(do_fallback) { + negate_v3_v3(fp, vc->rv3d->ofs); + return view3d_get_view_aligned_coordinate(vc, fp, mval, FALSE); + } + else { + return FALSE; + } } } From 05c7db95b684bde9e251caf2c993d616180dd72f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 21 Apr 2011 19:01:31 +0000 Subject: [PATCH 71/88] buildbot: Fixed typo for 64bit blenderplayer which caused undefined symbol gzopen64 --- build_files/buildbot/config/user-config-player-x86_64.py | 1 - 1 file changed, 1 deletion(-) diff --git a/build_files/buildbot/config/user-config-player-x86_64.py b/build_files/buildbot/config/user-config-player-x86_64.py index da5b6c1feba..363997143e5 100644 --- a/build_files/buildbot/config/user-config-player-x86_64.py +++ b/build_files/buildbot/config/user-config-player-x86_64.py @@ -47,7 +47,6 @@ WITH_BF_ZLIB = True WITH_BF_STATICZLIB = True BF_ZLIB_LIB_STATIC = '${BF_ZLIB}/lib/libz.a' -WITH_BF_STATICZLIB = False WITH_BF_SDL = True WITH_BF_OGG = False From ee9ea98e48d6dd1c7447baa049d15739588fe6de Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 22 Apr 2011 14:47:35 +0000 Subject: [PATCH 72/88] zoom operator. - continue zoom now uses the same options as dolly (hoz/vert & invert). - remove event mouse coord hack to bypass touchpad zoom invert, instead pass invert as an argument. --- .../scripts/startup/bl_ui/space_userpref.py | 4 +-- .../editors/space_view3d/view3d_edit.c | 35 ++++++++++++------- source/blender/makesdna/DNA_userdef_types.h | 2 +- source/blender/makesrna/intern/rna_userdef.c | 6 ++-- .../blender/render/intern/source/rayshade.c | 2 +- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 13ff09d7f23..7ae2efb3696 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -800,9 +800,9 @@ class USERPREF_PT_input(InputKeyMapPanel): sub.label(text="Zoom Style:") sub.row().prop(inputs, "view_zoom_method", text="") - if inputs.view_zoom_method == 'DOLLY': + if inputs.view_zoom_method in {'DOLLY', 'CONTINUE'}: sub.row().prop(inputs, "view_zoom_axis", expand=True) - sub.prop(inputs, "invert_mouse_wheel_zoom") + sub.prop(inputs, "invert_mouse_zoom") #sub.prop(inputs, "use_mouse_mmb_paste") diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 67576c188af..2b971a84af6 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1075,16 +1075,28 @@ static void view_zoom_mouseloc(ARegion *ar, float dfac, int mx, int my) } -static void viewzoom_apply(ViewOpsData *vod, int x, int y, short viewzoom) +static void viewzoom_apply(ViewOpsData *vod, int x, int y, const short viewzoom, const short zoom_invert) { float zfac=1.0; if(viewzoom==USER_ZOOM_CONT) { double time= PIL_check_seconds_timer(); float time_step= (float)(time - vod->timer_lastdraw); + float fac; + + if (U.uiflag & USER_ZOOM_HORIZ) { + fac= (float)(x - vod->origx); + } + else { + fac= (float)(y - vod->origy); + } + + if(zoom_invert) { + fac= -fac; + } // oldstyle zoom - zfac = 1.0f + (((float)(vod->origx - x + vod->origy - y) / 20.0f) * time_step); + zfac = 1.0f + ((fac / 20.0f) * time_step); vod->timer_lastdraw= time; } else if(viewzoom==USER_ZOOM_SCALE) { @@ -1102,7 +1114,7 @@ static void viewzoom_apply(ViewOpsData *vod, int x, int y, short viewzoom) else { /* USER_ZOOM_DOLLY */ float len1, len2; - if (U.uiflag & USER_ZOOM_DOLLY_HORIZ) { + if (U.uiflag & USER_ZOOM_HORIZ) { len1 = (vod->ar->winrct.xmax - x) + 5; len2 = (vod->ar->winrct.xmax - vod->origx) + 5; } @@ -1110,14 +1122,15 @@ static void viewzoom_apply(ViewOpsData *vod, int x, int y, short viewzoom) len1 = (vod->ar->winrct.ymax - y) + 5; len2 = (vod->ar->winrct.ymax - vod->origy) + 5; } - if (U.uiflag & USER_ZOOM_INVERT) + if (zoom_invert) { SWAP(float, len1, len2); + } zfac = vod->dist0 * (2.0f * ((len2/len1)-1.0f) + 1.0f) / vod->rv3d->dist; } if(zfac != 1.0f && zfac*vod->rv3d->dist > 0.001f * vod->grid && - zfac * vod->rv3d->dist < 10.0f * vod->far) + zfac * vod->rv3d->dist < 10.0f * vod->far) view_zoom_mouseloc(vod->ar, zfac, vod->oldx, vod->oldy); @@ -1179,7 +1192,7 @@ static int viewzoom_modal(bContext *C, wmOperator *op, wmEvent *event) } if(event_code==VIEW_APPLY) { - viewzoom_apply(vod, event->x, event->y, U.viewzoom); + viewzoom_apply(vod, event->x, event->y, U.viewzoom, (U.uiflag & USER_ZOOM_INVERT) != 0); } else if (event_code==VIEW_CONFIRM) { request_depth_update(vod->rv3d); @@ -1272,18 +1285,16 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event) vod= op->customdata; if (event->type == MOUSEZOOM) { - if (U.uiflag & USER_ZOOM_INVERT) /* Bypass Zoom invert flag */ - SWAP(int, event->x, event->prevx); + /* Bypass Zoom invert flag for track pads (pass FALSE always) */ - if (U.uiflag & USER_ZOOM_DOLLY_HORIZ) { + if (U.uiflag & USER_ZOOM_HORIZ) { vod->origx = vod->oldx = event->x; - viewzoom_apply(vod, event->prevx, event->prevy, USER_ZOOM_DOLLY); + viewzoom_apply(vod, event->prevx, event->prevy, USER_ZOOM_DOLLY, FALSE); } else { - /* Set y move = x move as MOUSEZOOM uses only x axis to pass magnification value */ vod->origy = vod->oldy = vod->origy + event->x - event->prevx; - viewzoom_apply(vod, event->prevx, event->prevy, USER_ZOOM_DOLLY); + viewzoom_apply(vod, event->prevx, event->prevy, USER_ZOOM_DOLLY, FALSE); } request_depth_update(vod->rv3d); diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 1eff1c3c640..1be67a4501b 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -476,7 +476,7 @@ extern UserDef U; /* from blenkernel blender.c */ #define USER_MENUFIXEDORDER (1 << 23) #define USER_CONTINUOUS_MOUSE (1 << 24) #define USER_ZOOM_INVERT (1 << 25) -#define USER_ZOOM_DOLLY_HORIZ (1 << 26) +#define USER_ZOOM_HORIZ (1 << 26) /* for CONTINUE and DOLLY zoom */ #define USER_SPLASH_DISABLE (1 << 27) #define USER_HIDE_RECENT (1 << 28) #define USER_SHOW_THUMBNAILS (1 << 29) diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index c21feead18f..a914d875490 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -2651,8 +2651,8 @@ static void rna_def_userdef_input(BlenderRNA *brna) {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem view_zoom_axes[] = { - {0, "VERTICAL", 0, "Vertical", "Zooms in and out based on vertical mouse movement"}, - {USER_ZOOM_DOLLY_HORIZ, "HORIZONTAL", 0, "Horizontal", "Zooms in and out based on horizontal mouse movement"}, + {0, "VERTICAL", 0, "Vertical", "Zooms in and out based on vertical mouse movement"}, + {USER_ZOOM_HORIZ, "HORIZONTAL", 0, "Horizontal", "Zooms in and out based on horizontal mouse movement"}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "UserPreferencesInput", NULL); @@ -2676,7 +2676,7 @@ static void rna_def_userdef_input(BlenderRNA *brna) RNA_def_property_enum_items(prop, view_zoom_axes); RNA_def_property_ui_text(prop, "Zoom Axis", "Axis of mouse movement to zoom in or out on"); - prop= RNA_def_property(srna, "invert_mouse_wheel_zoom", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "invert_mouse_zoom", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_ZOOM_INVERT); RNA_def_property_ui_text(prop, "Invert Zoom Direction", "Invert the axis of mouse movement for zooming"); diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index 4147fc4cdd8..b57fe5a8c3b 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -445,7 +445,7 @@ void makeraytree(Render *re) re->i.infostr= "Raytree.. preparing"; re->stats_draw(re->sdh, &re->i); - /* disable options not yet suported by octree, + /* disable options not yet supported by octree, they might actually never be supported (unless people really need it) */ if(re->r.raytrace_structure == R_RAYSTRUCTURE_OCTREE) re->r.raytrace_options &= ~( R_RAYTRACE_USE_INSTANCES | R_RAYTRACE_USE_LOCAL_COORDS); From e520c498d26aa1e0b6abe63c24e593484135c0ac Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 22 Apr 2011 15:34:07 +0000 Subject: [PATCH 73/88] View Dolly Operator: Ctrl+Shift+MMB. Recently there were 2 reports about zoom not working right because at some point you can't zoom in any further. This is not actually a bug with zoom but a limitation in blender that there is no way to move the viewpoint forward (unless you count rotate 90d, pan, rotate back which is a crummy workaround). So adding view dolly operator: - Supports zoom to mouse position setting. - Supports dolly hoz/vert, invert setting. - Moves by a fraction of the view 'dist', so the zoom distance my be roughly in proportion to the scale of objects in the scene. only used in perspective view since this is not useful in camera/ortho view. --- .../editors/space_view3d/view3d_edit.c | 233 +++++++++++++++++- .../editors/space_view3d/view3d_intern.h | 1 + .../blender/editors/space_view3d/view3d_ops.c | 2 + 3 files changed, 235 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 2b971a84af6..b377bb20baa 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -285,6 +285,7 @@ typedef struct ViewOpsData { float oldquat[4]; float trackvec[3]; + float mousevec[3]; /* dolly only */ float reverse, dist0; float grid, far; short axis_snap; /* view rotate only */ @@ -346,9 +347,9 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event) vod->origy= vod->oldy= event->y; vod->origkey= event->type; /* the key that triggered the operator. */ vod->use_dyn_ofs= (U.uiflag & USER_ORBIT_SELECTION) ? 1:0; + copy_v3_v3(vod->ofs, rv3d->ofs); if (vod->use_dyn_ofs) { - copy_v3_v3(vod->ofs, rv3d->ofs); /* If there's no selection, lastofs is unmodified and last value since static */ calculateTransformCenter(C, V3D_CENTROID, lastofs); negate_v3_v3(vod->dyn_ofs, lastofs); @@ -394,6 +395,9 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event) } } + /* for dolly */ + window_to_3d_vector(vod->ar, vod->mousevec, (vod->oldx - vod->ar->winrct.xmin)-(vod->ar->winx)/2, (vod->oldy - vod->ar->winrct.ymin)-(vod->ar->winy)/2); + /* lookup, we dont pass on v3d to prevent confusement */ vod->grid= v3d->grid; vod->far= v3d->far; @@ -1262,6 +1266,7 @@ static int viewzoom_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +/* viewdolly_invoke() copied this function, changes here may apply there */ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event) { /* if one or the other zoom position aren't set, set from event */ @@ -1339,6 +1344,232 @@ void VIEW3D_OT_zoom(wmOperatorType *ot) RNA_def_int(ot->srna, "my", 0, 0, INT_MAX, "Zoom Position Y", "", 0, INT_MAX); } + +/* ************************ viewdolly ******************************** */ +static void view_dolly_mouseloc(ARegion *ar, float orig_ofs[3], float dvec[3], float dfac) +{ + RegionView3D *rv3d= ar->regiondata; + madd_v3_v3v3fl(rv3d->ofs, orig_ofs, dvec, 1.0 - dfac); +} + +static void viewdolly_apply(ViewOpsData *vod, int x, int y, const short zoom_invert) +{ + float zfac=1.0; + + { + float len1, len2; + + if (U.uiflag & USER_ZOOM_HORIZ) { + len1 = (vod->ar->winrct.xmax - x) + 5; + len2 = (vod->ar->winrct.xmax - vod->origx) + 5; + } + else { + len1 = (vod->ar->winrct.ymax - y) + 5; + len2 = (vod->ar->winrct.ymax - vod->origy) + 5; + } + if (zoom_invert) + SWAP(float, len1, len2); + + zfac = 1.0 + ((len2 - len1) * 0.01 * vod->rv3d->dist); + } + + if(zfac != 1.0f) + view_dolly_mouseloc(vod->ar, vod->ofs, vod->mousevec, zfac); + + if(vod->rv3d->viewlock & RV3D_BOXVIEW) + view3d_boxview_sync(vod->sa, vod->ar); + + ED_region_tag_redraw(vod->ar); +} + + +static int viewdolly_modal(bContext *C, wmOperator *op, wmEvent *event) +{ + ViewOpsData *vod= op->customdata; + short event_code= VIEW_PASS; + + /* execute the events */ + if(event->type==MOUSEMOVE) { + event_code= VIEW_APPLY; + } + else if(event->type==EVT_MODAL_MAP) { + switch (event->val) { + case VIEW_MODAL_CONFIRM: + event_code= VIEW_CONFIRM; + break; + case VIEWROT_MODAL_SWITCH_MOVE: + WM_operator_name_call(C, "VIEW3D_OT_move", WM_OP_INVOKE_DEFAULT, NULL); + event_code= VIEW_CONFIRM; + break; + case VIEWROT_MODAL_SWITCH_ROTATE: + WM_operator_name_call(C, "VIEW3D_OT_rotate", WM_OP_INVOKE_DEFAULT, NULL); + event_code= VIEW_CONFIRM; + break; + } + } + else if(event->type==vod->origkey && event->val==KM_RELEASE) { + event_code= VIEW_CONFIRM; + } + + if(event_code==VIEW_APPLY) { + viewdolly_apply(vod, event->x, event->y, (U.uiflag & USER_ZOOM_INVERT) != 0); + } + else if (event_code==VIEW_CONFIRM) { + request_depth_update(vod->rv3d); + viewops_data_free(C, op); + + return OPERATOR_FINISHED; + } + + return OPERATOR_RUNNING_MODAL; +} + +static int viewdolly_exec(bContext *C, wmOperator *op) +{ + View3D *v3d; + RegionView3D *rv3d; + ScrArea *sa; + ARegion *ar; + float mousevec[3]; + + int delta= RNA_int_get(op->ptr, "delta"); + int mx, my; + + if(op->customdata) { + ViewOpsData *vod= op->customdata; + + sa= vod->sa; + ar= vod->ar; + copy_v3_v3(mousevec, vod->mousevec); + } + else { + sa= CTX_wm_area(C); + ar= CTX_wm_region(C); + normalize_v3_v3(mousevec, ((RegionView3D *)ar->regiondata)->viewinv[2]); + } + + v3d= sa->spacedata.first; + rv3d= ar->regiondata; + + /* overwrite the mouse vector with the view direction (zoom into the center) */ + if((U.uiflag & USER_ZOOM_TO_MOUSEPOS) == 0) { + normalize_v3_v3(mousevec, rv3d->viewinv[2]); + } + + mx= RNA_property_is_set(op->ptr, "mx") ? RNA_int_get(op->ptr, "mx") : ar->winx / 2; + my= RNA_property_is_set(op->ptr, "my") ? RNA_int_get(op->ptr, "my") : ar->winy / 2; + + + + if(delta < 0) { + view_dolly_mouseloc(ar, rv3d->ofs, mousevec, 1.2f); + } + else { + view_dolly_mouseloc(ar, rv3d->ofs, mousevec, .83333f); + } + + if(rv3d->viewlock & RV3D_BOXVIEW) + view3d_boxview_sync(sa, ar); + + request_depth_update(rv3d); + ED_region_tag_redraw(ar); + + viewops_data_free(C, op); + + return OPERATOR_FINISHED; +} + +/* copied from viewzoom_invoke(), changes here may apply there */ +static int viewdolly_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + /* if one or the other zoom position aren't set, set from event */ + if (!RNA_property_is_set(op->ptr, "mx") || !RNA_property_is_set(op->ptr, "my")) + { + RNA_int_set(op->ptr, "mx", event->x); + RNA_int_set(op->ptr, "my", event->y); + } + + if(RNA_property_is_set(op->ptr, "delta")) { + /* makes op->customdata */ + viewops_data_create(C, op, event); + viewdolly_exec(C, op); + } + else { + ViewOpsData *vod; + + /* makes op->customdata */ + viewops_data_create(C, op, event); + + vod= op->customdata; + + /* overwrite the mouse vector with the view direction (zoom into the center) */ + if((U.uiflag & USER_ZOOM_TO_MOUSEPOS) == 0) { + normalize_v3_v3(vod->mousevec, vod->rv3d->viewinv[2]); + } + + if (event->type == MOUSEZOOM) { + /* Bypass Zoom invert flag for track pads (pass FALSE always) */ + + if (U.uiflag & USER_ZOOM_HORIZ) { + vod->origx = vod->oldx = event->x; + viewdolly_apply(vod, event->prevx, event->prevy, FALSE); + } + else { + + /* Set y move = x move as MOUSEZOOM uses only x axis to pass magnification value */ + vod->origy = vod->oldy = vod->origy + event->x - event->prevx; + viewdolly_apply(vod, event->prevx, event->prevy, FALSE); + } + request_depth_update(vod->rv3d); + + viewops_data_free(C, op); + return OPERATOR_FINISHED; + } + else { + /* add temp handler */ + WM_event_add_modal_handler(C, op); + + return OPERATOR_RUNNING_MODAL; + } + } + return OPERATOR_FINISHED; +} + +/* like ED_operator_region_view3d_active but check its not in ortho view */ +static int viewdolly_poll(bContext *C) +{ + RegionView3D *rv3d= CTX_wm_region_view3d(C); + + if (rv3d && rv3d->persp == RV3D_PERSP) { + return 1; + } + + return 0; +} + +void VIEW3D_OT_dolly(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Dolly view"; + ot->description = "Dolly in/out in the view"; + ot->idname= "VIEW3D_OT_dolly"; + + /* api callbacks */ + ot->invoke= viewdolly_invoke; + ot->exec= viewdolly_exec; + ot->modal= viewdolly_modal; + ot->poll= viewdolly_poll; + + /* flags */ + ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER; + + RNA_def_int(ot->srna, "delta", 0, INT_MIN, INT_MAX, "Delta", "", INT_MIN, INT_MAX); + RNA_def_int(ot->srna, "mx", 0, 0, INT_MAX, "Zoom Position X", "", 0, INT_MAX); + RNA_def_int(ot->srna, "my", 0, 0, INT_MAX, "Zoom Position Y", "", 0, INT_MAX); +} + + + static int view3d_all_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.4x */ { ARegion *ar= CTX_wm_region(C); diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index d66a3b99911..12ad01e3977 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -68,6 +68,7 @@ void view3d_operatortypes(void); /* view3d_edit.c */ void VIEW3D_OT_zoom(struct wmOperatorType *ot); +void VIEW3D_OT_dolly(struct wmOperatorType *ot); void VIEW3D_OT_zoom_camera_1_to_1(struct wmOperatorType *ot); void VIEW3D_OT_move(struct wmOperatorType *ot); void VIEW3D_OT_rotate(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c index 30ca1638d34..4942030c516 100644 --- a/source/blender/editors/space_view3d/view3d_ops.c +++ b/source/blender/editors/space_view3d/view3d_ops.c @@ -63,6 +63,7 @@ void view3d_operatortypes(void) WM_operatortype_append(VIEW3D_OT_move); WM_operatortype_append(VIEW3D_OT_zoom); WM_operatortype_append(VIEW3D_OT_zoom_camera_1_to_1); + WM_operatortype_append(VIEW3D_OT_dolly); WM_operatortype_append(VIEW3D_OT_view_all); WM_operatortype_append(VIEW3D_OT_viewnumpad); WM_operatortype_append(VIEW3D_OT_view_orbit); @@ -129,6 +130,7 @@ void view3d_keymap(wmKeyConfig *keyconf) WM_keymap_verify_item(keymap, "VIEW3D_OT_rotate", MIDDLEMOUSE, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "VIEW3D_OT_move", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0); WM_keymap_verify_item(keymap, "VIEW3D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0); + WM_keymap_verify_item(keymap, "VIEW3D_OT_dolly", MIDDLEMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0); WM_keymap_verify_item(keymap, "VIEW3D_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "VIEW3D_OT_view_center_cursor", PADPERIOD, KM_PRESS, KM_CTRL, 0); From 1518d43f270e02a400b989f10ba9dce54abf6cd9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 22 Apr 2011 16:47:17 +0000 Subject: [PATCH 74/88] cancelling bake wasn't freeing the bake mask. --- source/blender/editors/object/object_bake.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index b4a358150e8..b513bab3924 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -189,9 +189,18 @@ static void finish_bake_internal(BakeRender *bkr) for(ima= G.main->image.first; ima; ima= ima->id.next) { if(ima->ok==IMA_OK_LOADED) { ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL); - if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) { - GPU_free_image(ima); - imb_freemipmapImBuf(ibuf); + if(ibuf) { + if(ibuf->userflags & IB_BITMAPDIRTY) { + GPU_free_image(ima); + imb_freemipmapImBuf(ibuf); + } + + /* freed when baking is done, but if its canceled we need to free here */ + if (ibuf->userdata) { + printf("freed\n"); + MEM_freeN(ibuf->userdata); + ibuf->userdata= NULL; + } } } } From d494c97b5899da83d19c4a47ed59075303bba1f8 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 23 Apr 2011 03:31:27 +0000 Subject: [PATCH 75/88] fix for using enter on menus which load files: commonly Ctrl+N,Enter or Ctrl+O,Enter --- source/blender/windowmanager/intern/wm_event_system.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 6b074029984..feff0393b88 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1537,6 +1537,12 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) } } + /* XXX fileread case, if the wm is freed then the handler's + * will have been too so the code below need not run. */ + if(CTX_wm_window(C)==NULL) { + return action; + } + /* XXX code this for all modal ops, and ensure free only happens here */ /* modal ui handler can be tagged to be freed */ @@ -1546,10 +1552,6 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) wm_event_free_handler(handler); } } - - /* XXX fileread case */ - if(CTX_wm_window(C)==NULL) - return action; } /* test for CLICK event */ From 25974319db3f3622bd29306da38e3cfdd4911801 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 23 Apr 2011 07:04:50 +0000 Subject: [PATCH 76/88] skip pose slide if the RNA value isn't found. --- source/blender/editors/armature/poseSlide.c | 31 ++++++++++++--------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/source/blender/editors/armature/poseSlide.c b/source/blender/editors/armature/poseSlide.c index 203d76086b3..2e4fb8a4d31 100644 --- a/source/blender/editors/armature/poseSlide.c +++ b/source/blender/editors/armature/poseSlide.c @@ -989,11 +989,11 @@ static float pose_propagate_get_boneHoldEndFrame (Object *ob, tPChanFCurveLink * } /* get reference value from F-Curve using RNA */ -static float pose_propagate_get_refVal (Object *ob, FCurve *fcu) +static float pose_propagate_get_refVal (Object *ob, FCurve *fcu, float *value) { PointerRNA id_ptr, ptr; PropertyRNA *prop; - float value; + int found= FALSE; /* base pointer is always the object -> id_ptr */ RNA_id_pointer_create(&ob->id, &id_ptr); @@ -1002,44 +1002,48 @@ static float pose_propagate_get_refVal (Object *ob, FCurve *fcu) if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) { if (RNA_property_array_check(&ptr, prop)) { /* array */ - if (fcu->array_index < RNA_property_array_length(&ptr, prop)) { + if (fcu->array_index < RNA_property_array_length(&ptr, prop)) { + found= TRUE; switch (RNA_property_type(prop)) { case PROP_BOOLEAN: - value= (float)RNA_property_boolean_get_index(&ptr, prop, fcu->array_index); + *value= (float)RNA_property_boolean_get_index(&ptr, prop, fcu->array_index); break; case PROP_INT: - value= (float)RNA_property_int_get_index(&ptr, prop, fcu->array_index); + *value= (float)RNA_property_int_get_index(&ptr, prop, fcu->array_index); break; case PROP_FLOAT: - value= RNA_property_float_get_index(&ptr, prop, fcu->array_index); + *value= RNA_property_float_get_index(&ptr, prop, fcu->array_index); break; default: + found= FALSE; break; } } } else { /* not an array */ + found= TRUE; switch (RNA_property_type(prop)) { case PROP_BOOLEAN: - value= (float)RNA_property_boolean_get(&ptr, prop); + *value= (float)RNA_property_boolean_get(&ptr, prop); break; case PROP_INT: - value= (float)RNA_property_int_get(&ptr, prop); + *value= (float)RNA_property_int_get(&ptr, prop); break; case PROP_ENUM: - value= (float)RNA_property_enum_get(&ptr, prop); + *value= (float)RNA_property_enum_get(&ptr, prop); break; case PROP_FLOAT: - value= RNA_property_float_get(&ptr, prop); + *value= RNA_property_float_get(&ptr, prop); break; default: + found= FALSE; break; } } } - return value; + return found; } /* propagate just works along each F-Curve in turn */ @@ -1062,8 +1066,9 @@ static void pose_propagate_fcurve (wmOperator *op, Object *ob, FCurve *fcu, * doesn't need to firstly keyframe the pose (though this doesn't mean that * they can't either) */ - refVal = pose_propagate_get_refVal(ob, fcu); - + if(!pose_propagate_get_refVal(ob, fcu, &refVal)) + return; + /* find the first keyframe to start propagating from * - if there's a keyframe on the current frame, we probably want to save this value there too * since it may be as of yet unkeyed From 6b4cecc4662f6f7e5c99f1bf2b1706771c37a00b Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Sat, 23 Apr 2011 07:21:10 +0000 Subject: [PATCH 77/88] Fix for group output memory leak, bug #27104. This happens when an internal node in a group has multiple output buffers, but only some of them are used. Then all the buffers would be created, but the unlinked outputs were not correctly tagged for freeing after group execution. --- source/blender/blenkernel/intern/node.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 18268d72609..fed982a8f1d 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1997,11 +1997,23 @@ static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNod if (ntree->type==NTREE_COMPOSIT) { bNodeSocket *sock; bNodeStack *ns; + + /* clear hasoutput on all local stack data, + * only the group output will be used from now on + */ + for (node=ntree->nodes.first; node; node=node->next) { + for (sock=node->outputs.first; sock; sock=sock->next) { + if (sock->stack_type==SOCK_STACK_LOCAL) { + ns= get_socket_stack(stack, sock, in); + ns->hasoutput = 0; + } + } + } + /* use the hasoutput flag to tag external sockets */ for (sock=ntree->outputs.first; sock; sock=sock->next) { - /* use the hasoutput flag to tag external sockets */ if (sock->stack_type==SOCK_STACK_LOCAL) { ns= get_socket_stack(stack, sock, in); - ns->hasoutput = 0; + ns->hasoutput = 1; } } /* now free all stacks that are not used from outside */ @@ -2009,11 +2021,9 @@ static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNod for (sock=node->outputs.first; sock; sock=sock->next) { if (sock->stack_type==SOCK_STACK_LOCAL ) { ns= get_socket_stack(stack, sock, in); - if (ns->hasoutput!=0 && ns->data) { + if (ns->hasoutput==0 && ns->data) { free_compbuf(ns->data); ns->data = NULL; - /* reset the flag */ - ns->hasoutput = 1; } } } From 7faa531a627b3010f614114531f0f54c12553cf1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 23 Apr 2011 07:28:30 +0000 Subject: [PATCH 78/88] fix for possible crash using an un-initialized pointer when getting a vertex weight from a non-mesh/lattice object. --- source/blender/editors/object/object_vgroup.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index d1315001f9e..53562caf1b5 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -508,7 +508,7 @@ void ED_vgroup_vert_remove(Object *ob, bDeformGroup *dg, int vertnum) static float get_vert_def_nr(Object *ob, int def_nr, int vertnum) { - MDeformVert *dvert; + MDeformVert *dvert= NULL; EditVert *eve; Mesh *me; int i; @@ -519,7 +519,9 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum) if(me->edit_mesh) { eve= BLI_findlink(&me->edit_mesh->verts, vertnum); - if(!eve) return 0.0f; + if(!eve) { + return 0.0f; + } dvert= CustomData_em_get(&me->edit_mesh->vdata, eve->data, CD_MDEFORMVERT); vertnum= 0; } From 176e45f88ec1b6e4068c4ed11a3f3821a0d7d794 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 23 Apr 2011 08:02:29 +0000 Subject: [PATCH 79/88] fix for possible (but unlikely) crash. added NULL check in case nodeAddNodeType() is given an invalid type or the dynamic node cant be found. --- source/blender/blenkernel/intern/node.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index fed982a8f1d..b8b57b6bac0 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -967,6 +967,11 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id) } else ntype= node_get_type(ntree, type, id); + if(ntype == NULL) { + printf("nodeAddNodeType() error: '%d' type invalid\n", type); + return NULL; + } + node= MEM_callocN(sizeof(bNode), "new node"); BLI_addtail(&ntree->nodes, node); node->typeinfo= ntype; From f69825e8e87dbb57f620c551f9fd4ff18a4585c6 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Sat, 23 Apr 2011 08:30:28 +0000 Subject: [PATCH 80/88] Color info in node editor backdrop now supports color management. --- .../blender/editors/space_image/image_draw.c | 45 +++++++++++++------ .../editors/space_image/image_intern.h | 2 +- .../blender/editors/space_image/image_ops.c | 3 +- source/blender/editors/space_node/drawnode.c | 43 ++++++++++++------ source/blender/editors/space_node/node_edit.c | 5 ++- .../blender/editors/space_node/node_intern.h | 2 +- 6 files changed, 68 insertions(+), 32 deletions(-) diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 85d36ea9b29..b866a21d027 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -45,7 +45,7 @@ #include "PIL_time.h" -#include "BLI_math_color.h" +#include "BLI_math.h" #include "BLI_threads.h" #include "BLI_string.h" #include "BLI_utildefines.h" @@ -133,7 +133,7 @@ static void draw_render_info(Scene *scene, Image *ima, ARegion *ar) BKE_image_release_renderresult(scene, ima); } -void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf) +void draw_image_info(ARegion *ar, int color_manage, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf) { char str[256]; float dx= 6; @@ -149,6 +149,7 @@ void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *f unsigned char blue[3] = {255, 255, 255}; #endif float hue=0, sat=0, val=0, lum=0, u=0, v=0; + float col[4], finalcol[4]; glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); @@ -230,31 +231,47 @@ void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *f } } - glDisable(GL_BLEND); + /* color rectangle */ if (channels==1) { if (fp) - glColor3f(fp[0], fp[0], fp[0]); + col[0] = col[1] = col[2] = fp[0]; else if (cp) - glColor3ub(cp[0], cp[0], cp[0]); + col[0] = col[1] = col[2] = (float)cp[0]/255.0f; else - glColor3ub(0, 0, 0); + col[0] = col[1] = col[2] = 0.0f; } else if (channels==3) { if (fp) - glColor3fv(fp); - else if (cp) - glColor3ub(cp[0], cp[1], cp[2]); + copy_v3_v3(col, fp); + else if (cp) { + col[0] = (float)cp[0]/255.0f; + col[1] = (float)cp[1]/255.0f; + col[2] = (float)cp[2]/255.0f; + } else - glColor3ub(0, 0, 0); + zero_v3(col); } else if (channels==4) { if (fp) - glColor4fv(fp); - else if (cp) - glColor4ub(cp[0], cp[1], cp[2], cp[3]); + copy_v4_v4(col, fp); + else if (cp) { + col[0] = (float)cp[0]/255.0f; + col[1] = (float)cp[1]/255.0f; + col[2] = (float)cp[2]/255.0f; + col[3] = (float)cp[3]/255.0f; + } else - glColor3ub(0, 0, 0); + zero_v4(col); } + if (color_manage) { + linearrgb_to_srgb_v3_v3(finalcol, col); + finalcol[3] = col[3]; + } + else { + copy_v4_v4(finalcol, col); + } + glDisable(GL_BLEND); + glColor3fv(finalcol); dx += 5; glBegin(GL_QUADS); glVertex2f(dx, 3); diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h index 5857e62e78a..e9e77ddf430 100644 --- a/source/blender/editors/space_image/image_intern.h +++ b/source/blender/editors/space_image/image_intern.h @@ -60,7 +60,7 @@ void IMAGE_OT_toolbox(struct wmOperatorType *ot); /* image_draw.c */ void draw_image_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene); -void draw_image_info(struct ARegion *ar, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf); +void draw_image_info(struct ARegion *ar, int color_manage, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf); void draw_image_grease_pencil(struct bContext *C, short onlyv2d); /* image_ops.c */ diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 61c999f51ab..ab435395d62 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1632,7 +1632,8 @@ static void sample_draw(const bContext *UNUSED(C), ARegion *ar, void *arg_info) { ImageSampleInfo *info= arg_info; if(info->draw) { - draw_image_info(ar, info->channels, info->x, info->y, info->colp, info->colfp, info->zp, info->zfp); + /* no color management needed for images (color_manage=0) */ + draw_image_info(ar, 0, info->channels, info->x, info->y, info->colp, info->colfp, info->zp, info->zfp); } } diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index db9a052fdbd..68b9170b837 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1442,7 +1442,7 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage) } } -void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp) +void draw_nodespace_color_info(ARegion *ar, int color_manage, int channels, int x, int y, char *cp, float *fp) { char str[256]; float dx= 6; @@ -1458,6 +1458,7 @@ void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp unsigned char blue[3] = {255, 255, 255}; #endif float hue=0, sat=0, val=0, lum=0, u=0, v=0; + float col[4], finalcol[4]; glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); @@ -1541,31 +1542,47 @@ void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp } } - glDisable(GL_BLEND); + /* color rectangle */ if (channels==1) { if (fp) - glColor3f(fp[0], fp[0], fp[0]); + col[0] = col[1] = col[2] = fp[0]; else if (cp) - glColor3ub(cp[0], cp[0], cp[0]); + col[0] = col[1] = col[2] = (float)cp[0]/255.0f; else - glColor3ub(0, 0, 0); + col[0] = col[1] = col[2] = 0.0f; } else if (channels==3) { if (fp) - glColor3fv(fp); - else if (cp) - glColor3ub(cp[0], cp[1], cp[2]); + copy_v3_v3(col, fp); + else if (cp) { + col[0] = (float)cp[0]/255.0f; + col[1] = (float)cp[1]/255.0f; + col[2] = (float)cp[2]/255.0f; + } else - glColor3ub(0, 0, 0); + zero_v3(col); } else if (channels==4) { if (fp) - glColor4fv(fp); - else if (cp) - glColor4ub(cp[0], cp[1], cp[2], cp[3]); + copy_v4_v4(col, fp); + else if (cp) { + col[0] = (float)cp[0]/255.0f; + col[1] = (float)cp[1]/255.0f; + col[2] = (float)cp[2]/255.0f; + col[3] = (float)cp[3]/255.0f; + } else - glColor3ub(0, 0, 0); + zero_v4(col); } + if (color_manage) { + linearrgb_to_srgb_v3_v3(finalcol, col); + finalcol[3] = col[3]; + } + else { + copy_v4_v4(finalcol, col); + } + glDisable(GL_BLEND); + glColor3fv(finalcol); dx += 5; glBegin(GL_QUADS); glVertex2f(dx, 3); diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index ed70e2b05f1..22bbd93de00 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -1142,11 +1142,12 @@ typedef struct ImageSampleInfo { int draw; } ImageSampleInfo; -static void sample_draw(const bContext *UNUSED(C), ARegion *ar, void *arg_info) +static void sample_draw(const bContext *C, ARegion *ar, void *arg_info) { ImageSampleInfo *info= arg_info; - draw_nodespace_color_info(ar, info->channels, info->x, info->y, info->col, info->colf); + draw_nodespace_color_info(ar, (CTX_data_scene(C)->r.color_mgt_flag & R_COLOR_MANAGEMENT), info->channels, + info->x, info->y, info->col, info->colf); } static void sample_apply(bContext *C, wmOperator *op, wmEvent *event) diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 205cf099776..fc1b579d1e1 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -90,7 +90,7 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link); void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 ); int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol); void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage); -void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp); +void draw_nodespace_color_info(struct ARegion *ar, int color_manage, int channels, int x, int y, char *cp, float *fp); /* node_edit.c */ void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype); From 8ca9dc3cfe8fbe53ba8cd2ac2af5df9b9ff0f104 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sat, 23 Apr 2011 08:52:27 +0000 Subject: [PATCH 81/88] Send NA_EDITED notifier when changing tab width in text space properties Now text editor refresh correct and there's no more glitches with messed up syntax highlighting. --- source/blender/makesrna/intern/rna_space.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 2e947039c16..b5b980aca5b 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -539,6 +539,15 @@ static void rna_SpaceTextEditor_text_set(PointerRNA *ptr, PointerRNA value) st->top= 0; } +static void rna_SpaceTextEditor_updateEdited(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + SpaceText *st= (SpaceText*)ptr->data; + + if(st->text) + WM_main_add_notifier(NC_TEXT|NA_EDITED, st->text); +} + + /* Space Properties */ /* note: this function exists only to avoid id refcounting */ @@ -1724,7 +1733,7 @@ static void rna_def_space_text(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "tabnumber"); RNA_def_property_range(prop, 2, 8); RNA_def_property_ui_text(prop, "Tab Width", "Number of spaces to display tabs with"); - RNA_def_property_update(prop, NC_TEXT|NA_EDITED, NULL); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, "rna_SpaceTextEditor_updateEdited"); prop= RNA_def_property(srna, "font_size", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "lheight"); From ef14d310a056d2af484d866acaf512fa80f8442d Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sat, 23 Apr 2011 09:07:46 +0000 Subject: [PATCH 82/88] Sculpting on shapekeys ====================== All this work with sculpting on armatured/deformed mesh allowed to implement sculpting on non-locked keys very easy -- just use the same approach of propagating offsets from deformed PBVH to "sculpting layer". - If key is locked, then old logic would be used. - If there's multires modifier enabled, sculpting would happen on multires. --- source/blender/blenkernel/intern/cdderivedmesh.c | 14 +++++++++++++- source/blender/editors/sculpt_paint/sculpt.c | 14 +++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index cbe7382c3a9..0b29b29e60f 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -197,8 +197,20 @@ static int can_pbvh_draw(Object *ob, DerivedMesh *dm) { CDDerivedMesh *cddm = (CDDerivedMesh*) dm; Mesh *me= ob->data; + int deformed= 0; - if(ob->sculpt->modifiers_active) return 0; + /* active modifiers means extra deformation, which can't be handled correct + on bith of PBVH and sculpt "layer" levels, so use PBVH only for internal brush + stuff and show final DerivedMesh so user would see actual object shape */ + deformed|= ob->sculpt->modifiers_active; + + /* as in case with modifiers, we can't synchronize deformation made against + PBVH and non-locked keyblock, so also use PBVH only for brushes and + final DM to give final result to user */ + deformed|= ob->sculpt->kb && (ob->shapeflag&OB_SHAPE_LOCK) == 0; + + if(deformed) + return 0; return (cddm->mvert == me->mvert) || ob->sculpt->kb; } diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 05e60fe8f9c..e4385131db1 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -175,10 +175,15 @@ static int sculpt_has_active_modifiers(Scene *scene, Object *ob) int sculpt_modifiers_active(Scene *scene, Object *ob) { ModifierData *md; + Mesh *me= (Mesh*)ob->data; MultiresModifierData *mmd= sculpt_multires_active(scene, ob); if(mmd) return 0; + /* non-locked shaoe keys could be handled in the same way as deformed mesh */ + if((ob->shapeflag&OB_SHAPE_LOCK)==0 && me->key && ob->shapenr) + return 1; + md= modifiers_getVirtualModifierList(ob); /* exception for shape keys because we can edit those */ @@ -2708,7 +2713,7 @@ void sculpt_update_mesh_elements(Scene *scene, Object *ob, int need_fmap) ss->modifiers_active= sculpt_modifiers_active(scene, ob); - if((ob->shapeflag & OB_SHAPE_LOCK) && !mmd) ss->kb= ob_get_keyblock(ob); + if(!mmd) ss->kb= ob_get_keyblock(ob); else ss->kb= NULL; if(mmd) { @@ -3342,7 +3347,7 @@ static void sculpt_brush_init_tex(Sculpt *sd, SculptSession *ss) sculpt_update_tex(sd, ss); } -static int sculpt_brush_stroke_init(bContext *C, ReportList *reports) +static int sculpt_brush_stroke_init(bContext *C, ReportList *UNUSED(reports)) { Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_active_object(C); @@ -3350,11 +3355,6 @@ static int sculpt_brush_stroke_init(bContext *C, ReportList *reports) SculptSession *ss = CTX_data_active_object(C)->sculpt; Brush *brush = paint_brush(&sd->paint); - if(ob_get_key(ob) && !(ob->shapeflag & OB_SHAPE_LOCK)) { - BKE_report(reports, RPT_ERROR, "Shape key sculpting requires a locked shape."); - return 0; - } - view3d_operator_needs_opengl(C); sculpt_brush_init_tex(sd, ss); From d7306104570a91a56bf02101b89cb01781fc4294 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sat, 23 Apr 2011 09:25:34 +0000 Subject: [PATCH 83/88] Fix #26959: change selection of shapekeys in edit mode causes mesh deformity of a key Vertex offset, which was used to update referenced keys was calculating between editmesh (which represents shapekey data) and base mesh (ob->mesh) which represents Bases key. This commit fixes bug with incorrect ofsset calculation for case when some keys got other (not Basis) keys as relative key by calculating offset using EditMesh (new shapekey data) and keyblock data (which was used to create EditMesh when entering edit mode). This commit shouldn't lead to regressions, but maybe there's something else which should be fixed for such kinda complicated cases -- more testing would be welcome. --- source/blender/editors/mesh/editmesh.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c index 0165b9794ca..ec08bfccda3 100644 --- a/source/blender/editors/mesh/editmesh.c +++ b/source/blender/editors/mesh/editmesh.c @@ -1177,13 +1177,14 @@ void load_editMesh(Scene *scene, Object *obedit) } if(act_is_basis) { /* active key is a base */ + float (*fp)[3]= actkey->data; i=0; ofs= MEM_callocN(sizeof(float) * 3 * em->totvert, "currkey->data"); eve= em->verts.first; mvert = me->mvert; while(eve) { if(eve->keyindex>=0) - VECSUB(ofs[i], mvert->co, oldverts[eve->keyindex].co); + VECSUB(ofs[i], mvert->co, fp[eve->keyindex]); eve= eve->next; i++; From 855a3e6ce3741513576dac5ebbecc580fb9c07e7 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sat, 23 Apr 2011 11:09:24 +0000 Subject: [PATCH 84/88] Small type-tweaks (int being returned as float) --- source/blender/editors/armature/poseSlide.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/armature/poseSlide.c b/source/blender/editors/armature/poseSlide.c index 2e4fb8a4d31..3d6888d87dc 100644 --- a/source/blender/editors/armature/poseSlide.c +++ b/source/blender/editors/armature/poseSlide.c @@ -989,11 +989,11 @@ static float pose_propagate_get_boneHoldEndFrame (Object *ob, tPChanFCurveLink * } /* get reference value from F-Curve using RNA */ -static float pose_propagate_get_refVal (Object *ob, FCurve *fcu, float *value) +static short pose_propagate_get_refVal (Object *ob, FCurve *fcu, float *value) { PointerRNA id_ptr, ptr; PropertyRNA *prop; - int found= FALSE; + short found= FALSE; /* base pointer is always the object -> id_ptr */ RNA_id_pointer_create(&ob->id, &id_ptr); @@ -1066,9 +1066,9 @@ static void pose_propagate_fcurve (wmOperator *op, Object *ob, FCurve *fcu, * doesn't need to firstly keyframe the pose (though this doesn't mean that * they can't either) */ - if(!pose_propagate_get_refVal(ob, fcu, &refVal)) + if( !pose_propagate_get_refVal(ob, fcu, &refVal)) return; - + /* find the first keyframe to start propagating from * - if there's a keyframe on the current frame, we probably want to save this value there too * since it may be as of yet unkeyed From 2060a261391499f64a372fb38dce0c977300d742 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sat, 23 Apr 2011 11:13:36 +0000 Subject: [PATCH 85/88] Bugfix [#27134] Minor bug in the name: property Constraint.is_valid has label "Disabled" "is_valid" RNA property for constraints had the property name inverted, but the displayed name and tooltips were not inverted too --- source/blender/makesrna/intern/rna_constraint.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c index e57491dc36d..966e679f0fe 100644 --- a/source/blender/makesrna/intern/rna_constraint.c +++ b/source/blender/makesrna/intern/rna_constraint.c @@ -2043,7 +2043,7 @@ void RNA_def_constraint(BlenderRNA *brna) prop= RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_DISABLE); - RNA_def_property_ui_text(prop, "Disabled", "Constraint has invalid settings and will not be evaluated"); + RNA_def_property_ui_text(prop, "Valid", "Constraint has valid settings and can be evaluated"); // TODO: setting this to true must ensure that all others in stack are turned off too... prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE); From 7f56023e9bd95e8817556e0c6ae317434a1bee5a Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sat, 23 Apr 2011 11:20:30 +0000 Subject: [PATCH 86/88] Bugfix [#27126] Ctrl 0/1/2/3/4 not working in edit mode Keymaps for subdivision_set operator were only added for Object mode. Since this is useful for meshes in particular, added these in EditMode keymap for mesh editing too. --- source/blender/editors/mesh/mesh_ops.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 1c10128cee8..d95c71b68ba 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -229,6 +229,7 @@ void ED_keymap_mesh(wmKeyConfig *keyconf) { wmKeyMap *keymap; wmKeyMapItem *kmi; + int i; keymap= WM_keymap_find(keyconf, "Mesh", 0, 0); keymap->poll= ED_operator_editmesh; @@ -322,6 +323,12 @@ void ED_keymap_mesh(wmKeyConfig *keyconf) WM_keymap_add_menu(keymap, "VIEW3D_MT_uv_map", UKEY, KM_PRESS, 0, 0); WM_keymap_add_menu(keymap, "VIEW3D_MT_vertex_group", GKEY, KM_PRESS, KM_CTRL, 0); + /* useful stuff from object-mode */ + for (i=0; i<=5; i++) { + kmi = WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", ZEROKEY+i, KM_PRESS, KM_CTRL, 0); + RNA_int_set(kmi->ptr, "level", i); + } + ED_object_generic_keymap(keyconf, keymap, 3); } From d6d2f09dd9e4df0a3e1168b2fbd3dcf2f9bd8e27 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 23 Apr 2011 12:57:03 +0000 Subject: [PATCH 87/88] quiet some clang warnings & fix for bugs in exceptional cases. - ghost C api, BLI_get_folder_version() could assign garbage values. - pointcache ptcache_find_frames_around() had a superfluous NULL check which would have crashed anyway if actually NULL. --- intern/ghost/intern/GHOST_C-api.cpp | 4 ++-- source/blender/blenkernel/intern/pointcache.c | 6 ++++-- source/blender/blenlib/intern/path_util.c | 2 ++ source/blender/editors/animation/anim_channels_defines.c | 4 ++-- source/blender/editors/interface/interface.c | 2 ++ source/blender/editors/interface/interface_regions.c | 1 + source/blender/editors/space_image/image_draw.c | 2 ++ source/blender/editors/space_view3d/view3d_header.c | 2 +- 8 files changed, 16 insertions(+), 7 deletions(-) diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp index 28058c60499..a1e1bafa82f 100644 --- a/intern/ghost/intern/GHOST_C-api.cpp +++ b/intern/ghost/intern/GHOST_C-api.cpp @@ -403,7 +403,7 @@ GHOST_TSuccess GHOST_GetModifierKeyState(GHOST_SystemHandle systemhandle, { GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; GHOST_TSuccess result; - bool isdown; + bool isdown= false; result = system->getModifierKeyState(mask, isdown); *isDown = (int) isdown; @@ -419,7 +419,7 @@ GHOST_TSuccess GHOST_GetButtonState(GHOST_SystemHandle systemhandle, { GHOST_ISystem* system = (GHOST_ISystem*) systemhandle; GHOST_TSuccess result; - bool isdown; + bool isdown= false; result = system->getButtonState(mask, isdown); *isDown = (int) isdown; diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index a8c7266b3fa..179aab064b4 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -1373,11 +1373,13 @@ static void ptcache_find_frames_around(PTCacheID *pid, unsigned int frame, int * while(pm->next && pm->next->frame < frame) pm= pm->next; - if(pm2 && pm2->frame < frame) + if(pm2->frame < frame) { pm2 = NULL; + } else { - while(pm2->prev && pm2->prev->frame > frame) + while(pm2->prev && pm2->prev->frame > frame) { pm2= pm2->prev; + } } if(pm && !pm2) { diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index 73d6588b97f..1a47a93ab51 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -1144,6 +1144,8 @@ char *BLI_get_folder_version(const int id, const int ver, const int do_check) ok= get_path_system(path, NULL, NULL, NULL, ver); break; default: + path[0]= '\0'; /* incase do_check is false */ + ok= FALSE; BLI_assert(!"incorrect ID"); } diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c index 383e35a5760..3374b3c6f95 100644 --- a/source/blender/editors/animation/anim_channels_defines.c +++ b/source/blender/editors/animation/anim_channels_defines.c @@ -3224,7 +3224,7 @@ void ANIM_channel_draw_widgets (bAnimContext *ac, bAnimListElem *ale, uiBlock *b { bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale); View2D *v2d= &ac->ar->v2d; - float y, ymid, ytext; + float y, ymid /*, ytext*/; short offset; /* sanity checks - don't draw anything */ @@ -3243,7 +3243,7 @@ void ANIM_channel_draw_widgets (bAnimContext *ac, bAnimListElem *ale, uiBlock *b y= (ymaxc - yminc)/2 + yminc; ymid= y - 7; /* y-coordinates for text is only 4 down from middle */ - ytext= y - 4; + /* ytext= y - 4; */ /* no button backdrop behind icons */ uiBlockSetEmboss(block, UI_EMBOSSN); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index b07baf45d23..108f06a5cb6 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -2093,6 +2093,8 @@ void ui_check_but(uiBut *but) str= strcat(str, "Alt "); if(but->modifier_key & KM_OSKEY) str= strcat(str, "Cmd "); + + (void)str; /* UNUSED */ } else strcat(but->drawstr, "Press a key "); diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 4457ec6b323..1a240f34757 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -2326,6 +2326,7 @@ static void confirm_operator(bContext *C, wmOperator *op, const char *title, con s= buf; if (title) s+= sprintf(s, "%s%%t|%s", title, item); + (void)s; handle= ui_popup_menu_create(C, NULL, NULL, NULL, NULL, buf); diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index b866a21d027..0f361b43de6 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -332,6 +332,8 @@ void draw_image_info(ARegion *ar, int color_manage, int channels, int x, int y, BLF_draw_ascii(blf_mono_font, str, sizeof(str)); dx += BLF_width(blf_mono_font, str); } + + (void)dx; } /* image drawing */ diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 445d2f434fa..939c44a0514 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -313,7 +313,7 @@ static char *view3d_modeselect_pup(Scene *scene) if (ob->particlesystem.first || modifiers_findByType(ob, eModifierType_Cloth) || modifiers_findByType(ob, eModifierType_Softbody)) { str += sprintf(str, formatstr, "Particle Mode", OB_MODE_PARTICLE_EDIT, ICON_PARTICLEMODE); } - + (void)str; return (string); } From 040a049fb17af2e690219ec7f48f601a6d2189c4 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sat, 23 Apr 2011 15:27:35 +0000 Subject: [PATCH 88/88] Fix #27048: text + SimpleDeform modifier = weird render result! It's not real fix, just patch which makes things better by using average normal for each displist separately. There are still some artifacts with quite highly deformed letters "O" or "g", but correct fix would need to calculate derivative of modifiers, which isn't implemented yet. --- .../render/intern/source/convertblender.c | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 93062bfb59a..1a19bbe7320 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -2868,17 +2868,10 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) startvert= obr->totvert; data= dl->verts; - n[0]= ob->imat[0][2]; - n[1]= ob->imat[1][2]; - n[2]= ob->imat[2][2]; - normalize_v3(n); - for(a=0; anr; a++, data+=3) { ver= RE_findOrAddVert(obr, obr->totvert++); VECCOPY(ver->co, data); - negate_v3_v3(ver->n, n); - mul_m4_v3(mat, ver->co); if (orco) { @@ -2888,21 +2881,41 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) } if(timeoffset==0) { + float tmp[3]; + const int startvlak= obr->totvlak; + + zero_v3(n); index= dl->index; for(a=0; aparts; a++, index+=3) { - vlr= RE_findOrAddVlak(obr, obr->totvlak++); vlr->v1= RE_findOrAddVert(obr, startvert+index[0]); vlr->v2= RE_findOrAddVert(obr, startvert+index[1]); vlr->v3= RE_findOrAddVert(obr, startvert+index[2]); vlr->v4= NULL; - negate_v3_v3(vlr->n, n); + normal_tri_v3(tmp, vlr->v3->co, vlr->v2->co, vlr->v1->co); + add_v3_v3(n, tmp); vlr->mat= matar[ dl->col ]; vlr->flag= 0; vlr->ec= 0; } + + normalize_v3(n); + + /* vertex normals */ + for(a= startvlak; atotvlak; a++) { + vlr= RE_findOrAddVlak(obr, a); + + copy_v3_v3(vlr->n, n); + add_v3_v3(vlr->v1->n, vlr->n); + add_v3_v3(vlr->v3->n, vlr->n); + add_v3_v3(vlr->v2->n, vlr->n); + } + for(a=startvert; atotvert; a++) { + ver= RE_findOrAddVert(obr, a); + normalize_v3(ver->n); + } } } else if (dl->type==DL_SURF) {