Exemple #1
0
	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();
	}
Exemple #2
0
	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();
	}