Overhaul the game's "rendering pipeline", simplifying it a fair bit
- Also significantly improves performance
This commit is contained in:
@@ -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()////
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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:
|
||||
|
@@ -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)
|
||||
|
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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();
|
||||
|
Reference in New Issue
Block a user