Nerd_STF/Nerd_STF/Graphics/Material.cs

191 lines
8.7 KiB
C#

namespace Nerd_STF.Graphics;
public struct Material : ICloneable, IEquatable<Material>
{
public float Alpha;
public float Anisotropy;
public float AnisotropyRoughness;
public IColor AmbientColor;
public float ClearcoatRoughness;
public float ClearcoatThickness;
public IColor DiffuseColor;
public IColor Emissive;
public IlluminationModel IllumModel;
public float Metallic;
public float OpticalDensity;
public float Roughness;
public float Sheen;
public IColor SpecularColor;
public float SpecularExponent;
public (Image Image, TextureConfig Config) AlphaTexture;
public (Image Image, TextureConfig Config) AmbientTexture;
public (Image Image, TextureConfig Config) DiffuseTexture;
public (Image Image, TextureConfig Config) DisplacementTexture;
public (Image Image, TextureConfig Config) EmissiveTexture;
public (Image Image, TextureConfig Config) MetallicTexture;
public (Image Image, TextureConfig Config) NormalTexture;
public (Image Image, TextureConfig Config) RoughnessTexture;
public (Image Image, TextureConfig Config) SheenTexture;
public (Image Image, TextureConfig Config) SpecularTexture;
public (Image Image, TextureConfig Config) SpecularHighlightTexture;
public (Image Image, TextureConfig Config) StencilTexture;
public Material()
{
Alpha = 1;
Anisotropy = 0;
AnisotropyRoughness = 0;
AmbientColor = RGBA.White;
ClearcoatRoughness = 0;
ClearcoatThickness = 0;
DiffuseColor = RGBA.White;
Emissive = RGBA.Clear;
IllumModel = IlluminationModel.Mode0;
Metallic = 0;
OpticalDensity = 1.45f;
Roughness = 1;
Sheen = 0;
SpecularColor = RGBA.White;
SpecularExponent = 10;
AlphaTexture = (Image.FromSingleColor(RGBA.White), new());
AmbientTexture = (Image.FromSingleColor(RGBA.White), new());
DiffuseTexture = (Image.FromSingleColor(RGBA.White), new());
DisplacementTexture = (Image.FromSingleColor(RGBA.White), new());
EmissiveTexture = (Image.FromSingleColor(RGBA.Clear), new());
MetallicTexture = (Image.FromSingleColor(RGBA.Black), new());
NormalTexture = (Image.FromSingleColor(new RGBA(0.5f, 0.5f, 1)), new());
RoughnessTexture = (Image.FromSingleColor(RGBA.White), new());
SheenTexture = (Image.FromSingleColor(RGBA.Black), new());
SpecularTexture = (Image.FromSingleColor(RGBA.White), new());
SpecularHighlightTexture = (Image.FromSingleColor(RGBA.White), new());
StencilTexture = (Image.FromSingleColor(RGBA.White), new());
}
public Material(Fill<object> fill)
{
Alpha = (float)fill(0);
Anisotropy = (float)fill(1);
AnisotropyRoughness = (float)fill(2);
AmbientColor = (IColor)fill(3);
ClearcoatRoughness = (float)fill(4);
ClearcoatThickness = (float)fill(5);
DiffuseColor = (IColor)fill(6);
Emissive = (IColor)fill(7);
IllumModel = (IlluminationModel)fill(8);
Metallic = (float)fill(9);
OpticalDensity = (float)fill(10);
Roughness = (float)fill(11);
Sheen = (float)fill(12);
SpecularColor = (IColor)fill(13);
SpecularExponent = (float)fill(14);
AlphaTexture = ((Image, TextureConfig))fill(15);
AmbientTexture = ((Image, TextureConfig))fill(16);
DiffuseTexture = ((Image, TextureConfig))fill(17);
DisplacementTexture = ((Image, TextureConfig))fill(18);
EmissiveTexture = ((Image, TextureConfig))fill(19);
MetallicTexture = ((Image, TextureConfig))fill(20);
NormalTexture = ((Image, TextureConfig))fill(21);
RoughnessTexture = ((Image, TextureConfig))fill(22);
SheenTexture = ((Image, TextureConfig))fill(23);
SpecularTexture = ((Image, TextureConfig))fill(24);
SpecularHighlightTexture = ((Image, TextureConfig))fill(25);
StencilTexture = ((Image, TextureConfig))fill(26);
}
public Material(IlluminationModel illum, Fill<float> floats, Fill<IColor> colors, Fill<(Image, TextureConfig)> images)
{
Alpha = floats(0);
Anisotropy = floats(1);
AnisotropyRoughness = floats(2);
AmbientColor = colors(0);
ClearcoatRoughness = floats(3);
ClearcoatThickness = floats(4);
DiffuseColor = colors(1);
Emissive = colors(2);
IllumModel = illum;
Metallic = floats(5);
OpticalDensity = floats(6);
Roughness = floats(7);
Sheen = floats(8);
SpecularColor = colors(3);
SpecularExponent = floats(9);
AlphaTexture = images(0);
AmbientTexture = images(1);
DiffuseTexture = images(2);
DisplacementTexture = images(3);
EmissiveTexture = images(4);
MetallicTexture = images(5);
NormalTexture = images(6);
RoughnessTexture = images(7);
SheenTexture = images(8);
SpecularTexture = images(9);
SpecularHighlightTexture = images(10);
StencilTexture = images(11);
}
public object Clone() => new Material()
{
Alpha = Alpha,
AmbientColor = AmbientColor,
Anisotropy = Anisotropy,
AnisotropyRoughness = AnisotropyRoughness,
ClearcoatRoughness = ClearcoatRoughness,
ClearcoatThickness = ClearcoatThickness,
DiffuseColor = DiffuseColor,
Emissive = Emissive,
IllumModel = IllumModel,
Metallic = Metallic,
OpticalDensity = OpticalDensity,
Roughness = Roughness,
Sheen = Sheen,
SpecularColor = SpecularColor,
SpecularExponent = SpecularExponent,
AlphaTexture = AlphaTexture,
AmbientTexture = AmbientTexture,
DiffuseTexture = DiffuseTexture,
DisplacementTexture = DisplacementTexture,
EmissiveTexture = EmissiveTexture,
MetallicTexture = MetallicTexture,
NormalTexture = NormalTexture,
RoughnessTexture = RoughnessTexture,
SheenTexture = SheenTexture,
SpecularTexture = SpecularTexture,
SpecularHighlightTexture = SpecularHighlightTexture,
StencilTexture = StencilTexture
};
public bool Equals(Material other) => Alpha.Equals(other.Alpha) && AmbientColor.Equals(other.AmbientColor) &&
Anisotropy.Equals(other.Anisotropy) && AnisotropyRoughness.Equals(other.AnisotropyRoughness) &&
ClearcoatRoughness.Equals(other.ClearcoatRoughness) && ClearcoatThickness.Equals(other.ClearcoatThickness) &&
DiffuseColor.Equals(other.DiffuseColor) && Emissive.Equals(other.Emissive) &&
IllumModel.Equals(other.IllumModel) && Metallic.Equals(other.Metallic) &&
OpticalDensity.Equals(other.OpticalDensity) && Roughness.Equals(other.Roughness) && Sheen.Equals(other.Sheen) &&
SpecularColor.Equals(other.SpecularColor) && SpecularExponent.Equals(other.SpecularExponent) &&
AlphaTexture.Equals(other.AlphaTexture) && AmbientTexture.Equals(other.AmbientTexture) &&
DiffuseTexture.Equals(other.DiffuseTexture) && DisplacementTexture.Equals(other.DisplacementTexture) &&
EmissiveTexture.Equals(other.EmissiveTexture) && MetallicTexture.Equals(other.MetallicTexture) &&
NormalTexture.Equals(other.NormalTexture) && RoughnessTexture.Equals(other.RoughnessTexture) &&
SheenTexture.Equals(other.SheenTexture) && SpecularTexture.Equals(other.SheenTexture) &&
SpecularHighlightTexture.Equals(other.SpecularHighlightTexture) && StencilTexture.Equals(other.StencilTexture);
public override bool Equals([NotNullWhen(true)] object? obj)
{
if (obj == null) return false;
if (obj.GetType() == typeof(Material)) return Equals((Material)obj);
return false;
}
public override int GetHashCode() => Alpha.GetHashCode() ^ AmbientColor.GetHashCode() ^ Anisotropy.GetHashCode() ^
AnisotropyRoughness.GetHashCode() ^ ClearcoatRoughness.GetHashCode() ^ ClearcoatThickness.GetHashCode() ^
DiffuseColor.GetHashCode() ^ Emissive.GetHashCode() ^ IllumModel.GetHashCode() ^ Metallic.GetHashCode() ^
OpticalDensity.GetHashCode() ^ Roughness.GetHashCode() ^ Sheen.GetHashCode() ^ SpecularColor.GetHashCode() ^
SpecularExponent.GetHashCode() ^ AlphaTexture.GetHashCode() ^ AmbientTexture.GetHashCode() ^
DiffuseTexture.GetHashCode() ^ DisplacementTexture.GetHashCode() ^ Emissive.GetHashCode() ^
Metallic.GetHashCode() ^ NormalTexture.GetHashCode() ^ RoughnessTexture.GetHashCode() ^
SheenTexture.GetHashCode() ^ SpecularTexture.GetHashCode() ^ SpecularHighlightTexture.GetHashCode() ^
StencilTexture.GetHashCode();
public static bool operator ==(Material a, Material b) => a.Equals(b);
public static bool operator !=(Material a, Material b) => !a.Equals(b);
}