//-------------------------------------------------------------------------------------------------- // Name: LoadParticleEffect // Desc: Loads and calls AddRef on a particle effect //-------------------------------------------------------------------------------------------------- IParticleEffect* CGameEffect::LoadParticleEffect(const char* pParticleEffectName) { IParticleEffect* pParticleEffect = NULL; IParticleManager* pParticleManager = gEnv->pParticleManager; if(pParticleEffectName && pParticleManager) { pParticleEffect = gEnv->pParticleManager->FindEffect(pParticleEffectName); if(pParticleEffect) { pParticleEffect->AddRef(); } } return pParticleEffect; }//-------------------------------------------------------------------------------------------------
void CBurnEffectManager::SpawnImpactEffect(const EventPhysCollision& pCollision, const char* effectName) { Vec3 surfaceNormal = pCollision.n; Vec3 surfacePosition = pCollision.pt; CItemParticleEffectCache& particleCache = g_pGame->GetGameSharedParametersStorage()->GetItemResourceCache().GetParticleEffectCache(); IParticleEffect* pParticleEffect = particleCache.GetCachedParticle(effectName); if (pParticleEffect) { Matrix34 loc; loc.SetIdentity(); loc.SetTranslation(surfacePosition); loc.SetRotation33(OrthoNormalVector(surfaceNormal)); pParticleEffect->Spawn(false, loc); } }
void CBurnEffectManager::CreateBurnEffect(const EventPhysCollision& pCollision, CBurnEffectManager::SBurnPoint* pBurnPoint) { Vec3 surfaceNormal = pCollision.n; Vec3 hitDir(ZERO); if (pCollision.vloc[0].GetLengthSquared() > 1e-6f) { hitDir = pCollision.vloc[0].GetNormalized(); } Vec3 surfacePosition = pCollision.pt; Vec3 halfVector = (surfaceNormal + (-hitDir)).GetNormalized(); CItemParticleEffectCache& particleCache = g_pGame->GetGameSharedParametersStorage()->GetItemResourceCache().GetParticleEffectCache(); IParticleEffect* pParticleEffect = particleCache.GetCachedParticle(pBurnPoint->m_pBurnParams->m_effectName); if (pParticleEffect) { Matrix34 loc; loc.SetIdentity(); loc.SetTranslation(surfacePosition); loc.SetRotation33(OrthoNormalVector(surfaceNormal)); IParticleEmitter* pEffect = pParticleEffect->Spawn(false, loc); if(pEffect) { pEffect->AddRef(); pBurnPoint->m_effect = pEffect; const ParticleParams& particleParams = pParticleEffect->GetParticleParams(); pBurnPoint->m_attachType = particleParams.eAttachType; pBurnPoint->m_attachForm = particleParams.eAttachForm; } UpdateBurnEffect(pBurnPoint); } UpdateBurnEffect(pBurnPoint); }
//------------------------------------------------------------------------ void CItem::SpawnEffect(int slot, const char *effectName, const char *helper, const Vec3 &offset, const Vec3 &dir, float scale) { if (m_stats.mounted) slot=eIGS_FirstPerson; Vec3 position(0,0,0); Vec3 finalOffset = offset; SEntitySlotInfo slotInfo; if (GetEntity()->GetSlotInfo(slot, slotInfo)) { if (slotInfo.pStatObj) // entity slot { // get helper position IStatObj *pStatsObj = slotInfo.pStatObj; position = pStatsObj->GetHelperPos(helper); position = GetEntity()->GetSlotWorldTM(slot).TransformPoint(position); } else if (slotInfo.pCharacter) // bone attachment { ICharacterInstance *pCharacter = slotInfo.pCharacter; IAttachmentManager *pAttachmentManager = pCharacter->GetIAttachmentManager(); IAttachment *pAttachment = pAttachmentManager->GetInterfaceByName(helper); if (pAttachment) { const Matrix34 m = Matrix34(pAttachment->GetAttWorldAbsolute()); position = m.GetTranslation(); } else { int16 id = pCharacter->GetISkeletonPose()->GetJointIDByName(helper); if (id>=0) position = pCharacter->GetISkeletonPose()->GetAbsJointByID(id).t; position = GetEntity()->GetSlotWorldTM(slot).TransformPoint(position); } } } else if(m_stats.mounted && !m_stats.fp) { if(GetIWeapon()) { // if no helper specified, try getting pos from firing locator IWeaponFiringLocator *pLocator = GetIWeapon()->GetFiringLocator(); if (pLocator) { if(!pLocator->GetFiringPos(GetEntityId(), NULL, position)) position.Set(0.0f,0.0f,0.0f); else finalOffset = GetEntity()->GetWorldTM().TransformVector(finalOffset); } } } position += finalOffset; IParticleEffect *pParticleEffect = gEnv->pParticleManager->FindEffect(effectName); if (pParticleEffect) pParticleEffect->Spawn(true, IParticleEffect::ParticleLoc(position, dir, scale)); }