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