• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

MyGUI_LayerNode.cpp

Go to the documentation of this file.
00001 
00007 /*
00008     This file is part of MyGUI.
00009     
00010     MyGUI is free software: you can redistribute it and/or modify
00011     it under the terms of the GNU Lesser General Public License as published by
00012     the Free Software Foundation, either version 3 of the License, or
00013     (at your option) any later version.
00014     
00015     MyGUI is distributed in the hope that it will be useful,
00016     but WITHOUT ANY WARRANTY; without even the implied warranty of
00017     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018     GNU Lesser General Public License for more details.
00019     
00020     You should have received a copy of the GNU Lesser General Public License
00021     along with MyGUI.  If not, see <http://www.gnu.org/licenses/>.
00022 */
00023 
00024 #include "MyGUI_Precompiled.h"
00025 #include "MyGUI_LayerNode.h"
00026 #include "MyGUI_ILayerItem.h"
00027 #include "MyGUI_ISubWidget.h"
00028 #include "MyGUI_ISubWidgetText.h"
00029 
00030 namespace MyGUI
00031 {
00032 
00033     LayerNode::LayerNode(ILayer* _layer, ILayerNode* _parent) :
00034         mParent(_parent),
00035         mLayer(_layer)
00036     {
00037     }
00038 
00039     LayerNode::~LayerNode()
00040     {
00041         for (VectorRenderItem::iterator iter=mFirstRenderItems.begin(); iter!=mFirstRenderItems.end(); ++iter)
00042         {
00043             delete (*iter);
00044         }
00045         mFirstRenderItems.clear();
00046 
00047         for (VectorRenderItem::iterator iter=mSecondRenderItems.begin(); iter!=mSecondRenderItems.end(); ++iter)
00048         {
00049             delete (*iter);
00050         }
00051         mSecondRenderItems.clear();
00052 
00053         // удаляем дочерние узлы
00054         for (VectorILayerNode::iterator iter = mChildItems.begin(); iter!=mChildItems.end(); ++iter)
00055         {
00056             delete (*iter);
00057         }
00058         mChildItems.clear();
00059     }
00060 
00061     ILayerNode* LayerNode::createChildItemNode()
00062     {
00063         LayerNode* layer = new LayerNode(mLayer, this);
00064         mChildItems.push_back(layer);
00065         return layer;
00066     }
00067 
00068     void LayerNode::destroyChildItemNode(ILayerNode* _node)
00069     {
00070         for (VectorILayerNode::iterator iter=mChildItems.begin(); iter!=mChildItems.end(); ++iter)
00071         {
00072             if ((*iter) == _node)
00073             {
00074                 delete _node;
00075                 mChildItems.erase(iter);
00076                 return;
00077             }
00078         }
00079         MYGUI_EXCEPT("item node not found");
00080     }
00081 
00082     void LayerNode::upChildItemNode(ILayerNode* _item)
00083     {
00084         for (VectorILayerNode::iterator iter=mChildItems.begin(); iter!=mChildItems.end(); ++iter)
00085         {
00086             if ((*iter) == _item)
00087             {
00088                 mChildItems.erase(iter);
00089                 mChildItems.push_back(_item);
00090                 return;
00091             }
00092         }
00093         MYGUI_EXCEPT("item node not found");
00094     }
00095 
00096     void LayerNode::renderToTarget(IRenderTarget* _target, bool _update)
00097     {
00098         // сначала отрисовываем свое
00099         for (VectorRenderItem::iterator iter=mFirstRenderItems.begin(); iter!=mFirstRenderItems.end(); ++iter)
00100         {
00101             (*iter)->renderToTarget(_target, _update);
00102         }
00103         for (VectorRenderItem::iterator iter=mSecondRenderItems.begin(); iter!=mSecondRenderItems.end(); ++iter)
00104         {
00105             (*iter)->renderToTarget(_target, _update);
00106         }
00107 
00108         // теперь отрисовываем дочерние узлы
00109         for (VectorILayerNode::iterator iter = mChildItems.begin(); iter!=mChildItems.end(); ++iter)
00110         {
00111             (*iter)->renderToTarget(_target, _update);
00112         }
00113     }
00114 
00115     ILayerItem* LayerNode::getLayerItemByPoint(int _left, int _top)
00116     {
00117         // сначала пикаем детей
00118         for (VectorILayerNode::iterator iter = mChildItems.begin(); iter!=mChildItems.end(); ++iter)
00119         {
00120             ILayerItem * item = (*iter)->getLayerItemByPoint(_left, _top);
00121             if (nullptr != item) return item;
00122         }
00123 
00124         for (VectorLayerItem::iterator iter=mLayerItems.begin(); iter!=mLayerItems.end(); ++iter)
00125         {
00126             ILayerItem * item = (*iter)->getLayerItemByPoint(_left, _top);
00127             if (nullptr != item) return item;
00128         }
00129 
00130         return nullptr;
00131     }
00132 
00133     RenderItem* LayerNode::addToRenderItem(const std::string& _texture, ISubWidget* _item)
00134     {
00135         bool first = _item->castType<ISubWidgetText>(false) == nullptr;
00136         // для первичной очереди нужен порядок
00137         if (first)
00138         {
00139             if (mFirstRenderItems.empty())
00140             {
00141                 // создаем новый буфер
00142                 RenderItem * item = new RenderItem(_texture);
00143                 mFirstRenderItems.push_back(item);
00144 
00145                 return item;
00146             }
00147 
00148             // если последний буфер пустой, то мона не создавать
00149             if (mFirstRenderItems.back()->getNeedVertexCount() == 0)
00150             {
00151                 // пустых может быть сколько угодно, нужен самый первый из пустых
00152                 for (VectorRenderItem::iterator iter=mFirstRenderItems.begin(); iter!=mFirstRenderItems.end(); ++iter)
00153                 {
00154                     if ((*iter)->getNeedVertexCount() == 0)
00155                     {
00156                         // а теперь внимание, если перед пустым наш, то его и юзаем
00157                         if (iter != mFirstRenderItems.begin())
00158                         {
00159                             VectorRenderItem::iterator prev = iter - 1;
00160                             if ((*prev)->getTextureName() == _texture)
00161                             {
00162                                 return (*prev);
00163                             }
00164                         }
00165                         (*iter)->setTextureName(_texture);
00166                         return (*iter);
00167                     }
00168                 }
00169             }
00170 
00171             // та же текстура
00172             if (mFirstRenderItems.back()->getTextureName() == _texture)
00173             {
00174                 return mFirstRenderItems.back();
00175             }
00176 
00177             // создаем новый буфер
00178             RenderItem * item = new RenderItem(_texture);
00179             mFirstRenderItems.push_back(item);
00180 
00181             return item;
00182         }
00183 
00184         // для второй очереди порядок неважен
00185         for (VectorRenderItem::iterator iter=mSecondRenderItems.begin(); iter!=mSecondRenderItems.end(); ++iter)
00186         {
00187             // либо такая же текстура, либо пустой буфер
00188             if ((*iter)->getTextureName() == _texture)
00189             {
00190                 return (*iter);
00191             }
00192             else if ((*iter)->getNeedVertexCount() == 0)
00193             {
00194                 (*iter)->setTextureName(_texture);
00195                 return (*iter);
00196             }
00197 
00198         }
00199         // не найденно создадим новый
00200         mSecondRenderItems.push_back(new RenderItem(_texture));
00201         return mSecondRenderItems.back();
00202     }
00203 
00204     void LayerNode::attachLayerItem(ILayerItem* _item)
00205     {
00206         mLayerItems.push_back(_item);
00207         _item->attachItemToNode(mLayer, this);
00208     }
00209 
00210     void LayerNode::detachLayerItem(ILayerItem* _item)
00211     {
00212         for (VectorLayerItem::iterator iter=mLayerItems.begin(); iter!=mLayerItems.end(); ++iter)
00213         {
00214             if ((*iter) == _item)
00215             {
00216                 (*iter) = mLayerItems.back();
00217                 mLayerItems.pop_back();
00218                 return;
00219             }
00220         }
00221         MYGUI_EXCEPT("layer item not found");
00222     }
00223 
00224     void LayerNode::outOfDate(RenderItem* _item)
00225     {
00226         if (_item)
00227             _item->outOfDate();
00228     }
00229 
00230     EnumeratorILayerNode LayerNode::getEnumerator()
00231     {
00232         return EnumeratorILayerNode(mChildItems);
00233     }
00234 
00235 } // namespace MyGUI

Generated on Sun Jan 30 2011 for MyGUI by  doxygen 1.7.1