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.
This commit is contained in:
Laurent alonso
2020-10-15 19:39:41 +02:00
committed by Celtic Minstrel
parent e625927a29
commit c31bb2d0ff
6 changed files with 82 additions and 53 deletions

View File

@@ -129,13 +129,14 @@ ePicType cPict::getPicType(){
return picType; return picType;
} }
// AsanU: unset
cPict::cPict(cDialog& parent) : cPict::cPict(cDialog& parent) :
cControl(CTRL_PICT,parent) { cControl(CTRL_PICT,parent), drawScaled(false) {
setFormat(TXT_FRAME, FRM_SOLID); setFormat(TXT_FRAME, FRM_SOLID);
} }
cPict::cPict(sf::RenderWindow& parent) : cPict::cPict(sf::RenderWindow& parent) :
cControl(CTRL_PICT, parent) { cControl(CTRL_PICT, parent), drawScaled(false) {
setFormat(TXT_FRAME, FRM_SOLID); setFormat(TXT_FRAME, FRM_SOLID);
} }
@@ -577,15 +578,14 @@ void cPict::recalcRect() {
case PIC_CUSTOM_FULL: case PIC_CUSTOM_FULL:
if(drawScaled) break; if(drawScaled) break;
auto sheet = getSheet(SHEET_FULL, picNum); auto sheet = getSheet(SHEET_FULL, picNum);
sf::Vector2u sz = sheet->getSize(); bounds.width() = sheet->dimension.x;
bounds.width() = sz.x; bounds.height() = sheet->dimension.y;
bounds.height() = sz.y;
break; break;
} }
setBounds(bounds); setBounds(bounds);
} }
std::shared_ptr<const sf::Texture> cPict::getSheet(eSheetType type, size_t n) { std::shared_ptr<const Texture> cPict::getSheet(eSheetType type, size_t n) {
std::ostringstream sout; std::ostringstream sout;
bool purgeable = false; bool purgeable = false;
switch(type) { switch(type) {
@@ -672,7 +672,7 @@ std::shared_ptr<const sf::Texture> cPict::getSheet(eSheetType type, size_t n) {
sout << "sheet" << n; sout << "sheet" << n;
} }
} }
return &ResMgr::graphics.get(sout.str(), purgeable); return &ResMgr::textures.get(sout.str(), purgeable);
} }
void cPict::draw(){ void cPict::draw(){
@@ -862,7 +862,7 @@ void cPict::drawPresetItem(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28; to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36; to_rect.bottom = to_rect.top + 36;
fill_rect(*inWindow, to_rect, sf::Color::Black); fill_rect(*inWindow, to_rect, sf::Color::Black);
std::shared_ptr<const sf::Texture> from_gw; std::shared_ptr<const Texture> from_gw;
rectangle from_rect = {0,0,18,18}; rectangle from_rect = {0,0,18,18};
if(num < 55) { if(num < 55) {
from_gw = getSheet(SHEET_ITEM); 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){ void cPict::drawFullSheet(short num, rectangle to_rect){
rectangle from_rect;
auto from_gw = getSheet(SHEET_FULL, num); auto from_gw = getSheet(SHEET_FULL, num);
from_rect = rectangle(*from_gw); if (!from_gw) return;
rectangle from_rect = rectangle(*from_gw);
if(!drawScaled) { if(!drawScaled) {
to_rect.right = to_rect.left + (from_rect.right - from_rect.left); to_rect.right = to_rect.left + (from_rect.right - from_rect.left);
to_rect.bottom = to_rect.top + (from_rect.bottom - from_rect.top); to_rect.bottom = to_rect.top + (from_rect.bottom - from_rect.top);

View File

@@ -18,6 +18,7 @@
#include <map> #include <map>
#include "control.hpp" #include "control.hpp"
#include "pictypes.hpp" #include "pictypes.hpp"
#include "texture.hpp"
/// A simple icon. /// A simple icon.
/// This control can also be made clickable. /// This control can also be made clickable.
@@ -87,7 +88,7 @@ public:
cPict& operator=(cPict& other) = delete; cPict& operator=(cPict& other) = delete;
cPict(cPict& other) = delete; cPict(cPict& other) = delete;
private: private:
static std::shared_ptr<const sf::Texture> getSheet(eSheetType type, size_t n = 0); static std::shared_ptr<const Texture> getSheet(eSheetType type, size_t n = 0);
static short animFrame; static short animFrame;
pic_num_t picNum; pic_num_t picNum;
ePicType picType; ePicType picType;

View File

@@ -395,7 +395,7 @@ void cScrollbar::draw_horizontal() {
draw_rect.width() = btn_size; draw_rect.width() = btn_size;
if(depressed && pressedPart == PART_UP) if(depressed && pressedPart == PART_UP)
from_rect = up_rect[style][HORZ_PRESSED]; 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); rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
if(pos > 0) { if(pos > 0) {
from_rect = bar_rect[style][HORZ]; from_rect = bar_rect[style][HORZ];
@@ -458,7 +458,7 @@ void cScrollbar::draw_vertical() {
draw_rect.height() = btn_size; draw_rect.height() = btn_size;
if(depressed && pressedPart == PART_UP) if(depressed && pressedPart == PART_UP)
from_rect = up_rect[style][VERT_PRESSED]; 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); rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
if(pos > 0) { if(pos > 0) {
from_rect = bar_rect[style][VERT]; from_rect = bar_rect[style][VERT];

View File

@@ -32,25 +32,50 @@ struct Texture {
return rectangle(0, 0, dimension.y, dimension.x); return rectangle(0, 0, dimension.y, dimension.x);
} }
static sf::Vector2u getApplicationDimension(std::string const &name) { 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<std::string, sf::Vector2u> nameToDimensions = { static std::map<std::string, sf::Vector2u> nameToDimensions = {
{ "buttons.png", {192,115} }, { "actionhelp", {275,100} },
{ "spidlogo.png", {350,350} }, { "bigscenpics", {256,64} },
{ "inventory.png", {271,144} }, { "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} }, { "pcedbuttons", {114,57} },
{ "startanim.png", {280,590} }, { "pcs", {280,576} },
{ "startbut.png", {301,48} }, { "scenpics", {160,224} },
{ "startsplash.png", {640,480} }, { "spidlogo", {350,350} },
{ "startup.png", {602, 322} }, { "startanim", {280,590} },
{ "statarea.png", {271,116} }, { "startbut", {301,48} },
{ "terscreen.png", {278,350} }, { "startsplash", {640,480} },
{ "textbar.png", {279,22} }, { "startup", {602,322} },
{ "transcript.png", {256,138} }, { "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()) if (it!=nameToDimensions.end())
return it->second; return it->second;
else // now check the special case terXXX.png and monstXXX.png
return {0,0}; 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<sf::Texture> texture; std::shared_ptr<sf::Texture> texture;
sf::Vector2u dimension; sf::Vector2u dimension;

View File

@@ -188,13 +188,13 @@ void init_main_buttons() {
void Set_up_win () { void Set_up_win () {
// Preload the main PC editor interface images // Preload the main PC editor interface images
ResMgr::graphics.get("pcedtitle"); ResMgr::textures.get("pcedtitle");
ResMgr::graphics.get("icon"); ResMgr::textures.get("icon");
ResMgr::graphics.get("invenbtns"); ResMgr::textures.get("invenbtns");
ResMgr::graphics.get("staticons"); ResMgr::textures.get("staticons");
ResMgr::graphics.get("dlogpics"); ResMgr::textures.get("dlogpics");
ResMgr::textures.get("pcedbuttons"); ResMgr::textures.get("pcedbuttons");
ResMgr::graphics.get("pcs"); ResMgr::textures.get("pcs");
} }
static void draw_main_screen(); static void draw_main_screen();
@@ -239,12 +239,12 @@ void draw_main_screen() {
tileImage(mainPtr,windRect,bg[12]); tileImage(mainPtr,windRect,bg[12]);
mainPtr.setView(mainView); 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 = source_rect = rectangle(icon_gworld);
dest_rec.offset(23, 16); dest_rec.offset(23, 16);
rect_draw_some_item(icon_gworld,source_rect,mainPtr,dest_rec); 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 = source_rect = rectangle(title_gworld);
dest_rec.offset(66, 0); dest_rec.offset(66, 0);
rect_draw_some_item(title_gworld,source_rect,mainPtr,dest_rec,sf::BlendAlpha); rect_draw_some_item(title_gworld,source_rect,mainPtr,dest_rec,sf::BlendAlpha);

View File

@@ -358,7 +358,7 @@ void Set_up_win() {
void run_startup_g() { void run_startup_g() {
sf::Event event; 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); rectangle dest_rect = rectangle(pict_to_draw);
play_sound(-95); play_sound(-95);
@@ -374,16 +374,16 @@ void run_startup_g() {
} }
// It's never needed again, so don't keep it in GPU memory // It's never needed again, so don't keep it in GPU memory
ResMgr::graphics.free("edsplash"); ResMgr::textures.free("edsplash");
} }
void load_graphics(){ void load_graphics(){
// Preload the main editor interface graphics // Preload the main editor interface graphics
ResMgr::graphics.get("edbuttons"); ResMgr::textures.get("edbuttons");
ResMgr::graphics.get("teranim"); ResMgr::textures.get("teranim");
ResMgr::graphics.get("fields"); ResMgr::graphics.get("fields");
ResMgr::graphics.get("objects"); ResMgr::textures.get("objects");
ResMgr::graphics.get("tinyobj"); ResMgr::textures.get("tinyobj");
ResMgr::graphics.get("termap"); ResMgr::graphics.get("termap");
} }
@@ -455,7 +455,8 @@ void draw_lb_slot (short which,short mode) {
from_rect = blue_button_from; from_rect = blue_button_from;
if(mode > 0) if(mode > 0)
from_rect.offset(0,from_rect.height()); 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) if(left_button_status[which].mode == LB_INDENT)
text_rect.left += 16; text_rect.left += 16;
@@ -520,7 +521,7 @@ void set_up_terrain_buttons(bool reset) {
int end = min(first + 256, max); int end = min(first + 256, max);
// first make terrain buttons // 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++) { for(short i = first; i < end; i++) {
rectangle draw_rect = terrain_rects[i - first]; rectangle draw_rect = terrain_rects[i - first];
draw_rect.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y); 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.right = ter_from.left + 28;
ter_from.top = 36 * (pic % 5); ter_from.top = 36 * (pic % 5);
ter_from.bottom = ter_from.top + 36; 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); small_i = get_small_icon(i);
@@ -674,7 +675,7 @@ void set_up_terrain_buttons(bool reset) {
} else { } else {
tiny_from = {0,0,18,18}; tiny_from = {0,0,18,18};
tiny_from.offset((pic % 10) * 18,(pic / 10) * 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; break;
} }
@@ -812,7 +813,7 @@ void draw_terrain(){
} }
if(is_field_type(cen_x + q - 4,cen_y + r - 4, BARRIER_FIRE)) { if(is_field_type(cen_x + q - 4,cen_y + r - 4, BARRIER_FIRE)) {
from_rect = calc_rect(8,4); 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)) { if(is_field_type(cen_x + q - 4,cen_y + r - 4, FIELD_QUICKFIRE)) {
from_rect = calc_rect(7,1); 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)) { if(is_field_type(cen_x + q - 4,cen_y + r - 4, BARRIER_FORCE)) {
from_rect = calc_rect(10,4); 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)) { if(is_field_type(cen_x + q - 4,cen_y + r - 4, OBJECT_BLOCK)) {
from_rect = calc_rect(3,0); from_rect = calc_rect(3,0);
@@ -848,7 +849,7 @@ void draw_terrain(){
if(!icons.empty()) { if(!icons.empty()) {
bool has_start = icons[0] == -1; bool has_start = icons[0] == -1;
rectangle tiny_from_base = {120, 0, 127, 7}; 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) { for(short icon : icons) {
rectangle tiny_from = tiny_from_base; rectangle tiny_from = tiny_from_base;
if(icon == -1) { if(icon == -1) {
@@ -1090,7 +1091,7 @@ void draw_items() {
dest_rect.left += 5; dest_rect.left += 5;
dest_rect.right -= 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); 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; rectangle road_rect = dest_rect;
int border = (size - 4) / 2; int border = (size - 4) / 2;
road_rect.inset(border,border); 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) { if(mouse_spot.x >= 0 && mouse_spot.y >= 0) {
location where_draw(i,j); 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.right = source_rect.left + 28;
source_rect.top = 36 * (picture_wanted % 5); source_rect.top = 36 * (picture_wanted % 5);
source_rect.bottom = source_rect.top + 36; 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 { else {
source_rect = get_template_rect(ter); 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; rectangle tiny_from = base_small_button_from;
tiny_from.offset(7 * (small_i % 30),7 * (small_i / 30)); tiny_from.offset(7 * (small_i % 30),7 * (small_i / 30));
if(small_i >= 0 && small_i < 255) 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() { 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); rect_draw_some_item(*ResMgr::graphics.get("teranim"),source_rect,mainPtr,draw_rect,sf::BlendAlpha);
} else if(overall_mode == MODE_PLACE_FORCE_BARRIER) { } else if(overall_mode == MODE_PLACE_FORCE_BARRIER) {
source_rect = calc_rect(8, 4); 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) { } else if(overall_mode == MODE_PLACE_QUICKFIRE) {
draw_field = true; draw_field = true;
source_rect = calc_rect(7, 1); source_rect = calc_rect(7, 1);