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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
#include <Texture.h>
#include <string.h>
struct texture_t {
char *name;
GLuint tex;
} __attribute__ ((packed));
struct texture_t *LoadedTexture[256];
unsigned int LoadedTextureCounter = 0;
namespace Texture{
Color pixels[8][4];
GLuint loadTexture(const char *fileName){
SDL_Surface *image;
GLuint object = 0;
for(unsigned int i=0;i<LoadedTextureCounter;i++){
if(!strcmp(LoadedTexture[i]->name,fileName)){
#ifdef DEBUG
DEBUG_printf("Reusing loaded texture for %s\n",fileName);
#endif // DEBUG
return LoadedTexture[i]->tex;
}
}
if(!fileName)
return 0;
if(!(image = IMG_Load(fileName)))
return 0;
#ifdef DEBUG
DEBUG_printf("Loaded image file: %s\n", fileName);
#endif // DEBUG
glGenTextures(1,&object); // Turns "object" into a texture
glBindTexture(GL_TEXTURE_2D,object); // Binds "object" to the top of the stack
glPixelStoref(GL_UNPACK_ALIGNMENT,1);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Sets the "min" filter
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // The the "max" filter of the stack
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // Wrap the texture to the matrix
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //
glTexImage2D(GL_TEXTURE_2D, // Sets the texture to the image file loaded above
0,
GL_RGBA,
image->w,
image->h,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
image->pixels
);
SDL_FreeSurface(image); // Free the surface
LoadedTexture[LoadedTextureCounter] = new struct texture_t; //(struct texture_t *)malloc(sizeof(struct texture_t));
LoadedTexture[LoadedTextureCounter]->name = new char[strlen(fileName)+1]; //(char *)malloc(safe_strlen(fileName));
LoadedTexture[LoadedTextureCounter]->tex = object;
strcpy(LoadedTexture[LoadedTextureCounter]->name,fileName);
LoadedTextureCounter++;
return object;
}
void initColorIndex(){
colorIndex = loadTexture("assets/colorIndex.png");
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, colorIndex);
GLubyte* buffer = new GLubyte[8*4*3];
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
uint i = 0;
for(uint o = 0; o < 8; o++){
for(uint t = 0; t < 4; t++){
for (int r = 0; r < 3; r++){
pixels[o][t].red = buffer[i++];
pixels[o][t].green = buffer[i++];
pixels[o][t].blue = buffer[i++];
std::cout << pixels[o][t].red << "," << pixels[o][t].green << "," << pixels[o][t].blue << std::endl;
}
//std::cout << std::endl;
}
}
}
//sqrt((255-145)^2+(90-145)^2+(0-0)^2);
vec2 getIndex(Color c){
uint buf[2];
float buff = 999;
float shit = 999;
for(uint o = 0; o < 8; o++){
for(uint t = 0; t < 4; t++){
buff = sqrt(pow((c.red-pixels[o][t].red),2)+pow((c.green-pixels[o][t].green),2)+pow((c.blue-pixels[o][t].blue),2));
//std::cout << buff << std::endl;
if(buff < shit){
shit = buff;
buf[0] = o;
buf[1] = t;
}
}
}
std::cout << float(buf[1]) << ", " << float(buf[0]) << std::endl;
return {float(buf[1]),float(buf[0])};
}
}
Texturec::Texturec(uint amt, ...){
va_list fNames;
texState = 0;
image = new GLuint[amt];
va_start(fNames, amt);
for(unsigned int i = 0; i < amt; i++){
image[i] = Texture::loadTexture(va_arg(fNames, char *));
}
va_end(fNames);
}
Texturec::Texturec(uint amt,const char **paths){
texState = 0;
image = new GLuint[amt];
for(unsigned int i = 0; i < amt; i++){
image[i] = Texture::loadTexture(paths[i]);
}
}
Texturec::~Texturec(){
delete[] image;
}
void Texturec::bind(unsigned int bn){
texState = bn;
glBindTexture(GL_TEXTURE_2D,image[(int)texState]);
}
void Texturec::bindNext(){
bind(++texState);
}
void Texturec::bindPrev(){
bind(--texState);
}
|