bool activate_offscreen() { #if defined(VSXU_OPENGL_ES) || defined (__APPLE__) glGetIntegerv (GL_VIEWPORT, viewport); #endif bool rebuild = false; if (alpha_channel->get() != alpha_channel_int) { alpha_channel_int = alpha_channel->get(); rebuild = true; } if (float_texture->get() != float_texture_int) { float_texture_int = float_texture->get(); rebuild = true; } if (multisample->get() != multisample_int) { multisample_int = multisample->get(); rebuild = true; } if (multisample->get() != multisample_int) { multisample_int = multisample->get(); rebuild = true; } if (texture_size->get() >= 10) { glGetIntegerv (GL_VIEWPORT, viewport); int t_res_x = abs(viewport[2] - viewport[0]); int t_res_y = abs(viewport[3] - viewport[1]); if (texture_size->get() == 10) { if (t_res_x != res_x || t_res_y != res_y) rebuild = true; } if (texture_size->get() == 11) { if (t_res_x / 2 != res_x || t_res_y / 2 != res_y) rebuild = true; } if (texture_size->get() == 12) { if (t_res_x / 4 != res_x || t_res_y / 4 != res_y) rebuild = true; } if (texture_size->get() == 13) { if (t_res_x * 2 != res_x || t_res_y * 2 != res_y) rebuild = true; } if (texture_size->get() == 14) { if (t_res_x * 4 != res_x || t_res_y * 4 != res_y) rebuild = true; } } if (texture_size->get() != tex_size_internal || rebuild) { //printf("generating new framebuffer\n"); tex_size_internal = texture_size->get(); switch (tex_size_internal) { case 0: res_y = res_x = 2048; break; case 1: res_y = res_x = 1024; break; case 2: res_y = res_x = 512; break; case 3: res_y = res_x = 256; break; case 4: res_y = res_x = 128; break; case 5: res_y = res_x = 64; break; case 6: res_y = res_x = 32; break; case 7: res_y = res_x = 16; break; case 8: res_y = res_x = 8; break; case 9: res_y = res_x = 4; break; case 10: res_x = abs(viewport[2] - viewport[0]); res_y = abs(viewport[3] - viewport[1]); break; case 11: res_x = abs(viewport[2] - viewport[0]) / 2; res_y = abs(viewport[3] - viewport[1]) / 2; break; case 12: res_x = abs(viewport[2] - viewport[0]) / 4; res_y = abs(viewport[3] - viewport[1]) / 4; break; case 13: res_x = abs(viewport[2] - viewport[0]) * 2; res_y = abs(viewport[3] - viewport[1]) * 2; break; case 14: res_x = abs(viewport[2] - viewport[0]) * 4; res_y = abs(viewport[3] - viewport[1]) * 4; break; }; texture->reinit_color_depth_buffer ( res_x, res_y, float_texture_int, alpha_channel_int, multisample_int ); } texture->begin_capture_to_buffer(); //printf("changing viewport to %d\n",res_x); glViewport(0,0,res_x,res_y); glDepthMask(GL_TRUE); glEnable(GL_BLEND); glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&glsl_prog); if ( atof((char*)glGetString(GL_VERSION)) >= 2.0 ) glUseProgram(0); else glUseProgramObjectARB(0); loading_done = true; return true; }
bool activate_offscreen() { #if defined(VSXU_OPENGL_ES) || defined (__APPLE__) glGetIntegerv (GL_VIEWPORT, viewport); #endif bool rebuild = false; if (support_feedback->get() != support_feedback_int) { support_feedback_int = support_feedback->get(); rebuild = true; } if (alpha_channel->get() != alpha_channel_int) { alpha_channel_int = alpha_channel->get(); rebuild = true; } if (float_texture->get() != float_texture_int) { float_texture_int = float_texture->get(); rebuild = true; } if (multisample->get() != multisample_int) { multisample_int = multisample->get(); rebuild = true; } if (multisample->get() != multisample_int) { multisample_int = multisample->get(); rebuild = true; } if (texture_size->get() >= 10) { glGetIntegerv (GL_VIEWPORT, viewport); int t_res_x = abs(viewport[2] - viewport[0]); int t_res_y = abs(viewport[3] - viewport[1]); if (texture_size->get() == 10) { if (t_res_x != res_x || t_res_y != res_y) rebuild = true; } if (texture_size->get() == 11) { if (t_res_x / 2 != res_x || t_res_y / 2 != res_y) rebuild = true; } if (texture_size->get() == 12) { if (t_res_x / 4 != res_x || t_res_y / 4 != res_y) rebuild = true; } if (texture_size->get() == 13) { if (t_res_x * 2 != res_x || t_res_y * 2 != res_y) rebuild = true; } if (texture_size->get() == 14) { if (t_res_x * 4 != res_x || t_res_y * 4 != res_y) rebuild = true; } } if (texture_size->get() != tex_size_internal || rebuild) { //printf("generating new framebuffer\n"); tex_size_internal = texture_size->get(); switch (tex_size_internal) { case 0: res_y = res_x = 2048; break; case 1: res_y = res_x = 1024; break; case 2: res_y = res_x = 512; break; case 3: res_y = res_x = 256; break; case 4: res_y = res_x = 128; break; case 5: res_y = res_x = 64; break; case 6: res_y = res_x = 32; break; case 7: res_y = res_x = 16; break; case 8: res_y = res_x = 8; break; case 9: res_y = res_x = 4; break; case 10: res_x = abs(viewport[2] - viewport[0]); res_y = abs(viewport[3] - viewport[1]); break; case 11: res_x = abs(viewport[2] - viewport[0]) / 2; res_y = abs(viewport[3] - viewport[1]) / 2; break; case 12: res_x = abs(viewport[2] - viewport[0]) / 4; res_y = abs(viewport[3] - viewport[1]) / 4; break; case 13: res_x = abs(viewport[2] - viewport[0]) * 2; res_y = abs(viewport[3] - viewport[1]) * 2; break; case 14: res_x = abs(viewport[2] - viewport[0]) * 4; res_y = abs(viewport[3] - viewport[1]) * 4; break; }; if (0 == support_feedback_int) { texture->reinit_color_depth_buffer ( res_x, res_y, float_texture_int, alpha_channel_int, multisample_int ); texture->bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,0); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); texture->_bind(); } if (1 == support_feedback_int) { // feedback textures ignores foreign depth buffer... texture->reinit_color_depth_buffer ( res_x, res_y, float_texture_int, alpha_channel_int, multisample_int ); texture->bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,0); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); texture->_bind(); texture2->reinit_color_depth_buffer ( res_x, res_y, float_texture_int, alpha_channel_int, multisample_int ); texture2->bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,0); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); texture2->_bind(); } } if (!which_buffer || support_feedback->get() == 0) texture->begin_capture_to_buffer(); else texture2->begin_capture_to_buffer(); //printf("changing viewport to %d\n",res_x); glViewport(0,0,res_x,res_y); glDepthMask(GL_TRUE); glClearColor(clear_color->get(0),clear_color->get(1),clear_color->get(2),clear_color->get(3)); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer glEnable(GL_BLEND); glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&glsl_prog); if ( atof((char*)glGetString(GL_VERSION)) >= 2.0 ) glUseProgram(0); else glUseProgramObjectARB(0); loading_done = true; return true; }