Firstborn/Assets/AwesomeTechnologies/VSPShaderPackager/Editor/ShaderPackageImporter.cs

129 lines
4.1 KiB
C#
Raw Permalink Normal View History

//////////////////////////////////////////////////////
// Shader Packager
// Copyright (c)2021 Jason Booth
//////////////////////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
#if UNITY_2020_2_OR_NEWER
using UnityEditor.AssetImporters;
#else
using UnityEditor.Experimental.AssetImporters;
#endif
using System.IO;
using System.Reflection;
namespace AwesomeTechnologies.ShaderPackager
{
[ScriptedImporter(0, ShaderPackageImporter.k_FileExtension)]
public class ShaderPackageImporter : ScriptedImporter
{
public const string k_FileExtension = ".VSPshaderpack";
public override void OnImportAsset(AssetImportContext ctx)
{
string fileContent = File.ReadAllText(ctx.assetPath);
var package = ObjectFactory.CreateInstance<ShaderPackage>();
if (!string.IsNullOrEmpty(fileContent))
{
EditorJsonUtility.FromJsonOverwrite(fileContent, package);
}
if (package.entries == null)
{
package.entries = new List<ShaderPackage.Entry>();
}
package.Pack(false);
#if __BETTERSHADERS__
if (package.betterShader == null && !string.IsNullOrEmpty(package.betterShaderPath))
{
ctx.DependsOnSourceAsset(package.betterShaderPath);
}
if (package.betterShader != null)
{
package.betterShaderPath = AssetDatabase.GetAssetPath(package.betterShader);
ctx.DependsOnSourceAsset(package.betterShaderPath);
}
#endif
foreach (var e in package.entries)
{
if (e.shader != null)
{
ctx.DependsOnSourceAsset(AssetDatabase.GetAssetPath(e.shader));
}
}
string shaderSrc = package.GetShaderSrc();
if (shaderSrc == null)
{
Debug.LogError("No Shader for this platform and SRP provided");
// maybe make an error shader here?
return;
}
Shader shader = ShaderUtil.CreateShaderAsset(ctx, shaderSrc, false);
ctx.AddObjectToAsset("MainAsset", shader);
ctx.SetMainObject(shader);
//RefreshMaterials(ctx.assetPath);
}
void RefreshMaterials(string shaderPath)
{
List<string> refreshMaterialList = new List<string>();
string[] allMaterials = AssetDatabase.FindAssets("t:Material");
for (int i = 0; i < allMaterials.Length; i++)
{
string materialPath = AssetDatabase.GUIDToAssetPath(allMaterials[i]);
string[] dep = AssetDatabase.GetDependencies(materialPath);
for (int j = 0; j < dep.Length; j++)
{
if (dep[j] == shaderPath)
{
refreshMaterialList.Add(allMaterials[i]);
}
}
}
for (int i = 0; i < refreshMaterialList.Count; i++)
{
RefreshPrefabs(refreshMaterialList[i]);
}
}
void RefreshPrefabs(string materialPath)
{
List<string> refreshPrefabList = new List<string>();
string[] allPrefabs = AssetDatabase.FindAssets("t:Prefab");
for (int i = 0; i < allPrefabs.Length; i++)
{
string prefabPath = AssetDatabase.GUIDToAssetPath(allPrefabs[i]);
string[] dep = AssetDatabase.GetDependencies(prefabPath, true);
for (int j = 0; j < dep.Length; j++)
{
Debug.Log("Dep: " + dep[j]);
if (dep[j] == materialPath)
{
refreshPrefabList.Add(allPrefabs[i]);
}
}
}
for (int i = 0; i < refreshPrefabList.Count; i++)
{
AssetDatabase.ImportAsset(refreshPrefabList[i]);
}
}
}
}