From: <tz...@us...> - 2008-08-22 00:36:22
|
Revision: 2669 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2669&view=rev Author: tzlaine Date: 2008-08-22 00:36:32 +0000 (Fri, 22 Aug 2008) Log Message: ----------- Changed IntroScreen to use a GG::TextControl, instead of redoing all the text layout work manually each render cycle. Modified Paths: -------------- trunk/FreeOrion/UI/IntroScreen.cpp trunk/FreeOrion/UI/IntroScreen.h Modified: trunk/FreeOrion/UI/IntroScreen.cpp =================================================================== --- trunk/FreeOrion/UI/IntroScreen.cpp 2008-08-22 00:32:43 UTC (rev 2668) +++ trunk/FreeOrion/UI/IntroScreen.cpp 2008-08-22 00:36:32 UTC (rev 2669) @@ -144,11 +144,17 @@ GG::GRAPHIC_FITGRAPHIC, GG::CLICKABLE)), m_logo(new GG::StaticGraphic(0, 0, GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight() / 10, ClientUI::GetTexture(ClientUI::ArtDir() / "logo.png"), - GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE)) + GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE)), + m_version(new GG::TextControl(0, 0, FreeOrionVersionString(), + HumanClientApp::GetApp()->GetFont(ClientUI::Font(), ClientUI::Pts()), + ClientUI::TextColor())) { m_splash->AttachChild(m_logo); GG::GUI::GetGUI()->Register(m_splash); + m_version->MoveTo(GG::Pt(GG::GUI::GetGUI()->AppWidth() - m_version->Size().x, + GG::GUI::GetGUI()->AppHeight() - m_version->Size().y)); + //create buttons m_single_player = new CUIButton(15, 12, 160, UserString("INTRO_BTN_SINGLE_PLAYER")); m_multi_player = new CUIButton(15, 52, 160, UserString("INTRO_BTN_MULTI_PLAYER")); @@ -182,6 +188,7 @@ delete m_credits_wnd; delete m_logo; delete m_splash; + delete m_version; } void IntroScreen::OnSinglePlayer() @@ -271,10 +278,6 @@ void IntroScreen::Render() { - boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::Font(), ClientUI::Pts()); CUIWnd::Render(); - GG::Pt size = font->TextExtent(FreeOrionVersionString()); - font->RenderText(GG::GUI::GetGUI()->AppWidth()-size.x, - GG::GUI::GetGUI()->AppHeight()-size.y, - FreeOrionVersionString()); + m_version->Render(); } Modified: trunk/FreeOrion/UI/IntroScreen.h =================================================================== --- trunk/FreeOrion/UI/IntroScreen.h 2008-08-22 00:32:43 UTC (rev 2668) +++ trunk/FreeOrion/UI/IntroScreen.h 2008-08-22 00:36:32 UTC (rev 2669) @@ -56,6 +56,7 @@ GG::StaticGraphic* m_splash; GG::StaticGraphic* m_logo; + GG::TextControl* m_version; }; #endif // _IntroScreen_h_ |
From: <tz...@us...> - 2008-08-22 01:21:28
|
Revision: 2670 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2670&view=rev Author: tzlaine Date: 2008-08-22 01:21:38 +0000 (Fri, 22 Aug 2008) Log Message: ----------- Added a TabBar subclass to CUIControls.h, which darkens all but the currently- selected tab. Thanks to forum member igrok for the patch. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIControls.h trunk/FreeOrion/UI/CUIStyle.cpp trunk/FreeOrion/UI/CUIStyle.h Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2008-08-22 00:36:32 UTC (rev 2669) +++ trunk/FreeOrion/UI/CUIControls.cpp 2008-08-22 01:21:38 UTC (rev 2670) @@ -320,8 +320,10 @@ m_border_color(border), m_mouse_here(false) { - if (style == GG::SBSTYLE_3D_TOP_DETACHED_TAB || style == GG::SBSTYLE_3D_TOP_ATTACHED_TAB) + if (style == GG::SBSTYLE_3D_TOP_DETACHED_TAB || style == GG::SBSTYLE_3D_TOP_ATTACHED_TAB) { SetColor(ClientUI::WndColor()); + SetTextColor(DarkColor(text_color)); + } // HACK! radio buttons should only emit sounds when they are checked, and *not* when they are unchecked; currently, there's no // other way to detect the difference between these two kinds of CUIStateButton within the CUIStateButton ctor other than // checking the redering style @@ -460,6 +462,28 @@ /////////////////////////////////////// +// class CUITabBar +/////////////////////////////////////// +CUITabBar::CUITabBar(int x, int y, int w, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color, + GG::TabBarStyle style, GG::Flags<GG::WndFlag> flags) : + GG::TabBar(x, y, w, font, color, text_color, style, flags) +{} + +void CUITabBar::DistinguishCurrentTab(const std::vector<GG::StateButton*>& tab_buttons) { + RaiseCurrentTabButton(); + int index = CurrentTabIndex(); + for (int i = 0; i < static_cast<int>(tab_buttons.size()); ++i) { + GG::StateButton* tab = tab_buttons[i]; + GG::Clr text_color = TextColor(); + if (index == i) + tab->SetTextColor(text_color); + else + tab->SetTextColor(DarkColor(text_color)); + } +} + + +/////////////////////////////////////// // class CUIScroll /////////////////////////////////////// namespace { Modified: trunk/FreeOrion/UI/CUIControls.h =================================================================== --- trunk/FreeOrion/UI/CUIControls.h 2008-08-22 00:36:32 UTC (rev 2669) +++ trunk/FreeOrion/UI/CUIControls.h 2008-08-22 01:21:38 UTC (rev 2670) @@ -13,6 +13,7 @@ #include <GG/MultiEdit.h> #include <GG/Scroll.h> #include <GG/Slider.h> +#include <GG/TabWnd.h> #include "LinkText.h" @@ -141,6 +142,21 @@ }; +/** Tab bar with buttons for selecting tabbed windows. */ +class CUITabBar : public GG::TabBar +{ +public: + /** \name Structors */ ///@{ + /** Basic ctor. */ + CUITabBar(int x, int y, int w, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color, + GG::TabBarStyle style, GG::Flags<GG::WndFlag> flags); + //@} + +private: + virtual void DistinguishCurrentTab(const std::vector<GG::StateButton*>& tab_buttons); +}; + + /** a FreeOrion Scroll control */ class CUIScroll : public GG::Scroll { Modified: trunk/FreeOrion/UI/CUIStyle.cpp =================================================================== --- trunk/FreeOrion/UI/CUIStyle.cpp 2008-08-22 00:36:32 UTC (rev 2669) +++ trunk/FreeOrion/UI/CUIStyle.cpp 2008-08-22 01:21:38 UTC (rev 2670) @@ -73,6 +73,12 @@ return new CUISpin<double>(x, y, w, value, step, min, max, edits); } +GG::TabBar* CUIStyle::NewTabBar(int x, int y, int w, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color/* = GG::CLR_BLACK*/, + GG::TabBarStyle style/* = GG::TAB_BAR_ATTACHED*/, GG::Flags<GG::WndFlag> flags/* = GG::CLICKABLE*/) const +{ + return new CUITabBar(x, y, w, font, color, text_color, style, flags); +} + GG::Button* CUIStyle::NewScrollUpButton(int x, int y, int w, int h, const std::string& str, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color/* = GG::CLR_BLACK*/, GG::Flags<GG::WndFlag> flags/* = GG::CLICKABLE | GG::REPEAT_BUTTON_DOWN*/) const Modified: trunk/FreeOrion/UI/CUIStyle.h =================================================================== --- trunk/FreeOrion/UI/CUIStyle.h 2008-08-22 00:36:32 UTC (rev 2669) +++ trunk/FreeOrion/UI/CUIStyle.h 2008-08-22 01:21:38 UTC (rev 2670) @@ -46,6 +46,10 @@ const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color = GG::CLR_BLACK, GG::Clr interior = GG::CLR_ZERO, GG::Flags<GG::WndFlag> flags = GG::CLICKABLE) const; + virtual GG::TabBar* NewTabBar(int x, int y, int w, const boost::shared_ptr<GG::Font>& font, GG::Clr color, + GG::Clr text_color = GG::CLR_BLACK, GG::TabBarStyle style = GG::TAB_BAR_ATTACHED, + GG::Flags<GG::WndFlag> flags = GG::CLICKABLE) const; + virtual GG::Button* NewScrollUpButton(int x, int y, int w, int h, const std::string& str, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color = GG::CLR_BLACK, GG::Flags<GG::WndFlag> flags = GG::CLICKABLE | GG::REPEAT_BUTTON_DOWN) const; |
From: <tz...@us...> - 2008-12-30 21:03:38
|
Revision: 2709 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2709&view=rev Author: tzlaine Date: 2008-12-30 21:03:29 +0000 (Tue, 30 Dec 2008) Log Message: ----------- Updated to reflect recent GG changes. Modified Paths: -------------- trunk/FreeOrion/UI/LinkText.cpp trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/LinkText.cpp =================================================================== --- trunk/FreeOrion/UI/LinkText.cpp 2008-12-24 19:57:00 UTC (rev 2708) +++ trunk/FreeOrion/UI/LinkText.cpp 2008-12-30 21:03:29 UTC (rev 2709) @@ -217,19 +217,20 @@ for (unsigned int i = 0; i < curr_line.char_data.size(); ++i) { for (unsigned int j = 0; j < curr_line.char_data[i].tags.size(); ++j) { const boost::shared_ptr<GG::Font::FormattingTag>& tag = curr_line.char_data[i].tags[j]; - if (tag->text == "planet" || tag->text == "system" || tag->text == "fleet" || - tag->text == "ship" || tag->text == "tech" || tag->text == "building" || tag->text == "encyclopedia") { - link.type = tag->text; + if (tag->tag_name == "planet" || tag->tag_name == "system" || tag->tag_name == "fleet" || + tag->tag_name == "ship" || tag->tag_name == "tech" || tag->tag_name == "building" || + tag->tag_name == "encyclopedia") { + link.type = tag->tag_name; if (tag->close_tag) { - link.text_posn.second = curr_line.char_data[i].string_index; + link.text_posn.second = Value(curr_line.char_data[i].string_index); link.rects.back().lr.x = i ? curr_line.char_data[i - 1].extent : GG::X0; m_links.push_back(link); link = Link(); } else { link.data = tag->params[0]; - link.text_posn.first = curr_line.char_data[i].string_index; + link.text_posn.first = Value(curr_line.char_data[i].string_index); for (unsigned int k = 0; k < curr_line.char_data[i].tags.size(); ++k) { - link.text_posn.first -= curr_line.char_data[i].tags[k]->OriginalStringChars(); + link.text_posn.first -= Value(curr_line.char_data[i].tags[k]->StringSize()); } link.rects.push_back(GG::Rect(i ? curr_line.char_data[i - 1].extent : GG::X0, y_posn, Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-12-24 19:57:00 UTC (rev 2708) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-12-30 21:03:29 UTC (rev 2709) @@ -493,14 +493,14 @@ case GG::GGK_TAB: { // auto-complete current chat edit word if (m_chat_edit->Visible()) { std::string text = m_chat_edit->WindowText(); - std::pair<int, int> cursor_pos = m_chat_edit->CursorPosn(); - if (cursor_pos.first == cursor_pos.second && 0 < cursor_pos.first && cursor_pos.first <= static_cast<int>(text.size())) { - std::string::size_type word_start = text.substr(0, cursor_pos.first).find_last_of(" :"); + std::pair<GG::CPSize, GG::CPSize> cursor_pos = m_chat_edit->CursorPosn(); + if (cursor_pos.first == cursor_pos.second && 0 < cursor_pos.first && cursor_pos.first <= text.size()) { + std::string::size_type word_start = text.substr(0, Value(cursor_pos.first)).find_last_of(" :"); if (word_start == std::string::npos) word_start = 0; else ++word_start; - std::string partial_word = text.substr(word_start, cursor_pos.first - word_start); + std::string partial_word = text.substr(word_start, Value(cursor_pos.first - word_start)); if (partial_word == "") return; std::set<std::string> names; @@ -517,7 +517,7 @@ } if (names.find(partial_word) != names.end()) { // if there's an exact match, just add a space - text.insert(cursor_pos.first, " "); + text.insert(Value(cursor_pos.first), " "); m_chat_edit->SetText(text); m_chat_edit->SelectRange(cursor_pos.first + 1, cursor_pos.first + 1); } else { // no exact match; look for possible completions @@ -546,9 +546,9 @@ } unsigned int chars_to_add = common_end - partial_word.size(); bool full_completion = common_end == lower_bound->size(); - text.insert(cursor_pos.first, lower_bound->substr(partial_word.size(), chars_to_add) + (full_completion ? " " : "")); + text.insert(Value(cursor_pos.first), lower_bound->substr(partial_word.size(), chars_to_add) + (full_completion ? " " : "")); m_chat_edit->SetText(text); - int move_cursor_to = cursor_pos.first + chars_to_add + (full_completion ? 1 : 0); + GG::CPSize move_cursor_to = cursor_pos.first + chars_to_add + (full_completion ? GG::CP1 : GG::CP0); m_chat_edit->SelectRange(move_cursor_to, move_cursor_to); } } |
From: <tz...@us...> - 2009-01-02 16:37:15
|
Revision: 2713 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2713&view=rev Author: tzlaine Date: 2009-01-02 16:37:04 +0000 (Fri, 02 Jan 2009) Log Message: ----------- Corrected a segfault in the UpdateQueue() functions of ProductionWnd and ResearchWnd. The GG::ListBox::BringRowIntoView() calls are now only performed if the queue ListBox is not empty. Modified Paths: -------------- trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2009-01-02 10:44:46 UTC (rev 2712) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2009-01-02 16:37:04 UTC (rev 2713) @@ -355,10 +355,11 @@ m_queue_lb->Insert(new QueueRow(QUEUE_WIDTH, *it, i)); } - if (!m_queue_lb->Empty()) + if (!m_queue_lb->Empty()) { m_queue_lb->BringRowIntoView(--m_queue_lb->end()); - if (m_queue_lb->NumRows() <= original_queue_length) - m_queue_lb->BringRowIntoView(boost::next(m_queue_lb->begin(), first_visible_queue_row)); + if (m_queue_lb->NumRows() <= original_queue_length) + m_queue_lb->BringRowIntoView(boost::next(m_queue_lb->begin(), first_visible_queue_row)); + } } void ProductionWnd::UpdateInfoPanel() Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2009-01-02 10:44:46 UTC (rev 2712) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2009-01-02 16:37:04 UTC (rev 2713) @@ -281,10 +281,11 @@ m_queue_lb->Insert(new QueueRow(QUEUE_WIDTH, it->tech, it->allocated_rp, it->turns_left)); } - if (!m_queue_lb->Empty()) + if (!m_queue_lb->Empty()) { m_queue_lb->BringRowIntoView(--m_queue_lb->end()); - if (m_queue_lb->NumRows() <= original_queue_length) - m_queue_lb->BringRowIntoView(boost::next(m_queue_lb->begin(), first_visible_queue_row)); + if (m_queue_lb->NumRows() <= original_queue_length) + m_queue_lb->BringRowIntoView(boost::next(m_queue_lb->begin(), first_visible_queue_row)); + } } void ResearchWnd::UpdateInfoPanel() |
From: <geo...@us...> - 2009-01-04 23:33:58
|
Revision: 2721 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2721&view=rev Author: geoffthemedio Date: 2009-01-04 23:33:50 +0000 (Sun, 04 Jan 2009) Log Message: ----------- Blocked selection changed signals of focus droplists on resourcepanel of sidepanel when updating the resourcepanel, which sets the droplists based on what the current focus selection is. Previously, setting the focus droplist was issuing a focuschangeorder, which was being executed, which was in turn causing the resourcepanel to be updated, which re-set the focus droplists, emitting another signal. Not sure why this didn't lead to an infinite loop, but it seems best to block the signals during the part of the update when the lists are being set by code. Modified Paths: -------------- trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/InfoPanels.h Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-04 00:21:20 UTC (rev 2720) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-04 23:33:50 UTC (rev 2721) @@ -646,8 +646,8 @@ m_primary_focus_drop->SetBrowseModeTime(tooltip_delay); m_secondary_focus_drop->SetBrowseModeTime(tooltip_delay); - GG::Connect(m_primary_focus_drop->SelChangedSignal, &ResourcePanel::PrimaryFocusDropListSelectionChanged, this); - GG::Connect(m_secondary_focus_drop->SelChangedSignal, &ResourcePanel::SecondaryFocusDropListSelectionChanged, this); + m_drop_changed_connections[m_primary_focus_drop] = GG::Connect(m_primary_focus_drop->SelChangedSignal, &ResourcePanel::PrimaryFocusDropListSelectionChanged, this); + m_drop_changed_connections[m_secondary_focus_drop] = GG::Connect(m_secondary_focus_drop->SelChangedSignal, &ResourcePanel::SecondaryFocusDropListSelectionChanged, this); // small resource indicators - for use when panel is collapsed m_farming_stat = new StatisticIcon(GG::X0, GG::Y0, icon_width, icon_height, ClientUI::MeterIcon(METER_FARMING), @@ -706,6 +706,11 @@ delete m_research_stat; delete m_trade_stat; + // get rid of held connections + for (std::map<CUIDropDownList*, boost::signals::connection>::iterator it = m_drop_changed_connections.begin(); it != m_drop_changed_connections.end(); ++it) + it->second.disconnect(); + m_drop_changed_connections.clear(); + delete m_primary_focus_drop; delete m_secondary_focus_drop; @@ -823,7 +828,7 @@ parent->MouseWheel(pt, move, mod_keys); } -void ResourcePanel::Render() +void ResourcePanel::Render() { // Draw outline and background... @@ -866,7 +871,7 @@ glEnable(GL_TEXTURE_2D); // draw details depending on state of ownership and expanded / collapsed status - + // determine ownership /*const UniverseObject* obj = GetUniverse().Object(m_rescenter_id); if(obj->Owners().empty()) @@ -952,6 +957,7 @@ } // focus droplists + m_drop_changed_connections[m_primary_focus_drop].block(); // prevent cyclic signalling std::string text; switch (res->PrimaryFocus()) { @@ -984,8 +990,10 @@ text = boost::io::str(FlexibleFormat(UserString("RP_PRIMARY_FOCUS_TOOLTIP")) % UserString("FOCUS_UNKNOWN")); break; } + m_drop_changed_connections[m_primary_focus_drop].unblock(); m_primary_focus_drop->SetBrowseText(text); + m_drop_changed_connections[m_secondary_focus_drop].block(); switch (res->SecondaryFocus()) { case FOCUS_BALANCED: @@ -1017,6 +1025,7 @@ text = boost::io::str(FlexibleFormat(UserString("RP_SECONDARY_FOCUS_TOOLTIP")) % UserString("FOCUS_UNKNOWN")); break; } + m_drop_changed_connections[m_secondary_focus_drop].unblock(); m_secondary_focus_drop->SetBrowseText(text); } Modified: trunk/FreeOrion/UI/InfoPanels.h =================================================================== --- trunk/FreeOrion/UI/InfoPanels.h 2009-01-04 00:21:20 UTC (rev 2720) +++ trunk/FreeOrion/UI/InfoPanels.h 2009-01-04 23:33:50 UTC (rev 2721) @@ -125,6 +125,7 @@ CUIDropDownList* m_primary_focus_drop; ///< displays and allows selection of primary focus CUIDropDownList* m_secondary_focus_drop; ///< displays and allows selection of secondary focus + std::map<CUIDropDownList*, boost::signals::connection> m_drop_changed_connections; ///< signals connecting selection changed signals from drop lists to responses. blocked when programmatically changing focus selection, to avoid recursive signal emission GG::Button* m_expand_button; ///< at top right of panel, toggles the panel open/closed to show details or minimal summary |
From: <tz...@us...> - 2009-01-05 04:17:39
|
Revision: 2722 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2722&view=rev Author: tzlaine Date: 2009-01-05 04:17:34 +0000 (Mon, 05 Jan 2009) Log Message: ----------- Fixed another crash when updating the production and research queues. This supercedes the recent similar crash fix for bug 2482169. Modified Paths: -------------- trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2009-01-04 23:33:50 UTC (rev 2721) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2009-01-05 04:17:34 UTC (rev 2722) @@ -354,11 +354,10 @@ for (ProductionQueue::const_iterator it = queue.begin(); it != queue.end(); ++it, ++i) m_queue_lb->Insert(new QueueRow(QUEUE_WIDTH, *it, i)); - if (!m_queue_lb->Empty()) { + if (!m_queue_lb->Empty()) m_queue_lb->BringRowIntoView(--m_queue_lb->end()); - if (m_queue_lb->NumRows() <= original_queue_length) - m_queue_lb->BringRowIntoView(boost::next(m_queue_lb->begin(), first_visible_queue_row)); - } + if (first_visible_queue_row < m_queue_lb->NumRows()) + m_queue_lb->BringRowIntoView(boost::next(m_queue_lb->begin(), first_visible_queue_row)); } void ProductionWnd::UpdateInfoPanel() Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2009-01-04 23:33:50 UTC (rev 2721) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2009-01-05 04:17:34 UTC (rev 2722) @@ -281,11 +281,10 @@ m_queue_lb->Insert(new QueueRow(QUEUE_WIDTH, it->tech, it->allocated_rp, it->turns_left)); } - if (!m_queue_lb->Empty()) { + if (!m_queue_lb->Empty()) m_queue_lb->BringRowIntoView(--m_queue_lb->end()); - if (m_queue_lb->NumRows() <= original_queue_length) - m_queue_lb->BringRowIntoView(boost::next(m_queue_lb->begin(), first_visible_queue_row)); - } + if (first_visible_queue_row < m_queue_lb->NumRows()) + m_queue_lb->BringRowIntoView(boost::next(m_queue_lb->begin(), first_visible_queue_row)); } void ResearchWnd::UpdateInfoPanel() |
From: <geo...@us...> - 2009-01-25 10:01:32
|
Revision: 2767 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2767&view=rev Author: geoffthemedio Date: 2009-01-25 10:01:29 +0000 (Sun, 25 Jan 2009) Log Message: ----------- -Fixed [ 2534402 ] 0.3.11 Crash on Renaming Fleets and [ 2534925 ] Right Clicking on Ship Rename Popup Crashes Client. Not exactly sure what was wrong, but partly rewriting the relevant code for both seems to have fixed both. -Tweaked GL version output to round properly -Trivial grooming in InfoPanels.cpp Modified Paths: -------------- trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2009-01-23 15:45:46 UTC (rev 2766) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2009-01-25 10:01:29 UTC (rev 2767) @@ -1043,14 +1043,18 @@ { ShipRow* ship_row = dynamic_cast<ShipRow*>(*it); - if (!ship_row || - ship_row->m_ship->Owners().size() != 1 || - HumanClientApp::GetApp()->EmpireID() != *ship_row->m_ship->Owners().begin()) { + if (!ship_row) return; + + Ship* ship = ship_row->m_ship; + + if (!ship || + ship->Owners().size() != 1 || + HumanClientApp::GetApp()->EmpireID() != *ship->Owners().begin()) + { + return; } - Ship* ship = GetUniverse().Object<Ship>(ship_row->ShipID()); - GG::MenuItem menu_contents; menu_contents.next_level.push_back(GG::MenuItem(UserString("RENAME"), 1, false, false)); @@ -1060,15 +1064,16 @@ if (popup.Run()) { switch (popup.MenuID()) { case 1: { // rename ship - GG::TextControl* text_control = boost::polymorphic_downcast<GG::TextControl*>((**it)[0]); - std::string ship_name = text_control->Text(); + std::string ship_name = ship->Name(); CUIEditWnd edit_wnd(GG::X(350), UserString("ENTER_NEW_NAME"), ship_name); edit_wnd.Run(); - if (edit_wnd.Result() != "") { + + std::string new_name = edit_wnd.Result(); + + if (new_name != "" && new_name != ship_name) { HumanClientApp::GetApp()->Orders().IssueOrder( OrderPtr(new RenameOrder(HumanClientApp::GetApp()->EmpireID(), ship->ID(), - edit_wnd.Result()))); - text_control->SetText(edit_wnd.Result()); + new_name))); } break;} default: @@ -1365,12 +1370,14 @@ Fleet* fleet = FleetInRow(it); if (!fleet || fleet->Owners().size() != 1 || - HumanClientApp::GetApp()->EmpireID() != *fleet->Owners().begin()) { + HumanClientApp::GetApp()->EmpireID() != *fleet->Owners().begin()) + { return; } GG::MenuItem menu_contents; menu_contents.next_level.push_back(GG::MenuItem(UserString("RENAME"), 1, false, false)); + GG::PopupMenu popup(pt.x, pt.y, ClientUI::GetFont(), menu_contents, ClientUI::TextColor()); @@ -1380,11 +1387,13 @@ std::string fleet_name = fleet->Name(); CUIEditWnd edit_wnd(GG::X(350), UserString("ENTER_NEW_NAME"), fleet_name); edit_wnd.Run(); - if (edit_wnd.Result() != "") { + + std::string new_name = edit_wnd.Result(); + + if (new_name != "" && new_name != fleet_name) { HumanClientApp::GetApp()->Orders().IssueOrder( OrderPtr(new RenameOrder(HumanClientApp::GetApp()->EmpireID(), fleet->ID(), - edit_wnd.Result()))); - boost::polymorphic_downcast<GG::TextControl*>((**it)[0])->SetText(edit_wnd.Result()); + new_name))); } break; } Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-23 15:45:46 UTC (rev 2766) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-25 10:01:29 UTC (rev 2767) @@ -2166,10 +2166,10 @@ Wnd::SizeMove(ul, lr); GG::Pt child_lr = lr - ul - GG::Pt(GG::X1, GG::Y1); // extra pixel prevents graphic from overflowing border box - + if (m_graphic) m_graphic->SizeMove(GG::Pt(GG::X0, GG::Y0), child_lr); - + GG::Y bar_top = Height() * 4 / 5; if (m_progress_bar) m_progress_bar->SizeMove(GG::Pt(GG::X0, bar_top), child_lr); Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-01-23 15:45:46 UTC (rev 2766) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-01-25 10:01:29 UTC (rev 2767) @@ -114,8 +114,9 @@ float version_number = 0.0; std::istringstream iss(gl_version_string); iss >> version_number; + version_number += 0.05f; // ensures proper rounding of 1.1 digit number - Logger().debugStream() << "...extracted version number: " << DoubleToString(version_number + 0.05, 2, false, false); // combination of floating point precision and DoubleToString preferring to round down means the +0.05 is needed to round properly + Logger().debugStream() << "...extracted version number: " << DoubleToString(version_number, 2, false, false); // combination of floating point precision and DoubleToString preferring to round down means the +0.05 is needed to round properly if (version_number < 1.5) { Logger().errorStream() << "OpenGL version number less than 1.5. FreeOrion uses OpenGL 1.5 features and may crash on this system."; |
From: <geo...@us...> - 2009-01-25 10:45:27
|
Revision: 2768 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2768&view=rev Author: geoffthemedio Date: 2009-01-25 10:45:22 +0000 (Sun, 25 Jan 2009) Log Message: ----------- -Extended PlanetPanel background and border around rendered planet spheres at insistence of eleazar. -Reworked layout and scrolling of PlanetPanels on SidePanel, removing some duplicate code and adding a slight gap between panels. -Added black outline around SidePanel planet names -Added window border colour edge to SidePanel, to better separate from black background space -Grooming / commenting Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/SidePanel.h Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2009-01-25 10:01:29 UTC (rev 2767) +++ trunk/FreeOrion/UI/SidePanel.cpp 2009-01-25 10:45:22 UTC (rev 2768) @@ -369,7 +369,7 @@ typedef boost::signal<void (int)> LeftClickedSignalType; ///< emitted when the planet graphic is left clicked by the user typedef boost::signal<void ()> ResizedSignalType; ///< emitted when resized, so external container can redo layout //@} - + /** \name Slot Types */ //@{ typedef LeftClickedSignalType::slot_type LeftClickedSlotType; ///< type of functor(s) invoked on a LeftClickedSignalType //@} @@ -430,6 +430,8 @@ SpecialsPanel* m_specials_panel; ///< contains icons representing specials }; +/** Container class that holds PlanetPanels. Creates and destroys PlanetPanel as necessary, and does layout of them + * after creation and in response to scrolling through them by the user. */ class SidePanel::PlanetPanelContainer : public GG::Wnd { public: @@ -468,16 +470,19 @@ void FindSelectionCandidates(); void HiliteSelectionCandidates(); void PlanetSelected(int planet_id); - void DoPanelsLayout(); // repositions PlanetPanels, accounting for their size, which may have changed - void VScroll(int from, int to, int range_min, int range_max); + void DoPanelsLayout(GG::Y top); // repositions PlanetPanels, positioning the top panel at y position \a top relative to the to of the container. + void DoPanelsLayout(); // repositions PlanetPanels, without moving top panel. Panels below may shift if ones above them have resized. + void VScroll(int pos_top, int pos_bottom, int range_min, int range_max); // all but first parameter ignored - std::vector<PlanetPanel*> m_planet_panels; - int m_planet_id; - std::set<int> m_candidate_ids; + std::vector<PlanetPanel*> m_planet_panels; + GG::Y m_planet_panels_top; - boost::shared_ptr<UniverseObjectVisitor> m_valid_selection_predicate; + int m_planet_id; + std::set<int> m_candidate_ids; - CUIScroll* m_vscroll; ///< the vertical scroll (for viewing all the planet panes) + boost::shared_ptr<UniverseObjectVisitor> m_valid_selection_predicate; + + CUIScroll* m_vscroll; ///< the vertical scroll (for viewing all the planet panes) }; class RotatingPlanetControl : public GG::Control @@ -705,20 +710,22 @@ } } - m_planet_name = new GG::TextControl(GG::X(MAX_PLANET_DIAMETER + 3), GG::Y(5), planet.Name(), ClientUI::GetBoldFont(ClientUI::Pts()*4/3), ClientUI::TextColor()); + // create planet panel that auto-sizes itself to fit text + m_planet_name = new ShadowedTextControl(GG::X(MAX_PLANET_DIAMETER + EDGE_PAD), GG::Y0, planet.Name(), ClientUI::GetBoldFont(ClientUI::Pts()*4/3), ClientUI::TextColor()); AttachChild(m_planet_name); std::string env_size_text = GetPlanetSizeName(planet) + " " + GetPlanetTypeName(planet) + " (" + GetPlanetEnvironmentName(planet) + ")"; + // create info panels and attach signals m_population_panel = new PopulationPanel(w - MAX_PLANET_DIAMETER, planet); AttachChild(m_population_panel); GG::Connect(m_population_panel->ExpandCollapseSignal, &SidePanel::PlanetPanel::DoLayout, this); m_resource_panel = new ResourcePanel(w - MAX_PLANET_DIAMETER, planet); AttachChild(m_resource_panel); - GG::Connect(m_resource_panel->ExpandCollapseSignal, &SidePanel::PlanetPanel::DoLayout, this); - GG::Connect(m_resource_panel->PrimaryFocusChangedSignal, &SidePanel::PlanetPanel::SetPrimaryFocus, this); - GG::Connect(m_resource_panel->SecondaryFocusChangedSignal, &SidePanel::PlanetPanel::SetSecondaryFocus, this); + GG::Connect(m_resource_panel->ExpandCollapseSignal, &SidePanel::PlanetPanel::DoLayout, this); + GG::Connect(m_resource_panel->PrimaryFocusChangedSignal, &SidePanel::PlanetPanel::SetPrimaryFocus, this); + GG::Connect(m_resource_panel->SecondaryFocusChangedSignal, &SidePanel::PlanetPanel::SetSecondaryFocus, this); m_military_panel = new MilitaryPanel(w - MAX_PLANET_DIAMETER, planet); AttachChild(m_military_panel); @@ -730,7 +737,6 @@ m_specials_panel = new SpecialsPanel(w - MAX_PLANET_DIAMETER, planet); AttachChild(m_specials_panel); - m_specials_panel->MoveTo(GG::Pt(GG::Pt(Width() - m_population_panel->Width(), m_planet_name->LowerRight().y - UpperLeft().y))); m_env_size = new GG::TextControl(GG::X(MAX_PLANET_DIAMETER), m_specials_panel->LowerRight().y - UpperLeft().y, env_size_text, ClientUI::GetFont(), ClientUI::TextColor()); AttachChild(m_env_size); @@ -748,7 +754,7 @@ if (planet.Type() == PT_ASTEROIDS) MoveChildDown(m_planet_graphic); - const Planet *plt = GetUniverse().Object<const Planet>(m_planet_id); + const Planet* plt = GetUniverse().Object<const Planet>(m_planet_id); // connecting system's StateChangedSignal to this->Refresh() should be redundant, as // the sidepanel's Refresh will be called when that signal is emitted, which will refresh @@ -793,23 +799,33 @@ void SidePanel::PlanetPanel::DoLayout() { - const int INTERPANEL_SPACE = 3; - GG::Y y = m_specials_panel->LowerRight().y - UpperLeft().y; - GG::X x = Width() - m_population_panel->Width(); + GG::X x = GG::X0 + MAX_PLANET_DIAMETER + EDGE_PAD; + GG::Y y = GG::Y0; + m_planet_name->MoveTo(GG::Pt(x, y)); // assumed to always be this Wnd's child + y += m_planet_name->Height(); // no interpanel space needed here, I declare arbitrarily + + m_specials_panel->MoveTo(GG::Pt(x, y)); // assumed to always be this Wnd's child + y += m_specials_panel->Height() + EDGE_PAD; + + if (m_env_size->Parent() == this) { + m_env_size->MoveTo(GG::Pt(x, y)); + y += m_env_size->Height() + EDGE_PAD; + } + if (m_population_panel->Parent() == this) { m_population_panel->MoveTo(GG::Pt(x, y)); - y += m_population_panel->Height() + INTERPANEL_SPACE; + y += m_population_panel->Height() + EDGE_PAD; } if (m_resource_panel->Parent() == this) { m_resource_panel->MoveTo(GG::Pt(x, y)); - y += m_resource_panel->Height() + INTERPANEL_SPACE; + y += m_resource_panel->Height() + EDGE_PAD; } if (m_military_panel->Parent() == this) { m_military_panel->MoveTo(GG::Pt(x, y)); - y += m_military_panel->Height() + INTERPANEL_SPACE; + y += m_military_panel->Height() + EDGE_PAD; } if (m_buildings_panel->Parent() == this) { @@ -906,11 +922,8 @@ bool SidePanel::PlanetPanel::InWindow(const GG::Pt& pt) const { - // The mouse is in this window if it is in the rightmost Width() - MAX_PLANET_DIAMETER portion, or if it is over the - // planet graphic, or if it is over the specials panel. That is, it falls through to the MapWnd if it is over the - // empty space around the planet on the left side of the panel. GG::Pt ul = UpperLeft(), lr = LowerRight(); - ul.x += MAX_PLANET_DIAMETER; + //ul.x += MAX_PLANET_DIAMETER; // uncomment to exclude points over rotating planet graphic return (ul <= pt && pt < lr || m_specials_panel->InWindow(pt) || InPlanet(pt)); } @@ -934,12 +947,18 @@ GG::Clr DARK_GREY = GG::Clr(26, 26, 26, 255); GG::Pt ul = UpperLeft(); GG::Pt lr = LowerRight(); - GG::FlatRectangle(GG::Pt(ul.x + SidePanel::MAX_PLANET_DIAMETER, m_planet_name->UpperLeft().y), - GG::Pt(lr.x, m_planet_name->LowerRight().y), - DARK_GREY, DARK_GREY, 0); // top title filled background - const Planet *planet = GetPlanet(); + Logger().debugStream() << "Planetpanel top: " << GG::Value(ul.y); + // background and border + GG::FlatRectangle(ul, lr, ClientUI::WndColor(), ClientUI::WndOuterBorderColor(), 1); + + // background behind planet name + GG::FlatRectangle(m_planet_name->UpperLeft() - GG::Pt(GG::X(SidePanel::EDGE_PAD), GG::Y0), GG::Pt(lr.x, m_planet_name->LowerRight().y), + DARK_GREY, DARK_GREY, 0); + + const Planet* planet = GetPlanet(); + if (m_hiliting == HILITING_CANDIDATE && planet->Type() != PT_ASTEROIDS) { GG::Rect planet_rect(m_rotating_planet_graphic->UpperLeft(), m_rotating_planet_graphic->LowerRight()); double PERIOD_MS = 2000.0; @@ -1060,6 +1079,7 @@ SidePanel::PlanetPanelContainer::PlanetPanelContainer(GG::X x, GG::Y y, GG::X w, GG::Y h) : Wnd(x, y, w, h, GG::CLICKABLE), m_planet_panels(), + m_planet_panels_top(GG::Y0), m_planet_id(UniverseObject::INVALID_OBJECT_ID), m_vscroll(new CUIScroll(Width()-14,GG::Y0,GG::X(14),Height(),GG::VERTICAL)) { @@ -1105,38 +1125,47 @@ PlanetPanel* planet_panel = new PlanetPanel(Width() - m_vscroll->Width(), *planet, star_type); AttachChild(planet_panel); m_planet_panels.push_back(planet_panel); - GG::Connect(m_planet_panels.back()->PlanetImageLClickedSignal, &SidePanel::PlanetPanelContainer::PlanetSelected, this); - GG::Connect(m_planet_panels.back()->ResizedSignal, &SidePanel::PlanetPanelContainer::DoPanelsLayout, this); + GG::Connect(m_planet_panels.back()->PlanetImageLClickedSignal, &SidePanel::PlanetPanelContainer::PlanetSelected, this); + GG::Connect(m_planet_panels.back()->ResizedSignal, &SidePanel::PlanetPanelContainer::DoPanelsLayout, this); } - DoPanelsLayout(); - VScroll(m_vscroll->PosnRange().first, 0, 0, 0); + VScroll(0, 0, 0, 0); // reset scroll when resetting planets to ensure new set of planets won't be stuck scrolled up out of view FindSelectionCandidates(); HiliteSelectionCandidates(); } void SidePanel::PlanetPanelContainer::DoPanelsLayout() { - GG::Y y(0); + DoPanelsLayout(m_planet_panels_top); // redo layout without moving panels +} + +void SidePanel::PlanetPanelContainer::DoPanelsLayout(GG::Y top) +{ + Logger().errorStream() << "SidePanel::PlanetPanelContainer::DoPanelsLaout passed positive top. It is expected to be 0 or negative only."; + m_planet_panels_top = top; + GG::Y y = m_planet_panels_top; + GG::X x = GG::X0; + for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { PlanetPanel* panel = *it; - panel->MoveTo(GG::Pt(GG::X0, y)); - y += panel->Height(); // may be different for each panel depending whether that panel has been previously left expanded or collapsed + panel->MoveTo(GG::Pt(x, y)); + y += panel->Height() + SidePanel::EDGE_PAD; // panel height may be different for each panel depending whether that panel has been previously left expanded or collapsed } GG::Y available_height = y; - GG::Wnd* parent = Parent(); - if (parent) { + const GG::Y BIG_PAD_TO_BE_SAFE = GG::Y(300); + + if (GG::Wnd* parent = Parent()) { GG::Y containing_height = parent->Height(); - available_height = containing_height - 300; // height of visible "page" of panels + available_height = containing_height - BIG_PAD_TO_BE_SAFE; // height of visible "page" of panels } - m_vscroll->SizeScroll(0, Value(y), MAX_PLANET_DIAMETER, Value(available_height)); // adjust size of scrollbar - m_vscroll->ScrolledSignal(m_vscroll->PosnRange().first, m_vscroll->PosnRange().second, 0, 0); // fake a scroll event in order to update scrollbar and panel container position + // adjust size of scrollbar to account for panel resizing + m_vscroll->SizeScroll(0, Value(y - m_planet_panels_top), MAX_PLANET_DIAMETER, Value(available_height)); - if (y < available_height + 1) { + // hide scrollbar if all panels are visible and fit into the available height + if (Value(y - m_planet_panels_top) < available_height + 1) { DetachChild(m_vscroll); - } - else { + } else { AttachChild(m_vscroll); m_vscroll->Show(); } @@ -1195,13 +1224,9 @@ } } -void SidePanel::PlanetPanelContainer::VScroll(int from, int to, int range_min, int range_max) +void SidePanel::PlanetPanelContainer::VScroll(int pos_top, int pos_bottom, int range_min, int range_max) { - GG::Y y(-from); - for (unsigned int i = 0; i < m_planet_panels.size(); ++i) { - m_planet_panels[i]->MoveTo(GG::Pt(GG::X0, y)); - y += m_planet_panels[i]->Height(); - } + DoPanelsLayout(GG::Y(-pos_top)); // scrolling bar down pos_top pixels causes the panels to move up that many pixels } void SidePanel::PlanetPanelContainer::RefreshAllPlanetPanels() @@ -1219,7 +1244,7 @@ const System* SidePanel::s_system = 0; std::set<SidePanel*> SidePanel::s_side_panels; -const int SidePanel::EDGE_PAD = 4; +const int SidePanel::EDGE_PAD = 3; SidePanel::SidePanel(GG::X x, GG::Y y, GG::X w, GG::Y h) : Wnd(x, y, w, h, GG::CLICKABLE), @@ -1298,7 +1323,7 @@ void SidePanel::Render() { GG::Pt ul = UpperLeft(), lr = LowerRight(); - FlatRectangle(GG::Pt(ul.x + MAX_PLANET_DIAMETER, ul.y), lr, ClientUI::SidePanelColor(), GG::CLR_CYAN, 0); + FlatRectangle(GG::Pt(ul.x + MAX_PLANET_DIAMETER, ul.y), lr, ClientUI::SidePanelColor(), ClientUI::WndOuterBorderColor(), 1); } void SidePanel::Refresh() Modified: trunk/FreeOrion/UI/SidePanel.h =================================================================== --- trunk/FreeOrion/UI/SidePanel.h 2009-01-25 10:01:29 UTC (rev 2767) +++ trunk/FreeOrion/UI/SidePanel.h 2009-01-25 10:45:22 UTC (rev 2768) @@ -55,10 +55,11 @@ void SetValidSelectionPredicate(const boost::shared_ptr<UniverseObjectVisitor> &visitor); //@} - static void SetSystem(int system_id); ///< sets the system currently being viewed in all side panels + static void SetSystem(int system_id); ///< sets the system currently being viewed in all side panels - static const int MAX_PLANET_DIAMETER; // size of a huge planet, in on-screen pixels - static const int MIN_PLANET_DIAMETER; // size of a tiny planet, in on-screen pixels + static const int MAX_PLANET_DIAMETER; ///< size of a huge planet, in on-screen pixels + static const int MIN_PLANET_DIAMETER; ///< size of a tiny planet, in on-screen pixels + static const int EDGE_PAD; ///< spacing between widgets and edges of sidepanel mutable boost::signal<void (int)> PlanetSelectedSignal; ///< emitted when a rotating planet in the side panel is clicked by the user mutable boost::signal<void (int)> SystemSelectedSignal; ///< emitted when something in the sidepanel wants to change the selected system, including the droplist or back/forward arrows @@ -93,8 +94,6 @@ std::set<boost::signals::connection> m_system_connections; std::map<const Fleet*, boost::signals::connection> m_fleet_state_change_signals; - - static const int EDGE_PAD; }; #endif // _SidePanel_h_ |
From: <geo...@us...> - 2009-01-27 10:48:02
|
Revision: 2772 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2772&view=rev Author: geoffthemedio Date: 2009-01-27 10:47:59 +0000 (Tue, 27 Jan 2009) Log Message: ----------- Moved some SidePanel layout constants from hard-coded to entries in the options DB Modified Paths: -------------- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/SidePanel.h Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2009-01-26 14:04:52 UTC (rev 2771) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2009-01-27 10:47:59 UTC (rev 2772) @@ -597,16 +597,18 @@ Wnd(GG::X0, GG::Y0, w, h, GG::CLICKABLE | GG::ONTOP), m_build_location(UniverseObject::INVALID_OBJECT_ID) { - GG::X CHILD_WIDTHS = w - MapWnd::SIDE_PANEL_WIDTH; + const GG::X SIDEPANEL_WIDTH = GG::X(GetOptionsDB().Get<int>("UI.sidepanel-width")); + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); + const GG::X CHILD_WIDTHS = w - SIDEPANEL_WIDTH; const GG::Y DETAIL_PANEL_HEIGHT = TechTreeWnd::NAVIGATOR_AND_DETAIL_HEIGHT; const GG::Y BUILD_SELECTOR_HEIGHT = DETAIL_PANEL_HEIGHT; m_enc_detail_panel = new EncyclopediaDetailPanel(CHILD_WIDTHS, DETAIL_PANEL_HEIGHT); - m_side_panel = new SidePanel(Width() - MapWnd::SIDE_PANEL_WIDTH, GG::Y0, MapWnd::SIDE_PANEL_WIDTH, GG::GUI::GetGUI()->AppHeight()); + m_side_panel = new SidePanel(Width() - SIDEPANEL_WIDTH, GG::Y0, GG::GUI::GetGUI()->AppHeight()); m_side_panel->Hide(); - m_map_view_hole = GG::Rect(GG::X0, GG::Y0, CHILD_WIDTHS + SidePanel::MAX_PLANET_DIAMETER, h); + m_map_view_hole = GG::Rect(GG::X0, GG::Y0, CHILD_WIDTHS + MAX_PLANET_DIAMETER, h); m_build_selector = new BuildSelector(CHILD_WIDTHS, BUILD_SELECTOR_HEIGHT); m_build_selector->MoveTo(GG::Pt(GG::X0, h - BUILD_SELECTOR_HEIGHT)); Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-26 14:04:52 UTC (rev 2771) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2009-01-27 10:47:59 UTC (rev 2772) @@ -412,7 +412,7 @@ std::map<int, bool> PopulationPanel::s_expanded_map = std::map<int, bool>(); const int PopulationPanel::EDGE_PAD = 3; PopulationPanel::PopulationPanel(GG::X w, const UniverseObject &obj) : - Wnd(GG::X0, GG::Y0, w, GG::Y(ClientUI::Pts()*4/3), GG::CLICKABLE), + Wnd(GG::X0, GG::Y0, w, GG::Y(ClientUI::Pts()*2), GG::CLICKABLE), m_popcenter_id(obj.ID()), m_pop_stat(0), m_health_stat(0), m_multi_icon_value_indicator(0), m_multi_meter_status_bar(0), @@ -522,6 +522,8 @@ Resize(GG::Pt(Width(), m_multi_meter_status_bar->LowerRight().y + EDGE_PAD - top)); } + m_expand_button->MoveTo(GG::Pt(Width() - m_expand_button->Width(), GG::Y0)); + // update appearance of expand/collapse button if (s_expanded_map[m_popcenter_id]) { m_expand_button->SetUnpressedGraphic(GG::SubTexture(ClientUI::GetTexture( ClientUI::ArtDir() / "icons" / "uparrownormal.png" ), GG::X0, GG::Y0, GG::X(32), GG::Y(32))); @@ -700,6 +702,8 @@ if (!res) throw std::invalid_argument("Attempted to construct a ResourcePanel with an UniverseObject that is not a ResourceCenter"); + EnableChildClipping(true); + // expand / collapse button at top right m_expand_button = new GG::Button(w - 16, GG::Y0, GG::X(16), GG::Y(16), "", ClientUI::GetFont(), GG::CLR_WHITE, GG::CLR_ZERO, GG::ONTOP | GG::CLICKABLE); AttachChild(m_expand_button); Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-01-26 14:04:52 UTC (rev 2771) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-01-27 10:47:59 UTC (rev 2772) @@ -253,7 +253,6 @@ // static(s) double MapWnd::s_min_scale_factor = 0.35; double MapWnd::s_max_scale_factor = 8.0; -const GG::X MapWnd::SIDE_PANEL_WIDTH(360); MapWnd::MapWnd() : GG::Wnd(-GG::GUI::GetGUI()->AppWidth(), -GG::GUI::GetGUI()->AppHeight(), @@ -286,25 +285,29 @@ m_toolbar->Hide(); // system-view side panel - m_side_panel = new SidePanel(GG::GUI::GetGUI()->AppWidth() - SIDE_PANEL_WIDTH, m_toolbar->LowerRight().y, SIDE_PANEL_WIDTH, GG::GUI::GetGUI()->AppHeight()); - GG::Connect(m_side_panel->SystemSelectedSignal, &MapWnd::SelectSystem, this); // sidepanel requests system selection change -> select it - GG::Connect(m_side_panel->ResourceCenterChangedSignal, &MapWnd::UpdateSidePanelSystemObjectMetersAndResourcePools, this); // something in sidepanel changed resource pool(s), so need to recalculate and update meteres and resource pools and refresh their indicators + const GG::X SIDEPANEL_WIDTH(GetOptionsDB().Get<int>("UI.sidepanel-width")); + const GG::X APP_WIDTH(GG::GUI::GetGUI()->AppWidth()); + const GG::Y APP_HEIGHT(GG::GUI::GetGUI()->AppHeight()); - m_sitrep_panel = new SitRepPanel( (GG::GUI::GetGUI()->AppWidth()-SITREP_PANEL_WIDTH)/2, (GG::GUI::GetGUI()->AppHeight()-SITREP_PANEL_HEIGHT)/2, SITREP_PANEL_WIDTH, SITREP_PANEL_HEIGHT ); + m_side_panel = new SidePanel(APP_WIDTH - SIDEPANEL_WIDTH, m_toolbar->LowerRight().y, APP_HEIGHT); + GG::Connect(m_side_panel->SystemSelectedSignal, &MapWnd::SelectSystem, this); // sidepanel requests system selection change -> select it + GG::Connect(m_side_panel->ResourceCenterChangedSignal, &MapWnd::UpdateSidePanelSystemObjectMetersAndResourcePools, this); // something in sidepanel changed resource pool(s), so need to recalculate and update meteres and resource pools and refresh their indicators + + m_sitrep_panel = new SitRepPanel( (APP_WIDTH-SITREP_PANEL_WIDTH)/2, (APP_HEIGHT-SITREP_PANEL_HEIGHT)/2, SITREP_PANEL_WIDTH, SITREP_PANEL_HEIGHT ); GG::Connect(m_sitrep_panel->ClosingSignal, BoolToVoidAdapter(boost::bind(&MapWnd::ToggleSitRep, this))); // sitrep panel is manually closed by user - m_research_wnd = new ResearchWnd(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight() - m_toolbar->Height()); + m_research_wnd = new ResearchWnd(APP_WIDTH, APP_HEIGHT - m_toolbar->Height()); m_research_wnd->MoveTo(GG::Pt(GG::X0, m_toolbar->Height())); GG::GUI::GetGUI()->Register(m_research_wnd); m_research_wnd->Hide(); - m_production_wnd = new ProductionWnd(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight() - m_toolbar->Height()); + m_production_wnd = new ProductionWnd(APP_WIDTH, APP_HEIGHT - m_toolbar->Height()); m_production_wnd->MoveTo(GG::Pt(GG::X0, m_toolbar->Height())); GG::GUI::GetGUI()->Register(m_production_wnd); m_production_wnd->Hide(); GG::Connect(m_production_wnd->SystemSelectedSignal, &MapWnd::SelectSystem, this); // productionwnd requests system selection change -> select it - m_design_wnd = new DesignWnd(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight() - m_toolbar->Height()); + m_design_wnd = new DesignWnd(APP_WIDTH, APP_HEIGHT - m_toolbar->Height()); m_design_wnd->MoveTo(GG::Pt(GG::X0, m_toolbar->Height())); GG::GUI::GetGUI()->Register(m_design_wnd); m_design_wnd->Hide(); @@ -388,7 +391,7 @@ m_chat_display->SetMaxLinesOfHistory(100); m_chat_display->Hide(); - m_chat_edit = new CUIEdit(GG::X(LAYOUT_MARGIN), GG::GUI::GetGUI()->AppHeight() - CHAT_EDIT_HEIGHT - LAYOUT_MARGIN, CHAT_WIDTH, "", + m_chat_edit = new CUIEdit(GG::X(LAYOUT_MARGIN), APP_HEIGHT - CHAT_EDIT_HEIGHT - LAYOUT_MARGIN, CHAT_WIDTH, "", ClientUI::GetFont(), ClientUI::CtrlBorderColor(), ClientUI::TextColor(), GG::CLR_ZERO); AttachChild(m_chat_edit); m_chat_edit->Hide(); @@ -2393,13 +2396,21 @@ void MapWnd::Sanitize() { Cleanup(); - m_side_panel->MoveTo(GG::Pt(GG::GUI::GetGUI()->AppWidth() - SIDE_PANEL_WIDTH, m_toolbar->LowerRight().y)); + + const GG::X SIDEPANEL_WIDTH = GG::X(GetOptionsDB().Get<int>("UI.sidepanel-width")); + const GG::X APP_WIDTH = GG::GUI::GetGUI()->AppWidth(); + const GG::Y APP_HEIGHT = GG::GUI::GetGUI()->AppHeight(); + + GG::Pt sp_ul = GG::Pt(APP_WIDTH - SIDEPANEL_WIDTH, m_toolbar->LowerRight().y); + GG::Pt sp_lr = sp_ul + GG::Pt(SIDEPANEL_WIDTH, m_side_panel->Height()); + + m_side_panel->SizeMove(sp_ul, sp_lr); m_chat_display->MoveTo(GG::Pt(GG::X(LAYOUT_MARGIN), m_turn_update->LowerRight().y + LAYOUT_MARGIN)); m_chat_display->Clear(); - m_chat_edit->MoveTo(GG::Pt(GG::X(LAYOUT_MARGIN), GG::GUI::GetGUI()->AppHeight() - CHAT_EDIT_HEIGHT - LAYOUT_MARGIN)); - m_sitrep_panel->MoveTo(GG::Pt((GG::GUI::GetGUI()->AppWidth() - SITREP_PANEL_WIDTH) / 2, (GG::GUI::GetGUI()->AppHeight() - SITREP_PANEL_HEIGHT) / 2)); + m_chat_edit->MoveTo(GG::Pt(GG::X(LAYOUT_MARGIN), APP_HEIGHT - CHAT_EDIT_HEIGHT - LAYOUT_MARGIN)); + m_sitrep_panel->MoveTo(GG::Pt((APP_WIDTH - SITREP_PANEL_WIDTH) / 2, (APP_HEIGHT - SITREP_PANEL_HEIGHT) / 2)); m_sitrep_panel->Resize(GG::Pt(SITREP_PANEL_WIDTH, SITREP_PANEL_HEIGHT)); - MoveTo(GG::Pt(-GG::GUI::GetGUI()->AppWidth(), -GG::GUI::GetGUI()->AppHeight())); + MoveTo(GG::Pt(-APP_WIDTH, -APP_HEIGHT)); m_zoom_factor = 1.0; m_research_wnd->Sanitize(); m_production_wnd->Sanitize(); Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2009-01-26 14:04:52 UTC (rev 2771) +++ trunk/FreeOrion/UI/MapWnd.h 2009-01-27 10:47:59 UTC (rev 2772) @@ -122,8 +122,6 @@ void Sanitize(); //!< sanitizes the MapWnd after a game //!@} - static const GG::X SIDE_PANEL_WIDTH; - protected: virtual bool EventFilter(GG::Wnd* w, const GG::WndEvent& event); Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2009-01-26 14:04:52 UTC (rev 2771) +++ trunk/FreeOrion/UI/SidePanel.cpp 2009-01-27 10:47:59 UTC (rev 2772) @@ -350,9 +350,24 @@ default : scale = 2.0/5.0; break; } - return static_cast<int>(SidePanel::MIN_PLANET_DIAMETER + (SidePanel::MAX_PLANET_DIAMETER - SidePanel::MIN_PLANET_DIAMETER) * scale) - 2; // -2 for borders of planet panel so largest planet doesn't exceed its space + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); + int MIN_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-min-diameter"); + // sanity check + if (MIN_PLANET_DIAMETER > MAX_PLANET_DIAMETER) + MIN_PLANET_DIAMETER = MAX_PLANET_DIAMETER; + + const int EDGE_PAD = 3; + + return static_cast<int>(MIN_PLANET_DIAMETER + (MAX_PLANET_DIAMETER - MIN_PLANET_DIAMETER) * scale) - 2 * EDGE_PAD; } + void AddOptions(OptionsDB& db) + { + db.Add("UI.sidepanel-width", "OPTIONS_DB_UI_SIDEPANEL_WIDTH", 360, RangedValidator<int>(64, 512)); + db.Add("UI.sidepanel-planet-max-diameter", "OPTIONS_DB_UI_SIDEPANEL_PLANET_MAX_DIAMETER", 128, RangedValidator<int>(16, 512)); + db.Add("UI.sidepanel-planet-min-diameter", "OPTIONS_DB_UI_SIDEPANEL_PLANET_MIN_DIAMETER", 24, RangedValidator<int>(8, 128)); + } + bool temp_bool = RegisterOptions(&AddOptions); } /** a single planet's info and controls; several of these may appear at any one time in a SidePanel */ @@ -656,7 +671,7 @@ } SidePanel::PlanetPanel::PlanetPanel(GG::X w, const Planet &planet, StarType star_type) : - Wnd(GG::X0, GG::Y0, w, GG::Y(MAX_PLANET_DIAMETER), GG::CLICKABLE), + Wnd(GG::X0, GG::Y0, w, GG::Y1, GG::CLICKABLE), m_planet_id(planet.ID()), m_planet_name(0), m_env_size(0), @@ -674,8 +689,10 @@ GG::Pt ul = UpperLeft(), lr = LowerRight(); int planet_image_sz = PlanetDiameter(); - GG::Pt planet_image_pos(GG::X(MAX_PLANET_DIAMETER / 2 - planet_image_sz / 2 + 3), Height() / 2 - planet_image_sz / 2); + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); + GG::Pt planet_image_pos(GG::X(MAX_PLANET_DIAMETER / 2 - planet_image_sz / 2 + 3), GG::Y(MAX_PLANET_DIAMETER / 2 - planet_image_sz / 2)); + if (planet.Type() == PT_ASTEROIDS) { std::vector<boost::shared_ptr<GG::Texture> > textures; @@ -802,6 +819,7 @@ void SidePanel::PlanetPanel::DoLayout() { + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); GG::X left = GG::X0 + MAX_PLANET_DIAMETER + EDGE_PAD; GG::X right = left + Width() - MAX_PLANET_DIAMETER - 2*EDGE_PAD; GG::Y y = GG::Y0; @@ -932,7 +950,6 @@ bool SidePanel::PlanetPanel::InWindow(const GG::Pt& pt) const { GG::Pt ul = UpperLeft(), lr = LowerRight(); - //ul.x += MAX_PLANET_DIAMETER; // uncomment to exclude points over rotating planet graphic return (ul <= pt && pt < lr || m_specials_panel->InWindow(pt) || InPlanet(pt)); } @@ -992,6 +1009,7 @@ bool SidePanel::PlanetPanel::InPlanet(const GG::Pt& pt) const { + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); GG::Pt center = UpperLeft() + GG::Pt(GG::X(MAX_PLANET_DIAMETER / 2), GG::Y(MAX_PLANET_DIAMETER / 2)); GG::Pt diff = pt - center; int r_squared = PlanetDiameter() * PlanetDiameter() / 4; @@ -1102,6 +1120,7 @@ bool SidePanel::PlanetPanelContainer::InWindow(const GG::Pt& pt) const { + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); for (std::vector<PlanetPanel*>::const_iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { if ((*it)->InWindow(pt)) return true; @@ -1169,6 +1188,7 @@ } // adjust size of scrollbar to account for panel resizing + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); m_vscroll->SizeScroll(0, Value(y - m_planet_panels_top), MAX_PLANET_DIAMETER, Value(available_height)); // hide scrollbar if all panels are visible and fit into the available height @@ -1248,29 +1268,29 @@ // SidePanel //////////////////////////////////////////////// // static(s) -const int SidePanel::MAX_PLANET_DIAMETER = 128; // size of a huge planet, in on-screen pixels -const int SidePanel::MIN_PLANET_DIAMETER = MAX_PLANET_DIAMETER / 4; // size of a tiny planet, in on-screen pixels - const System* SidePanel::s_system = 0; std::set<SidePanel*> SidePanel::s_side_panels; const int SidePanel::EDGE_PAD = 3; -SidePanel::SidePanel(GG::X x, GG::Y y, GG::X w, GG::Y h) : - Wnd(x, y, w, h, GG::CLICKABLE), +SidePanel::SidePanel(GG::X x, GG::Y y, GG::Y h) : + Wnd(x, y, GG::X(GetOptionsDB().Get<int>("UI.sidepanel-width")), h, GG::CLICKABLE), m_system_name(0), m_button_prev(0), m_button_next(0), m_star_graphic(0), - m_planet_panel_container(new PlanetPanelContainer(GG::X0, GG::Y(140), w, h-170)), + m_planet_panel_container(0), m_system_resource_summary(0) { const boost::shared_ptr<GG::Font>& font = ClientUI::GetFont(SystemNameFontSize()); const GG::Y DROP_HEIGHT(SystemNameFontSize()); + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); - m_button_prev = new GG::Button(GG::X(MAX_PLANET_DIAMETER + EDGE_PAD), GG::Y(EDGE_PAD), GG::X(Value(DROP_HEIGHT)), DROP_HEIGHT, "", font, GG::CLR_WHITE); - m_button_next = new GG::Button(w - Value(DROP_HEIGHT) - EDGE_PAD, GG::Y(EDGE_PAD), GG::X(Value(DROP_HEIGHT)), DROP_HEIGHT, "", font, GG::CLR_WHITE); - m_system_name = new CUIDropDownList(GG::X(MAX_PLANET_DIAMETER), GG::Y0, w - MAX_PLANET_DIAMETER, DROP_HEIGHT, GG::Y(10*SystemNameFontSize()), GG::CLR_ZERO, GG::FloatClr(0.0, 0.0, 0.0, 0.5)); + m_planet_panel_container = new PlanetPanelContainer(GG::X0, GG::Y(140), Width(), h - 170); + m_button_prev = new GG::Button(GG::X(MAX_PLANET_DIAMETER + EDGE_PAD), GG::Y(EDGE_PAD), GG::X(Value(DROP_HEIGHT)), DROP_HEIGHT, "", font, GG::CLR_WHITE); + m_button_next = new GG::Button(Width() - Value(DROP_HEIGHT) - EDGE_PAD, GG::Y(EDGE_PAD), GG::X(Value(DROP_HEIGHT)), DROP_HEIGHT, "", font, GG::CLR_WHITE); + m_system_name = new CUIDropDownList(GG::X(MAX_PLANET_DIAMETER), GG::Y0, Width() - MAX_PLANET_DIAMETER, DROP_HEIGHT, GG::Y(10*SystemNameFontSize()), GG::CLR_ZERO, GG::FloatClr(0.0, 0.0, 0.0, 0.5)); + TempUISoundDisabler sound_disabler; SetName(UserString("SIDE_PANEL")); @@ -1287,7 +1307,7 @@ m_button_next->SetPressedGraphic (GG::SubTexture(ClientUI::GetTexture( ClientUI::ArtDir() / "icons" / "rightarrowclicked.png" ), GG::X0, GG::Y0, GG::X(32), GG::Y(32))); m_button_next->SetRolloverGraphic (GG::SubTexture(ClientUI::GetTexture( ClientUI::ArtDir() / "icons" / "rightarrowmouseover.png"), GG::X0, GG::Y0, GG::X(32), GG::Y(32))); - m_system_resource_summary = new MultiIconValueIndicator(w - MAX_PLANET_DIAMETER - EDGE_PAD*2); + m_system_resource_summary = new MultiIconValueIndicator(Width() - MAX_PLANET_DIAMETER - EDGE_PAD*2); m_system_resource_summary->MoveTo(GG::Pt(GG::X(MAX_PLANET_DIAMETER + EDGE_PAD), 140 - m_system_resource_summary->Height())); @@ -1297,10 +1317,10 @@ AttachChild(m_system_resource_summary); AttachChild(m_planet_panel_container); - GG::Connect(m_system_name->SelChangedSignal, &SidePanel::SystemSelectionChanged, this); - GG::Connect(m_button_prev->ClickedSignal, &SidePanel::PrevButtonClicked, this); - GG::Connect(m_button_next->ClickedSignal, &SidePanel::NextButtonClicked, this); - GG::Connect(m_planet_panel_container->PlanetSelectedSignal, &SidePanel::PlanetSelected, this); + GG::Connect(m_system_name->SelChangedSignal, &SidePanel::SystemSelectionChanged, this); + GG::Connect(m_button_prev->ClickedSignal, &SidePanel::PrevButtonClicked, this); + GG::Connect(m_button_next->ClickedSignal, &SidePanel::NextButtonClicked, this); + GG::Connect(m_planet_panel_container->PlanetSelectedSignal, &SidePanel::PlanetSelected, this); Hide(); @@ -1326,12 +1346,14 @@ bool SidePanel::InWindow(const GG::Pt& pt) const { + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); return (UpperLeft() + GG::Pt(GG::X(MAX_PLANET_DIAMETER), GG::Y0) <= pt && pt < LowerRight()) || m_planet_panel_container->InWindow(pt); } void SidePanel::Render() { GG::Pt ul = UpperLeft(), lr = LowerRight(); + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); FlatRectangle(GG::Pt(ul.x + MAX_PLANET_DIAMETER, ul.y), lr, ClientUI::SidePanelColor(), ClientUI::WndOuterBorderColor(), 1); } @@ -1459,6 +1481,10 @@ meter_types.push_back(METER_FARMING); meter_types.push_back(METER_MINING); meter_types.push_back(METER_INDUSTRY); meter_types.push_back(METER_RESEARCH); meter_types.push_back(METER_TRADE); + + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); + + // refresh the system resource summary. delete m_system_resource_summary; m_system_resource_summary = new MultiIconValueIndicator(Width() - MAX_PLANET_DIAMETER - 8, owned_planets, meter_types); Modified: trunk/FreeOrion/UI/SidePanel.h =================================================================== --- trunk/FreeOrion/UI/SidePanel.h 2009-01-26 14:04:52 UTC (rev 2771) +++ trunk/FreeOrion/UI/SidePanel.h 2009-01-27 10:47:59 UTC (rev 2772) @@ -31,7 +31,7 @@ class PlanetPanel; /** \name Structors */ //@{ - SidePanel(GG::X x, GG::Y y, GG::X w, GG::Y h); + SidePanel(GG::X x, GG::Y y, GG::Y h); ~SidePanel(); //@} @@ -57,8 +57,6 @@ static void SetSystem(int system_id); ///< sets the system currently being viewed in all side panels - static const int MAX_PLANET_DIAMETER; ///< size of a huge planet, in on-screen pixels - static const int MIN_PLANET_DIAMETER; ///< size of a tiny planet, in on-screen pixels static const int EDGE_PAD; ///< spacing between widgets and edges of sidepanel mutable boost::signal<void (int)> PlanetSelectedSignal; ///< emitted when a rotating planet in the side panel is clicked by the user |
From: <geo...@us...> - 2009-01-31 04:27:37
|
Revision: 2784 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2784&view=rev Author: geoffthemedio Date: 2009-01-31 04:27:35 +0000 (Sat, 31 Jan 2009) Log Message: ----------- -Switched to using LinkText for text in MarkupBox so that it's multi-line and has link-showing capability -Moved a static member of LinkText into the implementation file, so as to remove it from the header where it wasn't needed -Added code to register MarkupBox tags with GG::Font like is done for LinkText tags -Minor grooming and such Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/LinkText.cpp trunk/FreeOrion/UI/LinkText.h trunk/FreeOrion/UI/MarkupBox.cpp trunk/FreeOrion/UI/MarkupBox.h Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2009-01-31 02:59:08 UTC (rev 2783) +++ trunk/FreeOrion/UI/CUIControls.cpp 2009-01-31 04:27:35 UTC (rev 2784) @@ -496,6 +496,7 @@ /////////////////////////////////////// // class CUIScroll::ScrollTab +/////////////////////////////////////// CUIScroll::ScrollTab::ScrollTab(GG::Orientation orientation, int scroll_width, GG::Clr color, GG::Clr border_color) : Button(GG::X(orientation == GG::VERTICAL ? 0 : 2), Modified: trunk/FreeOrion/UI/LinkText.cpp =================================================================== --- trunk/FreeOrion/UI/LinkText.cpp 2009-01-31 02:59:08 UTC (rev 2783) +++ trunk/FreeOrion/UI/LinkText.cpp 2009-01-31 04:27:35 UTC (rev 2784) @@ -10,6 +10,22 @@ #define RENDER_DEBUGGING_LINK_RECTS 0 +namespace { + static bool link_tags_registered = false; + void RegisterLinkTags() { + if (link_tags_registered) + return; + // need to register the tags that link text uses so GG::Font will know how to (not) render them + GG::Font::RegisterKnownTag("planet"); + GG::Font::RegisterKnownTag("system"); + GG::Font::RegisterKnownTag("fleet"); + GG::Font::RegisterKnownTag("ship"); + GG::Font::RegisterKnownTag("tech"); + GG::Font::RegisterKnownTag("building"); + GG::Font::RegisterKnownTag("encyclopedia"); + link_tags_registered = true; + } +} /////////////////////////////////////// // LinkText @@ -102,24 +118,11 @@ /////////////////////////////////////// // TextLinker /////////////////////////////////////// -// initialize static(s) -bool TextLinker::s_link_tags_registered = false; - TextLinker::TextLinker() : m_old_sel_link(-1), m_old_rollover_link(-1) { - // if this is the first LinkText created, it needs to register the tags that it knows about - if (!s_link_tags_registered) { - GG::Font::RegisterKnownTag("planet"); - GG::Font::RegisterKnownTag("system"); - GG::Font::RegisterKnownTag("fleet"); - GG::Font::RegisterKnownTag("ship"); - GG::Font::RegisterKnownTag("tech"); - GG::Font::RegisterKnownTag("building"); - GG::Font::RegisterKnownTag("encyclopedia"); - s_link_tags_registered = true; - } + RegisterLinkTags(); } TextLinker::~TextLinker() Modified: trunk/FreeOrion/UI/LinkText.h =================================================================== --- trunk/FreeOrion/UI/LinkText.h 2009-01-31 02:59:08 UTC (rev 2783) +++ trunk/FreeOrion/UI/LinkText.h 2009-01-31 04:27:35 UTC (rev 2784) @@ -53,8 +53,6 @@ std::vector<Link> m_links; int m_old_sel_link; int m_old_rollover_link; - - static bool s_link_tags_registered; }; /** allows text that the user sees to emit signals when clicked, and indicates to the user visually which text Modified: trunk/FreeOrion/UI/MarkupBox.cpp =================================================================== --- trunk/FreeOrion/UI/MarkupBox.cpp 2009-01-31 02:59:08 UTC (rev 2783) +++ trunk/FreeOrion/UI/MarkupBox.cpp 2009-01-31 04:27:35 UTC (rev 2784) @@ -11,6 +11,18 @@ namespace { static const GG::X SCROLL_WIDTH(14); static const int EDGE_PAD(3); + + static const std::string EMPTY_STRING(""); + + static bool markup_tags_registered = false; + + void RegisterMarkupTags() { + if (markup_tags_registered) + return; + GG::Font::RegisterKnownTag("img"); + GG::Font::RegisterKnownTag("h"); + markup_tags_registered = true; + } } ////////////////////////////// @@ -94,11 +106,18 @@ delete *it; m_controls.clear(); - // recreate controls / content based on current m_str - // TEMP / TEST~! GG::Y top = GG::Y0; - GG::Control* control = new GG::TextControl(GG::X0, top, m_text, ClientUI::GetFont(), ClientUI::TextColor()); + boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); + GG::Flags<GG::TextFormat> format = GG::FORMAT_LEFT | GG::FORMAT_WORDBREAK; + + // if tags for image: ... + // create image + + // if just text: + GG::Control* control = new LinkText(GG::X0, top, Width(), m_text, font, format, ClientUI::TextColor()); + + m_controls.push_back(control); AttachChild(control); @@ -108,7 +127,7 @@ std::cout << "MarkupSurface::Refresh control (x,y): " << control->UpperLeft().x << ", " << control->UpperLeft().y << " (w,h): " << control->Width() << ", " << control->Height() << std::endl; - Resize(GG::Pt(Width(), GG::Y(m_text.length()*ClientUI::Pts()))); + Resize(GG::Pt(Width(), GG::Y(top))); // END TEMP / TEST } @@ -120,16 +139,13 @@ ////////////////////////////// // MarkupBox // ////////////////////////////// -namespace { - static const std::string EMPTY_STRING(""); -} - MarkupBox::MarkupBox(GG::X x, GG::Y y, GG::X w, GG::Y h, const std::string& str, GG::Flags<GG::WndFlag> flags) : GG::Control(x, y, w, h, flags), m_vscroll(0), m_surface(0), m_preserve_scroll_position_on_next_text_set(false) { + RegisterMarkupTags(); m_surface = new MarkupSurface(GG::X0 + EDGE_PAD, GG::Y0 + EDGE_PAD, w - 2*EDGE_PAD, h - 2*EDGE_PAD, str); AttachChild(m_surface); EnableChildClipping(true); @@ -145,6 +161,7 @@ m_surface(0), m_preserve_scroll_position_on_next_text_set(false) { + RegisterMarkupTags(); m_surface = new MarkupSurface(GG::X0, GG::Y0, GG::X0, GG::Y0, ""); AttachChild(m_surface); EnableChildClipping(true); Modified: trunk/FreeOrion/UI/MarkupBox.h =================================================================== --- trunk/FreeOrion/UI/MarkupBox.h 2009-01-31 02:59:08 UTC (rev 2783) +++ trunk/FreeOrion/UI/MarkupBox.h 2009-01-31 04:27:35 UTC (rev 2784) @@ -57,7 +57,6 @@ GG::Y m_surface_top; ///< position, relative to top of MarkupBox where MarkupSurface is located. Used to keep track of scrolling position. bool m_preserve_scroll_position_on_next_text_set; - }; |
From: <geo...@us...> - 2009-01-31 06:50:11
|
Revision: 2785 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2785&view=rev Author: geoffthemedio Date: 2009-01-31 06:50:09 +0000 (Sat, 31 Jan 2009) Log Message: ----------- Tweaked TextLinker to hide some implementation details Modified Paths: -------------- trunk/FreeOrion/UI/LinkText.cpp trunk/FreeOrion/UI/LinkText.h Modified: trunk/FreeOrion/UI/LinkText.cpp =================================================================== --- trunk/FreeOrion/UI/LinkText.cpp 2009-01-31 04:27:35 UTC (rev 2784) +++ trunk/FreeOrion/UI/LinkText.cpp 2009-01-31 06:50:09 UTC (rev 2785) @@ -8,9 +8,9 @@ #include <boost/lexical_cast.hpp> -#define RENDER_DEBUGGING_LINK_RECTS 0 +namespace { + static const bool RENDER_DEBUGGING_LINK_RECTS = false; -namespace { static bool link_tags_registered = false; void RegisterLinkTags() { if (link_tags_registered) @@ -116,6 +116,18 @@ /////////////////////////////////////// +// TextLinker::Link +/////////////////////////////////////// +struct TextLinker::Link +{ + std::string type; ///< contents of type field of link tag (eg "planet" in <planet 3>) + std::string data; ///< contents of data field of link tag (eg "3" in <planet 3>) + std::vector<GG::Rect> rects; ///< the rectangles in which this link falls, in window coordinates (some links may span more than one line) + std::pair<int, int> text_posn; ///< the index of the first (.first) and last + 1 (.second) characters in the link text +}; + + +/////////////////////////////////////// // TextLinker /////////////////////////////////////// TextLinker::TextLinker() : @@ -130,16 +142,20 @@ void TextLinker::Render_() { -#if RENDER_DEBUGGING_LINK_RECTS + if (!RENDER_DEBUGGING_LINK_RECTS) + return; + + // draw yellow box around whole text block GG::Rect bounds(TextUpperLeft(), TextLowerRight()); - FlatRectangle(bounds.ul.x, bounds.ul.y, bounds.lr.x, bounds.lr.y, GG::CLR_ZERO, GG::CLR_YELLOW, 1); + FlatRectangle(bounds.ul, bounds.lr, GG::CLR_ZERO, GG::CLR_YELLOW, 1); + + // draw red box around individual linkified bits of text within block for (unsigned int i = 0; i < m_links.size(); ++i) { for (unsigned int j = 0; j < m_links[i].rects.size(); ++j) { GG::Rect r = TextUpperLeft() + m_links[i].rects[j]; - FlatRectangle(r.ul.x, r.ul.y, r.lr.x, r.lr.y, GG::CLR_ZERO, GG::CLR_RED, 1); + FlatRectangle(r.ul, r.lr, GG::CLR_ZERO, GG::CLR_RED, 1); } } -#endif } void TextLinker::LButtonDown_(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) Modified: trunk/FreeOrion/UI/LinkText.h =================================================================== --- trunk/FreeOrion/UI/LinkText.h 2009-01-31 04:27:35 UTC (rev 2784) +++ trunk/FreeOrion/UI/LinkText.h 2009-01-31 06:50:09 UTC (rev 2785) @@ -39,13 +39,7 @@ void FindLinks(); ///< finds the links in the text and populates m_links private: - struct Link - { - std::string type; ///< contents of type field of link tag (eg "planet" in <planet 3>) - std::string data; ///< contents of data field of link tag (eg "3" in <planet 3>) - std::vector<GG::Rect> rects; ///< the rectangles in which this link falls, in window coordinates (some links may span more than one line) - std::pair<int, int> text_posn; ///< the index of the first (.first) and last + 1 (.second) characters in the link text - }; + struct Link; int GetLinkUnderPt(const GG::Pt& pt); ///< returns the index of the link under screen coordinate \a pt, or -1 if none void ClearOldRollover(); |
From: <geo...@us...> - 2009-02-02 03:33:18
|
Revision: 2789 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2789&view=rev Author: geoffthemedio Date: 2009-02-02 03:33:13 +0000 (Mon, 02 Feb 2009) Log Message: ----------- MarkupBox progress, including fixing double-showing of images and removing problem-causing newlines Modified Paths: -------------- trunk/FreeOrion/UI/MarkupBox.cpp trunk/FreeOrion/UI/MarkupBox.h Modified: trunk/FreeOrion/UI/MarkupBox.cpp =================================================================== --- trunk/FreeOrion/UI/MarkupBox.cpp 2009-02-02 01:30:46 UTC (rev 2788) +++ trunk/FreeOrion/UI/MarkupBox.cpp 2009-02-02 03:33:13 UTC (rev 2789) @@ -114,16 +114,16 @@ for (std::vector<boost::shared_ptr<GG::Font::FormattingTag> >::const_iterator it = tags.begin(); it != tags.end(); ++it) { - boost::shared_ptr<GG::Font::FormattingTag> format_tag = *it; + boost::shared_ptr<GG::Font::FormattingTag> format_tag_temp = *it; // check for image tag first. image overrides / ends any other tags - if (format_tag->tag_name == IMAGE_TAG) { + if (format_tag_temp->tag_name == IMAGE_TAG) { current_char_type = IMAGE_MARKUP; - current_char_format_tag = format_tag; + current_char_format_tag = format_tag_temp; break; // next check for header tag - } else if (format_tag->tag_name == HEADING_TAG) { + } else if (format_tag_temp->tag_name == HEADING_TAG) { current_char_type = HEADING_MARKUP; - current_char_format_tag = format_tag; + current_char_format_tag = format_tag_temp; break; } } @@ -157,18 +157,12 @@ // if current CharData has a markup tag (ie. is not Plain Text), or if current CharData is // is the last, need to make a new MarkupTextBlock entry in retval if (current_char_type != PLAIN_TEXT_MARKUP || i >= char_data_vec.size() - 1) { - // DEBUG - if (current_char_type != PLAIN_TEXT_MARKUP) - std::cout << "found markup tag!" << std::endl; - else - std::cout << "reach end of char vector of size: " << char_data_vec.size() << " at index: " << i << std::endl; - // END DEBUG - // check if this is the first character in the char data vector. if it is, don't want to // close a tag yet; just record this character's tag as the open one if (i > 0) { - // not first character in char data vector. tag indicates that the previous block has ended. + // current CharData is not first character in char data vector. + // rather, a tag indicates that the previous block has ended // get last character of current text block @@ -178,6 +172,23 @@ text_block_end = i - 1; // end at preceeding character if closing block due to tag + + // DEBUG + if (current_char_type != PLAIN_TEXT_MARKUP) { + if (current_char_format_tag->close_tag) { + std::cout << "found markup close tag!" << std::endl; + current_char_type = PLAIN_TEXT_MARKUP; + } else { + std::cout << "found markup tag!" << std::endl; + } + } else { + std::cout << "reached end of char vector of size: " << char_data_vec.size() << + " at index: " << i << std::endl; + } + // END DEBUG + + + // add new MarkupTextBlock entry to retval, as long as the entry is not empty if (text_block_end >= text_block_start) { // DEBUG @@ -187,10 +198,11 @@ GG::StrSize start = char_data_vec[text_block_start].string_index; GG::StrSize end = char_data_vec[text_block_end].string_index + char_data_vec[text_block_end].string_size; + std::string block_text_temp = std::string(text, Value(start), Value(end - start)); MarkupTextBlock block; - block.text = std::string(text, Value(start), Value(end - start)); + block.text = block_text_temp.substr(0, block_text_temp.find_last_not_of("\n") + 1); // strip trailing newlines block.type = open_text_block_type; block.params = open_text_block_params; @@ -208,10 +220,19 @@ } } - // set new open tag type and start index - text_block_start = i; - open_text_block_type = current_char_type; - open_text_block_params = current_format_tag_params; + + // set new open tag type and start index. if current tag is an open tag, it is the start + // of a new text block. if it is a close tag, it is not part of a new block, and the new + // block starts at a later character + if (current_char_format_tag && current_char_format_tag->close_tag) { + text_block_start = i + 1; + open_text_block_type = PLAIN_TEXT_MARKUP; + open_text_block_params.clear(); + } else { + text_block_start = i; + open_text_block_type = current_char_type; + open_text_block_params = current_format_tag_params; + } } } } @@ -375,7 +396,7 @@ " (w,h): " << control->Width() << ", " << control->Height() << std::endl; } - Resize(GG::Pt(Width(), GG::Y(top))); + Resize(GG::Pt(Width(), GG::Y(top + plain_font->Lineskip()))); std::cout << std::endl << std::endl << "#############################################################" << std::endl << std::endl; } @@ -391,8 +412,7 @@ MarkupBox::MarkupBox(GG::X x, GG::Y y, GG::X w, GG::Y h, const std::string& str, GG::Flags<GG::WndFlag> flags) : GG::Control(x, y, w, h, flags), m_vscroll(0), - m_surface(0), - m_preserve_scroll_position_on_next_text_set(false) + m_surface(0) { RegisterMarkupTags(); m_surface = new MarkupSurface(GG::X0 + EDGE_PAD, GG::Y0 + EDGE_PAD, w - 2*EDGE_PAD, h - 2*EDGE_PAD, str); @@ -407,8 +427,7 @@ MarkupBox::MarkupBox() : GG::Control(), m_vscroll(0), - m_surface(0), - m_preserve_scroll_position_on_next_text_set(false) + m_surface(0) { RegisterMarkupTags(); m_surface = new MarkupSurface(GG::X0, GG::Y0, GG::X0, GG::Y0, ""); @@ -489,12 +508,6 @@ } void MarkupBox::SetText(const std::string& str) { - if (m_preserve_scroll_position_on_next_text_set) { - m_preserve_scroll_position_on_next_text_set = false; - m_surface->SetText(str); - return; - } - // save old surface size GG::Pt old_surface_size = m_surface->Size(); @@ -506,15 +519,12 @@ AdjustScrolls(); } -void MarkupBox::PreserveScrollPositionOnNextTextSet() { - m_preserve_scroll_position_on_next_text_set = true; -} - void MarkupBox::Refresh() { m_surface->Refresh(); } void MarkupBox::MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) { + std::cout << "MarkupBox::MouseWheel move: " << move << std::endl; if (!Disabled() && m_vscroll) { for (int i = 0; i < move; ++i) m_vscroll->ScrollLineDecr(); @@ -570,7 +580,7 @@ GG::Y surface_height = m_surface->Height(); GG::Y this_height = Height(); - GG::Y line_height = ClientUI::GetFont()->Lineskip(); + GG::Y line_height = ClientUI::GetFont()->Lineskip() * 3; if (m_vscroll) { if (surface_height <= this_height) { Modified: trunk/FreeOrion/UI/MarkupBox.h =================================================================== --- trunk/FreeOrion/UI/MarkupBox.h 2009-02-02 01:30:46 UTC (rev 2788) +++ trunk/FreeOrion/UI/MarkupBox.h 2009-02-02 03:33:13 UTC (rev 2789) @@ -7,6 +7,9 @@ namespace GG { class Scroll; } +namespace { + struct MarkupTextBlock; +} /** A control similar to GG::MultiEdit that displayed text, links, and images with layout determined @@ -37,12 +40,6 @@ void Clear(); void Refresh(); - - /** Ensures that the next call to SetText() preserves the scroll position. Useful when repeatedly - * setting the same text with slight changes in markup that will not affect the layout, such as - * when responding to mouseovers of links in text. */ - void PreserveScrollPositionOnNextTextSet(); - //@} private: @@ -51,12 +48,11 @@ void AdjustScrolls(); ///< sets the sizes of the scroll-space and the screen-space of the scrolls void VScrolled(int upper, int ignored1, int ignored2, int ignored3); - GG::Scroll* m_vscroll; ///< scrollbar used to scroll through marked up text - MarkupSurface* m_surface; ///< all contents are attached as children of surface so that scrolling only needs to update the surface position to move all contents + GG::Scroll* m_vscroll; ///< scrollbar used to scroll through marked up text + MarkupSurface* m_surface; ///< all contents are attached as children of surface so that scrolling only needs to update the surface position to move all contents - GG::Y m_surface_top; ///< position, relative to top of MarkupBox where MarkupSurface is located. Used to keep track of scrolling position. - - bool m_preserve_scroll_position_on_next_text_set; + GG::Y m_surface_top; ///< position, relative to top of MarkupBox where MarkupSurface is located. Used to keep track of scrolling position. + std::vector<MarkupTextBlock> m_text_blocks; ///< result of parsing raw text. each entry can be rendered as a single GG::Control }; |
From: <tz...@us...> - 2009-02-14 03:07:01
|
Revision: 2814 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2814&view=rev Author: tzlaine Date: 2009-02-14 03:06:58 +0000 (Sat, 14 Feb 2009) Log Message: ----------- CombatWnd now accepts keyboard input. Modified Paths: -------------- trunk/FreeOrion/UI/CombatWnd.cpp trunk/FreeOrion/UI/CombatWnd.h Modified: trunk/FreeOrion/UI/CombatWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatWnd.cpp 2009-02-13 21:53:36 UTC (rev 2813) +++ trunk/FreeOrion/UI/CombatWnd.cpp 2009-02-14 03:06:58 UTC (rev 2814) @@ -1164,7 +1164,7 @@ UpdateCameraPosition(); } -void CombatWnd::KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys) +void CombatWnd::KeyPress(GG::Key key, boost::uint32_t key_code_point, GG::Flags<GG::ModKey> mod_keys) { if (key == GG::GGK_q && mod_keys & GG::MOD_KEY_CTRL) m_exit = true; Modified: trunk/FreeOrion/UI/CombatWnd.h =================================================================== --- trunk/FreeOrion/UI/CombatWnd.h 2009-02-13 21:53:36 UTC (rev 2813) +++ trunk/FreeOrion/UI/CombatWnd.h 2009-02-14 03:06:58 UTC (rev 2814) @@ -67,7 +67,7 @@ virtual void RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void RDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); - virtual void KeyPress(GG::Key key, GG::Flags<GG::ModKey> mod_keys); + virtual void KeyPress(GG::Key key, boost::uint32_t key_code_point, GG::Flags<GG::ModKey> mod_keys); private: struct SelectedObject |
From: <tz...@us...> - 2009-02-15 04:30:52
|
Revision: 2819 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2819&view=rev Author: tzlaine Date: 2009-02-15 04:30:45 +0000 (Sun, 15 Feb 2009) Log Message: ----------- Added (non-accelerator) keyboard bindings to handle POV rotation in CombatWnd. Modified Paths: -------------- trunk/FreeOrion/UI/CombatWnd.cpp trunk/FreeOrion/UI/CombatWnd.h Modified: trunk/FreeOrion/UI/CombatWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatWnd.cpp 2009-02-15 02:51:09 UTC (rev 2818) +++ trunk/FreeOrion/UI/CombatWnd.cpp 2009-02-15 04:30:45 UTC (rev 2819) @@ -1073,6 +1073,22 @@ UpdateCameraPosition(); } +void CombatWnd::HandleRotation(const GG::Pt& delta) +{ + Ogre::Radian delta_pitch = + Value(-delta.y * 1.0 / GG::GUI::GetGUI()->AppHeight()) * Ogre::Radian(Ogre::Math::PI); + m_pitch += delta_pitch; + if (m_pitch < Ogre::Radian(0.0)) + m_pitch = Ogre::Radian(0.0); + if (Ogre::Radian(Ogre::Math::HALF_PI) < m_pitch) + m_pitch = Ogre::Radian(Ogre::Math::HALF_PI); + Ogre::Radian delta_roll = + Value(-delta.x * 1.0 / GG::GUI::GetGUI()->AppWidth()) * Ogre::Radian(Ogre::Math::PI); + m_roll += delta_roll; + + UpdateCameraPosition(); +} + void CombatWnd::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (m_selection_drag_start != INVALID_SELECTION_DRAG_POS) { @@ -1133,20 +1149,8 @@ GG::GUI::GetGUI()->MinDragDistance() * GG::GUI::GetGUI()->MinDragDistance() < static_cast<unsigned int>(Value(delta_pos.x * delta_pos.x) + Value(delta_pos.y * delta_pos.y))) { m_last_pos = pt; - - Ogre::Radian delta_pitch = - Value(-delta_pos.y * 1.0 / GG::GUI::GetGUI()->AppHeight()) * Ogre::Radian(Ogre::Math::PI); - m_pitch += delta_pitch; - if (m_pitch < Ogre::Radian(0.0)) - m_pitch = Ogre::Radian(0.0); - if (Ogre::Radian(Ogre::Math::HALF_PI) < m_pitch) - m_pitch = Ogre::Radian(Ogre::Math::HALF_PI); - Ogre::Radian delta_roll = - Value(-delta_pos.x * 1.0 / GG::GUI::GetGUI()->AppWidth()) * Ogre::Radian(Ogre::Math::PI); - m_roll += delta_roll; - + HandleRotation(delta_pos); UpdateCameraPosition(); - m_mouse_dragged = true; } } @@ -1194,6 +1198,15 @@ // TODO: This quick-quit is for prototyping only. if (key == GG::GGK_q && mod_keys & GG::MOD_KEY_CTRL) m_exit = true; + + const int SCALE = 5; + switch (key) { + case GG::GGK_UP: HandleRotation(GG::Pt(GG::X0, GG::Y(SCALE))); break; + case GG::GGK_DOWN: HandleRotation(GG::Pt(GG::X0, GG::Y(-SCALE))); break; + case GG::GGK_RIGHT: HandleRotation(GG::Pt(GG::X(2 * -SCALE), GG::Y0)); break; + case GG::GGK_LEFT: HandleRotation(GG::Pt(GG::X(2 * SCALE), GG::Y0)); break; + default: break; + } } bool CombatWnd::frameStarted(const Ogre::FrameEvent& event) Modified: trunk/FreeOrion/UI/CombatWnd.h =================================================================== --- trunk/FreeOrion/UI/CombatWnd.h 2009-02-15 02:51:09 UTC (rev 2818) +++ trunk/FreeOrion/UI/CombatWnd.h 2009-02-15 04:30:45 UTC (rev 2819) @@ -92,6 +92,7 @@ void LookAt(Ogre::SceneNode* look_at_node); void LookAt(const Ogre::Vector3& look_at_point); void Zoom(int move, GG::Flags<GG::ModKey> mod_keys); + void HandleRotation(const GG::Pt& delta); void UpdateCameraPosition(); void UpdateStarFromCameraPosition(); void UpdateSkyBox(); |
From: <tz...@us...> - 2009-02-21 00:35:38
|
Revision: 2835 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2835&view=rev Author: tzlaine Date: 2009-02-21 00:35:34 +0000 (Sat, 21 Feb 2009) Log Message: ----------- Removed the forward declaration of GG::StaticGraphic and GG::GraphicStyle, in favor of #includeing GG/StaticGraphic.h. This fixes a compilation failure with gcc, in which the static assertion GG::is_flag_type<GG::GraphicStyle> fails, since the forward declaration of GG::GraphicStyle is not in fact (yet) a flag type. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIControls.h Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2009-02-20 22:27:06 UTC (rev 2834) +++ trunk/FreeOrion/UI/CUIControls.cpp 2009-02-21 00:35:34 UTC (rev 2835) @@ -1,5 +1,3 @@ -//CUIControls.cpp - #include "CUIControls.h" #include "ClientUI.h" @@ -12,7 +10,6 @@ #include <GG/GUI.h> #include <GG/DrawUtil.h> -#include <GG/StaticGraphic.h> #include <GG/dialogs/ColorDlg.h> #include <boost/lexical_cast.hpp> @@ -20,6 +17,7 @@ #include <limits> + namespace { void PlayButtonClickSound() { Sound::GetSound().PlaySound(ClientUI::SoundDir() / GetOptionsDB().Get<std::string>("UI.sound.button-click"), true); } @@ -1467,7 +1465,7 @@ * if \a styles is not specified or contains fewer entres than \a textures, entries in \a textures without * associated styles use the style GRAPHIC_NONE. */ MultiTextureStaticGraphic::MultiTextureStaticGraphic(GG::X x, GG::Y y, GG::X w, GG::Y h, const std::vector<boost::shared_ptr<GG::Texture> >& textures, - std::vector<GG::Flags<GG::GraphicStyle> > styles, GG::Flags<GG::WndFlag> flags) : + const std::vector<GG::Flags<GG::GraphicStyle> >& styles, GG::Flags<GG::WndFlag> flags) : GG::Control(x, y, w, h, flags), m_graphics(), m_styles(styles) @@ -1478,7 +1476,7 @@ } MultiTextureStaticGraphic::MultiTextureStaticGraphic(GG::X x, GG::Y y, GG::X w, GG::Y h, const std::vector<GG::SubTexture>& subtextures, - std::vector<GG::Flags<GG::GraphicStyle> > styles, GG::Flags<GG::WndFlag> flags) : + const std::vector<GG::Flags<GG::GraphicStyle> >& styles, GG::Flags<GG::WndFlag> flags) : GG::Control(x, y, w, h, flags), m_graphics(subtextures), m_styles(styles) Modified: trunk/FreeOrion/UI/CUIControls.h =================================================================== --- trunk/FreeOrion/UI/CUIControls.h 2009-02-20 22:27:06 UTC (rev 2834) +++ trunk/FreeOrion/UI/CUIControls.h 2009-02-21 00:35:34 UTC (rev 2835) @@ -13,16 +13,12 @@ #include <GG/MultiEdit.h> #include <GG/Scroll.h> #include <GG/Slider.h> +#include <GG/StaticGraphic.h> #include <GG/TabWnd.h> #include "LinkText.h" -namespace GG { - class StaticGraphic; - class GraphicStyle; -} - //! \file All CUI* classes are FreeOrion-style controls incorporating //! the visual theme the project requires. Implementation may //! depend on graphics and design team specifications. They extend @@ -568,7 +564,7 @@ * if \a styles is not specified or contains fewer entres than \a textures, entries in \a textures without * associated styles use the style GRAPHIC_CENTER. */ MultiTextureStaticGraphic(GG::X x, GG::Y y, GG::X w, GG::Y h, const std::vector<boost::shared_ptr<GG::Texture> >& textures, - std::vector<GG::Flags<GG::GraphicStyle> > styles = std::vector<GG::Flags<GG::GraphicStyle> >(), + const std::vector<GG::Flags<GG::GraphicStyle> >& styles = std::vector<GG::Flags<GG::GraphicStyle> >(), GG::Flags<GG::WndFlag> flags = GG::Flags<GG::WndFlag>()); /** creates a MultiTextureStaticGraphic from multiple pre-existing SubTextures which are rendered back-to-front in the @@ -576,7 +572,7 @@ * if \a styles is not specified or contains fewer entres than \a subtextures, entries in \a subtextures without * associated styles use the style GRAPHIC_CENTER. */ MultiTextureStaticGraphic(GG::X x, GG::Y y, GG::X w, GG::Y h, const std::vector<GG::SubTexture>& subtextures, - std::vector<GG::Flags<GG::GraphicStyle> > styles = std::vector<GG::Flags<GG::GraphicStyle> >(), + const std::vector<GG::Flags<GG::GraphicStyle> >& styles = std::vector<GG::Flags<GG::GraphicStyle> >(), GG::Flags<GG::WndFlag> flags = GG::Flags<GG::WndFlag>()); //@} |
From: <geo...@us...> - 2009-02-21 15:59:52
|
Revision: 2843 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2843&view=rev Author: geoffthemedio Date: 2009-02-21 15:59:39 +0000 (Sat, 21 Feb 2009) Log Message: ----------- -FleetButton stuff: Made them clickable again, added mouseover highlighting with temporary circle behind them, made them adjust in size properly -Adjusted system name position -Enlarged system mouseover indicator default size -Move optimized system rendering toggle to the system icon section of the galaxy map options page -Added a circle around system icons and changed SystemIcon::InWindow to check whether cursor is within that circle, rather than the default square-shaped active area that was previously used Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/UI/FleetButton.cpp trunk/FreeOrion/UI/FleetButton.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/UI/SystemIcon.h Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2009-02-21 14:27:56 UTC (rev 2842) +++ trunk/FreeOrion/UI/ClientUI.cpp 2009-02-21 15:59:39 UTC (rev 2843) @@ -467,7 +467,7 @@ // galaxy map db.Add("UI.system-icon-size", "OPTIONS_DB_UI_SYSTEM_ICON_SIZE", 14, RangedValidator<int>(8, 50)); db.Add("UI.system-name-unowned-color", "OPTIONS_DB_UI_SYSTEM_NAME_UNOWNED_COLOR", StreamableColor(GG::Clr(160, 160, 160, 255)), Validator<StreamableColor>()); - db.Add("UI.system-selection-indicator-size","OPTIONS_DB_UI_SYSTEM_SELECTION_INDICATOR_SIZE",2.0, RangedStepValidator<double>(0.1, 0.5, 5)); + db.Add("UI.system-selection-indicator-size","OPTIONS_DB_UI_SYSTEM_SELECTION_INDICATOR_SIZE",2.5, RangedStepValidator<double>(0.1, 0.5, 5)); db.Add("UI.large-fleet-button-size", "OPTIONS_DB_UI_LARGE_FLEET_BUTTON_SIZE", 24, RangedValidator<int>(8, 48)); db.Add("UI.small-fleet-button-size", "OPTIONS_DB_UI_SMALL_FLEET_BUTTON_SIZE", 16, RangedValidator<int>(8, 32)); db.Add("UI.tiny-fleet-button-size", "OPTIONS_DB_UI_TINY_FLEET_BUTTON_SIZE", 10, RangedValidator<int>(4, 24)); Modified: trunk/FreeOrion/UI/FleetButton.cpp =================================================================== --- trunk/FreeOrion/UI/FleetButton.cpp 2009-02-21 14:27:56 UTC (rev 2842) +++ trunk/FreeOrion/UI/FleetButton.cpp 2009-02-21 15:59:39 UTC (rev 2843) @@ -10,6 +10,7 @@ #include "../util/OptionsDB.h" #include "../universe/System.h" #include "../Empire/Empire.h" +#include "CUIDrawUtil.h" #include <GG/DrawUtil.h> @@ -25,7 +26,7 @@ // FleetButton /////////////////////////// FleetButton::FleetButton(const std::vector<int>& fleet_IDs, SizeType size) : - GG::Button(), + GG::Button(GG::X0, GG::Y0, GG::X1, GG::Y1, "", boost::shared_ptr<GG::Font>(), GG::CLR_ZERO), m_fleets(), m_head_icon(), m_size_icon() @@ -34,14 +35,14 @@ } FleetButton::FleetButton(int fleet_id, SizeType size) : - GG::Button(), + GG::Button(GG::X0, GG::Y0, GG::X1, GG::Y1, "", boost::shared_ptr<GG::Font>(), GG::CLR_ZERO), m_fleets(), m_head_icon(), m_size_icon() { - std::vector<int> fleet_ids; - fleet_ids.push_back(fleet_id); - Init(fleet_ids, size); + std::vector<int> fleet_IDs; + fleet_IDs.push_back(fleet_id); + Init(fleet_IDs, size); } void FleetButton::Init(const std::vector<int>& fleet_IDs, SizeType size) { @@ -95,11 +96,7 @@ // set button size - int button_size = ClientUI::TinyFleetButtonSize(); - if (size == FLEET_BUTTON_SMALL) - button_size = ClientUI::SmallFleetButtonSize(); - else if (size == FLEET_BUTTON_LARGE) - button_size = ClientUI::LargeFleetButtonSize(); + int button_size = SizeForSizeType(size); Resize(GG::Pt(GG::X(button_size), GG::Y(button_size))); @@ -137,6 +134,24 @@ } } +void FleetButton::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) +{ + MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); + if (!Disabled() && (!map_wnd || !map_wnd->InProductionViewMode())) + PlayFleetButtonOpenSound(); + GG::Button::LClick(pt, mod_keys); +} + +int FleetButton::SizeForSizeType(SizeType size_type) { + if (size_type == FLEET_BUTTON_TINY) + return ClientUI::TinyFleetButtonSize(); + if (size_type == FLEET_BUTTON_SMALL) + return ClientUI::SmallFleetButtonSize(); + if (size_type == FLEET_BUTTON_LARGE) + return ClientUI::LargeFleetButtonSize(); + return 0; +} + void FleetButton::RenderUnpressed() { glColor(Color()); GG::Pt ul = UpperLeft(), lr = LowerRight(); @@ -147,9 +162,21 @@ } void FleetButton::RenderPressed() { + const double TWO_PI = 2.0*3.14159; + glDisable(GL_TEXTURE_2D); + glColor(Color()); + CircleArc(UpperLeft(), LowerRight(), 0.0, TWO_PI, true); + glEnable(GL_TEXTURE_2D); + RenderUnpressed(); // TODO: do something else } void FleetButton::RenderRollover() { + const double TWO_PI = 2.0*3.14159; + glDisable(GL_TEXTURE_2D); + glColor(GG::CLR_WHITE); + CircleArc(UpperLeft(), LowerRight(), 0.0, TWO_PI, true); + glEnable(GL_TEXTURE_2D); + RenderUnpressed(); // TODO: do something else } Modified: trunk/FreeOrion/UI/FleetButton.h =================================================================== --- trunk/FreeOrion/UI/FleetButton.h 2009-02-21 14:27:56 UTC (rev 2842) +++ trunk/FreeOrion/UI/FleetButton.h 2009-02-21 15:59:39 UTC (rev 2843) @@ -32,8 +32,11 @@ /** \name Mutators */ //@{ virtual void MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void FleetButton::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); //@} + static int SizeForSizeType(SizeType size_type); + protected: /** \name Mutators */ //@{ virtual void RenderUnpressed(); Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-02-21 14:27:56 UTC (rev 2842) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-02-21 15:59:39 UTC (rev 2843) @@ -233,7 +233,7 @@ // MapWnd // static(s) double MapWnd::s_max_scale_factor = 8.0; -double MapWnd::s_min_scale_factor = MapWnd::s_max_scale_factor / pow(ZOOM_STEP_SIZE, 14.0); +double MapWnd::s_min_scale_factor = MapWnd::s_max_scale_factor / std::pow(ZOOM_STEP_SIZE, 14.0); MapWnd::MapWnd() : GG::Wnd(-GG::GUI::GetGUI()->AppWidth(), -GG::GUI::GetGUI()->AppHeight(), @@ -1415,7 +1415,8 @@ void MapWnd::DoFleetButtonsLayout() { - const int FLEET_BUTTON_SIZE = FleetButtonSizeType(); + FleetButton::SizeType FLEET_BUTTON_SIZE_TYPE = FleetButtonSizeType(); + const int FLEET_BUTTON_SIZE = FleetButton::SizeForSizeType(FLEET_BUTTON_SIZE_TYPE); // position and resize unattached (to system icons) fleet icons for (unsigned int i = 0; i < m_moving_fleet_buttons.size(); ++i) { Fleet* fleet = *m_moving_fleet_buttons[i]->Fleets().begin(); @@ -1431,6 +1432,11 @@ return static_cast<int>(ClientUI::SystemIconSize() * m_zoom_factor); } +double MapWnd::SystemHaloScaleFactor() const +{ + return 1.0 + log10(m_zoom_factor); +} + FleetButton::SizeType MapWnd::FleetButtonSizeType() const { if (m_zoom_factor > ClientUI::LargeFleetButtonZoomThreshold()) @@ -1582,7 +1588,7 @@ void MapWnd::RenderSystems() { - const double HALO_SCALE_FACTOR = 1.0 + log10(m_zoom_factor); + const double HALO_SCALE_FACTOR = SystemHaloScaleFactor(); if (GetOptionsDB().Get<bool>("UI.optimized-system-rendering")) { glColor4f(1.0, 1.0, 1.0, 1.0); Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2009-02-21 14:27:56 UTC (rev 2842) +++ trunk/FreeOrion/UI/MapWnd.h 2009-02-21 15:59:39 UTC (rev 2843) @@ -61,6 +61,7 @@ double ZoomFactor() const; int SystemIconSize() const; + double SystemHaloScaleFactor() const; FleetButton::SizeType FleetButtonSizeType() const; //!< returns what size type (tiny, small, large) fleet buttons on this map are shown at SidePanel* GetSidePanel() const; Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2009-02-21 14:27:56 UTC (rev 2842) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2009-02-21 15:59:39 UTC (rev 2843) @@ -722,6 +722,7 @@ BeginSection(UserString("OPTIONS_SYSTEM_ICONS")); IntOption("UI.system-icon-size", UserString("OPTIONS_UI_SYSTEM_ICON_SIZE")); DoubleOption("UI.system-selection-indicator-size", UserString("OPTIONS_UI_SYSTEM_SELECTION_INDICATOR_SIZE")); + BoolOption("UI.optimized-system-rendering", UserString("OPTIONS_OPTIMIZED_SYSTEM_RENDERING")); ColorOption("UI.system-name-unowned-color", UserString("OPTIONS_UI_SYSTEM_NAME_UNOWNED_COLOR")); EndSection(); BeginSection(UserString("OPTIONS_FLEET_ICONS")); @@ -735,7 +736,6 @@ BeginSection(UserString("OPTIONS_GALAXY_MAP_GENERAL")); BoolOption("UI.galaxy-gas-background", UserString("OPTIONS_GALAXY_MAP_GAS")); BoolOption("UI.galaxy-starfields", UserString("OPTIONS_GALAXY_MAP_STARFIELDS")); - BoolOption("UI.optimized-system-rendering", UserString("OPTIONS_OPTIMIZED_SYSTEM_RENDERING")); DoubleOption("UI.starlane-thickness", UserString("OPTIONS_STARLANE_THICKNESS")); BoolOption("UI.resource-starlane-colouring", UserString("OPTIONS_RESOURCE_STARLANE_COLOURING")); BoolOption("UI.fleet-supply-lines", UserString("OPTIONS_FLEET_SUPPLY_LINES")); Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2009-02-21 14:27:56 UTC (rev 2842) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2009-02-21 15:59:39 UTC (rev 2843) @@ -192,7 +192,8 @@ GG::Pt retval = GG::Pt(); const MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); - const int FLEETBUTTON_SIZE = map_wnd->FleetButtonSizeType(); + FleetButton::SizeType FLEETBUTTON_SIZE_TYPE = map_wnd->FleetButtonSizeType(); + const int FLEETBUTTON_SIZE = FleetButton::SizeForSizeType(FLEETBUTTON_SIZE_TYPE); /* Positions of buttons relative to star. Moving fleet * buttons at top left, stationary buttons at top right. @@ -214,6 +215,11 @@ } } +int SystemIcon::EnclosingCircleDiameter() const +{ + return static_cast<const int>(Value(Width())*1.5) + 1; +} + void SystemIcon::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { Wnd::SizeMove(ul, lr); @@ -221,8 +227,8 @@ if (m_tiny_graphic && lr.x - ul.x < TINY_SIZE) { GG::Pt tiny_size = m_tiny_graphic->Size(); GG::Pt middle = GG::Pt(Width() / 2, Height() / 2); - GG::Pt tiny_ul(static_cast<GG::X>(middle.x - tiny_size.x / 2.0 + 0.5), - static_cast<GG::Y>(middle.y - tiny_size.y / 2.0 + 0.5)); + GG::Pt tiny_ul(static_cast<GG::X>(middle.x - tiny_size.x / 2.0), + static_cast<GG::Y>(middle.y - tiny_size.y / 2.0)); m_tiny_graphic->SizeMove(tiny_ul, tiny_ul + tiny_size); m_tiny_graphic->Show(); } else { @@ -241,9 +247,34 @@ PositionSystemName(); - DoFleetButtonLayout(); + RefreshFleetButtons(); } +void SystemIcon::Render() +{ + const int ARC_SIZE = EnclosingCircleDiameter(); + const double TWO_PI = 2.0*3.14159; + + GG::Pt ul = UpperLeft(), lr = LowerRight(); + GG::Pt size = lr - ul; + GG::Pt half_size = GG::Pt(size.x / 2, size.y / 2); + GG::Pt middle = ul + half_size; + + GG::Pt circle_size = GG::Pt(static_cast<GG::X>(ARC_SIZE), + static_cast<GG::Y>(ARC_SIZE)); + GG::Pt circle_half_size = GG::Pt(circle_size.x / 2, circle_size.y / 2); + GG::Pt circle_ul = middle - circle_half_size; + GG::Pt circle_lr = circle_ul + circle_size; + + glDisable(GL_TEXTURE_2D); + glLineWidth(1.0); + glColor(ClientUI::SystemNameTextColor()); + glBegin(GL_LINE_STRIP); + CircleArc(circle_ul, circle_lr, 0.0, TWO_PI, false); + glEnd(); + glEnable(GL_TEXTURE_2D); +} + void SystemIcon::ManualRender(double halo_scale_factor) { if (!Visible()) @@ -354,6 +385,7 @@ MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); FleetButton* fb = 0; + FleetButton::SizeType FLEETBUTTON_SIZE = map_wnd->FleetButtonSizeType(); // create new fleet buttons for (EmpireManager::const_iterator it = Empires().begin(); it != Empires().end(); ++it) { @@ -371,7 +403,7 @@ // Logger().debugStream() << "... " << *it1; if (!fleet_IDs.empty()) { - fb = new FleetButton(fleet_IDs); + fb = new FleetButton(fleet_IDs, FLEETBUTTON_SIZE); m_stationary_fleet_markers[empire_id] = fb; AttachChild(m_stationary_fleet_markers[empire_id]); GG::Connect(fb->ClickedSignal, FleetButtonClickedFunctor(*fb, *this, false)); @@ -379,7 +411,7 @@ fleet_IDs = m_system.FindObjectIDs(OrderedMovingFleetVisitor(it->first)); if (!fleet_IDs.empty()) { - fb = new FleetButton(fleet_IDs); + fb = new FleetButton(fleet_IDs, FLEETBUTTON_SIZE); m_moving_fleet_markers[empire_id] = fb; AttachChild(m_moving_fleet_markers[empire_id]); GG::Connect(fb->ClickedSignal, FleetButtonClickedFunctor(*fb, *this, true)); @@ -435,15 +467,12 @@ void SystemIcon::DoFleetButtonLayout() { - const int FLEETBUTTON_SIZE = ClientUI::SmallFleetButtonSize(); - const GG::Pt SIZE = GG::Pt(GG::X(FLEETBUTTON_SIZE), GG::Y(FLEETBUTTON_SIZE)); - // stationary fleet buttons int empire_num = 1; for (std::map<int, FleetButton*>::iterator it = m_stationary_fleet_markers.begin(); it != m_stationary_fleet_markers.end(); ++it) { GG::Pt ul = NthFleetButtonUpperLeft(empire_num, false); ++empire_num; - it->second->SizeMove(ul, ul + SIZE); + it->second->MoveTo(ul); } // departing fleet buttons @@ -451,14 +480,14 @@ for (std::map<int, FleetButton*>::iterator it = m_moving_fleet_markers.begin(); it != m_moving_fleet_markers.end(); ++it) { GG::Pt ul = NthFleetButtonUpperLeft(empire_num, true); ++empire_num; - it->second->SizeMove(ul, ul + SIZE); + it->second->MoveTo(ul); } } void SystemIcon::PositionSystemName() { if (m_colored_name) - m_colored_name->MoveTo(GG::Pt((Width() - m_colored_name->Width()) / 2, Height())); + m_colored_name->MoveTo(GG::Pt((Width() - m_colored_name->Width()) / 2, (Height() + GG::Y(EnclosingCircleDiameter() / 2) / 2))); } bool SystemIcon::InWindow(const GG::Pt& pt) const @@ -473,7 +502,21 @@ return true; } - return Wnd::InWindow(pt); + // find if cursor is within require distance of centre of icon + const int RADIUS = EnclosingCircleDiameter() / 2; + const int RADIUS2 = RADIUS*RADIUS; + + GG::Pt ul = UpperLeft(), lr = LowerRight(); + GG::Pt size = lr - ul; + GG::Pt half_size = GG::Pt(size.x / 2, size.y / 2); + GG::Pt middle = ul + half_size; + + GG::Pt delta = pt - middle; + + const int distx = Value(delta.x); + const int disty = Value(delta.y); + + return distx*distx + disty*disty <= RADIUS2; } void SystemIcon::FleetInserted(Fleet& fleet) Modified: trunk/FreeOrion/UI/SystemIcon.h =================================================================== --- trunk/FreeOrion/UI/SystemIcon.h 2009-02-21 14:27:56 UTC (rev 2842) +++ trunk/FreeOrion/UI/SystemIcon.h 2009-02-21 15:59:39 UTC (rev 2843) @@ -61,7 +61,7 @@ //! \name Mutators //!@{ virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr); - virtual void Render() {} + virtual void Render(); void ManualRender(double halo_scale_factor); //!< Draw disc and halo textures virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); @@ -93,12 +93,14 @@ void Init(); //!< common constructor tasks GG::Pt NthFleetButtonUpperLeft(int button_number, bool moving) const; //!< returns upper left point of moving or stationary fleetbutton owned by empire \a n, where n is the position in order of fleetbuttons shown starting from 1(not empire id) + int EnclosingCircleDiameter() const; //!< returns diameter of circle enclosing icon around which other icons can be placed and within which the mouse is over the icon + void FleetInserted(Fleet& fleet); void FleetRemoved(Fleet& fleet); void FleetStateChanged(); - void PositionSystemName(); + void PositionSystemName(); const System& m_system; //!< the System object associated with this SystemIcon boost::shared_ptr<GG::Texture> m_disc_texture; //!< solid star disc texture |
From: <tz...@us...> - 2009-02-21 16:55:15
|
Revision: 2844 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2844&view=rev Author: tzlaine Date: 2009-02-21 16:55:06 +0000 (Sat, 21 Feb 2009) Log Message: ----------- Fixed gcc compilation error -- FleetButton::LClick() had an extra FleetButton:: qualification in its declaration. Modified Paths: -------------- trunk/FreeOrion/UI/FleetButton.h trunk/FreeOrion/UI/SystemIcon.cpp Modified: trunk/FreeOrion/UI/FleetButton.h =================================================================== --- trunk/FreeOrion/UI/FleetButton.h 2009-02-21 15:59:39 UTC (rev 2843) +++ trunk/FreeOrion/UI/FleetButton.h 2009-02-21 16:55:06 UTC (rev 2844) @@ -32,7 +32,7 @@ /** \name Mutators */ //@{ virtual void MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); - virtual void FleetButton::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); //@} static int SizeForSizeType(SizeType size_type); Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2009-02-21 15:59:39 UTC (rev 2843) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2009-02-21 16:55:06 UTC (rev 2844) @@ -390,7 +390,6 @@ // create new fleet buttons for (EmpireManager::const_iterator it = Empires().begin(); it != Empires().end(); ++it) { const int empire_id = it->first; - const Empire* empire = it->second; //std::vector<int> contained_objects = m_system.FindObjectIDs(); //Logger().debugStream() << "System: " << m_system.Name() << " contained objects: "; |
From: <geo...@us...> - 2009-02-24 04:36:50
|
Revision: 2869 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2869&view=rev Author: geoffthemedio Date: 2009-02-24 04:36:45 +0000 (Tue, 24 Feb 2009) Log Message: ----------- -Split out most of the rendering setup from MapWnd::InitTurn into a separate function, called from in InitTurn, to make the main InitTurn shorter and easier to follow. -Seem to have fixed the issue with fleet move lines mentioned in my revision-before-last (2867), but I'm not sure since it was a bit hard to replicate. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-02-23 17:27:07 UTC (rev 2868) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-02-24 04:36:45 UTC (rev 2869) @@ -538,14 +538,6 @@ Universe& universe = GetUniverse(); - //Logger().debugStream() << "MapWnd::InitTurn universe objects:"; - //for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) - // Logger().debugStream() << " ... " << it->second->Name() << " with id " << it->first << " and systemID: " << it->second->SystemID(); - - //Logger().debugStream() << "MapWnd::InitTurn universe destroyed objects:"; - //for (Universe::const_iterator it = universe.beginDestroyed(); it != universe.endDestroyed(); ++it) - // Logger().debugStream() << " ... " << it->second->Name() << " with id " << it->first; - EmpireManager& manager = HumanClientApp::GetApp()->Empires(); Empire* empire = manager.Lookup(HumanClientApp::GetApp()->EmpireID()); if (!empire) { @@ -557,13 +549,16 @@ // update effect accounting and meter estimates universe.InitMeterEstimatesAndDiscrepancies(); + // redo meter estimates with unowned planets marked as owned by player, so accurate predictions of planet // population is available for currently uncolonized planets UpdateMeterEstimates(); + const std::set<int>& this_player_explored_systems = empire->ExploredSystems(); const std::map<int, std::set<int> > this_player_known_starlanes = empire->KnownStarlanes(); + // determine sytems where fleets can deliver supply, and groups of systems that can exchange resources for (EmpireManager::iterator it = manager.begin(); it != manager.end(); ++it) { Empire* cur_empire = it->second; @@ -583,10 +578,131 @@ } + // set up system icons, starlanes, galaxy gas rendering + InitTurnRendering(); + + + + // disconnect old moving fleet statechangedsignal connections + for (std::map<int, boost::signals::connection>::iterator it = m_fleet_state_change_signals.begin(); it != m_fleet_state_change_signals.end(); ++it) + it->second.disconnect(); + m_fleet_state_change_signals.clear(); + + // connect fleet change signals to update moving fleet movement lines, so that ordering + // moving fleets to move updates their displayed path + Universe::ObjectVec fleets = universe.FindObjects(MovingFleetVisitor()); + for (Universe::ObjectVec::const_iterator it = fleets.begin(); it != fleets.end(); ++it) { + const Fleet* moving_fleet = universe_object_cast<const Fleet*>(*it); + if (!moving_fleet) { + Logger().errorStream() << "MapWnd::InitTurn couldn't cast a (supposed) moving fleet pointer to a Fleet*"; + continue; + } + m_fleet_state_change_signals[moving_fleet->ID()] = GG::Connect(moving_fleet->StateChangedSignal, boost::bind(SetFleetMovementLineFunc, this, moving_fleet)); + } + + + MoveChildUp(m_side_panel); + + + // set turn button to current turn + m_turn_update->SetText(boost::io::str(FlexibleFormat(UserString("MAP_BTN_TURN_UPDATE")) % + boost::lexical_cast<std::string>(turn_number))); + MoveChildUp(m_turn_update); + + + // are there any sitreps to show? + m_sitrep_panel->Update(); + // HACK! The first time this SitRepPanel gets an update, the report row(s) are misaligned. I have no idea why, and + // I am sick of dealing with it, so I'm forcing another update in order to force it to behave. + m_sitrep_panel->Update(); + + empire = manager.Lookup(HumanClientApp::GetApp()->EmpireID()); + if (empire && empire->NumSitRepEntries()) + ShowSitRep(); + + + GetChatWnd()->HideEdit(); + EnableAlphaNumAccels(); + + + // show or hide system names, depending on zoom. replicates code in MapWnd::Zoom + if (m_zoom_factor * ClientUI::Pts() < MIN_SYSTEM_NAME_SIZE) + HideSystemNames(); + else + ShowSystemNames(); + + + // if we're at the default start position, the odds are very good that this is a fresh game + if (ClientUpperLeft() == GG::Pt()) { + // center the map on player's home system at the start of the game + int capitol_id = empire->CapitolID(); + UniverseObject *obj = universe.Object(capitol_id); + if (obj) { + CenterOnMapCoord(obj->X(), obj->Y()); + } else { + // default to centred on whole universe if there is no capitol + CenterOnMapCoord(Universe::UniverseWidth() / 2, Universe::UniverseWidth() / 2); + } + + // default the tech tree to be centred on something interesting + m_research_wnd->Reset(); + } + + + // empire is recreated each turn based on turn update from server, so connections of signals emitted from + // the empire must be remade each turn (unlike connections to signals from the sidepanel) + GG::Connect(empire->GetResourcePool(RE_FOOD)->ChangedSignal, &MapWnd::RefreshFoodResourceIndicator, this, 0); + GG::Connect(empire->GetResourcePool(RE_MINERALS)->ChangedSignal, &MapWnd::RefreshMineralsResourceIndicator, this, 0); + GG::Connect(empire->GetResourcePool(RE_TRADE)->ChangedSignal, &MapWnd::RefreshTradeResourceIndicator, this, 0); + GG::Connect(empire->GetResourcePool(RE_RESEARCH)->ChangedSignal, &MapWnd::RefreshResearchResourceIndicator, this, 0); + GG::Connect(empire->GetResourcePool(RE_INDUSTRY)->ChangedSignal, &MapWnd::RefreshIndustryResourceIndicator, this, 0); + GG::Connect(empire->GetPopulationPool().ChangedSignal, &MapWnd::RefreshPopulationIndicator, this, 1); + GG::Connect(empire->GetProductionQueue().ProductionQueueChangedSignal, &SidePanel::Refresh); + + + m_toolbar->Show(); + m_FPS->Show(); + m_side_panel->Hide(); // prevents sidepanel from appearing if previous turn was ended without sidepanel open. also ensures sidepanel UI updates properly, which it did not otherwise for unknown reasons. + DetachChild(m_side_panel); + SelectSystem(m_side_panel->SystemID()); + + for (EmpireManager::iterator it = manager.begin(); it != manager.end(); ++it) + it->second->UpdateResourcePools(); + + m_research_wnd->Update(); + m_production_wnd->Update(); +} + +void MapWnd::InitTurnRendering() +{ + Logger().debugStream() << "MapWnd::InitTurnRendering"; + CheckGLVersion(); + Universe& universe = GetUniverse(); + EmpireManager& manager = HumanClientApp::GetApp()->Empires(); + + + // temp storage + std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_star_core_quad_vertices; + std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_star_halo_quad_vertices; + std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_galaxy_gas_quad_vertices; + std::vector<float> raw_star_texture_coords; + std::vector<float> raw_starlane_vertices; + std::vector<unsigned char> raw_starlane_colors; + std::vector<float> raw_starlane_supply_vertices; + std::vector<unsigned char> raw_starlane_supply_colors; + std::set<std::pair<int, int> > rendered_starlanes; // stored by inserting return value of UnorderedIntPair so different orders of system ids don't create duplicates + std::set<std::pair<int, int> > rendered_half_starlanes; // stored as unaltered pairs, so that a each direction of traversal can be shown separately + const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); + + + // adjust size of map window for universe and application size Resize(GG::Pt(static_cast<GG::X>(Universe::UniverseWidth() * s_max_scale_factor + GG::GUI::GetGUI()->AppWidth() * 1.5), static_cast<GG::Y>(Universe::UniverseWidth() * s_max_scale_factor + GG::GUI::GetGUI()->AppHeight() * 1.5))); + std::vector<System*> systems = universe.FindObjects<System>(); + + // set up backgrounds on first turn if (m_backgrounds.empty()) { std::vector<boost::shared_ptr<GG::Texture> > starfield_textures = ClientUI::GetClientUI()->GetPrefixedTextures(ClientUI::ArtDir(), "starfield", false); @@ -602,40 +718,72 @@ } - // this gets cleared here instead of with the movement line stuff because that would - // clear some movement lines that come from the SystemIcons below + // remove any existing fleet movement lines or projected movement lines. this gets cleared + // here instead of with the movement line stuff because that would clear some movement lines + // that come from the SystemIcons m_fleet_lines.clear(); ClearProjectedFleetMovementLines(); - // set up system icon textures and starlane rendering + // create fleet buttons for moving fleets + RefreshFleetButtons(); + + + // remove old system icons for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) DeleteChild(it->second); m_system_icons.clear(); - std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_star_core_quad_vertices; - std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_star_halo_quad_vertices; - std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_galaxy_gas_quad_vertices; - std::vector<float> raw_star_texture_coords; - std::vector<float> raw_starlane_vertices; - std::vector<unsigned char> raw_starlane_colors; - std::vector<float> raw_starlane_supply_vertices; - std::vector<unsigned char> raw_starlane_supply_colors; - std::set<std::pair<int, int> > rendered_starlanes; // stored by inserting return value of UnorderedIntPair so different orders of system ids don't create duplicates - std::set<std::pair<int, int> > rendered_half_starlanes; // stored as unaltered pairs, so that a each direction of traversal can be shown separately - - Logger().debugStream() << "ADDING STARLANES, SYSTEM TETURES AND GALAXY GAS"; - const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); - - std::vector<System*> systems = universe.FindObjects<System>(); + // create system icons for (unsigned int i = 0; i < systems.size(); ++i) { - // system + // create new system icon const System* start_system = systems[i]; SystemIcon* icon = new SystemIcon(this, GG::X0, GG::Y0, GG::X(10), start_system->ID()); + m_system_icons[start_system->ID()] = icon; + icon->InstallEventFilter(this); + AttachChild(icon); + + + // connect UI response signals. TODO: Make these configurable in GUI? + GG::Connect(icon->LeftClickedSignal, &MapWnd::SystemLeftClicked, this); + GG::Connect(icon->RightClickedSignal, &MapWnd::SystemRightClicked, this); + GG::Connect(icon->LeftDoubleClickedSignal, &MapWnd::SystemDoubleClicked, this); + GG::Connect(icon->MouseEnteringSignal, &MapWnd::MouseEnteringSystem, this); + GG::Connect(icon->MouseLeavingSignal, &MapWnd::MouseLeavingSystem, this); + GG::Connect(icon->FleetButtonClickedSignal, &MapWnd::FleetButtonLeftClicked, this); + } + + + // position system icons + DoSystemIconsLayout(); + + + // Generate texture coordinates to be used for subsequent vertex buffer creation. + // Note these coordinates assume the texture is twice as large as it should + // be. This allows us to use one set of texture coords for everything, even + // though the star-halo textures must be rendered at sizes as much as twice + // as large as the star-disc textures. + for (std::size_t i = 0; i < systems.size(); ++i) { + raw_star_texture_coords.push_back(1.5); + raw_star_texture_coords.push_back(-0.5); + raw_star_texture_coords.push_back(-0.5); + raw_star_texture_coords.push_back(-0.5); + raw_star_texture_coords.push_back(-0.5); + raw_star_texture_coords.push_back(1.5); + raw_star_texture_coords.push_back(1.5); + raw_star_texture_coords.push_back(1.5); + } + + + // create various buffers used for map contents rendering + for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { + const SystemIcon* icon = it->second; + const System& system = icon->GetSystem(); + + // add disc and halo textures for system icon { // See note above texture coords for why we're making coordinate sets that are 2x too big. - const System& system = icon->GetSystem(); double icon_size = ClientUI::SystemIconSize(); double icon_ul_x = system.X() - icon_size; double icon_ul_y = system.Y() - icon_size; @@ -671,26 +819,15 @@ halo_vertices.push_back(icon_lr_y); } } - m_system_icons[start_system->ID()] = icon; - icon->InstallEventFilter(this); - AttachChild(icon); - GG::Connect(icon->LeftClickedSignal, &MapWnd::SystemLeftClicked, this); - GG::Connect(icon->RightClickedSignal, &MapWnd::SystemRightClicked, this); - GG::Connect(icon->LeftDoubleClickedSignal, &MapWnd::SystemDoubleClicked, this); - GG::Connect(icon->MouseEnteringSignal, &MapWnd::MouseEnteringSystem, this); - GG::Connect(icon->MouseLeavingSignal, &MapWnd::MouseLeavingSystem, this); - GG::Connect(icon->FleetButtonClickedSignal, &MapWnd::FleetButtonLeftClicked, this); - //Logger().debugStream() << " considering lanes from " << start_system->Name() << " (id: " << start_system->ID() << ")"; - - // gaseous substance around system - if (boost::shared_ptr<GG::Texture> gaseous_texture = ClientUI::GetClientUI()->GetModuloTexture(ClientUI::ArtDir() / "galaxy_decoration", "gaseous", start_system->ID())) { + // add gaseous substance around system + if (boost::shared_ptr<GG::Texture> gaseous_texture = ClientUI::GetClientUI()->GetModuloTexture(ClientUI::ArtDir() / "galaxy_decoration", "gaseous", system.ID())) { glBindTexture(GL_TEXTURE_2D, gaseous_texture->OpenGLId()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); const double GAS_SIZE = ClientUI::SystemIconSize() * 12.0; - const double ROTATION = start_system->ID() * 27.0; // arbitrary rotation in radians ("27.0" is just a number that produces pleasing results) + const double ROTATION = system.ID() * 27.0; // arbitrary rotation in radians ("27.0" is just a number that produces pleasing results) const double COS_THETA = std::cos(ROTATION); const double SIN_THETA = std::sin(ROTATION); @@ -714,14 +851,14 @@ // See note above texture coords for why we're making coordinate sets that are 2x too big. // add to system position to get translated scaled rotated quad corner - const double GAS_X1 = start_system->X() + (X1r * GAS_SIZE); - const double GAS_Y1 = start_system->Y() + (Y1r * GAS_SIZE); - const double GAS_X2 = start_system->X() + (X2r * GAS_SIZE); - const double GAS_Y2 = start_system->Y() + (Y2r * GAS_SIZE); - const double GAS_X3 = start_system->X() + (X3r * GAS_SIZE); - const double GAS_Y3 = start_system->Y() + (Y3r * GAS_SIZE); - const double GAS_X4 = start_system->X() + (X4r * GAS_SIZE); - const double GAS_Y4 = start_system->Y() + (Y4r * GAS_SIZE); + const double GAS_X1 = system.X() + (X1r * GAS_SIZE); + const double GAS_Y1 = system.Y() + (Y1r * GAS_SIZE); + const double GAS_X2 = system.X() + (X2r * GAS_SIZE); + const double GAS_Y2 = system.Y() + (Y2r * GAS_SIZE); + const double GAS_X3 = system.X() + (X3r * GAS_SIZE); + const double GAS_Y3 = system.Y() + (Y3r * GAS_SIZE); + const double GAS_X4 = system.X() + (X4r * GAS_SIZE); + const double GAS_Y4 = system.Y() + (Y4r * GAS_SIZE); std::vector<float>& gas_vertices = raw_galaxy_gas_quad_vertices[gaseous_texture]; // rotated upper right @@ -738,22 +875,15 @@ gas_vertices.push_back(GAS_Y4); } - // system's starlanes - for (System::const_lane_iterator lane_it = start_system->begin_lanes(); lane_it != start_system->end_lanes(); ++lane_it) { + + // add system's starlanes + for (System::const_lane_iterator lane_it = system.begin_lanes(); lane_it != system.end_lanes(); ++lane_it) { bool lane_is_wormhole = lane_it->second; if (lane_is_wormhole) continue; // at present, not rendering wormholes + const System* start_system = &system; const System* dest_system = universe.Object<System>(lane_it->first); - - //Logger().debugStream() << " considering lanes to " << dest_system->Name() << " (id: " << dest_system->ID() << ")"; - - //Logger().debugStream() << "added starlanes:"; - //for (std::set<std::pair<int, int> >::const_iterator it = rendered_starlanes.begin(); it != rendered_starlanes.end(); ++it) - // Logger().debugStream() << " ... " << GetUniverse().Object(it->first)->Name() << " to " << GetUniverse().Object(it->second)->Name(); - - //Logger().debugStream() << "looking for " << start_system->Name() << " to " << dest_system->Name(); - // render starlane between start and dest systems? // check that this lane isn't already going to be rendered. skip it if it is. @@ -771,7 +901,7 @@ GG::Clr lane_colour = UNOWNED_LANE_COLOUR; // default colour if no empires transfer resources along starlane for (EmpireManager::iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { - empire = empire_it->second; + Empire* empire = empire_it->second; const std::set<std::pair<int, int> >& resource_supply_lanes = empire->ResourceSupplyStarlaneTraversals(); std::pair<int, int> lane_forward = std::make_pair(start_system->ID(), dest_system->ID()); @@ -798,7 +928,6 @@ } - // render half-starlane from the current start_system to the current dest_system? // check that this lane isn't already going to be rendered. skip it if it is. @@ -809,7 +938,7 @@ // scan through possible empires to have a half-lane here and add a half-lane if one is found for (EmpireManager::iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { - empire = empire_it->second; + Empire* empire = empire_it->second; const std::set<std::pair<int, int> >& resource_obstructed_supply_lanes = empire->ResourceSupplyOstructedStarlaneTraversals(); std::pair<int, int> lane_forward = std::make_pair(start_system->ID(), dest_system->ID()); @@ -844,27 +973,9 @@ } - // Note these coordinates assume the texture is twice as large as it should - // be. This allows us to use one set of texture coords for everything, even - // though the star-halo textures must be rendered at sizes as much as twice - // as large as the star-disc textures. - for (std::size_t i = 0; i < systems.size(); ++i) { - raw_star_texture_coords.push_back(1.5); - raw_star_texture_coords.push_back(-0.5); - raw_star_texture_coords.push_back(-0.5); - raw_star_texture_coords.push_back(-0.5); - raw_star_texture_coords.push_back(-0.5); - raw_star_texture_coords.push_back(1.5); - raw_star_texture_coords.push_back(1.5); - raw_star_texture_coords.push_back(1.5); - } - - DoSystemIconsLayout(); - - // create animated lines indicating fleet supply flow for (EmpireManager::iterator it = manager.begin(); it != manager.end(); ++it) { - empire = it->second; + Empire* empire = it->second; const std::set<std::pair<int, int> >& fleet_supply_lanes = empire->FleetSupplyStarlaneTraversals(); for (std::set<std::pair<int, int> >::const_iterator lane_it = fleet_supply_lanes.begin(); lane_it != fleet_supply_lanes.end(); ++lane_it) { const System* start_sys = universe.Object<System>(lane_it->first); @@ -885,114 +996,7 @@ } - // remove old fleet buttons for fleets not in systems - for (unsigned int i = 0; i < m_moving_fleet_buttons.size(); ++i) - DeleteChild(m_moving_fleet_buttons[i]); - m_moving_fleet_buttons.clear(); - // disconnect old moving fleet statechangedsignal connections - for (std::map<int, boost::signals::connection>::iterator it = m_fleet_state_change_signals.begin(); it != m_fleet_state_change_signals.end(); ++it) - it->second.disconnect(); - m_fleet_state_change_signals.clear(); - - - // create fleet buttons for moving fleets - RefreshFleetButtons(); - - - // create movement lines (after positioning buttons, so lines will originate from button location) - for (std::vector<FleetButton*>::iterator it = m_moving_fleet_buttons.begin(); it != m_moving_fleet_buttons.end(); ++it) - SetFleetMovementLine(*it); - - - // connect fleet change signals to update moving fleet movement lines, so that ordering - // moving fleets to move updates their displayed path - Universe::ObjectVec fleets = universe.FindObjects(MovingFleetVisitor()); - for (Universe::ObjectVec::const_iterator it = fleets.begin(); it != fleets.end(); ++it) { - const Fleet* moving_fleet = universe_object_cast<const Fleet*>(*it); - if (!moving_fleet) { - Logger().errorStream() << "MapWnd::InitTurn couldn't cast a (supposed) moving fleet pointer to a Fleet*"; - continue; - } - m_fleet_state_change_signals[moving_fleet->ID()] = GG::Connect(moving_fleet->StateChangedSignal, boost::bind(SetFleetMovementLineFunc, this, moving_fleet)); - } - - - MoveChildUp(m_side_panel); - - - // set turn button to current turn - m_turn_update->SetText(boost::io::str(FlexibleFormat(UserString("MAP_BTN_TURN_UPDATE")) % - boost::lexical_cast<std::string>(turn_number))); - MoveChildUp(m_turn_update); - - // are there any sitreps to show? - m_sitrep_panel->Update(); - // HACK! The first time this SitRepPanel gets an update, the report row(s) are misaligned. I have no idea why, and - // I am sick of dealing with it, so I'm forcing another update in order to force it to behave. - m_sitrep_panel->Update(); - - empire = manager.Lookup(HumanClientApp::GetApp()->EmpireID()); - if (empire && empire->NumSitRepEntries()) - ShowSitRep(); - - - GetChatWnd()->HideEdit(); - EnableAlphaNumAccels(); - - - if (m_zoom_factor * ClientUI::Pts() < MIN_SYSTEM_NAME_SIZE) - HideSystemNames(); - else - ShowSystemNames(); - - // if we're at the default start position, the odds are very good that this is a fresh game - if (ClientUpperLeft() == GG::Pt()) { - // center the map on player's home system at the start of the game - int capitol_id = empire->CapitolID(); - UniverseObject *obj = universe.Object(capitol_id); - if (obj) { - CenterOnMapCoord(obj->X(), obj->Y()); - } else { - // default to centred on whole universe if there is no capitol - CenterOnMapCoord(Universe::UniverseWidth() / 2, Universe::UniverseWidth() / 2); - } - - // default the tech tree to be centred on something interesting - m_research_wnd->Reset(); - } - - // empire is recreated each turn based on turn update from server, so connections of signals emitted from - // the empire must be remade each turn (unlike connections to signals from the sidepanel) - GG::Connect(empire->GetResourcePool(RE_FOOD)->ChangedSignal, &MapWnd::RefreshFoodResourceIndicator, this, 0); - GG::Connect(empire->GetResourcePool(RE_MINERALS)->ChangedSignal, &MapWnd::RefreshMineralsResourceIndicator, this, 0); - GG::Connect(empire->GetResourcePool(RE_TRADE)->ChangedSignal, &MapWnd::RefreshTradeResourceIndicator, this, 0); - GG::Connect(empire->GetResourcePool(RE_RESEARCH)->ChangedSignal, &MapWnd::RefreshResearchResourceIndicator, this, 0); - GG::Connect(empire->GetResourcePool(RE_INDUSTRY)->ChangedSignal, &MapWnd::RefreshIndustryResourceIndicator, this, 0); - - GG::Connect(empire->GetPopulationPool().ChangedSignal, &MapWnd::RefreshPopulationIndicator, this, 1); - - GG::Connect(empire->GetProductionQueue().ProductionQueueChangedSignal, &SidePanel::Refresh); - - - m_toolbar->Show(); - m_FPS->Show(); - m_side_panel->Hide(); // prevents sidepanel from appearing if previous turn was ended without sidepanel open. also ensures sidepanel UI updates properly, which it did not otherwise for unknown reasons. - DetachChild(m_side_panel); - SelectSystem(m_side_panel->SystemID()); - - for (EmpireManager::iterator it = manager.begin(); it != manager.end(); ++it) - it->second->UpdateResourcePools(); - - m_research_wnd->Update(); - m_production_wnd->Update(); - - Logger().debugStream() << "Turn initialization graphic buffer clearing"; - - - CheckGLVersion(); - - // clear out all the old buffers for (std::map<boost::shared_ptr<GG::Texture>, GLBuffer>::const_iterator it = m_star_core_quad_vertices.begin(); it != m_star_core_quad_vertices.end(); @@ -1136,8 +1140,8 @@ { m_zoom_factor = data.map_zoom_factor; - DoSystemIconsLayout(); - DoFleetButtonsLayout(); + //DoSystemIconsLayout(); + //RefreshFleetButtons(); GG::Pt ul = UpperLeft(); GG::Pt map_ul = GG::Pt(GG::X(data.map_left), GG::Y(data.map_top)); @@ -1459,6 +1463,7 @@ m_moving_fleet_buttons.clear(); + // create new fleet buttons for fleets at each unique location const FleetButton::SizeType FLEETBUTTON_SIZE = FleetButtonSizeType(); SortedFleetMap::iterator it = position_sorted_fleets.begin(); @@ -1481,6 +1486,10 @@ // position fleetbuttons DoFleetButtonsLayout(); + + // create movement lines (after positioning buttons, so lines will originate from button location) + for (std::vector<FleetButton*>::iterator it = m_moving_fleet_buttons.begin(); it != m_moving_fleet_buttons.end(); ++it) + SetFleetMovementLine(*it); } int MapWnd::SystemIconSize() const @@ -1547,8 +1556,10 @@ else ShowSystemNames(); + DoSystemIconsLayout(); + // if fleet buttons need to change size, need to fully refresh them (clear and recreate). If they are the // same size as before the zoom, then can just reposition them without recreating const FleetButton::SizeType NEW_FLEETBUTTON_SIZE = FleetButtonSizeType(); @@ -1557,6 +1568,7 @@ else DoFleetButtonsLayout(); + // translate map and UI widgets to account for the change in upper left due to zooming GG::Pt map_move(static_cast<GG::X>((center_x + ul_offset_x) - ul.x), static_cast<GG::Y>((center_y + ul_offset_y) - ul.y)); Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2009-02-23 17:27:07 UTC (rev 2868) +++ trunk/FreeOrion/UI/MapWnd.h 2009-02-24 04:36:45 UTC (rev 2869) @@ -167,6 +167,8 @@ void DoFleetButtonsLayout(); //!< does layout of fleet buttons void DoSystemIconsLayout(); //!< does layout of system icons + void InitTurnRendering(); //!< sets up rendering of system icons, galaxy gas, starlanes at start of turn + void RenderStarfields(); //!< renders the background starfiends void RenderNebulae(); //!< renders nebulae void RenderGalaxyGas(); //!< renders gassy substance to make shape of galaxy |
From: <tz...@us...> - 2009-02-26 02:52:05
|
Revision: 2885 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2885&view=rev Author: tzlaine Date: 2009-02-26 02:40:11 +0000 (Thu, 26 Feb 2009) Log Message: ----------- Corrected the PagedGeometry coordinate system to use +Z as "up", and extended the range that impostors are used so that now the asteroids are always visible. Modified Paths: -------------- trunk/FreeOrion/UI/CombatWnd.cpp trunk/FreeOrion/UI/PagedGeometry/PagedGeometry.cpp trunk/FreeOrion/UI/PagedGeometry/PagedGeometry.h Modified: trunk/FreeOrion/UI/CombatWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatWnd.cpp 2009-02-26 02:31:52 UTC (rev 2884) +++ trunk/FreeOrion/UI/CombatWnd.cpp 2009-02-26 02:40:11 UTC (rev 2885) @@ -433,12 +433,13 @@ { if (!paged_geometry) { paged_geometry = new Forests::PagedGeometry; + paged_geometry->setCoordinateSystem(Ogre::Vector3::UNIT_Z); paged_geometry->setCamera(camera); paged_geometry->setPageSize(80); paged_geometry->setInfinite(); paged_geometry->addDetailLevel<Forests::BatchPage>(150, 50); paged_geometry->addDetailLevel<Forests::ImpostorPage>( - 500, 50, Ogre::Any(PAGED_GEOMETRY_IMPOSTOR_QUEUE)); + 3.0 * SystemRadius(), 0, Ogre::Any(PAGED_GEOMETRY_IMPOSTOR_QUEUE)); paged_geometry_loader = new Forests::TreeLoader3D( paged_geometry, Modified: trunk/FreeOrion/UI/PagedGeometry/PagedGeometry.cpp =================================================================== --- trunk/FreeOrion/UI/PagedGeometry/PagedGeometry.cpp 2009-02-26 02:31:52 UTC (rev 2884) +++ trunk/FreeOrion/UI/PagedGeometry/PagedGeometry.cpp 2009-02-26 02:40:11 UTC (rev 2885) @@ -255,14 +255,16 @@ if (!pageLoader) return; -#ifdef PAGEDGEOMETRY_ALTERNATE_COORDSYSTEM - point = _convertToLocal(point); -#endif - std::list<GeometryPageManager *>::iterator it; for (it = managerList.begin(); it != managerList.end(); ++it){ GeometryPageManager *mgr = *it; - mgr->reloadGeometryPage(point); + mgr->reloadGeometryPage( +#ifdef PAGEDGEOMETRY_ALTERNATE_COORDSYSTEM + _convertToLocal(point) +#else + point +#endif + ); } } @@ -271,14 +273,16 @@ if (!pageLoader) return; -#ifdef PAGEDGEOMETRY_ALTERNATE_COORDSYSTEM - center = _convertToLocal(center); -#endif - std::list<GeometryPageManager *>::iterator it; for (it = managerList.begin(); it != managerList.end(); ++it){ GeometryPageManager *mgr = *it; - mgr->reloadGeometryPages(center, radius); + mgr->reloadGeometryPages( +#ifdef PAGEDGEOMETRY_ALTERNATE_COORDSYSTEM + _convertToLocal(center) +#else + center +#endif + , radius); } } Modified: trunk/FreeOrion/UI/PagedGeometry/PagedGeometry.h =================================================================== --- trunk/FreeOrion/UI/PagedGeometry/PagedGeometry.h 2009-02-26 02:31:52 UTC (rev 2884) +++ trunk/FreeOrion/UI/PagedGeometry/PagedGeometry.h 2009-02-26 02:40:11 UTC (rev 2885) @@ -113,7 +113,7 @@ typedef Ogre::TRect<Ogre::Real> TBounds; //Enable PagedGeometry::setCoordinateSystem() -//#define PAGEDGEOMETRY_ALTERNATE_COORDSYSTEM +#define PAGEDGEOMETRY_ALTERNATE_COORDSYSTEM //Enable per-entity user-defined data and callbacks //#define PAGEDGEOMETRY_USER_DATA |
From: <tz...@us...> - 2009-02-26 04:32:32
|
Revision: 2886 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2886&view=rev Author: tzlaine Date: 2009-02-26 04:32:26 +0000 (Thu, 26 Feb 2009) Log Message: ----------- Added hacked-in setVisibilityFlags(REGULAR_OBJECTS_MASK) calls to BatchedGeometry::build() and StaticBillboardSet::build(), so that PagedGeometry's entities are not rendered in the glow pass. Also changed the page size, increased the number of asteroids rendered by a factor of 20 (with little or no slowdown!), and tweaked the shape of the asteroid belt. The PagedGeometry asteroid field in the tech demo now looks really good. Modified Paths: -------------- trunk/FreeOrion/UI/CombatWnd.cpp trunk/FreeOrion/UI/PagedGeometry/BatchedGeometry.cpp trunk/FreeOrion/UI/PagedGeometry/StaticBillboardSet.cpp Modified: trunk/FreeOrion/UI/CombatWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatWnd.cpp 2009-02-26 02:40:11 UTC (rev 2885) +++ trunk/FreeOrion/UI/CombatWnd.cpp 2009-02-26 04:32:26 UTC (rev 2886) @@ -375,32 +375,6 @@ return asteroid_sets; } -#define USE_PAGED_GEOMETRY 1 -#if !USE_PAGED_GEOMETRY - const std::vector<Ogre::MaterialPtr>& AsteroidMaterials() - { - static std::vector<Ogre::MaterialPtr> asteroid_materials; - if (asteroid_materials.empty()) - { - const std::set<std::string>& asteroid_sets = AsteroidSets(); - for (std::set<std::string>::const_iterator it = asteroid_sets.begin(); - it != asteroid_sets.end(); - ++it) { - std::string new_material_name = "asteroid_" + *it; - Ogre::MaterialPtr material = - Ogre::MaterialManager::getSingleton().getByName("asteroid"); - material = material->clone(new_material_name); - material->getTechnique(0)->getPass(0)->getTextureUnitState(0)-> - setTextureName(*it + "Color.png"); - material->getTechnique(0)->getPass(0)->getTextureUnitState(1)-> - setTextureName(*it + "Normal.png"); - asteroid_materials.push_back(material); - } - } - return asteroid_materials; - } -#endif - void CreateAsteroidEntities(std::vector<Ogre::Entity*>& asteroid_entities, Ogre::SceneManager* scene_manager) { @@ -435,7 +409,7 @@ paged_geometry = new Forests::PagedGeometry; paged_geometry->setCoordinateSystem(Ogre::Vector3::UNIT_Z); paged_geometry->setCamera(camera); - paged_geometry->setPageSize(80); + paged_geometry->setPageSize(250); paged_geometry->setInfinite(); paged_geometry->addDetailLevel<Forests::BatchPage>(150, 50); paged_geometry->addDetailLevel<Forests::ImpostorPage>( @@ -1068,7 +1042,7 @@ } else { SetupPagedGeometry(m_paged_geometry, m_paged_geometry_loader, m_camera); - const int ASTEROIDS_IN_BELT_AT_FOURTH_ORBIT = 50; + const int ASTEROIDS_IN_BELT_AT_FOURTH_ORBIT = 1000; const int ORBITAL_RADIUS = OrbitalRadius(it->first); const int ASTEROIDS = ORBITAL_RADIUS / OrbitalRadius(3) * ASTEROIDS_IN_BELT_AT_FOURTH_ORBIT; @@ -1079,45 +1053,19 @@ const Ogre::Real DELTA_THETA = 2.0 * Ogre::Math::PI / ASTEROIDS; Ogre::Real theta = 0.0; for (int i = 0; i < ASTEROIDS; ++i, theta += DELTA_THETA) { -#if !USE_PAGED_GEOMETRY - std::string i_string = boost::lexical_cast<std::string>(i); - Ogre::SceneNode* node = - m_scene_manager->getRootSceneNode()->createChildSceneNode( - planet_name + " node " + i_string); - node->roll(Ogre::Degree(360.0 * RandZeroToOne())); - node->pitch(Ogre::Degree(360.0 * RandZeroToOne())); - node->yaw(Ogre::Degree(360.0 * RandZeroToOne())); - Ogre::Vector3 position(ORBITAL_RADIUS, 0.0, 0.0); - Ogre::Quaternion position_rotation(Ogre::Radian(theta), - Ogre::Vector3::UNIT_Z); - position = position_rotation * position; - // bump position a bit - node->setPosition(position); - - std::string base_name = - *boost::next(asteroid_sets.begin(), i % asteroid_sets.size()); - - Ogre::Entity* entity = - m_scene_manager->createEntity(planet_name + " " + i_string, - base_name + ".mesh"); - entity->setVisibilityFlags(REGULAR_OBJECTS_MASK); - Ogre::MaterialPtr material = - AsteroidMaterials()[i % AsteroidMaterials().size()]; - entity->setMaterialName(material->getName()); - entity->setCastShadows(true); - node->attachObject(entity); -#else + const Ogre::Real THICKNESS = 25.0; Ogre::Radian yaw(2.0 * Ogre::Math::PI * RandZeroToOne()); Ogre::Vector3 position; - position.z = 25.0 * RandZeroToOne(); - position.y = ORBITAL_RADIUS * std::sin(theta); - position.x = ORBITAL_RADIUS * std::cos(theta); - Ogre::Real scale = Ogre::Math::RangeRandom(0.05f, 0.5f); + position.z = THICKNESS * (RandZeroToOne() - 0.5); + position.y = + (ORBITAL_RADIUS + THICKNESS * (RandZeroToOne() - 0.5)) * std::sin(theta); + position.x = + (ORBITAL_RADIUS + THICKNESS * (RandZeroToOne() - 0.5)) * std::cos(theta); + Ogre::Real scale = Ogre::Math::RangeRandom(0.05f, 0.25f); m_paged_geometry_loader->addTree( asteroid_entities[i % asteroid_entities.size()], position, yaw, scale ); -#endif } #if 0 Modified: trunk/FreeOrion/UI/PagedGeometry/BatchedGeometry.cpp =================================================================== --- trunk/FreeOrion/UI/PagedGeometry/BatchedGeometry.cpp 2009-02-26 02:40:11 UTC (rev 2885) +++ trunk/FreeOrion/UI/PagedGeometry/BatchedGeometry.cpp 2009-02-26 04:32:26 UTC (rev 2886) @@ -298,6 +298,9 @@ i->second->build(); } + const Ogre::uint32 REGULAR_OBJECTS_MASK = 1 << 0; + setVisibilityFlags(REGULAR_OBJECTS_MASK); + //Attach the batch to the scene node sceneNode->attachObject(this); Modified: trunk/FreeOrion/UI/PagedGeometry/StaticBillboardSet.cpp =================================================================== --- trunk/FreeOrion/UI/PagedGeometry/StaticBillboardSet.cpp 2009-02-26 02:40:11 UTC (rev 2885) +++ trunk/FreeOrion/UI/PagedGeometry/StaticBillboardSet.cpp 2009-02-26 04:32:26 UTC (rev 2886) @@ -434,6 +434,8 @@ //Create an entity for the mesh entity = sceneMgr->createEntity(entityName, mesh->getName()); + const Ogre::uint32 REGULAR_OBJECTS_MASK = 1 << 0; + entity->setVisibilityFlags(REGULAR_OBJECTS_MASK); entity->setCastShadows(false); //Apply texture |
From: <geo...@us...> - 2009-02-26 19:48:48
|
Revision: 2893 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2893&view=rev Author: geoffthemedio Date: 2009-02-26 19:48:44 +0000 (Thu, 26 Feb 2009) Log Message: ----------- Added a map distance scale indicator Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-02-26 16:32:06 UTC (rev 2892) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-02-26 19:48:44 UTC (rev 2893) @@ -45,12 +45,12 @@ const int ZOOM_TOTAL_STEPS = ZOOM_IN_MAX_STEPS + 1 + ZOOM_IN_MIN_STEPS; const double ZOOM_MAX = std::pow(ZOOM_STEP_SIZE, ZOOM_IN_MAX_STEPS); const double ZOOM_MIN = std::pow(ZOOM_STEP_SIZE, ZOOM_IN_MIN_STEPS); - const int MIN_NEBULAE = 3; // this min and max are for a 1000.0-width galaxy - const int MAX_NEBULAE = 6; const GG::X END_TURN_BTN_WIDTH(60); const GG::X SITREP_PANEL_WIDTH(400); const GG::Y SITREP_PANEL_HEIGHT(300); const GG::Y ZOOM_SLIDER_HEIGHT(200); + const GG::Y SCALE_LINE_HEIGHT(20); + const GG::X SCALE_LINE_MAX_WIDTH(200); const int MIN_SYSTEM_NAME_SIZE = 10; const int LAYOUT_MARGIN = 5; @@ -141,6 +141,85 @@ } //////////////////////////////////////////////////////////// +// MapWnd::MapScaleLine +//////////////////////////////////////////////////////////// +/** Displays a notched line with number labels to indicate Universe distance on the map. */ +class MapWnd::MapScaleLine : public GG::Control { +public: + MapScaleLine(GG::X x, GG::Y y, GG::X w, GG::Y h) : + GG::Control(x, y, w, h, GG::Flags<GG::WndFlag>()), + m_scale_factor(1.0), + m_line_right_x(GG::X1), + m_label(NULL) + { + m_label = new ShadowedTextControl(GG::X0, GG::Y0, GG::X1, h, "", ClientUI::GetFont(), ClientUI::TextColor(), GG::FORMAT_CENTER); + AttachChild(m_label); + Update(1.0); + } + virtual void Render() { + // use GL to draw line and ticks and labels to indicte a length on the map + GG::Pt ul = UpperLeft(); + GG::Pt lr = LowerRight(); + lr.x = m_line_right_x; + ul.y = (ul.y + lr.y)/2; + glColor(GG::CLR_WHITE); + glLineWidth(2.0); + + glDisable(GL_TEXTURE_2D); + glBegin(GL_LINES); + // left border + glVertex(ul.x, ul.y); + glVertex(ul.x, lr.y); + + // right border + glVertex(lr.x, ul.y); + glVertex(lr.x, lr.y); + + // bottom line + glVertex(ul.x, lr.y); + glVertex(lr.x, lr.y); + glEnd(); + glEnable(GL_TEXTURE_2D); + } + void Update(double zoom_factor) { + zoom_factor = std::min(std::max(zoom_factor, ZOOM_MIN), ZOOM_MAX); // sanity range limits to prevent divide by zero + m_scale_factor = zoom_factor; + + // determine length of line to draw and how long that is in universe units + double AVAILABLE_WIDTH = static_cast<double>(std::max(Value(Width()), 1)); + + // length in universe units that could be shown if full AVAILABLE_WIDTH was used + double max_shown_length = AVAILABLE_WIDTH / m_scale_factor; + + + // select an actual shown length in universe units by reducing max_shown_length to a nice round number, + // where nice round numbers are numbers beginning with 1, 2 or 5 + + // get appropriate power of 10 + double pow10 = floor(log10(max_shown_length)); + double shown_length = std::pow(10.0, pow10); + + // see if next higher multiples of 5 or 2 can be used + if (shown_length * 5.0 <= max_shown_length) + shown_length *= 5.0; + else if (shown_length * 2.0 <= max_shown_length) + shown_length *= 2.0; + + // determine end of drawn scale line + m_line_right_x = GG::X(static_cast<int>(shown_length * m_scale_factor)); + + // update text + std::string label_text = boost::lexical_cast<std::string>(shown_length) + " uu"; + m_label->Resize(GG::Pt(GG::X(m_line_right_x), Height())); + m_label->SetText(label_text); + } +private: + double m_scale_factor; + GG::X m_line_right_x; + GG::TextControl* m_label; +}; + +//////////////////////////////////////////////////////////// // MapWnd::GLBuffer //////////////////////////////////////////////////////////// MapWnd::GLBuffer::GLBuffer() : @@ -168,9 +247,8 @@ { CloseClicked(); } //////////////////////////////////////////////// -// MapWnd +// MapWnd::MovementLineData //////////////////////////////////////////////// -// MapWnd::MovementLineData MapWnd::MovementLineData::MovementLineData() : m_colour(GG::CLR_ZERO), m_path(), @@ -312,7 +390,8 @@ m_btn_design(NULL), m_btn_menu(NULL), m_FPS(NULL), - m_zoom_slider(NULL) + m_zoom_slider(NULL), + m_scale_line(NULL) { SetName("MapWnd"); @@ -363,10 +442,17 @@ m_FPS = new FPSIndicator(m_turn_update->LowerRight().x + LAYOUT_MARGIN, m_turn_update->UpperLeft().y); m_toolbar->AttachChild(m_FPS); + // Zoom scale line + m_scale_line = new MapScaleLine(m_turn_update->UpperLeft().x, m_turn_update->LowerRight().y + GG::Y(LAYOUT_MARGIN), + SCALE_LINE_MAX_WIDTH, SCALE_LINE_HEIGHT); + m_toolbar->AttachChild(m_scale_line); + GG::Connect(this->ZoomedSignal, &MapScaleLine::Update, m_scale_line); + m_scale_line->Update(ZoomFactor()); + // Zoom slider //const int ZOOM_SLIDER_MIN = static_cast<int>(ZOOM_IN_MIN_STEPS), // ZOOM_SLIDER_MAX = static_cast<int>(ZOOM_IN_MAX_STEPS); - //m_zoom_slider = new CUISlider(m_turn_update->UpperLeft().x, m_turn_update->LowerRight().y + GG::Y(LAYOUT_MARGIN), + //m_zoom_slider = new CUISlider(m_turn_update->UpperLeft().x, m_scale_line->LowerRight().y + GG::Y(LAYOUT_MARGIN), // GG::X(ClientUI::ScrollWidth()), ZOOM_SLIDER_HEIGHT, // ZOOM_SLIDER_MIN, ZOOM_SLIDER_MAX, GG::VERTICAL); ////m_zoom_slider->SizeSlider(ZOOM_SLIDER_MIN, ZOOM_SLIDER_MAX); @@ -1459,6 +1545,18 @@ m_projected_fleet_eta_map_indicators.clear(); } +void MapWnd::SetFleetETAIndicators(const std::vector<const Fleet*>& fleets) +{ +} + +void MapWnd::SetProjectedFleetETAIndicators() +{ +} + +void MapWnd::ClearProjectFleetETAIndicators() +{ +} + bool MapWnd::EventFilter(GG::Wnd* w, const GG::WndEvent& event) { if (event.Type() == GG::WndEvent::RClick && FleetUIManager::GetFleetUIManager().empty()) { @@ -1651,6 +1749,8 @@ m_sitrep_panel->OffsetMove(-final_move); MoveTo(move_to_pt - GG::Pt(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight())); + + ZoomedSignal(ZoomFactor()); } void MapWnd::ZoomSlid(int pos, int low, int high) Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2009-02-26 16:32:06 UTC (rev 2892) +++ trunk/FreeOrion/UI/MapWnd.h 2009-02-26 19:48:44 UTC (rev 2893) @@ -41,9 +41,10 @@ { public: //! \name Signal Types //!@{ - typedef boost::signal<void (int)> SystemLeftClickedSignalType; //!< emitted when the user left-clicks a star system - typedef boost::signal<void (int)> SystemRightClickedSignalType; //!< emitted when the user right-clicks a star system - typedef boost::signal<void (int)> SystemBrowsedSignalType; //!< emitted when the user moves the mouse over a star system + typedef boost::signal<void (int)> SystemLeftClickedSignalType; //!< emitted when the user left-clicks a star system + typedef boost::signal<void (int)> SystemRightClickedSignalType; //!< emitted when the user right-clicks a star system + typedef boost::signal<void (int)> SystemBrowsedSignalType; //!< emitted when the user moves the mouse over a star system + typedef boost::signal<void (double)> ZoomedSignalType; //!< emitted when the map zoom factor is changed //!@} //! \name Slot Types //!@{ @@ -89,9 +90,10 @@ void ShowSystemNames(); //!< enables the system name text void HideSystemNames(); //!< disables the system name text - mutable SystemLeftClickedSignalType SystemLeftClickedSignal; - mutable SystemRightClickedSignalType SystemRightClickedSignal; - mutable SystemBrowsedSignalType SystemBrowsedSignal; + mutable SystemLeftClickedSignalType SystemLeftClickedSignal; + mutable SystemRightClickedSignalType SystemRightClickedSignal; + mutable SystemBrowsedSignalType SystemBrowsedSignal; + mutable ZoomedSignalType ZoomedSignal; void CenterOnMapCoord(double x, double y); //!< centers the map on map position (x, y) void CenterOnObject(int id); //!< centers the map on object with id \a id @@ -105,7 +107,6 @@ void SetFleetMovementLine(const FleetButton* fleet_button); //!< creates fleet movement lines for all fleets in the given FleetButton to indicate where (and whether) they are moving. Move lines originate from the FleetButton. void SetFleetMovementLine(const Fleet* fleet); //!< creates fleet movement line for a single fleet. Move lines originate from the fleet's button location. - void SetFleetETAIndicators(const std::vector<const Fleet*>& fleets); //!< removes existing fleet move line ETA indicators, and adds indicators for the specified \a fleets move lines /* creates specially-coloured projected fleet movement line for specified fleet following the specified route. Move line originates from the fleet's button location. */ @@ -115,7 +116,10 @@ void SetProjectedFleetMovementLines(const std::vector<const Fleet*>& fleets, const std::list<System*>& travel_route); void RemoveProjectedFleetMovementLine(const Fleet* fleet); //!< removes projected fleet movement line for specified fleet. void ClearProjectedFleetMovementLines(); //!< removes all projected fleet movement lines + + void SetFleetETAIndicators(const std::vector<const Fleet*>& fleets); //!< removes existing fleet move line ETA indicators, and adds indicators for the specified \a fleets move lines void SetProjectedFleetETAIndicators(); //!< creates fleet move line ETA indicators for current projected fleet move lines + void ClearProjectFleetETAIndicators(); //!< removes all projected fleet ETA indactors void RegisterPopup(MapWndPopup* popup); //!< registers a MapWndPopup, which can be cleaned up with a call to DeleteAllPopups( ) void RemovePopup(MapWndPopup* popup); //!< removes a MapWndPopup from the list cleaned up on a call to DeleteAllPopups( ) @@ -162,6 +166,7 @@ }; class FleetETAMapIndicator; + class MapScaleLine; void Zoom(int delta); //!< changes the zoom level of the main map by zoom step size to the power of \a delta (adds delta to the current zoom exponent) void SetZoom(double steps_in); //!< sets zoom level of the main map to zoom step size to the power of \a steps_in @@ -306,6 +311,7 @@ FPSIndicator* m_FPS; GG::Slider* m_zoom_slider; + MapScaleLine* m_scale_line; struct FleetButtonClickedFunctor { |
From: <geo...@us...> - 2009-02-27 21:29:38
|
Revision: 2898 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2898&view=rev Author: geoffthemedio Date: 2009-02-27 21:29:37 +0000 (Fri, 27 Feb 2009) Log Message: ----------- Made moving fleet icons orient in direction of fleet travel. Somewhat experimental and probably not ideally implemented. Modified Paths: -------------- trunk/FreeOrion/UI/FleetButton.cpp trunk/FreeOrion/UI/FleetButton.h Modified: trunk/FreeOrion/UI/FleetButton.cpp =================================================================== --- trunk/FreeOrion/UI/FleetButton.cpp 2009-02-27 04:32:48 UTC (rev 2897) +++ trunk/FreeOrion/UI/FleetButton.cpp 2009-02-27 21:29:37 UTC (rev 2898) @@ -54,6 +54,69 @@ else return ""; } + + /* returns corner vertex x and y components of a quad centred at (0, 0) of side length 2 that is rotated + so the "top" or "up" face is perpendicular to and facing in the direction of \a direction_vector */ + std::vector<double> VectorAlignedQuadVertices(const GG::Pt& direction_vector, int texture_height, int texture_width) { + // get unit vectors parallel and perpendicular to direction vector + int x = Value(direction_vector.x), y = Value(direction_vector.y); + int mag2 = x*x + y*y; + + // first unit vector parallel to direction_vector + double U1X = static_cast<double>(x), U1Y = static_cast<double>(y); + if (mag2 > 1) { + double mag = std::sqrt(static_cast<double>(mag2)); + U1X /= mag; + U1Y /= mag; + } else if (mag2 == 0) { + // default to straight up for zero vector + U1X = 0.0; + U1Y = -1.0; + } // else don't need to rescale if vector length already is 1 + + // second unit vector perpendicular to first + double U2X = -U1Y, U2Y = U1X; + + // multiply unit vectors by (half) texture size to get properly-scaled side vectors + double V1X = U1X * texture_height / 2.0; + double V1Y = U1Y * texture_height / 2.0; + double V2X = U2X * texture_width / 2.0; + double V2Y = U2Y * texture_width / 2.0; + + // get components of corner points by adding unit vectors + std::vector<double> retval; + retval.push_back( V1X - V2X); retval.push_back( V1Y - V2Y); + retval.push_back( V1X + V2X); retval.push_back( V1Y + V2Y); + retval.push_back(-V1X - V2X); retval.push_back(-V1Y - V2Y); + retval.push_back(-V1X + V2X); retval.push_back(-V1Y + V2Y); + + return retval; + } + + /* renders quad with passed vertices and texture */ + void RenderTexturedQuad(const std::vector<double>& vertsXY, const boost::shared_ptr<GG::Texture>& texture) { + if (!texture || vertsXY.size() < 8) + return; + + glBindTexture(GL_TEXTURE_2D, texture->OpenGLId()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + double tex_coord_x = Value(1.0 * texture->DefaultWidth() / texture->Width()); + double tex_coord_y = Value(1.0 * texture->DefaultHeight() / texture->Height()); + + // render texture + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(0.0, 0.0); + glVertex2d(vertsXY[0], vertsXY[1]); + glTexCoord2f(tex_coord_x, 0.0); + glVertex2d(vertsXY[2], vertsXY[3]); + glTexCoord2f(0.0, tex_coord_y); + glVertex2d(vertsXY[4], vertsXY[5]); + glTexCoord2f(tex_coord_x, tex_coord_y); + glVertex2d(vertsXY[6], vertsXY[7]); + glEnd(); + } } /////////////////////////// @@ -63,7 +126,8 @@ GG::Button(GG::X0, GG::Y0, GG::X1, GG::Y1, "", boost::shared_ptr<GG::Font>(), GG::CLR_ZERO), m_fleets(), m_head_icon(), - m_size_icon() + m_size_icon(), + m_vertex_components() { Init(fleet_IDs, size_type); } @@ -72,7 +136,8 @@ GG::Button(GG::X0, GG::Y0, GG::X1, GG::Y1, "", boost::shared_ptr<GG::Font>(), GG::CLR_ZERO), m_fleets(), m_head_icon(), - m_size_icon() + m_size_icon(), + m_vertex_components() { std::vector<int> fleet_IDs; fleet_IDs.push_back(fleet_id); @@ -129,33 +194,77 @@ SetColor(empire->Color()); - // select icon(s) for fleet(s) + // select icon(s) for fleet(s), and get a fleet for use later + const Fleet* first_fleet = NULL; if (m_fleets.size() != 1) { + first_fleet = *(m_fleets.begin()); + m_head_icon = FleetHeadIcon(NULL, size_type); int num_ships = 0; for (std::vector<Fleet*>::const_iterator it = m_fleets.begin(); it != m_fleets.end(); ++it) num_ships += (*it)->NumShips(); m_size_icon = FleetSizeIcon(num_ships, size_type); - } else { - const Fleet* fleet = *m_fleets.begin(); - m_head_icon = FleetHeadIcon(fleet, size_type); - m_size_icon = FleetSizeIcon(fleet, size_type); + } else if (!m_fleets.empty()) { + first_fleet = *m_fleets.begin(); + m_head_icon = FleetHeadIcon(first_fleet, size_type); + m_size_icon = FleetSizeIcon(first_fleet, size_type); } // resize to fit icon by first determining necessary size, and then resizing - GG::X width(0); - GG::Y height(0); + GG::X texture_width(0); + GG::Y texture_height(0); if (m_head_icon) { - width = m_head_icon->DefaultWidth(); - height = m_head_icon->DefaultHeight(); + texture_width = m_head_icon->DefaultWidth(); + texture_height = m_head_icon->DefaultHeight(); } if (m_size_icon) { - width = std::max(width, m_size_icon->DefaultWidth()); - height = std::max(height, m_size_icon->DefaultHeight()); + texture_width = std::max(texture_width, m_size_icon->DefaultWidth()); + texture_height = std::max(texture_height, m_size_icon->DefaultHeight()); } - Resize(GG::Pt(width, height)); + + // determine if fleet icon should be rotated. this should be done if the fleet is moving along + // a starlane, which is the case if the fleet is not in a system and has a valid next system + GG::Pt direction_vector(GG::X(0), GG::Y(1)); // default, unrotated button orientation + + if (first_fleet && !first_fleet->GetSystem()) { + int next_sys_id = first_fleet->NextSystemID(); + const UniverseObject* obj = GetUniverse().Object(next_sys_id); + if (obj) { + // fleet is not in a system and has a valid next destination, so can orient it in that direction + // fleet icons might not appear on the screen in the exact place corresponding to their + // actual universe position, but if they're moving along a starlane, this code will assume + // their apparent position will only be different from their true position in a direction + // parallel with the starlane, so the direction from their true position to their destination + // position can be used to get a direction vector to orient the icon + double dest_x = obj->X(), dest_y = obj->Y(); + double cur_x = first_fleet->X(), cur_y = first_fleet->Y(); + const MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); + GG::Pt dest = map_wnd->ScreenCoordsFromUniversePosition(dest_x, dest_y); + GG::Pt cur = map_wnd->ScreenCoordsFromUniversePosition(cur_x, cur_y); + direction_vector = dest - cur; + } + } + + // check for unrotated texture + if (Value(direction_vector.x) == 0) { + // not rotated. can do simple texture blits + m_vertex_components.clear(); + Resize(GG::Pt(texture_width, texture_height)); + } else { + // texture is rotated, so need some extra math + + // get rotated corner vetex x and y components (x1, y1, x2, y2, x3, y3, x4, y4) for texture of appropriate size + m_vertex_components = VectorAlignedQuadVertices(direction_vector, Value(texture_height), Value(texture_width)); + + // find x and y extent of rotated quad, and resize this button to enclose it + double width = std::max(m_vertex_components[0], std::max(m_vertex_components[2], std::max(m_vertex_components[4], m_vertex_components[6]))) - + std::min(m_vertex_components[0], std::min(m_vertex_components[2], std::min(m_vertex_components[4], m_vertex_components[6]))); + double height = std::max(m_vertex_components[1], std::max(m_vertex_components[3], std::max(m_vertex_components[5], m_vertex_components[7]))) - + std::min(m_vertex_components[1], std::min(m_vertex_components[3], std::min(m_vertex_components[5], m_vertex_components[7]))); + Resize(GG::Pt(GG::X(width), GG::Y(height))); + } } bool FleetButton::InWindow(const GG::Pt& pt) const { @@ -196,10 +305,29 @@ void FleetButton::RenderUnpressed() { glColor(Color()); GG::Pt ul = UpperLeft(), lr = LowerRight(); - if (m_head_icon) - m_head_icon->OrthoBlit(ul); - if (m_size_icon) - m_size_icon->OrthoBlit(ul); + if (m_vertex_components.empty()) { + if (m_size_icon) + m_size_icon->OrthoBlit(ul); + if (m_head_icon) + m_head_icon->OrthoBlit(ul); + return; + } + + const double midX = static_cast<double>(Value(ul.x + lr.x))/2.0; + const double midY = static_cast<double>(Value(ul.y + lr.y))/2.0; + + std::vector<double> vertsXY; + vertsXY.push_back(midX + m_vertex_components[0]); + vertsXY.push_back(midY + m_vertex_components[1]); + vertsXY.push_back(midX + m_vertex_components[2]); + vertsXY.push_back(midY + m_vertex_components[3]); + vertsXY.push_back(midX + m_vertex_components[4]); + vertsXY.push_back(midY + m_vertex_components[5]); + vertsXY.push_back(midX + m_vertex_components[6]); + vertsXY.push_back(midY + m_vertex_components[7]); + + RenderTexturedQuad(vertsXY, m_head_icon); + RenderTexturedQuad(vertsXY, m_size_icon); } void FleetButton::RenderPressed() { Modified: trunk/FreeOrion/UI/FleetButton.h =================================================================== --- trunk/FreeOrion/UI/FleetButton.h 2009-02-27 04:32:48 UTC (rev 2897) +++ trunk/FreeOrion/UI/FleetButton.h 2009-02-27 21:29:37 UTC (rev 2898) @@ -46,9 +46,10 @@ private: void Init(const std::vector<int>& fleet_IDs, SizeType size_type); - std::vector<Fleet*> m_fleets; ///< the fleets represented by this button - boost::shared_ptr<GG::Texture> m_head_icon; ///< icon texture representing type of fleet - boost::shared_ptr<GG::Texture> m_size_icon; ///< icon texture representing number of ships in fleet + std::vector<Fleet*> m_fleets; ///< the fleets represented by this button + boost::shared_ptr<GG::Texture> m_head_icon; ///< icon texture representing type of fleet + boost::shared_ptr<GG::Texture> m_size_icon; ///< icon texture representing number of ships in fleet + std::vector<double> m_vertex_components; ///< x and y componentes of vertices to use to render this fleet button, relative to centre of the button }; /* returns head icon for passed fleet at passed icon size */ |
From: <geo...@us...> - 2009-02-28 19:57:29
|
Revision: 2905 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2905&view=rev Author: geoffthemedio Date: 2009-02-28 19:57:19 +0000 (Sat, 28 Feb 2009) Log Message: ----------- -Removed some debug output -Moved background starfield initialization into a separate function called from MapWnd::InitTurnRendering Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/SystemIcon.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-02-28 19:06:27 UTC (rev 2904) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-02-28 19:57:19 UTC (rev 2905) @@ -139,6 +139,23 @@ // disambiguate overloaded function with a function pointer void (MapWnd::*SetFleetMovementLineFunc)(const Fleet*) = &MapWnd::SetFleetMovementLine; + + /* loads background starfield textures int \a background_textures */ + void InitBackgrounds(std::vector<boost::shared_ptr<GG::Texture> >& background_textures, std::vector<double>& scroll_rates) { + if (!background_textures.empty()) + return; + + std::vector<boost::shared_ptr<GG::Texture> > starfield_textures = ClientUI::GetClientUI()->GetPrefixedTextures(ClientUI::ArtDir(), "starfield", false); + double scroll_rate = 1.0; + for (std::vector<boost::shared_ptr<GG::Texture> >::const_iterator it = starfield_textures.begin(); it != starfield_textures.end(); ++it) { + scroll_rate *= 0.5; + background_textures.push_back(*it); + scroll_rates.push_back(scroll_rate); + glBindTexture(GL_TEXTURE_2D, (*it)->OpenGLId()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + } } //////////////////////////////////////////////////////////// @@ -865,24 +882,10 @@ static_cast<GG::Y>(Universe::UniverseWidth() * ZOOM_MAX + GG::GUI::GetGUI()->AppHeight() * 1.5))); - std::vector<System*> systems = universe.FindObjects<System>(); + // set up backgrounds on first turn. if m_backgrounds already contains textures, does nothing + InitBackgrounds(m_backgrounds, m_bg_scroll_rate); - // set up backgrounds on first turn - if (m_backgrounds.empty()) { - std::vector<boost::shared_ptr<GG::Texture> > starfield_textures = ClientUI::GetClientUI()->GetPrefixedTextures(ClientUI::ArtDir(), "starfield", false); - double scroll_rate = 1.0; - for (std::vector<boost::shared_ptr<GG::Texture> >::const_iterator it = starfield_textures.begin(); it != starfield_textures.end(); ++it) { - scroll_rate *= 0.5; - m_backgrounds.push_back(*it); - m_bg_scroll_rate.push_back(scroll_rate); - glBindTexture(GL_TEXTURE_2D, (*it)->OpenGLId()); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } - } - - // remove any existing fleet movement lines or projected movement lines. this gets cleared // here instead of with the movement line stuff because that would clear some movement lines // that come from the SystemIcons @@ -890,10 +893,6 @@ ClearProjectedFleetMovementLines(); - // create fleet buttons for moving fleets - RefreshFleetButtons(); - - // remove old system icons for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) DeleteChild(it->second); @@ -901,6 +900,7 @@ // create system icons + std::vector<System*> systems = universe.FindObjects<System>(); for (unsigned int i = 0; i < systems.size(); ++i) { // create new system icon const System* start_system = systems[i]; @@ -924,6 +924,10 @@ DoSystemIconsLayout(); + // create fleet buttons for moving fleets + RefreshFleetButtons(); + + // Generate texture coordinates to be used for subsequent vertex buffer creation. // Note these coordinates assume the texture is twice as large as it should // be. This allows us to use one set of texture coords for everything, even Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2009-02-28 19:06:27 UTC (rev 2904) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2009-02-28 19:57:19 UTC (rev 2905) @@ -222,9 +222,9 @@ double first_fb_angle = PI/4.0; while (tries < MAX_TRIES) { - std::cout << std::endl << std::endl << "System: " << m_system.Name() << " button_number: " << button_number << std::endl; - std::cout << "arc_radius: " << arc_radius << std::endl; - std::cout << "FB_RADIUS: " << FB_RADIUS << std::endl; + //std::cout << std::endl << std::endl << "System: " << m_system.Name() << " button_number: " << button_number << std::endl; + //std::cout << "arc_radius: " << arc_radius << std::endl; + //std::cout << "FB_RADIUS: " << FB_RADIUS << std::endl; // determine how many buttons will fit in this shell double half_fb_arc_angle = FB_RADIUS/arc_radius; // small angle approximation theta ~= tan(theta) = opposite / adjacent @@ -233,15 +233,15 @@ double angle_range = max - min; int max_buttons_at_current_radius = std::max(1, static_cast<int>(floor(angle_range / (half_fb_arc_angle * 2.0)))); - std::cout << "90 degres: " << PI/2.0 << std::endl; - std::cout << "half_fb_arc_angle*2.0: " << half_fb_arc_angle * 2.0 << std::endl; - std::cout << "angle max: " << max << " min: " << min << " range: " << angle_range << std::endl; + //std::cout << "90 degres: " << PI/2.0 << std::endl; + //std::cout << "half_fb_arc_angle*2.0: " << half_fb_arc_angle * 2.0 << std::endl; + //std::cout << "angle max: " << max << " min: " << min << " range: " << angle_range << std::endl; - std::cout << "max buttons in shell: " << max_buttons_at_current_radius << std::endl; + //std::cout << "max buttons in shell: " << max_buttons_at_current_radius << std::endl; // can button fit in this shell? int button_number_in_shell = button_number - buttons_in_previous_shells; - std::cout << "button_number_in_shell: " << button_number_in_shell << std::endl; + //std::cout << "button_number_in_shell: " << button_number_in_shell << std::endl; if (button_number_in_shell > max_buttons_at_current_radius) { // button can't fit in this shell, so jump up to the next bigger shell |
From: <geo...@us...> - 2009-03-01 00:03:03
|
Revision: 2906 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2906&view=rev Author: geoffthemedio Date: 2009-03-01 00:02:54 +0000 (Sun, 01 Mar 2009) Log Message: ----------- -Separated starlane and system GL buffer initialization and refreshing into their own functions, called from MapWnd::InitTurnRendering Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-02-28 19:57:19 UTC (rev 2905) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-03-01 00:02:54 UTC (rev 2906) @@ -37,7 +37,6 @@ #include <vector> #include <deque> - namespace { const double ZOOM_STEP_SIZE = std::pow(2.0, 1.0/3.0); const double ZOOM_IN_MAX_STEPS = 9.0; @@ -158,6 +157,7 @@ } } + //////////////////////////////////////////////////////////// // MapWnd::MapScaleLine //////////////////////////////////////////////////////////// @@ -252,6 +252,7 @@ bool m_enabled; }; + //////////////////////////////////////////////////////////// // MapWnd::GLBuffer //////////////////////////////////////////////////////////// @@ -260,6 +261,7 @@ m_size(0) {} + //////////////////////////////////////////////////////////// // MapWndPopup //////////////////////////////////////////////////////////// @@ -860,23 +862,8 @@ Logger().debugStream() << "MapWnd::InitTurnRendering"; CheckGLVersion(); Universe& universe = GetUniverse(); - EmpireManager& manager = HumanClientApp::GetApp()->Empires(); - // temp storage - std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_star_core_quad_vertices; - std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_star_halo_quad_vertices; - std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_galaxy_gas_quad_vertices; - std::vector<float> raw_star_texture_coords; - std::vector<float> raw_starlane_vertices; - std::vector<unsigned char> raw_starlane_colors; - std::vector<float> raw_starlane_supply_vertices; - std::vector<unsigned char> raw_starlane_supply_colors; - std::set<std::pair<int, int> > rendered_starlanes; // stored by inserting return value of UnorderedIntPair so different orders of system ids don't create duplicates - std::set<std::pair<int, int> > rendered_half_starlanes; // stored as unaltered pairs, so that a each direction of traversal can be shown separately - const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); - - // adjust size of map window for universe and application size Resize(GG::Pt(static_cast<GG::X>(Universe::UniverseWidth() * ZOOM_MAX + GG::GUI::GetGUI()->AppWidth() * 1.5), static_cast<GG::Y>(Universe::UniverseWidth() * ZOOM_MAX + GG::GUI::GetGUI()->AppHeight() * 1.5))); @@ -909,7 +896,6 @@ icon->InstallEventFilter(this); AttachChild(icon); - // connect UI response signals. TODO: Make these configurable in GUI? GG::Connect(icon->LeftClickedSignal, &MapWnd::SystemLeftClicked, this); GG::Connect(icon->RightClickedSignal, &MapWnd::SystemRightClicked, this); @@ -928,12 +914,26 @@ RefreshFleetButtons(); + // create buffers for system icon and galaxy gas rendering, and starlane rendering + InitSystemRenderingBuffers(); + InitStarlaneRenderingBuffers(); +} + +void MapWnd::InitSystemRenderingBuffers() +{ + // temp storage + std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_star_core_quad_vertices; + std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_star_halo_quad_vertices; + std::map<boost::shared_ptr<GG::Texture>, std::vector<float> > raw_galaxy_gas_quad_vertices; + std::vector<float> raw_star_texture_coords; + + // Generate texture coordinates to be used for subsequent vertex buffer creation. // Note these coordinates assume the texture is twice as large as it should // be. This allows us to use one set of texture coords for everything, even // though the star-halo textures must be rendered at sizes as much as twice // as large as the star-disc textures. - for (std::size_t i = 0; i < systems.size(); ++i) { + for (std::size_t i = 0; i < m_system_icons.size(); ++i) { raw_star_texture_coords.push_back(1.5); raw_star_texture_coords.push_back(-0.5); raw_star_texture_coords.push_back(-0.5); @@ -945,52 +945,50 @@ } - // create various buffers used for map contents rendering for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { const SystemIcon* icon = it->second; const System& system = icon->GetSystem(); - // add disc and halo textures for system icon - { - // See note above texture coords for why we're making coordinate sets that are 2x too big. - double icon_size = ClientUI::SystemIconSize(); - double icon_ul_x = system.X() - icon_size; - double icon_ul_y = system.Y() - icon_size; - double icon_lr_x = system.X() + icon_size; - double icon_lr_y = system.Y() + icon_size; - if (icon->DiscTexture()) { - glBindTexture(GL_TEXTURE_2D, icon->DiscTexture()->OpenGLId()); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - std::vector<float>& core_vertices = raw_star_core_quad_vertices[icon->DiscTexture()]; - core_vertices.push_back(icon_lr_x); - core_vertices.push_back(icon_ul_y); - core_vertices.push_back(icon_ul_x); - core_vertices.push_back(icon_ul_y); - core_vertices.push_back(icon_ul_x); - core_vertices.push_back(icon_lr_y); - core_vertices.push_back(icon_lr_x); - core_vertices.push_back(icon_lr_y); - } + // Add disc and halo textures for system icon + // See note above texture coords for why we're making coordinate sets that are 2x too big. + double icon_size = ClientUI::SystemIconSize(); + double icon_ul_x = system.X() - icon_size; + double icon_ul_y = system.Y() - icon_size; + double icon_lr_x = system.X() + icon_size; + double icon_lr_y = system.Y() + icon_size; - if (icon->HaloTexture()) { - glBindTexture(GL_TEXTURE_2D, icon->HaloTexture()->OpenGLId()); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - std::vector<float>& halo_vertices = raw_star_halo_quad_vertices[icon->HaloTexture()]; - halo_vertices.push_back(icon_lr_x); - halo_vertices.push_back(icon_ul_y); - halo_vertices.push_back(icon_ul_x); - halo_vertices.push_back(icon_ul_y); - halo_vertices.push_back(icon_ul_x); - halo_vertices.push_back(icon_lr_y); - halo_vertices.push_back(icon_lr_x); - halo_vertices.push_back(icon_lr_y); - } + if (icon->DiscTexture()) { + glBindTexture(GL_TEXTURE_2D, icon->DiscTexture()->OpenGLId()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + std::vector<float>& core_vertices = raw_star_core_quad_vertices[icon->DiscTexture()]; + core_vertices.push_back(icon_lr_x); + core_vertices.push_back(icon_ul_y); + core_vertices.push_back(icon_ul_x); + core_vertices.push_back(icon_ul_y); + core_vertices.push_back(icon_ul_x); + core_vertices.push_back(icon_lr_y); + core_vertices.push_back(icon_lr_x); + core_vertices.push_back(icon_lr_y); } + if (icon->HaloTexture()) { + glBindTexture(GL_TEXTURE_2D, icon->HaloTexture()->OpenGLId()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + std::vector<float>& halo_vertices = raw_star_halo_quad_vertices[icon->HaloTexture()]; + halo_vertices.push_back(icon_lr_x); + halo_vertices.push_back(icon_ul_y); + halo_vertices.push_back(icon_ul_x); + halo_vertices.push_back(icon_ul_y); + halo_vertices.push_back(icon_ul_x); + halo_vertices.push_back(icon_lr_y); + halo_vertices.push_back(icon_lr_x); + halo_vertices.push_back(icon_lr_y); + } - // add gaseous substance around system + + // add (rotated) gaseous substance around system if (boost::shared_ptr<GG::Texture> gaseous_texture = ClientUI::GetClientUI()->GetModuloTexture(ClientUI::ArtDir() / "galaxy_decoration", "gaseous", system.ID())) { glBindTexture(GL_TEXTURE_2D, gaseous_texture->OpenGLId()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); @@ -1043,8 +1041,117 @@ gas_vertices.push_back(GAS_X4); gas_vertices.push_back(GAS_Y4); } + } + // clear out all the old buffers + for (std::map<boost::shared_ptr<GG::Texture>, GLBuffer>::const_iterator it = m_star_core_quad_vertices.begin(); + it != m_star_core_quad_vertices.end(); ++it) + { + glDeleteBuffers(1, &it->second.m_name); + } + m_star_core_quad_vertices.clear(); + + for (std::map<boost::shared_ptr<GG::Texture>, GLBuffer>::const_iterator it = m_star_halo_quad_vertices.begin(); + it != m_star_halo_quad_vertices.end(); ++it) + { + glDeleteBuffers(1, &it->second.m_name); + } + m_star_halo_quad_vertices.clear(); + + for (std::map<boost::shared_ptr<GG::Texture>, GLBuffer>::const_iterator it = m_galaxy_gas_quad_vertices.begin(); + it != m_galaxy_gas_quad_vertices.end(); ++it) + { + glDeleteBuffers(1, &it->second.m_name); + } + m_galaxy_gas_quad_vertices.clear(); + + if (m_star_texture_coords.m_name) { + glDeleteBuffers(1, &m_star_texture_coords.m_name); + m_star_texture_coords.m_name = 0; + } + + + // create new buffers + + // star cores + for (std::map<boost::shared_ptr<GG::Texture>, std::vector<float> >::const_iterator it = + raw_star_core_quad_vertices.begin(); + it != raw_star_core_quad_vertices.end(); + ++it) + { + GLuint& name = m_star_core_quad_vertices[it->first].m_name; + glGenBuffers(1, &name); + glBindBuffer(GL_ARRAY_BUFFER, name); + glBufferData(GL_ARRAY_BUFFER, + it->second.size() * sizeof(float), + &it->second[0], + GL_STATIC_DRAW); + m_star_core_quad_vertices[it->first].m_size = it->second.size() / 2; + } + + // star halos + for (std::map<boost::shared_ptr<GG::Texture>, std::vector<float> >::const_iterator it = raw_star_halo_quad_vertices.begin(); + it != raw_star_halo_quad_vertices.end(); ++it) + { + GLuint& name = m_star_halo_quad_vertices[it->first].m_name; + glGenBuffers(1, &name); + glBindBuffer(GL_ARRAY_BUFFER, name); + glBufferData(GL_ARRAY_BUFFER, + it->second.size() * sizeof(float), + &it->second[0], + GL_STATIC_DRAW); + m_star_halo_quad_vertices[it->first].m_size = it->second.size() / 2; + } + + // galaxy gas + for (std::map<boost::shared_ptr<GG::Texture>, std::vector<float> >::const_iterator it = raw_galaxy_gas_quad_vertices.begin(); + it != raw_galaxy_gas_quad_vertices.end(); ++it) + { + GLuint& name = m_galaxy_gas_quad_vertices[it->first].m_name; + glGenBuffers(1, &name); + glBindBuffer(GL_ARRAY_BUFFER, name); + glBufferData(GL_ARRAY_BUFFER, + it->second.size() * sizeof(float), + &it->second[0], + GL_STATIC_DRAW); + m_galaxy_gas_quad_vertices[it->first].m_size = it->second.size() / 2; + } + + + // fill buffers with star textures + glGenBuffers(1, &m_star_texture_coords.m_name); + glBindBuffer(GL_ARRAY_BUFFER, m_star_texture_coords.m_name); + glBufferData(GL_ARRAY_BUFFER, + raw_star_texture_coords.size() * sizeof(float), + &raw_star_texture_coords[0], + GL_STATIC_DRAW); + m_star_texture_coords.m_size = raw_star_texture_coords.size() / 2; + + // cleanup + glBindBuffer(GL_ARRAY_BUFFER, 0); +} + +void MapWnd::InitStarlaneRenderingBuffers() +{ + // temp storage + std::vector<float> raw_starlane_vertices; + std::vector<unsigned char> raw_starlane_colors; + std::vector<float> raw_starlane_supply_vertices; + std::vector<unsigned char> raw_starlane_supply_colors; + std::set<std::pair<int, int> > rendered_starlanes; // stored by inserting return value of UnorderedIntPair so different orders of system ids don't create duplicates + std::set<std::pair<int, int> > rendered_half_starlanes; // stored as unaltered pairs, so that a each direction of traversal can be shown separately + const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); + + Universe& universe = GetUniverse(); + EmpireManager& manager = HumanClientApp::GetApp()->Empires(); + + + // create buffers for starlane rendering + for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { + const SystemIcon* icon = it->second; + const System& system = icon->GetSystem(); + // add system's starlanes for (System::const_lane_iterator lane_it = system.begin_lanes(); lane_it != system.end_lanes(); ++lane_it) { bool lane_is_wormhole = lane_it->second; @@ -1165,34 +1272,7 @@ } - - // clear out all the old buffers - for (std::map<boost::shared_ptr<GG::Texture>, GLBuffer>::const_iterator it = m_star_core_quad_vertices.begin(); - it != m_star_core_quad_vertices.end(); - ++it) { - glDeleteBuffers(1, &it->second.m_name); - } - m_star_core_quad_vertices.clear(); - for (std::map<boost::shared_ptr<GG::Texture>, GLBuffer>::const_iterator it = - m_star_halo_quad_vertices.begin(); - it != m_star_halo_quad_vertices.end(); - ++it) { - glDeleteBuffers(1, &it->second.m_name); - } - m_star_halo_quad_vertices.clear(); - for (std::map<boost::shared_ptr<GG::Texture>, GLBuffer>::const_iterator it = - m_galaxy_gas_quad_vertices.begin(); - it != m_galaxy_gas_quad_vertices.end(); - ++it) { - glDeleteBuffers(1, &it->second.m_name); - } - m_galaxy_gas_quad_vertices.clear(); - - if (m_star_texture_coords.m_name) { - glDeleteBuffers(1, &m_star_texture_coords.m_name); - m_star_texture_coords.m_name = 0; - } - + // clear old buffers if (m_starlane_vertices.m_name) { glDeleteBuffers(1, &m_starlane_vertices.m_name); m_starlane_vertices.m_name = 0; @@ -1214,57 +1294,9 @@ } - Logger().debugStream() << "Turn initialization new graphic buffer creation"; - // create new buffers - for (std::map<boost::shared_ptr<GG::Texture>, std::vector<float> >::const_iterator it = - raw_star_core_quad_vertices.begin(); - it != raw_star_core_quad_vertices.end(); - ++it) { - GLuint& name = m_star_core_quad_vertices[it->first].m_name; - glGenBuffers(1, &name); - glBindBuffer(GL_ARRAY_BUFFER, name); - glBufferData(GL_ARRAY_BUFFER, - it->second.size() * sizeof(float), - &it->second[0], - GL_STATIC_DRAW); - m_star_core_quad_vertices[it->first].m_size = it->second.size() / 2; - } - for (std::map<boost::shared_ptr<GG::Texture>, std::vector<float> >::const_iterator it = - raw_star_halo_quad_vertices.begin(); - it != raw_star_halo_quad_vertices.end(); - ++it) { - GLuint& name = m_star_halo_quad_vertices[it->first].m_name; - glGenBuffers(1, &name); - glBindBuffer(GL_ARRAY_BUFFER, name); - glBufferData(GL_ARRAY_BUFFER, - it->second.size() * sizeof(float), - &it->second[0], - GL_STATIC_DRAW); - m_star_halo_quad_vertices[it->first].m_size = it->second.size() / 2; - } - for (std::map<boost::shared_ptr<GG::Texture>, std::vector<float> >::const_iterator it = - raw_galaxy_gas_quad_vertices.begin(); - it != raw_galaxy_gas_quad_vertices.end(); - ++it) { - GLuint& name = m_galaxy_gas_quad_vertices[it->first].m_name; - glGenBuffers(1, &name); - glBindBuffer(GL_ARRAY_BUFFER, name); - glBufferData(GL_ARRAY_BUFFER, - it->second.size() * sizeof(float), - &it->second[0], - GL_STATIC_DRAW); - m_galaxy_gas_quad_vertices[it->first].m_size = it->second.size() / 2; - } - if (!raw_star_texture_coords.empty()) { - glGenBuffers(1, &m_star_texture_coords.m_name); - glBindBuffer(GL_ARRAY_BUFFER, m_star_texture_coords.m_name); - glBufferData(GL_ARRAY_BUFFER, - raw_star_texture_coords.size() * sizeof(float), - &raw_star_texture_coords[0], - GL_STATIC_DRAW); - m_star_texture_coords.m_size = raw_star_texture_coords.size() / 2; - } + + // fill new buffers if (!raw_starlane_vertices.empty()) { glGenBuffers(1, &m_starlane_vertices.m_name); glBindBuffer(GL_ARRAY_BUFFER, m_starlane_vertices.m_name); @@ -1274,6 +1306,7 @@ GL_STATIC_DRAW); m_starlane_vertices.m_size = raw_starlane_vertices.size() / 2; } + if (!raw_starlane_colors.empty()) { glGenBuffers(1, &m_starlane_colors.m_name); glBindBuffer(GL_ARRAY_BUFFER, m_starlane_colors.m_name); @@ -1283,6 +1316,7 @@ GL_STATIC_DRAW); m_starlane_colors.m_size = raw_starlane_colors.size() / 4; } + if (!raw_starlane_supply_vertices.empty()) { glGenBuffers(1, &m_starlane_fleet_supply_vertices.m_name); glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_vertices.m_name); @@ -1292,6 +1326,7 @@ GL_STATIC_DRAW); m_starlane_fleet_supply_vertices.m_size = raw_starlane_supply_vertices.size() / 2; } + if (!raw_starlane_supply_colors.empty()) { glGenBuffers(1, &m_starlane_fleet_supply_colors.m_name); glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_colors.m_name); @@ -1302,6 +1337,7 @@ m_starlane_fleet_supply_colors.m_size = raw_starlane_supply_colors.size() / 4; } + // cleanup glBindBuffer(GL_ARRAY_BUFFER, 0); } Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2009-02-28 19:57:19 UTC (rev 2905) +++ trunk/FreeOrion/UI/MapWnd.h 2009-03-01 00:02:54 UTC (rev 2906) @@ -177,6 +177,8 @@ void ZoomSlid(int pos, int low, int high); void InitTurnRendering(); //!< sets up rendering of system icons, galaxy gas, starlanes at start of turn + void InitSystemRenderingBuffers(); //!< initializes or refreshes buffers for rendering of system icons and galaxy gas + void InitStarlaneRenderingBuffers(); //!< initializes or refreshes buffers for rendering of starlanes void RenderStarfields(); //!< renders the background starfiends void RenderNebulae(); //!< renders nebulae @@ -285,14 +287,14 @@ GLuint m_name; std::size_t m_size; }; - std::map<boost::shared_ptr<GG::Texture>, GLBuffer> m_star_core_quad_vertices; - std::map<boost::shared_ptr<GG::Texture>, GLBuffer> m_star_halo_quad_vertices; - std::map<boost::shared_ptr<GG::Texture>, GLBuffer> m_galaxy_gas_quad_vertices; - GLBuffer m_star_texture_coords; - GLBuffer m_starlane_vertices; - GLBuffer m_starlane_colors; - GLBuffer m_starlane_fleet_supply_vertices; - GLBuffer m_starlane_fleet_supply_colors; + std::map<boost::shared_ptr<GG::Texture>, GLBuffer> m_star_core_quad_vertices; + std::map<boost::shared_ptr<GG::Texture>, GLBuffer> m_star_halo_quad_vertices; + std::map<boost::shared_ptr<GG::Texture>, GLBuffer> m_galaxy_gas_quad_vertices; + GLBuffer m_star_texture_coords; + GLBuffer m_starlane_vertices; + GLBuffer m_starlane_colors; + GLBuffer m_starlane_fleet_supply_vertices; + GLBuffer m_starlane_fleet_supply_colors; GG::Pt m_drag_offset; //!< distance the cursor is from the upper-left corner of the window during a drag ((-1, -1) if no drag is occurring) bool m_dragged; //!< tracks whether or not a drag occurs during a left button down sequence of events |
From: <geo...@us...> - 2009-03-01 20:30:40
|
Revision: 2908 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2908&view=rev Author: geoffthemedio Date: 2009-03-01 20:30:33 +0000 (Sun, 01 Mar 2009) Log Message: ----------- Prep work for making fleet positions be determined using length of lanes between system circles, rather than system centres Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-03-01 03:12:44 UTC (rev 2907) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-03-01 20:30:33 UTC (rev 2908) @@ -156,36 +156,6 @@ } } - /* Takes X and Y coordinates of a pair of systems and moves these points inwards along the vector - * between them by the radius of a system on screen (at zoom 1.0) and return result */ - std::vector<double> StarlaneEndPointsFromSystemPositions(double X1, double Y1, double X2, double Y2) { - // get unit vector - double deltaX = X2 - X1, deltaY = Y2 - Y1; - double mag = std::sqrt(deltaX*deltaX + deltaY*deltaY); - - double ring_radius = GetOptionsDB().Get<int>("UI.system-icon-size") * GetOptionsDB().Get<double>("UI.system-circle-size") / 2.0 + 0.5; - - // safety check. don't modify original coordinates if they're too close togther - if (mag > 2*ring_radius) { - // rescale vector to length of ring radius - double offsetX = deltaX / mag * ring_radius; - double offsetY = deltaY / mag * ring_radius; - - // move start and end points inwards by rescaled vector - X1 += offsetX; - Y1 += offsetY; - X2 -= offsetX; - Y2 -= offsetY; - } - - // pack into return vector - std::vector<double> retval; - retval.push_back(X1); - retval.push_back(Y1); - retval.push_back(X2); - retval.push_back(Y2); - return retval; - } } @@ -312,6 +282,7 @@ void MapWndPopup::Close() { CloseClicked(); } + //////////////////////////////////////////////// // MapWnd::MovementLineData //////////////////////////////////////////////// @@ -319,8 +290,8 @@ m_colour(GG::CLR_ZERO), m_path(), m_button(0), - m_x(-100000.0), // UniverseObject::INVALID_POSITION value respecified here to avoid unnecessary include dependency - m_y(-100000.0) + m_x(UniverseObject::INVALID_POSITION), + m_y(UniverseObject::INVALID_POSITION) {} MapWnd::MovementLineData::MovementLineData(double x, double y, const std::list<MovePathNode>& path, GG::Clr colour/* = GG::CLR_WHITE*/) : @@ -358,6 +329,17 @@ ////////////////////////////////// +// MapWnd::LaneEndpoints +////////////////////////////////// +MapWnd::LaneEndpoints::LaneEndpoints() : + X1(UniverseObject::INVALID_POSITION), + Y1(UniverseObject::INVALID_POSITION), + X2(UniverseObject::INVALID_POSITION), + Y2(UniverseObject::INVALID_POSITION) +{} + + +////////////////////////////////// // MapWnd::FleetETAMapIndicator ////////////////////////////////// class MapWnd::FleetETAMapIndicator : public GG::Wnd @@ -418,6 +400,7 @@ m_research_wnd(NULL), m_production_wnd(NULL), m_design_wnd(NULL), + m_starlane_endpoints(), m_moving_fleet_buttons(), m_system_fleet_buttons(), m_fleet_state_change_signals(), @@ -1170,7 +1153,6 @@ std::vector<unsigned char> raw_starlane_colors; std::vector<float> raw_starlane_supply_vertices; std::vector<unsigned char> raw_starlane_supply_colors; - std::set<std::pair<int, int> > rendered_starlanes; // stored by inserting return value of UnorderedIntPair so different orders of system ids don't create duplicates std::set<std::pair<int, int> > rendered_half_starlanes; // stored as unaltered pairs, so that a each direction of traversal can be shown separately const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); @@ -1178,7 +1160,9 @@ EmpireManager& manager = HumanClientApp::GetApp()->Empires(); - // create buffers for starlane rendering + // calculate in-universe apparent starlane endpoints and create buffers for starlane rendering + m_starlane_endpoints.clear(); + for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { const SystemIcon* icon = it->second; const System& system = icon->GetSystem(); @@ -1192,17 +1176,21 @@ const System* dest_system = universe.Object<System>(lane_it->first); - // get starlane endpoints for this pair of systems - std::vector<double> starlane_endpoints = StarlaneEndPointsFromSystemPositions(start_system->X(), start_system->Y(), dest_system->X(), dest_system->Y()); + // check that this lane isn't already in map / being rendered + std::pair<int, int> lane = UnorderedIntPair(start_system->ID(), dest_system->ID()); + if (m_starlane_endpoints.find(lane) == m_starlane_endpoints.end()) { - // check that this lane isn't already going to be rendered. skip it if it is. - if (rendered_starlanes.find(UnorderedIntPair(start_system->ID(), dest_system->ID())) == rendered_starlanes.end()) { - //Logger().debugStream() << " ... lane not found."; - rendered_starlanes.insert(UnorderedIntPair(start_system->ID(), dest_system->ID())); + // get and store universe position endpoints for this starlane + LaneEndpoints lane_endpoints = StarlaneEndPointsFromSystemPositions(start_system->X(), start_system->Y(), dest_system->X(), dest_system->Y()); + m_starlane_endpoints[lane] = lane_endpoints; + // add vertices for this full-length starlane - std::copy(starlane_endpoints.begin(), starlane_endpoints.end(), std::back_inserter(raw_starlane_vertices)); + raw_starlane_vertices.push_back(lane_endpoints.X1); + raw_starlane_vertices.push_back(lane_endpoints.Y1); + raw_starlane_vertices.push_back(lane_endpoints.X2); + raw_starlane_vertices.push_back(lane_endpoints.Y2); // determine colour(s) for lane based on which empire(s) can transfer resources along the lane. @@ -1257,11 +1245,12 @@ if (resource_obstructed_supply_lanes.find(lane_forward) != resource_obstructed_supply_lanes.end()) { // found an empire that has a half lane here, so add it. rendered_half_starlanes.insert(std::make_pair(start_system->ID(), dest_system->ID())); // inserted as ordered pair, so both directions can have different half-lanes + LaneEndpoints lane_endpoints = StarlaneEndPointsFromSystemPositions(start_system->X(), start_system->Y(), dest_system->X(), dest_system->Y()); - raw_starlane_vertices.push_back(starlane_endpoints[0]); // X component of first system - raw_starlane_vertices.push_back(starlane_endpoints[1]); // Y component of first system - raw_starlane_vertices.push_back((starlane_endpoints[0] + starlane_endpoints[2]) * 0.5); // half way along starlane - raw_starlane_vertices.push_back((starlane_endpoints[1] + starlane_endpoints[3]) * 0.5); + raw_starlane_vertices.push_back(lane_endpoints.X1); + raw_starlane_vertices.push_back(lane_endpoints.Y1); + raw_starlane_vertices.push_back((lane_endpoints.X1 + lane_endpoints.X2) * 0.5); // half way along starlane + raw_starlane_vertices.push_back((lane_endpoints.Y1 + lane_endpoints.Y2) * 0.5); const GG::Clr& lane_colour = empire->Color(); raw_starlane_colors.push_back(lane_colour.r); @@ -1375,6 +1364,36 @@ glBindBuffer(GL_ARRAY_BUFFER, 0); } +MapWnd::LaneEndpoints MapWnd::StarlaneEndPointsFromSystemPositions(double X1, double Y1, double X2, double Y2) +{ + LaneEndpoints retval; + + // get unit vector + double deltaX = X2 - X1, deltaY = Y2 - Y1; + double mag = std::sqrt(deltaX*deltaX + deltaY*deltaY); + + double ring_radius = GetOptionsDB().Get<int>("UI.system-icon-size") * GetOptionsDB().Get<double>("UI.system-circle-size") / 2.0 + 0.5; + + // safety check. don't modify original coordinates if they're too close togther + if (mag > 2*ring_radius) { + // rescale vector to length of ring radius + double offsetX = deltaX / mag * ring_radius; + double offsetY = deltaY / mag * ring_radius; + + // move start and end points inwards by rescaled vector + X1 += offsetX; + Y1 += offsetY; + X2 -= offsetX; + Y2 -= offsetY; + } + + retval.X1 = X1; + retval.Y1 = Y1; + retval.X2 = X2; + retval.Y2 = Y2; + return retval; +} + void MapWnd::RestoreFromSaveData(const SaveGameUIData& data) { m_zoom_steps_in = data.map_zoom_steps_in; Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2009-03-01 03:12:44 UTC (rev 2907) +++ trunk/FreeOrion/UI/MapWnd.h 2009-03-01 20:30:33 UTC (rev 2908) @@ -165,6 +165,15 @@ double m_x, m_y; ///< universe x and y at which to originate line (start point isn't in the path) (if m_button is nonzero, its galaxy position should be used instead) }; + /* Start and end points in universe coordinates as seen in MapWnd. Lanes are drawn to + * and from a circle surrounding system icons, note the centre of the system icon. The + * location of these start ane endpoints is used for rendering the starlane and for + * positioning fleet buttons that are moving along the starlane. */ + struct LaneEndpoints { + LaneEndpoints(); + double X1, Y1, X2, Y2; + }; + class FleetETAMapIndicator; class MapScaleLine; @@ -179,6 +188,9 @@ void InitTurnRendering(); //!< sets up rendering of system icons, galaxy gas, starlanes at start of turn void InitSystemRenderingBuffers(); //!< initializes or refreshes buffers for rendering of system icons and galaxy gas void InitStarlaneRenderingBuffers(); //!< initializes or refreshes buffers for rendering of starlanes + /* Takes X and Y coordinates of a pair of systems and moves these points inwards along the vector + * between them by the radius of a system on screen (at zoom 1.0) and return result */ + LaneEndpoints StarlaneEndPointsFromSystemPositions(double X1, double Y1, double X2, double Y2); void RenderStarfields(); //!< renders the background starfiends void RenderNebulae(); //!< renders nebulae @@ -264,10 +276,12 @@ ProductionWnd* m_production_wnd; //!< production screen DesignWnd* m_design_wnd; //!< design screen + + std::map<std::pair<int, int>, LaneEndpoints> m_starlane_endpoints; //!< map from starlane start and end system IDs (stored in pair in increasing order) to the universe coordiates at which to draw the starlane ends + std::vector<FleetButton*> m_moving_fleet_buttons; //!< icons representing one or more fleets moving around map std::map<System*, FleetButton*> m_system_fleet_buttons; //!< icons representing one or more fleets stationary at a system std::map<int, boost::signals::connection> m_fleet_state_change_signals; - std::vector<boost::signals::connection> m_system_fleet_state_change_signals; std::set<boost::signals::connection> m_keyboard_accelerator_signals; //!< signals connecting keyboard accelerators to GUI responses @@ -280,9 +294,8 @@ std::map<const Fleet*, std::vector<FleetETAMapIndicator*> > m_projected_fleet_eta_map_indicators; //!< indicators that appear adjacent to projected fleet move lines that indicate the eta for points on a move path - // OpenGL buffers objects containing vertices, texture coordinates, etc. - struct GLBuffer - { + /* OpenGL buffers objects containing vertices, texture coordinates, etc. */ + struct GLBuffer { GLBuffer(); GLuint m_name; std::size_t m_size; |