[Add] All in one shader
This commit is contained in:
+87
@@ -0,0 +1,87 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AllIn13DShader
|
||||
{
|
||||
public abstract class AbstractEffectOverride
|
||||
{
|
||||
public List<PropertyOverride> propertyOverrides;
|
||||
|
||||
public string displayName;
|
||||
public string propertyName;
|
||||
|
||||
public bool overrideEnabled;
|
||||
|
||||
public List<EffectKeywordData> keywords;
|
||||
|
||||
public AbstractEffectOverride(AllIn13DEffectConfig effectConfig)
|
||||
{
|
||||
this.displayName = effectConfig.displayName;
|
||||
this.propertyName = effectConfig.keywordPropertyName;
|
||||
this.keywords = new List<EffectKeywordData>(effectConfig.keywords);
|
||||
|
||||
this.propertyOverrides = new List<PropertyOverride>();
|
||||
}
|
||||
|
||||
public void AddPropertyOverride(EffectProperty effectProperty, Shader shader)
|
||||
{
|
||||
PropertyOverride propertyOverride = new PropertyOverride(this, effectProperty, shader);
|
||||
|
||||
AddPropertyOverride(propertyOverride);
|
||||
}
|
||||
|
||||
public void AddPropertyOverride(int propertyIndex, Shader shader)
|
||||
{
|
||||
PropertyOverride propertyOverride = new PropertyOverride(this, propertyIndex, shader);
|
||||
|
||||
AddPropertyOverride(propertyOverride);
|
||||
}
|
||||
|
||||
private void AddPropertyOverride(PropertyOverride propertyOverride)
|
||||
{
|
||||
if (!propertyOverrides.Contains(propertyOverride))
|
||||
{
|
||||
propertyOverrides.Add(propertyOverride);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void ApplyChangesToMaterial(Material mat)
|
||||
{
|
||||
if (overrideEnabled)
|
||||
{
|
||||
ApplyMainPropertyChanges(mat);
|
||||
}
|
||||
|
||||
for(int i = 0; i < propertyOverrides.Count; i++)
|
||||
{
|
||||
propertyOverrides[i].ApplyChangesToMaterial(mat);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void ApplyMainPropertyChanges(Material mat);
|
||||
|
||||
public bool RemovePropertyOverride(PropertyOverride propertyOverrideToRemove)
|
||||
{
|
||||
bool res = propertyOverrides.Remove(propertyOverrideToRemove);
|
||||
return res;
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
if(obj is AbstractEffectOverride)
|
||||
{
|
||||
AbstractEffectOverride abstractEffectOverride = (AbstractEffectOverride)obj;
|
||||
res = propertyName == abstractEffectOverride.propertyName;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return propertyName.GetHashCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0611bcd764908134fa1f7a375b5e9e53
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 316173
|
||||
packageName: All In 1 3D-Shader
|
||||
packageVersion: 2.72
|
||||
assetPath: Assets/Plugins/AllIn13DShader/Editor/MaterialOverride/Scripts/AbstractEffectOverride.cs
|
||||
uploadId: 865720
|
||||
@@ -0,0 +1,33 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace AllIn13DShader
|
||||
{
|
||||
public class EffectEnumOverride : AbstractEffectOverride
|
||||
{
|
||||
public string[] enumOptions;
|
||||
|
||||
public int index;
|
||||
|
||||
public EffectEnumOverride(AllIn13DEffectConfig effectConfig) : base(effectConfig)
|
||||
{
|
||||
enumOptions = new string[effectConfig.keywords.Count];
|
||||
for(int i = 0; i < enumOptions.Length; i++)
|
||||
{
|
||||
enumOptions[i] = effectConfig.keywords[i].displayName;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void ApplyMainPropertyChanges(Material mat)
|
||||
{
|
||||
for(int i = 0; i < keywords.Count; i++)
|
||||
{
|
||||
mat.DisableKeyword(keywords[i].keyword);
|
||||
}
|
||||
|
||||
mat.EnableKeyword(keywords[index].keyword);
|
||||
mat.SetFloat(propertyName, (float)index);
|
||||
|
||||
MaterialUtils.CheckMaterialShader(mat);
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f4ad01e8d27a2b3499bce2fe41f386c1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 316173
|
||||
packageName: All In 1 3D-Shader
|
||||
packageVersion: 2.72
|
||||
assetPath: Assets/Plugins/AllIn13DShader/Editor/MaterialOverride/Scripts/EffectEnumOverride.cs
|
||||
uploadId: 865720
|
||||
@@ -0,0 +1,30 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace AllIn13DShader
|
||||
{
|
||||
public class EffectToggleOverride : AbstractEffectOverride
|
||||
{
|
||||
public bool boolValue;
|
||||
|
||||
public EffectToggleOverride(AllIn13DEffectConfig effectConfig) : base(effectConfig)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
protected override void ApplyMainPropertyChanges(Material mat)
|
||||
{
|
||||
if (boolValue)
|
||||
{
|
||||
mat.EnableKeyword(keywords[0].keyword);
|
||||
mat.SetFloat(propertyName, 1f);
|
||||
}
|
||||
else
|
||||
{
|
||||
mat.DisableKeyword(keywords[0].keyword);
|
||||
mat.SetFloat(propertyName, 0f);
|
||||
}
|
||||
|
||||
MaterialUtils.CheckMaterialShader(mat);
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 87a78a29536838242b8abe925b7597bb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 316173
|
||||
packageName: All In 1 3D-Shader
|
||||
packageVersion: 2.72
|
||||
assetPath: Assets/Plugins/AllIn13DShader/Editor/MaterialOverride/Scripts/EffectToggleOverride.cs
|
||||
uploadId: 865720
|
||||
+470
@@ -0,0 +1,470 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AllIn13DShader
|
||||
{
|
||||
[System.Serializable]
|
||||
public class MaterialOverrideData : ScriptableObject
|
||||
{
|
||||
public class MaterialOverride
|
||||
{
|
||||
public Material sourceMaterial;
|
||||
public Material previewMaterial;
|
||||
|
||||
public MaterialOverride(Material sourceMaterial)
|
||||
{
|
||||
this.sourceMaterial = sourceMaterial;
|
||||
|
||||
if(sourceMaterial == null)
|
||||
{
|
||||
this.previewMaterial = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.previewMaterial = new Material(sourceMaterial);
|
||||
this.previewMaterial.name = this.previewMaterial.name + "_PREVIEW";
|
||||
}
|
||||
}
|
||||
|
||||
public void ApplyPreviewToSource()
|
||||
{
|
||||
sourceMaterial.CopyMatchingPropertiesFromMaterial(previewMaterial);
|
||||
}
|
||||
|
||||
|
||||
public bool ApplySourceToPreview()
|
||||
{
|
||||
bool res = true;
|
||||
|
||||
if (previewMaterial == null || sourceMaterial == null)
|
||||
{
|
||||
res = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
previewMaterial.CopyMatchingPropertiesFromMaterial(sourceMaterial);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
public class RendererOverride
|
||||
{
|
||||
public Renderer renderer;
|
||||
public MaterialOverride[] materialsOverrides;
|
||||
|
||||
public Material[] sourceMaterials;
|
||||
public Material[] previewMaterials;
|
||||
|
||||
public RendererOverride(Renderer renderer)
|
||||
{
|
||||
this.renderer = renderer;
|
||||
this.materialsOverrides = new MaterialOverride[renderer.sharedMaterials.Length];
|
||||
|
||||
sourceMaterials = new Material[materialsOverrides.Length];
|
||||
previewMaterials = new Material[materialsOverrides.Length];
|
||||
|
||||
for (int i = 0; i < materialsOverrides.Length; i++)
|
||||
{
|
||||
materialsOverrides[i] = new MaterialOverride(renderer.sharedMaterials[i]);
|
||||
sourceMaterials[i] = materialsOverrides[i].sourceMaterial;
|
||||
previewMaterials[i] = materialsOverrides[i].previewMaterial;
|
||||
}
|
||||
}
|
||||
|
||||
public void UsePreviewMaterials()
|
||||
{
|
||||
if (renderer != null)
|
||||
{
|
||||
renderer.sharedMaterials = previewMaterials;
|
||||
}
|
||||
}
|
||||
|
||||
public void UseMaterialSource()
|
||||
{
|
||||
if (renderer != null)
|
||||
{
|
||||
renderer.sharedMaterials = sourceMaterials;
|
||||
}
|
||||
}
|
||||
|
||||
public void ApplyPreviewMaterial()
|
||||
{
|
||||
for (int i = 0; i < materialsOverrides.Length; i++)
|
||||
{
|
||||
materialsOverrides[i].ApplyPreviewToSource();
|
||||
renderer.sharedMaterials[i] = materialsOverrides[i].sourceMaterial;
|
||||
}
|
||||
}
|
||||
|
||||
public void DiscardChanges()
|
||||
{
|
||||
renderer.hideFlags = HideFlags.None;
|
||||
UseMaterialSource();
|
||||
}
|
||||
|
||||
public Material[] GetPreviewMaterials()
|
||||
{
|
||||
return previewMaterials;
|
||||
}
|
||||
|
||||
public void CleanPreviewMaterials()
|
||||
{
|
||||
for(int i = 0; i < materialsOverrides.Length; i++)
|
||||
{
|
||||
MaterialOverride matOverride = materialsOverrides[i];
|
||||
|
||||
matOverride.ApplySourceToPreview();
|
||||
|
||||
string[] keywords = new string[matOverride.sourceMaterial.shaderKeywords.Length];
|
||||
matOverride.sourceMaterial.shaderKeywords.CopyTo(keywords, 0);
|
||||
|
||||
matOverride.previewMaterial.shaderKeywords = keywords;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum ApplyTarget
|
||||
{
|
||||
CURRENT_SCENE,
|
||||
SELECTED_FOLDERS,
|
||||
ALL_PROJECT,
|
||||
}
|
||||
|
||||
public List<AbstractEffectOverride> effectOverrides;
|
||||
public List<PropertyOverride> generalPropertiesOverrides;
|
||||
|
||||
public RendererOverride[] rendererOverrides;
|
||||
|
||||
public ApplyTarget applyTarget;
|
||||
|
||||
[SerializeField] private Object[] folders;
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
ResetData();
|
||||
}
|
||||
|
||||
public void ResetData()
|
||||
{
|
||||
effectOverrides = new List<AbstractEffectOverride>();
|
||||
generalPropertiesOverrides = new List<PropertyOverride>();
|
||||
|
||||
rendererOverrides = new RendererOverride[0];
|
||||
applyTarget = ApplyTarget.CURRENT_SCENE;
|
||||
}
|
||||
|
||||
public void CreateRendererOverride()
|
||||
{
|
||||
Renderer[] renderers = FindObjectsByType<Renderer>(FindObjectsSortMode.None);
|
||||
for (int i = 0; i < renderers.Length; i++)
|
||||
{
|
||||
if (renderers[i] is ParticleSystemRenderer) { continue; }
|
||||
if (renderers[i].sharedMaterial == null) { continue; }
|
||||
|
||||
|
||||
renderers[i].hideFlags = HideFlags.NotEditable;
|
||||
RendererOverride rendererOverride = new RendererOverride(renderers[i]);
|
||||
ArrayUtility.Add(ref rendererOverrides, rendererOverride);
|
||||
}
|
||||
}
|
||||
|
||||
public List<Material> CollectAffectedMaterials()
|
||||
{
|
||||
List<Material> res = new List<Material>();
|
||||
|
||||
switch (applyTarget)
|
||||
{
|
||||
case ApplyTarget.SELECTED_FOLDERS:
|
||||
CollectAffectedMaterialsOnSelectedFolders(res);
|
||||
break;
|
||||
case ApplyTarget.CURRENT_SCENE:
|
||||
CollectAffectedMaterialsOnCurrentScene(res);
|
||||
break;
|
||||
case ApplyTarget.ALL_PROJECT:
|
||||
CollectAffectedMaterialsAllProject(res);
|
||||
break;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public void UsePreviewMaterials()
|
||||
{
|
||||
for (int i = 0; i < rendererOverrides.Length; i++)
|
||||
{
|
||||
rendererOverrides[i].UsePreviewMaterials();
|
||||
}
|
||||
}
|
||||
|
||||
public void UseMaterialSource()
|
||||
{
|
||||
for (int i = 0; i < rendererOverrides.Length; i++)
|
||||
{
|
||||
rendererOverrides[i].UseMaterialSource();
|
||||
}
|
||||
}
|
||||
|
||||
public void EndOverrideProcess()
|
||||
{
|
||||
for (int i = 0; i < rendererOverrides.Length; i++)
|
||||
{
|
||||
if (rendererOverrides[i].renderer == null) { continue; }
|
||||
|
||||
rendererOverrides[i].DiscardChanges();
|
||||
}
|
||||
|
||||
//for(int i = 0; i < rendererOverrides.Length; i++)
|
||||
//{
|
||||
// rendererOverrides[i].renderer.hideFlags = HideFlags.None;
|
||||
//}
|
||||
|
||||
//UseMaterialSource();
|
||||
|
||||
effectOverrides = new List<AbstractEffectOverride>();
|
||||
rendererOverrides = new RendererOverride[0];
|
||||
}
|
||||
|
||||
public void ApplyChangesToMaterials(Material[] materials)
|
||||
{
|
||||
for (int i = 0; i < materials.Length; i++)
|
||||
{
|
||||
ApplyChangesToMaterial(materials[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public void ApplyChangesToMaterials(List<Material> materials)
|
||||
{
|
||||
for(int i = 0; i < materials.Count; i++)
|
||||
{
|
||||
ApplyChangesToMaterial(materials[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public void ApplyChangesToMaterial(Material mat)
|
||||
{
|
||||
for (int i = 0; i < effectOverrides.Count; i++)
|
||||
{
|
||||
effectOverrides[i].ApplyChangesToMaterial(mat);
|
||||
}
|
||||
|
||||
for (int i = 0; i < generalPropertiesOverrides.Count; i++)
|
||||
{
|
||||
generalPropertiesOverrides[i].ApplyChangesToMaterial(mat);
|
||||
}
|
||||
}
|
||||
|
||||
private void CollectAffectedMaterialsOnCurrentScene(List<Material> affectedMaterials)
|
||||
{
|
||||
for (int i = 0; i < rendererOverrides.Length; i++)
|
||||
{
|
||||
affectedMaterials.AddRange(rendererOverrides[i].sourceMaterials);
|
||||
}
|
||||
}
|
||||
|
||||
private void CollectAffectedMaterialsOnSelectedFolders(List<Material> affectedMaterials)
|
||||
{
|
||||
HashSet<string> materialsInFolderGUIDs = new HashSet<string>();
|
||||
|
||||
for (int i = 0; i < folders.Length; i++)
|
||||
{
|
||||
string folderPath = AssetDatabase.GetAssetPath(folders[i]);
|
||||
if (AssetDatabase.IsValidFolder(folderPath))
|
||||
{
|
||||
string[] assetsPathsInFolder = AssetDatabase.FindAssets("t: Material", new string[] { folderPath });
|
||||
|
||||
for (int j = 0; j < assetsPathsInFolder.Length; j++)
|
||||
{
|
||||
materialsInFolderGUIDs.Add(assetsPathsInFolder[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (string guid in materialsInFolderGUIDs)
|
||||
{
|
||||
string path = AssetDatabase.GUIDToAssetPath(guid);
|
||||
Material mat = AssetDatabase.LoadAssetAtPath<Material>(path);
|
||||
|
||||
if (EditorUtils.IsAllIn13DShader(mat.shader))
|
||||
{
|
||||
affectedMaterials.Add(mat);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void CollectAffectedMaterialsAllProject(List<Material> affectedMaterials)
|
||||
{
|
||||
string[] materialsGUIDs = AssetDatabase.FindAssets("t: Material");
|
||||
|
||||
foreach (string guid in materialsGUIDs)
|
||||
{
|
||||
string path = AssetDatabase.GUIDToAssetPath(guid);
|
||||
Material mat = AssetDatabase.LoadAssetAtPath<Material>(path);
|
||||
|
||||
if (EditorUtils.IsAllIn13DShader(mat.shader))
|
||||
{
|
||||
affectedMaterials.Add(mat);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsApplyEnabled()
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
switch (applyTarget)
|
||||
{
|
||||
case ApplyTarget.SELECTED_FOLDERS:
|
||||
res = (folders != null) && (folders.Length > 0);
|
||||
break;
|
||||
case ApplyTarget.CURRENT_SCENE:
|
||||
res = true;
|
||||
break;
|
||||
case ApplyTarget.ALL_PROJECT:
|
||||
res = true;
|
||||
break;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public AbstractEffectOverride AddEffectOverride(AllIn13DEffectConfig effectConfig)
|
||||
{
|
||||
AbstractEffectOverride res = FindEffectOverride(effectConfig.keywordPropertyName);
|
||||
|
||||
if (res == null)
|
||||
{
|
||||
switch (effectConfig.effectConfigType)
|
||||
{
|
||||
case EffectConfigType.EFFECT_ENUM:
|
||||
res = new EffectEnumOverride(effectConfig);
|
||||
break;
|
||||
case EffectConfigType.EFFECT_TOGGLE:
|
||||
res = new EffectToggleOverride(effectConfig);
|
||||
break;
|
||||
}
|
||||
|
||||
effectOverrides.Add(res);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public void AddCopmleteEffectOverride(AllIn13DEffectConfig effectConfig, Shader shader)
|
||||
{
|
||||
AbstractEffectOverride effectOverride = FindEffectOverride(effectConfig.keywordPropertyName);
|
||||
|
||||
if(effectOverride == null)
|
||||
{
|
||||
effectOverride = AddEffectOverride(effectConfig);
|
||||
}
|
||||
|
||||
for (int i = 0; i < effectConfig.effectProperties.Count; i++)
|
||||
{
|
||||
effectOverride.AddPropertyOverride(effectConfig.effectProperties[i], shader);
|
||||
}
|
||||
}
|
||||
|
||||
public void AddPropertyOverride(AllIn13DEffectConfig effectConfig, EffectProperty effectProperty, Shader shader)
|
||||
{
|
||||
AbstractEffectOverride effectOverride = FindEffectOverride(effectConfig.keywordPropertyName);
|
||||
|
||||
effectOverride = AddEffectOverride(effectConfig);
|
||||
effectOverride.AddPropertyOverride(effectProperty.propertyIndex, shader);
|
||||
}
|
||||
|
||||
public void AddGeneralPropertyOverride(int propertyIndex, Shader shader)
|
||||
{
|
||||
PropertyOverride propertyOverride = new PropertyOverride(null, propertyIndex, shader);
|
||||
if (!generalPropertiesOverrides.Contains(propertyOverride))
|
||||
{
|
||||
generalPropertiesOverrides.Add(propertyOverride);
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveEffectOverride(AbstractEffectOverride effectOverrideToRemove)
|
||||
{
|
||||
effectOverrides.Remove(effectOverrideToRemove);
|
||||
|
||||
RebuildPreviewMaterial();
|
||||
}
|
||||
|
||||
public void RemovePropertyOverride(PropertyOverride propertyOverride)
|
||||
{
|
||||
bool removeSuccessfully = propertyOverride.Remove();
|
||||
if (!removeSuccessfully)
|
||||
{
|
||||
generalPropertiesOverrides.Remove(propertyOverride);
|
||||
}
|
||||
}
|
||||
|
||||
public void RebuildPreviewMaterial()
|
||||
{
|
||||
for (int i = 0; i < rendererOverrides.Length; i++)
|
||||
{
|
||||
rendererOverrides[i].CleanPreviewMaterials();
|
||||
}
|
||||
|
||||
ShowPreviewChanges();
|
||||
}
|
||||
|
||||
public void ShowPreviewChanges()
|
||||
{
|
||||
for (int i = 0; i < rendererOverrides.Length; i++)
|
||||
{
|
||||
RendererOverride rendererOverride = rendererOverrides[i];
|
||||
|
||||
rendererOverride.UsePreviewMaterials();
|
||||
|
||||
ApplyChangesToMaterials(rendererOverride.previewMaterials);
|
||||
}
|
||||
}
|
||||
|
||||
public AbstractEffectOverride FindEffectOverride(string effectPropertyName)
|
||||
{
|
||||
AbstractEffectOverride res = null;
|
||||
|
||||
for(int i = 0; i < effectOverrides.Count; i++)
|
||||
{
|
||||
if (effectOverrides[i].propertyName == effectPropertyName)
|
||||
{
|
||||
res = effectOverrides[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public bool IsEmpty()
|
||||
{
|
||||
bool res = effectOverrides.Count <= 0 && generalPropertiesOverrides.Count <= 0;
|
||||
return res;
|
||||
}
|
||||
|
||||
public bool DiscardChanges(Renderer[] renderers)
|
||||
{
|
||||
bool changes = false;
|
||||
|
||||
for(int i = this.rendererOverrides.Length - 1; i >= 0; i--)
|
||||
{
|
||||
for(int j = 0; j < renderers.Length; j++)
|
||||
{
|
||||
if (this.rendererOverrides[i].renderer == renderers[j])
|
||||
{
|
||||
rendererOverrides[i].DiscardChanges();
|
||||
ArrayUtility.RemoveAt(ref this.rendererOverrides, i);
|
||||
|
||||
changes = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return changes;
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 74623754e448ca3499d27a22fd49f94a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 316173
|
||||
packageName: All In 1 3D-Shader
|
||||
packageVersion: 2.72
|
||||
assetPath: Assets/Plugins/AllIn13DShader/Editor/MaterialOverride/Scripts/MaterialOverrideData.cs
|
||||
uploadId: 865720
|
||||
@@ -0,0 +1,43 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace AllIn13DShader
|
||||
{
|
||||
public abstract class OverrideEntry
|
||||
{
|
||||
public enum OverrideCategory
|
||||
{
|
||||
KEYWORD_TOGGLE,
|
||||
KEYWORD_ENUM,
|
||||
COMMON,
|
||||
GLOBAL_PROPERTY,
|
||||
}
|
||||
|
||||
public OverrideCategory overrideCategory;
|
||||
|
||||
|
||||
public OverrideEntry(OverrideCategory overrideCategory)
|
||||
{
|
||||
this.overrideCategory = overrideCategory;
|
||||
}
|
||||
|
||||
public abstract void ApplyChangesToMaterial(Material mat);
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
if (obj is OverrideEntry)
|
||||
{
|
||||
OverrideEntry overrideEntry = (OverrideEntry)obj;
|
||||
res = overrideCategory == overrideEntry.overrideCategory;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return overrideCategory.GetHashCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e130f397ef034734c995ecaed8cb8d4c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 316173
|
||||
packageName: All In 1 3D-Shader
|
||||
packageVersion: 2.72
|
||||
assetPath: Assets/Plugins/AllIn13DShader/Editor/MaterialOverride/Scripts/OverrideEntry.cs
|
||||
uploadId: 865720
|
||||
@@ -0,0 +1,247 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
|
||||
namespace AllIn13DShader
|
||||
{
|
||||
public class PropertyOverride
|
||||
{
|
||||
public string propertyName
|
||||
{
|
||||
get; private set;
|
||||
}
|
||||
|
||||
public string displayName
|
||||
{
|
||||
get; private set;
|
||||
}
|
||||
|
||||
private AbstractEffectOverride effectOverride;
|
||||
|
||||
public ShaderPropertyType shaderPropertyType;
|
||||
public PropertyOverrideType propertyOverrideType;
|
||||
|
||||
public float floatValue;
|
||||
public int intValue;
|
||||
public Color colorValue;
|
||||
public Vector2 rangeLimits;
|
||||
public Vector4 vectorValue;
|
||||
public Texture texValue;
|
||||
public Vector4 tilingAndOffset;
|
||||
|
||||
public bool isHDR;
|
||||
public bool hasTilingAndOffset;
|
||||
|
||||
public string[] keywords;
|
||||
|
||||
|
||||
public PropertyOverride(AbstractEffectOverride effectOverride, int propertyIndex, Shader shader)
|
||||
{
|
||||
this.effectOverride = effectOverride;
|
||||
|
||||
string propDescription = shader.GetPropertyName(propertyIndex);
|
||||
|
||||
if(propDescription == "_FogOn")
|
||||
{
|
||||
this.propertyOverrideType = PropertyOverrideType.TOGGLE;
|
||||
this.keywords = new string[1] { "_FOG_ON" };
|
||||
}
|
||||
else
|
||||
{
|
||||
this.propertyOverrideType = PropertyOverrideType.BASIC;
|
||||
this.keywords = new string[0];
|
||||
}
|
||||
|
||||
Initialize(propertyIndex, shader);
|
||||
}
|
||||
|
||||
public PropertyOverride(AbstractEffectOverride effectOverride, EffectProperty effectProperty, Shader shader)
|
||||
{
|
||||
this.effectOverride = effectOverride;
|
||||
|
||||
if (effectProperty.IsToggleProperty())
|
||||
{
|
||||
this.propertyOverrideType = PropertyOverrideType.TOGGLE;
|
||||
}
|
||||
else if (effectProperty.IsEnumProperty())
|
||||
{
|
||||
this.propertyOverrideType = PropertyOverrideType.ENUM;
|
||||
}
|
||||
|
||||
if (this.propertyOverrideType != PropertyOverrideType.BASIC)
|
||||
{
|
||||
keywords = new string[effectProperty.propertyKeywords.Length];
|
||||
for (int i = 0; i < effectProperty.propertyKeywords.Length; i++)
|
||||
{
|
||||
keywords[i] = effectProperty.propertyKeywords[i];
|
||||
}
|
||||
}
|
||||
|
||||
this.isHDR = effectProperty.isHDR;
|
||||
|
||||
Initialize(effectProperty, shader);
|
||||
}
|
||||
|
||||
|
||||
private void Initialize(int propertyIndex, Shader shader)
|
||||
{
|
||||
string propertyName = shader.GetPropertyName(propertyIndex);
|
||||
string displayName = shader.GetPropertyDescription(propertyIndex);
|
||||
|
||||
ShaderPropertyType shaderPropertyType = shader.GetPropertyType(propertyIndex);
|
||||
bool hasTilingAndOffset =
|
||||
shaderPropertyType == ShaderPropertyType.Texture && !shader.GetPropertyFlags(propertyIndex).HasFlag(ShaderPropertyFlags.NoScaleOffset);
|
||||
|
||||
|
||||
Initialize(propertyIndex, propertyName, displayName, shaderPropertyType, hasTilingAndOffset, shader);
|
||||
|
||||
//if (this.shaderPropertyType == ShaderPropertyType.Range)
|
||||
//{
|
||||
// this.rangeLimits = shader.GetPropertyRangeLimits(propertyIndex);
|
||||
//}
|
||||
}
|
||||
|
||||
private void Initialize(EffectProperty effectProperty, Shader shader)
|
||||
{
|
||||
Initialize(effectProperty.propertyIndex, effectProperty.propertyName, effectProperty.displayName, effectProperty.shaderPropertyType,
|
||||
effectProperty.hasTilingAndOffset, shader);
|
||||
|
||||
//this.propertyName = shader.GetPropertyName(effectProperty.propertyIndex);
|
||||
//this.displayName = shader.GetPropertyDescription(effectProperty.propertyIndex);
|
||||
|
||||
//this.shaderPropertyType = shader.GetPropertyType(effectProperty.propertyIndex);
|
||||
|
||||
//if (this.shaderPropertyType == ShaderPropertyType.Range)
|
||||
//{
|
||||
// this.rangeLimits = shader.GetPropertyRangeLimits(effectProperty.propertyIndex);
|
||||
//}
|
||||
|
||||
//InitializeDefaultValues(effectProperty.propertyIndex, shader);
|
||||
}
|
||||
|
||||
private void Initialize(int propertyIndex, string propertyName, string displayName, ShaderPropertyType shaderPropertyType, bool hasTilingAndOffset, Shader shader)
|
||||
{
|
||||
this.tilingAndOffset = new Vector4(1f, 1f, 0f, 0f);
|
||||
|
||||
this.propertyName = propertyName;
|
||||
this.displayName = displayName;
|
||||
this.shaderPropertyType = shaderPropertyType;
|
||||
this.hasTilingAndOffset = hasTilingAndOffset;
|
||||
|
||||
if(shaderPropertyType == ShaderPropertyType.Range)
|
||||
{
|
||||
this.rangeLimits = shader.GetPropertyRangeLimits(propertyIndex);
|
||||
}
|
||||
|
||||
InitializeDefaultValues(propertyIndex, shader);
|
||||
}
|
||||
|
||||
private void InitializeDefaultValues(int propertyIndex, Shader shader)
|
||||
{
|
||||
switch (shaderPropertyType)
|
||||
{
|
||||
case ShaderPropertyType.Range:
|
||||
case ShaderPropertyType.Float:
|
||||
this.floatValue = shader.GetPropertyDefaultFloatValue(propertyIndex);
|
||||
break;
|
||||
case ShaderPropertyType.Vector:
|
||||
this.vectorValue = shader.GetPropertyDefaultVectorValue(propertyIndex);
|
||||
break;
|
||||
case ShaderPropertyType.Color:
|
||||
this.colorValue = shader.GetPropertyDefaultVectorValue(propertyIndex);
|
||||
break;
|
||||
case ShaderPropertyType.Int:
|
||||
this.intValue = (int)shader.GetPropertyDefaultFloatValue(propertyIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
if (obj is PropertyOverride)
|
||||
{
|
||||
PropertyOverride propertyOverride = (PropertyOverride)obj;
|
||||
res = (propertyName == propertyOverride.propertyName);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
int res = propertyName.GetHashCode();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public void ApplyChangesToMaterial(Material mat)
|
||||
{
|
||||
if(mat == null) { return; }
|
||||
|
||||
if (this.propertyOverrideType == PropertyOverrideType.ENUM)
|
||||
{
|
||||
for(int i = 0; i < keywords.Length; i++)
|
||||
{
|
||||
string kw = (propertyName + "_" + keywords[i]).ToUpperInvariant();
|
||||
mat.DisableKeyword(kw);
|
||||
|
||||
if(i == floatValue)
|
||||
{
|
||||
mat.EnableKeyword(kw);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(this.propertyOverrideType == PropertyOverrideType.TOGGLE)
|
||||
{
|
||||
string kw = keywords[0];
|
||||
|
||||
if (floatValue > 0)
|
||||
{
|
||||
mat.EnableKeyword(kw);
|
||||
}
|
||||
else
|
||||
{
|
||||
mat.DisableKeyword(kw);
|
||||
}
|
||||
}
|
||||
|
||||
switch (shaderPropertyType)
|
||||
{
|
||||
case ShaderPropertyType.Float:
|
||||
case ShaderPropertyType.Range:
|
||||
mat.SetFloat(propertyName, floatValue);
|
||||
break;
|
||||
case ShaderPropertyType.Color:
|
||||
mat.SetColor(propertyName, colorValue);
|
||||
break;
|
||||
case ShaderPropertyType.Texture:
|
||||
mat.SetTexture(propertyName, texValue);
|
||||
if (hasTilingAndOffset)
|
||||
{
|
||||
string propST = propertyName + "_ST";
|
||||
mat.SetVector(propST, tilingAndOffset);
|
||||
}
|
||||
break;
|
||||
case ShaderPropertyType.Vector:
|
||||
mat.SetVector(propertyName, vectorValue);
|
||||
break;
|
||||
case ShaderPropertyType.Int:
|
||||
mat.SetInt(propertyName, intValue);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public bool Remove()
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
if(effectOverride != null)
|
||||
{
|
||||
res = effectOverride.RemovePropertyOverride(this);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 108081ac17dcca346914c1f8627b1b27
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 316173
|
||||
packageName: All In 1 3D-Shader
|
||||
packageVersion: 2.72
|
||||
assetPath: Assets/Plugins/AllIn13DShader/Editor/MaterialOverride/Scripts/PropertyOverride.cs
|
||||
uploadId: 865720
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace AllIn13DShader
|
||||
{
|
||||
public enum PropertyOverrideType
|
||||
{
|
||||
BASIC,
|
||||
TOGGLE,
|
||||
ENUM,
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b986e4ec738f7004cb7259afd96aef52
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 316173
|
||||
packageName: All In 1 3D-Shader
|
||||
packageVersion: 2.72
|
||||
assetPath: Assets/Plugins/AllIn13DShader/Editor/MaterialOverride/Scripts/PropertyOverrideType.cs
|
||||
uploadId: 865720
|
||||
+175
@@ -0,0 +1,175 @@
|
||||
using System;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AllIn13DShader
|
||||
{
|
||||
public class PropertySelectorAuxWindow : EditorWindow
|
||||
{
|
||||
public enum SelectionType
|
||||
{
|
||||
GLOBAL_PROPERTY,
|
||||
ADVANCED_PROPERTY,
|
||||
EFFECT_GROUP,
|
||||
}
|
||||
|
||||
public enum TypeOfPropertyAdded
|
||||
{
|
||||
GLOBAL_PROPERTY,
|
||||
ADVANCED_PROPERTY,
|
||||
EFFECT_PROPERTY,
|
||||
EFFECT_MAIN,
|
||||
}
|
||||
|
||||
private PropertiesConfigCollection propertiesConfigCollection;
|
||||
|
||||
//private Shader allIn13DShader;
|
||||
private Shader allIn13DShaderOutline;
|
||||
|
||||
//private PropertiesConfig propertiesConfigNormal;
|
||||
private PropertiesConfig propertiesConfigOutline;
|
||||
|
||||
private int effectGroupIdx;
|
||||
private int effectIdx;
|
||||
private int globalPropertyIdx;
|
||||
private int advancedPropertyIdx;
|
||||
|
||||
private EffectGroup selectedEffectGroup;
|
||||
private AllIn13DEffectConfig selectedEffectConfig;
|
||||
private EffectProperty selectedEffectProperty;
|
||||
|
||||
private TypeOfPropertyAdded typeOfPropertyAdded;
|
||||
private SelectionType selectionType;
|
||||
|
||||
private Action<AllIn13DEffectConfig, int, Shader, TypeOfPropertyAdded> propertyOverrideAddedCallback;
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
//this.allIn13DShader = Shader.Find(Constants.SHADER_FULL_NAME_ALLIN13D);
|
||||
this.allIn13DShaderOutline = Shader.Find(Constants.SHADER_FULL_NAME_ALLIN13D_OUTLINE);
|
||||
|
||||
this.effectIdx = 0;
|
||||
this.globalPropertyIdx = 0;
|
||||
this.advancedPropertyIdx = 0;
|
||||
|
||||
propertiesConfigCollection = EditorUtils.FindAsset<PropertiesConfigCollection>("PropertiesConfigCollection");
|
||||
propertiesConfigOutline = propertiesConfigCollection.FindPropertiesConfigByShader(allIn13DShaderOutline);
|
||||
}
|
||||
|
||||
public void Setup(Action<AllIn13DEffectConfig, int, Shader, TypeOfPropertyAdded> propertyOverrideAddedCallback)
|
||||
{
|
||||
this.propertyOverrideAddedCallback = propertyOverrideAddedCallback;
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
DrawEffectGroupSelector();
|
||||
|
||||
if(selectionType == SelectionType.EFFECT_GROUP)
|
||||
{
|
||||
DrawEffectSelector();
|
||||
}
|
||||
else if(selectionType == SelectionType.GLOBAL_PROPERTY)
|
||||
{
|
||||
DrawGlobalPropertySelector();
|
||||
}
|
||||
else if(selectionType == SelectionType.ADVANCED_PROPERTY)
|
||||
{
|
||||
DrawAdvancedPropertySelector();
|
||||
}
|
||||
|
||||
GUILayout.Space(20f);
|
||||
|
||||
if (GUILayout.Button("Add"))
|
||||
{
|
||||
AddProperty();
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawEffectGroupSelector()
|
||||
{
|
||||
string[] effectsGroupsNames = propertiesConfigOutline.GetEffectGroupsDisplayNames();
|
||||
ArrayUtility.Insert(ref effectsGroupsNames, 0, "Advanced Properties");
|
||||
ArrayUtility.Insert(ref effectsGroupsNames, 0, "Global Properties");
|
||||
|
||||
effectGroupIdx = EditorGUILayout.Popup("Group", effectGroupIdx, effectsGroupsNames);
|
||||
|
||||
if(effectGroupIdx == 0)
|
||||
{
|
||||
selectionType = SelectionType.GLOBAL_PROPERTY;
|
||||
this.selectedEffectGroup = null;
|
||||
}
|
||||
else if(effectGroupIdx == 1)
|
||||
{
|
||||
selectionType = SelectionType.ADVANCED_PROPERTY;
|
||||
this.selectedEffectGroup = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
selectionType = SelectionType.EFFECT_GROUP;
|
||||
this.selectedEffectGroup = propertiesConfigOutline.effectsGroups[effectGroupIdx - 2];
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawEffectSelector()
|
||||
{
|
||||
string[] effectsNames = selectedEffectGroup.GetEffectsNames();
|
||||
effectIdx = EditorGUILayout.Popup("Effect", effectIdx, effectsNames);
|
||||
|
||||
selectedEffectConfig = selectedEffectGroup.effects[effectIdx];
|
||||
}
|
||||
|
||||
private void DrawGlobalPropertySelector()
|
||||
{
|
||||
string[] globalPropertyNames = propertiesConfigOutline.GetGlobalPropertyNames();
|
||||
globalPropertyIdx = EditorGUILayout.Popup("Property", globalPropertyIdx, globalPropertyNames);
|
||||
}
|
||||
|
||||
private void DrawAdvancedPropertySelector()
|
||||
{
|
||||
string[] globalPropertyNames = propertiesConfigOutline.GetAdvancedPropertyNames();
|
||||
advancedPropertyIdx = EditorGUILayout.Popup("Property", advancedPropertyIdx, globalPropertyNames);
|
||||
}
|
||||
|
||||
private void AddProperty()
|
||||
{
|
||||
if(selectionType == SelectionType.GLOBAL_PROPERTY)
|
||||
{
|
||||
typeOfPropertyAdded = TypeOfPropertyAdded.GLOBAL_PROPERTY;
|
||||
}
|
||||
else if(selectionType == SelectionType.ADVANCED_PROPERTY)
|
||||
{
|
||||
typeOfPropertyAdded = TypeOfPropertyAdded.ADVANCED_PROPERTY;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(selectedEffectProperty == null)
|
||||
{
|
||||
typeOfPropertyAdded = TypeOfPropertyAdded.EFFECT_MAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
typeOfPropertyAdded = TypeOfPropertyAdded.EFFECT_PROPERTY;
|
||||
}
|
||||
}
|
||||
|
||||
if (propertyOverrideAddedCallback != null)
|
||||
{
|
||||
switch (typeOfPropertyAdded)
|
||||
{
|
||||
case TypeOfPropertyAdded.GLOBAL_PROPERTY:
|
||||
propertyOverrideAddedCallback(selectedEffectConfig, propertiesConfigOutline.singleProperties[globalPropertyIdx], allIn13DShaderOutline, typeOfPropertyAdded);
|
||||
break;
|
||||
case TypeOfPropertyAdded.ADVANCED_PROPERTY:
|
||||
propertyOverrideAddedCallback(selectedEffectConfig, propertiesConfigOutline.advancedProperties[advancedPropertyIdx + 1], allIn13DShaderOutline, typeOfPropertyAdded);
|
||||
break;
|
||||
case TypeOfPropertyAdded.EFFECT_MAIN:
|
||||
propertyOverrideAddedCallback(selectedEffectConfig, -1, allIn13DShaderOutline, typeOfPropertyAdded);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 135c1998be2528b458ad97784b0692ee
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 316173
|
||||
packageName: All In 1 3D-Shader
|
||||
packageVersion: 2.72
|
||||
assetPath: Assets/Plugins/AllIn13DShader/Editor/MaterialOverride/Scripts/PropertySelectorAuxWindow.cs
|
||||
uploadId: 865720
|
||||
Reference in New Issue
Block a user