Skip to content

Commit

Permalink
Added separate L/R iris overlays
Browse files Browse the repository at this point in the history
  • Loading branch information
ManlyMarco committed Mar 9, 2021
1 parent 9504491 commit d72bf20
Show file tree
Hide file tree
Showing 6 changed files with 141 additions and 24 deletions.
55 changes: 51 additions & 4 deletions Core_OverlayMods/Skin/KoiSkinOverlayController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,25 @@ protected override void OnReload(GameMode currentGameMode, bool maintainState)
RemoveAllOverlays(false);

var data = GetExtendedData();
if (data != null)
{
if (data.version <= 1)
ReadLegacyData(data);
else
ReadData(data);
}

if (needsUpdate || _overlays.Any())
UpdateTexture(TexType.Unknown);
}

private void ReadData(PluginData data)
{
throw new NotImplementedException();
}

private void ReadLegacyData(PluginData data)
{
foreach (TexType texType in Enum.GetValues(typeof(TexType)))
{
if (texType == TexType.Unknown) continue;
Expand All @@ -52,12 +71,22 @@ protected override void OnReload(GameMode currentGameMode, bool maintainState)
&& data.data.TryGetValue(texType.ToString(), out var texData)
&& texData is byte[] bytes && bytes.Length > 0)
{
_overlays.Add(texType, new OverlayTexture(bytes));
if (texType == TexType.EyeOver)
{
_overlays.Add(TexType.EyeOverL, new OverlayTexture(bytes));
_overlays.Add(TexType.EyeOverR, new OverlayTexture(bytes));
}
else if (texType == TexType.EyeUnder)
{
_overlays.Add(TexType.EyeUnderL, new OverlayTexture(bytes));
_overlays.Add(TexType.EyeUnderR, new OverlayTexture(bytes));
}
else
{
_overlays.Add(texType, new OverlayTexture(bytes));
}
}
}

if (needsUpdate || _overlays.Any())
UpdateTexture(TexType.Unknown);
}

public void ApplyOverlayToRT(RenderTexture bodyTexture, TexType overlayType)
Expand All @@ -83,6 +112,12 @@ internal static void ApplyOverlays(RenderTexture targetTexture, IEnumerable<Text

public OverlayTexture SetOverlayTex(byte[] overlayTex, TexType overlayType)
{
if (overlayType == TexType.EyeOver || overlayType == TexType.EyeUnder)
{
SetOverlayTex(overlayTex, overlayType + 2);
return SetOverlayTex(overlayTex, overlayType + 4); //todo return the correct thing
}

_overlays.TryGetValue(overlayType, out var existing);

if (overlayTex == null)
Expand Down Expand Up @@ -152,6 +187,10 @@ public static void UpdateTexture(ChaControl cc, TexType type)
break;
case TexType.EyeUnder:
case TexType.EyeOver:
case TexType.EyeUnderL:
case TexType.EyeOverL:
case TexType.EyeUnderR:
case TexType.EyeOverR:
cc.ChangeSettingEye(true, true, true);
break;
default:
Expand All @@ -175,6 +214,14 @@ public static void UpdateTexture(ChaControl cc, TexType type)
cc.AddUpdateCMFaceTexFlags(true, true, true, true, true, true, true);
cc.CreateFaceTexture();
break;
case TexType.EyeUnderL:
case TexType.EyeOverL:
cc.ChangeEyesKind(0); //todo test sides
break;
case TexType.EyeUnderR:
case TexType.EyeOverR:
cc.ChangeEyesKind(1);
break;
case TexType.EyeUnder:
case TexType.EyeOver:
cc.ChangeEyesKind(2);
Expand Down
64 changes: 56 additions & 8 deletions Core_OverlayMods/Skin/KoiSkinOverlayGui.cs
Original file line number Diff line number Diff line change
Expand Up @@ -223,41 +223,89 @@ private void SetTexAndUpdate(byte[] tex, TexType texType)

private void SetupTexControls(RegisterCustomControlsEvent e, MakerCategory makerCategory, BaseUnityPlugin owner, TexType texType, string title)
{
var radButtons = texType == TexType.EyeOver || texType == TexType.EyeUnder ?
e.AddControl(new MakerRadioButtons(makerCategory, owner, "Eye to edit", "Both", "Left", "Right")) :
null;

TexType GetTexType(bool cantBeBoth)
{
if (radButtons != null)
{
if (radButtons.Value == 0)
return cantBeBoth ? texType + 2 : texType; // left or both
if (radButtons.Value == 1)
return texType + 2; // left
if (radButtons.Value == 2)
return texType + 4; // right
}
return texType;
}

e.AddControl(new MakerText(title, makerCategory, owner));

var forceAllowBoth = false;
var bi = e.AddControl(new MakerImage(null, makerCategory, owner) { Height = 150, Width = 150 });
_textureChanged.Subscribe(
d =>
{
if (d.Key == texType)
var incomingType = d.Key;
if (!forceAllowBoth)
{
// If left and right images are different, and we have Both selected, change selection to Left instead
var currentType = GetTexType(false);
if (radButtons != null && (currentType == TexType.EyeOver && incomingType == TexType.EyeOverR || currentType == TexType.EyeUnder && incomingType == TexType.EyeUnderR))
{
var leftTex = GetTex(GetTexType(true));
if (d.Value != leftTex?.Texture)
radButtons.Value = 1;
else
radButtons.Value = 0;
}
}
if (incomingType == GetTexType(true) || incomingType == GetTexType(false))
bi.Texture = d.Value;
});

e.AddControl(new MakerButton("Load new texture", makerCategory, owner))
.OnClick.AddListener(
() => OpenFileDialog.Show(strings => OnFileAccept(strings, texType), "Open overlay image", GetDefaultLoadDir(), FileFilter, FileExt));
() => OpenFileDialog.Show(strings => OnFileAccept(strings, GetTexType(false)), "Open overlay image", GetDefaultLoadDir(), FileFilter, FileExt));

e.AddControl(new MakerButton("Clear texture", makerCategory, owner))
.OnClick.AddListener(() => SetTexAndUpdate(null, texType));
.OnClick.AddListener(() => SetTexAndUpdate(null, GetTexType(false)));

e.AddControl(new MakerButton("Export current texture", makerCategory, owner))
.OnClick.AddListener(
() =>
{
try
{
var ctrl = GetOverlayController();
var tex = ctrl.Overlays.FirstOrDefault(x => x.Key == texType).Value;
var tex = GetTex(GetTexType(true));
if (tex == null) return;
WriteAndOpenPng(tex.Data, texType.ToString());
WriteAndOpenPng(tex.Data, GetTexType(false).ToString());
}
catch (Exception ex)
{
Logger.LogMessage("Failed to export texture - " + ex.Message);
}
});
}

radButtons?.ValueChanged.Subscribe(i =>
{
forceAllowBoth = true;
var safeType = GetTexType(true);
_textureChanged.OnNext(new KeyValuePair<TexType, Texture2D>(safeType, GetTex(safeType)?.Texture));
forceAllowBoth = false;
});

OverlayTexture GetTex(TexType type)
{
var ctrl = GetOverlayController();
var overlayTexture = ctrl.Overlays.FirstOrDefault(x => x.Key == type).Value;
return overlayTexture;
}
}

public static string GetDefaultLoadDir()
{
return Directory.Exists(KoiSkinOverlayMgr.OverlayDirectory) ? KoiSkinOverlayMgr.OverlayDirectory : Paths.GameRootPath;
Expand Down Expand Up @@ -294,7 +342,7 @@ private void Update()
else
Logger.LogMessage("Texture imported successfully");

SetTexAndUpdate(tex.EncodeToPNG(), _typeToLoad);
SetTexAndUpdate(tex.EncodeToPNG(), _typeToLoad); //todo see if original is smaller size?
}
catch (Exception ex)
{
Expand Down
22 changes: 15 additions & 7 deletions Core_OverlayMods/Skin/TexType.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
namespace KoiSkinOverlayX
using System;

namespace KoiSkinOverlayX
{
/// <summary>
/// Names are important, don't change! - used for filenames and extended data keys
/// </summary>
public enum TexType
{
Unknown = 0,
BodyOver,
FaceOver,
BodyUnder,
FaceUnder,
EyeUnder,
EyeOver
BodyOver = 1,
FaceOver = 2,
BodyUnder = 3,
FaceUnder = 4,
[Obsolete]
EyeUnder = 5,
[Obsolete]
EyeOver = 6,
EyeUnderL = 7,
EyeOverL = 8,
EyeUnderR = 9,
EyeOverR = 10
}
}
8 changes: 8 additions & 0 deletions Core_OverlayMods/Skin/Util.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,10 @@ public static int GetRecommendedTexSize(TexType texType)
return 1024;
case TexType.EyeUnder:
case TexType.EyeOver:
case TexType.EyeUnderL:
case TexType.EyeOverL:
case TexType.EyeUnderR:
case TexType.EyeOverR:
return 512;
#elif AI || HS2
case TexType.BodyOver:
Expand All @@ -100,6 +104,10 @@ public static int GetRecommendedTexSize(TexType texType)
return 4096;
case TexType.EyeUnder:
case TexType.EyeOver:
case TexType.EyeUnderL:
case TexType.EyeOverL:
case TexType.EyeUnderR:
case TexType.EyeOverR:
return 512;
#endif
default:
Expand Down
4 changes: 2 additions & 2 deletions Shared_AIHS2/Skin/Hooks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ public static void ChangeTextureHook(ChaControl __instance, Renderer rend, ChaLi
{
if (__instance.cmpFace.targetCustom.rendEyes[i] == rend)
{
var underlays = controller.GetOverlayTextures(TexType.EyeUnder).ToList();
var underlays = controller.GetOverlayTextures(i == 0 ? TexType.EyeUnderL : TexType.EyeUnderR).ToList();
if (underlays.Count > 0)
{
var orig = rend.material.GetTexture(ChaShader.PupilTex);
Expand All @@ -143,7 +143,7 @@ public static void ChangeTextureHook(ChaControl __instance, Renderer rend, ChaLi
rend.material.SetTexture(ChaShader.PupilTex, rt);
}

var overlays = controller.GetOverlayTextures(TexType.EyeOver).ToList();
var overlays = controller.GetOverlayTextures(i == 0 ? TexType.EyeOverL : TexType.EyeOverR).ToList();
var mat = rend.materials.FirstOrDefault(x => x.shader == KoiSkinOverlayMgr.EyeOverShader);
if (overlays.Count == 0)
{
Expand Down
12 changes: 9 additions & 3 deletions Shared_KKEC/Skin/Hooks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,16 @@ private static void OverlayBlit(Texture source, RenderTexture dest, Material mat
overlay.ApplyOverlayToRT(dest, TexType.BodyOver);
return;
}
if (overlay.ChaControl.ctCreateEyeL == instance || overlay.ChaControl.ctCreateEyeR == instance)
if (overlay.ChaControl.ctCreateEyeL == instance)
{
OverlayBlitImpl(source, dest, mat, pass, overlay, TexType.EyeUnder);
overlay.ApplyOverlayToRT(dest, TexType.EyeOver);
OverlayBlitImpl(source, dest, mat, pass, overlay, TexType.EyeUnderL);
overlay.ApplyOverlayToRT(dest, TexType.EyeOverL);
return;
}
if (overlay.ChaControl.ctCreateEyeR == instance)
{
OverlayBlitImpl(source, dest, mat, pass, overlay, TexType.EyeUnderR);
overlay.ApplyOverlayToRT(dest, TexType.EyeOverR);
return;
}
}
Expand Down

0 comments on commit d72bf20

Please sign in to comment.