pplugins/pui/textures.cpp

91 lines
2.5 KiB
C++

#include <cstdlib>
#include <cmath>
#include <pugl/pugl.h>
#include "pui.h"
#include "textures/slider1-vert.c"
#include "textures/slider1-vert-prelight.c"
#include "textures/trough1-vertical.c"
#include "textures/slider2-vert.c"
#include "textures/slider2-vert-prelight.c"
#include "textures/trough2-vertical.c"
#include "textures/knob4.c"
void PTextures::BindTexture(int texture, int width, int height, const unsigned char *data, int format)
{
glBindTexture(GL_TEXTURE_2D, tex[texture]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_UNSIGNED_BYTE, data);
w[texture] = width;
h[texture] = height;
}
void PTextures::InitTextures()
{
if (initialised) return;
initialised = true;
glGenTextures(TEX_END, this->tex);
/* Texture buffer for generated textures */
int size = 128;
w[TEX_BACKTILE] = h[TEX_BACKTILE] = size;
uint8_t *buffer = new uint8_t[size * size];
/* Create background tile */
for (int i = 0; i < size * size; i++) {
/* Normalised noise */
int r = 0;
for (int j = 0; j < 4; j++) r += (rand() & 0x1F);
buffer[i] = (r >> 2) + 0x30;
}
BindTexture(TEX_BACKTILE, size, size, buffer, GL_LUMINANCE);
/* Create glow, focused at 1/3 down the window */
int cx = size / 2;
int cy = size / 3;
for (int y = 0; y < size; y++) {
for (int x = 0; x < size; x++) {
float b = 196 - sqrtf((cx - x) * (cx - x) + (cy - y) * (cy - y)) * 256 / size;
if (b < 0) b = 0;
buffer[x + y * size] = b;
}
}
BindTexture(TEX_BACKGLOW, size, size, buffer, GL_LUMINANCE);
delete buffer;
BindTexture(TEX_SLIDER1,
slider1_vert.width,
slider1_vert.height,
slider1_vert.pixel_data);
BindTexture(TEX_SLIDER1_PRE,
slider1_vert_prelight.width,
slider1_vert_prelight.height,
slider1_vert_prelight.pixel_data);
BindTexture(TEX_TROUGH1,
trough1_vertical.width,
trough1_vertical.height,
trough1_vertical.pixel_data);
BindTexture(TEX_SLIDER2,
slider2_vert.width,
slider2_vert.height,
slider2_vert.pixel_data);
BindTexture(TEX_SLIDER2_PRE,
slider2_vert_prelight.width,
slider2_vert_prelight.height,
slider2_vert_prelight.pixel_data);
BindTexture(TEX_TROUGH2,
trough2_vertical.width,
trough2_vertical.height,
trough2_vertical.pixel_data);
BindTexture(TEX_KNOB,
knob4.width,
knob4.height,
knob4.pixel_data);
}