-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTexture.cs
105 lines (94 loc) · 3.62 KB
/
Texture.cs
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
95
96
97
98
99
100
101
102
103
104
105
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tao.OpenGl;
using System.IO;
using System.Runtime.InteropServices;
namespace Graphics
{
class Texture
{
uint mtexture;
public int width, height;
int TexUnit;
public Texture(string path, int texUnit,bool flip=false)
{
try
{
Bitmap bitmap = (Bitmap)Bitmap.FromFile(path);
if (flip)
{
bitmap.RotateFlip(RotateFlipType.Rotate180FlipX);
//bitmap.RotateFlip(RotateFlipType.Rotate180FlipY);
}
Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
width = bitmap.Width;
height = bitmap.Height;
TexUnit = texUnit;
Gl.glActiveTexture(texUnit);
uint[] tex = { 0 };
Gl.glGenTextures(1, tex);
mtexture = tex[0];
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mtexture);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
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.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, width, height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
if (bitmap != null)
{
bitmap.UnlockBits(bitmapData);
bitmap.Dispose();
}
}
catch
{
width = 0;
height = 0;
}
}
public void UpdateTex(Bitmap bitmap)
{
try
{
Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
width = bitmap.Width;
height = bitmap.Height;
Gl.glActiveTexture(TexUnit);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mtexture);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
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.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, width, height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
if (bitmap != null)
{
bitmap.UnlockBits(bitmapData);
//bitmap.Dispose();
}
}
catch
{
width = 0;
height = 0;
}
}
public void CleanUp()
{
Gl.glDeleteTextures(1, (IntPtr)mtexture);
}
public void Bind()
{
Gl.glActiveTexture(TexUnit);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mtexture);
}
}
}