bool next_frame() { png_structp png_ptr; png_infop info_ptr; struct archive_entry *ae; int res; read_data: res = archive_read_next_header(this->archive, &ae); if (res != ARCHIVE_OK || res == ARCHIVE_EOF) { if (play_mode == LOOP) { /* Go to the first archive entry and read it. */ close(); open(); goto read_data; } else { printf("Animation finished.\n"); return false; } } else if (res == ARCHIVE_FATAL || res == ARCHIVE_WARN || res == ARCHIVE_RETRY) { printf("Failed to read next header.\n"); return false; } else if (res == 0) { /* At the end of the archive check the loop flag to see if we * restart. */ if (read_png(&png_ptr, &info_ptr, this->archive) == 1) { fprintf(stderr, "Problem reading PNG.\n"); return false; } /* Store the image data into the framebuffer. */ set_framebuffer(png_ptr, info_ptr, framebuffer); png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL); } else { fprintf(stderr, "archive_read_next_header resulted in an unknown error.\n"); return false; } return true; }
~preserve_fbo() { set_framebuffer(o,v); }
bool fbo::setup( GLint color_format, GLint depth_format, GLsizei w, GLsizei h) { ready = false; _w = w, _h = h; GLint o[1], v[4]; get_framebuffer(o, v); $glGenFramebuffersEXT(1, &frame); $glGenTextures (1, &color); $glGenTextures (1, &depth); // Initialize the color render buffer object. $glBindTexture(GL_TEXTURE_2D, color); $glTexImage2D (GL_TEXTURE_2D, 0, color_format, w, h, 0,GL_RGBA, GL_INT, NULL); $glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); $glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); $glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); $glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Initialize the depth render buffer object. $glBindTexture(GL_TEXTURE_2D, depth); $glTexImage2D (GL_TEXTURE_2D, 0, depth_format, w, h, 0,GL_DEPTH_COMPONENT, GL_INT, NULL); $glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); $glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); $glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); $glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); $glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); // Initialize the frame buffer object. $glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, frame); $glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D, color, 0); $glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_TEXTURE_2D, depth, 0); // Confirm the frame buffer object status. auto result = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT ); ; switch( result ) { case GL_FRAMEBUFFER_COMPLETE_EXT: break; case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: assert( !"Framebuffer incomplete attachment" ); case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: assert( !"Framebuffer missing attachment" ); case GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT: assert( !"Framebuffer duplicate attachment" ); case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: assert( !"Framebuffer dimensions" ); case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: assert( !"Framebuffer formats" ); case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: assert( !"Framebuffer draw buffer" ); case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT: assert( !"Framebuffer read buffer" ); case GL_FRAMEBUFFER_UNSUPPORTED_EXT: assert( !"Framebuffer unsupported" ); default: assert( !"Framebuffer error" ); } // Zero the buffer. $glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); set_framebuffer(o, v); ready = true; return true; }