Skip to content

Commit d45e3b9

Browse files
committed
Fix dynamic vertex buffer
1 parent 6345a0f commit d45e3b9

File tree

1 file changed

+43
-4
lines changed

1 file changed

+43
-4
lines changed

obs-shaderfilter.c

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ struct shader_filter_data {
168168
obs_source_t *context;
169169
gs_effect_t *effect;
170170
gs_effect_t *output_effect;
171+
gs_vertbuffer_t *sprite_buffer;
171172

172173
gs_texrender_t *input_texrender;
173174
gs_texrender_t *previous_input_texrender;
@@ -268,7 +269,6 @@ static unsigned int rand_interval(unsigned int min, unsigned int max)
268269

269270
static char *load_shader_from_file(const char *file_name) // add input of visited files
270271
{
271-
272272
char *file_ptr = os_quick_read_utf8_file(file_name);
273273
if (file_ptr == NULL) {
274274
blog(LOG_WARNING, "[obs-shaderfilter] failed to read file: %s", file_name);
@@ -694,6 +694,18 @@ static void *shader_filter_create(obs_data_t *settings, obs_source_t *source)
694694

695695
da_init(filter->stored_param_list);
696696
load_output_effect(filter);
697+
struct gs_vb_data *vbd = gs_vbdata_create();
698+
vbd->num = 4;
699+
vbd->points = bmalloc(sizeof(struct vec3) * 4);
700+
vbd->num_tex = 1;
701+
vbd->tvarray = bmalloc(sizeof(struct gs_tvertarray));
702+
vbd->tvarray[0].width = 2;
703+
vbd->tvarray[0].array = bmalloc(sizeof(struct vec2) * 4);
704+
memset(vbd->points, 0, sizeof(struct vec3) * 4);
705+
memset(vbd->tvarray[0].array, 0, sizeof(struct vec2) * 4);
706+
obs_enter_graphics();
707+
filter->sprite_buffer = gs_vertexbuffer_create(vbd, GS_DYNAMIC);
708+
obs_leave_graphics();
697709
obs_source_update(source, settings);
698710

699711
return filter;
@@ -717,7 +729,8 @@ static void shader_filter_destroy(void *data)
717729
gs_texrender_destroy(filter->previous_input_texrender);
718730
if (filter->previous_output_texrender)
719731
gs_texrender_destroy(filter->previous_output_texrender);
720-
732+
if (filter->sprite_buffer)
733+
gs_vertexbuffer_destroy(filter->sprite_buffer);
721734
obs_leave_graphics();
722735

723736
dstr_free(&filter->last_path);
@@ -2914,6 +2927,25 @@ void shader_filter_set_effect_params(struct shader_filter_data *filter)
29142927
}
29152928
}
29162929

2930+
static void build_sprite(struct gs_vb_data *data, float fcx, float fcy, float start_u, float end_u, float start_v, float end_v)
2931+
{
2932+
struct vec2 *tvarray = data->tvarray[0].array;
2933+
2934+
vec3_zero(data->points);
2935+
vec3_set(data->points + 1, fcx, 0.0f, 0.0f);
2936+
vec3_set(data->points + 2, 0.0f, fcy, 0.0f);
2937+
vec3_set(data->points + 3, fcx, fcy, 0.0f);
2938+
vec2_set(tvarray, start_u, start_v);
2939+
vec2_set(tvarray + 1, end_u, start_v);
2940+
vec2_set(tvarray + 2, start_u, end_v);
2941+
vec2_set(tvarray + 3, end_u, end_v);
2942+
}
2943+
2944+
static inline void build_sprite_norm(struct gs_vb_data *data, float fcx, float fcy)
2945+
{
2946+
build_sprite(data, fcx, fcy, 0.0f, 1.0f, 0.0f, 1.0f);
2947+
}
2948+
29172949
static void render_shader(struct shader_filter_data *filter, float f, obs_source_t *filter_to)
29182950
{
29192951
gs_texture_t *texture = gs_texrender_get_texture(filter->input_texrender);
@@ -3045,8 +3077,15 @@ static void render_shader(struct shader_filter_data *filter, float f, obs_source
30453077

30463078
if (gs_texrender_begin(filter->output_texrender, filter->total_width, filter->total_height)) {
30473079
gs_ortho(0.0f, (float)filter->total_width, 0.0f, (float)filter->total_height, -100.0f, 100.0f);
3048-
while (gs_effect_loop(filter->effect, "Draw"))
3049-
gs_draw_sprite(texture, 0, filter->total_width, filter->total_height);
3080+
while (gs_effect_loop(filter->effect, "Draw")) {
3081+
struct gs_vb_data *data = gs_vertexbuffer_get_data(filter->sprite_buffer);
3082+
build_sprite_norm(data, (float)filter->total_width, (float)filter->total_height);
3083+
gs_vertexbuffer_flush(filter->sprite_buffer);
3084+
gs_load_vertexbuffer(filter->sprite_buffer);
3085+
gs_load_indexbuffer(NULL);
3086+
3087+
gs_draw(GS_TRISTRIP, 0, 0);
3088+
}
30503089
gs_texrender_end(filter->output_texrender);
30513090
}
30523091

0 commit comments

Comments
 (0)