From 14a089aaeece63cab47f85322dd4cd928aee7746 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 15 Apr 2014 01:26:40 -0400 Subject: [PATCH] Overhaul the game's "rendering pipeline", simplifying it a fair bit - Also significantly improves performance --- osx/boe.actions.cpp | 12 ++-- osx/boe.dlgutil.cpp | 8 ++- osx/boe.fileio.cpp | 2 +- osx/boe.graphics.cpp | 136 ++++++++++------------------------------ osx/boe.graphics.h | 16 +++-- osx/boe.items.cpp | 7 --- osx/boe.main.cpp | 26 +------- osx/boe.party.cpp | 6 +- osx/boe.text.cpp | 17 +---- osx/boe.town.cpp | 2 +- osx/tools/graphtool.cpp | 4 +- osx/tools/graphtool.h | 2 +- 12 files changed, 64 insertions(+), 174 deletions(-) diff --git a/osx/boe.actions.cpp b/osx/boe.actions.cpp index e60c8e29..9c523b77 100644 --- a/osx/boe.actions.cpp +++ b/osx/boe.actions.cpp @@ -651,7 +651,7 @@ bool handle_action(sf::Event event) center = univ.town.p_loc; //put_pc_screen(); set_stat_window(current_pc); - redraw_screen(); + redraw_screen(REFRESH_TERRAIN | REFRESH_TEXT); play_sound(93); need_reprint = true; need_redraw = true; @@ -1794,7 +1794,7 @@ bool handle_keystroke(sf::Event& event){ clear_map(); add_string_to_buf("Debug: Reunite party and leave town."); print_buf(); - redraw_screen(); + redraw_screen(REFRESH_ALL); break; case 'C': @@ -1943,7 +1943,7 @@ bool handle_keystroke(sf::Event& event){ position_party(scenario.out_sec_start.x,scenario.out_sec_start.y, scenario.out_start.x,scenario.out_start.y); center = univ.town.p_loc = scenario.where_start; - redraw_screen(); + redraw_screen(REFRESH_ALL); add_string_to_buf("Debug: You return to the start."); print_buf(); break; @@ -2199,11 +2199,7 @@ void do_save(short mode) pause(6); -// initiate_redraw(); -// put_pc_screen(); -// put_item_screen(stat_window,0); -// print_buf(); - redraw_screen(); + redraw_screen(REFRESH_TEXT); } void increase_age()//// diff --git a/osx/boe.dlgutil.cpp b/osx/boe.dlgutil.cpp index 2a84a22c..8b981f35 100644 --- a/osx/boe.dlgutil.cpp +++ b/osx/boe.dlgutil.cpp @@ -185,8 +185,9 @@ void end_shop_mode() stat_screen_mode = 0; put_item_screen(stat_window,0); put_pc_screen(); - //refresh_screen(0); - redraw_screen(); + //refresh_screen(0); + // TODO: I suspect REFRESH_NONE will suffice here + redraw_screen(REFRESH_TERRAIN | REFRESH_BAR); } void handle_shop_event(location p) @@ -564,7 +565,8 @@ void end_talk_mode() put_item_screen(stat_window,0); put_pc_screen(); //refresh_screen(0); - redraw_screen(); + // TODO: I suspect REFRESH_NONE will suffice here + redraw_screen(REFRESH_TERRAIN | REFRESH_BAR); } void handle_talk_event(location p) diff --git a/osx/boe.fileio.cpp b/osx/boe.fileio.cpp index a3cef92f..0ec94299 100644 --- a/osx/boe.fileio.cpp +++ b/osx/boe.fileio.cpp @@ -214,7 +214,7 @@ void finish_load_party(){ center = univ.town.p_loc; } - redraw_screen(); + redraw_screen(REFRESH_ALL); current_pc = first_active_pc(); loaded_yet = true; diff --git a/osx/boe.graphics.cpp b/osx/boe.graphics.cpp index 28339e85..0d6acb0b 100644 --- a/osx/boe.graphics.cpp +++ b/osx/boe.graphics.cpp @@ -193,7 +193,6 @@ void adjust_window_mode() } } - redraw_screen(); if (text_sbar != NULL) { text_sbar->relocate({ul.x + 546,ul.y + 283}); item_sbar->relocate({ul.x + 546,ul.y + 146}); @@ -266,26 +265,6 @@ void plop_fancy_startup() if(display_mode != 5) showMenuBar(); } -void fancy_startup_delay() -{ - // OK try this ... destroy and recreate window. - /*DisposeWindow(mainPtr); - mainPtr = GetNewCWindow(128,NULL,IN_FRONT); - SetPort(mainPtr); /* set window to current graf port - text_sbar = NewControl(mainPtr,&sbar_rect,tit,false,58,0,58,scrollBarProc,1); - item_sbar = NewControl(mainPtr,&item_sbar_rect,tit,false,0,0,16,scrollBarProc,2); - shop_sbar = NewControl(mainPtr,&shop_sbar_rect,tit,false,0,0,16,scrollBarProc,3); - adjust_window_mode(); - RestoreDeviceClut(GetMainDevice()); */ - - // TODO: This probably isn't needed here? - TEXT.style = sf::Text::Regular; - - draw_startup(0); - - flushingInput = true; -} - void init_startup() { startup_loaded = true; @@ -311,15 +290,6 @@ void draw_startup(short but_type) if (startup_loaded == false) return; -// r1.bottom = ul.x + 5; -// tileImage(mainPtr, r1,bg_gworld,bg[4]); -// r2.right = ul.y - 13; -// tileImage(mainPtr, r2,bg_gworld,bg[4]); -// r3.top += ul.x + 5; -// tileImage(mainPtr, r3,bg_gworld,bg[4]); -// r4.left += ul.y - 13; -// tileImage(mainPtr, r4,bg_gworld,bg[4]); - tileImage(mainPtr, windRect, bg_gworld, bg[4]); to_rect = startup_from[0]; to_rect.offset(-13,5); rect_draw_some_item(startup_gworld,startup_from[0],to_rect,ul); @@ -643,68 +613,39 @@ void set_gworld_fonts(short font_num) #endif } -void draw_main_screen() -{ - // TODO: If this is called during MODE_TALKING, it's done from the wrong place. It's not called from redraw_screen during MODE_TALKING. - if (overall_mode == MODE_TALKING) { - put_background(); - } - else { -// rect_draw_some_item(terrain_screen_gworld.getTexture(), win_from_rects[0], win_to_rects[0],ul); - - draw_buttons(0); - if (overall_mode == MODE_COMBAT) - draw_pcs(pc_pos[current_pc],1); - if (overall_mode == MODE_FANCY_TARGET) - draw_targets(center); - } - draw_text_area(0); - text_sbar->show(); - text_sbar->draw(); - item_sbar->show(); - item_sbar->draw(); - if (overall_mode == MODE_SHOPPING) { - shop_sbar->show(); - shop_sbar->draw(); - } - else shop_sbar->hide(); -} - -// redraw_screen does the very first redraw, and any full redraw -void redraw_screen(){ +void redraw_screen(int refresh) { + // We may need to update some of the offscreen textures + if(refresh & REFRESH_TERRAIN) draw_terrain(1); + if(refresh & REFRESH_STATS) put_pc_screen(); + if(refresh & REFRESH_INVEN) put_item_screen(stat_window, 0); + if(refresh & REFRESH_TRANS) print_buf(); + put_background(); - if(overall_mode == MODE_STARTUP) - draw_startup(0); - else{ - switch (overall_mode) { - case MODE_TALKING: - refresh_talking(); - break; - case MODE_SHOPPING: - refresh_shopping(); - break; - default: - draw_main_screen(); - draw_terrain(0); - draw_text_bar(1); - if (overall_mode == MODE_COMBAT) - draw_pcs(pc_pos[current_pc],1); - if (overall_mode == MODE_FANCY_TARGET) - draw_targets(center); - break; - } - put_pc_screen(); - put_item_screen(stat_window,0); - print_buf(); - text_sbar->show(); + switch(overall_mode) { + case MODE_STARTUP: + draw_startup(0); + break; + case MODE_TALKING: + refresh_talking(); + break; + case MODE_SHOPPING: + refresh_shopping(); + break; + default: + redraw_terrain(); + draw_text_bar(bool(refresh & REFRESH_BAR)); + draw_buttons(0); + break; + } + if(overall_mode == MODE_COMBAT) + draw_pcs(pc_pos[current_pc],1); + if(overall_mode == MODE_FANCY_TARGET) + draw_targets(center); + if(overall_mode != MODE_STARTUP) { + refresh_stat_areas(0); text_sbar->draw(); - item_sbar->show(); item_sbar->draw(); - if (overall_mode == MODE_SHOPPING) { - shop_sbar->show(); - shop_sbar->draw(); - } - else shop_sbar->hide(); + shop_sbar->draw(); } } @@ -712,7 +653,9 @@ void put_background() { RECT bg_pict; - if (is_out()) { + if(overall_mode == MODE_STARTUP) + bg_pict = bg[4]; + else if(is_out()) { if (univ.party.outdoor_corner.x >= 7) bg_pict = bg[0]; else bg_pict = bg[10]; @@ -733,10 +676,6 @@ void put_background() else bg_pict = bg[13]; } tileImage(mainPtr, RECT(mainPtr), bg_gworld, bg_pict); - text_sbar->show(); - text_sbar->draw(); - item_sbar->show(); - item_sbar->draw(); } void draw_buttons(short mode) @@ -772,15 +711,6 @@ void draw_buttons(short mode) // ForeColor(blackColor); } -// In general, refreshes any area that has text in it, the stat areas, the text bar -void draw_text_area(short mode) -//short mode unused -{ - refresh_stat_areas(0); - - draw_text_bar(0); -} - void reset_text_bar() { remember_tiny_text = 300; diff --git a/osx/boe.graphics.h b/osx/boe.graphics.h index 6771a73f..4f5ba647 100644 --- a/osx/boe.graphics.h +++ b/osx/boe.graphics.h @@ -1,9 +1,19 @@ #include +enum { + REFRESH_NONE = 0, + REFRESH_TERRAIN = 1 << 0, + REFRESH_STATS = 1 << 1, + REFRESH_INVEN = 1 << 2, + REFRESH_TRANS = 1 << 3, + REFRESH_BAR = 1 << 4, + REFRESH_TEXT = REFRESH_BAR | REFRESH_TRANS, + REFRESH_ALL = 0x1f +}; + void adjust_window_mode(); void plop_fancy_startup(); -void fancy_startup_delay(); void init_startup(); void reload_startup(); void init_animation(); @@ -18,11 +28,9 @@ void end_startup(); void Set_up_win (); void load_main_screen(); void set_gworld_fonts(short font_num); -void redraw_screen(); +void redraw_screen(int refresh); void put_background(); -void draw_main_screen(); void draw_buttons(short mode); -void draw_text_area(short mode); void reset_text_bar(); void draw_text_bar(short mode); void put_text_bar(char *str); diff --git a/osx/boe.items.cpp b/osx/boe.items.cpp index 9c7b51a6..ed0a6382 100644 --- a/osx/boe.items.cpp +++ b/osx/boe.items.cpp @@ -1108,8 +1108,6 @@ short custom_choice_dialog(std::array& strs,short pic_num,ePicTy cThreeChoice customDialog(vec, buttons, pic_num, pic_type); std::string item_hit = customDialog.show(); - redraw_screen(); - for(int i = 0; i < 3; i++) { cBasicButtonType& btn = basic_buttons[available_btns[i]]; if(btn && item_hit == btn->label) @@ -1191,11 +1189,6 @@ short char_select_pc(short active_only,short free_inv_only,const char *title) selectPc.run(); item_hit = selectPc.getResult(); - if(overall_mode != MODE_STARTUP) - //refresh_screen(0); - redraw_screen(); - else draw_startup(0); - return item_hit; } diff --git a/osx/boe.main.cpp b/osx/boe.main.cpp index 28b9d20f..e0e6e1fb 100644 --- a/osx/boe.main.cpp +++ b/osx/boe.main.cpp @@ -161,7 +161,7 @@ int main(void) init_menubar(); // Do this first of all because otherwise a default File and Window menu will be seen Initialize(); init_fileio(); - init_graph_tool(redraw_screen); + init_graph_tool(); Set_Window_Drag_Bdry(); @@ -184,7 +184,7 @@ int main(void) //PSD[SDF_GAME_SPEED] = 1; //init_anim(0); - fancy_startup_delay(); + flushingInput = true; init_spell_menus(); @@ -456,27 +456,7 @@ bool handle_dialog_event() void Handle_Update() { - if(overall_mode == MODE_STARTUP) { - /*if (first_startup_update == true) - first_startup_update = false; - else*/ draw_startup(0); -/* if (first_sound_played == false) { - play_sound(22); - first_sound_played = true; - } */ - } - else { - if (first_update == true) { - first_update = false; - if (overall_mode == MODE_OUTDOORS) - redraw_screen(); - if ((overall_mode > MODE_OUTDOORS) & (overall_mode < MODE_COMBAT)) - redraw_screen(); - // 1st update never combat - } - else //refresh_screen(0); - redraw_screen(); - } + redraw_screen(REFRESH_NONE); if(map_visible) draw_map(false); else mini_map.setVisible(false); diff --git a/osx/boe.party.cpp b/osx/boe.party.cpp index d37285c6..f660ccca 100644 --- a/osx/boe.party.cpp +++ b/osx/boe.party.cpp @@ -522,9 +522,7 @@ void put_party_in_scen(std::string scen_name) center = scenario.where_start; update_explored(scenario.where_start); overall_mode = MODE_TOWN; - redraw_screen(); - // TODO: Maybe I should just be calling mainPtr.display() in redraw_screen()... - mainPtr.display(); + redraw_screen(REFRESH_ALL); set_stat_window(0); adjust_spell_menus(); adjust_monst_menu(); @@ -1725,7 +1723,7 @@ void do_priest_spell(short pc_num,short spell_num) //// // overall_mode = MODE_OUTDOORS; // center = univ.party.p_loc; // update_explored(univ.party.p_loc); - redraw_screen(); + redraw_screen(REFRESH_ALL); break; case 1: case 20: case 39: case 2: case 11: case 27: case 28: case 36: case 19: case 24: diff --git a/osx/boe.text.cpp b/osx/boe.text.cpp index 8c98c2d2..65904ae3 100644 --- a/osx/boe.text.cpp +++ b/osx/boe.text.cpp @@ -224,13 +224,7 @@ void put_pc_screen() pc_area_button_active[i][j] = 0; } } - // Now put text on window. - mainPtr.setActive(); - to_draw_rect = RECT(pc_stats_gworld); - RECT oldRect = to_draw_rect; - to_draw_rect.offset(PC_WIN_UL_X,PC_WIN_UL_Y); - pc_stats_gworld.display(); // TODO: I think displaying is necessary before accessing the texture...? - rect_draw_some_item(pc_stats_gworld.getTexture(), oldRect, to_draw_rect,ul); + pc_stats_gworld.display(); // Sometimes this gets called when character is slain. when that happens, if items for // that PC are up, switch item page. @@ -385,15 +379,6 @@ void put_item_screen(short screen_num,short suppress_buttons) place_item_bottom_buttons(); item_stats_gworld.display(); - - // Now put text on window. - mainPtr.setActive(); - - for (i = 0; i < 3; i++) { - dest_rect = parts_of_area_to_draw[i]; - dest_rect.offset(ITEM_WIN_UL_X,ITEM_WIN_UL_Y); - rect_draw_some_item(item_stats_gworld.getTexture(), parts_of_area_to_draw[i], dest_rect,ul); - } } void place_buy_button(short position,short pc_num,short item_num) diff --git a/osx/boe.town.cpp b/osx/boe.town.cpp index 13666b9e..48c8c4a5 100644 --- a/osx/boe.town.cpp +++ b/osx/boe.town.cpp @@ -695,7 +695,7 @@ location end_town_mode(short switching_level,location destination) // returns n update_explored(to_return); - redraw_screen(); + redraw_screen(REFRESH_TERRAIN | REFRESH_TEXT); } diff --git a/osx/tools/graphtool.cpp b/osx/tools/graphtool.cpp index b451540a..e2cadce6 100644 --- a/osx/tools/graphtool.cpp +++ b/osx/tools/graphtool.cpp @@ -27,7 +27,6 @@ CursorRef cursors[24] = { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, }; -void (*redraw_screen)(); RECT bg[21]; RECT map_pat[30]; RECT bw_pats[6]; @@ -44,8 +43,7 @@ void clean_up_graphtool(){ CleanUp(); } -void init_graph_tool(void (*redraw_callback)()){ - redraw_screen = redraw_callback; +void init_graph_tool(){ int i,j; // TODO: The duplication of location here shouldn't be necessary // TODO: Store the hotspots on disk instead of hardcoded here diff --git a/osx/tools/graphtool.h b/osx/tools/graphtool.h index 73cd37df..3065c5e9 100644 --- a/osx/tools/graphtool.h +++ b/osx/tools/graphtool.h @@ -94,7 +94,7 @@ struct cCustomGraphics { -void init_graph_tool(void (*redraw_callback)()); +void init_graph_tool(); void clean_up_graphtool(); void set_cursor(cursor_type which_curs); void restore_cursor();