浏览代码

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.
jp9000 5 年之前
父节点
当前提交
2d35f863da
共有 4 个文件被更改,包括 33 次插入4 次删除
  1. 4 1
      libobs/obs-internal.h
  2. 26 2
      libobs/obs-source-transition.c
  3. 1 1
      libobs/obs-source.c
  4. 2 0
      libobs/obs.h

+ 4 - 1
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);

+ 26 - 2
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);
 }
 

+ 1 - 1
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);

+ 2 - 0
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,