Files
UnrealEngineUWP/Engine/Source/Programs/AutomationTool/AutomationUtils/Platform.cs
Andrew Grant a140e73bbf Copying //UE4/Orion-Staging to //UE4/Main (Source: //Orion/Dev-General @ 3064255)
#lockdown Nick.Penwarden

Change 3063869 on 2016/07/25 by Michael.Noland@mnoland_T2801_OrionStream

	Engine: Added a cvar (t.FPSChart.OpenFolderOnDump) to control whether or not FPS charts automatically open the profiling folder when stopfpschart is executed, which can be useful to avoid a bunch of open windows while doing automated testing
	#rb marcus.wassmer
	#tests Tested startfpschart + stopfpschart with t.FPSChart.OpenFolderOnDump set to 1 and 0
	#codereview david.nikdel

Change 3063829 on 2016/07/25 by Michael.Noland@mnoland_T2801_OrionStream

	Core: Added an optional size to MallocLeak Stop and made the default filter size 128 KB for both MallocLeak Dump and MallocLeak Stop if no size was specified
	#rb marcus.wassmer
	#tests Tested using MallocLeak Stop and MallocLeak Dump

Change 3063825 on 2016/07/25 by Michael.Noland@mnoland_T2801_OrionStream

	Engine: Exposed GPU revision ID as GRHIDeviceRevision and added it to the FPS chart analytics (gathered on D3D11 and D3D12 only)
	#rb marcus.wassmer
	#tests Tested on my desktop and compared to dxdiag output

Change 3063702 on 2016/07/25 by Ryan.Gerleve@Ryan.Gerleve_T3703_Orion

	Collect garbage when scrubbing in a replay. Scrubbing generates a lot of garbage, and can lead to running out of memory.
	Can be disabled with the cvar demo.LoadCheckpointGarbageCollect.

	#jira OR-25964
	#tests bug repro
	#rb john.pollard

Change 3063426 on 2016/07/25 by Michael.Trepka@Michael.Trepka_T3244_Orion-Dev

	Borderless window support improvements:

	- the cursor changes to resize when hovering over the window edge
	- added a way for widgets to register a delegate that's called when window actions occur (maximize, restore, etc.)
	- used he window action notification for WindowTitleBarArea to improve how toggling fullscreen on double click is handled

	#rb Jeff.Campeau
	#tests Tested in editor build on PC

Change 3063358 on 2016/07/25 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 29.2 @ CL 3063307

	#RB:none
	#tests:none

	#ROBOMERGE-SOURCE: CL 3063345 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3063353 on 2016/07/25 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: ben.marsh
	Merging CL 3037547 and CL 3037552 from //UE4/Dev-Build to support BuildPatchTool analytics.

	#rb none
	#tests none

	#ROBOMERGE-SOURCE: CL 3063156 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3063198 on 2016/07/25 by Matt.Kuhlenschmidt@matt.kuhlenschmidt_orion_dev

	Temp fix for broken post process volumes

	#rb none
	#tests  none

Change 3063166 on 2016/07/25 by Daniel.Lamb@daniel.lamb_T3905_6612

	Added check to Redirect collector resolve string asset references.
	#rb none
	#test cook paragon

Change 3063057 on 2016/07/25 by Michael.Trepka@Michael.Trepka_T3244_Orion-Dev

	Use round corners for windows with no system title bar and border only in windowed mode.

	#rb Peter.Sauerbrei
	#tests Tested in editor build on PC

Change 3063015 on 2016/07/25 by Andrew.Rodham@Andrew.Rodham_Orion

	Sequencer: Fixed anim notifies not working when playing animation on blueprint-driven skeletal meshes

	We now inject a new animation position into the animation system, rather than trying to 'fake' events outside of the system. This allows for much more robust event triggering when playing back through sequencer. Previously, anim notifies for trail particles would be reset every frame due to TriggerAnimNotifies being called by the animation system, and sequencer. We now defer this responsibility to the animation system entirely during playback.

	#tests Tested sequencer driven animation with animation assets and (compatible) animation blueprints. Tested some non-sequencer animation.
	#rb Benn.Gallagher

Change 3062774 on 2016/07/24 by Ben.Marsh@Ben.Marsh_T3245_Orion

	BuildGraph: Fix <Cook> tasks failing when multiple platforms are specified, due to not scanning the output directories separately.

	#rb none
	#tests preflight

Change 3062761 on 2016/07/24 by Andrew.Grant@andrew.grant.T6730.orion.floating

	Non-unity fix
	#rb none
	#tests compiled

Change 3062324 on 2016/07/22 by Marcus.Wassmer@Marcus.Wassmer_Orion_DevGeneral

	Skipped a file
	#rb none
	#test none

Change 3062315 on 2016/07/22 by Marcus.Wassmer@Marcus.Wassmer_Orion_DevGeneral

	Allow r.SSR.MaxRoughness in shipping builds.
	Art has been tweaking with this value, but it's not being honored in shipping.
	#rb none
	#tests adjusted settings in agora_p

Change 3062306 on 2016/07/22 by Marcus.Wassmer@Marcus.Wassmer_Orion_DevGeneral

	HLOD distance scalability option (r.HLOD.DistanceScale)
	Higher values make HLODS transition further away.
	#rb Michael.Noland
	#tests Tested in agora_p

Change 3061861 on 2016/07/22 by Lina.Halper@Lina.Halper_Orion

	Fix Compression - Reduce functions to be editoronly

	#rb: Martin.Wilson
	#tests: PIE/compile editor build/noneditor

Change 3061714 on 2016/07/22 by Andrew.Rodham@Andrew.Rodham_Orion

	Sequencer: Fixed anim trails not playing in full, sequencer-driven animation.

	There were 2 issues here. Firstly, we were force-handling events and anim notifies in non-preview animation which caused undefined behaviour when the animation was also updated on tick. Secondly, On the very first frame of a game, sequencer can sometimes use the PreviewSetMatineeAnimPositionInner method because the actor it is referencing has not begun play yet. Unfortunately this function left the animation in a state where the 'real' animation update function wouldn't trigger any anim notifies properly.

	#tests Tested animation with and without anim trails to verify they work in editor, PIE and standalone game with and without sequencer open. Rendered out the announce trailer before and after my changes to verify there was no change in behaviour.

	#jira OR-25967

	#review-3061494 @Max.Chen

	#rb Benn.Gallagher

Change 3061393 on 2016/07/22 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: sam.zamani
	compile errors
	#rb none
	#tests compile

	#ROBOMERGE-SOURCE: CL 3061392 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3061384 on 2016/07/22 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: andrew.grant
	Fixed build breakage
	#rb none
	#tests compiled PS4 client

	#ROBOMERGE-SOURCE: CL 3061383 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3060894 on 2016/07/21 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: ian.fox
	#Orion, #OnlineSubsystem, #OnlineGameplayFramework - Game catalog supports Price Engine sales on real-money offers
	#rb Sam.Zamani
	#tests Real-money offers that are on sale show the correct sale price / discount display
	#jira OR-21659

	#ROBOMERGE-SOURCE: CL 3060891 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3060272 on 2016/07/21 by Lina.Halper@Lina.Halper_Orion

	Fix compile issue of non editor build

	#rb: none
	#tests: compile

Change 3060161 on 2016/07/21 by Marcus.Wassmer@Marcus.Wassmer_Orion_DevGeneral

	Duplicate 3046845
	CVAR threading crash fix.
	#rb none
	#tests compiled, ran ps4

Change 3060012 on 2016/07/21 by Lina.Halper@Lina.Halper_Orion

	- Back out changelist 3056611
	- Fix additive issue and built the new animation DDC
	#rb: Martin.Wilson
	#tests: Jump_Recovery_Additive, PIE

Change 3060009 on 2016/07/21 by Rob.Cannaday@rob.cannaday_orion-stream

	When receiving NotLeader party join rejection, include the new leader id and re-attempt the join to the new leader
	#jira OR-25648
	#rb bart.bressler
	#tests frontend parties with promotions, coop matchmaking

Change 3059989 on 2016/07/21 by Andrew.Grant@andrew.grant.T6730.orion.floating

	Fixes for applocal redist
	#rb none
	#test built locally

Change 3059832 on 2016/07/21 by Martin.Wilson@MartinWilsonOrionStream

	Fix graph linked external object saving error on re-compressed animations (dup from dev-framework CL )

	#jira UE-33567
	#rb Thomas.Sarkanen
	#tests In editor testing that animations can be recompressed and saved

Change 3059803 on 2016/07/21 by Andrew.Grant@andrew.grant.T6730.orion.floating

	Switching Orion, UnrealCEFSubProcess, and CrashReporterClient to build with VS2015
	Added AppLocalPrerequisitesDirectory editor setting that is passed in -applocaldir during staging
	WinPlatformAutomation now stages applocaldir to project and engine binaries
	Updated OrionBuild.xml to specify -applocaldir
	#codereview Jeff.Campeau, Ben.Marsh
	#rb none
	#tests build client locally and verified DLLs are local to executables

Change 3059707 on 2016/07/21 by David.Ratti@David.Ratti_G6218_Orion.Dev-General

	fix case where DefaultGameplayTags.ini fails to update if not checked out from source control
	#rb none
	#tests add tags without source control

Change 3059679 on 2016/07/21 by Rob.Cannaday@rob.cannaday_orion-stream

	Fix nonunity compile error due to OnlinePresenceInterface.h requiring enum defined in OnlineSubsystemTypes.h
	#rb paul.moore
	#tests compile with OrionFriendItem.cpp modified

Change 3059518 on 2016/07/21 by Andrew.Grant@andrew.grant.T6730.orion.floating

	AppLcoalDependencies required by VS2015

Change 3059477 on 2016/07/21 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 29.2 @ CL 3059419

	#RB:none
	#Tests:none

	#ROBOMERGE-SOURCE: CL 3059476 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3059455 on 2016/07/21 by Graeme.Thornton@GThornton_Orion_DevGeneral

	Linux build fix (bad case on #include filename)

	#rb robert.manuszewski
	#tests compiled Paragon on a linux machine

Change 3059258 on 2016/07/21 by Simon.Tovey@Simon.Tovey_OrionDev

	Implementing 3050352 in Dev-General.

	#rb none
	#tests Editor

	#codereview Marcus.Wassmer

Change 3058989 on 2016/07/21 by Michael.Noland@mnoland_T2801_OrionStream

	Audio: Disabling the audio thread to prevent a crash in async line trace code (it is already disabled in UE4 main)
	#rb none
	#codereview andrew.grant, ori.cohen

Change 3058773 on 2016/07/20 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: ian.fox
	#Orion - Remove QoS* from junk manifest
	#review-3058772 @Rob.Cannaday
	#rb none
	#tests QoS module doesn't get nuked every build

	#ROBOMERGE-SOURCE: CL 3058771 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3058717 on 2016/07/20 by Daniel.Lamb@daniel.lamb_T3905_6612

	Added submitted CL to success email for rebuild lighting commandlet.
	Removed nosimplygon from resave lighting commandlet commandline.
	#rb Daniel.Wright
	#test rebuildlighting paragon devgeneral.

Change 3058565 on 2016/07/20 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: ian.fox
	#Orion - Fix debug/non-development builds
	#rb Rob.Cannaday
	#tests it builds (and doesn't crash on login) on Debug Editor -debug -game!

	#ROBOMERGE-SOURCE: CL 3058563 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3058082 on 2016/07/20 by Daniel.Lamb@daniel.lamb_T3905_6612

	Added error to the lighting build whent it fails to build.
	#test Rebuild lighting commandlet
	#rb Daniel.Wright

Change 3057945 on 2016/07/20 by Andrew.Grant@andrew.grant.T6730.orion.floating

	Fix for NAN issue introduced in 3032847
	#rb Jeff.Farris
	#tests none

Change 3057840 on 2016/07/20 by David.Ratti@David.Ratti_G6218_Orion.Dev-General

	fix developer tags not properly adding to perforce when creating a new file

	#rb none
	#tests developer tags

Change 3057553 on 2016/07/20 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 29.2 @ CL 3057330

	#RB:none
	#Tests:none

	#ROBOMERGE-SOURCE: CL 3057549 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3057313 on 2016/07/20 by bruce.nesbit@BNesbit_Orion_Stream_1

	Fixed shadowvariable in FAnalyticsEventEntry

	#rb none

	#tests compiled

	#codereview Wes.Hunt

Change 3056802 on 2016/07/19 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: ryan.gerleve
	Fix issue where replicated map-placed actors with ability system components would cache an incorrect Role value.
	This could cause predicted gameplay effects in the fast TArray to have MarkItemDirty called on them, which in turn increments the item's ReplicationID, potentially causing a conflict with the server's ReplicationID.
	Since the Role may not be correct during OnRegister for these components, also cache it BeginPlay.

	#jira OR-25234
	#rb david.ratti
	#tests golden path, bug repro

	#ROBOMERGE-SOURCE: CL 3056801 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3056797 on 2016/07/19 by Wes.Hunt@WHUNT-ORION-STREAM

	OrionAnalytics updates.
	* Added IAnalyticsProviderET::SetDefaultEventAttributes to use to set the GameSessionID on all Orion Analytics events.
	* Removed OrionAnalyticsProvider as it was no longer necessary.
	* Updated all Orion code to use IAnalyticsProviderET directly in the code to be able to access all the new APIs.
	#rb sam.zamani, jason.bestimt
	#tests run dedicated server with 10 bot clients, observe analytics events sending correctly. Ran PIE.
	#jira UE-30980

Change 3056611 on 2016/07/19 by Lina.Halper@Lina.Halper_Orion

	Fix for additive broken with remove linear key
	- DDC key has been changed, so it will require to build DDC from this

	#rb: Martin.Wilson
	#tests: Jump_Recovery_Additive in editor, and PIE

Change 3056226 on 2016/07/19 by Lukasz.Furman@Lukasz.Furman_T7320_OrionStream

	extended gameplay debugger's ability category to show locally owned gameplay tags
	#orion
	#rb none
	#tests PIE

Change 3056204 on 2016/07/19 by Jeff.Campeau@jeff.campeau_3753_Orion

	Fix offset rendering of maximized borderless game window on Windows.
	#review-3055205 @michael.trepka
	#rb Michael.Trepka
	#tests Tested in editor build on PC (editor window normal and maximized, game window borderless normal and maximized, game window bordered normal and maximized).

Change 3056028 on 2016/07/19 by Rob.Cannaday@rob.cannaday_orion-stream

	Add moved modules to JunkManifest.txt

Change 3055650 on 2016/07/19 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - ACTUAL Merge 29.2 @ CL 3055553

	#RB:none
	#Tests:none

	#ROBOMERGE-SOURCE: CL 3055647 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3055620 on 2016/07/19 by Dmitry.Rekman@RCL_Win_Stream-ORMAIN

	Attempts to fix rare server crashes (OR-24947, OR-24952).

	- Rearranging to avoid AddDefaulted(), that might be triggering a compiler bug (conjecture).

	#rb Steve.Robb
	#codereview Steve.Robb
	#tests Compiled Windows client and Linux server, played a match.

Change 3054587 on 2016/07/18 by Andrew.Grant@andrew.grant.T6730.orion.floating

	Merging from //UE4/Main @ 3043787 through //UE4/Orion-Staging
	#rb none
	#tests Smoked by engine and dev QA

Change 3054491 on 2016/07/18 by Frank.Gigliotti@Frank.Gig_T4217_Orion_Stream

	Removed warning when client miss-predicts ability activation.

	* It is valid for the client to miss-predict.  Warning was only added to track down a bug.

	#CodeReview David.Ratti
	#RB None
	#Tests None

Change 3053850 on 2016/07/18 by David.Ratti@David.Ratti_G6218_Orion.Dev-General

	Missed checkins on ability system engine work:
	-Register debug delegate on module startup for easier debugging
	-Fallback to actor location if no hit impact is specified in default engine GC notify class

	#rb none
	#tests ability system sample project

Change 3053825 on 2016/07/18 by David.Ratti@David.Ratti_G6218_Orion.Dev-General

	Fix issue where config file not actually flushed at right time when adding new tags

	Fix issue where orion projecetile tags that are auto generated was generating tags for non gameplay tag properties

	#rb DanY
	#codereview Dan.Youhon
	#tests pie

Change 3053438 on 2016/07/18 by David.Ratti@David.Ratti_G6218_Orion.Dev-General

	-Remove developer tags from master tag list before saving to ini file
	-inline some stuff (wip for gc tag translator system)

	#rb none
	#test adding tags

Change 3053414 on 2016/07/18 by Robert.Manuszewski@Robert_Manuszewski_NCL_Orion

	Fixing rare crash when async loading objects caused by linker being detached too early (before other package's import has been fully processed)

	#jira OR-24955
	#jira OR-25183
	#rb Graeme.Thornton
	#tests Win64 cooked client golden path (solo vs AI)

Change 3052009 on 2016/07/15 by Dmitry.Rekman@RCL_Win_Stream-ORMAIN

	Overhaul of behavior of headless applications (server, client) (OR-23529).

	- Removed FApp::ShouldUseNullRHI(). Rationale: FApp::CanEverRender() answers a higher level question and the code shouldn't predicate on the type of RHI used.
	- Multiple code paths updated to prevent code execution on headless clients (some of this is optimization, some was causing crashes).
	- Most of these changes originated from a shelved CL by BradA.

	#rb Michael.Noland
	#codereview Michael.Noland, Brad.Angelcyk, Andrew.Grant, Chris.Wood, Matt.Schembari
	#tests Cooked Windows client and server, Linux client and server. Ran Windows client and server, played a match, ran Linux bot (headless client, requires local changes not in this CL), ran the Windows editor (tried PIE).

Change 3051926 on 2016/07/15 by Marcus.Wassmer@Marcus.Wassmer_Orion_DevGeneral

	Reinstate color grading changes.
	Fix broken config file.
	#rb none
	#tests Agora_p color grading and warning check

Change 3051759 on 2016/07/15 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: ryan.gerleve
	Don't record predicted elements of fast TArrays into client replays.
	Fixes issue where the client was incrementing the ReplicationID of predicted elements, potentially conflicting with the IDs of elements received by the server.

	#jira OR-25234, OR-25413, OR-25403
	#tests golden path, bug repo using 'net pktlag', replays
	#rb john.pollard, david.ratti

	#ROBOMERGE-SOURCE: CL 3051758 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3051702 on 2016/07/15 by Daniel.Lamb@daniel.lamb_T3905_6612

	Added jordan walker to rebuild lighting emails.
	Removed peter.sauerbrei.
	#rb Peter.Sauerbrei
	#test none

Change 3051661 on 2016/07/15 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: ben.marsh
	Merging support for precompiled binaries in CIS from Release-29.

	#rb none
	#tests none

	#ROBOMERGE-SOURCE: CL 3051660 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3051466 on 2016/07/15 by Marcus.Wassmer@Marcus.Wassmer_Orion_DevGeneral

	Allow seamless upgrade from FVector -> FVector4 for UProperties.
	#rb Robert.Manuszewski
	#tests Color grading property changes.

Change 3050680 on 2016/07/14 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: ian.fox
	#Mcp, #Orion - Fix initalization values of CatalogServiceMcp
	#rb none
	#tests Real money offers show in the store again

	#ROBOMERGE-SOURCE: CL 3050563 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3050520 on 2016/07/14 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - MERGING DUI @ CL 3047139

	#RB:none
	#Tests:none

	[CodeReviewed]: kerrington.smith, dan.hertzka, matt.schembari, benjamin.crocker, jaymee.stanford, alex.conner

	#ROBOMERGE-SOURCE: CL 3050519 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3050465 on 2016/07/14 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: ryan.gerleve
	Don't check IsClientOnly() to detemine whether a player controller is local or not.
	For client replay recording, the replay spectator controller should not return true from IsLocallyControlled(). This change fixes that case in client builds.
	Fixes issue where the SignificanceManager was using the replay spectator to influence significance values, causing them to be incorrect for the game player controller.

	#jira OR-25258
	#tests bug repro, golden path, replays
	#rb john.pollard
	[CodeReviewed] zak.middleton, josh.markiewicz

	#ROBOMERGE-SOURCE: CL 3050462 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3050326 on 2016/07/14 by Dan.Youhon@Dan.Youhon.Paragon

	Set CameraLensEffects position before activation so that initial significance values are correct, specifically to fix quick camera lens effects being culled out due to incorrect significance #OR-18321
	- Moves location determination code from AEmitterCameraLensEffectBase::UpdateLocation into a separate static GetAttachedEmitterTransform function, which is now called both from UpdateLocation and in APlayerCameraManager::AddCameraLensEffect to determine SpawnTransform for the LensEffect SpawnActor call
	- Unshelved from Jeff.Farris. Thanks Jeff!

	#rb Dan.Youhon
	#tests MultiPIE
	#codereview Jeff.Farris

Change 3049749 on 2016/07/14 by Daniel.Lamb@daniel.lamb_T3905_6612

	Added skipskin verify to rebuild lighting commandlet.
	#rb None
	#test Rebuild lighting commandlet

Change 3049728 on 2016/07/14 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: buildmachine
	Remove simplygon from rebuild lighting commandlet
	#rb none
	#test rebuild lighting

	#ROBOMERGE-SOURCE: CL 3049727 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3049721 on 2016/07/14 by buildmachine@buildmachine_Z4560_OrionDevGeneral

	Remove simplygon from rebuild lighting commandlet
	#rb none
	#test rebuild lighting

Change 3049325 on 2016/07/13 by Andrew.Grant@andrew.grant.T6730.orion.floating

	Back out changelist 3049037 due to incompatibility with current assets
	#rb none
	#tests Cooked content and verified warnings & errors are gone.
	#codereview Marcus.Wasmer, Brian.Karis, HaarmPieter.Duiker

Change 3049319 on 2016/07/13 by Andrew.Grant@andrew.grant.T6730.orion.floating

	More work on content filtering (still disabled)
	#rb none
	#tests cooked content and verified filtered content is not found.

Change 3049298 on 2016/07/13 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 28.2/29 @ CL 3049113

	#RB:none
	#Tests:none

	#ROBOMERGE-SOURCE: CL 3049296 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

Change 3049269 on 2016/07/13 by Mieszko.Zielinski@mieszko.zielinski_T4675_Orion

	Constified FObjectFinder::Succeeded because why not #UE4

	#rb none
	#test golden path

Change 3049104 on 2016/07/13 by Andrew.Grant@andrew.grant.T6730.orion.floating

	Created delegate for object name resolution and moved existing package localization code to use it.
	Orion code to filter out unreleased heroes and other data, but correnty disabled due to a cooking bug.
	#rb none
	#tests ran editor, ran cooker, verified object resolution is equivalent to before.

Change 3049037 on 2016/07/13 by HaarmPieter.Duiker@HPD-Dev-General

	Adding shadows, midtones and highlights color correction controls
	#rb brian.karis, marcus.wassmer
	#tests "postprocess color correction"

Change 3048457 on 2016/07/13 by Cody.Haskell@OrionStream

	#UE4

	- Adding a delegate that fires off when LastUserInteractionTime is updated

	#codereview Matt.Kuhlenschmidt
	#rb none
	#tests PIE

Change 3048420 on 2016/07/13 by Dmitry.Rekman@RCL_Lnx_CaseIns_Stream-ORMAIN

	Fix double #undef LOCTEXT_NAMESPACE in editor case.

	#rb none
	#codereview Nick.Darnell, Andrew.Grant
	#tests Compiled Linux editor (for running -server).

Change 3047891 on 2016/07/13 by Michael.Trepka@Michael.Trepka_T3244_Orion-Dev

	Rollback //Orion/Dev-General/Engine/Source/Runtime/Core/Private/Windows/WindowsWindow.cpp to revision 12

	#rb none
	#tests Tested in editor on PC

Change 3047216 on 2016/07/12 by Dmitry.Rekman@RCL_Lnx_CaseIns_Stream-ORMAIN

	Changes to Linux application specific to Linux client.

	#rb none
	#codereview Brad.Angelcyk
	#tests Ran Paragon Linux client (headless) locally.

Change 3047140 on 2016/07/12 by Andrew.Grant@andrew.grant.T6730.orion.floating

	Fix for PS4
	#rb #tests na

Change 3047107 on 2016/07/12 by Andrew.Grant@andrew.grant.T6730.orion.floating

	Moved timeguards out of stats.h
	#rb none
	#tests compiled editor & shipping client

Change 3046996 on 2016/07/12 by Ryan.Gerleve@Ryan.Gerleve_T3703_Orion

	Don't check bTearOff when deciding whether to swap roles for client replay recording and improve the comment.
	Fixes an assert that could occur if a torn-off actor happened to get recorded into a checkpoint of a client replay.

	#tests golden path
	#rb john.pollard

Change 3046975 on 2016/07/12 by Michael.Trepka@Michael.Trepka_T3244_Orion-Dev

	Support for making the game window borderless (no system border or title bar). Disabled by default. Enabling requires adding bUseBorderlessWindow=True to [/Script/EngineSettings.GeneralProjectSettings] in DefaultGame.ini. The game using this is responsible for adding WindowTitleBarArea widget to its UI, as well as window minimize/maximize/close buttons.

	#codereview Dan.Hertzka
	#rb Jeff.Campeau
	#tests Tested in editor build on PC

Change 3046812 on 2016/07/12 by Michael.Trepka@Michael.Trepka_T3244_Orion-Dev

	New UI for selecting fullscreen mode in Paragon video settings

	#rb Dan.Hertzka
	#tests Tested in editor build on PC

Change 3046803 on 2016/07/12 by Michael.Trepka@Michael.Trepka_T3244_Orion-Dev

	Added an option to WindowTitleBarArea widget to make it toggle fullscreen mode instead of maximizing the window.

	#rb Dan.Hertzka
	#tests Tested in editor build on PC

Change 3045374 on 2016/07/11 by John.Pollard@John.Pollard_T2802_Orion_DevGeneral

	Fix assert in channel cleanup code that could occur if the connection was cleaned up, and there were KeepProcessingActorChannelBunchesMap in-flight still

	#rb RyanG
	#tests Replays

Change 3044696 on 2016/07/11 by Daniel.Lamb@daniel.lamb_T3905_6612

	Added additional checks to ResavePackagesCommandlet so people don't miss the required allowcommandletrendering flag when using buildlighting option.
	#test rebuild lighting using resave packages paragon
	#rb None

Change 3044690 on 2016/07/11 by Daniel.Lamb@daniel.lamb_T3905_6612

	Changed MBWritten cooker stats to report mb instead of bytes...
	#rb Wes.Hunt.
	#test cook paragon.

Change 3044439 on 2016/07/11 by Jason.Bestimt@Robomerge_Orion_DevGeneral

	#ROBOMERGE-AUTHOR: jason.bestimt
	#ORION_MAIN - Merge 28.2 @ CL 3043960

	#RB:none
	#Tests:none

	#ROBOMERGE-SOURCE: CL 3044428 in //Orion/Main/...
	#ROBOMERGE-BOT: ORION (Main -> Dev-General)

[CL 3070724 by Andrew Grant in Main branch]
2016-07-29 17:10:25 -04:00

664 lines
21 KiB
C#

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Reflection;
using UnrealBuildTool;
namespace AutomationTool
{
/// <summary>
/// Platform abstraction layer.
/// </summary>
public class Platform : CommandUtils
{
#region Intialization
private static Dictionary<TargetPlatformDescriptor, Platform> AllPlatforms = new Dictionary<TargetPlatformDescriptor, Platform>();
internal static void InitializePlatforms(Assembly[] AssembliesWithPlatforms = null)
{
LogVerbose("Creating platforms.");
// Create all available platforms.
foreach (var ScriptAssembly in (AssembliesWithPlatforms != null ? AssembliesWithPlatforms : AppDomain.CurrentDomain.GetAssemblies()))
{
CreatePlatformsFromAssembly(ScriptAssembly);
}
// Create dummy platforms for platforms we don't support
foreach (var PlatformType in Enum.GetValues(typeof(UnrealTargetPlatform)))
{
var TargetDesc = new TargetPlatformDescriptor((UnrealTargetPlatform)PlatformType);
Platform ExistingInstance;
if (AllPlatforms.TryGetValue(TargetDesc, out ExistingInstance) == false)
{
LogVerbose("Creating placeholder platform for target: {0}", TargetDesc.Type);
AllPlatforms.Add(TargetDesc, new Platform(TargetDesc.Type));
}
}
}
private static void CreatePlatformsFromAssembly(Assembly ScriptAssembly)
{
LogVerbose("Looking for platforms in {0}", ScriptAssembly.Location);
Type[] AllTypes = null;
try
{
AllTypes = ScriptAssembly.GetTypes();
}
catch (Exception Ex)
{
LogError("Failed to get assembly types for {0}", ScriptAssembly.Location);
if (Ex is ReflectionTypeLoadException)
{
var TypeLoadException = (ReflectionTypeLoadException)Ex;
if (!IsNullOrEmpty(TypeLoadException.LoaderExceptions))
{
LogError("Loader Exceptions:");
foreach (var LoaderException in TypeLoadException.LoaderExceptions)
{
LogError(LogUtils.FormatException(LoaderException));
}
}
else
{
LogError("No Loader Exceptions available.");
}
}
// Re-throw, this is still a critical error!
throw Ex;
}
foreach (var PotentialPlatformType in AllTypes)
{
if (PotentialPlatformType != typeof(Platform) && typeof(Platform).IsAssignableFrom(PotentialPlatformType) && !PotentialPlatformType.IsAbstract)
{
LogVerbose("Creating platform {0} from {1}.", PotentialPlatformType.Name, ScriptAssembly.Location);
var PlatformInstance = Activator.CreateInstance(PotentialPlatformType) as Platform;
var PlatformDesc = PlatformInstance.GetTargetPlatformDescriptor();
Platform ExistingInstance;
if (!AllPlatforms.TryGetValue(PlatformDesc, out ExistingInstance))
{
AllPlatforms.Add(PlatformDesc, PlatformInstance);
}
else
{
LogWarning("Platform {0} already exists", PotentialPlatformType.Name);
}
}
}
}
#endregion
protected UnrealTargetPlatform TargetPlatformType = UnrealTargetPlatform.Unknown;
protected UnrealTargetPlatform TargetIniPlatformType = UnrealTargetPlatform.Unknown;
public Platform(UnrealTargetPlatform PlatformType)
{
TargetPlatformType = PlatformType;
TargetIniPlatformType = PlatformType;
}
/// <summary>
/// Allow the platform to alter the ProjectParams
/// </summary>
/// <param name="ProjParams"></param>
public virtual void PlatformSetupParams(ref ProjectParams ProjParams)
{
}
public virtual TargetPlatformDescriptor GetTargetPlatformDescriptor()
{
return new TargetPlatformDescriptor(TargetPlatformType, "");
}
/// <summary>
/// Package files for the current platform.
/// </summary>
/// <param name="ProjectPath"></param>
/// <param name="ProjectExeFilename"></param>
public virtual void Package(ProjectParams Params, DeploymentContext SC, int WorkingCL)
{
throw new AutomationException("{0} does not yet implement Packaging.", PlatformType);
}
/// <summary>
/// Does the reverse of the output from the package process
/// </summary>
/// <param name="SourcePath"></param>
/// <param name="DestinationPath"></param>
public virtual void ExtractPackage(ProjectParams Params, string SourcePath, string DestinationPath)
{
throw new AutomationException("{0} does not yet implement ExtractPackage.", PlatformType);
}
/// <summary>
/// Allow platform to do platform specific work on archived project before it's deployed.
/// </summary>
/// <param name="Params"></param>
/// <param name="SC"></param>
public virtual void ProcessArchivedProject(ProjectParams Params, DeploymentContext SC)
{
}
/// <summary>
/// Get all connected device names for this platform
/// </summary>
/// <param name="Params"></param>
/// <param name="SC"></param>
public virtual void GetConnectedDevices(ProjectParams Params, out List<string> Devices)
{
Devices = null;
LogWarning("{0} does not implement GetConnectedDevices", PlatformType);
}
/// <summary>
/// Deploy the application on the current platform
/// </summary>
/// <param name="Params"></param>
/// <param name="SC"></param>
public virtual void Deploy(ProjectParams Params, DeploymentContext SC)
{
LogWarning("{0} does not implement Deploy...", PlatformType);
}
/// <summary>
/// Run the client application on the platform
/// </summary>
/// <param name="ClientRunFlags"></param>
/// <param name="ClientApp"></param>
/// <param name="ClientCmdLine"></param>
public virtual ProcessResult RunClient(ERunOptions ClientRunFlags, string ClientApp, string ClientCmdLine, ProjectParams Params)
{
PushDir(Path.GetDirectoryName(ClientApp));
// Always start client process and don't wait for exit.
ProcessResult ClientProcess = Run(ClientApp, ClientCmdLine, null, ClientRunFlags | ERunOptions.NoWaitForExit);
PopDir();
return ClientProcess;
}
/// <summary>
/// Allow platform specific clean-up or detection after client has run
/// </summary>
/// <param name="ClientRunFlags"></param>
public virtual void PostRunClient(ProcessResult Result, ProjectParams Params)
{
// do nothing in the default case
}
public virtual void UploadSymbols(ProjectParams Params, DeploymentContext SC)
{
Log("{0} does not implement UploadSymbols...", PlatformType);
}
/// <summary>
/// Get the platform-specific name for the executable (with out the file extension)
/// </summary>
/// <param name="InExecutableName"></param>
/// <returns></returns>
public virtual string GetPlatformExecutableName(string InExecutableName)
{
return InExecutableName;
}
public virtual List<string> GetExecutableNames(DeploymentContext SC, bool bIsRun = false)
{
var ExecutableNames = new List<String>();
string Ext = AutomationTool.Platform.GetExeExtension(SC.StageTargetPlatform.TargetPlatformType);
if (!String.IsNullOrEmpty(SC.CookPlatform))
{
if (SC.StageExecutables.Count() > 0)
{
foreach (var StageExecutable in SC.StageExecutables)
{
string ExeName = SC.StageTargetPlatform.GetPlatformExecutableName(StageExecutable);
if (!SC.IsCodeBasedProject)
{
ExecutableNames.Add(CombinePaths(SC.RuntimeRootDir, "Engine/Binaries", SC.PlatformDir, ExeName + Ext));
}
else
{
ExecutableNames.Add(CombinePaths(SC.RuntimeProjectRootDir, "Binaries", SC.PlatformDir, ExeName + Ext));
}
}
}
//@todo, probably the rest of this can go away once everything passes it through
else if (SC.DedicatedServer)
{
if (!SC.IsCodeBasedProject)
{
string ExeName = SC.StageTargetPlatform.GetPlatformExecutableName("UE4Server");
ExecutableNames.Add(CombinePaths(SC.RuntimeRootDir, "Engine/Binaries", SC.PlatformDir, ExeName + Ext));
}
else
{
string ExeName = SC.StageTargetPlatform.GetPlatformExecutableName(SC.ShortProjectName + "Server");
string ClientApp = CombinePaths(SC.RuntimeProjectRootDir, "Binaries", SC.PlatformDir, ExeName + Ext);
var TestApp = CombinePaths(SC.ProjectRoot, "Binaries", SC.PlatformDir, SC.ShortProjectName + "Server" + Ext);
string Game = "Game";
//@todo, this is sketchy, someone might ask what the exe is before it is compiled
if (!FileExists_NoExceptions(ClientApp) && !FileExists_NoExceptions(TestApp) && SC.ShortProjectName.EndsWith(Game, StringComparison.InvariantCultureIgnoreCase))
{
ExeName = SC.StageTargetPlatform.GetPlatformExecutableName(SC.ShortProjectName.Substring(0, SC.ShortProjectName.Length - Game.Length) + "Server");
ClientApp = CombinePaths(SC.RuntimeProjectRootDir, "Binaries", SC.PlatformDir, ExeName + Ext);
}
ExecutableNames.Add(ClientApp);
}
}
else
{
if (!SC.IsCodeBasedProject)
{
string ExeName = SC.StageTargetPlatform.GetPlatformExecutableName("UE4Game");
ExecutableNames.Add(CombinePaths(SC.RuntimeRootDir, "Engine/Binaries", SC.PlatformDir, ExeName + Ext));
}
else
{
string ExeName = SC.StageTargetPlatform.GetPlatformExecutableName(SC.ShortProjectName);
ExecutableNames.Add(CombinePaths(SC.RuntimeProjectRootDir, "Binaries", SC.PlatformDir, ExeName + Ext));
}
}
}
else
{
string ExeName = SC.StageTargetPlatform.GetPlatformExecutableName("UE4Editor");
ExecutableNames.Add(CombinePaths(SC.RuntimeRootDir, "Engine/Binaries", SC.PlatformDir, ExeName + Ext));
}
return ExecutableNames;
}
/// <summary>
/// Get the files to deploy, specific to this platform, typically binaries
/// </summary>
/// <param name="SC">Deployment Context</param>
public virtual void GetFilesToDeployOrStage(ProjectParams Params, DeploymentContext SC)
{
throw new AutomationException("{0} does not yet implement GetFilesToDeployOrStage.", PlatformType);
}
/// <summary>
/// Called after CopyUsingStagingManifest. Does anything platform specific that requires a final list of staged files.
/// e.g. PlayGo emulation control file generation for PS4.
/// </summary>
/// <param name="Params"></param>
/// <param name="SC"></param>
public virtual void PostStagingFileCopy(ProjectParams Params, DeploymentContext SC)
{
}
/// <summary>
/// Get the files to deploy, specific to this platform, typically binaries
/// </summary>
/// <param name="SC">Deployment Context</param>
public virtual void GetFilesToArchive(ProjectParams Params, DeploymentContext SC)
{
SC.ArchiveFiles(SC.StageDirectory);
}
/// <summary>
/// Gets cook platform name for this platform.
/// </summary>
/// <param name="bDedicatedServer">True if cooking for dedicated server</param>
/// <param name="bIsClientOnly">True if cooking for client only</param>
/// <returns>Cook platform string.</returns>
public virtual string GetCookPlatform(bool bDedicatedServer, bool bIsClientOnly)
{
throw new AutomationException("{0} does not yet implement GetCookPlatform.", PlatformType);
}
/// <summary>
/// Gets extra cook commandline arguments for this platform.
/// </summary>
/// <param name="Params"> ProjectParams </param>
/// <returns>Cook platform string.</returns>
public virtual string GetCookExtraCommandLine(ProjectParams Params)
{
return "";
}
/// <summary>
/// Gets extra maps needed on this platform.
/// </summary>
/// <returns>extra maps</returns>
public virtual List<string> GetCookExtraMaps()
{
return new List<string>();
}
/// <summary>
/// Get a release pak file path, if we are currently building a patch then get the previous release pak file path, if we are creating a new release this will be the output path
/// </summary>
/// <param name="SC"></param>
/// <param name="Params"></param>
/// <param name="PakName"></param>
/// <returns></returns>
public virtual string GetReleasePakFilePath(DeploymentContext SC, ProjectParams Params, string PakName)
{
if (Params.IsGeneratingPatch)
{
return CombinePaths(Params.GetBasedOnReleaseVersionPath(SC, Params.Client), PakName);
}
else
{
return CombinePaths(Params.GetCreateReleaseVersionPath(SC, Params.Client), PakName);
}
}
/// <summary>
/// Gets editor cook platform name for this platform. Cooking the editor is not useful, but this is used to fill the derived data cache
/// </summary>
/// <returns>Cook platform string.</returns>
public virtual string GetEditorCookPlatform()
{
return GetCookPlatform(false, false);
}
/// <summary>
/// return true if we need to change the case of filenames inside of pak files
/// </summary>
/// <returns></returns>
public virtual bool DeployPakInternalLowerCaseFilenames()
{
return false;
}
/// <summary>
/// return true if we need to change the case of filenames outside of pak files
/// </summary>
/// <returns></returns>
public virtual bool DeployLowerCaseFilenames(bool bUFSFile)
{
return false;
}
/// <summary>
/// Converts local path to target platform path.
/// </summary>
/// <param name="LocalPath">Local path.</param>
/// <param name="LocalRoot">Local root.</param>
/// <returns>Local path converted to device format path.</returns>
public virtual string LocalPathToTargetPath(string LocalPath, string LocalRoot)
{
return LocalPath;
}
/// <summary>
/// Returns a list of the compiler produced debug file extensions
/// </summary>
/// <returns>a list of the compiler produced debug file extensions</returns>
public virtual List<string> GetDebugFileExtentions()
{
return new List<string>();
}
/// <summary>
/// Remaps movie directory for platforms that need a remap
/// </summary>
public virtual bool StageMovies
{
get { return true; }
}
/// <summary>
/// UnrealTargetPlatform type for this platform.
/// </summary>
public UnrealTargetPlatform PlatformType
{
get { return TargetPlatformType; }
}
/// <summary>
/// UnrealTargetPlatform type for this platform.
/// </summary>
public UnrealTargetPlatform IniPlatformType
{
get { return TargetIniPlatformType; }
}
/// <summary>
/// True if this platform is supported.
/// </summary>
public virtual bool IsSupported
{
get { return false; }
}
/// <summary>
/// True if this platform requires UFE for deploying
/// </summary>
public virtual bool DeployViaUFE
{
get { return false; }
}
/// <summary>
/// True if this platform requires UFE for launching
/// </summary>
public virtual bool LaunchViaUFE
{
get { return false; }
}
/// <summary>
/// True if this platform can write to the abslog path that's on the host desktop.
/// </summary>
public virtual bool UseAbsLog
{
get { return true; }
}
/// <summary>
/// Remaps the given content directory to its final location
/// </summary>
public virtual string Remap(string Dest)
{
return Dest;
}
/// <summary>
/// Tri-state - The intent is to override command line parameters for pak if needed per platform.
/// </summary>
///
public enum PakType { Always, Never, DontCare };
public virtual PakType RequiresPak(ProjectParams Params)
{
return PakType.DontCare;
}
/// <summary>
/// Returns platform specific command line options for UnrealPak
/// </summary>
public virtual string GetPlatformPakCommandLine()
{
return "";
}
/// <summary>
/// True if this platform is supported.
/// </summary>
public virtual bool SupportsMultiDeviceDeploy
{
get { return false; }
}
/// <summary>
/// Returns true if the platform wants patches to generate a small .pak file containing the difference
/// of current data against a shipped pak file.
/// </summary>
/// <returns></returns>
public virtual bool GetPlatformPatchesWithDiffPak(ProjectParams Params, DeploymentContext SC)
{
return true;
}
/// <summary>
/// Returns whether the platform requires a package to deploy to a device
/// </summary>
public virtual bool RequiresPackageToDeploy
{
get { return false; }
}
public virtual List<string> GetFilesForCRCCheck()
{
string CmdLine = "UE4CommandLine.txt";
if (DeployLowerCaseFilenames(true))
{
CmdLine = CmdLine.ToLowerInvariant();
}
return new List<string>() { CmdLine };
}
#region Hooks
public virtual void PreBuildAgenda(UE4Build Build, UE4Build.BuildAgenda Agenda)
{
}
public virtual void PostBuildTarget(UE4Build Build, FileReference UProjectPath, string TargetName, string Config)
{
}
/// <summary>
/// General purpose command to run generic string commands inside the platform interfeace
/// </summary>
/// <param name="Command"></param>
public virtual int RunCommand(string Command)
{
return 0;
}
public virtual bool ShouldUseManifestForUBTBuilds(string AddArgs)
{
return true;
}
/// <summary>
/// Determines whether we should stage a UE4CommandLine.txt for this platform
/// </summary>
public virtual bool ShouldStageCommandLine(ProjectParams Params, DeploymentContext SC)
{
return true;
}
/// <summary>
/// Only relevant for the mac and PC at the moment. Example calling the Mac platform with PS4 as an arg will return false. Can't compile or cook for the PS4 on the mac.
/// </summary>
public virtual bool CanHostPlatform(UnrealTargetPlatform Platform)
{
return false;
}
/// <summary>
/// Allows some platforms to not be compiled, for instance when BuildCookRun -build is performed
/// </summary>
/// <returns><c>true</c> if this instance can be compiled; otherwise, <c>false</c>.</returns>
public virtual bool CanBeCompiled()
{
return true;
}
public virtual bool RetrieveDeployedManifests(ProjectParams Params, DeploymentContext SC, string DeviceName, out List<string> UFSManifests, out List<string> NonUFSManifests)
{
UFSManifests = null;
NonUFSManifests = null;
return false;
}
public virtual bool SignExecutables(DeploymentContext SC, ProjectParams Params)
{
return true;
}
public virtual UnrealTargetPlatform[] GetStagePlatforms()
{
return new UnrealTargetPlatform[] { PlatformType };
}
#endregion
#region Utilities
public static string GetExeExtension(UnrealTargetPlatform Target)
{
switch (Target)
{
case UnrealTargetPlatform.Win32:
case UnrealTargetPlatform.Win64:
case UnrealTargetPlatform.XboxOne:
return ".exe";
case UnrealTargetPlatform.PS4:
return ".self";
case UnrealTargetPlatform.IOS:
return ".stub";
case UnrealTargetPlatform.Linux:
return "";
case UnrealTargetPlatform.HTML5:
return ".js";
}
return String.Empty;
}
public static Dictionary<TargetPlatformDescriptor, Platform> Platforms
{
get { return AllPlatforms; }
}
public static Platform GetPlatform(UnrealTargetPlatform PlatformType)
{
TargetPlatformDescriptor Desc = new TargetPlatformDescriptor(PlatformType);
return AllPlatforms[Desc];
}
public static Platform GetPlatform(UnrealTargetPlatform PlatformType, string CookFlavor)
{
TargetPlatformDescriptor Desc = new TargetPlatformDescriptor(PlatformType, CookFlavor);
return AllPlatforms[Desc];
}
public static bool IsValidTargetPlatform(TargetPlatformDescriptor PlatformDesc)
{
return AllPlatforms.ContainsKey(PlatformDesc);
}
public static List<TargetPlatformDescriptor> GetValidTargetPlatforms(UnrealTargetPlatform PlatformType, List<string> CookFlavors)
{
List<TargetPlatformDescriptor> ValidPlatforms = new List<TargetPlatformDescriptor>();
if (!CommandUtils.IsNullOrEmpty(CookFlavors))
{
foreach (string CookFlavor in CookFlavors)
{
TargetPlatformDescriptor TargetDesc = new TargetPlatformDescriptor(PlatformType, CookFlavor);
if (IsValidTargetPlatform(TargetDesc))
{
ValidPlatforms.Add(TargetDesc);
}
}
}
// In case there are no flavors specified or this platform type does not care/support flavors add it as generic platform
if (ValidPlatforms.Count == 0)
{
TargetPlatformDescriptor TargetDesc = new TargetPlatformDescriptor(PlatformType);
if (IsValidTargetPlatform(TargetDesc))
{
ValidPlatforms.Add(TargetDesc);
}
}
return ValidPlatforms;
}
#endregion
}
}