[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