void CCoherentUISystem::ChangeEntityDiffuseTextureForMaterial( CCoherentViewListener* pViewListener, const char* entityName, const char* materialName ) { IMaterial* pMaterial = gEnv->p3DEngine->GetMaterialManager()->FindMaterial( materialName ); IEntity* pEntity = gEnv->pEntitySystem->FindEntityByName( entityName ); if ( pEntity && !pMaterial ) { pMaterial = pEntity->GetMaterial(); } if ( pMaterial ) { STexSamplerRT& sampler = pMaterial->GetShaderItem().m_pShaderResources->GetTexture( EFTT_DIFFUSE )->m_Sampler; // Create a new texture and scrap the old one void* pD3DTextureDst = NULL; ITexture* pCryTex = gD3DSystem->CreateTexture( &pD3DTextureDst, sampler.m_pITex->GetWidth(), sampler.m_pITex->GetHeight(), 1, eTF_A8R8G8B8, FT_USAGE_DYNAMIC ); int oldTextureID = sampler.m_pITex->GetTextureID(); gEnv->pRenderer->RemoveTexture( oldTextureID ); sampler.m_pITex = pCryTex; pCryTex->AddRef(); pViewListener->SetTexture( pD3DTextureDst, pCryTex->GetTextureID() ); } }
void CLightningArc::TriggerSpark() { const char* targetName = "Target"; IEntity* pEntity = GetEntity(); if (pEntity->GetMaterial() == 0) { GameWarning("Lightning arc '%s' has no Material, no sparks will trigger", pEntity->GetName()); return; } IEntityLink* pLinks = pEntity->GetEntityLinks(); int numLinks = 0; for (IEntityLink* link = pLinks; link; link = link->next) { if (strcmp(link->name, targetName) == 0) ++numLinks; } if (numLinks == 0) { GameWarning("Lightning arc '%s' has no Targets, no sparks will trigger", pEntity->GetName()); return; } int nextSpark = Random(numLinks); IEntityLink* pNextSparkLink = pLinks; for (; nextSpark && pNextSparkLink; pNextSparkLink = pNextSparkLink->next) { if (strcmp(pNextSparkLink->name, targetName) == 0) --nextSpark; } CLightningGameEffect::TIndex id = g_pGame->GetLightningGameEffect()->TriggerSpark( m_lightningPreset, pEntity->GetMaterial(), CLightningGameEffect::STarget(GetEntityId()), CLightningGameEffect::STarget(pNextSparkLink->entityId)); float strikeTime = g_pGame->GetLightningGameEffect()->GetSparkRemainingTime(id); IScriptTable* pTargetScriptTable = 0; IEntity* pTarget = gEnv->pEntitySystem->GetEntity(pNextSparkLink->entityId); if (pTarget) pTargetScriptTable = pTarget->GetScriptTable(); EntityScripts::CallScriptFunction(pEntity, pEntity->GetScriptTable(), "OnStrike", strikeTime, pTargetScriptTable); }
void CGameVolume_Water::SetupVolume() { IGameVolumes::VolumeInfo volumeInfo; if (GetVolumeInfoForEntity(GetEntityId(), volumeInfo) == false) return; if (volumeInfo.verticesCount < 3) return; WaterProperties waterProperties(GetEntity()); if(waterProperties.isRiver) { if(volumeInfo.verticesCount < 4 || volumeInfo.verticesCount % 2 != 0) return; int numSegments = (volumeInfo.verticesCount / 2) - 1; m_segments.resize(numSegments); for(int i = 0; i < numSegments; ++i) { SetupVolumeSegment(waterProperties, i, &volumeInfo.pVertices[0], volumeInfo.verticesCount); } } else { SetupVolumeSegment(waterProperties, 0, &volumeInfo.pVertices[0], volumeInfo.verticesCount); } #if CRY_PLATFORM_WINDOWS && !defined(_RELEASE) { if (gEnv->IsEditor()) { IEntity* pEnt = GetEntity(); IMaterial* pMat = pEnt ? pEnt->GetMaterial() : 0; if (pMat) { const SShaderItem& si = pMat->GetShaderItem(); if (si.m_pShader && si.m_pShader->GetShaderType() != eST_Water) { CryWarning(VALIDATOR_MODULE_3DENGINE, VALIDATOR_ERROR, "Incorrect shader set for water / water fog volume \"%s\"!", pEnt->GetName()); } } } } #endif m_baseMatrix = GetEntity()->GetWorldTM(); m_initialMatrix = m_baseMatrix; m_volumeDepth = waterProperties.depth; m_streamSpeed = waterProperties.streamSpeed; m_awakeAreaWhenMoving = waterProperties.awakeAreaWhenMoving; m_isRiver = waterProperties.isRiver; }