From a2bdb631493b9b0d3a8eab33d31037c5aa85faf1 Mon Sep 17 00:00:00 2001 From: zicodxx Date: Wed, 20 Jul 2011 14:44:46 +0200 Subject: [PATCH] Added Polygon model viewer and GameBitmaps viewer in non-Release build for debugging, messing around, DXX-Redrawn, etc. --- CHANGELOG.txt | 4 + main/menu.c | 222 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 226 insertions(+) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 5c3f85ef3..a8cf1462e 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,9 @@ D1X-Rebirth Changelog +20110720 +-------- +main/menu: Added Polygon model viewer and GameBitmaps viewer in non-Release build for debugging, messing around, DXX-Redrawn, etc. + 20110719 -------- main/net_udp.c: Properly call multi_leave_game() when host leaves multi game to let clients exit smoothly diff --git a/main/menu.c b/main/menu.c index e9172a327..7ddd59ae3 100644 --- a/main/menu.c +++ b/main/menu.c @@ -114,6 +114,9 @@ enum MENUS MENU_START_KALI_NETGAME, // xKali support (not Windows Kali! Windows Kali is over IPX!) MENU_JOIN_KALI_NETGAME, #endif + #ifndef RELEASE + MENU_SANDBOX + #endif }; //ADD_ITEM("Start netgame...", MENU_START_NETGAME, -1 ); @@ -127,6 +130,9 @@ static window *menus[16] = { NULL }; int do_option(int select); int do_new_game_menu(void); void do_multi_player_menu(); +#ifndef RELEASE +void do_sandbox_menu(); +#endif extern void newmenu_free_background(); extern void ReorderPrimary(); extern void ReorderSecondary(); @@ -499,6 +505,7 @@ void create_main_menu(newmenu_item *m, int *menu_choice, int *callers_num_option ADD_ITEM(" Editor", MENU_EDITOR, KEY_E); #endif } + ADD_ITEM(" SANDBOX", MENU_SANDBOX, -1); #endif *callers_num_options = num_options; @@ -632,6 +639,11 @@ int do_option ( int select) songs_stop_all(); credits_show(NULL); break; +#ifndef RELEASE + case MENU_SANDBOX: + do_sandbox_menu(); + break; +#endif default: Error("Unknown option %d in do_option",select); break; @@ -1994,3 +2006,213 @@ void do_options_menu() // Allows clean closing and re-opening when resolution changes newmenu_do3( NULL, TXT_OPTIONS, 10, m, options_menuset, NULL, 0, NULL ); } + +#ifndef RELEASE +int polygon_models_viewer_handler(window *wind, d_event *event) +{ + static int view_idx = 0; + int key = 0; + static vms_angvec ang; + + switch (event->type) + { + case EVENT_WINDOW_ACTIVATED: + key_toggle_repeat(1); + view_idx = 0; + ang.p = ang.b = 0; + ang.h = F1_0/2; + break; + case EVENT_KEY_COMMAND: + key = event_key_get(event); + switch (key) + { + case KEY_ESC: + window_close(wind); + break; + case KEY_SPACEBAR: + view_idx ++; + if (view_idx >= N_polygon_models) view_idx = 0; + break; + case KEY_BACKSP: + view_idx --; + if (view_idx < 0 ) view_idx = N_polygon_models - 1; + break; + case KEY_A: + ang.h -= 100; + break; + case KEY_D: + ang.h += 100; + break; + case KEY_W: + ang.p -= 100; + break; + case KEY_S: + ang.p += 100; + break; + case KEY_Q: + ang.b -= 100; + break; + case KEY_E: + ang.b += 100; + break; + case KEY_R: + ang.p = ang.b = 0; + ang.h = F1_0/2; + break; + default: + break; + } + return 1; + case EVENT_WINDOW_DRAW: + timer_delay(F1_0/60); + draw_model_picture(view_idx, &ang); + gr_set_curfont(GAME_FONT); + gr_set_fontcolor(BM_XRGB(255,255,255), -1); + gr_printf(FSPACX(1), FSPACY(1), "ESC: leave\nSPACE/BACKSP: next/prev model (%i/%i)\nA/D: rotate y\nW/S: rotate x\nQ/E: rotate z\nR: reset orientation",view_idx,N_polygon_models-1); + break; + case EVENT_WINDOW_CLOSE: + key_toggle_repeat(0); + break; + default: + break; + } + + return 0; +} + +void polygon_models_viewer() +{ + window *wind = window_create(&grd_curscreen->sc_canvas, 0, 0, SWIDTH, SHEIGHT, (int (*)(window *, d_event *, void *))polygon_models_viewer_handler, NULL); + if (!wind) + { + d_event event = { EVENT_WINDOW_CLOSE }; + polygon_models_viewer_handler(NULL, &event); + return; + } + + while (window_exists(wind)) + event_process(); +} + +int gamebitmaps_viewer_handler(window *wind, d_event *event) +{ + static int view_idx = 0; + int key = 0; +#ifdef OGL + float scale = 1.0; +#endif + bitmap_index bi; + grs_bitmap *bm; + extern int Num_bitmap_files; + + switch (event->type) + { + case EVENT_WINDOW_ACTIVATED: + key_toggle_repeat(1); + view_idx = 0; + break; + case EVENT_KEY_COMMAND: + key = event_key_get(event); + switch (key) + { + case KEY_ESC: + window_close(wind); + break; + case KEY_SPACEBAR: + view_idx ++; + if (view_idx >= Num_bitmap_files) view_idx = 0; + break; + case KEY_BACKSP: + view_idx --; + if (view_idx < 0 ) view_idx = Num_bitmap_files - 1; + break; + default: + break; + } + return 1; + case EVENT_WINDOW_DRAW: + bi.index = view_idx; + bm = &GameBitmaps[view_idx]; + timer_delay(F1_0/60); + PIGGY_PAGE_IN(bi); + gr_clear_canvas( BM_XRGB(0,0,0) ); +#ifdef OGL + scale = (bm->bm_w > bm->bm_h)?(SHEIGHT/bm->bm_w)*0.8:(SHEIGHT/bm->bm_h)*0.8; + ogl_ubitmapm_cs((SWIDTH/2)-(bm->bm_w*scale/2),(SHEIGHT/2)-(bm->bm_h*scale/2),bm->bm_w*scale,bm->bm_h*scale,bm,-1,F1_0); +#else + gr_bitmap((SWIDTH/2)-(bm->bm_w/2), (SHEIGHT/2)-(bm->bm_h/2), bm); +#endif + gr_set_curfont(GAME_FONT); + gr_set_fontcolor(BM_XRGB(255,255,255), -1); + gr_printf(FSPACX(1), FSPACY(1), "ESC: leave\nSPACE/BACKSP: next/prev bitmap (%i/%i)",view_idx,Num_bitmap_files-1); + break; + case EVENT_WINDOW_CLOSE: + key_toggle_repeat(0); + break; + default: + break; + } + + return 0; +} + +void gamebitmaps_viewer() +{ + window *wind = window_create(&grd_curscreen->sc_canvas, 0, 0, SWIDTH, SHEIGHT, (int (*)(window *, d_event *, void *))gamebitmaps_viewer_handler, NULL); + if (!wind) + { + d_event event = { EVENT_WINDOW_CLOSE }; + gamebitmaps_viewer_handler(NULL, &event); + return; + } + + while (window_exists(wind)) + event_process(); +} + +int sandbox_menuset(newmenu *menu, d_event *event, void *userdata) +{ + switch (event->type) + { + case EVENT_NEWMENU_CHANGED: + break; + + case EVENT_NEWMENU_SELECTED: + switch(newmenu_get_citem(menu)) + { + case 0: polygon_models_viewer(); break; + case 1: gamebitmaps_viewer(); break; + } + return 1; // stay in menu until escape + break; + + case EVENT_WINDOW_CLOSE: + { + newmenu_item *items = newmenu_get_items(menu); + d_free(items); + break; + } + + default: + break; + } + + userdata = userdata; //kill warning + + return 0; +} + +void do_sandbox_menu() +{ + newmenu_item *m; + + MALLOC(m, newmenu_item, 2); + if (!m) + return; + + m[ 0].type = NM_TYPE_MENU; m[ 0].text="Polygon_models viewer"; + m[ 1].type = NM_TYPE_MENU; m[ 1].text="GameBitmaps viewer"; + + newmenu_do3( NULL, "Coder's sandbox", 2, m, sandbox_menuset, NULL, 0, NULL ); +} +#endif \ No newline at end of file