Files
UnrealEngineUWP/Engine/Source/Programs/UnrealBuildTool/System/VCProjectFileGenerator.cs
Ben Marsh 2cbba54705 Copying //UE4/Release-Staging-4.12 to //UE4/Main (Source: //UE4/Release-4.12 @ 2992821)
==========================
MAJOR FEATURES + CHANGES
==========================

Change 2992821 on 2016/05/27 by Max.Chen

	Subway Sequencer: Add "Assets" and "Character" to the list of additional directories to cook.

	#jira UE-31279
	#lockdown Cristina.Riveron

Change 2992761 on 2016/05/27 by Max.Chen

	Add assets from "Directories to Always Cook".

	#jira UE-31279

	#lockdown Cristina.Riveron

Change 2992371 on 2016/05/26 by Dmitry.Rekman

	Fix GUBP Tools node (UE-31378).

	#jira UE-31378
	#lockdown Josh.Adams

Change 2992279 on 2016/05/26 by Dmitry.Rekman

	One more fix for UAT compilation failure (UE-31312).

	- Make EnvVarsToXML target framework v4.5.

	#lockdown Josh.Adams
	#jira UE-31312

Change 2992060 on 2016/05/26 by Josh.Adams

	- Reset PVRTC compression quality to default, so cooks don't take forever for IOS. We shipped with PVRTC Quality 4 for the App Store version. This is set in the Cooker Settings in the Project Settings window.
	#lockdown cristina.riveron
	#jira UE-31373

Change 2992009 on 2016/05/26 by Dmitry.Rekman

	Fix packaging on Linux (UE-31312).

	- System.Xml was spelled as System.XML.

	#jira UE-31312
	#lockdown Josh.Adams

Change 2991784 on 2016/05/26 by Martin.Wilson

	Fix for RecalcRequiredBones crashing when there is no lod data

	#jira UE-30028
	#lockdown cristina.riveron

Change 2991744 on 2016/05/26 by Dmitry.Rekman

	Fix Linux code project generation (UE-31322).

	- Also fixes UE-31318 (not reopening when creating BP project).
	- Apparently, we cannot reset all signals to default, this makes posix_spawn() fail after fork (child exits with 127).
	- Added logging of child's return code.

	#lockdown Josh.Adams
	#jira UE-31322
	#jira UE-31318

Change 2991448 on 2016/05/26 by Nick.Darnell

	Disabling the logging in the git module that was added from the previous commit.

	#jira UE-30781
	#lockdown cristina.riveron

Change 2991352 on 2016/05/26 by Max.Chen

	Subway Sequencer: Add "Sequencer" to the list of additional directories to cook.

	#jira UE-31279
	#lockdown Cristina.Riveron

Change 2991121 on 2016/05/26 by Ben.Marsh

	Fix ShooterGame warnings on XboxOne.

	#lockdown cristina.riveron

Change 2991097 on 2016/05/26 by Nick.Darnell

	PR #2386: Git Plugin: fix initialization of a new repository broken by new "migrate" support 4.12 (Contributed by SRombauts)

	#jira UE-30781
	#lockdown cristina.riveron

Change 2991095 on 2016/05/26 by Dmitry.Rekman

	Fix packaging on Linux (UE-31312).

	- Excludes UAT modules unsupported on the platform (e.g. TVOS).

	#jira UE-31312
	#lockdown Josh.Adams

Change 2990806 on 2016/05/25 by Michael.Gay

	Last minute adjustments to SubwaySequencer shots.
	Fixed Fade track on master and moved Event tracks to shots.
	#jira UE-30804
	#lockdown Cristina.Riveron

Change 2990739 on 2016/05/25 by Dan.Oconnor

	Fix for transaction buffer failing to restore preview widget trees, these are regenerated post undo/redo and should not be tagged as transactional
	#jira UE-31155
	#lockdown cristina.riveron

Change 2990657 on 2016/05/25 by Dmitry.Rekman

	Fix crash in mono when invoked by the engine (UE-31312).

	- Reset signal mask on spawning a subprocess. We mask out all signals except explicitly handled, which does not play well with mono.
	- See also https://answers.unrealengine.com/questions/420161/mono-process-crash.html

	#jira UE-31312
	#lockdown Josh.Adams

Change 2990564 on 2016/05/25 by Marc.Audy

	Undo 4.12 change to DetachFromParent when AttachTo is called with a null parent.
	#jira UE-00000
	#lockdown Cristina.Riveron

Change 2990429 on 2016/05/25 by Max.Chen

	Movie Capture: Fix initialization order warning. Follow up to CL #2990314

	#jira UE-31285
	#lockdown Nick.Penwarden

Change 2990338 on 2016/05/25 by Zabir.Hoque

	TEMP Fix: On server enqued render thread work is dropped. So on server release Reflection capture resouce immediately instead of trying to defer enque.

	#jira UE-28838
	#lockdown cristina.riveron

Change 2990314 on 2016/05/25 by Max.Chen

	Movie Capture: Flush the viewport when grabbing frames. This fixes more frame accuracy issues.

	#jira UE-31285
	#lockdown Nick.Penwarden

Change 2990249 on 2016/05/25 by Max.Chen

	Sequencer: Fix tick prerequisites getting removed on stop and not re-set on play. This fixes frame accuracies when rendering in a separate process.

	#jira UE-31285
	#lockdown Nick.Penwarden

Change 2990243 on 2016/05/25 by Lukasz.Furman

	Fixed behavior tree observers not being applied correctly
	#jira UE-31307
	#lockdown Cristina.Riveron

Change 2990206 on 2016/05/25 by Daniel.Lamb

	Make sure min number of threads in the large thread pool is at least 2.
	#jira UE-31253
	#lockdown Cristina.Riveron

Change 2990182 on 2016/05/25 by Max.Chen

	Sequencer: Fix null ptr crash on trying to record from current player. This is a regression from the off by one frame fixes.

	#jira UE-31304
	#lockdown Nick.Penwarden

Change 2990124 on 2016/05/25 by Chris.Bunner

	Avoid creating additional inline code fragment casting matching uniform types.
	#lockdown cristina.riveron
	#jira UE-29089

Change 2989978 on 2016/05/25 by Uriel.Doyon

	Merged fix for issue with resolution scale in PostProcessVisualizeComplexity
	#jira UE-29473
	#lockdown cristina.riveron

Change 2989970 on 2016/05/25 by Taizyd.Korambayil

	#lockdown cristina.riveron
	#jira UE-31293 Added TestMaps Folder and moved all Non-Relevant Maps into it.

Change 2989911 on 2016/05/25 by Chris.Babcock

	Remove warning about Android debugging since CodeWorks for Android Nsight supports VS2015
	#jira UE-31292
	#ue4
	#android
	#lockdown cristina.riveron

Change 2989898 on 2016/05/25 by Robert.Manuszewski

	Splitting inline shader registration from serialization. Serialization can happen on the async loading thread but registration should only happen on the game thread. Removed a lot of critical section locks.

	Reimplementing CL #2952596

	#jira UE-29245
	#lockdown Nick.Penwarden

Change 2989849 on 2016/05/25 by Max.Preussner

	Sequencer: Fixed Crash when playing UMG sequence with audio tracks (UE-31289)

	#jira UE-31289
	#lockdown nick.penwarden

Change 2989793 on 2016/05/25 by Max.Chen

	Sequencer: Change automated capture so it captures in response to a sequence update to fix off by one frames.

	#jira UE-30755
	#lockdown Nick.Penwarden

Change 2989792 on 2016/05/25 by Max.Chen

	Sequencer: Put back setting MaxFPS when forcing fixed frame interval playback to fix motion blur in editor.

	#jira UE-30755
	#lockdown Nick.Penwarden

Change 2989774 on 2016/05/25 by Mike.Beach

	Mirroring CL 2946932

	Guarding against invalid EdGraphPins (ones that have been moved to the transient package) when constructing the widget - prevents a crash that we've been unable to repro or determine the cause of (turns it instead into an ensure, so we can collect more contextual information on the issue).

	#lockdown cristina.riveron
	#jira UE-26998

Change 2989765 on 2016/05/25 by Olaf.Piesche

	Moivng CL 2967970  from Dev-Rendering - fix for
	#jira UE-27297

	#lockdown nick.penwarden

Change 2989481 on 2016/05/25 by Marc.Audy

	Properly route AttachToComponent to SetupAttachment if called from the constructor
	#jira UE-31055
	#lockdown Cristina.Riveron

Change 2989369 on 2016/05/25 by Robert.Manuszewski

	Don't create asset import data for archetype TileMap. Propagate component flags to TileMap if the component is an archetype.

	#jira UE-31033
	#lockdown Nick.Penwarden

Change 2988975 on 2016/05/24 by Max.Preussner

	Sequencer: Fixed Cinematic Camera look at tool crashes on auto save (UE-31195)

	#jira UE-31195
	#lockdown nick.penwarden

Change 2988834 on 2016/05/24 by Max.Chen

	Movie Capture: Crash fix - Protect against null encoding filter.

	#jira UE-31233

	#lockdown Nick.Penwarden

Change 2988764 on 2016/05/24 by Peter.Sauerbrei

	fix for exception when deploying to tvOS from PC
	#jira UE-30318
	#lockdown cristina.riveron

Change 2988540 on 2016/05/24 by Jeff.Campeau

	Disable incompatible OpenVR for Windows XP builds.
	Gut SteamVR and SteamVRController for Windows XP builds (rely on OpenVR).
	#lockdown Nick.Penwarden
	#jira UE-30823

Change 2988491 on 2016/05/24 by Zak.Middleton

	#ue4 - (4.12) Remove version check from serialization logic that fixes up stale transient properties. They would still loaded for archetypes and we always want to prevent that in the future.

	#lockdown cristina.riveron
	#jira UE-30625

Change 2988427 on 2016/05/24 by Aaron.McLeran

	#jira UE-31028 Stop Quietest Concurrency does not remove the quietest sound

	Fix is to not re-add the sound once its stopped due to max concurrency.

	#tests ran the QA test map that demonstrated the problem
	#lockdown cristina.riveron

Change 2988391 on 2016/05/24 by Taizyd.Korambayil

	#lockdown cristina.riveron
	#jira UE-30301 Rebuilt Ligthing for all Content Example Maps

Change 2988315 on 2016/05/24 by Allan.Bentham

	Re-enabled FLUTBlenderPS on vulkan devices. (it's required for protostar)

	#jira UE-31079

Change 2988227 on 2016/05/24 by Frank.Fella

	Sequencer - Add support for forcing editor and runtime evaluation to happen on exact fixed frame intervals.  Updated the subway sequencer sample to work with these changes.

	Change missed in first checkin.

	#Jira UE-30755

Change 2988200 on 2016/05/24 by Robert.Manuszewski

	Assert if MaxObjectsInEditor or MaxObjectsInGame are too big and collide with EInternalObjectFlags

	#jira UE-31218

Change 2988181 on 2016/05/24 by Peter.Sauerbrei

	revert out the last fix and add more logging as I can't reproduce this bug
	#jira UE-30813

Change 2988140 on 2016/05/24 by Frank.Fella

	Sequencer - Add support for forcing editor and runtime evaluation to happen on exact fixed frame intervals.  Updated the subway sequencer sample to work with these changes.

	#Jira UE-30755

Change 2988081 on 2016/05/24 by Jamie.Dale

	Better fix for UE-29651 that will also work with packages saved from a build without an engine version

	There was no version bump for the change to FFormatArgumentData, but VER_UE4_K2NODE_VAR_REFERENCEGUIDS was added at almost the same time so testing that should handle the vast majority of packages that we have internally, and will handle all external packages.

	#jira UE-29651

Change 2987964 on 2016/05/24 by Lee.Clark

	Fix empty ENV path when compiling PS4 targets.

	#jira UE-31210

Change 2987721 on 2016/05/23 by Dan.Oconnor

	Reworking node validation change done in 2910382 so that nodes that are going to spawn other nodes in the expansion step are still validated.
	#jira UE-31099

Change 2987696 on 2016/05/23 by Chris.Babcock

	Update AndroidWorks 1R1 to CodeWorks for Android 1R4
	#jira UEPLAT-1312
	#ue4
	#android

Change 2987624 on 2016/05/23 by Jeff.Campeau

	Fix a define protection for WinXP stack walking support.
	#jira UE-30823

Change 2987607 on 2016/05/23 by Jeff.Campeau

	Windows Stack Walk fixed to work with Windows XP.
	Use the ASCII calls where needed.
	Symbol server is unsupported and is disabled when building for Windows XP.
	#jira UE-30823

Change 2987593 on 2016/05/23 by Zak.Middleton

	#ue4 - (4.12) Reject old serialized values of UMovementComponent::UpdatedComponent and UpdatedPrimitive that were saved before those were marked transient. Mark UPawnMovementComponent::PawnOwner and UCharacterMovementComponent::CharacterOwner as transient, and similarly reject old saved values.

	#jira UE-30625

Change 2987548 on 2016/05/23 by Lukasz.Furman

	Moved newly added gameplay debugger's code out of perception component
	#jira UE-31090

Change 2987510 on 2016/05/23 by Lukasz.Furman

	Restored perception category in old gameplay debugger tool
	#jira UE-31090

Change 2987278 on 2016/05/23 by Ben.Marsh

	Rocket: Add Mac GenerateProjectFiles.sh script into installed engine distro.

	#jira UE-31109

Change 2987156 on 2016/05/23 by Chris.Babcock

	Added GoogleVR to InstalledEngineFilters.ini
	#jira UE-31186
	#ue4
	#android

Change 2987129 on 2016/05/23 by Mieszko.Zielinski

	Fixed FNavigationFilterArea not zeroing its properties in default constuctor #UE4

	#jira UE-31185

Change 2987100 on 2016/05/23 by Peter.Sauerbrei

	fix for crash in DeploymentServer when attempting to copy a file with a space in the path or name
	#jira UE-30813

Change 2987064 on 2016/05/23 by Dmitry.Rekman

	PR #2164: [Linux] Fix clang '&&' within '||' error (Contributed by slonopotamus)

	#jira UE-28537

Change 2987002 on 2016/05/23 by Aaron.McLeran

	#jira UE-31036 Sound volume does not change when moving past the Non Focus Azimuth range if set to greater than 90 degrees

	Fix was to remove the clamp on the dot-product

	#tests ran test map with focus factors greater than 90 degrees

Change 2986880 on 2016/05/23 by Mark.Satterthwaite

	Fix UE-31124 due to bad array iteration logic - amazing that this hadn't been seen earlier.
	#jira UE-31124

Change 2986873 on 2016/05/23 by Lina.Halper

	#fix issue with morphtarget importings for LODs
	 - this was caused by option not being set correctly

	#jira: UE-30955
	#code review: Alexis.Matte

Change 2986804 on 2016/05/23 by Taizyd.Korambayil

	#jira UE-31132 Added Missing Function to Blueprint.

Change 2986801 on 2016/05/23 by Jamie.Dale

	SSearchBox will now only delay text changes while it has focus

	A text changed event when it doesn't have focus is usually triggered by code (rather than the user typing), so we need to process it immediately to avoid other operational ordering issues.

	#jira UE-31101

Change 2986793 on 2016/05/23 by Martin.Wilson

	Fix for morph curves not getting applied to meshes in cooked builds (smart names were not being corrected). (brought from dev-rendering 2983747)

	#Jira UE-31166

Change 2986772 on 2016/05/23 by Benn.Gallagher

	Fixed montage single node instances with negative rate scales only repeating the final section when looping
	#jira UE-31164

Change 2986766 on 2016/05/23 by Martin.Wilson

	Fix for preview not updating when tranform curve flags are changed.

	#Jira UE-31119

Change 2986569 on 2016/05/23 by Robert.Manuszewski

	Making hang detection disabled bu default and an opt-in for games.

	#jira UE-31151

Change 2986564 on 2016/05/23 by Martin.Wilson

	Fix for being able to set montages on an anim track segment.

	#jira UE-31039

Change 2986205 on 2016/05/21 by Zabir.Hoque

	Add new instrumentation to bucketize why we are seeing device lost so often.

	#jira UE-20434

Change 2986071 on 2016/05/20 by Dan.Oconnor

	Fix for TRASHCLASS sneaking into property list when recompiling a blueprint that has a dependency that is dirty and requires bytecode recompilation of its dependencies. Make sure that the dirty blueprint itself is part of the bytecode recompilation process and make sure that blueprints compiled in this way are compiled after their parent classes
	#jira UE-30411

Change 2986068 on 2016/05/20 by Dan.Oconnor

	Fix for blueprint change/compile delegates leaking
	#jira UE-31118

Change 2986044 on 2016/05/20 by Zabir.Hoque

	Make OpenGL VB allocation support alignment (16 by default). Future work should expose this up through the RHI layers.

	#CodeReview: Olaf.Piesche, Simon.Tovey
	#jira UE-29231

Change 2985934 on 2016/05/20 by Mark.Satterthwaite

	Further changes to ensure that UE-30710 really is fixed while also not live-leaking memory in MetalRHI.
	#jira UE-30710

Change 2985852 on 2016/05/20 by Max.Chen

	Subway Sequencer: Remove level sequence editor from plugin list since it's on by default.

	#jira UE-31106

Change 2985821 on 2016/05/20 by Phillip.Kavan

	[UE-22874] Fix UObject duplication to preserve default subobjects created by the native class ctor when the root object is duplicated.

	change summary:
	- added FObjectDuplicationHelperMethods::GatherDefaultSubobjectsForDuplication()
	- modified StaticDuplicateObjectEx() to map default subobjects created in the duplicated root object's ctor before entering the serialization pass. this preserves those instances instead of causing StaticConstructObject to destroy/recreate them during serialization as part of the UObject reference duplication logic.

	#jira UE-22874

Change 2985750 on 2016/05/20 by Michael.Gay

	Default Game map set to SubwaySequencer_P
	#jira UE-31108

Change 2985660 on 2016/05/20 by Michael.Gay

	Removing unused track animation
	#jira UE-30804

Change 2985349 on 2016/05/20 by Dan.Oconnor

	Fix for crash that occurs when repeatedly pasting and undoing an object with subobjects. We were not clearing the internal flags when recycling an object
	#jira UE-30954

Change 2985346 on 2016/05/20 by Leslie.Nivison

	Updating 4.12 credit
	#jira UEPROD-820

Change 2985297 on 2016/05/20 by Jamie.Dale

	Fixed VS version detection

	It was checking the file version (which is 12), rather than the VS version (which is 12 for 2013, and 14 for 2015).

	#jira UE-30977

Change 2985233 on 2016/05/20 by Gareth.Martin

	Fixed crash when building lighting when using "Use Landscape Lightmap" on landscape grass
	#jira UE-30975

Change 2985184 on 2016/05/20 by Chris.Babcock

	Move audio warning to show proper error result code
	#jira UE-31085
	#ue4
	#android

Change 2985183 on 2016/05/20 by Chad.Taylor

	GoogleVR disabled by default

	#jira UE-30921

Change 2985145 on 2016/05/20 by Jack.Porter

	Fix for precision issue causing blocky landscape LOD on iPad Pro and several other iOS devices

	#jira UE-24792

Change 2985124 on 2016/05/20 by Alex.Delesky

	#jira UE-29794

	If the editor cannot find the SSL DLLs when enabling the Perforce source control plugin, it will now display a warning in the Source Control log instead of crashing.

Change 2985066 on 2016/05/20 by Lee.Clark

	Fix r.SelectiveBasePassOutputs so that it defaults to off

	#jira UE-30133

Change 2985063 on 2016/05/20 by Allan.Bentham

	Fix for modulated shadow precision issues on low end android hardware.

	#jira UE-29083

Change 2985061 on 2016/05/20 by Max.Chen

	Viewport: Fix crash when the viewport widget is null.

	#jira UE-31050

Change 2985059 on 2016/05/20 by Rolando.Caloca

	UE4.12 - Workaround for crash trying to track down other crash
	#jira UE-30875

Change 2984876 on 2016/05/20 by Richard.TalbotWatkin

	Made SceneOutliner visibility code safer, to avoid a potential crash.
	#jira UE-30831 - [CrashReport] UE4Editor_SceneOutliner!SceneOutliner::FGetVisibilityVisitor::RecurseChildren() [sceneoutlinergutter.cpp:24]

Change 2984873 on 2016/05/20 by Richard.TalbotWatkin

	Clipped selection box bounds in Matinee viewport to prevent crash when reading outside of the viewport area.
	#jira UE-30968 - Ctrl+Alt selection drag inside to outside of Matinee window will crash the editor

Change 2984844 on 2016/05/20 by Matthew.Griffin

	Fixing compile error in mono games

Change 2984825 on 2016/05/20 by Robert.Manuszewski

	When the application crashes becaused the GPU driver was disabled, make sure the CrashReporterClient window gets the updated screen metrics after the driver is restored.

	#jira UE-30556

Change 2984693 on 2016/05/20 by Phillip.Kavan

	[UE-30495] Fix BP editor crash on component rename following undo of component add action.

	change summary:
	- modified USimpleConstructionScript::CreateNode() to create the initial component template object in the transient package, so that subsequent undo actions restore to that state rather than to a valid BPGC-owned state.
	- modified StaticConstructObject_Internal() to restore the inclusion of RF_ArchetypeObject-flagged objects in the logic that sets new objects to 'PendingKill' state before recording them into the transaction buffer. this ensures that they can be GC'd when construction is undone in the editor. Tested against sample/repro steps in UE-21240 to ensure that it no longer crashes even with the original change from CL# 2832225 reverted (that fix has since been superceded).

	#jira UE-30495

Change 2984684 on 2016/05/20 by Phillip.Kavan

	[UE-30852] Fix BPGC custom property list delta generation & post-construct initialization/serialization to properly handle array values that differ from default in length but not inner element values.

	change summary:
	- modified UBlueprintGeneratedClass::BuildCustomPropertyListForPostConstruction()/BuildCustomArrayPropertyListForPostConstruction() to return a boolean value indicating whether or not a delta value was detected.
	- modified UBlueprintGeneratedClass::BuildCustomArrayPropertyListForPostConstruction() and FBlueprintEditorUtils::BuildComponentInstancingData() to ensure that array properties are emitted to delta property lists if the size differs from default, even if none of the elements actually differ from the default value
	- removed the ensure() for the array property case in FObjectInitializer::InitPropertiesFromCustomList(), as it is now a valid case to encounter an array property delta value without any actual delta element value overrides following it in the custom property stream
	- restored the bCanUsePostConstructLink optimization for non-native class types in FObjectInitializer::InitProperties()
	- modified UArrayProperty::SerializeItem() for the ArUseCustomPropertyList case to not empty the array when a resize is needed on load (read) - this fixes an edge case in the cooked BP component data stream when array size differed from default but only one or more of the inner values actually differed, in which case all the array slots were being reset (constructed/zeroed) but only the overridden value was being serialized (loaded) from the template data stream

	#jira UE-30852

Change 2984651 on 2016/05/19 by Zabir.Hoque

	Forcing GoogleVR plugin to disabled by default since its causing even non HDM machines to render split foveated viewports.

	#CodeReview: Chad.Taylor, Nick.Whiting
	#jira UE-30921

Change 2984636 on 2016/05/19 by Zabir.Hoque

	Explicitly store the cubemap resolution in encoded reflection data.

	#CodeReview Daniel.Wright, Marcus.Wassmer
	#jira UE-30341

Change 2984454 on 2016/05/19 by Rolando.Caloca

	UE4.12 - Fix for vulkan failing to load shader
	Integration mirroring changelist 2984432
	#jira UE-28140

Change 2984452 on 2016/05/19 by Marcus.Wassmer

	#jira UE-31054
	Remove autocompletion for ToggleRHIThread and ShowMaterialDrawEvents as they no longer do anything

Change 2984415 on 2016/05/19 by Dan.Oconnor

	Fix for crash when we fail to spawn the preview actor because the desired class is deprecated
	#jira UE-31027

Change 2984376 on 2016/05/19 by Dan.Oconnor

	Fix for regression in GetClassDefaults - we were not handling the 'None' case
	#jira UE-31034

Change 2984316 on 2016/05/19 by Aaron.McLeran

	#jira UE-31049 Updating the Oculus Audio SDK to vs 1.02

	#tests Ran updated SDK in several test maps, confirmed HRTF spatialization is working.

Change 2984315 on 2016/05/19 by Lina.Halper

	Fix issue with importing morphtarget LOD when it's missing between

	#jira: UE-30949

Change 2984237 on 2016/05/19 by Dan.Oconnor

	Fix for ensure/possible stale memory access in UpdateOverlaps
	#jira UE-30919

Change 2984170 on 2016/05/19 by Max.Chen

	Movie Capture: Another pass at texture streaming fix for movie capture.

	#jira UE-30986

Change 2984134 on 2016/05/19 by Chad.Taylor

	Mac compiler warning fix

	#jira UE-30921

Change 2983903 on 2016/05/19 by Taizyd.Korambayil

	#jira UE-30562 Replaced cube With BSP for Floor

Change 2983840 on 2016/05/19 by Taizyd.Korambayil

	#jira UE-30979 Fixed Typo in one of the Stands

Change 2983662 on 2016/05/19 by Ben.Marsh

	GitHub: Add an exception to allow GoogleVR files to be mirrored to GitHub

Change 2983653 on 2016/05/19 by Chris.Bunner

	Modifed previous change to fixup incorrect ensures.
	#jira UE-30877

Change 2983599 on 2016/05/19 by Chris.Bunner

	Added ensure and null ptr check to canvas flush.
	#jira UE-30877

Change 2983596 on 2016/05/19 by Chad.Taylor

	FluffyBunny

	#jira UE-30921

Change 2983534 on 2016/05/19 by Brian.Karis

	4.12 fix per pixel translucency

	#jira UE-30902

Change 2983530 on 2016/05/19 by Chris.Babcock

	Broadcast EMediaEvent::MediaOpened when media opened successfully
	#jira UE-31006
	#ue4
	#android

Change 2983427 on 2016/05/19 by Richard.TalbotWatkin

	Conflated "Import" and "Import Scene" in the File menu; the new action is called "Import Into Level".  Limited the allowed file types to .t3d and .fbx.
	#jira UE-30891 - CRASH: Editor crashes when Importing Actors via File > Import

Change 2983386 on 2016/05/19 by Michael.Gay

	minor last tweaks
	#jira UE-30804

Change 2983280 on 2016/05/19 by Gil.Gribb

	UE4 - Fixed crash in FHierarchicalStaticMeshSceneProxy related to reflection captures and foliage.
	#jira UE-30837

Change 2983079 on 2016/05/18 by Max.Chen

	Movie Capture: Fix so that texture streaming option for movie capture is set when capturing in editor.

	#jira UE-30986

Change 2983078 on 2016/05/18 by Dmitriy.Dyomin

	Added more logging to track UE-30878
	#jira UE-30878

Change 2983067 on 2016/05/18 by Dmitriy.Dyomin

	Fixed: Mobile HDR Path doesn't work on GearVR
	#jira UE-11846

Change 2983049 on 2016/05/18 by Max.Chen

	Movie Capture: Fix crash on movie rendering when in HDR mode.

	#jira UE-30978

Change 2982825 on 2016/05/18 by Mark.Satterthwaite

	Correctly wait for the dispatch semaphore when clearing the Metal resource free lists.
	#jira UE-30710

Change 2982697 on 2016/05/18 by Marc.Audy

	Fix Orion DataProvider use of AddReferencedObjects in light of CL# 2982607
	#jira UE-00000

Change 2982546 on 2016/05/18 by Taizyd.Korambayil

	#jira UE-30862 resaved A bunc hof assets to Fix to attempt to fix Build Warnings

Change 2982533 on 2016/05/18 by Daniel.Lamb

	When you package if you haven't saved the changes will not be reflected in the game.
	#jira UE-30904

Change 2982415 on 2016/05/18 by Marc.Audy

	Bring forgotten 4.11 CL# 2928377 to 4.12
	Ensure that the compiler will throw an error when passing a non-UObject* TArray to AddReferencedObjects
	#jira UE-28933

Change 2982358 on 2016/05/18 by Taizyd.Korambayil

	#jira UE-30546 Updated TP_VehicleAdvPawn Chase Camera Location

Change 2982280 on 2016/05/18 by Martin.Mittring

	UE-26409 Crash when Light Propagation Volume Plugin is disabled on a Project
	#jira:UE-26409

Change 2982229 on 2016/05/18 by Max.Chen

	Sequencer: Add tick prerequisites so that the level sequence actor ticks before all of the actors that it controls. This fixes some inconsistencies in the movie rendered frames not matching what's in editor.

	#jira UE-30755

Change 2982080 on 2016/05/18 by Max.Chen

	Sequence Recorder: Fix crash when component class to record is null.

	#jira UE-30944

Change 2982041 on 2016/05/18 by Marcus.Wassmer

	Protect against crashes reading from a null texture.
	#jira UE-30834

Change 2981915 on 2016/05/18 by Allan.Bentham

	Do not mosaic encode for modulate blend operations.
	Fixes dark 'halos' around mod shadows.

	#jira UE-29083

Change 2981911 on 2016/05/18 by michael.gay

	Set framing in sequencer, set start to 200

	#jira UE-30633

Change 2981904 on 2016/05/18 by Chase.McAllister

	#jira UE-30943 Removing unused asset to fix DDC compiling bug

Change 2981894 on 2016/05/18 by Michael.Gay

	removed old cameras, changed start frame to remove black at head of sequence
	#jira UE-30633

Change 2981827 on 2016/05/18 by Gareth.Martin

	Fixed crash when entering landscape mode while a landscape is selected while simulating
	- Landscape infos no longer get created for PIE/Simulate landscapes (they were empty anyway)
	#jira UE-30917

Change 2981725 on 2016/05/18 by Keith.Judge

	Xbox One - Fix issues with DFAO/DF Shadowing. Problems were in RHIUpdateTexture3D(). Needed to ensure temp texture had the correct bind flags, etc, and also use the graphics context rather than the DMA context to do the copying, as for some reason the DMA engine corrupts some pixels of the distance field atlas texture.

	#jira UE-27591

Change 2981466 on 2016/05/17 by Max.Chen

	Merge from Chris Bunner from Dev-SequencerGDC - Frame state fixes when Sequencer is paused; No velocity in AA, Clamp motion blur scale, Clamp to scatter blur method.

	#jira UE-30576

Change 2981403 on 2016/05/17 by Dan.Oconnor

	Fix for overzealous filtering of classes with Within markup
	#jira UE-29878

Change 2981342 on 2016/05/17 by Dan.Oconnor

	Removing overzealous check. In Dev-BP this has already been downgraded to an ensure, but no reason to ensure now that we understand why it happens.
	#jira UE-30792

Change 2981318 on 2016/05/17 by Max.Preussner

	Sequencer: Fixed crash when scrubbing attached audio tracks; reduced nesting (UE-30923)

	#jira: UE-30923

Change 2981221 on 2016/05/17 by Dan.Oconnor

	Preventing spawning components with 'Within' markup specified, it is unsupported by the SCSEditor and Core UObject logic at this time. Likely logic is CoreUObject needs to avoid type checking for RF_ArchetypeObject instances and the SCSEditor needs to be more consistent about using that flag on its template objects
	#jira UE-29878

Change 2981169 on 2016/05/17 by Marc.Audy

	Gracefully handle invalid GameSingleton class name in ini file
	Remove unused DefaultPreviewPawnClass and ClassName from Engine
	#jira UE-30829

Change 2981104 on 2016/05/17 by Mieszko.Zielinski

	Made AISenses not send information to listeners that are not registered for given sense #UE4

	#jira UE-29939

Change 2981086 on 2016/05/17 by Taizyd.Korambayil

	#jira UE-30568 Added a check to make sure index being accessed was valid (BP_DemoRoom)

Change 2980755 on 2016/05/17 by Taizyd.Korambayil

	#jira UE-30706 Set material to use Translucent Blend

Change 2980753 on 2016/05/17 by Jon.Nabozny

	Initialize FBox used to store result for CalculateQuatACF96Bounds (bump from //UE4/Dev-Framework).

	#JIRA UE-30846

Change 2980682 on 2016/05/17 by Taizyd.Korambayil

	#jira UE-30570, UE-30575 Corrected Some Spellings

Change 2980559 on 2016/05/17 by Mieszko.Zielinski

	Changed UNavigationSystem.AgentToNavDataMap to store weak object pointers rather than raw painters #UE4

	This should make it immune to navigation data beging destroyed and not removed from AgentToNavDataMap.

	#jira UE-30836

Change 2980504 on 2016/05/17 by Daniel.Wright

	Integrate - Movable skylight now matches stationary for subsurface shading models
	* Two sided was broken in 4.11, Subsurface had never been handled
	#jira UE-30855

Change 2980467 on 2016/05/17 by Jamie.Dale

	Added some checks to avoid temporary worlds being added as favorites

	#jira UE-30613

Change 2980379 on 2016/05/17 by Jurre.deBaare

	Fix for static mesh merging, little too eager with changes.

	#jira UE-30808

Change 2980373 on 2016/05/17 by Gareth.Martin

	Fixed shader compile errors when applying a speedtree material to a landscape spline
	#jira UE-25820

Change 2980318 on 2016/05/17 by Gareth.Martin

	Fixed crash when calling EditorApplySpline with a null spline component
	Also stopped it doing anything in PIE (it's for blutilities, not runtime)
	#jira UE-30830

Change 2980300 on 2016/05/17 by Marc.Audy

	Treat Unreachable components the same as BeginDestroyed for endplay/cleanup purposes
	#jira UE-30839

Change 2980298 on 2016/05/17 by Gareth.Martin

	Fixed crash when loading landscape projects that used tessellation
	#jira UE-30742

Change 2980296 on 2016/05/17 by Martin.Wilson

	Fix crash accessing sync names from a child anim bp

	#jira UE-30811

Change 2980289 on 2016/05/17 by Jurre.deBaare

	Fix for regression with merge actor tab
	#jira UE-30809

Change 2980272 on 2016/05/17 by Ori.Cohen

	Make sure that root components do not get attached to non root components in the same actor. Fixes crash in scene outliner and other weird issues.

	#JIRA UE-30876

Change 2980206 on 2016/05/17 by Keith.Judge

	Xbox One - Bit the bullet and rewrote the occlusion query buffer handling so that we're not reliant on a finite ring buffer. Instead, each query has a small buffer of its own. removing the dependency of ordering when reading back the results. This should save memory on smaller maps too!

	#jira UE-30581
	#jira UEPLAT-623

Change 2980094 on 2016/05/17 by Matthew.Griffin

	Added OSVR dlls to InstalledEngineFilters.ini so that they are included in Launcher build even though the plugin is disabled by default
	#jira UE-30611

Change 2979935 on 2016/05/17 by Aaron.Herzog

	#jira UE-30619 updating owen sk mesh with proper morph

Change 2979816 on 2016/05/16 by Chad.Taylor

	Fix to address a crash related to multiple player VR Preview

	#jira UE-20109

Change 2979744 on 2016/05/16 by Mike.Beach

	Disabling Blueprint spawning, InitProperties() optimization until we can figure out why it is not filling out array properties properly.

	#jira UE-30745

Change 2979743 on 2016/05/16 by Mike.Beach

	Mirroring CL 2977497
	Clearing property nodes and cached read-addresses when changing the details view object (so any queued actions will not operate on invalid properties).

	#jira UE-26392

Change 2979544 on 2016/05/16 by Daniel.Wright

	Fixed crash with RTDF shadows when r.DistanceFieldAO was disabled
	#jira UE-26319

Change 2979477 on 2016/05/16 by michael.gay

	Remove errant Play Rate track.

	#jira UE-30633

Change 2979464 on 2016/05/16 by Mark.Satterthwaite

	Duplicate CL #2945444: Cache the Metal fallback depth-stencil surface for the canvas tile rendering so that we only ever keep one spare depth-stencil surface around. This costs us a little more permanent memory but reduces churn.
	#jira UE-30849

Change 2979441 on 2016/05/16 by Rolando.Caloca

	UE4.12 - vk - Fix quitting taking a long time
	#jira UE-28239

Change 2979315 on 2016/05/16 by Michael.Trepka

	Rollback //UE4/Release-4.12/Engine/Source/Programs/UnrealBuildTool/System/XcodeProject.cs to revision 1

	#jira UE-28016

Change 2979304 on 2016/05/16 by Jamie.Dale

	Backing out some changes from CL# 2976673

	These caused an issue with Slate hit-testing. The more correct fix here is to make the Slate Windows OS layer treat window positions as relative to the top-left of the window client area, rather than relative to the top-left of the window itself (which includes the OS border). This now matches what other platforms do.

	To this end, FWindowsWindow::Initialize, FWindowsWindow::MoveWindowTo, and FWindowsWindow::ReshapeWindow all now consider the given window position to be relative to the window client area, and will consistently adjust it to relative to the window before moving/creating the OS window. This only impacts windows with OS borders (aka, non-fullscreen and non-Slate drawn windows).

	#jira UE-30276
	#jira UE-30677
	#jira UE-30771

Change 2979077 on 2016/05/16 by Maciej.Mroz

	#jira UE-28536 Attached Project Crashes on Attempting to Play in Standalone
	merged from 2979069

Change 2979052 on 2016/05/16 by Chase.McAllister

	#jira UE-30789 Resaving Maps to fix project warning

Change 2978984 on 2016/05/16 by Chase.McAllister

	#jira UE-30789 Resaving start video assests that contained empty engine version

Change 2978806 on 2016/05/16 by Mieszko.Zielinski

	Fixed EQS tests' scoring equation value getting reset on load #UE4

	#jira UE-30470

Change 2978670 on 2016/05/16 by Max.Preussner

	Media: Workaround for changing Media asset path can cause crash (UE-22691)

	#jira: UE-22691

Change 2978638 on 2016/05/16 by Michael.Gay

	Cleanup of old maps in SubwaySequencer project
	#jira UE-30633

Change 2978636 on 2016/05/16 by Jamie.Dale

	Added guard against a crash navigating through a menu

	#jira UE-30698

Change 2978611 on 2016/05/16 by Lee.Clark

	PS4 - Fix RenderTargetOutputFormat using the wrong output index for velocity rendering when using r.BasePassOutputsVelocity=True

	#jira UE-30133

Change 2978596 on 2016/05/16 by Allan.Bentham

	Extend iOS metal Z bias offset to all  iOS (metal+gles) depth only shaders.

	#jira UE-27530

Change 2978566 on 2016/05/16 by Jamie.Dale

	Downgraded some checks to ensures and added more logging

	#jira UE-30613

Change 2978399 on 2016/05/16 by Keith.Judge

	Xbox One - Fix check() firing when we run out of occlusion buffer space. Also added occlusion query result caching (perf gain!).

	#jira UE-30581

Change 2978323 on 2016/05/16 by Jurre.deBaare

	Merge actor panel crashes when selecting a mesh component without static mesh
	#fix display 'No Static Mesh' when none is available
	#jira UE-30809

Change 2978322 on 2016/05/16 by Jurre.deBaare

	Issue with merging meshes resulting data saved across different LOD levels

	#fix use correct target LOD index for all source LODs
	#jira UE-30808

#lockdown Nick.Penwarden

[CL 2999693 by Ben Marsh in Main branch]
2016-06-03 11:49:20 -04:00

981 lines
41 KiB
C#

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Linq;
namespace UnrealBuildTool
{
/// <summary>
/// Represents a folder within the master project (e.g. Visual Studio solution)
/// </summary>
public class VisualStudioSolutionFolder : MasterProjectFolder
{
/// <summary>
/// Constructor
/// </summary>
public VisualStudioSolutionFolder(ProjectFileGenerator InitOwnerProjectFileGenerator, string InitFolderName)
: base(InitOwnerProjectFileGenerator, InitFolderName)
{
// Generate a unique GUID for this folder
// NOTE: When saving generated project files, we ignore differences in GUIDs if every other part of the file
// matches identically with the pre-existing file
FolderGUID = Guid.NewGuid();
}
/// GUID for this folder
public Guid FolderGUID
{
get;
private set;
}
}
/// <summary>
/// Visual C++ project file generator implementation
/// </summary>
public class VCProjectFileGenerator : ProjectFileGenerator
{
/// Default constructor
public VCProjectFileGenerator(FileReference InOnlyGameProject)
: base(InOnlyGameProject)
{
}
/// File extension for project files we'll be generating (e.g. ".vcxproj")
override public string ProjectFileExtension
{
get
{
return ".vcxproj";
}
}
/// <summary>
/// </summary>
public override void CleanProjectFiles(DirectoryReference InMasterProjectDirectory, string InMasterProjectName, DirectoryReference InIntermediateProjectFilesDirectory)
{
FileReference MasterProjectFile = FileReference.Combine(InMasterProjectDirectory, InMasterProjectName);
FileReference MasterProjDeleteFilename = MasterProjectFile + ".sln";
if (MasterProjDeleteFilename.Exists())
{
MasterProjDeleteFilename.Delete();
}
MasterProjDeleteFilename = MasterProjectFile + ".sdf";
if (MasterProjDeleteFilename.Exists())
{
MasterProjDeleteFilename.Delete();
}
MasterProjDeleteFilename = MasterProjectFile + ".suo";
if (MasterProjDeleteFilename.Exists())
{
MasterProjDeleteFilename.Delete();
}
MasterProjDeleteFilename = MasterProjectFile + ".v11.suo";
if (MasterProjDeleteFilename.Exists())
{
MasterProjDeleteFilename.Delete();
}
MasterProjDeleteFilename = MasterProjectFile + ".v12.suo";
if (MasterProjDeleteFilename.Exists())
{
MasterProjDeleteFilename.Delete();
}
// Delete the project files folder
if (InIntermediateProjectFilesDirectory.Exists())
{
try
{
Directory.Delete(InIntermediateProjectFilesDirectory.FullName, true);
}
catch (Exception Ex)
{
Log.TraceInformation("Error while trying to clean project files path {0}. Ignored.", InIntermediateProjectFilesDirectory);
Log.TraceInformation("\t" + Ex.Message);
}
}
}
/// <summary>
/// Allocates a generator-specific project file object
/// </summary>
/// <param name="InitFilePath">Path to the project file</param>
/// <returns>The newly allocated project file object</returns>
protected override ProjectFile AllocateProjectFile(FileReference InitFilePath)
{
return new VCProjectFile(InitFilePath, OnlyGameProject);
}
/// ProjectFileGenerator interface
public override MasterProjectFolder AllocateMasterProjectFolder(ProjectFileGenerator InitOwnerProjectFileGenerator, string InitFolderName)
{
return new VisualStudioSolutionFolder(InitOwnerProjectFileGenerator, InitFolderName);
}
public enum VCProjectFileFormat
{
VisualStudio2012, // Unsupported
VisualStudio2013,
VisualStudio2015,
}
/// "4.0", "12.0", or "14.0", etc...
static public string ProjectFileToolVersionString
{
get
{
switch (ProjectFileFormat)
{
case VCProjectFileFormat.VisualStudio2012:
return "4.0";
case VCProjectFileFormat.VisualStudio2013:
return "12.0";
case VCProjectFileFormat.VisualStudio2015:
return "14.0";
}
return string.Empty;
}
}
/// for instance: <PlatformToolset>v110</PlatformToolset>
static public string ProjectFilePlatformToolsetVersionString
{
get
{
switch (ProjectFileFormat)
{
case VCProjectFileFormat.VisualStudio2012:
return "v110";
case VCProjectFileFormat.VisualStudio2013:
return "v120";
case VCProjectFileFormat.VisualStudio2015:
return "v140";
}
return string.Empty;
}
}
/// Which version of Visual Studio we should generate project files for
static public VCProjectFileFormat ProjectFileFormat;
/// Just set up the defaults, later this will be overridden by command line or other options
static VCProjectFileGenerator()
{
switch (WindowsPlatform.Compiler)
{
case WindowsCompiler.VisualStudio2013:
ProjectFileFormat = VCProjectFileFormat.VisualStudio2013;
break;
case WindowsCompiler.VisualStudio2015:
ProjectFileFormat = VCProjectFileFormat.VisualStudio2015;
break;
}
}
/// This is the platform name that Visual Studio is always guaranteed to support. We'll use this as
/// a platform for any project configurations where our actual platform is not supported by the
/// installed version of Visual Studio (e.g, "iOS")
static public readonly string DefaultPlatformName = "Win32";
/// The platform name that must be used for .NET projects
static public readonly string DotNetPlatformName = "Any CPU";
/// <summary>
/// Configures project generator based on command-line options
/// </summary>
/// <param name="Arguments">Arguments passed into the program</param>
/// <param name="IncludeAllPlatforms">True if all platforms should be included</param>
protected override void ConfigureProjectFileGeneration(String[] Arguments, ref bool IncludeAllPlatforms)
{
// Call parent implementation first
base.ConfigureProjectFileGeneration(Arguments, ref IncludeAllPlatforms);
// Default the project file format to whatever UBT is using
{
switch (WindowsPlatform.Compiler)
{
case WindowsCompiler.VisualStudio2013:
ProjectFileFormat = VCProjectFileFormat.VisualStudio2013;
break;
case WindowsCompiler.VisualStudio2015:
ProjectFileFormat = VCProjectFileFormat.VisualStudio2015;
break;
}
}
foreach (string CurArgument in Arguments)
{
switch (CurArgument.ToUpperInvariant())
{
// Visual Studio 2012 project generation has been deprecated and is no longer maintained.
case "-2012UNSUPPORTED":
ProjectFileFormat = VCProjectFileFormat.VisualStudio2012;
break;
case "-2013":
ProjectFileFormat = VCProjectFileFormat.VisualStudio2013;
break;
case "-2015":
ProjectFileFormat = VCProjectFileFormat.VisualStudio2015;
break;
}
}
// By default VS2015 doesn't install the C++ toolchain. Help developers out with a special message.
if (ProjectFileFormat == VCProjectFileFormat.VisualStudio2015)
{
string ToolsPath = WindowsPlatform.GetVSComnToolsPath(WindowsCompiler.VisualStudio2015);
if(String.IsNullOrEmpty(ToolsPath) || !File.Exists(Path.Combine(ToolsPath, "../../VC/bin/cl.exe")))
{
Log.TraceInformation("Visual C++ 2015 toolchain does not appear to be correctly installed. Please verify that \"Common Tools for Visual C++ 2015\" was selected when installing Visual Studio 2015.");
}
}
}
/// <summary>
/// Adds Extra files that are specific to Visual Studio projects
/// </summary>
/// <param name="EngineProject">Project to add files to</param>
protected override void AddEngineExtrasFiles(ProjectFile EngineProject)
{
base.AddEngineExtrasFiles(EngineProject);
// Add our UE4.natvis file
var NatvisFilePath = FileReference.Combine(UnrealBuildTool.EngineDirectory, "Extras", "VisualStudioDebugging", "UE4.natvis");
if (NatvisFilePath.Exists())
{
EngineProject.AddFileToProject(NatvisFilePath, UnrealBuildTool.EngineDirectory);
}
}
/// <summary>
/// Selects which platforms and build configurations we want in the project file
/// </summary>
/// <param name="IncludeAllPlatforms">True if we should include ALL platforms that are supported on this machine. Otherwise, only desktop platforms will be included.</param>
/// <param name="SupportedPlatformNames">Output string for supported platforms, returned as comma-separated values.</param>
protected override void SetupSupportedPlatformsAndConfigurations(bool IncludeAllPlatforms, out string SupportedPlatformNames)
{
// Call parent implementation to figure out the actual platforms
base.SetupSupportedPlatformsAndConfigurations(IncludeAllPlatforms, out SupportedPlatformNames);
// Certain platforms override the project file format because their debugger add-ins may not yet support the latest
// version of Visual Studio. This is their chance to override that.
// ...but only if the user didn't override this via the command-line.
if (!UnrealBuildTool.CommandLineContains("-2015") && !UnrealBuildTool.CommandLineContains("-2013") && !UnrealBuildTool.CommandLineContains("-2012unsupported"))
{
foreach (UnrealTargetPlatform SupportedPlatform in SupportedPlatforms)
{
UEBuildPlatform BuildPlatform = UEBuildPlatform.GetBuildPlatform(SupportedPlatform, true);
if (BuildPlatform != null)
{
// Don't worry about platforms that we're missing SDKs for
if (BuildPlatform.HasRequiredSDKsInstalled() == SDKStatus.Valid)
{
VCProjectFileFormat ProposedFormat = ProjectFileFormat;
// Reduce the Visual Studio version to the max supported by each platform we plan to include.
if (ProposedFormat < ProjectFileFormat)
{
ProjectFileFormat = ProposedFormat;
}
}
}
}
}
}
/// <summary>
/// Used to sort VC solution config names along with the config and platform values
/// </summary>
class VCSolutionConfigCombination
{
/// Visual Studio solution configuration name for this config+platform
public string VCSolutionConfigAndPlatformName;
/// Configuration name
public UnrealTargetConfiguration Configuration;
/// Platform name
public UnrealTargetPlatform Platform;
/// The target configuration name
public string TargetConfigurationName;
public override string ToString()
{
return String.Format("{0}={1} {2} {3}", VCSolutionConfigAndPlatformName, Configuration, Platform, TargetConfigurationName);
}
}
/// <summary>
/// Composes a string to use for the Visual Studio solution configuration, given a build configuration and target rules configuration name
/// </summary>
/// <param name="Configuration">The build configuration</param>
/// <param name="TargetConfigurationName">The target rules configuration name</param>
/// <returns>The generated solution configuration name</returns>
string MakeSolutionConfigurationName(UnrealTargetConfiguration Configuration, string TargetConfigurationName)
{
string SolutionConfigName = Configuration.ToString();
// Don't bother postfixing "Game" or "Program" -- that will be the default when using "Debug", "Development", etc.
// Also don't postfix "RocketGame" when we're building Rocket game projects. That's the only type of game there is in that case!
if (!TargetConfigurationName.Equals(TargetRules.TargetType.Game.ToString(), StringComparison.InvariantCultureIgnoreCase) &&
!TargetConfigurationName.Equals(TargetRules.TargetType.Program.ToString(), StringComparison.InvariantCultureIgnoreCase))
{
SolutionConfigName += " " + TargetConfigurationName;
}
return SolutionConfigName;
}
protected override bool WriteMasterProjectFile(ProjectFile UBTProject)
{
bool bSuccess = true;
string SolutionFileName = MasterProjectName + ".sln";
// Setup solution file content
StringBuilder VCSolutionFileContent = new StringBuilder();
const string VersionTag = "# UnrealEngineGeneratedSolutionVersion=1.0";
// Solution file header
if (ProjectFileFormat == VCProjectFileFormat.VisualStudio2015)
{
VCSolutionFileContent.Append(
ProjectFileGenerator.NewLine +
"Microsoft Visual Studio Solution File, Format Version 12.00" + ProjectFileGenerator.NewLine +
"# Visual Studio 14" + ProjectFileGenerator.NewLine +
"VisualStudioVersion = 14.0.22310.1" + ProjectFileGenerator.NewLine +
"MinimumVisualStudioVersion = 10.0.40219.1" + ProjectFileGenerator.NewLine);
}
else if (ProjectFileFormat == VCProjectFileFormat.VisualStudio2013)
{
VCSolutionFileContent.Append(
ProjectFileGenerator.NewLine +
"Microsoft Visual Studio Solution File, Format Version 12.00" + ProjectFileGenerator.NewLine +
"# Visual Studio 2013" + ProjectFileGenerator.NewLine +
VersionTag + ProjectFileGenerator.NewLine);
}
else if (ProjectFileFormat == VCProjectFileFormat.VisualStudio2012)
{
VCSolutionFileContent.Append(
ProjectFileGenerator.NewLine +
"Microsoft Visual Studio Solution File, Format Version 12.00" + ProjectFileGenerator.NewLine +
"# Visual Studio 2012" + ProjectFileGenerator.NewLine +
VersionTag + ProjectFileGenerator.NewLine);
}
else
{
throw new BuildException("Unexpected ProjectFileFormat");
}
// Find the projects for ShaderCompileWorker and UnrealLightmass
ProjectFile ShaderCompileWorkerProject = null;
ProjectFile UnrealLightmassProject = null;
foreach (ProjectFile Project in AllProjectFiles)
{
if (Project.ProjectTargets.Count == 1)
{
FileReference TargetFilePath = Project.ProjectTargets[0].TargetFilePath;
if (TargetFilePath != null)
{
string TargetFileName = TargetFilePath.GetFileNameWithoutAnyExtensions();
if (TargetFileName.Equals("ShaderCompileWorker", StringComparison.InvariantCultureIgnoreCase))
{
ShaderCompileWorkerProject = Project;
}
else if (TargetFileName.Equals("UnrealLightmass", StringComparison.InvariantCultureIgnoreCase))
{
UnrealLightmassProject = Project;
}
}
if (ShaderCompileWorkerProject != null
&& UnrealLightmassProject != null)
{
break;
}
}
}
// Solution folders, files and project entries
{
// This the GUID that Visual Studio uses to identify a solution folder
string SolutionFolderEntryGUID = "{2150E333-8FDC-42A3-9474-1A3956D46DE8}";
// Solution folders
{
List<MasterProjectFolder> AllSolutionFolders = new List<MasterProjectFolder>();
System.Action<List<MasterProjectFolder> /* Folders */ > GatherFoldersFunction = null;
GatherFoldersFunction = FolderList =>
{
AllSolutionFolders.AddRange(FolderList);
foreach (MasterProjectFolder CurSubFolder in FolderList)
{
GatherFoldersFunction(CurSubFolder.SubFolders);
}
};
GatherFoldersFunction(RootFolder.SubFolders);
foreach (VisualStudioSolutionFolder CurFolder in AllSolutionFolders)
{
string FolderGUIDString = CurFolder.FolderGUID.ToString("B").ToUpperInvariant();
VCSolutionFileContent.Append(
"Project(\"" + SolutionFolderEntryGUID + "\") = \"" + CurFolder.FolderName + "\", \"" + CurFolder.FolderName + "\", \"" + FolderGUIDString + "\"" + ProjectFileGenerator.NewLine);
// Add any files that are inlined right inside the solution folder
if (CurFolder.Files.Count > 0)
{
VCSolutionFileContent.Append(
" ProjectSection(SolutionItems) = preProject" + ProjectFileGenerator.NewLine);
foreach (string CurFile in CurFolder.Files)
{
// Syntax is: <relative file path> = <relative file path>
VCSolutionFileContent.Append(
" " + CurFile + " = " + CurFile + ProjectFileGenerator.NewLine);
}
VCSolutionFileContent.Append(
" EndProjectSection" + ProjectFileGenerator.NewLine);
}
VCSolutionFileContent.Append(
"EndProject" + ProjectFileGenerator.NewLine
);
}
}
// Project files
foreach (MSBuildProjectFile CurProject in AllProjectFiles)
{
// Visual Studio uses different GUID types depending on the project type
string ProjectTypeGUID = CurProject.ProjectTypeGUID;
// NOTE: The project name in the solution doesn't actually *have* to match the project file name on disk. However,
// we prefer it when it does match so we use the actual file name here.
string ProjectNameInSolution = CurProject.ProjectFilePath.GetFileNameWithoutExtension();
// Use the existing project's GUID that's already known to us
string ProjectGUID = CurProject.ProjectGUID.ToString("B").ToUpperInvariant();
VCSolutionFileContent.Append(
"Project(\"" + ProjectTypeGUID + "\") = \"" + ProjectNameInSolution + "\", \"" + CurProject.ProjectFilePath.MakeRelativeTo(ProjectFileGenerator.MasterProjectPath) + "\", \"" + ProjectGUID + "\"" + ProjectFileGenerator.NewLine);
// Setup dependency on UnrealBuildTool, if we need that. This makes sure that UnrealBuildTool is
// freshly compiled before kicking off any build operations on this target project
if (!CurProject.IsStubProject)
{
List<ProjectFile> Dependencies = new List<ProjectFile>();
if (CurProject.IsGeneratedProject && UBTProject != null && CurProject != UBTProject)
{
Dependencies.Add(UBTProject);
Dependencies.AddRange(UBTProject.DependsOnProjects);
}
if (UEBuildConfiguration.bEditorDependsOnShaderCompileWorker && CurProject.IsGeneratedProject && ShaderCompileWorkerProject != null && CurProject.ProjectTargets.Any(x => x.TargetRules != null && x.TargetRules.Type == TargetRules.TargetType.Editor))
{
Dependencies.Add(ShaderCompileWorkerProject);
}
Dependencies.AddRange(CurProject.DependsOnProjects);
if (Dependencies.Count > 0)
{
VCSolutionFileContent.Append("\tProjectSection(ProjectDependencies) = postProject" + ProjectFileGenerator.NewLine);
// Setup any addition dependencies this project has...
foreach (ProjectFile DependsOnProject in Dependencies)
{
string DependsOnProjectGUID = ((MSBuildProjectFile)DependsOnProject).ProjectGUID.ToString("B").ToUpperInvariant();
VCSolutionFileContent.Append("\t\t" + DependsOnProjectGUID + " = " + DependsOnProjectGUID + ProjectFileGenerator.NewLine);
}
VCSolutionFileContent.Append("\tEndProjectSection" + ProjectFileGenerator.NewLine);
}
}
VCSolutionFileContent.Append(
"EndProject" + ProjectFileGenerator.NewLine
);
}
}
// Solution configuration platforms. This is just a list of all of the platforms and configurations that
// appear in Visual Studio's build configuration selector.
List<VCSolutionConfigCombination> SolutionConfigCombinations = new List<VCSolutionConfigCombination>();
// The "Global" section has source control, solution configurations, project configurations,
// preferences, and project hierarchy data
{
VCSolutionFileContent.Append(
"Global" + ProjectFileGenerator.NewLine);
{
{
VCSolutionFileContent.Append(
" GlobalSection(SolutionConfigurationPlatforms) = preSolution" + ProjectFileGenerator.NewLine);
Dictionary<string, Tuple<UnrealTargetConfiguration, string>> SolutionConfigurationsValidForProjects = new Dictionary<string, Tuple<UnrealTargetConfiguration, string>>();
HashSet<UnrealTargetPlatform> PlatformsValidForProjects = new HashSet<UnrealTargetPlatform>();
foreach (UnrealTargetConfiguration CurConfiguration in SupportedConfigurations)
{
if (UnrealBuildTool.IsValidConfiguration(CurConfiguration))
{
foreach (UnrealTargetPlatform CurPlatform in SupportedPlatforms)
{
if (UnrealBuildTool.IsValidPlatform(CurPlatform))
{
foreach (ProjectFile CurProject in AllProjectFiles)
{
if (!CurProject.IsStubProject)
{
if (CurProject.ProjectTargets.Count == 0)
{
throw new BuildException("Expecting project '" + CurProject.ProjectFilePath + "' to have at least one ProjectTarget associated with it!");
}
// Figure out the set of valid target configuration names
foreach (ProjectTarget ProjectTarget in CurProject.ProjectTargets)
{
if (VCProjectFile.IsValidProjectPlatformAndConfiguration(ProjectTarget, CurPlatform, CurConfiguration))
{
PlatformsValidForProjects.Add(CurPlatform);
// Default to a target configuration name of "Game", since that will collapse down to an empty string
string TargetConfigurationName = TargetRules.TargetType.Game.ToString();
if (ProjectTarget.TargetRules != null)
{
TargetConfigurationName = ProjectTarget.TargetRules.ConfigurationName;
}
string SolutionConfigName = MakeSolutionConfigurationName(CurConfiguration, TargetConfigurationName);
SolutionConfigurationsValidForProjects[SolutionConfigName] = new Tuple<UnrealTargetConfiguration, string>(CurConfiguration, TargetConfigurationName);
}
}
}
}
}
}
}
}
foreach (UnrealTargetPlatform CurPlatform in PlatformsValidForProjects)
{
foreach (KeyValuePair<string, Tuple<UnrealTargetConfiguration, string>> SolutionConfigKeyValue in SolutionConfigurationsValidForProjects)
{
// e.g. "Development|Win64 = Development|Win64"
string SolutionConfigName = SolutionConfigKeyValue.Key;
UnrealTargetConfiguration Configuration = SolutionConfigKeyValue.Value.Item1;
string TargetConfigurationName = SolutionConfigKeyValue.Value.Item2;
string SolutionPlatformName = CurPlatform.ToString();
string SolutionConfigAndPlatformPair = SolutionConfigName + "|" + SolutionPlatformName;
SolutionConfigCombinations.Add(
new VCSolutionConfigCombination
{
VCSolutionConfigAndPlatformName = SolutionConfigAndPlatformPair,
Configuration = Configuration,
Platform = CurPlatform,
TargetConfigurationName = TargetConfigurationName
}
);
}
}
// Sort the list of solution platform strings alphabetically (Visual Studio prefers it)
SolutionConfigCombinations.Sort(
new Comparison<VCSolutionConfigCombination>(
(x, y) => { return String.Compare(x.VCSolutionConfigAndPlatformName, y.VCSolutionConfigAndPlatformName, StringComparison.InvariantCultureIgnoreCase); }
)
);
HashSet<string> AppendedSolutionConfigAndPlatformNames = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
foreach (VCSolutionConfigCombination SolutionConfigCombination in SolutionConfigCombinations)
{
// We alias "Game" and "Program" to both have the same solution configuration, so we're careful not to add the same combination twice.
if (!AppendedSolutionConfigAndPlatformNames.Contains(SolutionConfigCombination.VCSolutionConfigAndPlatformName))
{
VCSolutionFileContent.Append(
" " + SolutionConfigCombination.VCSolutionConfigAndPlatformName + " = " + SolutionConfigCombination.VCSolutionConfigAndPlatformName + ProjectFileGenerator.NewLine);
AppendedSolutionConfigAndPlatformNames.Add(SolutionConfigCombination.VCSolutionConfigAndPlatformName);
}
}
VCSolutionFileContent.Append(
" EndGlobalSection" + ProjectFileGenerator.NewLine);
}
// Assign each project's "project configuration" to our "solution platform + configuration" pairs. This
// also sets up which projects are actually built when building the solution.
{
VCSolutionFileContent.Append(
" GlobalSection(ProjectConfigurationPlatforms) = postSolution" + ProjectFileGenerator.NewLine);
List<VCSolutionConfigCombination> CombinationsThatWereMatchedToProjects = new List<VCSolutionConfigCombination>();
foreach (MSBuildProjectFile CurProject in AllProjectFiles)
{
// NOTE: We don't emit solution configuration entries for "stub" projects. Those projects are only
// built using UnrealBuildTool and don't require a presence in the solution project list
// NOTE: We also process projects that were "imported" here, hoping to match those to our solution
// configurations. In some cases this may not be successful though. Imported projects
// should always be carefully setup to match our project generator's solution configs.
if (!CurProject.IsStubProject)
{
if (CurProject.ProjectTargets.Count == 0)
{
throw new BuildException("Expecting project '" + CurProject.ProjectFilePath + "' to have at least one ProjectTarget associated with it!");
}
bool IsProgramProject = CurProject.ProjectTargets[0].TargetRules != null && CurProject.ProjectTargets[0].TargetRules.Type == TargetRules.TargetType.Program;
HashSet<string> GameOrProgramConfigsAlreadyMapped = new HashSet<string>();
foreach (VCSolutionConfigCombination SolutionConfigCombination in SolutionConfigCombinations)
{
// Handle aliasing of Program and Game target configuration names
if ((IsProgramProject && GameOrProgramConfigsAlreadyMapped.Add(SolutionConfigCombination.VCSolutionConfigAndPlatformName)) ||
IsProgramProject && SolutionConfigCombination.TargetConfigurationName != TargetRules.TargetType.Game.ToString() ||
!IsProgramProject && SolutionConfigCombination.TargetConfigurationName != TargetRules.TargetType.Program.ToString())
{
string TargetConfigurationName = SolutionConfigCombination.TargetConfigurationName;
if (IsProgramProject && TargetConfigurationName == TargetRules.TargetType.Game.ToString())
{
TargetConfigurationName = TargetRules.TargetType.Program.ToString();
}
// Now, we want to find a target in this project that maps to the current solution config combination. Only up to one target should
// and every solution config combination should map to at least one target in one project (otherwise we shouldn't have added it!).
ProjectTarget MatchingProjectTarget = null;
foreach (ProjectTarget ProjectTarget in CurProject.ProjectTargets)
{
bool IsMatchingCombination = VCProjectFile.IsValidProjectPlatformAndConfiguration(ProjectTarget, SolutionConfigCombination.Platform, SolutionConfigCombination.Configuration);
if (ProjectTarget.TargetRules != null)
{
if (TargetConfigurationName != ProjectTarget.TargetRules.ConfigurationName)
{
// Solution configuration name for this combination doesn't match this target's configuration name. It's not buildable.
IsMatchingCombination = false;
}
}
else
{
// UBT gets a pass because it is a dependency of every single configuration combination
if (CurProject != UBTProject &&
!CurProject.ShouldBuildForAllSolutionTargets &&
TargetConfigurationName != TargetRules.TargetType.Game.ToString())
{
// Can't build non-generated project in configurations except for the default (Game)
IsMatchingCombination = false;
}
}
if (IsMatchingCombination)
{
if (MatchingProjectTarget != null)
{
// Not expecting more than one target to match a single solution configuration per project!
throw new BuildException("Not expecting more than one target for project " + CurProject.ProjectFilePath + " to match solution configuration " + SolutionConfigCombination.VCSolutionConfigAndPlatformName);
}
MatchingProjectTarget = ProjectTarget;
// NOTE: For faster perf, we could "break" here and bail out early, but that would circumvent the error checking
// for multiple targets within a project that may map to a single solution configuration.
}
}
UnrealTargetConfiguration SolutionConfiguration = SolutionConfigCombination.Configuration;
UnrealTargetPlatform SolutionPlatform = SolutionConfigCombination.Platform;
if (MatchingProjectTarget == null)
{
// The current configuration/platform and target configuration name doesn't map to anything our project actually supports.
// We'll map it to a default config.
SolutionConfiguration = UnrealTargetConfiguration.Development;
// Prefer using Win64 as the default, but fall back to a platform the project file actually supports if needed. This is for
// projects that can never be compiled in Windows, such as UnrealLaunchDaemon which is an iOS-only program
SolutionPlatform = UnrealTargetPlatform.Win64;
if (CurProject.ProjectTargets[0].TargetRules != null)
{
List<UnrealTargetPlatform> ProjectSupportedPlatforms = new List<UnrealTargetPlatform>();
CurProject.ProjectTargets[0].TargetRules.GetSupportedPlatforms(ref ProjectSupportedPlatforms);
if (!ProjectSupportedPlatforms.Contains(SolutionPlatform))
{
SolutionPlatform = ProjectSupportedPlatforms[0];
}
}
if (IsProgramProject)
{
TargetConfigurationName = TargetRules.TargetType.Program.ToString();
}
else
{
TargetConfigurationName = TargetRules.TargetType.Game.ToString();
}
}
// If the project wants to always build in "Development", regardless of what the solution
// configuration is set to, then we'll do that here. This is used for projects like
// UnrealBuildTool and ShaderCompileWorker
if (MatchingProjectTarget != null)
{
if (MatchingProjectTarget.ForceDevelopmentConfiguration)
{
SolutionConfiguration = UnrealTargetConfiguration.Development;
}
}
// Always allow SCW and UnrealLighmass to build in editor configurations
if (MatchingProjectTarget == null && SolutionConfigCombination.TargetConfigurationName == TargetRules.TargetType.Editor.ToString() && SolutionConfigCombination.Platform == UnrealTargetPlatform.Win64)
{
if (CurProject == ShaderCompileWorkerProject)
{
MatchingProjectTarget = ShaderCompileWorkerProject.ProjectTargets[0];
}
else if (CurProject == UnrealLightmassProject)
{
MatchingProjectTarget = UnrealLightmassProject.ProjectTargets[0];
}
}
string ProjectConfigName;
string ProjectPlatformName;
CurProject.MakeProjectPlatformAndConfigurationNames(SolutionPlatform, SolutionConfiguration, TargetConfigurationName, out ProjectPlatformName, out ProjectConfigName);
string ProjectConfigAndPlatformPair = ProjectConfigName.ToString() + "|" + ProjectPlatformName.ToString();
// e.g. "{4232C52C-680F-4850-8855-DC39419B5E9B}.Debug|iOS.ActiveCfg = iOS_Debug|Win32"
string CurProjectGUID = CurProject.ProjectGUID.ToString("B").ToUpperInvariant();
VCSolutionFileContent.Append(
" " + CurProjectGUID + "." + SolutionConfigCombination.VCSolutionConfigAndPlatformName + ".ActiveCfg = " + ProjectConfigAndPlatformPair + ProjectFileGenerator.NewLine);
// Set whether this project configuration should be built when the user initiates "build solution"
if (MatchingProjectTarget != null && CurProject.ShouldBuildByDefaultForSolutionTargets)
{
// Some targets are "dummy targets"; they only exist to show user friendly errors in VS. Weed them out here, and don't set them to build by default.
List<UnrealTargetPlatform> SupportedPlatforms = null;
if (MatchingProjectTarget.TargetRules != null)
{
SupportedPlatforms = new List<UnrealTargetPlatform>();
MatchingProjectTarget.TargetRules.GetSupportedPlatforms(ref SupportedPlatforms);
}
if (SupportedPlatforms == null || SupportedPlatforms.Contains(SolutionConfigCombination.Platform))
{
VCSolutionFileContent.Append(
" " + CurProjectGUID + "." + SolutionConfigCombination.VCSolutionConfigAndPlatformName + ".Build.0 = " + ProjectConfigAndPlatformPair + ProjectFileGenerator.NewLine);
UEPlatformProjectGenerator ProjGen = UEPlatformProjectGenerator.GetPlatformProjectGenerator(SolutionConfigCombination.Platform, true);
if (MatchingProjectTarget.ProjectDeploys ||
((ProjGen != null) && (ProjGen.GetVisualStudioDeploymentEnabled(SolutionPlatform, SolutionConfiguration) == true)))
{
VCSolutionFileContent.Append(
" " + CurProjectGUID + "." + SolutionConfigCombination.VCSolutionConfigAndPlatformName + ".Deploy.0 = " + ProjectConfigAndPlatformPair + ProjectFileGenerator.NewLine);
}
}
}
CombinationsThatWereMatchedToProjects.Add(SolutionConfigCombination);
}
}
}
}
// Check for problems
foreach (VCSolutionConfigCombination SolutionConfigCombination in SolutionConfigCombinations)
{
if (!CombinationsThatWereMatchedToProjects.Contains(SolutionConfigCombination))
{
throw new BuildException("Unable to find a ProjectTarget that matches the solution configuration/platform mapping: " + SolutionConfigCombination.Configuration.ToString() + ", " + SolutionConfigCombination.Platform.ToString() + ", " + SolutionConfigCombination.TargetConfigurationName);
}
}
VCSolutionFileContent.Append(
" EndGlobalSection" + ProjectFileGenerator.NewLine);
}
// Setup other solution properties
{
VCSolutionFileContent.Append(
" GlobalSection(SolutionProperties) = preSolution" + ProjectFileGenerator.NewLine);
// HideSolutionNode sets whether or not the top-level solution entry is completely hidden in the UI.
// We don't want that, as we need users to be able to right click on the solution tree item.
VCSolutionFileContent.Append(
" HideSolutionNode = FALSE" + ProjectFileGenerator.NewLine);
VCSolutionFileContent.Append(
" EndGlobalSection" + ProjectFileGenerator.NewLine);
}
// Solution directory hierarchy
{
VCSolutionFileContent.Append(
" GlobalSection(NestedProjects) = preSolution" + ProjectFileGenerator.NewLine);
// Every entry in this section is in the format "Guid1 = Guid2". Guid1 is the child project (or solution
// filter)'s GUID, and Guid2 is the solution filter directory to parent the child project (or solution
// filter) to. This sets up the hierarchical solution explorer tree for all solution folders and projects.
System.Action<StringBuilder /* VCSolutionFileContent */, List<MasterProjectFolder> /* Folders */ > FolderProcessorFunction = null;
FolderProcessorFunction = (LocalVCSolutionFileContent, LocalMasterProjectFolders) =>
{
foreach (VisualStudioSolutionFolder CurFolder in LocalMasterProjectFolders)
{
string CurFolderGUIDString = CurFolder.FolderGUID.ToString("B").ToUpperInvariant();
foreach (MSBuildProjectFile ChildProject in CurFolder.ChildProjects)
{
// e.g. "{BF6FB09F-A2A6-468F-BE6F-DEBE07EAD3EA} = {C43B6BB5-3EF0-4784-B896-4099753BCDA9}"
LocalVCSolutionFileContent.Append(
" " + ChildProject.ProjectGUID.ToString("B").ToUpperInvariant() + " = " + CurFolderGUIDString + ProjectFileGenerator.NewLine);
}
foreach (VisualStudioSolutionFolder SubFolder in CurFolder.SubFolders)
{
// e.g. "{BF6FB09F-A2A6-468F-BE6F-DEBE07EAD3EA} = {C43B6BB5-3EF0-4784-B896-4099753BCDA9}"
LocalVCSolutionFileContent.Append(
" " + SubFolder.FolderGUID.ToString("B").ToUpperInvariant() + " = " + CurFolderGUIDString + ProjectFileGenerator.NewLine);
}
// Recurse into subfolders
FolderProcessorFunction(LocalVCSolutionFileContent, CurFolder.SubFolders);
}
};
FolderProcessorFunction(VCSolutionFileContent, RootFolder.SubFolders);
VCSolutionFileContent.Append(
" EndGlobalSection" + ProjectFileGenerator.NewLine);
}
}
VCSolutionFileContent.Append(
"EndGlobal" + ProjectFileGenerator.NewLine);
}
// Save the solution file
if (bSuccess)
{
string SolutionFilePath = FileReference.Combine(MasterProjectPath, SolutionFileName).FullName;
bSuccess = WriteFileIfChanged(SolutionFilePath, VCSolutionFileContent.ToString());
}
// Save a solution config file which selects the development editor configuration by default.
if (bSuccess)
{
// Figure out the filename for the SUO file. VS will automatically import the options from earlier versions if necessary.
string SolutionOptionsExtension = "vUnknown.suo";
switch (ProjectFileFormat)
{
case VCProjectFileFormat.VisualStudio2012:
SolutionOptionsExtension = "v11.suo";
break;
case VCProjectFileFormat.VisualStudio2013:
SolutionOptionsExtension = "v12.suo";
break;
case VCProjectFileFormat.VisualStudio2015:
SolutionOptionsExtension = "v14.suo";
break;
}
// Check it doesn't exist before overwriting it. Since these files store the user's preferences, it'd be bad form to overwrite them.
string SolutionOptionsFileName = Path.Combine(MasterProjectPath.FullName, Path.ChangeExtension(SolutionFileName, SolutionOptionsExtension));
if (ProjectFileFormat == VCProjectFileFormat.VisualStudio2015)
{
SolutionOptionsFileName = Path.Combine(MasterProjectPath.FullName, ".vs", Path.GetFileNameWithoutExtension(SolutionFileName), "v14", ".suo");
Directory.CreateDirectory(Path.Combine(MasterProjectPath.FullName, ".vs", Path.GetFileNameWithoutExtension(SolutionFileName), "v14"));
}
if (!File.Exists(SolutionOptionsFileName))
{
VCSolutionOptions Options = new VCSolutionOptions();
// Set the default configuration and startup project
VCSolutionConfigCombination DefaultConfig = SolutionConfigCombinations.Find(x => x.Configuration == UnrealTargetConfiguration.Development && x.Platform == UnrealTargetPlatform.Win64 && x.TargetConfigurationName == "Editor");
if (DefaultConfig != null)
{
List<VCBinarySetting> Settings = new List<VCBinarySetting>();
Settings.Add(new VCBinarySetting("ActiveCfg", DefaultConfig.VCSolutionConfigAndPlatformName));
if (DefaultProject != null)
{
Settings.Add(new VCBinarySetting("StartupProject", ((MSBuildProjectFile)DefaultProject).ProjectGUID.ToString("B")));
}
Options.SetConfiguration(Settings);
}
// Mark all the projects as closed by default, apart from the startup project
VCSolutionExplorerState ExplorerState = new VCSolutionExplorerState();
foreach (ProjectFile ProjectFile in AllProjectFiles)
{
string ProjectName = ProjectFile.ProjectFilePath.GetFileNameWithoutExtension();
if (ProjectFile == DefaultProject)
{
ExplorerState.OpenProjects.Add(new Tuple<string, string[]>(ProjectName, new string[] { ProjectName }));
}
else
{
ExplorerState.OpenProjects.Add(new Tuple<string, string[]>(ProjectName, new string[] { }));
}
}
if (IncludeEnginePrograms)
{
ExplorerState.OpenProjects.Add(new Tuple<string, string[]>("Automation", new string[0]));
}
Options.SetExplorerState(ExplorerState);
// Write the file
if (Options.Sections.Count > 0)
{
Options.Write(SolutionOptionsFileName);
}
}
}
return bSuccess;
}
/// <summary>
/// Takes a string and "cleans it up" to make it parsable by the Visual Studio source control provider's file format
/// </summary>
/// <param name="Str">String to clean up</param>
/// <returns>The cleaned up string</returns>
public string CleanupStringForSCC(string Str)
{
string Cleaned = Str;
// SCC is expecting paths to contain only double-backslashes for path separators. It's a bit weird but we need to do it.
Cleaned = Cleaned.Replace(Path.DirectorySeparatorChar.ToString(), Path.DirectorySeparatorChar.ToString() + Path.DirectorySeparatorChar.ToString());
Cleaned = Cleaned.Replace(Path.AltDirectorySeparatorChar.ToString(), Path.DirectorySeparatorChar.ToString() + Path.DirectorySeparatorChar.ToString());
// SCC is expecting not to see spaces in these strings, so we'll replace spaces with "\u0020"
Cleaned = Cleaned.Replace(" ", "\\u0020");
return Cleaned;
}
}
}