using System;
using System.Runtime.InteropServices;
namespace UnityEngine.Rendering
{
///
/// Contains spherical harmonic coefficients used for lighting representation in the format
/// expected by DOTS_INSTANCING_ON shaders.
///
/// The size of the struct is padded to a power of two so arrays of such structs can be efficiently
/// indexed in shaders.
///
///
[StructLayout(LayoutKind.Sequential)]
[Serializable]
public struct SHCoefficients : IEquatable
{
///
/// Contains the SH coefficients that correspond to the unity_SHAr shader property.
///
public Vector4 SHAr;
///
/// Contains the SH coefficients that correspond to the unity_SHAg shader property.
///
public Vector4 SHAg;
///
/// Contains the SH coefficients that correspond to the unity_SHAb shader property.
///
public Vector4 SHAb;
///
/// Contains the SH coefficients that correspond to the unity_SHBr shader property.
///
public Vector4 SHBr;
///
/// Contains the SH coefficients that correspond to the unity_SHBg shader property.
///
public Vector4 SHBg;
///
/// Contains the SH coefficients that correspond to the unity_SHBb shader property.
///
public Vector4 SHBb;
///
/// Contains the SH coefficients that correspond to the unity_SHC shader property.
///
public Vector4 SHC;
///
/// Contains the baked shadowing data that corresponds to the unity_ProbesOcclusion shader property.
///
public Vector4 ProbesOcclusion;
///
/// Construct an instance of SHCoefficients that represents the same spherical
/// harmonic coefficients as the parameter.
///
/// The spherical harmonic coefficients to initialize with.
public SHCoefficients(SphericalHarmonicsL2 sh)
{
SHAr = GetSHA(sh, 0);
SHAg = GetSHA(sh, 1);
SHAb = GetSHA(sh, 2);
SHBr = GetSHB(sh, 0);
SHBg = GetSHB(sh, 1);
SHBb = GetSHB(sh, 2);
SHC = GetSHC(sh);
ProbesOcclusion = Vector4.one;
}
///
/// Construct an instance of SHCoefficients that represents the same spherical
/// harmonic coefficients as the parameter.
///
/// The spherical harmonic coefficients to initialize with.
/// The baked shadowing data to include with this set of spherical harmonic coefficients.
public SHCoefficients(SphericalHarmonicsL2 sh, Vector4 probesOcclusion)
: this(sh)
{
ProbesOcclusion = probesOcclusion;
}
static Vector4 GetSHA(SphericalHarmonicsL2 sh, int i)
{
return new Vector4(sh[i, 3], sh[i, 1], sh[i, 2], sh[i, 0] - sh[i, 6]);
}
static Vector4 GetSHB(SphericalHarmonicsL2 sh, int i)
{
return new Vector4(sh[i, 4], sh[i, 5], sh[i, 6] * 3f, sh[i, 7]);
}
static Vector4 GetSHC(SphericalHarmonicsL2 sh)
{
return new Vector4(sh[0, 8], sh[1, 8], sh[2, 8], 1);
}
///
/// Equals implementation.
///
/// Other SHCoefficients instance to comapre this against.
/// True if contents are equal, False otherwise.
public bool Equals(SHCoefficients other)
{
return SHAr.Equals(other.SHAr) && SHAg.Equals(other.SHAg) && SHAb.Equals(other.SHAb) && SHBr.Equals(other.SHBr) && SHBg.Equals(other.SHBg) && SHBb.Equals(other.SHBb) && SHC.Equals(other.SHC) && ProbesOcclusion.Equals(other.ProbesOcclusion);
}
///
/// Equals implementation.
///
/// Other object to compare this object against
/// True if contents are equal, False otherwise.
public override bool Equals(object obj)
{
return obj is SHCoefficients other && Equals(other);
}
///
/// GetHashCode implementation.
///
/// Returns a hashcode based on SHA coefficients.
public override int GetHashCode()
{
return HashCode.Combine(SHAr, SHAg, SHAb, SHBr, SHBg, SHBb, SHC, ProbesOcclusion);
}
///
/// Equality operator implementation.
///
/// Left operand of comparison
/// Right operand of comparison
/// True if contents are equal, False otherwise.
public static bool operator ==(SHCoefficients left, SHCoefficients right)
{
return left.Equals(right);
}
///
/// Not equals operator implementation.
///
/// Left operand of comparison
/// Right operand of comparison
/// True if contents are not equal, False otherwise.
public static bool operator !=(SHCoefficients left, SHCoefficients right)
{
return !left.Equals(right);
}
}
///
/// Contains default values for built-in properties that the user is expected to manually
/// provide for DOTS_INSTANCING_ON shaders. The struct layout matches the
/// unity_DOTSInstanceGlobalValues constant buffer the shader expects the default
/// values in.
///
[Obsolete("BatchRendererGroupGlobals and associated cbuffer are now set automatically by Unity. Setting it manually is no longer necessary or supported.")]
[StructLayout(LayoutKind.Sequential)]
[Serializable]
public struct BatchRendererGroupGlobals : IEquatable
{
///
/// The string name of the constant buffer DOTS_INSTANCING_ON shaders use
/// to read default values for the built-in properties contained in this struct.
///
public const string kGlobalsPropertyName = "unity_DOTSInstanceGlobalValues";
///
/// The unique identifier for , retrieved using
/// .
///
///
public static readonly int kGlobalsPropertyId = Shader.PropertyToID(kGlobalsPropertyName);
///
/// The default value to use for the unity_ProbesOcclusion built-in shader property.
///
public Vector4 ProbesOcclusion;
///
/// The default value to use for the unity_SpecCube0_HDR built-in shader property.
///
public Vector4 SpecCube0_HDR;
///
/// The default value to use for the unity_SpecCube1_HDR built-in shader property.
///
public Vector4 SpecCube1_HDR;
///
/// The default values to use for the built-in spherical harmonics shader properties.
///
///
public SHCoefficients SHCoefficients;
///
/// Construct a struct with default values based on the currently active reflection probe
/// and ambient lighting settings.
///
public static BatchRendererGroupGlobals Default
{
get
{
var globals = new BatchRendererGroupGlobals();
globals.ProbesOcclusion = Vector4.one;
globals.SpecCube0_HDR = ReflectionProbe.defaultTextureHDRDecodeValues;
globals.SpecCube1_HDR = globals.SpecCube0_HDR;
globals.SHCoefficients = new SHCoefficients(RenderSettings.ambientProbe);
return globals;
}
}
///
/// Equals implementation.
///
/// Other BatchRendererGroupGlobals instance to comapre this against.
/// True if contents are equal, False otherwise.
public bool Equals(BatchRendererGroupGlobals other)
{
return ProbesOcclusion.Equals(other.ProbesOcclusion) && SpecCube0_HDR.Equals(other.SpecCube0_HDR) && SpecCube1_HDR.Equals(other.SpecCube1_HDR) && SHCoefficients.Equals(other.SHCoefficients);
}
///
/// Equals implementation.
///
/// Other object to comapre this against.
/// True if contents are equal, False otherwise.
public override bool Equals(object obj)
{
return obj is BatchRendererGroupGlobals other && Equals(other);
}
///
/// GetHashCode implementation.
///
/// Returns a hashcode based on ProbesOcclusion, SpecCube and SH coefficients parameters
public override int GetHashCode()
{
return HashCode.Combine(ProbesOcclusion, SpecCube0_HDR, SpecCube1_HDR, SHCoefficients);
}
///
/// Equality operator implementation.
///
/// Left operand of comparison
/// Right operand of comparison
/// True if contents are equal, False otherwise.
public static bool operator ==(BatchRendererGroupGlobals left, BatchRendererGroupGlobals right)
{
return left.Equals(right);
}
///
/// Not equals operator implementation.
///
/// Left operand of comparison
/// Right operand of comparison
/// True if contents are not equal, False otherwise.
public static bool operator !=(BatchRendererGroupGlobals left, BatchRendererGroupGlobals right)
{
return !left.Equals(right);
}
}
}