#include "Texture.h"
#include "Shared.h"
static GLubyte smallTextureArray[32][32];
static GLubyte bigTextureArray[256][256][2];
GLuint theTexture = 0;
static void
SmoothTexture(void)
{
GLubyte filter[32][32];
float t;
for (int i = 1; i < 31; i++) {
for (int j = 1; j < 31; j++) {
t = (float)smallTextureArray[i][j] * 4;
t += (float)smallTextureArray[i - 1][j];
t += (float)smallTextureArray[i + 1][j];
t += (float)smallTextureArray[i][j - 1];
t += (float)smallTextureArray[i][j + 1];
t /= 8.0f;
filter[i][j] = (GLubyte) t;
}
}
for (int i = 1; i < 31; i++){
for (int j = 1; j < 31; j++)
smallTextureArray[i][j] = filter[i][j];
}
}
static void
SpeckleTexture(void)
{
int speck;
float t;
for (int i = 2; i < 30; i++) {
for (int j = 2; j < 30; j++) {
speck = 1;
while (speck <= 32 && random() % 2) {
t = (float) MIN_(255, smallTextureArray[i][j] + speck);
smallTextureArray[i][j] = (GLubyte)t;
speck += speck;
}
speck = 1;
while (speck <= 32 && random() % 2) {
t = (float)MAX_(0, smallTextureArray[i][j] - speck);
smallTextureArray[i][j] = (GLubyte)t;
speck += speck;
}
}
}
}
static void
MakeSmallTexture(void)
{
static int firstTime = 1;
if (firstTime) {
firstTime = 0;
for (int i = 0; i < 32; i++) {
for (int j = 0; j < 32; j++) {
float r = (float)sqrt((i - 15.5) * (i - 15.5) + (j - 15.5)
* (j - 15.5));
if (r > 15.0f)
smallTextureArray[i][j] = 0;
else {
float t = 255.0f * (float) cos(r * M_PI / 31.0);
smallTextureArray[i][j] = (GLubyte)t;
}
}
}
} else {
for (int i = 0; i < 32; i++) {
for (int j = 0; j < 32; j++) {
float t;
float r = (float)sqrt((i - 15.5) * (i - 15.5) + (j - 15.5)
* (j - 15.5));
if (r > 15.0f)
t = 0.0f;
else
t = 255.0f * (float) cos(r*M_PI/31.0);
smallTextureArray[i][j]
= (GLubyte)MIN_(255, (t + smallTextureArray[i][j]
+ smallTextureArray[i][j]) / 3);
}
}
}
SpeckleTexture();
SmoothTexture();
SmoothTexture();
}
static void
CopySmallTextureToBigTexture(int k, int l)
{
for (int i = 0; i < 32; i++) {
for (int j = 0; j < 32; j++) {
bigTextureArray[i + k][j + l][0] = smallTextureArray[i][j];
bigTextureArray[i + k][j + l][1] = smallTextureArray[i][j];
}
}
}
static void
AverageLastAndFirstTextures(void)
{
for (int i = 0; i < 32; i++) {
for (int j = 0; j < 32; j++) {
int t = (smallTextureArray[i][j] + bigTextureArray[i][j][0]) / 2;
smallTextureArray[i][j] = (GLubyte)MIN_(255, t);
}
}
}
void
MakeTexture()
{
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (i == 7 && j == 7)
AverageLastAndFirstTextures();
else
MakeSmallTexture();
CopySmallTextureToBigTexture(i * 32, j * 32);
}
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &theTexture);
glBindTexture(GL_TEXTURE_2D, theTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 2, 256, 256, GL_LUMINANCE_ALPHA,
GL_UNSIGNED_BYTE, bigTextureArray);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}