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); } }