/* client/map.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "core/application.h" #include "client/map.h" #include "client/targets.h" #include "client/input.h" #include "ui/paint.h" #include "render/gl.h" #include "render/textures.h" namespace client { Map::Map(ui::Widget *parent) : ui::Widget(parent) { set_label("map"); set_border(true); set_background(true); hide(); } Map::~Map() { } void Map::hide() { ui::Widget::hide(); map_hover = 0; } void Map::toggle() { if (visible()) hide(); else show(); } void Map::draw() { const float margin = font()->width() * 2.0f; const float w = width() - margin * 2.0f; const float h = height() - margin * 2.0f; const float s = math::min(w, h); const float blue = 0.8f; const float gridsize=16; math::Vector2f v(global_location()); v.x += margin; v.y += margin; map_hover = 0; if (h > s ) { v.y += (h-s) * 0.5f; } else { v.x += (w-s) * 0.5f; } gl::color(0,0,blue); gl::begin(gl::Lines); for (int i=0; i <= gridsize; i++) { gl::vertex(v.x, v.y + s / gridsize * i); gl::vertex(v.x + s, v.y + s / gridsize * i); gl::vertex(v.x + s / gridsize * i, v.y); gl::vertex(v.x + s / gridsize * i, v.y+s); } gl::end(); const size_t texture_entity = render::Textures::load("bitmaps/icons/entity_default"); const size_t texture_globe = render::Textures::load("bitmaps/icons/entity_globe"); const size_t texture_bright = render::Textures::load("bitmaps/icons/entity_bright"); size_t texture_current = render::Textures::bind(texture_entity); v.x += s * 0.5f; v.y += s * 0.5f; core::Zone *zone = core::localplayer()->zone(); const math::Vector2f cursor(input::mouse_position_x(), input::mouse_position_y()); const float r = 12.0f; float scale = 2048.0f; scale *= 2; gl::enable(GL_TEXTURE_2D); gl::begin(gl::Quads); for (core::Zone::Content::iterator it = zone->content().begin(); it != zone->content().end(); it++) { core::Entity *entity = (*it); bool has_icon = false; bool draw_icon = true; if ((entity->model()) || (entity->type() == core::Entity::Globe)) { has_icon = true; if ((entity->type() == core::Entity::Dynamic) || (entity->type() == core::Entity::Controlable)) { core::EntityDynamic *ed = dynamic_cast(entity); if (ed->eventstate() ==core::Entity::Docked) { draw_icon = false; } } if (entity == core::localcontrol()) { if (core::application()->time() - floorf(core::application()->time()) < 0.5f) { draw_icon = false; } } if (entity == targets::current()) { if (core::application()->time() - floorf(core::application()->time()) < 0.5f) { draw_icon = false; } } } if (has_icon) { math::Vector2f l(v); l.x -= s / scale * entity->location().y; l.y -= s / scale * entity->location().x; if (math::distancesquared(cursor, l) < (r*r)) { map_hover = entity->id(); } if (draw_icon) { if (entity->type() == core::Entity::Globe) { if ((entity->flags() & core::Entity::Bright) == core::Entity::Bright) { if (texture_current != texture_bright) { gl::end(); texture_current = render::Textures::bind(texture_bright); gl::begin(gl::Quads); } } else { if (texture_current != texture_globe) { gl::end(); texture_current = render::Textures::bind(texture_globe); gl::begin(gl::Quads); } } } else { if (texture_current != texture_entity) { gl::end(); texture_current = render::Textures::bind(texture_entity); gl::begin(gl::Quads); } } math::Color color(entity->color()); color.a = 1.0f; gl::color(color); glTexCoord2f(0.0f, 0.0f); gl::vertex(l.x-r, l.y-r); glTexCoord2f(1.0f, 0.0f); gl::vertex(l.x+r, l.y-r); glTexCoord2f(1.0f, 1.0f); gl::vertex(l.x+r, l.y+r); glTexCoord2f(0.0f, 1.0f); gl::vertex(l.x-r, l.y+r); } } } gl::end(); gl::disable(GL_TEXTURE_2D); } bool Map::on_keypress(const int key, const unsigned int modifier) { if ((hover()) && (key == 512 + SDL_BUTTON_LEFT)) { targets::select_target(hover()); return true; } return false; } }