bool UParticleModuleCollisionGPU::IsValidForLODLevel(UParticleLODLevel* LODLevel, FString& OutErrorString) { UMaterialInterface* Material = NULL; if (LODLevel && LODLevel->RequiredModule) { Material = LODLevel->RequiredModule->Material; } if (Material == NULL) { Material = UMaterial::GetDefaultMaterial(MD_Surface); } check(Material); EBlendMode BlendMode = BLEND_Opaque; const FMaterialResource* MaterialResource = Material->GetMaterialResource(GetWorld() ? GetWorld()->FeatureLevel : GMaxRHIFeatureLevel); if(MaterialResource) { BlendMode = MaterialResource->GetBlendMode(); } if (CollisionMode == EParticleCollisionMode::SceneDepth && (BlendMode == BLEND_Opaque || BlendMode == BLEND_Masked)) { OutErrorString = NSLOCTEXT("UnrealEd", "CollisionOnOpaqueEmitter", "Scene depth collision cannot be used on emitters with an opaque material.").ToString(); return false; } if (CollisionMode == EParticleCollisionMode::DistanceField) { static const auto CVar = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.GenerateMeshDistanceFields")); if (CVar->GetValueOnGameThread() == 0) { OutErrorString = NSLOCTEXT("UnrealEd", "CollisionWithoutDistanceField", "Distance Field collision requires the 'Generate Mesh Distance Fields' Renderer project setting to be enabled.").ToString(); return false; } } if (LODLevel->TypeDataModule && LODLevel->TypeDataModule->IsA(UParticleModuleTypeDataGpu::StaticClass())) { if(!IsDistributionAllowedOnGPU(ResilienceScaleOverLife.Distribution)) { OutErrorString = GetDistributionNotAllowedOnGPUText(StaticClass()->GetName(), "ResilienceScaleOverLife" ).ToString(); return false; } } return true; }
bool UParticleModuleCollisionGPU::IsValidForLODLevel(UParticleLODLevel* LODLevel, FString& OutErrorString) { UMaterialInterface* Material = NULL; if (LODLevel && LODLevel->RequiredModule) { Material = LODLevel->RequiredModule->Material; } if (Material == NULL) { Material = UMaterial::GetDefaultMaterial(MD_Surface); } check(Material); EBlendMode BlendMode = BLEND_Opaque; const FMaterialResource* MaterialResource = Material->GetMaterialResource(GetWorld() ? GetWorld()->FeatureLevel : GMaxRHIFeatureLevel); if(MaterialResource) { BlendMode = MaterialResource->GetBlendMode(); } if (BlendMode == BLEND_Opaque || BlendMode == BLEND_Masked) { OutErrorString = NSLOCTEXT("UnrealEd", "CollisionOnOpaqueEmitter", "Scene depth collision cannot be used on emitters with an opaque material.").ToString(); return false; } if (LODLevel->TypeDataModule && LODLevel->TypeDataModule->IsA(UParticleModuleTypeDataGpu::StaticClass())) { if(!IsDistributionAllowedOnGPU(ResilienceScaleOverLife.Distribution)) { OutErrorString = GetDistributionNotAllowedOnGPUText(StaticClass()->GetName(), "ResilienceScaleOverLife" ).ToString(); return false; } } return true; }