diff --git a/src/dialogxml/widgets/pict.cpp b/src/dialogxml/widgets/pict.cpp index f12625e8..1a195bbb 100644 --- a/src/dialogxml/widgets/pict.cpp +++ b/src/dialogxml/widgets/pict.cpp @@ -966,20 +966,20 @@ void cPict::drawStatusIcon(short num, rectangle to_rect){ void cPict::drawCustomTer(short num, rectangle to_rect){ to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect); } void cPict::drawCustomTerAnim(short num, rectangle to_rect){ to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; num += animFrame % 4; + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect); } void cPict::drawCustomMonstSm(short num, rectangle to_rect){ @@ -989,10 +989,10 @@ void cPict::drawCustomMonstSm(short num, rectangle to_rect){ to_rect.bottom = to_rect.top + 36; fill_rect(*inWindow, to_rect, sf::Color::Black); + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); } void cPict::drawCustomMonstWide(short num, rectangle to_rect){ @@ -1003,15 +1003,15 @@ void cPict::drawCustomMonstWide(short num, rectangle to_rect){ to_rect.bottom = to_rect.top + 36; fill_rect(*inWindow, to_rect, sf::Color::Black); + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); small_monst_rect.offset(to_rect.left,to_rect.top + 7); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+1); small_monst_rect.offset(14,0); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); } void cPict::drawCustomMonstTall(short num, rectangle to_rect){ @@ -1022,15 +1022,15 @@ void cPict::drawCustomMonstTall(short num, rectangle to_rect){ to_rect.bottom = to_rect.top + 36; fill_rect(*inWindow, to_rect, sf::Color::Black); + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); small_monst_rect.offset(to_rect.left + 7,to_rect.top); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+1); small_monst_rect.offset(0,18); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); } void cPict::drawCustomMonstLg(short num, rectangle to_rect){ @@ -1041,43 +1041,43 @@ void cPict::drawCustomMonstLg(short num, rectangle to_rect){ to_rect.bottom = to_rect.top + 36; fill_rect(*inWindow, to_rect, sf::Color::Black); + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); small_monst_rect.offset(to_rect.left,to_rect.top); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+1); small_monst_rect.offset(14,0); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+2); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+2); small_monst_rect.offset(-14,18); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+3); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+3); small_monst_rect.offset(14,0); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); } // This is a super-hacky way to wedge in scaled form, but at least it should work. static int dlog_to_w = 18, dlog_to_h = 36; void cPict::drawCustomDlog(short num, rectangle to_rect){ + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); to_rect.right = to_rect.left + dlog_to_w; to_rect.bottom = to_rect.top + dlog_to_h; from_rect.right = from_rect.left + 18; from_rect.bottom = from_rect.top + 36; - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+1); to_rect.offset(dlog_to_w,0); from_rect.right = from_rect.left + 18; from_rect.bottom = from_rect.top + 36; - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect); } void cPict::drawCustomDlogLg(short num, rectangle to_rect){ @@ -1099,87 +1099,86 @@ void cPict::drawCustomDlogLg(short num, rectangle to_rect){ } void cPict::drawCustomTalk(short num, rectangle to_rect){ + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); to_rect.right = to_rect.left + 16; to_rect.bottom = to_rect.top + 32; from_rect.right = from_rect.left + 16; from_rect.bottom = from_rect.top + 32; - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+1); to_rect.offset(16,0); from_rect.right = from_rect.left + 16; from_rect.bottom = from_rect.top + 32; - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect); } void cPict::drawCustomItem(short num, rectangle to_rect){ to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); fill_rect(*inWindow, to_rect, sf::Color::Black); - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); } void cPict::drawCustomTinyItem(short num, rectangle to_rect){ to_rect.right = to_rect.left + 18; to_rect.bottom = to_rect.top + 18; + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); fill_rect(*inWindow, to_rect, sf::Color::Black); - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); } void cPict::drawCustomBoom(short num, rectangle to_rect){ to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num + animFrame % 8); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num + animFrame % 8); fill_rect(*inWindow, to_rect, sf::Color::Black); - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); } void cPict::drawCustomMissile(short num, rectangle to_rect){ num += animFrame % 8; + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num); from_rect.right = from_rect.left + 18; from_rect.bottom = from_rect.top + 18; if(animFrame >= 4) from_rect.offset(0, 18); fill_rect(*inWindow, to_rect, sf::Color::Black); to_rect.inset(5,9); - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); } void cPict::drawCustomTerMap(short num, rectangle to_rect){ + Texture from_gw; rectangle from_rect; - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num % 1000); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num % 1000); from_rect.right = from_rect.left + 12; from_rect.bottom = from_rect.top + 12; num /= 1000; num--; from_rect.offset((num / 3) * 12, (num % 3) * 12); to_rect.right = to_rect.left + 24; to_rect.bottom = to_rect.top + 24; - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect); } void cPict::drawPartyMonstSm(short num, rectangle to_rect){ to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; - std::shared_ptr from_gw; + Texture from_gw; rectangle from_rect; - - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num, true); fill_rect(*inWindow, to_rect, sf::Color::Black); - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); } void cPict::drawPartyMonstWide(short num, rectangle to_rect){ @@ -1187,16 +1186,15 @@ void cPict::drawPartyMonstWide(short num, rectangle to_rect){ to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; fill_rect(*inWindow, to_rect, sf::Color::Black); - std::shared_ptr from_gw; + Texture from_gw; rectangle from_rect; - - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num, true); small_monst_rect.offset(to_rect.left,to_rect.top + 7); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1, true); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+1, true); small_monst_rect.offset(14,0); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); } void cPict::drawPartyMonstTall(short num, rectangle to_rect){ @@ -1204,16 +1202,15 @@ void cPict::drawPartyMonstTall(short num, rectangle to_rect){ to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; fill_rect(*inWindow, to_rect, sf::Color::Black); - std::shared_ptr from_gw; + Texture from_gw; rectangle from_rect; - - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num, true); small_monst_rect.offset(to_rect.left + 7,to_rect.top); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); small_monst_rect.offset(0,18); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1, true); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+1, true); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); } void cPict::drawPartyMonstLg(short num, rectangle to_rect){ @@ -1221,24 +1218,23 @@ void cPict::drawPartyMonstLg(short num, rectangle to_rect){ to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; fill_rect(*inWindow, to_rect, sf::Color::Black); - std::shared_ptr from_gw; + Texture from_gw; rectangle from_rect; - - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num, true); small_monst_rect.offset(to_rect.left,to_rect.top); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); small_monst_rect.offset(14,0); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1, true); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+1, true); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); small_monst_rect.offset(-14,18); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+2, true); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+2, true); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); small_monst_rect.offset(14,0); - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+3, true); - rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num+3, true); + rect_draw_some_item(from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha); } void cPict::drawPartyScen(short num, rectangle to_rect){ @@ -1253,23 +1249,21 @@ void cPict::drawPartyScen(short num, rectangle to_rect){ void cPict::drawPartyItem(short num, rectangle to_rect){ to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; - std::shared_ptr from_gw; + Texture from_gw; rectangle from_rect; - - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num, true); fill_rect(*inWindow, to_rect, sf::Color::Black); - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); } void cPict::drawPartyPc(short num, rectangle to_rect){ to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36; - std::shared_ptr from_gw; + Texture from_gw; rectangle from_rect; - - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(num, true); fill_rect(*inWindow, to_rect, sf::Color::Black); - rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha); } cPict::~cPict() {} diff --git a/src/game/boe.graphics.cpp b/src/game/boe.graphics.cpp index 0431609b..40be252a 100644 --- a/src/game/boe.graphics.cpp +++ b/src/game/boe.graphics.cpp @@ -319,16 +319,16 @@ void draw_startup_stats() { to_rect.offset(pc_rect.left,pc_rect.top); pic_num_t pic = univ.party[i].which_graphic; if(pic >= 1000) { - std::shared_ptr gw; - graf_pos_ref(gw, from_rect) = spec_scen_g.find_graphic(pic % 1000, pic >= 10000); - rect_draw_some_item(*gw,from_rect,mainPtr,to_rect,sf::BlendAlpha); + Texture gw; + std::tie(gw,from_rect) = spec_scen_g.find_graphic(pic % 1000, pic >= 10000); + rect_draw_some_item(gw,from_rect,mainPtr,to_rect,sf::BlendAlpha); } else if(pic >= 100) { pic -= 100; // Note that we assume it's a 1x1 graphic. // PCs can't be larger than that, but we leave it to the scenario designer to avoid assigning larger graphics. from_rect = get_monster_template_rect(pic, 0, 0); int which_sheet = m_pic_index[pic].i / 20; - sf::Texture& monst_gworld = *ResMgr::graphics.get("monst" + std::to_string(1 + which_sheet)); + auto const & monst_gworld = *ResMgr::textures.get("monst" + std::to_string(1 + which_sheet)); rect_draw_some_item(monst_gworld,from_rect,mainPtr,to_rect,sf::BlendAlpha); } else { from_rect = calc_rect(2 * (pic / 8), pic % 8); @@ -653,7 +653,7 @@ void put_text_bar(std::string str) { win_draw_string(text_bar_gworld, to_rect, str, eTextMode::LEFT_TOP, style); if(!monsters_going) { - sf::Texture& status_gworld = *ResMgr::graphics.get("staticons"); + auto const & status_gworld = *ResMgr::textures.get("staticons"); to_rect.top -= 2; to_rect.left = to_rect.right - 15; to_rect.width() = 12; @@ -927,7 +927,7 @@ void draw_terrain(short mode) { // Draw top half of forcecages (this list is populated by draw_fields) // TODO: Move into the above loop to eliminate global variable for(location fc_loc : forcecage_locs) - Draw_Some_Item(*ResMgr::graphics.get("fields"),calc_rect(2,0),terrain_screen_gworld,fc_loc,1,0); + Draw_Some_Item(*ResMgr::textures.get("fields"),calc_rect(2,0),terrain_screen_gworld,fc_loc,1,0); // Draw any posted labels, then clear them out clip_rect(terrain_screen_gworld, {13, 13, 337, 265}); for(text_label_t lbl : posted_labels) @@ -1094,7 +1094,7 @@ static void init_trim_mask(std::unique_ptr& mask, rectangle src_rec std::tie(dest_rect.top, dest_rect.bottom) = std::make_tuple(36 - dest_rect.top, 36 - dest_rect.bottom); render.create(28, 36); render.clear(sf::Color::White); - rect_draw_some_item(*ResMgr::graphics.get("trim"), src_rect, render, dest_rect); + rect_draw_some_item(*ResMgr::textures.get("trim"), src_rect, render, dest_rect); render.display(); mask.reset(new sf::Texture); mask->create(28, 36); @@ -1127,7 +1127,7 @@ void draw_trim(short q,short r,short which_trim,ter_num_t ground_ter) { }; static std::unique_ptr trim_masks[12], walkway_masks[9]; rectangle from_rect = {0,0,36,28},to_rect; - std::shared_ptr from_gworld; + Texture from_gworld; sf::Texture* mask; static bool inited = false; if(!inited){ @@ -1155,16 +1155,16 @@ void draw_trim(short q,short r,short which_trim,ter_num_t ground_ter) { unsigned short pic = univ.scenario.ter_types[ground_ter].picture; if(pic < 960){ int which_sheet = pic / 50; - from_gworld = &ResMgr::graphics.get("ter" + std::to_string(1 + which_sheet)); + from_gworld = *ResMgr::textures.get("ter" + std::to_string(1 + which_sheet)); pic %= 50; from_rect.offset(28 * (pic % 10), 36 * (pic / 10)); }else if(pic < 1000){ - from_gworld = &ResMgr::graphics.get("teranim"); + from_gworld = *ResMgr::textures.get("teranim"); pic -= 960; from_rect.offset(112 * (pic / 5),36 * (pic % 5)); }else{ pic %= 1000; - graf_pos_ref(from_gworld, from_rect) = spec_scen_g.find_graphic(pic); + std::tie(from_gworld,from_rect) = spec_scen_g.find_graphic(pic); } if(which_trim < 50) { if(!trim_masks[which_trim]) @@ -1178,7 +1178,7 @@ void draw_trim(short q,short r,short which_trim,ter_num_t ground_ter) { } to_rect = coord_to_rect(q,r); - rect_draw_some_item(*from_gworld, from_rect, *mask, terrain_screen_gworld, to_rect); + rect_draw_some_item(from_gworld, from_rect, *mask, terrain_screen_gworld, to_rect); } @@ -1485,7 +1485,7 @@ static void draw_one_pointing_arrow(int dir, int pos) { to_rect.width() = to_rect.height() = 8; - rect_draw_some_item(*ResMgr::graphics.get("invenbtns"), from_rect, mainPtr, to_rect, sf::BlendAlpha); + rect_draw_some_item(*ResMgr::textures.get("invenbtns"), from_rect, mainPtr, to_rect, sf::BlendAlpha); } void draw_pointing_arrows() { diff --git a/src/game/boe.graphutil.cpp b/src/game/boe.graphutil.cpp index 10d12285..b8080e33 100644 --- a/src/game/boe.graphutil.cpp +++ b/src/game/boe.graphutil.cpp @@ -13,6 +13,7 @@ #include "boe.graphics.hpp" #include "boe.infodlg.hpp" #include "boe.monster.hpp" +#include "boe.newgraph.hpp" #include "boe.specials.hpp" #include "sounds.hpp" #include "render_image.hpp" @@ -61,7 +62,7 @@ bool gave_no_g_error = false; void draw_one_terrain_spot (short i,short j,short terrain_to_draw) { rectangle where_draw; rectangle source_rect; - std::shared_ptr source_gworld; + Texture source_gworld; short anim_type = 0; location l; @@ -79,20 +80,20 @@ void draw_one_terrain_spot (short i,short j,short terrain_to_draw) { if(terrain_to_draw >= 10000) { // force using a specific graphic terrain_to_draw -= 10000; int which_sheet = terrain_to_draw / 50; - source_gworld = &ResMgr::graphics.get("ter" + std::to_string(1 + which_sheet)); + source_gworld = *ResMgr::textures.get("ter" + std::to_string(1 + which_sheet)); terrain_to_draw %= 50; source_rect = calc_rect(terrain_to_draw % 10, terrain_to_draw / 10); anim_type = -1; } else if(univ.scenario.ter_types[terrain_to_draw].picture >= 2000) { // custom - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(univ.scenario.ter_types[terrain_to_draw].picture - 2000 + (anim_ticks % 4)); + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(univ.scenario.ter_types[terrain_to_draw].picture - 2000 + (anim_ticks % 4)); anim_type = 0; } else if(univ.scenario.ter_types[terrain_to_draw].picture >= 1000) { // custom - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(univ.scenario.ter_types[terrain_to_draw].picture - 1000); + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(univ.scenario.ter_types[terrain_to_draw].picture - 1000); } else if(univ.scenario.ter_types[terrain_to_draw].picture >= 960) { // animated - source_gworld = &ResMgr::graphics.get("teranim"); + source_gworld = *ResMgr::textures.get("teranim"); terrain_to_draw = univ.scenario.ter_types[terrain_to_draw].picture; source_rect = calc_rect(4 * ((terrain_to_draw - 960) / 5) + (anim_ticks % 4),(terrain_to_draw - 960) % 5); anim_type = 0; @@ -100,13 +101,13 @@ void draw_one_terrain_spot (short i,short j,short terrain_to_draw) { else { terrain_to_draw = univ.scenario.ter_types[terrain_to_draw].picture; int which_sheet = terrain_to_draw / 50; - source_gworld = &ResMgr::graphics.get("ter" + std::to_string(1 + which_sheet)); + source_gworld = *ResMgr::textures.get("ter" + std::to_string(1 + which_sheet)); terrain_to_draw %= 50; source_rect = calc_rect(terrain_to_draw % 10, terrain_to_draw / 10); anim_type = -1; } - rect_draw_some_item(*source_gworld, source_rect, terrain_screen_gworld, where_draw); + rect_draw_some_item(source_gworld, source_rect, terrain_screen_gworld, where_draw); } void draw_monsters() { @@ -140,12 +141,12 @@ void draw_monsters() { if(picture_wanted >= 0) { if(picture_wanted >= 1000) { for(short k = 0; k < width * height; k++) { - std::shared_ptr src_gw; - graf_pos_ref(src_gw, source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000 + + Texture src_gw; + std::tie(src_gw,source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000 + ((enc.direction < 4) ? 0 : (width * height)) + k); to_rect = monst_rects[(width - 1) * 2 + height - 1][k]; to_rect.offset(13 + 28 * where_draw.x,13 + 36 * where_draw.y); - rect_draw_some_item(*src_gw, source_rect, terrain_screen_gworld,to_rect, sf::BlendAlpha); + rect_draw_some_item(src_gw, source_rect, terrain_screen_gworld,to_rect, sf::BlendAlpha); } } if(picture_wanted < 1000) { @@ -154,7 +155,7 @@ void draw_monsters() { to_rect = monst_rects[(width - 1) * 2 + height - 1][k]; to_rect.offset(13 + 28 * where_draw.x,13 + 36 * where_draw.y); int which_sheet = m_pic_index[picture_wanted].i / 20; - sf::Texture& monst_gworld = *ResMgr::graphics.get("monst" + std::to_string(1 + which_sheet)); + Texture& monst_gworld = *ResMgr::textures.get("monst" + std::to_string(1 + which_sheet)); rect_draw_some_item(monst_gworld, source_rect, terrain_screen_gworld,to_rect, sf::BlendAlpha); } } @@ -183,19 +184,19 @@ void draw_monsters() { draw_one_terrain_spot((short) where_draw.x,(short) where_draw.y,10000 + univ.scenario.ter_types[ter].flag1); else if(monst.picture_num >= 1000) { bool isParty = monst.picture_num >= 10000; - std::shared_ptr src_gw; pic_num_t need_pic = (monst.picture_num % 1000) + k; if(monst.direction >= 4) need_pic += width * height; if(combat_posing_monster == i + 100) need_pic += (2 * width * height); - graf_pos_ref(src_gw, source_rect) = spec_scen_g.find_graphic(need_pic, isParty); - Draw_Some_Item(*src_gw, source_rect, terrain_screen_gworld, store_loc, 1, 0); + Texture src_gw; + std::tie(src_gw,source_rect) = spec_scen_g.find_graphic(need_pic, isParty); + Draw_Some_Item(src_gw, source_rect, terrain_screen_gworld, store_loc, 1, 0); } else { pic_num_t this_monst = monst.picture_num; int pic_mode = (monst.direction) < 4 ? 0 : 1; pic_mode += (combat_posing_monster == i + 100) ? 10 : 0; source_rect = get_monster_template_rect(this_monst, pic_mode, k); int which_sheet = (m_pic_index[this_monst].i+k) / 20; - sf::Texture& monst_gworld = *ResMgr::graphics.get("monst" + std::to_string(1 + which_sheet)); + const Texture& monst_gworld = *ResMgr::textures.get("monst" + std::to_string(1 + which_sheet)); Draw_Some_Item(monst_gworld, source_rect, terrain_screen_gworld, store_loc, 1, 0); } } @@ -222,7 +223,7 @@ void draw_combat_pc(cPlayer& who, location center, bool attacking) { if(point_onscreen(center, who.combat_pos) && (cartoon_happening || party_can_see(who.combat_pos) < 6)) { location where_draw(who.combat_pos.x - center.x + 4, who.combat_pos.y - center.y + 4); rectangle source_rect; - std::shared_ptr from_gw; + Texture from_gw; pic_num_t pic = who.which_graphic; if(pic >= 1000) { bool isParty = pic >= 10000; @@ -231,7 +232,7 @@ void draw_combat_pc(cPlayer& who, location center, bool attacking) { need_pic++; if(attacking) need_pic += 2; - graf_pos_ref(from_gw, source_rect) = spec_scen_g.find_graphic(need_pic, isParty); + std::tie(from_gw,source_rect) = spec_scen_g.find_graphic(need_pic, isParty); } else if(pic >= 100) { // Note that we assume it's a 1x1 graphic. // PCs can't be larger than that, but we leave it to the scenario designer to avoid assigning larger graphics. @@ -243,17 +244,17 @@ void draw_combat_pc(cPlayer& who, location center, bool attacking) { mode += 10; source_rect = get_monster_template_rect(need_pic, mode, 0); int which_sheet = m_pic_index[need_pic].i / 20; - from_gw = &ResMgr::graphics.get("monst" + std::to_string(1 + which_sheet)); + from_gw = *ResMgr::textures.get("monst" + std::to_string(1 + which_sheet)); } else { source_rect = calc_rect(2 * (pic / 8), pic % 8); if(who.direction >= 4) source_rect.offset(28,0); if(attacking) source_rect.offset(0,288); - from_gw = &ResMgr::graphics.get("pcs"); + from_gw = *ResMgr::textures.get("pcs"); } - Draw_Some_Item(*from_gw, source_rect, terrain_screen_gworld, where_draw, 1, 0); + Draw_Some_Item(from_gw, source_rect, terrain_screen_gworld, where_draw, 1, 0); } } @@ -297,14 +298,14 @@ void draw_items(location where){ if(univ.town.items[i].variety != eItemType::NO_ITEM && univ.town.items[i].item_loc == where) { if(univ.town.items[i].contained) continue; if(party_can_see(where) >= 6) continue; - std::shared_ptr src_gw; to_rect = coord_to_rect(where_draw.x,where_draw.y); + Texture src_gw; if(univ.town.items[i].graphic_num >= 10000){ - graf_pos_ref(src_gw, from_rect) = spec_scen_g.find_graphic(univ.town.items[i].graphic_num - 10000, true); + std::tie(src_gw,from_rect) = spec_scen_g.find_graphic(univ.town.items[i].graphic_num - 10000, true); }else{ - graf_pos_ref(src_gw, from_rect) = calc_item_rect(univ.town.items[i].graphic_num, to_rect); + std::tie(src_gw, from_rect) = calc_item_rect(univ.town.items[i].graphic_num, to_rect); } - rect_draw_some_item(*src_gw, from_rect, terrain_screen_gworld, to_rect, sf::BlendAlpha); + rect_draw_some_item(src_gw, from_rect, terrain_screen_gworld, to_rect, sf::BlendAlpha); } } } @@ -312,7 +313,7 @@ void draw_items(location where){ void draw_outd_boats(location center) { location where_draw; rectangle source_rect; - sf::Texture& vehicle_gworld = *ResMgr::graphics.get("vehicle"); + Texture& vehicle_gworld = *ResMgr::textures.get("vehicle"); for(auto& boat : univ.party.boats) { if(!boat.exists) continue; @@ -351,7 +352,7 @@ void draw_outd_boats(location center) { void draw_town_boat(location center) { location where_draw; rectangle source_rect; - sf::Texture& vehicle_gworld = *ResMgr::graphics.get("vehicle"); + Texture const & vehicle_gworld = *ResMgr::textures.get("vehicle"); for(auto& boat : univ.party.boats) { if(!boat.exists) continue; @@ -381,7 +382,7 @@ void draw_fields(location where){ if(!point_onscreen(center,where)) return; if(party_can_see(where) >= 6) return; location where_draw(4 + where.x - center.x, 4 + where.y - center.y); - sf::Texture& fields_gworld = *ResMgr::graphics.get("fields"); + Texture const & fields_gworld = *ResMgr::textures.get("fields"); if(is_out()){ if(univ.out.is_spot(where.x,where.y)) Draw_Some_Item(fields_gworld,calc_rect(4,0),terrain_screen_gworld,where_draw,1,0); @@ -412,7 +413,7 @@ void draw_fields(location where){ if(univ.town.is_barrel(where.x,where.y)) Draw_Some_Item(fields_gworld,calc_rect(7,0),terrain_screen_gworld,where_draw,1,0); if(univ.town.is_fire_barr(where.x,where.y) || univ.town.is_force_barr(where.x,where.y)) - Draw_Some_Item(*ResMgr::graphics.get("teranim"),calc_rect(8+(anim_ticks%4),4),terrain_screen_gworld,where_draw,1,0); + Draw_Some_Item(*ResMgr::textures.get("teranim"),calc_rect(8+(anim_ticks%4),4),terrain_screen_gworld,where_draw,1,0); if(univ.town.is_quickfire(where.x,where.y)) Draw_Some_Item(fields_gworld,calc_rect(7,1),terrain_screen_gworld,where_draw,1,0); if(univ.town.is_sm_blood(where.x,where.y)) @@ -455,14 +456,14 @@ void draw_party_symbol(location center) { if((univ.party.in_boat < 0) && (univ.party.in_horse < 0)) { i = first_active_pc(); - std::shared_ptr from_gw; + Texture from_gw; pic_num_t pic = univ.party[i].which_graphic; if(pic >= 1000) { bool isParty = pic >= 10000; pic_num_t need_pic = pic % 1000; if(univ.party.direction >= 4) need_pic++; - graf_pos_ref(from_gw, source_rect) = spec_scen_g.find_graphic(need_pic, isParty); + std::tie(from_gw,source_rect) = spec_scen_g.find_graphic(need_pic, isParty); } else if(pic >= 100) { // Note that we assume it's a 1x1 graphic. // PCs can't be larger than that, but we leave it to the scenario designer to avoid assigning larger graphics. @@ -472,12 +473,12 @@ void draw_party_symbol(location center) { mode++; source_rect = get_monster_template_rect(need_pic, mode, 0); int which_sheet = m_pic_index[need_pic].i / 20; - from_gw = &ResMgr::graphics.get("monst" + std::to_string(1 + which_sheet)); + from_gw = *ResMgr::textures.get("monst" + std::to_string(1 + which_sheet)); } else { source_rect = calc_rect(2 * (pic / 8), pic % 8); if(univ.party.direction >= 4) source_rect.offset(28,0); - from_gw = &ResMgr::graphics.get("pcs"); + from_gw = *ResMgr::textures.get("pcs"); } ter_num_t ter = 0; if(is_out()) @@ -487,16 +488,16 @@ void draw_party_symbol(location center) { // now wedge in bed graphic if(is_town() && univ.scenario.ter_types[ter].special == eTerSpec::BED) draw_one_terrain_spot((short) target.x,(short) target.y,10000 + univ.scenario.ter_types[ter].flag1); - else Draw_Some_Item(*from_gw, source_rect, terrain_screen_gworld, target, 1, 0); + else Draw_Some_Item(from_gw, source_rect, terrain_screen_gworld, target, 1, 0); } else if(univ.party.in_boat >= 0) { if(univ.party.direction == DIR_N) i = 2; else if(univ.party.direction == DIR_S) i = 3; else i = univ.party.direction > DIR_S; - Draw_Some_Item(*ResMgr::graphics.get("vehicle"), calc_rect(i,0), terrain_screen_gworld, target, 1, 0); + Draw_Some_Item(*ResMgr::textures.get("vehicle"), calc_rect(i,0), terrain_screen_gworld, target, 1, 0); }else { i = univ.party.direction > 3; - Draw_Some_Item(*ResMgr::graphics.get("vehicle"), calc_rect(i + 2, 1), terrain_screen_gworld, target, 1, 0); + Draw_Some_Item(*ResMgr::textures.get("vehicle"), calc_rect(i + 2, 1), terrain_screen_gworld, target, 1, 0); } } diff --git a/src/game/boe.graphutil.hpp b/src/game/boe.graphutil.hpp index 7a79f3dc..af111191 100644 --- a/src/game/boe.graphutil.hpp +++ b/src/game/boe.graphutil.hpp @@ -23,7 +23,6 @@ bool is_ground(ter_num_t ter_type); char get_fluid_trim(location where,ter_num_t ter_type); void check_if_monst_seen(unsigned short m_num, location monst_loc); void play_ambient_sound(); -graf_pos calc_item_rect(int num,rectangle& to_rect); void draw_items(location where); void draw_fields(location where); diff --git a/src/game/boe.newgraph.cpp b/src/game/boe.newgraph.cpp index 2ea62f80..787676d8 100644 --- a/src/game/boe.newgraph.cpp +++ b/src/game/boe.newgraph.cpp @@ -427,14 +427,14 @@ void do_missile_anim(short num_steps,location missile_origin,short sound_num) { base -= 10000; } else base -= 1000; base += step % 4; - std::shared_ptr from_gw = nullptr; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(base, isParty); - if(from_gw == nullptr) continue; + Texture from_gw; + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(base, isParty); + if(!from_gw) continue; from_rect.width() = 18; from_rect.height() = 18; if(step >= 4) from_rect.offset(0,18); - rect_draw_some_item(*from_gw,from_rect, mainPtr,temp_rect,sf::BlendAlpha); + rect_draw_some_item(from_gw,from_rect, mainPtr,temp_rect,sf::BlendAlpha); } } mainPtr.setActive(); @@ -559,9 +559,9 @@ void do_explosion_anim(short /*sound_num*/,short special_draw, short snd) { if(store_booms[i].boom_type >= 0) { if((t + store_booms[i].offset >= 0) && (t + store_booms[i].offset <= 7)) { if(cur_boom_type >= 1000) { - std::shared_ptr src_gworld; - graf_pos_ref(src_gworld, from_rect) = spec_scen_g.find_graphic(cur_boom_type - 1000 + t); - rect_draw_some_item(*src_gworld, from_rect, mainPtr, explode_place_rect[i], sf::BlendAlpha); + Texture src_gworld; + std::tie(src_gworld,from_rect) = spec_scen_g.find_graphic(cur_boom_type - 1000 + t); + rect_draw_some_item(src_gworld, from_rect, mainPtr, explode_place_rect[i], sf::BlendAlpha); } else { from_rect = base_rect; from_rect.offset(28 * (t + store_booms[i].offset),36 * (1 + store_booms[i].boom_type)); @@ -606,15 +606,15 @@ void click_shop_rect(rectangle area_rect) { } -graf_pos calc_item_rect(int num,rectangle& to_rect) { +Texture_pos calc_item_rect(int num,rectangle& to_rect) { if(num >= 1000) return spec_scen_g.find_graphic(num - 1000); rectangle from_rect = {0,0,18,18}; - std::shared_ptr from_gw; + Texture from_gw; if(num < 55) { - from_gw = &ResMgr::graphics.get("objects"); + from_gw = *ResMgr::textures.get("objects"); from_rect = calc_rect(num % 5, num / 5); }else{ - from_gw = &ResMgr::graphics.get("tinyobj"); + from_gw = *ResMgr::textures.get("tinyobj"); to_rect.inset(5,9); from_rect.offset(18 * (num % 10), 18 * (num / 10)); } @@ -660,15 +660,15 @@ void draw_shop_graphics(bool pressed,rectangle clip_area_rect) { // Place store icon if(!pressed) { rectangle from_rect = {0,0,32,32}; - std::shared_ptr from_gw; + Texture from_gw; int i = std::max(0, active_shop.getFace()); if(i >= 1000) { - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(i - 1000); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(i - 1000); } else { from_rect.offset(32 * (i % 10),32 * (i / 10)); - from_gw = &ResMgr::graphics.get("talkportraits"); + from_gw = *ResMgr::textures.get("talkportraits"); } - rect_draw_some_item(*from_gw, from_rect, talk_gworld, face_rect); + rect_draw_some_item(from_gw, from_rect, talk_gworld, face_rect); } @@ -729,7 +729,7 @@ void draw_shop_graphics(bool pressed,rectangle clip_area_rect) { base_item = item.item; std::string cur_name = base_item.full_name, cur_info_str; rectangle from_rect, to_rect = shopping_rects[i][SHOPRECT_GRAPHIC]; - std::shared_ptr from_gw; + Texture from_gw; switch(item.type) { case eShopItemType::ITEM: base_item.ident = true; @@ -756,8 +756,8 @@ void draw_shop_graphics(bool pressed,rectangle clip_area_rect) { cur_info_str = ""; break; } - graf_pos_ref(from_gw, from_rect) = calc_item_rect(base_item.graphic_num,to_rect); - rect_draw_some_item(*from_gw, from_rect, talk_gworld, to_rect, sf::BlendAlpha); + std::tie(from_gw, from_rect) = calc_item_rect(base_item.graphic_num,to_rect); + rect_draw_some_item(from_gw, from_rect, talk_gworld, to_rect, sf::BlendAlpha); // Now draw item style.pointSize = 12; diff --git a/src/game/boe.newgraph.hpp b/src/game/boe.newgraph.hpp index 970ac17d..e531a8ad 100644 --- a/src/game/boe.newgraph.hpp +++ b/src/game/boe.newgraph.hpp @@ -4,6 +4,7 @@ #include "location.hpp" #include "item.hpp" #include "gfxsheets.hpp" +#include "texture.hpp" struct word_rect_t { std::string word; @@ -64,4 +65,4 @@ void click_talk_rect(word_rect_t word); void place_talk_str(std::string str_to_place,std::string str_to_place2,short color,rectangle c_rect); short scan_for_response(const char *str); void refresh_talking(); -graf_pos calc_item_rect(int num,rectangle& to_rect); +Texture_pos calc_item_rect(int num,rectangle& to_rect); diff --git a/src/game/boe.text.cpp b/src/game/boe.text.cpp index c8d9c083..5f621cfc 100644 --- a/src/game/boe.text.cpp +++ b/src/game/boe.text.cpp @@ -445,13 +445,13 @@ void place_item_graphic(short which_slot,short graphic) { item_area_button_active[which_slot][ITEMBTN_NAME] = item_area_button_active[which_slot][ITEMBTN_ICON] = true; from_rect.offset((graphic % 10) * 18,(graphic / 10) * 18); to_rect = item_buttons[which_slot][ITEMBTN_ICON]; - std::shared_ptr src_gw; + Texture src_gw; if(graphic >= 10000) { - graf_pos_ref(src_gw, from_rect) = spec_scen_g.find_graphic(graphic - 10000, true); - rect_draw_some_item(*src_gw, from_rect, item_stats_gworld, to_rect,sf::BlendAlpha); + std::tie(src_gw,from_rect) = spec_scen_g.find_graphic(graphic - 10000, true); + rect_draw_some_item(src_gw, from_rect, item_stats_gworld, to_rect,sf::BlendAlpha); } else if(graphic >= 1000) { - graf_pos_ref(src_gw, from_rect) = spec_scen_g.find_graphic(graphic - 1000); - rect_draw_some_item(*src_gw, from_rect, item_stats_gworld, to_rect,sf::BlendAlpha); + std::tie(src_gw,from_rect) = spec_scen_g.find_graphic(graphic - 1000); + rect_draw_some_item(src_gw, from_rect, item_stats_gworld, to_rect,sf::BlendAlpha); } else rect_draw_some_item(*ResMgr::textures.get("tinyobj"), from_rect, item_stats_gworld, to_rect, sf::BlendAlpha); } @@ -509,11 +509,11 @@ void place_item_bottom_buttons() { to_rect = item_screen_button_rects[i]; rect_draw_some_item(invenbtn_gworld, but_from_rect, item_stats_gworld, to_rect, sf::BlendAlpha); pic_num_t pic = univ.party[i].which_graphic; - std::shared_ptr from_gw; + Texture from_gw; if(pic >= 1000) { bool isParty = pic >= 10000; pic_num_t need_pic = pic % 1000; - graf_pos_ref(from_gw, pc_from_rect) = spec_scen_g.find_graphic(need_pic, isParty); + std::tie(from_gw,pc_from_rect) = spec_scen_g.find_graphic(need_pic, isParty); } else if(pic >= 100) { // Note that we assume it's a 1x1 graphic. // PCs can't be larger than that, but we leave it to the scenario designer to avoid assigning larger graphics. @@ -521,13 +521,13 @@ void place_item_bottom_buttons() { int mode = 0; pc_from_rect = get_monster_template_rect(need_pic, mode, 0); int which_sheet = m_pic_index[need_pic].i / 20; - from_gw = &ResMgr::graphics.get("monst" + std::to_string(1 + which_sheet)); + from_gw = *ResMgr::textures.get("monst" + std::to_string(1 + which_sheet)); } else { pc_from_rect = calc_rect(2 * (pic / 8), pic % 8); - from_gw = &ResMgr::graphics.get("pcs"); + from_gw = *ResMgr::textures.get("pcs"); } to_rect.inset(2,2); - rect_draw_some_item(*from_gw, pc_from_rect, item_stats_gworld, to_rect, sf::BlendAlpha); + rect_draw_some_item(from_gw, pc_from_rect, item_stats_gworld, to_rect, sf::BlendAlpha); std::string numeral = std::to_string(i + 1); short width = string_length(numeral, style); // Offset "6" down two pixels to make it line up, because it has an ascender in this font @@ -1109,7 +1109,7 @@ void through_sending() { /* Draw a bitmap in the world window. hor in 0 .. 8, vert in 0 .. 8, object is ptr. to bitmap to be drawn, and masking is for Copybits. */ -void Draw_Some_Item(const sf::Texture& src_gworld, rectangle src_rect, sf::RenderTarget& targ_gworld,location target, char masked, short main_win) { +void Draw_Some_Item(const Texture& src_gworld, rectangle src_rect, sf::RenderTarget& targ_gworld,location target, char masked, short main_win) { rectangle destrec = {0,0,36,28}; if((target.x < 0) || (target.y < 0) || (target.x > 8) || (target.y > 8)) diff --git a/src/game/boe.text.hpp b/src/game/boe.text.hpp index df065ee0..5f030ff3 100644 --- a/src/game/boe.text.hpp +++ b/src/game/boe.text.hpp @@ -1,6 +1,7 @@ #include class cVehicle; +struct Texture; void put_pc_screen(); void place_buy_button(short position,short pc_num,short item_num); @@ -36,7 +37,7 @@ void restore_mode(); void through_sending(); rectangle coord_to_rect(short i,short j); bool day_reached(unsigned short which_day, unsigned short which_event); -void Draw_Some_Item(const sf::Texture& src_gworld, rectangle src_rect, sf::RenderTarget& targ_gworld, location target, char masked, short main_win); +void Draw_Some_Item(const Texture& src_gworld, rectangle src_rect, sf::RenderTarget& targ_gworld, location target, char masked, short main_win); rectangle get_stat_effect_rect(int which_effect); struct text_label_t { diff --git a/src/game/boe.town.cpp b/src/game/boe.town.cpp index b057afe1..7931d738 100644 --- a/src/game/boe.town.cpp +++ b/src/game/boe.town.cpp @@ -1431,18 +1431,18 @@ void draw_map(bool need_refresh) { if(pic >= 1000) { if(spec_scen_g) { //print_nums(0,99,pic); - std::shared_ptr src_gw; + Texture src_gw; if(drawLargeIcon) { pic = pic % 1000; - graf_pos_ref(src_gw, custom_from) = spec_scen_g.find_graphic(pic); - rect_draw_some_item(*src_gw,custom_from,map_gworld,draw_rect); + std::tie(src_gw,custom_from) = spec_scen_g.find_graphic(pic); + rect_draw_some_item(src_gw,custom_from,map_gworld,draw_rect); } else { - graf_pos_ref(src_gw, custom_from) = spec_scen_g.find_graphic(pic % 1000); + std::tie(src_gw,custom_from) = spec_scen_g.find_graphic(pic % 1000); custom_from.right = custom_from.left + 12; custom_from.bottom = custom_from.top + 12; pic /= 1000; pic--; custom_from.offset((pic / 3) * 12, (pic % 3) * 12); - rect_draw_some_item(*src_gw, custom_from, map_gworld, draw_rect); + rect_draw_some_item(src_gw,custom_from, map_gworld, draw_rect); } } } else if(drawLargeIcon) { @@ -1451,7 +1451,7 @@ void draw_map(bool need_refresh) { rect_draw_some_item(*ResMgr::textures.get("teranim"), custom_from, map_gworld, draw_rect); } else { int which_sheet = pic / 50; - auto src_gw = &ResMgr::graphics.get("ter" + std::to_string(1 + which_sheet)); + auto src_gw = &ResMgr::textures.get("ter" + std::to_string(1 + which_sheet)); pic %= 50; custom_from = calc_rect(pic % 10, pic / 10); rect_draw_some_item(*src_gw, custom_from, map_gworld, draw_rect); @@ -1467,7 +1467,7 @@ void draw_map(bool need_refresh) { if(is_out() ? univ.out->roads[where.x][where.y] : univ.town.is_road(where.x,where.y)) { draw_rect.inset(1,1); - rect_draw_some_item(*ResMgr::graphics.get("trim"),{8,112,12,116},map_gworld,draw_rect); + rect_draw_some_item(*ResMgr::textures.get("trim"),{8,112,12,116},map_gworld,draw_rect); } } } diff --git a/src/gfx/gfxsheets.cpp b/src/gfx/gfxsheets.cpp index 89a7ad4f..70065e79 100644 --- a/src/gfx/gfxsheets.cpp +++ b/src/gfx/gfxsheets.cpp @@ -21,7 +21,7 @@ rectangle calc_rect(short i, short j){ return base_rect; } -graf_pos cCustomGraphics::find_graphic(pic_num_t which_rect, bool party) { +Texture_pos cCustomGraphics::find_graphic(pic_num_t which_rect, bool party) { bool valid = true; if(party && !party_sheet) valid = false; else if(!party && !is_old && (which_rect / 100) >= numSheets) @@ -29,8 +29,8 @@ graf_pos cCustomGraphics::find_graphic(pic_num_t which_rect, bool party) { else if(numSheets == 0) valid = false; if(!valid) { INVALID: - std::shared_ptr blank = &ResMgr::graphics.get("blank", true); - return {blank, {0,0,36,28}}; + auto blank = &ResMgr::textures.get("blank", true); + return std::make_pair(*blank, rectangle(0,0,36,28)); } short sheet = which_rect / 100; if(is_old || party) sheet = 0; @@ -82,23 +82,24 @@ void cCustomGraphics::copy_graphic(pic_num_t dest, pic_num_t src, size_t numSlot rect_draw_some_item(*party_sheet, rectangle(*party_sheet), temp, rectangle(*party_sheet)); party_sheet.reset(new sf::Texture(temp.getTexture())); } - std::shared_ptr from_sheet; - std::shared_ptr to_sheet; - std::shared_ptr last_src = nullptr; + Texture from_sheet; + Texture to_sheet; + std::shared_ptr last_src; sf::RenderTexture temp; rectangle from_rect, to_rect; for(size_t i = 0; i < numSlots; i++) { - graf_pos_ref(from_sheet, from_rect) = find_graphic(src + i); - graf_pos_ref(to_sheet, to_rect) = find_graphic(dest + i, true); - if(to_sheet != last_src) { - if(last_src) last_src.reset(new sf::Texture(temp.getTexture())); - last_src = to_sheet; + std::tie(from_sheet,from_rect) = find_graphic(src + i); + std::tie(to_sheet,to_rect) = find_graphic(dest + i, true); + if(to_sheet.texture != last_src) { + if(last_src) *last_src=sf::Texture(temp.getTexture()); + last_src = std::const_pointer_cast(to_sheet.texture); temp.create(to_sheet->getSize().x, to_sheet->getSize().y); - rect_draw_some_item(*to_sheet, rectangle(*to_sheet), temp, rectangle(*to_sheet)); + rect_draw_some_item(to_sheet, rectangle(to_sheet), temp, rectangle(*to_sheet.texture)); } - rect_draw_some_item(*from_sheet, from_rect, temp, to_rect); + rect_draw_some_item(from_sheet, from_rect, temp, + to_rect.rescale(to_sheet.dimension, to_sheet->getSize())); } - last_src.reset(new sf::Texture(temp.getTexture())); + if (last_src) *last_src=sf::Texture(temp.getTexture()); } extern std::string scenario_temp_dir_name; @@ -144,7 +145,7 @@ void cCustomGraphics::replace_sheet(size_t num, sf::Image& newSheet) { std::string sheetname = "sheet" + std::to_string(num); fs::path tmpPath = tempDir/scenario_temp_dir_name/"graphics"/(sheetname + ".png"); newSheet.saveToFile(tmpPath.string().c_str()); - ResMgr::graphics.free(sheetname); + ResMgr::textures.free(sheetname); } void cCustomGraphics::init_sheet(size_t num) { diff --git a/src/gfx/gfxsheets.hpp b/src/gfx/gfxsheets.hpp index bb425bb9..3e2bf29a 100644 --- a/src/gfx/gfxsheets.hpp +++ b/src/gfx/gfxsheets.hpp @@ -14,10 +14,9 @@ #include #include #include "location.hpp" +#include "texture.hpp" static const pic_num_t NO_PIC = -1; -using graf_pos = std::pair,rectangle>; -using graf_pos_ref = std::pair&,rectangle&>; struct m_pic_index_t { unsigned char i, x, y; @@ -40,7 +39,7 @@ struct cCustomGraphics { } void convert_sheets(); void copy_graphic(pic_num_t dest, pic_num_t src, size_t numSlots); - graf_pos find_graphic(pic_num_t pic, bool party = false); + Texture_pos find_graphic(pic_num_t pic, bool party = false); size_t count(bool party = false); void replace_sheet(size_t num, sf::Image& newSheet); void init_sheet(size_t num); diff --git a/src/gfx/render_image.cpp b/src/gfx/render_image.cpp index 026dd137..0a2d2b3f 100644 --- a/src/gfx/render_image.cpp +++ b/src/gfx/render_image.cpp @@ -14,7 +14,6 @@ #include "fileio.hpp" #include "render_shapes.hpp" -#include "texture.hpp" #include "res_image.hpp" sf::Shader maskShader; @@ -76,15 +75,9 @@ void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,sf::Render rect_draw_some_item(src_gworld, src_rect, targ_gworld, targ_rect, sf::RenderStates(mode)); } -static rectangle rescale(rectangle const &orig, sf::Vector2u const &fromSize, sf::Vector2u const &toSize) -{ - float const scale[]={float(toSize.x)/fromSize.x, float(toSize.y)/fromSize.y}; - return rectangle(int(scale[1]*orig.top), int(scale[0]*orig.left), int(scale[1]*orig.bottom), int(scale[0]*orig.right)); -} - void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::RenderStates mode) { setActiveRenderTarget(targ_gworld); - src_rect=rescale(src_rect, src_gworld.dimension, src_gworld->getSize()); + src_rect=src_rect.rescale(src_gworld.dimension, src_gworld->getSize()); sf::Sprite tile(*src_gworld, src_rect); tile.setPosition(targ_rect.left, targ_rect.top); double xScale = targ_rect.width(), yScale = targ_rect.height(); @@ -95,7 +88,7 @@ void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,sf::Render } void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,const sf::Texture& mask_gworld,sf::RenderTarget& targ_gworld,rectangle targ_rect) { - rectangle real_src_rect=rescale(src_rect, src_gworld.dimension, src_gworld->getSize()); + rectangle real_src_rect=src_rect.rescale(src_gworld.dimension, src_gworld->getSize()); static sf::RenderTexture src; static bool inited = false; if(!inited || real_src_rect.width() != src.getSize().x || real_src_rect.height() != src.getSize().y) { diff --git a/src/gfx/texture.hpp b/src/gfx/texture.hpp index 0886dc4c..71b79174 100644 --- a/src/gfx/texture.hpp +++ b/src/gfx/texture.hpp @@ -10,91 +10,120 @@ #include #include +#include #include #include "location.hpp" struct Texture { - operator bool() const { - return bool(texture); - } - sf::Texture const &operator*() const { - return *texture; - } - sf::Texture const *operator->() const { - return texture.get(); - } - sf::Texture *operator->() { - return texture.get(); - } - operator rectangle() const { - return rectangle(0, 0, dimension.y, dimension.x); - } - static sf::Vector2u getApplicationDimension(std::string const &name) { - if (name.size()<5 || name.substr(name.size()-4)!=".png") return {0,0}; - std::string const base=name.substr(0,name.size()-4); - static std::map nameToDimensions = { - { "actionhelp", {275,100} }, - { "bigscenpics", {256,64} }, - { "booms", {224,252} }, - { "buttons", {192,115} }, - { "dlgbtnred", {60,30} }, - { "dlogbtnhelp", {32,13} }, - { "dlogbtnled", {56,26} }, - { "dlogbtnlg", {204,23} }, - { "dlogbtnmed", {126,138} }, - { "dlogbtnsm", {46,23} }, - { "dlogbtntall", {126,80} }, - { "dlogpics", {144,360} }, - { "dlogscrollled", {56,48} }, - { "dlogscrollwh", {64,64} }, - { "edbuttons", {251,164} }, - { "edsplash", {640,480} }, - { "fields", {224,144} }, - { "fighthelp", {320,125} }, - { "icon", {38,38} }, - { "invenbtns", {130,80} }, - { "invenhelp", {138,112} }, - { "inventory", {271,144} }, - { "missiles", {144,288} }, - { "objects", {140,396} }, - { "outhelp", {320,125} }, - { "pcedbuttons", {114,57} }, - { "pcedtitle", {310,70} }, - { "pcs", {280,576} }, - { "pixpats", {320, 256} }, - { "scenpics", {160,224} }, - { "spidlogo", {350,350} }, - { "startanim", {280,590} }, - { "startbut", {301,48} }, - { "startsplash", {640,480} }, - { "startup", {602,322} }, - { "statarea", {271,116} }, - { "stathelp", {106,29} }, - { "staticons", {36,120} }, - { "talkportraits", {320,288} }, - { "teranim", {672,180} }, - { "termap", {252,576} }, - { "terscreen", {278,350} }, - { "textbar", {279,22} }, - { "tinyobj", {180,252} }, - { "townhelp", {320,125} }, - { "transcript", {256,138} }, - { "vehicle", {112,108} }, - }; - auto const &it=nameToDimensions.find(base); - if (it!=nameToDimensions.end()) - return it->second; - // now check the special case terXXX.png and monstXXX.png - if (base.size()>=4 && base.substr(0,3)=="ter" && base.substr(3).find_first_not_of( "0123456789" ) == std::string::npos) - return {280,180}; - if (base.size()>=6 && base.substr(0,5)=="monst" && base.substr(5).find_first_not_of( "0123456789" ) == std::string::npos) - return {224,360}; - return {0,0}; - } - std::shared_ptr texture; - sf::Vector2u dimension; + Texture() + : texture() + , dimension(0,0) + { + } + Texture(Texture const &)=default; + Texture(sf::Texture const &tex) + : texture(std::make_shared(tex)) + , dimension(0,0) + { + dimension={tex.getSize().x, tex.getSize().y}; + } + Texture(std::shared_ptr const &tex) + : texture(tex) + , dimension(0,0) + { + if (tex) + dimension={tex->getSize().x, tex->getSize().y}; + } + Texture &operator=(Texture const &)=default; + + operator bool() const { + return bool(texture); + } + sf::Texture const &operator*() const { + return *texture; + } + sf::Texture const *operator->() const { + return texture.get(); + } + bool operator==(Texture const &orig) const { + return texture.get()==orig.texture.get() && dimension==orig.dimension; + } + bool operator!=(Texture const &orig) const { + return !(*this==orig); + } + operator rectangle() const { + return rectangle(0, 0, dimension.y, dimension.x); + } + static sf::Vector2u getApplicationDimension(std::string const &name) { + if (name.size()<5 || name.substr(name.size()-4)!=".png") return {0,0}; + std::string const base=name.substr(0,name.size()-4); + static std::map nameToDimensions = { + { "actionhelp", {275,100} }, + { "bigscenpics", {256,64} }, + { "blank", {28,36} }, + { "booms", {224,252} }, + { "buttons", {192,115} }, + { "bwpats", {48,8} }, + { "dlgbtnred", {60,30} }, + { "dlogbtnhelp", {32,13} }, + { "dlogbtnled", {56,26} }, + { "dlogbtnlg", {204,23} }, + { "dlogbtnmed", {126,138} }, + { "dlogbtnsm", {46,23} }, + { "dlogbtntall", {126,80} }, + { "dlogpics", {144,360} }, + { "dlogscrollled", {56,48} }, + { "dlogscrollwh", {64,64} }, + { "edbuttons", {251,164} }, + { "edsplash", {640,480} }, + { "fields", {224,144} }, + { "fighthelp", {320,125} }, + { "icon", {38,38} }, + { "invenbtns", {130,80} }, + { "invenhelp", {138,112} }, + { "inventory", {271,144} }, + { "missiles", {144,288} }, + { "objects", {140,396} }, + { "outhelp", {320,125} }, + { "pcedbuttons", {114,57} }, + { "pcedtitle", {310,70} }, + { "pcs", {280,576} }, + { "pixpats", {320, 256} }, + { "scenpics", {160,224} }, + { "spidlogo", {350,350} }, + { "startanim", {280,590} }, + { "startbut", {301,48} }, + { "startsplash", {640,480} }, + { "startup", {602,322} }, + { "statarea", {271,116} }, + { "stathelp", {106,29} }, + { "staticons", {36,120} }, + { "talkportraits", {320,288} }, + { "teranim", {672,180} }, + { "termap", {252,576} }, + { "terscreen", {278,350} }, + { "textbar", {279,22} }, + { "tinyobj", {180,252} }, + { "townhelp", {320,125} }, + { "transcript", {256,138} }, + { "trim", {224,72} }, + { "vehicle", {112,108} }, + }; + auto const &it=nameToDimensions.find(base); + if (it!=nameToDimensions.end()) + return it->second; + // now check the special case terXXX.png and monstXXX.png + if (base.size()>=4 && base.substr(0,3)=="ter" && base.substr(3).find_first_not_of( "0123456789" ) == std::string::npos) + return {280,180}; + if (base.size()>=6 && base.substr(0,5)=="monst" && base.substr(5).find_first_not_of( "0123456789" ) == std::string::npos) + return {224,360}; + return {0,0}; + } + std::shared_ptr texture; + sf::Vector2u dimension; }; +typedef std::pair Texture_pos; #endif /* texture_h */ diff --git a/src/location.cpp b/src/location.cpp index ef1dd8b0..47aaaf94 100644 --- a/src/location.cpp +++ b/src/location.cpp @@ -200,6 +200,12 @@ void rectangle::inset(int dh, int dv) { top += dv; bottom -= dv; } +rectangle rectangle::rescale(sf::Vector2u const &fromSize, sf::Vector2u const &toSize) const +{ + float const scale[]={float(toSize.x)/fromSize.x, float(toSize.y)/fromSize.y}; + return rectangle(int(scale[1]*top), int(scale[0]*left), int(scale[1]*bottom), int(scale[0]*right)); +} + rectangle& rectangle::operator&=(rectangle other) { left = std::max(left, other.left); top = std::max(top, other.top); diff --git a/src/location.hpp b/src/location.hpp index 94ecb256..5bf58149 100644 --- a/src/location.hpp +++ b/src/location.hpp @@ -93,6 +93,7 @@ struct rectangle { template void offset(sf::Vector2 diff) {offset(diff.x,diff.y);} void inset(int dh, int dv); + rectangle rescale(sf::Vector2u const &fromSize, sf::Vector2u const &toSize) const; rectangle& operator&=(rectangle other); template operator typename sf::template Rect() { diff --git a/src/pcedit/pc.graphics.cpp b/src/pcedit/pc.graphics.cpp index 2e6a26c2..5a77d7db 100644 --- a/src/pcedit/pc.graphics.cpp +++ b/src/pcedit/pc.graphics.cpp @@ -402,11 +402,11 @@ void display_party() { if(univ.party[i].main_status != eMainStatus::ABSENT) { // PC exists? // draw PC graphic pic_num_t pic = univ.party[i].which_graphic; - std::shared_ptr from_gw; + Texture from_gw; if(pic >= 1000) { bool isParty = pic >= 10000; pic_num_t need_pic = pic % 1000; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(need_pic, isParty); + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(need_pic, isParty); } else if(pic >= 100) { // Note that we assume it's a 1x1 graphic. // PCs can't be larger than that, but we leave it to the scenario designer to avoid assigning larger graphics. @@ -414,12 +414,12 @@ void display_party() { pic_num_t picture_wanted = m_pic_index[need_pic].i % 20; from_rect = calc_rect(2 * (picture_wanted / 10), picture_wanted % 10); int which_sheet = m_pic_index[need_pic].i / 20; - from_gw = &ResMgr::graphics.get("monst" + std::to_string(1 + which_sheet)); + from_gw = *ResMgr::textures.get("monst" + std::to_string(1 + which_sheet)); } else { from_rect = calc_rect(2 * (pic / 8), pic % 8); - from_gw = &ResMgr::graphics.get("pcs"); + from_gw = *ResMgr::textures.get("pcs"); } - rect_draw_some_item(*from_gw,from_rect,mainPtr,pc_area_buttons[i][1],sf::BlendAlpha); + rect_draw_some_item(from_gw,from_rect,mainPtr,pc_area_buttons[i][1],sf::BlendAlpha); // draw name style.pointSize = 9; diff --git a/src/scenedit/scen.graphics.cpp b/src/scenedit/scen.graphics.cpp index b2b85569..93b8f353 100644 --- a/src/scenedit/scen.graphics.cpp +++ b/src/scenedit/scen.graphics.cpp @@ -534,9 +534,9 @@ void set_up_terrain_buttons(bool reset) { ter_from = ter_from_base; pic = scenario.ter_types[i].picture; if(pic >= 1000) { - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic % 1000); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, draw_rect); + Texture source_gworld; + std::tie(source_gworld, ter_from) = spec_scen_g.find_graphic(pic % 1000); + rect_draw_some_item(source_gworld, ter_from, mainPtr, draw_rect); } else if(pic < 960) { pic = pic % 50; @@ -571,55 +571,55 @@ void set_up_terrain_buttons(bool reset) { pic %= 1000; tiny_to.width() = tiny_to.width() / 2; tiny_to.height() = tiny_to.height() / 2; - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); + Texture source_gworld; + std::tie(source_gworld,ter_from) = spec_scen_g.find_graphic(pic); + rect_draw_some_item(source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); pic++; tiny_to.offset(tiny_to.width(), 0); - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); + std::tie(source_gworld,ter_from) = spec_scen_g.find_graphic(pic); + rect_draw_some_item(source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); pic++; tiny_to.offset(-tiny_to.width(), tiny_to.height()); - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); + std::tie(source_gworld,ter_from) = spec_scen_g.find_graphic(pic); + rect_draw_some_item(source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); pic++; tiny_to.offset(tiny_to.width(), 0); - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); + std::tie(source_gworld,ter_from) = spec_scen_g.find_graphic(pic); + rect_draw_some_item(source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); } else if(pic >= 3000) { pic %= 1000; tiny_to.width() = tiny_to.width() / 2; tiny_to.height() = tiny_to.height() / 2; tiny_to.offset(tiny_to.width() / 2, 0); - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); + Texture source_gworld; + std::tie(source_gworld,ter_from) = spec_scen_g.find_graphic(pic); + rect_draw_some_item(source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); pic++; tiny_to.offset(0, tiny_to.height()); - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); + std::tie(source_gworld,ter_from) = spec_scen_g.find_graphic(pic); + rect_draw_some_item(source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); } else if(pic >= 2000) { pic %= 1000; tiny_to.width() = tiny_to.width() / 2; tiny_to.height() = tiny_to.height() / 2; tiny_to.offset(0, tiny_to.height() / 2); - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); + Texture source_gworld; + std::tie(source_gworld,ter_from) = spec_scen_g.find_graphic(pic); + rect_draw_some_item(source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); pic++; tiny_to.offset(tiny_to.width(), 0); - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); + std::tie(source_gworld,ter_from) = spec_scen_g.find_graphic(pic); + rect_draw_some_item(source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); } else if(pic >= 1000) { pic %= 1000; - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); + Texture source_gworld; + std::tie(source_gworld,ter_from) = spec_scen_g.find_graphic(pic); + rect_draw_some_item(source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); } else { auto pic_info = m_pic_index[pic]; pic = pic_info.i; auto monst_gworld = [](pic_num_t sheet_num) { - return *ResMgr::graphics.get("monst" + std::to_string(1 + sheet_num)); + return *ResMgr::textures.get("monst" + std::to_string(1 + sheet_num)); }; if(pic_info.x == 2 && pic_info.y == 2) { tiny_to.width() = tiny_to.width() / 2; @@ -669,9 +669,9 @@ void set_up_terrain_buttons(bool reset) { tiny_to = draw_rect; frame_rect(mainPtr, tiny_to, sf::Color::Black); if(pic >= 1000) { - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, ter_from) = spec_scen_g.find_graphic(pic % 1000); - rect_draw_some_item(*source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); + Texture source_gworld; + std::tie(source_gworld,ter_from) = spec_scen_g.find_graphic(pic % 1000); + rect_draw_some_item(source_gworld, ter_from, mainPtr, tiny_to, sf::BlendAlpha); } else { tiny_from = {0,0,18,18}; tiny_from.offset((pic % 10) * 18,(pic / 10) * 18); @@ -992,7 +992,7 @@ void draw_terrain(){ void draw_monsts() { short width,height,m_start_pic; - std::shared_ptr from_gworld = nullptr; + Texture from_gworld; rectangle source_rect; location where_draw,store_loc; @@ -1008,14 +1008,14 @@ void draw_monsts() { if((where_draw.x == minmax(0,8,where_draw.x)) && (where_draw.y == minmax(0,8,where_draw.y)) && (scenario.scen_monsters[town->creatures[i].number].picture_num >= 1000)) { - graf_pos_ref(from_gworld, source_rect) = spec_scen_g.find_graphic((scenario.scen_monsters[town->creatures[i].number].picture_num + k) % 1000); + std::tie(from_gworld,source_rect) = spec_scen_g.find_graphic((scenario.scen_monsters[town->creatures[i].number].picture_num + k) % 1000); store_loc.x += k % width; store_loc.y += k / width; } else if(scenario.scen_monsters[town->creatures[i].number].picture_num < 1000) { m_start_pic = m_pic_index[scenario.scen_monsters[town->creatures[i].number].picture_num].i + k; int which_sheet = m_start_pic / 20; - from_gworld = &ResMgr::graphics.get("monst" + std::to_string(1 + which_sheet)); + from_gworld = *ResMgr::textures.get("monst" + std::to_string(1 + which_sheet)); m_start_pic = m_start_pic % 20; source_rect = calc_rect(2 * (m_start_pic / 10), m_start_pic % 10); store_loc.x += k % width; @@ -1035,7 +1035,7 @@ void draw_monsts() { destrec.top = destrec.bottom - (source_rect.bottom - source_rect.top); destrec.offset(TER_RECT_UL_X,TER_RECT_UL_Y); - rect_draw_some_item(*from_gworld, source_rect, mainPtr, destrec, sf::BlendAlpha); + rect_draw_some_item(from_gworld, source_rect, mainPtr, destrec, sf::BlendAlpha); } } } @@ -1075,11 +1075,11 @@ void draw_items() { (where_draw.y >= 0) && (where_draw.y <= 8)) { if(pic_num >= 1000) { - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(pic_num - 1000); + Texture source_gworld; + std::tie(source_gworld,source_rect)= spec_scen_g.find_graphic(pic_num - 1000); dest_rect = calc_rect(where_draw.x,where_draw.y); dest_rect.offset(8+TER_RECT_UL_X,8+TER_RECT_UL_Y); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, dest_rect, sf::BlendAlpha); + rect_draw_some_item(source_gworld, source_rect, mainPtr, dest_rect, sf::BlendAlpha); } else { source_rect = get_item_template_rect(pic_num); @@ -1111,7 +1111,7 @@ void draw_one_terrain_spot (short i,short j,ter_num_t terrain_to_draw) { location where_draw; rectangle source_rect; short picture_wanted; - std::shared_ptr source_gworld; + Texture source_gworld; if(i < 0 || i > 8 || j < 0 || j > 8) return; @@ -1122,10 +1122,10 @@ void draw_one_terrain_spot (short i,short j,ter_num_t terrain_to_draw) { where_draw.y = (char) j; if(picture_wanted >= 1000 && spec_scen_g) { - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); } else if(picture_wanted >= 960) { - source_gworld = &ResMgr::graphics.get("teranim"); + source_gworld = *ResMgr::textures.get("teranim"); picture_wanted -= 960; source_rect.left = 112 * (picture_wanted / 5); source_rect.right = source_rect.left + 28; @@ -1135,7 +1135,7 @@ void draw_one_terrain_spot (short i,short j,ter_num_t terrain_to_draw) { else { source_rect = get_template_rect(terrain_to_draw); int which_sheet = picture_wanted / 50; - source_gworld = &ResMgr::graphics.get("ter" + std::to_string(1 + which_sheet)); + source_gworld = *ResMgr::textures.get("ter" + std::to_string(1 + which_sheet)); } rectangle destrec; @@ -1145,14 +1145,14 @@ void draw_one_terrain_spot (short i,short j,ter_num_t terrain_to_draw) { destrec.bottom = destrec.top + BITMAP_HEIGHT; destrec.offset(TER_RECT_UL_X,TER_RECT_UL_Y); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, destrec); + rect_draw_some_item(source_gworld, source_rect, mainPtr, destrec); } void draw_one_tiny_terrain_spot (short i,short j,ter_num_t terrain_to_draw,short size,bool road) { rectangle dest_rect = {0,0,size,size},from_rect = {0,0,12,12}; short picture_wanted; bool drawLargeIcon = false; - std::shared_ptr source_gworld; + Texture source_gworld; picture_wanted = scenario.ter_types[terrain_to_draw].map_pic; if(picture_wanted == NO_PIC) { @@ -1163,21 +1163,21 @@ void draw_one_tiny_terrain_spot (short i,short j,ter_num_t terrain_to_draw,short dest_rect.offset(8 + TER_RECT_UL_X + size * i, 8 + TER_RECT_UL_Y + size * j); if(drawLargeIcon) { if(picture_wanted >= 1000) { - graf_pos_ref(source_gworld, from_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); + std::tie(source_gworld,from_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); } else if(picture_wanted >= 960) { - source_gworld = &ResMgr::graphics.get("teranim"); + source_gworld = *ResMgr::textures.get("teranim"); from_rect = calc_rect(4 * ((picture_wanted - 960) / 5),(picture_wanted - 960) % 5); } else { int which_sheet = picture_wanted / 50; - source_gworld = &ResMgr::graphics.get("ter" + std::to_string(1 + which_sheet)); + source_gworld = *ResMgr::textures.get("ter" + std::to_string(1 + which_sheet)); picture_wanted %= 50; from_rect = calc_rect(picture_wanted % 10, picture_wanted / 10); } - rect_draw_some_item(*source_gworld, from_rect, mainPtr, dest_rect); + rect_draw_some_item(source_gworld, from_rect, mainPtr, dest_rect); } else { if(picture_wanted >= 1000) { - std::shared_ptr from_gw; - graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); + Texture from_gw; + std::tie(from_gw,from_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); from_rect.right = from_rect.left + 12; from_rect.bottom = from_rect.top + 12; picture_wanted /= 1000; picture_wanted--; @@ -1279,9 +1279,9 @@ static void place_selected_terrain(ter_num_t ter, rectangle draw_rect) { pic_num_t picture_wanted = scenario.ter_types[ter].picture; rectangle source_rect; if(picture_wanted >= 1000) { - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); - rect_draw_some_item(*source_gworld, source_rect,mainPtr,draw_rect); + Texture source_gworld; + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); + rect_draw_some_item(source_gworld, source_rect, mainPtr,draw_rect); } else if(picture_wanted >= 960) { picture_wanted -= 960; @@ -1395,55 +1395,55 @@ void place_location() { picture_wanted %= 1000; to_rect.width() = to_rect.width() / 2; to_rect.height() = to_rect.height() / 2; - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); + Texture source_gworld; + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted); + rect_draw_some_item(source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); picture_wanted++; to_rect.offset(to_rect.width(), 0); - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted); + rect_draw_some_item(source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); picture_wanted++; to_rect.offset(-to_rect.width(), to_rect.height()); - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted); + rect_draw_some_item(source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); picture_wanted++; to_rect.offset(to_rect.width(), 0); - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted); + rect_draw_some_item(source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); } else if(picture_wanted >= 3000) { picture_wanted %= 1000; to_rect.width() = to_rect.width() / 2; to_rect.height() = to_rect.height() / 2; to_rect.offset(to_rect.width() / 2, 0); - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); + Texture source_gworld; + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted); + rect_draw_some_item(source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); picture_wanted++; to_rect.offset(0, to_rect.height()); - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted); + rect_draw_some_item(source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); } else if(picture_wanted >= 2000) { picture_wanted %= 1000; to_rect.width() = to_rect.width() / 2; to_rect.height() = to_rect.height() / 2; to_rect.offset(0, to_rect.height() / 2); - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); + Texture source_gworld; + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted); + rect_draw_some_item(source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); picture_wanted++; to_rect.offset(to_rect.width(), 0); - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted); + rect_draw_some_item(source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); } else if(picture_wanted >= 1000) { picture_wanted %= 1000; - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted); - rect_draw_some_item(*source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); + Texture source_gworld; + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted); + rect_draw_some_item(source_gworld, source_rect, mainPtr, to_rect, sf::BlendAlpha); } else { auto pic_info = m_pic_index[picture_wanted]; picture_wanted = pic_info.i; auto monst_gworld = [](pic_num_t sheet_num) { - return *ResMgr::graphics.get("monst" + std::to_string(1 + sheet_num)); + return *ResMgr::textures.get("monst" + std::to_string(1 + sheet_num)); }; if(pic_info.x == 2 && pic_info.y == 2) { to_rect.width() = to_rect.width() / 2; @@ -1490,9 +1490,9 @@ void place_location() { } else if(overall_mode == MODE_PLACE_ITEM || overall_mode == MODE_PLACE_SAME_ITEM) { picture_wanted = scenario.scen_items[mode_count].graphic_num; if(picture_wanted >= 1000) { - std::shared_ptr source_gworld; - graf_pos_ref(source_gworld, source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); - rect_draw_some_item(*source_gworld,source_rect,mainPtr,draw_rect,sf::BlendAlpha); + Texture source_gworld; + std::tie(source_gworld,source_rect) = spec_scen_g.find_graphic(picture_wanted % 1000); + rect_draw_some_item(source_gworld,source_rect,mainPtr,draw_rect,sf::BlendAlpha); } else if(picture_wanted < 55) { source_rect = calc_rect(picture_wanted % 5,picture_wanted / 5); rect_draw_some_item(*ResMgr::textures.get("objects"),source_rect,mainPtr,draw_rect,sf::BlendAlpha);