-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPlugin.cs
96 lines (87 loc) · 3.47 KB
/
Plugin.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using IPA;
using UnityEngine;
using IPALogger = IPA.Logging.Logger;
using BS_Utils.Utilities;
using System.Threading.Tasks;
using HarmonyLib;
using System.Reflection;
using BeatSaberMarkupLanguage.GameplaySetup;
using System.Collections.Generic;
using CoverColorSaber.Configuration;
using IPA.Config.Stores;
namespace CoverColorSaber
{
[Plugin(RuntimeOptions.SingleStartInit)]
public class Plugin
{
internal static IPALogger Log { get; set; }
[Init]
public void Init(IPALogger logger, IPA.Config.Config config)
{
PluginConfig.Instance = config.Generated<PluginConfig>();
Log = logger;
new Harmony("CoverSaber").PatchAll(Assembly.GetExecutingAssembly());
GameplaySetup.instance.AddTab("Cover Color Saber", "CoverColorSaber.Settings.Panel.bsml", Settings.Menu.instance);
}
[OnExit]
public void OnApplicationExit()
{
BSEvents.levelSelected -= LevelSelected;
}
[OnStart]
public void OnApplicationStart()
{
BSEvents.levelSelected += LevelSelected;
}
private static Rect InvertAtlas(Rect i)
{
Rect o = new Rect(i.x, i.y, i.width, i.height);
o.y = 2048 - o.y - 160;
return o;
}
private static Texture2D GetFromUnreadable(Texture2D tex, Rect rect)
{
var tmp = RenderTexture.GetTemporary(
tex.width,
tex.height,
0,
RenderTextureFormat.Default,
RenderTextureReadWrite.Linear);
Graphics.Blit(tex, tmp);
var previous = RenderTexture.active;
RenderTexture.active = tmp;
var myTexture2D = new Texture2D((int)rect.width, (int)rect.height);
myTexture2D.ReadPixels(rect, 0, 0);
myTexture2D.Apply();
RenderTexture.active = previous;
RenderTexture.ReleaseTemporary(tmp);
return myTexture2D;
}
private static async void LevelSelected(LevelCollectionViewController lcvc, IPreviewBeatmapLevel level)
{
Texture2D tex;
Sprite sprite = (await level.GetCoverImageAsync(System.Threading.CancellationToken.None));
try
{
tex = sprite.texture;
}
catch
{
tex = GetFromUnreadable((level as CustomPreviewBeatmapLevel)?.defaultCoverImage.texture, sprite.textureRect);
}
if (!(level is CustomPreviewBeatmapLevel))
{
tex = GetFromUnreadable(tex, InvertAtlas(sprite.textureRect));
}
else
{
tex = GetFromUnreadable(tex, sprite.textureRect);
}
var scheme = new ColorScheme("CoverSaber", "Cover Saber", true, "Cover Saber", false, Color.white, Color.white, Color.white, Color.white, true, Color.white, Color.white, Color.white);
var colors = new List<ColorThief.QuantizedColor>();
await Task.Run(async () => { var data = await CoverColorManager.GetSchemeFromCoverImage(tex, level.levelID); scheme = CoverColorManager.Cache.GetOrAdd(level.levelID, data.Scheme); colors = data.Colors; });
Settings.Menu.instance.SongName = level.songName;
Settings.Menu.instance.SetColors(colors, scheme, level.levelID);
}
}
}