#region usings using System.Drawing; using System.Drawing.Imaging; using OpenTK.Graphics.OpenGL4; using SM.OGL.Texture; using PixelFormat = System.Drawing.Imaging.PixelFormat; #endregion namespace SM.Base.Textures { /// /// Texture that can be drawn to an object. /// public class Texture : TextureBase { /// /// Decides if the bitmap will automatically dispose itself. /// public bool AutoDispose = false; /// /// The texture as bitmap. /// public Bitmap Map; /// public override int Width { get => Map.Width; protected set { } } /// public override int Height { get => Map.Height; protected set {} } public float Aspect { get; private set; } /// /// Empty constructor /// protected Texture() { } /// /// Creates a texture with only the map. /// Sets the filter to Linear and WrapMode to Repeat. /// /// The map public Texture(Bitmap map) : this(map, TextureMinFilter.Linear, TextureWrapMode.Repeat) { } /// /// Creates the texture. /// /// The texture map /// The filter /// The wrap mode public Texture(Bitmap map, TextureMinFilter filter, TextureWrapMode wrapMode) { Map = map; Aspect = (float)map.Width / map.Height; Filter = filter; WrapMode = wrapMode; } /// public override void Compile() { base.Compile(); _id = GenerateTexture(Map, Filter, WrapMode, AutoDispose); } /// public override void Dispose() { base.Dispose(); GL.DeleteTexture(this); } /// /// Generates a OpenGL-texture. /// /// The texture as bitmap /// The filter /// The wrap mode /// Auto dispose of the bitmap? Default: false /// public static int GenerateTexture(Bitmap map, TextureMinFilter filter, TextureWrapMode wrapMode, bool dispose = false) { var id = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, id); var data = map.LockBits(new Rectangle(0, 0, map.Width, map.Height), ImageLockMode.ReadOnly, map.PixelFormat); var transparenz = map.PixelFormat == PixelFormat.Format32bppArgb; GL.TexImage2D(TextureTarget.Texture2D, 0, transparenz ? PixelInternalFormat.Rgba : PixelInternalFormat.Rgb, data.Width, data.Height, 0, transparenz ? OpenTK.Graphics.OpenGL4.PixelFormat.Bgra : OpenTK.Graphics.OpenGL4.PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) filter); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) filter); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) wrapMode); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int) wrapMode); GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); GL.BindTexture(TextureTarget.Texture2D, 0); map.UnlockBits(data); if (dispose) map.Dispose(); return id; } /// /// Converts a bitmap to a texture. /// public static implicit operator Texture(Bitmap map) { return new Texture(map); } } }