VSE: Remove transform effect

Functionality has been replaced by strip transform properties. Transform
strips in existing files will be replaced with gaussian blur with radius
of 0 to preserve modifiers and overall strip stack.

Pull Request: https://projects.blender.org/blender/blender/pulls/147003
This commit is contained in:
Richard Antalik
2025-10-01 13:37:54 +02:00
committed by Richard Antalik
parent 6691d89f9e
commit 698268f927
15 changed files with 60 additions and 340 deletions

View File

@@ -691,8 +691,7 @@ class SEQUENCER_MT_change(Menu):
if strip and strip.type in {
'CROSS', 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
'GAMMA_CROSS', 'MULTIPLY', 'WIPE', 'GLOW',
'TRANSFORM', 'SPEED', 'MULTICAM', 'ADJUSTMENT',
'GAUSSIAN_BLUR',
'SPEED', 'MULTICAM', 'ADJUSTMENT', 'GAUSSIAN_BLUR',
}:
layout.menu("SEQUENCER_MT_strip_effect_change")
layout.operator("sequencer.swap_inputs")
@@ -850,7 +849,6 @@ class SEQUENCER_MT_add_effect(Menu):
layout.separator()
col = layout.column()
col.operator("sequencer.effect_strip_add", text="Transform").type = 'TRANSFORM'
col.operator("sequencer.effect_strip_add", text="Speed Control").type = 'SPEED'
col.operator("sequencer.effect_strip_add", text="Glow").type = 'GLOW'
col.operator("sequencer.effect_strip_add", text="Gaussian Blur").type = 'GAUSSIAN_BLUR'
@@ -1090,7 +1088,6 @@ class SEQUENCER_MT_strip_effect_change(Menu):
layout.separator()
col = layout.column()
col.operator("sequencer.change_effect_type", text="Transform").type = 'TRANSFORM'
col.operator("sequencer.change_effect_type", text="Speed Control").type = 'SPEED'
col.operator("sequencer.change_effect_type", text="Glow").type = 'GLOW'
col.operator("sequencer.change_effect_type", text="Gaussian Blur").type = 'GAUSSIAN_BLUR'
@@ -1224,8 +1221,7 @@ class SEQUENCER_MT_strip(Menu):
if strip_type in {
'CROSS', 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
'GAMMA_CROSS', 'MULTIPLY', 'WIPE', 'GLOW',
'TRANSFORM', 'SPEED', 'MULTICAM', 'ADJUSTMENT',
'GAUSSIAN_BLUR',
'SPEED', 'MULTICAM', 'ADJUSTMENT', 'GAUSSIAN_BLUR',
}:
layout.separator()
layout.menu("SEQUENCER_MT_strip_effect")
@@ -1408,8 +1404,7 @@ class SEQUENCER_MT_context_menu(Menu):
if strip_type in {
'CROSS', 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
'GAMMA_CROSS', 'MULTIPLY', 'WIPE', 'GLOW',
'TRANSFORM', 'SPEED', 'MULTICAM', 'ADJUSTMENT',
'GAUSSIAN_BLUR',
'SPEED', 'MULTICAM', 'ADJUSTMENT', 'GAUSSIAN_BLUR',
}:
layout.separator()
layout.menu("SEQUENCER_MT_strip_effect")
@@ -1657,8 +1652,7 @@ class SEQUENCER_PT_strip(SequencerButtonsPanel, Panel):
if strip_type in {
'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER', 'MULTIPLY',
'GLOW', 'TRANSFORM', 'SPEED', 'MULTICAM',
'GAUSSIAN_BLUR', 'COLORMIX',
'GLOW', 'SPEED', 'MULTICAM', 'GAUSSIAN_BLUR', 'COLORMIX',
}:
icon_header = 'SHADERFX'
elif strip_type in {
@@ -1749,8 +1743,7 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel):
return strip.type in {
'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
'CROSS', 'GAMMA_CROSS', 'MULTIPLY',
'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'SPEED',
'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'WIPE', 'GLOW', 'COLOR', 'SPEED',
'MULTICAM', 'GAUSSIAN_BLUR', 'TEXT', 'COLORMIX',
}
@@ -1814,30 +1807,6 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel):
row = layout.row(align=True, heading="Interpolation")
row.prop(strip, "use_frame_interpolate", text="")
elif strip_type == 'TRANSFORM':
col = layout.column()
col.prop(strip, "interpolation")
col.prop(strip, "translation_unit")
col = layout.column(align=True)
col.prop(strip, "translate_start_x", text="Position X")
col.prop(strip, "translate_start_y", text="Y")
col.separator()
colsub = col.column(align=True)
colsub.prop(strip, "use_uniform_scale")
if strip.use_uniform_scale:
colsub = col.column(align=True)
colsub.prop(strip, "scale_start_x", text="Scale")
else:
col.prop(strip, "scale_start_x", text="Scale X")
col.prop(strip, "scale_start_y", text="Y")
col.separator()
col.prop(strip, "rotation_start", text="Rotation")
elif strip_type == 'MULTICAM':
col = layout.column(align=True)
strip_channel = strip.channel
@@ -2629,8 +2598,7 @@ class SEQUENCER_PT_adjust_video(SequencerButtonsPanel, Panel):
'MOVIE', 'IMAGE', 'SCENE', 'MOVIECLIP', 'MASK',
'META', 'ADD', 'SUBTRACT', 'ALPHA_OVER',
'ALPHA_UNDER', 'CROSS', 'GAMMA_CROSS', 'MULTIPLY',
'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
'MULTICAM', 'SPEED', 'ADJUSTMENT', 'COLORMIX',
'WIPE', 'GLOW', 'COLOR', 'MULTICAM', 'SPEED', 'ADJUSTMENT', 'COLORMIX',
}
def draw(self, context):
@@ -2666,8 +2634,7 @@ class SEQUENCER_PT_adjust_color(SequencerButtonsPanel, Panel):
'MOVIE', 'IMAGE', 'SCENE', 'MOVIECLIP', 'MASK',
'META', 'ADD', 'SUBTRACT', 'ALPHA_OVER',
'ALPHA_UNDER', 'CROSS', 'GAMMA_CROSS', 'MULTIPLY',
'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
'MULTICAM', 'SPEED', 'ADJUSTMENT', 'COLORMIX',
'WIPE', 'GLOW', 'COLOR', 'MULTICAM', 'SPEED', 'ADJUSTMENT', 'COLORMIX',
}
def draw(self, context):

View File

@@ -67,9 +67,13 @@
#include "BLO_read_write.hh"
#include "SEQ_edit.hh"
#include "SEQ_effects.hh"
#include "SEQ_iterator.hh"
#include "SEQ_modifier.hh"
#include "SEQ_relations.hh"
#include "SEQ_sequencer.hh"
#include "SEQ_utils.hh"
#include "WM_api.hh"
@@ -2461,6 +2465,38 @@ static bool window_has_sequence_editor_open(const wmWindow *win)
return false;
}
/* Merge transform effect properties with strip transform. Because this effect could use modifiers,
* change its type to gaussian blur with 0 radius. */
static void sequencer_substitute_transform_effects(Scene *scene)
{
blender::seq::for_each_callback(&scene->ed->seqbase, [&](Strip *strip) -> bool {
if (strip->type == STRIP_TYPE_TRANSFORM_LEGACY && strip->effectdata != nullptr) {
TransformVarsLegacy *tv = static_cast<TransformVarsLegacy *>(strip->effectdata);
StripTransform *transform = strip->data->transform;
blender::float2 offset(tv->xIni, tv->yIni);
if (tv->percent == 1) {
blender::float2 scene_resolution(scene->r.xsch, scene->r.ysch);
offset *= scene_resolution;
}
transform->xofs += offset.x;
transform->yofs += offset.y;
transform->scale_x *= tv->ScalexIni;
transform->scale_y *= tv->ScaleyIni;
transform->rotation += tv->rotIni;
blender::seq::EffectHandle sh = blender::seq::strip_effect_handle_get(strip);
sh.free(strip, true);
strip->type = STRIP_TYPE_GAUSSIAN_BLUR;
sh = blender::seq::strip_effect_handle_get(strip);
sh.init(strip);
GaussianBlurVars *gv = static_cast<GaussianBlurVars *>(strip->effectdata);
gv->size_x = gv->size_y = 0.0f;
blender::seq::edit_strip_name_set(scene, strip, "Transform Placeholder (Migrated)");
blender::seq::ensure_unique_name(strip, scene);
}
return true;
});
}
void do_versions_after_linking_500(FileData *fd, Main *bmain)
{
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 500, 9)) {
@@ -2563,6 +2599,14 @@ void do_versions_after_linking_500(FileData *fd, Main *bmain)
}
}
if (!MAIN_VERSION_FILE_ATLEAST(bmain, 500, 97)) {
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
if (scene->ed != nullptr) {
sequencer_substitute_transform_effects(scene);
}
}
}
/**
* Always bump subversion in BKE_blender_version.h when adding versioning
* code here, and wrap it inside a MAIN_VERSION_FILE_ATLEAST check.

View File

@@ -2847,7 +2847,6 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
case STRIP_TYPE_ALPHAUNDER:
case STRIP_TYPE_COLORMIX:
case STRIP_TYPE_MULTICAM:
case STRIP_TYPE_TRANSFORM:
case STRIP_TYPE_SPEED:
case STRIP_TYPE_GLOW:
case STRIP_TYPE_GAUSSIAN_BLUR:

View File

@@ -2047,8 +2047,6 @@ static std::string sequencer_add_effect_strip_get_description(bContext * /*C*/,
return TIP_("Add a wipe transition strip for two selected strips with video content");
case STRIP_TYPE_GLOW:
return TIP_("Add a glow effect strip for a single selected strip with video content");
case STRIP_TYPE_TRANSFORM:
return TIP_("Add a transform effect strip for a single selected strip with video content");
case STRIP_TYPE_COLOR:
return TIP_("Add a color strip to the sequencer");
case STRIP_TYPE_SPEED:

View File

@@ -2998,7 +2998,6 @@ const EnumPropertyItem sequencer_prop_effect_types[] = {
{STRIP_TYPE_MUL, "MULTIPLY", 0, "Multiply", "Multiply color channels from two videos"},
{STRIP_TYPE_WIPE, "WIPE", 0, "Wipe", "Sweep a transition line across the frame"},
{STRIP_TYPE_GLOW, "GLOW", 0, "Glow", "Add blur and brightness to light areas"},
{STRIP_TYPE_TRANSFORM, "TRANSFORM", 0, "Transform", "Apply scale, rotation, or translation"},
{STRIP_TYPE_COLOR, "COLOR", 0, "Color", "Add a simple color strip"},
{STRIP_TYPE_SPEED, "SPEED", 0, "Speed", "Timewarp video strips, modifying playback speed"},
{STRIP_TYPE_MULTICAM, "MULTICAM", 0, "Multicam Selector", "Control active camera angles"},

View File

@@ -365,7 +365,6 @@ static void color3ubv_from_seq(const Scene *curscene,
break;
/* Effects. */
case STRIP_TYPE_TRANSFORM:
case STRIP_TYPE_SPEED:
case STRIP_TYPE_ADD:
case STRIP_TYPE_SUB:
@@ -410,9 +409,6 @@ static void color3ubv_from_seq(const Scene *curscene,
else if (strip->type == STRIP_TYPE_SPEED) {
rgb_byte_set_hue_float_offset(r_col, 0.72);
}
else if (strip->type == STRIP_TYPE_TRANSFORM) {
rgb_byte_set_hue_float_offset(r_col, 0.75);
}
else if (strip->type == STRIP_TYPE_MULTICAM) {
rgb_byte_set_hue_float_offset(r_col, 0.85);
}

View File

@@ -412,7 +412,8 @@ typedef struct GlowVars {
int bNoComp;
} GlowVars;
typedef struct TransformVars {
/* Removed in 5.0. Only used in versioning and blend reading. */
typedef struct TransformVarsLegacy {
float ScalexIni;
float ScaleyIni;
float xIni;
@@ -422,7 +423,7 @@ typedef struct TransformVars {
int interpolation;
/** Preserve aspect/ratio when scaling. */
int uniform_scale;
} TransformVars;
} TransformVarsLegacy;
typedef struct SolidColorVars {
float col[3];
@@ -822,10 +823,11 @@ typedef enum StripType {
STRIP_TYPE_MUL = 14,
/* Removed (behavior was the same as alpha-over), only used when reading old files. */
STRIP_TYPE_OVERDROP_REMOVED = 15,
/* STRIP_TYPE_PLUGIN = 24, */ /* Removed */
/* STRIP_TYPE_PLUGIN = 24, */ /* Removed. */
STRIP_TYPE_WIPE = 25,
STRIP_TYPE_GLOW = 26,
STRIP_TYPE_TRANSFORM = 27,
/* Removed in 5.0, used only for versioning. */
STRIP_TYPE_TRANSFORM_LEGACY = 27,
STRIP_TYPE_COLOR = 28,
STRIP_TYPE_SPEED = 29,
STRIP_TYPE_MULTICAM = 30,

View File

@@ -53,6 +53,7 @@ DNA_STRUCT_RENAME(SpaceButs, SpaceProperties)
DNA_STRUCT_RENAME(SpaceIpo, SpaceGraph)
DNA_STRUCT_RENAME(SpaceOops, SpaceOutliner)
DNA_STRUCT_RENAME(Strip, StripData)
DNA_STRUCT_RENAME(TransformVars, TransformVarsLegacy)
DNA_STRUCT_RENAME_MEMBER(ActionSlot, name, identifier)
DNA_STRUCT_RENAME_MEMBER(AnimData, slot_name, last_slot_identifier)
DNA_STRUCT_RENAME_MEMBER(AnimData, tmp_slot_name, tmp_last_slot_identifier)

View File

@@ -912,8 +912,6 @@ static StructRNA *rna_Strip_refine(PointerRNA *ptr)
return &RNA_WipeStrip;
case STRIP_TYPE_GLOW:
return &RNA_GlowStrip;
case STRIP_TYPE_TRANSFORM:
return &RNA_TransformStrip;
case STRIP_TYPE_COLOR:
return &RNA_ColorStrip;
case STRIP_TYPE_SPEED:
@@ -2278,7 +2276,6 @@ static void rna_def_strip(BlenderRNA *brna)
{STRIP_TYPE_MUL, "MULTIPLY", 0, "Multiply", ""},
{STRIP_TYPE_WIPE, "WIPE", 0, "Wipe", ""},
{STRIP_TYPE_GLOW, "GLOW", 0, "Glow", ""},
{STRIP_TYPE_TRANSFORM, "TRANSFORM", 0, "Transform", ""},
{STRIP_TYPE_COLOR, "COLOR", 0, "Color", ""},
{STRIP_TYPE_SPEED, "SPEED", 0, "Speed", ""},
{STRIP_TYPE_MULTICAM, "MULTICAM", 0, "Multicam Selector", ""},
@@ -3358,74 +3355,6 @@ static void rna_def_glow(StructRNA *srna)
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Strip_invalidate_raw_update");
}
static void rna_def_transform(StructRNA *srna)
{
PropertyRNA *prop;
static const EnumPropertyItem interpolation_items[] = {
{0, "NONE", 0, "None", "No interpolation"},
{1, "BILINEAR", 0, "Bilinear", "Bilinear interpolation"},
{2, "BICUBIC", 0, "Bicubic", "Bicubic interpolation"},
{0, nullptr, 0, nullptr, nullptr},
};
static const EnumPropertyItem translation_unit_items[] = {
{0, "PIXELS", 0, "Pixels", ""},
{1, "PERCENT", 0, "Percent", ""},
{0, nullptr, 0, nullptr, nullptr},
};
RNA_def_struct_sdna_from(srna, "TransformVars", "effectdata");
prop = RNA_def_property(srna, "scale_start_x", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, nullptr, "ScalexIni");
RNA_def_property_ui_text(prop, "Scale X", "Amount to scale the input in the X axis");
RNA_def_property_ui_range(prop, 0, 10, 3, 6);
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Strip_invalidate_raw_update");
prop = RNA_def_property(srna, "scale_start_y", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, nullptr, "ScaleyIni");
RNA_def_property_ui_text(prop, "Scale Y", "Amount to scale the input in the Y axis");
RNA_def_property_ui_range(prop, 0, 10, 3, 6);
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Strip_invalidate_raw_update");
prop = RNA_def_property(srna, "use_uniform_scale", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "uniform_scale", 0);
RNA_def_property_ui_text(prop, "Uniform Scale", "Scale uniformly, preserving aspect ratio");
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Strip_invalidate_raw_update");
prop = RNA_def_property(srna, "translate_start_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, nullptr, "xIni");
RNA_def_property_ui_text(prop, "Translate X", "Amount to move the input on the X axis");
RNA_def_property_ui_range(prop, -4000.0f, 4000.0f, 3, 6);
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Strip_invalidate_raw_update");
prop = RNA_def_property(srna, "translate_start_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, nullptr, "yIni");
RNA_def_property_ui_text(prop, "Translate Y", "Amount to move the input on the Y axis");
RNA_def_property_ui_range(prop, -4000.0f, 4000.0f, 3, 6);
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Strip_invalidate_raw_update");
prop = RNA_def_property(srna, "rotation_start", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, nullptr, "rotIni");
RNA_def_property_ui_text(prop, "Rotation", "Degrees to rotate the input");
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Strip_invalidate_raw_update");
prop = RNA_def_property(srna, "translation_unit", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, nullptr, "percent");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); /* not meant to be animated */
RNA_def_property_enum_items(prop, translation_unit_items);
RNA_def_property_ui_text(prop, "Translation Unit", "Unit of measure to translate the input");
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Strip_invalidate_raw_update");
prop = RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, interpolation_items);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); /* not meant to be animated */
RNA_def_property_ui_text(
prop, "Interpolation", "Method to determine how missing pixels are created");
RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Strip_invalidate_raw_update");
}
static void rna_def_solid_color(StructRNA *srna)
{
PropertyRNA *prop;
@@ -3767,11 +3696,6 @@ static EffectInfo def_effects[] = {
rna_def_speed_control,
1},
{"SubtractStrip", "Subtract Strip", "Subtract Strip", nullptr, 2},
{"TransformStrip",
"Transform Strip",
"Sequence strip applying affine transformations to other strips",
rna_def_transform,
1},
{"WipeStrip", "Wipe Strip", "Sequence strip creating a wipe transition", rna_def_wipe, 2},
{"GaussianBlurStrip",
"Gaussian Blur Strip",

View File

@@ -839,7 +839,6 @@ void RNA_api_strips(StructRNA *srna, const bool metastrip)
{STRIP_TYPE_MUL, "MULTIPLY", 0, "Multiply", "Multiply color channels from two videos"},
{STRIP_TYPE_WIPE, "WIPE", 0, "Wipe", "Sweep a transition line across the frame"},
{STRIP_TYPE_GLOW, "GLOW", 0, "Glow", "Add blur and brightness to light areas"},
{STRIP_TYPE_TRANSFORM, "TRANSFORM", 0, "Transform", "Apply scale, rotation, or translation"},
{STRIP_TYPE_COLOR, "COLOR", 0, "Color", "Add a simple color strip"},
{STRIP_TYPE_SPEED, "SPEED", 0, "Speed", "Timewarp video strips, modifying playback speed"},
{STRIP_TYPE_MULTICAM, "MULTICAM", 0, "Multicam Selector", "Control active camera angles"},

View File

@@ -67,7 +67,6 @@ set(SRC
intern/effects/vse_effect_solid_color.cc
intern/effects/vse_effect_speed.cc
intern/effects/vse_effect_text.cc
intern/effects/vse_effect_transform.cc
intern/effects/vse_effect_wipe.cc
intern/modifiers/MOD_brightness_contrast.cc
intern/modifiers/MOD_color_balance.cc

View File

@@ -200,9 +200,6 @@ EffectHandle effect_handle_get(StripType strip_type)
case STRIP_TYPE_GLOW:
glow_effect_get_handle(rval);
break;
case STRIP_TYPE_TRANSFORM:
transform_effect_get_handle(rval);
break;
case STRIP_TYPE_SPEED:
speed_effect_get_handle(rval);
break;

View File

@@ -1,200 +0,0 @@
/* SPDX-FileCopyrightText: 2024 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup sequencer
*/
#include "BLI_math_rotation.h"
#include "DNA_sequence_types.h"
#include "DNA_space_types.h"
#include "IMB_imbuf.hh"
#include "IMB_interp.hh"
#include "SEQ_proxy.hh"
#include "SEQ_render.hh"
#include "effects.hh"
namespace blender::seq {
static void init_transform_effect(Strip *strip)
{
if (strip->effectdata) {
MEM_freeN(strip->effectdata);
}
TransformVars *transform = MEM_callocN<TransformVars>("transformvars");
strip->effectdata = transform;
transform->ScalexIni = 1.0f;
transform->ScaleyIni = 1.0f;
transform->xIni = 0.0f;
transform->yIni = 0.0f;
transform->rotIni = 0.0f;
transform->interpolation = 1;
transform->percent = 1;
transform->uniform_scale = 0;
}
static int num_inputs_transform()
{
return 1;
}
static void free_transform_effect(Strip *strip, const bool /*do_id_user*/)
{
MEM_SAFE_FREE(strip->effectdata);
}
static void copy_transform_effect(Strip *dst, const Strip *src, const int /*flag*/)
{
dst->effectdata = MEM_dupallocN(src->effectdata);
}
static void transform_image(int x,
int y,
int start_line,
int total_lines,
const ImBuf *ibuf,
ImBuf *out,
float scale_x,
float scale_y,
float translate_x,
float translate_y,
float rotate,
int interpolation)
{
/* Rotate */
float s = sinf(rotate);
float c = cosf(rotate);
float4 *dst_fl = reinterpret_cast<float4 *>(out->float_buffer.data);
uchar4 *dst_ch = reinterpret_cast<uchar4 *>(out->byte_buffer.data);
size_t offset = size_t(x) * start_line;
for (int yi = start_line; yi < start_line + total_lines; yi++) {
for (int xi = 0; xi < x; xi++) {
/* Translate point. */
float xt = xi - translate_x;
float yt = yi - translate_y;
/* Rotate point with center ref. */
float xr = c * xt + s * yt;
float yr = -s * xt + c * yt;
/* Scale point with center ref. */
xt = xr / scale_x;
yt = yr / scale_y;
/* Undo reference center point. */
xt += (x / 2.0f);
yt += (y / 2.0f);
/* interpolate */
switch (interpolation) {
case 0:
if (dst_fl) {
dst_fl[offset] = imbuf::interpolate_nearest_border_fl(ibuf, xt, yt);
}
else {
dst_ch[offset] = imbuf::interpolate_nearest_border_byte(ibuf, xt, yt);
}
break;
case 1:
if (dst_fl) {
dst_fl[offset] = imbuf::interpolate_bilinear_border_fl(ibuf, xt, yt);
}
else {
dst_ch[offset] = imbuf::interpolate_bilinear_border_byte(ibuf, xt, yt);
}
break;
case 2:
if (dst_fl) {
dst_fl[offset] = imbuf::interpolate_cubic_bspline_fl(ibuf, xt, yt);
}
else {
dst_ch[offset] = imbuf::interpolate_cubic_bspline_byte(ibuf, xt, yt);
}
break;
}
offset++;
}
}
}
static ImBuf *do_transform_effect(const RenderData *context,
SeqRenderState * /*state*/,
Strip *strip,
float /*timeline_frame*/,
float /*fac*/,
ImBuf *src1,
ImBuf * /*src2*/)
{
ImBuf *dst = prepare_effect_imbufs(context, src1, nullptr);
const TransformVars *transform = (TransformVars *)strip->effectdata;
/* Scale */
float scale_x, scale_y;
if (transform->uniform_scale) {
scale_x = scale_y = transform->ScalexIni;
}
else {
scale_x = transform->ScalexIni;
scale_y = transform->ScaleyIni;
}
const int x = context->rectx;
const int y = context->recty;
/* Translate */
float translate_x, translate_y;
if (!transform->percent) {
/* Compensate for render scale. */
const float size_scale = seq::get_render_scale_factor(*context);
translate_x = transform->xIni * size_scale + (x / 2.0f);
translate_y = transform->yIni * size_scale + (y / 2.0f);
}
else {
translate_x = x * (transform->xIni / 100.0f) + (x / 2.0f);
translate_y = y * (transform->yIni / 100.0f) + (y / 2.0f);
}
/* Rotate */
float rotate_radians = DEG2RADF(transform->rotIni);
blender::threading::parallel_for(
blender::IndexRange(dst->y), 32, [&](blender::IndexRange y_range) {
transform_image(x,
y,
y_range.first(),
y_range.size(),
src1,
dst,
scale_x,
scale_y,
translate_x,
translate_y,
rotate_radians,
transform->interpolation);
});
return dst;
}
void transform_effect_get_handle(EffectHandle &rval)
{
rval.init = init_transform_effect;
rval.num_inputs = num_inputs_transform;
rval.free = free_transform_effect;
rval.copy = copy_transform_effect;
rval.execute = do_transform_effect;
}
} // namespace blender::seq

View File

@@ -773,9 +773,6 @@ static bool strip_write_data_cb(Strip *strip, void *userdata)
case STRIP_TYPE_GLOW:
BLO_write_struct(writer, GlowVars, strip->effectdata);
break;
case STRIP_TYPE_TRANSFORM:
BLO_write_struct(writer, TransformVars, strip->effectdata);
break;
case STRIP_TYPE_GAUSSIAN_BLUR:
BLO_write_struct(writer, GaussianBlurVars, strip->effectdata);
break;
@@ -879,8 +876,8 @@ static bool strip_read_data_cb(Strip *strip, void *user_data)
case STRIP_TYPE_GLOW:
BLO_read_struct(reader, GlowVars, &strip->effectdata);
break;
case STRIP_TYPE_TRANSFORM:
BLO_read_struct(reader, TransformVars, &strip->effectdata);
case STRIP_TYPE_TRANSFORM_LEGACY:
BLO_read_struct(reader, TransformVarsLegacy, &strip->effectdata);
break;
case STRIP_TYPE_GAUSSIAN_BLUR:
BLO_read_struct(reader, GaussianBlurVars, &strip->effectdata);

View File

@@ -146,8 +146,6 @@ const char *get_default_stripname_by_type(int type)
return CTX_DATA_(BLT_I18NCONTEXT_ID_SEQUENCE, "Wipe");
case STRIP_TYPE_GLOW:
return CTX_DATA_(BLT_I18NCONTEXT_ID_SEQUENCE, "Glow");
case STRIP_TYPE_TRANSFORM:
return CTX_DATA_(BLT_I18NCONTEXT_ID_SEQUENCE, "Transform");
case STRIP_TYPE_COLOR:
return CTX_DATA_(BLT_I18NCONTEXT_ID_SEQUENCE, "Color");
case STRIP_TYPE_MULTICAM: