using System.Runtime.InteropServices;
namespace Raylib_cs;
///
/// Material map index
///
public enum MaterialMapIndex
{
///
/// NOTE: Same as MATERIAL_MAP_DIFFUSE
///
Albedo = 0,
///
/// NOTE: Same as MATERIAL_MAP_SPECULAR
///
Metalness,
Normal,
Roughness,
Occlusion,
Emission,
Height,
///
/// NOTE: Uses GL_TEXTURE_CUBE_MAP
///
Cubemap,
///
/// NOTE: Uses GL_TEXTURE_CUBE_MAP
///
Irradiance,
///
/// NOTE: Uses GL_TEXTURE_CUBE_MAP
///
Prefilter,
Brdf,
Diffuse = Albedo,
Specular = Metalness,
}
///
/// Material texture map
///
[StructLayout(LayoutKind.Sequential)]
public struct MaterialMap
{
///
/// Material map texture
///
public Texture2D Texture;
///
/// Material map color
///
public Color Color;
///
/// Material map value
///
public float Value;
}
///
/// Material type (generic)
///
[StructLayout(LayoutKind.Sequential)]
public unsafe struct Material
{
///
/// Material shader
///
public Shader Shader;
//TODO: convert
///
/// Material maps
///
public MaterialMap* Maps;
///
/// Material generic parameters (if required)
///
public fixed float Param[4];
public readonly CBool IsValid => Raylib.IsMaterialValid(this);
///
/// Load default material
///
public static Material Load()
{
return Raylib.LoadMaterialDefault();
}
///
/// Load materials from model file
///
public static Material[] Load(string fileName)
{
using AnsiBuffer buffer = fileName.ToAnsiBuffer();
int count = 0;
Material* materials = Raylib.LoadMaterials(buffer.AsPointer(), &count);
Material[] output = new Material[count];
for (int i = 0; i < count; i++)
{
output[i] = materials[i];
}
return output;
}
public static Material GetMaterial(ref Model model, int materialIndex)
{
return Raylib.GetMaterial(ref model, materialIndex);
}
public static Texture2D GetTexture(ref Model model, int materialIndex, MaterialMapIndex mapIndex)
{
return Raylib.GetMaterialTexture(ref model, materialIndex, mapIndex);
}
public void SetTexture(MaterialMapIndex mapIndex, Texture2D texture)
{
Raylib.SetMaterialTexture(ref this, mapIndex, texture);
}
public static void SetShader(ref Model model, int materialIndex, ref Shader shader)
{
Raylib.SetMaterialShader(ref model, materialIndex, ref shader);
}
public void Unload()
{
Raylib.UnloadMaterial(this);
}
}