Overhaul the game's "rendering pipeline", simplifying it a fair bit

- Also significantly improves performance
This commit is contained in:
2014-04-15 01:26:40 -04:00
parent 3274864f12
commit 14a089aaee
12 changed files with 64 additions and 174 deletions

View File

@@ -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()////

View File

@@ -186,7 +186,8 @@ void end_shop_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_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)

View File

@@ -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;

View File

@@ -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,40 +613,18 @@ 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);
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();
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(){
put_background();
if(overall_mode == MODE_STARTUP)
switch(overall_mode) {
case MODE_STARTUP:
draw_startup(0);
else{
switch (overall_mode) {
break;
case MODE_TALKING:
refresh_talking();
break;
@@ -684,35 +632,30 @@ void redraw_screen(){
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);
redraw_terrain();
draw_text_bar(bool(refresh & REFRESH_BAR));
draw_buttons(0);
break;
}
put_pc_screen();
put_item_screen(stat_window,0);
print_buf();
text_sbar->show();
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();
}
}
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;

View File

@@ -1,9 +1,19 @@
#include <SFML/Graphics.hpp>
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);

View File

@@ -1108,8 +1108,6 @@ short custom_choice_dialog(std::array<std::string, 6>& 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<short>();
if(overall_mode != MODE_STARTUP)
//refresh_screen(0);
redraw_screen();
else draw_startup(0);
return item_hit;
}

View File

@@ -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);

View File

@@ -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:

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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();