diff --git a/Assets/UniGLTF/Runtime/Extensions/ColorConversionExtensions.cs b/Assets/UniGLTF/Runtime/Extensions/ColorConversionExtensions.cs new file mode 100644 index 000000000..6de7f163b --- /dev/null +++ b/Assets/UniGLTF/Runtime/Extensions/ColorConversionExtensions.cs @@ -0,0 +1,73 @@ +using System; +using UnityEngine; + +namespace UniGLTF +{ + public enum ColorSpace + { + sRGB, + Linear, + } + + public static class ColorConversionExtensions + { + public static float[] ToFloat4(this Color src, ColorSpace srcColorSpace, ColorSpace dstColorSpace) + { + var dst = src.ConvertColorSpace(srcColorSpace, dstColorSpace); + return new float[] {dst.r, dst.g, dst.b, dst.a}; + } + + public static float[] ToFloat3(this Color src, ColorSpace srcColorSpace, ColorSpace dstColorSpace) + { + var dst = src.ConvertColorSpace(srcColorSpace, dstColorSpace); + return new float[] {dst.r, dst.g, dst.b}; + } + + public static Color ToColor4(this float[] src, ColorSpace srcColorSpace, ColorSpace dstColorSpace) + { + if (src == null || src.Length < 4) + { + Debug.LogWarning("Invalid argument."); + return Color.magenta; + } + + return new Color(src[0], src[1], src[2], src[3]).ConvertColorSpace(srcColorSpace, dstColorSpace); + } + + public static Color ToColor3(this float[] src, ColorSpace srcColorSpace, ColorSpace dstColorSpace) + { + if (src == null || src.Length < 3) + { + Debug.LogWarning("Invalid argument."); + return Color.magenta; + } + + return new Color(src[0], src[1], src[2], 1f).ConvertColorSpace(srcColorSpace, dstColorSpace); + } + + private static Color ConvertColorSpace(this Color srcColor, ColorSpace srcColorSpace, ColorSpace dstColorSpace) + { + // Need pattern matching :( + if (srcColorSpace == ColorSpace.sRGB && dstColorSpace == ColorSpace.sRGB) + { + return srcColor; + } + else if (srcColorSpace == ColorSpace.sRGB && dstColorSpace == ColorSpace.Linear) + { + return srcColor.linear; + } + else if (srcColorSpace == ColorSpace.Linear && dstColorSpace == ColorSpace.sRGB) + { + return srcColor.gamma; + } + else if (srcColorSpace == ColorSpace.Linear && dstColorSpace == ColorSpace.Linear) + { + return srcColor; + } + else + { + throw new ArgumentException(); + } + } + } +} \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/Extensions/ColorConversionExtensions.cs.meta b/Assets/UniGLTF/Runtime/Extensions/ColorConversionExtensions.cs.meta new file mode 100644 index 000000000..7c0672cd9 --- /dev/null +++ b/Assets/UniGLTF/Runtime/Extensions/ColorConversionExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c2b6bc13ed6e459e98834507edfede07 +timeCreated: 1620378376 \ No newline at end of file