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:
jp9000 2019-12-27 16:33:38 -08:00
parent a97039db64
commit 2d35f863da
4 changed files with 33 additions and 4 deletions

View file

@ -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);

View file

@ -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);
}

View file

@ -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);

View file

@ -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,