From: <geo...@us...> - 2010-04-04 22:48:23
|
Revision: 3424 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3424&view=rev Author: geoffthemedio Date: 2010-04-04 22:48:17 +0000 (Sun, 04 Apr 2010) Log Message: ----------- -Fixed issue with dragging the map up too far at certain zoom levels would cause the apparent map position to change unexpectedly -Made the Turn button size adjust appropriately for the size of the text to be shown in it, similar to the menu, sitrep and subscreen buttons on the toolbar at the top of the MapWnd Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-04-04 07:03:32 UTC (rev 3423) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-04-04 22:48:17 UTC (rev 3424) @@ -45,10 +45,9 @@ const double ZOOM_STEP_SIZE = std::pow(2.0, 1.0/3.0); const double ZOOM_IN_MAX_STEPS = 9.0; const double ZOOM_IN_MIN_STEPS = -4.0; // negative zoom steps indicates zooming out - const int ZOOM_TOTAL_STEPS = ZOOM_IN_MAX_STEPS + 1 + ZOOM_IN_MIN_STEPS; + const int ZOOM_TOTAL_STEPS = static_cast<const int>(ZOOM_IN_MAX_STEPS + 1.0 + 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 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); @@ -600,15 +599,20 @@ m_design_wnd->Hide(); + boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); + const GG::X BUTTON_TOTAL_MARGIN(8); + + // turn button - m_turn_update = new CUITurnButton(GG::X(LAYOUT_MARGIN), GG::Y(LAYOUT_MARGIN), END_TURN_BTN_WIDTH, ""); + // determine size from the text that will go into the button, using a test year string + std::string turn_button_longest_reasonable_text = boost::io::str(FlexibleFormat(UserString("MAP_BTN_TURN_UPDATE")) % "99999"); // it is unlikely a game will go over 100000 turns + GG::X button_width = font->TextExtent(turn_button_longest_reasonable_text).x + BUTTON_TOTAL_MARGIN; + // create button using determined width + m_turn_update = new CUITurnButton(GG::X(LAYOUT_MARGIN), GG::Y(LAYOUT_MARGIN), button_width, turn_button_longest_reasonable_text); m_toolbar->AttachChild(m_turn_update); GG::Connect(m_turn_update->ClickedSignal, BoolToVoidAdapter(boost::bind(&MapWnd::EndTurn, this))); - boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); - const GG::X BUTTON_TOTAL_MARGIN(8); - // FPS indicator m_FPS = new FPSIndicator(m_turn_update->LowerRight().x + LAYOUT_MARGIN, m_turn_update->UpperLeft().y); m_toolbar->AttachChild(m_FPS); @@ -648,7 +652,7 @@ // Menu button - GG::X button_width = font->TextExtent(UserString("MAP_BTN_MENU")).x + BUTTON_TOTAL_MARGIN; + button_width = font->TextExtent(UserString("MAP_BTN_MENU")).x + BUTTON_TOTAL_MARGIN; m_btn_menu = new SettableInWindowCUIButton(m_toolbar->LowerRight().x - button_width - GG::X(LAYOUT_MARGIN), GG::Y(LAYOUT_MARGIN), button_width, UserString("MAP_BTN_MENU") ); @@ -3214,6 +3218,12 @@ GG::Y app_height = GG::GUI::GetGUI()->AppHeight(); GG::X map_margin_width(app_width / 2.0); + //std::cout << "MapWnd::CorrectMapPosition appwidth: " << Value(app_width) << " appheight: " << Value(app_height) + // << " to_x: " << Value(move_to_pt.x) << " to_y: " << Value(move_to_pt.y) << std::endl;; + + // restrict map positions to prevent map from being dragged too far off screen. + // add extra padding to restrictions when universe to be shown is larger than + // the screen area in which to show it. if (app_width - map_margin_width < contents_width || Value(app_height) - map_margin_width < contents_width) { if (map_margin_width < move_to_pt.x) move_to_pt.x = map_margin_width; @@ -3222,7 +3232,7 @@ if (map_margin_width < Value(move_to_pt.y)) move_to_pt.y = GG::Y(Value(map_margin_width)); if (Value(move_to_pt.y) + contents_width < Value(app_height) - map_margin_width) - move_to_pt.y = app_height - Value(map_margin_width - contents_width); + move_to_pt.y = app_height - Value(map_margin_width) - Value(contents_width); } else { if (move_to_pt.x < 0) move_to_pt.x = GG::X0; |
From: <tz...@us...> - 2010-04-13 19:15:46
|
Revision: 3477 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3477&view=rev Author: tzlaine Date: 2010-04-13 19:15:35 +0000 (Tue, 13 Apr 2010) Log Message: ----------- "De-parented" SitrepPanel from MapWnd. This addresses longstanding feature request "SitRep Stuck at Bottom of Window Stack" (1443851). Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-04-13 18:24:15 UTC (rev 3476) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-04-13 19:15:35 UTC (rev 3477) @@ -574,6 +574,8 @@ // situation report window 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 + GG::GUI::GetGUI()->Register(m_sitrep_panel); + m_sitrep_panel->Hide(); // research window @@ -781,6 +783,7 @@ MapWnd::~MapWnd() { delete m_toolbar; + delete m_sitrep_panel; delete m_research_wnd; delete m_production_wnd; delete m_design_wnd; @@ -886,7 +889,6 @@ CorrectMapPosition(move_to_pt); GG::Pt final_move = move_to_pt - ClientUpperLeft(); m_side_panel->OffsetMove(-final_move); - m_sitrep_panel->OffsetMove(-final_move); MoveTo(move_to_pt - GG::Pt(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight())); m_dragged = true; @@ -1758,14 +1760,12 @@ GG::Pt map_move = map_ul - ul; OffsetMove(map_move); m_side_panel->OffsetMove(-map_move); - m_sitrep_panel->OffsetMove(-map_move); // this correction ensures that zooming in doesn't leave too large a margin to the side GG::Pt move_to_pt = ul = ClientUpperLeft(); CorrectMapPosition(move_to_pt); GG::Pt final_move = move_to_pt - ul; m_side_panel->OffsetMove(-final_move); - m_sitrep_panel->OffsetMove(-final_move); MoveTo(move_to_pt - GG::Pt(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight())); } @@ -1793,14 +1793,12 @@ static_cast<GG::Y>((current_y - y) * ZoomFactor())); OffsetMove(map_move); m_side_panel->OffsetMove(-map_move); - m_sitrep_panel->OffsetMove(-map_move); // this correction ensures that the centering doesn't leave too large a margin to the side GG::Pt move_to_pt = ul = ClientUpperLeft(); CorrectMapPosition(move_to_pt); GG::Pt final_move = move_to_pt - ul; m_side_panel->OffsetMove(-final_move); - m_sitrep_panel->OffsetMove(-final_move); MoveTo(move_to_pt - GG::Pt(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight())); } @@ -1891,7 +1889,6 @@ // selected a valid system, show sidepanel AttachChild(m_side_panel); MoveChildUp(m_side_panel); - MoveChildUp(m_sitrep_panel); m_side_panel->Show(); } } @@ -2657,14 +2654,12 @@ static_cast<GG::Y>((center_y + ul_offset_y) - ul.y)); OffsetMove(map_move); m_side_panel->OffsetMove(-map_move); - m_sitrep_panel->OffsetMove(-map_move); // this correction ensures that zooming in doesn't leave too large a margin to the side GG::Pt move_to_pt = ul = ClientUpperLeft(); CorrectMapPosition(move_to_pt); GG::Pt final_move = move_to_pt - ul; m_side_panel->OffsetMove(-final_move); - m_sitrep_panel->OffsetMove(-final_move); MoveTo(move_to_pt - GG::Pt(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight())); @@ -3642,8 +3637,6 @@ HideDesign(); // show the sitrep window - AttachChild(m_sitrep_panel); - MoveChildUp(m_sitrep_panel); m_sitrep_panel->Show(); // indicate selection on button @@ -3652,7 +3645,6 @@ void MapWnd::HideSitRep() { - DetachChild(m_sitrep_panel); m_sitrep_panel->Hide(); // necessary so it won't be visible when next toggled m_btn_siterep->MarkNotSelected(); } |
From: <geo...@us...> - 2010-05-04 20:41:21
|
Revision: 3573 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3573&view=rev Author: geoffthemedio Date: 2010-05-04 20:41:14 +0000 (Tue, 04 May 2010) Log Message: ----------- -In MapWnd::RenderStarlanes commented out starlane colour buffer binding and GL_COLOR_ARRAY client state setting code which seems to be causing crashes when, after starting a new game, the player immediately clicks a fleet button, then the sitrep button, then the sitrep window (bringing it to the top of the stack) and then the map. -Moved some MapWnd rendering functions within MapWnd.cpp to just below MapWnd::Render to make them easier to find and refer to when looking at the main Render function Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-05-01 02:25:54 UTC (rev 3572) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-05-04 20:41:14 UTC (rev 3573) @@ -858,6 +858,8 @@ RenderVisibilityRadii(); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisable(GL_TEXTURE_2D); glEnable(GL_LINE_SMOOTH); glEnable(GL_LINE_STIPPLE); @@ -867,16 +869,539 @@ glDisable(GL_LINE_STIPPLE); glLineWidth(1.0); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + RenderSystems(); RenderFleetMovementLines(); - + glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glPopMatrix(); } +void MapWnd::RenderStarfields() +{ + if (!GetOptionsDB().Get<bool>("UI.galaxy-starfields")) + return; + + glColor3d(1.0, 1.0, 1.0); + + GG::Pt origin_offset = + UpperLeft() + GG::Pt(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight()); + glMatrixMode(GL_TEXTURE); + + for (unsigned int i = 0; i < m_backgrounds.size(); ++i) { + float texture_coords_per_pixel_x = static_cast<float>(1.0 / Value(m_backgrounds[i]->Width())); + float texture_coords_per_pixel_y = static_cast<float>(1.0 / Value(m_backgrounds[i]->Height())); + glScalef(Value(texture_coords_per_pixel_x * Width()), + Value(texture_coords_per_pixel_y * Height()), + 1.0); + glTranslatef(Value(-texture_coords_per_pixel_x * origin_offset.x / 16.0 * m_bg_scroll_rate[i]), + Value(-texture_coords_per_pixel_y * origin_offset.y / 16.0 * m_bg_scroll_rate[i]), + 0.0); + glBindTexture(GL_TEXTURE_2D, m_backgrounds[i]->OpenGLId()); + glBegin(GL_QUADS); + glTexCoord2f(0.0, 0.0); + glVertex2i(0, 0); + glTexCoord2f(0.0, 1.0); + glVertex(GG::X0, Height()); + glTexCoord2f(1.0, 1.0); + glVertex(Width(), Height()); + glTexCoord2f(1.0, 0.0); + glVertex(Width(), GG::Y0); + glEnd(); + glLoadIdentity(); + } + + glMatrixMode(GL_MODELVIEW); +} + +void MapWnd::RenderNebulae() +{ + // nebula rendering disabled until we add nebulae worth rendering, which likely + // means for them to have some gameplay purpose and artist-approved way to + // specify what colours or specific nebula images to use + + //glColor4f(1.0, 1.0, 1.0, 1.0); + //glPushMatrix(); + //glLoadIdentity(); + //for (unsigned int i = 0; i < m_nebulae.size(); ++i) { + // int nebula_width = m_nebulae[i]->Width() / 3; // factor of 3 chosen to give ok-seeming nebula sizes for images in use at time of this writing + // int nebula_height = m_nebulae[i]->Height() / 3; + + // GG::Pt ul = + // ClientUpperLeft() + + // GG::Pt(static_cast<int>((m_nebula_centers[i].x - nebula_width / 2.0) * ZoomFactor()), + // static_cast<int>((m_nebula_centers[i].y - nebula_height / 2.0) * ZoomFactor())); + // m_nebulae[i]->OrthoBlit(ul, + // ul + GG::Pt(static_cast<int>(nebula_width * ZoomFactor()), + // static_cast<int>(nebula_height * ZoomFactor()))); + //} + //glPopMatrix(); +} + +void MapWnd::RenderGalaxyGas() +{ + if (!GetOptionsDB().Get<bool>("UI.galaxy-gas-background")) + return; + glColor4f(1.0, 1.0, 1.0, 1.0); + 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) + { + glBindTexture(GL_TEXTURE_2D, it->first->OpenGLId()); + glBindBuffer(GL_ARRAY_BUFFER, it->second.m_name); + glVertexPointer(2, GL_FLOAT, 0, 0); + glBindBuffer(GL_ARRAY_BUFFER, m_star_texture_coords.m_name); + glTexCoordPointer(2, GL_FLOAT, 0, 0); + glDrawArrays(GL_QUADS, 0, it->second.m_size); + } +} + +void MapWnd::RenderSystems() +{ + const double HALO_SCALE_FACTOR = SystemHaloScaleFactor(); + int empire_id = HumanClientApp::GetApp()->EmpireID(); + + if (GetOptionsDB().Get<bool>("UI.optimized-system-rendering")) { + glColor4f(1.0, 1.0, 1.0, 1.0); + + if (0.5 < HALO_SCALE_FACTOR) { + glMatrixMode(GL_TEXTURE); + glTranslatef(0.5, 0.5, 0.0); + glScalef(1.0 / HALO_SCALE_FACTOR, 1.0 / HALO_SCALE_FACTOR, 1.0); + glTranslatef(-0.5, -0.5, 0.0); + 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) + { + glBindTexture(GL_TEXTURE_2D, it->first->OpenGLId()); + glBindBuffer(GL_ARRAY_BUFFER, it->second.m_name); + glVertexPointer(2, GL_FLOAT, 0, 0); + glBindBuffer(GL_ARRAY_BUFFER, m_star_texture_coords.m_name); + glTexCoordPointer(2, GL_FLOAT, 0, 0); + glDrawArrays(GL_QUADS, 0, it->second.m_size); + } + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + } + + if (GetOptionsDB().Get<int>("UI.system-tiny-icon-size-threshold") < ZoomFactor() * ClientUI::SystemIconSize()) { + 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) + { + glBindTexture(GL_TEXTURE_2D, it->first->OpenGLId()); + glBindBuffer(GL_ARRAY_BUFFER, it->second.m_name); + glVertexPointer(2, GL_FLOAT, 0, 0); + glBindBuffer(GL_ARRAY_BUFFER, m_star_texture_coords.m_name); + glTexCoordPointer(2, GL_FLOAT, 0, 0); + glDrawArrays(GL_QUADS, 0, it->second.m_size); + } + } + + glBindBuffer(GL_ARRAY_BUFFER, 0); + + } else { + glColor4f(1.0, 1.0, 1.0, 1.0); + glPushMatrix(); + glLoadIdentity(); + for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) + it->second->ManualRender(HALO_SCALE_FACTOR); + glPopMatrix(); + } + + // circles around system icons and fog over unexplored systems + bool circles = GetOptionsDB().Get<bool>("UI.system-circles"); + bool fog_scanlines = false; + float fog_scanline_spacing = 4.0f; + Universe& universe = GetUniverse(); + + if (empire_id != ALL_EMPIRES && GetOptionsDB().Get<bool>("UI.system-fog-of-war")) { + fog_scanlines = true; + fog_scanline_spacing = static_cast<float>(GetOptionsDB().Get<double>("UI.system-fog-of-war-spacing")); + } + + if (fog_scanlines || circles) { + glPushMatrix(); + glLoadIdentity(); + const double TWO_PI = 2.0*3.14159; + glDisable(GL_TEXTURE_2D); + glEnable(GL_LINE_SMOOTH); + glLineWidth(1.5); + glColor(GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr()); + + for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { + const SystemIcon* icon = it->second; + + const int ARC_SIZE = icon->EnclosingCircleDiameter(); + + GG::Pt ul = icon->UpperLeft(), lr = icon->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; + + if (fog_scanlines && m_scanline_shader) { + if (universe.GetObjectVisibilityByEmpire(it->first, empire_id) <= VIS_BASIC_VISIBILITY) { + m_scanline_shader->Use(); + m_scanline_shader->Bind("scanline_spacing", fog_scanline_spacing); + CircleArc(circle_ul, circle_lr, 0.0, TWO_PI, true); + glUseProgram(0); + } + } + + // render circles around systems that have at least one starlane, if circles are enabled. + if (circles) { + if (const System* system = GetEmpireKnownObject<System>(it->first, empire_id)) { + if (system->NumStarlanes() > 0) { + CircleArc(circle_ul, circle_lr, 0.0, TWO_PI, false); + } + } + } + } + + glDisable(GL_LINE_SMOOTH); + glEnable(GL_TEXTURE_2D); + glPopMatrix(); + glLineWidth(1.0); + } +} + +void MapWnd::RenderStarlanes() +{ + bool coloured = GetOptionsDB().Get<bool>("UI.resource-starlane-colouring"); + + if (m_starlane_vertices.m_name && (m_starlane_colors.m_name || !coloured)) { + const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); + + glLineStipple(1, 0xffff); // solid line / no stipple + glLineWidth(GetOptionsDB().Get<double>("UI.starlane-thickness")); + + //if (coloured) + // glEnableClientState(GL_COLOR_ARRAY); + //else + glColor(UNOWNED_LANE_COLOUR); + + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_vertices.m_name); + glVertexPointer(2, GL_FLOAT, 0, 0); + + //if (coloured) { + // glBindBuffer(GL_ARRAY_BUFFER, m_starlane_colors.m_name); + // glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0); + //} + + glDrawArrays(GL_LINES, 0, m_starlane_vertices.m_size); + + //if (coloured) + // glDisableClientState(GL_COLOR_ARRAY); + + glLineWidth(1.0); + } + + if (m_starlane_fleet_supply_vertices.m_name && m_starlane_fleet_supply_colors.m_name && GetOptionsDB().Get<bool>("UI.fleet-supply-lines")) { + // render fleet supply lines + const GLushort PATTERN = 0x8080; // = 1000000010000000 -> widely space small dots + const int GLUSHORT_BIT_LENGTH = sizeof(GLushort) * 8; + const double RATE = 0.1; // slow crawl + const int SHIFT = static_cast<int>(GG::GUI::GetGUI()->Ticks() * RATE / GLUSHORT_BIT_LENGTH) % GLUSHORT_BIT_LENGTH; + const unsigned int STIPPLE = (PATTERN << SHIFT) | (PATTERN >> (GLUSHORT_BIT_LENGTH - SHIFT)); + glLineStipple(static_cast<int>(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")), STIPPLE); + glLineWidth(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")); + glEnableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_vertices.m_name); + glVertexPointer(2, GL_FLOAT, 0, 0); + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_colors.m_name); + glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0); + glDrawArrays(GL_LINES, 0, m_starlane_fleet_supply_vertices.m_size); + glDisableClientState(GL_COLOR_ARRAY); + glLineWidth(1.0); + } +} + +void MapWnd::RenderFleetMovementLines() +{ + if (ZoomFactor() < ClientUI::TinyFleetButtonZoomThreshold()) + return; + + // set common animation shift for move lines + const int MOVE_LINE_DOT_SPACING = GetOptionsDB().Get<int>("UI.fleet-supply-line-dot-spacing"); + const double RATE = GetOptionsDB().Get<double>("UI.fleet-supply-line-dot-rate"); + move_line_animation_shift = static_cast<double>(static_cast<int>(static_cast<double>(GG::GUI::GetGUI()->Ticks()) * RATE) % MOVE_LINE_DOT_SPACING); + + + // render movement lines for all fleets + for (std::map<int, MovementLineData>::const_iterator it = m_fleet_lines.begin(); it != m_fleet_lines.end(); ++it) + RenderMovementLine(it->second); + + // re-render selected fleets' movement lines in white + for (std::set<int>::const_iterator it = m_selected_fleet_ids.begin(); it != m_selected_fleet_ids.end(); ++it) { + int fleet_id = *it; + std::map<int, MovementLineData>::const_iterator line_it = m_fleet_lines.find(fleet_id); + if (line_it != m_fleet_lines.end()) + RenderMovementLine(line_it->second, GG::CLR_WHITE); + } + + // render move line ETA indicators for selected fleets + for (std::set<int>::const_iterator it = m_selected_fleet_ids.begin(); it != m_selected_fleet_ids.end(); ++it) { + int fleet_id = *it; + std::map<int, MovementLineData>::const_iterator line_it = m_fleet_lines.find(fleet_id); + if (line_it != m_fleet_lines.end()) + RenderMovementLineETAIndicators(line_it->second); + } + + // render projected move lines + for (std::map<int, MovementLineData>::const_iterator it = m_projected_fleet_lines.begin(); it != m_projected_fleet_lines.end(); ++it) + RenderMovementLine(it->second, GG::CLR_WHITE); + + // render projected move line ETA indicators + for (std::map<int, MovementLineData>::const_iterator it = m_projected_fleet_lines.begin(); it != m_projected_fleet_lines.end(); ++it) + RenderMovementLineETAIndicators(it->second, GG::CLR_WHITE); +} + +void MapWnd::RenderMovementLine(const MapWnd::MovementLineData& move_line, GG::Clr clr) +{ + const std::vector<MovementLineData::Vertex>& vertices = move_line.vertices; + if (vertices.empty()) + return; // nothing to draw. need at least two nodes at different locations to draw a line + if (vertices.size() % 2 == 1) { + Logger().errorStream() << "RenderMovementLine given an odd number of vertices to render?!"; + return; + } + + glPushMatrix(); + glLoadIdentity(); + + if (clr == GG::CLR_ZERO) { + glColor(move_line.colour); + } else { + glColor(clr); + } + + boost::shared_ptr<GG::Texture> move_line_dot_texture = + ClientUI::GetTexture(ClientUI::ArtDir() / "misc" / "move_line_dot.png"); + GG::Pt texture_half_size = GG::Pt(GG::X(move_line_dot_texture->DefaultWidth() / 2), + GG::Y(move_line_dot_texture->DefaultHeight() / 2)); + const int MOVE_LINE_DOT_SPACING = GetOptionsDB().Get<int>("UI.fleet-supply-line-dot-spacing"); + + double offset = move_line_animation_shift; // step along line in by move_line_animation_shift to get position of first dot + + // blit a series of coloured dots along move path + for (std::vector<MovementLineData::Vertex>::const_iterator verts_it = vertices.begin(); verts_it != vertices.end(); ++verts_it) { + // get next two vertices + const MovementLineData::Vertex& vert1 = *verts_it; + verts_it++; + const MovementLineData::Vertex& vert2 = *verts_it; + + GG::Pt vert1Pt = ScreenCoordsFromUniversePosition(vert1.x, vert1.y) - texture_half_size; + GG::Pt vert2Pt = ScreenCoordsFromUniversePosition(vert2.x, vert2.y) - texture_half_size; + + // get unit vector along line connecting vertices + double deltaX = Value(vert2Pt.x - vert1Pt.x), deltaY = Value(vert2Pt.y - vert1Pt.y); + double length = std::sqrt(deltaX*deltaX + deltaY*deltaY); + if (length == 0.0) // safety check + length = 1.0; + double uVecX = deltaX / length, uVecY = deltaY / length; + + + // increment along line, rendering dots, until end of line segment is passed + while (offset < length) { + // find position of dot from initial vertex position, offset length and unit vectors + std::pair<double, double> ul(Value(vert1Pt.x) + offset * uVecX, + Value(vert1Pt.y) + offset * uVecY); + + // blit texture (appropriately coloured) into place + glBindTexture(GL_TEXTURE_2D, move_line_dot_texture->OpenGLId()); + const GLfloat* tex_coords = move_line_dot_texture->DefaultTexCoords(); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(tex_coords[0], tex_coords[1]); + glVertex2f(ul.first, ul.second); + glTexCoord2f(tex_coords[2], tex_coords[1]); + glVertex2f(ul.first + Value(move_line_dot_texture->DefaultWidth()), ul.second); + glTexCoord2f(tex_coords[0], tex_coords[3]); + glVertex2f(ul.first, ul.second + Value(move_line_dot_texture->DefaultHeight())); + glTexCoord2f(tex_coords[2], tex_coords[3]); + glVertex2f(ul.first + Value(move_line_dot_texture->DefaultWidth()), + ul.second + Value(move_line_dot_texture->DefaultHeight())); + glEnd(); + + // move offset to that for next dot + offset += MOVE_LINE_DOT_SPACING; + } + + offset -= length; // so next segment's dots meld smoothly into this segment's + } + glPopMatrix(); +} + +void MapWnd::RenderMovementLineETAIndicators(const MapWnd::MovementLineData& move_line, GG::Clr clr) +{ + const std::vector<MovementLineData::Vertex>& vertices = move_line.vertices; + if (vertices.empty()) + return; // nothing to draw. + + + const double MARKER_HALF_SIZE = 9; + const int MARKER_PTS = ClientUI::Pts(); + boost::shared_ptr<GG::Font> font = ClientUI::GetBoldFont(MARKER_PTS); + const double TWO_PI = 2.0*3.1415926536; + GG::Flags<GG::TextFormat> flags = GG::FORMAT_CENTER | GG::FORMAT_VCENTER; + + glPushMatrix(); + glLoadIdentity(); + for (std::vector<MovementLineData::Vertex>::const_iterator verts_it = vertices.begin(); verts_it != vertices.end(); ++verts_it) { + const MovementLineData::Vertex& vert = *verts_it; + if (!vert.show_eta) + continue; + + + // draw background disc in empire colour, or passed-in colour + GG::Pt marker_centre = ScreenCoordsFromUniversePosition(vert.x, vert.y); + + if (clr == GG::CLR_ZERO) + glColor(move_line.colour); + else + glColor(clr); + + GG::Pt ul = marker_centre - GG::Pt(GG::X(static_cast<int>(MARKER_HALF_SIZE)), GG::Y(static_cast<int>(MARKER_HALF_SIZE))); + GG::Pt lr = marker_centre + GG::Pt(GG::X(static_cast<int>(MARKER_HALF_SIZE)), GG::Y(static_cast<int>(MARKER_HALF_SIZE))); + + glDisable(GL_TEXTURE_2D); + CircleArc(ul, lr, 0.0, TWO_PI, true); + glEnable(GL_TEXTURE_2D); + + + // render ETA number in white with black shadows + std::string text = boost::lexical_cast<std::string>(vert.eta); + + glColor(GG::CLR_BLACK); + font->RenderText(ul + GG::Pt(-GG::X1, GG::Y0), lr + GG::Pt(-GG::X1, GG::Y0), text, flags); + font->RenderText(ul + GG::Pt( GG::X1, GG::Y0), lr + GG::Pt( GG::X1, GG::Y0), text, flags); + font->RenderText(ul + GG::Pt( GG::X0, -GG::Y1), lr + GG::Pt( GG::X0, -GG::Y1), text, flags); + font->RenderText(ul + GG::Pt( GG::X0, GG::Y1), lr + GG::Pt( GG::X0, GG::Y1), text, flags); + + glColor(GG::CLR_WHITE); + font->RenderText(ul, lr, text, flags); + } + glPopMatrix(); +} + +void MapWnd::RenderVisibilityRadii() { + if (!GetOptionsDB().Get<bool>("UI.show-detection-range")) + return; + + const int STEALTH_THRESHOLD = GetOptionsDB().Get<int>("UI.detection-range-stealth-threshold"); // how much to deduct from detection to compensate for potential target stealth, and also the minimum detection to consider showing + + int client_empire_id = HumanClientApp::GetApp()->EmpireID(); + const std::set<int>& known_destroyed_object_ids = GetUniverse().EmpireKnownDestroyedObjectIDs(client_empire_id); + const ObjectMap& known_objects = GetUniverse().EmpireKnownObjects(client_empire_id); + + // for each map position and empire, find max value of detection range at that position + std::map<std::pair<int, std::pair<double, double> >, double> empire_position_max_detection_ranges; + for (ObjectMap::const_iterator it = known_objects.const_begin(); it != known_objects.const_end(); ++it) { + // skip destroyed objects + int object_id = it->first; + if (known_destroyed_object_ids.find(object_id) != known_destroyed_object_ids.end()) + continue; + + // if this object has the largest yet checked visibility range at this location, update the location's range + const UniverseObject* obj = it->second; + if (const Meter* detection_meter = obj->GetMeter(METER_DETECTION)) { + double X = obj->X(); + double Y = obj->Y(); + double D = detection_meter->Current() - STEALTH_THRESHOLD; + if (D <= 0.0) + continue; // skip objects that don't contribute detection (at the current stealth threshold) + const std::set<int>& owners = obj->Owners(); + for (std::set<int>::const_iterator empire_it = owners.begin(); empire_it != owners.end(); ++empire_it) { + // find this empires entry for this location, if any + std::pair<int, std::pair<double, double> > key = std::make_pair(*empire_it, std::make_pair(X, Y)); + std::map<std::pair<int, std::pair<double, double> >, double>::iterator range_it = empire_position_max_detection_ranges.find(key); + if (range_it != empire_position_max_detection_ranges.end()) { + if (range_it->second < D) range_it->second = D; // update existing entry + } else { + empire_position_max_detection_ranges[key] = D; // add new entry to map + } + } + } + } + + std::map<GG::Clr, std::vector<std::pair<GG::Pt, GG::Pt> >, ClrLess> circles; + for (std::map<std::pair<int, std::pair<double, double> >, double>::const_iterator it = empire_position_max_detection_ranges.begin(); + it != empire_position_max_detection_ranges.end(); ++it) + { + if (const Empire* empire = Empires().Lookup(it->first.first)) { + GG::Clr circle_colour = empire->Color(); + circle_colour.a = 64; + + GG::Pt circle_centre = ScreenCoordsFromUniversePosition(it->first.second.first, it->first.second.second); + double radius = 10.0*it->second*ZoomFactor(); + if (radius < 20.0) + continue; + + GG::Pt ul = circle_centre - GG::Pt(GG::X(static_cast<int>(radius)), GG::Y(static_cast<int>(radius))); + GG::Pt lr = circle_centre + GG::Pt(GG::X(static_cast<int>(radius)), GG::Y(static_cast<int>(radius))); + + circles[circle_colour].push_back(std::make_pair(ul, lr)); + } + } + +#define USE_STENCILS 1 + +#if USE_STENCILS + glPushAttrib(GL_ENABLE_BIT | GL_STENCIL_BUFFER_BIT); + glEnable(GL_STENCIL_TEST); +#endif + + const double TWO_PI = 2.0*3.1415926536; + const GG::Pt UNIT(GG::X1, GG::Y1); + + glLineWidth(1.5); + glPushMatrix(); + glLoadIdentity(); + glEnable(GL_LINE_SMOOTH); + glDisable(GL_TEXTURE_2D); + + for (std::map<GG::Clr, std::vector<std::pair<GG::Pt, GG::Pt> >, ClrLess>::iterator it = circles.begin(); + it != circles.end(); + ++it) { + glClear(GL_STENCIL_BUFFER_BIT); + glStencilOp(GL_INCR, GL_INCR, GL_INCR); + glStencilFunc(GL_EQUAL, 0x0, 0xf); + glColor(it->first); + const std::vector<std::pair<GG::Pt, GG::Pt> >& circles_in_this_colour = it->second; + for (std::size_t i = 0; i < circles_in_this_colour.size(); ++i) + { + CircleArc(circles_in_this_colour[i].first, circles_in_this_colour[i].second, + 0.0, TWO_PI, true); + } + glStencilFunc(GL_GREATER, 0x2, 0xf); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + for (std::size_t i = 0; i < circles_in_this_colour.size(); ++i) + { + CircleArc(circles_in_this_colour[i].first + UNIT, circles_in_this_colour[i].second - UNIT, + 0.0, TWO_PI, false); + } + } + +#if !USE_STENCILS + glEnable(GL_TEXTURE_2D); + glDisable(GL_LINE_SMOOTH); +#endif + glPopMatrix(); + glLineWidth(1.0); + +#if USE_STENCILS + glPopAttrib(); +#endif + +#undef USE_STENCILS +} + void MapWnd::LButtonDown(const GG::Pt &pt, GG::Flags<GG::ModKey> mod_keys) { m_drag_offset = pt - ClientUpperLeft(); @@ -2679,531 +3204,6 @@ GetOptionsDB().Set("UI.detection-range-stealth-threshold", pos); } -void MapWnd::RenderStarfields() -{ - if (!GetOptionsDB().Get<bool>("UI.galaxy-starfields")) - return; - - glColor3d(1.0, 1.0, 1.0); - - GG::Pt origin_offset = - UpperLeft() + GG::Pt(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight()); - glMatrixMode(GL_TEXTURE); - - for (unsigned int i = 0; i < m_backgrounds.size(); ++i) { - float texture_coords_per_pixel_x = static_cast<float>(1.0 / Value(m_backgrounds[i]->Width())); - float texture_coords_per_pixel_y = static_cast<float>(1.0 / Value(m_backgrounds[i]->Height())); - glScalef(Value(texture_coords_per_pixel_x * Width()), - Value(texture_coords_per_pixel_y * Height()), - 1.0); - glTranslatef(Value(-texture_coords_per_pixel_x * origin_offset.x / 16.0 * m_bg_scroll_rate[i]), - Value(-texture_coords_per_pixel_y * origin_offset.y / 16.0 * m_bg_scroll_rate[i]), - 0.0); - glBindTexture(GL_TEXTURE_2D, m_backgrounds[i]->OpenGLId()); - glBegin(GL_QUADS); - glTexCoord2f(0.0, 0.0); - glVertex2i(0, 0); - glTexCoord2f(0.0, 1.0); - glVertex(GG::X0, Height()); - glTexCoord2f(1.0, 1.0); - glVertex(Width(), Height()); - glTexCoord2f(1.0, 0.0); - glVertex(Width(), GG::Y0); - glEnd(); - glLoadIdentity(); - } - - glMatrixMode(GL_MODELVIEW); -} - -void MapWnd::RenderNebulae() -{ - // nebula rendering disabled until we add nebulae worth rendering, which likely - // means for them to have some gameplay purpose and artist-approved way to - // specify what colours or specific nebula images to use - - //glColor4f(1.0, 1.0, 1.0, 1.0); - //glPushMatrix(); - //glLoadIdentity(); - //for (unsigned int i = 0; i < m_nebulae.size(); ++i) { - // int nebula_width = m_nebulae[i]->Width() / 3; // factor of 3 chosen to give ok-seeming nebula sizes for images in use at time of this writing - // int nebula_height = m_nebulae[i]->Height() / 3; - - // GG::Pt ul = - // ClientUpperLeft() + - // GG::Pt(static_cast<int>((m_nebula_centers[i].x - nebula_width / 2.0) * ZoomFactor()), - // static_cast<int>((m_nebula_centers[i].y - nebula_height / 2.0) * ZoomFactor())); - // m_nebulae[i]->OrthoBlit(ul, - // ul + GG::Pt(static_cast<int>(nebula_width * ZoomFactor()), - // static_cast<int>(nebula_height * ZoomFactor()))); - //} - //glPopMatrix(); -} - -void MapWnd::RenderGalaxyGas() -{ - if (!GetOptionsDB().Get<bool>("UI.galaxy-gas-background")) - return; - glColor4f(1.0, 1.0, 1.0, 1.0); - 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) { - glBindTexture(GL_TEXTURE_2D, it->first->OpenGLId()); - glBindBuffer(GL_ARRAY_BUFFER, it->second.m_name); - glVertexPointer(2, GL_FLOAT, 0, 0); - glBindBuffer(GL_ARRAY_BUFFER, m_star_texture_coords.m_name); - glTexCoordPointer(2, GL_FLOAT, 0, 0); - glDrawArrays(GL_QUADS, 0, it->second.m_size); - } -} - -void MapWnd::RenderSystems() -{ - const double HALO_SCALE_FACTOR = SystemHaloScaleFactor(); - int empire_id = HumanClientApp::GetApp()->EmpireID(); - - if (GetOptionsDB().Get<bool>("UI.optimized-system-rendering")) { - glColor4f(1.0, 1.0, 1.0, 1.0); - - if (0.5 < HALO_SCALE_FACTOR) { - glMatrixMode(GL_TEXTURE); - glTranslatef(0.5, 0.5, 0.0); - glScalef(1.0 / HALO_SCALE_FACTOR, 1.0 / HALO_SCALE_FACTOR, 1.0); - glTranslatef(-0.5, -0.5, 0.0); - 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) - { - glBindTexture(GL_TEXTURE_2D, it->first->OpenGLId()); - glBindBuffer(GL_ARRAY_BUFFER, it->second.m_name); - glVertexPointer(2, GL_FLOAT, 0, 0); - glBindBuffer(GL_ARRAY_BUFFER, m_star_texture_coords.m_name); - glTexCoordPointer(2, GL_FLOAT, 0, 0); - glDrawArrays(GL_QUADS, 0, it->second.m_size); - } - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - } - - if (GetOptionsDB().Get<int>("UI.system-tiny-icon-size-threshold") < ZoomFactor() * ClientUI::SystemIconSize()) { - 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) - { - glBindTexture(GL_TEXTURE_2D, it->first->OpenGLId()); - glBindBuffer(GL_ARRAY_BUFFER, it->second.m_name); - glVertexPointer(2, GL_FLOAT, 0, 0); - glBindBuffer(GL_ARRAY_BUFFER, m_star_texture_coords.m_name); - glTexCoordPointer(2, GL_FLOAT, 0, 0); - glDrawArrays(GL_QUADS, 0, it->second.m_size); - } - } - - glBindBuffer(GL_ARRAY_BUFFER, 0); - - } else { - glColor4f(1.0, 1.0, 1.0, 1.0); - glPushMatrix(); - glLoadIdentity(); - for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) - it->second->ManualRender(HALO_SCALE_FACTOR); - glPopMatrix(); - } - - // circles around system icons and fog over unexplored systems - bool circles = GetOptionsDB().Get<bool>("UI.system-circles"); - bool fog_scanlines = false; - float fog_scanline_spacing = 4.0f; - Universe& universe = GetUniverse(); - - if (empire_id != ALL_EMPIRES && GetOptionsDB().Get<bool>("UI.system-fog-of-war")) { - fog_scanlines = true; - fog_scanline_spacing = static_cast<float>(GetOptionsDB().Get<double>("UI.system-fog-of-war-spacing")); - } - - if (fog_scanlines || circles) { - glPushMatrix(); - glLoadIdentity(); - const double TWO_PI = 2.0*3.14159; - glDisable(GL_TEXTURE_2D); - glEnable(GL_LINE_SMOOTH); - glLineWidth(1.5); - glColor(GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr()); - - for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { - const SystemIcon* icon = it->second; - - const int ARC_SIZE = icon->EnclosingCircleDiameter(); - - GG::Pt ul = icon->UpperLeft(), lr = icon->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; - - if (fog_scanlines && m_scanline_shader) { - if (universe.GetObjectVisibilityByEmpire(it->first, empire_id) <= VIS_BASIC_VISIBILITY) { - m_scanline_shader->Use(); - m_scanline_shader->Bind("scanline_spacing", fog_scanline_spacing); - CircleArc(circle_ul, circle_lr, 0.0, TWO_PI, true); - glUseProgram(0); - } - } - - // render circles around systems that have at least one starlane, if circles are enabled. - if (circles) { - if (const System* system = GetEmpireKnownObject<System>(it->first, empire_id)) { - if (system->NumStarlanes() > 0) { - CircleArc(circle_ul, circle_lr, 0.0, TWO_PI, false); - } - } - } - } - - glDisable(GL_LINE_SMOOTH); - glEnable(GL_TEXTURE_2D); - glPopMatrix(); - glLineWidth(1.0); - } -} - -void MapWnd::RenderStarlanes() -{ - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - - bool coloured = GetOptionsDB().Get<bool>("UI.resource-starlane-colouring"); - const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); - - - if (m_starlane_vertices.m_name && (m_starlane_colors.m_name || !coloured)) { - glLineStipple(1, 0xffff); // solid line / no stipple - glLineWidth(GetOptionsDB().Get<double>("UI.starlane-thickness")); - - if (coloured) - glEnableClientState(GL_COLOR_ARRAY); - else - glColor(UNOWNED_LANE_COLOUR); - - glBindBuffer(GL_ARRAY_BUFFER, m_starlane_vertices.m_name); - glVertexPointer(2, GL_FLOAT, 0, 0); - - if (coloured) { - glBindBuffer(GL_ARRAY_BUFFER, m_starlane_colors.m_name); - glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0); - } - - glDrawArrays(GL_LINES, 0, m_starlane_vertices.m_size); - - if (coloured) - glDisableClientState(GL_COLOR_ARRAY); - - glLineWidth(1.0); - } - - if (m_starlane_fleet_supply_vertices.m_name && m_starlane_fleet_supply_colors.m_name && GetOptionsDB().Get<bool>("UI.fleet-supply-lines")) { - // render fleet supply lines - const GLushort PATTERN = 0x8080; // = 1000000010000000 -> widely space small dots - const int GLUSHORT_BIT_LENGTH = sizeof(GLushort) * 8; - const double RATE = 0.1; // slow crawl - const int SHIFT = static_cast<int>(GG::GUI::GetGUI()->Ticks() * RATE / GLUSHORT_BIT_LENGTH) % GLUSHORT_BIT_LENGTH; - const unsigned int STIPPLE = (PATTERN << SHIFT) | (PATTERN >> (GLUSHORT_BIT_LENGTH - SHIFT)); - glLineStipple(static_cast<int>(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")), STIPPLE); - glLineWidth(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")); - glEnableClientState(GL_COLOR_ARRAY); - glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_vertices.m_name); - glVertexPointer(2, GL_FLOAT, 0, 0); - glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_colors.m_name); - glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0); - glDrawArrays(GL_LINES, 0, m_starlane_fleet_supply_vertices.m_size); - glDisableClientState(GL_COLOR_ARRAY); - glLineWidth(1.0); - } - - glEnableClientState(GL_TEXTURE_COORD_ARRAY); -} - -void MapWnd::RenderFleetMovementLines() -{ - if (ZoomFactor() < ClientUI::TinyFleetButtonZoomThreshold()) - return; - - // set common animation shift for move lines - const int MOVE_LINE_DOT_SPACING = GetOptionsDB().Get<int>("UI.fleet-supply-line-dot-spacing"); - const double RATE = GetOptionsDB().Get<double>("UI.fleet-supply-line-dot-rate"); - move_line_animation_shift = static_cast<double>(static_cast<int>(static_cast<double>(GG::GUI::GetGUI()->Ticks()) * RATE) % MOVE_LINE_DOT_SPACING); - - - // render movement lines for all fleets - for (std::map<int, MovementLineData>::const_iterator it = m_fleet_lines.begin(); it != m_fleet_lines.end(); ++it) - RenderMovementLine(it->second); - - // re-render selected fleets' movement lines in white - for (std::set<int>::const_iterator it = m_selected_fleet_ids.begin(); it != m_selected_fleet_ids.end(); ++it) { - int fleet_id = *it; - std::map<int, MovementLineData>::const_iterator line_it = m_fleet_lines.find(fleet_id); - if (line_it != m_fleet_lines.end()) - RenderMovementLine(line_it->second, GG::CLR_WHITE); - } - - // render move line ETA indicators for selected fleets - for (std::set<int>::const_iterator it = m_selected_fleet_ids.begin(); it != m_selected_fleet_ids.end(); ++it) { - int fleet_id = *it; - std::map<int, MovementLineData>::const_iterator line_it = m_fleet_lines.find(fleet_id); - if (line_it != m_fleet_lines.end()) - RenderMovementLineETAIndicators(line_it->second); - } - - // render projected move lines - for (std::map<int, MovementLineData>::const_iterator it = m_projected_fleet_lines.begin(); it != m_projected_fleet_lines.end(); ++it) - RenderMovementLine(it->second, GG::CLR_WHITE); - - // render projected move line ETA indicators - for (std::map<int, MovementLineData>::const_iterator it = m_projected_fleet_lines.begin(); it != m_projected_fleet_lines.end(); ++it) - RenderMovementLineETAIndicators(it->second, GG::CLR_WHITE); -} - -void MapWnd::RenderMovementLine(const MapWnd::MovementLineData& move_line, GG::Clr clr) -{ - const std::vector<MovementLineData::Vertex>& vertices = move_line.vertices; - if (vertices.empty()) - return; // nothing to draw. need at least two nodes at different locations to draw a line - if (vertices.size() % 2 == 1) { - Logger().errorStream() << "RenderMovementLine given an odd number of vertices to render?!"; - return; - } - - glPushMatrix(); - glLoadIdentity(); - - if (clr == GG::CLR_ZERO) { - glColor(move_line.colour); - } else { - glColor(clr); - } - - boost::shared_ptr<GG::Texture> move_line_dot_texture = - ClientUI::GetTexture(ClientUI::ArtDir() / "misc" / "move_line_dot.png"); - GG::Pt texture_half_size = GG::Pt(GG::X(move_line_dot_texture->DefaultWidth() / 2), - GG::Y(move_line_dot_texture->DefaultHeight() / 2)); - const int MOVE_LINE_DOT_SPACING = GetOptionsDB().Get<int>("UI.fleet-supply-line-dot-spacing"); - - double offset = move_line_animation_shift; // step along line in by move_line_animation_shift to get position of first dot - - // blit a series of coloured dots along move path - for (std::vector<MovementLineData::Vertex>::const_iterator verts_it = vertices.begin(); verts_it != vertices.end(); ++verts_it) { - // get next two vertices - const MovementLineData::Vertex& vert1 = *verts_it; - verts_it++; - const MovementLineData::Vertex& vert2 = *verts_it; - - GG::Pt vert1Pt = ScreenCoordsFromUniversePosition(vert1.x, vert1.y) - texture_half_size; - GG::Pt vert2Pt = ScreenCoordsFromUniversePosition(vert2.x, vert2.y) - texture_half_size; - - // get unit vector along line connecting vertices - double deltaX = Value(vert2Pt.x - vert1Pt.x), deltaY = Value(vert2Pt.y - vert1Pt.y); - double length = std::sqrt(deltaX*deltaX + deltaY*deltaY); - if (length == 0.0) // safety check - length = 1.0; - double uVecX = deltaX / length, uVecY = deltaY / length; - - - // increment along line, rendering dots, until end of line segment is passed - while (offset < length) { - // find position of dot from initial vertex position, offset length and unit vectors - std::pair<double, double> ul(Value(vert1Pt.x) + offset * uVecX, - Value(vert1Pt.y) + offset * uVecY); - - // blit texture (appropriately coloured) into place - glBindTexture(GL_TEXTURE_2D, move_line_dot_texture->OpenGLId()); - const GLfloat* tex_coords = move_line_dot_texture->DefaultTexCoords(); - glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(tex_coords[0], tex_coords[1]); - glVertex2f(ul.first, ul.second); - glTexCoord2f(tex_coords[2], tex_coords[1]); - glVertex2f(ul.first + Value(move_line_dot_texture->DefaultWidth()), ul.second); - glTexCoord2f(tex_coords[0], tex_coords[3]); - glVertex2f(ul.first, ul.second + Value(move_line_dot_texture->DefaultHeight())); - glTexCoord2f(tex_coords[2], tex_coords[3]); - glVertex2f(ul.first + Value(move_line_dot_texture->DefaultWidth()), - ul.second + Value(move_line_dot_texture->DefaultHeight())); - glEnd(); - - // move offset to that for next dot - offset += MOVE_LINE_DOT_SPACING; - } - - offset -= length; // so next segment's dots meld smoothly into this segment's - } - glPopMatrix(); -} - -void MapWnd::RenderMovementLineETAIndicators(const MapWnd::MovementLineData& move_line, GG::Clr clr) -{ - const std::vector<MovementLineData::Vertex>& vertices = move_line.vertices; - if (vertices.empty()) - return; // nothing to draw. - - - const double MARKER_HALF_SIZE = 9; - const int MARKER_PTS = ClientUI::Pts(); - boost::shared_ptr<GG::Font> font = ClientUI::GetBoldFont(MARKER_PTS); - const double TWO_PI = 2.0*3.1415926536; - GG::Flags<GG::TextFormat> flags = GG::FORMAT_CENTER | GG::FORMAT_VCENTER; - - glPushMatrix(); - glLoadIdentity(); - for (std::vector<MovementLineData::Vertex>::const_iterator verts_it = vertices.begin(); verts_it != vertices.end(); ++verts_it) { - const MovementLineData::Vertex& vert = *verts_it; - if (!vert.show_eta) - continue; - - - // draw background disc in empire colour, or passed-in colour - GG::Pt marker_centre = ScreenCoordsFromUniversePosition(vert.x, vert.y); - - if (clr == GG::CLR_ZERO) - glColor(move_line.colour); - else - glColor(clr); - - GG::Pt ul = marker_centre - GG::Pt(GG::X(static_cast<int>(MARKER_HALF_SIZE)), GG::Y(static_cast<int>(MARKER_HALF_SIZE))); - GG::Pt lr = marker_centre + GG::Pt(GG::X(static_cast<int>(MARKER_HALF_SIZE)), GG::Y(static_cast<int>(MARKER_HALF_SIZE))); - - glDisable(GL_TEXTURE_2D); - CircleArc(ul, lr, 0.0, TWO_PI, true); - glEnable(GL_TEXTURE_2D); - - - // render ETA number in white with black shadows - std::string text = boost::lexical_cast<std::string>(vert.eta); - - glColor(GG::CLR_BLACK); - font->RenderText(ul + GG::Pt(-GG::X1, GG::Y0), lr + GG::Pt(-GG::X1, GG::Y0), text, flags); - font->RenderText(ul + GG::Pt( GG::X1, GG::Y0), lr + GG::Pt( GG::X1, GG::Y0), text, flags); - font->RenderText(ul + GG::Pt( GG::X0, -GG::Y1), lr + GG::Pt( GG::X0, -GG::Y1), text, flags); - font->RenderText(ul + GG::Pt( GG::X0, GG::Y1), lr + GG::Pt( GG::X0, GG::Y1), text, flags); - - glColor(GG::CLR_WHITE); - font->RenderText(ul, lr, text, flags); - } - glPopMatrix(); -} - -void MapWnd::RenderVisibilityRadii() { - if (!GetOptionsDB().Get<bool>("UI.show-detection-range")) - return; - - const int STEALTH_THRESHOLD = GetOptionsDB().Get<int>("UI.detection-range-stealth-threshold"); // how much to deduct from detection to compensate for potential target stealth, and also the minimum detection to consider showing - - int client_empire_id = HumanClientApp::GetApp()->EmpireID(); - const std::set<int>& known_destroyed_object_ids = GetUniverse().EmpireKnownDestroyedObjectIDs(client_empire_id); - const ObjectMap& known_objects = GetUniverse().EmpireKnownObjects(client_empire_id); - - // for each map position and empire, find max value of detection range at that position - std::map<std::pair<int, std::pair<double, double> >, double> empire_position_max_detection_ranges; - for (ObjectMap::const_iterator it = known_objects.const_begin(); it != known_objects.const_end(); ++it) { - // skip destroyed objects - int object_id = it->first; - if (known_destroyed_object_ids.find(object_id) != known_destroyed_object_ids.end()) - continue; - - // if this object has the largest yet checked visibility range at this location, update the location's range - const UniverseObject* obj = it->second; - if (const Meter* detection_meter = obj->GetMeter(METER_DETECTION)) { - double X = obj->X(); - double Y = obj->Y(); - double D = detection_meter->Current() - STEALTH_THRESHOLD; - if (D <= 0.0) - continue; // skip objects that don't contribute detection (at the current stealth threshold) - const std::set<int>& owners = obj->Owners(); - for (std::set<int>::const_iterator empire_it = owners.begin(); empire_it != owners.end(); ++empire_it) { - // find this empires entry for this location, if any - std::pair<int, std::pair<double, double> > key = std::make_pair(*empire_it, std::make_pair(X, Y)); - std::map<std::pair<int, std::pair<double, double> >, double>::iterator range_it = empire_position_max_detection_ranges.find(key); - if (range_it != empire_position_max_detection_ranges.end()) { - if (range_it->second < D) range_it->second = D; // update existing entry - } else { - empire_position_max_detection_ranges[key] = D; // add new entry to map - } - } - } - } - - std::map<GG::Clr, std::vector<std::pair<GG::Pt, GG::Pt> >, ClrLess> circles; - for (std::map<std::pair<int, std::pair<double, double> >, double>::const_iterator it = empire_position_max_detection_ranges.begin(); - it != empire_position_max_detection_ranges.end(); ++it) - { - if (const Empire* empire = Empires().Lookup(it->first.first)) { - GG::Clr circle_colour = empire->Color(); - circle_colour.a = 64; - - GG::Pt circle_centre = ScreenCoordsFromUniversePosition(it->first.second.first, it->first.second.second); - double radius = 10.0*it->second*ZoomFactor(); - if (radius < 20.0) - continue; - - GG::Pt ul = circle_centre - GG::Pt(GG::X(static_cast<int>(radius)), GG::Y(static_cast<int>(radius))); - GG::Pt lr = circle_centre + GG::Pt(GG::X(static_cast<int>(radius)), GG::Y(static_cast<int>(radius))); - - circles[circle_colour].push_back(std::make_pair(ul, lr)); - } - } - -#define USE_STENCILS 1 - -#if USE_STENCILS - glPushAttrib(GL_ENABLE_BIT | GL_STENCIL_BUFFER_BIT); - glEnable(GL_STENCIL_TEST); -#endif - - const double TWO_PI = 2.0*3.1415926536; - const GG::Pt UNIT(GG::X1, GG::Y1); - - glLineWidth(1.5); - glPushMatrix(); - glLoadIdentity(); - glEnable(GL_LINE_SMOOTH); - glDisable(GL_TEXTURE_2D); - - for (std::map<GG::Clr, std::vector<std::pair<GG::Pt, GG::Pt> >, ClrLess>::iterator it = circles.begin(); - it != circles.end(); - ++it) { - glClear(GL_STENCIL_BUFFER_BIT); - glStencilOp(GL_INCR, GL_INCR, GL_INCR); - glStencilFunc(GL_EQUAL, 0x0, 0xf); - glColor(it->first); - const std::vector<std::pair<GG::Pt, GG::Pt> >& circles_in_this_colour = it->second; - for (std::size_t i = 0; i < circles_in_this_colour.size(); ++i) - { - CircleArc(circles_in_this_colour[i].first, circles_in_this_colour[i].second, - 0.0, TWO_PI, true); - } - glStencilFunc(GL_GREATER, 0x2, 0xf); - glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); - for (std::size_t i = 0; i < circles_in_this_colour.size(); ++i) - { - CircleArc(circles_in_this_colour[i].first + UNIT, circles_in_this_colour[i].second - UNIT, - 0.0, TWO_PI, false); - } - } - -#if !USE_STENCILS - glEnable(GL_TEXTURE_2D); - glDisable(GL_LINE_SMOOTH); -#endif - glPopMatrix(); - glLineWidth(1.0); - -#if USE_STENCILS - glPopAttrib(); -#endif - -#undef USE_STENCILS -} - void MapWnd::CorrectMapPosition(GG::Pt &move_to_pt) { GG::X contents_width(static_cast<int>(ZoomFactor() * Universe::UniverseWidth())); |
From: <geo...@us...> - 2010-05-05 08:52:05
|
Revision: 3576 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3576&view=rev Author: geoffthemedio Date: 2010-05-05 08:51:58 +0000 (Wed, 05 May 2010) Log Message: ----------- Seemingly fixed OpenGL crash on glBindBuffer in MapWnd::RenderStarlanes (quickstart new game, click fleet button, click sitrep button, click sitrep to bring to top of stack, click empty part of map) by wrapping changes in client rendering state in push and pop pairs in MapWnd::Render and MapWnd::RenderSystems. This also seems to have fixed bug 2996793 : "Fleets Window Close X Not Rendered If SidePanel Not Open" for me. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-05-05 08:02:16 UTC (rev 3575) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-05-05 08:51:58 UTC (rev 3576) @@ -841,6 +841,7 @@ if (m_design_wnd->Visible()) return; // as of this writing, the design screen has a fully opaque background + glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); RenderStarfields(); @@ -859,25 +860,24 @@ RenderVisibilityRadii(); glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisable(GL_TEXTURE_2D); glEnable(GL_LINE_SMOOTH); glEnable(GL_LINE_STIPPLE); + RenderStarlanes(); + + glDisable(GL_LINE_STIPPLE); + glDisable(GL_LINE_SMOOTH); glEnable(GL_TEXTURE_2D); - glDisable(GL_LINE_SMOOTH); - glDisable(GL_LINE_STIPPLE); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glLineWidth(1.0); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - RenderSystems(); RenderFleetMovementLines(); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_VERTEX_ARRAY); - glPopMatrix(); + glPopClientAttrib(); } void MapWnd::RenderStarfields() @@ -1082,23 +1082,28 @@ glLineStipple(1, 0xffff); // solid line / no stipple glLineWidth(GetOptionsDB().Get<double>("UI.starlane-thickness")); - //if (coloured) - // glEnableClientState(GL_COLOR_ARRAY); - //else + glPushAttrib(GL_COLOR_BUFFER_BIT); + glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + + glEnableClientState(GL_VERTEX_ARRAY); + + if (coloured) + glEnableClientState(GL_COLOR_ARRAY); + else glColor(UNOWNED_LANE_COLOUR); glBindBuffer(GL_ARRAY_BUFFER, m_starlane_vertices.m_name); glVertexPointer(2, GL_FLOAT, 0, 0); - //if (coloured) { - // glBindBuffer(GL_ARRAY_BUFFER, m_starlane_colors.m_name); - // glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0); - //} + if (coloured) { + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_colors.m_name); + glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0); + } glDrawArrays(GL_LINES, 0, m_starlane_vertices.m_size); - //if (coloured) - // glDisableClientState(GL_COLOR_ARRAY); + glPopClientAttrib(); + glPopAttrib(); glLineWidth(1.0); } |
From: <geo...@us...> - 2010-05-07 06:06:59
|
Revision: 3580 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3580&view=rev Author: geoffthemedio Date: 2010-05-07 06:06:53 +0000 (Fri, 07 May 2010) Log Message: ----------- Copied some common GL state setting and restoring code in MapWnd rendering functions into individual map part rendering functions to make their use more flexible and less order-dependent. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-05-07 02:50:55 UTC (rev 3579) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-05-07 06:06:53 UTC (rev 3580) @@ -846,33 +846,17 @@ RenderStarfields(); GG::Pt origin_offset = UpperLeft() + GG::Pt(GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight()); + glPushMatrix(); glLoadIdentity(); + glScalef(static_cast<GLfloat>(ZoomFactor()), static_cast<GLfloat>(ZoomFactor()), 1.0f); glTranslatef(static_cast<GLfloat>(Value(origin_offset.x / ZoomFactor())), static_cast<GLfloat>(Value(origin_offset.y / ZoomFactor())), 0.0f); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - RenderGalaxyGas(); RenderNebulae(); - RenderVisibilityRadii(); - - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisable(GL_TEXTURE_2D); - glEnable(GL_LINE_SMOOTH); - glEnable(GL_LINE_STIPPLE); - RenderStarlanes(); - - glDisable(GL_LINE_STIPPLE); - glDisable(GL_LINE_SMOOTH); - glEnable(GL_TEXTURE_2D); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - - glLineWidth(1.0); - RenderSystems(); RenderFleetMovementLines(); @@ -922,7 +906,11 @@ // nebula rendering disabled until we add nebulae worth rendering, which likely // means for them to have some gameplay purpose and artist-approved way to // specify what colours or specific nebula images to use - + // + //glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + //glEnableClientState(GL_VERTEX_ARRAY); + //glEnableClientState(GL_TEXTURE_COORD_ARRAY); + // //glColor4f(1.0, 1.0, 1.0, 1.0); //glPushMatrix(); //glLoadIdentity(); @@ -939,6 +927,8 @@ // static_cast<int>(nebula_height * ZoomFactor()))); //} //glPopMatrix(); + //glDisableClientState(GL_TEXTURE_COORD_ARRAY); + //glPopClientAttrib(); } void MapWnd::RenderGalaxyGas() @@ -946,6 +936,11 @@ if (!GetOptionsDB().Get<bool>("UI.galaxy-gas-background")) return; glColor4f(1.0, 1.0, 1.0, 1.0); + + glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + 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) @@ -957,6 +952,9 @@ glTexCoordPointer(2, GL_FLOAT, 0, 0); glDrawArrays(GL_QUADS, 0, it->second.m_size); } + + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glPopClientAttrib(); } void MapWnd::RenderSystems() @@ -964,6 +962,11 @@ const double HALO_SCALE_FACTOR = SystemHaloScaleFactor(); int empire_id = HumanClientApp::GetApp()->EmpireID(); + glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + if (GetOptionsDB().Get<bool>("UI.optimized-system-rendering")) { glColor4f(1.0, 1.0, 1.0, 1.0); @@ -1070,6 +1073,9 @@ glPopMatrix(); glLineWidth(1.0); } + + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glPopClientAttrib(); } void MapWnd::RenderStarlanes() @@ -1079,12 +1085,15 @@ if (m_starlane_vertices.m_name && (m_starlane_colors.m_name || !coloured)) { const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); + glDisable(GL_TEXTURE_2D); + glEnable(GL_LINE_SMOOTH); + glEnable(GL_LINE_STIPPLE); + + glLineWidth(GetOptionsDB().Get<double>("UI.starlane-thickness")); glLineStipple(1, 0xffff); // solid line / no stipple - glLineWidth(GetOptionsDB().Get<double>("UI.starlane-thickness")); glPushAttrib(GL_COLOR_BUFFER_BIT); glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); - glEnableClientState(GL_VERTEX_ARRAY); if (coloured) @@ -1102,10 +1111,14 @@ glDrawArrays(GL_LINES, 0, m_starlane_vertices.m_size); + glLineWidth(1.0); + glPopClientAttrib(); glPopAttrib(); - glLineWidth(1.0); + glEnable(GL_TEXTURE_2D); + glDisable(GL_LINE_SMOOTH); + glDisable(GL_LINE_STIPPLE); } if (m_starlane_fleet_supply_vertices.m_name && m_starlane_fleet_supply_colors.m_name && GetOptionsDB().Get<bool>("UI.fleet-supply-lines")) { @@ -1117,15 +1130,23 @@ const unsigned int STIPPLE = (PATTERN << SHIFT) | (PATTERN >> (GLUSHORT_BIT_LENGTH - SHIFT)); glLineStipple(static_cast<int>(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")), STIPPLE); glLineWidth(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")); + + glPushAttrib(GL_COLOR_BUFFER_BIT); + glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_vertices.m_name); glVertexPointer(2, GL_FLOAT, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, m_starlane_fleet_supply_colors.m_name); glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0); glDrawArrays(GL_LINES, 0, m_starlane_fleet_supply_vertices.m_size); - glDisableClientState(GL_COLOR_ARRAY); - glLineWidth(1.0); + + glPopClientAttrib(); + glPopAttrib(); } + + glLineWidth(1.0); } void MapWnd::RenderFleetMovementLines() @@ -1355,6 +1376,10 @@ } } + + glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + glEnableClientState(GL_VERTEX_ARRAY); + #define USE_STENCILS 1 #if USE_STENCILS @@ -1397,6 +1422,7 @@ glEnable(GL_TEXTURE_2D); glDisable(GL_LINE_SMOOTH); #endif + glPopMatrix(); glLineWidth(1.0); @@ -1405,6 +1431,8 @@ #endif #undef USE_STENCILS + + glPopClientAttrib(); } void MapWnd::LButtonDown(const GG::Pt &pt, GG::Flags<GG::ModKey> mod_keys) |
From: <geo...@us...> - 2010-05-07 06:23:44
|
Revision: 3581 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3581&view=rev Author: geoffthemedio Date: 2010-05-07 06:23:38 +0000 (Fri, 07 May 2010) Log Message: ----------- -Fixed fleet supply line rendering that I broke in a recent commit -Made page size of stealth threshold slider 1 to allow easier tweaking of small changes in threshold, which make a big different in the apparent radius shown Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-05-07 06:06:53 UTC (rev 3580) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-05-07 06:23:38 UTC (rev 3581) @@ -639,6 +639,7 @@ m_stealth_threshold_slider = new CUISlider(m_zoom_slider->UpperLeft().x + GG::X(ClientUI::ScrollWidth()*3), m_zoom_slider->UpperLeft().y, GG::X(ClientUI::ScrollWidth()), ZOOM_SLIDER_HEIGHT, 0, 100, GG::VERTICAL); + m_stealth_threshold_slider->SetPageSize(1); m_stealth_threshold_slider->SlideTo(GetOptionsDB().Get<int>("UI.detection-range-stealth-threshold")); @@ -1128,6 +1129,11 @@ const double RATE = 0.1; // slow crawl const int SHIFT = static_cast<int>(GG::GUI::GetGUI()->Ticks() * RATE / GLUSHORT_BIT_LENGTH) % GLUSHORT_BIT_LENGTH; const unsigned int STIPPLE = (PATTERN << SHIFT) | (PATTERN >> (GLUSHORT_BIT_LENGTH - SHIFT)); + + glDisable(GL_TEXTURE_2D); + glEnable(GL_LINE_SMOOTH); + glEnable(GL_LINE_STIPPLE); + glLineStipple(static_cast<int>(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")), STIPPLE); glLineWidth(GetOptionsDB().Get<double>("UI.fleet-supply-line-width")); @@ -1144,6 +1150,10 @@ glPopClientAttrib(); glPopAttrib(); + + glEnable(GL_TEXTURE_2D); + glDisable(GL_LINE_SMOOTH); + glDisable(GL_LINE_STIPPLE); } glLineWidth(1.0); |
From: <geo...@us...> - 2010-08-22 22:34:21
|
Revision: 3751 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3751&view=rev Author: geoffthemedio Date: 2010-08-22 22:34:14 +0000 (Sun, 22 Aug 2010) Log Message: ----------- Tweaked default position and size of sitrep and pedia panels. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-08-22 16:47:45 UTC (rev 3750) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-08-22 22:34:14 UTC (rev 3751) @@ -50,7 +50,7 @@ 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 GG::X SITREP_PANEL_WIDTH(400); - const GG::Y SITREP_PANEL_HEIGHT(300); + const GG::Y SITREP_PANEL_HEIGHT(200); const GG::Y ZOOM_SLIDER_HEIGHT(200); const GG::Y SCALE_LINE_HEIGHT(20); const GG::X SCALE_LINE_MAX_WIDTH(200); @@ -576,7 +576,7 @@ // situation report window - m_sitrep_panel = new SitRepPanel( (APP_WIDTH-SITREP_PANEL_WIDTH)/2, GG::Y0, SITREP_PANEL_WIDTH, SITREP_PANEL_HEIGHT ); + m_sitrep_panel = new SitRepPanel(GG::X0, GG::Y0, 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 GG::GUI::GetGUI()->Register(m_sitrep_panel); m_sitrep_panel->Hide(); @@ -682,9 +682,9 @@ // Encyclo"pedia" button button_width = font->TextExtent(UserString("MAP_BTN_PEDIA")).x + BUTTON_TOTAL_MARGIN; - m_btn_pedia = new SettableInWindowCUIButton(m_btn_menu->UpperLeft().x-LAYOUT_MARGIN-button_width, - GG::Y(LAYOUT_MARGIN), - button_width, UserString("MAP_BTN_PEDIA") ); + m_btn_pedia = new SettableInWindowCUIButton(m_btn_menu->UpperLeft().x - LAYOUT_MARGIN-button_width, + GG::Y(LAYOUT_MARGIN), + button_width, UserString("MAP_BTN_PEDIA") ); m_toolbar->AttachChild(m_btn_pedia); GG::Connect(m_btn_pedia->ClickedSignal, BoolToVoidAdapter(boost::bind(&MapWnd::TogglePedia, this))); in_window_func = @@ -809,6 +809,7 @@ { delete m_toolbar; delete m_sitrep_panel; + delete m_pedia_panel; delete m_research_wnd; delete m_production_wnd; delete m_design_wnd; @@ -3661,10 +3662,13 @@ 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_side_panel->SizeMove(sp_ul, sp_lr); - m_sitrep_panel->MoveTo(GG::Pt((APP_WIDTH - SITREP_PANEL_WIDTH) / 2, (APP_HEIGHT - SITREP_PANEL_HEIGHT) / 2)); + m_sitrep_panel->MoveTo(GG::Pt(SCALE_LINE_MAX_WIDTH + LAYOUT_MARGIN, m_toolbar->LowerRight().y)); m_sitrep_panel->Resize(GG::Pt(SITREP_PANEL_WIDTH, SITREP_PANEL_HEIGHT)); + + m_pedia_panel->MoveTo(GG::Pt(m_sitrep_panel->UpperLeft().x, m_sitrep_panel->LowerRight().y)); + MoveTo(GG::Pt(-APP_WIDTH, -APP_HEIGHT)); m_zoom_steps_in = 0.0; m_research_wnd->Sanitize(); |
From: <geo...@us...> - 2010-08-25 20:21:32
|
Revision: 3761 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3761&view=rev Author: geoffthemedio Date: 2010-08-25 20:21:24 +0000 (Wed, 25 Aug 2010) Log Message: ----------- Fixed some problems with the map scale line. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-08-25 16:07:10 UTC (rev 3760) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-08-25 20:21:24 UTC (rev 3761) @@ -53,7 +53,7 @@ const GG::Y SITREP_PANEL_HEIGHT(200); const GG::Y ZOOM_SLIDER_HEIGHT(200); const GG::Y SCALE_LINE_HEIGHT(20); - const GG::X SCALE_LINE_MAX_WIDTH(200); + const GG::X SCALE_LINE_MAX_WIDTH(240); const int MIN_SYSTEM_NAME_SIZE = 10; const int LAYOUT_MARGIN = 5; const GG::Y TOOLBAR_HEIGHT(30); @@ -243,7 +243,7 @@ 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_line_length(GG::X1), m_label(0), m_enabled(false) { @@ -259,9 +259,8 @@ // 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; + GG::Pt lr = ul + GG::Pt(m_line_length, Height()); + glColor(GG::CLR_WHITE); glLineWidth(2.0); @@ -293,7 +292,6 @@ // 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 @@ -308,12 +306,12 @@ shown_length *= 2.0; // determine end of drawn scale line - m_line_right_x = GG::X(static_cast<int>(shown_length * m_scale_factor)); + m_line_length = GG::X(static_cast<int>(shown_length * m_scale_factor)); // update text std::string label_text = boost::io::str(FlexibleFormat(UserString("MAP_SCALE_INDICATOR")) % boost::lexical_cast<std::string>(shown_length)); - m_label->Resize(GG::Pt(GG::X(m_line_right_x), Height())); + m_label->Resize(GG::Pt(GG::X(m_line_length), Height())); m_label->SetText(label_text); } private: @@ -325,7 +323,7 @@ DetachChild(m_label); } double m_scale_factor; - GG::X m_line_right_x; + GG::X m_line_length; GG::TextControl* m_label; bool m_enabled; }; @@ -3380,7 +3378,7 @@ if (m_scale_line) m_scale_line->Update(ZoomFactor()); if (update_slide && m_zoom_slider) - m_zoom_slider->SlideTo(m_zoom_steps_in); + m_zoom_slider->SlideTo(static_cast<int>(m_zoom_steps_in)); ZoomedSignal(ZoomFactor()); } @@ -3837,7 +3835,6 @@ bool MapWnd::EndTurn() { Logger().debugStream() << "MapWnd::EndTurn"; - Cleanup(); HumanClientApp::GetApp()->StartTurn(); return true; } |
From: <geo...@us...> - 2010-08-25 21:31:39
|
Revision: 3762 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3762&view=rev Author: geoffthemedio Date: 2010-08-25 21:31:33 +0000 (Wed, 25 Aug 2010) Log Message: ----------- Made scale line a child of mapwnd and not of the toolbar, so that it doesn't cover up other wnds such as the production or research screens when they are open. Also added appropriate position adjustments to ensure it stays in place on the screen when the map is dragged or zoomed. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-08-25 20:21:24 UTC (rev 3761) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-08-25 21:31:33 UTC (rev 3762) @@ -646,7 +646,7 @@ // 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); + AttachChild(m_scale_line); m_scale_line->Update(ZoomFactor()); @@ -1582,6 +1582,9 @@ GG::Pt move_to_pt = pt - m_drag_offset; CorrectMapPosition(move_to_pt); + GG::Pt final_move = move_to_pt - ClientUpperLeft(); + m_scale_line->OffsetMove(-final_move); + MoveTo(move_to_pt - GG::Pt(AppWidth(), AppHeight())); m_dragged = true; } @@ -1747,6 +1750,9 @@ RefreshFleetSignals(); + MoveChildUp(m_scale_line); + + // 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))); @@ -2451,9 +2457,10 @@ GG::Pt ul = ClientUpperLeft(); GG::X_d current_x = (AppWidth() / 2 - ul.x) / ZoomFactor(); GG::Y_d current_y = (AppHeight() / 2 - ul.y) / ZoomFactor(); - GG::Pt map_move = GG::Pt(static_cast<GG::X>((current_x - x) * ZoomFactor()), + GG::Pt map_move = GG::Pt(static_cast<GG::X>((current_x - x) * ZoomFactor()), static_cast<GG::Y>((current_y - y) * ZoomFactor())); OffsetMove(map_move); + m_scale_line->OffsetMove(-map_move); // this correction ensures that the centering doesn't leave too large a margin to the side GG::Pt move_to_pt = ul = ClientUpperLeft(); @@ -2461,6 +2468,7 @@ GG::Pt final_move = move_to_pt - ul; MoveTo(move_to_pt - GG::Pt(AppWidth(), AppHeight())); + m_scale_line->OffsetMove(-final_move); } void MapWnd::ShowTech(const std::string& tech_name) @@ -3366,14 +3374,16 @@ 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)); OffsetMove(map_move); + m_scale_line->OffsetMove(-map_move); // this correction ensures that zooming in doesn't leave too large a margin to the side GG::Pt move_to_pt = ul = ClientUpperLeft(); CorrectMapPosition(move_to_pt); GG::Pt final_move = move_to_pt - ul; - m_side_panel->OffsetMove(-final_move); + m_scale_line->OffsetMove(-final_move); MoveTo(move_to_pt - GG::Pt(AppWidth(), AppHeight())); + m_scale_line->OffsetMove(-final_move); if (m_scale_line) m_scale_line->Update(ZoomFactor()); |
From: <geo...@us...> - 2010-08-26 01:31:43
|
Revision: 3764 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3764&view=rev Author: geoffthemedio Date: 2010-08-26 01:31:37 +0000 (Thu, 26 Aug 2010) Log Message: ----------- More tweaking of scale line positioning. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-08-25 22:44:38 UTC (rev 3763) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-08-26 01:31:37 UTC (rev 3764) @@ -644,8 +644,8 @@ // 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_scale_line = new MapScaleLine(GG::X(LAYOUT_MARGIN), GG::Y(LAYOUT_MARGIN) + TOOLBAR_HEIGHT, + SCALE_LINE_MAX_WIDTH, SCALE_LINE_HEIGHT); AttachChild(m_scale_line); m_scale_line->Update(ZoomFactor()); @@ -835,6 +835,8 @@ { m_toolbar->Resize(GG::Pt(AppWidth(), TOOLBAR_HEIGHT)); + m_scale_line->MoveTo(GG::Pt(GG::X(LAYOUT_MARGIN), GG::Y(LAYOUT_MARGIN) + TOOLBAR_HEIGHT) - ClientUpperLeft()); + boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); const GG::X BUTTON_TOTAL_MARGIN(8); const GG::Y BUTTON_TOP(LAYOUT_MARGIN); @@ -842,7 +844,7 @@ // menu button - GG::X right = m_toolbar->LowerRight().x - GG::X(LAYOUT_MARGIN); + GG::X right = m_toolbar->LowerRight().x - GG::X(LAYOUT_MARGIN) - m_toolbar->UpperLeft().x; GG::X width = font->TextExtent(UserString("MAP_BTN_MENU")).x + BUTTON_TOTAL_MARGIN; GG::X left = right - width; m_btn_menu->SizeMove(GG::Pt(left, BUTTON_TOP), GG::Pt(right, BUTTON_BOTTOM)); @@ -3380,7 +3382,6 @@ GG::Pt move_to_pt = ul = ClientUpperLeft(); CorrectMapPosition(move_to_pt); GG::Pt final_move = move_to_pt - ul; - m_scale_line->OffsetMove(-final_move); MoveTo(move_to_pt - GG::Pt(AppWidth(), AppHeight())); m_scale_line->OffsetMove(-final_move); |
From: <geo...@us...> - 2010-08-30 05:55:57
|
Revision: 3779 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3779&view=rev Author: geoffthemedio Date: 2010-08-30 05:55:51 +0000 (Mon, 30 Aug 2010) Log Message: ----------- -Made MapScaleLine and zoom and stealth threshold sliders ONTOP, and made them not childs of the MapWnd or toolbar, but instead separately-registered Wnds. -Accordingly removed the offset moving code that corrected their positions after the map was dragged. -This all helps ensure they are properly deleted, and not double-deleted, when the MapWnd is destructed. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-08-30 03:32:55 UTC (rev 3778) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-08-30 05:55:51 UTC (rev 3779) @@ -241,7 +241,7 @@ 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>()), + GG::Control(x, y, w, h, GG::ONTOP), m_scale_factor(1.0), m_line_length(GG::X1), m_label(0), @@ -641,13 +641,15 @@ // FPS indicator m_FPS = new FPSIndicator(m_turn_update->LowerRight().x + LAYOUT_MARGIN, m_turn_update->UpperLeft().y); m_toolbar->AttachChild(m_FPS); + m_FPS->Hide(); // Zoom scale line m_scale_line = new MapScaleLine(GG::X(LAYOUT_MARGIN), GG::Y(LAYOUT_MARGIN) + TOOLBAR_HEIGHT, SCALE_LINE_MAX_WIDTH, SCALE_LINE_HEIGHT); - AttachChild(m_scale_line); + GG::GUI::GetGUI()->Register(m_scale_line); m_scale_line->Update(ZoomFactor()); + m_scale_line->Hide(); // Zoom slider @@ -655,18 +657,20 @@ ZOOM_SLIDER_MAX = static_cast<int>(ZOOM_IN_MAX_STEPS); 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); + ZOOM_SLIDER_MIN, ZOOM_SLIDER_MAX, GG::VERTICAL, GG::INTERACTIVE | GG::ONTOP); m_zoom_slider->SlideTo(static_cast<int>(m_zoom_steps_in)); + GG::GUI::GetGUI()->Register(m_zoom_slider); + // stealth threshold slider m_stealth_threshold_slider = new CUISlider(m_zoom_slider->UpperLeft().x + GG::X(ClientUI::ScrollWidth()*3), m_zoom_slider->UpperLeft().y, GG::X(ClientUI::ScrollWidth()), ZOOM_SLIDER_HEIGHT, - 0, 100, GG::VERTICAL); + 0, 100, GG::VERTICAL, GG::INTERACTIVE | GG::ONTOP); m_stealth_threshold_slider->SetPageSize(1); m_stealth_threshold_slider->SlideTo(GetOptionsDB().Get<int>("UI.detection-range-stealth-threshold")); + GG::GUI::GetGUI()->Register(m_stealth_threshold_slider); - RefreshSliders(); GG::Connect(m_zoom_slider->SlidSignal, &MapWnd::ZoomSlid, this); GG::Connect(m_stealth_threshold_slider->SlidSignal, &MapWnd::StealthSlid, this); GG::Connect(GetOptionsDB().OptionChangedSignal("UI.show-galaxy-map-zoom-slider"), &MapWnd::RefreshSliders, this); @@ -828,6 +832,9 @@ MapWnd::~MapWnd() { delete m_toolbar; + delete m_scale_line; + delete m_zoom_slider; + delete m_stealth_threshold_slider; delete m_sitrep_panel; delete m_pedia_panel; delete m_research_wnd; @@ -840,8 +847,6 @@ { m_toolbar->Resize(GG::Pt(AppWidth(), TOOLBAR_HEIGHT)); - m_scale_line->MoveTo(GG::Pt(GG::X(LAYOUT_MARGIN), GG::Y(LAYOUT_MARGIN) + TOOLBAR_HEIGHT) - ClientUpperLeft()); - boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); const GG::X BUTTON_TOTAL_MARGIN(8); const GG::Y BUTTON_TOP(LAYOUT_MARGIN); @@ -1589,9 +1594,6 @@ GG::Pt move_to_pt = pt - m_drag_offset; CorrectMapPosition(move_to_pt); - GG::Pt final_move = move_to_pt - ClientUpperLeft(); - m_scale_line->OffsetMove(-final_move); - MoveTo(move_to_pt - GG::Pt(AppWidth(), AppHeight())); m_dragged = true; } @@ -1768,9 +1770,6 @@ RefreshFleetSignals(); - MoveChildUp(m_scale_line); - - // 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))); @@ -1808,6 +1807,8 @@ m_toolbar->Show(); m_FPS->Show(); + m_scale_line->Show(); + RefreshSliders(); timer.restart(); @@ -2498,15 +2499,12 @@ GG::Pt map_move = GG::Pt(static_cast<GG::X>((current_x - x) * ZoomFactor()), static_cast<GG::Y>((current_y - y) * ZoomFactor())); OffsetMove(map_move); - m_scale_line->OffsetMove(-map_move); // this correction ensures that the centering doesn't leave too large a margin to the side GG::Pt move_to_pt = ul = ClientUpperLeft(); CorrectMapPosition(move_to_pt); - GG::Pt final_move = move_to_pt - ul; MoveTo(move_to_pt - GG::Pt(AppWidth(), AppHeight())); - m_scale_line->OffsetMove(-final_move); } void MapWnd::ShowTech(const std::string& tech_name) @@ -3301,17 +3299,17 @@ void MapWnd::RefreshSliders() { - if (m_zoom_slider && m_toolbar) { + if (m_zoom_slider) { if (GetOptionsDB().Get<bool>("UI.show-galaxy-map-zoom-slider")) - m_toolbar->AttachChild(m_zoom_slider); + m_zoom_slider->Show(); else - m_toolbar->DetachChild(m_zoom_slider); + m_zoom_slider->Hide(); } - if (m_stealth_threshold_slider && m_toolbar) { + if (m_stealth_threshold_slider) { if (GetOptionsDB().Get<bool>("UI.show-stealth-threshold-slider")) - m_toolbar->AttachChild(m_stealth_threshold_slider); + m_stealth_threshold_slider->Show(); else - m_toolbar->DetachChild(m_stealth_threshold_slider); + m_stealth_threshold_slider->Hide(); } } @@ -3412,15 +3410,12 @@ 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)); OffsetMove(map_move); - m_scale_line->OffsetMove(-map_move); // this correction ensures that zooming in doesn't leave too large a margin to the side GG::Pt move_to_pt = ul = ClientUpperLeft(); CorrectMapPosition(move_to_pt); - GG::Pt final_move = move_to_pt - ul; MoveTo(move_to_pt - GG::Pt(AppWidth(), AppHeight())); - m_scale_line->OffsetMove(-final_move); if (m_scale_line) m_scale_line->Update(ZoomFactor()); @@ -3770,8 +3765,12 @@ HideProduction(); HideDesign(); HideSitRep(); + HidePedia(); m_toolbar->Hide(); m_FPS->Hide(); + m_scale_line->Hide(); + m_zoom_slider->Hide(); + m_stealth_threshold_slider->Hide(); } void MapWnd::Sanitize() |
From: <geo...@us...> - 2010-12-19 07:13:30
|
Revision: 3891 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3891&view=rev Author: geoffthemedio Date: 2010-12-19 07:13:23 +0000 (Sun, 19 Dec 2010) Log Message: ----------- Used GG::Layout to re-do layout of menu / turn buttons and empire resource statistic icons on toolbar. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-12-18 20:18:35 UTC (rev 3890) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-12-19 07:13:23 UTC (rev 3891) @@ -38,6 +38,7 @@ #include <GG/DrawUtil.h> #include <GG/MultiEdit.h> #include <GG/WndEvent.h> +#include <GG/Layout.h> #include <vector> #include <deque> @@ -121,7 +122,7 @@ #ifndef FREEORION_RELEASE bool RequestRegressionTestDump() { ClientNetworking& networking = HumanClientApp::GetApp()->Networking(); - Message msg(Message::DEBUG, HumanClientApp::GetApp()->PlayerID(), -1, "EffectsRegressionTest"); + Message msg(Message::DEBUG, HumanClientApp::GetApp()->PlayerID(), Networking::INVALID_PLAYER_ID, "EffectsRegressionTest"); networking.SendMessage(msg); return true; } @@ -566,8 +567,11 @@ m_toolbar = new CUIToolBar(GG::X0, GG::Y0, AppWidth(), TOOLBAR_HEIGHT); GG::GUI::GetGUI()->Register(m_toolbar); m_toolbar->Hide(); + GG::Layout* layout = new GG::Layout(m_toolbar->ClientUpperLeft().x, m_toolbar->ClientUpperLeft().y, + m_toolbar->ClientWidth(), m_toolbar->ClientHeight(), + 1, 14); + m_toolbar->SetLayout(layout); - // system-view side panel m_side_panel = new SidePanel(AppWidth() - SidePanelWidth(), m_toolbar->LowerRight().y, AppHeight() - m_toolbar->Height()); GG::GUI::GetGUI()->Register(m_side_panel); @@ -620,10 +624,10 @@ m_design_wnd->MoveTo(GG::Pt(GG::X0, m_toolbar->Height())); GG::GUI::GetGUI()->Register(m_design_wnd); m_design_wnd->Hide(); - + boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); - const GG::X BUTTON_TOTAL_MARGIN(8); + const GG::X BUTTON_TOTAL_MARGIN(12); // turn button @@ -631,14 +635,12 @@ std::string turn_button_longest_reasonable_text = boost::io::str(FlexibleFormat(UserString("MAP_BTN_TURN_UPDATE")) % "99999"); // it is unlikely a game will go over 100000 turns GG::X button_width = font->TextExtent(turn_button_longest_reasonable_text).x + BUTTON_TOTAL_MARGIN; // create button using determined width - m_turn_update = new CUITurnButton(GG::X(LAYOUT_MARGIN), GG::Y(LAYOUT_MARGIN), button_width, turn_button_longest_reasonable_text); - m_toolbar->AttachChild(m_turn_update); + m_turn_update = new CUITurnButton(GG::X0, GG::Y0, button_width, turn_button_longest_reasonable_text); GG::Connect(m_turn_update->ClickedSignal, BoolToVoidAdapter(boost::bind(&MapWnd::EndTurn, this))); // FPS indicator - m_FPS = new FPSIndicator(m_turn_update->LowerRight().x + LAYOUT_MARGIN, m_turn_update->UpperLeft().y); - m_toolbar->AttachChild(m_FPS); + m_FPS = new FPSIndicator(GG::X0, GG::Y0); m_FPS->Hide(); @@ -682,10 +684,7 @@ // Menu button button_width = font->TextExtent(UserString("MAP_BTN_MENU")).x + BUTTON_TOTAL_MARGIN; - m_btn_menu = new SettableInWindowCUIButton(m_toolbar->LowerRight().x - button_width - GG::X(LAYOUT_MARGIN), - GG::Y(LAYOUT_MARGIN), - button_width, UserString("MAP_BTN_MENU") ); - m_toolbar->AttachChild(m_btn_menu); + m_btn_menu = new SettableInWindowCUIButton(GG::X0, GG::Y0, button_width, UserString("MAP_BTN_MENU")); GG::Connect(m_btn_menu->ClickedSignal, BoolToVoidAdapter(boost::bind(&MapWnd::ShowMenu, this))); // create custom InWindow function for Menu button that extends its // clickable area to the adjacent edges of the toolbar containing it @@ -698,10 +697,7 @@ // Encyclo"pedia" button button_width = font->TextExtent(UserString("MAP_BTN_PEDIA")).x + BUTTON_TOTAL_MARGIN; - m_btn_pedia = new SettableInWindowCUIButton(m_btn_menu->UpperLeft().x - LAYOUT_MARGIN-button_width, - GG::Y(LAYOUT_MARGIN), - button_width, UserString("MAP_BTN_PEDIA") ); - m_toolbar->AttachChild(m_btn_pedia); + m_btn_pedia = new SettableInWindowCUIButton(GG::X0, GG::Y0, button_width, UserString("MAP_BTN_PEDIA")); GG::Connect(m_btn_pedia->ClickedSignal, BoolToVoidAdapter(boost::bind(&MapWnd::TogglePedia, this))); in_window_func = boost::bind(&InRect, boost::bind(&WndLeft, m_btn_pedia), boost::bind(&WndTop, m_toolbar), @@ -712,10 +708,7 @@ // Design button button_width = font->TextExtent(UserString("MAP_BTN_DESIGN")).x + BUTTON_TOTAL_MARGIN; - m_btn_design = new SettableInWindowCUIButton(m_btn_pedia->UpperLeft().x-LAYOUT_MARGIN-button_width, - GG::Y(LAYOUT_MARGIN), - button_width, UserString("MAP_BTN_DESIGN") ); - m_toolbar->AttachChild(m_btn_design); + m_btn_design = new SettableInWindowCUIButton(GG::X0, GG::Y0, button_width, UserString("MAP_BTN_DESIGN")); GG::Connect(m_btn_design->ClickedSignal, BoolToVoidAdapter(boost::bind(&MapWnd::ToggleDesign, this))); in_window_func = boost::bind(&InRect, boost::bind(&WndLeft, m_btn_design), boost::bind(&WndTop, m_toolbar), @@ -726,10 +719,7 @@ // Production button button_width = font->TextExtent(UserString("MAP_BTN_PRODUCTION")).x + BUTTON_TOTAL_MARGIN; - m_btn_production = new SettableInWindowCUIButton(m_btn_design->UpperLeft().x - LAYOUT_MARGIN-button_width, - GG::Y(LAYOUT_MARGIN), - button_width, UserString("MAP_BTN_PRODUCTION") ); - m_toolbar->AttachChild(m_btn_production); + m_btn_production = new SettableInWindowCUIButton(GG::X0, GG::Y0, button_width, UserString("MAP_BTN_PRODUCTION")); GG::Connect(m_btn_production->ClickedSignal, BoolToVoidAdapter(boost::bind(&MapWnd::ToggleProduction, this))); in_window_func = boost::bind(&InRect, boost::bind(&WndLeft, m_btn_production), boost::bind(&WndTop, m_toolbar), @@ -740,10 +730,7 @@ // Research button button_width = font->TextExtent(UserString("MAP_BTN_RESEARCH")).x + BUTTON_TOTAL_MARGIN; - m_btn_research = new SettableInWindowCUIButton(m_btn_production->UpperLeft().x - LAYOUT_MARGIN - button_width, - GG::Y(LAYOUT_MARGIN), - button_width, UserString("MAP_BTN_RESEARCH") ); - m_toolbar->AttachChild(m_btn_research); + m_btn_research = new SettableInWindowCUIButton(GG::X0, GG::Y0, button_width, UserString("MAP_BTN_RESEARCH")); GG::Connect(m_btn_research->ClickedSignal, BoolToVoidAdapter(boost::bind(&MapWnd::ToggleResearch, this))); in_window_func = boost::bind(&InRect, boost::bind(&WndLeft, m_btn_research), boost::bind(&WndTop, m_toolbar), @@ -754,10 +741,7 @@ // SitRep button button_width = font->TextExtent(UserString("MAP_BTN_SITREP")).x + BUTTON_TOTAL_MARGIN; - m_btn_siterep = new SettableInWindowCUIButton(m_btn_research->UpperLeft().x - LAYOUT_MARGIN-button_width, - GG::Y(LAYOUT_MARGIN), - button_width, UserString("MAP_BTN_SITREP") ); - m_toolbar->AttachChild(m_btn_siterep); + m_btn_siterep = new SettableInWindowCUIButton(GG::X0, GG::Y0, button_width, UserString("MAP_BTN_SITREP")); GG::Connect(m_btn_siterep->ClickedSignal, BoolToVoidAdapter(boost::bind(&MapWnd::ToggleSitRep, this))); in_window_func = boost::bind(&InRect, boost::bind(&WndLeft, m_btn_siterep), boost::bind(&WndTop, m_toolbar), @@ -769,39 +753,102 @@ // resources const GG::X ICON_DUAL_WIDTH(100); const GG::X ICON_WIDTH(ICON_DUAL_WIDTH - 30); - m_population = new StatisticIcon(m_btn_siterep->UpperLeft().x-LAYOUT_MARGIN-ICON_DUAL_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_DUAL_WIDTH,m_turn_update->Height(), + m_population = new StatisticIcon(GG::X0, GG::Y0, ICON_DUAL_WIDTH, m_turn_update->Height(), ClientUI::MeterIcon(METER_POPULATION), - 0,0,3,3,false,true); - m_toolbar->AttachChild(m_population); + 0, 0, 3, 3, false, true); - m_industry = new StatisticIcon(m_population->UpperLeft().x-LAYOUT_MARGIN-ICON_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_WIDTH,m_turn_update->Height(), + m_industry = new StatisticIcon(GG::X0, GG::Y0, ICON_WIDTH, m_turn_update->Height(), ClientUI::MeterIcon(METER_INDUSTRY), - 0,3,false); - m_toolbar->AttachChild(m_industry); + 0, 3, false); - m_research = new StatisticIcon(m_industry->UpperLeft().x-LAYOUT_MARGIN-ICON_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_WIDTH,m_turn_update->Height(), + m_research = new StatisticIcon(GG::X0, GG::Y0, ICON_WIDTH, m_turn_update->Height(), ClientUI::MeterIcon(METER_RESEARCH), - 0,3,false); - m_toolbar->AttachChild(m_research); + 0, 3, false); - m_trade = new StatisticIcon(m_research->UpperLeft().x-LAYOUT_MARGIN-ICON_DUAL_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_DUAL_WIDTH,m_turn_update->Height(), + m_trade = new StatisticIcon(GG::X0, GG::Y0, ICON_DUAL_WIDTH, m_turn_update->Height(), ClientUI::MeterIcon(METER_TRADE), - 0,0,3,3,false,true); - m_toolbar->AttachChild(m_trade); + 0, 0, 3, 3, false, true); - m_mineral = new StatisticIcon(m_trade->UpperLeft().x-LAYOUT_MARGIN-ICON_DUAL_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_DUAL_WIDTH,m_turn_update->Height(), + m_mineral = new StatisticIcon(GG::X0, GG::Y0, ICON_DUAL_WIDTH, m_turn_update->Height(), ClientUI::MeterIcon(METER_MINING), - 0,0,3,3,false,true); - m_toolbar->AttachChild(m_mineral); + 0, 0, 3, 3, false, true); - m_food = new StatisticIcon(m_mineral->UpperLeft().x-LAYOUT_MARGIN-ICON_DUAL_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_DUAL_WIDTH,m_turn_update->Height(), + m_food = new StatisticIcon(GG::X0, GG::Y0, ICON_DUAL_WIDTH, m_turn_update->Height(), ClientUI::MeterIcon(METER_FARMING), - 0,0,3,3,false,true); - m_toolbar->AttachChild(m_food); + 0, 0, 3, 3, false, true); m_menu_showing = false; + int layout_column(0); + layout->SetMinimumColumnWidth(layout_column, m_turn_update->Width()); + layout->SetColumnStretch(layout_column, 0.0); + layout->Add(m_turn_update, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetMinimumColumnWidth(layout_column, GG::X(ClientUI::Pts()*4)); + layout->SetColumnStretch(layout_column, 0.0); + layout->Add(m_FPS, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetColumnStretch(layout_column, 1.0); + layout->Add(m_food, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetColumnStretch(layout_column, 1.0); + layout->Add(m_mineral, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetColumnStretch(layout_column, 1.0); + layout->Add(m_industry, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetColumnStretch(layout_column, 1.0); + layout->Add(m_research, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetColumnStretch(layout_column, 1.0); + layout->Add(m_trade, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetColumnStretch(layout_column, 1.0); + layout->Add(m_population, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetMinimumColumnWidth(layout_column, m_btn_siterep->Width()); + layout->SetColumnStretch(layout_column, 0.0); + layout->Add(m_btn_siterep, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetMinimumColumnWidth(layout_column, m_btn_research->Width()); + layout->SetColumnStretch(layout_column, 0.0); + layout->Add(m_btn_research, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetMinimumColumnWidth(layout_column, m_btn_production->Width()); + layout->SetColumnStretch(layout_column, 0.0); + layout->Add(m_btn_production, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetMinimumColumnWidth(layout_column, m_btn_design->Width()); + layout->SetColumnStretch(layout_column, 0.0); + layout->Add(m_btn_design, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetMinimumColumnWidth(layout_column, m_btn_pedia->Width()); + layout->SetColumnStretch(layout_column, 0.0); + layout->Add(m_btn_pedia, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetMinimumColumnWidth(layout_column, m_btn_menu->Width()); + layout->SetColumnStretch(layout_column, 0.0); + layout->Add(m_btn_menu, 0, layout_column, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + ++layout_column; + + layout->SetCellMargin(5); + layout->SetBorderMargin(5); + + //clear background images m_backgrounds.clear(); m_bg_scroll_rate.clear(); |
From: <geo...@us...> - 2010-12-22 21:25:14
|
Revision: 3910 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3910&view=rev Author: geoffthemedio Date: 2010-12-22 21:25:07 +0000 (Wed, 22 Dec 2010) Log Message: ----------- Removed old / unused MapWnd toolbar contents layout code. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-12-22 21:11:57 UTC (rev 3909) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-12-22 21:25:07 UTC (rev 3910) @@ -893,85 +893,6 @@ void MapWnd::DoLayout() { m_toolbar->Resize(GG::Pt(AppWidth(), TOOLBAR_HEIGHT)); - - boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); - const GG::X BUTTON_TOTAL_MARGIN(8); - const GG::Y BUTTON_TOP(LAYOUT_MARGIN); - const GG::Y BUTTON_BOTTOM(TOOLBAR_HEIGHT - LAYOUT_MARGIN); - - - // menu button - GG::X right = m_toolbar->LowerRight().x - GG::X(LAYOUT_MARGIN) - m_toolbar->UpperLeft().x; - GG::X width = font->TextExtent(UserString("MAP_BTN_MENU")).x + BUTTON_TOTAL_MARGIN; - GG::X left = right - width; - m_btn_menu->SizeMove(GG::Pt(left, BUTTON_TOP), GG::Pt(right, BUTTON_BOTTOM)); - - // Encyclo"pedia" button - right = left - GG::X(LAYOUT_MARGIN); - width = font->TextExtent(UserString("MAP_BTN_PEDIA")).x + BUTTON_TOTAL_MARGIN; - left = right - width; - m_btn_pedia->SizeMove(GG::Pt(left, BUTTON_TOP), GG::Pt(right, BUTTON_BOTTOM)); - - // Design button - right = left - GG::X(LAYOUT_MARGIN); - width = font->TextExtent(UserString("MAP_BTN_DESIGN")).x + BUTTON_TOTAL_MARGIN; - left = right - width; - m_btn_design->SizeMove(GG::Pt(left, BUTTON_TOP), GG::Pt(right, BUTTON_BOTTOM)); - - // Production button - right = left - GG::X(LAYOUT_MARGIN); - width = font->TextExtent(UserString("MAP_BTN_PRODUCTION")).x + BUTTON_TOTAL_MARGIN; - left = right - width; - m_btn_production->SizeMove(GG::Pt(left, BUTTON_TOP), GG::Pt(right, BUTTON_BOTTOM)); - - // Research button - right = left - GG::X(LAYOUT_MARGIN); - width = font->TextExtent(UserString("MAP_BTN_RESEARCH")).x + BUTTON_TOTAL_MARGIN; - left = right - width; - m_btn_research->SizeMove(GG::Pt(left, BUTTON_TOP), GG::Pt(right, BUTTON_BOTTOM)); - - // SitRep button - right = left - GG::X(LAYOUT_MARGIN); - width = font->TextExtent(UserString("MAP_BTN_SITREP")).x + BUTTON_TOTAL_MARGIN; - left = right - width; - m_btn_siterep->SizeMove(GG::Pt(left, BUTTON_TOP), GG::Pt(right, BUTTON_BOTTOM)); - - // Turn button - left = GG::X(LAYOUT_MARGIN); - std::string turn_button_longest_reasonable_text = boost::io::str(FlexibleFormat(UserString("MAP_BTN_TURN_UPDATE")) % "99999"); // it is unlikely a game will go over 100000 turns - width = font->TextExtent(turn_button_longest_reasonable_text).x + BUTTON_TOTAL_MARGIN; - right = left + width; - m_turn_update->SizeMove(GG::Pt(left, BUTTON_TOP), GG::Pt(right, BUTTON_BOTTOM)); - - - // resources - const GG::X ICON_DUAL_WIDTH(100); - const GG::X ICON_WIDTH(ICON_DUAL_WIDTH - 30); - - - //m_population = new StatisticIcon(m_btn_siterep->UpperLeft().x-LAYOUT_MARGIN-ICON_DUAL_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_DUAL_WIDTH,m_turn_update->Height(), - // ClientUI::MeterIcon(METER_POPULATION), - // 0,0,3,3,false,true); - - //m_industry = new StatisticIcon(m_population->UpperLeft().x-LAYOUT_MARGIN-ICON_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_WIDTH,m_turn_update->Height(), - // ClientUI::MeterIcon(METER_INDUSTRY), - // 0,3,false); - - //m_research = new StatisticIcon(m_industry->UpperLeft().x-LAYOUT_MARGIN-ICON_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_WIDTH,m_turn_update->Height(), - // ClientUI::MeterIcon(METER_RESEARCH), - // 0,3,false); - - //m_trade = new StatisticIcon(m_research->UpperLeft().x-LAYOUT_MARGIN-ICON_DUAL_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_DUAL_WIDTH,m_turn_update->Height(), - // ClientUI::MeterIcon(METER_TRADE), - // 0,0,3,3,false,true); - - //m_mineral = new StatisticIcon(m_trade->UpperLeft().x-LAYOUT_MARGIN-ICON_DUAL_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_DUAL_WIDTH,m_turn_update->Height(), - // ClientUI::MeterIcon(METER_MINING), - // 0,0,3,3,false,true); - - //m_food = new StatisticIcon(m_mineral->UpperLeft().x-LAYOUT_MARGIN-ICON_DUAL_WIDTH,GG::Y(LAYOUT_MARGIN),ICON_DUAL_WIDTH,m_turn_update->Height(), - // ClientUI::MeterIcon(METER_FARMING), - // 0,0,3,3,false,true); } GG::Pt MapWnd::ClientUpperLeft() const |
From: <geo...@us...> - 2010-12-25 23:22:23
|
Revision: 3921 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3921&view=rev Author: geoffthemedio Date: 2010-12-25 23:22:17 +0000 (Sat, 25 Dec 2010) Log Message: ----------- Fixed issue in MapWnd where known destroyed fleets (or presumably systems) could still be shown in some situations. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-12-25 19:14:20 UTC (rev 3920) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-12-25 23:22:17 UTC (rev 3921) @@ -1722,7 +1722,6 @@ // (Apparently not needed?) - // set up system icons, starlanes, galaxy gas rendering InitTurnRendering(); @@ -1872,11 +1871,18 @@ m_system_icons.clear(); + const std::set<int>& this_client_known_destroyed_objects = GetUniverse().EmpireKnownDestroyedObjectIDs(HumanClientApp::GetApp()->EmpireID()); + // create system icons std::vector<const System*> systems = known_objects.FindObjects<System>(); for (unsigned int i = 0; i < systems.size(); ++i) { + const System* start_system = systems[i]; + + // skip known destroyed objects + if (this_client_known_destroyed_objects.find(start_system->ID()) != this_client_known_destroyed_objects.end()) + continue; + // 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); @@ -3017,10 +3023,16 @@ // be grouped by empire owner and buttons created const ObjectMap& objects = GetUniverse().Objects(); + const std::set<int>& this_client_known_destroyed_objects = GetUniverse().EmpireKnownDestroyedObjectIDs(HumanClientApp::GetApp()->EmpireID()); + // for each system, each empire's fleets that are ordered to move, but still at the system: "departing fleets" std::map<const System*, std::map<int, std::vector<const Fleet*> > > departing_fleets; std::vector<const UniverseObject*> departing_fleet_objects = objects.FindObjects(OrderedMovingFleetVisitor()); for (std::vector<const UniverseObject*>::iterator it = departing_fleet_objects.begin(); it != departing_fleet_objects.end(); ++it) { + // skip known destroyed objects + if (this_client_known_destroyed_objects.find((*it)->ID()) != this_client_known_destroyed_objects.end()) + continue; + const Fleet* fleet = universe_object_cast<const Fleet*>(*it); // sanity checks @@ -3050,6 +3062,10 @@ std::map<const System*, std::map<int, std::vector<const Fleet*> > > stationary_fleets; std::vector<const UniverseObject*> stationary_fleet_objects = objects.FindObjects(StationaryFleetVisitor()); for (std::vector<const UniverseObject*>::iterator it = stationary_fleet_objects.begin(); it != stationary_fleet_objects.end(); ++it) { + // skip known destroyed objects + if (this_client_known_destroyed_objects.find((*it)->ID()) != this_client_known_destroyed_objects.end()) + continue; + const Fleet* fleet = universe_object_cast<const Fleet*>(*it); // sanity checks @@ -3079,6 +3095,10 @@ std::map<std::pair<double, double>, std::map<int, std::vector<const Fleet*> > > moving_fleets; std::vector<const UniverseObject*> moving_fleet_objects = objects.FindObjects(MovingFleetVisitor()); for (std::vector<const UniverseObject*>::iterator it = moving_fleet_objects.begin(); it != moving_fleet_objects.end(); ++it) { + // skip known destroyed objects + if (this_client_known_destroyed_objects.find((*it)->ID()) != this_client_known_destroyed_objects.end()) + continue; + const Fleet* fleet = universe_object_cast<const Fleet*>(*it); // sanity checks |
From: <geo...@us...> - 2010-12-26 12:03:30
|
Revision: 3926 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3926&view=rev Author: geoffthemedio Date: 2010-12-26 12:03:24 +0000 (Sun, 26 Dec 2010) Log Message: ----------- More MapWnd tweaks to hide stuff that doesn't exist Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2010-12-26 11:45:04 UTC (rev 3925) +++ trunk/FreeOrion/UI/MapWnd.cpp 2010-12-26 12:03:24 UTC (rev 3926) @@ -2171,6 +2171,7 @@ int empire_id = HumanClientApp::GetApp()->EmpireID(); EmpireManager& manager = HumanClientApp::GetApp()->Empires(); + const std::set<int>& this_client_known_destroyed_objects = GetUniverse().EmpireKnownDestroyedObjectIDs(HumanClientApp::GetApp()->EmpireID()); // calculate in-universe apparent starlane endpoints and create buffers for starlane rendering @@ -2178,20 +2179,30 @@ for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { int system_id = it->first; - const System* system = GetEmpireKnownObject<System>(system_id, empire_id); - if (!system) { + + // skip systems that don't actually exist + if (this_client_known_destroyed_objects.find(system_id) != this_client_known_destroyed_objects.end()) + continue; + + const System* start_system = GetEmpireKnownObject<System>(system_id, empire_id); + if (!start_system) { Logger().errorStream() << "MapWnd::InitStarlaneRenderingBuffers couldn't get system with id " << system_id; continue; } // add system's starlanes - for (System::const_lane_iterator lane_it = system->begin_lanes(); lane_it != system->end_lanes(); ++lane_it) { + for (System::const_lane_iterator lane_it = start_system->begin_lanes(); lane_it != start_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; + int lane_end_sys_id = lane_it->first; + + // skip lanes to systems that don't actually exist + if (this_client_known_destroyed_objects.find(lane_end_sys_id) != this_client_known_destroyed_objects.end()) + continue; + const System* dest_system = GetEmpireKnownObject<System>(lane_it->first, empire_id); - if (!start_system || ! dest_system) + if (!dest_system) continue; //std::cout << "colouring lanes between " << start_system->Name() << " and " << dest_system->Name() << std::endl; @@ -2300,6 +2311,10 @@ // create animated lines indicating fleet supply flow for (EmpireManager::iterator it = manager.begin(); it != manager.end(); ++it) { + // which empires' fleet supply to show? + if (it->first != HumanClientApp::GetApp()->EmpireID()) + continue; + 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) { |
From: <geo...@us...> - 2011-02-05 09:14:26
|
Revision: 3966 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3966&view=rev Author: geoffthemedio Date: 2011-02-05 09:14:19 +0000 (Sat, 05 Feb 2011) Log Message: ----------- Added alternative starlane rendering code for when vertex buffers are not supported. Hopefully this will fix some reported issues where starlanes are not visible on some systems. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2011-02-05 02:57:09 UTC (rev 3965) +++ trunk/FreeOrion/UI/MapWnd.cpp 2011-02-05 09:14:19 UTC (rev 3966) @@ -1191,6 +1191,7 @@ bool coloured = GetOptionsDB().Get<bool>("UI.resource-starlane-colouring"); if (m_starlane_vertices.m_name && (m_starlane_colors.m_name || !coloured)) { + // render starlanes with vertex buffer (and possibly colour buffer) const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); glDisable(GL_TEXTURE_2D); @@ -1227,6 +1228,70 @@ glEnable(GL_TEXTURE_2D); glDisable(GL_LINE_SMOOTH); glDisable(GL_LINE_STIPPLE); + + + } else if (!m_starlane_vertices.m_name) { + // render lanes without buffers + const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); + glColor(UNOWNED_LANE_COLOUR); + + glDisable(GL_TEXTURE_2D); + glEnable(GL_LINE_SMOOTH); + glEnable(GL_LINE_STIPPLE); + + glLineWidth(static_cast<GLfloat>(GetOptionsDB().Get<double>("UI.starlane-thickness"))); + glLineStipple(1, 0xffff); // solid line / no stipple + + int empire_id = HumanClientApp::GetApp()->EmpireID(); + EmpireManager& manager = HumanClientApp::GetApp()->Empires(); + const std::set<int>& this_client_known_destroyed_objects = GetUniverse().EmpireKnownDestroyedObjectIDs(HumanClientApp::GetApp()->EmpireID()); + + glBegin(GL_LINES); + + // for every system icon, render lanes + for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { + int system_id = it->first; + + // skip systems that don't actually exist + if (this_client_known_destroyed_objects.find(system_id) != this_client_known_destroyed_objects.end()) + continue; + + const System* start_system = GetEmpireKnownObject<System>(system_id, empire_id); + if (!start_system) { + Logger().errorStream() << "MapWnd::RenderStarlanes couldn't get system with id " << system_id; + continue; + } + + // render system's starlanes + for (System::const_lane_iterator lane_it = start_system->begin_lanes(); lane_it != start_system->end_lanes(); ++lane_it) { + bool lane_is_wormhole = lane_it->second; + if (lane_is_wormhole) continue; // at present, not rendering wormholes + + int lane_end_sys_id = lane_it->first; + + // skip lanes to systems that don't actually exist + if (this_client_known_destroyed_objects.find(lane_end_sys_id) != this_client_known_destroyed_objects.end()) + continue; + + const System* dest_system = GetEmpireKnownObject<System>(lane_it->first, empire_id); + if (!dest_system) + continue; + + // get lane endpoint positions + LaneEndpoints lane_endpoints = StarlaneEndPointsFromSystemPositions(start_system->X(), start_system->Y(), dest_system->X(), dest_system->Y()); + + glVertex2d(lane_endpoints.X1, lane_endpoints.Y1); + glVertex2d(lane_endpoints.X2, lane_endpoints.Y2); + } + } + + glEnd(); + + glLineWidth(1.0); + + glEnable(GL_TEXTURE_2D); + glDisable(GL_LINE_SMOOTH); + glDisable(GL_LINE_STIPPLE); } if (m_starlane_fleet_supply_vertices.m_name && m_starlane_fleet_supply_colors.m_name && GetOptionsDB().Get<bool>("UI.fleet-supply-lines")) { |
From: <geo...@us...> - 2011-09-07 12:34:31
|
Revision: 4236 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4236&view=rev Author: geoffthemedio Date: 2011-09-07 12:34:25 +0000 (Wed, 07 Sep 2011) Log Message: ----------- Made monster fleet movement lines red. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2011-09-07 12:18:02 UTC (rev 4235) +++ trunk/FreeOrion/UI/MapWnd.cpp 2011-09-07 12:34:25 UTC (rev 4236) @@ -2653,6 +2653,8 @@ GG::Clr line_colour = GG::CLR_WHITE; if (const Empire* empire = Empires().Lookup(fleet->Owner())) line_colour = empire->Color(); + else if (fleet->Unowned() && fleet->HasMonsters()) + line_colour = GG::CLR_RED; // create and store line m_fleet_lines[fleet_id] = MovementLineData(fleet->MovePath(), m_starlane_endpoints, line_colour); |
From: <geo...@us...> - 2011-10-08 21:11:16
|
Revision: 4359 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4359&view=rev Author: geoffthemedio Date: 2011-10-08 21:11:10 +0000 (Sat, 08 Oct 2011) Log Message: ----------- Cleared player list when ending game, so if starting a new game, the old list of players isn't still shown before the first turn update arrives. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2011-10-08 19:24:53 UTC (rev 4358) +++ trunk/FreeOrion/UI/MapWnd.cpp 2011-10-08 21:11:10 UTC (rev 4359) @@ -5,6 +5,7 @@ #include "MapWnd.h" #include "ChatWnd.h" +#include "PlayerListWnd.h" #include "ClientUI.h" #include "CUIControls.h" #include "FleetButton.h" @@ -3606,6 +3607,14 @@ ClearSystemRenderingBuffers(); ClearStarlaneRenderingBuffers(); + if (ClientUI* cui = ClientUI::GetClientUI()) { + // clearing of message window commented out because scrollbar has quirks + // after doing so until enough messages are added to + //if (MessageWnd* msg_wnd = cui->GetMessageWnd()) + // msg_wnd->Clear(); + if (PlayerListWnd* plr_wnd = cui->GetPlayerListWnd()) + plr_wnd->Clear(); + } GG::Pt sp_ul = GG::Pt(AppWidth() - SidePanelWidth(), m_toolbar->LowerRight().y); GG::Pt sp_lr = sp_ul + GG::Pt(SidePanelWidth(), AppHeight() - m_toolbar->Height()); |
From: <geo...@us...> - 2012-02-19 10:21:47
|
Revision: 4662 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4662&view=rev Author: geoffthemedio Date: 2012-02-19 10:21:41 +0000 (Sun, 19 Feb 2012) Log Message: ----------- Skipped fleets not in systems when finding stationary and departing fleets in MapWnd, to avoid unnecessary error messages in logs. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2012-02-19 10:20:30 UTC (rev 4661) +++ trunk/FreeOrion/UI/MapWnd.cpp 2012-02-19 10:21:41 UTC (rev 4662) @@ -2869,6 +2869,10 @@ const Fleet* fleet = universe_object_cast<const Fleet*>(*it); + // skip fleets outside systems + if (fleet->SystemID() == INVALID_OBJECT_ID) + continue; + // sanity checks if (!fleet) { Logger().errorStream() << "couldn't cast object to fleet in RefreshFleetButtons()"; @@ -2896,6 +2900,10 @@ const Fleet* fleet = universe_object_cast<const Fleet*>(*it); + // skip fleets outside systems + if (fleet->SystemID() == INVALID_OBJECT_ID) + continue; + // sanity checks if (!fleet) { Logger().errorStream() << "couldn't cast object to fleet in RefreshFleetButtons()"; @@ -2903,7 +2911,7 @@ } const System* system = GetSystem(fleet->SystemID()); if (!system) { - Logger().errorStream() << "couldn't get system of an departing fleet in RefreshFleetButtons()"; + Logger().errorStream() << "couldn't get system of a stationary fleet in RefreshFleetButtons()"; continue; } |
From: <geo...@us...> - 2012-06-13 02:48:22
|
Revision: 4908 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4908&view=rev Author: geoffthemedio Date: 2012-06-13 02:48:16 +0000 (Wed, 13 Jun 2012) Log Message: ----------- Removed population and trade resource indicators' predicted change number, so all stat indicators on the info bar now just have a single number. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2012-06-13 02:47:10 UTC (rev 4907) +++ trunk/FreeOrion/UI/MapWnd.cpp 2012-06-13 02:48:16 UTC (rev 4908) @@ -741,7 +741,7 @@ const GG::X ICON_WIDTH(ICON_DUAL_WIDTH - 30); m_population = new StatisticIcon(GG::X0, GG::Y0, ICON_DUAL_WIDTH, m_turn_update->Height(), ClientUI::MeterIcon(METER_POPULATION), - 0, 0, 3, 3, false, true); + 0, 3, false); m_industry = new StatisticIcon(GG::X0, GG::Y0, ICON_WIDTH, m_turn_update->Height(), ClientUI::MeterIcon(METER_INDUSTRY), @@ -753,7 +753,7 @@ m_trade = new StatisticIcon(GG::X0, GG::Y0, ICON_DUAL_WIDTH, m_turn_update->Height(), ClientUI::MeterIcon(METER_TRADE), - 0, 0, 3, 3, false, true); + 0, 3, false); m_menu_showing = false; @@ -3853,11 +3853,6 @@ Empire *empire = HumanClientApp::GetApp()->Empires().Lookup( HumanClientApp::GetApp()->EmpireID() ); m_trade->SetValue(empire->ResourceStockpile(RE_TRADE)); - - double production = empire->ResourceProduction(RE_TRADE); - double spent = empire->TotalTradeSpending(); - - m_trade->SetValue(production - spent, 1); } void MapWnd::RefreshResearchResourceIndicator() { @@ -3873,7 +3868,6 @@ void MapWnd::RefreshPopulationIndicator() { Empire *empire = HumanClientApp::GetApp()->Empires().Lookup( HumanClientApp::GetApp()->EmpireID() ); m_population->SetValue(empire->GetPopulationPool().Population()); - m_population->SetValue(empire->GetPopulationPool().Growth(), 1); } void MapWnd::UpdateMetersAndResourcePools() { |
From: <geo...@us...> - 2012-11-17 03:26:37
|
Revision: 5424 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5424&view=rev Author: geoffthemedio Date: 2012-11-17 03:26:30 +0000 (Sat, 17 Nov 2012) Log Message: ----------- Removed unnecessary and compile-error-causing extra "SubTexture" when calling constructor. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2012-11-16 16:31:22 UTC (rev 5423) +++ trunk/FreeOrion/UI/MapWnd.cpp 2012-11-17 03:26:30 UTC (rev 5424) @@ -797,7 +797,7 @@ AttachChild(m_research_wasted); boost::shared_ptr<GG::Texture> wasted_ressource_texture = ClientUI::GetTexture(ClientUI::ArtDir() / "icons" /"wasted_resource.png", false); - GG::SubTexture wasted_ressource_subtexture = GG::SubTexture::SubTexture(wasted_ressource_texture, GG::X(0), GG::Y(0), GG::X(32), GG::Y(32)); + GG::SubTexture wasted_ressource_subtexture = GG::SubTexture(wasted_ressource_texture, GG::X(0), GG::Y(0), GG::X(32), GG::Y(32)); m_industry_wasted->SetUnpressedGraphic(wasted_ressource_subtexture); m_industry_wasted->SetPressedGraphic (wasted_ressource_subtexture); |
From: <geo...@us...> - 2012-11-18 08:51:06
|
Revision: 5429 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5429&view=rev Author: geoffthemedio Date: 2012-11-18 08:50:59 +0000 (Sun, 18 Nov 2012) Log Message: ----------- Groomed / simplified some MapWnd rendering init code and added safety checks to prevent crashes. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2012-11-18 08:47:42 UTC (rev 5428) +++ trunk/FreeOrion/UI/MapWnd.cpp 2012-11-18 08:50:59 UTC (rev 5429) @@ -1929,8 +1929,6 @@ ShaderProgram::shaderProgramFactory("", shader_text)); } - const ObjectMap& known_objects = GetUniverse().EmpireKnownObjects(HumanClientApp::GetApp()->EmpireID()); - // adjust size of map window for universe and application size Resize(GG::Pt(static_cast<GG::X>(GetUniverse().UniverseWidth() * ZOOM_MAX + AppWidth() * 1.5), static_cast<GG::Y>(GetUniverse().UniverseWidth() * ZOOM_MAX + AppHeight() * 1.5))); @@ -1948,27 +1946,28 @@ const std::set<int>& this_client_known_destroyed_objects = GetUniverse().EmpireKnownDestroyedObjectIDs(HumanClientApp::GetApp()->EmpireID()); + const ObjectMap& objects = Objects(); - // 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(); // create system icons - std::vector<const System*> systems = known_objects.FindObjects<System>(); - for (unsigned int i = 0; i < systems.size(); ++i) { - const System* system = systems[i]; + std::vector<const System*> systems = objects.FindObjects<System>(); + for (std::vector<const System*>::const_iterator sys_it = systems.begin(); sys_it != systems.end(); ++sys_it) { + const System* sys = *sys_it; + int sys_id = sys->ID(); // skip known destroyed objects - if (this_client_known_destroyed_objects.find(system->ID()) != this_client_known_destroyed_objects.end()) + if (this_client_known_destroyed_objects.find(sys_id) != this_client_known_destroyed_objects.end()) continue; // create new system icon - SystemIcon* icon = new SystemIcon(GG::X0, GG::Y0, GG::X(10), system->ID()); - m_system_icons[system->ID()] = icon; + SystemIcon* icon = new SystemIcon(GG::X0, GG::Y0, GG::X(10), sys_id); + m_system_icons[sys_id] = icon; icon->InstallEventFilter(this); - if (SidePanel::SystemID() == systems[i]->ID()) + if (SidePanel::SystemID() == sys_id) icon->SetSelected(true); AttachChild(icon); @@ -1994,19 +1993,20 @@ m_field_icons.clear(); // create field icons - std::vector<const Field*> fields = known_objects.FindObjects<Field>(); - for (unsigned int i = 0; i < fields.size(); ++i) { - const Field* field = fields[i]; + std::vector<const Field*> fields = objects.FindObjects<Field>(); + for (std::vector<const Field*>::const_iterator fld_it = fields.begin(); fld_it != fields.end(); ++fld_it) { + const Field* field = *fld_it; + int fld_id = field->ID(); // skip known destroyed objects - if (this_client_known_destroyed_objects.find(field->ID()) != this_client_known_destroyed_objects.end()) + if (this_client_known_destroyed_objects.find(fld_id) != this_client_known_destroyed_objects.end()) continue; if (field->GetVisibility(HumanClientApp::GetApp()->EmpireID()) <= VIS_NO_VISIBILITY) continue; // create new system icon - FieldIcon* icon = new FieldIcon(GG::X0, GG::Y0, field->ID()); - m_field_icons[field->ID()] = icon; + FieldIcon* icon = new FieldIcon(GG::X0, GG::Y0, fld_id); + m_field_icons[fld_id] = icon; icon->InstallEventFilter(this); //if (SidePanel::SystemID() == systems[i]->ID()) // icon->SetSelected(true); @@ -2229,9 +2229,9 @@ int empire_id = HumanClientApp::GetApp()->EmpireID(); EmpireManager& manager = HumanClientApp::GetApp()->Empires(); - ObjectMap objMap = HumanClientApp::GetApp()->GetUniverse().EmpireKnownObjects(empire_id); + const std::set<int>& this_client_known_destroyed_objects = GetUniverse().EmpireKnownDestroyedObjectIDs(HumanClientApp::GetApp()->EmpireID()); - Empire* thisEmpire = Empires().Lookup(empire_id); + Empire* this_client_empire = Empires().Lookup(empire_id); std::set<int> underAllocResSys; std::map<std::set<int>, std::set<int> > resPoolSystems;//map keyed by ResourcePool (set of objects) to the corresponding set of SysIDs @@ -2241,29 +2241,33 @@ std::map<int, std::set<int> > memberToPool; std::set<int> underAllocResGrpCoreMembers; - if (thisEmpire) { - const std::set<std::set<int> >& resGroups = thisEmpire->ResourceSupplyGroups(); - const ProductionQueue& queue = thisEmpire->GetProductionQueue(); + if (this_client_empire) { + const std::set<std::set<int> >& resGroups = this_client_empire->ResourceSupplyGroups(); + const ProductionQueue& queue = this_client_empire->GetProductionQueue(); std::map<std::set<int>, double> allocatedPP(queue.AllocatedPP()); - std::map<std::set<int>, double> availablePP(thisEmpire->GetResourcePool(RE_INDUSTRY)->Available() ); + std::map<std::set<int>, double> availablePP(this_client_empire->GetResourcePool(RE_INDUSTRY)->Available()); + for (std::map<std::set<int>, double>::const_iterator it = availablePP.begin(); it != availablePP.end(); ++it) { + double group_pp = it->second; + if (group_pp < 1e-4) + continue; + std::string thisPool = "( "; for (std::set<int>::const_iterator objIt = it->first.begin(); objIt != it->first.end(); ++objIt) { - //Logger().debugStream() << "Empire " << empire_id << "; Object (" << *objIt << ") is named " << objMap.Object(*objIt)->Name(); - thisPool += boost::lexical_cast<std::string>(*objIt) +", "; - int sysID = objMap.Object(*objIt)->SystemID(); - if ( (sysID != -1) ) { - std::vector<int> planetIDs = universe_object_cast<System*>(objMap.Object(sysID))->FindObjectIDs<Planet>(); - std::set<int> planetSet(planetIDs.begin(), planetIDs.end() ); - if (planetSet.find(*objIt) != planetSet.end()) { // currently only wanting systems containing a planetary resGrp member, not ship members - if (it->second > 1e-4) { - resPoolSystems[it->first].insert(sysID); - m_resourceCenters.insert(sysID ); - if ( ( it->second > allocatedPP[it->first] + 1e-4 )) - underAllocResSys.insert(sysID ); - } - } - } + int object_id = *objIt; + thisPool += boost::lexical_cast<std::string>(object_id) +", "; + + const Planet* planet = GetPlanet(object_id); + if (!planet) + continue; + + //Logger().debugStream() << "Empire " << empire_id << "; Planet (" << object_id << ") is named " << planet->Name(); + + int system_id = planet->SystemID(); + resPoolSystems[it->first].insert(system_id); + m_resourceCenters.insert(system_id); + if (group_pp > allocatedPP[it->first] + 1e-4) + underAllocResSys.insert(system_id); } thisPool += ")"; //Logger().debugStream() << "Empire " << empire_id << "; ResourcePool[RE_INDUSTRY] resourceGroup (" << thisPool << ") has (" << it->second << " PP available"; @@ -2286,7 +2290,7 @@ }//TODO: could add double checking that pool was successfully linked to a group, but *shouldn't* be necessary I think //Logger().debugStream() << " MapWnd::InitStarlaneRenderingBuffers finished empire Info collection Round 2"; - std::set<std::pair<int, int> > resource_supply_lanes (thisEmpire->SupplyStarlaneTraversals()) ; + std::set<std::pair<int, int> > resource_supply_lanes (this_client_empire->SupplyStarlaneTraversals()) ; for (std::map<std::set<int>, std::set<int> >::iterator resPoolSysIt = resPoolSystems.begin(); resPoolSysIt != resPoolSystems.end(); resPoolSysIt++){ std::string thisPoolCtrs = "( "; for (std::set<int>::iterator startSys=resPoolSysIt->second.begin(); startSys != resPoolSysIt->second.end(); startSys++) @@ -2302,7 +2306,7 @@ std::set<int>::iterator nextSys = startSys; for (std::set<int>::iterator endSys=++nextSys; endSys!=resPoolSysIt->second.end(); endSys++) { //Logger().debugStream() << " MapWnd::InitStarlaneRenderingBuffers getting path from sys "<< (*startSys) << " to "<< (*endSys) ; - std::vector<int> path = GetLeastJumps(*startSys, *endSys, resPoolToGroupMap[resPoolSysIt->first], resource_supply_lanes, objMap); + std::vector<int> path = GetLeastJumps(*startSys, *endSys, resPoolToGroupMap[resPoolSysIt->first], resource_supply_lanes, Objects()); int plen = path.size(); //Logger().debugStream() << " MapWnd::InitStarlaneRenderingBuffers got path, length: "<< plen ; for (std::vector<int>::iterator pathSys= path.begin(); pathSys!= path.end(); pathSys++) { @@ -2331,7 +2335,7 @@ if (this_client_known_destroyed_objects.find(system_id) != this_client_known_destroyed_objects.end()) continue; - const System* start_system = GetEmpireKnownSystem(system_id, empire_id); + const System* start_system = GetSystem(system_id); if (!start_system) { Logger().errorStream() << "MapWnd::InitStarlaneRenderingBuffers couldn't get system with id " << system_id; continue; @@ -2348,7 +2352,7 @@ if (this_client_known_destroyed_objects.find(lane_end_sys_id) != this_client_known_destroyed_objects.end()) continue; - const System* dest_system = GetEmpireKnownSystem(lane_it->first, empire_id); + const System* dest_system = GetSystem(lane_it->first); if (!dest_system) continue; //std::cout << "colouring lanes between " << start_system->Name() << " and " << dest_system->Name() << std::endl; @@ -2420,32 +2424,32 @@ //std::pair<int, int> lane_backward = std::make_pair(dest_system->ID(), start_system->ID()); LaneEndpoints lane_endpoints = StarlaneEndPointsFromSystemPositions(start_system->X(), start_system->Y(), dest_system->X(), dest_system->Y()); GG::Clr lane_colour; - if ( (thisEmpire) &&(resGrpCoreMembers.find(start_system->ID()) != resGrpCoreMembers.end())) {//start system is a res Grp core member for thisEmpire -- highlight - lane_colour = thisEmpire->Color(); - float indicatorExtent = 0.5; + if ( (this_client_empire) &&(resGrpCoreMembers.find(start_system->ID()) != resGrpCoreMembers.end())) {//start system is a res Grp core member for this_client_empire -- highlight + lane_colour = this_client_empire->Color(); + float indicatorExtent = 0.5f; if (underAllocResGrpCoreMembers.find(start_system->ID()) != underAllocResGrpCoreMembers.end() ) { - GG::Clr eclr= thisEmpire->Color(); + GG::Clr eclr= this_client_empire->Color(); lane_colour = GG::DarkColor( GG::Clr(255-eclr.r, 255-eclr.g, 255-eclr.b, eclr.a)); } - /*if ((thisEmpire->SupplyOstructedStarlaneTraversals().find(lane_forward) != thisEmpire->SupplyOstructedStarlaneTraversals().end()) || - (thisEmpire->SupplyOstructedStarlaneTraversals().find(lane_backward) != thisEmpire->SupplyOstructedStarlaneTraversals().end()) || - !( (thisEmpire->SupplyStarlaneTraversals().find(lane_forward) != thisEmpire->SupplyStarlaneTraversals().end()) || - (thisEmpire->SupplyStarlaneTraversals().find(lane_backward) != thisEmpire->SupplyStarlaneTraversals().end()) ) ) */ + /*if ((this_client_empire->SupplyOstructedStarlaneTraversals().find(lane_forward) != this_client_empire->SupplyOstructedStarlaneTraversals().end()) || + (this_client_empire->SupplyOstructedStarlaneTraversals().find(lane_backward) != this_client_empire->SupplyOstructedStarlaneTraversals().end()) || + !( (this_client_empire->SupplyStarlaneTraversals().find(lane_forward) != this_client_empire->SupplyStarlaneTraversals().end()) || + (this_client_empire->SupplyStarlaneTraversals().find(lane_backward) != this_client_empire->SupplyStarlaneTraversals().end()) ) ) */ if (resGroupCores[ memberToPool[start_system->ID()]] != resGroupCores[ memberToPool[dest_system->ID()]]) indicatorExtent = 0.2f; m_RC_starlane_vertices.store(lane_endpoints.X1, - lane_endpoints.Y1); + lane_endpoints.Y1); m_RC_starlane_vertices.store((lane_endpoints.X2 - lane_endpoints.X1) * indicatorExtent + lane_endpoints.X1, // part way along starlane - (lane_endpoints.Y2 - lane_endpoints.Y1) * indicatorExtent + lane_endpoints.Y1); + (lane_endpoints.Y2 - lane_endpoints.Y1) * indicatorExtent + lane_endpoints.Y1); m_RC_starlane_colors.store(lane_colour.r, - lane_colour.g, - lane_colour.b, - lane_colour.a); + lane_colour.g, + lane_colour.b, + lane_colour.a); m_RC_starlane_colors.store(lane_colour.r, - lane_colour.g, - lane_colour.b, - lane_colour.a); + lane_colour.g, + lane_colour.b, + lane_colour.a); } for (EmpireManager::iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { |
From: <geo...@us...> - 2012-11-20 16:48:30
|
Revision: 5443 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5443&view=rev Author: geoffthemedio Date: 2012-11-20 16:48:18 +0000 (Tue, 20 Nov 2012) Log Message: ----------- grooming Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2012-11-19 11:09:03 UTC (rev 5442) +++ trunk/FreeOrion/UI/MapWnd.cpp 2012-11-20 16:48:18 UTC (rev 5443) @@ -4178,7 +4178,7 @@ } void MapWnd::RefreshResearchResourceIndicator() { - const Empire *empire = HumanClientApp::GetApp()->Empires().Lookup( HumanClientApp::GetApp()->EmpireID() ); + const Empire *empire = HumanClientApp::GetApp()->Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (!empire) return; m_research->SetValue(empire->ResourceProduction(RE_RESEARCH)); @@ -4188,16 +4188,18 @@ double totalWastedRP = totalProduction - totalRPSpent; if (totalWastedRP > 0){ m_research_wasted->Show(); - m_research_wasted->SetBrowseInfoWnd(boost::shared_ptr<GG::BrowseInfoWnd>(new TextBrowseWnd(UserString("MAP_RES_WASTED_TITLE"), - boost::io::str(FlexibleFormat(UserString("MAP_RES_WASTED_TEXT")) % DoubleToString(totalProduction, 3, false) - % DoubleToString(totalWastedRP, 3, false))))); + m_research_wasted->SetBrowseInfoWnd(boost::shared_ptr<GG::BrowseInfoWnd>( + new TextBrowseWnd(UserString("MAP_RES_WASTED_TITLE"), + boost::io::str(FlexibleFormat(UserString("MAP_RES_WASTED_TEXT")) + % DoubleToString(totalProduction, 3, false) + % DoubleToString(totalWastedRP, 3, false))))); } else { m_research_wasted->Hide(); } } void MapWnd::RefreshIndustryResourceIndicator() { - const Empire *empire = HumanClientApp::GetApp()->Empires().Lookup( HumanClientApp::GetApp()->EmpireID() ); + const Empire *empire = HumanClientApp::GetApp()->Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (!empire) return; m_industry->SetValue(empire->ResourceProduction(RE_INDUSTRY)); @@ -4207,10 +4209,11 @@ double totalWastedPP = totalProduction - totalPPSpent; if (totalWastedPP > 0){ m_industry_wasted->Show(); - m_industry_wasted->SetBrowseInfoWnd(boost::shared_ptr<GG::BrowseInfoWnd>(new TextBrowseWnd(UserString("MAP_PROD_WASTED_TITLE"), - boost::io::str(FlexibleFormat(UserString("MAP_PROD_WASTED_TEXT")) % DoubleToString(totalProduction, 3, false) - % DoubleToString(totalWastedPP, 3, false))))); - + m_industry_wasted->SetBrowseInfoWnd(boost::shared_ptr<GG::BrowseInfoWnd>( + new TextBrowseWnd(UserString("MAP_PROD_WASTED_TITLE"), + boost::io::str(FlexibleFormat(UserString("MAP_PROD_WASTED_TEXT")) + % DoubleToString(totalProduction, 3, false) + % DoubleToString(totalWastedPP, 3, false))))); } else { m_industry_wasted->Hide(); } |
From: <geo...@us...> - 2012-11-25 07:50:30
|
Revision: 5460 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5460&view=rev Author: geoffthemedio Date: 2012-11-25 07:50:21 +0000 (Sun, 25 Nov 2012) Log Message: ----------- Removed unused code accidentally added in recent commit. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2012-11-24 17:11:21 UTC (rev 5459) +++ trunk/FreeOrion/UI/MapWnd.cpp 2012-11-25 07:50:21 UTC (rev 5460) @@ -4223,32 +4223,6 @@ } } -const GG::Y ICON_HEIGHT(24); -const int EDGE_PAD(3); -class CensusListWnd : public GG::BrowseInfoWnd { - -private: - -public: - CensusListWnd(){ - Resize(GG::Pt(Width(), Height())); - }; - - void Update(){ - Resize(GG::Pt(Width(), Height())); - } - - void Render(){ - GG::Pt ul = UpperLeft(); - GG::Pt lr = LowerRight(); - FlatRectangle(ul, lr, ClientUI::WndColor(), ClientUI::WndOuterBorderColor(), 1); - }; - bool WndHasBrowseInfo(const Wnd* wnd, std::size_t mode) const { - return true; - }; -}; - - void MapWnd::RefreshPopulationIndicator() { Empire* empire = HumanClientApp::GetApp()->Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (!empire) |
From: <geo...@us...> - 2012-11-26 02:18:20
|
Revision: 5463 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5463&view=rev Author: geoffthemedio Date: 2012-11-26 02:18:13 +0000 (Mon, 26 Nov 2012) Log Message: ----------- -Slightly tweaked patch by Dilvish to add logging of human player empire stats useful for making empire production output progression graphs. -Replaced some references with direct calls to Empires(). Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2012-11-25 10:19:41 UTC (rev 5462) +++ trunk/FreeOrion/UI/MapWnd.cpp 2012-11-26 02:18:13 UTC (rev 5463) @@ -1751,13 +1751,12 @@ //Logger().debugStream() << "Visible UniverseObjects: "; //objects.Dump(); - EmpireManager& manager = HumanClientApp::GetApp()->Empires(); //// DEBUG - //for (EmpireManager::const_iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) + //for (EmpireManager::const_iterator empire_it = Empires().begin(); empire_it != Empires().end(); ++empire_it) // Logger().debugStream() << "MapWnd::InitTurn: empire id: " << empire_it->first << " named: " << empire_it->second->Name(); //// END DEBUG - Empire* this_client_empire = manager.Lookup(HumanClientApp::GetApp()->EmpireID()); + Empire* this_client_empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); // update effect accounting and meter estimates @@ -1857,7 +1856,7 @@ timer.restart(); - for (EmpireManager::iterator it = manager.begin(); it != manager.end(); ++it) + for (EmpireManager::iterator it = Empires().begin(); it != Empires().end(); ++it) it->second->UpdateResourcePools(); @@ -2225,7 +2224,6 @@ const GG::Clr UNOWNED_LANE_COLOUR = GetOptionsDB().Get<StreamableColor>("UI.unowned-starlane-colour").ToClr(); int empire_id = HumanClientApp::GetApp()->EmpireID(); - EmpireManager& manager = HumanClientApp::GetApp()->Empires(); const std::set<int>& this_client_known_destroyed_objects = GetUniverse().EmpireKnownDestroyedObjectIDs(HumanClientApp::GetApp()->EmpireID()); Empire* this_client_empire = Empires().Lookup(empire_id); @@ -2378,7 +2376,7 @@ // determine colour(s) for lane based on which empire(s) can transfer resources along the lane. // todo: multiple rendered lanes (one for each empire) when multiple empires use the same lane. 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) { + for (EmpireManager::iterator empire_it = Empires().begin(); empire_it != Empires().end(); ++empire_it) { Empire* empire = empire_it->second; const std::set<std::pair<int, int> >& resource_supply_lanes = empire->SupplyStarlaneTraversals(); @@ -2449,7 +2447,7 @@ lane_colour.a); } - for (EmpireManager::iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { + for (EmpireManager::iterator empire_it = Empires().begin(); empire_it != Empires().end(); ++empire_it) { Empire* empire = empire_it->second; const std::set<std::pair<int, int> >& resource_obstructed_supply_lanes = empire->SupplyOstructedStarlaneTraversals(); @@ -3915,6 +3913,14 @@ bool MapWnd::EndTurn() { Logger().debugStream() << "MapWnd::EndTurn"; + const Empire *empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + if (empire) { + double RP = empire->ResourceProduction(RE_RESEARCH); + double PP = empire->ResourceProduction(RE_INDUSTRY); + int turn_number = CurrentTurn(); + float ratio = (RP/(PP+0.0001)); + Logger().debugStream() << "Current Output (turn " << turn_number << " ) RP/PP: " << ratio << " ( " << RP << "/"<< PP << ")"; + } HumanClientApp::GetApp()->StartTurn(); return true; } |