static void GLimp_InitExtensions() { ri.Printf( PRINT_ALL, "Initializing OpenGL extensions\n" ); if ( LOAD_EXTENSION_WITH_CVAR(ARB_debug_output, r_glDebugProfile) ) { glDebugMessageCallbackARB( (GLDEBUGPROCARB)GLimp_DebugCallback, nullptr ); glEnable( GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB ); } // Shaders REQUIRE_EXTENSION( ARB_fragment_shader ); REQUIRE_EXTENSION( ARB_vertex_shader ); glGetIntegerv( GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &glConfig2.maxVertexUniforms ); glGetIntegerv( GL_MAX_VERTEX_ATTRIBS_ARB, &glConfig2.maxVertexAttribs ); int reservedComponents = 36 * 10; // approximation how many uniforms we have besides the bone matrices glConfig2.maxVertexSkinningBones = Math::Clamp( ( glConfig2.maxVertexUniforms - reservedComponents ) / 16, 0, MAX_BONES ); glConfig2.vboVertexSkinningAvailable = r_vboVertexSkinning->integer && ( ( glConfig2.maxVertexSkinningBones >= 12 ) ? true : false ); // GLSL REQUIRE_EXTENSION( ARB_shading_language_100 ); Q_strncpyz( glConfig2.shadingLanguageVersionString, ( char * ) glGetString( GL_SHADING_LANGUAGE_VERSION_ARB ), sizeof( glConfig2.shadingLanguageVersionString ) ); int majorVersion, minorVersion; if ( sscanf( glConfig2.shadingLanguageVersionString, "%i.%i", &majorVersion, &minorVersion ) != 2 ) { ri.Printf( PRINT_ALL, "WARNING: unrecognized shading language version string format\n" ); } glConfig2.shadingLanguageVersion = majorVersion * 100 + minorVersion; ri.Printf( PRINT_ALL, "...found shading language version %i\n", glConfig2.shadingLanguageVersion ); // Texture formats and compression REQUIRE_EXTENSION( ARB_depth_texture ); REQUIRE_EXTENSION( ARB_texture_cube_map ); glGetIntegerv( GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, &glConfig2.maxCubeMapTextureSize ); glConfig2.textureHalfFloatAvailable = LOAD_EXTENSION_WITH_CVAR(ARB_half_float_pixel, r_ext_half_float_pixel); glConfig2.textureFloatAvailable = LOAD_EXTENSION_WITH_CVAR(ARB_texture_float, r_ext_texture_float); glConfig2.textureRGAvailable = LOAD_EXTENSION_WITH_CVAR(ARB_texture_rg, r_ext_texture_rg); // TODO figure out what was the problem with MESA glConfig2.framebufferPackedDepthStencilAvailable = glConfig.driverType != GLDRV_MESA && LOAD_EXTENSION_WITH_CVAR(EXT_packed_depth_stencil, r_ext_packed_depth_stencil); glConfig2.ARBTextureCompressionAvailable = LOAD_EXTENSION_WITH_CVAR(ARB_texture_compression, r_ext_compressed_textures); glConfig.textureCompression = TC_NONE; if( LOAD_EXTENSION_WITH_CVAR(EXT_texture_compression_s3tc, r_ext_compressed_textures) ) { glConfig.textureCompression = TC_S3TC; } //REQUIRE_EXTENSION(EXT_texture3D); // Texture - others glConfig2.textureNPOTAvailable = LOAD_EXTENSION_WITH_CVAR(ARB_texture_non_power_of_two, r_ext_texture_non_power_of_two); glConfig2.generateMipmapAvailable = LOAD_EXTENSION_WITH_CVAR(SGIS_generate_mipmap, r_ext_generate_mipmap); glConfig2.textureAnisotropyAvailable = false; if ( LOAD_EXTENSION_WITH_CVAR(EXT_texture_filter_anisotropic, r_ext_texture_filter_anisotropic) ) { glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig2.maxTextureAnisotropy ); glConfig2.textureAnisotropyAvailable = true; } // VAO and VBO //REQUIRE_EXTENSION( ARB_vertex_array_object ); REQUIRE_EXTENSION( ARB_vertex_buffer_object ); REQUIRE_EXTENSION( ARB_half_float_vertex ); // FBO glConfig2.framebufferObjectAvailable = false; if ( LOAD_EXTENSION_WITH_CVAR(ARB_framebuffer_object, r_arb_framebuffer_object) ) { glGetIntegerv( GL_MAX_RENDERBUFFER_SIZE, &glConfig2.maxRenderbufferSize ); glGetIntegerv( GL_MAX_COLOR_ATTACHMENTS, &glConfig2.maxColorAttachments ); glConfig2.framebufferObjectAvailable = true; } // Other REQUIRE_EXTENSION( ARB_shader_objects ); glConfig2.occlusionQueryAvailable = false; glConfig2.occlusionQueryBits = 0; if ( LOAD_EXTENSION_WITH_CVAR(ARB_occlusion_query, r_ext_occlusion_query) ) { glConfig2.occlusionQueryAvailable = true; glGetQueryivARB( GL_SAMPLES_PASSED, GL_QUERY_COUNTER_BITS, &glConfig2.occlusionQueryBits ); } glConfig2.drawBuffersAvailable = false; if ( LOAD_EXTENSION_WITH_CVAR(ARB_draw_buffers, r_ext_draw_buffers) ) { glGetIntegerv( GL_MAX_DRAW_BUFFERS_ARB, &glConfig2.maxDrawBuffers ); glConfig2.drawBuffersAvailable = true; } // gDEBugger debug if ( GLEW_GREMEDY_string_marker ) { ri.Printf( PRINT_ALL, "...using GL_GREMEDY_string_marker\n" ); } else { ri.Printf( PRINT_ALL, "...GL_GREMEDY_string_marker not found\n" ); } #ifdef GLEW_ARB_get_program_binary if( GLEW_ARB_get_program_binary ) { int formats = 0; glGetIntegerv( GL_NUM_PROGRAM_BINARY_FORMATS, &formats ); if ( !formats ) { ri.Printf( PRINT_ALL, "...GL_ARB_get_program_binary found, but with no binary formats\n"); glConfig2.getProgramBinaryAvailable = false; } else { ri.Printf( PRINT_ALL, "...using GL_ARB_get_program_binary\n"); glConfig2.getProgramBinaryAvailable = true; } } else #endif { ri.Printf( PRINT_ALL, "...GL_ARB_get_program_binary not found\n"); glConfig2.getProgramBinaryAvailable = false; } #ifdef GLEW_ARB_buffer_storage if ( GLEW_ARB_buffer_storage ) { if ( r_arb_buffer_storage->integer ) { ri.Printf( PRINT_ALL, "...using GL_ARB_buffer_storage\n" ); glConfig2.bufferStorageAvailable = true; } else { ri.Printf( PRINT_ALL, "...ignoring GL_ARB_buffer_storage\n" ); glConfig2.bufferStorageAvailable = false; } } else #endif { ri.Printf( PRINT_ALL, "...GL_ARB_buffer_storage not found\n" ); glConfig2.bufferStorageAvailable = false; } glConfig2.mapBufferRangeAvailable = LOAD_EXTENSION_WITH_CVAR( ARB_map_buffer_range, r_arb_map_buffer_range ); glConfig2.syncAvailable = LOAD_EXTENSION_WITH_CVAR( ARB_sync, r_arb_sync ); GL_CheckErrors(); }
int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowSize(640, 480); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("Cloth"); glutReshapeFunc(&reshape); glutDisplayFunc(&render); glutIdleFunc(&update); glutKeyboardFunc(&on_keyboard); glutMouseFunc(&on_mouse); glutMotionFunc(&on_mouse_move); g_last_fps_update = ptime(); if (glewInit() != GLEW_OK) { fprintf(stderr, "Error: Could not initialize GLEW\n"); return 1; } REQUIRE_EXTENSION("GL_ARB_vertex_buffer_object"); g_world = new World(); /*g_world->planes.push_back(Plane(glm::vec3(-1.0f, 0.5f, -1.0f), glm::vec3(-1.0f, 0.5f, 1.0f), glm::vec3(1.0f, -0.5f, 1.0f)));*/ /*g_world->planes.push_back(new Plane(glm::vec3(0.0f, -0.9f, 0.0f), glm::vec3(0.0f, -0.9f, 1.0f), glm::vec3(1.0f, -0.9f, 0.0f)));*/ /*g_world->planes.push_back(Plane(glm::vec3(0.0f, 0.1f, 0.0f), glm::vec3(1.0f, 0.1f, 0.0f), glm::vec3(0.0f, 0.1f, 1.0f)));*/ g_cloth = new Cloth(2.0f, 2.0f, 32, 32, *g_world); reset(); if (argc > 1) { std::string error_msg; g_script = new Script(*g_world); for (int i = 1; i < argc; ++i) { const char *fname = argv[i]; if (!g_script->load(fname, &error_msg)) { fprintf(stderr, "%s\n", error_msg.c_str()); return 1; } } g_script->init(); } g_plane_surface = new Surface(2, 2); // make a XZ-oriented plane spanning (-1, 0, -1) to (+1, 0, +1) g_plane_surface->lock(); g_plane_surface->make_plane(glm::vec3(-1.f, 0.f, -1.f), glm::vec3(1.f, 0.f, 0.f), glm::vec3(0.f, 0.f, 1.f), 2.f, 2.f); g_plane_surface->unlock(); glutMainLoop(); delete g_cloth; delete g_world; if (g_script != NULL) delete g_script; return 0; }