00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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 }