From ecee40e9191f6e913503a274c26fc3815dd095b5 Mon Sep 17 00:00:00 2001 From: raa Date: Wed, 1 Mar 2017 19:30:18 +0300 Subject: All drop-down buttons should use the same width --- source/blender/editors/interface/interface_layout.c | 2 +- source/blender/editors/interface/interface_templates.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index aa39870d755..ad5f6279606 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1274,7 +1274,7 @@ static void ui_item_rna_size( if (!w) { if (type == PROP_ENUM && icon_only) { w = ui_text_icon_width(layout, "", ICON_BLANK1, 0); - w += 0.6f * UI_UNIT_X; + w += 0.5f * UI_UNIT_X; } else { w = ui_text_icon_width(layout, name, icon, 0); diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 131584dd405..62f12cd7967 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -430,7 +430,7 @@ static void template_ID( uiLayoutRow(layout, true); } else if (flag & UI_ID_BROWSE) { - but = uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X * 1.6, UI_UNIT_Y, + but = uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X * 1.5, UI_UNIT_Y, TIP_(template_id_browse_tip(type))); ui_def_but_icon(but, RNA_struct_ui_icon(type), UI_HAS_ICON); /* default dragging of icon for id browse buttons */ -- cgit v1.2.3 From 7fcae7ba60ebe90cb1381e773bdfe0022fab3dc4 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 1 Mar 2017 12:51:51 +0100 Subject: Task scheduler: Remove query for the pool's number of threads Not really happy of per-pool threads limit, need to find better approach to that. But at least it's possible to get rid of half of the nastyness here by removing getter which was only used in an assert statement. That piece of code was already well-tested and this code becomes obsolete in the new depsgraph and does no longer exists in blender 2.8 branch. --- source/blender/blenkernel/intern/scene.c | 2 -- source/blender/blenlib/BLI_task.h | 3 --- source/blender/blenlib/intern/task.c | 10 ---------- 3 files changed, 15 deletions(-) diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 56bfe5d7ff1..50f46748570 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1510,8 +1510,6 @@ static void scene_update_object_func(TaskPool * __restrict pool, void *taskdata, if (add_to_stats) { StatisicsEntry *entry; - BLI_assert(threadid < BLI_pool_get_num_threads(pool)); - entry = MEM_mallocN(sizeof(StatisicsEntry), "update thread statistics"); entry->object = object; entry->start_time = start_time; diff --git a/source/blender/blenlib/BLI_task.h b/source/blender/blenlib/BLI_task.h index 08b9629610d..cd2054a5ec3 100644 --- a/source/blender/blenlib/BLI_task.h +++ b/source/blender/blenlib/BLI_task.h @@ -98,9 +98,6 @@ void BLI_task_pool_cancel(TaskPool *pool); /* stop all worker threads */ void BLI_task_pool_stop(TaskPool *pool); -/* get number of threads allowed to be used by this pool */ -int BLI_pool_get_num_threads(TaskPool *pool); - /* set number of threads allowed to be used by this pool */ void BLI_pool_set_num_threads(TaskPool *pool, int num_threads); diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c index c4761e9f7ef..a65ef881afd 100644 --- a/source/blender/blenlib/intern/task.c +++ b/source/blender/blenlib/intern/task.c @@ -687,16 +687,6 @@ void BLI_task_pool_work_and_wait(TaskPool *pool) BLI_mutex_unlock(&pool->num_mutex); } -int BLI_pool_get_num_threads(TaskPool *pool) -{ - if (pool->num_threads != 0) { - return pool->num_threads; - } - else { - return BLI_task_scheduler_num_threads(pool->scheduler); - } -} - void BLI_pool_set_num_threads(TaskPool *pool, int num_threads) { /* NOTE: Don't try to modify threads while tasks are running! */ -- cgit v1.2.3 From 278fce1170fc095bebf4c7feae1570761359ff01 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 1 Mar 2017 17:57:22 +0100 Subject: Fix T50565: Planar constraints don't work properly with non-Blender key configurations The issue was introduced by 4df75e5 and seems we just need to explicitly add new keymap item now. There is still some difference from old behavior, which is planar transform is using precision movement since e138cde and here i don't see nice solution currently: the change was requested here in the studio and it's just a conflict in picking shift key for something which is not supposed to be accurate. At least now it's possible to invoke planar constraint and simply unhold shift. --- release/scripts/presets/keyconfig/maya.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/release/scripts/presets/keyconfig/maya.py b/release/scripts/presets/keyconfig/maya.py index 67fd1fddcac..61049fd348c 100644 --- a/release/scripts/presets/keyconfig/maya.py +++ b/release/scripts/presets/keyconfig/maya.py @@ -933,6 +933,9 @@ km = kc.keymaps.new('3D View', space_type='VIEW_3D', region_type='WINDOW', modal kmi = km.keymap_items.new('view3d.cursor3d', 'ACTIONMOUSE', 'PRESS') kmi = km.keymap_items.new('view3d.rotate', 'LEFTMOUSE', 'PRESS', alt=True) +kmi = km.keymap_items.new('view3d.manipulator', 'LEFTMOUSE', 'PRESS', shift=True) +kmi.properties.release_confirm = True +kmi.properties.use_planar_constraint = True kmi = km.keymap_items.new('view3d.manipulator', 'LEFTMOUSE', 'PRESS', any=True) kmi.properties.release_confirm = True kmi = km.keymap_items.new('view3d.move', 'MIDDLEMOUSE', 'PRESS', alt=True) -- cgit v1.2.3 From 49c99549eb19502b2a101ef4d42e0ecbc65800b8 Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Wed, 1 Mar 2017 13:05:34 -0500 Subject: Cleanup: Use .enabled instead of .active --- release/scripts/startup/bl_ui/space_sequencer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 23697c5e5eb..f6a79125a49 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -671,11 +671,11 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel): # Workaround - .active has to have a separate UI block to work if i == strip.multicam_source: sub = row.row(align=True) - sub.active = False + sub.enabled = False sub.operator("sequencer.cut_multicam", text="%d" % i).camera = i else: sub_1 = row.row(align=True) - sub_1.active = True + sub_1.enabled = True sub_1.operator("sequencer.cut_multicam", text="%d" % i).camera = i if strip.channel > BT_ROW and (strip_channel - 1) % BT_ROW: -- cgit v1.2.3 From 193827e59bd45f9e5818551cf605e9645c78e14c Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Wed, 1 Mar 2017 14:12:03 -0500 Subject: Correct comment Thanks to @dingto for noticing. --- release/scripts/startup/bl_ui/space_sequencer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index f6a79125a49..67ffaa7fccf 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -668,7 +668,7 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel): if (i % BT_ROW) == 1: row = col.row(align=True) - # Workaround - .active has to have a separate UI block to work + # Workaround - .enabled has to have a separate UI block to work if i == strip.multicam_source: sub = row.row(align=True) sub.enabled = False -- cgit v1.2.3 From 856077618a9dfe33a6fb25c86effdfd2b3098419 Mon Sep 17 00:00:00 2001 From: Luca Rood Date: Wed, 1 Mar 2017 17:56:10 -0300 Subject: Fix T50830: Wrong context when calling surfacedeform_bind The custom poll function for surfacedeform_bind seems to have caused issues when calling it from Python. Fixed by using the generic modifier poll function, and setting the button to be active or not in the Python UI code instead. (there might be a better way, but for now this works fine) --- release/scripts/startup/bl_ui/properties_data_modifier.py | 7 +++++-- source/blender/editors/object/object_modifier.c | 9 +-------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index d62c20d4589..68b6265ab15 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -960,10 +960,13 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): layout.separator() + col = layout.column() + col.active = md.target is not None + if md.is_bound: - layout.operator("object.surfacedeform_bind", text="Unbind") + col.operator("object.surfacedeform_bind", text="Unbind") else: - layout.operator("object.surfacedeform_bind", text="Bind") + col.operator("object.surfacedeform_bind", text="Bind") def UV_PROJECT(self, layout, ob, md): split = layout.split() diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 38df1116cd3..d601f5c3b14 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -2299,14 +2299,7 @@ void OBJECT_OT_laplaciandeform_bind(wmOperatorType *ot) static int surfacedeform_bind_poll(bContext *C) { - if (edit_modifier_poll_generic(C, &RNA_SurfaceDeformModifier, 0)) { - PointerRNA ptr = CTX_data_pointer_get_type(C, "modifier", &RNA_SurfaceDeformModifier); - SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)ptr.data; - - return ((smd != NULL) && (smd->target != NULL)); - } - - return 0; + return edit_modifier_poll_generic(C, &RNA_SurfaceDeformModifier, 0); } static int surfacedeform_bind_exec(bContext *C, wmOperator *op) -- cgit v1.2.3 From 499faa8b1135d519675dde841f14333892a4d391 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 2 Mar 2017 11:20:57 +0100 Subject: Fix second part T50565: Using planar transform once makes it enabled by default Was caused by property being saved by the operator manager. --- source/blender/editors/space_view3d/view3d_edit.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 5e13b3f27fc..df649a59f08 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -4781,6 +4781,7 @@ static int manipulator_invoke(bContext *C, wmOperator *op, const wmEvent *event) void VIEW3D_OT_manipulator(wmOperatorType *ot) { + PropertyRNA *prop; /* identifiers */ ot->name = "3D Manipulator"; @@ -4795,8 +4796,9 @@ void VIEW3D_OT_manipulator(wmOperatorType *ot) /* properties to pass to transform */ Transform_Properties(ot, P_CONSTRAINT); - RNA_def_boolean(ot->srna, "use_planar_constraint", false, "Planar Constraint", "Limit the transformation to the " - "two axes that have not been clicked (translate/scale only)"); + prop = RNA_def_boolean(ot->srna, "use_planar_constraint", false, "Planar Constraint", "Limit the transformation to the " + "two axes that have not been clicked (translate/scale only)"); + RNA_def_property_flag(prop, PROP_SKIP_SAVE); } static int enable_manipulator_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) -- cgit v1.2.3 From 87f8bb8d1d3692845b92545a4cbe5c1b5c03ec36 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 2 Mar 2017 12:18:07 +0100 Subject: Fix another part of T50565: Planar constraints were always initialized to accurate transform Now it is defined by keymap. --- source/blender/editors/physics/physics_ops.c | 10 +++++++++- source/blender/editors/space_view3d/view3d_edit.c | 5 ++++- source/blender/editors/space_view3d/view3d_ops.c | 10 +++++++++- source/blender/editors/transform/transform.c | 9 ++++++++- source/blender/editors/transform/transform_manipulator.c | 12 ++++++++++++ source/blender/editors/transform/transform_ops.c | 3 +++ 6 files changed, 45 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c index 0c907f19753..b1d708ebc07 100644 --- a/source/blender/editors/physics/physics_ops.c +++ b/source/blender/editors/physics/physics_ops.c @@ -138,13 +138,21 @@ static void keymap_particle(wmKeyConfig *keyconf) RNA_boolean_set(kmi->ptr, "unselected", true); /* Shift+LMB behavior first, so it has priority over KM_ANY item below. */ - kmi = WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); + kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "release_confirm", true); RNA_boolean_set(kmi->ptr, "use_planar_constraint", true); + RNA_boolean_set(kmi->ptr, "use_accurate", false); + + kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "release_confirm", true); + RNA_boolean_set(kmi->ptr, "use_planar_constraint", false); + RNA_boolean_set(kmi->ptr, "use_accurate", true); + /* Using KM_ANY here to allow holding modifiers before starting to transform. */ kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_ANY, 0); RNA_boolean_set(kmi->ptr, "release_confirm", true); RNA_boolean_set(kmi->ptr, "use_planar_constraint", false); + RNA_boolean_set(kmi->ptr, "use_accurate", false); WM_keymap_add_item(keymap, "PARTICLE_OT_brush_edit", LEFTMOUSE, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "PARTICLE_OT_brush_edit", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index df649a59f08..04670f5a843 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -4798,7 +4798,10 @@ void VIEW3D_OT_manipulator(wmOperatorType *ot) prop = RNA_def_boolean(ot->srna, "use_planar_constraint", false, "Planar Constraint", "Limit the transformation to the " "two axes that have not been clicked (translate/scale only)"); - RNA_def_property_flag(prop, PROP_SKIP_SAVE); + RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN); + + prop = RNA_def_boolean(ot->srna, "use_accurate", false, "Accurate", "Use accurate transformation"); + RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN); } static int enable_manipulator_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c index 0fa6841fe27..d71639c35d2 100644 --- a/source/blender/editors/space_view3d/view3d_ops.c +++ b/source/blender/editors/space_view3d/view3d_ops.c @@ -241,13 +241,21 @@ void view3d_keymap(wmKeyConfig *keyconf) keymap = WM_keymap_find(keyconf, "3D View", SPACE_VIEW3D, 0); /* Shift+LMB behavior first, so it has priority over KM_ANY item below. */ - kmi = WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); + kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "release_confirm", true); RNA_boolean_set(kmi->ptr, "use_planar_constraint", true); + RNA_boolean_set(kmi->ptr, "use_accurate", false); + + kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "release_confirm", true); + RNA_boolean_set(kmi->ptr, "use_planar_constraint", false); + RNA_boolean_set(kmi->ptr, "use_accurate", true); + /* Using KM_ANY here to allow holding modifiers before starting to transform. */ kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_ANY, 0); RNA_boolean_set(kmi->ptr, "release_confirm", true); RNA_boolean_set(kmi->ptr, "use_planar_constraint", false); + RNA_boolean_set(kmi->ptr, "use_accurate", false); WM_keymap_verify_item(keymap, "VIEW3D_OT_cursor3d", ACTIONMOUSE, KM_PRESS, 0, 0); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 1916f9b4dab..7d9063c3285 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -2176,7 +2176,14 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve calculateCenter(t); if (event) { - initMouseInput(t, &t->mouse, t->center2d, event->mval, event->shift); + /* Initialize accurate transform to settings requested by keymap. */ + bool use_accurate = false; + if ((prop = RNA_struct_find_property(op->ptr, "use_accurate")) && RNA_property_is_set(op->ptr, prop)) { + if (RNA_property_boolean_get(op->ptr, prop)) { + use_accurate = true; + } + } + initMouseInput(t, &t->mouse, t->center2d, event->mval, use_accurate); } switch (mode) { diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index e141724f2df..c906c467f8b 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -1836,6 +1836,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) int constraint_axis[3] = {0, 0, 0}; int val; const bool use_planar = RNA_boolean_get(op->ptr, "use_planar_constraint"); + const bool use_accurate = RNA_boolean_get(op->ptr, "use_accurate"); if (!(v3d->twflag & V3D_USE_MANIPULATOR)) return 0; if (!(v3d->twflag & V3D_DRAW_MANIPULATOR)) return 0; @@ -1851,6 +1852,13 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) drawflags = manipulator_selectbuf(sa, ar, event->mval, 0.2f * (float)U.tw_hotspot); if (drawflags == 0) drawflags = val; + /* We are not doing translation but were requested to do planar constraints. + * This wouldn't work, so we give other keymaps a chance. + */ + if ((drawflags & MAN_TRANS_C) == 0 && use_planar) { + return 0; + } + if (drawflags & MAN_TRANS_C) { switch (drawflags) { case MAN_TRANS_C: @@ -1881,6 +1889,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) break; } RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); + RNA_boolean_set(op->ptr, "use_accurate", use_accurate); WM_operator_name_call(C, "TRANSFORM_OT_translate", WM_OP_INVOKE_DEFAULT, op->ptr); } else if (drawflags & MAN_SCALE_C) { @@ -1911,6 +1920,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) break; } RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); + RNA_boolean_set(op->ptr, "use_accurate", use_accurate); WM_operator_name_call(C, "TRANSFORM_OT_resize", WM_OP_INVOKE_DEFAULT, op->ptr); } else if (drawflags == MAN_ROT_T) { /* trackball need special case, init is different */ @@ -1924,6 +1934,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) if ((prop = RNA_struct_find_property(op->ptr, "release_confirm")) && RNA_property_is_set(op->ptr, prop)) { RNA_property_boolean_set(&props_ptr, prop, RNA_property_boolean_get(op->ptr, prop)); } + RNA_boolean_set(op->ptr, "use_accurate", use_accurate); WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &props_ptr); WM_operator_properties_free(&props_ptr); } @@ -1940,6 +1951,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) break; } RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); + RNA_boolean_set(op->ptr, "use_accurate", use_accurate); WM_operator_name_call(C, "TRANSFORM_OT_rotate", WM_OP_INVOKE_DEFAULT, op->ptr); } } diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index cbe58ddf586..2a97384cf7d 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -569,6 +569,9 @@ void Transform_Properties(struct wmOperatorType *ot, int flags) // Add confirm method all the time. At the end because it's not really that important and should be hidden only in log, not in keymap edit /*prop =*/ RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", "Always confirm operation when releasing button"); //RNA_def_property_flag(prop, PROP_HIDDEN); + + prop = RNA_def_boolean(ot->srna, "use_accurate", 0, "Accurate", "Use accurate transformation"); + RNA_def_property_flag(prop, PROP_HIDDEN); } } -- cgit v1.2.3 From a83a68b9b6506b90c535451297c058a2905c928f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 2 Mar 2017 09:56:25 +0100 Subject: Threads: Use atomics instead of spin when entering threaded malloc --- source/blender/blenlib/intern/threads.c | 39 ++++++++++++--------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c index b60981802aa..77da3be0600 100644 --- a/source/blender/blenlib/intern/threads.c +++ b/source/blender/blenlib/intern/threads.c @@ -54,6 +54,8 @@ # include #endif +#include "atomic_ops.h" + #if defined(__APPLE__) && defined(_OPENMP) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) && !defined(__clang__) # define USE_APPLE_OMP_FIX #endif @@ -124,7 +126,7 @@ static pthread_mutex_t _colormanage_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _fftw_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t _view3d_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_t mainid; -static int thread_levels = 0; /* threads can be invoked inside threads */ +static unsigned int thread_levels = 0; /* threads can be invoked inside threads */ static int num_threads_override = 0; /* just a max for security reasons */ @@ -198,9 +200,9 @@ void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot) tslot->avail = 1; } } - - BLI_spin_lock(&_malloc_lock); - if (thread_levels == 0) { + + unsigned int level = atomic_fetch_and_add_u(&thread_levels, 1); + if (level == 0) { MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread); #ifdef USE_APPLE_OMP_FIX @@ -210,9 +212,6 @@ void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot) thread_tls_data = pthread_getspecific(gomp_tls_key); #endif } - - thread_levels++; - BLI_spin_unlock(&_malloc_lock); } /* amount of available threads */ @@ -331,11 +330,10 @@ void BLI_end_threads(ListBase *threadbase) BLI_freelistN(threadbase); } - BLI_spin_lock(&_malloc_lock); - thread_levels--; - if (thread_levels == 0) + unsigned int level = atomic_sub_and_fetch_u(&thread_levels, 1); + if (level == 0) { MEM_set_lock_callback(NULL, NULL); - BLI_spin_unlock(&_malloc_lock); + } } /* System Information */ @@ -812,26 +810,17 @@ void BLI_thread_queue_wait_finish(ThreadQueue *queue) void BLI_begin_threaded_malloc(void) { - /* Used for debug only */ - /* BLI_assert(thread_levels >= 0); */ - - BLI_spin_lock(&_malloc_lock); - if (thread_levels == 0) { + unsigned int level = atomic_fetch_and_add_u(&thread_levels, 1); + if (level == 0) { MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread); } - thread_levels++; - BLI_spin_unlock(&_malloc_lock); } void BLI_end_threaded_malloc(void) { - /* Used for debug only */ - /* BLI_assert(thread_levels >= 0); */ - - BLI_spin_lock(&_malloc_lock); - thread_levels--; - if (thread_levels == 0) + unsigned int level = atomic_sub_and_fetch_u(&thread_levels, 1); + if (level == 0) { MEM_set_lock_callback(NULL, NULL); - BLI_spin_unlock(&_malloc_lock); + } } -- cgit v1.2.3 From e7dc46d278a74fc41124bf09aa78c9f3ed33e959 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Thu, 2 Mar 2017 13:23:00 +0100 Subject: Fix weird "use_planar_constraint" button in redo panel Issue was that the VIEW_OT_manipulator operator calls the transform operators and passes them it's own operator properties. That means the transform operator got properties passed that it doesn't have. --- .../editors/transform/transform_manipulator.c | 71 ++++++++++++++-------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index c906c467f8b..1567cafeb08 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -1826,6 +1826,23 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, const int mval[2], fl return 0; } +static const char *manipulator_get_operator_name(int man_val) +{ + if (man_val & MAN_TRANS_C) { + return "TRANSFORM_OT_translate"; + } + else if (man_val == MAN_ROT_T) { + return "TRANSFORM_OT_trackball"; + } + else if (man_val & MAN_ROT_C) { + return "TRANSFORM_OT_rotate"; + } + else if (man_val & MAN_SCALE_C) { + return "TRANSFORM_OT_resize"; + } + + return NULL; +} /* return 0; nothing happened */ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) @@ -1836,7 +1853,6 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) int constraint_axis[3] = {0, 0, 0}; int val; const bool use_planar = RNA_boolean_get(op->ptr, "use_planar_constraint"); - const bool use_accurate = RNA_boolean_get(op->ptr, "use_accurate"); if (!(v3d->twflag & V3D_USE_MANIPULATOR)) return 0; if (!(v3d->twflag & V3D_DRAW_MANIPULATOR)) return 0; @@ -1847,6 +1863,10 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) // find the hotspots first test narrow hotspot val = manipulator_selectbuf(sa, ar, event->mval, 0.5f * (float)U.tw_hotspot); if (val) { + wmOperatorType *ot; + PointerRNA props_ptr; + PropertyRNA *prop; + const char *opname; // drawflags still global, for drawing call above drawflags = manipulator_selectbuf(sa, ar, event->mval, 0.2f * (float)U.tw_hotspot); @@ -1859,6 +1879,10 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) return 0; } + opname = manipulator_get_operator_name(drawflags); + ot = WM_operatortype_find(opname, true); + WM_operator_properties_create_ptr(&props_ptr, ot); + if (drawflags & MAN_TRANS_C) { switch (drawflags) { case MAN_TRANS_C: @@ -1888,9 +1912,7 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) constraint_axis[2] = 1; break; } - RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); - RNA_boolean_set(op->ptr, "use_accurate", use_accurate); - WM_operator_name_call(C, "TRANSFORM_OT_translate", WM_OP_INVOKE_DEFAULT, op->ptr); + RNA_boolean_set_array(&props_ptr, "constraint_axis", constraint_axis); } else if (drawflags & MAN_SCALE_C) { switch (drawflags) { @@ -1919,24 +1941,10 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) constraint_axis[2] = 1; break; } - RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); - RNA_boolean_set(op->ptr, "use_accurate", use_accurate); - WM_operator_name_call(C, "TRANSFORM_OT_resize", WM_OP_INVOKE_DEFAULT, op->ptr); + RNA_boolean_set_array(&props_ptr, "constraint_axis", constraint_axis); } - else if (drawflags == MAN_ROT_T) { /* trackball need special case, init is different */ - /* Do not pass op->ptr!!! trackball has no "constraint" properties! - * See [#34621], it's a miracle it did not cause more problems!!! */ - /* However, we need to copy the "release_confirm" property, but only if defined, see T41112. */ - PointerRNA props_ptr; - PropertyRNA *prop; - wmOperatorType *ot = WM_operatortype_find("TRANSFORM_OT_trackball", true); - WM_operator_properties_create_ptr(&props_ptr, ot); - if ((prop = RNA_struct_find_property(op->ptr, "release_confirm")) && RNA_property_is_set(op->ptr, prop)) { - RNA_property_boolean_set(&props_ptr, prop, RNA_property_boolean_get(op->ptr, prop)); - } - RNA_boolean_set(op->ptr, "use_accurate", use_accurate); - WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &props_ptr); - WM_operator_properties_free(&props_ptr); + else if (drawflags == MAN_ROT_T) { + /* pass */ } else if (drawflags & MAN_ROT_C) { switch (drawflags) { @@ -1950,10 +1958,25 @@ int BIF_do_manipulator(bContext *C, const struct wmEvent *event, wmOperator *op) constraint_axis[2] = 1; break; } - RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); - RNA_boolean_set(op->ptr, "use_accurate", use_accurate); - WM_operator_name_call(C, "TRANSFORM_OT_rotate", WM_OP_INVOKE_DEFAULT, op->ptr); + RNA_boolean_set_array(&props_ptr, "constraint_axis", constraint_axis); + } + + /* pass operator properties on to transform operators */ + prop = RNA_struct_find_property(op->ptr, "use_accurate"); + if (RNA_property_is_set(op->ptr, prop)) { + RNA_property_boolean_set(&props_ptr, prop, RNA_property_boolean_get(op->ptr, prop)); } + prop = RNA_struct_find_property(op->ptr, "release_confirm"); + if (RNA_property_is_set(op->ptr, prop)) { + RNA_property_boolean_set(&props_ptr, prop, RNA_property_boolean_get(op->ptr, prop)); + } + prop = RNA_struct_find_property(op->ptr, "constraint_orientation"); + if (RNA_property_is_set(op->ptr, prop)) { + RNA_property_enum_set(&props_ptr, prop, RNA_property_enum_get(op->ptr, prop)); + } + + WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &props_ptr); + WM_operator_properties_free(&props_ptr); } /* after transform, restore drawflags */ drawflags = 0xFFFF; -- cgit v1.2.3 From a78717a72d22e0dfd4a6a0cd47b1fc4ef9169a60 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Thu, 2 Mar 2017 13:39:01 +0100 Subject: Fix duplicated 'Accurate' property for manipulator keymap item Is already added through Transform_Properties --- source/blender/editors/space_view3d/view3d_edit.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 04670f5a843..5816519e5b2 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -4799,9 +4799,6 @@ void VIEW3D_OT_manipulator(wmOperatorType *ot) prop = RNA_def_boolean(ot->srna, "use_planar_constraint", false, "Planar Constraint", "Limit the transformation to the " "two axes that have not been clicked (translate/scale only)"); RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN); - - prop = RNA_def_boolean(ot->srna, "use_accurate", false, "Accurate", "Use accurate transformation"); - RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN); } static int enable_manipulator_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) -- cgit v1.2.3 From 42cb93205c0fc33185e56239d1dc21f0a6230e54 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 2 Mar 2017 17:22:03 +0100 Subject: Fix own stupid mistake in recent mesh 'split_faces' rework. Was assigning new edge index to ml_prev->e, and then assigning ml_pre->e to orig_index... --- source/blender/blenkernel/intern/mesh.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 918032b2df8..befe1a4d70e 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -2258,16 +2258,18 @@ static int split_faces_prepare_new_edges( for (int loop_idx = 0; loop_idx < mp->totloop; loop_idx++, ml++) { void **eval; if (!BLI_edgehash_ensure_p(edges_hash, ml_prev->v, ml->v, &eval)) { + const int edge_idx = ml_prev->e; + /* That edge has not been encountered yet, define it. */ - if (BLI_BITMAP_TEST(edges_used, ml_prev->e)) { + if (BLI_BITMAP_TEST(edges_used, edge_idx)) { /* Original edge has already been used, we need to define a new one. */ - const int edge_idx = num_edges++; - *eval = SET_INT_IN_POINTER(edge_idx); - ml_prev->e = edge_idx; + const int new_edge_idx = num_edges++; + *eval = SET_INT_IN_POINTER(new_edge_idx); + ml_prev->e = new_edge_idx; SplitFaceNewEdge *new_edge = BLI_memarena_alloc(memarena, sizeof(*new_edge)); - new_edge->orig_index = ml_prev->e; - new_edge->new_index = edge_idx; + new_edge->orig_index = edge_idx; + new_edge->new_index = new_edge_idx; new_edge->v1 = ml_prev->v; new_edge->v2 = ml->v; new_edge->next = *new_edges; @@ -2275,7 +2277,6 @@ static int split_faces_prepare_new_edges( } else { /* We can re-use original edge. */ - const int edge_idx = ml_prev->e; medge[edge_idx].v1 = ml_prev->v; medge[edge_idx].v2 = ml->v; *eval = SET_INT_IN_POINTER(edge_idx); @@ -2308,6 +2309,7 @@ static void split_faces_split_new_verts( MVert *new_mv = &mvert[mesh->totvert - 1]; for (int i = mesh->totvert - 1; i >= num_verts ; i--, new_mv--, new_verts = new_verts->next) { BLI_assert(new_verts->new_index == i); + BLI_assert(new_verts->new_index != new_verts->orig_index); CustomData_copy_data(&mesh->vdata, &mesh->vdata, new_verts->orig_index, i, 1); if (new_verts->vnor) { normal_float_to_short_v3(new_mv->no, new_verts->vnor); @@ -2326,6 +2328,7 @@ static void split_faces_split_new_edges( MEdge *new_med = &medge[mesh->totedge - 1]; for (int i = mesh->totedge - 1; i >= num_edges ; i--, new_med--, new_edges = new_edges->next) { BLI_assert(new_edges->new_index == i); + BLI_assert(new_edges->new_index != new_edges->orig_index); CustomData_copy_data(&mesh->edata, &mesh->edata, new_edges->orig_index, i, 1); new_med->v1 = new_edges->v1; new_med->v2 = new_edges->v2; -- cgit v1.2.3