示例#1
0
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();
}
示例#2
0
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;
}