using System.Runtime.InteropServices;
namespace Raylib_cs;
///
/// Shader location index
///
public enum ShaderLocationIndex
{
VertexPosition = 0,
VertexTexcoord01,
VertexTexcoord02,
VertexNormal,
VertexTangent,
VertexColor,
MatrixMvp,
MatrixView,
MatrixProjection,
MatrixModel,
MatrixNormal,
VectorView,
ColorDiffuse,
ColorSpecular,
ColorAmbient,
MapAlbedo,
MapMetalness,
MapNormal,
MapRoughness,
MapOcclusion,
MapEmission,
MapHeight,
MapCubemap,
MapIrradiance,
MapPrefilter,
MapBrdf,
VertexBoneIds,
VertexBoneWeights,
BoneMatrices,
MapDiffuse = MapAlbedo,
MapSpecular = MapMetalness,
}
///
/// Shader attribute data types
///
public enum ShaderAttributeDataType
{
Float = 0,
Vec2,
Vec3,
Vec4
}
///
/// Shader uniform data type
///
public enum ShaderUniformDataType
{
Float = 0,
Vec2,
Vec3,
Vec4,
Int,
IVec2,
IVec3,
IVec4,
UInt,
UIVec2,
UIVec3,
UIVec4,
Sampler2D
}
///
/// Shader type (generic)
///
[StructLayout(LayoutKind.Sequential)]
public unsafe struct Shader
{
///
/// Shader program id
///
public uint Id;
///
/// Shader locations array (MAX_SHADER_LOCATIONS, int *)
///
public int* Locs;
public readonly CBool IsValid => Raylib.IsShaderValid(this);
public static Shader Load(string vsFileName, string fsFileName)
{
return Raylib.LoadShader(vsFileName, fsFileName);
}
public static Shader LoadFromMemory(string vsCode, string fsCode)
{
return Raylib.LoadShaderFromMemory(vsCode, fsCode);
}
public void GetLocationAttrib(string attribName)
{
Raylib.GetShaderLocationAttrib(this, attribName);
}
public void SetValue(int locationIndex, T value, ShaderUniformDataType uniformDataType) where T : unmanaged
{
Raylib.SetShaderValue(this, locationIndex, &value, uniformDataType);
}
public void SetValues(int locationIndex, T[] values, ShaderUniformDataType uniformDataType) where T : unmanaged
{
Raylib.SetShaderValueV(this, locationIndex, values, uniformDataType, values.Length);
}
public void SetTexture(int locationIndex, Texture2D texture)
{
Raylib.SetShaderValueTexture(this, locationIndex, texture);
}
public void SetMatrix(int locationIndex, System.Numerics.Matrix4x4 matrix)
{
Raylib.SetShaderValueMatrix(this, locationIndex, matrix);
}
public void Unload()
{
Raylib.UnloadShader(this);
}
}