From 5fc35fb36f6658dc486bf2c5e05510c575f3efec Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Thu, 5 Sep 2019 23:09:28 +0200 Subject: Unfinished integration of multi-process approach --- src/scene01.c | 248 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 131 insertions(+), 117 deletions(-) (limited to 'src/scene01.c') diff --git a/src/scene01.c b/src/scene01.c index 80cbae2..b817e71 100644 --- a/src/scene01.c +++ b/src/scene01.c @@ -24,130 +24,129 @@ typedef float t_mat4x4[16]; static inline void mat4x4_ortho( t_mat4x4 out, float left, float right, float bottom, float top, float znear, float zfar ) { - #define T(a, b) (a * 4 + b) + #define T(a, b) (a * 4 + b) - out[T(0,0)] = 2.0f / (right - left); - out[T(0,1)] = 0.0f; - out[T(0,2)] = 0.0f; - out[T(0,3)] = 0.0f; + out[T(0,0)] = 2.0f / (right - left); + out[T(0,1)] = 0.0f; + out[T(0,2)] = 0.0f; + out[T(0,3)] = 0.0f; - out[T(1,1)] = 2.0f / (top - bottom); - out[T(1,0)] = 0.0f; - out[T(1,2)] = 0.0f; - out[T(1,3)] = 0.0f; + out[T(1,1)] = 2.0f / (top - bottom); + out[T(1,0)] = 0.0f; + out[T(1,2)] = 0.0f; + out[T(1,3)] = 0.0f; - out[T(2,2)] = -2.0f / (zfar - znear); - out[T(2,0)] = 0.0f; - out[T(2,1)] = 0.0f; - out[T(2,3)] = 0.0f; + out[T(2,2)] = -2.0f / (zfar - znear); + out[T(2,0)] = 0.0f; + out[T(2,1)] = 0.0f; + out[T(2,3)] = 0.0f; - out[T(3,0)] = -(right + left) / (right - left); - out[T(3,1)] = -(top + bottom) / (top - bottom); - out[T(3,2)] = -(zfar + znear) / (zfar - znear); - out[T(3,3)] = 1.0f; + out[T(3,0)] = -(right + left) / (right - left); + out[T(3,1)] = -(top + bottom) / (top - bottom); + out[T(3,2)] = -(zfar + znear) / (zfar - znear); + out[T(3,3)] = 1.0f; - #undef T + #undef T } static const char * vertex_shader = - "#version 130\n" - "in vec2 i_position;\n" - "in vec4 i_color;\n" - "out vec4 v_color;\n" - "uniform mat4 u_projection_matrix;\n" - "void main() {\n" - " v_color = i_color;\n" - " gl_Position = u_projection_matrix * vec4( i_position, 0.0, 1.0 );\n" - "}\n"; + "#version 130\n" + "in vec2 i_position;\n" + "in vec4 i_color;\n" + "out vec4 v_color;\n" + "uniform mat4 u_projection_matrix;\n" + "void main() {\n" + " v_color = i_color;\n" + " gl_Position = u_projection_matrix * vec4( i_position, 0.0, 1.0 );\n" + "}\n"; static const char * fragment_shader = - "#version 130\n" - "in vec4 v_color;\n" - "out vec4 o_color;\n" - "void main() {\n" - " o_color = v_color;\n" - "}\n"; + "#version 130\n" + "in vec4 v_color;\n" + "out vec4 o_color;\n" + "void main() {\n" + " o_color = v_color;\n" + "}\n"; typedef enum t_attrib_id { - attrib_position, - attrib_color + attrib_position, + attrib_color } t_attrib_id; int scene01_init(graphical_env_t *ge, scene01_env_t *se) { - int width = 256, height = 256; - GLuint vs, fs, program; - - vs = glCreateShader( GL_VERTEX_SHADER ); - fs = glCreateShader( GL_FRAGMENT_SHADER ); - - int length = strlen( vertex_shader ); - glShaderSource( vs, 1, ( const GLchar ** )&vertex_shader, &length ); - glCompileShader( vs ); - - GLint status; - glGetShaderiv( vs, GL_COMPILE_STATUS, &status ); - if( status == GL_FALSE ) - { - fprintf( stderr, "vertex shader compilation failed\n" ); - return 1; - } - - length = strlen( fragment_shader ); - glShaderSource( fs, 1, ( const GLchar ** )&fragment_shader, &length ); - glCompileShader( fs ); - - glGetShaderiv( fs, GL_COMPILE_STATUS, &status ); - if( status == GL_FALSE ) - { - fprintf( stderr, "fragment shader compilation failed\n" ); - return 1; - } - - program = glCreateProgram(); - glAttachShader( program, vs ); - glAttachShader( program, fs ); - - glBindAttribLocation( program, attrib_position, "i_position" ); - glBindAttribLocation( program, attrib_color, "i_color" ); - glLinkProgram( program ); - - glUseProgram( program ); - - glDisable( GL_DEPTH_TEST ); - //glClearColor( 0.5, 0.0, 0.0, 0.0 ); - glClearColor( 0.5, 0.5, 0.0, 0.0 ); - glViewport( 0, 0, width, height ); - - GLuint vbo; - - glGenVertexArrays( 1, &(se->vao) ); - glGenBuffers( 1, &vbo ); - glBindVertexArray( se->vao ); - glBindBuffer( GL_ARRAY_BUFFER, vbo ); - - glEnableVertexAttribArray( attrib_position ); - glEnableVertexAttribArray( attrib_color ); - - glVertexAttribPointer( attrib_color, 4, GL_FLOAT, GL_FALSE, sizeof( float ) * 6, 0 ); - glVertexAttribPointer( attrib_position, 2, GL_FLOAT, GL_FALSE, sizeof( float ) * 6, ( void * )(4 * sizeof(float)) ); - - const GLfloat g_vertex_buffer_data[] = { - /* R, G, B, A, X, Y */ - 1, 0, 0, 1, 0, 0, - 0, 1, 0, 1, width, 0, - 0, 0, 1, 1, width, height, - - 1, 0, 0, 1, 0, 0, - 0, 0, 1, 1, width, height, - 1, 1, 1, 1, 0, height - }; - - glBufferData( GL_ARRAY_BUFFER, sizeof( g_vertex_buffer_data ), g_vertex_buffer_data, GL_STATIC_DRAW ); - - t_mat4x4 projection_matrix; - mat4x4_ortho( projection_matrix, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 100.0f ); - glUniformMatrix4fv( glGetUniformLocation( program, "u_projection_matrix" ), 1, GL_FALSE, projection_matrix ); + GLuint vs, fs, program; + + vs = glCreateShader( GL_VERTEX_SHADER ); + fs = glCreateShader( GL_FRAGMENT_SHADER ); + + int length = strlen( vertex_shader ); + glShaderSource( vs, 1, ( const GLchar ** )&vertex_shader, &length ); + glCompileShader( vs ); + + GLint status; + glGetShaderiv( vs, GL_COMPILE_STATUS, &status ); + if( status == GL_FALSE ) + { + fprintf( stderr, "vertex shader compilation failed\n" ); + return 1; + } + + length = strlen( fragment_shader ); + glShaderSource( fs, 1, ( const GLchar ** )&fragment_shader, &length ); + glCompileShader( fs ); + + glGetShaderiv( fs, GL_COMPILE_STATUS, &status ); + if( status == GL_FALSE ) + { + fprintf( stderr, "fragment shader compilation failed\n" ); + return 1; + } + + program = glCreateProgram(); + glAttachShader( program, vs ); + glAttachShader( program, fs ); + + glBindAttribLocation( program, attrib_position, "i_position" ); + glBindAttribLocation( program, attrib_color, "i_color" ); + glLinkProgram( program ); + + glUseProgram( program ); + + glDisable( GL_DEPTH_TEST ); + //glClearColor( 0.5, 0.0, 0.0, 0.0 ); + glClearColor( 0.5, 0.5, 0.0, 0.0 ); + glViewport( 0, 0, FBUF_W, FBUF_H ); + + GLuint vbo; + + glGenVertexArrays( 1, &(se->vao) ); + glGenBuffers( 1, &vbo ); + glBindVertexArray( se->vao ); + glBindBuffer( GL_ARRAY_BUFFER, vbo ); + + glEnableVertexAttribArray( attrib_position ); + glEnableVertexAttribArray( attrib_color ); + + glVertexAttribPointer( attrib_color, 4, GL_FLOAT, GL_FALSE, sizeof( float ) * 6, 0 ); + glVertexAttribPointer( attrib_position, 2, GL_FLOAT, GL_FALSE, sizeof( float ) * 6, ( void * )(4 * sizeof(float)) ); + + const GLfloat g_vertex_buffer_data[] = { + /* R, G, B, A, X, Y */ + 1, 0, 0, 1, 0, 0, + 0, 1, 0, 1, FBUF_W, 0, + 0, 0, 1, 1, FBUF_W, FBUF_H, + + 1, 0, 0, 1, 0, 0, + 0, 0, 1, 1, FBUF_W, FBUF_H, + 1, 1, 1, 1, 0, FBUF_H + }; + + glBufferData( GL_ARRAY_BUFFER, sizeof( g_vertex_buffer_data ), g_vertex_buffer_data, GL_STATIC_DRAW ); + + t_mat4x4 projection_matrix; + mat4x4_ortho( projection_matrix, 0.0f, (float)FBUF_W, (float)FBUF_H, 0.0f, 0.0f, 100.0f ); + glUniformMatrix4fv( glGetUniformLocation( program, "u_projection_matrix" ), 1, GL_FALSE, projection_matrix ); return 0; } @@ -155,35 +154,50 @@ void scene01_free(graphical_env_t *ge, scene01_env_t *se) { //FIXME scene00 cannot be rendered coorectly after scene01_init done once } -int scene01_next(graphical_env_t *ge, scene01_env_t *se) { +int scene01_next_gl(graphical_env_t *ge, scene01_env_t *se) { // Shorthands caca_canvas_t *cv = ge->cv; int w = ge->w, h = ge->h; - Uint32 frame = ge->sc_framecount; SDL_Renderer *r = ge->sdl_rndr; - // Locals + // Local vars int res; + // https://gist.github.com/Twinklebear/8265888 + // https://forums.libsdl.org/viewtopic.php?p=51634 + // Render all the stuff on target texture - //SDL_SetRenderTarget(r, ge->sdl_target); + SDL_SetRenderTarget(r, ge->sdl_target); glClear( GL_COLOR_BUFFER_BIT ); glBindVertexArray( se->vao ); glDrawArrays( GL_TRIANGLES, 0, 6 ); - SDL_GL_SwapWindow( ge->sdl_win ); // Copy the SDL screen to SDL debug window (and display it, not mandatory) - //SDL_SetRenderTarget(r, NULL); - //SDL_RenderCopy(r, ge->sdl_target, NULL, NULL); - //SDL_RenderPresent(r); + SDL_SetRenderTarget(r, NULL); + SDL_RenderCopy(r, ge->sdl_target, NULL, NULL); + SDL_RenderPresent(r); // Download the rendered texture from videocard to main memory + SDL_SetRenderTarget(r, ge->sdl_target); res = SDL_RenderReadPixels(r, NULL, 0, ge->raw_target, 256*4); // "convert" the raw pixel stream to ASCII art on caca canevas - caca_set_dither_gamma(ge->d, (100-frame%100)/100.0); + caca_set_dither_gamma(ge->d, 1.0); if ( res == 0 ) caca_dither_bitmap(cv, 0, 0, w, h, ge->d, ge->raw_target); + return 0; +} + +int scene01_next_sdl(graphical_env_t *ge, scene01_env_t *se) { + return 0; +} + +int scene01_next_caca(graphical_env_t *ge, scene01_env_t *se) { + // Shorthands + caca_canvas_t *cv = ge->cv; + int w = ge->w, h = ge->h; + Uint32 frame = ge->sc_framecount; + caca_set_color_ansi(cv, CACA_WHITE, CACA_BLACK); caca_put_str(cv, (w-17)/2, h/2, "This is a message"); -- cgit v1.2.3