From c31bb2d0ffb032d8d0d4f16ed891d3e9e855cee0 Mon Sep 17 00:00:00 2001 From: Laurent alonso Date: Thu, 15 Oct 2020 19:39:41 +0200 Subject: [PATCH] graphics: continue to rewrite code to be more simple ; retrieve modifications to allow to load some graphics with different resolutions: actionhelp, bigscenpics, fighthelp, invenhelp, outhelp, scenpics, stathelp, townhelp, dlogpics, dlogscrollled, dlogscrollwh, edbuttons, edsplash, pcedtitle. --- src/dialogxml/widgets/pict.cpp | 20 +++++------ src/dialogxml/widgets/pict.hpp | 3 +- src/dialogxml/widgets/scrollbar.cpp | 4 +-- src/gfx/texture.hpp | 53 +++++++++++++++++++++-------- src/pcedit/pc.graphics.cpp | 16 ++++----- src/scenedit/scen.graphics.cpp | 39 +++++++++++---------- 6 files changed, 82 insertions(+), 53 deletions(-) diff --git a/src/dialogxml/widgets/pict.cpp b/src/dialogxml/widgets/pict.cpp index 1477fe10..f12625e8 100644 --- a/src/dialogxml/widgets/pict.cpp +++ b/src/dialogxml/widgets/pict.cpp @@ -129,13 +129,14 @@ ePicType cPict::getPicType(){ return picType; } +// AsanU: unset cPict::cPict(cDialog& parent) : - cControl(CTRL_PICT,parent) { + cControl(CTRL_PICT,parent), drawScaled(false) { setFormat(TXT_FRAME, FRM_SOLID); } cPict::cPict(sf::RenderWindow& parent) : - cControl(CTRL_PICT, parent) { + cControl(CTRL_PICT, parent), drawScaled(false) { setFormat(TXT_FRAME, FRM_SOLID); } @@ -577,15 +578,14 @@ void cPict::recalcRect() { case PIC_CUSTOM_FULL: if(drawScaled) break; auto sheet = getSheet(SHEET_FULL, picNum); - sf::Vector2u sz = sheet->getSize(); - bounds.width() = sz.x; - bounds.height() = sz.y; + bounds.width() = sheet->dimension.x; + bounds.height() = sheet->dimension.y; break; } setBounds(bounds); } -std::shared_ptr cPict::getSheet(eSheetType type, size_t n) { +std::shared_ptr cPict::getSheet(eSheetType type, size_t n) { std::ostringstream sout; bool purgeable = false; switch(type) { @@ -672,7 +672,7 @@ std::shared_ptr cPict::getSheet(eSheetType type, size_t n) { sout << "sheet" << n; } } - return &ResMgr::graphics.get(sout.str(), purgeable); + return &ResMgr::textures.get(sout.str(), purgeable); } void cPict::draw(){ @@ -862,7 +862,7 @@ void cPict::drawPresetItem(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; + std::shared_ptr from_gw; rectangle from_rect = {0,0,18,18}; if(num < 55) { from_gw = getSheet(SHEET_ITEM); @@ -916,9 +916,9 @@ void cPict::drawPresetBoom(short num, rectangle to_rect){ } void cPict::drawFullSheet(short num, rectangle to_rect){ - rectangle from_rect; auto from_gw = getSheet(SHEET_FULL, num); - from_rect = rectangle(*from_gw); + if (!from_gw) return; + rectangle from_rect = rectangle(*from_gw); if(!drawScaled) { to_rect.right = to_rect.left + (from_rect.right - from_rect.left); to_rect.bottom = to_rect.top + (from_rect.bottom - from_rect.top); diff --git a/src/dialogxml/widgets/pict.hpp b/src/dialogxml/widgets/pict.hpp index 5843b9c8..7a3b2719 100644 --- a/src/dialogxml/widgets/pict.hpp +++ b/src/dialogxml/widgets/pict.hpp @@ -18,6 +18,7 @@ #include #include "control.hpp" #include "pictypes.hpp" +#include "texture.hpp" /// A simple icon. /// This control can also be made clickable. @@ -87,7 +88,7 @@ public: cPict& operator=(cPict& other) = delete; cPict(cPict& other) = delete; private: - static std::shared_ptr getSheet(eSheetType type, size_t n = 0); + static std::shared_ptr getSheet(eSheetType type, size_t n = 0); static short animFrame; pic_num_t picNum; ePicType picType; diff --git a/src/dialogxml/widgets/scrollbar.cpp b/src/dialogxml/widgets/scrollbar.cpp index 16a12acd..c1255730 100644 --- a/src/dialogxml/widgets/scrollbar.cpp +++ b/src/dialogxml/widgets/scrollbar.cpp @@ -395,7 +395,7 @@ void cScrollbar::draw_horizontal() { draw_rect.width() = btn_size; if(depressed && pressedPart == PART_UP) from_rect = up_rect[style][HORZ_PRESSED]; - sf::Texture scroll_gw = *ResMgr::graphics.get(scroll_textures[style]); + auto const &scroll_gw = *ResMgr::textures.get(scroll_textures[style]); rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect); if(pos > 0) { from_rect = bar_rect[style][HORZ]; @@ -458,7 +458,7 @@ void cScrollbar::draw_vertical() { draw_rect.height() = btn_size; if(depressed && pressedPart == PART_UP) from_rect = up_rect[style][VERT_PRESSED]; - sf::Texture scroll_gw = *ResMgr::graphics.get(scroll_textures[style]); + auto const &scroll_gw = *ResMgr::textures.get(scroll_textures[style]); rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect); if(pos > 0) { from_rect = bar_rect[style][VERT]; diff --git a/src/gfx/texture.hpp b/src/gfx/texture.hpp index eea3e8ba..9ca4d4db 100644 --- a/src/gfx/texture.hpp +++ b/src/gfx/texture.hpp @@ -32,25 +32,50 @@ struct Texture { 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 = { - { "buttons.png", {192,115} }, - { "spidlogo.png", {350,350} }, - { "inventory.png", {271,144} }, + { "actionhelp", {275,100} }, + { "bigscenpics", {256,64} }, + { "booms", {224,252} }, + { "buttons", {192,115} }, + { "dlogpics", {144,360} }, + { "fields", {224,144} }, + { "fighthelp", {320,125} }, + { "invenhelp", {138,112} }, + { "inventory", {271,144} }, + { "missiles", {144,288} }, + { "objects", {140,396} }, + { "outhelp", {320,125} }, { "pcedbuttons", {114,57} }, - { "startanim.png", {280,590} }, - { "startbut.png", {301,48} }, - { "startsplash.png", {640,480} }, - { "startup.png", {602, 322} }, - { "statarea.png", {271,116} }, - { "terscreen.png", {278,350} }, - { "textbar.png", {279,22} }, - { "transcript.png", {256,138} }, + { "pcs", {280,576} }, + { "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} }, }; - auto const &it=nameToDimensions.find(name); + auto const &it=nameToDimensions.find(base); if (it!=nameToDimensions.end()) return it->second; - else - return {0,0}; + // 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; diff --git a/src/pcedit/pc.graphics.cpp b/src/pcedit/pc.graphics.cpp index eccfa157..96612078 100644 --- a/src/pcedit/pc.graphics.cpp +++ b/src/pcedit/pc.graphics.cpp @@ -188,13 +188,13 @@ void init_main_buttons() { void Set_up_win () { // Preload the main PC editor interface images - ResMgr::graphics.get("pcedtitle"); - ResMgr::graphics.get("icon"); - ResMgr::graphics.get("invenbtns"); - ResMgr::graphics.get("staticons"); - ResMgr::graphics.get("dlogpics"); + ResMgr::textures.get("pcedtitle"); + ResMgr::textures.get("icon"); + ResMgr::textures.get("invenbtns"); + ResMgr::textures.get("staticons"); + ResMgr::textures.get("dlogpics"); ResMgr::textures.get("pcedbuttons"); - ResMgr::graphics.get("pcs"); + ResMgr::textures.get("pcs"); } static void draw_main_screen(); @@ -239,12 +239,12 @@ void draw_main_screen() { tileImage(mainPtr,windRect,bg[12]); mainPtr.setView(mainView); - sf::Texture& icon_gworld = *ResMgr::graphics.get("icon"); + auto const & icon_gworld = *ResMgr::textures.get("icon"); dest_rec = source_rect = rectangle(icon_gworld); dest_rec.offset(23, 16); rect_draw_some_item(icon_gworld,source_rect,mainPtr,dest_rec); - sf::Texture& title_gworld = *ResMgr::graphics.get("pcedtitle"); + auto const &title_gworld = *ResMgr::textures.get("pcedtitle"); dest_rec = source_rect = rectangle(title_gworld); dest_rec.offset(66, 0); rect_draw_some_item(title_gworld,source_rect,mainPtr,dest_rec,sf::BlendAlpha); diff --git a/src/scenedit/scen.graphics.cpp b/src/scenedit/scen.graphics.cpp index 49b61654..e52f597f 100644 --- a/src/scenedit/scen.graphics.cpp +++ b/src/scenedit/scen.graphics.cpp @@ -358,7 +358,7 @@ void Set_up_win() { void run_startup_g() { sf::Event event; - sf::Texture& pict_to_draw = *ResMgr::graphics.get("edsplash", true); + auto & pict_to_draw = *ResMgr::textures.get("edsplash", true); rectangle dest_rect = rectangle(pict_to_draw); play_sound(-95); @@ -374,16 +374,16 @@ void run_startup_g() { } // It's never needed again, so don't keep it in GPU memory - ResMgr::graphics.free("edsplash"); + ResMgr::textures.free("edsplash"); } void load_graphics(){ // Preload the main editor interface graphics - ResMgr::graphics.get("edbuttons"); - ResMgr::graphics.get("teranim"); + ResMgr::textures.get("edbuttons"); + ResMgr::textures.get("teranim"); ResMgr::graphics.get("fields"); - ResMgr::graphics.get("objects"); - ResMgr::graphics.get("tinyobj"); + ResMgr::textures.get("objects"); + ResMgr::textures.get("tinyobj"); ResMgr::graphics.get("termap"); } @@ -455,7 +455,8 @@ void draw_lb_slot (short which,short mode) { from_rect = blue_button_from; if(mode > 0) from_rect.offset(0,from_rect.height()); - rect_draw_some_item(*ResMgr::graphics.get("edbuttons"),from_rect,mainPtr,left_buttons[which][1]); + auto const &edbuttons=*ResMgr::textures.get("edbuttons"); + rect_draw_some_item(edbuttons,from_rect,mainPtr,left_buttons[which][1]); } if(left_button_status[which].mode == LB_INDENT) text_rect.left += 16; @@ -520,7 +521,7 @@ void set_up_terrain_buttons(bool reset) { int end = min(first + 256, max); // first make terrain buttons - sf::Texture& editor_mixed = *ResMgr::graphics.get("edbuttons"); + auto const &editor_mixed = *ResMgr::textures.get("edbuttons"); for(short i = first; i < end; i++) { rectangle draw_rect = terrain_rects[i - first]; draw_rect.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y); @@ -550,7 +551,7 @@ void set_up_terrain_buttons(bool reset) { ter_from.right = ter_from.left + 28; ter_from.top = 36 * (pic % 5); ter_from.bottom = ter_from.top + 36; - rect_draw_some_item(*ResMgr::graphics.get("teranim"), ter_from, mainPtr, draw_rect); + rect_draw_some_item(*ResMgr::textures.get("teranim"), ter_from, mainPtr, draw_rect); } small_i = get_small_icon(i); @@ -674,7 +675,7 @@ void set_up_terrain_buttons(bool reset) { } else { tiny_from = {0,0,18,18}; tiny_from.offset((pic % 10) * 18,(pic / 10) * 18); - rect_draw_some_item(*ResMgr::graphics.get("tinyobj"), tiny_from, mainPtr, tiny_to, sf::BlendAlpha); + rect_draw_some_item(*ResMgr::textures.get("tinyobj"), tiny_from, mainPtr, tiny_to, sf::BlendAlpha); } break; } @@ -812,7 +813,7 @@ void draw_terrain(){ } if(is_field_type(cen_x + q - 4,cen_y + r - 4, BARRIER_FIRE)) { from_rect = calc_rect(8,4); - rect_draw_some_item(*ResMgr::graphics.get("teranim"),from_rect,mainPtr,destrec,sf::BlendAlpha); + rect_draw_some_item(*ResMgr::textures.get("teranim"),from_rect,mainPtr,destrec,sf::BlendAlpha); } if(is_field_type(cen_x + q - 4,cen_y + r - 4, FIELD_QUICKFIRE)) { from_rect = calc_rect(7,1); @@ -820,7 +821,7 @@ void draw_terrain(){ } if(is_field_type(cen_x + q - 4,cen_y + r - 4, BARRIER_FORCE)) { from_rect = calc_rect(10,4); - rect_draw_some_item(*ResMgr::graphics.get("teranim"),from_rect,mainPtr,destrec,sf::BlendAlpha); + rect_draw_some_item(*ResMgr::textures.get("teranim"),from_rect,mainPtr,destrec,sf::BlendAlpha); } if(is_field_type(cen_x + q - 4,cen_y + r - 4, OBJECT_BLOCK)) { from_rect = calc_rect(3,0); @@ -848,7 +849,7 @@ void draw_terrain(){ if(!icons.empty()) { bool has_start = icons[0] == -1; rectangle tiny_from_base = {120, 0, 127, 7}; - sf::Texture& editor_mixed = *ResMgr::graphics.get("edbuttons"); + auto const &editor_mixed = *ResMgr::textures.get("edbuttons"); for(short icon : icons) { rectangle tiny_from = tiny_from_base; if(icon == -1) { @@ -1090,7 +1091,7 @@ void draw_items() { dest_rect.left += 5; dest_rect.right -= 5; } - rect_draw_some_item(*ResMgr::graphics.get((pic_num < 55) ? "objects" : "tinyobj"), + rect_draw_some_item(*ResMgr::textures.get((pic_num < 55) ? "objects" : "tinyobj"), source_rect, mainPtr, dest_rect,sf::BlendAlpha); } } @@ -1198,7 +1199,9 @@ void draw_one_tiny_terrain_spot (short i,short j,ter_num_t terrain_to_draw,short rectangle road_rect = dest_rect; int border = (size - 4) / 2; road_rect.inset(border,border); - rect_draw_some_item(*ResMgr::graphics.get("edbuttons"), {120, 231, 124, 235}, mainPtr, road_rect); + auto const &edbuttons=*ResMgr::textures.get("edbuttons"); + rectangle const road_from={120, 231, 124, 235}; + rect_draw_some_item(edbuttons, road_from, mainPtr, road_rect); } if(mouse_spot.x >= 0 && mouse_spot.y >= 0) { location where_draw(i,j); @@ -1286,7 +1289,7 @@ static void place_selected_terrain(ter_num_t ter, rectangle draw_rect) { source_rect.right = source_rect.left + 28; source_rect.top = 36 * (picture_wanted % 5); source_rect.bottom = source_rect.top + 36; - rect_draw_some_item(*ResMgr::graphics.get("teranim"),source_rect,mainPtr,draw_rect); + rect_draw_some_item(*ResMgr::textures.get("teranim"),source_rect,mainPtr,draw_rect); } else { source_rect = get_template_rect(ter); @@ -1302,7 +1305,7 @@ static void place_selected_terrain(ter_num_t ter, rectangle draw_rect) { rectangle tiny_from = base_small_button_from; tiny_from.offset(7 * (small_i % 30),7 * (small_i / 30)); if(small_i >= 0 && small_i < 255) - rect_draw_some_item(*ResMgr::graphics.get("edbuttons"),tiny_from,mainPtr,tiny_to); + rect_draw_some_item(*ResMgr::textures.get("edbuttons"),tiny_from,mainPtr,tiny_to); } void place_location() { @@ -1519,7 +1522,7 @@ void place_location() { rect_draw_some_item(*ResMgr::graphics.get("teranim"),source_rect,mainPtr,draw_rect,sf::BlendAlpha); } else if(overall_mode == MODE_PLACE_FORCE_BARRIER) { source_rect = calc_rect(8, 4); - rect_draw_some_item(*ResMgr::graphics.get("teranim"),source_rect,mainPtr,draw_rect,sf::BlendAlpha); + rect_draw_some_item(*ResMgr::textures.get("teranim"),source_rect,mainPtr,draw_rect,sf::BlendAlpha); } else if(overall_mode == MODE_PLACE_QUICKFIRE) { draw_field = true; source_rect = calc_rect(7, 1);