//-------------------------------------------------------------------------------------------------- // Name: SetMaterialOnEntity // Desc: Sets material on entity //-------------------------------------------------------------------------------------------------- void CGameEffect::SetMaterialOnEntity(IMaterial* pMaterial,EntityId entityId,PodArray<ItemString>* bodyAttachmentNameArray) { if(pMaterial && bodyAttachmentNameArray) { IEntity* pEntity = gEnv->pEntitySystem->GetEntity(entityId); if(pEntity) { SEntitySlotInfo slotInfo; bool gotSlotInfo = pEntity->GetSlotInfo(0, slotInfo); if(gotSlotInfo && slotInfo.pCharacter) { IAttachmentManager* pAttachmentManager = slotInfo.pCharacter->GetIAttachmentManager(); if(pAttachmentManager) { int attachmentCount = bodyAttachmentNameArray->size(); for(int i=0; i<attachmentCount; i++) { IAttachment* attachment = pAttachmentManager->GetInterfaceByName(((*bodyAttachmentNameArray)[i]).c_str()); if(attachment) { IAttachmentObject* attachmentObj = attachment->GetIAttachmentObject(); if(attachmentObj) { attachmentObj->SetReplacementMaterial(pMaterial); } } } } } } } }//-------------------------------------------------------------------------------------------------
void CBodyDestrutibilityInstance::ResetMaterials( IEntity& characterEntity, ICharacterInstance& characterInstance ) { characterEntity.SetSlotMaterial(0, NULL); IAttachmentManager *pAttachmentManager = characterInstance.GetIAttachmentManager(); CRY_ASSERT(pAttachmentManager); const uint32 attachmentCount = (uint32)pAttachmentManager->GetAttachmentCount(); for(TOriginalMaterials::iterator it = m_originalMaterials.begin(); it != m_originalMaterials.end(); ++it) { IAttachmentObject *pAttachmentObject = (it->first < attachmentCount) ? pAttachmentManager->GetInterfaceByIndex(it->first)->GetIAttachmentObject() : NULL; if (pAttachmentObject) { pAttachmentObject->SetReplacementMaterial(it->second); it->second->Release(); } } m_originalMaterials.clear(); }
void CBodyDestrutibilityInstance::ReplaceMaterial( IEntity& characterEntity, ICharacterInstance& characterInstance, IMaterial& replacementMaterial ) { IMaterial* pCurrentMaterial = characterInstance.GetIMaterial(); if ((pCurrentMaterial != NULL) && stricmp(pCurrentMaterial->GetName(), replacementMaterial.GetName())) { characterEntity.SetSlotMaterial(0, &replacementMaterial); } const bool storeOriginalReplacementMaterials = m_originalMaterials.empty(); IAttachmentManager *pAttachmentManager = characterInstance.GetIAttachmentManager(); CRY_ASSERT(pAttachmentManager); const int attachmentCount = pAttachmentManager->GetAttachmentCount(); for (int attachmentIdx = 0; attachmentIdx < attachmentCount; ++attachmentIdx) { IAttachmentObject *pAttachmentObject = pAttachmentManager->GetInterfaceByIndex(attachmentIdx)->GetIAttachmentObject(); if (pAttachmentObject) { IMaterial* pAttachMaterial = (IMaterial*)pAttachmentObject->GetBaseMaterial(); if ((pAttachMaterial != NULL) && stricmp(pAttachMaterial->GetName(), replacementMaterial.GetName())) { if (storeOriginalReplacementMaterials) { IMaterial* pOriginalReplacementMaterial = pAttachmentObject->GetReplacementMaterial(); if(pOriginalReplacementMaterial != NULL) { pOriginalReplacementMaterial->AddRef(); m_originalMaterials.push_back(TAttachmentMaterialPair((uint32)attachmentIdx, pOriginalReplacementMaterial)); } } pAttachmentObject->SetReplacementMaterial(&replacementMaterial); } } } }