This commit is contained in:
2021-06-13 10:28:03 +02:00
parent eb70603c85
commit df2d24cbd3
7487 changed files with 943244 additions and 0 deletions

View File

@@ -0,0 +1,324 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace UnityEngine.Rendering
{
/// <summary>
/// Packing Rules for structs.
/// </summary>
public enum PackingRules
{
/// <summary>
/// Exact Packing
/// </summary>
Exact,
/// <summary>
/// Aggressive Packing
/// </summary>
Aggressive
};
/// <summary>
/// Field packing scheme.
/// </summary>
public enum FieldPacking
{
/// <summary>
/// No Packing
/// </summary>
NoPacking = 0,
/// <summary>
/// R11G11B10 Packing
/// </summary>
R11G11B10,
/// <summary>
/// Packed Float
/// </summary>
PackedFloat,
/// <summary>
/// Packed UInt
/// </summary>
PackedUint
}
/// <summary>
/// Field Precision
/// </summary>
public enum FieldPrecision
{
/// <summary>
/// Half Precision
/// </summary>
Half,
/// <summary>
/// Real Precision
/// </summary>
Real,
/// <summary>
/// Default Precision
/// </summary>
Default
}
/// <summary>
/// Attribute specifying that HLSL code should be generated.
/// </summary>
[AttributeUsage(AttributeTargets.Struct | AttributeTargets.Class | AttributeTargets.Enum)]
public class GenerateHLSL : System.Attribute
{
/// <summary>
/// Packing rules for the struct.
/// </summary>
public PackingRules packingRules;
/// <summary>
/// Structure contains packed fields.
/// </summary>
public bool containsPackedFields;
/// <summary>
/// Structure needs generated accessors.
/// </summary>
public bool needAccessors;
/// <summary>
/// Structure needs generated setters.
/// </summary>
public bool needSetters;
/// <summary>
/// Structure needs generated debug defines and functions.
/// </summary>
public bool needParamDebug;
/// <summary>
/// Start value of generated defines.
/// </summary>
public int paramDefinesStart;
/// <summary>
/// Generate structure declaration or not.
/// </summary>
public bool omitStructDeclaration;
/// <summary>
/// Generate constant buffer declaration or not.
/// </summary>
public bool generateCBuffer;
/// <summary>
/// If specified, when generating a constant buffer, use this explicit register.
/// </summary>
public int constantRegister;
/// <summary>
/// Path of the generated file
/// </summary>
public string sourcePath;
/// <summary>
/// GenerateHLSL attribute constructor.
/// </summary>
/// <param name="rules">Packing rules.</param>
/// <param name="needAccessors">Need accessors.</param>
/// <param name="needSetters">Need setters.</param>
/// <param name="needParamDebug">Need debug defines.</param>
/// <param name="paramDefinesStart">Start value of debug defines.</param>
/// <param name="omitStructDeclaration">Omit structure declaration.</param>
/// <param name="containsPackedFields">Contains packed fields.</param>
/// <param name="generateCBuffer">Generate a constant buffer.</param>
/// <param name="constantRegister">When generating a constant buffer, specify the optional constant register.</param>
/// <param name="sourcePath">Location of the source file defining the C# type. (Automatically filled by compiler)</param>
public GenerateHLSL(PackingRules rules = PackingRules.Exact, bool needAccessors = true, bool needSetters = false, bool needParamDebug = false, int paramDefinesStart = 1,
bool omitStructDeclaration = false, bool containsPackedFields = false, bool generateCBuffer = false, int constantRegister = -1,
[CallerFilePath] string sourcePath = null)
{
this.sourcePath = sourcePath;
packingRules = rules;
this.needAccessors = needAccessors;
this.needSetters = needSetters;
this.needParamDebug = needParamDebug;
this.paramDefinesStart = paramDefinesStart;
this.omitStructDeclaration = omitStructDeclaration;
this.containsPackedFields = containsPackedFields;
this.generateCBuffer = generateCBuffer;
this.constantRegister = constantRegister;
}
}
/// <summary>
/// Attribute specifying the parameters of a surface data field.
/// </summary>
[AttributeUsage(AttributeTargets.Field)]
public class SurfaceDataAttributes : System.Attribute
{
/// <summary>
/// Display names overrides for the field.
/// </summary>
public string[] displayNames;
/// <summary>
/// True if the field is a direction.
/// </summary>
public bool isDirection;
/// <summary>
/// True if the field is an sRGB value.
/// </summary>
public bool sRGBDisplay;
/// <summary>
/// Field precision.
/// </summary>
public FieldPrecision precision;
/// <summary>
/// Field is a normalized vector.
/// </summary>
public bool checkIsNormalized;
/// <summary>
/// SurfaceDataAttributes constructor.
/// </summary>
/// <param name="displayName">Display name.</param>
/// <param name="isDirection">Field is a direction.</param>
/// <param name="sRGBDisplay">Field is an sRGB value.</param>
/// <param name="precision">Field precision.</param>
public SurfaceDataAttributes(string displayName = "", bool isDirection = false, bool sRGBDisplay = false, FieldPrecision precision = FieldPrecision.Default, bool checkIsNormalized = false)
{
displayNames = new string[1];
displayNames[0] = displayName;
this.isDirection = isDirection;
this.sRGBDisplay = sRGBDisplay;
this.precision = precision;
this.checkIsNormalized = checkIsNormalized;
}
// We allow users to add several names for one field, so user can override the auto behavior and do something else with the same data
// typical example is normal that you want to draw in view space or world space. So user can override view space case and do the transform.
/// <summary>
/// SurfaceDataAttributes constructor.
/// </summary>
/// <param name="displayNames">List of names for the field.</param>
/// <param name="isDirection">Field is a direction.</param>
/// <param name="sRGBDisplay">Field is an sRGB value.</param>
/// <param name="precision">Field precision.</param>
public SurfaceDataAttributes(string[] displayNames, bool isDirection = false, bool sRGBDisplay = false, bool checkIsNormalized = false, FieldPrecision precision = FieldPrecision.Default)
{
this.displayNames = displayNames;
this.isDirection = isDirection;
this.sRGBDisplay = sRGBDisplay;
this.precision = precision;
this.checkIsNormalized = checkIsNormalized;
}
}
/// <summary>
/// Attribute defining an HLSL array.
/// </summary>
[AttributeUsage(AttributeTargets.Field)]
public class HLSLArray : System.Attribute
{
/// <summary>
/// Size of the array.
/// </summary>
public int arraySize;
/// <summary>
/// Type of the array elements.
/// </summary>
public Type elementType;
/// <summary>
/// HLSLSArray constructor.
/// </summary>
/// <param name="arraySize">Size of the array.</param>
/// <param name="elementType">Type of the array elements.</param>
public HLSLArray(int arraySize, Type elementType)
{
this.arraySize = arraySize;
this.elementType = elementType;
}
}
/// <summary>
/// Attribute defining packing.
/// </summary>
[AttributeUsage(AttributeTargets.Field, AllowMultiple = true)]
public class PackingAttribute : System.Attribute
{
/// <summary>
/// Display names.
/// </summary>
public string[] displayNames;
/// <summary>
/// Minimum and Maximum value.
/// </summary>
public float[] range;
/// <summary>
/// Packing scheme.
/// </summary>
public FieldPacking packingScheme;
/// <summary>
/// Offset in source.
/// </summary>
public int offsetInSource;
/// <summary>
/// Size in bits.
/// </summary>
public int sizeInBits;
/// <summary>
/// True if the field is a direction.
/// </summary>
public bool isDirection;
/// <summary>
/// True if the field is an sRGB value.
/// </summary>
public bool sRGBDisplay;
/// <summary>
/// True if the field is an sRGB value.
/// </summary>
public bool checkIsNormalized;
/// <summary>
/// Packing Attribute constructor.
/// </summary>
/// <param name="displayNames">Display names.</param>
/// <param name="packingScheme">Packing scheme.</param>
/// <param name="bitSize">Size in bits.</param>
/// <param name="offsetInSource">Offset in source.</param>
/// <param name="minValue">Minimum value.</param>
/// <param name="maxValue">Maximum value.</param>
/// <param name="isDirection">Field is a direction.</param>
/// <param name="sRGBDisplay">Field is an sRGB value.</param>
public PackingAttribute(string[] displayNames, FieldPacking packingScheme = FieldPacking.NoPacking, int bitSize = 32, int offsetInSource = 0, float minValue = 0.0f, float maxValue = 1.0f, bool isDirection = false, bool sRGBDisplay = false, bool checkIsNormalized = false)
{
this.displayNames = displayNames;
this.packingScheme = packingScheme;
this.offsetInSource = offsetInSource;
this.isDirection = isDirection;
this.sRGBDisplay = sRGBDisplay;
this.checkIsNormalized = checkIsNormalized;
this.sizeInBits = bitSize;
this.range = new float[] { minValue, maxValue };
}
/// <summary>
/// Packing Attribute constructor.
/// </summary>
/// <param name="displayName">Display name.</param>
/// <param name="packingScheme">Packing scheme.</param>
/// <param name="bitSize">Size in bits.</param>
/// <param name="offsetInSource">Offset in source.</param>
/// <param name="minValue">Minimum value.</param>
/// <param name="maxValue">Maximum value.</param>
/// <param name="isDirection">Field is a direction.</param>
/// <param name="sRGBDisplay">Field is an sRGB value.</param>
public PackingAttribute(string displayName = "", FieldPacking packingScheme = FieldPacking.NoPacking, int bitSize = 0, int offsetInSource = 0, float minValue = 0.0f, float maxValue = 1.0f, bool isDirection = false, bool sRGBDisplay = false, bool checkIsNormalized = false)
{
displayNames = new string[1];
displayNames[0] = displayName;
this.packingScheme = packingScheme;
this.offsetInSource = offsetInSource;
this.isDirection = isDirection;
this.sRGBDisplay = sRGBDisplay;
this.checkIsNormalized = checkIsNormalized;
this.sizeInBits = bitSize;
this.range = new float[] { minValue, maxValue };
}
}
/// <summary>
/// This type needs to be used when generating unsigned integer arrays for constant buffers.
/// </summary>
public struct ShaderGenUInt4
{
}
}