|
|
|
|
|
|
using UnityEngine.Experimental.Rendering.HDPipeline; |
|
|
|
using UnityEngine.SceneManagement; |
|
|
|
using UnityEditor.SceneManagement; |
|
|
|
using System.Linq; |
|
|
|
using System.Collections.Generic; |
|
|
|
|
|
|
|
namespace UnityEditor.Experimental.Rendering.HDPipeline |
|
|
|
{ |
|
|
|
|
|
|
{ |
|
|
|
EditorUtility.ClearProgressBar(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Update EmissiveColor after we remove EmissiveIntensity from all shaders in 2018.2
|
|
|
|
// Now EmissiveColor is HDR and it must be update to the value new EmissiveColor = old EmissiveColor * EmissiveIntensity
|
|
|
|
static bool UpdateMaterial_EmissiveColor_2018_2(string path, Material mat) |
|
|
|
{ |
|
|
|
// Find the missing property in the file and update EmissiveColor
|
|
|
|
string[] readText = File.ReadAllLines(path); |
|
|
|
|
|
|
|
foreach (string line in readText) |
|
|
|
{ |
|
|
|
if (line.Contains("_EmissiveIntensity:")) |
|
|
|
{ |
|
|
|
int startPos = line.IndexOf(":") + 1; |
|
|
|
string sub = line.Substring(startPos); |
|
|
|
float emissiveIntensity = float.Parse(sub); |
|
|
|
|
|
|
|
Color emissiveColor = Color.black; |
|
|
|
if (mat.HasProperty("_EmissiveColor")) |
|
|
|
{ |
|
|
|
emissiveColor = mat.GetColor("_EmissiveColor"); |
|
|
|
} |
|
|
|
|
|
|
|
emissiveColor *= emissiveIntensity; |
|
|
|
emissiveColor.a = 1.0f; |
|
|
|
mat.SetColor("_EmissiveColor", emissiveColor); |
|
|
|
// Also fix EmissionColor if needed (Allow to let HD handle GI, if black GI is disabled by legacy)
|
|
|
|
mat.SetColor("_EmissionColor", Color.white); |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
static void UpdateMaterialFile_EmissiveColor_2018_2(string path) |
|
|
|
{ |
|
|
|
string[] readText = File.ReadAllLines(path); |
|
|
|
|
|
|
|
foreach (string line in readText) |
|
|
|
{ |
|
|
|
if (line.Contains("_EmissiveIntensity:")) |
|
|
|
{ |
|
|
|
// Remove emissive intensity line
|
|
|
|
string[] writeText = readText.Where(l => l != line).ToArray(); |
|
|
|
File.WriteAllLines(path, writeText); |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
delegate bool UpdateMaterial(string path, Material mat); |
|
|
|
delegate void UpdateMaterialFile(string path); |
|
|
|
|
|
|
|
static void UpdateMaterialToNewerVersion(string caption, UpdateMaterial updateMaterial, UpdateMaterialFile updateMaterialFile = null) |
|
|
|
{ |
|
|
|
bool VSCEnabled = (UnityEditor.VersionControl.Provider.enabled && UnityEditor.VersionControl.Provider.isActive); |
|
|
|
var matIds = AssetDatabase.FindAssets("t:Material"); |
|
|
|
List<string> materialFiles = new List<string>(); // Contain the list dirty files
|
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
for (int i = 0, length = matIds.Length; i < length; i++) |
|
|
|
{ |
|
|
|
var path = AssetDatabase.GUIDToAssetPath(matIds[i]); |
|
|
|
var mat = AssetDatabase.LoadAssetAtPath<Material>(path); |
|
|
|
|
|
|
|
EditorUtility.DisplayProgressBar( |
|
|
|
"Update material to new version " + caption + "...", |
|
|
|
string.Format("{0} / {1} materials updated.", i, length), |
|
|
|
i / (float)(length - 1)); |
|
|
|
|
|
|
|
if (mat.shader.name == "HDRenderPipeline/LitTessellation" || |
|
|
|
mat.shader.name == "HDRenderPipeline/Lit" || |
|
|
|
mat.shader.name == "HDRenderPipeline/LayeredLit" || |
|
|
|
mat.shader.name == "HDRenderPipeline/LayeredLitTessellation" || |
|
|
|
mat.shader.name == "HDRenderPipeline/StackLit" || |
|
|
|
mat.shader.name == "HDRenderPipeline/Unlit" |
|
|
|
) |
|
|
|
{ |
|
|
|
// Need to be processed in order - All function here should be re-entrant (i.e after upgrade it can be recall)
|
|
|
|
bool dirty = updateMaterial(path, mat); |
|
|
|
|
|
|
|
if (dirty) |
|
|
|
{ |
|
|
|
// Checkout the file and tag it as dirty
|
|
|
|
CoreUtils.CheckOutFile(VSCEnabled, mat); |
|
|
|
EditorUtility.SetDirty(mat); |
|
|
|
materialFiles.Add(path); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
EditorUtility.ClearProgressBar(); |
|
|
|
// Save all dirty assets
|
|
|
|
AssetDatabase.SaveAssets(); |
|
|
|
} |
|
|
|
|
|
|
|
if (updateMaterialFile == null) |
|
|
|
return; |
|
|
|
|
|
|
|
// Now that all the asset have been modified and save, we can safely update the .mat file and remove removed property
|
|
|
|
try |
|
|
|
{ |
|
|
|
for (int i = 0, length = materialFiles.Count; i < length; i++) |
|
|
|
{ |
|
|
|
string path = materialFiles[i]; |
|
|
|
|
|
|
|
EditorUtility.DisplayProgressBar( |
|
|
|
"Update .mat files...", |
|
|
|
string.Format("{0} / {1} materials .mat file updated.", i, length), |
|
|
|
i / (float)(length - 1)); |
|
|
|
|
|
|
|
// Note: The file is supposed to be checkout by the previous loop
|
|
|
|
updateMaterialFile(path); |
|
|
|
} |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
EditorUtility.ClearProgressBar(); |
|
|
|
// No need to save in this case
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[MenuItem("Edit/Render Pipeline/Update all Materials to latest version", priority = CoreUtils.editMenuPriority3)] |
|
|
|
static void UpdateMaterialToNewerVersion() |
|
|
|
{ |
|
|
|
// Add here all the material upgrade function supported in this version
|
|
|
|
UpdateMaterialToNewerVersion("(EmissiveColor)", UpdateMaterial_EmissiveColor_2018_2, UpdateMaterialFile_EmissiveColor_2018_2); |
|
|
|
} |
|
|
|
} |
|
|
|
} |