Author: esr
Date: Sat Jun 23 22:58:51 2007
New Revision: 18423
URL: http://svn.gna.org/viewcvs/wesnoth?rev=18423&view=rev
Log:
Lift the lower end of the terrain-tile drawing code.
Modified:
trunk/src/display.cpp
trunk/src/display.hpp
Modified: trunk/src/display.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/display.cpp?rev=18423&r1=18422&r2=18423&view=diff
==============================================================================
--- trunk/src/display.cpp (original)
+++ trunk/src/display.cpp Sat Jun 23 22:58:51 2007
@@ -379,6 +379,171 @@
return res;
}
+static const std::string& get_direction(size_t n)
+{
+ static std::string const dirs[6] = { "-n", "-ne", "-se", "-s", "-sw",
"-nw" };
+ return dirs[n >= sizeof(dirs)/sizeof(*dirs) ? 0 : n];
+}
+
+std::vector<std::string> map_display::get_fog_shroud_graphics(const
gamemap::location& loc)
+{
+ std::vector<std::string> res;
+
+ gamemap::location adjacent[6];
+ get_adjacent_tiles(loc,adjacent);
+ t_translation::t_letter tiles[6];
+
+ static const t_translation::t_letter terrain_types[] =
+ { t_translation::FOGGED, t_translation::VOID_TERRAIN,
t_translation::NONE_TERRAIN };
+
+ for(int i = 0; i != 6; ++i) {
+ if(shrouded(adjacent[i])) {
+ tiles[i] = t_translation::VOID_TERRAIN;
+ } else if(!fogged(loc) && fogged(adjacent[i])) {
+ tiles[i] = t_translation::FOGGED;
+ } else {
+ tiles[i] = t_translation::NONE_TERRAIN;
+ }
+ }
+
+
+ for(const t_translation::t_letter *terrain = terrain_types;
+ *terrain != t_translation::NONE_TERRAIN; terrain ++) {
+
+ //find somewhere that doesn't have overlap to use as a starting
point
+ int start;
+ for(start = 0; start != 6; ++start) {
+ if(tiles[start] != *terrain) {
+ break;
+ }
+ }
+
+ if(start == 6) {
+ start = 0;
+ }
+
+ //find all the directions overlap occurs from
+ for(int i = (start+1)%6, n = 0; i != start && n != 6; ++n) {
+ if(tiles[i] == *terrain) {
+ std::ostringstream stream;
+ std::string name;
+ // if(*terrain == terrain_type::VOID_TERRAIN)
+ // stream << "void";
+ //else
+ // stream << "fog";
+ stream << "terrain/" <<
map_.get_terrain_info(*terrain).symbol_image();
+
+ for(int n = 0; *terrain == tiles[i] && n != 6;
i = (i+1)%6, ++n) {
+ stream << get_direction(i);
+
+ if(!image::exists(stream.str() +
".png")) {
+ //if we don't have any surface
at all,
+ //then move onto the next
overlapped area
+ if(name.empty()) {
+ i = (i+1)%6;
+ }
+ break;
+ } else {
+ name = stream.str();
+ }
+ }
+
+ if(!name.empty()) {
+ res.push_back(name + ".png");
+ }
+ } else {
+ i = (i+1)%6;
+ }
+ }
+ }
+
+ return res;
+}
+
+std::vector<surface> map_display::get_terrain_images(const gamemap::location
&loc,
+ const time_of_day& tod,
+ image::TYPE image_type,
+ ADJACENT_TERRAIN_TYPE terrain_type)
+{
+ std::vector<surface> res;
+
+ if(terrain_type == ADJACENT_FOGSHROUD) {
+ const std::vector<std::string> fog_shroud =
get_fog_shroud_graphics(loc);
+
+ if(!fog_shroud.empty()) {
+ for(std::vector<std::string>::const_iterator it =
fog_shroud.begin(); it != fog_shroud.end(); ++it) {
+ image::locator image(*it);
+ // image.filename = "terrain/" + *it;
+
+ const surface surface(image::get_image(image,
image_type));
+ if (!surface.null()) {
+ res.push_back(surface);
+ }
+ }
+
+ }
+
+ return res;
+ }
+
+ terrain_builder::ADJACENT_TERRAIN_TYPE builder_terrain_type =
+ (terrain_type == ADJACENT_FOREGROUND ?
+ terrain_builder::ADJACENT_FOREGROUND :
terrain_builder::ADJACENT_BACKGROUND);
+ const terrain_builder::imagelist* const terrains =
builder_.get_terrain_at(loc,
+ tod.id, builder_terrain_type);
+
+ if(terrains != NULL) {
+ for(std::vector<animated<image::locator> >::const_iterator it =
terrains->begin(); it != terrains->end(); ++it) {
+ // it->update_current_frame();
+ image::locator image = it->get_current_frame();
+ // image.filename = "terrain/" + image.filename;
+
+ const surface surface(image::get_image(image,
image_type));
+ if (!surface.null()) {
+ res.push_back(surface);
+ }
+ }
+ } else if(terrain_type == ADJACENT_BACKGROUND){
+ // this should only happen with the off map tiles and now
+ // return the void image. NOTE this is a temp hack
+ const surface
surface(image::get_image("terrain/off-map/alpha.png"));
+ wassert(!surface.null());
+ if (!surface.null()) {
+ res.push_back(surface);
+ }
+ }
+
+ return res;
+}
+
+void map_display::draw_terrain_on_tile(const gamemap::location& loc,
+ const time_of_day& tod,
+ image::TYPE image_type,
+ ADJACENT_TERRAIN_TYPE type)
+{
+ int xpos = int(get_location_x(loc));
+ int ypos = int(get_location_y(loc));
+
+ SDL_Rect clip_rect = map_area();
+
+ if(xpos > clip_rect.x + clip_rect.w || ypos > clip_rect.y + clip_rect.h
||
+ xpos + zoom_ < clip_rect.x || ypos + zoom_ < clip_rect.y) {
+ return;
+ }
+
+ surface const dst(screen_.getSurface());
+
+ clip_rect_setter set_clip_rect(dst,clip_rect);
+
+ const std::vector<surface>& images =
get_terrain_images(loc,tod,image_type,type);
+
+ std::vector<surface>::const_iterator itor;
+ for(itor = images.begin(); itor != images.end(); ++itor) {
+ SDL_Rect dstrect = { xpos, ypos, 0, 0 };
+ SDL_BlitSurface(*itor,NULL,dst,&dstrect);
+ }
+}
+
// Methods for superclass aware of units go here
std::map<gamemap::location,fixed_t> display::debugHighlights_;
@@ -1002,6 +1167,7 @@
void display::draw(bool update,bool force)
{
bool changed = false;
+
//log_scope("Drawing");
invalidate_animations();
@@ -1076,7 +1242,9 @@
if (units_.find(*it) != units_.end()) {
unit_invals.insert(*it);
}
- draw_tile(*it, clip_rect);
+ const time_of_day& tod = status_.get_time_of_day();
+ const time_of_day& tod_at =
timeofday_at(status_,units_,*it,map_);
+ draw_tile(*it, tod, tod_at, clip_rect);
simulate_delay += 1;
}
@@ -1562,32 +1730,7 @@
}
}
-void display::draw_terrain_on_tile(const gamemap::location& loc, image::TYPE
image_type, ADJACENT_TERRAIN_TYPE type)
-{
- int xpos = int(get_location_x(loc));
- int ypos = int(get_location_y(loc));
-
- SDL_Rect clip_rect = map_area();
-
- if(xpos > clip_rect.x + clip_rect.w || ypos > clip_rect.y + clip_rect.h
||
- xpos + zoom_ < clip_rect.x || ypos + zoom_ < clip_rect.y) {
- return;
- }
-
- surface const dst(screen_.getSurface());
-
- clip_rect_setter set_clip_rect(dst,clip_rect);
-
- const std::vector<surface>& images =
get_terrain_images(loc,image_type,type);
-
- std::vector<surface>::const_iterator itor;
- for(itor = images.begin(); itor != images.end(); ++itor) {
- SDL_Rect dstrect = { xpos, ypos, 0, 0 };
- SDL_BlitSurface(*itor,NULL,dst,&dstrect);
- }
-}
-
-void display::draw_tile(const gamemap::location &loc, const SDL_Rect
&clip_rect)
+void display::draw_tile(const gamemap::location &loc, const time_of_day& tod,
const time_of_day & tod_at, const SDL_Rect &clip_rect)
{
if(screen_.update_locked()) {
return;
@@ -1620,8 +1763,6 @@
image::TYPE image_type = image::SCALED_TO_HEX;
- const time_of_day& tod = status_.get_time_of_day();
- const time_of_day& tod_at = timeofday_at(status_,units_,loc,map_);
std::string mask = tod_at.image_mask;
if(tod_hex_mask1 != NULL || tod_hex_mask2 != NULL || tod.image_mask !=
tod_at.image_mask) {
image_type = image::SCALED_TO_HEX;
@@ -1640,7 +1781,7 @@
}
if(!is_shrouded /*|| !on_map*/) {
- draw_terrain_on_tile(loc,image_type,ADJACENT_BACKGROUND);
+ draw_terrain_on_tile(loc, tod, image_type, ADJACENT_BACKGROUND);
surface flag(get_flag(terrain,loc));
if(flag != NULL) {
@@ -1679,7 +1820,7 @@
draw_footstep(loc,xpos,ypos);
if(!is_shrouded /*|| !on_map*/) {
- draw_terrain_on_tile(loc,image_type,ADJACENT_FOREGROUND);
+ draw_terrain_on_tile(loc,tod,image_type,ADJACENT_FOREGROUND);
}
if(fogged(loc) && on_map && !is_shrouded) {
@@ -1691,7 +1832,7 @@
}
if(!is_shrouded && on_map) {
- draw_terrain_on_tile(loc,image_type,ADJACENT_FOGSHROUD);
+ draw_terrain_on_tile(loc,tod,image_type,ADJACENT_FOGSHROUD);
}
//draw the time-of-day mask on top of the hex
@@ -1918,146 +2059,6 @@
draw_text_in_hex(loc, turns_text.str(), font::SIZE_PLUS,
turns_color, 0.5, 0.5);
#endif
}
-}
-
-
-
-static const std::string& get_direction(size_t n)
-{
- static std::string const dirs[6] = { "-n", "-ne", "-se", "-s", "-sw",
"-nw" };
- return dirs[n >= sizeof(dirs)/sizeof(*dirs) ? 0 : n];
-}
-
-std::vector<std::string> display::get_fog_shroud_graphics(const
gamemap::location& loc)
-{
- std::vector<std::string> res;
-
- gamemap::location adjacent[6];
- get_adjacent_tiles(loc,adjacent);
- t_translation::t_letter tiles[6];
-
- static const t_translation::t_letter terrain_types[] =
- { t_translation::FOGGED, t_translation::VOID_TERRAIN,
t_translation::NONE_TERRAIN };
-
- for(int i = 0; i != 6; ++i) {
- if(shrouded(adjacent[i])) {
- tiles[i] = t_translation::VOID_TERRAIN;
- } else if(!fogged(loc) && fogged(adjacent[i])) {
- tiles[i] = t_translation::FOGGED;
- } else {
- tiles[i] = t_translation::NONE_TERRAIN;
- }
- }
-
-
- for(const t_translation::t_letter *terrain = terrain_types;
- *terrain != t_translation::NONE_TERRAIN; terrain ++) {
-
- //find somewhere that doesn't have overlap to use as a starting
point
- int start;
- for(start = 0; start != 6; ++start) {
- if(tiles[start] != *terrain) {
- break;
- }
- }
-
- if(start == 6) {
- start = 0;
- }
-
- //find all the directions overlap occurs from
- for(int i = (start+1)%6, n = 0; i != start && n != 6; ++n) {
- if(tiles[i] == *terrain) {
- std::ostringstream stream;
- std::string name;
- // if(*terrain == terrain_type::VOID_TERRAIN)
- // stream << "void";
- //else
- // stream << "fog";
- stream << "terrain/" <<
map_.get_terrain_info(*terrain).symbol_image();
-
- for(int n = 0; *terrain == tiles[i] && n != 6;
i = (i+1)%6, ++n) {
- stream << get_direction(i);
-
- if(!image::exists(stream.str() +
".png")) {
- //if we don't have any surface
at all,
- //then move onto the next
overlapped area
- if(name.empty()) {
- i = (i+1)%6;
- }
- break;
- } else {
- name = stream.str();
- }
- }
-
- if(!name.empty()) {
- res.push_back(name + ".png");
- }
- } else {
- i = (i+1)%6;
- }
- }
- }
-
- return res;
-}
-
-std::vector<surface> display::get_terrain_images(const gamemap::location &loc,
- image::TYPE image_type, ADJACENT_TERRAIN_TYPE terrain_type)
-{
- std::vector<surface> res;
-
- if(terrain_type == ADJACENT_FOGSHROUD) {
- const std::vector<std::string> fog_shroud =
get_fog_shroud_graphics(loc);
-
- if(!fog_shroud.empty()) {
- for(std::vector<std::string>::const_iterator it =
fog_shroud.begin(); it != fog_shroud.end(); ++it) {
- image::locator image(*it);
- // image.filename = "terrain/" + *it;
-
- const surface surface(image::get_image(image,
image_type));
- if (!surface.null()) {
- res.push_back(surface);
- }
- }
-
- }
-
- return res;
- }
-
- const time_of_day& tod = status_.get_time_of_day();
- // const time_of_day& tod_at =
timeofday_at(status_,units_,gamemap::location(x,y));
-
- terrain_builder::ADJACENT_TERRAIN_TYPE builder_terrain_type =
- (terrain_type == ADJACENT_FOREGROUND ?
- terrain_builder::ADJACENT_FOREGROUND :
terrain_builder::ADJACENT_BACKGROUND);
- const terrain_builder::imagelist* const terrains =
builder_.get_terrain_at(loc,
- tod.id, builder_terrain_type);
-
- if(terrains != NULL) {
- for(std::vector<animated<image::locator> >::const_iterator it =
terrains->begin(); it != terrains->end(); ++it) {
- // it->update_current_frame();
- image::locator image = it->get_current_frame();
- // image.filename = "terrain/" + image.filename;
-
- const surface surface(image::get_image(image,
image_type));
- if (!surface.null()) {
- res.push_back(surface);
- }
- }
- } else if(terrain_type == ADJACENT_BACKGROUND){
- // this should only happen with the off map tiles and now
- // return the void image. NOTE this is a temp hack
- const surface
surface(image::get_image("terrain/off-map/alpha.png"));
- wassert(!surface.null());
- if (!surface.null()) {
- res.push_back(surface);
- }
- }
-
- return res;
}
surface display::get_flag(const t_translation::t_letter& terrain, const
gamemap::location& loc)
Modified: trunk/src/display.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/display.hpp?rev=18423&r1=18422&r2=18423&view=diff
==============================================================================
--- trunk/src/display.hpp (original)
+++ trunk/src/display.hpp Sat Jun 23 22:58:51 2007
@@ -144,6 +144,17 @@
// Will be overridden in the display subclass
bool fogged(const gamemap::location& loc UNUSED) const {return false;};
+ bool shrouded(const gamemap::location& loc UNUSED) const {return
false;};
+
+protected:
+ enum ADJACENT_TERRAIN_TYPE { ADJACENT_BACKGROUND, ADJACENT_FOREGROUND,
ADJACENT_FOGSHROUD };
+
+ std::vector<surface> get_terrain_images(const gamemap::location &loc,
+ const time_of_day& tod,
+ image::TYPE type,
+ ADJACENT_TERRAIN_TYPE terrain_type);
+
+ std::vector<std::string> get_fog_shroud_graphics(const
gamemap::location& loc);
protected:
CVideo& screen_;
@@ -158,6 +169,11 @@
// Not set by the initializer
std::vector<gui::button> buttons_;
+ //composes and draws the terrains on a tile
+ void draw_terrain_on_tile(const gamemap::location& loc,
+ const time_of_day& tod,
+ image::TYPE image_type,
+ ADJACENT_TERRAIN_TYPE type);
};
class display : public map_display
@@ -283,11 +299,6 @@
void clear_mouseover_hex_overlay() { mouseover_hex_overlay_ = NULL; }
private:
- enum ADJACENT_TERRAIN_TYPE { ADJACENT_BACKGROUND, ADJACENT_FOREGROUND,
ADJACENT_FOGSHROUD };
-
- //composes and draws the terrains on a tile
- void draw_terrain_on_tile(const gamemap::location& loc, image::TYPE
image_type, ADJACENT_TERRAIN_TYPE type);
-
// event raised when the map is being scrolled
mutable events::generic_event _scroll_event;
@@ -465,7 +476,7 @@
display(const display&);
void operator=(const display&);
- void draw_tile(const gamemap::location &loc, const SDL_Rect &clip_rect);
+ void draw_tile(const gamemap::location &loc, const time_of_day& tod,
const time_of_day& tod_at, const SDL_Rect &clip_rect);
void draw_sidebar();
void draw_minimap(int x, int y, int w, int h);
void draw_game_status();
@@ -478,11 +489,6 @@
void bounds_check_position();
void bounds_check_position(int& xpos, int& ypos);
-
- std::vector<surface> get_terrain_images(const gamemap::location &loc,
- image::TYPE type, ADJACENT_TERRAIN_TYPE terrain_type);
-
- std::vector<std::string> get_fog_shroud_graphics(const
gamemap::location& loc);
//this surface must be freed by the caller
surface get_flag(const t_translation::t_letter& terrain, const
gamemap::location& loc);
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits