Rev 1451 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 787 | chris | 1 | using System; |
| 2 | using System.Collections.Generic; |
||
| 3 | using System.Linq; |
||
| 4 | using System.Text; |
||
| 5 | using System.Threading.Tasks; |
||
| 6 | |||
| 788 | chris | 7 | using System.Drawing; |
| 8 | using System.Drawing.Imaging; |
||
| 9 | |||
| 10 | using Tao.OpenGl; |
||
| 11 | |||
| 790 | chris | 12 | using BauzoidNET.graphics; |
| 13 | |||
| 1451 | chris | 14 | #pragma warning disable 0618 |
| 15 | |||
| 787 | chris | 16 | namespace BauzoidNET.graphics.texture |
| 17 | { |
||
| 790 | chris | 18 | public class Texture : GraphicsObject |
| 787 | chris | 19 | { |
| 20 | public enum Filter |
||
| 21 | { |
||
| 788 | chris | 22 | NEAREST = Gl.GL_NEAREST, |
| 23 | LINEAR = Gl.GL_LINEAR |
||
| 787 | chris | 24 | } |
| 25 | |||
| 788 | chris | 26 | public enum Wrap |
| 787 | chris | 27 | { |
| 788 | chris | 28 | MIRRORED_REPEAT = Gl.GL_MIRRORED_REPEAT, |
| 29 | CLAMP_TO_EDGE = Gl.GL_CLAMP_TO_EDGE, |
||
| 30 | REPEAT = Gl.GL_REPEAT |
||
| 787 | chris | 31 | } |
| 32 | |||
| 788 | chris | 33 | private static int[] TEXTUREID = new int[1]; |
| 34 | |||
| 1469 | chris | 35 | private Filter mTextureMinFilter = Filter.LINEAR; |
| 36 | private Filter mTextureMagFilter = Filter.LINEAR; |
||
| 37 | private Wrap mTextureWrapS = Wrap.CLAMP_TO_EDGE; |
||
| 38 | private Wrap mTextureWrapT = Wrap.CLAMP_TO_EDGE; |
||
| 788 | chris | 39 | |
| 797 | chris | 40 | private int mWidth = 0; |
| 41 | private int mHeight = 0; |
||
| 788 | chris | 42 | |
| 825 | chris | 43 | private int mTextureID = 0; |
| 788 | chris | 44 | |
| 790 | chris | 45 | public Texture(Graphics graphics, string path) |
| 46 | : base(graphics) |
||
| 788 | chris | 47 | { |
| 825 | chris | 48 | create(new Bitmap(path)); |
| 788 | chris | 49 | } |
| 50 | |||
| 825 | chris | 51 | public Texture(Graphics graphics, int width, int height) |
| 52 | : base(graphics) |
||
| 788 | chris | 53 | { |
| 825 | chris | 54 | create(new Bitmap(width, height, PixelFormat.Format32bppArgb)); |
| 55 | } |
||
| 788 | chris | 56 | |
| 1394 | chris | 57 | public Texture(Graphics graphics, Bitmap image) |
| 58 | : base(graphics) |
||
| 59 | { |
||
| 60 | create(image); |
||
| 61 | } |
||
| 62 | |||
| 825 | chris | 63 | public void create(Bitmap image) |
| 64 | { |
||
| 802 | chris | 65 | image.RotateFlip(RotateFlipType.RotateNoneFlipNone); |
| 788 | chris | 66 | Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); |
| 797 | chris | 67 | mWidth = image.Width; |
| 68 | mHeight = image.Height; |
||
| 825 | chris | 69 | BitmapData bitmapdata = image.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); |
| 788 | chris | 70 | |
| 71 | load(bitmapdata); |
||
| 72 | |||
| 73 | image.UnlockBits(bitmapdata); |
||
| 74 | image.Dispose(); |
||
| 75 | } |
||
| 76 | |||
| 77 | public void load(BitmapData data) |
||
| 78 | { |
||
| 79 | Gl.glGenTextures(1, TEXTUREID); |
||
| 80 | mTextureID = TEXTUREID[0]; |
||
| 81 | |||
| 82 | Gl.glEnable(Gl.GL_TEXTURE_2D); |
||
| 83 | bind(); |
||
| 84 | |||
| 802 | chris | 85 | Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, mWidth, mHeight, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, data.Scan0); |
| 86 | |||
| 1469 | chris | 87 | Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, (int)mTextureMinFilter); |
| 88 | Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, (int)mTextureMagFilter); |
||
| 89 | Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, (int)mTextureWrapS); |
||
| 90 | Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, (int)mTextureWrapT); |
||
| 788 | chris | 91 | } |
| 92 | |||
| 93 | public void dispose() |
||
| 94 | { |
||
| 797 | chris | 95 | if (mTextureID != 0) |
| 96 | { |
||
| 97 | TEXTUREID[0] = mTextureID; |
||
| 98 | Gl.glDeleteTextures(1, TEXTUREID); |
||
| 99 | } |
||
| 788 | chris | 100 | } |
| 101 | |||
| 787 | chris | 102 | public void bind() |
| 103 | { |
||
| 788 | chris | 104 | // TODO: bind using TextureStage/renderstate |
| 105 | Gl.glBindTexture(Gl.GL_TEXTURE_2D, mTextureID); |
||
| 1469 | chris | 106 | Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, (int)mTextureMinFilter); |
| 107 | Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, (int)mTextureMagFilter); |
||
| 108 | Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, (int)mTextureWrapS); |
||
| 109 | Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, (int)mTextureWrapT); |
||
| 787 | chris | 110 | } |
| 111 | |||
| 112 | public void setFilter(Filter minFilter, Filter magFilter) |
||
| 113 | { |
||
| 1469 | chris | 114 | mTextureMinFilter = minFilter; |
| 115 | mTextureMagFilter = magFilter; |
||
| 787 | chris | 116 | } |
| 117 | |||
| 788 | chris | 118 | public void setWrap(Wrap wrapS, Wrap wrapT) |
| 119 | { |
||
| 1469 | chris | 120 | mTextureWrapS = wrapS; |
| 121 | mTextureWrapT = wrapT; |
||
| 788 | chris | 122 | } |
| 123 | |||
| 124 | public int getTextureHandle() |
||
| 125 | { |
||
| 126 | return mTextureID; |
||
| 127 | } |
||
| 128 | |||
| 797 | chris | 129 | public int getWidth() |
| 130 | { |
||
| 131 | return mWidth; |
||
| 132 | } |
||
| 133 | |||
| 134 | public int getHeight() |
||
| 135 | { |
||
| 136 | return mHeight; |
||
| 137 | } |
||
| 138 | |||
| 787 | chris | 139 | } |
| 140 | } |