int main( int argc, char **argv ) { /* Print copyright notice */ fprintf( stderr, "Tux Rider World Challenge -- http://www.barlow-server.com\n" "a fork from:\n" "Tux Racer " VERSION " -- a Sunspire Studios Production " "(http://www.sunspirestudios.com)\n" "(c) 1999-2000 Jasmin F. Patry " "<*****@*****.**>\n" "\"Tux Racer\" is a trademark of Jasmin F. Patry\n" "Tux Rider World Challenge comes with ABSOLUTELY NO WARRANTY. " "This is free software,\nand you are welcome to redistribute " "it under certain conditions.\n" "See http://www.gnu.org/copyleft/gpl.html for details.\n\n" ); /* Init the game clock */ g_game.secs_since_start = 0; /* Seed the random number generator */ srand( time(NULL) ); /* * Set up the game configuration */ /* Don't support multiplayer, yet... */ g_game.num_players = 2; /* Create a Tcl interpreter */ g_game.tcl_interp = Tcl_CreateInterp(); if ( g_game.tcl_interp == NULL ) { handle_error( 1, "cannot create Tcl interpreter" ); } /* Setup the configuration variables and read the ~/.tuxracer/options file */ init_game_configuration(); read_config_file(); /* Set up the debugging modes */ init_debug(); /* Setup diagnostic log if requested */ if ( getparam_write_diagnostic_log() ) { setup_diagnostic_log(); } /* * Setup Tcl stdout and stderr channels to point to C stdout and stderr * streams */ setup_tcl_std_channels(); /* * Initialize rendering context, create window */ winsys_init( &argc, argv, WINDOW_TITLE, WINDOW_TITLE ); /* Ingore key-repeat messages */ winsys_enable_key_repeat(0); /* Set up a function to clean up when program exits */ winsys_atexit( cleanup ); /* * Initial OpenGL settings */ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); init_opengl_extensions(); /* Print OpenGL debugging information if requested */ if ( debug_mode_is_active( DEBUG_GL_INFO ) ) { print_debug( DEBUG_GL_INFO, "OpenGL information:" ); print_gl_info(); } /* * Load the game data and initialize game state */ register_game_config_callbacks( g_game.tcl_interp ); register_course_load_tcl_callbacks( g_game.tcl_interp ); register_key_frame_callbacks( g_game.tcl_interp ); register_fog_callbacks( g_game.tcl_interp ); register_course_light_callbacks( g_game.tcl_interp ); register_particle_callbacks( g_game.tcl_interp ); register_texture_callbacks( g_game.tcl_interp ); register_font_callbacks( g_game.tcl_interp ); register_sound_tcl_callbacks( g_game.tcl_interp ); register_sound_data_tcl_callbacks( g_game.tcl_interp ); register_course_manager_callbacks( g_game.tcl_interp ); init_saved_games(); load_tux(); init_textures(); init_fonts(); init_audio_data(); init_audio(); init_ui_manager(); init_course_manager(); init_joystick(); /* Read the tuxracer_init.tcl file */ read_game_init_script(); /* Need to set up an initial view position for select_course (quadtree simplification) */ //Player 0 = classic mode player ; Player 1 = Speed Only Mode Player g_game.player[0].view.pos = make_point( 0., 0., 0. ); g_game.player[1].view.pos = make_point( 0., 0., 0. ); /* Placeholder name until we give players way to enter name */ g_game.player[0].name = "noname"; g_game.player[1].name = "nonameSpeedOnly"; init_preview(); splash_screen_register(); intro_register(); racing_register(); game_over_register(); paused_register(); reset_register(); game_type_select_register(); racing_mode_select_register(); event_select_register(); race_select_register(); credits_register(); loading_register(); g_game.mode = NO_MODE; set_game_mode( SPLASH ); g_game.difficulty = DIFFICULTY_LEVEL_NORMAL; init_keyboard(); winsys_show_cursor( False ); /* We use this to "prime" the GLUT loop */ winsys_set_idle_func( main_loop ); /* * ...and off we go! */ winsys_process_events(); return 0; }
void init_gl_extensions() { char str[1024]; init_opengl_extensions(); /* GL_ARB_multitexture */ if (have_extension(arb_multitexture)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_multitexture"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_multitexture"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_multitexture */ /* GL_ARB_texture_env_combine */ if (have_extension(arb_texture_env_combine)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_texture_env_combine"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_texture_env_combine"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_texture_env_combine */ /* GL_EXT_compiled_vertex_array */ if (have_extension(ext_compiled_vertex_array)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_EXT_compiled_vertex_array"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_EXT_compiled_vertex_array"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_EXT_compiled_vertex_array */ /* GL_ARB_point_sprite */ if (have_extension(ext_compiled_vertex_array)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_point_sprite"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_point_sprite"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_point_sprite */ /* GL_ARB_texture_compression */ if (have_extension(arb_texture_compression)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_texture_compression"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_texture_compression"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_texture_compression */ /* GL_EXT_texture_compression_s3tc */ if (have_extension(ext_texture_compression_s3tc)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_EXT_texture_compression_s3tc"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_EXT_texture_compression_s3tc"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_EXT_texture_compression_s3tc */ /* GL_SGIS_generate_mipmap */ if (have_extension(sgis_generate_mipmap)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_SGIS_generate_mipmap"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_SGIS_generate_mipmap"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_SGIS_generate_mipmap */ /* GL_ARB_shadow */ if (have_extension(arb_shadow)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_shadow"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_shadow"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_shadow */ /* GL_ARB_vertex_buffer_object */ if (have_extension(arb_vertex_buffer_object)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_vertex_buffer_object"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_vertex_buffer_object"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_vertex_buffer_object */ /* GL_EXT_framebuffer_object */ if (have_extension(ext_framebuffer_object)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_EXT_framebuffer_object"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_EXT_framebuffer_object"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_EXT_framebuffer_object */ /* GL_EXT_draw_range_elements */ if (have_extension(ext_draw_range_elements)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_EXT_draw_range_elements"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_EXT_draw_range_elements"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_EXT_draw_range_elements */ /* GL_ARB_texture_non_power_of_two */ if (have_extension(arb_texture_non_power_of_two)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_texture_non_power_of_two"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_texture_non_power_of_two"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_texture_non_power_of_two */ /* GL_ARB_fragment_program */ if (have_extension(arb_fragment_program)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_fragment_program"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_fragment_program"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_fragment_program */ /* GL_ARB_vertex_program */ if (have_extension(arb_vertex_program)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_vertex_program"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_vertex_program"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_vertex_program */ /* GL_ARB_fragment_shader */ if (have_extension(arb_fragment_shader)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_fragment_shader"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_fragment_shader"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_fragment_shader */ /* GL_ARB_vertex_shader */ if (have_extension(arb_vertex_shader)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_vertex_shader"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_vertex_shader"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_vertex_shader */ /* GL_ARB_shader_objects */ if (have_extension(arb_shader_objects)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_shader_objects"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_shader_objects"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_shader_objects */ /* GL_ARB_shading_language_100 */ if (have_extension(arb_shading_language_100)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ARB_shading_language_100"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_shading_language_100"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_shading_language_100 */ /* GL_ARB_texture_mirrored_repeat */ if (have_extension(arb_texture_mirrored_repeat)) { safe_snprintf(str, sizeof(str), gl_ext_found_not_used, "GL_ARB_texture_mirrored_repeat"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_texture_mirrored_repeat"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_texture_mirrored_repeat */ /* GL_ARB_texture_rectangle */ if (have_extension(arb_texture_rectangle)) { safe_snprintf(str, sizeof(str), gl_ext_found_not_used, "GL_ARB_texture_rectangle"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ARB_texture_rectangle"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ARB_texture_rectangle */ /* GL_EXT_fog_coord */ if (have_extension(ext_fog_coord)) { safe_snprintf(str, sizeof(str), gl_ext_found_not_used, "GL_EXT_fog_coord"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_EXT_fog_coord"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_EXT_fog_coord */ /* GL_ATI_texture_compression_3dc */ if (have_extension(ati_texture_compression_3dc)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_ATI_texture_compression_3dc"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_ATI_texture_compression_3dc"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_ATI_texture_compression_3dc */ /* GL_EXT_texture_compression_latc */ if (have_extension(ext_texture_compression_latc)) { safe_snprintf(str, sizeof(str), gl_ext_found, "GL_EXT_texture_compression_latc"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_EXT_texture_compression_latc"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_EXT_texture_compression_latc */ /* GL_EXT_texture_filter_anisotropic */ if (have_extension(ext_texture_filter_anisotropic)) { glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisotropic_filter); safe_snprintf(str, sizeof(str), gl_ext_found, "GL_EXT_texture_filter_anisotropic"); LOG_TO_CONSOLE(c_green2, str); LOG_DEBUG("%s\n",str); } else { anisotropic_filter = 1.0f; safe_snprintf(str, sizeof(str), gl_ext_not_found, "GL_EXT_texture_filter_anisotropic"); LOG_TO_CONSOLE(c_red1, str); LOG_DEBUG("%s\n",str); } /* GL_EXT_texture_filter_anisotropic */ #if 0 // Disabled because of bad drivers if (have_extension(ext_framebuffer_object)) { check_fbo_formats(); } #endif init_shaders(); #ifdef GL_EXTENSION_CHECK evaluate_extension(); #endif //GL_EXTENSION_CHECK gl_extensions_loaded = 1; CHECK_GL_ERRORS(); }