|
@@ -56,11 +56,23 @@ static void fade_callback(void *data, gs_texture_t *a, gs_texture_t *b, float t,
|
|
|
const bool previous = gs_framebuffer_srgb_enabled();
|
|
|
gs_enable_framebuffer_srgb(true);
|
|
|
|
|
|
- gs_effect_set_texture(fade->a_param, a);
|
|
|
- gs_effect_set_texture(fade->b_param, b);
|
|
|
+ const char *tech_name = "Fade";
|
|
|
+
|
|
|
+ /* texture setters look reversed, but they aren't */
|
|
|
+ if (gs_get_color_space() == GS_CS_SRGB) {
|
|
|
+ /* users want nonlinear fade */
|
|
|
+ gs_effect_set_texture(fade->a_param, a);
|
|
|
+ gs_effect_set_texture(fade->b_param, b);
|
|
|
+ } else {
|
|
|
+ /* nonlinear fade is too wrong, so use linear fade */
|
|
|
+ gs_effect_set_texture_srgb(fade->a_param, a);
|
|
|
+ gs_effect_set_texture_srgb(fade->b_param, b);
|
|
|
+ tech_name = "FadeLinear";
|
|
|
+ }
|
|
|
+
|
|
|
gs_effect_set_float(fade->fade_param, t);
|
|
|
|
|
|
- while (gs_effect_loop(fade->effect, "Fade"))
|
|
|
+ while (gs_effect_loop(fade->effect, tech_name))
|
|
|
gs_draw_sprite(NULL, 0, cx, cy);
|
|
|
|
|
|
gs_enable_framebuffer_srgb(previous);
|
|
@@ -68,9 +80,10 @@ static void fade_callback(void *data, gs_texture_t *a, gs_texture_t *b, float t,
|
|
|
|
|
|
static void fade_video_render(void *data, gs_effect_t *effect)
|
|
|
{
|
|
|
+ UNUSED_PARAMETER(effect);
|
|
|
+
|
|
|
struct fade_info *fade = data;
|
|
|
obs_transition_video_render(fade->source, fade_callback);
|
|
|
- UNUSED_PARAMETER(effect);
|
|
|
}
|
|
|
|
|
|
static float mix_a(void *data, float t)
|
|
@@ -95,6 +108,24 @@ static bool fade_audio_render(void *data, uint64_t *ts_out,
|
|
|
channels, sample_rate, mix_a, mix_b);
|
|
|
}
|
|
|
|
|
|
+static enum gs_color_space
|
|
|
+fade_video_get_color_space(void *data, size_t count,
|
|
|
+ const enum gs_color_space *preferred_spaces)
|
|
|
+{
|
|
|
+ struct fade_info *const fade = data;
|
|
|
+ const enum gs_color_space transition_space =
|
|
|
+ obs_transition_video_get_color_space(fade->source);
|
|
|
+
|
|
|
+ enum gs_color_space space = transition_space;
|
|
|
+ for (size_t i = 0; i < count; ++i) {
|
|
|
+ space = preferred_spaces[i];
|
|
|
+ if (space == transition_space)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return space;
|
|
|
+}
|
|
|
+
|
|
|
struct obs_source_info fade_transition = {
|
|
|
.id = "fade_transition",
|
|
|
.type = OBS_SOURCE_TYPE_TRANSITION,
|
|
@@ -103,4 +134,5 @@ struct obs_source_info fade_transition = {
|
|
|
.destroy = fade_destroy,
|
|
|
.video_render = fade_video_render,
|
|
|
.audio_render = fade_audio_render,
|
|
|
+ .video_get_color_space = fade_video_get_color_space,
|
|
|
};
|