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(); }