void CEntityObject::OnXForm( CEntity* pEntity ) { UpdateWorldTM(pEntity); if (!m_worldTM.IsValid()) { EntityWarning("CEntityObject::OnXForm: Invalid world matrix: %s", pEntity->GetEntityTextDescription()); return; } if (pLight) { ILightSource* pLightSource = pLight; // Update light positions. CDLight* pDLight = &pLightSource->GetLightProperties(); pDLight->SetPosition( m_worldTM.GetTranslation()); pDLight->SetMatrix(m_worldTM); pDLight->m_sName = pEntity->GetName(); // For debugging only. pDLight->m_nEntityId = pEntity->GetId(); pEntity->UpdateLightClipBounds(*pDLight); pLightSource->SetMatrix(m_worldTM); pLight->SetSrcEntity(pEntity); } else if (pChildRenderNode) { pChildRenderNode->SetMatrix( m_worldTM ); } }
//------------------------------------------------------------------------ void CItem::SetLightRadius(float radius, uint32 id) { TEffectInfoMap::const_iterator it = m_effects.find(id); if (it == m_effects.end()) return; const SEffectInfo &info = it->second; SEntitySlotInfo slotInfo; ILightSource* pLightSource = 0; if (info.slot != -1) { if (GetEntity()->GetSlotInfo(info.slot, slotInfo) && slotInfo.pLight) pLightSource = static_cast<ILightSource*>(slotInfo.pLight); } else if (info.characterSlot != -1) { if (GetEntity()->GetSlotInfo(info.characterSlot, slotInfo) && slotInfo.pCharacter) { IAttachmentManager *pAttachmentManager = slotInfo.pCharacter->GetIAttachmentManager(); IAttachment *pAttachment = pAttachmentManager->GetInterfaceByName(info.helper.c_str()); if (pAttachment) { CLightAttachment *pLightAttachment = static_cast<CLightAttachment *>(pAttachment->GetIAttachmentObject()); if (pLightAttachment) pLightSource = pLightAttachment->GetLightSource(); } } } if (pLightSource) { CDLight& light = pLightSource->GetLightProperties(); light.m_fRadius = radius; pLightSource->SetLightProperties(light); } }
TAttachedEffectId CEffectsController::AttachLight(const int targetSlot, const char *helperName, const SLightAttachParams &attachParams) { CRY_ASSERT(m_pOwnerEntity); CDLight light; light.SetLightColor(ColorF(attachParams.color.x * attachParams.diffuseMultiplier, attachParams.color.y * attachParams.diffuseMultiplier, attachParams.color.z * attachParams.diffuseMultiplier, 1.0f)); light.SetSpecularMult( (float)__fsel( -attachParams.diffuseMultiplier, attachParams.specularMultiplier, (attachParams.specularMultiplier / (attachParams.diffuseMultiplier + FLT_EPSILON)) ) ); light.m_nLightStyle = attachParams.style; light.SetAnimSpeed(attachParams.animSpeed); light.m_fLightFrustumAngle = 45.0f; light.m_fRadius = attachParams.radius; light.m_fLightFrustumAngle = attachParams.projectFov * 0.5f; light.m_fHDRDynamic = attachParams.hdrDynamic; light.m_Flags |= attachParams.deferred ? DLF_DEFERRED_LIGHT : 0; light.m_Flags |= attachParams.castShadows ? DLF_CASTSHADOW_MAPS : 0; light.m_nEntityId = m_pOwnerEntity->GetId(); if (attachParams.projectTexture && attachParams.projectTexture[0]) { light.m_pLightImage = gEnv->pRenderer->EF_LoadTexture(attachParams.projectTexture); if (!light.m_pLightImage || !light.m_pLightImage->IsTextureLoaded()) { GameWarning("[EntityEffects] Entity '%s' failed to load projecting light texture '%s'!", m_pOwnerEntity->GetName(), attachParams.projectTexture); return 0; } } if ((light.m_pLightImage != NULL) && light.m_pLightImage->IsTextureLoaded()) { light.m_Flags |= DLF_PROJECT; } else { if (light.m_pLightImage) { light.m_pLightImage->Release(); } light.m_pLightImage = NULL; light.m_Flags |= DLF_POINT; } IMaterial* pMaterial = NULL; if (attachParams.material && attachParams.material[0]) { pMaterial = gEnv->p3DEngine->GetMaterialManager()->LoadMaterial(attachParams.material); } SEntitySlotInfo slotInfo; SEffectInfo effectInfo; const bool validSlot = m_pOwnerEntity->GetSlotInfo(targetSlot, slotInfo); if (!validSlot || slotInfo.pStatObj) { //Get helper position on static object (if any) Vec3 helperPos(ZERO); Vec3 localHelperPosition = attachParams.offset; if (validSlot) { helperPos = slotInfo.pStatObj->GetHelperPos(helperName); if (helperPos.IsZero()) { const int childCount = m_pOwnerEntity->GetChildCount(); for (int i=0;i<childCount;++i) { if (IEntity* pChild = m_pOwnerEntity->GetChild(i)) { if (IStatObj* statObj = pChild->GetStatObj(targetSlot)) { helperPos = statObj->GetHelperPos(helperName); if (!helperPos.IsZero()) { helperPos += pChild->GetPos(); break; } } } } } localHelperPosition = helperPos + attachParams.offset; localHelperPosition = m_pOwnerEntity->GetSlotLocalTM(targetSlot, false).TransformPoint(localHelperPosition); } int attachSlot = FindSafeSlot(attachParams.firstSafeSlot); ++m_effectGeneratorId; effectInfo.id = m_effectGeneratorId; effectInfo.entityEffectSlot = m_pOwnerEntity->LoadLight(attachSlot, &light); if ((effectInfo.entityEffectSlot >= 0) && pMaterial) { m_pOwnerEntity->SetSlotMaterial(effectInfo.entityEffectSlot, pMaterial); } Matrix34 localEffectMtx = Matrix34(Matrix33::CreateRotationVDir(attachParams.direction)); localEffectMtx.SetTranslation(localHelperPosition); m_pOwnerEntity->SetSlotLocalTM(effectInfo.entityEffectSlot, localEffectMtx); m_attachedEffects.push_back(effectInfo); return m_effectGeneratorId; } else if (slotInfo.pCharacter) { IAttachmentManager *pAttachmentManager = slotInfo.pCharacter->GetIAttachmentManager(); IAttachment *pAttachment = pAttachmentManager->GetInterfaceByName(helperName); if (pAttachment) { CLightAttachment *pLightAttachment = new CLightAttachment(); pLightAttachment->LoadLight(light); ILightSource* pLightSource = pLightAttachment->GetLightSource(); if (pLightSource) { pLightSource->SetMaterial(pMaterial); pLightSource->SetCastingException(attachParams.pCasterException); } pAttachment->AddBinding(pLightAttachment); const bool customOffset = (attachParams.offset != Vec3Constants<float>::fVec3_Zero) || (attachParams.direction != Vec3Constants<float>::fVec3_OneY); if (customOffset) { pAttachment->SetAttRelativeDefault(QuatT(Quat::CreateRotationVDir(attachParams.direction), attachParams.offset)); } } else { GameWarning("[EntityEffects] Entity '%s' trying to attach light to attachment '%s' which does not exist!", m_pOwnerEntity->GetName(), helperName); return 0; } ++m_effectGeneratorId; effectInfo.id = m_effectGeneratorId; effectInfo.helperName = helperName; effectInfo.characterEffectSlot = targetSlot; m_attachedEffects.push_back(effectInfo); return m_effectGeneratorId; } return 0; }