44e484ad34
obs_source_process_filter tried to do everything in a single function, but the problem is that effect parameters would not properly be accounted for due to the way it internally draws, therefore it was necessary to split the functions in to two, you first call obs_source_process_filter_begin, then you set your effect parameters, then you finally call obs_source_process_filter_end. This ensures that when the filter is drawn, that the effect parameters are set.
70 lines
1.3 KiB
C
70 lines
1.3 KiB
C
#include <obs-module.h>
|
|
|
|
struct test_filter {
|
|
obs_source_t *source;
|
|
gs_effect_t *whatever;
|
|
};
|
|
|
|
static const char *filter_getname(void)
|
|
{
|
|
return "Test";
|
|
}
|
|
|
|
static void filter_destroy(void *data)
|
|
{
|
|
struct test_filter *tf = data;
|
|
|
|
if (tf) {
|
|
obs_enter_graphics();
|
|
|
|
gs_effect_destroy(tf->whatever);
|
|
bfree(tf);
|
|
|
|
obs_leave_graphics();
|
|
}
|
|
}
|
|
|
|
static void *filter_create(obs_data_t *settings, obs_source_t *source)
|
|
{
|
|
struct test_filter *tf = bzalloc(sizeof(struct test_filter));
|
|
char *effect_file;
|
|
|
|
obs_enter_graphics();
|
|
|
|
effect_file = obs_module_file("test.effect");
|
|
|
|
tf->source = source;
|
|
tf->whatever = gs_effect_create_from_file(effect_file, NULL);
|
|
bfree(effect_file);
|
|
if (!tf->whatever) {
|
|
filter_destroy(tf);
|
|
tf = NULL;
|
|
}
|
|
|
|
obs_leave_graphics();
|
|
|
|
UNUSED_PARAMETER(settings);
|
|
return tf;
|
|
}
|
|
|
|
static void filter_render(void *data, gs_effect_t *effect)
|
|
{
|
|
struct test_filter *tf = data;
|
|
|
|
obs_source_process_filter_begin(tf->source, GS_RGBA,
|
|
OBS_ALLOW_DIRECT_RENDERING);
|
|
obs_source_process_filter_end(tf->source, tf->whatever, 0, 0);
|
|
|
|
UNUSED_PARAMETER(effect);
|
|
}
|
|
|
|
struct obs_source_info test_filter = {
|
|
.id = "test_filter",
|
|
.type = OBS_SOURCE_TYPE_FILTER,
|
|
.output_flags = OBS_SOURCE_VIDEO,
|
|
.get_name = filter_getname,
|
|
.create = filter_create,
|
|
.destroy = filter_destroy,
|
|
.video_render = filter_render
|
|
};
|