using System.Runtime.InteropServices;

namespace Raylib_cs;

/// <summary>
/// Texture parameters: filter mode<br/>
/// NOTE 1: Filtering considers mipmaps if available in the texture<br/>
/// NOTE 2: Filter is accordingly set for minification and magnification
/// </summary>
public enum TextureFilter
{
    /// <summary>
    /// No filter, just pixel aproximation
    /// </summary>
    TEXTURE_FILTER_POINT = 0,

    /// <summary>
    /// Linear filtering
    /// </summary>
    TEXTURE_FILTER_BILINEAR,

    /// <summary>
    /// Trilinear filtering (linear with mipmaps)
    /// </summary>
    TEXTURE_FILTER_TRILINEAR,

    /// <summary>
    /// Anisotropic filtering 4x
    /// </summary>
    TEXTURE_FILTER_ANISOTROPIC_4X,

    /// <summary>
    /// Anisotropic filtering 8x
    /// </summary>
    TEXTURE_FILTER_ANISOTROPIC_8X,

    /// <summary>
    /// Anisotropic filtering 16x
    /// </summary>
    TEXTURE_FILTER_ANISOTROPIC_16X,
}

/// <summary>
/// Texture parameters: wrap mode
/// </summary>
public enum TextureWrap
{
    /// <summary>
    /// Repeats texture in tiled mode
    /// </summary>
    TEXTURE_WRAP_REPEAT = 0,

    /// <summary>
    /// Clamps texture to edge pixel in tiled mode
    /// </summary>
    TEXTURE_WRAP_CLAMP,

    /// <summary>
    /// Mirrors and repeats the texture in tiled mode
    /// </summary>
    TEXTURE_WRAP_MIRROR_REPEAT,

    /// <summary>
    /// Mirrors and clamps to border the texture in tiled mode
    /// </summary>
    TEXTURE_WRAP_MIRROR_CLAMP
}

/// <summary>
/// Cubemap layouts
/// </summary>
public enum CubemapLayout
{
    /// <summary>
    /// Automatically detect layout type
    /// </summary>
    CUBEMAP_LAYOUT_AUTO_DETECT = 0,

    /// <summary>
    /// Layout is defined by a vertical line with faces
    /// </summary>
    CUBEMAP_LAYOUT_LINE_VERTICAL,

    /// <summary>
    /// Layout is defined by a horizontal line with faces
    /// </summary>
    CUBEMAP_LAYOUT_LINE_HORIZONTAL,

    /// <summary>
    /// Layout is defined by a 3x4 cross with cubemap faces
    /// </summary>
    CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR,

    /// <summary>
    /// Layout is defined by a 4x3 cross with cubemap faces
    /// </summary>
    CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE,

    /// <summary>
    /// Layout is defined by a panorama image (equirectangular map)
    /// </summary>
    CUBEMAP_LAYOUT_PANORAMA
}

/// <summary>
/// Texture2D type<br/>
/// NOTE: Data stored in GPU memory
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public partial struct Texture2D
{
    /// <summary>
    /// OpenGL texture id
    /// </summary>
    public uint Id;

    /// <summary>
    /// Texture base width
    /// </summary>
    public int Width;

    /// <summary>
    /// Texture base height
    /// </summary>
    public int Height;

    /// <summary>
    /// Mipmap levels, 1 by default
    /// </summary>
    public int Mipmaps;

    /// <summary>
    /// Data format (PixelFormat type)
    /// </summary>
    public PixelFormat Format;
}