Files
test2/source/blender/sequencer/intern/effects/vse_effect_adjustment.cc
Richard Antalik 0b633fab3e Fix #135631: Locked strip visibility can't be changed
Strip locking was meant to be used with strip transformation only. So
the check, whether strip is locked is removed from hide/unhide operator.

Further it was requested to lock sound strip subframe offset. Since this
is time related property, it was moved to time panel. This also
addresses request to make it more obvious, why the value can't be
changed.
The name of the property was clarified from "Offset" to
"Sound offset", because there are another 2 offsets in the panel.

Finally, when channel is locked, properties in side panel now reflects
this state. This is done by adding RNA get function for `Strip.lock`
property. Function `seq::transform_is_locked` is used instead of
checking `SEQ_LOCK` flag, because it also checks channel state. With
this setup, the lock property can't be disabled while channel is locked.
However strip lock flag will be unset, which can be prevented. (I am not sure which is better. Both are fine in my eyes.)

Pull Request: https://projects.blender.org/blender/blender/pulls/135831
2025-03-25 21:50:05 +01:00

102 lines
2.5 KiB
C++

/* SPDX-FileCopyrightText: 2024 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup sequencer
*/
#include "DNA_sequence_types.h"
#include "SEQ_channels.hh"
#include "SEQ_relations.hh"
#include "SEQ_render.hh"
#include "SEQ_sequencer.hh"
#include "SEQ_time.hh"
#include "SEQ_utils.hh"
#include "effects.hh"
#include "render.hh"
namespace blender::seq {
/* No effect inputs for adjustment, we use #give_ibuf_seq. */
static int num_inputs_adjustment()
{
return 0;
}
static StripEarlyOut early_out_adjustment(const Strip * /*strip*/, float /*fac*/)
{
return StripEarlyOut::NoInput;
}
static ImBuf *do_adjustment_impl(const RenderData *context, Strip *strip, float timeline_frame)
{
Editing *ed;
ImBuf *i = nullptr;
ed = context->scene->ed;
ListBase *seqbasep = get_seqbase_by_seq(context->scene, strip);
ListBase *channels = get_channels_by_seq(ed, strip);
/* Clamp timeline_frame to strip range so it behaves as if it had "still frame" offset (last
* frame is static after end of strip). This is how most strips behave. This way transition
* effects that doesn't overlap or speed effect can't fail rendering outside of strip range. */
timeline_frame = clamp_i(timeline_frame,
time_left_handle_frame_get(context->scene, strip),
time_right_handle_frame_get(context->scene, strip) - 1);
if (strip->machine > 1) {
i = seq_render_give_ibuf_seqbase(
context, timeline_frame, strip->machine - 1, channels, seqbasep);
}
/* Found nothing? so let's work the way up the meta-strip stack, so
* that it is possible to group a bunch of adjustment strips into
* a meta-strip and have that work on everything below the meta-strip. */
if (!i) {
Strip *meta;
meta = lookup_meta_by_strip(ed, strip);
if (meta) {
i = do_adjustment_impl(context, meta, timeline_frame);
}
}
return i;
}
static ImBuf *do_adjustment(const RenderData *context,
Strip *strip,
float timeline_frame,
float /*fac*/,
ImBuf * /*ibuf1*/,
ImBuf * /*ibuf2*/)
{
ImBuf *out;
Editing *ed;
ed = context->scene->ed;
if (!ed) {
return nullptr;
}
out = do_adjustment_impl(context, strip, timeline_frame);
return out;
}
void adjustment_effect_get_handle(EffectHandle &rval)
{
rval.num_inputs = num_inputs_adjustment;
rval.early_out = early_out_adjustment;
rval.execute = do_adjustment;
}
} // namespace blender::seq