Skip to content

Commit

Permalink
Merge branch 'head_unity2019'
Browse files Browse the repository at this point in the history
  • Loading branch information
whiteflare committed Jun 11, 2024
2 parents 02ce0f8 + ea63134 commit b58a80b
Show file tree
Hide file tree
Showing 101 changed files with 1,524 additions and 632 deletions.
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# Change Log

## 2024-06-12 (2.1.0)
https://github.com/whiteflare/Unlit_WF_ShaderSuite/releases/tag/UnlitWF_Shader_20240612

### Changed
- Shader
- Customの中に入れていたアウトライン付きPowerCapを `UnToon_PowerCap_Outline` として整理しました。
- FakeFur のマスクを `長さマスク``アルファマスク` に分割しました。
- GUI
- Custom Shader Variants の表示とシェーダ切り替えメニューを新しくしました。
- ヘルプページを開くボタンを追加しました。
- matcapを入れ替えるメニューを追加しました。

### Fixed
- GUI
- Transparent系列のUnToonからUnityビルトインのUnlitに切り替えた後に描画が行われない問題を修正しました。
- プロパティをリセットしたときにデフォルトテクスチャが割り当てられない問題を修正しました。

----

## 2024-05-25 (2.0.0)
https://github.com/whiteflare/Unlit_WF_ShaderSuite/releases/tag/UnlitWF_Shader_20240525

Expand Down
253 changes: 158 additions & 95 deletions Editor/WF_Common.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,21 +72,21 @@ static class WFCommonUtility
/// <returns></returns>
public static bool FormatDispName(string text, out string label, out string name, out string dispName)
{
var mm = PAT_DISP_NAME.Match(text ?? "");
if (mm.Success)
if (text != null)
{
label = mm.Groups["label"].Value.ToUpper();
name = mm.Groups["name"].Value;
dispName = "[" + label + "] " + name;
return true;
}
else
{
label = null;
name = text;
dispName = text;
return false;
var mm = PAT_DISP_NAME.Match(text ?? "");
if (mm.Success)
{
label = mm.Groups["label"].Value.ToUpper();
name = mm.Groups["name"].Value;
dispName = "[" + label + "] " + name;
return true;
}
}
label = null;
name = text;
dispName = text;
return false;
}

/// <summary>
Expand Down Expand Up @@ -130,6 +130,35 @@ public static string GetPrefixFromPropName(string prop_name)
return label;
}

public static string GetHelpUrl(MaterialEditor editor, string displayName, string headerTitle)
{
string url;
if (FormatDispName(displayName, out var label, out var _, out var _))
{
if (WFShaderDictionary.ShaderFuncHelpUrl.TryGetValue(label, out url))
{
return url;
}
}
var shaderName = WFShaderNameDictionary.TryFindFromName(GetCurrentShader(editor)?.name);
if (shaderName != null)
{
if (WFShaderDictionary.ShaderFuncHelpUrl.TryGetValue(shaderName.Familly + "/" + shaderName.Variant + "/" + headerTitle, out url))
{
return url;
}
if (WFShaderDictionary.ShaderFuncHelpUrl.TryGetValue(shaderName.Familly + "/" + headerTitle, out url))
{
return url;
}
}
if (WFShaderDictionary.ShaderFuncHelpUrl.TryGetValue(headerTitle, out url))
{
return url;
}
return null;
}

/// <summary>
/// プロパティ物理名から Enable トグルかどうかを判定する。
/// </summary>
Expand Down Expand Up @@ -681,6 +710,29 @@ public static void OpenDownloadPage()

#region その他の汎用ユーティリティ

public static Material GetCurrentMaterial(MaterialEditor editor)
{
if (editor == null)
{
return null;
}
return editor.target as Material;
}

public static Material[] GetCurrentMaterials(MaterialEditor editor)
{
if (editor == null)
{
return null;
}
return AsMaterials(editor.targets);
}

public static Shader GetCurrentShader(MaterialEditor editor)
{
return GetCurrentMaterial(editor)?.shader;
}

/// <summary>
/// Object[] -> Material[] のユーティリティ関数。
/// </summary>
Expand Down Expand Up @@ -1382,6 +1434,10 @@ public static List<string> LabelToPrefix(List<string> labelList)

public static string LabelToPrefix(string label)
{
if (string.IsNullOrWhiteSpace(label))
{
return null;
}
return WFShaderDictionary.ShaderFuncList.Where(func => func.Label == label).Select(func => func.Prefix).FirstOrDefault();
}

Expand Down Expand Up @@ -1689,6 +1745,10 @@ class WFVariantList
public readonly List<WFShaderName> variantList = new List<WFShaderName>();
public readonly List<WFShaderName> renderTypeList = new List<WFShaderName>();

public readonly List<string> labelFamilyList = new List<string>();
public readonly List<string> labelVariantList = new List<string>();
public readonly List<string> labelRenderTypeList = new List<string>();

public int idxFamily = -1;
public int idxVariant = -1;
public int idxRenderType = -1;
Expand All @@ -1697,10 +1757,6 @@ public WFVariantList(WFShaderName current)
{
this.current = current;
}

public string[] LabelFamilyList { get => familyList.Select(nm => nm == null ? "" : nm.Familly).ToArray(); }
public string[] LabelVariantList { get => variantList.Select(nm => nm == null ? "" : nm.Variant).ToArray(); }
public string[] LabelRenderTypeList { get => renderTypeList.Select(nm => nm == null ? "" : nm.RenderType).ToArray(); }
}

static class WFShaderNameDictionary
Expand Down Expand Up @@ -1772,7 +1828,7 @@ private static IEnumerable<WFShaderName> GetAdditionalShaderNames(string rp, Lis
return result;
}

private static IEnumerable<WFShaderName> GetCurrentRpNames()
internal static IEnumerable<WFShaderName> GetCurrentRpNames()
{
var result = new List<WFShaderName>();
var rp = WFCommonUtility.GetCurrentRenderPipeline();
Expand All @@ -1785,117 +1841,127 @@ private static IEnumerable<WFShaderName> GetCurrentRpNames()
return result;
}

internal static IEnumerable<WFShaderName> GetCurrentFamillyNames(WFShaderName name)
{
return GetCurrentRpNames().Where(nm => nm.Familly == name.Familly);
}

public static WFShaderName TryFindFromName(string name)
{
if (string.IsNullOrEmpty(name))
{
return null;
}
return GetCurrentRpNames().Where(nm => nm.Name == name).FirstOrDefault();
}

public static List<WFShaderName> GetFamilyList()
public static void CreateFamilyList(WFShaderName name, WFVariantList result)
{
var result = new List<WFShaderName>();
foreach(var group in GetCurrentRpNames().GroupBy(p => p.Familly))
{
// Family ごとにグループ化して、Represent が true のものがあればそれを取得、そうでなければ最初の1件を取得してリストに詰める
var represent = group.Where(p => p.Represent).Union(group).FirstOrDefault();
if (represent != null)
if (name.Familly == group.First().Familly)
{
result.Add(represent);
// current と Familly が一致するものは current 自体を詰める
result.familyList.Add(name);
result.labelFamilyList.Add(name.Familly);
}
else
{
// Represent が true のものがあればそれを取得、そうでなければ最初の1件を取得してリストに詰める
var represent = group.Where(p => p.Represent).Union(group).FirstOrDefault();
if (represent != null)
{
result.familyList.Add(represent);
result.labelFamilyList.Add(represent.Familly);
}
}
}
return result;
}

public static List<WFShaderName> GetVariantList(WFShaderName name)
public static void CreateVariantList(WFShaderName name, WFVariantList result)
{
var first = new List<WFShaderName>();
if (name == null)
{
return first;
return;
}

var second = new List<WFShaderName>();
var third = new List<WFShaderName>();

// Variant でグループ化して、RenderType の一致するものを first に、一致しないものを second に追加
foreach (var group in GetCurrentRpNames().Where(nm => nm.Familly == name.Familly).GroupBy(nm => nm.Variant))
void AddToList(IEnumerable<WFShaderName> shaders)
{
if (!IsVariantCustomOrLegacy(group.Key))
{
var snm = group.Where(nm => nm.RenderType == name.RenderType).FirstOrDefault();
if (snm != null)
{
first.Add(snm);
}
else
{
second.Add(group.First());
}
}
else
foreach (var group in shaders.GroupBy(nm => nm.Variant))
{
var snm = group.Where(nm => nm.RenderType == name.RenderType).FirstOrDefault();
if (snm != null)
{
third.Add(snm);
// RenderTypeが一致するものを追加
result.variantList.Add(snm);
result.labelVariantList.Add(snm.Variant);
}
else
{
third.Add(group.First());
// RenderTypeが一致するものがない場合は、ラベルに印を付けて追加
var snm2 = group.OrderByDescending(nm => nm.RenderType.Length).Where(nm => name.RenderType.StartsWith(nm.RenderType)).FirstOrDefault();
if (snm2 != null)
{
// RenderTypeの文字数の降順に並べて先頭一致する最初のものを追加
result.variantList.Add(snm2);
result.labelVariantList.Add(snm2.Variant + " *");
}
else
{
// 一致するものがなければグループの先頭を追加
result.variantList.Add(group.First());
result.labelVariantList.Add(group.First().Variant + " *");
}
}
}
}

// 結合
if (0 < first.Count && 0 < second.Count)
{
first.Add(null);
}
first.AddRange(second);
if (0 < first.Count && 0 < third.Count)
// カスタム以外を追加
AddToList(GetCurrentFamillyNames(name).Where(nm => !IsVariantCustomOrLegacy(nm)));

// カスタムシェーダを追加
var custonVariants = GetCurrentFamillyNames(name).Where(nm => IsVariantCustomOrLegacy(nm));
if (0 < custonVariants.Count())
{
first.Add(null);
result.variantList.Add(null);
result.labelVariantList.Add("");
AddToList(custonVariants);
}
first.AddRange(third);

return first;
}

public static List<WFShaderName> GetRenderTypeList(WFShaderName name)
public static void CreateRenderTypeList(WFShaderName name, WFVariantList result)
{
var first = new List<WFShaderName>();
if (name == null)
{
return first;
return;
}

var second = new List<WFShaderName>();
var listedRenderType = new List<string>();

// RenderType でグループ化して、Variant の一致するものを first に、一致しないものを second に追加
foreach (var group in GetCurrentRpNames().Where(nm => nm.Familly == name.Familly).GroupBy(nm => nm.RenderType))
// Familly と Variant が一致するものの RenderType をまず追加
foreach (var snm in GetCurrentFamillyNames(name).Where(nm => nm.Variant == name.Variant))
{
var snm = group.Where(nm => nm.Variant == name.Variant).FirstOrDefault();
if (snm != null)
{
first.Add(snm);
}
else
{
// ただし一致しない場合では Custom と Legacy は無視する
snm = group.Where(nm => !(IsVariantCustomOrLegacy(nm))).FirstOrDefault();
if (snm != null)
{
second.Add(snm);
}
}
result.renderTypeList.Add(snm);
listedRenderType.Add(snm.RenderType);
}

if (0 < first.Count && 0 < second.Count)
var tempList = new List<WFShaderName>();

// Familly が一致するが Variant が一致しないものについて
foreach (var group in GetCurrentFamillyNames(name).Where(nm => nm.Variant != name.Variant
// 未追加のRenderTypeかつLegacyでもCustomでもないものをRenderTypeでグループ化
&& !listedRenderType.Contains(nm.RenderType) && !IsVariantCustomOrLegacy(nm)).GroupBy(nm => nm.RenderType))
{
tempList.AddRange(group);
}

if (0 < tempList.Count)
{
first.Add(null);
result.renderTypeList.Add(null);
result.renderTypeList.AddRange(tempList);
}
first.AddRange(second);

return first;
result.labelRenderTypeList.AddRange(result.renderTypeList.Select(nm => nm == null ? "" : (nm.Variant == name.Variant ? nm.RenderType : nm.RenderType + "/" + nm.Variant)));
}

private static bool IsVariantCustomOrLegacy(WFShaderName nm)
Expand All @@ -1911,18 +1977,15 @@ private static bool IsVariantCustomOrLegacy(string variant)
public static WFVariantList CreateVariantList(WFShaderName current)
{
WFVariantList result = new WFVariantList(current);
{
result.familyList.AddRange(GetFamilyList());
result.idxFamily = Array.IndexOf(result.LabelFamilyList, current.Familly);
}
{
result.variantList.AddRange(GetVariantList(current));
result.idxVariant = Array.IndexOf(result.LabelVariantList, current.Variant);
}
{
result.renderTypeList.AddRange(GetRenderTypeList(current));
result.idxRenderType = Array.IndexOf(result.LabelRenderTypeList, current.RenderType);
}

CreateFamilyList(current, result);
CreateVariantList(current, result);
CreateRenderTypeList(current, result);

result.idxFamily = result.familyList.IndexOf(current);
result.idxVariant = result.variantList.IndexOf(current);
result.idxRenderType = result.renderTypeList.IndexOf(current);

return result;
}
}
Expand Down
Loading

0 comments on commit b58a80b

Please sign in to comment.