From: <be...@us...> - 2011-12-22 21:56:13
|
Revision: 618 http://freesynd.svn.sourceforge.net/freesynd/?rev=618&view=rev Author: benblan Date: 2011-12-22 21:56:06 +0000 (Thu, 22 Dec 2011) Log Message: ----------- extended the use of dirty list to the Menu::handleRender() method Modified Paths: -------------- freesynd/trunk/src/gfx/dirtylist.cpp freesynd/trunk/src/gfx/dirtylist.h freesynd/trunk/src/menus/briefmenu.cpp freesynd/trunk/src/menus/briefmenu.h freesynd/trunk/src/menus/confmenu.cpp freesynd/trunk/src/menus/confmenu.h freesynd/trunk/src/menus/debriefmenu.cpp freesynd/trunk/src/menus/debriefmenu.h freesynd/trunk/src/menus/gameplaymenu.cpp freesynd/trunk/src/menus/gameplaymenu.h freesynd/trunk/src/menus/mapmenu.cpp freesynd/trunk/src/menus/mapmenu.h freesynd/trunk/src/menus/menu.cpp freesynd/trunk/src/menus/menu.h freesynd/trunk/src/menus/menumanager.cpp freesynd/trunk/src/menus/researchmenu.cpp freesynd/trunk/src/menus/researchmenu.h freesynd/trunk/src/menus/selectmenu.cpp freesynd/trunk/src/menus/selectmenu.h Modified: freesynd/trunk/src/gfx/dirtylist.cpp =================================================================== --- freesynd/trunk/src/gfx/dirtylist.cpp 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/gfx/dirtylist.cpp 2011-12-22 21:56:06 UTC (rev 618) @@ -140,3 +140,23 @@ } pHead_ = NULL; } + +bool DirtyList::intersectsList(int x, int y, int width, int height) +{ + if (pHead_) { + Link * l = pHead_; + while (l) { + if ( !((x > l->element.x + l->element.width) || + (x + width < l->element.x) || + (y > l->element.y + l->element.height) || + (y + height < l->element.y)) ) { + return true; + } + + + l = l->pNext; + } + } + + return false; +} Modified: freesynd/trunk/src/gfx/dirtylist.h =================================================================== --- freesynd/trunk/src/gfx/dirtylist.h 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/gfx/dirtylist.h 2011-12-22 21:56:06 UTC (rev 618) @@ -44,6 +44,9 @@ void flush(); + //! Returns true if the given rect intersects with any dirty rect in the list + bool intersectsList(int x, int y, int width, int height); + private: struct Link { Modified: freesynd/trunk/src/menus/briefmenu.cpp =================================================================== --- freesynd/trunk/src/menus/briefmenu.cpp 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/briefmenu.cpp 2011-12-22 21:56:06 UTC (rev 618) @@ -136,7 +136,7 @@ g_System.showCursor(); } -void BriefMenu::handleRender() { +void BriefMenu::handleRender(DirtyList &dirtyList) { g_Screen.drawLogo(18, 14, g_Session.getLogo(), g_Session.getLogoColour()); Modified: freesynd/trunk/src/menus/briefmenu.h =================================================================== --- freesynd/trunk/src/menus/briefmenu.h 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/briefmenu.h 2011-12-22 21:56:06 UTC (rev 618) @@ -40,7 +40,7 @@ void handleTick(int elapsed); void handleShow(); - void handleRender(); + void handleRender(DirtyList &dirtyList); void handleLeave(); void handleAction(const int actionId, void *ctx, const int modKeys); Modified: freesynd/trunk/src/menus/confmenu.cpp =================================================================== --- freesynd/trunk/src/menus/confmenu.cpp 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/confmenu.cpp 2011-12-22 21:56:06 UTC (rev 618) @@ -114,7 +114,7 @@ pCompNameTF_ = addTextField(312, 79, 255, 21, FontManager::SIZE_2, NAME_MAX_SIZE); } -void ConfMenu::handleRender() { +void ConfMenu::handleRender(DirtyList &dirtyList) { // Draw the current logo g_Screen.drawLogo(28, 22, toAcceptLogo_, g_Colours[toAcceptColourId_]); Modified: freesynd/trunk/src/menus/confmenu.h =================================================================== --- freesynd/trunk/src/menus/confmenu.h 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/confmenu.h 2011-12-22 21:56:06 UTC (rev 618) @@ -35,7 +35,7 @@ ConfMenu(MenuManager *m); ~ConfMenu(); - virtual void handleRender(); + virtual void handleRender(DirtyList &dirtyList); void handleShow(); void handleLeave(); Modified: freesynd/trunk/src/menus/debriefmenu.cpp =================================================================== --- freesynd/trunk/src/menus/debriefmenu.cpp 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/debriefmenu.cpp 2011-12-22 21:56:06 UTC (rev 618) @@ -160,7 +160,7 @@ } } -void DebriefMenu::handleRender() { +void DebriefMenu::handleRender(DirtyList &dirtyList) { // Display team logo g_Screen.drawLogo(18, 14, g_App.getGameSession().getLogo(), g_App.getGameSession().getLogoColour()); Modified: freesynd/trunk/src/menus/debriefmenu.h =================================================================== --- freesynd/trunk/src/menus/debriefmenu.h 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/debriefmenu.h 2011-12-22 21:56:06 UTC (rev 618) @@ -36,7 +36,7 @@ DebriefMenu(MenuManager *m); void handleShow(); - void handleRender(); + void handleRender(DirtyList &dirtyList); void handleLeave(); void handleGameEvent(GameEvent evt); Modified: freesynd/trunk/src/menus/gameplaymenu.cpp =================================================================== --- freesynd/trunk/src/menus/gameplaymenu.cpp 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/gameplaymenu.cpp 2011-12-22 21:56:06 UTC (rev 618) @@ -309,7 +309,7 @@ } if (change) { - render(); + needRendering(); // force pointing_at_ped / vehicle to update handleMouseMotion(last_motion_x_, last_motion_y_, 0, KMD_NONE); } @@ -404,7 +404,7 @@ int qanim = 200, qframe = 0; -void GameplayMenu::handleRender() +void GameplayMenu::handleRender(DirtyList &dirtyList) { g_Screen.clear(0); mission_->drawMap(world_x_, world_y_); @@ -851,7 +851,8 @@ } if (change) - render(); + //render(); + needRendering(); return true; } Modified: freesynd/trunk/src/menus/gameplaymenu.h =================================================================== --- freesynd/trunk/src/menus/gameplaymenu.h 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/gameplaymenu.h 2011-12-22 21:56:06 UTC (rev 618) @@ -38,7 +38,7 @@ void handleTick(int elapsed); void handleShow(); - void handleRender(); + void handleRender(DirtyList &dirtyList); void handleLeave(); protected: Modified: freesynd/trunk/src/menus/mapmenu.cpp =================================================================== --- freesynd/trunk/src/menus/mapmenu.cpp 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/mapmenu.cpp 2011-12-22 21:56:06 UTC (rev 618) @@ -342,7 +342,7 @@ updateClock(); } -void MapMenu::handleRender() +void MapMenu::handleRender(DirtyList &dirtyList) { // Draws all countries for (int i = 0; i < GameSession::NB_MISSION; i++) { Modified: freesynd/trunk/src/menus/mapmenu.h =================================================================== --- freesynd/trunk/src/menus/mapmenu.h 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/mapmenu.h 2011-12-22 21:56:06 UTC (rev 618) @@ -41,11 +41,11 @@ void handleTick(int elapsed); void handleShow(); - void handleRender(); void handleLeave(); void handleAction(const int actionId, void *ctx, const int modKeys); protected: + void handleRender(DirtyList &dirtyList); bool handleUnknownKey(Key key, const int modKeys); bool handleMouseDown(int x, int y, int button, const int modKeys); //! Utility method to draw the mission selector Modified: freesynd/trunk/src/menus/menu.cpp =================================================================== --- freesynd/trunk/src/menus/menu.cpp 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/menu.cpp 2011-12-22 21:56:06 UTC (rev 618) @@ -69,16 +69,6 @@ return menu_manager_->menuSprites(); } -void Menu::redrawOptions() -{ - for (std::list < ActionWidget * >::iterator it = actions_.begin(); - it != actions_.end(); it++) { - if ( (*it)->isVisible()) { - (*it)->draw(); - } - } -} - /*! * Adds a dirty rect the size of the screen. */ @@ -97,19 +87,25 @@ menu_manager_->addRect(x, y, width, height); } -void Menu::render() +void Menu::render(DirtyList &dirtyList) { - handleRender(); + handleRender(dirtyList); for (std::list < MenuText >::iterator it = statics_.begin(); it != statics_.end(); it++) { MenuText & m = *it; - if ( m.isVisible()) { + if ( m.isVisible() && dirtyList.intersectsList(m.getX(), m.getY(), m.getWidth(), m.getHeight()) ) { m.draw(); } } - redrawOptions(); + for (std::list < ActionWidget * >::iterator it = actions_.begin(); + it != actions_.end(); it++) { + ActionWidget * a = *it; + if ( a->isVisible() && dirtyList.intersectsList(a->getX(), a->getY(), a->getWidth(), a->getHeight())) { + a->draw(); + } + } } /*! Modified: freesynd/trunk/src/menus/menu.h =================================================================== --- freesynd/trunk/src/menus/menu.h 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/menu.h 2011-12-22 21:56:06 UTC (rev 618) @@ -32,6 +32,7 @@ #include "keys.h" #include "common.h" #include "menus/widget.h" +#include "gfx/dirtylist.h" class FontManager; class Menu; @@ -106,7 +107,6 @@ //! Adds a mapping between a Printable Key and an Option void registerHotKey(uint16 unicode, int optId); - void render(); //! Does common actions before leaving void leave(); @@ -116,15 +116,12 @@ * been defined) and before the menu is rendered for the first time. */ virtual void handleShow() {} + + //! Main render function + void render(DirtyList &dirtyList); //! Callback function : Childs can reimplement /*! - * Called each time a menu is rendered. - */ - virtual void handleRender() {} - - //! Callback function : Childs can reimplement - /*! * Called just before the closing animation is played (if one has * been defined) and the menu closed. */ @@ -155,6 +152,12 @@ void captureInputBy(TextField *pTextfield); protected: + + //! Callback function : Childs can reimplement + /*! + * Called each time a menu is rendered. + */ + virtual void handleRender(DirtyList &dirtyList) {} //! Handle mouse down event. /*! @@ -165,7 +168,6 @@ virtual void handleMouseMotion(int x, int y, int state, const int modKeys) {} virtual bool handleUnknownKey(Key key, const int modKeys) { return false;} - void redrawOptions(); void needRendering(); void addDirtyRect(int x, int y, int width, int height); Modified: freesynd/trunk/src/menus/menumanager.cpp =================================================================== --- freesynd/trunk/src/menus/menumanager.cpp 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/menumanager.cpp 2011-12-22 21:56:06 UTC (rev 618) @@ -309,10 +309,10 @@ int x,y; int state = g_System.getMousePos(&x, &y); pMenu->mouseMotionEvent(x, y, state, KMD_NONE); - - // First draw completly the menu - pMenu->render(); + // Adds a dirty rect to force menu rendering + addRect(0, 0, g_Screen.gameScreenWidth(), g_Screen.gameScreenHeight()); + // reopen the event processing drop_events_ = false; } @@ -361,7 +361,7 @@ g_Screen.blitRect(rect->x, rect->y, rect->width, rect->height, background_, false, g_Screen.gameScreenWidth()); } } - current_->render(); + current_->render(dirtyList_); // flush dirty list dirtyList_.flush(); } Modified: freesynd/trunk/src/menus/researchmenu.cpp =================================================================== --- freesynd/trunk/src/menus/researchmenu.cpp 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/researchmenu.cpp 2011-12-22 21:56:06 UTC (rev 618) @@ -264,7 +264,7 @@ } } -void ResearchMenu::handleRender() +void ResearchMenu::handleRender(DirtyList &dirtyList) { g_Screen.drawLogo(18, 14, g_App.getGameSession().getLogo(), g_App.getGameSession().getLogoColour()); Modified: freesynd/trunk/src/menus/researchmenu.h =================================================================== --- freesynd/trunk/src/menus/researchmenu.h 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/researchmenu.h 2011-12-22 21:56:06 UTC (rev 618) @@ -37,7 +37,7 @@ void handleTick(int elapsed); void handleShow(); - void handleRender(); + void handleRender(DirtyList &dirtyList); void handleLeave(); void handleAction(const int actionId, void *ctx, const int modKeys); void handleGameEvent(GameEvent evt); Modified: freesynd/trunk/src/menus/selectmenu.cpp =================================================================== --- freesynd/trunk/src/menus/selectmenu.cpp 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/selectmenu.cpp 2011-12-22 21:56:06 UTC (rev 618) @@ -337,7 +337,7 @@ } } -void SelectMenu::handleRender() { +void SelectMenu::handleRender(DirtyList &dirtyList) { g_Screen.drawLogo(18, 14, g_App.getGameSession().getLogo(), g_App.getGameSession().getLogoColour()); // write team member icons and health Modified: freesynd/trunk/src/menus/selectmenu.h =================================================================== --- freesynd/trunk/src/menus/selectmenu.h 2011-12-22 10:51:41 UTC (rev 617) +++ freesynd/trunk/src/menus/selectmenu.h 2011-12-22 21:56:06 UTC (rev 618) @@ -40,7 +40,7 @@ void handleTick(int elapsed); void handleShow(); - void handleRender(); + void handleRender(DirtyList &dirtyList); void handleLeave(); void handleAction(const int actionId, void *ctx, const int modKeys); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |