@@ -171,7 +171,9 @@ struct shader_filter_data {
171171 gs_effect_t * output_effect ;
172172
173173 gs_texrender_t * input_texrender ;
174+ gs_texrender_t * previous_input_texrender ;
174175 gs_texrender_t * output_texrender ;
176+ gs_texrender_t * previous_output_texrender ;
175177 gs_eparam_t * param_output_image ;
176178
177179 bool reload_effect ;
@@ -215,10 +217,12 @@ struct shader_filter_data {
215217 gs_eparam_t * param_rand_instance_f ;
216218 gs_eparam_t * param_rand_activation_f ;
217219 gs_eparam_t * param_image ;
220+ gs_eparam_t * param_previous_image ;
218221 gs_eparam_t * param_image_a ;
219222 gs_eparam_t * param_image_b ;
220223 gs_eparam_t * param_transition_time ;
221224 gs_eparam_t * param_convert_linear ;
225+ gs_eparam_t * param_previous_output ;
222226
223227 int expand_left ;
224228 int expand_right ;
@@ -347,10 +351,12 @@ static void shader_filter_clear_params(struct shader_filter_data *filter)
347351 filter -> param_loop_second = NULL ;
348352 filter -> param_local_time = NULL ;
349353 filter -> param_image = NULL ;
354+ filter -> param_previous_image = NULL ;
350355 filter -> param_image_a = NULL ;
351356 filter -> param_image_b = NULL ;
352357 filter -> param_transition_time = NULL ;
353358 filter -> param_convert_linear = NULL ;
359+ filter -> param_previous_output = NULL ;
354360
355361 size_t param_count = filter -> stored_param_list .num ;
356362 for (size_t param_index = 0 ; param_index < param_count ; param_index ++ ) {
@@ -593,6 +599,10 @@ static void shader_filter_reload_effect(struct shader_filter_data *filter)
593599 // Nothing.
594600 } else if (strcmp (info .name , "image" ) == 0 ) {
595601 filter -> param_image = param ;
602+ } else if (strcmp (info .name , "previous_image" ) == 0 ) {
603+ filter -> param_previous_image = param ;
604+ } else if (strcmp (info .name , "previous_output" ) == 0 ) {
605+ filter -> param_previous_output = param ;
596606 } else if (filter -> transition && strcmp (info .name , "image_a" ) == 0 ) {
597607 filter -> param_image_a = param ;
598608 } else if (filter -> transition && strcmp (info .name , "image_b" ) == 0 ) {
@@ -704,6 +714,10 @@ static void shader_filter_destroy(void *data)
704714 gs_texrender_destroy (filter -> input_texrender );
705715 if (filter -> output_texrender )
706716 gs_texrender_destroy (filter -> output_texrender );
717+ if (filter -> previous_input_texrender )
718+ gs_texrender_destroy (filter -> previous_input_texrender );
719+ if (filter -> previous_output_texrender )
720+ gs_texrender_destroy (filter -> previous_output_texrender );
707721
708722 obs_leave_graphics ();
709723
@@ -2662,6 +2676,12 @@ static void get_input_source(struct shader_filter_data *filter)
26622676
26632677 const enum gs_color_format format = gs_get_format_from_space (source_space );
26642678
2679+ if (filter -> param_previous_image ) {
2680+ gs_texrender_t * temp = filter -> input_texrender ;
2681+ filter -> input_texrender = filter -> previous_input_texrender ;
2682+ filter -> previous_input_texrender = temp ;
2683+ }
2684+
26652685 // Set up our input_texrender to catch the output texture.
26662686 filter -> input_texrender = create_or_reset_texrender (filter -> input_texrender );
26672687
@@ -2897,11 +2917,20 @@ static void render_shader(struct shader_filter_data *filter, float f, obs_source
28972917 return ;
28982918 }
28992919
2920+ if (filter -> param_previous_output ) {
2921+ gs_texrender_t * temp = filter -> output_texrender ;
2922+ filter -> output_texrender = filter -> previous_output_texrender ;
2923+ filter -> previous_output_texrender = temp ;
2924+ }
29002925 filter -> output_texrender = create_or_reset_texrender (filter -> output_texrender );
29012926
2902- if (filter -> param_image ) {
2927+ if (filter -> param_image )
29032928 gs_effect_set_texture (filter -> param_image , texture );
2904- }
2929+ if (filter -> param_previous_image )
2930+ gs_effect_set_texture (filter -> param_previous_image , gs_texrender_get_texture (filter -> previous_input_texrender ));
2931+ if (filter -> param_previous_output )
2932+ gs_effect_set_texture (filter -> param_previous_output , gs_texrender_get_texture (filter -> previous_output_texrender ));
2933+
29052934 shader_filter_set_effect_params (filter );
29062935
29072936 if (f > 0.0f ) {
@@ -2968,11 +2997,11 @@ static void render_shader(struct shader_filter_data *filter, float f, obs_source
29682997
29692998 switch (param -> type ) {
29702999 case GS_SHADER_PARAM_FLOAT :
2971- gs_effect_set_float (param -> param , (float )param -> default_value .f * f + (float )param -> value .f * (1.0f - f ));
3000+ gs_effect_set_float (param -> param ,
3001+ (float )param -> default_value .f * f + (float )param -> value .f * (1.0f - f ));
29723002 break ;
29733003 case GS_SHADER_PARAM_INT :
2974- gs_effect_set_int (param -> param ,
2975- (int )((double )param -> default_value .i * f +
3004+ gs_effect_set_int (param -> param , (int )((double )param -> default_value .i * f +
29763005 (double )param -> value .i * (1.0f - f )));
29773006 break ;
29783007 case GS_SHADER_PARAM_VEC2 : {
0 commit comments