X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fvframe3d.C;h=52f096d7fa444385895067c2bce5a2bf82bf0949;hp=649a3b1997343d9577a0b885ec95da2f153e7adf;hb=3305343c3d9bfb889f6892e7821cc0e2d68669de;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1 diff --git a/cinelerra-5.1/guicast/vframe3d.C b/cinelerra-5.1/guicast/vframe3d.C index 649a3b19..52f096d7 100644 --- a/cinelerra-5.1/guicast/vframe3d.C +++ b/cinelerra-5.1/guicast/vframe3d.C @@ -179,7 +179,6 @@ void VFrame::screen_to_texture(int x, int y, int w, int h) // Create texture BC_Texture::new_texture(&texture, get_w(), get_h(), get_color_model()); - if(pbuffer) { glEnable(GL_TEXTURE_2D); @@ -237,20 +236,15 @@ void VFrame::draw_texture(int flip_y) } -void VFrame::bind_texture(int texture_unit) +void VFrame::bind_texture(int texture_unit, int nearest) { // Bind the texture - if(texture) - { - texture->bind(texture_unit); + if(texture) { + texture->bind(texture_unit, nearest); } } - - - - void VFrame::init_screen(int w, int h) { #ifdef HAVE_GL @@ -266,7 +260,7 @@ void VFrame::init_screen(int w, int h) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Shift down and right so 0,0 is the top left corner - glTranslatef(-(w-1)/2.f, (h-1)/2.f, 0.0); + glTranslatef(-w/2.f, h/2.f, 0.f); glTranslatef(0.0, 0.0, -(far + near) / 2); glDisable(GL_DEPTH_TEST); @@ -307,103 +301,136 @@ void VFrame::init_screen() init_screen(get_w(), get_h()); } -static int print_error(char *source, unsigned int object, int is_program) -{ + + #ifdef HAVE_GL - char string[BCTEXTLEN]; + +static int print_error(const char *text, unsigned int object, int is_program) +{ + char info[BCTEXTLEN]; int len = 0; - if(is_program) - glGetProgramInfoLog(object, BCTEXTLEN, &len, string); + if( is_program ) + glGetProgramInfoLog(object, BCTEXTLEN, &len, info); else - glGetShaderInfoLog(object, BCTEXTLEN, &len, string); - if(len > 0) printf("Playback3D::print_error:\n%s\n%s\n", source, string); - if(len > 0) return 1; -#endif - return 0; + glGetShaderInfoLog(object, BCTEXTLEN, &len, info); + if( len > 0 ) printf("Playback3D::print_error:\n%s\n%s\n", text, info); + return !len ? 0 : 1; } - - -// call as: -// make_shader(0, frag1, .., fragn, 0); -// or make_shader(fragments); - -unsigned int VFrame::make_shader(const char **fragments, ...) +static char *shader_segs(const char **segs, int n) { - unsigned int result = 0; -#ifdef HAVE_GL -// Construct single source file out of arguments - char *program = 0; - int nb_mains = 0; - - int nb_frags = 1; - if( !fragments ) { - va_list list; va_start(list, fragments); - while( va_arg(list, char*) != 0 ) ++nb_frags; - va_end(list); - } - const char *frags[nb_frags], *text = 0; - if( !fragments ) { - va_list list; va_start(list, fragments); - for( int i=0; iget_shader(program, &got_it); - if( !got_it ) { - result = glCreateProgram(); - unsigned int shader = glCreateShader(GL_FRAGMENT_SHADER); - const GLchar *text_ptr = program; - glShaderSource(shader, 1, &text_ptr, NULL); - glCompileShader(shader); - int error = print_error(program, shader, 0); - glAttachShader(result, shader); - glDeleteShader(shader); - glLinkProgram(result); - if( !error ) - error = print_error(program, result, 1); -//printf("BC_WindowBase::make_shader: shader=%d window_id=%d\n", result, -// BC_WindowBase::get_synchronous()->current_window->get_id()); - BC_WindowBase::get_synchronous()->put_shader(result, program); + if( ret ) { + cp = cstrcat(2, ret, main_prog); + delete [] ret; ret = cp; + } + else + ret = cstrdup(main_prog); + return ret; +} + +static int compile_shader(unsigned int &shader, int type, const GLchar *text) +{ + shader = glCreateShader(type); + glShaderSource(shader, 1, &text, 0); + glCompileShader(shader); + return print_error(text, shader, 0); +} + +static unsigned int build_shader(const char *vert, const char *frag) +{ + int error = 0; + unsigned int vertex_shader = 0; + unsigned int fragment_shader = 0; + unsigned int program = glCreateProgram(); + if( !error && vert ) + error = compile_shader(vertex_shader, GL_VERTEX_SHADER, vert); + if( !error && frag ) + error = compile_shader(fragment_shader, GL_FRAGMENT_SHADER, frag); + if( !error && vert ) glAttachShader(program, vertex_shader); + if( !error && frag ) glAttachShader(program, fragment_shader); + if( !error ) glLinkProgram(program); + if( !error ) error = print_error("link", program, 1); + if( !error ) + BC_WindowBase::get_synchronous()->put_shader(program, vert, frag); + else { + glDeleteProgram(program); + program = 0; + } + return program; +} + +#endif + +// call as: +// make_shader(0, seg1, .., segn, 0); +// or make_shader(&seg); +// line 1: optional comment // vertex shader + +unsigned int VFrame::make_shader(const char **segments, ...) +{ + unsigned int program = 0; +#ifdef HAVE_GL +// Construct single source file out of arguments + int nb_segs = 1; + if( !segments ) { + va_list list; va_start(list, segments); + while( va_arg(list, char*) != 0 ) ++nb_segs; + va_end(list); + } + const char *segs[nb_segs]; + if( !segments ) { + va_list list; va_start(list, segments); + for( int i=0; iget_shader(&program, vert, frag) ) + program = build_shader(vert, frag); + delete [] vert; + delete [] frag; #endif - return result; + return program; } void VFrame::dump_shader(int shader_id)