mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-07-14 15:24:07 +00:00
libobs: Add manual transition "torque" support
Allows the ability for manual transitioning to smoothly flow (interpolate) to the intended transition point over a short period of time rather than simply setting a hard transition point number. Doing this allows manual transitioning to occur more smoothly, and in a more visually pleasant way.
This commit is contained in:
parent
a97039db64
commit
2d35f863da
|
@ -700,6 +700,9 @@ struct obs_source {
|
|||
gs_texrender_t *transition_texrender[2];
|
||||
pthread_mutex_t transition_mutex;
|
||||
obs_source_t *transition_sources[2];
|
||||
float transition_manual_clamp;
|
||||
float transition_manual_torque;
|
||||
float transition_manual_target;
|
||||
float transition_manual_val;
|
||||
bool transitioning_video;
|
||||
bool transitioning_audio;
|
||||
|
@ -728,7 +731,7 @@ extern bool obs_source_init_context(struct obs_source *source,
|
|||
|
||||
extern bool obs_transition_init(obs_source_t *transition);
|
||||
extern void obs_transition_free(obs_source_t *transition);
|
||||
extern void obs_transition_tick(obs_source_t *transition);
|
||||
extern void obs_transition_tick(obs_source_t *transition, float t);
|
||||
extern void obs_transition_enum_sources(obs_source_t *transition,
|
||||
obs_source_enum_proc_t enum_callback,
|
||||
void *param);
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
******************************************************************************/
|
||||
|
||||
#include "obs-internal.h"
|
||||
#include "graphics/math-extra.h"
|
||||
|
||||
#define lock_transition(transition) \
|
||||
pthread_mutex_lock(&transition->transition_mutex);
|
||||
|
@ -203,11 +204,24 @@ static void recalculate_transition_size(obs_source_t *transition)
|
|||
transition->transition_actual_cy = cy;
|
||||
}
|
||||
|
||||
void obs_transition_tick(obs_source_t *transition)
|
||||
void obs_transition_tick(obs_source_t *transition, float t)
|
||||
{
|
||||
recalculate_transition_size(transition);
|
||||
recalculate_transition_matrices(transition);
|
||||
|
||||
if (transition->transition_mode == OBS_TRANSITION_MODE_MANUAL) {
|
||||
if (transition->transition_manual_torque == 0.0f) {
|
||||
transition->transition_manual_val =
|
||||
transition->transition_manual_target;
|
||||
} else {
|
||||
transition->transition_manual_val = calc_torquef(
|
||||
transition->transition_manual_val,
|
||||
transition->transition_manual_target,
|
||||
transition->transition_manual_torque,
|
||||
transition->transition_manual_clamp, t);
|
||||
}
|
||||
}
|
||||
|
||||
if (trylock_textures(transition) == 0) {
|
||||
gs_texrender_reset(transition->transition_texrender[0]);
|
||||
gs_texrender_reset(transition->transition_texrender[1]);
|
||||
|
@ -372,6 +386,7 @@ bool obs_transition_start(obs_source_t *transition,
|
|||
lock_transition(transition);
|
||||
transition->transition_mode = mode;
|
||||
transition->transition_manual_val = 0.0f;
|
||||
transition->transition_manual_target = 0.0f;
|
||||
unlock_transition(transition);
|
||||
|
||||
if (transition->info.transition_start)
|
||||
|
@ -402,10 +417,19 @@ bool obs_transition_start(obs_source_t *transition,
|
|||
return true;
|
||||
}
|
||||
|
||||
void obs_transition_set_manual_torque(obs_source_t *transition, float torque,
|
||||
float clamp)
|
||||
{
|
||||
lock_transition(transition);
|
||||
transition->transition_manual_torque = torque;
|
||||
transition->transition_manual_clamp = clamp;
|
||||
unlock_transition(transition);
|
||||
}
|
||||
|
||||
void obs_transition_set_manual_time(obs_source_t *transition, float t)
|
||||
{
|
||||
lock_transition(transition);
|
||||
transition->transition_manual_val = t;
|
||||
transition->transition_manual_target = t;
|
||||
unlock_transition(transition);
|
||||
}
|
||||
|
||||
|
|
|
@ -1067,7 +1067,7 @@ void obs_source_video_tick(obs_source_t *source, float seconds)
|
|||
return;
|
||||
|
||||
if (source->info.type == OBS_SOURCE_TYPE_TRANSITION)
|
||||
obs_transition_tick(source);
|
||||
obs_transition_tick(source, seconds);
|
||||
|
||||
if ((source->info.output_flags & OBS_SOURCE_ASYNC) != 0)
|
||||
async_tick(source);
|
||||
|
|
|
@ -1343,6 +1343,8 @@ EXPORT bool obs_transition_start(obs_source_t *transition,
|
|||
EXPORT void obs_transition_set(obs_source_t *transition, obs_source_t *source);
|
||||
|
||||
EXPORT void obs_transition_set_manual_time(obs_source_t *transition, float t);
|
||||
EXPORT void obs_transition_set_manual_torque(obs_source_t *transition,
|
||||
float torque, float clamp);
|
||||
|
||||
enum obs_transition_scale_type {
|
||||
OBS_TRANSITION_SCALE_MAX_ONLY,
|
||||
|
|
Loading…
Reference in a new issue