Пример #1
0
	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;
	}
Пример #2
0
Файл: fbo.hpp Проект: r-lyeh/eve
 ~preserve_fbo() { set_framebuffer(o,v); }
Пример #3
0
Файл: fbo.cpp Проект: r-lyeh/eve
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;
}