Subversion Repositories AndroidProjects

Rev

Rev 789 | Rev 797 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Drawing;
using System.Drawing.Imaging;

using Tao.OpenGl;

using BauzoidNET.graphics;

namespace BauzoidNET.graphics.texture
{
    public class Texture : GraphicsObject
    {
        public enum Filter
        {
            NEAREST = Gl.GL_NEAREST,
            LINEAR = Gl.GL_LINEAR
        }

        public enum Wrap
        {
            MIRRORED_REPEAT = Gl.GL_MIRRORED_REPEAT,
            CLAMP_TO_EDGE = Gl.GL_CLAMP_TO_EDGE,
            REPEAT = Gl.GL_REPEAT
        }

        private static int[] TEXTUREID = new int[1];

        private Filter mTextureFilter = Filter.LINEAR;
        private Wrap mTextureWrap = Wrap.CLAMP_TO_EDGE;

        public int width = 0;
        public int height = 0;

        public int mTextureID = 0;

        public Texture(Graphics graphics, string path)
            : base(graphics)
        {
        }

        public void create(string path)
        {
            Bitmap image;

            image = new Bitmap(path);

            Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
            width = image.Width;
            height = image.Height;
            BitmapData bitmapdata = image.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

            load(bitmapdata);

            image.UnlockBits(bitmapdata);
            image.Dispose();

            /*Bitmap image;

            try
            {
                image = new Bitmap(path);

                image.RotateFlip(RotateFlipType.RotateNoneFlipY);
                Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
                height = image.Height;
                width = image.Width;
                BitmapData bitmapdata = image.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

                Gl.glEnable(Gl.GL_TEXTURE_2D);                                  // Enable 2D Texture Mapping
                // Gl.glDisable(Gl.GL_DEPTH_TEST);                                   // Disable Depth Testing
                Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);                         // Set Blending Mode
                Gl.glEnable(Gl.GL_BLEND);
                Gl.glEnable(Gl.GL_TEXTURE_GEN_S); //enable texture coordinate generation
                Gl.glEnable(Gl.GL_TEXTURE_GEN_T);

                Gl.glBindTexture(Gl.GL_TEXTURE_2D, index[0]);
                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, image.Width, image.Height,
                                0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);
                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP);
                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP);
                image.UnlockBits(bitmapdata);
                image.Dispose();
            }
            catch (ArgumentException)
            {
                Environment.Exit(0);
            }*/

        }

        public void load(BitmapData data)
        {
            Gl.glGenTextures(1, TEXTUREID);
            mTextureID = TEXTUREID[0];

            Gl.glEnable(Gl.GL_TEXTURE_2D);
            bind();

            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, width, height, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, data.Scan0);
        }

        public void dispose()
        {
            TEXTUREID[0] = mTextureID;
            Gl.glDeleteTextures(1, TEXTUREID);
        }

        public void bind()
        {
            // TODO: bind using TextureStage/renderstate
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, mTextureID);
        }

        public void setFilter(Filter minFilter, Filter magFilter)
        {
        }

        public void setWrap(Wrap wrapS, Wrap wrapT)
        {
        }

        public int getTextureHandle()
        {
            return mTextureID;
        }

    }
}