// Copyright Epic Games, Inc. All Rights Reserved. /*============================================================================= GenericMacTargetPlatform.h: Declares the TGenericMacTargetPlatform class template. =============================================================================*/ #pragma once #include "CoreMinimal.h" #include "Common/TargetPlatformBase.h" #include "Mac/MacPlatformProperties.h" #include "Misc/ConfigCacheIni.h" #include "LocalMacTargetDevice.h" #if WITH_ENGINE #include "AudioCompressionSettings.h" #include "Sound/SoundWave.h" #include "TextureResource.h" #include "StaticMeshResources.h" #endif // WITH_ENGINE #define LOCTEXT_NAMESPACE "TGenericMacTargetPlatform" /** * Template for Mac target platforms */ template class TGenericMacTargetPlatform : public TTargetPlatformBase > { public: typedef FMacPlatformProperties TProperties; typedef TTargetPlatformBase TSuper; /** * Default constructor. */ TGenericMacTargetPlatform( ) { #if PLATFORM_MAC // only add local device if actually running on Mac LocalDevice = MakeShareable(new FLocalMacTargetDevice(*this)); #endif #if WITH_ENGINE TextureLODSettings = nullptr; StaticMeshLODSettings.Initialize(this); #endif } public: //~ Begin ITargetPlatform Interface virtual void EnableDeviceCheck(bool OnOff) override {} virtual void GetAllDevices( TArray& OutDevices ) const override { OutDevices.Reset(); if (LocalDevice.IsValid()) { OutDevices.Add(LocalDevice); } } virtual bool GenerateStreamingInstallManifest(const TMultiMap& PakchunkMap, const TSet& PakchunkIndicesInUse) const override { return true; } virtual ITargetDevicePtr GetDefaultDevice( ) const override { if (LocalDevice.IsValid()) { return LocalDevice; } return nullptr; } virtual ITargetDevicePtr GetDevice( const FTargetDeviceId& DeviceId ) { if (LocalDevice.IsValid() && (DeviceId == LocalDevice->GetId())) { return LocalDevice; } return NULL; } virtual bool IsRunningPlatform( ) const override { // Must be Mac platform as editor for this to be considered a running platform return PLATFORM_MAC && !UE_SERVER && !UE_GAME && WITH_EDITOR && HAS_EDITOR_DATA; } virtual bool SupportsFeature( ETargetPlatformFeatures Feature ) const override { // we currently do not have a build target for MacServer if (Feature == ETargetPlatformFeatures::Packaging) { return (HAS_EDITOR_DATA || !IS_DEDICATED_SERVER); } return TSuper::SupportsFeature(Feature); } virtual void GetAllPossibleShaderFormats( TArray& OutFormats ) const override { // no shaders needed for dedicated server target if (!IS_DEDICATED_SERVER) { static FName NAME_SF_METAL_SM5(TEXT("SF_METAL_SM5")); OutFormats.AddUnique(NAME_SF_METAL_SM5); static FName NAME_SF_METAL_MACES3_1(TEXT("SF_METAL_MACES3_1")); OutFormats.AddUnique(NAME_SF_METAL_MACES3_1); static FName NAME_SF_METAL_MRT_MAC(TEXT("SF_METAL_MRT_MAC")); OutFormats.AddUnique(NAME_SF_METAL_MRT_MAC); } } virtual void GetAllTargetedShaderFormats(TArray& OutFormats) const override { // Get the Target RHIs for this platform, we do not always want all those that are supported. TArrayTargetedShaderFormats; GConfig->GetArray(TEXT("/Script/MacTargetPlatform.MacTargetSettings"), TEXT("TargetedRHIs"), TargetedShaderFormats, GEngineIni); // Gather the list of Target RHIs and filter out any that may be invalid. TArray PossibleShaderFormats; GetAllPossibleShaderFormats(PossibleShaderFormats); for (int32 ShaderFormatIdx = TargetedShaderFormats.Num() - 1; ShaderFormatIdx >= 0; ShaderFormatIdx--) { FString ShaderFormat = TargetedShaderFormats[ShaderFormatIdx]; if (PossibleShaderFormats.Contains(FName(*ShaderFormat)) == false) { TargetedShaderFormats.RemoveAt(ShaderFormatIdx); } } for(const FString& ShaderFormat : TargetedShaderFormats) { OutFormats.AddUnique(FName(*ShaderFormat)); } } #if WITH_ENGINE virtual const class FStaticMeshLODSettings& GetStaticMeshLODSettings( ) const override { return StaticMeshLODSettings; } virtual void GetTextureFormats( const UTexture* Texture, TArray< TArray >& OutFormats) const override { if (!IS_DEDICATED_SERVER) { // just use the standard texture format name for this texture (with DX11 support) GetDefaultTextureFormatNamePerLayer(OutFormats.AddDefaulted_GetRef(), this, Texture, true, 4, true); } } virtual void GetAllTextureFormats(TArray& OutFormats) const override { if (!IS_DEDICATED_SERVER) { // just use the standard texture format name for this texture (with DX11 support) GetAllDefaultTextureFormats(this, OutFormats); } } virtual bool SupportsLQCompressionTextureFormat() const override { return false; }; virtual const UTextureLODSettings& GetTextureLODSettings() const override { return *TextureLODSettings; } virtual void RegisterTextureLODSettings(const UTextureLODSettings* InTextureLODSettings) override { TextureLODSettings = InTextureLODSettings; } virtual bool CanSupportRemoteShaderCompile() const override { return true; } virtual void GetShaderCompilerDependencies(TArray& OutDependencies) const override { FTargetPlatformBase::AddDependencySCArrayHelper(OutDependencies, TEXT("Binaries/ThirdParty/ShaderConductor/Mac/libdxcompiler.dylib")); FTargetPlatformBase::AddDependencySCArrayHelper(OutDependencies, TEXT("Binaries/ThirdParty/ShaderConductor/Mac/libShaderConductor.dylib")); } virtual FName GetWaveFormat(const class USoundWave* Wave) const override { FName FormatName = Audio::ToName(Wave->GetSoundAssetCompressionType()); if (FormatName == Audio::NAME_PLATFORM_SPECIFIC) { if (Wave->IsStreaming(*this->IniPlatformName())) { return Audio::NAME_OPUS; } return Audio::NAME_OGG; } else { return FormatName; } } virtual void GetAllWaveFormats(TArray& OutFormats) const override { OutFormats.Add(Audio::NAME_ADPCM); OutFormats.Add(Audio::NAME_PCM); OutFormats.Add(Audio::NAME_OGG); OutFormats.Add(Audio::NAME_OPUS); OutFormats.Add(Audio::NAME_BINKA); } #endif //WITH_ENGINE virtual bool SupportsVariants() const override { return true; } virtual float GetVariantPriority() const override { return TProperties::GetVariantPriority(); } //~ End ITargetPlatform Interface private: // Holds the local device. ITargetDevicePtr LocalDevice; #if WITH_ENGINE // Holds the texture LOD settings. const UTextureLODSettings* TextureLODSettings; // Holds the static mesh LOD settings. FStaticMeshLODSettings StaticMeshLODSettings; #endif // WITH_ENGINE }; #undef LOCTEXT_NAMESPACE