static void config_key(const char *s, int i) { SDL_Keycode c = SDL_GetKeyFromName(s); if (c == SDLK_UNKNOWN) config_set_d(i, option_d[i].def); else config_set_d(i, c); }
static int conf_action(int tok, int val) { int sound = config_get_d(CONFIG_SOUND_VOLUME); int music = config_get_d(CONFIG_MUSIC_VOLUME); int mouse = MOUSE_RANGE_MAP(config_get_d(CONFIG_MOUSE_SENSE)); int r = 1; audio_play(AUD_MENU, 1.0f); switch (tok) { case GUI_BACK: goto_state(&st_title); break; case CONF_VIDEO: goto_state(&st_conf_video); break; case CONF_PLAYER: goto_name(&st_conf, &st_conf, 1); break; case CONF_BALL: goto_state(&st_ball); break; case CONF_MOUSE_SENSE: config_set_d(CONFIG_MOUSE_SENSE, MOUSE_RANGE_UNMAP(val)); gui_toggle(mouse_id[val]); gui_toggle(mouse_id[mouse]); break; case CONF_SOUND_VOLUME: config_set_d(CONFIG_SOUND_VOLUME, val); audio_volume(val, music); audio_play(AUD_BUMPM, 1.f); gui_toggle(sound_id[val]); gui_toggle(sound_id[sound]); break; case CONF_MUSIC_VOLUME: config_set_d(CONFIG_MUSIC_VOLUME, val); audio_volume(sound, val); audio_play(AUD_BUMPM, 1.f); gui_toggle(music_id[val]); gui_toggle(music_id[music]); break; } return r; }
static void config_mouse(const char *s, int i) { if (strcmp(s, "none") == 0) config_set_d(i, 0); else if (strcmp(s, "left") == 0) config_set_d(i, SDL_BUTTON_LEFT); else if (strcmp(s, "right") == 0) config_set_d(i, SDL_BUTTON_RIGHT); else if (strcmp(s, "middle") == 0) config_set_d(i, SDL_BUTTON_MIDDLE); else config_set_d(i, atoi(s)); }
static void config_key(const char *s, int i) { int c; config_set_d(i, option_d[i].def); for (c = 0; c < SDLK_LAST; c++) if (strcmp(s, SDL_GetKeyName((SDLKey) c)) == 0) { config_set_d(i, c); break; } }
static int camera_action(int tok, int val) { int r = 1; int rot_speed = ROT_SPEED_RANGE_MAP(config_get_d(CONFIG_ROTATE_FAST)); int normal_rot_accel = config_get_d(CONFIG_ROTATE_ACCEL_NORMAL); int finesse_rot_accel = config_get_d(CONFIG_ROTATE_ACCEL_FINESSE); audio_play(AUD_MENU, 1.0f); switch (tok) { case GUI_BACK: goto_state(camera_back); camera_back = NULL; break; case CAMERA_ROT_SPEED: config_set_d(CONFIG_ROTATE_FAST, ROT_SPEED_RANGE_UNMAP(val)); gui_toggle(rot_speed_id[val]); gui_toggle(rot_speed_id[rot_speed]); break; case CAMERA_NORMAL_ROT_ACCEL: config_set_d(CONFIG_ROTATE_ACCEL_NORMAL, val); gui_toggle(normal_rot_accel_id[val]); gui_toggle(normal_rot_accel_id[normal_rot_accel]); break; case CAMERA_FINESSE_ROT_ACCEL: config_set_d(CONFIG_ROTATE_ACCEL_FINESSE, val); gui_toggle(finesse_rot_accel_id[val]); gui_toggle(finesse_rot_accel_id[finesse_rot_accel]); break; case CAMERA_SCREEN_TILT_ENABLED: goto_state(&st_null); config_set_d(CONFIG_SCREEN_TILT_ENABLED, val); goto_state(&st_camera); break; case CAMERA_REVERSED_CAMERA_ROTATION: goto_state(&st_null); config_set_d(CONFIG_REVERSED_CAMERA_ROTATION, val); goto_state(&st_camera); break; default: break; } return r; }
static int conf_action(int i) { int s = config_get_d(CONFIG_SOUND_VOLUME); int m = config_get_d(CONFIG_MUSIC_VOLUME); int r = 1; audio_play(AUD_MENU, 1.0f); switch (i) { case CONF_BACK: goto_state(&st_title); break; case CONF_VIDEO: goto_state(&st_video); break; case CONF_LANG: goto_state(&st_lang); break; default: if (100 <= i && i <= 110) { int n = i - 100; config_set_d(CONFIG_SOUND_VOLUME, n); audio_volume(n, m); audio_play(AUD_BUMP, 1.f); gui_toggle(sound_id[n]); gui_toggle(sound_id[s]); } if (200 <= i && i <= 210) { int n = i - 200; config_set_d(CONFIG_MUSIC_VOLUME, n); audio_volume(s, n); audio_play(AUD_BUMP, 1.f); gui_toggle(music_id[n]); gui_toggle(music_id[m]); } } return r; }
static int display_action(int tok, int val) { int r = 1; audio_play(AUD_MENU, 1.0f); switch (tok) { case GUI_BACK: goto_state(display_back); display_back = NULL; break; case DISPLAY_SELECT: if (val != config_get_d(CONFIG_DISPLAY)) { goto_state(&st_null); config_set_d(CONFIG_DISPLAY, val); r = video_mode(config_get_d(CONFIG_FULLSCREEN), config_get_d(CONFIG_WIDTH), config_get_d(CONFIG_HEIGHT)); goto_state(&st_display); } break; } return r; }
static void stroke_leave(struct state *st, struct state *next, int id) { hud_free(); video_clr_grab(); config_set_d(CONFIG_CAMERA, 0); stroke_rotate = 0.0f; stroke_mag = 0.0f; }
static int stroke_enter(void) { hud_init(); game_clr_mag(); config_set_d(CONFIG_CAMERA, 2); video_set_grab(!paused); if (paused) paused = 0; return 0; }
static int stroke_enter(struct state *st, struct state *prev) { hud_init(); game_clr_mag(); config_set_d(CONFIG_CAMERA, 2); video_set_grab(1); if (paused) paused = 0; return 0; }
static int start_action(int tok, int val) { audio_play(AUD_MENU, 1.0f); switch (tok) { case GUI_BACK: return goto_state(&st_set); case START_CHALLENGE: if (config_cheat()) { progress_init(curr_mode() == MODE_CHALLENGE ? MODE_NORMAL : MODE_CHALLENGE); gui_toggle(challenge_id); return 1; } else { progress_init(MODE_CHALLENGE); return start_action(START_LEVEL, 0); } break; case GUI_SCORE: gui_score_set(val); start_over(gui_active(), 0); return 1; case START_LOCK_GOALS: config_set_d(CONFIG_LOCK_GOALS, val); return goto_state(&st_start); case START_LEVEL: if (progress_play(get_level(val))) return goto_state(&st_level); break; } return 1; }
void config_init(void) { int i; /* * Store index of each option in its associated config symbol and * initialise current values with defaults. */ for (i = 0; i < ARRAYSIZE(option_d); i++) { *option_d[i].sym = i; config_set_d(i, option_d[i].def); } for (i = 0; i < ARRAYSIZE(option_s); i++) { *option_s[i].sym = i; config_set_s(i, option_s[i].def); } }
static void set_camera(int c) { config_set_d(CONFIG_CAMERA, c); hud_cam_pulse(c); }
int main(int argc, char *argv[]) { int camera = 0; SDL_Joystick *joy = NULL; if (!fs_init(argv[0])) { fprintf(stderr, "Failure to initialize virtual file system (%s)\n", fs_error()); return 1; } srand((int) time(NULL)); opt_parse(argc, argv); config_paths(opt_data); log_init("Neverputt", "neverputt.log"); fs_mkdir("Screenshots"); /* Request backlight stay on (ubuntu touch) */ int dispreq = -1; DBusError err; dbus_error_init(&err); DBusConnection *conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err); if (dbus_error_is_set(&err)) { log_printf("Failed to get system bus\n"); dbus_error_free(&err); if (conn) { dbus_connection_unref(conn); conn = NULL; } } else { dbus_connection_set_exit_on_disconnect(conn, 0); DBusMessage *msg = dbus_message_new_method_call("com.canonical.Unity.Screen", "/com/canonical/Unity/Screen", "com.canonical.Unity.Screen", "keepDisplayOn"); if (msg != NULL) { DBusMessage *reply = dbus_connection_send_with_reply_and_block(conn, msg, 300, NULL); if (reply) { if (!dbus_message_get_args(reply, NULL, DBUS_TYPE_INT32, &dispreq, DBUS_TYPE_INVALID)) dispreq = -1; dbus_message_unref(reply); } dbus_message_unref(msg); } if (dispreq == -1) log_printf("Failed to request backlight stay on\n"); } if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) == 0) { config_init(); config_load(); /* Initialize localization. */ lang_init(); /* Cache Neverball's camera setting. */ camera = config_get_d(CONFIG_CAMERA); /* Initialize the joystick. */ if (config_get_d(CONFIG_JOYSTICK) && SDL_NumJoysticks() > 0) { joy = SDL_JoystickOpen(config_get_d(CONFIG_JOYSTICK_DEVICE)); if (joy) { SDL_JoystickEventState(SDL_ENABLE); set_joystick(joy); } } /* Initialize the audio. */ audio_init(); /* Initialize the video. */ if (video_init()) { int t1, t0 = SDL_GetTicks(); /* Material system. */ mtrl_init(); /* Run the main game loop. */ init_state(&st_null); if (opt_hole) { const char *path = fs_resolve(opt_hole); int loaded = 0; if (path) { hole_init(NULL); if (hole_load(0, path) && hole_load(1, path) && hole_goto(1, 1)) { goto_state(&st_next); loaded = 1; } } if (!loaded) goto_state(&st_title); } else goto_state(&st_title); while (loop()) if ((t1 = SDL_GetTicks()) > t0) { st_timer((t1 - t0) / 1000.f); hmd_step(); st_paint(0.001f * t1); video_swap(); t0 = t1; if (config_get_d(CONFIG_NICE)) SDL_Delay(1); } mtrl_quit(); } /* Restore Neverball's camera setting. */ config_set_d(CONFIG_CAMERA, camera); config_save(); /* Remove backlight request (ubuntu touch) */ if (conn) { if (dispreq != -1) { DBusMessage *msg = dbus_message_new_method_call("com.canonical.Unity.Screen", "/com/canonical/Unity/Screen", "com.canonical.Unity.Screen", "removeDisplayOnRequest"); dbus_message_append_args(msg, DBUS_TYPE_INT32, &dispreq, DBUS_TYPE_INVALID); if (msg != NULL) { if (dbus_connection_send(conn, msg, NULL)) dbus_connection_flush(conn); dbus_message_unref(msg); } } dbus_connection_close(conn); dbus_connection_unref(conn); dbus_shutdown(); } SDL_Quit(); } else log_printf("Failure to initialize SDL (%s)\n", SDL_GetError()); return 0; }
int video_mode(int f, int w, int h) { //senquack /* Enable standard application logging */ SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); SDL_LogSetAllPriority(SDL_LOG_PRIORITY_VERBOSE); int stereo = config_get_d(CONFIG_STEREO) ? 1 : 0; int stencil = config_get_d(CONFIG_REFLECTION) ? 1 : 0; int buffers = config_get_d(CONFIG_MULTISAMPLE) ? 1 : 0; int samples = config_get_d(CONFIG_MULTISAMPLE); int vsync = config_get_d(CONFIG_VSYNC) ? 1 : 0; int hmd = config_get_d(CONFIG_HMD) ? 1 : 0; int highdpi = config_get_d(CONFIG_HIGHDPI) ? 1 : 0; int dpy = config_get_d(CONFIG_DISPLAY); int X = SDL_WINDOWPOS_CENTERED_DISPLAY(dpy); int Y = SDL_WINDOWPOS_CENTERED_DISPLAY(dpy); hmd_free(); if (window) { SDL_GL_DeleteContext(context); SDL_DestroyWindow(window); } //senquack // SDL_GL_SetAttribute(SDL_GL_STEREO, stereo); //senquack - disabled drawing shadows and reflections on GCW Zero, don't need a stencil buffer: #ifdef GCWZERO SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 0); #endif //senquack - don't need or want these on GCW Zero: #ifndef GCWZERO SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, buffers); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, samples); #endif /* Require 16-bit double buffer with 16-bit depth buffer. */ //senquack - GCW Zero port change SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); // SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); // SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6); // SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); // SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0); // SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); //senquack SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); /* Try to set the currently specified mode. */ log_printf("Creating a window (%dx%d, %s)\n", w, h, (f ? "fullscreen" : "windowed")); //senquack DEBUG - DO NOT RUN - loads GLES2.0 for some reason // SDL_VideoInit(NULL); window = SDL_CreateWindow("", X, Y, w, h, SDL_WINDOW_OPENGL | (highdpi ? SDL_WINDOW_ALLOW_HIGHDPI : 0) | (f ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0)); if (window) { if ((context = SDL_GL_CreateContext(window))) { int buf, smp; SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buf); SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &smp); /* * Work around SDL+WGL returning pixel formats below * minimum specifications instead of failing, thus * bypassing our fallback path. SDL tries to ensure that * WGL plays by the rules, but forgets about extended * context attributes such as multisample. See SDL * Bugzilla #77. */ if (buf < buffers || smp < samples) { log_printf("GL context does not meet minimum specifications\n"); SDL_GL_DeleteContext(context); context = NULL; } } } if (window && context) { set_window_title(TITLE); set_window_icon(ICON); /* * SDL_GetWindowSize can be unreliable when going fullscreen * on OSX (and possibly elsewhere). We should really be * waiting for a resize / size change event, but for now we're * doing this lazy thing instead. */ if (f) { SDL_DisplayMode dm; if (SDL_GetDesktopDisplayMode(video_display(), &dm) == 0) { video.window_w = dm.w; video.window_h = dm.h; // //senquack dm.format = SDL_PIXELFORMAT_RGBA8888; // dm.format = SDL_PIXELFORMAT_RGB565; dm.w = 320; dm.h = 240; dm.refresh_rate = 60; dm.driverdata = 0; SDL_SetWindowDisplayMode(window, &dm); printf("setting new video dm..\n"); SDL_GetCurrentDisplayMode(0, &dm); SDL_Log("Screen w: %d h: %d\n", dm.w, dm.h); SDL_Log("Screen bpp: %d\n", SDL_BITSPERPIXEL(dm.format)); SDL_Log("Screen dm: "); SDL_Log("\n\n"); SDL_Log("Vendor : %s\n", glGetString(GL_VENDOR)); SDL_Log("Renderer : %s\n", glGetString(GL_RENDERER)); SDL_Log("Version : %s\n", glGetString(GL_VERSION)); SDL_Log("Extensions : %s\n", glGetString(GL_EXTENSIONS)); SDL_Log("\n"); fflush(NULL); } } else { SDL_GetWindowSize(window, &video.window_w, &video.window_h); } if (highdpi) { SDL_GL_GetDrawableSize(window, &video.device_w, &video.device_h); } else { video.device_w = video.window_w; video.device_h = video.window_h; } video.device_scale = (float) video.device_h / (float) video.window_h; log_printf("Created a window (%u, %dx%d, %s)\n", SDL_GetWindowID(window), video.window_w, video.window_h, (f ? "fullscreen" : "windowed")); config_set_d(CONFIG_DISPLAY, video_display()); config_set_d(CONFIG_FULLSCREEN, f); config_set_d(CONFIG_WIDTH, video.window_w); config_set_d(CONFIG_HEIGHT, video.window_h); SDL_GL_SetSwapInterval(vsync); if (!glext_init()) return 0; glViewport(0, 0, video.device_w, video.device_h); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glEnable(GL_NORMALIZE); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glEnable(GL_BLEND); #if !ENABLE_OPENGLES glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); #endif glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthFunc(GL_LEQUAL); /* If GL supports multisample, and SDL got a multisample buffer... */ if (glext_check("ARB_multisample")) { SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buffers); if (buffers) glEnable(GL_MULTISAMPLE); } /* Set up HMD display if requested. */ if (hmd) hmd_init(); /* Initialize screen snapshotting. */ snapshot_init(); video_show_cursor(); /* Grab input immediately in HMD mode. */ if (hmd_stat()) SDL_SetWindowGrab(window, SDL_TRUE); return 1; } /* If the mode failed, try it without stereo. */ else if (stereo) { config_set_d(CONFIG_STEREO, 0); return video_mode(f, w, h); } /* If the mode failed, try decreasing the level of multisampling. */ else if (buffers) { config_set_d(CONFIG_MULTISAMPLE, samples / 2); return video_mode(f, w, h); } /* If that mode failed, try it without reflections. */ else if (stencil) { config_set_d(CONFIG_REFLECTION, 0); return video_mode(f, w, h); } /* If THAT mode failed, punt. */ return 0; }
void config_clr_cheat(void) { config_set_d(CONFIG_CHEAT, 0); }
static int loop(void) { SDL_Event e; int d = 1; int ax, ay, dx, dy; /* Process SDL events. */ while (d && SDL_PollEvent(&e)) { switch (e.type) { case SDL_QUIT: return 0; case SDL_MOUSEMOTION: /* Convert to OpenGL coordinates. */ ax = +e.motion.x; ay = -e.motion.y + video.window_h; dx = +e.motion.xrel; dy = (config_get_d(CONFIG_MOUSE_INVERT) ? +e.motion.yrel : -e.motion.yrel); /* Convert to pixels. */ ax = ROUND(ax * video.device_scale); ay = ROUND(ay * video.device_scale); dx = ROUND(dx * video.device_scale); dy = ROUND(dy * video.device_scale); st_point(ax, ay, dx, dy); break; case SDL_MOUSEBUTTONDOWN: d = st_click(e.button.button, 1); break; case SDL_MOUSEBUTTONUP: d = st_click(e.button.button, 0); break; case SDL_KEYDOWN: d = handle_key_dn(&e); break; case SDL_KEYUP: d = handle_key_up(&e); break; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_FOCUS_LOST: if (video_get_grab()) goto_state(&st_pause); break; case SDL_WINDOWEVENT_MOVED: if (config_get_d(CONFIG_DISPLAY) != video_display()) config_set_d(CONFIG_DISPLAY, video_display()); break; case SDL_WINDOWEVENT_RESIZED: log_printf("Resize event (%u, %dx%d)\n", e.window.windowID, e.window.data1, e.window.data2); break; case SDL_WINDOWEVENT_SIZE_CHANGED: log_printf("Size change event (%u, %dx%d)\n", e.window.windowID, e.window.data1, e.window.data2); break; } break; case SDL_TEXTINPUT: text_input_str(e.text.text, 1); break; case SDL_JOYAXISMOTION: st_stick(e.jaxis.axis, JOY_VALUE(e.jaxis.value)); break; case SDL_JOYBUTTONDOWN: d = st_buttn(e.jbutton.button, 1); break; case SDL_JOYBUTTONUP: d = st_buttn(e.jbutton.button, 0); break; case SDL_MOUSEWHEEL: st_wheel(e.wheel.x, e.wheel.y); break; } } /* Process events via the tilt sensor API. */ if (tilt_stat()) { int b; int s; st_angle(tilt_get_x(), tilt_get_z()); while (tilt_get_button(&b, &s)) { const int X = config_get_d(CONFIG_JOYSTICK_AXIS_X0); const int Y = config_get_d(CONFIG_JOYSTICK_AXIS_Y0); const int L = config_get_d(CONFIG_JOYSTICK_DPAD_L); const int R = config_get_d(CONFIG_JOYSTICK_DPAD_R); const int U = config_get_d(CONFIG_JOYSTICK_DPAD_U); const int D = config_get_d(CONFIG_JOYSTICK_DPAD_D); if (b == L || b == R || b == U || b == D) { static int pad[4] = { 0, 0, 0, 0 }; /* Track the state of the D-pad buttons. */ if (b == L) pad[0] = s; else if (b == R) pad[1] = s; else if (b == U) pad[2] = s; else if (b == D) pad[3] = s; /* Convert D-pad button events into joystick axis motion. */ if (pad[0] && !pad[1]) st_stick(X, -1.0f); else if (pad[1] && !pad[0]) st_stick(X, +1.0f); else st_stick(X, 0.0f); if (pad[2] && !pad[3]) st_stick(Y, -1.0f); else if (pad[3] && !pad[2]) st_stick(Y, +1.0f); else st_stick(Y, 0.0f); } else d = st_buttn(b, s); } } return d; }
static int conf_video_action(int tok, int val) { int w = config_get_d(CONFIG_WIDTH); int h = config_get_d(CONFIG_HEIGHT); int r = 1; audio_play(AUD_MENU, 1.0f); switch (tok) { case GUI_BACK: goto_state(&st_conf); break; case CONF_VIDEO_FULLSCREEN: goto_state(&st_null); r = video_mode(val, w, h); goto_state(&st_conf_video); break; case CONF_VIDEO_REFLECTION: goto_state(&st_null); config_set_d(CONFIG_REFLECTION, val); if (val) { /* Ensure we have a stencil buffer. */ r = video_init(TITLE, ICON); } goto_state(&st_conf_video); break; case CONF_VIDEO_BACKGROUND: goto_state(&st_null); config_set_d(CONFIG_BACKGROUND, val); goto_state(&st_conf_video); break; case CONF_VIDEO_SHADOW: goto_state(&st_null); config_set_d(CONFIG_SHADOW, val); goto_state(&st_conf_video); break; case CONF_VIDEO_RESOLUTION: goto_state(&st_resol); break; case CONF_VIDEO_VSYNC: goto_state(&st_null); config_set_d(CONFIG_VSYNC, val); r = video_init(TITLE, ICON); goto_state(&st_conf_video); break; case CONF_VIDEO_HMD: goto_state(&st_null); config_set_d(CONFIG_HMD, val); r = video_init(TITLE, ICON); goto_state(&st_conf_video); break; case CONF_VIDEO_MULTISAMPLE: goto_state(&st_null); config_set_d(CONFIG_MULTISAMPLE, val); r = video_init(TITLE, ICON); goto_state(&st_conf_video); break; } return r; }
int video_mode(int f, int w, int h) { int stereo = config_get_d(CONFIG_STEREO) ? 1 : 0; int stencil = config_get_d(CONFIG_REFLECTION) ? 1 : 0; int buffers = config_get_d(CONFIG_MULTISAMPLE) ? 1 : 0; int samples = config_get_d(CONFIG_MULTISAMPLE); int vsync = config_get_d(CONFIG_VSYNC) ? 1 : 0; int hmd = config_get_d(CONFIG_HMD) ? 1 : 0; hmd_free(); SDL_GL_SetAttribute(SDL_GL_STEREO, stereo); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, stencil); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, buffers); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, samples); SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, vsync); /* Require 16-bit double buffer with 16-bit depth buffer. */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); /* Try to set the currently specified mode. */ if (SDL_SetVideoMode(w, h, 0, SDL_OPENGL | (f ? SDL_FULLSCREEN : 0))) { config_set_d(CONFIG_FULLSCREEN, f); config_set_d(CONFIG_WIDTH, w); config_set_d(CONFIG_HEIGHT, h); if (!glext_init()) return 0; glViewport(0, 0, w, h); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glEnable(GL_NORMALIZE); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glEnable(GL_BLEND); #if !ENABLE_OPENGLES glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); #endif glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthFunc(GL_LEQUAL); /* If GL supports multisample, and SDL got a multisample buffer... */ if (glext_check("ARB_multisample")) { SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buffers); if (buffers) glEnable(GL_MULTISAMPLE); } /* Attempt manual swap control if SDL's is broken. */ if (vsync && SDL_GL_GetAttribute(SDL_GL_SWAP_CONTROL, &vsync) == -1) sync_init(); /* Set up HMD display if requested. */ if (hmd) hmd_init(); /* Initialize screen snapshotting. */ snapshot_init(); video_show_cursor(); return 1; } /* If the mode failed, try it without stereo. */ else if (stereo) { config_set_d(CONFIG_STEREO, 0); return video_mode(f, w, h); } /* If the mode failed, try decreasing the level of multisampling. */ else if (buffers) { config_set_d(CONFIG_MULTISAMPLE, samples / 2); return video_mode(f, w, h); } /* If that mode failed, try it without reflections. */ else if (stencil) { config_set_d(CONFIG_REFLECTION, 0); return video_mode(f, w, h); } /* If THAT mode failed, punt. */ return 0; }
static void stroke_leave(int id) { hud_free(); video_clr_grab(); config_set_d(CONFIG_CAMERA, 0); }
static int loop(void) { SDL_Event e; int d = 1; int c; int ax, ay, dx, dy; while (d && SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) return 0; switch (e.type) { case SDL_MOUSEMOTION: /* Convert to OpenGL coordinates. */ ax = +e.motion.x; ay = -e.motion.y + video.window_h; dx = +e.motion.xrel; dy = -e.motion.yrel; /* Convert to pixels. */ ax = ROUND(ax * video.device_scale); ay = ROUND(ay * video.device_scale); dx = ROUND(dx * video.device_scale); dy = ROUND(dy * video.device_scale); st_point(ax, ay, dx, dy); break; case SDL_MOUSEBUTTONDOWN: d = st_click(e.button.button, 1); break; case SDL_MOUSEBUTTONUP: d = st_click(e.button.button, 0); break; case SDL_FINGERMOTION: case SDL_FINGERDOWN: case SDL_FINGERUP: /* Convert to OpenGL coordinates. */ if (video.device_orientation & VIDEO_ORIENTATION_ROTATE) { ax = e.tfinger.y * video.window_w; ay = e.tfinger.x * video.window_h; dx = e.tfinger.dy * video.window_w; dy = e.tfinger.dx * video.window_h; if (video.device_orientation & VIDEO_ORIENTATION_MIRROR) { ax = video.window_w - ax; ay = video.window_h - ay; dx *= -1; dy *= -1; } } else { ax = e.tfinger.x * video.window_w; ay = e.tfinger.y * video.window_h; dx = e.tfinger.dx * video.window_w; dy = e.tfinger.dy * video.window_h; if (video.device_orientation & VIDEO_ORIENTATION_MIRROR) { ax = video.window_w - ax; dx *= -1; } else { ay = video.window_h - ay; dy *= -1; } } /* Convert to pixels. */ ax = ROUND(ax * video.device_scale); ay = ROUND(ay * video.device_scale); dx = ROUND(dx * video.device_scale); dy = ROUND(dy * video.device_scale); st_point(ax, ay, dx, dy); if (e.type == SDL_FINGERDOWN) { d = st_click(SDL_BUTTON_LEFT, 1); } else if (e.type == SDL_FINGERUP) { d = st_click(SDL_BUTTON_LEFT, 0); st_point(0, 0, 0, 0); } break; case SDL_KEYDOWN: c = e.key.keysym.sym; #ifdef __APPLE__ if (c == SDLK_q && e.key.keysym.mod & KMOD_GUI) { d = 0; break; } #endif #ifdef _WIN32 if (c == SDLK_F4 && e.key.keysym.mod & KMOD_ALT) { d = 0; break; } #endif switch (c) { case KEY_SCREENSHOT: shot(); break; case KEY_FPS: config_tgl_d(CONFIG_FPS); break; case KEY_WIREFRAME: toggle_wire(); break; case SDLK_RETURN: case SDLK_KP_ENTER: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case SDLK_ESCAPE: if (video_get_grab()) d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_START), 1); else d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_B), 1); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), -1.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), +1.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), -1.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), +1.0f); else d = st_keybd(e.key.keysym.sym, 1); } break; case SDL_KEYUP: c = e.key.keysym.sym; switch (c) { case SDLK_RETURN: case SDLK_KP_ENTER: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 0); break; case SDLK_ESCAPE: if (video_get_grab()) d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_START), 0); else d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_B), 0); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), 0.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), 0.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), 0.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), 0.0f); else d = st_keybd(e.key.keysym.sym, 0); } break; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_FOCUS_LOST: if (video_get_grab()) goto_pause(&st_over); break; case SDL_WINDOWEVENT_MOVED: if (config_get_d(CONFIG_DISPLAY) != video_display()) config_set_d(CONFIG_DISPLAY, video_display()); break; } break; case SDL_JOYAXISMOTION: st_stick(e.jaxis.axis, JOY_VALUE(e.jaxis.value)); break; case SDL_JOYBUTTONDOWN: d = st_buttn(e.jbutton.button, 1); break; case SDL_JOYBUTTONUP: d = st_buttn(e.jbutton.button, 0); break; } } return d; }
int video_mode(int f, int w, int h) { int stereo = config_get_d(CONFIG_STEREO) ? 1 : 0; int stencil = config_get_d(CONFIG_REFLECTION) ? 1 : 0; int buffers = config_get_d(CONFIG_MULTISAMPLE) ? 1 : 0; int samples = config_get_d(CONFIG_MULTISAMPLE); #ifndef __PSP__ int vsync = config_get_d(CONFIG_VSYNC) ? 1 : 0; #endif SDL_GL_SetAttribute(SDL_GL_STEREO, stereo); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, stencil); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, buffers); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, samples); #ifndef __PSP__ SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, vsync); #endif /* Require 16-bit double buffer with 16-bit depth buffer. */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); /* Try to set the currently specified mode. */ if (SDL_SetVideoMode(w, h, 0, SDL_OPENGL | (f ? SDL_FULLSCREEN : 0))) { config_set_d(CONFIG_FULLSCREEN, f); config_set_d(CONFIG_WIDTH, w); config_set_d(CONFIG_HEIGHT, h); glViewport(0, 0, w, h); glClearColor(0.0f, 0.0f, 0.1f, 0.0f); glEnable(GL_NORMALIZE); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glEnable(GL_BLEND); glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); //glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); FIXME glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthFunc(GL_LEQUAL); /* If GL supports multisample, and SDL got a multisample buffer... */ #ifdef GL_ARB_multisample if (check_extension("ARB_multisample")) { SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buffers); if (buffers) glEnable(GL_MULTISAMPLE_ARB); } #endif glReadBuffer(GL_FRONT); return 1; } /* If the mode failed, try it without stereo. */ else if (stereo) { config_set_d(CONFIG_STEREO, 0); return video_mode(f, w, h); } /* If the mode failed, try decreasing the level of multisampling. */ else if (buffers) { config_set_d(CONFIG_MULTISAMPLE, samples / 2); return video_mode(f, w, h); } /* If that mode failed, try it without reflections. */ else if (stencil) { config_set_d(CONFIG_REFLECTION, 0); return video_mode(f, w, h); } /* If THAT mode failed, punt. */ return 0; }
int main(int argc, char *argv[]) { int camera = 0; SDL_Joystick *joy = NULL; if (!fs_init(argv[0])) { fprintf(stderr, "Failure to initialize virtual file system: %s\n", fs_error()); return 1; } srand((int) time(NULL)); lang_init("neverball"); opt_parse(argc, argv); config_paths(opt_data); fs_mkdir("Screenshots"); if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) == 0) { config_init(); config_load(); /* Cache Neverball's camera setting. */ camera = config_get_d(CONFIG_CAMERA); /* Initialize the joystick. */ if (config_get_d(CONFIG_JOYSTICK) && SDL_NumJoysticks() > 0) { joy = SDL_JoystickOpen(config_get_d(CONFIG_JOYSTICK_DEVICE)); if (joy) { SDL_JoystickEventState(SDL_ENABLE); set_joystick(joy); } } /* Initialize the audio. */ audio_init(); /* Initialize the video. */ if (video_init(TITLE, ICON)) { int t1, t0 = SDL_GetTicks(); /* Run the main game loop. */ init_state(&st_null); if (opt_hole) { const char *path = fs_resolve(opt_hole); int loaded = 0; if (path) { hole_init(NULL); if (hole_load(0, path) && hole_load(1, path) && hole_goto(1, 1)) { goto_state(&st_next); loaded = 1; } } if (!loaded) goto_state(&st_title); } else goto_state(&st_title); while (loop()) if ((t1 = SDL_GetTicks()) > t0) { st_timer((t1 - t0) / 1000.f); st_paint(0.001f * t1); shot_take(); SDL_GL_SwapWindow(video_get_window()); t0 = t1; if (config_get_d(CONFIG_NICE)) SDL_Delay(1); } } /* Restore Neverball's camera setting. */ config_set_d(CONFIG_CAMERA, camera); config_save(); SDL_Quit(); } else fprintf(stderr, "%s: %s\n", argv[0], SDL_GetError()); return 0; }
void config_load(void) { fs_file fh; if ((fh = fs_open(USER_CONFIG_FILE, "r"))) { char *line, *key, *val; while (read_line(&line, fh)) { if (scan_key_and_value(&key, &val, line)) { int i; /* Look up an integer option by that name. */ for (i = 0; i < ARRAYSIZE(option_d); i++) { if (strcmp(key, option_d[i].name) == 0) { /* Translate some strings to integers. */ if (i == CONFIG_MOUSE_CAMERA_1 || i == CONFIG_MOUSE_CAMERA_2 || i == CONFIG_MOUSE_CAMERA_3 || i == CONFIG_MOUSE_CAMERA_TOGGLE || i == CONFIG_MOUSE_CAMERA_L || i == CONFIG_MOUSE_CAMERA_R) { config_mouse(val, i); } else if (i == CONFIG_KEY_FORWARD || i == CONFIG_KEY_BACKWARD || i == CONFIG_KEY_LEFT || i == CONFIG_KEY_RIGHT || i == CONFIG_KEY_CAMERA_1 || i == CONFIG_KEY_CAMERA_2 || i == CONFIG_KEY_CAMERA_3 || i == CONFIG_KEY_CAMERA_TOGGLE || i == CONFIG_KEY_CAMERA_R || i == CONFIG_KEY_CAMERA_L || i == CONFIG_KEY_PAUSE || i == CONFIG_KEY_RESTART || i == CONFIG_KEY_SCORE_NEXT || i == CONFIG_KEY_ROTATE_FAST) { config_key(val, i); } else config_set_d(i, atoi(val)); /* Stop looking. */ break; } } /* Look up a string option by that name.*/ for (i = 0; i < ARRAYSIZE(option_s); i++) { if (strcmp(key, option_s[i].name) == 0) { config_set_s(i, val); break; } } } free(line); } fs_close(fh); dirty = 0; } }
static int video_action(int tok, int val) { int f = config_get_d(CONFIG_FULLSCREEN); int w = config_get_d(CONFIG_WIDTH); int h = config_get_d(CONFIG_HEIGHT); int r = 1; audio_play(AUD_MENU, 1.0f); switch (tok) { case GUI_BACK: goto_state(video_back); video_back = NULL; break; case VIDEO_FULLSCREEN: goto_state(&st_null); r = video_mode(val, w, h); goto_state(&st_video); break; case VIDEO_DISPLAY: goto_state(&st_display); break; case VIDEO_REFLECTION: goto_state(&st_null); config_set_d(CONFIG_REFLECTION, val); r = video_mode(f, w, h); goto_state(&st_video); break; case VIDEO_BACKGROUND: goto_state(&st_null); config_set_d(CONFIG_BACKGROUND, val); goto_state(&st_video); break; case VIDEO_SHADOW: goto_state(&st_null); config_set_d(CONFIG_SHADOW, val); goto_state(&st_video); break; case VIDEO_RESOLUTION: goto_state(&st_resol); break; case VIDEO_VSYNC: goto_state(&st_null); config_set_d(CONFIG_VSYNC, val); r = video_mode(f, w, h); goto_state(&st_video); break; case VIDEO_HMD: goto_state(&st_null); config_set_d(CONFIG_HMD, val); r = video_mode(f, w, h); goto_state(&st_video); break; case VIDEO_MULTISAMPLE: goto_state(&st_null); config_set_d(CONFIG_MULTISAMPLE, val); r = video_mode(f, w, h); goto_state(&st_video); break; } return r; }
void config_set_cheat(void) { config_set_d(CONFIG_CHEAT, 1); }
int video_mode(int f, int w, int h) { int stereo = config_get_d(CONFIG_STEREO) ? 1 : 0; int stencil = config_get_d(CONFIG_REFLECTION) ? 1 : 0; int buffers = config_get_d(CONFIG_MULTISAMPLE) ? 1 : 0; int samples = config_get_d(CONFIG_MULTISAMPLE); int vsync = config_get_d(CONFIG_VSYNC) ? 1 : 0; int hmd = config_get_d(CONFIG_HMD) ? 1 : 0; int highdpi = config_get_d(CONFIG_HIGHDPI) ? 1 : 0; int dpy = config_get_d(CONFIG_DISPLAY); int X = SDL_WINDOWPOS_CENTERED_DISPLAY(dpy); int Y = SDL_WINDOWPOS_CENTERED_DISPLAY(dpy); hmd_free(); if (window) { SDL_GL_DeleteContext(context); SDL_DestroyWindow(window); } #if ENABLE_OPENGLES SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); #endif SDL_GL_SetAttribute(SDL_GL_STEREO, stereo); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, stencil); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, buffers); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, samples); /* Require 16-bit double buffer with 16-bit depth buffer. */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); /* Try to set the currently specified mode. */ log_printf("Creating a window (%dx%d, %s)\n", w, h, (f ? "fullscreen" : "windowed")); window = SDL_CreateWindow("", X, Y, w, h, SDL_WINDOW_OPENGL | (highdpi ? SDL_WINDOW_ALLOW_HIGHDPI : 0) | (f ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0)); if (window) { if ((context = SDL_GL_CreateContext(window))) { int buf, smp; SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buf); SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &smp); /* * Work around SDL+WGL returning pixel formats below * minimum specifications instead of failing, thus * bypassing our fallback path. SDL tries to ensure that * WGL plays by the rules, but forgets about extended * context attributes such as multisample. See SDL * Bugzilla #77. */ if (buf < buffers || smp < samples) { log_printf("GL context does not meet minimum specifications\n"); SDL_GL_DeleteContext(context); context = NULL; } } } if (window && context) { set_window_title(TITLE); set_window_icon(ICON); /* * SDL_GetWindowSize can be unreliable when going fullscreen * on OSX (and possibly elsewhere). We should really be * waiting for a resize / size change event, but for now we're * doing this lazy thing instead. */ if (f) { SDL_DisplayMode dm; if (SDL_GetDesktopDisplayMode(video_display(), &dm) == 0) { video.window_w = dm.w; video.window_h = dm.h; } } else { SDL_GetWindowSize(window, &video.window_w, &video.window_h); } if (highdpi) { SDL_GL_GetDrawableSize(window, &video.device_w, &video.device_h); } else { video.device_w = video.window_w; video.device_h = video.window_h; } video.device_scale = (float) video.device_h / (float) video.window_h; log_printf("Created a window (%u, %dx%d, %s)\n", SDL_GetWindowID(window), video.window_w, video.window_h, (f ? "fullscreen" : "windowed")); config_set_d(CONFIG_DISPLAY, video_display()); config_set_d(CONFIG_FULLSCREEN, f); config_set_d(CONFIG_WIDTH, video.window_w); config_set_d(CONFIG_HEIGHT, video.window_h); SDL_GL_SetSwapInterval(vsync); if (!glext_init()) return 0; glViewport(0, 0, video.device_w, video.device_h); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glEnable(GL_NORMALIZE); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glEnable(GL_BLEND); #if !ENABLE_OPENGLES glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); #endif glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthFunc(GL_LEQUAL); /* If GL supports multisample, and SDL got a multisample buffer... */ if (glext_check("ARB_multisample")) { SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buffers); if (buffers) glEnable(GL_MULTISAMPLE); } /* Set up HMD display if requested. */ if (hmd) hmd_init(); /* Initialize screen snapshotting. */ snapshot_init(); video_show_cursor(); /* Grab input immediately in HMD mode. */ if (hmd_stat()) SDL_SetWindowGrab(window, SDL_TRUE); return 1; } /* If the mode failed, try it without stereo. */ else if (stereo) { config_set_d(CONFIG_STEREO, 0); return video_mode(f, w, h); } /* If the mode failed, try decreasing the level of multisampling. */ else if (buffers) { config_set_d(CONFIG_MULTISAMPLE, samples / 2); return video_mode(f, w, h); } /* If that mode failed, try it without reflections. */ else if (stencil) { config_set_d(CONFIG_REFLECTION, 0); return video_mode(f, w, h); } /* If THAT mode failed, punt. */ return 0; }
static int loop(void) { SDL_Event e; int d = 1; int c; while (d && SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) return 0; switch (e.type) { case SDL_MOUSEMOTION: st_point(+e.motion.x, -e.motion.y + config_get_d(CONFIG_HEIGHT), +e.motion.xrel, -e.motion.yrel); break; case SDL_MOUSEBUTTONDOWN: d = st_click(e.button.button, 1); break; case SDL_MOUSEBUTTONUP: d = st_click(e.button.button, 0); break; case SDL_KEYDOWN: c = e.key.keysym.sym; #ifdef __APPLE__ if (c == SDLK_q && e.key.keysym.mod & KMOD_GUI) { d = 0; break; } #endif #ifdef _WIN32 if (c == SDLK_F4 && e.key.keysym.mod & KMOD_ALT) { d = 0; break; } #endif switch (c) { case KEY_SCREENSHOT: shot(); break; case KEY_FPS: config_tgl_d(CONFIG_FPS); break; case KEY_WIREFRAME: toggle_wire(); break; case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case SDLK_ESCAPE: if (video_get_grab()) d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_START), 1); else d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_B), 1); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), -1.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), +1.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), -1.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), +1.0f); else d = st_keybd(e.key.keysym.sym, 1); } break; case SDL_KEYUP: c = e.key.keysym.sym; switch (c) { case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 0); break; case SDLK_ESCAPE: if (video_get_grab()) d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_START), 0); else d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_B), 0); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), 0.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), 0.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), 0.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), 0.0f); else d = st_keybd(e.key.keysym.sym, 0); } break; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_FOCUS_LOST: if (video_get_grab()) goto_pause(&st_over); break; case SDL_WINDOWEVENT_MOVED: if (config_get_d(CONFIG_DISPLAY) != video_display()) config_set_d(CONFIG_DISPLAY, video_display()); break; } break; case SDL_JOYAXISMOTION: st_stick(e.jaxis.axis, JOY_VALUE(e.jaxis.value)); break; case SDL_JOYBUTTONDOWN: d = st_buttn(e.jbutton.button, 1); break; case SDL_JOYBUTTONUP: d = st_buttn(e.jbutton.button, 0); break; } } return d; }
static int conf_action(int i) { int w = config_get_d(CONFIG_WIDTH); int h = config_get_d(CONFIG_HEIGHT); int s = config_get_d(CONFIG_SOUND_VOLUME); int m = config_get_d(CONFIG_MUSIC_VOLUME); int r = 1; audio_play(AUD_MENU, 1.0f); switch (i) { case CONF_FULL: goto_state(&st_null); r = video_mode(1, w, h); goto_state(&st_conf); break; case CONF_WIN: goto_state(&st_null); r = video_mode(0, w, h); goto_state(&st_conf); break; case CONF_TEXHI: goto_state(&st_null); config_set_d(CONFIG_TEXTURES, 1); goto_state(&st_conf); break; case CONF_TEXLO: goto_state(&st_null); config_set_d(CONFIG_TEXTURES, 2); goto_state(&st_conf); break; case CONF_SHDON: goto_state(&st_null); config_set_d(CONFIG_SHADOW, 1); goto_state(&st_conf); break; case CONF_SHDOF: goto_state(&st_null); config_set_d(CONFIG_SHADOW, 0); goto_state(&st_conf); break; case CONF_BACK: goto_state(&st_title); break; case CONF_RESOL: goto_state(&st_resol); break; default: if (100 <= i && i <= 110) { int n = i - 100; config_set_d(CONFIG_SOUND_VOLUME, n); audio_volume(n, m); audio_play(AUD_BUMP, 1.f); gui_toggle(sound_id[n]); gui_toggle(sound_id[s]); } if (200 <= i && i <= 210) { int n = i - 200; config_set_d(CONFIG_MUSIC_VOLUME, n); audio_volume(s, n); audio_play(AUD_BUMP, 1.f); gui_toggle(music_id[n]); gui_toggle(music_id[m]); } } return r; }
int video_mode(int f, int w, int h) { int stereo = config_get_d(CONFIG_STEREO) ? 1 : 0; int stencil = config_get_d(CONFIG_REFLECTION) ? 1 : 0; int buffers = config_get_d(CONFIG_MULTISAMPLE) ? 1 : 0; int samples = config_get_d(CONFIG_MULTISAMPLE); int vsync = config_get_d(CONFIG_VSYNC) ? 1 : 0; int hmd = config_get_d(CONFIG_HMD) ? 1 : 0; int dpy = config_get_d(CONFIG_DISPLAY); int X = SDL_WINDOWPOS_CENTERED_DISPLAY(dpy); int Y = SDL_WINDOWPOS_CENTERED_DISPLAY(dpy); hmd_free(); if (window) { SDL_GL_DeleteContext(context); SDL_DestroyWindow(window); } SDL_GL_SetAttribute(SDL_GL_STEREO, stereo); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, stencil); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, buffers); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, samples); /* Require 16-bit double buffer with 16-bit depth buffer. */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); /* Try to set the currently specified mode. */ window = SDL_CreateWindow("", X, Y, w, h, SDL_WINDOW_OPENGL | (f ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0)); if (window) { set_window_title(TITLE); set_window_icon(ICON); SDL_GetWindowSize(window, &w, &h); config_set_d(CONFIG_DISPLAY, video_display()); config_set_d(CONFIG_FULLSCREEN, f); config_set_d(CONFIG_WIDTH, w); config_set_d(CONFIG_HEIGHT, h); context = SDL_GL_CreateContext(window); SDL_GL_SetSwapInterval(vsync); if (!glext_init()) return 0; glViewport(0, 0, w, h); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glEnable(GL_NORMALIZE); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glEnable(GL_BLEND); #if !ENABLE_OPENGLES glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); #endif glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthFunc(GL_LEQUAL); /* If GL supports multisample, and SDL got a multisample buffer... */ if (glext_check("ARB_multisample")) { SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buffers); if (buffers) glEnable(GL_MULTISAMPLE); } /* Set up HMD display if requested. */ if (hmd) hmd_init(); /* Initialize screen snapshotting. */ snapshot_init(); video_show_cursor(); /* Grab input immediately in HMD mode. */ if (hmd_stat()) SDL_SetWindowGrab(window, SDL_TRUE); return 1; } /* If the mode failed, try it without stereo. */ else if (stereo) { config_set_d(CONFIG_STEREO, 0); return video_mode(f, w, h); } /* If the mode failed, try decreasing the level of multisampling. */ else if (buffers) { config_set_d(CONFIG_MULTISAMPLE, samples / 2); return video_mode(f, w, h); } /* If that mode failed, try it without reflections. */ else if (stencil) { config_set_d(CONFIG_REFLECTION, 0); return video_mode(f, w, h); } /* If THAT mode failed, punt. */ return 0; }