From 6f7ae034fd40a29e23fd02b1e8d034222f45643c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 7 Dec 2011 00:36:57 +0000 Subject: [PATCH 01/16] fix for noise module in driver namespace (was infact mathutils). --- source/blender/makesdna/DNA_object_types.h | 2 +- source/blender/python/intern/bpy_driver.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index e4237197fca..8707ae038c3 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -219,7 +219,7 @@ typedef struct Object { ListBase controllers; /* game logic controllers */ ListBase actuators; /* game logic actuators */ - float bbsize[3]; + float bbsize[3] DNA_DEPRECATED; short index; /* custom index, for renderpasses */ unsigned short actdef; /* current deformation group, note: index starts at 1 */ float col[4]; /* object color */ diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index 34270c832ea..db408374b7f 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -82,9 +82,10 @@ int bpy_pydriver_create_dict(void) } /* add noise to global namespace */ - mod= PyImport_ImportModuleLevel((char *)"mathutils.noise", NULL, NULL, NULL, 0); + mod= PyImport_ImportModuleLevel((char *)"mathutils", NULL, NULL, NULL, 0); if (mod) { - PyDict_SetItemString(bpy_pydriver_Dict, "noise", mod); + PyObject *modsub= PyDict_GetItemString(PyModule_GetDict(mod), "noise"); + PyDict_SetItemString(bpy_pydriver_Dict, "noise", modsub); Py_DECREF(mod); } From 9d69115e9217c6b4de76efd3091934eaa255f012 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 7 Dec 2011 07:13:33 +0000 Subject: [PATCH 02/16] fix for uninitialized memory use drawing 'nan' vertex groups, noticed while looking into [#29521] --- .../blender/blenkernel/intern/DerivedMesh.c | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 795b36813e1..5c80038a50d 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -60,6 +60,7 @@ #include "BKE_texture.h" #include "BKE_multires.h" #include "BKE_armature.h" +#include "BKE_deform.h" #ifdef WITH_GAMEENGINE #include "BKE_navmesh_conversion.h" @@ -625,40 +626,49 @@ void weight_to_rgb(float r_rgb[3], const float weight) r_rgb[1]= blend * (1.0f-((weight-0.75f)*4.0f)); r_rgb[2]= 0.0f; } + else { + /* exceptional value, unclamped or nan, + * avoid uninitialized memory use */ + r_rgb[0]= 1.0f; + r_rgb[1]= 0.0f; + r_rgb[2]= 1.0f; + } } /* draw_flag's for calc_weightpaint_vert_color */ enum { CALC_WP_MULTIPAINT= (1<<0), - CALC_WP_AUTO_NORMALIZE= (1<<1), + CALC_WP_AUTO_NORMALIZE= (1<<1) }; static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, unsigned char *col, char *dg_flags, int selected, int UNUSED(unselected), const int draw_flag) { Mesh *me = ob->data; - float colf[4], input = 0.0f; - int i; - + float input = 0.0f; int make_black= FALSE; if (me->dvert) { + MDeformVert *dvert= &me->dvert[vert]; + if ((selected > 1) && (draw_flag & CALC_WP_MULTIPAINT)) { - int was_a_nonzero= FALSE; - for (i=0; idvert[vert].totweight; i++) { + int i; + + MDeformWeight *dw= dvert->dw; + for (i = dvert->totweight; i > 0; i--, dw++) { /* in multipaint, get the average if auto normalize is inactive * get the sum if it is active */ - if(dg_flags[me->dvert[vert].dw[i].def_nr]) { - if(me->dvert[vert].dw[i].weight) { - input+= me->dvert[vert].dw[i].weight; + if (dg_flags[dw->def_nr]) { + if (dw->weight) { + input += dw->weight; was_a_nonzero= TRUE; } } } /* make it black if the selected groups have no weight on a vertex */ - if(was_a_nonzero == FALSE) { + if (was_a_nonzero == FALSE) { make_black = TRUE; } else if ((draw_flag & CALC_WP_AUTO_NORMALIZE) == FALSE) { @@ -667,11 +677,7 @@ static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, u } else { /* default, non tricky behavior */ - for (i=0; idvert[vert].totweight; i++) { - if (me->dvert[vert].dw[i].def_nr==ob->actdef-1) { - input+=me->dvert[vert].dw[i].weight; - } - } + input= defvert_find_weight(dvert, ob->actdef-1); } } @@ -680,20 +686,23 @@ static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, u col[2] = 0; col[1] = 0; col[0] = 255; - return; } + else { + float colf[4]; + CLAMP(input, 0.0f, 1.0f); - CLAMP(input, 0.0f, 1.0f); + colf[0]= colf[1]= colf[2]= -1; - if(coba) - do_colorband(coba, input, colf); - else - weight_to_rgb(colf, input); - - col[3] = (unsigned char)(colf[0] * 255.0f); - col[2] = (unsigned char)(colf[1] * 255.0f); - col[1] = (unsigned char)(colf[2] * 255.0f); - col[0] = 255; + if(coba) + do_colorband(coba, input, colf); + else + weight_to_rgb(colf, input); + + col[3] = (unsigned char)(colf[0] * 255.0f); + col[2] = (unsigned char)(colf[1] * 255.0f); + col[1] = (unsigned char)(colf[2] * 255.0f); + col[0] = 255; + } } static ColorBand *stored_cb= NULL; From c292bf18be49f7052b716e0eec1b25a87d117394 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 7 Dec 2011 08:03:52 +0000 Subject: [PATCH 03/16] correct missing argument error if CYCLES_OPTIMIZED_KERNEL_FLAGS isnt set --- intern/cycles/kernel/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index 601b95d262a..a0803f37cb9 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -129,7 +129,7 @@ include_directories(${INC}) add_library(cycles_kernel ${SRC} ${SRC_HEADERS} ${SRC_SVM_HEADERS}) if(WITH_CYCLES_OPTIMIZED_KERNEL) - SET_SOURCE_FILES_PROPERTIES(kernel_optimized.cpp PROPERTIES COMPILE_FLAGS ${CYCLES_OPTIMIZED_KERNEL_FLAGS}) + set_source_files_properties(kernel_optimized.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_OPTIMIZED_KERNEL_FLAGS}") endif() if(WITH_CYCLES_CUDA) From 2b49d0533817df05e829b3adc802a30b2234e49d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 7 Dec 2011 09:13:15 +0000 Subject: [PATCH 04/16] fix for NULL pointer free and add in some checks, while looking into bug [#29521], add asserts so we know if an invalid active index is ever set. --- source/blender/editors/object/object_vgroup.c | 48 +++++++++++++------ .../editors/sculpt_paint/paint_vertex.c | 10 ++-- .../editors/space_outliner/outliner_select.c | 2 + 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 55d72bcf165..b809fd5dbb1 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -1608,21 +1608,37 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v sel, sel_mirr, \ flip_map, flip_map_len, \ mirror_weights, flip_vgroups, \ - all_vgroups, act_vgroup \ + all_vgroups, def_nr \ ) EditVert *eve, *eve_mirr; MDeformVert *dvert, *dvert_mirr; short sel, sel_mirr; int *flip_map, flip_map_len; - const int act_vgroup= ob->actdef > 0 ? ob->actdef-1 : 0; + const int def_nr= ob->actdef-1; - if(mirror_weights==0 && flip_vgroups==0) + if ( (mirror_weights==0 && flip_vgroups==0) || + (BLI_findlink(&ob->defbase, def_nr) == NULL) ) + { return; + } - flip_map= all_vgroups ? - defgroup_flip_map(ob, &flip_map_len, FALSE) : - defgroup_flip_map_single(ob, &flip_map_len, FALSE, act_vgroup); + if (flip_vgroups) { + flip_map= all_vgroups ? + defgroup_flip_map(ob, &flip_map_len, FALSE) : + defgroup_flip_map_single(ob, &flip_map_len, FALSE, def_nr); + + BLI_assert(flip_map != NULL); + + if (flip_map == NULL) { + /* something went wrong!, possibly no groups */ + return; + } + } + else { + flip_map= NULL; + flip_map_len= 0; + } /* only the active group */ if(ob->type == OB_MESH) { @@ -1631,8 +1647,7 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v if (em) { if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) { - MEM_freeN(flip_map); - return; + goto cleanup; } EM_cache_x_mirror_vert(ob, em); @@ -1654,7 +1669,6 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v eve->tmp.v= eve_mirr->tmp.v= NULL; } } - BKE_mesh_end_editmesh(me, em); } else { @@ -1664,8 +1678,7 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0; if (me->dvert == NULL) { - MEM_freeN(flip_map); - return; + goto cleanup; } if (!use_vert_sel) { @@ -1712,8 +1725,7 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v if(lt->editlatt) lt= lt->editlatt->latt; if(lt->pntsu == 1 || lt->dvert == NULL) { - MEM_freeN(flip_map); - return; + goto cleanup; } /* unlike editmesh we know that by only looping over the first hald of @@ -1749,9 +1761,11 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v } } - MEM_freeN(flip_map); +cleanup: + if (flip_map) MEM_freeN(flip_map); #undef VGROUP_MIRR_OP + } static void vgroup_remap_update_users(Object *ob, int *map) @@ -2733,6 +2747,7 @@ static int set_active_group_exec(bContext *C, wmOperator *op) int nr= RNA_enum_get(op->ptr, "group"); ob->actdef= nr+1; + BLI_assert(ob->actdef >= 0); DAG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob); @@ -2811,7 +2826,7 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op) MDeformVert *dvert= NULL; bDeformGroup *def; int def_tot = BLI_countlist(&ob->defbase); - int *sort_map_update= MEM_mallocN(MAX_VGROUP_NAME * sizeof(int) * def_tot + 1, "sort vgroups"); /* needs a dummy index at the start*/ + int *sort_map_update= MEM_mallocN(sizeof(int) * (def_tot + 1), "sort vgroups"); /* needs a dummy index at the start*/ int *sort_map= sort_map_update + 1; char *name; int i; @@ -2820,6 +2835,8 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op) for(def= ob->defbase.first, i=0; def; def=def->next, i++){ sort_map[i]= BLI_findstringindex(&ob->defbase, name, offsetof(bDeformGroup, name)); name += MAX_VGROUP_NAME; + + BLI_assert(sort_map[i] != -1); } if(ob->mode == OB_MODE_EDIT) { @@ -2861,6 +2878,7 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op) vgroup_remap_update_users(ob, sort_map_update); ob->actdef= sort_map_update[ob->actdef]; + BLI_assert(ob->actdef >= 0); MEM_freeN(sort_map_update); diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index a5bd38d6696..9cc81df6ce5 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -1022,6 +1022,7 @@ static int weight_sample_group_exec(bContext *C, wmOperator *op) view3d_set_viewcontext(C, &vc); vc.obact->actdef= type + 1; + BLI_assert(vc.obact->actdef >= 0); DAG_id_tag_update(&vc.obact->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, vc.obact); @@ -1879,10 +1880,13 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED if(pchan) { bDeformGroup *dg= defgroup_find_name(ob, pchan->name); - if(dg==NULL) + if(dg==NULL) { dg= ED_vgroup_add_name(ob, pchan->name); /* sets actdef */ - else + } + else { ob->actdef= 1 + defgroup_find_index(ob, dg); + BLI_assert(ob->actdef >= 0); + } } } } @@ -1954,7 +1958,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P wpi.defbase_tot= wpd->defbase_tot; wpi.defbase_sel= MEM_mallocN(wpi.defbase_tot*sizeof(char), "wpi.defbase_sel"); wpi.defbase_tot_sel= get_selected_defgroups(ob, wpi.defbase_sel, wpi.defbase_tot); - if(wpi.defbase_tot_sel == 0 && ob->actdef) wpi.defbase_tot_sel = 1; + if(wpi.defbase_tot_sel == 0 && ob->actdef > 0) wpi.defbase_tot_sel = 1; wpi.defbase_tot_unsel= wpi.defbase_tot - wpi.defbase_tot_sel; wpi.vgroup_mirror= wpd->vgroup_mirror; wpi.lock_flags= wpd->lock_flags; diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c index aa50b3d5154..89547edaafa 100644 --- a/source/blender/editors/space_outliner/outliner_select.c +++ b/source/blender/editors/space_outliner/outliner_select.c @@ -397,6 +397,8 @@ static int tree_element_active_defgroup(bContext *C, Scene *scene, TreeElement * ob= (Object *)tselem->id; if(set) { ob->actdef= te->index+1; + BLI_assert(ob->actdef >= 0); + DAG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob); } From 433033c2bf4b72e389d103e00a375d344588ac8e Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 7 Dec 2011 09:21:50 +0000 Subject: [PATCH 05/16] Camera tracking: some bug fixes - Fixed bug with not putting disabled markers properly when doing backwards tracking - Fixed margin size calculating from pattern size which used to be double-sized and prevented to track things on the image edges. --- source/blender/blenkernel/intern/tracking.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 66c0c0265a1..043fabcd510 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -1158,7 +1158,7 @@ int BKE_tracking_next(MovieTrackingContext *context) if(marker && (marker->flag&MARKER_DISABLED)==0) { #ifdef WITH_LIBMV int width, height, origin[2], tracked= 0, need_readjust= 0; - float pos[2], margin[2]; + float pos[2], margin[2], dim[2]; double x1, y1, x2, y2; ImBuf *ibuf= NULL; MovieTrackingMarker marker_new, *marker_keyed; @@ -1174,7 +1174,8 @@ int BKE_tracking_next(MovieTrackingContext *context) else nextfra= curfra+1; /* margin from frame boundaries */ - sub_v2_v2v2(margin, track->pat_max, track->pat_min); + sub_v2_v2v2(dim, track->pat_max, track->pat_min); + margin[0]= margin[1]= MAX2(dim[0], dim[1]) / 2.0f; margin[0]= MAX2(margin[0], (float)track->margin / ibuf_new->x); margin[1]= MAX2(margin[1], (float)track->margin / ibuf_new->y); @@ -1287,7 +1288,7 @@ int BKE_tracking_next(MovieTrackingContext *context) { /* check if there's no keyframe/tracked markers before tracking marker. if so -- create disabled marker before currently tracking "segment" */ - put_disabled_marker(track, marker, 1, 0); + put_disabled_marker(track, marker, !context->backwards, 0); } } @@ -1311,7 +1312,7 @@ int BKE_tracking_next(MovieTrackingContext *context) /* make currently tracked segment be finished with disabled marker */ #pragma omp critical { - put_disabled_marker(track, &marker_new, 0, 0); + put_disabled_marker(track, &marker_new, context->backwards, 0); } } else { marker_new= *marker; From d0c327c81c519aed6dcf19329c6e9daf0d87cc01 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 7 Dec 2011 09:55:37 +0000 Subject: [PATCH 06/16] Fix #29432: Marquee Select Bug Moved tweak threshold value to user preferences This threshold might be needed to be tweaked when working with tables, i.e. to prevent tap+slight movement be treated as tweak event. --- release/scripts/startup/bl_ui/space_userpref.py | 2 ++ source/blender/editors/interface/resources.c | 2 ++ source/blender/makesdna/DNA_userdef_types.h | 4 +++- source/blender/makesrna/intern/rna_userdef.c | 5 +++++ source/blender/windowmanager/intern/wm_gesture.c | 3 +-- 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index d71d57509c1..df8c085d77e 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -889,6 +889,8 @@ class USERPREF_PT_input(Panel, InputKeyMapPanel): sub.label(text="NDOF Device:") sub.prop(inputs, "ndof_sensitivity", text="NDOF Sensitivity") + col.prop(inputs, "tweak_threshold") + row.separator() def draw(self, context): diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index dee945ecd7d..c3fe50edcd3 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -1715,6 +1715,8 @@ void init_userdef_do_versions(void) U.ndof_flag = NDOF_LOCK_HORIZON | NDOF_SHOULD_PAN | NDOF_SHOULD_ZOOM | NDOF_SHOULD_ROTATE; } + if (U.tweak_threshold == 0 ) + U.tweak_threshold= 10; /* funny name, but it is GE stuff, moves userdef stuff to engine */ // XXX space_set_commmandline_options(); diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 4f6c7e22f5e..851d4b562e6 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -408,7 +408,9 @@ typedef struct UserDef { struct ColorBand coba_weight; /* from texture.h */ float sculpt_paint_overlay_col[3]; - int pad3; + + short tweak_threshold; + short pad3; char author[80]; /* author name for file formats supporting it */ } UserDef; diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 0ea6b902150..f9b20d3ac78 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -2929,6 +2929,11 @@ static void rna_def_userdef_input(BlenderRNA *brna) RNA_def_property_range(prop, 3, 40); RNA_def_property_ui_text(prop, "Drag Threshold", "Amount of pixels you have to drag before dragging UI items happens"); + prop= RNA_def_property(srna, "tweak_threshold", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "tweak_threshold"); + RNA_def_property_range(prop, 3, 1024); + RNA_def_property_ui_text(prop, "Tweak Threshold", "Number of pixels you have to drag before tweak event is triggered"); + /* 3D mouse settings */ /* global options */ prop= RNA_def_property(srna, "ndof_sensitivity", PROP_FLOAT, PROP_NONE); diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c index ef463989c64..4fb8751de69 100644 --- a/source/blender/windowmanager/intern/wm_gesture.c +++ b/source/blender/windowmanager/intern/wm_gesture.c @@ -124,14 +124,13 @@ void WM_gestures_remove(bContext *C) /* tweak and line gestures */ -#define TWEAK_THRESHOLD 10 int wm_gesture_evaluate(wmGesture *gesture) { if(gesture->type==WM_GESTURE_TWEAK) { rcti *rect= gesture->customdata; int dx= rect->xmax - rect->xmin; int dy= rect->ymax - rect->ymin; - if(ABS(dx)+ABS(dy) > TWEAK_THRESHOLD) { + if(ABS(dx)+ABS(dy) > U.tweak_threshold) { int theta= (int)floor(4.0f*atan2f((float)dy, (float)dx)/(float)M_PI + 0.5f); int val= EVT_GESTURE_W; From 62fc8f5197eb4b4eaf69a7f193d8587e296fcadb Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 7 Dec 2011 10:01:39 +0000 Subject: [PATCH 07/16] Make Hybrid tracker default for movie clips --- source/blender/blenkernel/intern/tracking.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 043fabcd510..e3284b46e8e 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -76,7 +76,7 @@ void BKE_tracking_init_settings(MovieTracking *tracking) tracking->camera.pixel_aspect= 1.0f; tracking->camera.units= CAMERA_UNITS_MM; - tracking->settings.default_tracker= TRACKER_KLT; + tracking->settings.default_tracker= TRACKER_HYBRID; tracking->settings.default_pyramid_levels= 2; tracking->settings.default_minimum_correlation= 0.75; tracking->settings.default_pattern_size= 11; From 91796ab6301c6d7c017a2086522015a0db6a2cec Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 7 Dec 2011 10:53:51 +0000 Subject: [PATCH 08/16] Tracks which were moved to close to boundary weren'haven't been disabled when doing frame-by-frame tracking. --- source/blender/blenkernel/intern/tracking.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index e3284b46e8e..9044661f369 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -1282,7 +1282,7 @@ int BKE_tracking_next(MovieTrackingContext *context) } coords_correct= !isnan(x2) && !isnan(y2) && finite(x2) && finite(y2); - if(coords_correct && (tracked || !context->disable_failed)) { + if(coords_correct && !onbound && (tracked || !context->disable_failed)) { if(context->first_time) { #pragma omp critical { From f96ac8c335e1bd535111a0ab7d81c8d774fc677b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 7 Dec 2011 11:22:29 +0000 Subject: [PATCH 09/16] Fix #29518: uv cylinder/sphere unwrap from menu didn't work same as using U key menu. --- release/scripts/startup/bl_ui/space_view3d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index ce0d56b9fca..5444ad327a9 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -255,7 +255,7 @@ class VIEW3D_MT_uv_map(Menu): layout.separator() - layout.operator_context = 'EXEC_DEFAULT' + layout.operator_context = 'EXEC_REGION_WIN' layout.operator("uv.cube_project") layout.operator("uv.cylinder_project") layout.operator("uv.sphere_project") From 11bacd403f16818023229bcebd22d609054eda16 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 7 Dec 2011 11:29:24 +0000 Subject: [PATCH 10/16] Fix #29523: RenderEngine.update_progress() doesn't redraw UI. --- source/blender/editors/render/render_internal.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index dbd1e27024e..8a580627da3 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -378,8 +378,12 @@ static void render_progress_update(void *rjv, float progress) { RenderJob *rj= rjv; - if(rj->progress) + if(rj->progress && *rj->progress != progress) { *rj->progress = progress; + + /* make jobs timer to send notifier */ + *(rj->do_update)= 1; + } } static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrect) From d568f56f181d21869e86511d9cc5502d1f312a79 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 7 Dec 2011 14:54:03 +0000 Subject: [PATCH 11/16] Merging remained part of hybrid tracker which adds correlation threshold Keir's comment: Add support for detecting tracking failure in the ESM tracker component of libmv. Since both KLT and Hybrid rely on ESM underneath, KLT and Hybrid now have a minimum correlation setting to match. With this fix, track failures should get detected quicker, with the issue that sometimes the tracker will give up too easily. That is fixable by reducing the required correlation (in the track properties). Command used for merge: svn merge -r 42396:42397 -r 42399:42400 ^/branches/soc-2011-tomato --- extern/libmv/libmv-capi.cpp | 6 ++-- extern/libmv/libmv-capi.h | 4 +-- .../libmv/tracking/esm_region_tracker.cc | 28 ++++++++++++++++--- .../libmv/libmv/tracking/esm_region_tracker.h | 4 ++- release/scripts/startup/bl_ui/space_clip.py | 6 ++-- source/blender/blenkernel/intern/tracking.c | 5 ++-- 6 files changed, 37 insertions(+), 16 deletions(-) diff --git a/extern/libmv/libmv-capi.cpp b/extern/libmv/libmv-capi.cpp index dd98d0828dc..1835c53b53f 100644 --- a/extern/libmv/libmv-capi.cpp +++ b/extern/libmv/libmv-capi.cpp @@ -111,12 +111,13 @@ void libmv_setLoggingVerbosity(int verbosity) /* ************ RegionTracker ************ */ -libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyramid_level, int half_window_size) +libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyramid_level, int half_window_size, double minimum_correlation) { libmv::EsmRegionTracker *esm_region_tracker = new libmv::EsmRegionTracker; esm_region_tracker->half_window_size = half_window_size; esm_region_tracker->max_iterations = max_iterations; esm_region_tracker->min_determinant = 1e-4; + esm_region_tracker->minimum_correlation = minimum_correlation; libmv::PyramidRegionTracker *pyramid_region_tracker = new libmv::PyramidRegionTracker(esm_region_tracker, pyramid_level); @@ -124,12 +125,13 @@ libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyram return (libmv_RegionTracker *)pyramid_region_tracker; } -libmv_RegionTracker *libmv_hybridRegionTrackerNew(int max_iterations, int half_window_size) +libmv_RegionTracker *libmv_hybridRegionTrackerNew(int max_iterations, int half_window_size, double minimum_correlation) { libmv::EsmRegionTracker *esm_region_tracker = new libmv::EsmRegionTracker; esm_region_tracker->half_window_size = half_window_size; esm_region_tracker->max_iterations = max_iterations; esm_region_tracker->min_determinant = 1e-4; + esm_region_tracker->minimum_correlation = minimum_correlation; libmv::BruteRegionTracker *brute_region_tracker = new libmv::BruteRegionTracker; brute_region_tracker->half_window_size = half_window_size; diff --git a/extern/libmv/libmv-capi.h b/extern/libmv/libmv-capi.h index c5e61d69c56..e10d4ef842a 100644 --- a/extern/libmv/libmv-capi.h +++ b/extern/libmv/libmv-capi.h @@ -43,8 +43,8 @@ void libmv_startDebugLogging(void); void libmv_setLoggingVerbosity(int verbosity); /* RegionTracker */ -struct libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyramid_level, int half_window_size); -struct libmv_RegionTracker *libmv_hybridRegionTrackerNew(int max_iterations, int half_window_size); +struct libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyramid_level, int half_window_size, double minimum_correlation); +struct libmv_RegionTracker *libmv_hybridRegionTrackerNew(int max_iterations, int half_window_size, double minimum_correlation); int libmv_regionTrackerTrack(struct libmv_RegionTracker *libmv_tracker, const float *ima1, const float *ima2, int width, int height, double x1, double y1, double *x2, double *y2); void libmv_regionTrackerDestroy(struct libmv_RegionTracker *libmv_tracker); diff --git a/extern/libmv/libmv/tracking/esm_region_tracker.cc b/extern/libmv/libmv/tracking/esm_region_tracker.cc index 844b5ff3cb9..9784b61c068 100644 --- a/extern/libmv/libmv/tracking/esm_region_tracker.cc +++ b/extern/libmv/libmv/tracking/esm_region_tracker.cc @@ -273,10 +273,30 @@ bool EsmRegionTracker::Track(const FloatImage &image1, // If the step was accepted, then check for termination. if (d.squaredNorm() < min_update_squared_distance) { - if (new_error > reasonable_error) { - LG << "Update size shrank but reasonable error (" - << reasonable_error << ") not achieved; failing."; - return true; // XXX + // Compute the Pearson product-moment correlation coefficient to check + // for sanity. + // TODO(keir): Put this somewhere smarter. + double sX=0,sY=0,sXX=0,sYY=0,sXY=0; + for (int r = 0; r < width; ++r) { + for (int c = 0; c < width; ++c) { + double x = image_and_gradient1_sampled(r, c, 0); + double y = image_and_gradient2_sampled[new_image](r, c, 0); + sX += x; + sY += y; + sXX += x*x; + sYY += y*y; + sXY += x*y; + } + } + double N = width*width; + sX /= N, sY /= N, sXX /= N, sYY /= N, sXY /= N; + double correlation = (sXY-sX*sY)/sqrt(double((sXX-sX*sX)*(sYY-sY*sY))); + LG << "Final correlation: " << correlation; + + if (correlation < minimum_correlation) { + LG << "Correlation " << correlation << " greater than " + << minimum_correlation << "; bailing."; + return false; } LG << "Successful track in " << (i + 1) << " iterations."; return true; diff --git a/extern/libmv/libmv/tracking/esm_region_tracker.h b/extern/libmv/libmv/tracking/esm_region_tracker.h index c63417201ad..602b32f1675 100644 --- a/extern/libmv/libmv/tracking/esm_region_tracker.h +++ b/extern/libmv/libmv/tracking/esm_region_tracker.h @@ -38,7 +38,8 @@ struct EsmRegionTracker : public RegionTracker { max_iterations(16), min_determinant(1e-6), min_update_squared_distance(1e-4), - sigma(0.9) {} + sigma(0.9), + minimum_correlation(0.78) {} virtual ~EsmRegionTracker() {} @@ -54,6 +55,7 @@ struct EsmRegionTracker : public RegionTracker { double min_determinant; double min_update_squared_distance; double sigma; + double minimum_correlation; }; } // namespace libmv diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py index 39b78ce8cdc..d05c93ccfe1 100644 --- a/release/scripts/startup/bl_ui/space_clip.py +++ b/release/scripts/startup/bl_ui/space_clip.py @@ -129,8 +129,7 @@ class CLIP_PT_tools_marker(Panel): if settings.default_tracker == 'KLT': col.prop(settings, "default_pyramid_levels") - elif settings.default_tracker == 'SAD': - col.prop(settings, "default_correlation_min") + col.prop(settings, "default_correlation_min") col.separator() @@ -497,8 +496,7 @@ class CLIP_PT_track_settings(Panel): if active.tracker == 'KLT': col.prop(active, "pyramid_levels") - elif active.tracker == 'SAD': - col.prop(active, "correlation_min") + col.prop(active, "correlation_min") col.separator() col.prop(active, "frames_limit") diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 9044661f369..cacea980fe2 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -77,7 +77,6 @@ void BKE_tracking_init_settings(MovieTracking *tracking) tracking->camera.units= CAMERA_UNITS_MM; tracking->settings.default_tracker= TRACKER_HYBRID; - tracking->settings.default_pyramid_levels= 2; tracking->settings.default_minimum_correlation= 0.75; tracking->settings.default_pattern_size= 11; tracking->settings.default_search_size= 51; @@ -810,9 +809,9 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u int level= MIN2(track->pyramid_levels, max_pyramid_levels); if(track->tracker==TRACKER_KLT) - track_context.region_tracker= libmv_pyramidRegionTrackerNew(100, level, MAX2(wndx, wndy)); + track_context.region_tracker= libmv_pyramidRegionTrackerNew(100, level, MAX2(wndx, wndy), track->minimum_correlation); else - track_context.region_tracker= libmv_hybridRegionTrackerNew(100, MAX2(wndx, wndy)); + track_context.region_tracker= libmv_hybridRegionTrackerNew(100, MAX2(wndx, wndy), track->minimum_correlation); } else if(track->tracker==TRACKER_SAD) { track_context.pattern_size= MAX2(patx, paty); From 4e48c7d91df6aea65f59d770a0af2b07453afc88 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 7 Dec 2011 15:21:38 +0000 Subject: [PATCH 12/16] Fix [#29461] Selection-to-Cursor works strange with bones with TrackTo constraint. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In fact, the problem was present with any kind of constraint… We need the cursor coordinates in the rest bone space (aka armature space), i.e with all "manual" and "procedural" (constraints, ...) pose transforms cleared (as said in armature_mat_pose_to_bone: /* Remove the pchan's transforms from it's pose_mat. * This should leave behind the effects of restpose + * parenting + constraints */ , only "manual" transforms are "cleared" by armature_loc_pose_to_bone...). --- source/blender/editors/space_view3d/view3d_snap.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index b2707db806f..0b33ac0d3cd 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -641,16 +641,19 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op)) if(pchan->bone->layer & arm->layer) { if((pchan->bone->flag & BONE_CONNECTED)==0) { float curspn[3]; + float inv_restmat[4][4]; - /* get location of cursor in bone-space */ - armature_loc_pose_to_bone(pchan, cursp, curspn); + /* get location of cursor in *rest* bone-space */ + copy_v3_v3(curspn, cursp); + invert_m4_m4(inv_restmat, pchan->bone->arm_mat); + mul_m4_v3(inv_restmat, curspn); /* copy new position */ - if ((pchan->protectflag & OB_LOCK_LOCX)==0) + if ((pchan->protectflag & OB_LOCK_LOCX)==0) pchan->loc[0]= curspn[0]; - if ((pchan->protectflag & OB_LOCK_LOCY)==0) + if ((pchan->protectflag & OB_LOCK_LOCY)==0) pchan->loc[1]= curspn[1]; - if ((pchan->protectflag & OB_LOCK_LOCZ)==0) + if ((pchan->protectflag & OB_LOCK_LOCZ)==0) pchan->loc[2]= curspn[2]; /* auto-keyframing */ From 58528bca3662802d8b7aa5e9f5c7b2d3dce885ab Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 7 Dec 2011 15:55:37 +0000 Subject: [PATCH 13/16] =?UTF-8?q?More=20fix=20for=20snapto=20in=20Pose=20m?= =?UTF-8?q?ode:=20*=20The=20code=20for=20snap=20to=20grid=20was=20complete?= =?UTF-8?q?ly=20wrong=20(only=20x=20pos=20of=20chan=20was=20affected?= =?UTF-8?q?=E2=80=A6=20by=20z=20computed=20value!),=20and=20the=20same=20p?= =?UTF-8?q?roblem=20as=20with=20snap=20to=20cursor=20was=20present=20(usin?= =?UTF-8?q?g=20armature=5Floc=5Fpose=5Fto=5Fbone=20is=20wrong=20here).=20A?= =?UTF-8?q?lso,=20computing=20nearest=20grid=20point=20in=20world=20space!?= =?UTF-8?q?=20Else,=20it=20generally=20ends=20up=20completely=20out=20of?= =?UTF-8?q?=20grid,=20due=20to=20object=20transforms...=20*=20Small=20clea?= =?UTF-8?q?nup=20of=20code=20(uneeded=20vars=20and=20copying).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../editors/space_view3d/view3d_snap.c | 90 +++++++++---------- 1 file changed, 42 insertions(+), 48 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index 0b33ac0d3cd..ecb54c77e0c 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -91,9 +91,7 @@ static int tottrans= 0; /* copied from editobject.c, now uses (almost) proper depgraph */ static void special_transvert_update(Object *obedit) { - if(obedit) { - DAG_id_tag_update(obedit->data, 0); if(obedit->type==OB_MESH) { @@ -177,7 +175,7 @@ static void special_transvert_update(Object *obedit) } } } - if(arm->flag & ARM_MIRROR_EDIT) + if(arm->flag & ARM_MIRROR_EDIT) transform_armature_mirror_update(obedit); } else if(obedit->type==OB_LATTICE) { @@ -193,7 +191,7 @@ static void special_transvert_update(Object *obedit) /* mode flags: */ #define TM_ALL_JOINTS 1 /* all joints (for bones only) */ #define TM_SKIP_HANDLES 2 /* skip handles when control point is selected (for curves only) */ -static void make_trans_verts(Object *obedit, float *min, float *max, int mode) +static void make_trans_verts(Object *obedit, float *min, float *max, int mode) { Nurb *nu; BezTriple *bezt; @@ -278,7 +276,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode) if ((tipsel && rootsel) || (rootsel)) { /* Don't add the tip (unless mode & TM_ALL_JOINTS, for getting all joints), * otherwise we get zero-length bones as tips will snap to the same - * location as heads. + * location as heads. */ if (rootok) { copy_v3_v3(tv->oldloc, ebo->head); @@ -296,7 +294,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode) tv->flag= 1; tv++; tottrans++; - } + } } else if (tipsel) { copy_v3_v3(tv->oldloc, ebo->tail); @@ -306,7 +304,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode) tv++; tottrans++; } - } + } } } else if (ELEM(obedit->type, OB_CURVE, OB_SURF)) { @@ -465,7 +463,7 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op)) if(obedit) { tottrans= 0; - if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL) + if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL) make_trans_verts(obedit, bmat[0], bmat[1], 0); if(tottrans==0) return OPERATOR_CANCELLED; @@ -474,7 +472,6 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op)) tv= transvmain; for(a=0; aloc); mul_m3_v3(bmat, vec); add_v3_v3(vec, obedit->obmat[3]); @@ -491,7 +488,6 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op)) MEM_freeN(transvmain); transvmain= NULL; - } else { struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOCATION_ID); @@ -501,34 +497,42 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op)) bPoseChannel *pchan; bArmature *arm= ob->data; + invert_m4_m4(ob->imat, ob->obmat); + for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { if(pchan->bone->flag & BONE_SELECTED) { if(pchan->bone->layer & arm->layer) { - if((pchan->bone->flag & BONE_CONNECTED)==0) { - float vecN[3], nLoc[3]; + if((pchan->bone->flag & BONE_CONNECTED)==0) { + float nLoc[3]; + float inv_restmat[4][4]; /* get nearest grid point to snap to */ copy_v3_v3(nLoc, pchan->pose_mat[3]); + /* We must operate in world space! */ + mul_m4_v3(ob->obmat, nLoc); vec[0]= gridf * (float)(floor(0.5f+ nLoc[0]/gridf)); vec[1]= gridf * (float)(floor(0.5f+ nLoc[1]/gridf)); vec[2]= gridf * (float)(floor(0.5f+ nLoc[2]/gridf)); + /* Back in object space... */ + mul_m4_v3(ob->imat, vec); - /* get bone-space location of grid point */ - armature_loc_pose_to_bone(pchan, vec, vecN); + /* get location of grid point in *rest* bone-space */ + invert_m4_m4(inv_restmat, pchan->bone->arm_mat); + mul_m4_v3(inv_restmat, vec); /* adjust location */ - if ((pchan->protectflag & OB_LOCK_LOCX)==0) - pchan->loc[0]= vecN[0]; - if ((pchan->protectflag & OB_LOCK_LOCY)==0) - pchan->loc[0]= vecN[1]; - if ((pchan->protectflag & OB_LOCK_LOCZ)==0) - pchan->loc[0]= vecN[2]; + if ((pchan->protectflag & OB_LOCK_LOCX)==0) + pchan->loc[0]= vec[0]; + if ((pchan->protectflag & OB_LOCK_LOCY)==0) + pchan->loc[1]= vec[1]; + if ((pchan->protectflag & OB_LOCK_LOCZ)==0) + pchan->loc[2]= vec[2]; /* auto-keyframing */ ED_autokeyframe_pchan(C, scene, ob, pchan, ks); } - /* if the bone has a parent and is connected to the parent, - * don't do anything - will break chain unless we do auto-ik. + /* if the bone has a parent and is connected to the parent, + * don't do anything - will break chain unless we do auto-ik. */ } } @@ -572,7 +576,6 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op)) void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot) { - /* identifiers */ ot->name= "Snap Selection to Grid"; ot->description= "Snap selected item(s) to nearest grid node"; @@ -603,7 +606,7 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op)) if(obedit) { tottrans= 0; - if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL) + if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL) make_trans_verts(obedit, bmat[0], bmat[1], 0); if(tottrans==0) return OPERATOR_CANCELLED; @@ -621,7 +624,6 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op)) MEM_freeN(transvmain); transvmain= NULL; - } else { struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOCATION_ID); @@ -630,37 +632,34 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op)) if(ob->mode & OB_MODE_POSE) { bPoseChannel *pchan; bArmature *arm= ob->data; - float cursp[3]; invert_m4_m4(ob->imat, ob->obmat); - copy_v3_v3(cursp, curs); - mul_m4_v3(ob->imat, cursp); + copy_v3_v3(vec, curs); + mul_m4_v3(ob->imat, vec); for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) { if(pchan->bone->flag & BONE_SELECTED) { if(pchan->bone->layer & arm->layer) { - if((pchan->bone->flag & BONE_CONNECTED)==0) { - float curspn[3]; + if((pchan->bone->flag & BONE_CONNECTED)==0) { float inv_restmat[4][4]; /* get location of cursor in *rest* bone-space */ - copy_v3_v3(curspn, cursp); invert_m4_m4(inv_restmat, pchan->bone->arm_mat); - mul_m4_v3(inv_restmat, curspn); + mul_m4_v3(inv_restmat, vec); /* copy new position */ if ((pchan->protectflag & OB_LOCK_LOCX)==0) - pchan->loc[0]= curspn[0]; + pchan->loc[0]= vec[0]; if ((pchan->protectflag & OB_LOCK_LOCY)==0) - pchan->loc[1]= curspn[1]; + pchan->loc[1]= vec[1]; if ((pchan->protectflag & OB_LOCK_LOCZ)==0) - pchan->loc[2]= curspn[2]; + pchan->loc[2]= vec[2]; /* auto-keyframing */ ED_autokeyframe_pchan(C, scene, ob, pchan, ks); } - /* if the bone has a parent and is connected to the parent, - * don't do anything - will break chain unless we do auto-ik. + /* if the bone has a parent and is connected to the parent, + * don't do anything - will break chain unless we do auto-ik. */ } } @@ -704,7 +703,6 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op)) void VIEW3D_OT_snap_selected_to_cursor(wmOperatorType *ot) { - /* identifiers */ ot->name= "Snap Selection to Cursor"; ot->description= "Snap selected item(s) to cursor"; @@ -741,7 +739,6 @@ static int snap_curs_to_grid(bContext *C, wmOperator *UNUSED(op)) void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot) { - /* identifiers */ ot->name= "Snap Cursor to Grid"; ot->description= "Snap cursor to nearest grid node"; @@ -806,7 +803,7 @@ static int snap_curs_to_sel(bContext *C, wmOperator *UNUSED(op)) if(obedit) { tottrans=0; - if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL) + if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL) make_trans_verts(obedit, bmat[0], bmat[1], TM_ALL_JOINTS|TM_SKIP_HANDLES); if(tottrans==0) return OPERATOR_CANCELLED; @@ -884,10 +881,9 @@ static int snap_curs_to_sel(bContext *C, wmOperator *UNUSED(op)) void VIEW3D_OT_snap_cursor_to_selected(wmOperatorType *ot) { - /* identifiers */ ot->name= "Snap Cursor to Selected"; - ot->description= "Snap cursor to center of selected item(s)"; + ot->description= "Snap cursor to center of selected item(s)"; ot->idname= "VIEW3D_OT_snap_cursor_to_selected"; /* api callbacks */ @@ -935,7 +931,6 @@ static int snap_curs_to_active(bContext *C, wmOperator *UNUSED(op)) void VIEW3D_OT_snap_cursor_to_active(wmOperatorType *ot) { - /* identifiers */ ot->name= "Snap Cursor to Active"; ot->description= "Snap cursor to active item"; @@ -969,13 +964,12 @@ static int snap_curs_to_center(bContext *C, wmOperator *UNUSED(op)) void VIEW3D_OT_snap_cursor_to_center(wmOperatorType *ot) { - /* identifiers */ ot->name= "Snap Cursor to Center"; ot->description= "Snap cursor to the Center"; ot->idname= "VIEW3D_OT_snap_cursor_to_center"; - /* api callbacks */ + /* api callbacks */ ot->exec= snap_curs_to_center; ot->poll= ED_operator_view3d_active; @@ -993,7 +987,7 @@ int minmax_verts(Object *obedit, float *min, float *max) int a; tottrans=0; - if ELEM5(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE) + if ELEM5(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE) make_trans_verts(obedit, bmat[0], bmat[1], TM_ALL_JOINTS); if(tottrans==0) return 0; @@ -1001,12 +995,12 @@ int minmax_verts(Object *obedit, float *min, float *max) copy_m3_m4(bmat, obedit->obmat); tv= transvmain; - for(a=0; aloc); mul_m3_v3(bmat, vec); add_v3_v3(vec, obedit->obmat[3]); add_v3_v3(centroid, vec); - DO_MINMAX(vec, min, max); + DO_MINMAX(vec, min, max); } MEM_freeN(transvmain); From d227471b72f6f20b35c8cfa5fc5cf7d264060838 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 7 Dec 2011 17:23:45 +0000 Subject: [PATCH 14/16] Fix #28663: All "unit" properties show a value of 0 (on WinXP&MinGW&scons) Use %g instead of %lg due to %g is supposed to be used for doubles and %lg confuses mingw at all --- source/blender/blenkernel/intern/unit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c index 616c27f6b0b..aa914998a72 100644 --- a/source/blender/blenkernel/intern/unit.c +++ b/source/blender/blenkernel/intern/unit.c @@ -494,7 +494,7 @@ static int unit_scale_str(char *str, int len_max, char *str_tmp, double scale_pr len_name = strlen(replace_str); len_move= (len - (found_ofs+len_name)) + 1; /* 1+ to copy the string terminator */ - len_num= BLI_snprintf(str_tmp, TEMP_STR_SIZE, "*%lg"SEP_STR, unit->scalar/scale_pref); /* # removed later */ + len_num= BLI_snprintf(str_tmp, TEMP_STR_SIZE, "*%g"SEP_STR, unit->scalar/scale_pref); /* # removed later */ if(len_num > len_max) len_num= len_max; From 1b71790316ff3e2c3c4a5f472fd45304fee83886 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 7 Dec 2011 17:28:42 +0000 Subject: [PATCH 15/16] Update presets for tracking --- .../presets/tracking_settings/blurry_footage.py | 11 +++++++++++ .../presets/tracking_settings/blurry_movie.py | 11 ----------- release/scripts/presets/tracking_settings/default.py | 4 ++-- .../scripts/presets/tracking_settings/fast_motion.py | 12 ++++++------ 4 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 release/scripts/presets/tracking_settings/blurry_footage.py delete mode 100644 release/scripts/presets/tracking_settings/blurry_movie.py diff --git a/release/scripts/presets/tracking_settings/blurry_footage.py b/release/scripts/presets/tracking_settings/blurry_footage.py new file mode 100644 index 00000000000..c805301df78 --- /dev/null +++ b/release/scripts/presets/tracking_settings/blurry_footage.py @@ -0,0 +1,11 @@ +import bpy +settings = bpy.context.edit_movieclip.tracking.settings + +settings.default_tracker = 'Hybrid' +settings.default_pyramid_levels = 2 +settings.default_correlation_min = 0.75 +settings.default_pattern_size = 21 +settings.default_search_size = 100 +settings.default_frames_limit = 0 +settings.default_pattern_match = 'PREV_FRAME' +settings.default_margin = 0 diff --git a/release/scripts/presets/tracking_settings/blurry_movie.py b/release/scripts/presets/tracking_settings/blurry_movie.py deleted file mode 100644 index 8a503bec9bd..00000000000 --- a/release/scripts/presets/tracking_settings/blurry_movie.py +++ /dev/null @@ -1,11 +0,0 @@ -import bpy -settings = bpy.context.edit_movieclip.tracking.settings - -settings.default_tracker = 'KLT' -settings.default_pyramid_levels = 4 -settings.default_correlation_min = 0.75 -settings.default_pattern_size = 11 -settings.default_search_size = 202 -settings.default_frames_limit = 25 -settings.default_pattern_match = 'KEYFRAME' -settings.default_margin = 0 diff --git a/release/scripts/presets/tracking_settings/default.py b/release/scripts/presets/tracking_settings/default.py index 4b2d41bf292..3846f92d828 100644 --- a/release/scripts/presets/tracking_settings/default.py +++ b/release/scripts/presets/tracking_settings/default.py @@ -1,11 +1,11 @@ import bpy settings = bpy.context.edit_movieclip.tracking.settings -settings.default_tracker = 'KLT' +settings.default_tracker = 'Hybrid' settings.default_pyramid_levels = 2 settings.default_correlation_min = 0.75 settings.default_pattern_size = 11 -settings.default_search_size = 51 +settings.default_search_size = 61 settings.default_frames_limit = 0 settings.default_pattern_match = 'KEYFRAME' settings.default_margin = 0 diff --git a/release/scripts/presets/tracking_settings/fast_motion.py b/release/scripts/presets/tracking_settings/fast_motion.py index a3d382e6700..f99fd7f0c42 100644 --- a/release/scripts/presets/tracking_settings/fast_motion.py +++ b/release/scripts/presets/tracking_settings/fast_motion.py @@ -1,11 +1,11 @@ import bpy settings = bpy.context.edit_movieclip.tracking.settings -settings.default_tracker = 'KLT' +settings.default_tracker = 'Hybrid' settings.default_pyramid_levels = 2 -settings.default_correlation_min = 0.75 -settings.default_pattern_size = 11 -settings.default_search_size = 121 +settings.default_correlation_min = 0.7 +settings.default_pattern_size = 31 +settings.default_search_size = 300 settings.default_frames_limit = 0 -settings.default_pattern_match = 'KEYFRAME' -settings.default_margin = 0 +settings.default_pattern_match = 'PREV_FRAME' +settings.default_margin = 5 From 3637794436b6a37ae9447adbd9baaccc0add0823 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 7 Dec 2011 18:22:16 +0000 Subject: [PATCH 16/16] remove initilaizing weight collor with dummy value (from recent commit), harmless but not needed. --- source/blender/blenkernel/intern/DerivedMesh.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 5c80038a50d..1498a3b4cc0 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -641,7 +641,9 @@ enum { CALC_WP_AUTO_NORMALIZE= (1<<1) }; -static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, unsigned char *col, char *dg_flags, int selected, int UNUSED(unselected), const int draw_flag) +static void calc_weightpaint_vert_color( + Object *ob, ColorBand *coba, int vert, unsigned char *col, + const char *dg_flags, int selected, int UNUSED(unselected), const int draw_flag) { Mesh *me = ob->data; float input = 0.0f; @@ -691,12 +693,8 @@ static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, u float colf[4]; CLAMP(input, 0.0f, 1.0f); - colf[0]= colf[1]= colf[2]= -1; - - if(coba) - do_colorband(coba, input, colf); - else - weight_to_rgb(colf, input); + if(coba) do_colorband(coba, input, colf); + else weight_to_rgb(colf, input); col[3] = (unsigned char)(colf[0] * 255.0f); col[2] = (unsigned char)(colf[1] * 255.0f);