RenderItem* LayerNode::addToRenderItem(ITexture* _texture, bool _firstQueue, bool _manualRender) { // для первичной очереди нужен порядок if (_firstQueue) { if (mFirstRenderItems.empty() || _manualRender) { // создаем новый буфер RenderItem* item = new RenderItem(); item->setTexture(_texture); item->setManualRender(_manualRender); mFirstRenderItems.push_back(item); mOutOfDate = false; return item; } // если в конце пустой буфер, то нуна найти последний пустой с краю // либо с нужной текстурой за пустым VectorRenderItem::reverse_iterator iter = mFirstRenderItems.rbegin(); if ((*iter)->getNeedVertexCount() == 0) { while (true) { VectorRenderItem::reverse_iterator next = iter + 1; if (next != mFirstRenderItems.rend()) { if ((*next)->getNeedVertexCount() == 0) { iter = next; continue; } else if (!(*next)->getManualRender() && (*next)->getTexture() == _texture) { iter = next; } } break; } (*iter)->setTexture(_texture); mOutOfDate = false; return (*iter); } // последний буфер с нужной текстурой else if (!(*iter)->getManualRender() && (*iter)->getTexture() == _texture) { mOutOfDate = false; return *iter; } // создаем новый буфер RenderItem* item = new RenderItem(); item->setTexture(_texture); item->setManualRender(_manualRender); mFirstRenderItems.push_back(item); mOutOfDate = false; return item; } // для второй очереди порядок неважен for (VectorRenderItem::iterator iter = mSecondRenderItems.begin(); iter != mSecondRenderItems.end(); ++iter) { // либо такая же текстура, либо пустой буфер if ((*iter)->getTexture() == _texture) { mOutOfDate = false; return (*iter); } else if ((*iter)->getNeedVertexCount() == 0) { (*iter)->setTexture(_texture); mOutOfDate = false; return (*iter); } } // не найденно создадим новый RenderItem* item = new RenderItem(); item->setTexture(_texture); item->setManualRender(_manualRender); mSecondRenderItems.push_back(item); mOutOfDate = false; return mSecondRenderItems.back(); }
RenderItem* LayerNode::addToRenderItem(ITexture* _texture, ISubWidget* _item) { bool first = _item->castType<ISubWidgetText>(false) == nullptr; // для первичной очереди нужен порядок if (first) { if (mFirstRenderItems.empty()) { // создаем новый буфер RenderItem * item = new RenderItem(); item->setTexture(_texture); mFirstRenderItems.push_back(item); return item; } // если последний буфер пустой, то мона не создавать if (mFirstRenderItems.back()->getNeedVertexCount() == 0) { // пустых может быть сколько угодно, нужен самый первый из пустых for (VectorRenderItem::iterator iter=mFirstRenderItems.begin(); iter!=mFirstRenderItems.end(); ++iter) { if ((*iter)->getNeedVertexCount() == 0) { // а теперь внимание, если перед пустым наш, то его и юзаем if (iter != mFirstRenderItems.begin()) { VectorRenderItem::iterator prev = iter - 1; if ((*prev)->getTexture() == _texture) { return (*prev); } } (*iter)->setTexture(_texture); return (*iter); } } } // та же текстура if (mFirstRenderItems.back()->getTexture() == _texture) { return mFirstRenderItems.back(); } // создаем новый буфер RenderItem * item = new RenderItem(); item->setTexture(_texture); mFirstRenderItems.push_back(item); return item; } // для второй очереди порядок неважен for (VectorRenderItem::iterator iter=mSecondRenderItems.begin(); iter!=mSecondRenderItems.end(); ++iter) { // либо такая же текстура, либо пустой буфер if ((*iter)->getTexture() == _texture) { return (*iter); } else if ((*iter)->getNeedVertexCount() == 0) { (*iter)->setTexture(_texture); return (*iter); } } // не найденно создадим новый RenderItem * item = new RenderItem(); item->setTexture(_texture); mSecondRenderItems.push_back(item); return mSecondRenderItems.back(); }