Example #1
0
int ccMaterialSet::addMaterial(ccMaterial::CShared mtl, bool allowDuplicateNames/*=false*/)
{
	if (!mtl)
	{
		//invalid input material
		return -1;
	}
	 
	//material already exists?
	int previousIndex = findMaterialByName(mtl->getName());
	//DGM: warning, the materials may have the same name, but they may be different in reality (other texture, etc.)!
	if (previousIndex >= 0)
	{
		const ccMaterial::CShared& previousMtl = (*this)[previousIndex];
		if (!previousMtl->compare(*mtl))
		{
			//in fact the material is a bit different
			previousIndex = -1;
			if (!allowDuplicateNames)
			{
				//generate a new name
				static const unsigned MAX_ATTEMPTS = 100;
				for (unsigned i=1 ; i < MAX_ATTEMPTS; i++)
				{
					QString newMtlName = previousMtl->getName() + QString("_%1").arg(i);
					if (findMaterialByName(newMtlName) < 0)
					{
						//we duplicate the material and we change its name
						ccMaterial::Shared newMtl(new ccMaterial(*mtl));
						newMtl->setName(newMtlName);
						mtl = newMtl;
						break;
					}
				}
			}
		}
	}
	if (previousIndex >= 0 && !allowDuplicateNames)
		return previousIndex;

	try
	{
		push_back(mtl);
	}
	catch (const std::bad_alloc&)
	{
		//not enough memory
		return -1;
	}

	return static_cast<int>(size())-1;
}
Example #2
0
s32 CMaterialsManager::addMaterial(const vid::SMaterial &m, const c8 *name)
{
	u64 hash = m.getHash();
	if (findMaterialByHash(hash) != -1)
		return -1;
	if (findMaterialByName(name) != -1)
		return -1;
	Materials.push_back(SMeshBufferMaterial(m, (vid::E_VERTEX_TYPE)-1, name));
	_updateMaterialsHash();
	return findMaterialByHash(hash);
}