aboutsummaryrefslogtreecommitdiffstatsci
path: root/CrowIDE/OpenGL/Texture.cs
blob: e6bec071a1b9ef6a3a7a87856b64efd49e1e5068 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//
//  Texture.cs
//
//  Author:
//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
//
//  Copyright (c) 2016 jp
//
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Drawing;
using OpenTK.Graphics.OpenGL;
using System.Drawing.Imaging;
using System.IO;
using System.Diagnostics;

namespace Crow
{
    public class Texture
    {
	public string Map;
	public int texRef;
		public int Width;
		public int Height;

		public Texture(string _mapPath, bool flipY = true)
	{
			using (Stream s = Interface.GetStreamFromPath (_mapPath)) {

				try {
					Map = _mapPath;

					Bitmap bitmap = new Bitmap (s);

					if (flipY)
						bitmap.RotateFlip (RotateFlipType.RotateNoneFlipY);

					BitmapData data = bitmap.LockBits (new System.Drawing.Rectangle (0, 0, bitmap.Width, bitmap.Height),
						ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

					createTexture (data.Scan0, data.Width, data.Height);

					bitmap.UnlockBits (data);

					GL.TexParameter (TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear);
					GL.TexParameter (TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

					GL.GenerateMipmap (GenerateMipmapTarget.Texture2D);

				} catch (Exception ex) {
					Debug.WriteLine ("Error loading texture: " + Map + ":" + ex.Message);
				}
			}
		}

		public Texture(int width, int height)
		{
			createTexture (IntPtr.Zero, width, height);
			GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
			GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
			GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Clamp);
			GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Clamp);
		}

		void createTexture(IntPtr data, int width, int height)
		{
			Width = width;
			Height = height;

			GL.GenTextures(1, out texRef);
			GL.BindTexture(TextureTarget.Texture2D, texRef);
			GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, width, height, 0,
				OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data);
		}

	public static implicit operator int(Texture t)
	{
	    return t == null ? 0: t.texRef;
	}
    }

}