rev |
line source |
nuclear@0
|
1 #include <string.h>
|
nuclear@0
|
2 #include <math.h>
|
nuclear@0
|
3 #include "opengl.h"
|
nuclear@0
|
4 #include "image.h"
|
nuclear@0
|
5
|
nuclear@0
|
6 static unsigned int next_pow2(unsigned int x);
|
nuclear@0
|
7
|
nuclear@0
|
8 Image::Image()
|
nuclear@0
|
9 {
|
nuclear@0
|
10 width = height = 0;
|
nuclear@0
|
11 tex_width = tex_height = 0;
|
nuclear@0
|
12 pixels = 0;
|
nuclear@0
|
13 texture = 0;
|
nuclear@0
|
14 own_pixels = 0;
|
nuclear@0
|
15 }
|
nuclear@0
|
16
|
nuclear@0
|
17 Image::~Image()
|
nuclear@0
|
18 {
|
nuclear@0
|
19 destroy();
|
nuclear@0
|
20 }
|
nuclear@0
|
21
|
nuclear@0
|
22 void Image::create(int xsz, int ysz, unsigned char *pix)
|
nuclear@0
|
23 {
|
nuclear@0
|
24 destroy();
|
nuclear@0
|
25
|
nuclear@0
|
26 pixels = own_pixels = new unsigned char[xsz * ysz * 3];
|
nuclear@0
|
27 if(pix) {
|
nuclear@0
|
28 memcpy(pixels, pix, xsz * ysz * 3);
|
nuclear@0
|
29 } else {
|
nuclear@0
|
30 memset(pixels, 0, xsz * ysz * 3);
|
nuclear@0
|
31 }
|
nuclear@0
|
32 width = xsz;
|
nuclear@0
|
33 height = ysz;
|
nuclear@0
|
34 }
|
nuclear@0
|
35
|
nuclear@0
|
36 void Image::destroy()
|
nuclear@0
|
37 {
|
nuclear@0
|
38 if(texture) {
|
nuclear@0
|
39 glDeleteTextures(1, &texture);
|
nuclear@0
|
40 texture = 0;
|
nuclear@0
|
41 }
|
nuclear@0
|
42
|
nuclear@0
|
43 delete [] own_pixels;
|
nuclear@0
|
44 own_pixels = pixels = 0;
|
nuclear@0
|
45
|
nuclear@0
|
46 width = height = tex_width = tex_height = 0;
|
nuclear@0
|
47 }
|
nuclear@0
|
48
|
nuclear@0
|
49 unsigned int Image::gen_texture()
|
nuclear@0
|
50 {
|
nuclear@0
|
51 if(!pixels || !width || !height) {
|
nuclear@0
|
52 return 0;
|
nuclear@0
|
53 }
|
nuclear@0
|
54
|
nuclear@0
|
55 if(!texture) {
|
nuclear@0
|
56 glGenTextures(1, &texture);
|
nuclear@0
|
57 glBindTexture(GL_TEXTURE_2D, texture);
|
nuclear@0
|
58 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
nuclear@0
|
59 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
nuclear@0
|
60 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
|
nuclear@0
|
61 } else {
|
nuclear@0
|
62 glBindTexture(GL_TEXTURE_2D, texture);
|
nuclear@0
|
63 }
|
nuclear@0
|
64
|
nuclear@0
|
65 tex_width = next_pow2(width);
|
nuclear@0
|
66 tex_height = next_pow2(height);
|
nuclear@0
|
67
|
nuclear@0
|
68 if(tex_width == width && tex_height == height) {
|
nuclear@0
|
69 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_width, tex_height, 0,
|
nuclear@0
|
70 GL_RGB, GL_UNSIGNED_BYTE, pixels);
|
nuclear@0
|
71 } else {
|
nuclear@0
|
72 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_width, tex_height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
|
nuclear@0
|
73 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
|
nuclear@0
|
74 GL_RGB, GL_UNSIGNED_BYTE, pixels);
|
nuclear@0
|
75 }
|
nuclear@0
|
76
|
nuclear@0
|
77 return texture;
|
nuclear@0
|
78 }
|
nuclear@0
|
79
|
nuclear@0
|
80 static unsigned int next_pow2(unsigned int x)
|
nuclear@0
|
81 {
|
nuclear@0
|
82 --x;
|
nuclear@0
|
83 x |= x >> 1;
|
nuclear@0
|
84 x |= x >> 2;
|
nuclear@0
|
85 x |= x >> 4;
|
nuclear@0
|
86 x |= x >> 8;
|
nuclear@0
|
87 x |= x >> 16;
|
nuclear@0
|
88 return x + 1;
|
nuclear@0
|
89 }
|