-
Notifications
You must be signed in to change notification settings - Fork 855
Universal Render Settings Upgrader #4476
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
phi-lira
merged 80 commits into
master
from
universal/upgrader/quality-settings-converter
Jun 17, 2021
Merged
Changes from all commits
Commits
Show all changes
80 commits
Select commit
Hold shift + click to select a range
a8b3c1c
initial commit for the uxml's
martint-unity 0649efa
updates to widget
martint-unity a6c66c9
update to uxml for editor part
martint-unity fe60e22
updates to layout
martint-unity 9944ab2
Added first init of coonverters
martint-unity 6cf0c4b
Updated styling and added new converter item
martint-unity f244127
Added convert method and restructured code
martint-unity 4e8b454
added test converters. will be removed before done
martint-unity d4b4c61
Added converter Context
martint-unity d4c1432
Made the widget root element Bindable
martint-unity 8c11fbe
Moved code into init phase
martint-unity 38c9cb9
updates to the bindings to the Serilized Object
martint-unity 650b811
Updated the naming of core converter
martint-unity 8d364aa
Made sure user doesnt init twize
martint-unity d8890e9
moved the uxml's and uss to core and the Editor
martint-unity df2b186
spring cleaning
martint-unity de3165d
Updated the converter UI to get errors and pending
martint-unity 5f3b773
Added OnClicked method
martint-unity 16f7d92
added status enum
martint-unity 7986ca8
updated the ui a bit
martint-unity c02175e
changed icon size and removed Visual element
martint-unity 6669e06
Added contextual menu, but commented it out
martint-unity a5116c7
Added active bool to converteritemstate
martint-unity 366d835
oups, active bool was placed in the wrong statment
martint-unity 366210d
Merge branch 'master' into universal/upgrader/builtin-to-urp-upgrader…
martint-unity faca1ea
Added manipulator, trying out userData for index
martint-unity 6437db9
cleaned out and documented code
martint-unity b532a7e
fixed a small bug in init method and list refresh
martint-unity 0836acc
Removed unnecessary files
martint-unity e2710cd
added some doc strings
martint-unity 2a68e59
Addressed PR Feedback
martint-unity a46dee6
removed old tests that shouldnt live here
martint-unity bfbb0ae
PR feedback, split code into files
martint-unity 0c9fcd8
added progressbar and material upgrader
martint-unity 4ecc880
Spring cleaning
martint-unity f88c9bf
Moved code into folder
martint-unity e4230a6
New name for Conversion, changed to Container
martint-unity 43bf46a
Updated with PR feedback and Doc strings
martint-unity 3f7d115
Merge branch 'master' into universal/upgrader/builtin-to-urp-upgrader…
martint-unity 689e1ee
Adressed PR feedback
martint-unity b9198c1
Addressed PR Feedback. Changed message string
martint-unity a958cac
Moved converter to URP package.
martint-unity c1efeeb
Made converter and container internal
martint-unity a15f2c0
Start work on quality converter
Verasl ae7efce
Added lots of pesudo code
Verasl 0f73bf0
Continued work on quality setting converter
Verasl b8a1f2d
api tweak
Verasl f58cac0
Update to new API from Upgrader Framework
Verasl bcc676e
Changed protection level of converter
Verasl 586ab4a
Added base implementation of searcher for finding cameras
Verasl 0d5f299
Exposing quality settings internally for URP
Nzollner 2cd7b60
Merge branch 'master' into universal/upgrader/quality-settings-converter
Verasl 547e17c
Merge branch 'universal/exposing_quality_settings' into universal/upg…
Verasl 79ac93a
started to add actual settings storing for later conversion
Verasl b47a885
Pipeline asset settings now getting populated from quality settings
Verasl 450d9b7
added API for providing the suffix for renderers getting created
Verasl cb1d5f5
additional cleanup
Verasl 66e28bf
More clean up
Verasl 67aef65
More cleanup and moved to better folder
Verasl 62d0427
Removed all camera code for now
Verasl a8472b5
Change switch statement back for the formatter
Verasl da08358
Squashed commit of the following:
Verasl a85003d
Revert "Squashed commit of the following:"
Verasl d945ed8
Merge branch 'master' into universal/upgrader/quality-settings-converter
Verasl f23ce44
Apply suggestions from code review
Verasl a473db1
Updated code based off latest master
Verasl 79b571c
Made setters internal
Verasl 0685b5a
PR comments and update to latest master API changes
Verasl db8edd8
Protect against invalid renderer index
Verasl 5046758
run the formatter
Verasl 9227230
Merge branch 'master' into universal/upgrader/quality-settings-converter
Verasl fcef452
Added priority
Verasl 3255239
Fixed issue that caused MSAA to not be enabled for cameras that didn'…
phi-lira 267719b
changed light upgrade logic
Verasl b973fa8
Added logic to actually activate URP by adding a GraphicsSettings pip…
Verasl a2168bd
Merge branch 'master' into universal/upgrader/quality-settings-converter
Verasl 6be7b26
Formatting
pbbastian 32d0f72
changelog
Verasl c6210da
Merge branch 'master' into universal/upgrader/quality-settings-converter
Verasl 42eea6c
Revert "Fixed issue that caused MSAA to not be enabled for cameras th…
phi-lira File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
8 changes: 8 additions & 0 deletions
8
com.unity.render-pipelines.universal/Editor/Converter/Converters.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
308 changes: 308 additions & 0 deletions
308
com.unity.render-pipelines.universal/Editor/Converter/Converters/RenderSettingsConverter.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,308 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using UnityEngine; | ||
using UnityEngine.Rendering; | ||
using UnityEngine.Rendering.Universal; | ||
using ShadowQuality = UnityEngine.ShadowQuality; | ||
using ShadowResolution = UnityEngine.ShadowResolution; | ||
|
||
namespace UnityEditor.Rendering.Universal.Converters | ||
{ | ||
internal class RenderSettingsConverter : RenderPipelineConverter | ||
{ | ||
public override int priority => - 9000; | ||
public override string name => "Rendering Settings"; | ||
|
||
public override string info => | ||
"This converter will look at creating Universal Render Pipeline assets and respective Renderer Assets and configure" + | ||
" their settings based on equivalent settings from builtin renderer."; | ||
|
||
public override Type container => typeof(BuiltInToURPConverterContainer); | ||
|
||
// Used to store settings specific to Graphics Tiers | ||
GraphicsTierSettings m_GraphicsTierSettings; | ||
|
||
// Settings items, currently tracks Quality settings only | ||
List<SettingsItem> m_SettingsItems; | ||
|
||
// List of the rendering modes required | ||
List<RenderingMode> m_RenderingModes; | ||
|
||
const string k_PipelineAssetPath = "Settings"; | ||
|
||
public override void OnInitialize(InitializeConverterContext context, Action callback) | ||
{ | ||
m_SettingsItems = new List<SettingsItem>(); | ||
m_RenderingModes = new List<RenderingMode>(); | ||
|
||
// check graphics tiers | ||
GatherGraphicsTiers(); | ||
|
||
// check quality levels | ||
GatherQualityLevels(ref context); | ||
|
||
callback?.Invoke(); | ||
} | ||
|
||
/// <summary> | ||
/// Grabs the 3rd tier from the Graphics Tier Settings based off the current build platform | ||
/// </summary> | ||
private void GatherGraphicsTiers() | ||
{ | ||
var targetGrp = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); | ||
var tier = EditorGraphicsSettings.GetTierSettings(targetGrp, GraphicsTier.Tier3); | ||
|
||
// Add the Graphic Tier Render Path settings as the first rendering mode | ||
m_RenderingModes.Add(GetEquivalentRenderMode(tier.renderingPath)); | ||
|
||
m_GraphicsTierSettings.RenderingPath = tier.renderingPath; | ||
m_GraphicsTierSettings.ReflectionProbeBlending = tier.reflectionProbeBlending; | ||
m_GraphicsTierSettings.ReflectionProbeBoxProjection = tier.reflectionProbeBoxProjection; | ||
m_GraphicsTierSettings.CascadeShadows = tier.cascadedShadowMaps; | ||
m_GraphicsTierSettings.HDR = tier.hdr; | ||
} | ||
|
||
/// <summary> | ||
/// Iterates over all Quality Settings and saves relevant settings to a RenderSettingsItem. | ||
/// This will also create the required information for the Render Pipeline Converter UI. | ||
/// </summary> | ||
/// <param name="context">Converter context to add elements to.</param> | ||
private void GatherQualityLevels(ref InitializeConverterContext context) | ||
{ | ||
var currentQuality = QualitySettings.GetQualityLevel(); | ||
var id = 0; | ||
foreach (var levelName in QualitySettings.names) | ||
{ | ||
QualitySettings.SetQualityLevel(id); | ||
|
||
var projectSettings = new RenderSettingItem | ||
{ | ||
Index = id, | ||
LevelName = levelName, | ||
PixelLightCount = QualitySettings.pixelLightCount, | ||
MSAA = QualitySettings.antiAliasing, | ||
Shadows = QualitySettings.shadows, | ||
ShadowResolution = QualitySettings.shadowResolution, | ||
ShadowDistance = QualitySettings.shadowDistance, | ||
ShadowCascadeCount = QualitySettings.shadowCascades, | ||
CascadeSplit2 = QualitySettings.shadowCascade2Split, | ||
CascadeSplit4 = QualitySettings.shadowCascade4Split, | ||
SoftParticles = QualitySettings.softParticles, | ||
}; | ||
m_SettingsItems.Add(projectSettings); | ||
|
||
var setting = QualitySettings.GetRenderPipelineAssetAt(id); | ||
var item = new ConverterItemDescriptor {name = $"Quality Level {id}: {levelName}"}; | ||
|
||
if (setting != null) | ||
{ | ||
item.warningMessage = setting.GetType() == typeof(UniversalRenderPipelineAsset) | ||
? "Contains URP Asset, will override existing asset." | ||
: "Contains SRP Asset, will override existing asset with URP asset."; | ||
} | ||
|
||
context.AddAssetToConvert(item); | ||
id++; | ||
} | ||
|
||
QualitySettings.SetQualityLevel(currentQuality); | ||
} | ||
|
||
public override void OnRun(ref RunItemContext context) | ||
{ | ||
var item = context.item; | ||
// is quality item | ||
if (m_SettingsItems[item.index].GetType() == typeof(RenderSettingItem)) | ||
{ | ||
GeneratePipelineAsset(m_SettingsItems[item.index] as RenderSettingItem); | ||
} | ||
} | ||
|
||
private void GeneratePipelineAsset(RenderSettingItem settings) | ||
{ | ||
// store current quality level | ||
var currentQualityLevel = QualitySettings.GetQualityLevel(); | ||
|
||
//creating pipeline asset | ||
var asset = | ||
ScriptableObject.CreateInstance(typeof(UniversalRenderPipelineAsset)) as UniversalRenderPipelineAsset; | ||
if (!AssetDatabase.IsValidFolder($"Assets/{k_PipelineAssetPath}")) | ||
AssetDatabase.CreateFolder("Assets", k_PipelineAssetPath); | ||
var path = $"Assets/{k_PipelineAssetPath}/{settings.LevelName}_PipelineAsset.asset"; | ||
|
||
// Setting Pipeline Asset settings | ||
SetPipelineSettings(asset, settings); | ||
|
||
// Create Renderers | ||
var defaultIndex = 0; | ||
var renderers = new List<ScriptableRendererData>(); | ||
if (m_RenderingModes.Contains(RenderingMode.Forward)) | ||
{ | ||
renderers.Add(CreateRendererDataAsset(path, RenderingPath.Forward, "ForwardRenderer")); | ||
if (GetEquivalentRenderMode(m_GraphicsTierSettings.RenderingPath) == RenderingMode.Forward) | ||
defaultIndex = m_RenderingModes.IndexOf(RenderingMode.Forward); | ||
} | ||
|
||
if (m_RenderingModes.Contains(RenderingMode.Deferred)) | ||
{ | ||
renderers.Add(CreateRendererDataAsset(path, RenderingPath.DeferredShading, "DeferredRenderer")); | ||
if (GetEquivalentRenderMode(m_GraphicsTierSettings.RenderingPath) == RenderingMode.Deferred) | ||
defaultIndex = m_RenderingModes.IndexOf(RenderingMode.Deferred); | ||
} | ||
|
||
Verasl marked this conversation as resolved.
Show resolved
Hide resolved
|
||
asset.m_RendererDataList = renderers.ToArray(); | ||
asset.m_DefaultRendererIndex = defaultIndex; | ||
|
||
// Create Pipeline asset on disk | ||
AssetDatabase.CreateAsset(asset, path); | ||
// Assign asset | ||
QualitySettings.SetQualityLevel(settings.Index); | ||
QualitySettings.renderPipeline = asset; | ||
|
||
// return to original quality level | ||
QualitySettings.SetQualityLevel(currentQualityLevel); | ||
// Set graphics settings | ||
if (currentQualityLevel == settings.Index || GraphicsSettings.defaultRenderPipeline == null || GraphicsSettings.defaultRenderPipeline.GetType() != | ||
typeof(UniversalRenderPipelineAsset)) | ||
{ | ||
GraphicsSettings.defaultRenderPipeline = asset; | ||
} | ||
} | ||
|
||
private ScriptableRendererData CreateRendererDataAsset(string assetPath, RenderingPath renderingPath, | ||
string fileName) | ||
{ | ||
var rendererAsset = | ||
UniversalRenderPipelineAsset.CreateRendererAsset(assetPath, RendererType.UniversalRenderer, true, fileName) | ||
as UniversalRendererData; | ||
//Missing API to set deferred or forward | ||
rendererAsset.renderingMode = | ||
renderingPath == RenderingPath.Forward ? RenderingMode.Forward : RenderingMode.Deferred; | ||
//missing API to assign to pipeline asset | ||
return rendererAsset; | ||
} | ||
|
||
/// <summary> | ||
/// Sets all relevant RP settings in order they appear in URP | ||
/// </summary> | ||
/// <param name="asset">Pipeline asset to set</param> | ||
/// <param name="settings">The ProjectSettingItem with stored settings</param> | ||
private void SetPipelineSettings(UniversalRenderPipelineAsset asset, RenderSettingItem settings) | ||
{ | ||
// General | ||
asset.supportsCameraDepthTexture = settings.SoftParticles; | ||
|
||
// Quality | ||
asset.supportsHDR = m_GraphicsTierSettings.HDR; | ||
asset.msaaSampleCount = settings.MSAA == 0 ? 1 : settings.MSAA; | ||
svens-unity marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
// Main Light | ||
asset.mainLightRenderingMode = settings.PixelLightCount == 0 | ||
? LightRenderingMode.Disabled | ||
: LightRenderingMode.PerPixel; | ||
asset.supportsMainLightShadows = settings.Shadows != ShadowQuality.Disable; | ||
asset.mainLightShadowmapResolution = | ||
GetEquivalentMainlightShadowResolution((int)settings.ShadowResolution); | ||
|
||
// Additional Lights | ||
asset.additionalLightsRenderingMode = settings.PixelLightCount == 0 | ||
? LightRenderingMode.PerVertex | ||
: LightRenderingMode.PerPixel; | ||
asset.maxAdditionalLightsCount = settings.PixelLightCount != 0 ? Mathf.Max(0, settings.PixelLightCount) : 4; | ||
asset.supportsAdditionalLightShadows = settings.Shadows != ShadowQuality.Disable; | ||
asset.additionalLightsShadowmapResolution = | ||
GetEquivalentAdditionalLightAtlasShadowResolution((int)settings.ShadowResolution); | ||
|
||
// Reflection Probes | ||
asset.reflectionProbeBlending = m_GraphicsTierSettings.ReflectionProbeBlending; | ||
asset.reflectionProbeBoxProjection = m_GraphicsTierSettings.ReflectionProbeBoxProjection; | ||
|
||
// Shadows | ||
asset.shadowDistance = settings.ShadowDistance; | ||
asset.shadowCascadeCount = m_GraphicsTierSettings.CascadeShadows ? settings.ShadowCascadeCount : 0; | ||
asset.cascade2Split = settings.CascadeSplit2; | ||
asset.cascade4Split = settings.CascadeSplit4; | ||
asset.supportsSoftShadows = settings.Shadows == ShadowQuality.All; | ||
} | ||
|
||
#region HelperFunctions | ||
|
||
private static int GetEquivalentMainlightShadowResolution(int value) | ||
{ | ||
return GetEquivalentShadowResolution(value); | ||
} | ||
|
||
private static int GetEquivalentAdditionalLightAtlasShadowResolution(int value) | ||
{ | ||
return GetEquivalentShadowResolution(value); | ||
} | ||
|
||
private static int GetEquivalentShadowResolution(int value) | ||
{ | ||
switch (value) | ||
{ | ||
case 0: // low | ||
return 1024; | ||
case 1: // med | ||
return 2048; | ||
case 2: // high | ||
return 4096; | ||
case 3: // very high | ||
return 4096; | ||
svens-unity marked this conversation as resolved.
Show resolved
Hide resolved
|
||
default: // backup | ||
return 1024; | ||
} | ||
} | ||
|
||
private RenderingMode GetEquivalentRenderMode(RenderingPath path) | ||
{ | ||
switch (path) | ||
{ | ||
case RenderingPath.VertexLit: | ||
case RenderingPath.Forward: | ||
return RenderingMode.Forward; | ||
case RenderingPath.DeferredLighting: | ||
case RenderingPath.DeferredShading: | ||
return RenderingMode.Deferred; | ||
default: | ||
return RenderingMode.Forward; | ||
} | ||
} | ||
|
||
#endregion | ||
|
||
#region Data | ||
|
||
private struct GraphicsTierSettings | ||
{ | ||
public bool ReflectionProbeBoxProjection; | ||
public bool ReflectionProbeBlending; | ||
public bool CascadeShadows; | ||
public bool HDR; | ||
public RenderingPath RenderingPath; | ||
} | ||
|
||
private class SettingsItem {} | ||
|
||
private class RenderSettingItem : SettingsItem | ||
{ | ||
// General | ||
public int Index; | ||
|
||
public string LevelName; | ||
|
||
// Settings | ||
public int PixelLightCount; | ||
public int MSAA; | ||
public ShadowQuality Shadows; | ||
public ShadowResolution ShadowResolution; | ||
public float ShadowDistance; | ||
public int ShadowCascadeCount; | ||
public float CascadeSplit2; | ||
public Vector3 CascadeSplit4; | ||
public bool SoftParticles; | ||
} | ||
|
||
#endregion | ||
} | ||
} |
11 changes: 11 additions & 0 deletions
11
...ty.render-pipelines.universal/Editor/Converter/Converters/RenderSettingsConverter.cs.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.