Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2021-08-27 07:41:41 +0300
committerHans Goudey <h.goudey@me.com>2021-08-27 07:41:41 +0300
commita0f754e7749a485c97718433edbbab5ac76cdc7a (patch)
treed968d66e73be6dbac5997a3f5bb8e33e462c96d3
parent137a5e162c2435662dbb299ff49771e7d2e7598f (diff)
parent523bc981cfeecead5050e7af44bbe252c166d718 (diff)
Merge branch 'master' into refactor-idprop-ui-datarefactor-idprop-ui-data
-rw-r--r--build_files/cmake/platform/platform_win32.cmake4
-rw-r--r--intern/atomic/intern/atomic_ops_unix.h223
-rw-r--r--intern/atomic/intern/atomic_ops_utils.h2
-rw-r--r--intern/cycles/blender/blender_object.cpp9
-rw-r--r--intern/cycles/kernel/closure/bsdf_microfacet.h2
-rw-r--r--intern/ghost/intern/GHOST_SystemCocoa.mm2
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.cpp2
-rw-r--r--intern/ghost/intern/GHOST_XrContext.cpp5
-rw-r--r--intern/ghost/intern/GHOST_XrSession.cpp14
-rw-r--r--release/scripts/modules/bl_keymap_utils/io.py36
-rw-r--r--release/scripts/modules/bpy/utils/__init__.py1
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/blender_default.py137
-rw-r--r--release/scripts/startup/bl_app_templates_system/Video_Editing/__init__.py19
-rw-r--r--release/scripts/startup/bl_ui/properties_data_gpencil.py5
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_common.py25
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_toolbar.py6
-rw-r--r--release/scripts/templates_py/ui_tool_simple.py24
-rw-r--r--source/blender/blenfont/BLF_api.h5
-rw-r--r--source/blender/blenfont/intern/blf.c28
-rw-r--r--source/blender/blenfont/intern/blf_default.c11
-rw-r--r--source/blender/blenfont/intern/blf_dir.c4
-rw-r--r--source/blender/blenfont/intern/blf_font.c59
-rw-r--r--source/blender/blenkernel/BKE_action.hh2
-rw-r--r--source/blender/blenkernel/BKE_idtype.h4
-rw-r--r--source/blender/blenkernel/BKE_scene.h8
-rw-r--r--source/blender/blenkernel/BKE_sound.h3
-rw-r--r--source/blender/blenkernel/CMakeLists.txt2
-rw-r--r--source/blender/blenkernel/intern/action.c2
-rw-r--r--source/blender/blenkernel/intern/bpath.c74
-rw-r--r--source/blender/blenkernel/intern/constraint.c2
-rw-r--r--source/blender/blenkernel/intern/displist.cc4
-rw-r--r--source/blender/blenkernel/intern/fluid.c10
-rw-r--r--source/blender/blenkernel/intern/gpencil.c2
-rw-r--r--source/blender/blenkernel/intern/gpencil_curve.c4
-rw-r--r--source/blender/blenkernel/intern/gpencil_modifier.c2
-rw-r--r--source/blender/blenkernel/intern/ipo.c100
-rw-r--r--source/blender/blenkernel/intern/lib_id.c14
-rw-r--r--source/blender/blenkernel/intern/lib_id_delete.c2
-rw-r--r--source/blender/blenkernel/intern/lib_override.c15
-rw-r--r--source/blender/blenkernel/intern/lib_query.c2
-rw-r--r--source/blender/blenkernel/intern/modifier.c2
-rw-r--r--source/blender/blenkernel/intern/nla.c6
-rw-r--r--source/blender/blenkernel/intern/object.c2
-rw-r--r--source/blender/blenkernel/intern/particle_system.c8
-rw-r--r--source/blender/blenkernel/intern/scene.c341
-rw-r--r--source/blender/blenkernel/intern/shader_fx.c2
-rw-r--r--source/blender/blenkernel/intern/text.c15
-rw-r--r--source/blender/blenkernel/intern/undo_system.c2
-rw-r--r--source/blender/blenlib/BLI_string_utf8.h84
-rw-r--r--source/blender/blenlib/CMakeLists.txt2
-rw-r--r--source/blender/blenlib/intern/string_cursor_utf8.c23
-rw-r--r--source/blender/blenlib/intern/string_search.cc17
-rw-r--r--source/blender/blenlib/intern/string_utf8.c140
-rw-r--r--source/blender/blenloader/BLO_readfile.h3
-rw-r--r--source/blender/blenloader/intern/blend_validate.c6
-rw-r--r--source/blender/blenloader/intern/readblenentry.c118
-rw-r--r--source/blender/blenloader/intern/readfile.c8
-rw-r--r--source/blender/blenloader/intern/versioning_250.c80
-rw-r--r--source/blender/blenloader/intern/versioning_260.c96
-rw-r--r--source/blender/blenloader/intern/versioning_270.c79
-rw-r--r--source/blender/blenloader/intern/versioning_280.c27
-rw-r--r--source/blender/blenloader/intern/versioning_legacy.c32
-rw-r--r--source/blender/blenloader/intern/writefile.c2
-rw-r--r--source/blender/blentranslation/msgfmt/msgfmt.c2
-rw-r--r--source/blender/compositor/intern/COM_ExecutionGroup.cc2
-rw-r--r--source/blender/compositor/intern/COM_WorkPackage.h2
-rw-r--r--source/blender/compositor/nodes/COM_BokehBlurNode.cc5
-rw-r--r--source/blender/compositor/nodes/COM_ColorSpillNode.cc4
-rw-r--r--source/blender/compositor/nodes/COM_Stabilize2dNode.cc4
-rw-r--r--source/blender/compositor/operations/COM_ColorCurveOperation.cc2
-rw-r--r--source/blender/compositor/operations/COM_ColorSpillOperation.cc2
-rw-r--r--source/blender/compositor/operations/COM_CompositorOperation.cc6
-rw-r--r--source/blender/compositor/operations/COM_DilateErodeOperation.cc2
-rw-r--r--source/blender/compositor/operations/COM_GlareFogGlowOperation.cc68
-rw-r--r--source/blender/compositor/operations/COM_InpaintOperation.cc2
-rw-r--r--source/blender/compositor/operations/COM_ScaleOperation.cc2
-rw-r--r--source/blender/compositor/operations/COM_SplitOperation.cc2
-rw-r--r--source/blender/compositor/operations/COM_VectorBlurOperation.cc4
-rw-r--r--source/blender/compositor/operations/COM_ViewerOperation.cc2
-rw-r--r--source/blender/compositor/operations/COM_WriteBufferOperation.cc8
-rw-r--r--source/blender/depsgraph/DEG_depsgraph.h2
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc44
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc74
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc44
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_keys.cc2
-rw-r--r--source/blender/depsgraph/intern/debug/deg_time_average.h11
-rw-r--r--source/blender/depsgraph/intern/depsgraph_query_iter.cc16
-rw-r--r--source/blender/depsgraph/intern/depsgraph_registry.cc2
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc48
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_component.cc2
-rw-r--r--source/blender/draw/engines/image/image_engine.c2
-rw-r--r--source/blender/draw/engines/overlay/overlay_edit_uv.c10
-rw-r--r--source/blender/draw/engines/overlay/overlay_extra.c7
-rw-r--r--source/blender/draw/engines/overlay/overlay_motion_path.c2
-rw-r--r--source/blender/draw/intern/draw_cache_extract.h4
-rw-r--r--source/blender/draw/intern/draw_manager_profiling.c12
-rw-r--r--source/blender/draw/intern/draw_manager_text.c10
-rw-r--r--source/blender/draw/intern/draw_manager_text.h2
-rw-r--r--source/blender/editors/armature/pose_select.c13
-rw-r--r--source/blender/editors/asset/CMakeLists.txt2
-rw-r--r--source/blender/editors/asset/ED_asset_filter.h2
-rw-r--r--source/blender/editors/asset/ED_asset_list.h2
-rw-r--r--source/blender/editors/asset/ED_asset_list.hh4
-rw-r--r--source/blender/editors/asset/ED_asset_mark_clear.h2
-rw-r--r--source/blender/editors/asset/ED_asset_temp_id_consumer.h2
-rw-r--r--source/blender/editors/curve/editfont.c5
-rw-r--r--source/blender/editors/include/ED_object.h2
-rw-r--r--source/blender/editors/include/UI_interface.h2
-rw-r--r--source/blender/editors/interface/interface_eyedropper.c38
-rw-r--r--source/blender/editors/interface/interface_eyedropper_color.c38
-rw-r--r--source/blender/editors/interface/interface_eyedropper_datablock.c46
-rw-r--r--source/blender/editors/interface/interface_eyedropper_depth.c9
-rw-r--r--source/blender/editors/interface/interface_eyedropper_intern.h9
-rw-r--r--source/blender/editors/interface/interface_templates.c4
-rw-r--r--source/blender/editors/interface/interface_utils.c2
-rw-r--r--source/blender/editors/interface/view2d_draw.c4
-rw-r--r--source/blender/editors/interface/view2d_edge_pan.c6
-rw-r--r--source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c2
-rw-r--r--source/blender/editors/object/object_add.c29
-rw-r--r--source/blender/editors/object/object_vgroup.c40
-rw-r--r--source/blender/editors/render/render_opengl.c2
-rw-r--r--source/blender/editors/screen/screen_ops.c26
-rw-r--r--source/blender/editors/sound/sound_ops.c10
-rw-r--r--source/blender/editors/space_clip/clip_graph_ops.c13
-rw-r--r--source/blender/editors/space_clip/tracking_select.c11
-rw-r--r--source/blender/editors/space_file/filelist.c4
-rw-r--r--source/blender/editors/space_file/filelist.h2
-rw-r--r--source/blender/editors/space_graph/graph_edit.c13
-rw-r--r--source/blender/editors/space_graph/graph_view.c2
-rw-r--r--source/blender/editors/space_image/image_draw.c30
-rw-r--r--source/blender/editors/space_image/image_ops.c2
-rw-r--r--source/blender/editors/space_node/node_draw.cc13
-rw-r--r--source/blender/editors/space_node/node_edit.cc2
-rw-r--r--source/blender/editors/space_node/node_select.cc12
-rw-r--r--source/blender/editors/space_outliner/outliner_select.c2
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c26
-rw-r--r--source/blender/editors/space_text/text_autocomplete.c7
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c10
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_camera.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c2
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_tool_generic.c48
-rw-r--r--source/blender/editors/transform/transform.c6
-rw-r--r--source/blender/editors/transform/transform_mode_translate.c4
-rw-r--r--source/blender/editors/transform/transform_ops.c3
-rw-r--r--source/blender/editors/undo/memfile_undo.c2
-rw-r--r--source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c2
-rw-r--r--source/blender/gpu/GPU_capabilities.h2
-rw-r--r--source/blender/imbuf/intern/colormanagement.c16
-rw-r--r--source/blender/imbuf/intern/iris.c6
-rw-r--r--source/blender/imbuf/intern/thumbs_blend.c83
-rw-r--r--source/blender/io/alembic/tests/abc_matrix_test.cc2
-rw-r--r--source/blender/io/collada/AnimationImporter.cpp4
-rw-r--r--source/blender/io/collada/BCAnimationCurve.cpp2
-rw-r--r--source/blender/io/gpencil/CMakeLists.txt3
-rw-r--r--source/blender/io/usd/CMakeLists.txt4
-rw-r--r--source/blender/io/usd/usd.h6
-rw-r--r--source/blender/makesdna/DNA_action_types.h4
-rw-r--r--source/blender/makesdna/DNA_anim_types.h5
-rw-r--r--source/blender/makesdna/DNA_armature_types.h5
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h2
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h1
-rw-r--r--source/blender/makesdna/DNA_node_types.h6
-rw-r--r--source/blender/makesrna/intern/rna_access.c2
-rw-r--r--source/blender/makesrna/intern/rna_color.c40
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c6
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c8
-rw-r--r--source/blender/makesrna/intern/rna_rna.c3
-rw-r--r--source/blender/makesrna/intern/rna_sequencer.c40
-rw-r--r--source/blender/makesrna/intern/rna_wm.c5
-rw-r--r--source/blender/makesrna/intern/rna_xr.c68
-rw-r--r--source/blender/modifiers/intern/MOD_collision.c4
-rw-r--r--source/blender/modifiers/intern/MOD_mask.cc433
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc238
-rw-r--r--source/blender/python/gpu/gpu_py_shader.c39
-rw-r--r--source/blender/python/gpu/gpu_py_state.c26
-rw-r--r--source/blender/python/intern/bpy_props.c1
-rw-r--r--source/blender/render/intern/engine.c83
-rw-r--r--source/blender/render/intern/pipeline.c6
-rw-r--r--source/blender/render/intern/render_types.h8
-rw-r--r--source/blender/sequencer/SEQ_iterator.h25
-rw-r--r--source/blender/sequencer/SEQ_sequencer.h20
-rw-r--r--source/blender/sequencer/SEQ_utils.h6
-rw-r--r--source/blender/sequencer/intern/clipboard.c2
-rw-r--r--source/blender/sequencer/intern/effects.c53
-rw-r--r--source/blender/sequencer/intern/iterator.c56
-rw-r--r--source/blender/sequencer/intern/proxy.c2
-rw-r--r--source/blender/sequencer/intern/sequencer.c337
-rw-r--r--source/blender/sequencer/intern/sequencer.h5
-rw-r--r--source/blender/sequencer/intern/strip_relations.c35
-rw-r--r--source/blender/sequencer/intern/utils.c34
-rw-r--r--source/blender/windowmanager/WM_api.h16
-rw-r--r--source/blender/windowmanager/WM_types.h4
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c4
-rw-r--r--source/blender/windowmanager/intern/wm_window.c16
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr.c5
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr_actionmap.c13
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr_intern.h1
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr_session.c6
198 files changed, 2833 insertions, 1872 deletions
diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake
index d44ef691d1b..e3183fe5b7f 100644
--- a/build_files/cmake/platform/platform_win32.cmake
+++ b/build_files/cmake/platform/platform_win32.cmake
@@ -151,8 +151,8 @@ if(MSVC_CLANG) # Clangs version of cl doesn't support all flags
string(APPEND CMAKE_CXX_FLAGS " ${CXX_WARN_FLAGS} /nologo /J /Gd /EHsc -Wno-unused-command-line-argument -Wno-microsoft-enum-forward-reference ")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /nologo /J /Gd -Wno-unused-command-line-argument -Wno-microsoft-enum-forward-reference")
else()
- string(APPEND CMAKE_CXX_FLAGS " /nologo /J /Gd /MP /EHsc /bigobj")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /nologo /J /Gd /MP /bigobj")
+ string(APPEND CMAKE_CXX_FLAGS " /nologo /J /Gd /MP /EHsc /bigobj /Zc:inline")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /nologo /J /Gd /MP /bigobj /Zc:inline")
endif()
# X64 ASAN is available and usable on MSVC 16.9 preview 4 and up)
diff --git a/intern/atomic/intern/atomic_ops_unix.h b/intern/atomic/intern/atomic_ops_unix.h
index b08a0e9bc28..dcafbc67949 100644
--- a/intern/atomic/intern/atomic_ops_unix.h
+++ b/intern/atomic/intern/atomic_ops_unix.h
@@ -60,9 +60,108 @@
# define JE_FORCE_SYNC_COMPARE_AND_SWAP_8
#endif
-/******************************************************************************/
-/* 64-bit operations. */
-#if (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_8))
+/* Define the `ATOMIC_FORCE_USE_FALLBACK` to force lock-based fallback implementation to be used
+ * (even on platforms where there is native implementation available via compiler.
+ * Useful for development purposes. */
+#undef ATOMIC_FORCE_USE_FALLBACK
+
+/* -------------------------------------------------------------------- */
+/** \name Spin-lock implementation
+ *
+ * Used to implement atomics on unsupported platforms.
+ * The spin implementation is shared for all platforms to make sure it compiles and tested.
+ * \{ */
+
+typedef struct AtomicSpinLock {
+ volatile int lock;
+
+ /* Pad the structure size to a cache-line, to avoid unwanted sharing with other data. */
+ int pad[32 - sizeof(int)];
+} __attribute__((aligned(32))) AtomicSpinLock;
+
+ATOMIC_INLINE void atomic_spin_lock(volatile AtomicSpinLock *lock)
+{
+ while (__sync_lock_test_and_set(&lock->lock, 1)) {
+ while (lock->lock) {
+ }
+ }
+}
+
+ATOMIC_INLINE void atomic_spin_unlock(volatile AtomicSpinLock *lock)
+{
+ __sync_lock_release(&lock->lock);
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Common part of locking fallback implementation
+ * \{ */
+
+/* Global lock, shared by all atomic operations implementations.
+ *
+ * Could be split into per-size locks, although added complexity and being more error-proone does
+ * not seem to worth it for a fall-back implementation. */
+static _ATOMIC_MAYBE_UNUSED AtomicSpinLock _atomic_global_lock = {0};
+
+#define ATOMIC_LOCKING_OP_AND_FETCH_DEFINE(_type, _op_name, _op) \
+ ATOMIC_INLINE _type##_t atomic_##_op_name##_and_fetch_##_type(_type##_t *p, _type##_t x) \
+ { \
+ atomic_spin_lock(&_atomic_global_lock); \
+ const _type##_t original_value = *(p); \
+ const _type##_t new_value = original_value _op(x); \
+ *(p) = new_value; \
+ atomic_spin_unlock(&_atomic_global_lock); \
+ return new_value; \
+ }
+
+#define ATOMIC_LOCKING_FETCH_AND_OP_DEFINE(_type, _op_name, _op) \
+ ATOMIC_INLINE _type##_t atomic_fetch_and_##_op_name##_##_type(_type##_t *p, _type##_t x) \
+ { \
+ atomic_spin_lock(&_atomic_global_lock); \
+ const _type##_t original_value = *(p); \
+ *(p) = original_value _op(x); \
+ atomic_spin_unlock(&_atomic_global_lock); \
+ return original_value; \
+ }
+
+#define ATOMIC_LOCKING_ADD_AND_FETCH_DEFINE(_type) \
+ ATOMIC_LOCKING_OP_AND_FETCH_DEFINE(_type, add, +)
+
+#define ATOMIC_LOCKING_SUB_AND_FETCH_DEFINE(_type) \
+ ATOMIC_LOCKING_OP_AND_FETCH_DEFINE(_type, sub, -)
+
+#define ATOMIC_LOCKING_FETCH_AND_ADD_DEFINE(_type) \
+ ATOMIC_LOCKING_FETCH_AND_OP_DEFINE(_type, add, +)
+
+#define ATOMIC_LOCKING_FETCH_AND_SUB_DEFINE(_type) \
+ ATOMIC_LOCKING_FETCH_AND_OP_DEFINE(_type, sub, -)
+
+#define ATOMIC_LOCKING_FETCH_AND_OR_DEFINE(_type) ATOMIC_LOCKING_FETCH_AND_OP_DEFINE(_type, or, |)
+
+#define ATOMIC_LOCKING_FETCH_AND_AND_DEFINE(_type) \
+ ATOMIC_LOCKING_FETCH_AND_OP_DEFINE(_type, and, &)
+
+#define ATOMIC_LOCKING_CAS_DEFINE(_type) \
+ ATOMIC_INLINE _type##_t atomic_cas_##_type(_type##_t *v, _type##_t old, _type##_t _new) \
+ { \
+ atomic_spin_lock(&_atomic_global_lock); \
+ const _type##_t original_value = *v; \
+ if (*v == old) { \
+ *v = _new; \
+ } \
+ atomic_spin_unlock(&_atomic_global_lock); \
+ return original_value; \
+ }
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name 64-bit operations
+ * \{ */
+
+#if !defined(ATOMIC_FORCE_USE_FALLBACK) && \
+ (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_8))
/* Unsigned */
ATOMIC_INLINE uint64_t atomic_add_and_fetch_uint64(uint64_t *p, uint64_t x)
{
@@ -115,7 +214,7 @@ ATOMIC_INLINE int64_t atomic_cas_int64(int64_t *v, int64_t old, int64_t _new)
return __sync_val_compare_and_swap(v, old, _new);
}
-#elif (defined(__amd64__) || defined(__x86_64__))
+#elif !defined(ATOMIC_FORCE_USE_FALLBACK) && (defined(__amd64__) || defined(__x86_64__))
/* Unsigned */
ATOMIC_INLINE uint64_t atomic_fetch_and_add_uint64(uint64_t *p, uint64_t x)
{
@@ -190,12 +289,36 @@ ATOMIC_INLINE int64_t atomic_cas_int64(int64_t *v, int64_t old, int64_t _new)
return ret;
}
#else
-# error "Missing implementation for 64-bit atomic operations"
+
+/* Unsigned */
+
+ATOMIC_LOCKING_ADD_AND_FETCH_DEFINE(uint64)
+ATOMIC_LOCKING_SUB_AND_FETCH_DEFINE(uint64)
+
+ATOMIC_LOCKING_FETCH_AND_ADD_DEFINE(uint64)
+ATOMIC_LOCKING_FETCH_AND_SUB_DEFINE(uint64)
+
+ATOMIC_LOCKING_CAS_DEFINE(uint64)
+
+/* Signed */
+ATOMIC_LOCKING_ADD_AND_FETCH_DEFINE(int64)
+ATOMIC_LOCKING_SUB_AND_FETCH_DEFINE(int64)
+
+ATOMIC_LOCKING_FETCH_AND_ADD_DEFINE(int64)
+ATOMIC_LOCKING_FETCH_AND_SUB_DEFINE(int64)
+
+ATOMIC_LOCKING_CAS_DEFINE(int64)
+
#endif
-/******************************************************************************/
-/* 32-bit operations. */
-#if (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_4))
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name 32-bit operations
+ * \{ */
+
+#if !defined(ATOMIC_FORCE_USE_FALLBACK) && \
+ (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_4))
/* Unsigned */
ATOMIC_INLINE uint32_t atomic_add_and_fetch_uint32(uint32_t *p, uint32_t x)
{
@@ -228,7 +351,8 @@ ATOMIC_INLINE int32_t atomic_cas_int32(int32_t *v, int32_t old, int32_t _new)
return __sync_val_compare_and_swap(v, old, _new);
}
-#elif (defined(__i386__) || defined(__amd64__) || defined(__x86_64__))
+#elif !defined(ATOMIC_FORCE_USE_FALLBACK) && \
+ (defined(__i386__) || defined(__amd64__) || defined(__x86_64__))
/* Unsigned */
ATOMIC_INLINE uint32_t atomic_add_and_fetch_uint32(uint32_t *p, uint32_t x)
{
@@ -286,10 +410,25 @@ ATOMIC_INLINE int32_t atomic_cas_int32(int32_t *v, int32_t old, int32_t _new)
}
#else
-# error "Missing implementation for 32-bit atomic operations"
+
+/* Unsigned */
+
+ATOMIC_LOCKING_ADD_AND_FETCH_DEFINE(uint32)
+ATOMIC_LOCKING_SUB_AND_FETCH_DEFINE(uint32)
+
+ATOMIC_LOCKING_CAS_DEFINE(uint32)
+
+/* Signed */
+
+ATOMIC_LOCKING_ADD_AND_FETCH_DEFINE(int32)
+ATOMIC_LOCKING_SUB_AND_FETCH_DEFINE(int32)
+
+ATOMIC_LOCKING_CAS_DEFINE(int32)
+
#endif
-#if (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_4))
+#if !defined(ATOMIC_FORCE_USE_FALLBACK) && \
+ (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_4))
/* Unsigned */
ATOMIC_INLINE uint32_t atomic_fetch_and_add_uint32(uint32_t *p, uint32_t x)
{
@@ -323,12 +462,27 @@ ATOMIC_INLINE int32_t atomic_fetch_and_and_int32(int32_t *p, int32_t x)
}
#else
-# error "Missing implementation for 32-bit atomic operations"
+
+/* Unsigned */
+ATOMIC_LOCKING_FETCH_AND_ADD_DEFINE(uint32)
+ATOMIC_LOCKING_FETCH_AND_OR_DEFINE(uint32)
+ATOMIC_LOCKING_FETCH_AND_AND_DEFINE(uint32)
+
+/* Signed */
+ATOMIC_LOCKING_FETCH_AND_ADD_DEFINE(int32)
+ATOMIC_LOCKING_FETCH_AND_OR_DEFINE(int32)
+ATOMIC_LOCKING_FETCH_AND_AND_DEFINE(int32)
+
#endif
-/******************************************************************************/
-/* 16-bit operations. */
-#if (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_2))
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name 16-bit operations
+ * \{ */
+
+#if !defined(ATOMIC_FORCE_USE_FALLBACK) && \
+ (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_2))
/* Signed */
ATOMIC_INLINE int16_t atomic_fetch_and_and_int16(int16_t *p, int16_t b)
@@ -341,12 +495,21 @@ ATOMIC_INLINE int16_t atomic_fetch_and_or_int16(int16_t *p, int16_t b)
}
#else
-# error "Missing implementation for 16-bit atomic operations"
+
+ATOMIC_LOCKING_FETCH_AND_AND_DEFINE(int16)
+ATOMIC_LOCKING_FETCH_AND_OR_DEFINE(int16)
+
#endif
-/******************************************************************************/
-/* 8-bit operations. */
-#if (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_1))
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name 8-bit operations
+ * \{ */
+
+#if !defined(ATOMIC_FORCE_USE_FALLBACK) && \
+ (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) || defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_1))
+
/* Unsigned */
ATOMIC_INLINE uint8_t atomic_fetch_and_and_uint8(uint8_t *p, uint8_t b)
{
@@ -368,7 +531,27 @@ ATOMIC_INLINE int8_t atomic_fetch_and_or_int8(int8_t *p, int8_t b)
}
#else
-# error "Missing implementation for 8-bit atomic operations"
+
+/* Unsigned */
+ATOMIC_LOCKING_FETCH_AND_AND_DEFINE(uint8)
+ATOMIC_LOCKING_FETCH_AND_OR_DEFINE(uint8)
+
+/* Signed */
+ATOMIC_LOCKING_FETCH_AND_AND_DEFINE(int8)
+ATOMIC_LOCKING_FETCH_AND_OR_DEFINE(int8)
+
#endif
+/** \} */
+
+#undef ATOMIC_LOCKING_OP_AND_FETCH_DEFINE
+#undef ATOMIC_LOCKING_FETCH_AND_OP_DEFINE
+#undef ATOMIC_LOCKING_ADD_AND_FETCH_DEFINE
+#undef ATOMIC_LOCKING_SUB_AND_FETCH_DEFINE
+#undef ATOMIC_LOCKING_FETCH_AND_ADD_DEFINE
+#undef ATOMIC_LOCKING_FETCH_AND_SUB_DEFINE
+#undef ATOMIC_LOCKING_FETCH_AND_OR_DEFINE
+#undef ATOMIC_LOCKING_FETCH_AND_AND_DEFINE
+#undef ATOMIC_LOCKING_CAS_DEFINE
+
#endif /* __ATOMIC_OPS_UNIX_H__ */
diff --git a/intern/atomic/intern/atomic_ops_utils.h b/intern/atomic/intern/atomic_ops_utils.h
index 57e5b74dd72..01f4284284a 100644
--- a/intern/atomic/intern/atomic_ops_utils.h
+++ b/intern/atomic/intern/atomic_ops_utils.h
@@ -64,9 +64,11 @@
#ifdef __GNUC__
# define _ATOMIC_LIKELY(x) __builtin_expect(!!(x), 1)
# define _ATOMIC_UNLIKELY(x) __builtin_expect(!!(x), 0)
+# define _ATOMIC_MAYBE_UNUSED __attribute__((unused))
#else
# define _ATOMIC_LIKELY(x) (x)
# define _ATOMIC_UNLIKELY(x) (x)
+# define _ATOMIC_MAYBE_UNUSED
#endif
#if defined(__SIZEOF_POINTER__)
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index a7eae421b55..5d98b61b409 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -376,7 +376,7 @@ static bool lookup_property(BL::ID b_id, const string &name, float4 *r_value)
if (type == PROP_FLOAT)
value = RNA_property_float_get(&ptr, prop);
else if (type == PROP_INT)
- value = RNA_property_int_get(&ptr, prop);
+ value = static_cast<float>(RNA_property_int_get(&ptr, prop));
else
return false;
@@ -504,14 +504,14 @@ void BlenderSync::sync_procedural(BL::Object &b_ob,
procedural_map.used(procedural);
}
- float current_frame = b_scene.frame_current();
+ float current_frame = static_cast<float>(b_scene.frame_current());
if (cache_file.override_frame()) {
current_frame = cache_file.frame();
}
if (!cache_file.override_frame()) {
- procedural->set_start_frame(b_scene.frame_start());
- procedural->set_end_frame(b_scene.frame_end());
+ procedural->set_start_frame(static_cast<float>(b_scene.frame_start()));
+ procedural->set_end_frame(static_cast<float>(b_scene.frame_end()));
}
procedural->set_frame(current_frame);
@@ -547,6 +547,7 @@ void BlenderSync::sync_procedural(BL::Object &b_ob,
#else
(void)b_ob;
(void)b_mesh_cache;
+ (void)has_subdivision_modifier;
#endif
}
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index aed4b849aca..af03bab39f7 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -1050,7 +1050,7 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg,
float D, G1i;
if (alpha_x == alpha_y) {
- /* istropic distribution */
+ /* Isotropic distribution. */
float cosThetaM2 = cosThetaM * cosThetaM;
float cosThetaM4 = cosThetaM2 * cosThetaM2;
float tanThetaM2 = 1 / (cosThetaM2)-1;
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm
index 933e0c70cc8..189e663f91a 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.mm
+++ b/intern/ghost/intern/GHOST_SystemCocoa.mm
@@ -424,7 +424,7 @@ extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG])
{
/* TODO: implement graceful termination through Cocoa mechanism
* to avoid session log off to be canceled. */
- /* Note that Cmd+Q is already handled by keyhandler. */
+ /* Note that Cmd+Q is already handled by key-handler. */
systemCocoa->handleQuitRequest();
return NSTerminateCancel;
}
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index 9422d15692d..10ccb00cc15 100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
@@ -1922,7 +1922,7 @@ static GHOST_TKey ghost_key_from_keycode(const XkbDescPtr xkb_descr, const KeyCo
#undef MAKE_ID
-/* from xclip.c xcout() v0.11 */
+/* From `xclip.c` #xcout() v0.11. */
#define XCLIB_XCOUT_NONE 0 /* no context */
#define XCLIB_XCOUT_SENTCONVSEL 1 /* sent a request */
diff --git a/intern/ghost/intern/GHOST_XrContext.cpp b/intern/ghost/intern/GHOST_XrContext.cpp
index 2906a6b241e..a7498e9f91f 100644
--- a/intern/ghost/intern/GHOST_XrContext.cpp
+++ b/intern/ghost/intern/GHOST_XrContext.cpp
@@ -410,6 +410,11 @@ void GHOST_XrContext::getExtensionsToEnable(
try_ext.push_back(XR_EXT_DEBUG_UTILS_EXTENSION_NAME);
}
+ /* Try enabling interaction profile extensions. */
+ try_ext.push_back(XR_EXT_HP_MIXED_REALITY_CONTROLLER_EXTENSION_NAME);
+ try_ext.push_back(XR_HTC_VIVE_COSMOS_CONTROLLER_INTERACTION_EXTENSION_NAME);
+ try_ext.push_back(XR_HUAWEI_CONTROLLER_INTERACTION_EXTENSION_NAME);
+
r_ext_names.reserve(try_ext.size() + graphics_binding_types.size());
/* Add graphics binding extensions (may be multiple ones, we'll settle for one to use later, once
diff --git a/intern/ghost/intern/GHOST_XrSession.cpp b/intern/ghost/intern/GHOST_XrSession.cpp
index 8b0320ef358..a08b2d6045a 100644
--- a/intern/ghost/intern/GHOST_XrSession.cpp
+++ b/intern/ghost/intern/GHOST_XrSession.cpp
@@ -148,13 +148,12 @@ static void create_reference_spaces(OpenXRSessionData &oxr, const GHOST_XrPose &
if (XR_FAILED(result)) {
/* One of the rare cases where we don't want to immediately throw an exception on failure,
- * since run-times are not required to support the stage reference space. Although we need the
- * stage reference space for absolute tracking, if the runtime doesn't support it then just
- * fallback to the local space. */
+ * since runtimes are not required to support the stage reference space. If the runtime
+ * doesn't support it then just fall back to the local space. */
if (result == XR_ERROR_REFERENCE_SPACE_UNSUPPORTED) {
printf(
- "Warning: XR runtime does not support stage reference space, disabling absolute "
- "tracking.\n");
+ "Warning: XR runtime does not support stage reference space, falling back to local "
+ "reference space.\n");
create_info.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_LOCAL;
CHECK_XR(xrCreateReferenceSpace(oxr.session, &create_info, &oxr.reference_space),
@@ -172,8 +171,9 @@ static void create_reference_spaces(OpenXRSessionData &oxr, const GHOST_XrPose &
"Failed to get stage reference space bounds.");
if (extents.width == 0.0f || extents.height == 0.0f) {
printf(
- "Warning: Invalid stage reference space bounds, disabling absolute tracking. To enable "
- "absolute tracking, please define a tracking space via the XR runtime.\n");
+ "Warning: Invalid stage reference space bounds, falling back to local reference space. "
+ "To use the stage reference space, please define a tracking space via the XR "
+ "runtime.\n");
/* Fallback to local space. */
if (oxr.reference_space != XR_NULL_HANDLE) {
diff --git a/release/scripts/modules/bl_keymap_utils/io.py b/release/scripts/modules/bl_keymap_utils/io.py
index 7adcd799c0f..96832cbd9c7 100644
--- a/release/scripts/modules/bl_keymap_utils/io.py
+++ b/release/scripts/modules/bl_keymap_utils/io.py
@@ -22,6 +22,7 @@
# Export Functions
__all__ = (
+ "_init_properties_from_data", # Shared with gizmo default property initialization.
"keyconfig_export_as_data",
"keyconfig_import_from_data",
"keyconfig_init_from_data",
@@ -244,20 +245,24 @@ def keyconfig_export_as_data(wm, kc, filepath, *, all_keymaps=False):
# -----------------------------------------------------------------------------
# Import Functions
-
-def _kmi_props_setattr(kmi_props, attr, value):
- if type(value) is list:
- kmi_subprop = getattr(kmi_props, attr)
- for subattr, subvalue in value:
- _kmi_props_setattr(kmi_subprop, subattr, subvalue)
- return
-
- try:
- setattr(kmi_props, attr, value)
- except AttributeError:
- print(f"Warning: property '{attr}' not found in keymap item '{kmi_props.__class__.__name__}'")
- except Exception as ex:
- print(f"Warning: {ex!r}")
+#
+# NOTE: unlike export, this runs on startup.
+# Take care making changes that could impact performance.
+
+def _init_properties_from_data(base_props, base_value):
+ assert(type(base_value) is list)
+ for attr, value in base_value:
+ if type(value) is list:
+ base_props.property_unset(attr)
+ props = getattr(base_props, attr)
+ _init_properties_from_data(props, value)
+ else:
+ try:
+ setattr(base_props, attr, value)
+ except AttributeError:
+ print(f"Warning: property '{attr}' not found in item '{base_props.__class__.__name__}'")
+ except Exception as ex:
+ print(f"Warning: {ex!r}")
def keymap_init_from_data(km, km_items, is_modal=False):
@@ -271,8 +276,7 @@ def keymap_init_from_data(km, km_items, is_modal=False):
if kmi_props_data is not None:
kmi_props = kmi.properties
assert type(kmi_props_data) is list
- for attr, value in kmi_props_data:
- _kmi_props_setattr(kmi_props, attr, value)
+ _init_properties_from_data(kmi_props, kmi_props_data)
def keyconfig_init_from_data(kc, keyconfig_data):
diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py
index 1fe73f50639..afa04a18ef6 100644
--- a/release/scripts/modules/bpy/utils/__init__.py
+++ b/release/scripts/modules/bpy/utils/__init__.py
@@ -859,6 +859,7 @@ def register_tool(tool_cls, *, after=None, separator=False, group=False):
"icon": getattr(tool_cls, "bl_icon", None),
"cursor": getattr(tool_cls, "bl_cursor", None),
"widget": getattr(tool_cls, "bl_widget", None),
+ "widget_properties": getattr(tool_cls, "bl_widget_properties", None),
"keymap": getattr(tool_cls, "bl_keymap", None),
"data_block": getattr(tool_cls, "bl_data_block", None),
"operator": getattr(tool_cls, "bl_operator", None),
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 55f60329a97..6a9306c2eab 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -796,11 +796,11 @@ def km_outliner(params):
("outliner.item_rename", {"type": 'F2', "value": 'PRESS'},
{"properties": [("use_active", True)]}),
("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK'},
- {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
+ {"properties": [("deselect_all", not params.legacy)]}),
("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
{"properties": [("extend", True), ("deselect_all", not params.legacy)]}),
("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
- {"properties": [("extend", False), ("extend_range", True), ("deselect_all", not params.legacy)]}),
+ {"properties": [("extend_range", True), ("deselect_all", not params.legacy)]}),
("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "shift": True},
{"properties": [("extend", True), ("extend_range", True), ("deselect_all", not params.legacy)]}),
("outliner.select_box", {"type": 'B', "value": 'PRESS'}, None),
@@ -884,15 +884,13 @@ def km_uv_editor(params):
*_template_items_uv_select_mode(params),
("uv.mark_seam", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
("uv.select", {"type": params.select_mouse, "value": params.select_mouse_value},
- {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
+ {"properties": [("deselect_all", not params.legacy)]}),
("uv.select", {"type": params.select_mouse, "value": params.select_mouse_value, "shift": True},
{"properties": [("extend", True)]}),
- ("uv.select_loop", {"type": params.select_mouse, "value": params.select_mouse_value, "alt": True},
- {"properties": [("extend", False)]}),
+ ("uv.select_loop", {"type": params.select_mouse, "value": params.select_mouse_value, "alt": True}, None),
("uv.select_loop", {"type": params.select_mouse, "value": params.select_mouse_value, "shift": True, "alt": True},
{"properties": [("extend", True)]}),
- ("uv.select_edge_ring", {"type": params.select_mouse, "value": params.select_mouse_value, "ctrl": True, "alt": True},
- {"properties": [("extend", False)]}),
+ ("uv.select_edge_ring", {"type": params.select_mouse, "value": params.select_mouse_value, "ctrl": True, "alt": True}, None),
("uv.select_edge_ring", {"type": params.select_mouse, "value": params.select_mouse_value, "ctrl": True, "shift": True, "alt": True},
{"properties": [("extend", True)]}),
("uv.shortest_path_pick", {"type": params.select_mouse, "value": params.select_mouse_value, "ctrl": True},
@@ -913,7 +911,7 @@ def km_uv_editor(params):
("uv.select_linked_pick", {"type": 'L', "value": 'PRESS'},
{"properties": [("extend", True), ("deselect", False)]}),
("uv.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
- {"properties": [("extend", False), ("deselect", True)]}),
+ {"properties": [("deselect", True)]}),
("uv.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
("uv.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
*_template_items_select_actions(params, "uv.select_all"),
@@ -957,8 +955,7 @@ def km_uv_editor(params):
# Fallback for MMB emulation
if params.use_mouse_emulate_3_button and params.select_mouse == 'LEFTMOUSE':
items.extend([
- ("uv.select_loop", {"type": params.select_mouse, "value": 'DOUBLE_CLICK'},
- {"properties": [("extend", False)]}),
+ ("uv.select_loop", {"type": params.select_mouse, "value": 'DOUBLE_CLICK'}, None),
("uv.select_loop", {"type": params.select_mouse, "value": 'DOUBLE_CLICK', "alt": True},
{"properties": [("extend", True)]}),
])
@@ -1354,9 +1351,7 @@ def km_mask_editing(params):
# click select keymap it's fine to have the context menu instead.
items.extend([
("mask.select", {"type": 'RIGHTMOUSE', "value": 'PRESS'},
- {"properties": [
- ("extend", False), ("deselect", False), ("toggle", False),
- ("deselect_all", not params.legacy)]}),
+ {"properties": [("deselect_all", not params.legacy)]}),
("transform.translate", {"type": 'EVT_TWEAK_R', "value": 'ANY'}, None),
])
@@ -1370,7 +1365,7 @@ def km_mask_editing(params):
("mask.delete", {"type": 'X', "value": 'PRESS'}, None),
("mask.delete", {"type": 'DEL', "value": 'PRESS'}, None),
("mask.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
- {"properties": [("extend", False), ("deselect", False), ("toggle", True)]}),
+ {"properties": [("toggle", True)]}),
*_template_items_select_actions(params, "mask.select_all"),
("mask.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
("mask.select_linked_pick", {"type": 'L', "value": 'PRESS'},
@@ -1390,8 +1385,7 @@ def km_mask_editing(params):
{"properties": [("unselected", False)]}),
("mask.hide_view_set", {"type": 'H', "value": 'PRESS', "shift": True},
{"properties": [("unselected", True)]}),
- ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
- {"properties": [("extend", False)]}),
+ ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True}, None),
("mask.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True}, None),
("mask.slide_point", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
("mask.slide_spline_curvature", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
@@ -1446,7 +1440,7 @@ def km_markers(params):
("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
("marker.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
- {"properties": [("extend", False), ("camera", True)]}),
+ {"properties": [("camera", True)]}),
("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
{"properties": [("extend", True), ("camera", True)]}),
("marker.select_box", {"type": params.select_tweak, "value": 'ANY'},
@@ -1531,29 +1525,27 @@ def km_graph_editor(params):
("wm.context_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True},
{"properties": [("data_path", 'space_data.show_handles')]}),
("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS'},
- {"properties": [
- ("extend", False), ("deselect_all", not params.legacy),
- ("column", False), ("curves", False)]}),
+ {"properties": [("deselect_all", not params.legacy)]}),
("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
- {"properties": [("extend", False), ("column", True), ("curves", False)]}),
+ {"properties": [("column", True)]}),
("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
- {"properties": [("extend", True), ("column", False), ("curves", False)]}),
+ {"properties": [("extend", True)]}),
("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
- {"properties": [("extend", True), ("column", True), ("curves", False)]}),
+ {"properties": [("extend", True), ("column", True)]}),
("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties": [("extend", False), ("column", False), ("curves", True)]}),
+ {"properties": [("curves", True)]}),
("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
- {"properties": [("extend", True), ("column", False), ("curves", True)]}),
+ {"properties": [("extend", True), ("curves", True)]}),
("graph.select_leftright",
{"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
- {"properties": [("mode", 'CHECK'), ("extend", False)]}),
+ {"properties": [("mode", 'CHECK')]}),
("graph.select_leftright",
{"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
{"properties": [("mode", 'CHECK'), ("extend", True)]}),
("graph.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties": [("mode", 'LEFT'), ("extend", False)]}),
+ {"properties": [("mode", 'LEFT')]}),
("graph.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
+ {"properties": [("mode", 'RIGHT')]}),
*_template_items_select_actions(params, "graph.select_all"),
("graph.select_box", {"type": 'B', "value": 'PRESS'}, None),
("graph.select_box", {"type": 'B', "value": 'PRESS', "alt": True},
@@ -1597,8 +1589,7 @@ def km_graph_editor(params):
("graph.delete", {"type": 'DEL', "value": 'PRESS'}, {"properties": [("confirm", False)]}),
("graph.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
("graph.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
- ("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True},
- {"properties": [("extend", False)]}),
+ ("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True}, None),
("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "shift": True, "ctrl": True},
{"properties": [("extend", True)]}),
("graph.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
@@ -1804,13 +1795,10 @@ def km_node_editor(params):
def node_select_ops(select_mouse):
return [
("node.select", {"type": select_mouse, "value": 'PRESS'},
- {"properties": [("extend", False), ("deselect_all", True)]}),
- ("node.select", {"type": select_mouse, "value": 'PRESS', "ctrl": True},
- {"properties": [("extend", False)]}),
- ("node.select", {"type": select_mouse, "value": 'PRESS', "alt": True},
- {"properties": [("extend", False)]}),
- ("node.select", {"type": select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties": [("extend", False)]}),
+ {"properties": [("deselect_all", True)]}),
+ ("node.select", {"type": select_mouse, "value": 'PRESS', "ctrl": True}, None),
+ ("node.select", {"type": select_mouse, "value": 'PRESS', "alt": True}, None),
+ ("node.select", {"type": select_mouse, "value": 'PRESS', "ctrl": True, "alt": True}, None),
("node.select", {"type": select_mouse, "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
("node.select", {"type": select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
@@ -1832,7 +1820,7 @@ def km_node_editor(params):
items.extend(node_select_ops('RIGHTMOUSE'))
items.extend([
("node.select", {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties": [("extend", False), ("deselect_all", False)]}),
+ {"properties": [("deselect_all", False)]}),
("node.select", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
])
@@ -1887,8 +1875,7 @@ def km_node_editor(params):
*_template_items_select_actions(params, "node.select_all"),
("node.select_linked_to", {"type": 'L', "value": 'PRESS', "shift": True}, None),
("node.select_linked_from", {"type": 'L', "value": 'PRESS'}, None),
- ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True},
- {"properties": [("extend", False)]}),
+ ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True},
{"properties": [("extend", True)]}),
("node.select_same_type_step", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
@@ -2131,29 +2118,27 @@ def km_dopesheet(params):
items.extend([
("action.clickselect", {"type": params.select_mouse, "value": 'PRESS'},
- {"properties": [
- ("extend", False), ("deselect_all", not params.legacy),
- ("column", False), ("channel", False)]}),
+ {"properties": [("deselect_all", not params.legacy)]}),
("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
- {"properties": [("extend", False), ("column", True), ("channel", False)]}),
+ {"properties": [("column", True)]}),
("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
- {"properties": [("extend", True), ("column", False), ("channel", False)]}),
+ {"properties": [("extend", True)]}),
("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
- {"properties": [("extend", True), ("column", True), ("channel", False)]}),
+ {"properties": [("extend", True), ("column", True)]}),
("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
- {"properties": [("extend", False), ("column", False), ("channel", True)]}),
+ {"properties": [("channel", True)]}),
("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
- {"properties": [("extend", True), ("column", False), ("channel", True)]}),
+ {"properties": [("extend", True), ("channel", True)]}),
("action.select_leftright",
{"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
- {"properties": [("mode", 'CHECK'), ("extend", False)]}),
+ {"properties": [("mode", 'CHECK')]}),
("action.select_leftright",
{"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
{"properties": [("mode", 'CHECK'), ("extend", True)]}),
("action.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties": [("mode", 'LEFT'), ("extend", False)]}),
+ {"properties": [("mode", 'LEFT')]}),
("action.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
+ {"properties": [("mode", 'RIGHT')]}),
*_template_items_select_actions(params, "action.select_all"),
("action.select_box", {"type": 'B', "value": 'PRESS'},
{"properties": [("axis_range", False)]}),
@@ -2264,8 +2249,7 @@ def km_nla_channels(params):
)
items.extend([
- ("nla.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties": [("extend", False)]}),
+ ("nla.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
("nla.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
("nla.tracks_add", {"type": 'A', "value": 'PRESS', "shift": True},
@@ -2290,19 +2274,19 @@ def km_nla_editor(params):
items.extend([
("nla.click_select", {"type": params.select_mouse, "value": 'PRESS'},
- {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
+ {"properties": [("deselect_all", not params.legacy)]}),
("nla.click_select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
("nla.select_leftright",
{"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
- {"properties": [("mode", 'CHECK'), ("extend", False)]}),
+ {"properties": [("mode", 'CHECK')]}),
("nla.select_leftright",
{"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
{"properties": [("mode", 'CHECK'), ("extend", True)]}),
("nla.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties": [("mode", 'LEFT'), ("extend", False)]}),
+ {"properties": [("mode", 'LEFT')]}),
("nla.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
+ {"properties": [("mode", 'RIGHT')]}),
*_template_items_select_actions(params, "nla.select_all"),
("nla.select_box", {"type": 'B', "value": 'PRESS'},
{"properties": [("axis_range", False)]}),
@@ -2498,7 +2482,7 @@ def km_text(params):
{"properties": [("type", 'PREVIOUS_CHARACTER')]}),
("text.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True, "repeat": True},
{"properties": [("type", 'NEXT_WORD')]}),
- ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
+ ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True, "repeat": True},
{"properties": [("type", 'PREVIOUS_WORD')]}),
("text.overwrite_toggle", {"type": 'INSERT', "value": 'PRESS'}, None),
("text.scroll_bar", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
@@ -2638,8 +2622,7 @@ def km_sequencer(params):
{"properties": [("side_of_frame", True), ("linked_time", True), ("extend", True)]}),
("sequencer.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
("sequencer.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
- ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS'},
- {"properties": [("extend", False)]}),
+ ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS'}, None),
("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
("sequencer.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
@@ -2862,7 +2845,7 @@ def km_clip_editor(params):
{"properties": [("position", 'PATHSTART')]}),
("clip.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
("clip.select", {"type": params.select_mouse, "value": 'PRESS'},
- {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
+ {"properties": [("deselect_all", not params.legacy)]}),
("clip.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
*_template_items_select_actions(params, "clip.select_all"),
@@ -2948,8 +2931,7 @@ def km_clip_graph_editor(params):
)
items.extend([
- ("clip.graph_select", {"type": params.select_mouse, "value": 'PRESS'},
- {"properties": [("extend", False)]}),
+ ("clip.graph_select", {"type": params.select_mouse, "value": 'PRESS'}, None),
("clip.graph_select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
*_template_items_select_actions(params, "clip.graph_select_all_markers"),
@@ -4241,8 +4223,7 @@ def km_paint_curve(params):
items.extend([
("paintcurve.add_point_slide", {"type": params.action_mouse, "value": 'PRESS', "ctrl": True}, None),
- ("paintcurve.select", {"type": params.select_mouse, "value": 'PRESS'},
- {"properties": [("extend", False)]}),
+ ("paintcurve.select", {"type": params.select_mouse, "value": 'PRESS'}, None),
("paintcurve.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
{"properties": [("extend", True)]}),
("paintcurve.slide", {"type": params.action_mouse, "value": 'PRESS'},
@@ -4664,15 +4645,13 @@ def km_mesh(params):
# Selection modes.
*_template_items_editmode_mesh_select_mode(params),
# Loop Select with alt. Double click in case MMB emulation is on (below).
- ("mesh.loop_select", {"type": params.select_mouse, "value": params.select_mouse_value, "alt": True},
- {"properties": [("extend", False), ("deselect", False), ("toggle", False)]}),
+ ("mesh.loop_select", {"type": params.select_mouse, "value": params.select_mouse_value, "alt": True}, None),
("mesh.loop_select", {"type": params.select_mouse, "value": params.select_mouse_value, "shift": True, "alt": True},
- {"properties": [("extend", False), ("deselect", False), ("toggle", True)]}),
+ {"properties": [("toggle", True)]}),
# Selection
- ("mesh.edgering_select", {"type": params.select_mouse, "value": params.select_mouse_value, "ctrl": True, "alt": True},
- {"properties": [("extend", False), ("deselect", False), ("toggle", False)]}),
+ ("mesh.edgering_select", {"type": params.select_mouse, "value": params.select_mouse_value, "ctrl": True, "alt": True}, None),
("mesh.edgering_select", {"type": params.select_mouse, "value": params.select_mouse_value, "shift": True, "ctrl": True, "alt": True},
- {"properties": [("extend", False), ("deselect", False), ("toggle", True)]}),
+ {"properties": [("toggle", True)]}),
("mesh.shortest_path_pick", {"type": params.select_mouse, "value": params.select_mouse_value, "ctrl": True},
{"properties": [("use_fill", False)]}),
("mesh.shortest_path_pick", {"type": params.select_mouse, "value": params.select_mouse_value, "shift": True, "ctrl": True},
@@ -4754,16 +4733,14 @@ def km_mesh(params):
if params.use_mouse_emulate_3_button and params.select_mouse == 'LEFTMOUSE':
items.extend([
- ("mesh.loop_select", {"type": params.select_mouse, "value": 'DOUBLE_CLICK'},
- {"properties": [("extend", False), ("deselect", False), ("toggle", False)]}),
+ ("mesh.loop_select", {"type": params.select_mouse, "value": 'DOUBLE_CLICK'}, None),
("mesh.loop_select", {"type": params.select_mouse, "value": 'DOUBLE_CLICK', "shift": True},
- {"properties": [("extend", True), ("deselect", False), ("toggle", False)]}),
+ {"properties": [("extend", True)]}),
("mesh.loop_select", {"type": params.select_mouse, "value": 'DOUBLE_CLICK', "alt": True},
- {"properties": [("extend", False), ("deselect", True), ("toggle", False)]}),
- ("mesh.edgering_select", {"type": params.select_mouse, "value": 'DOUBLE_CLICK', "ctrl": True},
- {"properties": [("extend", False), ("deselect", False), ("toggle", False)]}),
+ {"properties": [("deselect", True)]}),
+ ("mesh.edgering_select", {"type": params.select_mouse, "value": 'DOUBLE_CLICK', "ctrl": True}, None),
("mesh.edgering_select", {"type": params.select_mouse, "value": 'DOUBLE_CLICK', "shift": True, "ctrl": True},
- {"properties": [("extend", False), ("deselect", False), ("toggle", True)]}),
+ {"properties": [("toggle", True)]}),
])
if params.legacy:
@@ -5953,7 +5930,7 @@ def km_node_editor_tool_select(params):
{"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
{"items": [
("node.select", {"type": params.select_mouse, "value": 'PRESS'},
- {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
+ {"properties": [("deselect_all", not params.legacy)]}),
]},
)
@@ -7021,7 +6998,7 @@ def km_sequencer_editor_tool_select(params):
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
{"items": [
("sequencer.select", {"type": params.select_mouse, "value": 'PRESS'},
- {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
+ {"properties": [("deselect_all", not params.legacy)]}),
*_template_items_change_frame(params),
]},
)
diff --git a/release/scripts/startup/bl_app_templates_system/Video_Editing/__init__.py b/release/scripts/startup/bl_app_templates_system/Video_Editing/__init__.py
index 247a1ec342e..05ecac4d70c 100644
--- a/release/scripts/startup/bl_app_templates_system/Video_Editing/__init__.py
+++ b/release/scripts/startup/bl_app_templates_system/Video_Editing/__init__.py
@@ -29,9 +29,28 @@ def update_factory_startup_screens():
params.use_filter_folder = True
+def update_factory_startup_ffmpeg_preset():
+ preset = "H264_in_MP4"
+ preset_filepath = bpy.utils.preset_find(preset, preset_path="ffmpeg")
+ if not preset_filepath:
+ print("Preset %r not found" % preset)
+
+ for scene in bpy.data.scenes:
+ render = scene.render
+ render.image_settings.file_format = 'FFMPEG'
+
+ if preset_filepath:
+ bpy.ops.script.python_file_run({"scene": scene}, filepath=preset_filepath)
+
+ render.ffmpeg.audio_codec = 'AAC'
+ render.ffmpeg.audio_bitrate = 256
+
+
@persistent
def load_handler(_):
update_factory_startup_screens()
+ if bpy.app.build_options.codec_ffmpeg:
+ update_factory_startup_ffmpeg_preset()
def register():
diff --git a/release/scripts/startup/bl_ui/properties_data_gpencil.py b/release/scripts/startup/bl_ui/properties_data_gpencil.py
index b273eee4e19..793c4a52350 100644
--- a/release/scripts/startup/bl_ui/properties_data_gpencil.py
+++ b/release/scripts/startup/bl_ui/properties_data_gpencil.py
@@ -342,6 +342,11 @@ class DATA_PT_gpencil_vertex_groups(ObjectButtonsPanel, Panel):
col.operator("object.vertex_group_add", icon='ADD', text="")
col.operator("object.vertex_group_remove", icon='REMOVE', text="").all = False
+ if group:
+ col.separator()
+ col.operator("object.vertex_group_move", icon='TRIA_UP', text="").direction = 'UP'
+ col.operator("object.vertex_group_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
+
if ob.vertex_groups:
row = layout.row()
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py
index cde430c1e6f..28549098e51 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_common.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py
@@ -75,6 +75,8 @@ ToolDef = namedtuple(
"icon",
# An optional cursor to use when this tool is active.
"cursor",
+ # The properties to use for the widget.
+ "widget_properties",
# An optional gizmo group to activate when the tool is set or None for no gizmo.
"widget",
# Optional key-map for tool, possible values are:
@@ -132,6 +134,7 @@ def from_dict(kw_args):
"icon": None,
"cursor": None,
"widget": None,
+ "widget_properties": None,
"keymap": None,
"data_block": None,
"operator": None,
@@ -983,11 +986,13 @@ def _activate_by_item(context, space_type, item, index, *, as_fallback=False):
item_fallback, _index = cls._tool_get_active_by_index(context, select_index)
# End calculating fallback.
+ gizmo_group = item.widget or ""
+
tool.setup(
idname=item.idname,
keymap=item.keymap[0] if item.keymap is not None else "",
cursor=item.cursor or 'DEFAULT',
- gizmo_group=item.widget or "",
+ gizmo_group=gizmo_group,
data_block=item.data_block or "",
operator=item.operator or "",
index=index,
@@ -995,6 +1000,24 @@ def _activate_by_item(context, space_type, item, index, *, as_fallback=False):
keymap_fallback=(item_fallback and item_fallback.keymap and item_fallback.keymap[0]) or "",
)
+ if (
+ (gizmo_group != "") and
+ (props := tool.gizmo_group_properties(gizmo_group))
+ ):
+ if props is None:
+ print("Error:", gizmo_group, "could not access properties!")
+ else:
+ for key in props.bl_rna.properties.keys():
+ props.property_unset(key)
+
+ gizmo_properties = item.widget_properties
+ if gizmo_properties is not None:
+ if not isinstance(gizmo_properties, list):
+ raise Exception("expected a list, not a %r" % type(gizmo_properties))
+
+ from bl_keymap_utils.io import _init_properties_from_data
+ _init_properties_from_data(props, gizmo_properties)
+
WindowManager = bpy.types.WindowManager
handle_map = _activate_by_item._cursor_draw_handle
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index bde710d8dbf..c5191e80aef 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -824,7 +824,11 @@ class _defs_edit_mesh:
idname="builtin.inset_faces",
label="Inset Faces",
icon="ops.mesh.inset",
- widget="VIEW3D_GGT_tool_generic_handle_normal",
+ widget="VIEW3D_GGT_tool_generic_handle_free",
+ widget_properties=[
+ ("radius", 75.0),
+ ("backdrop_fill_alpha", 0.0),
+ ],
keymap=(),
draw_settings=draw_settings,
)
diff --git a/release/scripts/templates_py/ui_tool_simple.py b/release/scripts/templates_py/ui_tool_simple.py
index fc239093b9c..fa81b3b58a9 100644
--- a/release/scripts/templates_py/ui_tool_simple.py
+++ b/release/scripts/templates_py/ui_tool_simple.py
@@ -53,14 +53,38 @@ class MyOtherTool(WorkSpaceTool):
layout.prop(props, "mode")
+class MyWidgetTool(WorkSpaceTool):
+ bl_space_type = 'VIEW_3D'
+ bl_context_mode = 'OBJECT'
+
+ bl_idname = "my_template.my_gizmo_translate"
+ bl_label = "My Gizmo Tool"
+ bl_description = "Short description"
+ bl_icon = "ops.transform.translate"
+ bl_widget="VIEW3D_GGT_tool_generic_handle_free"
+ bl_widget_properties=[
+ ("radius", 75.0),
+ ("backdrop_fill_alpha", 0.0),
+ ]
+ bl_keymap = (
+ ("transform.translate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ )
+
+ def draw_settings(context, layout, tool):
+ props = tool.operator_properties("transform.translate")
+ layout.prop(props, "mode")
+
+
def register():
bpy.utils.register_tool(MyTool, after={"builtin.scale_cage"}, separator=True, group=True)
bpy.utils.register_tool(MyOtherTool, after={MyTool.bl_idname})
+ bpy.utils.register_tool(MyWidgetTool, after={MyTool.bl_idname})
def unregister():
bpy.utils.unregister_tool(MyTool)
bpy.utils.unregister_tool(MyOtherTool)
+ bpy.utils.unregister_tool(MyWidgetTool)
if __name__ == "__main__":
diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h
index 4de7e704a7e..78252bdb08b 100644
--- a/source/blender/blenfont/BLF_api.h
+++ b/source/blender/blenfont/BLF_api.h
@@ -101,9 +101,6 @@ void BLF_batch_draw_end(void);
void BLF_draw_ex(int fontid, const char *str, size_t str_len, struct ResultBLF *r_info)
ATTR_NONNULL(2);
void BLF_draw(int fontid, const char *str, size_t str_len) ATTR_NONNULL(2);
-void BLF_draw_ascii_ex(int fontid, const char *str, size_t str_len, struct ResultBLF *r_info)
- ATTR_NONNULL(2);
-void BLF_draw_ascii(int fontid, const char *str, size_t str_len) ATTR_NONNULL(2);
int BLF_draw_mono(int fontid, const char *str, size_t str_len, int cwidth) ATTR_NONNULL(2);
typedef bool (*BLF_GlyphBoundsFn)(const char *str,
@@ -257,8 +254,6 @@ void BLF_default_set(int fontid);
int BLF_default(void); /* get default font ID so we can pass it to other functions */
/* Draw the string using the default font, size and dpi. */
void BLF_draw_default(float x, float y, float z, const char *str, size_t str_len) ATTR_NONNULL();
-void BLF_draw_default_ascii(float x, float y, float z, const char *str, size_t str_len)
- ATTR_NONNULL();
/* Set size and DPI, and return default font ID. */
int BLF_set_default(void);
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c
index 86d67c80fd4..34ddb6f22d2 100644
--- a/source/blender/blenfont/intern/blf.c
+++ b/source/blender/blenfont/intern/blf.c
@@ -550,34 +550,6 @@ void BLF_draw(int fontid, const char *str, const size_t str_len)
BLF_draw_ex(fontid, str, str_len, NULL);
}
-void BLF_draw_ascii_ex(int fontid, const char *str, const size_t str_len, struct ResultBLF *r_info)
-{
- FontBLF *font = blf_get(fontid);
-
- BLF_RESULT_CHECK_INIT(r_info);
-
- if (font) {
- blf_draw_gl__start(font);
- if (font->flags & BLF_WORD_WRAP) {
- /* Use non-ASCII draw function for word-wrap. */
- blf_font_draw__wrap(font, str, str_len, r_info);
- }
- else {
- blf_font_draw_ascii(font, str, str_len, r_info);
- }
- blf_draw_gl__end(font);
- }
-}
-
-void BLF_draw_ascii(int fontid, const char *str, const size_t str_len)
-{
- if (str_len == 0 || str[0] == '\0') {
- return;
- }
-
- BLF_draw_ascii_ex(fontid, str, str_len, NULL);
-}
-
int BLF_draw_mono(int fontid, const char *str, const size_t str_len, int cwidth)
{
if (str_len == 0 || str[0] == '\0') {
diff --git a/source/blender/blenfont/intern/blf_default.c b/source/blender/blenfont/intern/blf_default.c
index 1b458e8aaef..2bac0bf8904 100644
--- a/source/blender/blenfont/intern/blf_default.c
+++ b/source/blender/blenfont/intern/blf_default.c
@@ -77,14 +77,3 @@ void BLF_draw_default(float x, float y, float z, const char *str, const size_t s
BLF_position(global_font_default, x, y, z);
BLF_draw(global_font_default, str, str_len);
}
-
-/* same as above but call 'BLF_draw_ascii' */
-void BLF_draw_default_ascii(float x, float y, float z, const char *str, const size_t str_len)
-{
- ASSERT_DEFAULT_SET;
-
- const uiStyle *style = UI_style_get();
- BLF_size(global_font_default, style->widgetlabel.points, global_font_dpi);
- BLF_position(global_font_default, x, y, z);
- BLF_draw_ascii(global_font_default, str, str_len); /* XXX, use real length */
-}
diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c
index 9520e971148..55c02b34f3d 100644
--- a/source/blender/blenfont/intern/blf_dir.c
+++ b/source/blender/blenfont/intern/blf_dir.c
@@ -172,12 +172,12 @@ char *blf_dir_metrics_search(const char *filename)
s[1] = 'f';
s[2] = 'm';
- /* first check .afm */
+ /* First check `.afm`. */
if (BLI_exists(mfile)) {
return mfile;
}
- /* and now check .pfm */
+ /* And now check `.pfm`. */
s[0] = 'p';
if (BLI_exists(mfile)) {
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index 5ad48aa08d4..dbcd1d6016d 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -309,15 +309,13 @@ BLI_INLINE GlyphBLF *blf_utf8_next_fast(
}
(*i_p)++;
}
- else if ((*r_c = BLI_str_utf8_as_unicode_step(str, str_len, i_p)) != BLI_UTF8_ERR) {
+ else {
+ *r_c = BLI_str_utf8_as_unicode_step(str, str_len, i_p);
g = blf_glyph_search(gc, *r_c);
if (UNLIKELY(g == NULL)) {
g = blf_glyph_add(font, gc, FT_Get_Char_Index(font->face, *r_c), *r_c);
}
}
- else {
- g = NULL;
- }
return g;
}
@@ -414,56 +412,6 @@ void blf_font_draw(FontBLF *font, const char *str, const size_t str_len, struct
blf_glyph_cache_release(font);
}
-/* faster version of blf_font_draw, ascii only for view dimensions */
-static void blf_font_draw_ascii_ex(
- FontBLF *font, const char *str, size_t str_len, struct ResultBLF *r_info, int pen_y)
-{
- unsigned int c, c_prev = BLI_UTF8_ERR;
- GlyphBLF *g, *g_prev = NULL;
- int pen_x = 0;
-
- GlyphCacheBLF *gc = blf_glyph_cache_acquire(font);
-
- blf_batch_draw_begin(font);
-
- while ((c = *(str++)) && str_len--) {
- BLI_assert(c < GLYPH_ASCII_TABLE_SIZE);
- g = gc->glyph_ascii_table[c];
- if (UNLIKELY(g == NULL)) {
- g = blf_glyph_add(font, gc, FT_Get_Char_Index((font)->face, c), c);
- gc->glyph_ascii_table[c] = g;
- if (UNLIKELY(g == NULL)) {
- continue;
- }
- }
- blf_kerning_step_fast(font, g_prev, g, c_prev, c, &pen_x);
-
- /* do not return this loop if clipped, we want every character tested */
- blf_glyph_render(font, gc, g, (float)pen_x, (float)pen_y);
-
- pen_x += g->advance_i;
- g_prev = g;
- c_prev = c;
- }
-
- blf_batch_draw_end();
-
- if (r_info) {
- r_info->lines = 1;
- r_info->width = pen_x;
- }
-
- blf_glyph_cache_release(font);
-}
-
-void blf_font_draw_ascii(FontBLF *font,
- const char *str,
- const size_t str_len,
- struct ResultBLF *r_info)
-{
- blf_font_draw_ascii_ex(font, str, str_len, r_info, 0);
-}
-
/* use fixed column width, but an utf8 character may occupy multiple columns */
int blf_font_draw_mono(FontBLF *font, const char *str, const size_t str_len, int cwidth)
{
@@ -1202,7 +1150,8 @@ int blf_font_count_missing_chars(FontBLF *font,
if ((c = str[i]) < GLYPH_ASCII_TABLE_SIZE) {
i++;
}
- else if ((c = BLI_str_utf8_as_unicode_step(str, str_len, &i)) != BLI_UTF8_ERR) {
+ else {
+ c = BLI_str_utf8_as_unicode_step(str, str_len, &i);
if (FT_Get_Char_Index((font)->face, c) == 0) {
missing++;
}
diff --git a/source/blender/blenkernel/BKE_action.hh b/source/blender/blenkernel/BKE_action.hh
index b9f106d367e..9b033713dc7 100644
--- a/source/blender/blenkernel/BKE_action.hh
+++ b/source/blender/blenkernel/BKE_action.hh
@@ -24,8 +24,8 @@
#include "BLI_function_ref.hh"
-struct bAction;
struct FCurve;
+struct bAction;
namespace blender::bke {
diff --git a/source/blender/blenkernel/BKE_idtype.h b/source/blender/blenkernel/BKE_idtype.h
index 28171b2b363..b0939ec884d 100644
--- a/source/blender/blenkernel/BKE_idtype.h
+++ b/source/blender/blenkernel/BKE_idtype.h
@@ -114,8 +114,8 @@ typedef struct IDTypeInfo {
/* ********** General IDType data. ********** */
/**
- * Unique identifier of this type, either as a short or an array of two chars, see DNA_ID.h's
- * ID_XX enums.
+ * Unique identifier of this type, either as a short or an array of two chars, see
+ * DNA_ID_enums.h's ID_XX enums.
*/
short id_code;
/**
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 83ce5e72794..f3edf8e9f64 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -264,14 +264,6 @@ void BKE_scene_cursor_from_mat4(struct View3DCursor *cursor,
const float mat[4][4],
bool use_compat);
-/* Dependency graph evaluation. */
-
-/* Evaluate parts of sequences which needs to be done as a part of a dependency graph evaluation.
- * This does NOT include actual rendering of the strips, but rather makes them up-to-date for
- * animation playback and makes them ready for the sequencer's rendering pipeline to render them.
- */
-void BKE_scene_eval_sequencer_sequences(struct Depsgraph *depsgraph, struct Scene *scene);
-
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h
index 4b257b3b8ab..fa58813c5f8 100644
--- a/source/blender/blenkernel/BKE_sound.h
+++ b/source/blender/blenkernel/BKE_sound.h
@@ -61,8 +61,7 @@ struct bSound *BKE_sound_new_file_exists_ex(struct Main *bmain,
bool *r_exists);
struct bSound *BKE_sound_new_file_exists(struct Main *bmain, const char *filepath);
-// XXX unused currently
-#if 0
+#if 0 /* UNUSED */
struct bSound *BKE_sound_new_buffer(struct Main *bmain, struct bSound *source);
struct bSound *BKE_sound_new_limiter(struct Main *bmain,
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index adaef22d5bc..64cfbd8f491 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -78,9 +78,9 @@ set(SRC
intern/anim_visualization.c
intern/appdir.c
intern/armature.c
- intern/armature_selection.cc
intern/armature_deform.c
intern/armature_pose.cc
+ intern/armature_selection.cc
intern/armature_update.c
intern/asset.cc
intern/attribute.c
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index 981815f400a..16d269f9e26 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -1991,7 +1991,7 @@ void BKE_pose_blend_read_lib(BlendLibReader *reader, Object *ob, bPose *pose)
if (UNLIKELY(pchan->bone == NULL)) {
rebuild = true;
}
- else if ((ob->id.lib == NULL) && arm->id.lib) {
+ else if (!ID_IS_LINKED(ob) && ID_IS_LINKED(arm)) {
/* local pose selection copied to armature, bit hackish */
pchan->bone->flag &= ~BONE_SELECTED;
pchan->bone->flag |= pchan->selectflag;
diff --git a/source/blender/blenkernel/intern/bpath.c b/source/blender/blenkernel/intern/bpath.c
index 70274de8bff..1684e22dece 100644
--- a/source/blender/blenkernel/intern/bpath.c
+++ b/source/blender/blenkernel/intern/bpath.c
@@ -534,6 +534,46 @@ static bool rewrite_path_alloc(char **path,
return false;
}
+typedef struct Seq_callback_data {
+ const char *absbase;
+ void *bpath_user_data;
+ BPathVisitor visit_cb;
+ const int flag;
+} Seq_callback_data;
+
+static bool seq_rewrite_path_callback(Sequence *seq, void *user_data)
+{
+ if (SEQ_HAS_PATH(seq)) {
+ StripElem *se = seq->strip->stripdata;
+ Seq_callback_data *cd = (Seq_callback_data *)user_data;
+
+ if (ELEM(seq->type, SEQ_TYPE_MOVIE, SEQ_TYPE_SOUND_RAM) && se) {
+ rewrite_path_fixed_dirfile(
+ seq->strip->dir, se->name, cd->visit_cb, cd->absbase, cd->bpath_user_data);
+ }
+ else if ((seq->type == SEQ_TYPE_IMAGE) && se) {
+ /* might want an option not to loop over all strips */
+ unsigned int len = (unsigned int)MEM_allocN_len(se) / (unsigned int)sizeof(*se);
+ unsigned int i;
+
+ if (cd->flag & BKE_BPATH_TRAVERSE_SKIP_MULTIFILE) {
+ /* only operate on one path */
+ len = MIN2(1u, len);
+ }
+
+ for (i = 0; i < len; i++, se++) {
+ rewrite_path_fixed_dirfile(
+ seq->strip->dir, se->name, cd->visit_cb, cd->absbase, cd->bpath_user_data);
+ }
+ }
+ else {
+ /* simple case */
+ rewrite_path_fixed(seq->strip->dir, cd->visit_cb, cd->absbase, cd->bpath_user_data);
+ }
+ }
+ return true;
+}
+
/**
* Run visitor function 'visit' on all paths contained in 'id'.
*/
@@ -701,38 +741,8 @@ void BKE_bpath_traverse_id(
case ID_SCE: {
Scene *scene = (Scene *)id;
if (scene->ed) {
- Sequence *seq;
-
- SEQ_ALL_BEGIN (scene->ed, seq) {
- if (SEQ_HAS_PATH(seq)) {
- StripElem *se = seq->strip->stripdata;
-
- if (ELEM(seq->type, SEQ_TYPE_MOVIE, SEQ_TYPE_SOUND_RAM) && se) {
- rewrite_path_fixed_dirfile(
- seq->strip->dir, se->name, visit_cb, absbase, bpath_user_data);
- }
- else if ((seq->type == SEQ_TYPE_IMAGE) && se) {
- /* might want an option not to loop over all strips */
- unsigned int len = (unsigned int)MEM_allocN_len(se) / (unsigned int)sizeof(*se);
- unsigned int i;
-
- if (flag & BKE_BPATH_TRAVERSE_SKIP_MULTIFILE) {
- /* only operate on one path */
- len = MIN2(1u, len);
- }
-
- for (i = 0; i < len; i++, se++) {
- rewrite_path_fixed_dirfile(
- seq->strip->dir, se->name, visit_cb, absbase, bpath_user_data);
- }
- }
- else {
- /* simple case */
- rewrite_path_fixed(seq->strip->dir, visit_cb, absbase, bpath_user_data);
- }
- }
- }
- SEQ_ALL_END;
+ Seq_callback_data user_data = {absbase, bpath_user_data, visit_cb, flag};
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_rewrite_path_callback, &user_data);
}
break;
}
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 30aa22387d0..72f14d94833 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -6657,7 +6657,7 @@ void BKE_constraint_blend_read_lib(BlendLibReader *reader, ID *id, ListBase *con
BLO_read_id_address(reader, id->lib, &con->ipo); /* XXX deprecated - old animation system */
/* If linking from a library, clear 'local' library override flag. */
- if (id->lib != NULL) {
+ if (ID_IS_LINKED(id)) {
con->flag &= ~CONSTRAINT_OVERRIDE_LIBRARY_LOCAL;
}
}
diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc
index c97e07ad487..58509e95de6 100644
--- a/source/blender/blenkernel/intern/displist.cc
+++ b/source/blender/blenkernel/intern/displist.cc
@@ -56,7 +56,7 @@
#include "BKE_modifier.h"
#include "BKE_object.h"
-#include "BLI_sys_types.h" // for intptr_t support
+#include "BLI_sys_types.h" /* For #intptr_t support. */
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
@@ -655,7 +655,7 @@ static float displist_calc_taper(Depsgraph *depsgraph,
return fp[1];
}
}
- return fp[-2]; // last y coord
+ return fp[-2]; /* Last y coordinate. */
}
}
diff --git a/source/blender/blenkernel/intern/fluid.c b/source/blender/blenkernel/intern/fluid.c
index 799d6553682..87c1f99fd73 100644
--- a/source/blender/blenkernel/intern/fluid.c
+++ b/source/blender/blenkernel/intern/fluid.c
@@ -557,7 +557,7 @@ static bool BKE_fluid_modifier_init(
return false;
}
-// forward declaration
+/* Forward declarations. */
static void manta_smoke_calc_transparency(FluidDomainSettings *fds, ViewLayer *view_layer);
static float calc_voxel_transp(
float *result, const float *input, int res[3], int *pixel, float *t_ray, float correct);
@@ -4380,10 +4380,10 @@ static void manta_smoke_calc_transparency(FluidDomainSettings *fds, ViewLayer *v
light[2] = (light[2] - fds->p0[2]) / fds->cell_size[2] - 0.5f - (float)fds->res_min[2];
/* Calculate domain bounds in sim cell space. */
- // 0,2,4 = 0.0f
- bv[1] = (float)fds->res[0]; // x
- bv[3] = (float)fds->res[1]; // y
- bv[5] = (float)fds->res[2]; // z
+ /* 0,2,4 = 0.0f */
+ bv[1] = (float)fds->res[0]; /* X */
+ bv[3] = (float)fds->res[1]; /* Y */
+ bv[5] = (float)fds->res[2]; /* Z */
for (int z = 0; z < fds->res[2]; z++) {
size_t index = z * slabsize;
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 9062fd2d39c..a143645c2ee 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -208,7 +208,7 @@ void BKE_gpencil_blend_read_data(BlendDataReader *reader, bGPdata *gpd)
BKE_animdata_blend_read_data(reader, gpd->adt);
/* Ensure full objectmode for linked grease pencil. */
- if (gpd->id.lib != NULL) {
+ if (ID_IS_LINKED(gpd)) {
gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c
index 344be7bc0f5..0752424df71 100644
--- a/source/blender/blenkernel/intern/gpencil_curve.c
+++ b/source/blender/blenkernel/intern/gpencil_curve.c
@@ -883,7 +883,7 @@ static void gpencil_interpolate_fl_from_to(
float *r = point_offset;
for (int i = 0; i <= it; i++) {
float fac = (float)i / (float)it;
- fac = 3.0f * fac * fac - 2.0f * fac * fac * fac; // smooth
+ fac = 3.0f * fac * fac - 2.0f * fac * fac * fac; /* Smooth. */
*r = interpf(to, from, fac);
r = POINTER_OFFSET(r, stride);
}
@@ -896,7 +896,7 @@ static void gpencil_interpolate_v4_from_to(
float *r = point_offset;
for (int i = 0; i <= it; i++) {
float fac = (float)i / (float)it;
- fac = 3.0f * fac * fac - 2.0f * fac * fac * fac; // smooth
+ fac = 3.0f * fac * fac - 2.0f * fac * fac * fac; /* Smooth. */
interp_v4_v4v4(r, from, to, fac);
r = POINTER_OFFSET(r, stride);
}
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index 4db527e5b42..eac6a05d33a 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -1025,7 +1025,7 @@ void BKE_gpencil_modifier_blend_read_lib(BlendLibReader *reader, Object *ob)
BKE_gpencil_modifiers_foreach_ID_link(ob, BKE_object_modifiers_lib_link_common, reader);
/* If linking from a library, clear 'local' library override flag. */
- if (ob->id.lib != NULL) {
+ if (ID_IS_LINKED(ob)) {
LISTBASE_FOREACH (GpencilModifierData *, mod, &ob->greasepencil_modifiers) {
mod->flag &= ~eGpencilModifierFlag_OverrideLibrary_Local;
}
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 8a70f065e40..aac081991e3 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -2038,6 +2038,58 @@ static void nlastrips_to_animdata(ID *id, ListBase *strips)
}
}
+typedef struct Seq_callback_data {
+ Main *bmain;
+ Scene *scene;
+ AnimData *adt;
+} Seq_callback_data;
+
+static bool seq_convert_callback(Sequence *seq, void *userdata)
+{
+ IpoCurve *icu = (seq->ipo) ? seq->ipo->curve.first : NULL;
+ short adrcode = SEQ_FAC1;
+
+ if (G.debug & G_DEBUG) {
+ printf("\tconverting sequence strip %s\n", seq->name + 2);
+ }
+
+ if (ELEM(NULL, seq->ipo, icu)) {
+ seq->flag |= SEQ_USE_EFFECT_DEFAULT_FADE;
+ return true;
+ }
+
+ /* patch adrcode, so that we can map
+ * to different DNA variables later
+ * (semi-hack (tm) )
+ */
+ switch (seq->type) {
+ case SEQ_TYPE_IMAGE:
+ case SEQ_TYPE_META:
+ case SEQ_TYPE_SCENE:
+ case SEQ_TYPE_MOVIE:
+ case SEQ_TYPE_COLOR:
+ adrcode = SEQ_FAC_OPACITY;
+ break;
+ case SEQ_TYPE_SPEED:
+ adrcode = SEQ_FAC_SPEED;
+ break;
+ }
+ icu->adrcode = adrcode;
+
+ Seq_callback_data *cd = (Seq_callback_data *)userdata;
+
+ /* convert IPO */
+ ipo_to_animdata(cd->bmain, (ID *)cd->scene, seq->ipo, NULL, NULL, seq);
+
+ if (cd->adt->action) {
+ cd->adt->action->idroot = ID_SCE; /* scene-rooted */
+ }
+
+ id_us_min(&seq->ipo->id);
+ seq->ipo = NULL;
+ return true;
+}
+
/* *************************************************** */
/* External API - Only Called from do_versions() */
@@ -2286,52 +2338,8 @@ void do_versions_ipos_to_animato(Main *bmain)
Scene *scene = (Scene *)id;
Editing *ed = scene->ed;
if (ed && ed->seqbasep) {
- Sequence *seq;
-
- AnimData *adt = BKE_animdata_ensure_id(id);
-
- SEQ_ALL_BEGIN (ed, seq) {
- IpoCurve *icu = (seq->ipo) ? seq->ipo->curve.first : NULL;
- short adrcode = SEQ_FAC1;
-
- if (G.debug & G_DEBUG) {
- printf("\tconverting sequence strip %s\n", seq->name + 2);
- }
-
- if (ELEM(NULL, seq->ipo, icu)) {
- seq->flag |= SEQ_USE_EFFECT_DEFAULT_FADE;
- continue;
- }
-
- /* patch adrcode, so that we can map
- * to different DNA variables later
- * (semi-hack (tm) )
- */
- switch (seq->type) {
- case SEQ_TYPE_IMAGE:
- case SEQ_TYPE_META:
- case SEQ_TYPE_SCENE:
- case SEQ_TYPE_MOVIE:
- case SEQ_TYPE_COLOR:
- adrcode = SEQ_FAC_OPACITY;
- break;
- case SEQ_TYPE_SPEED:
- adrcode = SEQ_FAC_SPEED;
- break;
- }
- icu->adrcode = adrcode;
-
- /* convert IPO */
- ipo_to_animdata(bmain, (ID *)scene, seq->ipo, NULL, NULL, seq);
-
- if (adt->action) {
- adt->action->idroot = ID_SCE; /* scene-rooted */
- }
-
- id_us_min(&seq->ipo->id);
- seq->ipo = NULL;
- }
- SEQ_ALL_END;
+ Seq_callback_data cb_data = {bmain, scene, BKE_animdata_ensure_id(id)};
+ SEQ_for_each_callback(&ed->seqbase, seq_convert_callback, &cb_data);
}
}
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c
index aa458bc1b27..11e9053df43 100644
--- a/source/blender/blenkernel/intern/lib_id.c
+++ b/source/blender/blenkernel/intern/lib_id.c
@@ -970,7 +970,7 @@ void BKE_main_id_repair_duplicate_names_listbase(ListBase *lb)
{
int lb_len = 0;
LISTBASE_FOREACH (ID *, id, lb) {
- if (id->lib == NULL) {
+ if (!ID_IS_LINKED(id)) {
lb_len += 1;
}
}
@@ -983,7 +983,7 @@ void BKE_main_id_repair_duplicate_names_listbase(ListBase *lb)
GSet *gset = BLI_gset_str_new_ex(__func__, lb_len);
int i = 0;
LISTBASE_FOREACH (ID *, id, lb) {
- if (id->lib == NULL) {
+ if (!ID_IS_LINKED(id)) {
id_array[i] = id;
i++;
}
@@ -1840,7 +1840,7 @@ static void library_make_local_copying_check(ID *id,
from_id = ((Key *)from_id)->from;
}
- if (from_id->lib == NULL) {
+ if (!ID_IS_LINKED(from_id)) {
/* Local user, early out to avoid some gset querying... */
continue;
}
@@ -2068,7 +2068,7 @@ void BKE_library_make_local(Main *bmain,
ID *id = it->link;
BLI_assert(id->newid != NULL);
- BLI_assert(id->lib != NULL);
+ BLI_assert(ID_IS_LINKED(id));
BKE_libblock_remap(bmain, id, id->newid, ID_REMAP_SKIP_INDIRECT_USAGE);
if (old_to_new_ids) {
@@ -2103,7 +2103,7 @@ void BKE_library_make_local(Main *bmain,
bool is_local = false, is_lib = false;
/* Proxies only work when the proxified object is linked-in from a library. */
- if (ob->proxy->id.lib == NULL) {
+ if (!ID_IS_LINKED(ob->proxy)) {
CLOG_WARN(&LOG,
"proxy object %s will lose its link to %s, because the "
"proxified object is local.",
@@ -2221,7 +2221,7 @@ void BKE_id_full_name_get(char name[MAX_ID_FULL_NAME], const ID *id, char separa
{
strcpy(name, id->name + 2);
- if (id->lib != NULL) {
+ if (ID_IS_LINKED(id)) {
const size_t idname_len = strlen(id->name + 2);
const size_t libname_len = strlen(id->lib->id.name + 2);
@@ -2274,7 +2274,7 @@ void BKE_id_full_name_ui_prefix_get(char name[MAX_ID_FULL_NAME_UI],
*/
char *BKE_id_to_unique_string_key(const struct ID *id)
{
- if (id->lib == NULL) {
+ if (!ID_IS_LINKED(id)) {
return BLI_strdup(id->name);
}
diff --git a/source/blender/blenkernel/intern/lib_id_delete.c b/source/blender/blenkernel/intern/lib_id_delete.c
index 43afac5a376..79717fe5f48 100644
--- a/source/blender/blenkernel/intern/lib_id_delete.c
+++ b/source/blender/blenkernel/intern/lib_id_delete.c
@@ -219,7 +219,7 @@ void BKE_id_free_us(Main *bmain, void *idv) /* test users */
* Otherwise, there is no real way to get rid of an object anymore -
* better handling of this is TODO.
*/
- if ((GS(id->name) == ID_OB) && (id->us == 1) && (id->lib == NULL)) {
+ if ((GS(id->name) == ID_OB) && (id->us == 1) && !ID_IS_LINKED(id)) {
id_us_clear_real(id);
}
diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c
index 8083585b594..8c1e04838df 100644
--- a/source/blender/blenkernel/intern/lib_override.c
+++ b/source/blender/blenkernel/intern/lib_override.c
@@ -104,7 +104,7 @@ IDOverrideLibrary *BKE_lib_override_library_init(ID *local_id, ID *reference_id)
{
/* If reference_id is NULL, we are creating an override template for purely local data.
* Else, reference *must* be linked data. */
- BLI_assert(reference_id == NULL || reference_id->lib != NULL);
+ BLI_assert(reference_id == NULL || ID_IS_LINKED(reference_id));
BLI_assert(local_id->override_library == NULL);
ID *ancestor_id;
@@ -286,7 +286,7 @@ ID *BKE_lib_override_library_create_from_id(Main *bmain,
const bool do_tagged_remap)
{
BLI_assert(reference_id != NULL);
- BLI_assert(reference_id->lib != NULL);
+ BLI_assert(ID_IS_LINKED(reference_id));
ID *local_id = lib_override_library_create_from(bmain, reference_id, 0);
@@ -299,7 +299,7 @@ ID *BKE_lib_override_library_create_from_id(Main *bmain,
ID *other_id;
FOREACH_MAIN_ID_BEGIN (bmain, other_id) {
- if ((other_id->tag & LIB_TAG_DOIT) != 0 && other_id->lib == NULL) {
+ if ((other_id->tag & LIB_TAG_DOIT) != 0 && !ID_IS_LINKED(other_id)) {
/* Note that using ID_REMAP_SKIP_INDIRECT_USAGE below is superfluous, as we only remap
* local IDs usages anyway. */
BKE_libblock_relink_ex(bmain,
@@ -830,7 +830,7 @@ static void lib_override_library_create_post_process(Main *bmain,
Collection *default_instantiating_collection = residual_storage;
LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
Object *ob_new = (Object *)ob->id.newid;
- if (ob_new == NULL || ob_new->id.lib != NULL) {
+ if (ob_new == NULL || ID_IS_LINKED(ob_new)) {
continue;
}
@@ -1148,7 +1148,7 @@ bool BKE_lib_override_library_resync(Main *bmain,
/* We need to 'move back' newly created override into its proper library (since it was
* duplicated from the reference ID with 'no main' option, it should currently be the same
* as the reference ID one). */
- BLI_assert(/*id_override_new->lib == NULL || */ id_override_new->lib == id->lib);
+ BLI_assert(/*!ID_IS_LINKED(id_override_new) || */ id_override_new->lib == id->lib);
BLI_assert(id_override_old == NULL || id_override_old->lib == id_root->lib);
id_override_new->lib = id_root->lib;
/* Remap step below will tag directly linked ones properly as needed. */
@@ -1734,8 +1734,7 @@ void BKE_lib_override_library_main_resync(Main *bmain,
#define OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME "OVERRIDE_RESYNC_LEFTOVERS"
Collection *override_resync_residual_storage = BLI_findstring(
&bmain->collections, OVERRIDE_RESYNC_RESIDUAL_STORAGE_NAME, offsetof(ID, name) + 2);
- if (override_resync_residual_storage != NULL &&
- override_resync_residual_storage->id.lib != NULL) {
+ if (override_resync_residual_storage != NULL && ID_IS_LINKED(override_resync_residual_storage)) {
override_resync_residual_storage = NULL;
}
if (override_resync_residual_storage == NULL) {
@@ -2195,7 +2194,7 @@ void BKE_lib_override_library_validate(Main *UNUSED(bmain), ID *id, ReportList *
id->override_library->reference = NULL;
return;
}
- if (id->override_library->reference->lib == NULL) {
+ if (!ID_IS_LINKED(id->override_library->reference)) {
/* Very serious data corruption, cannot do much about it besides removing the reference
* (therefore making the id a local override template one only). */
BKE_reportf(reports,
diff --git a/source/blender/blenkernel/intern/lib_query.c b/source/blender/blenkernel/intern/lib_query.c
index 9400458376d..36cbf35b251 100644
--- a/source/blender/blenkernel/intern/lib_query.c
+++ b/source/blender/blenkernel/intern/lib_query.c
@@ -845,7 +845,7 @@ void BKE_library_indirectly_used_data_tag_clear(Main *bmain)
while (i--) {
LISTBASE_FOREACH (ID *, id, lb_array[i]) {
- if (id->lib == NULL || id->tag & LIB_TAG_DOIT) {
+ if (!ID_IS_LINKED(id) || id->tag & LIB_TAG_DOIT) {
/* Local or non-indirectly-used ID (so far), no need to check it further. */
continue;
}
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 821ca7b98b3..b328a31cda5 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -1573,7 +1573,7 @@ void BKE_modifier_blend_read_lib(BlendLibReader *reader, Object *ob)
BKE_modifiers_foreach_ID_link(ob, BKE_object_modifiers_lib_link_common, reader);
/* If linking from a library, clear 'local' library override flag. */
- if (ob->id.lib != NULL) {
+ if (ID_IS_LINKED(ob)) {
LISTBASE_FOREACH (ModifierData *, mod, &ob->modifiers) {
mod->flag &= ~eModifierFlag_OverrideLibrary_Local;
}
diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c
index 7e524da0f53..4ce2ae3c11f 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -269,7 +269,7 @@ void BKE_nla_tracks_copy(Main *bmain, ListBase *dst, const ListBase *src, const
/* copy each NLA-track, one at a time */
for (nlt = src->first; nlt; nlt = nlt->next) {
/* make a copy, and add the copy to the destination list */
- // XXX: we need to fix this sometime
+ /* XXX: we need to fix this sometime. */
nlt_d = BKE_nlatrack_copy(bmain, nlt, true, flag);
BLI_addtail(dst, nlt_d);
}
@@ -516,7 +516,7 @@ static float nlastrip_get_frame_actionclip(NlaStrip *strip, float cframe, short
if (IS_EQF(strip->repeat, 0.0f)) {
strip->repeat = 1.0f;
}
- // repeat = strip->repeat; // UNUSED
+ // repeat = strip->repeat; /* UNUSED */
/* scaling */
if (IS_EQF(strip->scale, 0.0f)) {
@@ -2344,7 +2344,7 @@ void BKE_nla_blend_read_lib(BlendLibReader *reader, ID *id, ListBase *tracks)
/* we only care about the NLA strips inside the tracks */
LISTBASE_FOREACH (NlaTrack *, nlt, tracks) {
/* If linking from a library, clear 'local' library override flag. */
- if (id->lib != NULL) {
+ if (ID_IS_LINKED(id)) {
nlt->flag &= ~NLATRACK_OVERRIDELIBRARY_LOCAL;
}
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 6e26ed4925d..c91cf6ed926 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -864,7 +864,7 @@ static void object_blend_read_lib(BlendLibReader *reader, ID *id)
BLO_read_id_address(reader, ob->id.lib, &ob->proxy);
if (ob->proxy) {
/* paranoia check, actually a proxy_from pointer should never be written... */
- if (ob->proxy->id.lib == NULL) {
+ if (!ID_IS_LINKED(ob->proxy)) {
ob->proxy->proxy_from = NULL;
ob->proxy = NULL;
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 60edb78f8ba..8986847a034 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -1638,10 +1638,10 @@ static void sph_springs_modify(ParticleSystem *psys, float dtime)
Lij = spring->rest_length;
d = yield_ratio * timefix * Lij;
- if (rij > Lij + d) { // Stretch
+ if (rij > Lij + d) { /* Stretch */
spring->rest_length += plasticity * (rij - Lij - d) * timefix;
}
- else if (rij < Lij - d) { // Compress
+ else if (rij < Lij - d) { /* Compress */
spring->rest_length -= plasticity * (Lij - d - rij) * timefix;
}
@@ -2209,7 +2209,7 @@ static void sph_integrate(ParticleSimulationData *sim,
SPHData *sphdata)
{
ParticleSettings *part = sim->psys->part;
- // float timestep = psys_get_timestep(sim); // UNUSED
+ // float timestep = psys_get_timestep(sim); /* UNUSED */
float pa_mass = part->mass * ((part->flag & PART_SIZEMASS) ? pa->size : 1.0f);
float dtime = dfra * psys_get_timestep(sim);
// int steps = 1; // UNUSED
@@ -2218,7 +2218,7 @@ static void sph_integrate(ParticleSimulationData *sim,
sphdata->pa = pa;
sphdata->mass = pa_mass;
sphdata->pass = 0;
- // sphdata.element_size and sphdata.flow are set in the callback.
+ /* #sphdata.element_size and #sphdata.flow are set in the callback. */
/* Restore previous state and treat gravity & effectors as external acceleration. */
sub_v3_v3v3(effector_acceleration, pa->state.vel, pa->prev_state.vel);
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 5a668746956..6b5c94a2786 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -113,11 +113,7 @@
#include "SEQ_edit.h"
#include "SEQ_iterator.h"
-#include "SEQ_modifier.h"
-#include "SEQ_proxy.h"
-#include "SEQ_relations.h"
#include "SEQ_sequencer.h"
-#include "SEQ_sound.h"
#include "BLO_read_write.h"
@@ -702,6 +698,40 @@ static void scene_foreach_layer_collection(LibraryForeachIDData *data, ListBase
}
}
+static bool seq_foreach_member_id_cb(Sequence *seq, void *user_data)
+{
+ LibraryForeachIDData *data = (LibraryForeachIDData *)user_data;
+
+#define FOREACHID_PROCESS(_data, _id_super, _cb_flag) \
+ { \
+ CHECK_TYPE(&((_id_super)->id), ID *); \
+ if (!BKE_lib_query_foreachid_process((_data), (ID **)&(_id_super), (_cb_flag))) { \
+ return false; \
+ } \
+ } \
+ ((void)0)
+
+ FOREACHID_PROCESS(data, seq->scene, IDWALK_CB_NEVER_SELF);
+ FOREACHID_PROCESS(data, seq->scene_camera, IDWALK_CB_NOP);
+ FOREACHID_PROCESS(data, seq->clip, IDWALK_CB_USER);
+ FOREACHID_PROCESS(data, seq->mask, IDWALK_CB_USER);
+ FOREACHID_PROCESS(data, seq->sound, IDWALK_CB_USER);
+ IDP_foreach_property(
+ seq->prop, IDP_TYPE_FILTER_ID, BKE_lib_query_idpropertiesForeachIDLink_callback, data);
+ LISTBASE_FOREACH (SequenceModifierData *, smd, &seq->modifiers) {
+ FOREACHID_PROCESS(data, smd->mask_id, IDWALK_CB_USER);
+ }
+
+ if (seq->type == SEQ_TYPE_TEXT && seq->effectdata) {
+ TextVars *text_data = seq->effectdata;
+ FOREACHID_PROCESS(data, text_data->text_font, IDWALK_CB_USER);
+ }
+
+#undef FOREACHID_PROCESS
+
+ return true;
+}
+
static void scene_foreach_id(ID *id, LibraryForeachIDData *data)
{
Scene *scene = (Scene *)id;
@@ -717,25 +747,7 @@ static void scene_foreach_id(ID *id, LibraryForeachIDData *data)
BKE_library_foreach_ID_embedded(data, (ID **)&scene->nodetree);
}
if (scene->ed) {
- Sequence *seq;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- BKE_LIB_FOREACHID_PROCESS(data, seq->scene, IDWALK_CB_NEVER_SELF);
- BKE_LIB_FOREACHID_PROCESS(data, seq->scene_camera, IDWALK_CB_NOP);
- BKE_LIB_FOREACHID_PROCESS(data, seq->clip, IDWALK_CB_USER);
- BKE_LIB_FOREACHID_PROCESS(data, seq->mask, IDWALK_CB_USER);
- BKE_LIB_FOREACHID_PROCESS(data, seq->sound, IDWALK_CB_USER);
- IDP_foreach_property(
- seq->prop, IDP_TYPE_FILTER_ID, BKE_lib_query_idpropertiesForeachIDLink_callback, data);
- LISTBASE_FOREACH (SequenceModifierData *, smd, &seq->modifiers) {
- BKE_LIB_FOREACHID_PROCESS(data, smd->mask_id, IDWALK_CB_USER);
- }
-
- if (seq->type == SEQ_TYPE_TEXT && seq->effectdata) {
- TextVars *text_data = seq->effectdata;
- BKE_LIB_FOREACHID_PROCESS(data, text_data->text_font, IDWALK_CB_USER);
- }
- }
- SEQ_ALL_END;
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_foreach_member_id_cb, data);
}
/* This pointer can be NULL during old files reading, better be safe than sorry. */
@@ -883,87 +895,9 @@ static void scene_blend_write(BlendWriter *writer, ID *id, const void *id_addres
Editing *ed = sce->ed;
if (ed) {
- Sequence *seq;
-
BLO_write_struct(writer, Editing, ed);
- /* reset write flags too */
-
- SEQ_ALL_BEGIN (ed, seq) {
- if (seq->strip) {
- seq->strip->done = false;
- }
- BLO_write_struct(writer, Sequence, seq);
- }
- SEQ_ALL_END;
-
- SEQ_ALL_BEGIN (ed, seq) {
- if (seq->strip && seq->strip->done == 0) {
- /* write strip with 'done' at 0 because readfile */
-
- if (seq->effectdata) {
- switch (seq->type) {
- case SEQ_TYPE_COLOR:
- BLO_write_struct(writer, SolidColorVars, seq->effectdata);
- break;
- case SEQ_TYPE_SPEED:
- BLO_write_struct(writer, SpeedControlVars, seq->effectdata);
- break;
- case SEQ_TYPE_WIPE:
- BLO_write_struct(writer, WipeVars, seq->effectdata);
- break;
- case SEQ_TYPE_GLOW:
- BLO_write_struct(writer, GlowVars, seq->effectdata);
- break;
- case SEQ_TYPE_TRANSFORM:
- BLO_write_struct(writer, TransformVars, seq->effectdata);
- break;
- case SEQ_TYPE_GAUSSIAN_BLUR:
- BLO_write_struct(writer, GaussianBlurVars, seq->effectdata);
- break;
- case SEQ_TYPE_TEXT:
- BLO_write_struct(writer, TextVars, seq->effectdata);
- break;
- case SEQ_TYPE_COLORMIX:
- BLO_write_struct(writer, ColorMixVars, seq->effectdata);
- break;
- }
- }
-
- BLO_write_struct(writer, Stereo3dFormat, seq->stereo3d_format);
-
- Strip *strip = seq->strip;
- BLO_write_struct(writer, Strip, strip);
- if (strip->crop) {
- BLO_write_struct(writer, StripCrop, strip->crop);
- }
- if (strip->transform) {
- BLO_write_struct(writer, StripTransform, strip->transform);
- }
- if (strip->proxy) {
- BLO_write_struct(writer, StripProxy, strip->proxy);
- }
- if (seq->type == SEQ_TYPE_IMAGE) {
- BLO_write_struct_array(writer,
- StripElem,
- MEM_allocN_len(strip->stripdata) / sizeof(struct StripElem),
- strip->stripdata);
- }
- else if (ELEM(seq->type, SEQ_TYPE_MOVIE, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) {
- BLO_write_struct(writer, StripElem, strip->stripdata);
- }
-
- strip->done = true;
- }
-
- if (seq->prop) {
- IDP_BlendWrite(writer, seq->prop);
- }
-
- SEQ_modifier_blend_write(writer, &seq->modifiers);
- }
- SEQ_ALL_END;
-
+ SEQ_blend_write(writer, &ed->seqbase);
/* new; meta stack too, even when its nasty restore code */
LISTBASE_FOREACH (MetaStack *, ms, &ed->metastack) {
BLO_write_struct(writer, MetaStack, ms);
@@ -1155,66 +1089,8 @@ static void scene_blend_read_data(BlendDataReader *reader, ID *id)
/* recursive link sequences, lb will be correctly initialized */
link_recurs_seq(reader, &ed->seqbase);
- Sequence *seq;
- SEQ_ALL_BEGIN (ed, seq) {
- /* Do as early as possible, so that other parts of reading can rely on valid session UUID. */
- SEQ_relations_session_uuid_generate(seq);
-
- BLO_read_data_address(reader, &seq->seq1);
- BLO_read_data_address(reader, &seq->seq2);
- BLO_read_data_address(reader, &seq->seq3);
-
- /* a patch: after introduction of effects with 3 input strips */
- if (seq->seq3 == NULL) {
- seq->seq3 = seq->seq2;
- }
-
- BLO_read_data_address(reader, &seq->effectdata);
- BLO_read_data_address(reader, &seq->stereo3d_format);
-
- if (seq->type & SEQ_TYPE_EFFECT) {
- seq->flag |= SEQ_EFFECT_NOT_LOADED;
- }
-
- if (seq->type == SEQ_TYPE_TEXT) {
- TextVars *t = seq->effectdata;
- t->text_blf_id = SEQ_FONT_NOT_LOADED;
- }
-
- BLO_read_data_address(reader, &seq->prop);
- IDP_BlendDataRead(reader, &seq->prop);
-
- BLO_read_data_address(reader, &seq->strip);
- if (seq->strip && seq->strip->done == 0) {
- seq->strip->done = true;
-
- if (ELEM(seq->type,
- SEQ_TYPE_IMAGE,
- SEQ_TYPE_MOVIE,
- SEQ_TYPE_SOUND_RAM,
- SEQ_TYPE_SOUND_HD)) {
- BLO_read_data_address(reader, &seq->strip->stripdata);
- }
- else {
- seq->strip->stripdata = NULL;
- }
- BLO_read_data_address(reader, &seq->strip->crop);
- BLO_read_data_address(reader, &seq->strip->transform);
- BLO_read_data_address(reader, &seq->strip->proxy);
- if (seq->strip->proxy) {
- seq->strip->proxy->anim = NULL;
- }
- else if (seq->flag & SEQ_USE_PROXY) {
- SEQ_proxy_set(seq, true);
- }
-
- /* need to load color balance to it could be converted to modifier */
- BLO_read_data_address(reader, &seq->strip->color_balance);
- }
-
- SEQ_modifier_blend_read_data(reader, &seq->modifiers);
- }
- SEQ_ALL_END;
+ /* Read in sequence member data. */
+ SEQ_blend_read(reader, &ed->seqbase);
/* link metastack, slight abuse of structs here,
* have to restore pointer to internal part in struct */
@@ -1461,50 +1337,9 @@ static void scene_blend_read_lib(BlendLibReader *reader, ID *id)
}
}
- Sequence *seq;
- SEQ_ALL_BEGIN (sce->ed, seq) {
- IDP_BlendReadLib(reader, seq->prop);
-
- if (seq->ipo) {
- /* XXX: deprecated - old animation system. */
- BLO_read_id_address(reader, sce->id.lib, &seq->ipo);
- }
- seq->scene_sound = NULL;
- if (seq->scene) {
- BLO_read_id_address(reader, sce->id.lib, &seq->scene);
- seq->scene_sound = NULL;
- }
- if (seq->clip) {
- BLO_read_id_address(reader, sce->id.lib, &seq->clip);
- }
- if (seq->mask) {
- BLO_read_id_address(reader, sce->id.lib, &seq->mask);
- }
- if (seq->scene_camera) {
- BLO_read_id_address(reader, sce->id.lib, &seq->scene_camera);
- }
- if (seq->sound) {
- seq->scene_sound = NULL;
- if (seq->type == SEQ_TYPE_SOUND_HD) {
- seq->type = SEQ_TYPE_SOUND_RAM;
- }
- else {
- BLO_read_id_address(reader, sce->id.lib, &seq->sound);
- }
- if (seq->sound) {
- id_us_plus_no_lib((ID *)seq->sound);
- seq->scene_sound = NULL;
- }
- }
- if (seq->type == SEQ_TYPE_TEXT) {
- TextVars *t = seq->effectdata;
- BLO_read_id_address(reader, sce->id.lib, &t->text_font);
- }
- BLI_listbase_clear(&seq->anims);
-
- SEQ_modifier_blend_read_lib(reader, sce, &seq->modifiers);
+ if (sce->ed) {
+ SEQ_blend_read_lib(reader, sce, &sce->ed->seqbase);
}
- SEQ_ALL_END;
LISTBASE_FOREACH (TimeMarker *, marker, &sce->markers) {
IDP_BlendReadLib(reader, marker->prop);
@@ -1619,33 +1454,7 @@ static void scene_blend_read_expand(BlendExpander *expander, ID *id)
}
if (sce->ed) {
- Sequence *seq;
-
- SEQ_ALL_BEGIN (sce->ed, seq) {
- IDP_BlendReadExpand(expander, seq->prop);
-
- if (seq->scene) {
- BLO_expand(expander, seq->scene);
- }
- if (seq->scene_camera) {
- BLO_expand(expander, seq->scene_camera);
- }
- if (seq->clip) {
- BLO_expand(expander, seq->clip);
- }
- if (seq->mask) {
- BLO_expand(expander, seq->mask);
- }
- if (seq->sound) {
- BLO_expand(expander, seq->sound);
- }
-
- if (seq->type == SEQ_TYPE_TEXT && seq->effectdata) {
- TextVars *data = seq->effectdata;
- BLO_expand(expander, data->text_font);
- }
- }
- SEQ_ALL_END;
+ SEQ_blend_read_expand(expander, &sce->ed->seqbase);
}
if (sce->rigidbody_world) {
@@ -3547,7 +3356,7 @@ static char *scene_undo_depsgraph_gen_key(Scene *scene, ViewLayer *view_layer, c
}
size_t key_full_offset = BLI_strncpy_rlen(key_full, scene->id.name, MAX_ID_NAME);
- if (scene->id.lib != NULL) {
+ if (ID_IS_LINKED(scene)) {
key_full_offset += BLI_strncpy_rlen(
key_full + key_full_offset, scene->id.lib->filepath, FILE_MAX);
}
@@ -3781,69 +3590,3 @@ void BKE_scene_cursor_from_mat4(View3DCursor *cursor, const float mat[4][4], boo
}
/** \} */
-
-/* Dependency graph evaluation. */
-
-static void scene_sequencer_disable_sound_strips(Scene *scene)
-{
- if (scene->sound_scene == NULL) {
- return;
- }
- Sequence *seq;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- if (seq->scene_sound != NULL) {
- BKE_sound_remove_scene_sound(scene, seq->scene_sound);
- seq->scene_sound = NULL;
- }
- }
- SEQ_ALL_END;
-}
-
-void BKE_scene_eval_sequencer_sequences(Depsgraph *depsgraph, Scene *scene)
-{
- DEG_debug_print_eval(depsgraph, __func__, scene->id.name, scene);
- if (scene->ed == NULL) {
- return;
- }
- BKE_sound_ensure_scene(scene);
- Sequence *seq;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- if (seq->scene_sound == NULL) {
- if (seq->sound != NULL) {
- seq->scene_sound = BKE_sound_add_scene_sound_defaults(scene, seq);
- }
- else if (seq->type == SEQ_TYPE_SCENE) {
- if (seq->scene != NULL) {
- BKE_sound_ensure_scene(seq->scene);
- seq->scene_sound = BKE_sound_scene_add_scene_sound_defaults(scene, seq);
- }
- }
- }
- if (seq->scene_sound != NULL) {
- /* Make sure changing volume via sequence's properties panel works correct.
- *
- * Ideally, the entire BKE_scene_update_sound() will happen from a dependency graph, so
- * then it is no longer needed to do such manual forced updates. */
- if (seq->type == SEQ_TYPE_SCENE && seq->scene != NULL) {
- BKE_sound_set_scene_volume(seq->scene, seq->scene->audio.volume);
- if ((seq->flag & SEQ_SCENE_STRIPS) == 0) {
- scene_sequencer_disable_sound_strips(seq->scene);
- }
- }
- if (seq->sound != NULL) {
- if (scene->id.recalc & ID_RECALC_AUDIO || seq->sound->id.recalc & ID_RECALC_AUDIO) {
- BKE_sound_update_scene_sound(seq->scene_sound, seq->sound);
- }
- }
- BKE_sound_set_scene_sound_volume(
- seq->scene_sound, seq->volume, (seq->flag & SEQ_AUDIO_VOLUME_ANIMATED) != 0);
- BKE_sound_set_scene_sound_pitch(
- seq->scene_sound, seq->pitch, (seq->flag & SEQ_AUDIO_PITCH_ANIMATED) != 0);
- BKE_sound_set_scene_sound_pan(
- seq->scene_sound, seq->pan, (seq->flag & SEQ_AUDIO_PAN_ANIMATED) != 0);
- }
- }
- SEQ_ALL_END;
- SEQ_edit_update_muting(scene->ed);
- SEQ_sound_update_bounds_all(scene);
-}
diff --git a/source/blender/blenkernel/intern/shader_fx.c b/source/blender/blenkernel/intern/shader_fx.c
index 29cbe05f4d1..12017907038 100644
--- a/source/blender/blenkernel/intern/shader_fx.c
+++ b/source/blender/blenkernel/intern/shader_fx.c
@@ -326,7 +326,7 @@ void BKE_shaderfx_blend_read_lib(BlendLibReader *reader, Object *ob)
BKE_shaderfx_foreach_ID_link(ob, BKE_object_modifiers_lib_link_common, reader);
/* If linking from a library, clear 'local' library override flag. */
- if (ob->id.lib != NULL) {
+ if (ID_IS_LINKED(ob)) {
LISTBASE_FOREACH (ShaderFxData *, fx, &ob->shader_fx) {
fx->flag &= ~eShaderFxFlag_OverrideLibrary_Local;
}
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index c2ab91251b6..7f1f6590e48 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -1888,8 +1888,9 @@ void txt_delete_char(Text *text)
}
}
else { /* Just deleting a char */
- size_t c_len = 0;
- c = BLI_str_utf8_as_unicode_and_size(text->curl->line + text->curc, &c_len);
+ size_t c_len = text->curc;
+ c = BLI_str_utf8_as_unicode_step(text->curl->line, text->curl->len, &c_len);
+ c_len -= text->curc;
UNUSED_VARS(c);
memmove(text->curl->line + text->curc,
@@ -1937,9 +1938,11 @@ void txt_backspace_char(Text *text)
txt_pop_sel(text);
}
else { /* Just backspacing a char */
- size_t c_len = 0;
const char *prev = BLI_str_prev_char_utf8(text->curl->line + text->curc);
- c = BLI_str_utf8_as_unicode_and_size(prev, &c_len);
+ size_t c_len = prev - text->curl->line;
+ c = BLI_str_utf8_as_unicode_step(text->curl->line, text->curl->len, &c_len);
+ c_len -= prev - text->curl->line;
+
UNUSED_VARS(c);
/* source and destination overlap, don't use memcpy() */
@@ -2053,7 +2056,9 @@ bool txt_replace_char(Text *text, unsigned int add)
return txt_add_char(text, add);
}
- del = BLI_str_utf8_as_unicode_and_size(text->curl->line + text->curc, &del_size);
+ del_size = text->curc;
+ del = BLI_str_utf8_as_unicode_step(text->curl->line, text->curl->len, &del_size);
+ del_size -= text->curc;
UNUSED_VARS(del);
add_size = BLI_str_utf8_from_unicode(add, ch);
diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c
index e524bd254bb..0ca2b97b4ef 100644
--- a/source/blender/blenkernel/intern/undo_system.c
+++ b/source/blender/blenkernel/intern/undo_system.c
@@ -145,7 +145,7 @@ static void undosys_id_ref_resolve(void *user_data, UndoRefID *id_ref)
Main *bmain = user_data;
ListBase *lb = which_libbase(bmain, GS(id_ref->name));
LISTBASE_FOREACH (ID *, id, lb) {
- if (STREQ(id_ref->name, id->name) && (id->lib == NULL)) {
+ if (STREQ(id_ref->name, id->name) && !ID_IS_LINKED(id)) {
id_ref->ptr = id;
break;
}
diff --git a/source/blender/blenlib/BLI_string_utf8.h b/source/blender/blenlib/BLI_string_utf8.h
index b936e39731d..a9cb13a3277 100644
--- a/source/blender/blenlib/BLI_string_utf8.h
+++ b/source/blender/blenlib/BLI_string_utf8.h
@@ -28,78 +28,88 @@ extern "C" {
#endif
char *BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t maxncpy)
- ATTR_NONNULL();
-size_t BLI_strncpy_utf8_rlen(char *__restrict dst, const char *__restrict src, size_t maxncpy)
- ATTR_NONNULL();
-ptrdiff_t BLI_str_utf8_invalid_byte(const char *str, size_t length) ATTR_NONNULL();
-int BLI_str_utf8_invalid_strip(char *str, size_t length) ATTR_NONNULL();
+ ATTR_NONNULL(1, 2);
+size_t BLI_strncpy_utf8_rlen(char *__restrict dst,
+ const char *__restrict src,
+ size_t maxncpy) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2);
+ptrdiff_t BLI_str_utf8_invalid_byte(const char *str, size_t length) ATTR_NONNULL(1);
+int BLI_str_utf8_invalid_strip(char *str, size_t length) ATTR_NONNULL(1);
/* warning, can return -1 on bad chars */
-int BLI_str_utf8_size(const char *p) ATTR_NONNULL();
-int BLI_str_utf8_size_safe(const char *p) ATTR_NONNULL();
+int BLI_str_utf8_size(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
+int BLI_str_utf8_size_safe(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
/* copied from glib */
-unsigned int BLI_str_utf8_as_unicode(const char *p) ATTR_NONNULL();
-unsigned int BLI_str_utf8_as_unicode_and_size(const char *__restrict p, size_t *__restrict index)
- ATTR_NONNULL();
-unsigned int BLI_str_utf8_as_unicode_and_size_safe(const char *__restrict p,
- size_t *__restrict index) ATTR_NONNULL();
+unsigned int BLI_str_utf8_as_unicode(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
unsigned int BLI_str_utf8_as_unicode_step(const char *__restrict p,
size_t p_len,
- size_t *__restrict index) ATTR_NONNULL(1, 3);
+ size_t *__restrict index) ATTR_WARN_UNUSED_RESULT
+ ATTR_NONNULL(1, 3);
+unsigned int BLI_str_utf8_as_unicode_step_or_error(
+ const char *__restrict p, size_t p_len, size_t *__restrict index) ATTR_WARN_UNUSED_RESULT
+ ATTR_NONNULL(1, 3);
size_t BLI_str_utf8_from_unicode(unsigned int c, char *outbuf);
size_t BLI_str_utf8_as_utf32(char32_t *__restrict dst_w,
const char *__restrict src_c,
- const size_t maxncpy) ATTR_NONNULL();
+ const size_t maxncpy) ATTR_NONNULL(1, 2);
size_t BLI_str_utf32_as_utf8(char *__restrict dst,
const char32_t *__restrict src,
- const size_t maxncpy) ATTR_NONNULL();
-size_t BLI_str_utf32_as_utf8_len(const char32_t *src) ATTR_NONNULL();
+ const size_t maxncpy) ATTR_NONNULL(1, 2);
+size_t BLI_str_utf32_as_utf8_len(const char32_t *src) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
-char *BLI_str_find_prev_char_utf8(const char *str, const char *p) ATTR_NONNULL();
-char *BLI_str_find_next_char_utf8(const char *p, const char *end) ATTR_NONNULL(1);
-char *BLI_str_prev_char_utf8(const char *p) ATTR_NONNULL();
+char *BLI_str_find_prev_char_utf8(const char *str, const char *p) ATTR_WARN_UNUSED_RESULT
+ ATTR_NONNULL(1, 2);
+char *BLI_str_find_next_char_utf8(const char *p, const char *end) ATTR_WARN_UNUSED_RESULT
+ ATTR_NONNULL(1);
+char *BLI_str_prev_char_utf8(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
/* wchar_t functions, copied from blenders own font.c originally */
-size_t BLI_wstrlen_utf8(const wchar_t *src) ATTR_NONNULL();
-size_t BLI_strlen_utf8_ex(const char *strc, size_t *r_len_bytes) ATTR_NONNULL();
-size_t BLI_strlen_utf8(const char *strc) ATTR_NONNULL();
+size_t BLI_wstrlen_utf8(const wchar_t *src) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
+size_t BLI_strlen_utf8_ex(const char *strc, size_t *r_len_bytes)
+ ATTR_NONNULL(1, 2) ATTR_WARN_UNUSED_RESULT;
+size_t BLI_strlen_utf8(const char *strc) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
size_t BLI_strnlen_utf8_ex(const char *strc, const size_t maxlen, size_t *r_len_bytes)
- ATTR_NONNULL();
-size_t BLI_strnlen_utf8(const char *strc, const size_t maxlen) ATTR_NONNULL();
+ ATTR_NONNULL(1, 3);
+size_t BLI_strnlen_utf8(const char *strc, const size_t maxlen)
+ ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT;
size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst,
const wchar_t *__restrict src,
- const size_t maxncpy) ATTR_NONNULL();
+ const size_t maxncpy) ATTR_NONNULL(1, 2);
size_t BLI_strncpy_wchar_from_utf8(wchar_t *__restrict dst,
const char *__restrict src,
- const size_t maxncpy) ATTR_NONNULL();
+ const size_t maxncpy) ATTR_NONNULL(1, 2);
/* count columns that character/string occupies, based on wcwidth.c */
-int BLI_wcwidth(char32_t ucs);
-int BLI_wcswidth(const char32_t *pwcs, size_t n) ATTR_NONNULL();
+int BLI_wcwidth(char32_t ucs) ATTR_WARN_UNUSED_RESULT;
+int BLI_wcswidth(const char32_t *pwcs, size_t n) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
/* warning, can return -1 on bad chars */
-int BLI_str_utf8_char_width(const char *p) ATTR_NONNULL();
-int BLI_str_utf8_char_width_safe(const char *p) ATTR_NONNULL();
+int BLI_str_utf8_char_width(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
+int BLI_str_utf8_char_width_safe(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
size_t BLI_str_partition_utf8(const char *str,
const unsigned int delim[],
const char **sep,
- const char **suf) ATTR_NONNULL();
+ const char **suf) ATTR_NONNULL(1, 2, 3, 4);
size_t BLI_str_rpartition_utf8(const char *str,
const unsigned int delim[],
const char **sep,
- const char **suf) ATTR_NONNULL();
+ const char **suf) ATTR_NONNULL(1, 2, 3, 4);
size_t BLI_str_partition_ex_utf8(const char *str,
const char *end,
const unsigned int delim[],
const char **sep,
const char **suf,
- const bool from_right) ATTR_NONNULL(1, 3, 4, 5);
+ const bool from_right) ATTR_WARN_UNUSED_RESULT
+ ATTR_NONNULL(1, 3, 4, 5);
-int BLI_str_utf8_offset_to_index(const char *str, int offset);
-int BLI_str_utf8_offset_from_index(const char *str, int index);
-int BLI_str_utf8_offset_to_column(const char *str, int offset);
-int BLI_str_utf8_offset_from_column(const char *str, int column);
+int BLI_str_utf8_offset_to_index(const char *str, int offset) ATTR_WARN_UNUSED_RESULT
+ ATTR_NONNULL(1);
+int BLI_str_utf8_offset_from_index(const char *str, int index) ATTR_WARN_UNUSED_RESULT
+ ATTR_NONNULL(1);
+int BLI_str_utf8_offset_to_column(const char *str, int offset) ATTR_WARN_UNUSED_RESULT
+ ATTR_NONNULL(1);
+int BLI_str_utf8_offset_from_column(const char *str, int column) ATTR_WARN_UNUSED_RESULT
+ ATTR_NONNULL(1);
#define BLI_UTF8_MAX 6 /* mem */
#define BLI_UTF8_WIDTH_MAX 2 /* columns */
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index f98d15ad08b..24178535068 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -199,8 +199,8 @@ set(SRC
BLI_enumerable_thread_specific.hh
BLI_expr_pylike_eval.h
BLI_fileops.h
- BLI_filereader.h
BLI_fileops_types.h
+ BLI_filereader.h
BLI_float2.hh
BLI_float3.hh
BLI_float4x4.hh
diff --git a/source/blender/blenlib/intern/string_cursor_utf8.c b/source/blender/blenlib/intern/string_cursor_utf8.c
index 90fde02b11f..f76a3114e09 100644
--- a/source/blender/blenlib/intern/string_cursor_utf8.c
+++ b/source/blender/blenlib/intern/string_cursor_utf8.c
@@ -101,11 +101,14 @@ static eStrCursorDelimType cursor_delim_type_unicode(const uint uch)
return STRCUR_DELIM_ALPHANUMERIC; /* Not quite true, but ok for now */
}
-static eStrCursorDelimType cursor_delim_type_utf8(const char *ch_utf8)
+static eStrCursorDelimType cursor_delim_type_utf8(const char *ch_utf8,
+ const size_t ch_utf8_len,
+ const int pos)
{
/* for full unicode support we really need to have large lookup tables to figure
* out what's what in every possible char set - and python, glib both have these. */
- uint uch = BLI_str_utf8_as_unicode(ch_utf8);
+ size_t index = (size_t)pos;
+ uint uch = BLI_str_utf8_as_unicode_step_or_error(ch_utf8, ch_utf8_len, &index);
return cursor_delim_type_unicode(uch);
}
@@ -157,14 +160,19 @@ void BLI_str_cursor_step_utf8(const char *str,
}
if (jump != STRCUR_JUMP_NONE) {
- const eStrCursorDelimType delim_type = (*pos) < maxlen ? cursor_delim_type_utf8(&str[*pos]) :
- STRCUR_DELIM_NONE;
+ const eStrCursorDelimType delim_type = (*pos) < maxlen ?
+ cursor_delim_type_utf8(str, maxlen, *pos) :
+ STRCUR_DELIM_NONE;
/* jump between special characters (/,\,_,-, etc.),
* look at function cursor_delim_type() for complete
* list of special character, ctr -> */
while ((*pos) < maxlen) {
if (BLI_str_cursor_step_next_utf8(str, maxlen, pos)) {
- if ((jump != STRCUR_JUMP_ALL) && (delim_type != cursor_delim_type_utf8(&str[*pos]))) {
+ if (*pos == maxlen) {
+ break;
+ }
+ if ((jump != STRCUR_JUMP_ALL) &&
+ (delim_type != cursor_delim_type_utf8(str, maxlen, *pos))) {
break;
}
}
@@ -184,7 +192,7 @@ void BLI_str_cursor_step_utf8(const char *str,
if (jump != STRCUR_JUMP_NONE) {
const eStrCursorDelimType delim_type = (*pos) > 0 ?
- cursor_delim_type_utf8(&str[(*pos) - 1]) :
+ cursor_delim_type_utf8(str, maxlen, *pos - 1) :
STRCUR_DELIM_NONE;
/* jump between special characters (/,\,_,-, etc.),
* look at function cursor_delim_type() for complete
@@ -192,7 +200,8 @@ void BLI_str_cursor_step_utf8(const char *str,
while ((*pos) > 0) {
const int pos_prev = *pos;
if (BLI_str_cursor_step_prev_utf8(str, maxlen, pos)) {
- if ((jump != STRCUR_JUMP_ALL) && (delim_type != cursor_delim_type_utf8(&str[*pos]))) {
+ if ((jump != STRCUR_JUMP_ALL) &&
+ (delim_type != cursor_delim_type_utf8(str, maxlen, (size_t)*pos))) {
/* left only: compensate for index/change in direction */
if ((pos_orig - (*pos)) >= 1) {
*pos = pos_prev;
diff --git a/source/blender/blenlib/intern/string_search.cc b/source/blender/blenlib/intern/string_search.cc
index 25a13674932..a466c124073 100644
--- a/source/blender/blenlib/intern/string_search.cc
+++ b/source/blender/blenlib/intern/string_search.cc
@@ -71,12 +71,12 @@ int damerau_levenshtein_distance(StringRef a, StringRef b)
for (const int i : IndexRange(size_a)) {
v2[0] = (i + 1) * deletion_cost;
- const uint32_t unicode_a = BLI_str_utf8_as_unicode_and_size(a.data() + offset_a, &offset_a);
+ const uint32_t unicode_a = BLI_str_utf8_as_unicode_step(a.data(), a.size(), &offset_a);
uint32_t prev_unicode_b;
size_t offset_b = 0;
for (const int j : IndexRange(size_b)) {
- const uint32_t unicode_b = BLI_str_utf8_as_unicode_and_size(b.data() + offset_b, &offset_b);
+ const uint32_t unicode_b = BLI_str_utf8_as_unicode_step(b.data(), b.size(), &offset_b);
/* Check how costly the different operations would be and pick the cheapest - the one with
* minimal cost. */
@@ -202,8 +202,8 @@ static bool match_word_initials(StringRef query,
int first_found_word_index = -1;
while (query_index < query.size()) {
- const uint query_unicode = BLI_str_utf8_as_unicode_and_size(query.data() + query_index,
- &query_index);
+ const uint query_unicode = BLI_str_utf8_as_unicode_step(
+ query.data(), query.size(), &query_index);
while (true) {
/* We are at the end of words, no complete match has been found yet. */
if (word_index >= words.size()) {
@@ -226,8 +226,8 @@ static bool match_word_initials(StringRef query,
StringRef word = words[word_index];
/* Try to match the current character with the current word. */
if (static_cast<int>(char_index) < word.size()) {
- const uint32_t char_unicode = BLI_str_utf8_as_unicode_and_size(word.data() + char_index,
- &char_index);
+ const uint32_t char_unicode = BLI_str_utf8_as_unicode_step(
+ word.data(), word.size(), &char_index);
if (query_unicode == char_unicode) {
r_word_is_matched[word_index] = true;
if (first_found_word_index == -1) {
@@ -368,8 +368,9 @@ void extract_normalized_words(StringRef str,
size_t word_start = 0;
size_t offset = 0;
while (offset < str_size_in_bytes) {
- size_t size = 0;
- uint32_t unicode = BLI_str_utf8_as_unicode_and_size(str.data() + offset, &size);
+ size_t size = offset;
+ uint32_t unicode = BLI_str_utf8_as_unicode_step(str.data(), str.size(), &size);
+ size -= offset;
if (is_separator(unicode)) {
if (is_in_word) {
r_words.append(
diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c
index dbde5221d7e..e35e2bcca3c 100644
--- a/source/blender/blenlib/intern/string_utf8.c
+++ b/source/blender/blenlib/intern/string_utf8.c
@@ -297,8 +297,8 @@ size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst,
const size_t maxncpy)
{
const size_t maxlen = maxncpy - 1;
- /* 6 is max utf8 length of an unicode char. */
- const int64_t maxlen_secured = (int64_t)maxlen - 6;
+ /* #BLI_UTF8_MAX is max utf8 length of an unicode char. */
+ const int64_t maxlen_secured = (int64_t)maxlen - BLI_UTF8_MAX;
size_t len = 0;
BLI_assert(maxncpy != 0);
@@ -314,9 +314,9 @@ size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst,
/* We have to be more careful for the last six bytes,
* to avoid buffer overflow in case utf8-encoded char would be too long for our dst buffer. */
while (*src) {
- char t[6];
+ char t[BLI_UTF8_MAX];
size_t l = BLI_str_utf8_from_unicode((uint)*src++, t);
- BLI_assert(l <= 6);
+ BLI_assert(l <= BLI_UTF8_MAX);
if (len + l > maxlen) {
break;
}
@@ -546,104 +546,63 @@ uint BLI_str_utf8_as_unicode(const char *p)
return result;
}
-/* variant that increments the length */
-uint BLI_str_utf8_as_unicode_and_size(const char *__restrict p, size_t *__restrict index)
+/**
+ * UTF8 decoding that steps over the index (unless an error is encountered).
+ *
+ * \param p: The text to step over.
+ * \param p_len: The length of `p`.
+ * \param index: Index of `p` to step over.
+ * \return the code-point or #BLI_UTF8_ERR if there is a decoding error.
+ *
+ * \note The behavior for clipped text (where `p_len` limits decoding trailing bytes)
+ * must have the same behavior is encountering a nil byte,
+ * so functions that only use the first part of a string has matching behavior to functions
+ * that null terminate the text.
+ */
+uint BLI_str_utf8_as_unicode_step_or_error(const char *__restrict p,
+ const size_t p_len,
+ size_t *__restrict index)
{
int i, len;
uint mask = 0;
uint result;
- const unsigned char c = (unsigned char)*p;
+ const unsigned char c = (unsigned char)*(p += *index);
+
+ BLI_assert(*index < p_len);
+ BLI_assert(c != '\0');
UTF8_COMPUTE(c, mask, len, -1);
- if (UNLIKELY(len == -1)) {
+ if (UNLIKELY(len == -1) || (*index + (size_t)len > p_len)) {
return BLI_UTF8_ERR;
}
UTF8_GET(result, p, i, mask, len, BLI_UTF8_ERR);
- *index += (size_t)len;
- return result;
-}
-
-uint BLI_str_utf8_as_unicode_and_size_safe(const char *__restrict p, size_t *__restrict index)
-{
- int i, len;
- uint mask = 0;
- uint result;
- const unsigned char c = (unsigned char)*p;
-
- UTF8_COMPUTE(c, mask, len, -1);
- if (UNLIKELY(len == -1)) {
- *index += 1;
- return c;
+ if (UNLIKELY(result == BLI_UTF8_ERR)) {
+ return BLI_UTF8_ERR;
}
- UTF8_GET(result, p, i, mask, len, BLI_UTF8_ERR);
*index += (size_t)len;
+ BLI_assert(*index <= p_len);
return result;
}
/**
- * Another variant that steps over the index.
+ * UTF8 decoding that steps over the index (unless an error is encountered).
*
* \param p: The text to step over.
* \param p_len: The length of `p`.
* \param index: Index of `p` to step over.
+ * \return the code-point `(p + *index)` if there is a decoding error.
*
- * \note currently this also falls back to latin1 for text drawing.
- *
- * \note The behavior for clipped text (where `p_len` limits decoding trailing bytes)
- * must have the same behavior is encountering a nil byte,
- * so functions that only use the first part of a string has matching behavior to functions
- * that null terminate the text.
+ * \note Falls back to `LATIN1` for text drawing.
*/
uint BLI_str_utf8_as_unicode_step(const char *__restrict p,
const size_t p_len,
size_t *__restrict index)
{
- int i, len;
- uint mask = 0;
- uint result;
- const char c = p[*index];
-
- BLI_assert(*index < p_len);
- BLI_assert(c != '\0');
-
- UTF8_COMPUTE(c, mask, len, -1);
- if (UNLIKELY(len == -1)) {
- const char *p_next = BLI_str_find_next_char_utf8(p + *index, p + p_len);
- /* #BLI_str_find_next_char_utf8 ensures the nil byte will terminate.
- * so there is no chance this sets the index past the nil byte (assert this is the case). */
- BLI_assert(p_next || (memchr(p + *index, '\0', p_len - *index) == NULL));
- len = (int)((p_next ? (size_t)(p_next - p) : p_len) - *index);
- result = BLI_UTF8_ERR;
- }
- else if (UNLIKELY(*index + (size_t)len > p_len)) {
- /* A multi-byte character reads past the buffer bounds,
- * match the behavior of encountering an byte with invalid encoding below. */
- len = 1;
- result = (uint)c;
- }
- else {
- /* This is tricky since there are a few ways we can bail out of bad unicode
- * values, 3 possible solutions. */
- p += *index;
-#if 0
- UTF8_GET(result, p, i, mask, len, BLI_UTF8_ERR);
-#elif 1
- /* WARNING: this is NOT part of glib, or supported by similar functions.
- * this is added for text drawing because some filepaths can have latin1
- * characters */
- UTF8_GET(result, p, i, mask, len, BLI_UTF8_ERR);
- if (result == BLI_UTF8_ERR) {
- len = 1;
- result = (uint)c;
- }
- /* end warning! */
-#else
- /* Without a fallback like '?', text drawing will stop on this value. */
- UTF8_GET(result, p, i, mask, len, '?');
-#endif
+ uint result = BLI_str_utf8_as_unicode_step_or_error(p, p_len, index);
+ if (UNLIKELY(result == BLI_UTF8_ERR)) {
+ result = (uint)p[*index];
+ *index += 1;
}
-
- *index += (size_t)len;
BLI_assert(*index <= p_len);
return result;
}
@@ -716,16 +675,23 @@ size_t BLI_str_utf8_as_utf32(char32_t *__restrict dst_w,
memset(dst_w, 0xff, sizeof(*dst_w) * maxncpy);
#endif
- while (*src_c && len != maxlen) {
- size_t step = 0;
- uint unicode = BLI_str_utf8_as_unicode_and_size(src_c, &step);
+ const size_t src_c_len = strlen(src_c);
+ const char *src_c_end = src_c + src_c_len;
+ size_t index = 0;
+ while ((index < src_c_len) && (len != maxlen)) {
+ const uint unicode = BLI_str_utf8_as_unicode_step_or_error(src_c, src_c_len, &index);
if (unicode != BLI_UTF8_ERR) {
*dst_w = unicode;
- src_c += step;
}
else {
*dst_w = '?';
- src_c = BLI_str_find_next_char_utf8(src_c, NULL);
+ const char *src_c_next = BLI_str_find_next_char_utf8(src_c + index, src_c_end);
+ if (src_c_next != NULL) {
+ index = (size_t)(src_c_next - src_c);
+ }
+ else {
+ index += 1;
+ }
}
dst_w++;
len++;
@@ -741,8 +707,8 @@ size_t BLI_str_utf32_as_utf8(char *__restrict dst,
const size_t maxncpy)
{
const size_t maxlen = maxncpy - 1;
- /* 6 is max utf8 length of an unicode char. */
- const int64_t maxlen_secured = (int64_t)maxlen - 6;
+ /* #BLI_UTF8_MAX is max utf8 length of an unicode char. */
+ const int64_t maxlen_secured = (int64_t)maxlen - BLI_UTF8_MAX;
size_t len = 0;
BLI_assert(maxncpy != 0);
@@ -758,9 +724,9 @@ size_t BLI_str_utf32_as_utf8(char *__restrict dst,
/* We have to be more careful for the last six bytes,
* to avoid buffer overflow in case utf8-encoded char would be too long for our dst buffer. */
while (*src) {
- char t[6];
+ char t[BLI_UTF8_MAX];
size_t l = BLI_str_utf8_from_unicode((uint)*src++, t);
- BLI_assert(l <= 6);
+ BLI_assert(l <= BLI_UTF8_MAX);
if (len + l > maxlen) {
break;
}
@@ -905,7 +871,9 @@ size_t BLI_str_partition_ex_utf8(const char *str,
index = 0;
*sep >= str && (!end || *sep < end) && **sep != '\0';
*sep = (char *)(from_right ? BLI_str_find_prev_char_utf8(str, *sep) : str + index)) {
- const uint c = BLI_str_utf8_as_unicode_and_size(*sep, &index);
+ size_t index_ofs = 0;
+ const uint c = BLI_str_utf8_as_unicode_step_or_error(*sep, (size_t)(end - *sep), &index_ofs);
+ index += index_ofs;
if (c == BLI_UTF8_ERR) {
*suf = *sep = NULL;
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index dbdb181281a..4b7f29dd7dc 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -172,6 +172,9 @@ struct LinkNode *BLO_blendhandle_get_datablock_info(BlendHandle *bh,
int ofblocktype,
int *r_tot_info_items);
struct LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *r_tot_prev);
+struct PreviewImage *BLO_blendhandle_get_preview_for_id(BlendHandle *bh,
+ int ofblocktype,
+ const char *name);
struct LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh);
void BLO_blendhandle_close(BlendHandle *bh);
diff --git a/source/blender/blenloader/intern/blend_validate.c b/source/blender/blenloader/intern/blend_validate.c
index 5b093223fda..7d641d976e3 100644
--- a/source/blender/blenloader/intern/blend_validate.c
+++ b/source/blender/blenloader/intern/blend_validate.c
@@ -64,7 +64,7 @@ bool BLO_main_validate_libraries(Main *bmain, ReportList *reports)
int i = set_listbasepointers(bmain, lbarray);
while (i--) {
for (ID *id = lbarray[i]->first; id != NULL; id = id->next) {
- if (id->lib != NULL) {
+ if (ID_IS_LINKED(id)) {
is_valid = false;
BKE_reportf(reports,
RPT_ERROR,
@@ -115,7 +115,7 @@ bool BLO_main_validate_libraries(Main *bmain, ReportList *reports)
int totnames = 0;
LinkNode *names = BLO_blendhandle_get_datablock_names(bh, GS(id->name), false, &totnames);
for (; id != NULL; id = id->next) {
- if (id->lib == NULL) {
+ if (!ID_IS_LINKED(id)) {
is_valid = false;
BKE_reportf(reports,
RPT_ERROR,
@@ -179,7 +179,7 @@ bool BLO_main_validate_shapekeys(Main *bmain, ReportList *reports)
if (!BKE_key_idtype_support(GS(id->name))) {
break;
}
- if (id->lib == NULL) {
+ if (!ID_IS_LINKED(id)) {
/* We assume lib data is valid... */
Key *shapekey = BKE_key_from_id(id);
if (shapekey != NULL && shapekey->from != id) {
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c
index 44a26b9bf85..f67ff0f7ac7 100644
--- a/source/blender/blenloader/intern/readblenentry.c
+++ b/source/blender/blenloader/intern/readblenentry.c
@@ -217,6 +217,96 @@ LinkNode *BLO_blendhandle_get_datablock_info(BlendHandle *bh,
}
/**
+ * Read the preview rects and store in `result`.
+ *
+ * `bhead` should point to the block that sourced the `preview_from_file`
+ * parameter.
+ * `bhead` parameter is consumed. The correct bhead pointing to the next bhead in the file after
+ * the preview rects is returned by this function.
+ * \param fd: The filedata to read the data from.
+ * \param bhead: should point to the block that sourced the `preview_from_file parameter`.
+ * bhead is consumed. the new bhead is returned by this function.
+ * \param result: the Preview Image where the preview rect will be stored.
+ * \param preview_from_file: The read PreviewImage where the bhead points to. The rects of this
+ * \return PreviewImage or NULL when no preview Images have been found. Caller owns the returned
+ */
+static BHead *blo_blendhandle_read_preview_rects(FileData *fd,
+ BHead *bhead,
+ PreviewImage *result,
+ const PreviewImage *preview_from_file)
+{
+ for (int preview_index = 0; preview_index < NUM_ICON_SIZES; preview_index++) {
+ if (preview_from_file->rect[preview_index] && preview_from_file->w[preview_index] &&
+ preview_from_file->h[preview_index]) {
+ bhead = blo_bhead_next(fd, bhead);
+ BLI_assert((preview_from_file->w[preview_index] * preview_from_file->h[preview_index] *
+ sizeof(uint)) == bhead->len);
+ result->rect[preview_index] = BLO_library_read_struct(fd, bhead, "PreviewImage Icon Rect");
+ }
+ else {
+ /* This should not be needed, but can happen in 'broken' .blend files,
+ * better handle this gracefully than crashing. */
+ BLI_assert(preview_from_file->rect[preview_index] == NULL &&
+ preview_from_file->w[preview_index] == 0 &&
+ preview_from_file->h[preview_index] == 0);
+ result->rect[preview_index] = NULL;
+ result->w[preview_index] = result->h[preview_index] = 0;
+ }
+ BKE_previewimg_finish(result, preview_index);
+ }
+
+ return bhead;
+}
+
+/**
+ * Get the PreviewImage of a single data block in a file.
+ * (e.g. all the scene previews in a file).
+ *
+ * \param bh: The blendhandle to access.
+ * \param ofblocktype: The type of names to get.
+ * \param name: Name of the block without the ID_ prefix, to read the preview image from.
+ * \return PreviewImage or NULL when no preview Images have been found. Caller owns the returned
+ */
+PreviewImage *BLO_blendhandle_get_preview_for_id(BlendHandle *bh,
+ int ofblocktype,
+ const char *name)
+{
+ FileData *fd = (FileData *)bh;
+ bool looking = false;
+ const int sdna_preview_image = DNA_struct_find_nr(fd->filesdna, "PreviewImage");
+
+ for (BHead *bhead = blo_bhead_first(fd); bhead; bhead = blo_bhead_next(fd, bhead)) {
+ if (bhead->code == DATA) {
+ if (looking && bhead->SDNAnr == sdna_preview_image) {
+ PreviewImage *preview_from_file = BLO_library_read_struct(fd, bhead, "PreviewImage");
+
+ if (preview_from_file == NULL) {
+ break;
+ }
+
+ PreviewImage *result = MEM_dupallocN(preview_from_file);
+ bhead = blo_blendhandle_read_preview_rects(fd, bhead, result, preview_from_file);
+ MEM_freeN(preview_from_file);
+ return result;
+ }
+ }
+ else if (looking || bhead->code == ENDB) {
+ /* We were looking for a preview image, but didn't find any belonging to block. So it doesn't
+ * exist. */
+ break;
+ }
+ else if (bhead->code == ofblocktype) {
+ const char *idname = blo_bhead_id_name(fd, bhead);
+ if (STREQ(&idname[2], name)) {
+ looking = true;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+/**
* Gets the previews of all the data-blocks in a file of a certain type
* (e.g. all the scene previews in a file).
*
@@ -264,33 +354,7 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype, int *r_
if (prv) {
memcpy(new_prv, prv, sizeof(PreviewImage));
- if (prv->rect[0] && prv->w[0] && prv->h[0]) {
- bhead = blo_bhead_next(fd, bhead);
- BLI_assert((new_prv->w[0] * new_prv->h[0] * sizeof(uint)) == bhead->len);
- new_prv->rect[0] = BLO_library_read_struct(fd, bhead, "PreviewImage Icon Rect");
- }
- else {
- /* This should not be needed, but can happen in 'broken' .blend files,
- * better handle this gracefully than crashing. */
- BLI_assert(prv->rect[0] == NULL && prv->w[0] == 0 && prv->h[0] == 0);
- new_prv->rect[0] = NULL;
- new_prv->w[0] = new_prv->h[0] = 0;
- }
- BKE_previewimg_finish(new_prv, 0);
-
- if (prv->rect[1] && prv->w[1] && prv->h[1]) {
- bhead = blo_bhead_next(fd, bhead);
- BLI_assert((new_prv->w[1] * new_prv->h[1] * sizeof(uint)) == bhead->len);
- new_prv->rect[1] = BLO_library_read_struct(fd, bhead, "PreviewImage Image Rect");
- }
- else {
- /* This should not be needed, but can happen in 'broken' .blend files,
- * better handle this gracefully than crashing. */
- BLI_assert(prv->rect[1] == NULL && prv->w[1] == 0 && prv->h[1] == 0);
- new_prv->rect[1] = NULL;
- new_prv->w[1] = new_prv->h[1] = 0;
- }
- BKE_previewimg_finish(new_prv, 1);
+ bhead = blo_blendhandle_read_preview_rects(fd, bhead, new_prv, prv);
MEM_freeN(prv);
}
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 49c3497f996..3e9ea8db758 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -1625,7 +1625,7 @@ static void change_link_placeholder_to_real_ID_pointer(ListBase *mainlist,
void blo_clear_proxy_pointers_from_lib(Main *oldmain)
{
LISTBASE_FOREACH (Object *, ob, &oldmain->objects) {
- if (ob->id.lib != NULL && ob->proxy_from != NULL && ob->proxy_from->id.lib == NULL) {
+ if (ID_IS_LINKED(ob) && ob->proxy_from != NULL && !ID_IS_LINKED(ob->proxy_from)) {
ob->proxy_from = NULL;
}
}
@@ -2419,7 +2419,7 @@ static void lib_link_seq_clipboard_pt_restore(ID *id, struct IDNameLib_Map *id_m
id->newid = restore_pointer_by_name(id_map, id->newid, USER_REAL);
}
}
-static int lib_link_seq_clipboard_cb(Sequence *seq, void *arg_pt)
+static bool lib_link_seq_clipboard_cb(Sequence *seq, void *arg_pt)
{
struct IDNameLib_Map *id_map = arg_pt;
@@ -2428,13 +2428,13 @@ static int lib_link_seq_clipboard_cb(Sequence *seq, void *arg_pt)
lib_link_seq_clipboard_pt_restore((ID *)seq->clip, id_map);
lib_link_seq_clipboard_pt_restore((ID *)seq->mask, id_map);
lib_link_seq_clipboard_pt_restore((ID *)seq->sound, id_map);
- return 1;
+ return true;
}
static void lib_link_clipboard_restore(struct IDNameLib_Map *id_map)
{
/* update IDs stored in sequencer clipboard */
- SEQ_seqbase_recursive_apply(&seqbase_clipboard, lib_link_seq_clipboard_cb, id_map);
+ SEQ_for_each_callback(&seqbase_clipboard, lib_link_seq_clipboard_cb, id_map);
}
static int lib_link_main_data_restore_cb(LibraryIDLinkCallbackData *cb_data)
diff --git a/source/blender/blenloader/intern/versioning_250.c b/source/blender/blenloader/intern/versioning_250.c
index 436645c2241..54e673b51eb 100644
--- a/source/blender/blenloader/intern/versioning_250.c
+++ b/source/blender/blenloader/intern/versioning_250.c
@@ -638,6 +638,46 @@ static void do_versions_socket_default_value_259(bNodeSocket *sock)
}
}
+static bool seq_sound_proxy_update_cb(Sequence *seq, void *user_data)
+{
+ Main *bmain = (Main *)user_data;
+ if (seq->type == SEQ_TYPE_SOUND_HD) {
+ char str[FILE_MAX];
+ BLI_join_dirfile(str, sizeof(str), seq->strip->dir, seq->strip->stripdata->name);
+ BLI_path_abs(str, BKE_main_blendfile_path(bmain));
+ seq->sound = BKE_sound_new_file(bmain, str);
+ }
+#define SEQ_USE_PROXY_CUSTOM_DIR (1 << 19)
+#define SEQ_USE_PROXY_CUSTOM_FILE (1 << 21)
+ /* don't know, if anybody used that this way, but just in case, upgrade to new way... */
+ if ((seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) && !(seq->flag & SEQ_USE_PROXY_CUSTOM_DIR)) {
+ BLI_snprintf(seq->strip->proxy->dir, FILE_MAXDIR, "%s/BL_proxy", seq->strip->dir);
+ }
+#undef SEQ_USE_PROXY_CUSTOM_DIR
+#undef SEQ_USE_PROXY_CUSTOM_FILE
+ return true;
+}
+
+static bool seq_set_volume_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ seq->volume = 1.0f;
+ return true;
+}
+
+static bool seq_set_sat_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ if (seq->sat == 0.0f) {
+ seq->sat = 1.0f;
+ }
+ return true;
+}
+
+static bool seq_set_pitch_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ seq->pitch = 1.0f;
+ return true;
+}
+
/* NOLINTNEXTLINE: readability-function-size */
void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain)
{
@@ -660,7 +700,6 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain)
#endif
bSound *sound;
- Sequence *seq;
for (sound = bmain->sounds.first; sound; sound = sound->id.next) {
if (sound->newpackedfile) {
@@ -671,23 +710,7 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain)
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
if (scene->ed && scene->ed->seqbasep) {
- SEQ_ALL_BEGIN (scene->ed, seq) {
- if (seq->type == SEQ_TYPE_SOUND_HD) {
- char str[FILE_MAX];
- BLI_join_dirfile(str, sizeof(str), seq->strip->dir, seq->strip->stripdata->name);
- BLI_path_abs(str, BKE_main_blendfile_path(bmain));
- seq->sound = BKE_sound_new_file(bmain, str);
- }
-#define SEQ_USE_PROXY_CUSTOM_DIR (1 << 19)
-#define SEQ_USE_PROXY_CUSTOM_FILE (1 << 21)
- /* don't know, if anybody used that this way, but just in case, upgrade to new way... */
- if ((seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) && !(seq->flag & SEQ_USE_PROXY_CUSTOM_DIR)) {
- BLI_snprintf(seq->strip->proxy->dir, FILE_MAXDIR, "%s/BL_proxy", seq->strip->dir);
- }
-#undef SEQ_USE_PROXY_CUSTOM_DIR
-#undef SEQ_USE_PROXY_CUSTOM_FILE
- }
- SEQ_ALL_END;
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_sound_proxy_update_cb, bmain);
}
}
@@ -1391,7 +1414,6 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain)
if (!MAIN_VERSION_ATLEAST(bmain, 250, 17)) {
Scene *sce;
- Sequence *seq;
/* initialize to sane default so toggling on border shows something */
for (sce = bmain->scenes.first; sce; sce = sce->id.next) {
@@ -1406,11 +1428,9 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain)
if ((sce->r.ffcodecdata.flags & FFMPEG_MULTIPLEX_AUDIO) == 0) {
sce->r.ffcodecdata.audio_codec = 0x0; /* `CODEC_ID_NONE` */
}
-
- SEQ_ALL_BEGIN (sce->ed, seq) {
- seq->volume = 1.0f;
+ if (sce->ed) {
+ SEQ_for_each_callback(&sce->ed->seqbase, seq_set_volume_cb, NULL);
}
- SEQ_ALL_END;
}
/* particle brush strength factor was changed from int to float */
@@ -1678,13 +1698,9 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain)
}
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
- Sequence *seq;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- if (seq->sat == 0.0f) {
- seq->sat = 1.0f;
- }
+ if (scene->ed) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_set_sat_cb, NULL);
}
- SEQ_ALL_END;
}
/* GSOC 2010 Sculpt - New settings for Brush */
@@ -2159,15 +2175,13 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain)
if (!MAIN_VERSION_ATLEAST(bmain, 259, 1)) {
{
Scene *scene;
- Sequence *seq;
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
scene->r.ffcodecdata.audio_channels = 2;
scene->audio.volume = 1.0f;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- seq->pitch = 1.0f;
+ if (scene->ed) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_set_pitch_cb, NULL);
}
- SEQ_ALL_END;
}
}
diff --git a/source/blender/blenloader/intern/versioning_260.c b/source/blender/blenloader/intern/versioning_260.c
index 7c644fa3b55..b71dd5a27bb 100644
--- a/source/blender/blenloader/intern/versioning_260.c
+++ b/source/blender/blenloader/intern/versioning_260.c
@@ -663,6 +663,53 @@ static void do_versions_nodetree_customnodes(bNodeTree *ntree, int UNUSED(is_gro
}
}
+static bool seq_colorbalance_update_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ Strip *strip = seq->strip;
+
+ if (strip && strip->color_balance) {
+ SequenceModifierData *smd;
+ ColorBalanceModifierData *cbmd;
+
+ smd = SEQ_modifier_new(seq, NULL, seqModifierType_ColorBalance);
+ cbmd = (ColorBalanceModifierData *)smd;
+
+ cbmd->color_balance = *strip->color_balance;
+
+ /* multiplication with color balance used is handled differently,
+ * so we need to move multiplication to modifier so files would be
+ * compatible
+ */
+ cbmd->color_multiply = seq->mul;
+ seq->mul = 1.0f;
+
+ MEM_freeN(strip->color_balance);
+ strip->color_balance = NULL;
+ }
+ return true;
+}
+
+static bool seq_set_alpha_mode_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ enum { SEQ_MAKE_PREMUL = (1 << 6) };
+ if (seq->flag & SEQ_MAKE_PREMUL) {
+ seq->alpha_mode = SEQ_ALPHA_STRAIGHT;
+ }
+ else {
+ SEQ_alpha_mode_from_file_extension(seq);
+ }
+ return true;
+}
+
+static bool seq_set_wipe_angle_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ if (seq->type == SEQ_TYPE_WIPE) {
+ WipeVars *wv = seq->effectdata;
+ wv->angle = DEG2RADF(wv->angle);
+ }
+ return true;
+}
+
/* NOLINTNEXTLINE: readability-function-size */
void blo_do_versions_260(FileData *fd, Library *UNUSED(lib), Main *bmain)
{
@@ -1492,32 +1539,7 @@ void blo_do_versions_260(FileData *fd, Library *UNUSED(lib), Main *bmain)
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
if (scene->ed) {
- Sequence *seq;
-
- SEQ_ALL_BEGIN (scene->ed, seq) {
- Strip *strip = seq->strip;
-
- if (strip && strip->color_balance) {
- SequenceModifierData *smd;
- ColorBalanceModifierData *cbmd;
-
- smd = SEQ_modifier_new(seq, NULL, seqModifierType_ColorBalance);
- cbmd = (ColorBalanceModifierData *)smd;
-
- cbmd->color_balance = *strip->color_balance;
-
- /* multiplication with color balance used is handled differently,
- * so we need to move multiplication to modifier so files would be
- * compatible
- */
- cbmd->color_multiply = seq->mul;
- seq->mul = 1.0f;
-
- MEM_freeN(strip->color_balance);
- strip->color_balance = NULL;
- }
- }
- SEQ_ALL_END;
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_colorbalance_update_cb, NULL);
}
}
}
@@ -1807,18 +1829,9 @@ void blo_do_versions_260(FileData *fd, Library *UNUSED(lib), Main *bmain)
Tex *tex;
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
- Sequence *seq;
-
- SEQ_ALL_BEGIN (scene->ed, seq) {
- enum { SEQ_MAKE_PREMUL = (1 << 6) };
- if (seq->flag & SEQ_MAKE_PREMUL) {
- seq->alpha_mode = SEQ_ALPHA_STRAIGHT;
- }
- else {
- SEQ_alpha_mode_from_file_extension(seq);
- }
+ if (scene->ed) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_set_alpha_mode_cb, NULL);
}
- SEQ_ALL_END;
if (scene->r.bake_samples == 0) {
scene->r.bake_samples = 256;
@@ -2450,14 +2463,9 @@ void blo_do_versions_260(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
- Sequence *seq;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- if (seq->type == SEQ_TYPE_WIPE) {
- WipeVars *wv = seq->effectdata;
- wv->angle = DEG2RADF(wv->angle);
- }
+ if (scene->ed) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_set_wipe_angle_cb, NULL);
}
- SEQ_ALL_END;
}
FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index 1d46c0d5790..6492f0d1f69 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -425,6 +425,45 @@ static void do_version_bbone_easing_fcurve_fix(ID *UNUSED(id),
}
}
+static bool seq_update_proxy_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ seq->stereo3d_format = MEM_callocN(sizeof(Stereo3dFormat), "Stereo Display 3d Format");
+
+#define SEQ_USE_PROXY_CUSTOM_DIR (1 << 19)
+#define SEQ_USE_PROXY_CUSTOM_FILE (1 << 21)
+ if (seq->strip && seq->strip->proxy && !seq->strip->proxy->storage) {
+ if (seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) {
+ seq->strip->proxy->storage = SEQ_STORAGE_PROXY_CUSTOM_DIR;
+ }
+ if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) {
+ seq->strip->proxy->storage = SEQ_STORAGE_PROXY_CUSTOM_FILE;
+ }
+ }
+#undef SEQ_USE_PROXY_CUSTOM_DIR
+#undef SEQ_USE_PROXY_CUSTOM_FILE
+ return true;
+}
+
+static bool seq_update_effectdata_cb(Sequence *seq, void *UNUSED(user_data))
+{
+
+ if (seq->type != SEQ_TYPE_TEXT) {
+ return true;
+ }
+
+ if (seq->effectdata == NULL) {
+ struct SeqEffectHandle effect_handle = SEQ_effect_handle_get(seq);
+ effect_handle.init(seq);
+ }
+
+ TextVars *data = seq->effectdata;
+ if (data->color[3] == 0.0f) {
+ copy_v4_fl(data->color, 1.0f);
+ data->shadow_color[3] = 1.0f;
+ }
+ return true;
+}
+
/* NOLINTNEXTLINE: readability-function-size */
void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain)
{
@@ -908,8 +947,6 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain)
Image *ima;
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
- Sequence *seq;
-
BKE_scene_add_render_view(scene, STEREO_LEFT_NAME);
srv = scene->r.views.first;
BLI_strncpy(srv->suffix, STEREO_LEFT_SUFFIX, sizeof(srv->suffix));
@@ -918,23 +955,9 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain)
srv = scene->r.views.last;
BLI_strncpy(srv->suffix, STEREO_RIGHT_SUFFIX, sizeof(srv->suffix));
- SEQ_ALL_BEGIN (scene->ed, seq) {
- seq->stereo3d_format = MEM_callocN(sizeof(Stereo3dFormat), "Stereo Display 3d Format");
-
-#define SEQ_USE_PROXY_CUSTOM_DIR (1 << 19)
-#define SEQ_USE_PROXY_CUSTOM_FILE (1 << 21)
- if (seq->strip && seq->strip->proxy && !seq->strip->proxy->storage) {
- if (seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) {
- seq->strip->proxy->storage = SEQ_STORAGE_PROXY_CUSTOM_DIR;
- }
- if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) {
- seq->strip->proxy->storage = SEQ_STORAGE_PROXY_CUSTOM_FILE;
- }
- }
-#undef SEQ_USE_PROXY_CUSTOM_DIR
-#undef SEQ_USE_PROXY_CUSTOM_FILE
+ if (scene->ed) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_update_proxy_cb, NULL);
}
- SEQ_ALL_END;
}
for (screen = bmain->screens.first; screen; screen = screen->id.next) {
@@ -1215,25 +1238,9 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
- Sequence *seq;
-
- SEQ_ALL_BEGIN (scene->ed, seq) {
- if (seq->type != SEQ_TYPE_TEXT) {
- continue;
- }
-
- if (seq->effectdata == NULL) {
- struct SeqEffectHandle effect_handle = SEQ_effect_handle_get(seq);
- effect_handle.init(seq);
- }
-
- TextVars *data = seq->effectdata;
- if (data->color[3] == 0.0f) {
- copy_v4_fl(data->color, 1.0f);
- data->shadow_color[3] = 1.0f;
- }
+ if (scene->ed) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_update_effectdata_cb, NULL);
}
- SEQ_ALL_END;
}
/* Adding "Properties" region to DopeSheet */
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 9d65488e8d4..2598c53a5e0 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -444,7 +444,7 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene)
Collection *collection = BKE_collection_add(bmain, collection_master, name);
collection->id.lib = scene->id.lib;
- if (collection->id.lib != NULL) {
+ if (ID_IS_LINKED(collection)) {
collection->id.tag |= LIB_TAG_INDIRECT;
}
collections[layer] = collection;
@@ -574,10 +574,10 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene)
static void do_version_collection_propagate_lib_to_children(Collection *collection)
{
- if (collection->id.lib != NULL) {
+ if (ID_IS_LINKED(collection)) {
for (CollectionChild *collection_child = collection->children.first; collection_child != NULL;
collection_child = collection_child->next) {
- if (collection_child->collection->id.lib == NULL) {
+ if (!ID_IS_LINKED(collection_child->collection)) {
collection_child->collection->id.lib = collection->id.lib;
}
do_version_collection_propagate_lib_to_children(collection_child->collection);
@@ -1772,6 +1772,16 @@ static void do_versions_seq_set_cache_defaults(Editing *ed)
ed->recycle_max_cost = 10.0f;
}
+static bool seq_update_flags_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ seq->flag &= ~(SEQ_FLAG_UNUSED_6 | SEQ_FLAG_UNUSED_18 | SEQ_FLAG_UNUSED_19 | SEQ_FLAG_UNUSED_21);
+ if (seq->type == SEQ_TYPE_SPEED) {
+ SpeedControlVars *s = (SpeedControlVars *)seq->effectdata;
+ s->flags &= ~(SEQ_SPEED_UNUSED_1);
+ }
+ return true;
+}
+
/* NOLINTNEXTLINE: readability-function-size */
void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
{
@@ -3447,16 +3457,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
if (scene->ed) {
- Sequence *seq;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- seq->flag &= ~(SEQ_FLAG_UNUSED_6 | SEQ_FLAG_UNUSED_18 | SEQ_FLAG_UNUSED_19 |
- SEQ_FLAG_UNUSED_21);
- if (seq->type == SEQ_TYPE_SPEED) {
- SpeedControlVars *s = (SpeedControlVars *)seq->effectdata;
- s->flags &= ~(SEQ_SPEED_UNUSED_1);
- }
- }
- SEQ_ALL_END;
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_update_flags_cb, NULL);
}
}
diff --git a/source/blender/blenloader/intern/versioning_legacy.c b/source/blender/blenloader/intern/versioning_legacy.c
index 6ba27b6ee9e..62cc2aa3662 100644
--- a/source/blender/blenloader/intern/versioning_legacy.c
+++ b/source/blender/blenloader/intern/versioning_legacy.c
@@ -482,6 +482,22 @@ void blo_do_version_old_trackto_to_constraints(Object *ob)
ob->track = NULL;
}
+static bool seq_set_alpha_mode_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ if (ELEM(seq->type, SEQ_TYPE_IMAGE, SEQ_TYPE_MOVIE)) {
+ seq->alpha_mode = SEQ_ALPHA_STRAIGHT;
+ }
+ return true;
+}
+
+static bool seq_set_blend_mode_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ if (seq->blend_mode == 0) {
+ seq->blend_opacity = 100.0f;
+ }
+ return true;
+}
+
/* NOLINTNEXTLINE: readability-function-size */
void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain)
{
@@ -1228,7 +1244,6 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain)
if (bmain->versionfile <= 235) {
Tex *tex = bmain->textures.first;
Scene *sce = bmain->scenes.first;
- Sequence *seq;
Editing *ed;
while (tex) {
@@ -1240,12 +1255,7 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain)
while (sce) {
ed = sce->ed;
if (ed) {
- SEQ_ALL_BEGIN (sce->ed, seq) {
- if (ELEM(seq->type, SEQ_TYPE_IMAGE, SEQ_TYPE_MOVIE)) {
- seq->alpha_mode = SEQ_ALPHA_STRAIGHT;
- }
- }
- SEQ_ALL_END;
+ SEQ_for_each_callback(&sce->ed->seqbase, seq_set_alpha_mode_cb, NULL);
}
sce = sce->id.next;
@@ -2404,15 +2414,11 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain)
if (!MAIN_VERSION_ATLEAST(bmain, 245, 14)) {
Scene *sce;
- Sequence *seq;
for (sce = bmain->scenes.first; sce; sce = sce->id.next) {
- SEQ_ALL_BEGIN (sce->ed, seq) {
- if (seq->blend_mode == 0) {
- seq->blend_opacity = 100.0f;
- }
+ if (sce->ed) {
+ SEQ_for_each_callback(&sce->ed->seqbase, seq_set_blend_mode_cb, NULL);
}
- SEQ_ALL_END;
}
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 90d58514eb5..56ff7151cb1 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -840,7 +840,7 @@ static void write_renderinfo(WriteData *wd, Main *mainvar)
current_screen_compat(mainvar, false, &curscreen, &curscene, &view_layer);
LISTBASE_FOREACH (Scene *, sce, &mainvar->scenes) {
- if (sce->id.lib == NULL && (sce == curscene || (sce->r.scemode & R_BG_RENDER))) {
+ if (!ID_IS_LINKED(sce) && (sce == curscene || (sce->r.scemode & R_BG_RENDER))) {
RenderInfo data;
data.sfra = sce->r.sfra;
data.efra = sce->r.efra;
diff --git a/source/blender/blentranslation/msgfmt/msgfmt.c b/source/blender/blentranslation/msgfmt/msgfmt.c
index f95bf2a9037..05c71fd4852 100644
--- a/source/blender/blentranslation/msgfmt/msgfmt.c
+++ b/source/blender/blentranslation/msgfmt/msgfmt.c
@@ -382,7 +382,7 @@ static int make(const char *input_file_name, const char *output_file_name)
}
else if (strstr(l, msgstr_kw) == l) {
l = l + msgstr_len;
- // Now we are in a msgstr section
+ /* Now we are in a `msgstr` section. */
section = SECTION_STR;
if (l[0] == '[') {
if (!is_plural) {
diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cc b/source/blender/compositor/intern/COM_ExecutionGroup.cc
index 68bda8c70d6..a45c453d7ed 100644
--- a/source/blender/compositor/intern/COM_ExecutionGroup.cc
+++ b/source/blender/compositor/intern/COM_ExecutionGroup.cc
@@ -561,7 +561,7 @@ bool ExecutionGroup::scheduleChunkWhenPossible(ExecutionSystem *graph,
return true;
}
- // Check if chunk is already executed or scheduled and not yet executed.
+ /* Check if chunk is already executed or scheduled and not yet executed. */
const int chunk_index = chunk_y * this->m_x_chunks_len + chunk_x;
WorkPackage &work_package = m_work_packages[chunk_index];
if (work_package.state == eWorkPackageState::Executed) {
diff --git a/source/blender/compositor/intern/COM_WorkPackage.h b/source/blender/compositor/intern/COM_WorkPackage.h
index f0f53f300a5..20fca89aa4c 100644
--- a/source/blender/compositor/intern/COM_WorkPackage.h
+++ b/source/blender/compositor/intern/COM_WorkPackage.h
@@ -30,7 +30,7 @@
#include <ostream>
namespace blender::compositor {
-// Forward Declarations.
+/* Forward Declarations. */
class ExecutionGroup;
/**
diff --git a/source/blender/compositor/nodes/COM_BokehBlurNode.cc b/source/blender/compositor/nodes/COM_BokehBlurNode.cc
index 1d2a0dae390..c51a98c0f82 100644
--- a/source/blender/compositor/nodes/COM_BokehBlurNode.cc
+++ b/source/blender/compositor/nodes/COM_BokehBlurNode.cc
@@ -64,9 +64,8 @@ void BokehBlurNode::convertToOperations(NodeConverter &converter,
converter.mapInputSocket(getInputSocket(0), operation->getInputSocket(0));
converter.mapInputSocket(getInputSocket(1), operation->getInputSocket(1));
- // NOTE: on the bokeh blur operation the sockets are switched.
- // for this reason the next two lines are correct.
- // Fix for T43771
+ /* NOTE: on the bokeh blur operation the sockets are switched.
+ * for this reason the next two lines are correct. Fix for T43771. */
converter.mapInputSocket(getInputSocket(2), operation->getInputSocket(3));
converter.mapInputSocket(getInputSocket(3), operation->getInputSocket(2));
diff --git a/source/blender/compositor/nodes/COM_ColorSpillNode.cc b/source/blender/compositor/nodes/COM_ColorSpillNode.cc
index 119cff93e84..6119e635e59 100644
--- a/source/blender/compositor/nodes/COM_ColorSpillNode.cc
+++ b/source/blender/compositor/nodes/COM_ColorSpillNode.cc
@@ -39,8 +39,8 @@ void ColorSpillNode::convertToOperations(NodeConverter &converter,
ColorSpillOperation *operation;
operation = new ColorSpillOperation();
operation->setSettings((NodeColorspill *)editorsnode->storage);
- operation->setSpillChannel(editorsnode->custom1 - 1); // Channel for spilling
- operation->setSpillMethod(editorsnode->custom2); // Channel method
+ operation->setSpillChannel(editorsnode->custom1 - 1); /* Channel for spilling */
+ operation->setSpillMethod(editorsnode->custom2); /* Channel method */
converter.addOperation(operation);
converter.mapInputSocket(inputSocketImage, operation->getInputSocket(0));
diff --git a/source/blender/compositor/nodes/COM_Stabilize2dNode.cc b/source/blender/compositor/nodes/COM_Stabilize2dNode.cc
index 7b2388bebca..90f62c6d562 100644
--- a/source/blender/compositor/nodes/COM_Stabilize2dNode.cc
+++ b/source/blender/compositor/nodes/COM_Stabilize2dNode.cc
@@ -101,7 +101,7 @@ void Stabilize2dNode::convertToOperations(NodeConverter &converter,
converter.mapOutputSocket(getOutputSocket(), psoperation->getOutputSocket());
if (invert) {
- // Translate -> Rotate -> Scale.
+ /* Translate -> Rotate -> Scale. */
converter.mapInputSocket(imageInput, translateOperation->getInputSocket(0));
converter.addLink(translateOperation->getOutputSocket(),
@@ -111,7 +111,7 @@ void Stabilize2dNode::convertToOperations(NodeConverter &converter,
converter.addLink(scaleOperation->getOutputSocket(), psoperation->getInputSocket(0));
}
else {
- // Scale -> Rotate -> Translate.
+ /* Scale -> Rotate -> Translate. */
converter.mapInputSocket(imageInput, scaleOperation->getInputSocket(0));
converter.addLink(scaleOperation->getOutputSocket(), rotateOperation->getInputSocket(0));
diff --git a/source/blender/compositor/operations/COM_ColorCurveOperation.cc b/source/blender/compositor/operations/COM_ColorCurveOperation.cc
index 1b7ad0ea608..646238460ba 100644
--- a/source/blender/compositor/operations/COM_ColorCurveOperation.cc
+++ b/source/blender/compositor/operations/COM_ColorCurveOperation.cc
@@ -128,7 +128,7 @@ void ColorCurveOperation::update_memory_buffer_partial(MemoryBuffer *output,
}
}
-// Constant level curve mapping
+/* Constant level curve mapping. */
ConstantLevelColorCurveOperation::ConstantLevelColorCurveOperation()
{
diff --git a/source/blender/compositor/operations/COM_ColorSpillOperation.cc b/source/blender/compositor/operations/COM_ColorSpillOperation.cc
index 4b0e0520b75..5bf7a9ee9cd 100644
--- a/source/blender/compositor/operations/COM_ColorSpillOperation.cc
+++ b/source/blender/compositor/operations/COM_ColorSpillOperation.cc
@@ -30,7 +30,7 @@ ColorSpillOperation::ColorSpillOperation()
this->m_inputImageReader = nullptr;
this->m_inputFacReader = nullptr;
- this->m_spillChannel = 1; // GREEN
+ this->m_spillChannel = 1; /* GREEN */
this->m_spillMethod = 0;
flags.can_be_constant = true;
}
diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cc b/source/blender/compositor/operations/COM_CompositorOperation.cc
index 8752d764107..fb9e2e43c60 100644
--- a/source/blender/compositor/operations/COM_CompositorOperation.cc
+++ b/source/blender/compositor/operations/COM_CompositorOperation.cc
@@ -62,7 +62,7 @@ void CompositorOperation::initExecution()
return;
}
- // When initializing the tree during initial load the width and height can be zero.
+ /* When initializing the tree during initial load the width and height can be zero. */
this->m_imageInput = getInputSocketReader(0);
this->m_alphaInput = getInputSocketReader(1);
this->m_depthInput = getInputSocketReader(2);
@@ -242,8 +242,8 @@ void CompositorOperation::determineResolution(unsigned int resolution[2],
int width = this->m_rd->xsch * this->m_rd->size / 100;
int height = this->m_rd->ysch * this->m_rd->size / 100;
- // check actual render resolution with cropping it may differ with cropped border.rendering
- // FIX for: [31777] Border Crop gives black (easy)
+ /* Check actual render resolution with cropping it may differ with cropped border.rendering
+ * Fix for T31777 Border Crop gives black (easy). */
Render *re = RE_GetSceneRender(this->m_scene);
if (re) {
RenderResult *rr = RE_AcquireResultRead(re);
diff --git a/source/blender/compositor/operations/COM_DilateErodeOperation.cc b/source/blender/compositor/operations/COM_DilateErodeOperation.cc
index a27148f967d..c459d09f02c 100644
--- a/source/blender/compositor/operations/COM_DilateErodeOperation.cc
+++ b/source/blender/compositor/operations/COM_DilateErodeOperation.cc
@@ -160,7 +160,7 @@ bool DilateErodeThresholdOperation::determineDependingAreaOfInterest(
return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
}
-// Dilate Distance
+/* Dilate Distance. */
DilateDistanceOperation::DilateDistanceOperation()
{
this->addInputSocket(DataType::Value);
diff --git a/source/blender/compositor/operations/COM_GlareFogGlowOperation.cc b/source/blender/compositor/operations/COM_GlareFogGlowOperation.cc
index 1c1eaebd331..0026615f08b 100644
--- a/source/blender/compositor/operations/COM_GlareFogGlowOperation.cc
+++ b/source/blender/compositor/operations/COM_GlareFogGlowOperation.cc
@@ -27,7 +27,7 @@ namespace blender::compositor {
using fREAL = float;
-// returns next highest power of 2 of x, as well its log2 in L2
+/* Returns next highest power of 2 of x, as well its log2 in L2. */
static unsigned int nextPow2(unsigned int x, unsigned int *L2)
{
unsigned int pw, x_notpow2 = x & (x - 1);
@@ -45,8 +45,8 @@ static unsigned int nextPow2(unsigned int x, unsigned int *L2)
//------------------------------------------------------------------------------
-// from FXT library by Joerg Arndt, faster in order bitreversal
-// use: r = revbin_upd(r, h) where h = N>>1
+/* From FXT library by Joerg Arndt, faster in order bit-reversal
+ * use: `r = revbin_upd(r, h)` where `h = N>>1`. */
static unsigned int revbin_upd(unsigned int r, unsigned int h)
{
while (!((r ^= h) & h)) {
@@ -127,7 +127,7 @@ static void FHT(fREAL *data, unsigned int M, unsigned int inverse)
//------------------------------------------------------------------------------
/* 2D Fast Hartley Transform, Mx/My -> log2 of width/height,
* nzp -> the row where zero pad data starts,
- * inverse -> see above */
+ * inverse -> see above. */
static void FHT2D(
fREAL *data, unsigned int Mx, unsigned int My, unsigned int nzp, unsigned int inverse)
{
@@ -136,14 +136,14 @@ static void FHT2D(
Nx = 1 << Mx;
Ny = 1 << My;
- // rows (forward transform skips 0 pad data)
+ /* Rows (forward transform skips 0 pad data). */
maxy = inverse ? Ny : nzp;
for (j = 0; j < maxy; j++) {
FHT(&data[Nx * j], Mx, inverse);
}
- // transpose data
- if (Nx == Ny) { // square
+ /* Transpose data. */
+ if (Nx == Ny) { /* Square. */
for (j = 0; j < Ny; j++) {
for (i = j + 1; i < Nx; i++) {
unsigned int op = i + (j << Mx), np = j + (i << My);
@@ -151,12 +151,12 @@ static void FHT2D(
}
}
}
- else { // rectangular
+ else { /* Rectangular. */
unsigned int k, Nym = Ny - 1, stm = 1 << (Mx + My);
for (i = 0; stm > 0; i++) {
#define PRED(k) (((k & Nym) << Mx) + (k >> My))
for (j = PRED(i); j > i; j = PRED(j)) {
- /* pass */
+ /* Pass. */
}
if (j < i) {
continue;
@@ -172,12 +172,12 @@ static void FHT2D(
SWAP(unsigned int, Nx, Ny);
SWAP(unsigned int, Mx, My);
- // now columns == transposed rows
+ /* Now columns == transposed rows. */
for (j = 0; j < Ny; j++) {
FHT(&data[Nx * j], Mx, inverse);
}
- // finalize
+ /* Finalize. */
for (j = 0; j <= (Ny >> 1); j++) {
unsigned int jm = (Ny - j) & (Ny - 1);
unsigned int ji = j << Mx;
@@ -199,7 +199,7 @@ static void FHT2D(
//------------------------------------------------------------------------------
-/* 2D convolution calc, d1 *= d2, M/N - > log2 of width/height */
+/* 2D convolution calc, d1 *= d2, M/N - > log2 of width/height. */
static void fht_convolve(fREAL *d1, const fREAL *d2, unsigned int M, unsigned int N)
{
fREAL a, b;
@@ -275,18 +275,18 @@ static void convolve(float *dst, MemoryBuffer *in1, MemoryBuffer *in2)
0,
rdst->getWidth() * rdst->getHeight() * COM_DATA_TYPE_COLOR_CHANNELS * sizeof(float));
- // convolution result width & height
+ /* Convolution result width & height. */
w2 = 2 * kernelWidth - 1;
h2 = 2 * kernelHeight - 1;
- // FFT pow2 required size & log2
+ /* FFT pow2 required size & log2. */
w2 = nextPow2(w2, &log2_w);
h2 = nextPow2(h2, &log2_h);
- // alloc space
+ /* Allocate space. */
data1 = (fREAL *)MEM_callocN(3 * w2 * h2 * sizeof(fREAL), "convolve_fast FHT data1");
data2 = (fREAL *)MEM_callocN(w2 * h2 * sizeof(fREAL), "convolve_fast FHT data2");
- // normalize convolutor
+ /* Normalize convolutor. */
wt[0] = wt[1] = wt[2] = 0.0f;
for (y = 0; y < kernelHeight; y++) {
colp = (fRGB *)&kernelBuffer[y * kernelWidth * COM_DATA_TYPE_COLOR_CHANNELS];
@@ -310,10 +310,10 @@ static void convolve(float *dst, MemoryBuffer *in1, MemoryBuffer *in2)
}
}
- // copy image data, unpacking interleaved RGBA into separate channels
- // only need to calc data1 once
+ /* Copy image data, unpacking interleaved RGBA into separate channels
+ * only need to calc data1 once. */
- // block add-overlap
+ /* Block add-overlap. */
hw = kernelWidth >> 1;
hh = kernelHeight >> 1;
xbsz = (w2 + 1) - kernelWidth;
@@ -329,13 +329,13 @@ static void convolve(float *dst, MemoryBuffer *in1, MemoryBuffer *in2)
for (ybl = 0; ybl < nyb; ybl++) {
for (xbl = 0; xbl < nxb; xbl++) {
- // each channel one by one
+ /* Each channel one by one. */
for (ch = 0; ch < 3; ch++) {
fREAL *data1ch = &data1[ch * w2 * h2];
- // only need to calc fht data from in2 once, can re-use for every block
+ /* Only need to calc fht data from in2 once, can re-use for every block. */
if (!in2done) {
- // in2, channel ch -> data1
+ /* in2, channel ch -> data1 */
for (y = 0; y < kernelHeight; y++) {
fp = &data1ch[y * w2];
colp = (fRGB *)&kernelBuffer[y * kernelWidth * COM_DATA_TYPE_COLOR_CHANNELS];
@@ -345,7 +345,7 @@ static void convolve(float *dst, MemoryBuffer *in1, MemoryBuffer *in2)
}
}
- // in1, channel ch -> data2
+ /* in1, channel ch -> data2 */
memset(data2, 0, w2 * h2 * sizeof(fREAL));
for (y = 0; y < ybsz; y++) {
int yy = ybl * ybsz + y;
@@ -363,20 +363,20 @@ static void convolve(float *dst, MemoryBuffer *in1, MemoryBuffer *in2)
}
}
- // forward FHT
- // zero pad data start is different for each == height+1
+ /* Forward FHT
+ * zero pad data start is different for each == height+1. */
if (!in2done) {
FHT2D(data1ch, log2_w, log2_h, kernelHeight + 1, 0);
}
FHT2D(data2, log2_w, log2_h, kernelHeight + 1, 0);
- // FHT2D transposed data, row/col now swapped
- // convolve & inverse FHT
+ /* FHT2D transposed data, row/col now swapped
+ * convolve & inverse FHT. */
fht_convolve(data2, data1ch, log2_h, log2_w);
FHT2D(data2, log2_h, log2_w, 0, 1);
- // data again transposed, so in order again
+ /* Data again transposed, so in order again. */
- // overlap-add result
+ /* Overlap-add result. */
for (y = 0; y < (int)h2; y++) {
const int yy = ybl * ybsz + y - hh;
if ((yy < 0) || (yy >= imageHeight)) {
@@ -416,8 +416,8 @@ void GlareFogGlowOperation::generateGlare(float *data,
unsigned int sz = 1 << settings->size;
const float cs_r = 1.0f, cs_g = 1.0f, cs_b = 1.0f;
- // temp. src image
- // make the convolution kernel
+ /* Temp. src image
+ * make the convolution kernel. */
rcti kernelRect;
BLI_rcti_init(&kernelRect, 0, sz, 0, sz);
ckrn = new MemoryBuffer(DataType::Color, kernelRect);
@@ -433,9 +433,9 @@ void GlareFogGlowOperation::generateGlare(float *data,
fcol[0] = expf(d * cs_r);
fcol[1] = expf(d * cs_g);
fcol[2] = expf(d * cs_b);
- // linear window good enough here, visual result counts, not scientific analysis
- // w = (1.0f-fabs(u))*(1.0f-fabs(v));
- // actually, Hanning window is ok, cos^2 for some reason is slower
+ /* Linear window good enough here, visual result counts, not scientific analysis:
+ * `w = (1.0f-fabs(u))*(1.0f-fabs(v));`
+ * actually, Hanning window is ok, `cos^2` for some reason is slower. */
w = (0.5f + 0.5f * cosf(u * (float)M_PI)) * (0.5f + 0.5f * cosf(v * (float)M_PI));
mul_v3_fl(fcol, w);
ckrn->writePixel(x, y, fcol);
diff --git a/source/blender/compositor/operations/COM_InpaintOperation.cc b/source/blender/compositor/operations/COM_InpaintOperation.cc
index 413ed2694a9..bfcd504177f 100644
--- a/source/blender/compositor/operations/COM_InpaintOperation.cc
+++ b/source/blender/compositor/operations/COM_InpaintOperation.cc
@@ -28,7 +28,7 @@ namespace blender::compositor {
#define ASSERT_XY_RANGE(x, y) \
BLI_assert(x >= 0 && x < this->getWidth() && y >= 0 && y < this->getHeight())
-// Inpaint (simple convolve using average of known pixels)
+/* In-paint (simple convolve using average of known pixels). */
InpaintSimpleOperation::InpaintSimpleOperation()
{
this->addInputSocket(DataType::Color);
diff --git a/source/blender/compositor/operations/COM_ScaleOperation.cc b/source/blender/compositor/operations/COM_ScaleOperation.cc
index ef34bc7bee6..bbb6de2f39e 100644
--- a/source/blender/compositor/operations/COM_ScaleOperation.cc
+++ b/source/blender/compositor/operations/COM_ScaleOperation.cc
@@ -262,7 +262,7 @@ bool ScaleAbsoluteOperation::determineDependingAreaOfInterest(rcti *input,
return ScaleOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
}
-// Absolute fixed size
+/* Absolute fixed size. */
ScaleFixedSizeOperation::ScaleFixedSizeOperation() : BaseScaleOperation()
{
this->addInputSocket(DataType::Color, ResizeMode::None);
diff --git a/source/blender/compositor/operations/COM_SplitOperation.cc b/source/blender/compositor/operations/COM_SplitOperation.cc
index d18ed3b8e14..b2a50e2c740 100644
--- a/source/blender/compositor/operations/COM_SplitOperation.cc
+++ b/source/blender/compositor/operations/COM_SplitOperation.cc
@@ -40,7 +40,7 @@ SplitOperation::SplitOperation()
void SplitOperation::initExecution()
{
- // When initializing the tree during initial load the width and height can be zero.
+ /* When initializing the tree during initial load the width and height can be zero. */
this->m_image1Input = getInputSocketReader(0);
this->m_image2Input = getInputSocketReader(1);
}
diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.cc b/source/blender/compositor/operations/COM_VectorBlurOperation.cc
index b5b5d426338..df65044afc1 100644
--- a/source/blender/compositor/operations/COM_VectorBlurOperation.cc
+++ b/source/blender/compositor/operations/COM_VectorBlurOperation.cc
@@ -48,8 +48,8 @@ void antialias_tagbuf(int xsize, int ysize, char *rectmove);
VectorBlurOperation::VectorBlurOperation()
{
this->addInputSocket(DataType::Color);
- this->addInputSocket(DataType::Value); // ZBUF
- this->addInputSocket(DataType::Color); // SPEED
+ this->addInputSocket(DataType::Value); /* ZBUF */
+ this->addInputSocket(DataType::Color); /* SPEED */
this->addOutputSocket(DataType::Color);
this->m_settings = nullptr;
this->m_cachedInstance = nullptr;
diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cc b/source/blender/compositor/operations/COM_ViewerOperation.cc
index 37a45ac32cb..a038e8994d8 100644
--- a/source/blender/compositor/operations/COM_ViewerOperation.cc
+++ b/source/blender/compositor/operations/COM_ViewerOperation.cc
@@ -61,7 +61,7 @@ ViewerOperation::ViewerOperation()
void ViewerOperation::initExecution()
{
- // When initializing the tree during initial load the width and height can be zero.
+ /* When initializing the tree during initial load the width and height can be zero. */
this->m_imageInput = getInputSocketReader(0);
this->m_alphaInput = getInputSocketReader(1);
this->m_depthInput = getInputSocketReader(2);
diff --git a/source/blender/compositor/operations/COM_WriteBufferOperation.cc b/source/blender/compositor/operations/COM_WriteBufferOperation.cc
index e2dc6287baf..6380f6bf3df 100644
--- a/source/blender/compositor/operations/COM_WriteBufferOperation.cc
+++ b/source/blender/compositor/operations/COM_WriteBufferOperation.cc
@@ -126,7 +126,7 @@ void WriteBufferOperation::executeOpenCLRegion(OpenCLDevice *device,
*
* NOTE: list of cl_mem will be filled by 2, and needs to be cleaned up by 4
*/
- // STEP 1
+ /* STEP 1 */
const unsigned int outputBufferWidth = outputBuffer->getWidth();
const unsigned int outputBufferHeight = outputBuffer->getHeight();
@@ -144,7 +144,7 @@ void WriteBufferOperation::executeOpenCLRegion(OpenCLDevice *device,
printf("CLERROR[%d]: %s\n", error, clewErrorString(error));
}
- // STEP 2
+ /* STEP 2 */
std::list<cl_mem> *clMemToCleanUp = new std::list<cl_mem>();
clMemToCleanUp->push_back(clOutputBuffer);
std::list<cl_kernel> *clKernelsToCleanUp = new std::list<cl_kernel>();
@@ -156,7 +156,7 @@ void WriteBufferOperation::executeOpenCLRegion(OpenCLDevice *device,
clMemToCleanUp,
clKernelsToCleanUp);
- // STEP 3
+ /* STEP 3 */
size_t origin[3] = {0, 0, 0};
size_t region[3] = {outputBufferWidth, outputBufferHeight, 1};
@@ -185,7 +185,7 @@ void WriteBufferOperation::executeOpenCLRegion(OpenCLDevice *device,
this->getMemoryProxy()->getBuffer()->fill_from(*outputBuffer);
- // STEP 4
+ /* STEP 4 */
while (!clMemToCleanUp->empty()) {
cl_mem mem = clMemToCleanUp->front();
error = clReleaseMemObject(mem);
diff --git a/source/blender/depsgraph/DEG_depsgraph.h b/source/blender/depsgraph/DEG_depsgraph.h
index 47dad17b482..aa184cce433 100644
--- a/source/blender/depsgraph/DEG_depsgraph.h
+++ b/source/blender/depsgraph/DEG_depsgraph.h
@@ -82,7 +82,7 @@ extern "C" {
/* CRUD ------------------------------------------- */
-// Get main depsgraph instance from context!
+/* Get main depsgraph instance from context! */
/* Create new Depsgraph instance */
/* TODO: what args are needed here? What's the building-graph entry point? */
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 22bce10937d..a739a0fe337 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -112,6 +112,7 @@
#include "DEG_depsgraph_build.h"
#include "SEQ_iterator.h"
+#include "SEQ_sequencer.h"
#include "intern/builder/deg_builder.h"
#include "intern/builder/deg_builder_rna.h"
@@ -2032,6 +2033,27 @@ void DepsgraphNodeBuilder::build_simulation(Simulation *simulation)
});
}
+static bool seq_node_build_cb(Sequence *seq, void *user_data)
+{
+ DepsgraphNodeBuilder *nb = (DepsgraphNodeBuilder *)user_data;
+ nb->build_idproperties(seq->prop);
+ if (seq->sound != nullptr) {
+ nb->build_sound(seq->sound);
+ }
+ if (seq->scene != nullptr) {
+ nb->build_scene_parameters(seq->scene);
+ }
+ if (seq->type == SEQ_TYPE_SCENE && seq->scene != nullptr) {
+ if (seq->flag & SEQ_SCENE_STRIPS) {
+ nb->build_scene_sequencer(seq->scene);
+ }
+ ViewLayer *sequence_view_layer = BKE_view_layer_default_render(seq->scene);
+ nb->build_scene_speakers(seq->scene, sequence_view_layer);
+ }
+ /* TODO(sergey): Movie clip, scene, camera, mask. */
+ return true;
+}
+
void DepsgraphNodeBuilder::build_scene_sequencer(Scene *scene)
{
if (scene->ed == nullptr) {
@@ -2046,28 +2068,10 @@ void DepsgraphNodeBuilder::build_scene_sequencer(Scene *scene)
NodeType::SEQUENCER,
OperationCode::SEQUENCES_EVAL,
[scene_cow](::Depsgraph *depsgraph) {
- BKE_scene_eval_sequencer_sequences(depsgraph, scene_cow);
+ SEQ_eval_sequences(depsgraph, scene_cow, &scene_cow->ed->seqbase);
});
/* Make sure data for sequences is in the graph. */
- Sequence *seq;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- build_idproperties(seq->prop);
- if (seq->sound != nullptr) {
- build_sound(seq->sound);
- }
- if (seq->scene != nullptr) {
- build_scene_parameters(seq->scene);
- }
- if (seq->type == SEQ_TYPE_SCENE && seq->scene != nullptr) {
- if (seq->flag & SEQ_SCENE_STRIPS) {
- build_scene_sequencer(seq->scene);
- }
- ViewLayer *sequence_view_layer = BKE_view_layer_default_render(seq->scene);
- build_scene_speakers(seq->scene, sequence_view_layer);
- }
- /* TODO(sergey): Movie clip, scene, camera, mask. */
- }
- SEQ_ALL_END;
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_node_build_cb, this);
}
void DepsgraphNodeBuilder::build_scene_audio(Scene *scene)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index d88e9bc9c04..ab3081cb1ae 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -2769,6 +2769,45 @@ void DepsgraphRelationBuilder::build_simulation(Simulation *simulation)
add_relation(nodetree_key, simulation_eval_key, "NodeTree -> Simulation", 0);
}
+using Seq_build_prop_cb_data = struct Seq_build_prop_cb_data {
+ DepsgraphRelationBuilder *builder;
+ ComponentKey sequencer_key;
+ bool has_audio_strips;
+};
+
+static bool seq_build_prop_cb(Sequence *seq, void *user_data)
+{
+ Seq_build_prop_cb_data *cd = (Seq_build_prop_cb_data *)user_data;
+
+ cd->builder->build_idproperties(seq->prop);
+ if (seq->sound != nullptr) {
+ cd->builder->build_sound(seq->sound);
+ ComponentKey sound_key(&seq->sound->id, NodeType::AUDIO);
+ cd->builder->add_relation(sound_key, cd->sequencer_key, "Sound -> Sequencer");
+ cd->has_audio_strips = true;
+ }
+ if (seq->scene != nullptr) {
+ cd->builder->build_scene_parameters(seq->scene);
+ /* This is to support 3D audio. */
+ cd->has_audio_strips = true;
+ }
+ if (seq->type == SEQ_TYPE_SCENE && seq->scene != nullptr) {
+ if (seq->flag & SEQ_SCENE_STRIPS) {
+ cd->builder->build_scene_sequencer(seq->scene);
+ ComponentKey sequence_scene_audio_key(&seq->scene->id, NodeType::AUDIO);
+ cd->builder->add_relation(
+ sequence_scene_audio_key, cd->sequencer_key, "Sequence Scene Audio -> Sequencer");
+ ComponentKey sequence_scene_key(&seq->scene->id, NodeType::SEQUENCER);
+ cd->builder->add_relation(
+ sequence_scene_key, cd->sequencer_key, "Sequence Scene -> Sequencer");
+ }
+ ViewLayer *sequence_view_layer = BKE_view_layer_default_render(seq->scene);
+ cd->builder->build_scene_speakers(seq->scene, sequence_view_layer);
+ }
+ /* TODO(sergey): Movie clip, camera, mask. */
+ return true;
+}
+
void DepsgraphRelationBuilder::build_scene_sequencer(Scene *scene)
{
if (scene->ed == nullptr) {
@@ -2781,36 +2820,11 @@ void DepsgraphRelationBuilder::build_scene_sequencer(Scene *scene)
ComponentKey scene_audio_key(&scene->id, NodeType::AUDIO);
/* Make sure dependencies from sequences data goes to the sequencer evaluation. */
ComponentKey sequencer_key(&scene->id, NodeType::SEQUENCER);
- Sequence *seq;
- bool has_audio_strips = false;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- build_idproperties(seq->prop);
- if (seq->sound != nullptr) {
- build_sound(seq->sound);
- ComponentKey sound_key(&seq->sound->id, NodeType::AUDIO);
- add_relation(sound_key, sequencer_key, "Sound -> Sequencer");
- has_audio_strips = true;
- }
- if (seq->scene != nullptr) {
- build_scene_parameters(seq->scene);
- /* This is to support 3D audio. */
- has_audio_strips = true;
- }
- if (seq->type == SEQ_TYPE_SCENE && seq->scene != nullptr) {
- if (seq->flag & SEQ_SCENE_STRIPS) {
- build_scene_sequencer(seq->scene);
- ComponentKey sequence_scene_audio_key(&seq->scene->id, NodeType::AUDIO);
- add_relation(sequence_scene_audio_key, sequencer_key, "Sequence Scene Audio -> Sequencer");
- ComponentKey sequence_scene_key(&seq->scene->id, NodeType::SEQUENCER);
- add_relation(sequence_scene_key, sequencer_key, "Sequence Scene -> Sequencer");
- }
- ViewLayer *sequence_view_layer = BKE_view_layer_default_render(seq->scene);
- build_scene_speakers(seq->scene, sequence_view_layer);
- }
- /* TODO(sergey): Movie clip, camera, mask. */
- }
- SEQ_ALL_END;
- if (has_audio_strips) {
+
+ Seq_build_prop_cb_data cb_data = {this, sequencer_key, false};
+
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_build_prop_cb, &cb_data);
+ if (cb_data.has_audio_strips) {
add_relation(sequencer_key, scene_audio_key, "Sequencer -> Audio");
}
}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc
index b9ce29ce8d2..bf3af571f0b 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_drivers.cc
@@ -125,13 +125,13 @@ static bool is_reachable(const Node *const from, const Node *const to)
return true;
}
- // Perform a graph walk from 'to' towards its incoming connections.
- // Walking from 'from' towards its outgoing connections is 10x slower on the Spring rig.
+ /* Perform a graph walk from 'to' towards its incoming connections.
+ * Walking from 'from' towards its outgoing connections is 10x slower on the Spring rig. */
deque<const Node *> queue;
Set<const Node *> seen;
queue.push_back(to);
while (!queue.empty()) {
- // Visit the next node to inspect.
+ /* Visit the next node to inspect. */
const Node *visit = queue.back();
queue.pop_back();
@@ -139,7 +139,7 @@ static bool is_reachable(const Node *const from, const Node *const to)
return true;
}
- // Queue all incoming relations that we haven't seen before.
+ /* Queue all incoming relations that we haven't seen before. */
for (Relation *relation : visit->inlinks) {
const Node *prev_node = relation->from;
if (seen.add(prev_node)) {
@@ -177,7 +177,7 @@ void DepsgraphRelationBuilder::build_driver_relations(IDNode *id_node)
return;
}
- // Mapping from RNA prefix -> set of driver descriptors:
+ /* Mapping from RNA prefix -> set of driver descriptors: */
Map<string, Vector<DriverDescriptor>> driver_groups;
PointerRNA id_ptr;
@@ -197,47 +197,47 @@ void DepsgraphRelationBuilder::build_driver_relations(IDNode *id_node)
}
for (Span<DriverDescriptor> prefix_group : driver_groups.values()) {
- // For each node in the driver group, try to connect it to another node
- // in the same group without creating any cycles.
+ /* For each node in the driver group, try to connect it to another node
+ * in the same group without creating any cycles. */
int num_drivers = prefix_group.size();
if (num_drivers < 2) {
- // A relation requires two drivers.
+ /* A relation requires two drivers. */
continue;
}
for (int from_index = 0; from_index < num_drivers; ++from_index) {
const DriverDescriptor &driver_from = prefix_group[from_index];
Node *op_from = get_node(driver_from.depsgraph_key());
- // Start by trying the next node in the group.
+ /* Start by trying the next node in the group. */
for (int to_offset = 1; to_offset < num_drivers; ++to_offset) {
const int to_index = (from_index + to_offset) % num_drivers;
const DriverDescriptor &driver_to = prefix_group[to_index];
Node *op_to = get_node(driver_to.depsgraph_key());
- // Duplicate drivers can exist (see T78615), but cannot be distinguished by OperationKey
- // and thus have the same depsgraph node. Relations between those drivers should not be
- // created. This not something that is expected to happen (both the UI and the Python API
- // prevent duplicate drivers), it did happen in a file and it is easy to deal with here.
+ /* Duplicate drivers can exist (see T78615), but cannot be distinguished by OperationKey
+ * and thus have the same depsgraph node. Relations between those drivers should not be
+ * created. This not something that is expected to happen (both the UI and the Python API
+ * prevent duplicate drivers), it did happen in a file and it is easy to deal with here. */
if (op_from == op_to) {
continue;
}
if (from_index < to_index && driver_from.is_same_array_as(driver_to)) {
- // This is for adding a relation like `color[0]` -> `color[1]`.
- // When the search for another driver wraps around, we cannot blindly add relations any
- // more.
+ /* This is for adding a relation like `color[0]` -> `color[1]`.
+ * When the search for another driver wraps around,
+ * we cannot blindly add relations any more. */
}
else {
- // Investigate whether this relation would create a dependency cycle.
- // Example graph:
- // A -> B -> C
- // and investigating a potential connection C->A. Because A->C is an
- // existing transitive connection, adding C->A would create a cycle.
+ /* Investigate whether this relation would create a dependency cycle.
+ * Example graph:
+ * A -> B -> C
+ * and investigating a potential connection C->A. Because A->C is an
+ * existing transitive connection, adding C->A would create a cycle. */
if (is_reachable(op_to, op_from)) {
continue;
}
- // No need to directly connect this node if there is already a transitive connection.
+ /* No need to directly connect this node if there is already a transitive connection. */
if (is_reachable(op_from, op_to)) {
break;
}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_keys.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_keys.cc
index e0a7a42ea4a..bad4e96c60b 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations_keys.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_keys.cc
@@ -28,7 +28,7 @@
namespace blender::deg {
////////////////////////////////////////////////////////////////////////////////
-// Time source.
+/* Time source. */
TimeSourceKey::TimeSourceKey() : id(nullptr)
{
diff --git a/source/blender/depsgraph/intern/debug/deg_time_average.h b/source/blender/depsgraph/intern/debug/deg_time_average.h
index 838ceff8d96..4ed78fe70cb 100644
--- a/source/blender/depsgraph/intern/debug/deg_time_average.h
+++ b/source/blender/depsgraph/intern/debug/deg_time_average.h
@@ -26,8 +26,7 @@
namespace blender {
namespace deg {
-// Utility class which takes care of calculating average of time series, such as
-// FPS counters.
+/* Utility class which takes care of calculating average of time series, such as FPS counters. */
template<int MaxSamples> class AveragedTimeSampler {
public:
AveragedTimeSampler() : num_samples_(0), next_sample_index_(0)
@@ -38,13 +37,13 @@ template<int MaxSamples> class AveragedTimeSampler {
{
samples_[next_sample_index_] = value;
- // Move to the next index, keeping wrapping at the end of array into account.
+ /* Move to the next index, keeping wrapping at the end of array into account. */
++next_sample_index_;
if (next_sample_index_ == MaxSamples) {
next_sample_index_ = 0;
}
- // Update number of stored samples.
+ /* Update number of stored samples. */
if (num_samples_ != MaxSamples) {
++num_samples_;
}
@@ -62,10 +61,10 @@ template<int MaxSamples> class AveragedTimeSampler {
protected:
double samples_[MaxSamples];
- // Number of samples which are actually stored in the array.
+ /* Number of samples which are actually stored in the array. */
int num_samples_;
- // Index in the samples_ array under which next sample will be stored.
+ /* Index in the samples_ array under which next sample will be stored. */
int next_sample_index_;
};
diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index df1cf8cc771..770d9775dd3 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -51,9 +51,9 @@
# include "intern/eval/deg_eval_copy_on_write.h"
#endif
-// If defined, all working data will be set to an invalid state, helping
-// to catch issues when areas accessing data which is considered to be no
-// longer available.
+/* If defined, all working data will be set to an invalid state, helping
+ * to catch issues when areas accessing data which is considered to be no
+ * longer available. */
#undef INVALIDATE_WORK_DATA
#ifndef NDEBUG
@@ -79,22 +79,20 @@ void deg_invalidate_iterator_work_data(DEGObjectIterData *data)
void verify_id_properties_freed(DEGObjectIterData *data)
{
if (data->dupli_object_current == nullptr) {
- // We didn't enter duplication yet, so we can't have any dangling
- // pointers.
+ /* We didn't enter duplication yet, so we can't have any dangling pointers. */
return;
}
const Object *dupli_object = data->dupli_object_current->ob;
Object *temp_dupli_object = &data->temp_dupli_object;
if (temp_dupli_object->id.properties == nullptr) {
- // No ID properties in temp data-block -- no leak is possible.
+ /* No ID properties in temp data-block -- no leak is possible. */
return;
}
if (temp_dupli_object->id.properties == dupli_object->id.properties) {
- // Temp copy of object did not modify ID properties.
+ /* Temp copy of object did not modify ID properties. */
return;
}
- // Free memory which is owned by temporary storage which is about to
- // get overwritten.
+ /* Free memory which is owned by temporary storage which is about to get overwritten. */
IDP_FreeProperty(temp_dupli_object->id.properties);
temp_dupli_object->id.properties = nullptr;
}
diff --git a/source/blender/depsgraph/intern/depsgraph_registry.cc b/source/blender/depsgraph/intern/depsgraph_registry.cc
index f348ef6e6e9..cc9fcf78292 100644
--- a/source/blender/depsgraph/intern/depsgraph_registry.cc
+++ b/source/blender/depsgraph/intern/depsgraph_registry.cc
@@ -49,7 +49,7 @@ void unregister_graph(Depsgraph *depsgraph)
VectorSet<Depsgraph *> &graphs = graph_registry.lookup(bmain);
graphs.remove(depsgraph);
- // If this was the last depsgraph associated with the main, remove the main entry as well.
+ /* If this was the last depsgraph associated with the main, remove the main entry as well. */
if (graphs.is_empty()) {
graph_registry.remove(bmain);
}
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc
index 34c23740730..166ca37bc35 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc
@@ -38,33 +38,43 @@ SequencerBackup::SequencerBackup(const Depsgraph *depsgraph) : depsgraph(depsgra
{
}
+static bool seq_init_cb(Sequence *seq, void *user_data)
+{
+ SequencerBackup *sb = (SequencerBackup *)user_data;
+ SequenceBackup sequence_backup(sb->depsgraph);
+ sequence_backup.init_from_sequence(seq);
+ if (!sequence_backup.isEmpty()) {
+ const SessionUUID &session_uuid = seq->runtime.session_uuid;
+ BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
+ sb->sequences_backup.add(session_uuid, sequence_backup);
+ }
+ return true;
+}
+
void SequencerBackup::init_from_scene(Scene *scene)
{
- Sequence *sequence;
- SEQ_ALL_BEGIN (scene->ed, sequence) {
- SequenceBackup sequence_backup(depsgraph);
- sequence_backup.init_from_sequence(sequence);
- if (!sequence_backup.isEmpty()) {
- const SessionUUID &session_uuid = sequence->runtime.session_uuid;
- BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
- sequences_backup.add(session_uuid, sequence_backup);
- }
+ if (scene->ed != nullptr) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_init_cb, this);
}
- SEQ_ALL_END;
+}
+
+static bool seq_restore_cb(Sequence *seq, void *user_data)
+{
+ SequencerBackup *sb = (SequencerBackup *)user_data;
+ const SessionUUID &session_uuid = seq->runtime.session_uuid;
+ BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
+ SequenceBackup *sequence_backup = sb->sequences_backup.lookup_ptr(session_uuid);
+ if (sequence_backup != nullptr) {
+ sequence_backup->restore_to_sequence(seq);
+ }
+ return true;
}
void SequencerBackup::restore_to_scene(Scene *scene)
{
- Sequence *sequence;
- SEQ_ALL_BEGIN (scene->ed, sequence) {
- const SessionUUID &session_uuid = sequence->runtime.session_uuid;
- BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
- SequenceBackup *sequence_backup = sequences_backup.lookup_ptr(session_uuid);
- if (sequence_backup != nullptr) {
- sequence_backup->restore_to_sequence(sequence);
- }
+ if (scene->ed != nullptr) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_restore_cb, this);
}
- SEQ_ALL_END;
/* Cleanup audio while the scene is still known. */
for (SequenceBackup &sequence_backup : sequences_backup.values()) {
if (sequence_backup.scene_sound != nullptr) {
diff --git a/source/blender/depsgraph/intern/node/deg_node_component.cc b/source/blender/depsgraph/intern/node/deg_node_component.cc
index 431bf536b65..a29618cefa8 100644
--- a/source/blender/depsgraph/intern/node/deg_node_component.cc
+++ b/source/blender/depsgraph/intern/node/deg_node_component.cc
@@ -237,7 +237,7 @@ void ComponentNode::tag_update(Depsgraph *graph, eUpdateSource source)
for (OperationNode *op_node : operations) {
op_node->tag_update(graph, source);
}
- // It is possible that tag happens before finalization.
+ /* It is possible that tag happens before finalization. */
if (operations_map != nullptr) {
for (OperationNode *op_node : operations_map->values()) {
op_node->tag_update(graph, source);
diff --git a/source/blender/draw/engines/image/image_engine.c b/source/blender/draw/engines/image/image_engine.c
index b4c0ade380e..662238df270 100644
--- a/source/blender/draw/engines/image/image_engine.c
+++ b/source/blender/draw/engines/image/image_engine.c
@@ -120,7 +120,7 @@ static void space_image_gpu_texture_get(Image *image,
}
if (ibuf->rect == NULL && ibuf->rect_float == NULL) {
- /* This codepath is only supposed to happen when drawing a lazily-allocatable render result.
+ /* This code-path is only supposed to happen when drawing a lazily-allocatable render result.
* In all the other cases the `ED_space_image_acquire_buffer()` is expected to return NULL as
* an image buffer when it has no pixels. */
diff --git a/source/blender/draw/engines/overlay/overlay_edit_uv.c b/source/blender/draw/engines/overlay/overlay_edit_uv.c
index c2b130163e8..985f8a6785c 100644
--- a/source/blender/draw/engines/overlay/overlay_edit_uv.c
+++ b/source/blender/draw/engines/overlay/overlay_edit_uv.c
@@ -333,14 +333,8 @@ void OVERLAY_edit_uv_cache_init(OVERLAY_Data *vedata)
BLI_snprintf(text, 5, "%d", tile->tile_number);
float tile_location[3] = {
((tile->tile_number - 1001) % 10), ((tile->tile_number - 1001) / 10), 0.0f};
- DRW_text_cache_add(dt,
- tile_location,
- text,
- strlen(text),
- 10,
- 10,
- DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_ASCII,
- color);
+ DRW_text_cache_add(
+ dt, tile_location, text, strlen(text), 10, 10, DRW_TEXT_CACHE_GLOBALSPACE, color);
}
}
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 04d90919a20..8f9db7f6f13 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -861,11 +861,8 @@ typedef union OVERLAY_CameraInstanceData {
};
} OVERLAY_CameraInstanceData;
-static void camera_view3d_reconstruction(OVERLAY_ExtraCallBuffers *cb,
- Scene *scene,
- View3D *v3d,
- Object *ob,
- const float color[4])
+static void camera_view3d_reconstruction(
+ OVERLAY_ExtraCallBuffers *cb, Scene *scene, View3D *v3d, Object *ob, const float color[4])
{
const DRWContextState *draw_ctx = DRW_context_state_get();
const bool is_select = DRW_state_is_select();
diff --git a/source/blender/draw/engines/overlay/overlay_motion_path.c b/source/blender/draw/engines/overlay/overlay_motion_path.c
index e19d99dc597..1b7611e9620 100644
--- a/source/blender/draw/engines/overlay/overlay_motion_path.c
+++ b/source/blender/draw/engines/overlay/overlay_motion_path.c
@@ -130,7 +130,7 @@ static void motion_path_cache(OVERLAY_Data *vedata,
OVERLAY_PrivateData *pd = vedata->stl->pd;
const DRWContextState *draw_ctx = DRW_context_state_get();
struct DRWTextStore *dt = DRW_text_cache_ensure();
- int txt_flag = DRW_TEXT_CACHE_GLOBALSPACE | DRW_TEXT_CACHE_ASCII;
+ int txt_flag = DRW_TEXT_CACHE_GLOBALSPACE;
int cfra = (int)DEG_get_ctime(draw_ctx->depsgraph);
bool selected = (pchan) ? (pchan->bone->flag & BONE_SELECTED) : (ob->base_flag & BASE_SELECTED);
bool show_keyframes = (avs->path_viewflag & MOTIONPATH_VIEW_KFRAS) != 0;
diff --git a/source/blender/draw/intern/draw_cache_extract.h b/source/blender/draw/intern/draw_cache_extract.h
index db96d6a774f..a680cc0d6b7 100644
--- a/source/blender/draw/intern/draw_cache_extract.h
+++ b/source/blender/draw/intern/draw_cache_extract.h
@@ -304,8 +304,8 @@ typedef struct MeshBatchCache {
MBC_EDITUV_EDGES | MBC_EDITUV_VERTS | MBC_EDITUV_FACEDOTS | MBC_WIRE_LOOPS_UVS)
void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph,
- MeshBatchCache *mbc,
- MeshBufferCache *extraction_cache,
+ MeshBatchCache *cache,
+ MeshBufferCache *mbc,
Mesh *me,
const bool is_editmode,
const bool is_paint_mode,
diff --git a/source/blender/draw/intern/draw_manager_profiling.c b/source/blender/draw/intern/draw_manager_profiling.c
index 783ec1b1d7d..d9ba2cbf932 100644
--- a/source/blender/draw/intern/draw_manager_profiling.c
+++ b/source/blender/draw/intern/draw_manager_profiling.c
@@ -209,16 +209,16 @@ void DRW_stats_reset(void)
static void draw_stat_5row(const rcti *rect, int u, int v, const char *txt, const int size)
{
- BLF_draw_default_ascii(rect->xmin + (1 + u * 5) * U.widget_unit,
- rect->ymax - (3 + v) * U.widget_unit,
- 0.0f,
- txt,
- size);
+ BLF_draw_default(rect->xmin + (1 + u * 5) * U.widget_unit,
+ rect->ymax - (3 + v) * U.widget_unit,
+ 0.0f,
+ txt,
+ size);
}
static void draw_stat(const rcti *rect, int u, int v, const char *txt, const int size)
{
- BLF_draw_default_ascii(
+ BLF_draw_default(
rect->xmin + (1 + u) * U.widget_unit, rect->ymax - (3 + v) * U.widget_unit, 0.0f, txt, size);
}
diff --git a/source/blender/draw/intern/draw_manager_text.c b/source/blender/draw/intern/draw_manager_text.c
index 265fdba66fd..cfaa22ba7c6 100644
--- a/source/blender/draw/intern/draw_manager_text.c
+++ b/source/blender/draw/intern/draw_manager_text.c
@@ -152,11 +152,9 @@ static void drw_text_cache_draw_ex(DRWTextStore *dt, ARegion *region)
BLF_position(
font_id, (float)(vos->sco[0] + vos->xoffs), (float)(vos->sco[1] + vos->yoffs), 2.0f);
-
- ((vos->flag & DRW_TEXT_CACHE_ASCII) ? BLF_draw_ascii : BLF_draw)(
- font_id,
- (vos->flag & DRW_TEXT_CACHE_STRING_PTR) ? *((const char **)vos->str) : vos->str,
- vos->str_len);
+ BLF_draw(font_id,
+ (vos->flag & DRW_TEXT_CACHE_STRING_PTR) ? *((const char **)vos->str) : vos->str,
+ vos->str_len);
}
}
@@ -235,7 +233,7 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region,
* etc.). See bug T36090.
*/
struct DRWTextStore *dt = DRW_text_cache_ensure();
- const short txt_flag = DRW_TEXT_CACHE_GLOBALSPACE | (unit->system ? 0 : DRW_TEXT_CACHE_ASCII);
+ const short txt_flag = DRW_TEXT_CACHE_GLOBALSPACE;
Mesh *me = ob->data;
BMEditMesh *em = me->edit_mesh;
float v1[3], v2[3], v3[3], vmid[3], fvec[3];
diff --git a/source/blender/draw/intern/draw_manager_text.h b/source/blender/draw/intern/draw_manager_text.h
index f6dff335f1f..760259018bb 100644
--- a/source/blender/draw/intern/draw_manager_text.h
+++ b/source/blender/draw/intern/draw_manager_text.h
@@ -48,7 +48,7 @@ void DRW_text_edit_mesh_measure_stats(struct ARegion *region,
const struct UnitSettings *unit);
enum {
- DRW_TEXT_CACHE_ASCII = (1 << 0),
+ // DRW_UNUSED_1 = (1 << 0), /* dirty */
DRW_TEXT_CACHE_GLOBALSPACE = (1 << 1),
DRW_TEXT_CACHE_LOCALCLIP = (1 << 2),
/* reference the string by pointer */
diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c
index c39fcb790dd..1dbb859fd6c 100644
--- a/source/blender/editors/armature/pose_select.c
+++ b/source/blender/editors/armature/pose_select.c
@@ -503,6 +503,8 @@ static bool pose_select_linked_pick_poll(bContext *C)
void POSE_OT_select_linked_pick(wmOperatorType *ot)
{
+ PropertyRNA *prop;
+
/* identifiers */
ot->name = "Select Connected";
ot->idname = "POSE_OT_select_linked_pick";
@@ -517,11 +519,12 @@ void POSE_OT_select_linked_pick(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* props */
- RNA_def_boolean(ot->srna,
- "extend",
- false,
- "Extend",
- "Extend selection instead of deselecting everything first");
+ prop = RNA_def_boolean(ot->srna,
+ "extend",
+ false,
+ "Extend",
+ "Extend selection instead of deselecting everything first");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
static int pose_select_linked_exec(bContext *C, wmOperator *UNUSED(op))
diff --git a/source/blender/editors/asset/CMakeLists.txt b/source/blender/editors/asset/CMakeLists.txt
index 7e578b78809..31c07580570 100644
--- a/source/blender/editors/asset/CMakeLists.txt
+++ b/source/blender/editors/asset/CMakeLists.txt
@@ -51,8 +51,8 @@ set(SRC
)
set(LIB
- bf_blenloader
bf_blenkernel
+ bf_blenloader
)
blender_add_lib(bf_editor_asset "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
diff --git a/source/blender/editors/asset/ED_asset_filter.h b/source/blender/editors/asset/ED_asset_filter.h
index fb2d3bfb273..340c4c9dbe7 100644
--- a/source/blender/editors/asset/ED_asset_filter.h
+++ b/source/blender/editors/asset/ED_asset_filter.h
@@ -24,8 +24,8 @@
extern "C" {
#endif
-struct AssetHandle;
struct AssetFilterSettings;
+struct AssetHandle;
bool ED_asset_filter_matches_asset(const struct AssetFilterSettings *filter,
const struct AssetHandle *asset);
diff --git a/source/blender/editors/asset/ED_asset_list.h b/source/blender/editors/asset/ED_asset_list.h
index 55a0ac0b500..61d7729b651 100644
--- a/source/blender/editors/asset/ED_asset_list.h
+++ b/source/blender/editors/asset/ED_asset_list.h
@@ -27,8 +27,8 @@ extern "C" {
struct AssetFilterSettings;
struct AssetHandle;
struct AssetLibraryReference;
-struct bContext;
struct ID;
+struct bContext;
struct wmNotifier;
void ED_assetlist_storage_fetch(const struct AssetLibraryReference *library_reference,
diff --git a/source/blender/editors/asset/ED_asset_list.hh b/source/blender/editors/asset/ED_asset_list.hh
index fee34d929c2..dcc07f54e75 100644
--- a/source/blender/editors/asset/ED_asset_list.hh
+++ b/source/blender/editors/asset/ED_asset_list.hh
@@ -24,10 +24,10 @@
#include "BLI_function_ref.hh"
-struct AssetLibraryReference;
struct AssetHandle;
-struct bContext;
+struct AssetLibraryReference;
struct FileDirEntry;
+struct bContext;
std::string ED_assetlist_asset_filepath_get(const bContext *C,
const AssetLibraryReference &library_reference,
diff --git a/source/blender/editors/asset/ED_asset_mark_clear.h b/source/blender/editors/asset/ED_asset_mark_clear.h
index cdd1f0d080b..7524ec6b02a 100644
--- a/source/blender/editors/asset/ED_asset_mark_clear.h
+++ b/source/blender/editors/asset/ED_asset_mark_clear.h
@@ -24,8 +24,8 @@
extern "C" {
#endif
-struct bContext;
struct ID;
+struct bContext;
bool ED_asset_mark_id(const struct bContext *C, struct ID *id);
bool ED_asset_clear_id(struct ID *id);
diff --git a/source/blender/editors/asset/ED_asset_temp_id_consumer.h b/source/blender/editors/asset/ED_asset_temp_id_consumer.h
index 7c10d88262e..9a47e435612 100644
--- a/source/blender/editors/asset/ED_asset_temp_id_consumer.h
+++ b/source/blender/editors/asset/ED_asset_temp_id_consumer.h
@@ -30,9 +30,9 @@ typedef struct AssetTempIDConsumer AssetTempIDConsumer;
struct AssetHandle;
struct AssetLibraryReference;
-struct bContext;
struct Main;
struct ReportList;
+struct bContext;
AssetTempIDConsumer *ED_asset_temp_id_consumer_create(const struct AssetHandle *handle);
void ED_asset_temp_id_consumer_free(AssetTempIDConsumer **consumer);
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index b7deea5069e..d029bb539ba 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -59,6 +59,7 @@
#include "ED_curve.h"
#include "ED_object.h"
+#include "ED_outliner.h"
#include "ED_screen.h"
#include "ED_view3d.h"
@@ -704,6 +705,7 @@ static void txt_add_object(bContext *C,
void ED_text_to_object(bContext *C, const Text *text, const bool split_lines)
{
+ Main *bmain = CTX_data_main(C);
RegionView3D *rv3d = CTX_wm_region_view3d(C);
const TextLine *line;
float offset[3];
@@ -742,6 +744,9 @@ void ED_text_to_object(bContext *C, const Text *text, const bool split_lines)
txt_add_object(C, text->lines.first, BLI_listbase_count(&text->lines), offset);
}
+
+ DEG_relations_tag_update(bmain);
+ ED_outliner_select_sync_from_object_tag(C);
}
/** \} */
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 3141c8f707b..a9cf04e1ad7 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -50,10 +50,10 @@ struct bContext;
struct bFaceMap;
struct bPoseChannel;
struct uiLayout;
+struct wmEvent;
struct wmKeyConfig;
struct wmOperator;
struct wmOperatorType;
-struct wmEvent;
/* object_edit.c */
/* context.object */
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 30be3588b5a..7211cf9f893 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -35,8 +35,8 @@ extern "C" {
/* Struct Declarations */
struct ARegion;
-struct AssetHandle;
struct AssetFilterSettings;
+struct AssetHandle;
struct AutoComplete;
struct EnumPropertyItem;
struct FileDirEntry;
diff --git a/source/blender/editors/interface/interface_eyedropper.c b/source/blender/editors/interface/interface_eyedropper.c
index b52bfc81b7a..2e7b0ce532c 100644
--- a/source/blender/editors/interface/interface_eyedropper.c
+++ b/source/blender/editors/interface/interface_eyedropper.c
@@ -125,24 +125,13 @@ void eyedropper_draw_cursor_text_window(const struct wmWindow *window, const cha
eyedropper_draw_cursor_text_ex(x, y, name);
}
-void eyedropper_draw_cursor_text_region(const struct bContext *C,
- const ARegion *region,
- const char *name)
+void eyedropper_draw_cursor_text_region(const int x, const int y, const char *name)
{
- wmWindow *win = CTX_wm_window(C);
- const int x = win->eventstate->x;
- const int y = win->eventstate->y;
-
- if ((name[0] == '\0') || (BLI_rcti_isect_pt(&region->winrct, x, y) == false)) {
+ if (name[0] == '\0') {
return;
}
- const int mval[2] = {
- x - region->winrct.xmin,
- y - region->winrct.ymin,
- };
-
- eyedropper_draw_cursor_text_ex(mval[0], mval[1], name);
+ eyedropper_draw_cursor_text_ex(x, y, name);
}
/**
@@ -168,4 +157,25 @@ uiBut *eyedropper_get_property_button_under_mouse(bContext *C, const wmEvent *ev
return but;
}
+void datadropper_win_area_find(
+ const bContext *C, const int mval[2], int r_mval[2], wmWindow **r_win, ScrArea **r_area)
+{
+ bScreen *screen = CTX_wm_screen(C);
+
+ *r_win = CTX_wm_window(C);
+ *r_area = BKE_screen_find_area_xy(screen, -1, mval[0], mval[1]);
+ if (*r_area == NULL) {
+ wmWindowManager *wm = CTX_wm_manager(C);
+ *r_win = WM_window_find_under_cursor(wm, NULL, *r_win, mval, r_mval);
+ if (*r_win) {
+ screen = WM_window_get_active_screen(*r_win);
+ *r_area = BKE_screen_find_area_xy(screen, SPACE_TYPE_ANY, r_mval[0], r_mval[1]);
+ }
+ }
+ else if (mval != r_mval) {
+ r_mval[0] = mval[0];
+ r_mval[1] = mval[1];
+ }
+}
+
/** \} */
diff --git a/source/blender/editors/interface/interface_eyedropper_color.c b/source/blender/editors/interface/interface_eyedropper_color.c
index ba72cecc514..9d06fb2b27a 100644
--- a/source/blender/editors/interface/interface_eyedropper_color.c
+++ b/source/blender/editors/interface/interface_eyedropper_color.c
@@ -337,52 +337,41 @@ void eyedropper_color_sample_fl(bContext *C, int mx, int my, float r_col[3])
const char *display_device = CTX_data_scene(C)->display_settings.display_device;
struct ColorManagedDisplay *display = IMB_colormanagement_display_get_named(display_device);
- wmWindow *win = CTX_wm_window(C);
- bScreen *screen = CTX_wm_screen(C);
- ScrArea *area = BKE_screen_find_area_xy(screen, SPACE_TYPE_ANY, mx, my);
- if (area == NULL) {
- int mval[2] = {mx, my};
- if (WM_window_find_under_cursor(wm, NULL, win, mval, &win, mval)) {
- mx = mval[0];
- my = mval[1];
- screen = WM_window_get_active_screen(win);
- area = BKE_screen_find_area_xy(screen, SPACE_TYPE_ANY, mx, my);
- }
- else {
- win = NULL;
- }
- }
+ wmWindow *win;
+ ScrArea *area;
+ int mval[2] = {mx, my};
+ datadropper_win_area_find(C, mval, mval, &win, &area);
if (area) {
if (area->spacetype == SPACE_IMAGE) {
- ARegion *region = BKE_area_find_region_xy(area, RGN_TYPE_WINDOW, mx, my);
+ ARegion *region = BKE_area_find_region_xy(area, RGN_TYPE_WINDOW, mval[0], mval[1]);
if (region) {
SpaceImage *sima = area->spacedata.first;
- int mval[2] = {mx - region->winrct.xmin, my - region->winrct.ymin};
+ int region_mval[2] = {mval[0] - region->winrct.xmin, mval[1] - region->winrct.ymin};
- if (ED_space_image_color_sample(sima, region, mval, r_col, NULL)) {
+ if (ED_space_image_color_sample(sima, region, region_mval, r_col, NULL)) {
return;
}
}
}
else if (area->spacetype == SPACE_NODE) {
- ARegion *region = BKE_area_find_region_xy(area, RGN_TYPE_WINDOW, mx, my);
+ ARegion *region = BKE_area_find_region_xy(area, RGN_TYPE_WINDOW, mval[0], mval[1]);
if (region) {
SpaceNode *snode = area->spacedata.first;
- const int mval[2] = {mx - region->winrct.xmin, my - region->winrct.ymin};
+ int region_mval[2] = {mval[0] - region->winrct.xmin, mval[1] - region->winrct.ymin};
- if (ED_space_node_color_sample(bmain, snode, region, mval, r_col)) {
+ if (ED_space_node_color_sample(bmain, snode, region, region_mval, r_col)) {
return;
}
}
}
else if (area->spacetype == SPACE_CLIP) {
- ARegion *region = BKE_area_find_region_xy(area, RGN_TYPE_WINDOW, mx, my);
+ ARegion *region = BKE_area_find_region_xy(area, RGN_TYPE_WINDOW, mval[0], mval[1]);
if (region) {
SpaceClip *sc = area->spacedata.first;
- int mval[2] = {mx - region->winrct.xmin, my - region->winrct.ymin};
+ int region_mval[2] = {mval[0] - region->winrct.xmin, mval[1] - region->winrct.ymin};
- if (ED_space_clip_color_sample(sc, region, mval, r_col)) {
+ if (ED_space_clip_color_sample(sc, region, region_mval, r_col)) {
return;
}
}
@@ -391,7 +380,6 @@ void eyedropper_color_sample_fl(bContext *C, int mx, int my, float r_col[3])
if (win) {
/* Fallback to simple opengl picker. */
- const int mval[2] = {mx, my};
WM_window_pixel_sample_read(wm, win, mval, r_col);
IMB_colormanagement_display_to_scene_linear_v3(r_col, display);
}
diff --git a/source/blender/editors/interface/interface_eyedropper_datablock.c b/source/blender/editors/interface/interface_eyedropper_datablock.c
index 8c605598cbc..4996c803dfe 100644
--- a/source/blender/editors/interface/interface_eyedropper_datablock.c
+++ b/source/blender/editors/interface/interface_eyedropper_datablock.c
@@ -71,13 +71,16 @@ typedef struct DataDropper {
ScrArea *cursor_area; /* Area under the cursor */
ARegionType *art;
void *draw_handle_pixel;
+ int name_pos[2];
char name[200];
} DataDropper;
-static void datadropper_draw_cb(const struct bContext *C, ARegion *region, void *arg)
+static void datadropper_draw_cb(const struct bContext *UNUSED(C),
+ ARegion *UNUSED(region),
+ void *arg)
{
DataDropper *ddr = arg;
- eyedropper_draw_cursor_text_region(C, region, ddr->name);
+ eyedropper_draw_cursor_text_region(UNPACK2(ddr->name_pos), ddr->name);
}
static int datadropper_init(bContext *C, wmOperator *op)
@@ -148,12 +151,10 @@ static void datadropper_exit(bContext *C, wmOperator *op)
/**
* \brief get the ID from the 3D view or outliner.
*/
-static void datadropper_id_sample_pt(bContext *C, DataDropper *ddr, int mx, int my, ID **r_id)
+static void datadropper_id_sample_pt(
+ bContext *C, wmWindow *win, ScrArea *area, DataDropper *ddr, int mx, int my, ID **r_id)
{
- /* we could use some clever */
- bScreen *screen = CTX_wm_screen(C);
- ScrArea *area = BKE_screen_find_area_xy(screen, -1, mx, my);
-
+ wmWindow *win_prev = CTX_wm_window(C);
ScrArea *area_prev = CTX_wm_area(C);
ARegion *region_prev = CTX_wm_region(C);
@@ -166,6 +167,7 @@ static void datadropper_id_sample_pt(bContext *C, DataDropper *ddr, int mx, int
const int mval[2] = {mx - region->winrct.xmin, my - region->winrct.ymin};
Base *base;
+ CTX_wm_window_set(C, win);
CTX_wm_area_set(C, area);
CTX_wm_region_set(C, region);
@@ -202,11 +204,15 @@ static void datadropper_id_sample_pt(bContext *C, DataDropper *ddr, int mx, int
BLI_snprintf(ddr->name, sizeof(ddr->name), "%s: %s", ddr->idcode_name, id->name + 2);
*r_id = id;
}
+
+ ddr->name_pos[0] = mval[0];
+ ddr->name_pos[1] = mval[1];
}
}
}
}
+ CTX_wm_window_set(C, win_prev);
CTX_wm_area_set(C, area_prev);
CTX_wm_region_set(C, region_prev);
}
@@ -232,7 +238,13 @@ static bool datadropper_id_sample(bContext *C, DataDropper *ddr, int mx, int my)
{
ID *id = NULL;
- datadropper_id_sample_pt(C, ddr, mx, my, &id);
+ wmWindow *win;
+ ScrArea *area;
+
+ int mval[] = {mx, my};
+ datadropper_win_area_find(C, mval, mval, &win, &area);
+
+ datadropper_id_sample_pt(C, win, area, ddr, mval[0], mval[1], &id);
return datadropper_id_set(C, ddr, id);
}
@@ -244,14 +256,8 @@ static void datadropper_cancel(bContext *C, wmOperator *op)
}
/* To switch the draw callback when region under mouse event changes */
-static void datadropper_set_draw_callback_region(bContext *C,
- DataDropper *ddr,
- const int mx,
- const int my)
+static void datadropper_set_draw_callback_region(ScrArea *area, DataDropper *ddr)
{
- bScreen *screen = CTX_wm_screen(C);
- ScrArea *area = BKE_screen_find_area_xy(screen, -1, mx, my);
-
if (area) {
/* If spacetype changed */
if (area->spacetype != ddr->cursor_area->spacetype) {
@@ -300,10 +306,16 @@ static int datadropper_modal(bContext *C, wmOperator *op, const wmEvent *event)
else if (event->type == MOUSEMOVE) {
ID *id = NULL;
+ wmWindow *win;
+ ScrArea *area;
+
+ int mval[] = {event->x, event->y};
+ datadropper_win_area_find(C, mval, mval, &win, &area);
+
/* Set the region for eyedropper cursor text drawing */
- datadropper_set_draw_callback_region(C, ddr, event->x, event->y);
+ datadropper_set_draw_callback_region(area, ddr);
- datadropper_id_sample_pt(C, ddr, event->x, event->y, &id);
+ datadropper_id_sample_pt(C, win, area, ddr, mval[0], mval[1], &id);
}
return OPERATOR_RUNNING_MODAL;
diff --git a/source/blender/editors/interface/interface_eyedropper_depth.c b/source/blender/editors/interface/interface_eyedropper_depth.c
index a64fad8c333..311f718d950 100644
--- a/source/blender/editors/interface/interface_eyedropper_depth.c
+++ b/source/blender/editors/interface/interface_eyedropper_depth.c
@@ -72,13 +72,16 @@ typedef struct DepthDropper {
ARegionType *art;
void *draw_handle_pixel;
+ int name_pos[2];
char name[200];
} DepthDropper;
-static void depthdropper_draw_cb(const struct bContext *C, ARegion *region, void *arg)
+static void depthdropper_draw_cb(const struct bContext *UNUSED(C),
+ ARegion *UNUSED(region),
+ void *arg)
{
DepthDropper *ddr = arg;
- eyedropper_draw_cursor_text_region(C, region, ddr->name);
+ eyedropper_draw_cursor_text_region(UNPACK2(ddr->name_pos), ddr->name);
}
static int depthdropper_init(bContext *C, wmOperator *op)
@@ -172,6 +175,8 @@ static void depthdropper_depth_sample_pt(
/* weak, we could pass in some reference point */
const float *view_co = v3d->camera ? v3d->camera->obmat[3] : rv3d->viewinv[3];
const int mval[2] = {mx - region->winrct.xmin, my - region->winrct.ymin};
+ copy_v2_v2_int(ddr->name_pos, mval);
+
float co[3];
CTX_wm_area_set(C, area);
diff --git a/source/blender/editors/interface/interface_eyedropper_intern.h b/source/blender/editors/interface/interface_eyedropper_intern.h
index 96a2c6ed111..f9f3fcfb5d1 100644
--- a/source/blender/editors/interface/interface_eyedropper_intern.h
+++ b/source/blender/editors/interface/interface_eyedropper_intern.h
@@ -24,10 +24,13 @@
/* interface_eyedropper.c */
void eyedropper_draw_cursor_text_window(const struct wmWindow *window, const char *name);
-void eyedropper_draw_cursor_text_region(const struct bContext *C,
- const struct ARegion *region,
- const char *name);
+void eyedropper_draw_cursor_text_region(const int x, const int y, const char *name);
uiBut *eyedropper_get_property_button_under_mouse(bContext *C, const wmEvent *event);
+void datadropper_win_area_find(const struct bContext *C,
+ const int mval[2],
+ int r_mval[2],
+ struct wmWindow **r_win,
+ struct ScrArea **r_area);
/* interface_eyedropper_color.c (expose for color-band picker) */
void eyedropper_color_sample_fl(bContext *C, int mx, int my, float r_col[3]);
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 0e5a6a79137..08d78552710 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -397,7 +397,7 @@ static bool id_search_add(const bContext *C, TemplateID *template_ui, uiSearchIt
char name_ui[MAX_ID_FULL_NAME_UI];
int iconid = ui_id_icon_get(C, id, template_ui->preview);
const bool use_lib_prefix = template_ui->preview || iconid;
- const bool has_sep_char = (id->lib != NULL);
+ const bool has_sep_char = ID_IS_LINKED(id);
/* When using previews, the library hint (linked, overridden, missing) is added with a
* character prefix, otherwise we can use a icon. */
@@ -1112,7 +1112,7 @@ static void template_ID(const bContext *C,
UI_but_flag_enable(but, UI_BUT_REDALERT);
}
- if (id->lib == NULL && !(ELEM(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_OB, ID_WS)) &&
+ if (!ID_IS_LINKED(id) && !(ELEM(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_OB, ID_WS)) &&
(hide_buttons == false)) {
uiDefIconButR(block,
UI_BTYPE_ICON_TOGGLE,
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 93a790b53d0..1a41dc8e9fb 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -535,7 +535,7 @@ void ui_rna_collection_search_update_fn(const struct bContext *C,
BLI_STATIC_ASSERT(sizeof(name_buf) >= MAX_ID_FULL_NAME_UI,
"Name string buffer should be big enough to hold full UI ID name");
name = name_buf;
- has_sep_char = (id->lib != NULL);
+ has_sep_char = ID_IS_LINKED(id);
}
}
else {
diff --git a/source/blender/editors/interface/view2d_draw.c b/source/blender/editors/interface/view2d_draw.c
index 95427e49495..fd4dba30c1c 100644
--- a/source/blender/editors/interface/view2d_draw.c
+++ b/source/blender/editors/interface/view2d_draw.c
@@ -349,7 +349,7 @@ static void draw_horizontal_scale_indicators(const ARegion *region,
const float text_width = BLF_width(font_id, text, strlen(text));
if (xpos_region - text_width / 2.0f >= xmin && xpos_region + text_width / 2.0f <= xmax) {
- BLF_draw_default_ascii(xpos_region - text_width / 2.0f, ypos, 0.0f, text, sizeof(text));
+ BLF_draw_default(xpos_region - text_width / 2.0f, ypos, 0.0f, text, sizeof(text));
}
}
}
@@ -411,7 +411,7 @@ static void draw_vertical_scale_indicators(const ARegion *region,
const float text_width = BLF_width(font_id, text, strlen(text));
if (ypos_region - text_width / 2.0f >= ymin && ypos_region + text_width / 2.0f <= ymax) {
- BLF_draw_default_ascii(xpos, ypos_region - text_width / 2.0f, 0.0f, text, sizeof(text));
+ BLF_draw_default(xpos, ypos_region - text_width / 2.0f, 0.0f, text, sizeof(text));
}
}
diff --git a/source/blender/editors/interface/view2d_edge_pan.c b/source/blender/editors/interface/view2d_edge_pan.c
index eaf8ef30311..54e0d8f40ea 100644
--- a/source/blender/editors/interface/view2d_edge_pan.c
+++ b/source/blender/editors/interface/view2d_edge_pan.c
@@ -176,10 +176,12 @@ static float edge_pan_speed(View2DEdgePanData *vpd,
1.0f;
/* Zoom factor increases speed when zooming in and decreases speed when zooming out. */
- const float zoomx = (float)(BLI_rcti_size_x(&region->winrct) + 1) / BLI_rctf_size_x(&region->v2d.cur);
+ const float zoomx = (float)(BLI_rcti_size_x(&region->winrct) + 1) /
+ BLI_rctf_size_x(&region->v2d.cur);
const float zoom_factor = 1.0f + CLAMPIS(vpd->zoom_influence, 0.0f, 1.0f) * (zoomx - 1.0f);
- return distance_factor * delay_factor * zoom_factor * vpd->max_speed * U.widget_unit * (float)U.dpi_fac;
+ return distance_factor * delay_factor * zoom_factor * vpd->max_speed * U.widget_unit *
+ (float)U.dpi_fac;
}
static void edge_pan_apply_delta(bContext *C, View2DEdgePanData *vpd, float dx, float dy)
diff --git a/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c b/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c
index 1af489b60ce..ae37d6c8deb 100644
--- a/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c
+++ b/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c
@@ -51,7 +51,7 @@
/**
* Orient the handles towards the selection (can be slow with high-poly mesh!).
*/
-// Disable for now, issues w/ refresh and '+' icons overlap.
+/* Disable for now, issues w/ refresh and '+' icons overlap. */
// #define USE_SELECT_CENTER
#ifdef USE_SELECT_CENTER
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 34400462d38..2e34284f46e 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -766,8 +766,6 @@ static int lightprobe_add_exec(bContext *C, wmOperator *op)
BKE_lightprobe_type_set(probe, type);
- DEG_relations_tag_update(CTX_data_main(C));
-
return OPERATOR_FINISHED;
}
@@ -884,8 +882,6 @@ static int effector_add_exec(bContext *C, wmOperator *op)
ob->pd = BKE_partdeflect_new(type);
- DEG_relations_tag_update(CTX_data_main(C));
-
return OPERATOR_FINISHED;
}
@@ -1015,8 +1011,10 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
if (newob && !enter_editmode) {
ED_object_editmode_exit_ex(bmain, scene, obedit, EM_FREEDATA);
}
-
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
+ else {
+ /* Only needed in edit-mode (#ED_object_add_type normally handles this). */
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
+ }
return OPERATOR_FINISHED;
}
@@ -1067,8 +1065,6 @@ static int object_add_text_exec(bContext *C, wmOperator *op)
obedit = ED_object_add_type(C, OB_FONT, NULL, loc, rot, enter_editmode, local_view_bits);
BKE_object_obdata_size_init(obedit, RNA_float_get(op->ptr, "radius"));
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
-
return OPERATOR_FINISHED;
}
@@ -1138,8 +1134,6 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
ED_object_editmode_exit_ex(bmain, scene, obedit, EM_FREEDATA);
}
- WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
-
return OPERATOR_FINISHED;
}
@@ -1670,7 +1664,6 @@ static int collection_instance_add_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
/* Avoid dependency cycles. */
@@ -1686,12 +1679,6 @@ static int collection_instance_add_exec(bContext *C, wmOperator *op)
ob->transflag |= OB_DUPLICOLLECTION;
id_us_plus(&collection->id);
- /* works without this except if you try render right after, see: 22027 */
- DEG_relations_tag_update(bmain);
- DEG_id_tag_update(&scene->id, ID_RECALC_SELECT);
- WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene);
- WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, scene);
-
return OPERATOR_FINISHED;
}
@@ -1784,17 +1771,9 @@ static int object_data_instance_add_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- Scene *scene = CTX_data_scene(C);
-
ED_object_add_type_with_obdata(
C, object_type, id->name + 2, loc, rot, false, local_view_bits, id);
- /* Works without this except if you try render right after, see: T22027. */
- DEG_relations_tag_update(bmain);
- DEG_id_tag_update(&scene->id, ID_RECALC_SELECT);
- WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene);
- WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, scene);
-
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 7a42c9d5d8b..f0ab082cd9c 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -28,6 +28,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_curve_types.h"
+#include "DNA_gpencil_types.h"
#include "DNA_lattice_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -39,6 +40,7 @@
#include "BLI_alloca.h"
#include "BLI_array.h"
#include "BLI_blenlib.h"
+#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
#include "BLI_utildefines_stack.h"
@@ -4083,16 +4085,38 @@ static int vgroup_do_remap(Object *ob, const char *name_array, wmOperator *op)
}
else {
int dvert_tot = 0;
+ /* Grease pencil stores vertex groups separately for each stroke,
+ * so remap each stroke's weights separately. */
+ if (ob->type == OB_GPENCIL) {
+ bGPdata *gpd = ob->data;
+ LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+ LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
+ LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
+ dvert = gps->dvert;
+ dvert_tot = gps->totpoints;
+ if (dvert) {
+ while (dvert_tot--) {
+ if (dvert->totweight) {
+ BKE_defvert_remap(dvert, sort_map, defbase_tot);
+ }
+ dvert++;
+ }
+ }
+ }
+ }
+ }
+ }
+ else {
+ BKE_object_defgroup_array_get(ob->data, &dvert, &dvert_tot);
- BKE_object_defgroup_array_get(ob->data, &dvert, &dvert_tot);
-
- /* Create as necessary. */
- if (dvert) {
- while (dvert_tot--) {
- if (dvert->totweight) {
- BKE_defvert_remap(dvert, sort_map, defbase_tot);
+ /* Create as necessary. */
+ if (dvert) {
+ while (dvert_tot--) {
+ if (dvert->totweight) {
+ BKE_defvert_remap(dvert, sort_map, defbase_tot);
+ }
+ dvert++;
}
- dvert++;
}
}
}
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index 749010a5ba3..834c023dde9 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -697,7 +697,7 @@ static void gather_frames_to_render(bContext *C, OGLRender *oglrender)
AnimData *adt = BKE_animdata_from_id(id);
gather_frames_to_render_for_adt(oglrender, adt);
- /* Gather the frames from linked datablocks (materials, shapkeys, etc.). */
+ /* Gather the frames from linked data-blocks (materials, shape-keys, etc.). */
BKE_library_foreach_ID_link(
NULL, id, gather_frames_to_render_for_id, oglrender, IDWALK_RECURSE);
}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index cff3ecfbbd3..daac196a90c 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1738,19 +1738,19 @@ static int area_snap_calc_location(const bScreen *screen,
int snap_dist_best = INT_MAX;
{
const float div_array[] = {
- /* Middle. */
- 1.0f / 2.0f,
- /* Thirds. */
- 1.0f / 3.0f,
- 2.0f / 3.0f,
- /* Quarters. */
- 1.0f / 4.0f,
- 3.0f / 4.0f,
- /* Eighth. */
- 1.0f / 8.0f,
- 3.0f / 8.0f,
- 5.0f / 8.0f,
- 7.0f / 8.0f,
+ 0.0f,
+ 1.0f / 12.0f,
+ 2.0f / 12.0f,
+ 3.0f / 12.0f,
+ 4.0f / 12.0f,
+ 5.0f / 12.0f,
+ 6.0f / 12.0f,
+ 7.0f / 12.0f,
+ 8.0f / 12.0f,
+ 9.0f / 12.0f,
+ 10.0f / 12.0f,
+ 11.0f / 12.0f,
+ 1.0f,
};
/* Test the snap to the best division. */
for (int i = 0; i < ARRAY_SIZE(div_array); i++) {
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index fe0a53ae964..85f6647ddd0 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -207,7 +207,7 @@ static void SOUND_OT_open_mono(wmOperatorType *ot)
static void sound_update_animation_flags(Scene *scene);
-static int sound_update_animation_flags_fn(Sequence *seq, void *user_data)
+static bool sound_update_animation_flags_fn(Sequence *seq, void *user_data)
{
struct FCurve *fcu;
Scene *scene = (Scene *)user_data;
@@ -244,24 +244,22 @@ static int sound_update_animation_flags_fn(Sequence *seq, void *user_data)
sound_update_animation_flags(seq->scene);
}
- return 0;
+ return true;
}
static void sound_update_animation_flags(Scene *scene)
{
struct FCurve *fcu;
bool driven;
- Sequence *seq;
if (scene->id.tag & LIB_TAG_DOIT) {
return;
}
scene->id.tag |= LIB_TAG_DOIT;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- SEQ_recursive_apply(seq, sound_update_animation_flags_fn, scene);
+ if (scene->ed != NULL) {
+ SEQ_for_each_callback(&scene->ed->seqbase, sound_update_animation_flags_fn, scene);
}
- SEQ_ALL_END;
fcu = id_data_find_fcurve(&scene->id, scene, &RNA_Scene, "audio_volume", 0, &driven);
if (fcu || driven) {
diff --git a/source/blender/editors/space_clip/clip_graph_ops.c b/source/blender/editors/space_clip/clip_graph_ops.c
index 590f8efe105..9a4e0c7f060 100644
--- a/source/blender/editors/space_clip/clip_graph_ops.c
+++ b/source/blender/editors/space_clip/clip_graph_ops.c
@@ -327,6 +327,8 @@ static int select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void CLIP_OT_graph_select(wmOperatorType *ot)
{
+ PropertyRNA *prop;
+
/* identifiers */
ot->name = "Select";
ot->description = "Select graph curves";
@@ -351,11 +353,12 @@ void CLIP_OT_graph_select(wmOperatorType *ot)
"Mouse location to select nearest entity",
-100.0f,
100.0f);
- RNA_def_boolean(ot->srna,
- "extend",
- 0,
- "Extend",
- "Extend selection rather than clearing the existing selection");
+ prop = RNA_def_boolean(ot->srna,
+ "extend",
+ 0,
+ "Extend",
+ "Extend selection rather than clearing the existing selection");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
/********************** box select operator *********************/
diff --git a/source/blender/editors/space_clip/tracking_select.c b/source/blender/editors/space_clip/tracking_select.c
index 558c0bec11d..c7f0f4c228f 100644
--- a/source/blender/editors/space_clip/tracking_select.c
+++ b/source/blender/editors/space_clip/tracking_select.c
@@ -459,11 +459,12 @@ void CLIP_OT_select(wmOperatorType *ot)
/* properties */
PropertyRNA *prop;
- RNA_def_boolean(ot->srna,
- "extend",
- 0,
- "Extend",
- "Extend selection rather than clearing the existing selection");
+ prop = RNA_def_boolean(ot->srna,
+ "extend",
+ 0,
+ "Extend",
+ "Extend selection rather than clearing the existing selection");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
prop = RNA_def_boolean(ot->srna,
"deselect_all",
false,
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index f8ae4be9471..c7d23943b6c 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -1590,7 +1590,7 @@ static void filelist_cache_previews_push(FileList *filelist, FileDirEntry *entry
preview->flags = entry->typeflag;
preview->in_memory_preview = intern_entry->local_data.preview_image;
preview->icon_id = 0;
- // printf("%s: %d - %s - %p\n", __func__, preview->index, preview->path, preview->img);
+ // printf("%s: %d - %s\n", __func__, preview->index, preview->path);
filelist_cache_preview_ensure_running(cache);
@@ -3055,7 +3055,7 @@ static void filelist_readjob_main_recursive(Main *bmain, FileList *filelist)
ok = 1;
if (ok) {
if (!(filelist->filter_data.flags & FLF_HIDE_DOT) || id->name[2] != '.') {
- if (id->lib == NULL) {
+ if (!ID_IS_LINKED(id)) {
files->entry->relpath = BLI_strdup(id->name + 2);
}
else {
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index d67cd89200b..1fb05e0f9ac 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -27,9 +27,9 @@
extern "C" {
#endif
+struct AssetLibraryReference;
struct BlendHandle;
struct FileList;
-struct AssetLibraryReference;
struct FileSelection;
struct wmWindowManager;
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index 8bfafc6bef8..2955c4ef7ae 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -417,6 +417,8 @@ static int graphkeys_click_insert_invoke(bContext *C, wmOperator *op, const wmEv
void GRAPH_OT_click_insert(wmOperatorType *ot)
{
+ PropertyRNA *prop;
+
/* Identifiers */
ot->name = "Click-Insert Keyframes";
ot->idname = "GRAPH_OT_click_insert";
@@ -443,11 +445,12 @@ void GRAPH_OT_click_insert(wmOperatorType *ot)
RNA_def_float(
ot->srna, "value", 1.0f, -FLT_MAX, FLT_MAX, "Value", "Value for keyframe on", 0, 100);
- RNA_def_boolean(ot->srna,
- "extend",
- false,
- "Extend",
- "Extend selection instead of deselecting everything first");
+ prop = RNA_def_boolean(ot->srna,
+ "extend",
+ false,
+ "Extend",
+ "Extend selection instead of deselecting everything first");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
/** \} */
diff --git a/source/blender/editors/space_graph/graph_view.c b/source/blender/editors/space_graph/graph_view.c
index 036fd354c18..c38c5f09a2a 100644
--- a/source/blender/editors/space_graph/graph_view.c
+++ b/source/blender/editors/space_graph/graph_view.c
@@ -219,7 +219,7 @@ static int graphkeys_previewrange_exec(bContext *C, wmOperator *UNUSED(op))
scene->r.pefra = round_fl_to_int(max);
/* Set notifier that things have changed. */
- // XXX Err... there's nothing for frame ranges yet, but this should do fine too.
+ /* XXX: Err... there's nothing for frame ranges yet, but this should do fine too. */
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, ac.scene);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index 92ceb00d5c0..4f66506d28b 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -196,21 +196,21 @@ void ED_image_draw_info(Scene *scene,
BLF_color3ub(blf_mono_font, 255, 255, 255);
SNPRINTF(str, "X:%-4d Y:%-4d |", x, y);
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
if (zp) {
BLF_color3ub(blf_mono_font, 255, 255, 255);
SNPRINTF(str, " Z:%-.4f |", 0.5f + 0.5f * (((float)*zp) / (float)0x7fffffff));
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
}
if (zpf) {
BLF_color3ub(blf_mono_font, 255, 255, 255);
SNPRINTF(str, " Z:%-.3f |", *zpf);
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
}
@@ -223,7 +223,7 @@ void ED_image_draw_info(Scene *scene,
}
BLF_color3ub(blf_mono_font, 255, 255, 255);
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
}
@@ -239,7 +239,7 @@ void ED_image_draw_info(Scene *scene,
STRNCPY(str, " R:-");
}
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
BLF_color3ubv(blf_mono_font, green);
@@ -253,7 +253,7 @@ void ED_image_draw_info(Scene *scene,
STRNCPY(str, " G:-");
}
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
BLF_color3ubv(blf_mono_font, blue);
@@ -267,7 +267,7 @@ void ED_image_draw_info(Scene *scene,
STRNCPY(str, " B:-");
}
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
if (channels == 4) {
@@ -282,7 +282,7 @@ void ED_image_draw_info(Scene *scene,
STRNCPY(str, "- ");
}
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
}
@@ -307,7 +307,7 @@ void ED_image_draw_info(Scene *scene,
SNPRINTF(str, " | CM R:%-.4f G:%-.4f B:%-.4f", rgba[0], rgba[1], rgba[2]);
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
}
}
@@ -429,12 +429,12 @@ void ED_image_draw_info(Scene *scene,
SNPRINTF(str, "V:%-.4f", val);
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
SNPRINTF(str, " L:%-.4f", lum);
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
}
else if (channels >= 3) {
rgb_to_hsv(finalcol[0], finalcol[1], finalcol[2], &hue, &sat, &val);
@@ -442,22 +442,22 @@ void ED_image_draw_info(Scene *scene,
SNPRINTF(str, "H:%-.4f", hue);
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
SNPRINTF(str, " S:%-.4f", sat);
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
SNPRINTF(str, " V:%-.4f", val);
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
dx += BLF_width(blf_mono_font, str, sizeof(str));
SNPRINTF(str, " L:%-.4f", lum);
BLF_position(blf_mono_font, dx, dy, 0);
- BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+ BLF_draw(blf_mono_font, str, sizeof(str));
}
}
void draw_image_sample_line(SpaceImage *sima)
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 4f8feda3911..11efd3e33ef 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -2338,7 +2338,7 @@ int ED_image_save_all_modified_info(const Main *bmain, ReportList *reports)
if (image_should_be_saved(ima, &is_format_writable)) {
if (BKE_image_has_packedfile(ima) || (ima->source == IMA_SRC_GENERATED)) {
- if (ima->id.lib == NULL) {
+ if (!ID_IS_LINKED(ima)) {
num_saveable_images++;
}
else {
diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc
index 3b1a55f55ab..b67117f1ad0 100644
--- a/source/blender/editors/space_node/node_draw.cc
+++ b/source/blender/editors/space_node/node_draw.cc
@@ -836,9 +836,8 @@ struct SocketTooltipData {
static void create_inspection_string_for_generic_value(const geo_log::GenericValueLog &value_log,
std::stringstream &ss)
{
- auto id_to_inspection_string = [&](ID *id) {
- ss << (id ? id->name + 2 : TIP_("None")) << " (" << BKE_idtype_idcode_to_name(GS(id->name))
- << ")";
+ auto id_to_inspection_string = [&](ID *id, short idcode) {
+ ss << (id ? id->name + 2 : TIP_("None")) << " (" << BKE_idtype_idcode_to_name(idcode) << ")";
};
const GPointer value = value_log.value();
@@ -858,16 +857,16 @@ static void create_inspection_string_for_generic_value(const geo_log::GenericVal
ss << *value.get<std::string>() << TIP_(" (String)");
}
else if (value.is_type<Object *>()) {
- id_to_inspection_string((ID *)*value.get<Object *>());
+ id_to_inspection_string((ID *)*value.get<Object *>(), ID_OB);
}
else if (value.is_type<Material *>()) {
- id_to_inspection_string((ID *)*value.get<Material *>());
+ id_to_inspection_string((ID *)*value.get<Material *>(), ID_MA);
}
else if (value.is_type<Tex *>()) {
- id_to_inspection_string((ID *)*value.get<Tex *>());
+ id_to_inspection_string((ID *)*value.get<Tex *>(), ID_TE);
}
else if (value.is_type<Collection *>()) {
- id_to_inspection_string((ID *)*value.get<Collection *>());
+ id_to_inspection_string((ID *)*value.get<Collection *>(), ID_GR);
}
}
diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc
index cbf03f553f6..5b1b737751c 100644
--- a/source/blender/editors/space_node/node_edit.cc
+++ b/source/blender/editors/space_node/node_edit.cc
@@ -398,7 +398,7 @@ void snode_dag_update(bContext *C, SpaceNode *snode)
Main *bmain = CTX_data_main(C);
/* for groups, update all ID's using this */
- if (snode->edittree != snode->nodetree) {
+ if ((snode->edittree->id.flag & LIB_EMBEDDED_DATA) == 0) {
FOREACH_NODETREE_BEGIN (bmain, tntree, id) {
if (ntreeHasTree(tntree, snode->edittree)) {
DEG_id_tag_update(id, 0);
diff --git a/source/blender/editors/space_node/node_select.cc b/source/blender/editors/space_node/node_select.cc
index a1068f29624..adff85a2b8c 100644
--- a/source/blender/editors/space_node/node_select.cc
+++ b/source/blender/editors/space_node/node_select.cc
@@ -417,6 +417,7 @@ static int node_select_grouped_exec(bContext *C, wmOperator *op)
void NODE_OT_select_grouped(wmOperatorType *ot)
{
+ PropertyRNA *prop;
static const EnumPropertyItem prop_select_grouped_types[] = {
{NODE_SELECT_GROUPED_TYPE, "TYPE", 0, "Type", ""},
{NODE_SELECT_GROUPED_COLOR, "COLOR", 0, "Color", ""},
@@ -439,11 +440,12 @@ void NODE_OT_select_grouped(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* properties */
- RNA_def_boolean(ot->srna,
- "extend",
- false,
- "Extend",
- "Extend selection instead of deselecting everything first");
+ prop = RNA_def_boolean(ot->srna,
+ "extend",
+ false,
+ "Extend",
+ "Extend selection instead of deselecting everything first");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", "");
}
diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index 898e66e7a39..1feecc04ead 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -1682,7 +1682,7 @@ void OUTLINER_OT_item_activate(wmOperatorType *ot)
ot->flag |= OPTYPE_REGISTER | OPTYPE_UNDO;
PropertyRNA *prop;
- prop = RNA_def_boolean(ot->srna, "extend", true, "Extend", "Extend selection for activation");
+ prop = RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection for activation");
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
prop = RNA_def_boolean(
ot->srna, "extend_range", false, "Extend Range", "Select a range from active element");
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 694e5fbb41d..935bc97d0b2 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -2980,6 +2980,22 @@ static int sequencer_export_subtitles_invoke(bContext *C,
return OPERATOR_RUNNING_MODAL;
}
+typedef struct Seq_get_text_cb_data {
+ ListBase *text_seq;
+ Scene *scene;
+} Seq_get_text_cb_data;
+
+static bool seq_get_text_strip_cb(Sequence *seq, void *user_data)
+{
+ Seq_get_text_cb_data *cd = (Seq_get_text_cb_data *)user_data;
+ /* Only text strips that are not muted and don't end with negative frame. */
+ if ((seq->type == SEQ_TYPE_TEXT) && ((seq->flag & SEQ_MUTE) == 0) &&
+ (seq->enddisp > cd->scene->r.sfra)) {
+ BLI_addtail(cd->text_seq, MEM_dupallocN(seq));
+ }
+ return true;
+}
+
static int sequencer_export_subtitles_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
@@ -3011,14 +3027,10 @@ static int sequencer_export_subtitles_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- /* Only text strips that are not muted and don't end with negative frame. */
- SEQ_ALL_BEGIN (ed, seq) {
- if ((seq->type == SEQ_TYPE_TEXT) && ((seq->flag & SEQ_MUTE) == 0) &&
- (seq->enddisp > scene->r.sfra)) {
- BLI_addtail(&text_seq, MEM_dupallocN(seq));
- }
+ if (ed != NULL) {
+ Seq_get_text_cb_data cb_data = {&text_seq, scene};
+ SEQ_for_each_callback(&ed->seqbase, seq_get_text_strip_cb, &cb_data);
}
- SEQ_ALL_END;
if (BLI_listbase_is_empty(&text_seq)) {
BKE_report(op->reports, RPT_ERROR, "No subtitles (text strips) to export");
diff --git a/source/blender/editors/space_text/text_autocomplete.c b/source/blender/editors/space_text/text_autocomplete.c
index a38ed12e53b..32e455f3ac9 100644
--- a/source/blender/editors/space_text/text_autocomplete.c
+++ b/source/blender/editors/space_text/text_autocomplete.c
@@ -177,13 +177,12 @@ static GHash *text_autocomplete_build(Text *text)
i_pos = i_start;
while ((i_start < linep->len) &&
(!text_check_identifier_nodigit_unicode(
- BLI_str_utf8_as_unicode_and_size_safe(&linep->line[i_start], &i_pos)))) {
+ BLI_str_utf8_as_unicode_step(linep->line, linep->len, &i_pos)))) {
i_start = i_pos;
}
i_pos = i_end = i_start;
- while ((i_end < linep->len) &&
- (text_check_identifier_unicode(
- BLI_str_utf8_as_unicode_and_size_safe(&linep->line[i_end], &i_pos)))) {
+ while ((i_end < linep->len) && (text_check_identifier_unicode(BLI_str_utf8_as_unicode_step(
+ linep->line, linep->len, &i_pos)))) {
i_end = i_pos;
}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index ec99affe43b..86f79718a68 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -1020,7 +1020,7 @@ static void draw_view_axis(RegionView3D *rv3d, const rcti *rect)
const char axis_text[2] = {'x' + i, '\0'};
BLF_color4ubv(BLF_default(), axis_col[i]);
- BLF_draw_default_ascii(axis_pos[i][0] + 2, axis_pos[i][1] + 2, 0.0f, axis_text, 1);
+ BLF_draw_default(axis_pos[i][0] + 2, axis_pos[i][1] + 2, 0.0f, axis_text, 1);
}
}
@@ -1458,9 +1458,7 @@ static void draw_grid_unit_name(
BLF_enable(font_id, BLF_SHADOW);
BLF_shadow(font_id, 5, (const float[4]){0.0f, 0.0f, 0.0f, 1.0f});
BLF_shadow_offset(font_id, 1, -1);
- BLF_draw_default_ascii(
- xoffset, *yoffset, 0.0f, numstr[0] ? numstr : grid_unit, sizeof(numstr));
-
+ BLF_draw_default(xoffset, *yoffset, 0.0f, numstr[0] ? numstr : grid_unit, sizeof(numstr));
BLF_disable(font_id, BLF_SHADOW);
}
}
@@ -2548,11 +2546,7 @@ void ED_scene_draw_fps(const Scene *scene, int xoffset, int *yoffset)
*yoffset -= VIEW3D_OVERLAY_LINEHEIGHT;
-#ifdef WITH_INTERNATIONAL
BLF_draw_default(xoffset, *yoffset, 0.0f, printable, sizeof(printable));
-#else
- BLF_draw_default_ascii(xoffset, *yoffset, 0.0f, printable, sizeof(printable));
-#endif
BLF_disable(font_id, BLF_SHADOW);
}
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_camera.c b/source/blender/editors/space_view3d/view3d_gizmo_camera.c
index e1d439bef15..30b9839935f 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_camera.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_camera.c
@@ -75,7 +75,7 @@ static bool WIDGETGROUP_camera_poll(const bContext *C, wmGizmoGroupType *UNUSED(
if (ob->type == OB_CAMERA) {
Camera *camera = ob->data;
/* TODO: support overrides. */
- if (camera->id.lib == NULL) {
+ if (!ID_IS_LINKED(camera)) {
return true;
}
}
@@ -408,7 +408,7 @@ static bool WIDGETGROUP_camera_view_poll(const bContext *C, wmGizmoGroupType *UN
if (rv3d->persp == RV3D_CAMOB) {
if (scene->r.mode & R_BORDER) {
/* TODO: support overrides. */
- if (scene->id.lib == NULL) {
+ if (!ID_IS_LINKED(scene)) {
return true;
}
}
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c b/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c
index 05ea35f114f..baa54adaa83 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_navigate_type.c
@@ -300,7 +300,7 @@ static void gizmo_axis_draw(const bContext *C, wmGizmo *gz)
text_color[3] = is_active ? 1.0f : 0.9f;
}
BLF_color4fv(font.id, text_color);
- BLF_draw_ascii(font.id, axis_str, 2);
+ BLF_draw(font.id, axis_str, 2);
GPU_matrix_pop();
}
}
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_tool_generic.c b/source/blender/editors/space_view3d/view3d_gizmo_tool_generic.c
index ad91af73a71..0e0d59764e5 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_tool_generic.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_tool_generic.c
@@ -36,6 +36,7 @@
#include "WM_toolsystem.h"
#include "RNA_access.h"
+#include "RNA_define.h"
#include "WM_api.h"
#include "WM_message.h"
@@ -47,6 +48,9 @@
static const char *handle_normal_id;
static const char *handle_free_id;
+static const float handle_normal_radius_default = 100.0f;
+static const float handle_free_radius_default = 36.0f;
+
/* -------------------------------------------------------------------- */
/** \name Generic Tool
* \{ */
@@ -72,6 +76,7 @@ static bool WIDGETGROUP_tool_generic_poll(const bContext *C, wmGizmoGroupType *g
static wmGizmo *tool_generic_create_gizmo(const bContext *C, wmGizmoGroup *gzgroup)
{
+
wmGizmo *gz = WM_gizmo_new("GIZMO_GT_button_2d", gzgroup, NULL);
gz->flag |= WM_GIZMO_OPERATOR_TOOL_INIT;
@@ -82,8 +87,17 @@ static wmGizmo *tool_generic_create_gizmo(const bContext *C, wmGizmoGroup *gzgro
RNA_enum_set(gz->ptr, "icon", ICON_NONE);
+ bToolRef *tref = WM_toolsystem_ref_from_context((bContext *)C);
+ PointerRNA gzgt_ptr;
+ const bool gzgt_ptr_is_valid = WM_toolsystem_ref_properties_get_from_gizmo_group(
+ tref, gzgroup->type, &gzgt_ptr);
+
if (gzgroup->type->idname == handle_normal_id) {
- gz->scale_basis = 0.12f;
+ const float radius = (gzgt_ptr_is_valid ? RNA_float_get(&gzgt_ptr, "radius") :
+ handle_normal_radius_default) /
+ 12.0f;
+
+ gz->scale_basis = radius / U.gizmo_size;
gz->matrix_offset[3][2] -= 12.0;
RNA_enum_set(gz->ptr,
"draw_options",
@@ -91,16 +105,20 @@ static wmGizmo *tool_generic_create_gizmo(const bContext *C, wmGizmoGroup *gzgro
ED_GIZMO_BUTTON_SHOW_OUTLINE));
}
else {
- gz->scale_basis = 0.16f * 3;
+ const float radius = gzgt_ptr_is_valid ? RNA_float_get(&gzgt_ptr, "radius") :
+ handle_free_radius_default;
+
+ gz->scale_basis = radius / U.gizmo_size;
RNA_enum_set(gz->ptr, "draw_options", ED_GIZMO_BUTTON_SHOW_BACKDROP);
/* Make the center low alpha. */
WM_gizmo_set_line_width(gz, 2.0f);
- RNA_float_set(gz->ptr, "backdrop_fill_alpha", 0.125f);
+ RNA_float_set(gz->ptr,
+ "backdrop_fill_alpha",
+ gzgt_ptr_is_valid ? RNA_float_get(&gzgt_ptr, "backdrop_fill_alpha") : 0.125f);
}
- bToolRef *tref = WM_toolsystem_ref_from_context((bContext *)C);
wmWindowManager *wm = CTX_wm_manager(C);
struct wmKeyConfig *kc = wm->defaultconf;
@@ -206,6 +224,16 @@ void VIEW3D_GGT_tool_generic_handle_normal(wmGizmoGroupType *gzgt)
gzgt->setup = WIDGETGROUP_tool_generic_setup;
gzgt->refresh = WIDGETGROUP_tool_generic_refresh;
gzgt->message_subscribe = WIDGETGROUP_gizmo_message_subscribe;
+
+ RNA_def_float(gzgt->srna,
+ "radius",
+ handle_normal_radius_default,
+ 0.0f,
+ 1000.0,
+ "Radius",
+ "Radius in pixels",
+ 0.0f,
+ 1000.0f);
}
void VIEW3D_GGT_tool_generic_handle_free(wmGizmoGroupType *gzgt)
@@ -224,6 +252,18 @@ void VIEW3D_GGT_tool_generic_handle_free(wmGizmoGroupType *gzgt)
gzgt->setup = WIDGETGROUP_tool_generic_setup;
gzgt->refresh = WIDGETGROUP_tool_generic_refresh;
gzgt->message_subscribe = WIDGETGROUP_gizmo_message_subscribe;
+
+ RNA_def_float(gzgt->srna,
+ "radius",
+ handle_free_radius_default,
+ 0.0f,
+ 1000.0,
+ "Radius",
+ "Radius in pixels",
+ 0.0f,
+ 1000.0f);
+ RNA_def_float(
+ gzgt->srna, "backdrop_fill_alpha", 0.125, 0.0f, 1.0f, "Backdrop Alpha", "", 0.0f, 1.0f);
}
/** \} */
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 7a83fb71c28..58491f8c2d3 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -1372,11 +1372,7 @@ static void drawAutoKeyWarning(TransInfo *UNUSED(t), ARegion *region)
uchar color[3];
UI_GetThemeColorShade3ubv(TH_TEXT_HI, -50, color);
BLF_color3ubv(font_id, color);
-#ifdef WITH_INTERNATIONAL
BLF_draw_default(xco, yco, 0.0f, printable, BLF_DRAW_STR_DUMMY_MAX);
-#else
- BLF_draw_default_ascii(xco, yco, 0.0f, printable, BLF_DRAW_STR_DUMMY_MAX);
-#endif
/* autokey recording icon... */
GPU_blend(GPU_BLEND_ALPHA);
@@ -1404,7 +1400,7 @@ static void drawTransformPixel(const struct bContext *C, ARegion *region, void *
/* draw auto-key-framing hint in the corner
* - only draw if enabled (advanced users may be distracted/annoyed),
- * for objects that will be autokeyframed (no point otherwise),
+ * for objects that will be auto-keyframed (no point otherwise),
* AND only for the active region (as showing all is too overwhelming)
*/
if ((U.autokey_flag & AUTOKEY_FLAG_NOWARNING) == 0) {
diff --git a/source/blender/editors/transform/transform_mode_translate.c b/source/blender/editors/transform/transform_mode_translate.c
index e44e346d3e4..82574cffb82 100644
--- a/source/blender/editors/transform/transform_mode_translate.c
+++ b/source/blender/editors/transform/transform_mode_translate.c
@@ -234,7 +234,6 @@ static void headerTranslation(TransInfo *t, const float vec[3], char str[UI_MAX_
if (t->con.mode & CON_APPLY) {
int i = 0;
- zero_v3(dvec);
if (t->con.mode & CON_AXIS0) {
dvec[i++] = dvec[0];
}
@@ -244,6 +243,9 @@ static void headerTranslation(TransInfo *t, const float vec[3], char str[UI_MAX_
if (t->con.mode & CON_AXIS2) {
dvec[i++] = dvec[2];
}
+ while (i != 3) {
+ dvec[i++] = 0.0f;
+ }
}
if (t->flag & T_2D_EDIT) {
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index cbc2adf641f..9638ec8750e 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -710,7 +710,8 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
}
if (flags & P_VIEW2D_EDGE_PAN) {
- prop = RNA_def_boolean(ot->srna, "view2d_edge_pan", false, "Edge Pan", "Enable edge panning in 2D view");
+ prop = RNA_def_boolean(
+ ot->srna, "view2d_edge_pan", false, "Edge Pan", "Enable edge panning in 2D view");
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
}
diff --git a/source/blender/editors/undo/memfile_undo.c b/source/blender/editors/undo/memfile_undo.c
index 7c6ce56eab0..1bdc2b2251e 100644
--- a/source/blender/editors/undo/memfile_undo.c
+++ b/source/blender/editors/undo/memfile_undo.c
@@ -116,7 +116,7 @@ static int memfile_undosys_step_id_reused_cb(LibraryIDLinkCallbackData *cb_data)
BLI_assert((id_self->tag & LIB_TAG_UNDO_OLD_ID_REUSED) != 0);
ID *id = *id_pointer;
- if (id != NULL && id->lib == NULL && (id->tag & LIB_TAG_UNDO_OLD_ID_REUSED) == 0) {
+ if (id != NULL && !ID_IS_LINKED(id) && (id->tag & LIB_TAG_UNDO_OLD_ID_REUSED) == 0) {
bool do_stop_iter = true;
if (GS(id_self->name) == ID_OB) {
Object *ob_self = (Object *)id_self;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 99e3d59a57f..c71cde8ec43 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -1692,7 +1692,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
}
if (obi->free_use_mesh) {
- BKE_id_free(NULL, &obi->original_me);
+ BKE_id_free(NULL, obi->original_me);
}
if (rb->remove_doubles) {
diff --git a/source/blender/gpu/GPU_capabilities.h b/source/blender/gpu/GPU_capabilities.h
index 0c054d4f264..5b5d0f16c9f 100644
--- a/source/blender/gpu/GPU_capabilities.h
+++ b/source/blender/gpu/GPU_capabilities.h
@@ -22,7 +22,7 @@
*
* GPU Capabilities & workarounds
* This module expose the reported implementation limits & enabled
- * workaround for drivers that needs specific codepaths.
+ * workaround for drivers that needs specific code-paths.
*/
#pragma once
diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c
index 8b2ac2ed22d..119ef3ff971 100644
--- a/source/blender/imbuf/intern/colormanagement.c
+++ b/source/blender/imbuf/intern/colormanagement.c
@@ -1185,6 +1185,14 @@ static void colormanage_check_colorspace_settings(
(void)what;
}
+static bool seq_callback(Sequence *seq, void *UNUSED(user_data))
+{
+ if (seq->strip) {
+ colormanage_check_colorspace_settings(&seq->strip->colorspace_settings, "sequencer strip");
+ }
+ return true;
+}
+
void IMB_colormanagement_check_file_config(Main *bmain)
{
Scene *scene;
@@ -1217,13 +1225,9 @@ void IMB_colormanagement_check_file_config(Main *bmain)
}
/* check sequencer strip input color space settings */
- Sequence *seq;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- if (seq->strip) {
- colormanage_check_colorspace_settings(&seq->strip->colorspace_settings, "sequencer strip");
- }
+ if (scene->ed != NULL) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_callback, NULL);
}
- SEQ_ALL_END;
}
/* ** check input color space settings ** */
diff --git a/source/blender/imbuf/intern/iris.c b/source/blender/imbuf/intern/iris.c
index 59a17fcc600..df516d2a5c4 100644
--- a/source/blender/imbuf/intern/iris.c
+++ b/source/blender/imbuf/intern/iris.c
@@ -72,14 +72,14 @@ BLI_STATIC_ASSERT(sizeof(IMAGE) == HEADER_SIZE, "Invalid header size");
// #define TYPEMASK 0xff00
#define BPPMASK 0x00ff
-// #define ITYPE_VERBATIM 0x0000 // UNUSED
+// #define ITYPE_VERBATIM 0x0000 /* UNUSED */
#define ITYPE_RLE 0x0100
#define ISRLE(type) (((type)&0xff00) == ITYPE_RLE)
// #define ISVERBATIM(type) (((type) & 0xff00) == ITYPE_VERBATIM)
#define BPP(type) ((type)&BPPMASK)
#define RLE(bpp) (ITYPE_RLE | (bpp))
-// #define VERBATIM(bpp) (ITYPE_VERBATIM | (bpp)) // UNUSED
-// #define IBUFSIZE(pixels) ((pixels + (pixels >> 6)) << 2) // UNUSED
+// #define VERBATIM(bpp) (ITYPE_VERBATIM | (bpp)) /* UNUSED */
+// #define IBUFSIZE(pixels) ((pixels + (pixels >> 6)) << 2) /* UNUSED */
// #define RLE_NOP 0x00
/* local struct for mem access */
diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c
index 759f96af7c8..471c1bde383 100644
--- a/source/blender/imbuf/intern/thumbs_blend.c
+++ b/source/blender/imbuf/intern/thumbs_blend.c
@@ -41,64 +41,47 @@
#include "MEM_guardedalloc.h"
-ImBuf *IMB_thumb_load_blend(const char *blen_path, const char *blen_group, const char *blen_id)
+/* NOTE: we should handle all previews for a same group at once, would avoid reopening
+ * `.blend` file for each and every ID. However, this adds some complexity,
+ * so keep it for later. */
+static ImBuf *imb_thumb_load_from_blend_id(const char *blen_path,
+ const char *blen_group,
+ const char *blen_id)
{
ImBuf *ima = NULL;
+ BlendFileReadReport bf_reports = {.reports = NULL};
- if (blen_group && blen_id) {
- LinkNode *ln, *names, *lp, *previews = NULL;
- BlendFileReadReport bf_reports = {.reports = NULL};
- struct BlendHandle *libfiledata = BLO_blendhandle_from_file(blen_path, &bf_reports);
- int idcode = BKE_idtype_idcode_from_name(blen_group);
- int i, nprevs, nnames;
-
- if (libfiledata == NULL) {
- return ima;
- }
-
- /* NOTE: we should handle all previews for a same group at once, would avoid reopening
- * `.blend` file for each and every ID. However, this adds some complexity,
- * so keep it for later. */
- names = BLO_blendhandle_get_datablock_names(libfiledata, idcode, false, &nnames);
- previews = BLO_blendhandle_get_previews(libfiledata, idcode, &nprevs);
-
- BLO_blendhandle_close(libfiledata);
-
- if (!previews || (nnames != nprevs)) {
- if (previews != 0) {
- /* No previews at all is not a bug! */
- printf("%s: error, found %d items, %d previews\n", __func__, nnames, nprevs);
- }
- BLI_linklist_free(previews, BKE_previewimg_freefunc);
- BLI_linklist_freeN(names);
- return ima;
- }
-
- for (i = 0, ln = names, lp = previews; i < nnames; i++, ln = ln->next, lp = lp->next) {
- const char *blockname = ln->link;
- PreviewImage *img = lp->link;
+ struct BlendHandle *libfiledata = BLO_blendhandle_from_file(blen_path, &bf_reports);
+ if (libfiledata == NULL) {
+ return NULL;
+ }
- if (STREQ(blockname, blen_id)) {
- if (img) {
- ima = BKE_previewimg_to_imbuf(img, ICON_SIZE_PREVIEW);
- }
- break;
- }
- }
+ int idcode = BKE_idtype_idcode_from_name(blen_group);
+ PreviewImage *preview = BLO_blendhandle_get_preview_for_id(libfiledata, idcode, blen_id);
+ BLO_blendhandle_close(libfiledata);
- BLI_linklist_free(previews, BKE_previewimg_freefunc);
- BLI_linklist_freeN(names);
+ if (preview) {
+ ima = BKE_previewimg_to_imbuf(preview, ICON_SIZE_PREVIEW);
+ BKE_previewimg_freefunc(preview);
}
- else {
- BlendThumbnail *data;
+ return ima;
+}
- data = BLO_thumbnail_from_file(blen_path);
- ima = BKE_main_thumbnail_to_imbuf(NULL, data);
+static ImBuf *imb_thumb_load_from_blendfile(const char *blen_path)
+{
+ BlendThumbnail *data = BLO_thumbnail_from_file(blen_path);
+ ImBuf *ima = BKE_main_thumbnail_to_imbuf(NULL, data);
- if (data) {
- MEM_freeN(data);
- }
+ if (data) {
+ MEM_freeN(data);
}
-
return ima;
}
+
+ImBuf *IMB_thumb_load_blend(const char *blen_path, const char *blen_group, const char *blen_id)
+{
+ if (blen_group && blen_id) {
+ return imb_thumb_load_from_blend_id(blen_path, blen_group, blen_id);
+ }
+ return imb_thumb_load_from_blendfile(blen_path);
+}
diff --git a/source/blender/io/alembic/tests/abc_matrix_test.cc b/source/blender/io/alembic/tests/abc_matrix_test.cc
index c6d7245a52c..2706699d994 100644
--- a/source/blender/io/alembic/tests/abc_matrix_test.cc
+++ b/source/blender/io/alembic/tests/abc_matrix_test.cc
@@ -1,6 +1,6 @@
#include "testing/testing.h"
-// Keep first since utildefines defines AT which conflicts with STL
+/* Keep first since utildefines defines AT which conflicts with STL. */
#include "intern/abc_axis_conversion.h"
#include "BLI_math.h"
diff --git a/source/blender/io/collada/AnimationImporter.cpp b/source/blender/io/collada/AnimationImporter.cpp
index e54192abc54..5b6391c1b9c 100644
--- a/source/blender/io/collada/AnimationImporter.cpp
+++ b/source/blender/io/collada/AnimationImporter.cpp
@@ -58,7 +58,7 @@ template<class T> static const char *bc_get_joint_name(T *node)
FCurve *AnimationImporter::create_fcurve(int array_index, const char *rna_path)
{
FCurve *fcu = BKE_fcurve_create();
- fcu->flag = (FCURVE_VISIBLE | FCURVE_AUTO_HANDLES | FCURVE_SELECTED);
+ fcu->flag = (FCURVE_VISIBLE | FCURVE_SELECTED);
fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
fcu->array_index = array_index;
return fcu;
@@ -102,7 +102,7 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
for (i = 0; i < dim; i++) {
FCurve *fcu = BKE_fcurve_create();
- fcu->flag = (FCURVE_VISIBLE | FCURVE_AUTO_HANDLES | FCURVE_SELECTED);
+ fcu->flag = (FCURVE_VISIBLE | FCURVE_SELECTED);
fcu->array_index = 0;
fcu->auto_smoothing = U.auto_smoothing_new;
diff --git a/source/blender/io/collada/BCAnimationCurve.cpp b/source/blender/io/collada/BCAnimationCurve.cpp
index 0e31e522ec4..82d8b6e9ff3 100644
--- a/source/blender/io/collada/BCAnimationCurve.cpp
+++ b/source/blender/io/collada/BCAnimationCurve.cpp
@@ -95,7 +95,7 @@ void BCAnimationCurve::delete_fcurve(FCurve *fcu)
FCurve *BCAnimationCurve::create_fcurve(int array_index, const char *rna_path)
{
FCurve *fcu = BKE_fcurve_create();
- fcu->flag = (FCURVE_VISIBLE | FCURVE_AUTO_HANDLES | FCURVE_SELECTED);
+ fcu->flag = (FCURVE_VISIBLE | FCURVE_SELECTED);
fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
fcu->array_index = array_index;
return fcu;
diff --git a/source/blender/io/gpencil/CMakeLists.txt b/source/blender/io/gpencil/CMakeLists.txt
index 4af8b506bd5..3ef9fa44ff8 100644
--- a/source/blender/io/gpencil/CMakeLists.txt
+++ b/source/blender/io/gpencil/CMakeLists.txt
@@ -50,6 +50,9 @@ set(SRC
intern/gpencil_io_export_base.hh
intern/gpencil_io_import_base.hh
intern/gpencil_io_import_svg.hh
+
+ # Only so this file is known by CMake.
+ ../../../../extern/nanosvg/nanosvg.h
)
set(LIB
diff --git a/source/blender/io/usd/CMakeLists.txt b/source/blender/io/usd/CMakeLists.txt
index 5499fe36898..12015bf1698 100644
--- a/source/blender/io/usd/CMakeLists.txt
+++ b/source/blender/io/usd/CMakeLists.txt
@@ -77,8 +77,8 @@ set(SRC
intern/usd_reader_nurbs.cc
intern/usd_reader_prim.cc
intern/usd_reader_stage.cc
- intern/usd_reader_xform.cc
intern/usd_reader_volume.cc
+ intern/usd_reader_xform.cc
usd.h
@@ -102,8 +102,8 @@ set(SRC
intern/usd_reader_nurbs.h
intern/usd_reader_prim.h
intern/usd_reader_stage.h
- intern/usd_reader_xform.h
intern/usd_reader_volume.h
+ intern/usd_reader_xform.h
)
set(LIB
diff --git a/source/blender/io/usd/usd.h b/source/blender/io/usd/usd.h
index 6b6b2d37162..2a036c3d398 100644
--- a/source/blender/io/usd/usd.h
+++ b/source/blender/io/usd/usd.h
@@ -25,11 +25,11 @@
extern "C" {
#endif
-struct bContext;
-struct Object;
struct CacheArchiveHandle;
-struct CacheReader;
struct CacheFile;
+struct CacheReader;
+struct Object;
+struct bContext;
struct USDExportParams {
bool export_animation;
diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h
index baed2aa2866..e899e6bd3ec 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -856,11 +856,11 @@ typedef enum eSAction_Flag {
/* draw time in seconds instead of time in frames */
SACTION_DRAWTIME = (1 << 2),
/* don't filter action channels according to visibility */
- // SACTION_NOHIDE = (1 << 3), /* XXX deprecated... old animation systems. */
+ // SACTION_NOHIDE = (1 << 3), /* Deprecated, old animation systems. */
/* don't kill overlapping keyframes after transform */
SACTION_NOTRANSKEYCULL = (1 << 4),
/* don't include keyframes that are out of view */
- // SACTION_HORIZOPTIMISEON = (1 << 5), // XXX deprecated... old irrelevant trick
+ // SACTION_HORIZOPTIMISEON = (1 << 5), /* Deprecated, old irrelevant trick. */
/* show pose-markers (local to action) in Action Editor mode. */
SACTION_POSEMARKERS_SHOW = (1 << 6),
/* don't draw action channels using group colors (where applicable) */
diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h
index a49a76c3f26..5dbed6b4d24 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -658,9 +658,10 @@ typedef enum eFCurve_Flags {
/** FCurve will not be evaluated for the next round. */
FCURVE_MUTED = (1 << 4),
+#ifdef DNA_DEPRECATED_ALLOW
/** fcurve uses 'auto-handles', which stay horizontal... */
- // DEPRECATED
- FCURVE_AUTO_HANDLES = (1 << 5),
+ FCURVE_AUTO_HANDLES = (1 << 5), /* Dirty. */
+#endif
FCURVE_MOD_OFF = (1 << 6),
/** skip evaluation, as RNA-path cannot be resolved
* (similar to muting, but cannot be set by user) */
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index 454d843112a..3b65378f9eb 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -207,9 +207,8 @@ typedef enum eArmature_DeformFlag {
ARM_DEF_INVERT_VGROUP = (1 << 4),
} eArmature_DeformFlag;
-/* armature->pathflag */
-// XXX deprecated... old animation system (armature only viz)
-#ifdef DNA_DEPRECATED_ALLOW
+#ifdef DNA_DEPRECATED_ALLOW /* Old animation system (armature only viz). */
+/** #bArmature.pathflag */
typedef enum eArmature_PathFlag {
ARM_PATH_FNUMS = (1 << 0),
ARM_PATH_KFRAS = (1 << 1),
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index 822b8705c9b..4b4c24a7a4e 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -37,7 +37,7 @@ struct Ipo;
struct Text;
/* channels reside in Object or Action (ListBase) constraintChannels */
-// XXX deprecated... old AnimSys
+/* XXX: deprecated... old AnimSys. */
typedef struct bConstraintChannel {
struct bConstraintChannel *next, *prev;
struct Ipo *ipo;
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 1bebbc35747..13213f70fed 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -298,6 +298,7 @@ enum {
/* Mask Modifier -> flag */
enum {
MOD_MASK_INV = (1 << 0),
+ MOD_MASK_SMOOTH = (1 << 1),
};
typedef struct ArrayModifierData {
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index fd794ed1b21..361fefa59d2 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1836,9 +1836,9 @@ typedef enum NodeShaderOutputTarget {
/* Geometry Nodes */
typedef enum GeometryNodeAttributeProximityTargetType {
- GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_POINTS = 0,
- GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_EDGES = 1,
- GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES = 2,
+ GEO_NODE_PROXIMITY_TARGET_POINTS = 0,
+ GEO_NODE_PROXIMITY_TARGET_EDGES = 1,
+ GEO_NODE_PROXIMITY_TARGET_FACES = 2,
} GeometryNodeAttributeProximityTargetType;
typedef enum GeometryNodeBooleanOperation {
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 246446313d4..2d6d5408aa0 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -6000,7 +6000,7 @@ char *RNA_path_full_ID_py(Main *bmain, ID *id)
}
char lib_filepath_esc[(sizeof(id->lib->filepath) * 2) + 4];
- if (id->lib != NULL) {
+ if (ID_IS_LINKED(id)) {
int ofs = 0;
memcpy(lib_filepath_esc, ", \"", 3);
ofs += 3;
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c
index 5f198a8ed4c..1ac6dd021e9 100644
--- a/source/blender/makesrna/intern/rna_color.c
+++ b/source/blender/makesrna/intern/rna_color.c
@@ -597,6 +597,27 @@ static const EnumPropertyItem *rna_ColorManagedColorspaceSettings_colorspace_ite
return items;
}
+typedef struct Seq_colorspace_cb_data {
+ ColorManagedColorspaceSettings *colorspace_settings;
+ Sequence *r_seq;
+} Seq_colorspace_cb_data;
+
+static bool seq_find_colorspace_settings_cb(Sequence *seq, void *user_data)
+{
+ Seq_colorspace_cb_data *cd = (Seq_colorspace_cb_data *)user_data;
+ if (seq->strip && &seq->strip->colorspace_settings == cd->colorspace_settings) {
+ cd->r_seq = seq;
+ return false;
+ }
+ return true;
+}
+
+static bool seq_free_anim_cb(Sequence *seq, void *UNUSED(user_data))
+{
+ SEQ_relations_sequence_free_anim(seq);
+ return true;
+}
+
static void rna_ColorManagedColorspaceSettings_reload_update(Main *bmain,
Scene *UNUSED(scene),
PointerRNA *ptr)
@@ -629,20 +650,14 @@ static void rna_ColorManagedColorspaceSettings_reload_update(Main *bmain,
if (scene->ed) {
ColorManagedColorspaceSettings *colorspace_settings = (ColorManagedColorspaceSettings *)
ptr->data;
- Sequence *seq;
- bool seq_found = false;
+ Seq_colorspace_cb_data cb_data = {colorspace_settings, NULL};
if (&scene->sequencer_colorspace_settings != colorspace_settings) {
- SEQ_ALL_BEGIN (scene->ed, seq) {
- if (seq->strip && &seq->strip->colorspace_settings == colorspace_settings) {
- seq_found = true;
- break;
- }
- }
- SEQ_ALL_END;
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_find_colorspace_settings_cb, &cb_data);
}
+ Sequence *seq = cb_data.r_seq;
- if (seq_found) {
+ if (seq) {
SEQ_relations_sequence_free_anim(seq);
if (seq->strip->proxy && seq->strip->proxy->anim) {
@@ -653,10 +668,7 @@ static void rna_ColorManagedColorspaceSettings_reload_update(Main *bmain,
SEQ_relations_invalidate_cache_raw(scene, seq);
}
else {
- SEQ_ALL_BEGIN (scene->ed, seq) {
- SEQ_relations_sequence_free_anim(seq);
- }
- SEQ_ALL_END;
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_free_anim_cb, NULL);
}
WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, NULL);
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 486d8d13564..f11d845c582 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -4431,6 +4431,12 @@ static void rna_def_modifier_mask(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Invert", "Use vertices that are not part of region defined");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+ prop = RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MASK_SMOOTH);
+ RNA_def_property_ui_text(
+ prop, "Smooth", "Use vertex group weights to cut faces at the weight contour");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "threshold");
RNA_def_property_range(prop, 0.0, 1.0);
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index d8ab7c7a61b..8d672e9b570 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -9853,17 +9853,17 @@ static void def_geo_collection_info(StructRNA *srna)
static void def_geo_attribute_proximity(StructRNA *srna)
{
static const EnumPropertyItem target_geometry_element[] = {
- {GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_POINTS,
+ {GEO_NODE_PROXIMITY_TARGET_POINTS,
"POINTS",
ICON_NONE,
"Points",
"Calculate proximity to the target's points (usually faster than the other two modes)"},
- {GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_EDGES,
+ {GEO_NODE_PROXIMITY_TARGET_EDGES,
"EDGES",
ICON_NONE,
"Edges",
"Calculate proximity to the target's edges"},
- {GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES,
+ {GEO_NODE_PROXIMITY_TARGET_FACES,
"FACES",
ICON_NONE,
"Faces",
@@ -9877,7 +9877,7 @@ static void def_geo_attribute_proximity(StructRNA *srna)
prop = RNA_def_property(srna, "target_geometry_element", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, target_geometry_element);
- RNA_def_property_enum_default(prop, GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES);
+ RNA_def_property_enum_default(prop, GEO_NODE_PROXIMITY_TARGET_FACES);
RNA_def_property_ui_text(
prop, "Target Geometry", "Element of the target geometry to calculate the distance from");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index f714987fc05..12fb7a40d13 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -123,7 +123,8 @@ const EnumPropertyItem rna_enum_property_unit_items[] = {
{PROP_UNIT_AREA, "AREA", 0, "Area", ""},
{PROP_UNIT_VOLUME, "VOLUME", 0, "Volume", ""},
{PROP_UNIT_ROTATION, "ROTATION", 0, "Rotation", ""},
- {PROP_UNIT_TIME, "TIME", 0, "Time", ""},
+ {PROP_UNIT_TIME, "TIME", 0, "Time (Scene Relative)", ""},
+ {PROP_UNIT_TIME_ABSOLUTE, "TIME_ABSOLUTE", 0, "Time (Absolute)", ""},
{PROP_UNIT_VELOCITY, "VELOCITY", 0, "Velocity", ""},
{PROP_UNIT_ACCELERATION, "ACCELERATION", 0, "Acceleration", ""},
{PROP_UNIT_MASS, "MASS", 0, "Mass", ""},
diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c
index dad77b4aad5..9dee7bc841c 100644
--- a/source/blender/makesrna/intern/rna_sequencer.c
+++ b/source/blender/makesrna/intern/rna_sequencer.c
@@ -495,15 +495,15 @@ static void rna_Sequence_use_proxy_set(PointerRNA *ptr, bool value)
SEQ_proxy_set(seq, value != 0);
}
-static int transform_seq_cmp_fn(Sequence *seq, void *arg_pt)
+static bool transform_seq_cmp_fn(Sequence *seq, void *arg_pt)
{
SequenceSearchData *data = arg_pt;
if (seq->strip && seq->strip->transform == data->data) {
data->seq = seq;
- return -1; /* done so bail out */
+ return false; /* done so bail out */
}
- return 1;
+ return true;
}
static Sequence *sequence_get_by_transform(Editing *ed, StripTransform *transform)
@@ -514,7 +514,7 @@ static Sequence *sequence_get_by_transform(Editing *ed, StripTransform *transfor
data.data = transform;
/* irritating we need to search for our sequence! */
- SEQ_seqbase_recursive_apply(&ed->seqbase, transform_seq_cmp_fn, &data);
+ SEQ_for_each_callback(&ed->seqbase, transform_seq_cmp_fn, &data);
return data.seq;
}
@@ -547,15 +547,15 @@ static void rna_SequenceTransform_update(Main *UNUSED(bmain),
SEQ_relations_invalidate_cache_preprocessed(scene, seq);
}
-static int crop_seq_cmp_fn(Sequence *seq, void *arg_pt)
+static bool crop_seq_cmp_fn(Sequence *seq, void *arg_pt)
{
SequenceSearchData *data = arg_pt;
if (seq->strip && seq->strip->crop == data->data) {
data->seq = seq;
- return -1; /* done so bail out */
+ return false; /* done so bail out */
}
- return 1;
+ return true;
}
static Sequence *sequence_get_by_crop(Editing *ed, StripCrop *crop)
@@ -566,7 +566,7 @@ static Sequence *sequence_get_by_crop(Editing *ed, StripCrop *crop)
data.data = crop;
/* irritating we need to search for our sequence! */
- SEQ_seqbase_recursive_apply(&ed->seqbase, crop_seq_cmp_fn, &data);
+ SEQ_for_each_callback(&ed->seqbase, crop_seq_cmp_fn, &data);
return data.seq;
}
@@ -935,15 +935,15 @@ static void rna_Sequence_sound_update(Main *bmain, Scene *scene, PointerRNA *UNU
DEG_relations_tag_update(bmain);
}
-static int seqproxy_seq_cmp_fn(Sequence *seq, void *arg_pt)
+static bool seqproxy_seq_cmp_fn(Sequence *seq, void *arg_pt)
{
SequenceSearchData *data = arg_pt;
if (seq->strip && seq->strip->proxy == data->data) {
data->seq = seq;
- return -1; /* done so bail out */
+ return false; /* done so bail out */
}
- return 1;
+ return true;
}
static Sequence *sequence_get_by_proxy(Editing *ed, StripProxy *proxy)
@@ -953,7 +953,7 @@ static Sequence *sequence_get_by_proxy(Editing *ed, StripProxy *proxy)
data.seq = NULL;
data.data = proxy;
- SEQ_seqbase_recursive_apply(&ed->seqbase, seqproxy_seq_cmp_fn, &data);
+ SEQ_for_each_callback(&ed->seqbase, seqproxy_seq_cmp_fn, &data);
return data.seq;
}
@@ -988,7 +988,7 @@ static void rna_Sequence_opacity_set(PointerRNA *ptr, float value)
seq->blend_opacity = value * 100.0f;
}
-static int colbalance_seq_cmp_fn(Sequence *seq, void *arg_pt)
+static bool colbalance_seq_cmp_fn(Sequence *seq, void *arg_pt)
{
SequenceSearchData *data = arg_pt;
@@ -999,12 +999,12 @@ static int colbalance_seq_cmp_fn(Sequence *seq, void *arg_pt)
if (&cbmd->color_balance == data->data) {
data->seq = seq;
data->smd = smd;
- return -1; /* done so bail out */
+ return false; /* done so bail out */
}
}
}
- return 1;
+ return true;
}
static Sequence *sequence_get_by_colorbalance(Editing *ed,
@@ -1018,7 +1018,7 @@ static Sequence *sequence_get_by_colorbalance(Editing *ed,
data.data = cb;
/* irritating we need to search for our sequence! */
- SEQ_seqbase_recursive_apply(&ed->seqbase, colbalance_seq_cmp_fn, &data);
+ SEQ_for_each_callback(&ed->seqbase, colbalance_seq_cmp_fn, &data);
*r_smd = data.smd;
@@ -1122,16 +1122,16 @@ static void rna_SequenceEditor_overlay_frame_set(PointerRNA *ptr, int value)
}
}
-static int modifier_seq_cmp_fn(Sequence *seq, void *arg_pt)
+static bool modifier_seq_cmp_fn(Sequence *seq, void *arg_pt)
{
SequenceSearchData *data = arg_pt;
if (BLI_findindex(&seq->modifiers, data->data) != -1) {
data->seq = seq;
- return -1; /* done so bail out */
+ return false; /* done so bail out */
}
- return 1;
+ return true;
}
static Sequence *sequence_get_by_modifier(Editing *ed, SequenceModifierData *smd)
@@ -1142,7 +1142,7 @@ static Sequence *sequence_get_by_modifier(Editing *ed, SequenceModifierData *smd
data.data = smd;
/* irritating we need to search for our sequence! */
- SEQ_seqbase_recursive_apply(&ed->seqbase, modifier_seq_cmp_fn, &data);
+ SEQ_for_each_callback(&ed->seqbase, modifier_seq_cmp_fn, &data);
return data.seq;
}
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index b910648495b..21a3c087197 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -649,10 +649,9 @@ static void rna_Event_unicode_get(PointerRNA *ptr, char *value)
size_t len = 0;
if (event->utf8_buf[0]) {
- BLI_str_utf8_as_unicode_and_size(event->utf8_buf, &len);
- if (len > 0) {
+ if (BLI_str_utf8_as_unicode_step_or_error(event->utf8_buf, sizeof(event->utf8_buf), &len) !=
+ BLI_UTF8_ERR)
memcpy(value, event->utf8_buf, len);
- }
}
value[len] = '\0';
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index 4cab92ad878..f24d28d1209 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -40,6 +40,23 @@
# include "WM_api.h"
/* -------------------------------------------------------------------- */
+
+# ifdef WITH_XR_OPENXR
+static wmXrData *rna_XrSession_wm_xr_data_get(PointerRNA *ptr)
+{
+ /* Callers could also get XrSessionState pointer through ptr->data, but prefer if we just
+ * consistently pass wmXrData pointers to the WM_xr_xxx() API. */
+
+ BLI_assert((ptr->type == &RNA_XrSessionSettings) || (ptr->type == &RNA_XrSessionState));
+
+ wmWindowManager *wm = (wmWindowManager *)ptr->owner_id;
+ BLI_assert(wm && (GS(wm->id.name) == ID_WM));
+
+ return &wm->xr;
+}
+# endif
+
+/* -------------------------------------------------------------------- */
/** \name XR Action Map
* \{ */
@@ -420,29 +437,32 @@ static void rna_XrActionMapItem_update(Main *UNUSED(bmain), Scene *UNUSED(scene)
# endif
}
-static XrActionMap *rna_XrActionMap_new(wmXrData *xr, const char *name, bool replace_existing)
+static XrActionMap *rna_XrActionMap_new(PointerRNA *ptr, const char *name, bool replace_existing)
{
# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
return WM_xr_actionmap_new(xr->runtime, name, replace_existing);
# else
- UNUSED_VARS(xr, name, replace_existing);
+ UNUSED_VARS(ptr, name, replace_existing);
return NULL;
# endif
}
-static XrActionMap *rna_XrActionMap_new_from_actionmap(wmXrData *xr, XrActionMap *am_src)
+static XrActionMap *rna_XrActionMap_new_from_actionmap(PointerRNA *ptr, XrActionMap *am_src)
{
# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
return WM_xr_actionmap_add_copy(xr->runtime, am_src);
# else
- UNUSED_VARS(xr, am_src);
+ UNUSED_VARS(ptr, am_src);
return NULL;
# endif
}
-static void rna_XrActionMap_remove(wmXrData *xr, ReportList *reports, PointerRNA *actionmap_ptr)
+static void rna_XrActionMap_remove(ReportList *reports, PointerRNA *ptr, PointerRNA *actionmap_ptr)
{
# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
XrActionMap *actionmap = actionmap_ptr->data;
if (WM_xr_actionmap_remove(xr->runtime, actionmap) == false) {
BKE_reportf(reports, RPT_ERROR, "ActionMap '%s' cannot be removed", actionmap->name);
@@ -450,16 +470,17 @@ static void rna_XrActionMap_remove(wmXrData *xr, ReportList *reports, PointerRNA
}
RNA_POINTER_INVALIDATE(actionmap_ptr);
# else
- UNUSED_VARS(xr, reports, actionmap_ptr);
+ UNUSED_VARS(ptr, reports, actionmap_ptr);
# endif
}
-static XrActionMap *rna_XrActionMap_find(wmXrData *xr, const char *name)
+static XrActionMap *rna_XrActionMap_find(PointerRNA *ptr, const char *name)
{
# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
return WM_xr_actionmap_find(xr->runtime, name);
# else
- UNUSED_VARS(xr, name);
+ UNUSED_VARS(ptr, name);
return NULL;
# endif
}
@@ -480,23 +501,6 @@ static void rna_XrActionMap_name_update(Main *bmain, Scene *UNUSED(scene), Point
/** \} */
/* -------------------------------------------------------------------- */
-
-# ifdef WITH_XR_OPENXR
-static wmXrData *rna_XrSession_wm_xr_data_get(PointerRNA *ptr)
-{
- /* Callers could also get XrSessionState pointer through ptr->data, but prefer if we just
- * consistently pass wmXrData pointers to the WM_xr_xxx() API. */
-
- BLI_assert((ptr->type == &RNA_XrSessionSettings) || (ptr->type == &RNA_XrSessionState));
-
- wmWindowManager *wm = (wmWindowManager *)ptr->owner_id;
- BLI_assert(wm && (GS(wm->id.name) == ID_WM));
-
- return &wm->xr;
-}
-# endif
-
-/* -------------------------------------------------------------------- */
/** \name XR Session Settings
* \{ */
@@ -1136,10 +1140,12 @@ static void rna_def_xr_actionmaps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "XrActionMaps");
srna = RNA_def_struct(brna, "XrActionMaps", NULL);
- RNA_def_struct_sdna(srna, "wmXrData");
RNA_def_struct_ui_text(srna, "XR Action Maps", "Collection of XR action maps");
func = RNA_def_function(srna, "new", "rna_XrActionMap_new");
+ RNA_def_function_flag(func, FUNC_NO_SELF);
+ parm = RNA_def_pointer(func, "xr_session_state", "XrSessionState", "XR Session State", "");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
parm = RNA_def_string(func, "name", NULL, MAX_NAME, "Name", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_boolean(func,
@@ -1152,6 +1158,9 @@ static void rna_def_xr_actionmaps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
func = RNA_def_function(srna, "new_from_actionmap", "rna_XrActionMap_new_from_actionmap");
+ RNA_def_function_flag(func, FUNC_NO_SELF);
+ parm = RNA_def_pointer(func, "xr_session_state", "XrSessionState", "XR Session State", "");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
parm = RNA_def_pointer(
func, "actionmap", "XrActionMap", "Action Map", "Action map to use as a reference");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
@@ -1159,12 +1168,17 @@ static void rna_def_xr_actionmaps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
func = RNA_def_function(srna, "remove", "rna_XrActionMap_remove");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_REPORTS);
+ parm = RNA_def_pointer(func, "xr_session_state", "XrSessionState", "XR Session State", "");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
parm = RNA_def_pointer(func, "actionmap", "XrActionMap", "Action Map", "Removed action map");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
func = RNA_def_function(srna, "find", "rna_XrActionMap_find");
+ RNA_def_function_flag(func, FUNC_NO_SELF);
+ parm = RNA_def_pointer(func, "xr_session_state", "XrSessionState", "XR Session State", "");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
parm = RNA_def_string(func, "name", NULL, MAX_NAME, "Name", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_pointer(
diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c
index e7d5fe056c5..d94e9a988c6 100644
--- a/source/blender/modifiers/intern/MOD_collision.c
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -277,8 +277,8 @@ static void blendRead(BlendDataReader *UNUSED(reader), ModifierData *md)
{
CollisionModifierData *collmd = (CollisionModifierData *)md;
#if 0
- // TODO: CollisionModifier should use pointcache
- // + have proper reset events before enabling this
+ /* TODO: #CollisionModifier should use point-cache
+ * + have proper reset events before enabling this. */
collmd->x = newdataadr(fd, collmd->x);
collmd->xnew = newdataadr(fd, collmd->xnew);
collmd->mfaces = newdataadr(fd, collmd->mfaces);
diff --git a/source/blender/modifiers/intern/MOD_mask.cc b/source/blender/modifiers/intern/MOD_mask.cc
index 9aa8e3dd7c8..aca90e0533c 100644
--- a/source/blender/modifiers/intern/MOD_mask.cc
+++ b/source/blender/modifiers/intern/MOD_mask.cc
@@ -27,6 +27,7 @@
#include "BLI_ghash.h"
#include "BLI_listbase.h"
+#include "BLI_math.h"
#include "BLT_translation.h"
@@ -214,6 +215,40 @@ static void computed_masked_edges(const Mesh *mesh,
*r_num_masked_edges = num_masked_edges;
}
+static void computed_masked_edges_smooth(const Mesh *mesh,
+ Span<bool> vertex_mask,
+ MutableSpan<int> r_edge_map,
+ uint *r_num_masked_edges,
+ uint *r_num_add_vertices)
+{
+ BLI_assert(mesh->totedge == r_edge_map.size());
+
+ uint num_masked_edges = 0;
+ uint num_add_vertices = 0;
+ for (int i : IndexRange(mesh->totedge)) {
+ const MEdge &edge = mesh->medge[i];
+
+ /* only add if both verts will be in new mesh */
+ bool v1 = vertex_mask[edge.v1];
+ bool v2 = vertex_mask[edge.v2];
+ if (v1 && v2) {
+ r_edge_map[i] = num_masked_edges;
+ num_masked_edges++;
+ }
+ else if (v1 != v2) {
+ r_edge_map[i] = -2;
+ num_add_vertices++;
+ }
+ else {
+ r_edge_map[i] = -1;
+ }
+ }
+
+ num_masked_edges += num_add_vertices;
+ *r_num_masked_edges = num_masked_edges;
+ *r_num_add_vertices = num_add_vertices;
+}
+
static void computed_masked_polygons(const Mesh *mesh,
Span<bool> vertex_mask,
Vector<int> &r_masked_poly_indices,
@@ -224,7 +259,7 @@ static void computed_masked_polygons(const Mesh *mesh,
BLI_assert(mesh->totvert == vertex_mask.size());
r_masked_poly_indices.reserve(mesh->totpoly);
- r_loop_starts.reserve(mesh->totloop);
+ r_loop_starts.reserve(mesh->totpoly);
uint num_masked_loops = 0;
for (int i : IndexRange(mesh->totpoly)) {
@@ -250,6 +285,76 @@ static void computed_masked_polygons(const Mesh *mesh,
*r_num_masked_loops = num_masked_loops;
}
+static void compute_interpolated_polygons(const Mesh *mesh,
+ Span<bool> vertex_mask,
+ uint num_add_vertices,
+ uint num_masked_loops,
+ Vector<int> &r_masked_poly_indices,
+ Vector<int> &r_loop_starts,
+ uint *r_num_add_edges,
+ uint *r_num_add_polys,
+ uint *r_num_add_loops)
+{
+ BLI_assert(mesh->totvert == vertex_mask.size());
+
+ /* Can't really know ahead of time how much space to use exactly. Estimate limit instead. */
+ /* NOTE: this reserve can only lift the capacity if there are ngons, which get split. */
+ r_masked_poly_indices.reserve(r_masked_poly_indices.size() + num_add_vertices);
+ r_loop_starts.reserve(r_loop_starts.size() + num_add_vertices);
+
+ uint num_add_edges = 0;
+ uint num_add_polys = 0;
+ uint num_add_loops = 0;
+ for (int i : IndexRange(mesh->totpoly)) {
+ const MPoly &poly_src = mesh->mpoly[i];
+
+ int in_count = 0;
+ int start = -1;
+ int dst_totloop = -1;
+ Span<MLoop> loops_src(&mesh->mloop[poly_src.loopstart], poly_src.totloop);
+ for (const int j : loops_src.index_range()) {
+ const MLoop &loop = loops_src[j];
+ if (vertex_mask[loop.v]) {
+ in_count++;
+ }
+ else if (start == -1) {
+ start = j;
+ }
+ }
+ if (0 < in_count && in_count < poly_src.totloop) {
+ /* Ring search starting at a vertex which is not included in the mask. */
+ const MLoop *last_loop = &loops_src[start];
+ bool v_loop_in_mask_last = vertex_mask[last_loop->v];
+ for (const int j : loops_src.index_range()) {
+ const MLoop &loop = loops_src[(start + 1 + j) % poly_src.totloop];
+ const bool v_loop_in_mask = vertex_mask[loop.v];
+ if (v_loop_in_mask && !v_loop_in_mask_last) {
+ dst_totloop = 3;
+ }
+ else if (!v_loop_in_mask && v_loop_in_mask_last) {
+ BLI_assert(dst_totloop > 2);
+ r_masked_poly_indices.append(i);
+ r_loop_starts.append(num_masked_loops + num_add_loops);
+ num_add_loops += dst_totloop;
+ num_add_polys++;
+ num_add_edges++;
+ dst_totloop = -1;
+ }
+ else if (v_loop_in_mask && v_loop_in_mask_last) {
+ BLI_assert(dst_totloop > 2);
+ dst_totloop++;
+ }
+ last_loop = &loop;
+ v_loop_in_mask_last = v_loop_in_mask;
+ }
+ }
+ }
+
+ *r_num_add_edges = num_add_edges;
+ *r_num_add_polys = num_add_polys;
+ *r_num_add_loops = num_add_loops;
+}
+
void copy_masked_vertices_to_new_mesh(const Mesh &src_mesh, Mesh &dst_mesh, Span<int> vertex_map)
{
BLI_assert(src_mesh.totvert == vertex_map.size());
@@ -267,6 +372,89 @@ void copy_masked_vertices_to_new_mesh(const Mesh &src_mesh, Mesh &dst_mesh, Span
}
}
+static float get_interp_factor_from_vgroup(
+ MDeformVert *dvert, int defgrp_index, float threshold, uint v1, uint v2)
+{
+ /* NOTE: this calculation is done twice for every vertex,
+ * instead of storing it the first time and then reusing it. */
+ float value1 = BKE_defvert_find_weight(&dvert[v1], defgrp_index);
+ float value2 = BKE_defvert_find_weight(&dvert[v2], defgrp_index);
+ return (threshold - value1) / (value2 - value1);
+}
+
+static void add_interp_verts_copy_edges_to_new_mesh(const Mesh &src_mesh,
+ Mesh &dst_mesh,
+ Span<bool> vertex_mask,
+ Span<int> vertex_map,
+ MDeformVert *dvert,
+ int defgrp_index,
+ float threshold,
+ uint num_masked_edges,
+ uint num_add_verts,
+ MutableSpan<int> r_edge_map)
+{
+ BLI_assert(src_mesh.totvert == vertex_mask.size());
+ BLI_assert(src_mesh.totedge == r_edge_map.size());
+
+ uint vert_index = dst_mesh.totvert - num_add_verts;
+ uint edge_index = num_masked_edges - num_add_verts;
+ for (int i_src : IndexRange(src_mesh.totedge)) {
+ if (r_edge_map[i_src] != -1) {
+ int i_dst = r_edge_map[i_src];
+ if (i_dst == -2) {
+ i_dst = edge_index;
+ }
+ const MEdge &e_src = src_mesh.medge[i_src];
+ MEdge &e_dst = dst_mesh.medge[i_dst];
+
+ CustomData_copy_data(&src_mesh.edata, &dst_mesh.edata, i_src, i_dst, 1);
+ e_dst = e_src;
+ e_dst.v1 = vertex_map[e_src.v1];
+ e_dst.v2 = vertex_map[e_src.v2];
+ }
+ if (r_edge_map[i_src] == -2) {
+ const int i_dst = edge_index++;
+ r_edge_map[i_src] = i_dst;
+ const MEdge &e_src = src_mesh.medge[i_src];
+ /* Cut destination edge and make v1 the new vertex. */
+ MEdge &e_dst = dst_mesh.medge[i_dst];
+ if (!vertex_mask[e_src.v1]) {
+ e_dst.v1 = vert_index;
+ }
+ else {
+ BLI_assert(!vertex_mask[e_src.v2]);
+ e_dst.v2 = e_dst.v1;
+ e_dst.v1 = vert_index;
+ }
+ /* Create the new vertex. */
+ float fac = get_interp_factor_from_vgroup(
+ dvert, defgrp_index, threshold, e_src.v1, e_src.v2);
+
+ float weights[2] = {1.0f - fac, fac};
+ CustomData_interp(
+ &src_mesh.vdata, &dst_mesh.vdata, (int *)&e_src.v1, weights, NULL, 2, vert_index);
+ MVert &v = dst_mesh.mvert[vert_index];
+ MVert &v1 = src_mesh.mvert[e_src.v1];
+ MVert &v2 = src_mesh.mvert[e_src.v2];
+
+ interp_v3_v3v3(v.co, v1.co, v2.co, fac);
+
+ float no1[3];
+ float no2[3];
+ normal_short_to_float_v3(no1, v1.no);
+ normal_short_to_float_v3(no2, v2.no);
+ mul_v3_fl(no1, weights[0]);
+ madd_v3_v3fl(no1, no2, weights[1]);
+ normalize_v3(no1);
+ normal_float_to_short_v3(v.no, no1);
+
+ vert_index++;
+ }
+ }
+ BLI_assert(vert_index == dst_mesh.totvert);
+ BLI_assert(edge_index == num_masked_edges);
+}
+
void copy_masked_edges_to_new_mesh(const Mesh &src_mesh,
Mesh &dst_mesh,
Span<int> vertex_map,
@@ -276,7 +464,7 @@ void copy_masked_edges_to_new_mesh(const Mesh &src_mesh,
BLI_assert(src_mesh.totedge == edge_map.size());
for (const int i_src : IndexRange(src_mesh.totedge)) {
const int i_dst = edge_map[i_src];
- if (i_dst == -1) {
+ if (i_dst == -1 || i_dst == -2) {
continue;
}
@@ -290,6 +478,36 @@ void copy_masked_edges_to_new_mesh(const Mesh &src_mesh,
}
}
+static void copy_masked_polys_to_new_mesh(const Mesh &src_mesh,
+ Mesh &dst_mesh,
+ Span<int> vertex_map,
+ Span<int> edge_map,
+ Span<int> masked_poly_indices,
+ Span<int> new_loop_starts,
+ int num_masked_polys)
+{
+ for (const int i_dst : IndexRange(num_masked_polys)) {
+ const int i_src = masked_poly_indices[i_dst];
+
+ const MPoly &mp_src = src_mesh.mpoly[i_src];
+ MPoly &mp_dst = dst_mesh.mpoly[i_dst];
+ const int i_ml_src = mp_src.loopstart;
+ const int i_ml_dst = new_loop_starts[i_dst];
+
+ CustomData_copy_data(&src_mesh.pdata, &dst_mesh.pdata, i_src, i_dst, 1);
+ CustomData_copy_data(&src_mesh.ldata, &dst_mesh.ldata, i_ml_src, i_ml_dst, mp_src.totloop);
+
+ const MLoop *ml_src = src_mesh.mloop + i_ml_src;
+ MLoop *ml_dst = dst_mesh.mloop + i_ml_dst;
+
+ mp_dst = mp_src;
+ mp_dst.loopstart = i_ml_dst;
+ for (int i : IndexRange(mp_src.totloop)) {
+ ml_dst[i].v = vertex_map[ml_src[i].v];
+ ml_dst[i].e = edge_map[ml_src[i].e];
+ }
+ }
+}
void copy_masked_polys_to_new_mesh(const Mesh &src_mesh,
Mesh &dst_mesh,
Span<int> vertex_map,
@@ -320,6 +538,137 @@ void copy_masked_polys_to_new_mesh(const Mesh &src_mesh,
}
}
+static void add_interpolated_polys_to_new_mesh(const Mesh &src_mesh,
+ Mesh &dst_mesh,
+ Span<bool> vertex_mask,
+ Span<int> vertex_map,
+ Span<int> edge_map,
+ MDeformVert *dvert,
+ int defgrp_index,
+ float threshold,
+ Span<int> masked_poly_indices,
+ Span<int> new_loop_starts,
+ int num_masked_polys,
+ int num_add_edges)
+{
+ int edge_index = dst_mesh.totedge - num_add_edges;
+ int sub_poly_index = 0;
+ int last_i_src = -1;
+ for (const int i_dst :
+ IndexRange(num_masked_polys, masked_poly_indices.size() - num_masked_polys)) {
+ const int i_src = masked_poly_indices[i_dst];
+ if (i_src == last_i_src) {
+ sub_poly_index++;
+ }
+ else {
+ sub_poly_index = 0;
+ last_i_src = i_src;
+ }
+
+ const MPoly &mp_src = src_mesh.mpoly[i_src];
+ MPoly &mp_dst = dst_mesh.mpoly[i_dst];
+ const int i_ml_src = mp_src.loopstart;
+ int i_ml_dst = new_loop_starts[i_dst];
+ const int mp_totloop = (i_dst + 1 < new_loop_starts.size() ? new_loop_starts[i_dst + 1] :
+ dst_mesh.totloop) -
+ i_ml_dst;
+
+ CustomData_copy_data(&src_mesh.pdata, &dst_mesh.pdata, i_src, i_dst, 1);
+
+ mp_dst = mp_src;
+ mp_dst.loopstart = i_ml_dst;
+ mp_dst.totloop = mp_totloop;
+
+ /* Ring search starting at a vertex which is not included in the mask. */
+ int start = -sub_poly_index - 1;
+ bool skip = false;
+ Span<MLoop> loops_src(&src_mesh.mloop[i_ml_src], mp_src.totloop);
+ for (const int j : loops_src.index_range()) {
+ if (!vertex_mask[loops_src[j].v]) {
+ if (start == -1) {
+ start = j;
+ break;
+ }
+ else if (!skip) {
+ skip = true;
+ }
+ }
+ else if (skip) {
+ skip = false;
+ start++;
+ }
+ }
+
+ BLI_assert(start >= 0);
+ BLI_assert(edge_index < dst_mesh.totedge);
+
+ const MLoop *last_loop = &loops_src[start];
+ bool v_loop_in_mask_last = vertex_mask[last_loop->v];
+ int last_index = start;
+ for (const int j : loops_src.index_range()) {
+ const int index = (start + 1 + j) % mp_src.totloop;
+ const MLoop &loop = loops_src[index];
+ const bool v_loop_in_mask = vertex_mask[loop.v];
+ if (v_loop_in_mask && !v_loop_in_mask_last) {
+ /* Start new cut. */
+ float fac = get_interp_factor_from_vgroup(
+ dvert, defgrp_index, threshold, last_loop->v, loop.v);
+ float weights[2] = {1.0f - fac, fac};
+ int indices[2] = {i_ml_src + last_index, i_ml_src + index};
+ CustomData_interp(&src_mesh.ldata, &dst_mesh.ldata, indices, weights, NULL, 2, i_ml_dst);
+ MLoop &cut_dst_loop = dst_mesh.mloop[i_ml_dst];
+ cut_dst_loop.e = edge_map[last_loop->e];
+ cut_dst_loop.v = dst_mesh.medge[cut_dst_loop.e].v1;
+ i_ml_dst++;
+
+ CustomData_copy_data(&src_mesh.ldata, &dst_mesh.ldata, i_ml_src + index, i_ml_dst, 1);
+ MLoop &next_dst_loop = dst_mesh.mloop[i_ml_dst];
+ next_dst_loop.v = vertex_map[loop.v];
+ next_dst_loop.e = edge_map[loop.e];
+ i_ml_dst++;
+ }
+ else if (!v_loop_in_mask && v_loop_in_mask_last) {
+ BLI_assert(i_ml_dst != mp_dst.loopstart);
+ /* End active cut. */
+ float fac = get_interp_factor_from_vgroup(
+ dvert, defgrp_index, threshold, last_loop->v, loop.v);
+ float weights[2] = {1.0f - fac, fac};
+ int indices[2] = {i_ml_src + last_index, i_ml_src + index};
+ CustomData_interp(&src_mesh.ldata, &dst_mesh.ldata, indices, weights, NULL, 2, i_ml_dst);
+ MLoop &cut_dst_loop = dst_mesh.mloop[i_ml_dst];
+ cut_dst_loop.e = edge_index;
+ cut_dst_loop.v = dst_mesh.medge[edge_map[last_loop->e]].v1;
+ i_ml_dst++;
+
+ /* Create closing edge. */
+ MEdge &cut_edge = dst_mesh.medge[edge_index];
+ cut_edge.v1 = dst_mesh.mloop[mp_dst.loopstart].v;
+ cut_edge.v2 = cut_dst_loop.v;
+ BLI_assert(cut_edge.v1 != cut_edge.v2);
+ cut_edge.flag = ME_EDGEDRAW | ME_EDGERENDER;
+ edge_index++;
+
+ /* Only handle one of the cuts per iteration. */
+ break;
+ }
+ else if (v_loop_in_mask && v_loop_in_mask_last) {
+ BLI_assert(i_ml_dst != mp_dst.loopstart);
+ /* Extend active poly. */
+ CustomData_copy_data(&src_mesh.ldata, &dst_mesh.ldata, i_ml_src + index, i_ml_dst, 1);
+ MLoop &dst_loop = dst_mesh.mloop[i_ml_dst];
+ dst_loop.v = vertex_map[loop.v];
+ dst_loop.e = edge_map[loop.e];
+ i_ml_dst++;
+ }
+ last_loop = &loop;
+ last_index = index;
+ v_loop_in_mask_last = v_loop_in_mask;
+ }
+ BLI_assert(mp_dst.loopstart + mp_dst.totloop == i_ml_dst);
+ }
+ BLI_assert(edge_index == dst_mesh.totedge);
+}
+
/* Components of the algorithm:
* 1. Figure out which vertices should be present in the output mesh.
* 2. Find edges and polygons only using those vertices.
@@ -329,6 +678,8 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
{
MaskModifierData *mmd = reinterpret_cast<MaskModifierData *>(md);
const bool invert_mask = mmd->flag & MOD_MASK_INV;
+ const bool use_interpolation = mmd->mode == MOD_MASK_MODE_VGROUP &&
+ (mmd->flag & MOD_MASK_SMOOTH);
/* Return empty or input mesh when there are no vertex groups. */
MDeformVert *dvert = (MDeformVert *)CustomData_get_layer(&mesh->vdata, CD_MDEFORMVERT);
@@ -342,6 +693,8 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
return mesh;
}
+ int defgrp_index = -1;
+
Array<bool> vertex_mask;
if (mmd->mode == MOD_MASK_MODE_ARM) {
Object *armature_ob = mmd->ob_arm;
@@ -355,7 +708,8 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
compute_vertex_mask__armature_mode(dvert, mesh, armature_ob, mmd->threshold, vertex_mask);
}
else {
- int defgrp_index = BKE_id_defgroup_name_index(&mesh->id, mmd->vgroup);
+ BLI_assert(mmd->mode == MOD_MASK_MODE_VGROUP);
+ defgrp_index = BKE_id_defgroup_name_index(&mesh->id, mmd->vgroup);
/* Return input mesh if the vertex group does not exist. */
if (defgrp_index == -1) {
@@ -376,7 +730,15 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
Array<int> edge_map(mesh->totedge);
uint num_masked_edges;
- computed_masked_edges(mesh, vertex_mask, edge_map, &num_masked_edges);
+ uint num_add_vertices;
+ if (use_interpolation) {
+ computed_masked_edges_smooth(
+ mesh, vertex_mask, edge_map, &num_masked_edges, &num_add_vertices);
+ }
+ else {
+ computed_masked_edges(mesh, vertex_mask, edge_map, &num_masked_edges);
+ num_add_vertices = 0;
+ }
Vector<int> masked_poly_indices;
Vector<int> new_loop_starts;
@@ -389,13 +751,65 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
&num_masked_polys,
&num_masked_loops);
- Mesh *result = BKE_mesh_new_nomain_from_template(
- mesh, num_masked_vertices, num_masked_edges, 0, num_masked_loops, num_masked_polys);
+ uint num_add_edges = 0;
+ uint num_add_polys = 0;
+ uint num_add_loops = 0;
+ if (use_interpolation) {
+ compute_interpolated_polygons(mesh,
+ vertex_mask,
+ num_add_vertices,
+ num_masked_loops,
+ masked_poly_indices,
+ new_loop_starts,
+ &num_add_edges,
+ &num_add_polys,
+ &num_add_loops);
+ }
+
+ Mesh *result = BKE_mesh_new_nomain_from_template(mesh,
+ num_masked_vertices + num_add_vertices,
+ num_masked_edges + num_add_edges,
+ 0,
+ num_masked_loops + num_add_loops,
+ num_masked_polys + num_add_polys);
copy_masked_vertices_to_new_mesh(*mesh, *result, vertex_map);
- copy_masked_edges_to_new_mesh(*mesh, *result, vertex_map, edge_map);
- copy_masked_polys_to_new_mesh(
- *mesh, *result, vertex_map, edge_map, masked_poly_indices, new_loop_starts);
+ if (use_interpolation) {
+ add_interp_verts_copy_edges_to_new_mesh(*mesh,
+ *result,
+ vertex_mask,
+ vertex_map,
+ dvert,
+ defgrp_index,
+ mmd->threshold,
+ num_masked_edges,
+ num_add_vertices,
+ edge_map);
+ }
+ else {
+ copy_masked_edges_to_new_mesh(*mesh, *result, vertex_map, edge_map);
+ }
+ copy_masked_polys_to_new_mesh(*mesh,
+ *result,
+ vertex_map,
+ edge_map,
+ masked_poly_indices,
+ new_loop_starts,
+ num_masked_polys);
+ if (use_interpolation) {
+ add_interpolated_polys_to_new_mesh(*mesh,
+ *result,
+ vertex_mask,
+ vertex_map,
+ edge_map,
+ dvert,
+ defgrp_index,
+ mmd->threshold,
+ masked_poly_indices,
+ new_loop_starts,
+ num_masked_polys,
+ num_add_edges);
+ }
BKE_mesh_calc_edges_loose(result);
/* Tag to recalculate normals later. */
@@ -441,6 +855,7 @@ static void panel_draw(const bContext *UNUSED(C), Panel *panel)
}
else if (mode == MOD_MASK_MODE_VGROUP) {
modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", nullptr);
+ uiItemR(layout, ptr, "use_smooth", 0, nullptr, ICON_NONE);
}
uiItemR(layout, ptr, "threshold", 0, nullptr, ICON_NONE);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc
index d71cb09f1bd..bfcde288cfb 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc
@@ -14,8 +14,6 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "BLI_kdopbvh.h"
-#include "BLI_kdtree.h"
#include "BLI_task.hh"
#include "BLI_timeit.hh"
@@ -53,179 +51,155 @@ static void geo_attribute_proximity_init(bNodeTree *UNUSED(ntree), bNode *node)
NodeGeometryAttributeProximity *node_storage = (NodeGeometryAttributeProximity *)MEM_callocN(
sizeof(NodeGeometryAttributeProximity), __func__);
- node_storage->target_geometry_element =
- GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES;
+ node_storage->target_geometry_element = GEO_NODE_PROXIMITY_TARGET_FACES;
node->storage = node_storage;
}
namespace blender::nodes {
-static void proximity_calc(MutableSpan<float> distance_span,
- MutableSpan<float3> location_span,
- const VArray<float3> &positions,
- BVHTreeFromMesh &tree_data_mesh,
- BVHTreeFromPointCloud &tree_data_pointcloud,
- const bool bvh_mesh_success,
- const bool bvh_pointcloud_success,
- const bool store_distances,
- const bool store_locations)
+static void calculate_mesh_proximity(const VArray<float3> &positions,
+ const Mesh &mesh,
+ const GeometryNodeAttributeProximityTargetType type,
+ MutableSpan<float> r_distances,
+ MutableSpan<float3> r_locations)
{
- IndexRange range = positions.index_range();
- threading::parallel_for(range, 512, [&](IndexRange range) {
- BVHTreeNearest nearest_from_mesh;
- BVHTreeNearest nearest_from_pointcloud;
+ BVHTreeFromMesh bvh_data;
+ switch (type) {
+ case GEO_NODE_PROXIMITY_TARGET_POINTS:
+ BKE_bvhtree_from_mesh_get(&bvh_data, &mesh, BVHTREE_FROM_VERTS, 2);
+ break;
+ case GEO_NODE_PROXIMITY_TARGET_EDGES:
+ BKE_bvhtree_from_mesh_get(&bvh_data, &mesh, BVHTREE_FROM_EDGES, 2);
+ break;
+ case GEO_NODE_PROXIMITY_TARGET_FACES:
+ BKE_bvhtree_from_mesh_get(&bvh_data, &mesh, BVHTREE_FROM_LOOPTRI, 2);
+ break;
+ }
- copy_v3_fl(nearest_from_mesh.co, FLT_MAX);
- copy_v3_fl(nearest_from_pointcloud.co, FLT_MAX);
+ if (bvh_data.tree == nullptr) {
+ return;
+ }
- nearest_from_mesh.index = -1;
- nearest_from_pointcloud.index = -1;
+ threading::parallel_for(positions.index_range(), 512, [&](IndexRange range) {
+ BVHTreeNearest nearest;
+ copy_v3_fl(nearest.co, FLT_MAX);
+ nearest.index = -1;
for (int i : range) {
/* Use the distance to the last found point as upper bound to speedup the bvh lookup. */
- nearest_from_mesh.dist_sq = len_squared_v3v3(nearest_from_mesh.co, positions[i]);
-
- if (bvh_mesh_success) {
- BLI_bvhtree_find_nearest(tree_data_mesh.tree,
- positions[i],
- &nearest_from_mesh,
- tree_data_mesh.nearest_callback,
- &tree_data_mesh);
- }
+ nearest.dist_sq = float3::distance_squared(nearest.co, positions[i]);
- /* Use the distance to the closest point in the mesh to speedup the pointcloud bvh lookup.
- * This is ok because we only need to find the closest point in the pointcloud if it's closer
- * than the mesh. */
- nearest_from_pointcloud.dist_sq = nearest_from_mesh.dist_sq;
-
- if (bvh_pointcloud_success) {
- BLI_bvhtree_find_nearest(tree_data_pointcloud.tree,
- positions[i],
- &nearest_from_pointcloud,
- tree_data_pointcloud.nearest_callback,
- &tree_data_pointcloud);
- }
+ BLI_bvhtree_find_nearest(
+ bvh_data.tree, positions[i], &nearest, bvh_data.nearest_callback, &bvh_data);
- if (nearest_from_pointcloud.dist_sq < nearest_from_mesh.dist_sq) {
- if (store_distances) {
- distance_span[i] = sqrtf(nearest_from_pointcloud.dist_sq);
- }
- if (store_locations) {
- location_span[i] = nearest_from_pointcloud.co;
- }
- }
- else {
- if (store_distances) {
- distance_span[i] = sqrtf(nearest_from_mesh.dist_sq);
- }
- if (store_locations) {
- location_span[i] = nearest_from_mesh.co;
+ if (nearest.dist_sq < r_distances[i]) {
+ r_distances[i] = nearest.dist_sq;
+ if (!r_locations.is_empty()) {
+ r_locations[i] = nearest.co;
}
}
}
});
+
+ free_bvhtree_from_mesh(&bvh_data);
}
-static bool bvh_from_mesh(const Mesh *target_mesh,
- int target_geometry_element,
- BVHTreeFromMesh &r_tree_data_mesh)
+static void calculate_pointcloud_proximity(const VArray<float3> &positions,
+ const PointCloud &pointcloud,
+ MutableSpan<float> r_distances,
+ MutableSpan<float3> r_locations)
{
- BVHCacheType bvh_type = BVHTREE_FROM_LOOPTRI;
- switch (target_geometry_element) {
- case GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_POINTS:
- bvh_type = BVHTREE_FROM_VERTS;
- break;
- case GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_EDGES:
- bvh_type = BVHTREE_FROM_EDGES;
- break;
- case GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_FACES:
- bvh_type = BVHTREE_FROM_LOOPTRI;
- break;
+ BVHTreeFromPointCloud bvh_data;
+ BKE_bvhtree_from_pointcloud_get(&bvh_data, &pointcloud, 2);
+ if (bvh_data.tree == nullptr) {
+ return;
}
- BKE_bvhtree_from_mesh_get(&r_tree_data_mesh, target_mesh, bvh_type, 2);
- if (r_tree_data_mesh.tree == nullptr) {
- return false;
- }
- return true;
-}
+ threading::parallel_for(positions.index_range(), 512, [&](IndexRange range) {
+ BVHTreeNearest nearest;
+ copy_v3_fl(nearest.co, FLT_MAX);
+ nearest.index = -1;
-static bool bvh_from_pointcloud(const PointCloud *target_pointcloud,
- BVHTreeFromPointCloud &r_tree_data_pointcloud)
-{
- BKE_bvhtree_from_pointcloud_get(&r_tree_data_pointcloud, target_pointcloud, 2);
- if (r_tree_data_pointcloud.tree == nullptr) {
- return false;
- }
- return true;
+ for (int i : range) {
+ /* Use the distance to the closest point in the mesh to speedup the pointcloud bvh lookup.
+ * This is ok because we only need to find the closest point in the pointcloud if it's
+ * closer than the mesh. */
+ nearest.dist_sq = r_distances[i];
+
+ BLI_bvhtree_find_nearest(
+ bvh_data.tree, positions[i], &nearest, bvh_data.nearest_callback, &bvh_data);
+
+ if (nearest.dist_sq < r_distances[i]) {
+ r_distances[i] = nearest.dist_sq;
+ if (!r_locations.is_empty()) {
+ r_locations[i] = nearest.co;
+ }
+ }
+ }
+ });
+
+ free_bvhtree_from_pointcloud(&bvh_data);
}
static void attribute_calc_proximity(GeometryComponent &component,
- GeometrySet &geometry_set_target,
+ GeometrySet &target,
GeoNodeExecParams &params)
{
- /* This node works on the "point" domain, since that is where positions are stored. */
- const AttributeDomain result_domain = ATTR_DOMAIN_POINT;
-
- const std::string distance_attribute_name = params.get_input<std::string>("Distance");
+ const std::string distance_name = params.get_input<std::string>("Distance");
OutputAttribute_Typed<float> distance_attribute =
- component.attribute_try_get_for_output_only<float>(distance_attribute_name, result_domain);
+ component.attribute_try_get_for_output_only<float>(distance_name, ATTR_DOMAIN_POINT);
- const std::string location_attribute_name = params.get_input<std::string>("Position");
+ const std::string location_name = params.get_input<std::string>("Position");
OutputAttribute_Typed<float3> location_attribute =
- component.attribute_try_get_for_output_only<float3>(location_attribute_name, result_domain);
+ component.attribute_try_get_for_output_only<float3>(location_name, ATTR_DOMAIN_POINT);
ReadAttributeLookup position_attribute = component.attribute_try_get_for_read("position");
if (!position_attribute || (!distance_attribute && !location_attribute)) {
return;
}
- BLI_assert(position_attribute.varray->type().is<float3>());
-
- const bNode &node = params.node();
- const NodeGeometryAttributeProximity &storage = *(const NodeGeometryAttributeProximity *)
- node.storage;
-
- BVHTreeFromMesh tree_data_mesh;
- BVHTreeFromPointCloud tree_data_pointcloud;
- bool bvh_mesh_success = false;
- bool bvh_pointcloud_success = false;
+ GVArray_Typed<float3> positions{*position_attribute.varray};
+ const NodeGeometryAttributeProximity &storage =
+ *(const NodeGeometryAttributeProximity *)params.node().storage;
- if (geometry_set_target.has_mesh()) {
- bvh_mesh_success = bvh_from_mesh(
- geometry_set_target.get_mesh_for_read(), storage.target_geometry_element, tree_data_mesh);
+ Array<float> distances_internal;
+ MutableSpan<float> distances;
+ if (distance_attribute) {
+ distances = distance_attribute.as_span();
}
-
- if (geometry_set_target.has_pointcloud() &&
- storage.target_geometry_element ==
- GEO_NODE_ATTRIBUTE_PROXIMITY_TARGET_GEOMETRY_ELEMENT_POINTS) {
- bvh_pointcloud_success = bvh_from_pointcloud(geometry_set_target.get_pointcloud_for_read(),
- tree_data_pointcloud);
+ else {
+ /* Theoretically it would be possible to avoid using the distance array when it's not required
+ * and there is only one component. However, this only adds an allocation and a single float
+ * comparison per vertex, so it's likely not worth it. */
+ distances_internal.reinitialize(positions.size());
+ distances = distances_internal;
}
-
- GVArray_Typed<float3> positions{*position_attribute.varray};
- MutableSpan<float> distance_span = distance_attribute ? distance_attribute.as_span() :
- MutableSpan<float>();
- MutableSpan<float3> location_span = location_attribute ? location_attribute.as_span() :
- MutableSpan<float3>();
-
- proximity_calc(distance_span,
- location_span,
- positions,
- tree_data_mesh,
- tree_data_pointcloud,
- bvh_mesh_success,
- bvh_pointcloud_success,
- distance_attribute, /* Boolean. */
- location_attribute); /* Boolean. */
-
- if (bvh_mesh_success) {
- free_bvhtree_from_mesh(&tree_data_mesh);
+ distances.fill(FLT_MAX);
+ MutableSpan<float3> locations = location_attribute ? location_attribute.as_span() :
+ MutableSpan<float3>();
+
+ if (target.has_mesh()) {
+ calculate_mesh_proximity(
+ positions,
+ *target.get_mesh_for_read(),
+ static_cast<GeometryNodeAttributeProximityTargetType>(storage.target_geometry_element),
+ distances,
+ locations);
}
- if (bvh_pointcloud_success) {
- free_bvhtree_from_pointcloud(&tree_data_pointcloud);
+
+ if (target.has_pointcloud() &&
+ storage.target_geometry_element == GEO_NODE_PROXIMITY_TARGET_POINTS) {
+ calculate_pointcloud_proximity(
+ positions, *target.get_pointcloud_for_read(), distances, locations);
}
if (distance_attribute) {
+ /* Squared distances are used above to speed up comparisons,
+ * so do the square roots now if necessary for the output attribute. */
+ threading::parallel_for(distances.index_range(), 2048, [&](IndexRange range) {
+ for (const int i : range) {
+ distances[i] = std::sqrt(distances[i]);
+ }
+ });
distance_attribute.save();
}
if (location_attribute) {
diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c
index 145586d8ab0..c7b59ee0d6e 100644
--- a/source/blender/python/gpu/gpu_py_shader.c
+++ b/source/blender/python/gpu/gpu_py_shader.c
@@ -70,6 +70,12 @@ static const struct PyC_StringEnumItems pygpu_shader_builtin_items[] = {
{0, NULL},
};
+static const struct PyC_StringEnumItems pygpu_shader_config_items[] = {
+ {GPU_SHADER_CFG_DEFAULT, "DEFAULT"},
+ {GPU_SHADER_CFG_CLIPPED, "CLIPPED"},
+ {0, NULL},
+};
+
static int pygpu_shader_uniform_location_get(GPUShader *shader,
const char *name,
const char *error_prefix)
@@ -711,29 +717,48 @@ static PyObject *pygpu_shader_unbind(BPyGPUShader *UNUSED(self))
}
PyDoc_STRVAR(pygpu_shader_from_builtin_doc,
- ".. function:: from_builtin(pygpu_shader_name)\n"
+ ".. function:: from_builtin(shader_name, config='DEFAULT')\n"
"\n"
" Shaders that are embedded in the blender internal code.\n"
" They all read the uniform ``mat4 ModelViewProjectionMatrix``,\n"
" which can be edited by the :mod:`gpu.matrix` module.\n"
+ " You can also choose a shader configuration that uses clip_planes by setting the "
+ "``CLIPPED`` value to the config parameter. Note that in this case you also need to "
+ "manually set the value of ``ModelMatrix``.\n"
+ "\n"
" For more details, you can check the shader code with the\n"
" :func:`gpu.shader.code_from_builtin` function.\n"
"\n"
- " :param pygpu_shader_name: One of these builtin shader names:\n"
+ " :param shader_name: One of these builtin shader names:\n"
"\n" PYDOC_BUILTIN_SHADER_LIST
- " :type pygpu_shader_name: str\n"
+ " :type shader_name: str\n"
+ " :param config: One of these types of shader configuration:\n"
+ " - ``DEFAULT``\n"
+ " - ``CLIPPED``\n"
+ " :type config: str\n"
" :return: Shader object corresponding to the given name.\n"
" :rtype: :class:`bpy.types.GPUShader`\n");
-static PyObject *pygpu_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg)
+static PyObject *pygpu_shader_from_builtin(PyObject *UNUSED(self), PyObject *args, PyObject *kwds)
{
BPYGPU_IS_INIT_OR_ERROR_OBJ;
struct PyC_StringEnum pygpu_bultinshader = {pygpu_shader_builtin_items};
- if (!PyC_ParseStringEnum(arg, &pygpu_bultinshader)) {
+ struct PyC_StringEnum pygpu_config = {pygpu_shader_config_items, GPU_SHADER_CFG_DEFAULT};
+
+ static const char *_keywords[] = {"shader_name", "config", NULL};
+ static _PyArg_Parser _parser = {"O&|$O&:from_builtin", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(args,
+ kwds,
+ &_parser,
+ PyC_ParseStringEnum,
+ &pygpu_bultinshader,
+ PyC_ParseStringEnum,
+ &pygpu_config)) {
return NULL;
}
- GPUShader *shader = GPU_shader_get_builtin_shader(pygpu_bultinshader.value_found);
+ GPUShader *shader = GPU_shader_get_builtin_shader_with_config(pygpu_bultinshader.value_found,
+ pygpu_config.value_found);
return BPyGPUShader_CreatePyObject(shader, true);
}
@@ -788,7 +813,7 @@ static struct PyMethodDef pygpu_shader_module__tp_methods[] = {
{"unbind", (PyCFunction)pygpu_shader_unbind, METH_NOARGS, pygpu_shader_unbind_doc},
{"from_builtin",
(PyCFunction)pygpu_shader_from_builtin,
- METH_O,
+ METH_VARARGS | METH_KEYWORDS,
pygpu_shader_from_builtin_doc},
{"code_from_builtin",
(PyCFunction)pygpu_shader_code_from_builtin,
diff --git a/source/blender/python/gpu/gpu_py_state.c b/source/blender/python/gpu/gpu_py_state.c
index 7b7a61cc338..757c787882b 100644
--- a/source/blender/python/gpu/gpu_py_state.c
+++ b/source/blender/python/gpu/gpu_py_state.c
@@ -123,6 +123,28 @@ static PyObject *pygpu_state_blend_get(PyObject *UNUSED(self))
return PyUnicode_FromString(PyC_StringEnum_FindIDFromValue(pygpu_state_blend_items, blend));
}
+PyDoc_STRVAR(pygpu_state_clip_distances_set_doc,
+ ".. function:: clip_distances_set(distances_enabled)\n"
+ "\n"
+ " Sets number of `gl_ClipDistance`s that will be used for clip geometry.\n"
+ "\n"
+ " :param distances_enabled: Number of clip distances enabled.\n"
+ " :type distances_enabled: int\n");
+static PyObject *pygpu_state_clip_distances_set(PyObject *UNUSED(self), PyObject *value)
+{
+ int distances_enabled = (int)PyLong_AsUnsignedLong(value);
+ if (distances_enabled == -1) {
+ return NULL;
+ }
+
+ if (distances_enabled > 6) {
+ PyErr_SetString(PyExc_ValueError, "too many distances enabled, max is 6");
+ }
+
+ GPU_clip_distances(distances_enabled);
+ Py_RETURN_NONE;
+}
+
PyDoc_STRVAR(pygpu_state_depth_test_set_doc,
".. function:: depth_test_set(mode)\n"
"\n"
@@ -356,6 +378,10 @@ static struct PyMethodDef pygpu_state__tp_methods[] = {
/* Manage Stack */
{"blend_set", (PyCFunction)pygpu_state_blend_set, METH_O, pygpu_state_blend_set_doc},
{"blend_get", (PyCFunction)pygpu_state_blend_get, METH_NOARGS, pygpu_state_blend_get_doc},
+ {"clip_distances_set",
+ (PyCFunction)pygpu_state_clip_distances_set,
+ METH_O,
+ pygpu_state_clip_distances_set_doc},
{"depth_test_set",
(PyCFunction)pygpu_state_depth_test_set,
METH_O,
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c
index a84d920d47d..f89a4809587 100644
--- a/source/blender/python/intern/bpy_props.c
+++ b/source/blender/python/intern/bpy_props.c
@@ -157,7 +157,6 @@ static const EnumPropertyItem property_subtype_number_items[] = {
0,
"Time (Absolute)",
"Time specified in seconds, independent of the scene"},
- {PROP_TIME_ABSOLUTE, "TIME_ABSOLUTE", 0, "Time Absolute", ""},
{PROP_DISTANCE, "DISTANCE", 0, "Distance", ""},
{PROP_DISTANCE_CAMERA, "DISTANCE_CAMERA", 0, "Camera Distance", ""},
{PROP_POWER, "POWER", 0, "Power", ""},
diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c
index 1510587502b..481a6662cc0 100644
--- a/source/blender/render/intern/engine.c
+++ b/source/blender/render/intern/engine.c
@@ -291,6 +291,15 @@ static RenderPart *get_part_from_result(Render *re, RenderResult *result)
return BLI_ghash_lookup(re->parts, &key);
}
+static HighlightedTile highlighted_tile_from_result_get(Render *re, RenderResult *result)
+{
+ HighlightedTile tile;
+ tile.rect = result->tilerect;
+ BLI_rcti_translate(&tile.rect, re->disprect.xmin, re->disprect.ymin);
+
+ return tile;
+}
+
RenderResult *RE_engine_begin_result(
RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname)
{
@@ -426,6 +435,30 @@ void RE_engine_end_result(
}
}
+ if (re->engine && (re->engine->flag & RE_ENGINE_HIGHLIGHT_TILES)) {
+ BLI_mutex_lock(&re->highlighted_tiles_mutex);
+
+ if (re->highlighted_tiles == NULL) {
+ re->highlighted_tiles = BLI_gset_new(
+ BLI_ghashutil_inthash_v4_p, BLI_ghashutil_inthash_v4_cmp, "highlighted tiles");
+ }
+
+ HighlightedTile tile = highlighted_tile_from_result_get(re, result);
+ if (highlight) {
+ void **tile_in_set;
+ if (!BLI_gset_ensure_p_ex(re->highlighted_tiles, &tile, &tile_in_set)) {
+ *tile_in_set = MEM_mallocN(sizeof(HighlightedTile), __func__);
+ memcpy(*tile_in_set, &tile, sizeof(tile));
+ }
+ BLI_gset_add(re->highlighted_tiles, &tile);
+ }
+ else {
+ BLI_gset_remove(re->highlighted_tiles, &tile, MEM_freeN);
+ }
+
+ BLI_mutex_unlock(&re->highlighted_tiles_mutex);
+ }
+
if (!cancel || merge_results) {
if (re->result->do_exr_tile) {
if (!cancel && merge_results) {
@@ -597,43 +630,43 @@ rcti *RE_engine_get_current_tiles(Render *re, int *r_total_tiles, bool *r_needs_
rcti *tiles = tiles_static;
int allocation_size = BLENDER_MAX_THREADS;
- BLI_rw_mutex_lock(&re->partsmutex, THREAD_LOCK_READ);
+ BLI_mutex_lock(&re->highlighted_tiles_mutex);
*r_needs_free = false;
- if (!re->parts || (re->engine && (re->engine->flag & RE_ENGINE_HIGHLIGHT_TILES) == 0)) {
+ if (re->highlighted_tiles == NULL) {
*r_total_tiles = 0;
- BLI_rw_mutex_unlock(&re->partsmutex);
+ BLI_mutex_unlock(&re->highlighted_tiles_mutex);
return NULL;
}
- GHashIterator pa_iter;
- GHASH_ITER (pa_iter, re->parts) {
- RenderPart *pa = BLI_ghashIterator_getValue(&pa_iter);
- if (pa->status == PART_STATUS_IN_PROGRESS) {
- if (total_tiles >= allocation_size) {
- /* Just in case we're using crazy network rendering with more
- * workers than BLENDER_MAX_THREADS.
+ GSET_FOREACH_BEGIN (HighlightedTile *, tile, re->highlighted_tiles) {
+ if (total_tiles >= allocation_size) {
+ /* Just in case we're using crazy network rendering with more
+ * workers than BLENDER_MAX_THREADS.
+ */
+ allocation_size += allocation_step;
+ if (tiles == tiles_static) {
+ /* Can not realloc yet, tiles are pointing to a
+ * stack memory.
*/
- allocation_size += allocation_step;
- if (tiles == tiles_static) {
- /* Can not realloc yet, tiles are pointing to a
- * stack memory.
- */
- tiles = MEM_mallocN(allocation_size * sizeof(rcti), "current engine tiles");
- }
- else {
- tiles = MEM_reallocN(tiles, allocation_size * sizeof(rcti));
- }
- *r_needs_free = true;
+ tiles = MEM_mallocN(allocation_size * sizeof(rcti), "current engine tiles");
}
- tiles[total_tiles] = pa->disprect;
-
- total_tiles++;
+ else {
+ tiles = MEM_reallocN(tiles, allocation_size * sizeof(rcti));
+ }
+ *r_needs_free = true;
}
+ tiles[total_tiles] = tile->rect;
+
+ total_tiles++;
}
- BLI_rw_mutex_unlock(&re->partsmutex);
+ GSET_FOREACH_END();
+
+ BLI_mutex_unlock(&re->highlighted_tiles_mutex);
+
*r_total_tiles = total_tiles;
+
return tiles;
}
diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c
index 9ef52b4bf41..bf42adbab87 100644
--- a/source/blender/render/intern/pipeline.c
+++ b/source/blender/render/intern/pipeline.c
@@ -569,6 +569,7 @@ Render *RE_NewRender(const char *name)
BLI_strncpy(re->name, name, RE_MAXNAME);
BLI_rw_mutex_init(&re->resultmutex);
BLI_rw_mutex_init(&re->partsmutex);
+ BLI_mutex_init(&re->highlighted_tiles_mutex);
}
RE_InitRenderCB(re);
@@ -633,12 +634,17 @@ void RE_FreeRender(Render *re)
BLI_rw_mutex_end(&re->resultmutex);
BLI_rw_mutex_end(&re->partsmutex);
+ BLI_mutex_end(&re->highlighted_tiles_mutex);
BLI_freelistN(&re->view_layers);
BLI_freelistN(&re->r.views);
BKE_curvemapping_free_data(&re->r.mblur_shutter_curve);
+ if (re->highlighted_tiles != NULL) {
+ BLI_gset_free(re->highlighted_tiles, MEM_freeN);
+ }
+
/* main dbase can already be invalid now, some database-free code checks it */
re->main = NULL;
re->scene = NULL;
diff --git a/source/blender/render/intern/render_types.h b/source/blender/render/intern/render_types.h
index 50b684beba9..d2d2b499495 100644
--- a/source/blender/render/intern/render_types.h
+++ b/source/blender/render/intern/render_types.h
@@ -37,6 +37,7 @@
#include "RE_pipeline.h"
struct GHash;
+struct GSet;
struct Main;
struct Object;
struct RenderEngine;
@@ -59,6 +60,10 @@ typedef struct RenderPart {
short status;
} RenderPart;
+typedef struct HighlightedTile {
+ rcti rect;
+} HighlightedTile;
+
enum {
/* PART_STATUS_NONE = 0, */ /* UNUSED */
PART_STATUS_IN_PROGRESS = 1,
@@ -118,6 +123,9 @@ struct Render {
ThreadRWMutex partsmutex;
struct GHash *parts;
+ ThreadMutex highlighted_tiles_mutex;
+ struct GSet *highlighted_tiles;
+
/* render engine */
struct RenderEngine *engine;
diff --git a/source/blender/sequencer/SEQ_iterator.h b/source/blender/sequencer/SEQ_iterator.h
index 3ade7309f89..055db07f646 100644
--- a/source/blender/sequencer/SEQ_iterator.h
+++ b/source/blender/sequencer/SEQ_iterator.h
@@ -39,23 +39,7 @@ struct Sequence;
SEQ_iterator_ensure(collection, &iter, &var) && var != NULL; \
var = SEQ_iterator_yield(&iter))
-#define SEQ_ALL_BEGIN(ed, var) \
- { \
- if (ed != NULL) { \
- SeqCollection *all_strips = SEQ_query_all_strips_recursive(&ed->seqbase); \
- GSetIterator gsi; \
- GSET_ITER (gsi, all_strips->set) { \
- var = (Sequence *)(BLI_gsetIterator_getKey(&gsi));
-
-#define SEQ_ALL_END \
- } \
- SEQ_collection_free(all_strips); \
- } \
- } \
- ((void)0)
-
typedef struct SeqCollection {
- struct SeqCollection *next, *prev;
struct GSet *set;
} SeqCollection;
@@ -70,6 +54,11 @@ bool SEQ_iterator_ensure(SeqCollection *collection,
struct Sequence **r_seq);
struct Sequence *SEQ_iterator_yield(SeqIterator *iterator);
+/* Callback format for the for_each function below. */
+typedef bool (*SeqForEachFunc)(struct Sequence *seq, void *user_data);
+
+void SEQ_for_each_callback(struct ListBase *seqbase, SeqForEachFunc callback, void *user_data);
+
SeqCollection *SEQ_collection_create(const char *name);
SeqCollection *SEQ_collection_duplicate(SeqCollection *collection);
uint SEQ_collection_len(const SeqCollection *collection);
@@ -90,8 +79,8 @@ SeqCollection *SEQ_query_by_reference(struct Sequence *seq_reference,
struct ListBase *seqbase,
SeqCollection *collection));
SeqCollection *SEQ_query_selected_strips(struct ListBase *seqbase);
-SeqCollection *SEQ_query_all_strips(ListBase *seqbase);
-SeqCollection *SEQ_query_all_strips_recursive(ListBase *seqbase);
+SeqCollection *SEQ_query_all_strips(struct ListBase *seqbase);
+SeqCollection *SEQ_query_all_strips_recursive(struct ListBase *seqbase);
void SEQ_query_strip_effect_chain(struct Sequence *seq_reference,
struct ListBase *seqbase,
SeqCollection *collection);
diff --git a/source/blender/sequencer/SEQ_sequencer.h b/source/blender/sequencer/SEQ_sequencer.h
index f4338d13c8f..54ef37b9049 100644
--- a/source/blender/sequencer/SEQ_sequencer.h
+++ b/source/blender/sequencer/SEQ_sequencer.h
@@ -29,6 +29,11 @@ extern "C" {
#include "DNA_scene_types.h"
+struct BlendDataReader;
+struct BlendExpander;
+struct BlendLibReader;
+struct BlendWriter;
+struct Depsgraph;
struct Editing;
struct Scene;
struct Sequence;
@@ -83,6 +88,21 @@ void SEQ_sequence_base_dupli_recursive(const struct Scene *scene_src,
int dupe_flag,
const int flag);
+/* Read and Write functions for .blend file data */
+void SEQ_blend_write(struct BlendWriter *writer, struct ListBase *seqbase);
+void SEQ_blend_read(struct BlendDataReader *reader, struct ListBase *seqbase);
+
+void SEQ_blend_read_lib(struct BlendLibReader *reader,
+ struct Scene *scene,
+ struct ListBase *seqbase);
+
+void SEQ_blend_read_expand(struct BlendExpander *expander, struct ListBase *seqbase);
+
+/* Depsgraph update function */
+void SEQ_eval_sequences(struct Depsgraph *depsgraph,
+ struct Scene *scene,
+ struct ListBase *seqbase);
+
/* Defined in sequence_lookup.c */
typedef enum eSequenceLookupTag {
diff --git a/source/blender/sequencer/SEQ_utils.h b/source/blender/sequencer/SEQ_utils.h
index 99603dc8a3e..09de7bc67e9 100644
--- a/source/blender/sequencer/SEQ_utils.h
+++ b/source/blender/sequencer/SEQ_utils.h
@@ -56,12 +56,6 @@ void SEQ_set_scale_to_fit(const struct Sequence *seq,
const int preview_width,
const int preview_height,
const eSeqImageFitMethod fit_method);
-int SEQ_seqbase_recursive_apply(struct ListBase *seqbase,
- int (*apply_fn)(struct Sequence *seq, void *),
- void *arg);
-int SEQ_recursive_apply(struct Sequence *seq,
- int (*apply_fn)(struct Sequence *, void *),
- void *arg);
void SEQ_ensure_unique_name(struct Sequence *seq, struct Scene *scene);
#ifdef __cplusplus
diff --git a/source/blender/sequencer/intern/clipboard.c b/source/blender/sequencer/intern/clipboard.c
index 9e702a4e60b..05406c50303 100644
--- a/source/blender/sequencer/intern/clipboard.c
+++ b/source/blender/sequencer/intern/clipboard.c
@@ -71,7 +71,7 @@ void SEQ_clipboard_free(void)
for (seq = seqbase_clipboard.first; seq; seq = nseq) {
nseq = seq->next;
- seq_free_sequence_recurse(NULL, seq, false);
+ seq_free_sequence_recurse(NULL, seq, false, true);
}
BLI_listbase_clear(&seqbase_clipboard);
}
diff --git a/source/blender/sequencer/intern/effects.c b/source/blender/sequencer/intern/effects.c
index d4adad9a34d..37bac523645 100644
--- a/source/blender/sequencer/intern/effects.c
+++ b/source/blender/sequencer/intern/effects.c
@@ -39,6 +39,7 @@
#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
#include "DNA_space_types.h"
@@ -3755,31 +3756,47 @@ static void init_text_effect(Sequence *seq)
void SEQ_effect_text_font_unload(TextVars *data, const bool do_id_user)
{
- if (data) {
- /* Unlink the VFont */
- if (do_id_user && data->text_font != NULL) {
- id_us_min(&data->text_font->id);
- data->text_font = NULL;
- }
+ if (data == NULL) {
+ return;
+ }
- /* Unload the BLF font. */
- if (data->text_blf_id >= 0) {
- BLF_unload_id(data->text_blf_id);
- }
+ /* Unlink the VFont */
+ if (do_id_user && data->text_font != NULL) {
+ id_us_min(&data->text_font->id);
+ data->text_font = NULL;
+ }
+
+ /* Unload the BLF font. */
+ if (data->text_blf_id >= 0) {
+ BLF_unload_id(data->text_blf_id);
}
}
void SEQ_effect_text_font_load(TextVars *data, const bool do_id_user)
{
- if (data->text_font != NULL) {
- if (do_id_user) {
- id_us_plus(&data->text_font->id);
- }
+ VFont *vfont = data->text_font;
+ if (vfont == NULL) {
+ return;
+ }
+
+ if (do_id_user) {
+ id_us_plus(&vfont->id);
+ }
+ if (vfont->packedfile != NULL) {
+ PackedFile *pf = vfont->packedfile;
+ /* Create a name that's unique between library data-blocks to avoid loading
+ * a font per strip which will load fonts many times. */
+ char name[MAX_ID_FULL_NAME];
+ BKE_id_full_name_get(name, &vfont->id, 0);
+
+ data->text_blf_id = BLF_load_mem(name, pf->data, pf->size);
+ }
+ else {
char path[FILE_MAX];
- STRNCPY(path, data->text_font->filepath);
+ STRNCPY(path, vfont->filepath);
BLI_assert(BLI_thread_is_main());
- BLI_path_abs(path, ID_BLEND_PATH_FROM_GLOBAL(&data->text_font->id));
+ BLI_path_abs(path, ID_BLEND_PATH_FROM_GLOBAL(&vfont->id));
data->text_blf_id = BLF_load(path);
}
@@ -3850,9 +3867,7 @@ static ImBuf *do_text_effect(const SeqRenderData *context,
if (data->text_blf_id == SEQ_FONT_NOT_LOADED) {
data->text_blf_id = -1;
- if (data->text_font) {
- data->text_blf_id = BLF_load(data->text_font->filepath);
- }
+ SEQ_effect_text_font_load(data, false);
}
if (data->text_blf_id >= 0) {
diff --git a/source/blender/sequencer/intern/iterator.c b/source/blender/sequencer/intern/iterator.c
index 333a8e46c44..a9cbf4879f1 100644
--- a/source/blender/sequencer/intern/iterator.c
+++ b/source/blender/sequencer/intern/iterator.c
@@ -90,6 +90,36 @@ Sequence *SEQ_iterator_yield(SeqIterator *iterator)
return seq;
}
+static bool seq_for_each_recursive(ListBase *seqbase, SeqForEachFunc callback, void *user_data)
+{
+ LISTBASE_FOREACH (Sequence *, seq, seqbase) {
+ if (!callback(seq, user_data)) {
+ /* Callback signaled stop, return. */
+ return false;
+ }
+ if (seq->type == SEQ_TYPE_META) {
+ if (!seq_for_each_recursive(&seq->seqbase, callback, user_data)) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+/**
+ * Utility function to recursively iterate through all sequence strips in a `seqbase` list.
+ * Uses callback to do operations on each sequence element.
+ * The callback can stop the iteration if needed.
+ *
+ * \param seqbase: #ListBase of sequences to be iterated over.
+ * \param callback: query function callback, returns false if iteration should stop.
+ * \param user_data: pointer to user data that can be used in the callback function.
+ */
+void SEQ_for_each_callback(ListBase *seqbase, SeqForEachFunc callback, void *user_data)
+{
+ seq_for_each_recursive(seqbase, callback, user_data);
+}
+
/**
* Free strip collection.
*
@@ -222,19 +252,15 @@ void SEQ_collection_expand(ListBase *seqbase,
SeqCollection *collection))
{
/* Collect expanded results for each sequence in provided SeqIteratorCollection. */
- ListBase expand_collections = {0};
+ SeqCollection *query_matches = SEQ_collection_create(__func__);
Sequence *seq;
SEQ_ITERATOR_FOREACH (seq, collection) {
- SeqCollection *expand_collection = SEQ_query_by_reference(seq, seqbase, seq_query_func);
- BLI_addtail(&expand_collections, expand_collection);
+ SEQ_collection_merge(query_matches, SEQ_query_by_reference(seq, seqbase, seq_query_func));
}
/* Merge all expanded results in provided SeqIteratorCollection. */
- LISTBASE_FOREACH_MUTABLE (SeqCollection *, expand_collection, &expand_collections) {
- BLI_remlink(&expand_collections, expand_collection);
- SEQ_collection_merge(collection, expand_collection);
- }
+ SEQ_collection_merge(collection, query_matches);
}
/**
@@ -255,6 +281,16 @@ SeqCollection *SEQ_collection_duplicate(SeqCollection *collection)
/** \} */
+static void query_all_strips_recursive(ListBase *seqbase, SeqCollection *collection)
+{
+ LISTBASE_FOREACH (Sequence *, seq, seqbase) {
+ if (seq->type == SEQ_TYPE_META) {
+ query_all_strips_recursive(&seq->seqbase, collection);
+ }
+ SEQ_collection_append_strip(seq, collection);
+ }
+}
+
/**
* Query all strips in seqbase and nested meta strips.
*
@@ -266,7 +302,7 @@ SeqCollection *SEQ_query_all_strips_recursive(ListBase *seqbase)
SeqCollection *collection = SEQ_collection_create(__func__);
LISTBASE_FOREACH (Sequence *, seq, seqbase) {
if (seq->type == SEQ_TYPE_META) {
- SEQ_collection_merge(collection, SEQ_query_all_strips_recursive(&seq->seqbase));
+ query_all_strips_recursive(&seq->seqbase, collection);
}
SEQ_collection_append_strip(seq, collection);
}
@@ -282,9 +318,7 @@ SeqCollection *SEQ_query_all_strips_recursive(ListBase *seqbase)
SeqCollection *SEQ_query_all_strips(ListBase *seqbase)
{
SeqCollection *collection = SEQ_collection_create(__func__);
- LISTBASE_FOREACH (Sequence *, seq, seqbase) {
- SEQ_collection_append_strip(seq, collection);
- }
+ query_all_strips_recursive(seqbase, collection);
return collection;
}
diff --git a/source/blender/sequencer/intern/proxy.c b/source/blender/sequencer/intern/proxy.c
index bd7ea5b958c..2bc294c91cd 100644
--- a/source/blender/sequencer/intern/proxy.c
+++ b/source/blender/sequencer/intern/proxy.c
@@ -576,7 +576,7 @@ void SEQ_proxy_rebuild_finish(SeqIndexBuildContext *context, bool stop)
IMB_anim_index_rebuild_finish(context->index_context, stop);
}
- seq_free_sequence_recurse(NULL, context->seq, true);
+ seq_free_sequence_recurse(NULL, context->seq, true, true);
MEM_freeN(context);
}
diff --git a/source/blender/sequencer/intern/sequencer.c b/source/blender/sequencer/intern/sequencer.c
index 7dc19cf39a6..2863af8fb2e 100644
--- a/source/blender/sequencer/intern/sequencer.c
+++ b/source/blender/sequencer/intern/sequencer.c
@@ -24,11 +24,14 @@
* \ingroup bke
*/
+#define DNA_DEPRECATED_ALLOW
+
#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
+#include "DNA_sound_types.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
@@ -44,14 +47,19 @@
#include "IMB_colormanagement.h"
#include "IMB_imbuf.h"
+#include "SEQ_edit.h"
#include "SEQ_effects.h"
#include "SEQ_iterator.h"
#include "SEQ_modifier.h"
+#include "SEQ_proxy.h"
#include "SEQ_relations.h"
#include "SEQ_select.h"
#include "SEQ_sequencer.h"
+#include "SEQ_sound.h"
#include "SEQ_utils.h"
+#include "BLO_read_write.h"
+
#include "image_cache.h"
#include "prefetch.h"
#include "sequencer.h"
@@ -217,16 +225,19 @@ void SEQ_sequence_free(Scene *scene, Sequence *seq, const bool do_clean_animdata
/* cache must be freed before calling this function
* since it leaves the seqbase in an invalid state */
-void seq_free_sequence_recurse(Scene *scene, Sequence *seq, const bool do_id_user)
+void seq_free_sequence_recurse(Scene *scene,
+ Sequence *seq,
+ const bool do_id_user,
+ const bool do_clean_animdata)
{
Sequence *iseq, *iseq_next;
for (iseq = seq->seqbase.first; iseq; iseq = iseq_next) {
iseq_next = iseq->next;
- seq_free_sequence_recurse(scene, iseq, do_id_user);
+ seq_free_sequence_recurse(scene, iseq, do_id_user, do_clean_animdata);
}
- seq_sequence_free_ex(scene, seq, false, do_id_user, true);
+ seq_sequence_free_ex(scene, seq, false, do_id_user, do_clean_animdata);
}
Editing *SEQ_editing_get(Scene *scene, bool alloc)
@@ -255,7 +266,6 @@ Editing *SEQ_editing_ensure(Scene *scene)
void SEQ_editing_free(Scene *scene, const bool do_id_user)
{
Editing *ed = scene->ed;
- Sequence *seq;
if (ed == NULL) {
return;
@@ -264,11 +274,10 @@ void SEQ_editing_free(Scene *scene, const bool do_id_user)
seq_prefetch_free(scene);
seq_cache_destruct(scene);
- SEQ_ALL_BEGIN (ed, seq) {
- /* handle cache freeing above */
- seq_sequence_free_ex(scene, seq, false, do_id_user, false);
+ /* handle cache freeing above */
+ LISTBASE_FOREACH_MUTABLE (Sequence *, seq, &ed->seqbase) {
+ seq_free_sequence_recurse(scene, seq, do_id_user, false);
}
- SEQ_ALL_END;
BLI_freelistN(&ed->metastack);
SEQ_sequence_lookup_free(scene);
@@ -732,3 +741,315 @@ SequencerToolSettings *SEQ_tool_settings_copy(SequencerToolSettings *tool_settin
}
/** \} */
+
+static bool seq_set_strip_done_cb(Sequence *seq, void *UNUSED(userdata))
+{
+ if (seq->strip) {
+ seq->strip->done = false;
+ }
+ return true;
+}
+
+static bool seq_write_data_cb(Sequence *seq, void *userdata)
+{
+ BlendWriter *writer = (BlendWriter *)userdata;
+ BLO_write_struct(writer, Sequence, seq);
+ if (seq->strip && seq->strip->done == 0) {
+ /* Write strip with 'done' at 0 because read-file. */
+
+ /* TODO this doesn't depend on the `Strip` data to be present? */
+ if (seq->effectdata) {
+ switch (seq->type) {
+ case SEQ_TYPE_COLOR:
+ BLO_write_struct(writer, SolidColorVars, seq->effectdata);
+ break;
+ case SEQ_TYPE_SPEED:
+ BLO_write_struct(writer, SpeedControlVars, seq->effectdata);
+ break;
+ case SEQ_TYPE_WIPE:
+ BLO_write_struct(writer, WipeVars, seq->effectdata);
+ break;
+ case SEQ_TYPE_GLOW:
+ BLO_write_struct(writer, GlowVars, seq->effectdata);
+ break;
+ case SEQ_TYPE_TRANSFORM:
+ BLO_write_struct(writer, TransformVars, seq->effectdata);
+ break;
+ case SEQ_TYPE_GAUSSIAN_BLUR:
+ BLO_write_struct(writer, GaussianBlurVars, seq->effectdata);
+ break;
+ case SEQ_TYPE_TEXT:
+ BLO_write_struct(writer, TextVars, seq->effectdata);
+ break;
+ case SEQ_TYPE_COLORMIX:
+ BLO_write_struct(writer, ColorMixVars, seq->effectdata);
+ break;
+ }
+ }
+
+ BLO_write_struct(writer, Stereo3dFormat, seq->stereo3d_format);
+
+ Strip *strip = seq->strip;
+ BLO_write_struct(writer, Strip, strip);
+ if (strip->crop) {
+ BLO_write_struct(writer, StripCrop, strip->crop);
+ }
+ if (strip->transform) {
+ BLO_write_struct(writer, StripTransform, strip->transform);
+ }
+ if (strip->proxy) {
+ BLO_write_struct(writer, StripProxy, strip->proxy);
+ }
+ if (seq->type == SEQ_TYPE_IMAGE) {
+ BLO_write_struct_array(writer,
+ StripElem,
+ MEM_allocN_len(strip->stripdata) / sizeof(struct StripElem),
+ strip->stripdata);
+ }
+ else if (ELEM(seq->type, SEQ_TYPE_MOVIE, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) {
+ BLO_write_struct(writer, StripElem, strip->stripdata);
+ }
+
+ strip->done = true;
+ }
+
+ if (seq->prop) {
+ IDP_BlendWrite(writer, seq->prop);
+ }
+
+ SEQ_modifier_blend_write(writer, &seq->modifiers);
+ return true;
+}
+
+void SEQ_blend_write(BlendWriter *writer, ListBase *seqbase)
+{
+ /* reset write flags */
+ SEQ_for_each_callback(seqbase, seq_set_strip_done_cb, NULL);
+
+ SEQ_for_each_callback(seqbase, seq_write_data_cb, writer);
+}
+
+static bool seq_read_data_cb(Sequence *seq, void *user_data)
+{
+ BlendDataReader *reader = (BlendDataReader *)user_data;
+
+ /* Do as early as possible, so that other parts of reading can rely on valid session UUID. */
+ SEQ_relations_session_uuid_generate(seq);
+
+ BLO_read_data_address(reader, &seq->seq1);
+ BLO_read_data_address(reader, &seq->seq2);
+ BLO_read_data_address(reader, &seq->seq3);
+
+ /* a patch: after introduction of effects with 3 input strips */
+ if (seq->seq3 == NULL) {
+ seq->seq3 = seq->seq2;
+ }
+
+ BLO_read_data_address(reader, &seq->effectdata);
+ BLO_read_data_address(reader, &seq->stereo3d_format);
+
+ if (seq->type & SEQ_TYPE_EFFECT) {
+ seq->flag |= SEQ_EFFECT_NOT_LOADED;
+ }
+
+ if (seq->type == SEQ_TYPE_TEXT) {
+ TextVars *t = seq->effectdata;
+ t->text_blf_id = SEQ_FONT_NOT_LOADED;
+ }
+
+ BLO_read_data_address(reader, &seq->prop);
+ IDP_BlendDataRead(reader, &seq->prop);
+
+ BLO_read_data_address(reader, &seq->strip);
+ if (seq->strip && seq->strip->done == 0) {
+ seq->strip->done = true;
+
+ if (ELEM(seq->type, SEQ_TYPE_IMAGE, SEQ_TYPE_MOVIE, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) {
+ BLO_read_data_address(reader, &seq->strip->stripdata);
+ }
+ else {
+ seq->strip->stripdata = NULL;
+ }
+ BLO_read_data_address(reader, &seq->strip->crop);
+ BLO_read_data_address(reader, &seq->strip->transform);
+ BLO_read_data_address(reader, &seq->strip->proxy);
+ if (seq->strip->proxy) {
+ seq->strip->proxy->anim = NULL;
+ }
+ else if (seq->flag & SEQ_USE_PROXY) {
+ SEQ_proxy_set(seq, true);
+ }
+
+ /* need to load color balance to it could be converted to modifier */
+ BLO_read_data_address(reader, &seq->strip->color_balance);
+ }
+
+ SEQ_modifier_blend_read_data(reader, &seq->modifiers);
+ return true;
+}
+void SEQ_blend_read(BlendDataReader *reader, ListBase *seqbase)
+{
+ SEQ_for_each_callback(seqbase, seq_read_data_cb, reader);
+}
+
+typedef struct Read_lib_data {
+ BlendLibReader *reader;
+ Scene *scene;
+} Read_lib_data;
+
+static bool seq_read_lib_cb(Sequence *seq, void *user_data)
+{
+ Read_lib_data *data = (Read_lib_data *)user_data;
+ BlendLibReader *reader = data->reader;
+ Scene *sce = data->scene;
+
+ IDP_BlendReadLib(reader, seq->prop);
+
+ if (seq->ipo) {
+ /* XXX: deprecated - old animation system. */
+ BLO_read_id_address(reader, sce->id.lib, &seq->ipo);
+ }
+ seq->scene_sound = NULL;
+ if (seq->scene) {
+ BLO_read_id_address(reader, sce->id.lib, &seq->scene);
+ seq->scene_sound = NULL;
+ }
+ if (seq->clip) {
+ BLO_read_id_address(reader, sce->id.lib, &seq->clip);
+ }
+ if (seq->mask) {
+ BLO_read_id_address(reader, sce->id.lib, &seq->mask);
+ }
+ if (seq->scene_camera) {
+ BLO_read_id_address(reader, sce->id.lib, &seq->scene_camera);
+ }
+ if (seq->sound) {
+ seq->scene_sound = NULL;
+ if (seq->type == SEQ_TYPE_SOUND_HD) {
+ seq->type = SEQ_TYPE_SOUND_RAM;
+ }
+ else {
+ BLO_read_id_address(reader, sce->id.lib, &seq->sound);
+ }
+ if (seq->sound) {
+ id_us_plus_no_lib((ID *)seq->sound);
+ seq->scene_sound = NULL;
+ }
+ }
+ if (seq->type == SEQ_TYPE_TEXT) {
+ TextVars *t = seq->effectdata;
+ BLO_read_id_address(reader, sce->id.lib, &t->text_font);
+ }
+ BLI_listbase_clear(&seq->anims);
+
+ SEQ_modifier_blend_read_lib(reader, sce, &seq->modifiers);
+ return true;
+}
+
+void SEQ_blend_read_lib(BlendLibReader *reader, Scene *scene, ListBase *seqbase)
+{
+ Read_lib_data data = {reader, scene};
+ SEQ_for_each_callback(seqbase, seq_read_lib_cb, &data);
+}
+
+static bool seq_blend_read_expand(Sequence *seq, void *user_data)
+{
+ BlendExpander *expander = (BlendExpander *)user_data;
+
+ IDP_BlendReadExpand(expander, seq->prop);
+
+ if (seq->scene) {
+ BLO_expand(expander, seq->scene);
+ }
+ if (seq->scene_camera) {
+ BLO_expand(expander, seq->scene_camera);
+ }
+ if (seq->clip) {
+ BLO_expand(expander, seq->clip);
+ }
+ if (seq->mask) {
+ BLO_expand(expander, seq->mask);
+ }
+ if (seq->sound) {
+ BLO_expand(expander, seq->sound);
+ }
+
+ if (seq->type == SEQ_TYPE_TEXT && seq->effectdata) {
+ TextVars *data = seq->effectdata;
+ BLO_expand(expander, data->text_font);
+ }
+ return true;
+}
+
+void SEQ_blend_read_expand(BlendExpander *expander, ListBase *seqbase)
+{
+ SEQ_for_each_callback(seqbase, seq_blend_read_expand, expander);
+}
+
+/* Depsgraph update functions. */
+
+static bool seq_disable_sound_strips_cb(Sequence *seq, void *user_data)
+{
+ Scene *scene = (Scene *)user_data;
+ if (seq->scene_sound != NULL) {
+ BKE_sound_remove_scene_sound(scene, seq->scene_sound);
+ seq->scene_sound = NULL;
+ }
+ return true;
+}
+
+static bool seq_update_seq_cb(Sequence *seq, void *user_data)
+{
+ Scene *scene = (Scene *)user_data;
+ if (seq->scene_sound == NULL) {
+ if (seq->sound != NULL) {
+ seq->scene_sound = BKE_sound_add_scene_sound_defaults(scene, seq);
+ }
+ else if (seq->type == SEQ_TYPE_SCENE) {
+ if (seq->scene != NULL) {
+ BKE_sound_ensure_scene(seq->scene);
+ seq->scene_sound = BKE_sound_scene_add_scene_sound_defaults(scene, seq);
+ }
+ }
+ }
+ if (seq->scene_sound != NULL) {
+ /* Make sure changing volume via sequence's properties panel works correct.
+ *
+ * Ideally, the entire BKE_scene_update_sound() will happen from a dependency graph, so
+ * then it is no longer needed to do such manual forced updates. */
+ if (seq->type == SEQ_TYPE_SCENE && seq->scene != NULL) {
+ BKE_sound_set_scene_volume(seq->scene, seq->scene->audio.volume);
+ if ((seq->flag & SEQ_SCENE_STRIPS) == 0 && seq->scene->sound_scene != NULL &&
+ seq->scene->ed != NULL) {
+ SEQ_for_each_callback(&seq->scene->ed->seqbase, seq_disable_sound_strips_cb, seq->scene);
+ }
+ }
+ if (seq->sound != NULL) {
+ if (scene->id.recalc & ID_RECALC_AUDIO || seq->sound->id.recalc & ID_RECALC_AUDIO) {
+ BKE_sound_update_scene_sound(seq->scene_sound, seq->sound);
+ }
+ }
+ BKE_sound_set_scene_sound_volume(
+ seq->scene_sound, seq->volume, (seq->flag & SEQ_AUDIO_VOLUME_ANIMATED) != 0);
+ BKE_sound_set_scene_sound_pitch(
+ seq->scene_sound, seq->pitch, (seq->flag & SEQ_AUDIO_PITCH_ANIMATED) != 0);
+ BKE_sound_set_scene_sound_pan(
+ seq->scene_sound, seq->pan, (seq->flag & SEQ_AUDIO_PAN_ANIMATED) != 0);
+ }
+ return true;
+}
+
+/* Evaluate parts of sequences which needs to be done as a part of a dependency graph evaluation.
+ * This does NOT include actual rendering of the strips, but rather makes them up-to-date for
+ * animation playback and makes them ready for the sequencer's rendering pipeline to render them.
+ */
+void SEQ_eval_sequences(Depsgraph *depsgraph, Scene *scene, ListBase *seqbase)
+{
+ DEG_debug_print_eval(depsgraph, __func__, scene->id.name, scene);
+ BKE_sound_ensure_scene(scene);
+
+ SEQ_for_each_callback(seqbase, seq_update_seq_cb, scene);
+
+ SEQ_edit_update_muting(scene->ed);
+ SEQ_sound_update_bounds_all(scene);
+}
diff --git a/source/blender/sequencer/intern/sequencer.h b/source/blender/sequencer/intern/sequencer.h
index 928b3edd728..e43535d14ee 100644
--- a/source/blender/sequencer/intern/sequencer.h
+++ b/source/blender/sequencer/intern/sequencer.h
@@ -30,7 +30,10 @@ extern "C" {
struct Scene;
struct Sequence;
-void seq_free_sequence_recurse(struct Scene *scene, struct Sequence *seq, const bool do_id_user);
+void seq_free_sequence_recurse(struct Scene *scene,
+ struct Sequence *seq,
+ const bool do_id_user,
+ const bool do_clean_animdata);
#ifdef __cplusplus
}
diff --git a/source/blender/sequencer/intern/strip_relations.c b/source/blender/sequencer/intern/strip_relations.c
index ec70a683da5..b840b19f244 100644
--- a/source/blender/sequencer/intern/strip_relations.c
+++ b/source/blender/sequencer/intern/strip_relations.c
@@ -476,6 +476,24 @@ void SEQ_relations_session_uuid_generate(struct Sequence *sequence)
sequence->runtime.session_uuid = BLI_session_uuid_generate();
}
+static bool get_uuids_cb(Sequence *seq, void *user_data)
+{
+ struct GSet *used_uuids = (struct GSet *)user_data;
+ const SessionUUID *session_uuid = &seq->runtime.session_uuid;
+ if (!BLI_session_uuid_is_generated(session_uuid)) {
+ printf("Sequence %s does not have UUID generated.\n", seq->name);
+ return true;
+ }
+
+ if (BLI_gset_lookup(used_uuids, session_uuid) != NULL) {
+ printf("Sequence %s has duplicate UUID generated.\n", seq->name);
+ return true;
+ }
+
+ BLI_gset_insert(used_uuids, (void *)session_uuid);
+ return true;
+}
+
void SEQ_relations_check_uuids_unique_and_report(const Scene *scene)
{
if (scene->ed == NULL) {
@@ -485,22 +503,7 @@ void SEQ_relations_check_uuids_unique_and_report(const Scene *scene)
struct GSet *used_uuids = BLI_gset_new(
BLI_session_uuid_ghash_hash, BLI_session_uuid_ghash_compare, "sequencer used uuids");
- const Sequence *sequence;
- SEQ_ALL_BEGIN (scene->ed, sequence) {
- const SessionUUID *session_uuid = &sequence->runtime.session_uuid;
- if (!BLI_session_uuid_is_generated(session_uuid)) {
- printf("Sequence %s does not have UUID generated.\n", sequence->name);
- continue;
- }
-
- if (BLI_gset_lookup(used_uuids, session_uuid) != NULL) {
- printf("Sequence %s has duplicate UUID generated.\n", sequence->name);
- continue;
- }
-
- BLI_gset_insert(used_uuids, (void *)session_uuid);
- }
- SEQ_ALL_END;
+ SEQ_for_each_callback(&scene->ed->seqbase, get_uuids_cb, used_uuids);
BLI_gset_free(used_uuids, NULL);
}
diff --git a/source/blender/sequencer/intern/utils.c b/source/blender/sequencer/intern/utils.c
index f946affe1d8..e4eecaf552c 100644
--- a/source/blender/sequencer/intern/utils.c
+++ b/source/blender/sequencer/intern/utils.c
@@ -133,12 +133,12 @@ static void seqbase_unique_name(ListBase *seqbasep, SeqUniqueInfo *sui)
}
}
-static int seqbase_unique_name_recursive_fn(Sequence *seq, void *arg_pt)
+static bool seqbase_unique_name_recursive_fn(Sequence *seq, void *arg_pt)
{
if (seq->seqbase.first) {
seqbase_unique_name(&seq->seqbase, (SeqUniqueInfo *)arg_pt);
}
- return 1;
+ return true;
}
void SEQ_sequence_base_unique_name_recursive(struct Scene *scene,
@@ -167,7 +167,7 @@ void SEQ_sequence_base_unique_name_recursive(struct Scene *scene,
while (sui.match) {
sui.match = 0;
seqbase_unique_name(seqbasep, &sui);
- SEQ_seqbase_recursive_apply(seqbasep, seqbase_unique_name_recursive_fn, &sui);
+ SEQ_for_each_callback(seqbasep, seqbase_unique_name_recursive_fn, &sui);
}
SEQ_edit_sequence_name_set(scene, seq, sui.name_dest);
@@ -573,34 +573,6 @@ void SEQ_set_scale_to_fit(const Sequence *seq,
}
}
-int SEQ_seqbase_recursive_apply(ListBase *seqbase,
- int (*apply_fn)(Sequence *seq, void *),
- void *arg)
-{
- Sequence *iseq;
- for (iseq = seqbase->first; iseq; iseq = iseq->next) {
- if (SEQ_recursive_apply(iseq, apply_fn, arg) == -1) {
- return -1; /* bail out */
- }
- }
- return 1;
-}
-
-int SEQ_recursive_apply(Sequence *seq, int (*apply_fn)(Sequence *, void *), void *arg)
-{
- int ret = apply_fn(seq, arg);
-
- if (ret == -1) {
- return -1; /* bail out */
- }
-
- if (ret && seq->seqbase.first) {
- ret = SEQ_seqbase_recursive_apply(&seq->seqbase, apply_fn, arg);
- }
-
- return ret;
-}
-
/**
* Ensure, that provided Sequence has unique name. If animation data exists for this Sequence, it
* will be duplicated and mapped onto new name
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 3027df41e77..ca1610a8101 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -111,12 +111,11 @@ void WM_reinit_gizmomap_all(struct Main *bmain);
void WM_script_tag_reload(void);
-bool WM_window_find_under_cursor(const wmWindowManager *wm,
- const wmWindow *win_ignore,
- const wmWindow *win,
- const int mval[2],
- wmWindow **r_win,
- int r_mval[2]);
+wmWindow *WM_window_find_under_cursor(const wmWindowManager *wm,
+ const wmWindow *win_ignore,
+ const wmWindow *win,
+ const int mval[2],
+ int r_mval[2]);
void WM_window_pixel_sample_read(const wmWindowManager *wm,
const wmWindow *win,
const int pos[2],
@@ -263,9 +262,8 @@ struct wmEventHandler_Keymap *WM_event_add_keymap_handler_priority(ListBase *han
wmKeyMap *keymap,
int priority);
-typedef struct wmKeyMap *(wmEventHandler_KeymapDynamicFn)(wmWindowManager *wm,
- struct wmEventHandler_Keymap *handler)
- ATTR_WARN_UNUSED_RESULT;
+typedef struct wmKeyMap *(wmEventHandler_KeymapDynamicFn)(
+ wmWindowManager *wm, struct wmEventHandler_Keymap *handler)ATTR_WARN_UNUSED_RESULT;
struct wmKeyMap *WM_event_get_keymap_from_toolsystem_fallback(
struct wmWindowManager *wm, struct wmEventHandler_Keymap *handler);
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 843ceca7700..8a1ff67b37c 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -111,11 +111,11 @@
struct ID;
struct ImBuf;
struct bContext;
+struct wmDrag;
+struct wmDropBox;
struct wmEvent;
struct wmOperator;
struct wmWindowManager;
-struct wmDrag;
-struct wmDropBox;
#include "BLI_compiler_attrs.h"
#include "DNA_listBase.h"
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index b9a3dd0c3fb..1f47b152a2b 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -4357,8 +4357,8 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi
}
}
- wmWindow *win_other;
- if (WM_window_find_under_cursor(wm, win, win, mval, &win_other, mval)) {
+ wmWindow *win_other = WM_window_find_under_cursor(wm, win, win, mval, mval);
+ if (win_other) {
event->x = mval[0];
event->y = mval[1];
return win_other;
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 93417213a65..e9d0adf6798 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -1922,12 +1922,11 @@ static void wm_window_screen_pos_get(const wmWindow *win,
r_scr_pos[1] = desktop_pos[1] - (int)(U.pixelsize * win->posy);
}
-bool WM_window_find_under_cursor(const wmWindowManager *wm,
- const wmWindow *win_ignore,
- const wmWindow *win,
- const int mval[2],
- wmWindow **r_win,
- int r_mval[2])
+wmWindow *WM_window_find_under_cursor(const wmWindowManager *wm,
+ const wmWindow *win_ignore,
+ const wmWindow *win,
+ const int mval[2],
+ int r_mval[2])
{
int desk_pos[2];
wm_window_desktop_pos_get(win, mval, desk_pos);
@@ -1949,13 +1948,12 @@ bool WM_window_find_under_cursor(const wmWindowManager *wm,
if (scr_pos[0] >= 0 && win_iter->posy >= 0 && scr_pos[0] <= WM_window_pixels_x(win_iter) &&
scr_pos[1] <= WM_window_pixels_y(win_iter)) {
- *r_win = win_iter;
copy_v2_v2_int(r_mval, scr_pos);
- return true;
+ return win_iter;
}
}
- return false;
+ return NULL;
}
void WM_window_pixel_sample_read(const wmWindowManager *wm,
diff --git a/source/blender/windowmanager/xr/intern/wm_xr.c b/source/blender/windowmanager/xr/intern/wm_xr.c
index 3091a3a19f1..4877addbb77 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr.c
@@ -115,7 +115,6 @@ bool wm_xr_init(wmWindowManager *wm)
void wm_xr_exit(wmWindowManager *wm)
{
if (wm->xr.runtime != NULL) {
- WM_xr_actionmaps_clear(wm->xr.runtime);
wm_xr_runtime_data_free(&wm->xr.runtime);
}
if (wm->xr.session_settings.shading.prop) {
@@ -166,6 +165,10 @@ void wm_xr_runtime_data_free(wmXrRuntimeData **runtime)
/* Prevent recursive GHOST_XrContextDestroy() call by NULL'ing the context pointer before the
* first call, see comment above. */
(*runtime)->context = NULL;
+
+ wm_xr_session_data_free(&(*runtime)->session_state);
+ WM_xr_actionmaps_clear(*runtime);
+
GHOST_XrContextDestroy(context);
}
MEM_SAFE_FREE(*runtime);
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_actionmap.c b/source/blender/windowmanager/xr/intern/wm_xr_actionmap.c
index f9ad34b5a9b..673fdfcd602 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_actionmap.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_actionmap.c
@@ -178,6 +178,12 @@ XrActionMapBinding *WM_xr_actionmap_binding_find(XrActionMapItem *ami, const cha
* Item in an XR action map, that maps an XR event to an operator, pose, or haptic output.
* \{ */
+static void wm_xr_actionmap_item_bindings_clear(XrActionMapItem *ami)
+{
+ BLI_freelistN(&ami->bindings);
+ ami->selbinding = -1;
+}
+
static void wm_xr_actionmap_item_properties_set(XrActionMapItem *ami)
{
WM_operator_properties_alloc(&(ami->op_properties_ptr), &(ami->op_properties), ami->op);
@@ -345,10 +351,8 @@ bool WM_xr_actionmap_item_remove(XrActionMap *actionmap, XrActionMapItem *ami)
int idx = BLI_findindex(&actionmap->items, ami);
if (idx != -1) {
- if (ami->op_properties_ptr) {
- WM_operator_properties_free(ami->op_properties_ptr);
- MEM_freeN(ami->op_properties_ptr);
- }
+ wm_xr_actionmap_item_bindings_clear(ami);
+ wm_xr_actionmap_item_properties_free(ami);
BLI_freelinkN(&actionmap->items, ami);
if (BLI_listbase_is_empty(&actionmap->items)) {
@@ -518,6 +522,7 @@ XrActionMap *WM_xr_actionmap_find(wmXrRuntimeData *runtime, const char *name)
void WM_xr_actionmap_clear(XrActionMap *actionmap)
{
LISTBASE_FOREACH (XrActionMapItem *, ami, &actionmap->items) {
+ wm_xr_actionmap_item_bindings_clear(ami);
wm_xr_actionmap_item_properties_free(ami);
}
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_intern.h b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
index 4d4df43f796..fc54e261f79 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_intern.h
+++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
@@ -174,6 +174,7 @@ typedef struct wmXrActionSet {
wmXrRuntimeData *wm_xr_runtime_data_create(void);
void wm_xr_runtime_data_free(wmXrRuntimeData **runtime);
+void wm_xr_session_data_free(wmXrSessionState *state);
void wm_xr_session_draw_data_update(const wmXrSessionState *state,
const XrSessionSettings *settings,
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c
index ba30b0dd864..dc15b579e9d 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_session.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c
@@ -68,7 +68,7 @@ static void wm_xr_session_controller_data_free(wmXrSessionState *state)
BLI_freelistN(&state->controllers);
}
-static void wm_xr_session_data_free(wmXrSessionState *state)
+void wm_xr_session_data_free(wmXrSessionState *state)
{
wm_xr_session_controller_data_free(state);
}
@@ -76,6 +76,9 @@ static void wm_xr_session_data_free(wmXrSessionState *state)
static void wm_xr_session_exit_cb(void *customdata)
{
wmXrData *xr_data = customdata;
+ if (!xr_data->runtime) {
+ return;
+ }
xr_data->runtime->session_state.is_started = false;
@@ -84,7 +87,6 @@ static void wm_xr_session_exit_cb(void *customdata)
}
/* Free the entire runtime data (including session state and context), to play safe. */
- wm_xr_session_data_free(&xr_data->runtime->session_state);
wm_xr_runtime_data_free(&xr_data->runtime);
}