mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
draft out some code. this is my therapy
This commit is contained in:
parent
c5873aa0ef
commit
eaa6864fa3
43
NewHorizons/Utility/Files/NHTexture/CanvasScale.cs
Normal file
43
NewHorizons/Utility/Files/NHTexture/CanvasScale.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Utility.Files.NHTexture;
|
||||
|
||||
public class CanvasScale : ITextureOperation
|
||||
{
|
||||
private readonly int _width;
|
||||
private readonly int _height;
|
||||
|
||||
public CanvasScale(int width, int height)
|
||||
{
|
||||
_width = width;
|
||||
_height = height;
|
||||
}
|
||||
|
||||
public string Description => $"canvas scale {_width} {_height}";
|
||||
|
||||
public Texture2D Apply(Texture2D src)
|
||||
{
|
||||
var dest = new Texture2D(_width, _height, src.format, src.mipmapCount != 1);
|
||||
dest.name = Description;
|
||||
var fillPixels = new Color[dest.width * dest.height];
|
||||
for (int i = 0; i < dest.width; i++)
|
||||
{
|
||||
for (int j = 0; j < dest.height; j++)
|
||||
{
|
||||
var x = i + (dest.width - _width) / 2;
|
||||
var y = j + (dest.height - _height) / 2;
|
||||
|
||||
var colour = Color.black;
|
||||
if (x < dest.width && y < dest.height) colour = dest.GetPixel(i, j);
|
||||
|
||||
fillPixels[i + j * dest.width] = colour;
|
||||
}
|
||||
}
|
||||
dest.SetPixels(fillPixels);
|
||||
dest.Apply();
|
||||
|
||||
dest.wrapMode = dest.wrapMode;
|
||||
|
||||
return dest;
|
||||
}
|
||||
}
|
||||
9
NewHorizons/Utility/Files/NHTexture/ITextureOperation.cs
Normal file
9
NewHorizons/Utility/Files/NHTexture/ITextureOperation.cs
Normal file
@ -0,0 +1,9 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Utility.Files.NHTexture;
|
||||
|
||||
public interface ITextureOperation
|
||||
{
|
||||
public string Description { get; }
|
||||
public Texture2D Apply(Texture2D src);
|
||||
}
|
||||
33
NewHorizons/Utility/Files/NHTexture/LerpGreyscale.cs
Normal file
33
NewHorizons/Utility/Files/NHTexture/LerpGreyscale.cs
Normal file
@ -0,0 +1,33 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Utility.Files.NHTexture;
|
||||
|
||||
public class LerpGreyscale : ITextureOperation
|
||||
{
|
||||
private readonly Color _lightTint;
|
||||
private readonly Color _darkTint;
|
||||
|
||||
public LerpGreyscale(Color lightTint, Color darkTint)
|
||||
{
|
||||
_lightTint = lightTint;
|
||||
_darkTint = darkTint;
|
||||
}
|
||||
|
||||
public string Description => $"lerp greyscale {_lightTint} {_darkTint}";
|
||||
|
||||
public Texture2D Apply(Texture2D src)
|
||||
{
|
||||
var pixels = src.GetPixels();
|
||||
for (int i = 0; i < pixels.Length; i++)
|
||||
{
|
||||
pixels[i].r = Mathf.Lerp(_darkTint.r, _lightTint.r, pixels[i].r);
|
||||
pixels[i].g = Mathf.Lerp(_darkTint.g, _lightTint.g, pixels[i].g);
|
||||
pixels[i].b = Mathf.Lerp(_darkTint.b, _lightTint.b, pixels[i].b);
|
||||
}
|
||||
|
||||
src.SetPixels(pixels);
|
||||
src.Apply();
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
44
NewHorizons/Utility/Files/NHTexture/Load.cs
Normal file
44
NewHorizons/Utility/Files/NHTexture/Load.cs
Normal file
@ -0,0 +1,44 @@
|
||||
using OWML.Common;
|
||||
using System.IO;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Utility.Files.NHTexture;
|
||||
|
||||
public class Load : ITextureOperation
|
||||
{
|
||||
private readonly IModBehaviour _mod;
|
||||
private readonly string _filename;
|
||||
private readonly bool _useMipmaps;
|
||||
private readonly bool _wrap;
|
||||
private readonly bool _linear;
|
||||
|
||||
public Load(IModBehaviour mod, string filename, bool useMipmaps = true, bool wrap = false, bool linear = false)
|
||||
{
|
||||
_mod = mod;
|
||||
_filename = filename;
|
||||
_useMipmaps = useMipmaps;
|
||||
_wrap = wrap;
|
||||
_linear = linear;
|
||||
|
||||
var path = Path.Combine(mod.ModHelper.Manifest.ModFolderPath, filename);
|
||||
var key = GetKey(path);
|
||||
Description = $"load {key} {useMipmaps} {wrap} {linear}";
|
||||
}
|
||||
|
||||
public string Description { get; }
|
||||
|
||||
public Texture2D Apply(Texture2D src)
|
||||
{
|
||||
var path = Path.Combine(_mod.ModHelper.Manifest.ModFolderPath, _filename);
|
||||
|
||||
var data = File.ReadAllBytes(path);
|
||||
var dest = new Texture2D(2, 2, TextureFormat.RGBA32, _useMipmaps, _linear);
|
||||
dest.name = Description;
|
||||
dest.wrapMode = _wrap ? TextureWrapMode.Repeat : TextureWrapMode.Clamp;
|
||||
dest.LoadImage(data);
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
private static string GetKey(string path) => path.Substring(Main.Instance.ModHelper.OwmlConfig.ModsPath.Length);
|
||||
}
|
||||
37
NewHorizons/Utility/Files/NHTexture/MakeClear.cs
Normal file
37
NewHorizons/Utility/Files/NHTexture/MakeClear.cs
Normal file
@ -0,0 +1,37 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Utility.Files.NHTexture;
|
||||
|
||||
public class MakeClear : ITextureOperation
|
||||
{
|
||||
private readonly int _width;
|
||||
private readonly int _height;
|
||||
private readonly bool _wrap;
|
||||
|
||||
public MakeClear(int width, int height, bool wrap = false)
|
||||
{
|
||||
_width = width;
|
||||
_height = height;
|
||||
_wrap = wrap;
|
||||
}
|
||||
|
||||
public string Description => $"clear {_width} {_height} {_wrap}";
|
||||
|
||||
public Texture2D Apply(Texture2D src)
|
||||
{
|
||||
var dest = new Texture2D(1, 1, TextureFormat.ARGB32, false);
|
||||
dest.name = Description;
|
||||
var fillColor = Color.clear;
|
||||
var fillPixels = new Color[dest.width * dest.height];
|
||||
for (int i = 0; i < fillPixels.Length; i++)
|
||||
{
|
||||
fillPixels[i] = fillColor;
|
||||
}
|
||||
dest.SetPixels(fillPixels);
|
||||
dest.Apply();
|
||||
|
||||
dest.wrapMode = _wrap ? TextureWrapMode.Repeat : TextureWrapMode.Clamp;
|
||||
|
||||
return dest;
|
||||
}
|
||||
}
|
||||
59
NewHorizons/Utility/Files/NHTexture/NHTexture.cs
Normal file
59
NewHorizons/Utility/Files/NHTexture/NHTexture.cs
Normal file
@ -0,0 +1,59 @@
|
||||
using HarmonyLib;
|
||||
using NewHorizons.Utility.OWML;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace NewHorizons.Utility.Files.NHTexture;
|
||||
|
||||
public class NHTexture
|
||||
{
|
||||
private static readonly Dictionary<string, Texture2D> _cache = new();
|
||||
|
||||
private readonly List<ITextureOperation> _operations = new();
|
||||
|
||||
public void AddOperation(ITextureOperation operation)
|
||||
{
|
||||
_operations.Add(operation);
|
||||
}
|
||||
|
||||
public Texture2D Apply()
|
||||
{
|
||||
var cacheKey = _operations.Join(x => x.Description, " > ");
|
||||
if (_cache.TryGetValue(cacheKey, out var texture))
|
||||
{
|
||||
return texture;
|
||||
}
|
||||
|
||||
ITextureOperation operation = null;
|
||||
try
|
||||
{
|
||||
for (var i = 0; i < _operations.Count; i++)
|
||||
{
|
||||
operation = _operations[i];
|
||||
var src = texture;
|
||||
var dest = operation.Apply(src);
|
||||
if (dest != null)
|
||||
{
|
||||
// makes new texture. destroy the old one
|
||||
Object.DestroyImmediate(src);
|
||||
texture = dest;
|
||||
}
|
||||
else
|
||||
{
|
||||
// mutates src. keep it around
|
||||
texture = src;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
NHLogger.LogVerbose($"Exception thrown while performing NHTexture operation {(operation != null ? operation.Description : "NULL")} on texture {(texture != null ? texture.name : "NULL")}:\n{e}");
|
||||
return null;
|
||||
}
|
||||
|
||||
_cache.Add(cacheKey, texture);
|
||||
return texture;
|
||||
}
|
||||
}
|
||||
60
NewHorizons/Utility/Files/NHTexture/Outline.cs
Normal file
60
NewHorizons/Utility/Files/NHTexture/Outline.cs
Normal file
@ -0,0 +1,60 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Utility.Files.NHTexture;
|
||||
|
||||
public class Outline : ITextureOperation
|
||||
{
|
||||
private readonly Color _color;
|
||||
private readonly int _thickness;
|
||||
|
||||
public Outline(Color color, int thickness)
|
||||
{
|
||||
_color = color;
|
||||
_thickness = thickness;
|
||||
}
|
||||
|
||||
public string Description => $"outline {_color} {_thickness}";
|
||||
|
||||
public Texture2D Apply(Texture2D src)
|
||||
{
|
||||
var outlinePixels = new Color[src.width * src.height];
|
||||
var pixels = src.GetPixels();
|
||||
|
||||
for (int x = 0; x < src.width; x++)
|
||||
{
|
||||
for (int y = 0; y < src.height; y++)
|
||||
{
|
||||
var fillColor = new Color(0, 0, 0, 0);
|
||||
|
||||
if (pixels[x + y * src.width].a == 1 && CloseToTransparent(pixels, src.width, src.height, x, y, _thickness))
|
||||
{
|
||||
fillColor = _color;
|
||||
}
|
||||
outlinePixels[x + y * src.width] = fillColor;
|
||||
}
|
||||
}
|
||||
|
||||
src.SetPixels(outlinePixels);
|
||||
src.Apply();
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static bool CloseToTransparent(Color[] pixels, int width, int height, int x, int y, int thickness)
|
||||
{
|
||||
// Check nearby
|
||||
var minX = Mathf.Max(0, x - thickness / 2);
|
||||
var minY = Mathf.Max(0, y - thickness / 2);
|
||||
var maxX = Mathf.Min(width, x + thickness / 2);
|
||||
var maxY = Mathf.Min(height, y + thickness / 2);
|
||||
|
||||
for (int i = minX; i < maxX; i++)
|
||||
{
|
||||
for (int j = minY; j < maxY; j++)
|
||||
{
|
||||
if (pixels[i + j * width].a < 1) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
38
NewHorizons/Utility/Files/NHTexture/SlideInvert.cs
Normal file
38
NewHorizons/Utility/Files/NHTexture/SlideInvert.cs
Normal file
@ -0,0 +1,38 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Utility.Files.NHTexture;
|
||||
|
||||
public class SlideInvert : ITextureOperation
|
||||
{
|
||||
public string Description => "slide invert";
|
||||
|
||||
public Texture2D Apply(Texture2D src)
|
||||
{
|
||||
var pixels = src.GetPixels();
|
||||
for (var i = 0; i < pixels.Length; i++)
|
||||
{
|
||||
var x = i % src.width;
|
||||
var y = i / src.height;
|
||||
|
||||
// Needs a black border
|
||||
if (x == 0 || y == 0 || x == src.width - 1 || y == src.height - 1)
|
||||
{
|
||||
pixels[i].r = 1;
|
||||
pixels[i].g = 1;
|
||||
pixels[i].b = 1;
|
||||
pixels[i].a = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
pixels[i].r = 1f - pixels[i].r;
|
||||
pixels[i].g = 1f - pixels[i].g;
|
||||
pixels[i].b = 1f - pixels[i].b;
|
||||
}
|
||||
}
|
||||
|
||||
src.SetPixels(pixels);
|
||||
src.Apply();
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
31
NewHorizons/Utility/Files/NHTexture/Tint.cs
Normal file
31
NewHorizons/Utility/Files/NHTexture/Tint.cs
Normal file
@ -0,0 +1,31 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace NewHorizons.Utility.Files.NHTexture;
|
||||
|
||||
public class Tint : ITextureOperation
|
||||
{
|
||||
private readonly Color _tint;
|
||||
|
||||
public Tint(Color tint)
|
||||
{
|
||||
_tint = tint;
|
||||
}
|
||||
|
||||
public string Description => $"tint {_tint}";
|
||||
|
||||
public Texture2D Apply(Texture2D src)
|
||||
{
|
||||
var pixels = src.GetPixels();
|
||||
for (int i = 0; i < pixels.Length; i++)
|
||||
{
|
||||
pixels[i].r *= _tint.r;
|
||||
pixels[i].g *= _tint.g;
|
||||
pixels[i].b *= _tint.b;
|
||||
}
|
||||
|
||||
src.SetPixels(pixels);
|
||||
src.Apply();
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user