(partial merge of 97f0723a4c69580457a4e1ba4b0ff60ecd4e2621)

Also prep for color shifts in rendering

+ try to merge all rect_draw_some_item functions
This commit is contained in:
Terane436
2022-01-26 09:44:24 +01:00
committed by Celtic Minstrel
parent dcb82a5789
commit 485e401781
9 changed files with 92 additions and 107 deletions

View File

@@ -658,7 +658,7 @@ void put_text_bar(std::string str) {
void refresh_text_bar() {
mainPtr.setActive(false);
rect_draw_some_item(text_bar_gworld.getTexture(), rectangle(text_bar_gworld), mainPtr, win_to_rects[WINRECT_STATUS]);
rect_draw_some_item(Texture(text_bar_gworld.getTexture()), rectangle(text_bar_gworld), mainPtr, win_to_rects[WINRECT_STATUS]);
mainPtr.setActive();
}
@@ -847,7 +847,7 @@ void draw_terrain(short mode) {
place_trim((short) q,(short) r,where_draw,spec_terrain);
// if((is_town() && univ.town.is_spot(where_draw.x,where_draw.y)) ||
// (is_out() && univ.out.outdoors[univ.party.i_w_c.x][univ.party.i_w_c.y].is_special_spot(where_draw.x,where_draw.y)))
// Draw_Some_Item(roads_gworld, calc_rect(6, 0), terrain_screen_gworld, loc(q,r), 1, 0);
// Draw_Some_Item(roads_gworld, calc_rect(6, 0), terrain_screen_gworld, loc(q,r));
// TODO: Move draw_sfx, draw_items, draw_fields, draw_spec_items, etc to here
if(is_town() || is_combat())
@@ -899,7 +899,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::textures.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);
// Draw any posted labels, then clear them out
clip_rect(terrain_screen_gworld, {13, 13, 337, 265});
for(text_label_t lbl : posted_labels)
@@ -1068,7 +1068,7 @@ static void init_trim_mask(std::unique_ptr<sf::Texture>& mask, rectangle src_rec
render.create(28, 36);
render.clear(sf::Color::White);
rect_draw_some_item(*ResMgr::textures.get("trim"), src_rect, render, dest_rect);
render.display();
//render.display(); checkme: understand why this leads to up/down picture
mask.reset(new sf::Texture);
mask->create(28, 36);
mask->update(render.getTexture().copyToImage());
@@ -1139,11 +1139,9 @@ void draw_trim(short q,short r,short which_trim,ter_num_t ground_ter) {
init_trim_mask(walkway_masks[which], walkway_rects[which]);
mask = walkway_masks[which].get();
}
if (mask)
rect_draw_some_item(from_gworld, from_rect, *mask, terrain_screen_gworld, to_rect);
else
rect_draw_some_item(from_gworld, from_rect, terrain_screen_gworld, to_rect);
RenderState state;
if (mask) state.set_mask(*mask);
rect_draw_some_item(from_gworld, from_rect, terrain_screen_gworld, to_rect, state);
}
@@ -1473,7 +1471,7 @@ void draw_pointing_arrows() {
void redraw_terrain() {
rectangle to_rect = win_to_rects[WINRECT_TERVIEW], from_rect(terrain_screen_gworld);
rect_draw_some_item(terrain_screen_gworld.getTexture(), from_rect, mainPtr, to_rect);
rect_draw_some_item(Texture(terrain_screen_gworld.getTexture()), from_rect, mainPtr, to_rect);
apply_light_mask(true);
@@ -1611,7 +1609,7 @@ void redraw_partial_terrain(rectangle redraw_rect) {
// as rect_draw_some_item will shift redraw_rect before drawing, we need to compensate
redraw_rect.offset(5,5);
rect_draw_some_item(terrain_screen_gworld.getTexture(),from_rect,mainPtr,redraw_rect);
rect_draw_some_item(Texture(terrain_screen_gworld.getTexture()),from_rect,mainPtr,redraw_rect);
}

View File

@@ -154,11 +154,11 @@ void draw_monsters() {
if(combat_posing_monster == i + 100) need_pic += (2 * width * height);
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);
Draw_Some_Item(src_gw, source_rect, terrain_screen_gworld, store_loc);
} else {
Texture src_gw;
cPict::get_picture(cPictNum(monst.picture_num,PIC_MONST), src_gw, source_rect, (monst.direction < 4 ? 0 : 2) + (combat_posing_monster == i + 100 ? 1 : 0), k);
Draw_Some_Item(src_gw, source_rect, terrain_screen_gworld, store_loc, 1, 0);
Draw_Some_Item(src_gw, source_rect, terrain_screen_gworld, store_loc);
}
}
}
@@ -182,7 +182,7 @@ void draw_combat_pc(cPlayer& who, location center, bool attacking) {
rectangle source_rect;
Texture from_gw;
if (cPict::get_picture(who.get_picture_num(), from_gw, source_rect, (who.direction >= 4 ? 2 : 0) + (attacking ? 1 : 0)))
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);
}
}
@@ -255,7 +255,7 @@ void draw_outd_boats(location center) {
if(point_onscreen(center, loc) && can_see_light(center, loc, sight_obscurity) < 5) {
where_draw.x = loc.x - center.x + 4;
where_draw.y = loc.y - center.y + 4;
Draw_Some_Item(vehicle_gworld, calc_rect(0,0), terrain_screen_gworld, where_draw, 1, 0);
Draw_Some_Item(vehicle_gworld, calc_rect(0,0), terrain_screen_gworld, where_draw);
}
}
for(auto& horse : univ.party.horses) {
@@ -271,7 +271,7 @@ void draw_outd_boats(location center) {
if(point_onscreen(center, loc) && can_see_light(center, loc, sight_obscurity) < 5) {
where_draw.x = loc.x - center.x + 4;
where_draw.y = loc.y - center.y + 4;
Draw_Some_Item(vehicle_gworld, calc_rect(0,1), terrain_screen_gworld, where_draw, 1, 0);
Draw_Some_Item(vehicle_gworld, calc_rect(0,1), terrain_screen_gworld, where_draw);
}
}
}
@@ -288,7 +288,7 @@ void draw_town_boat(location center) {
if(point_onscreen(center, boat.loc) && can_see_light(center, boat.loc, sight_obscurity) < 5 && pt_in_light(center, boat.loc)) {
where_draw.x = boat.loc.x - center.x + 4;
where_draw.y = boat.loc.y - center.y + 4;
Draw_Some_Item(vehicle_gworld, calc_rect(1,0), terrain_screen_gworld, where_draw, 1, 0);
Draw_Some_Item(vehicle_gworld, calc_rect(1,0), terrain_screen_gworld, where_draw);
}
}
for(auto const &horse : univ.party.horses) {
@@ -298,7 +298,7 @@ void draw_town_boat(location center) {
if(point_onscreen(center, horse.loc) && can_see_light(center, horse.loc, sight_obscurity) < 5 && pt_in_light(center, horse.loc)) {
where_draw.x = horse.loc.x - center.x + 4;
where_draw.y = horse.loc.y - center.y + 4;
Draw_Some_Item(vehicle_gworld, calc_rect(1,1), terrain_screen_gworld, where_draw, 1, 0);
Draw_Some_Item(vehicle_gworld, calc_rect(1,1), terrain_screen_gworld, where_draw);
}
}
}
@@ -312,7 +312,7 @@ void draw_fields(location where){
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);
Draw_Some_Item(fields_gworld,calc_rect(4,0),terrain_screen_gworld,where_draw);
return;
}
if (!univ.town->is_on_map(where))
@@ -320,51 +320,51 @@ void draw_fields(location where){
auto const fields=univ.town.fields[where.x][where.y];
if ((fields&~(unsigned long)SPECIAL_EXPLORED)==0) return;
if(fields & WALL_FORCE)
Draw_Some_Item(fields_gworld,calc_rect(0,1),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(0,1),terrain_screen_gworld,where_draw,0xFFFFFF7F);
if(fields & WALL_FIRE)
Draw_Some_Item(fields_gworld,calc_rect(1,1),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(1,1),terrain_screen_gworld,where_draw);
if(fields & FIELD_ANTIMAGIC)
Draw_Some_Item(fields_gworld,calc_rect(2,1),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(2,1),terrain_screen_gworld,where_draw);
if(fields & CLOUD_STINK)
Draw_Some_Item(fields_gworld,calc_rect(3,1),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(3,1),terrain_screen_gworld,where_draw,0x7FFF7FFF);
if(fields & WALL_ICE)
Draw_Some_Item(fields_gworld,calc_rect(4,1),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(4,1),terrain_screen_gworld,where_draw);
if(fields & WALL_BLADES)
Draw_Some_Item(fields_gworld,calc_rect(5,1),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(5,1),terrain_screen_gworld,where_draw);
if(fields & CLOUD_SLEEP)
Draw_Some_Item(fields_gworld,calc_rect(6,1),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(6,1),terrain_screen_gworld,where_draw);
if(fields & OBJECT_BLOCK)
Draw_Some_Item(fields_gworld,calc_rect(3,0),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(3,0),terrain_screen_gworld,where_draw);
if(!is_combat() && (fields & SPECIAL_SPOT))
Draw_Some_Item(fields_gworld,calc_rect(4,0),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(4,0),terrain_screen_gworld,where_draw);
if(fields & FIELD_WEB)
Draw_Some_Item(fields_gworld,calc_rect(5,0),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(5,0),terrain_screen_gworld,where_draw);
if(fields & OBJECT_CRATE)
Draw_Some_Item(fields_gworld,calc_rect(6,0),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(6,0),terrain_screen_gworld,where_draw);
if(fields & OBJECT_BARREL)
Draw_Some_Item(fields_gworld,calc_rect(7,0),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(7,0),terrain_screen_gworld,where_draw);
if(fields & (BARRIER_FIRE | BARRIER_FORCE))
Draw_Some_Item(*ResMgr::textures.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);
if(fields & FIELD_QUICKFIRE)
Draw_Some_Item(fields_gworld,calc_rect(7,1),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(7,1),terrain_screen_gworld,where_draw);
if(fields & SFX_SMALL_BLOOD)
Draw_Some_Item(fields_gworld,calc_rect(0,3),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(0,3),terrain_screen_gworld,where_draw);
if(fields & SFX_MEDIUM_BLOOD)
Draw_Some_Item(fields_gworld,calc_rect(1,3),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(1,3),terrain_screen_gworld,where_draw);
if(fields & SFX_LARGE_BLOOD)
Draw_Some_Item(fields_gworld,calc_rect(2,3),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(2,3),terrain_screen_gworld,where_draw);
if(fields & SFX_SMALL_SLIME)
Draw_Some_Item(fields_gworld,calc_rect(3,3),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(3,3),terrain_screen_gworld,where_draw);
if(fields & SFX_LARGE_SLIME)
Draw_Some_Item(fields_gworld,calc_rect(4,3),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(4,3),terrain_screen_gworld,where_draw);
if(fields & SFX_ASH)
Draw_Some_Item(fields_gworld,calc_rect(5,3),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(5,3),terrain_screen_gworld,where_draw);
if(fields & SFX_BONES)
Draw_Some_Item(fields_gworld,calc_rect(6,3),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(6,3),terrain_screen_gworld,where_draw);
if(fields & SFX_RUBBLE)
Draw_Some_Item(fields_gworld,calc_rect(7,3),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(7,3),terrain_screen_gworld,where_draw);
if(fields & BARRIER_CAGE) {
Draw_Some_Item(fields_gworld,calc_rect(1,0),terrain_screen_gworld,where_draw,1,0);
Draw_Some_Item(fields_gworld,calc_rect(1,0),terrain_screen_gworld,where_draw);
forcecage_locs.push_back(where_draw);
}
}
@@ -398,17 +398,17 @@ void draw_party_symbol(location center) {
else {
Texture from_gw;
cPict::get_picture(univ.party[i].get_picture_num(), from_gw, source_rect, (univ.party.direction >= 4 ? 2 : 0));
Draw_Some_Item(from_gw, source_rect, terrain_screen_gworld, target, 1, 0);
Draw_Some_Item(from_gw, source_rect, terrain_screen_gworld, target);
}
}
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::textures.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);
}else {
i = univ.party.direction > 3;
Draw_Some_Item(*ResMgr::textures.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);
}
}

View File

@@ -283,7 +283,7 @@ void draw(bool need_refresh) {
win_draw_string(windows, map_bar_rect,"(Hit Escape to close.)",eTextMode::WRAP,style);
if(canMap) {
rect_draw_some_item(gworld.getTexture(),area_to_draw_from,windows,area_to_draw_on);
rect_draw_some_item(Texture(gworld.getTexture()),area_to_draw_from,windows,area_to_draw_on);
// Now place PCs and monsters
if(draw_pcs) {

View File

@@ -356,7 +356,7 @@ void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
to_rect.bottom -= 10; // Adjust for pointing buttons
rectangle oldBounds = to_rect;
to_rect.offset(current_terrain_ul);
rect_draw_some_item(terrain_screen_gworld.getTexture(),oldBounds,mainPtr,to_rect);
rect_draw_some_item(Texture(terrain_screen_gworld.getTexture()),oldBounds,mainPtr,to_rect);
mainPtr.setActive(false);
@@ -456,7 +456,7 @@ void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
to_rect.bottom -= 10; // Adjust for pointing buttons
rectangle oldRect = to_rect;
to_rect.offset(current_terrain_ul);
rect_draw_some_item(terrain_screen_gworld.getTexture(),oldRect,mainPtr,to_rect);
rect_draw_some_item(Texture(terrain_screen_gworld.getTexture()),oldRect,mainPtr,to_rect);
}
short get_missile_direction(location origin_point,location the_point) {
@@ -520,7 +520,7 @@ void do_explosion_anim(short /*sound_num*/,short special_draw, short snd) {
to_rect.bottom -= 10; // Adjust for pointing buttons
rectangle oldRect = to_rect;
to_rect.offset(current_terrain_ul);
rect_draw_some_item(terrain_screen_gworld.getTexture(),oldRect,mainPtr,to_rect);
rect_draw_some_item(Texture(terrain_screen_gworld.getTexture()),oldRect,mainPtr,to_rect);
}
TextStyle style;
@@ -803,7 +803,7 @@ void draw_shop_graphics(bool pressed,rectangle clip_area_rect) {
void refresh_shopping() {
rectangle from_rect(talk_gworld);
rect_draw_some_item(talk_gworld.getTexture(),from_rect,mainPtr,talk_area_rect);
rect_draw_some_item(Texture(talk_gworld.getTexture()),from_rect,mainPtr,talk_area_rect);
}
static ePicType get_monst_pictype(mon_num_t monst) {
@@ -832,7 +832,7 @@ static void place_talk_face() {
void click_talk_rect(word_rect_t word) {
rectangle talkRect(talk_gworld), wordRect(word.rect);
mainPtr.setActive();
rect_draw_some_item(talk_gworld.getTexture(),rectangle(talk_gworld),mainPtr,talk_area_rect);
rect_draw_some_item(Texture(talk_gworld.getTexture()),rectangle(talk_gworld),mainPtr,talk_area_rect);
wordRect.offset(talk_area_rect.topLeft());
TextStyle style;
style.font = FONT_DUNGEON;
@@ -843,7 +843,7 @@ void click_talk_rect(word_rect_t word) {
place_talk_face();
mainPtr.display();
play_sound(37, time_in_ticks(5));
rect_draw_some_item(talk_gworld.getTexture(),rectangle(talk_gworld),mainPtr,talk_area_rect);
rect_draw_some_item(Texture(talk_gworld.getTexture()),rectangle(talk_gworld),mainPtr,talk_area_rect);
place_talk_face();
}
@@ -1004,14 +1004,14 @@ void place_talk_str(std::string str_to_place,std::string str_to_place2,short col
// Finally place processed graphics
mainPtr.setActive();
rect_draw_some_item(talk_gworld.getTexture(),oldRect,mainPtr,talk_area_rect);
rect_draw_some_item(Texture(talk_gworld.getTexture()),oldRect,mainPtr,talk_area_rect);
// I have no idea what this check is for; I'm just preserving it in case it was important
if(c_rect.right == 0) place_talk_face();
}
void refresh_talking() {
rectangle tempRect(talk_gworld);
rect_draw_some_item(talk_gworld.getTexture(),tempRect,mainPtr,talk_area_rect);
rect_draw_some_item(Texture(talk_gworld.getTexture()),tempRect,mainPtr,talk_area_rect);
place_talk_face();
}

View File

@@ -251,7 +251,7 @@ void put_item_screen(eItemWinMode screen_num) {
default: // on an items page
pc = screen_num;
sout.str("");;
sout << univ.party[pc].name << " inventory:",
sout << univ.party[pc].name << " inventory:";
win_draw_string(item_stats_gworld,upper_frame_rect,sout.str(),eTextMode::WRAP,style);
break;
}
@@ -660,9 +660,9 @@ void refresh_stat_areas(short mode) {
if(mode == 1) x = sf::BlendAdd;
else x = sf::BlendNone;
rect_draw_some_item(pc_stats_gworld.getTexture(), rectangle(pc_stats_gworld), mainPtr, win_to_rects[WINRECT_PCSTATS], x);
rect_draw_some_item(item_stats_gworld.getTexture(), rectangle(item_stats_gworld), mainPtr, win_to_rects[WINRECT_INVEN], x);
rect_draw_some_item(text_area_gworld.getTexture(), rectangle(text_area_gworld), mainPtr, win_to_rects[WINRECT_TRANSCRIPT], x);
rect_draw_some_item(Texture(pc_stats_gworld.getTexture()), rectangle(pc_stats_gworld), mainPtr, win_to_rects[WINRECT_PCSTATS], x);
rect_draw_some_item(Texture(item_stats_gworld.getTexture()), rectangle(item_stats_gworld), mainPtr, win_to_rects[WINRECT_INVEN], x);
rect_draw_some_item(Texture(text_area_gworld.getTexture()), rectangle(text_area_gworld), mainPtr, win_to_rects[WINRECT_TRANSCRIPT], x);
}
rectangle get_stat_effect_rect(int code) {
@@ -1152,27 +1152,14 @@ 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 Texture& src_gworld, rectangle src_rect, sf::RenderTarget& targ_gworld,location target, char masked, short main_win) {
rectangle destrec = {0,0,36,28};
void Draw_Some_Item(const Texture& src_gworld, rectangle src_rect, sf::RenderTarget& targ_gworld,location target, long modValue) {
if((target.x < 0) || (target.y < 0) || (target.x > 8) || (target.y > 8))
return;
if((supressing_some_spaces) && (target != ok_space[0]) &&
(target != ok_space[1]) && (target != ok_space[2]) && (target != ok_space[3]))
return;
destrec = coord_to_rect(target.x,target.y);
if(main_win == 1) destrec.offset(5,5);
if(main_win == 0) {
if(masked == 1)
rect_draw_some_item(src_gworld, src_rect, targ_gworld, destrec, sf::BlendAlpha);
else rect_draw_some_item(src_gworld, src_rect, targ_gworld, destrec, sf::BlendNone);
} else {
if(masked == 1)
rect_draw_some_item(src_gworld, src_rect, targ_gworld, destrec, sf::BlendAlpha);
else rect_draw_some_item(src_gworld, src_rect, targ_gworld, destrec, sf::BlendNone);
}
rect_draw_some_item(src_gworld, src_rect, targ_gworld, coord_to_rect(target.x,target.y), RenderState(sf::BlendAlpha, modValue));
}
std::list<text_label_t> posted_labels;

View File

@@ -39,7 +39,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 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, long modValue=0);
rectangle get_stat_effect_rect(int which_effect);
struct text_label_t {

View File

@@ -194,5 +194,5 @@ void cToolbar::draw(sf::RenderTarget& targ) {
}
// Add the cached toolbar over the background
rect_draw_some_item(cache.getTexture(), rectangle(cache), targ, to, sf::BlendAdd);
rect_draw_some_item(Texture(cache.getTexture()), rectangle(cache), targ, to, sf::BlendAdd);
}

View File

@@ -16,7 +16,7 @@
#include "render_shapes.hpp"
#include "res_image.hpp"
sf::Shader maskShader;
static sf::Shader maskShader;
extern fs::path progDir;
void init_shaders() {
@@ -67,18 +67,12 @@ void draw_splash(const Texture& splash, sf::RenderWindow& targ, rectangle dest_r
targ.display();
}
static void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::RenderStates mode);
static void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::RenderStates mode);
void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::BlendMode mode){
rect_draw_some_item(src_gworld, src_rect, targ_gworld, targ_rect, sf::RenderStates(mode));
}
void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::RenderStates mode) {
static void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,
sf::RenderStates const &mode, unsigned long colorMod) {
setActiveRenderTarget(targ_gworld);
src_rect=src_rect.rescale(src_gworld.dimension, src_gworld->getSize());
sf::Sprite tile(*src_gworld, src_rect);
if(colorMod != 0) tile.setColor(sf::Color(colorMod));
tile.setPosition(targ_rect.left, targ_rect.top);
double xScale = targ_rect.width(), yScale = targ_rect.height();
xScale /= src_rect.width();
@@ -87,7 +81,13 @@ void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,sf::Render
targ_gworld.draw(tile, mode);
}
void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,const sf::Texture& mask_gworld,sf::RenderTarget& targ_gworld,rectangle targ_rect) {
void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,
RenderState const &mode) {
if (mode.mask==nullptr) {
rect_draw_some_item(src_gworld, src_rect, targ_gworld, targ_rect, sf::RenderStates(mode.blend_mode), mode.color_mod);
return;
}
rectangle real_src_rect=src_rect.rescale(src_gworld.dimension, src_gworld->getSize());
static sf::RenderTexture src;
static bool inited = false;
@@ -97,27 +97,12 @@ void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,const sf::
}
rectangle dest_rect = real_src_rect;
dest_rect.offset(-dest_rect.left,-dest_rect.top);
rect_draw_some_item(src_gworld, src_rect, src, dest_rect);
rect_draw_some_item(src_gworld, src_rect, src, dest_rect, sf::RenderStates(), 0);
src.display();
maskShader.setParameter("texture", sf::Shader::CurrentTexture);
maskShader.setParameter("mask", mask_gworld);
rect_draw_some_item(src.getTexture(), dest_rect, targ_gworld, targ_rect, &maskShader);
}
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::RenderStates mode) {
setActiveRenderTarget(targ_gworld);
sf::Sprite tile(src_gworld, src_rect);
tile.setPosition(targ_rect.left, targ_rect.top);
double xScale = targ_rect.width(), yScale = targ_rect.height();
xScale /= src_rect.width();
yScale /= src_rect.height();
tile.setScale(xScale, yScale);
targ_gworld.draw(tile, sf::RenderStates(mode));
}
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::BlendMode mode){
rect_draw_some_item(src_gworld, src_rect, targ_gworld, targ_rect, sf::RenderStates(mode));
maskShader.setParameter("mask", *mode.mask);
rect_draw_some_item(Texture(src.getTexture()), dest_rect, targ_gworld, targ_rect, &maskShader, mode.color_mod);
}
void setActiveRenderTarget(sf::RenderTarget& where) {

View File

@@ -19,11 +19,26 @@
#include "pictypes.hpp"
void init_shaders();
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::BlendMode mode = sf::BlendNone);
struct RenderState {
RenderState() = default;
RenderState(sf::BlendMode blendMode, unsigned long colorMod=0)
: blend_mode(blendMode)
, color_mod(colorMod) {
}
RenderState(RenderState const &)=default;
RenderState &operator=(RenderState const &)=default;
void set_mask(const sf::Texture& mask_gworld) {
mask=&mask_gworld;
}
sf::BlendMode blend_mode = sf::BlendNone;
unsigned long color_mod=0;
sf::Texture const *mask=nullptr;
};
struct Texture;
void rect_draw_some_item(const Texture & src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::BlendMode mode = sf::BlendNone);
void rect_draw_some_item(const Texture& src_gworld,rectangle src_rect,const sf::Texture& mask_gworld,sf::RenderTarget& targ_gworld,rectangle targ_rect);
void rect_draw_some_item(const Texture & src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,
RenderState const &mode=RenderState());
void draw_splash(const Texture & splash, sf::RenderWindow& targ, rectangle dest_rect);
void setActiveRenderTarget(sf::RenderTarget& where);