[Bf-blender-cvs] [7e6142ac43b] temp-vse-retiming-tool: - Rewrite some code in C++, This needs a bit of tweaking still. - Address inlines
Richard Antalik
noreply at git.blender.org
Mon Nov 14 16:58:18 CET 2022
Commit: 7e6142ac43bfac3aedb305dcee8238f2cbfc11ec
Author: Richard Antalik
Date: Mon Oct 17 20:38:50 2022 +0200
Branches: temp-vse-retiming-tool
https://developer.blender.org/rB7e6142ac43bfac3aedb305dcee8238f2cbfc11ec
- Rewrite some code in C++, This needs a bit of tweaking still. - Address inlines
===================================================================
M release/scripts/startup/bl_ui/space_sequencer.py
M release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M source/blender/editors/space_sequencer/CMakeLists.txt
A source/blender/editors/space_sequencer/sequencer_gizmo_retime.cc
A source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc
M source/blender/editors/space_sequencer/sequencer_intern.h
M source/blender/editors/space_sequencer/sequencer_ops.c
A source/blender/editors/space_sequencer/sequencer_retiming.cc
M source/blender/editors/space_sequencer/space_sequencer.c
M source/blender/makesdna/DNA_sequence_types.h
M source/blender/makesrna/intern/rna_sequencer.c
M source/blender/sequencer/CMakeLists.txt
A source/blender/sequencer/SEQ_retiming.hh
M source/blender/sequencer/SEQ_time.h
M source/blender/sequencer/intern/sequencer.c
A source/blender/sequencer/intern/strip_retiming.cc
M source/blender/sequencer/intern/strip_time.c
M source/blender/sequencer/intern/strip_time.h
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index e703cf7f9c6..3f72454015b 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -1870,11 +1870,17 @@ class SEQUENCER_PT_time(SequencerButtonsPanel, Panel):
split.label(text="Channel")
split.prop(strip, "channel", text="")
+ use_retiming_tool = strip.use_retiming_tool
+
if not is_effect:
- split = layout.split(factor=0.5 + max_factor)
- split.alignment = 'RIGHT'
- split.label(text="Speed Factor")
- split.prop(strip, "speed_factor", text="")
+ if not use_retiming_tool:
+ split = layout.split(factor=0.5 + max_factor)
+ split.alignment = 'RIGHT'
+ split.label(text="Speed Factor")
+ split.prop(strip, "speed_factor", text="")
+ else:
+ layout.operator("sequencer.retiming_reset")
+
sub = layout.column(align=True)
split = sub.split(factor=0.5 + max_factor, align=True)
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index 20021762d5a..a38b6c8451f 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -2558,6 +2558,17 @@ class _defs_sequencer_generic:
options={'KEYMAP_FALLBACK'},
)
+ @ToolDef.from_fn
+ def retime():
+ return dict(
+ idname="builtin.retime",
+ label="Retime",
+ icon="none",
+ widget="SEQUENCER_GGT_gizmo_retime",
+ operator="transform.translate",
+ keymap=None,
+ )
+
@ToolDef.from_fn
def sample():
return dict(
@@ -3248,6 +3259,7 @@ class SEQUENCER_PT_tools_active(ToolSelectPanelHelper, Panel):
'SEQUENCER': [
*_tools_select,
_defs_sequencer_generic.blade,
+ _defs_sequencer_generic.retime,
],
'SEQUENCER_PREVIEW': [
*_tools_select,
diff --git a/source/blender/editors/space_sequencer/CMakeLists.txt b/source/blender/editors/space_sequencer/CMakeLists.txt
index 5466beca255..419265ff299 100644
--- a/source/blender/editors/space_sequencer/CMakeLists.txt
+++ b/source/blender/editors/space_sequencer/CMakeLists.txt
@@ -33,10 +33,13 @@ set(SRC
sequencer_drag_drop.c
sequencer_draw.c
sequencer_edit.c
+ sequencer_gizmo_retime.cc
+ sequencer_gizmo_retime_type.cc
sequencer_modifier.c
sequencer_ops.c
sequencer_preview.c
sequencer_proxy.c
+ sequencer_retiming.cc
sequencer_scopes.c
sequencer_select.c
sequencer_thumbnails.c
diff --git a/source/blender/editors/space_sequencer/sequencer_gizmo_retime.cc b/source/blender/editors/space_sequencer/sequencer_gizmo_retime.cc
new file mode 100644
index 00000000000..ff6d7f04cba
--- /dev/null
+++ b/source/blender/editors/space_sequencer/sequencer_gizmo_retime.cc
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2022 Blender Foundation. All rights reserved. */
+
+/** \file
+ * \ingroup spseq
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+
+#include "BKE_context.h"
+
+#include "BLI_span.hh"
+
+#include "RNA_access.h"
+
+#include "UI_resources.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_gizmo_library.h"
+
+#include "SEQ_iterator.h"
+#include "SEQ_retiming.hh"
+#include "SEQ_sequencer.h"
+
+/* Own include. */
+#include "sequencer_intern.h"
+
+typedef struct GizmoGroup_retime {
+ wmGizmo *add_handle_gizmo;
+ wmGizmo *move_handle_gizmo;
+ wmGizmo *remove_handle_gizmo;
+} GizmoGroup_retime;
+
+static bool gizmogroup_retime_poll(const bContext *C, wmGizmoGroupType *UNUSED(gzgt))
+{
+ if ((U.gizmo_flag & USER_GIZMO_DRAW) == 0) {
+ return false;
+ }
+
+ ScrArea *area = CTX_wm_area(C);
+ if (area == NULL && area->spacetype != SPACE_SEQ) {
+ return false;
+ }
+
+ const SpaceSeq *sseq = (SpaceSeq *)area->spacedata.first;
+ if (sseq->gizmo_flag & (SEQ_GIZMO_HIDE | SEQ_GIZMO_HIDE_TOOL)) {
+ return false;
+ }
+
+ Editing *ed = SEQ_editing_get(CTX_data_scene(C));
+ Sequence *seq = ed->act_seq;
+
+ if (ed == NULL || seq == NULL || !SEQ_retiming_is_allowed(seq)) {
+ return false;
+ }
+
+ return true;
+}
+
+static void gizmogroup_retime_setup(const bContext *UNUSED(C), wmGizmoGroup *gzgroup)
+{
+ GizmoGroup_retime *ggd = (GizmoGroup_retime *)MEM_callocN(sizeof(GizmoGroup_retime), __func__);
+
+ /* Assign gizmos. */
+ const wmGizmoType *gzt_add_handle = WM_gizmotype_find("GIZMO_GT_retime_handle_add", true);
+ ggd->add_handle_gizmo = WM_gizmo_new_ptr(gzt_add_handle, gzgroup, NULL);
+ const wmGizmoType *gzt_remove_handle = WM_gizmotype_find("GIZMO_GT_retime_handle_remove", true);
+ ggd->remove_handle_gizmo = WM_gizmo_new_ptr(gzt_remove_handle, gzgroup, NULL);
+ const wmGizmoType *gzt_move_handle = WM_gizmotype_find("GIZMO_GT_retime_handle_move", true);
+ ggd->move_handle_gizmo = WM_gizmo_new_ptr(gzt_move_handle, gzgroup, NULL);
+
+ /* Assign operators. */
+ wmOperatorType *ot = WM_operatortype_find("SEQUENCER_OT_retiming_handle_move", true);
+ WM_gizmo_operator_set(ggd->move_handle_gizmo, 0, ot, NULL);
+ ot = WM_operatortype_find("SEQUENCER_OT_retiming_handle_add", true);
+ WM_gizmo_operator_set(ggd->add_handle_gizmo, 0, ot, NULL);
+ ot = WM_operatortype_find("SEQUENCER_OT_retiming_handle_remove", true);
+ WM_gizmo_operator_set(ggd->remove_handle_gizmo, 0, ot, NULL);
+}
+
+void SEQUENCER_GGT_gizmo_retime(wmGizmoGroupType *gzgt)
+{
+ gzgt->name = "Sequencer Transform Gizmo Retime";
+ gzgt->idname = "SEQUENCER_GGT_gizmo_retime";
+
+ gzgt->flag = WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL;
+
+ gzgt->gzmap_params.spaceid = SPACE_SEQ;
+ gzgt->gzmap_params.regionid = RGN_TYPE_WINDOW;
+
+ gzgt->poll = gizmogroup_retime_poll;
+ gzgt->setup = gizmogroup_retime_setup;
+}
+
+/** \} */
diff --git a/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc b/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc
new file mode 100644
index 00000000000..8198d19bdb7
--- /dev/null
+++ b/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc
@@ -0,0 +1,681 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2022 Blender Foundation. All rights reserved. */
+
+/** \file
+ * \ingroup spseq
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_span.hh"
+
+#include "DNA_anim_types.h"
+
+#include "BKE_context.h"
+#include "BKE_fcurve.h"
+#include "BKE_scene.h"
+
+#include "BLF_api.h"
+
+#include "GPU_batch.h"
+#include "GPU_batch_utils.h"
+#include "GPU_immediate.h"
+#include "GPU_immediate_util.h"
+#include "GPU_matrix.h"
+#include "GPU_select.h"
+#include "GPU_state.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_gizmo_library.h"
+#include "ED_screen.h"
+#include "ED_view3d.h"
+
+#include "UI_interface.h"
+#include "UI_interface_icons.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "SEQ_iterator.h"
+#include "SEQ_retiming.hh"
+#include "SEQ_sequencer.h"
+#include "SEQ_time.h"
+
+/* Own include. */
+#include "sequencer_intern.h"
+
+#define REMOVE_GIZMO_HEIGHT 12.0f * U.dpi_fac; /* Pixels from bottom of strip. */
+#define RETIME_HANDLE_TRIANGLE_SIZE 10.0f * U.dpi_fac /* Also used for mouseover test. */
+#define RETIME_BUTTON_SIZE 0.6f /* Factor based on icon size. */
+
+static float strip_y_rescale(const Sequence *seq, const float y_value)
+{
+ const float y_range = SEQ_STRIP_OFSTOP - SEQ_STRIP_OFSBOTTOM;
+ return (y_value * y_range) + seq->machine + SEQ_STRIP_OFSBOTTOM;
+}
+
+class RetimingHandle {
+ public:
+ int index;
+ bool is_last_handle;
+
+ RetimingHandle(const Sequence *seq, const SeqRetimingHandle *handle, const int handle_index)
+ {
+ seq_ = seq;
+ handle_ = handle;
+ index = handle_index;
+
+ const int handle_count = SEQ_retiming_handles_count(seq);
+ is_last_handle = (handle_index == handle_count - 1);
+ }
+
+ float x()
+ {
+ return SEQ_time_start_frame_get(seq_) + handle_->strip_frame_index + (is_last_handle ? 1 : 0);
+ }
+
+ float y()
+ {
+ return strip_y_rescale(seq_, handle_->retiming_factor);
+ }
+
+ RetimingHandle next_handle_get()
+ {
+ const int handle_count = SEQ_retiming_handles_count(seq_);
+ BLI_assert(index < handle_count - 1);
+ const SeqRetimingHandle *next = handle_ + 1;
+ return RetimingHandle(seq_, next, index + 1);
+ }
+
+ private:
+ const Sequence *seq_;
+ const SeqRetimingHandle *handle_;
+};
+
+template<typename T> class RetimingHandlesIterator {
+ public:
+ using value_type = SeqRetimingHandle;
+ using pointer = value_type *;
+ using reference = T;
+
+ struct Iterator {
+ Iterator(const Sequence *seq, pointer ptr, int handle_index)
+ {
+ ptr_ = ptr;
+ seq_ = seq;
+ handle_index_ = handle_index;
+ }
+
+ reference operator*() const
+ {
+ return reference(seq_, ptr_, handle_index_);
+ }
+ pointer operator->()
+ {
+ return ptr_;
+ }
+ Iterator &operator++()
+ {
+ ptr_++;
+ handle_index_++;
+ return *this;
+ }
+ Iterator operator++(int)
+ {
+ Iterator tmp = *this;
+ ++(*this);
+ return tmp;
+ }
+ friend bool operator==(const Iterator &a, const Iterator &b)
+ {
+ return a.ptr_ == b.ptr_;
+ };
+ friend bool operator!=(const Iterator &a, const Iterator &b)
+ {
+ return a.ptr_ != b.ptr_;
+ };
+
+ private:
+ pointer ptr_;
+ int handle_index_;
+ const Sequence *seq_;
+ };
+
+ Iterator begin()
+ {
+ return Iterator(seq_, handles_array_, 0);
+ }
+ Iterator end()
+ {
+ const int count = this->count();
+ return Iterator(seq_, handles_array_ + count, count - 1);
+ }
+
+ public:
+ RetimingHandlesIterator(const Sequence *seq)
+ {
+ handles_array_ = seq->retiming_handles;
+ seq_ = seq;
+ }
+
+ referenc
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list