diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 5b5f0266a..7b2aa2be5 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -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); diff --git a/libobs/obs-source-transition.c b/libobs/obs-source-transition.c index b1ba2990b..d5782488c 100644 --- a/libobs/obs-source-transition.c +++ b/libobs/obs-source-transition.c @@ -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); } diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 3bee2baea..88ce0b271 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -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); diff --git a/libobs/obs.h b/libobs/obs.h index 877572e46..da0e1ee9f 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -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,