Merge branch GLdc:master into glCompressedTexSubImage2D-recreated
This commit is contained in:
commit
9d2c1fb3e8
4
GL/glu.c
4
GL/glu.c
@ -4,9 +4,9 @@
|
||||
/* Set the Perspective */
|
||||
void APIENTRY gluPerspective(GLdouble angle, GLdouble aspect,
|
||||
GLdouble znear, GLdouble zfar) {
|
||||
GLfloat fW, fH;
|
||||
GLdouble fW, fH;
|
||||
|
||||
fH = tanf(angle * (M_PI / 360.0f)) * znear;
|
||||
fH = tan(angle * (M_PI / 360.0)) * znear;
|
||||
fW = fH * aspect;
|
||||
|
||||
glFrustum(-fW, fW, -fH, fH, znear, zfar);
|
||||
|
@ -14,27 +14,7 @@
|
||||
GLfloat global_diffuse[] = {1.0, 1.0, 1.0, 1.0};
|
||||
GLfloat global_ambient[] = {1.0, 1.0, 1.0, 1.0};
|
||||
|
||||
|
||||
int dtex_to_gl_texture(texture *tex, char* filename) {
|
||||
// Load Texture
|
||||
Image *image;
|
||||
|
||||
// allocate space for texture
|
||||
image = (Image *) malloc(sizeof(Image));
|
||||
if (image == NULL) {
|
||||
printf("No memory for .DTEX file\n");
|
||||
return(0);
|
||||
}
|
||||
|
||||
FILE* file = NULL;
|
||||
|
||||
// make sure the file is there.
|
||||
if ((file = fopen(filename, "rb")) == NULL)
|
||||
{
|
||||
printf("File not found");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int decode_dtex(Image* image, FILE* file) {
|
||||
struct {
|
||||
char id[4]; // 'DTEX'
|
||||
GLushort width;
|
||||
@ -45,9 +25,9 @@ int dtex_to_gl_texture(texture *tex, char* filename) {
|
||||
|
||||
fread(&header, sizeof(header), 1, file);
|
||||
|
||||
GLboolean twiddled = (header.type & (1 << 26)) < 1;
|
||||
GLboolean compressed = (header.type & (1 << 30)) > 0;
|
||||
GLboolean mipmapped = (header.type & (1 << 31)) > 0;
|
||||
image->twiddled = (header.type & (1 << 26)) < 1;
|
||||
image->compressed = (header.type & (1 << 30)) > 0;
|
||||
image->mipmapped = (header.type & (1 << 31)) > 0;
|
||||
GLuint format = (header.type >> 27) & 0b111;
|
||||
|
||||
image->data = (char *) malloc (header.size);
|
||||
@ -55,134 +35,148 @@ int dtex_to_gl_texture(texture *tex, char* filename) {
|
||||
image->sizeY = header.height;
|
||||
image->dataSize = header.size;
|
||||
|
||||
GLuint expected = 2 * header.width * header.height;
|
||||
GLuint ratio = (GLuint) (((GLfloat) expected) / ((GLfloat) header.size));
|
||||
|
||||
fread(image->data, image->dataSize, 1, file);
|
||||
fclose(file);
|
||||
|
||||
if(compressed) {
|
||||
printf("Compressed - ");
|
||||
if(twiddled) {
|
||||
printf("Twiddled - ");
|
||||
if(image->compressed && image->twiddled) {
|
||||
switch(format) {
|
||||
case 0: {
|
||||
if(mipmapped) {
|
||||
case 0:
|
||||
puts("Compressed & Twiddled - ARGB 1555");
|
||||
if(image->mipmapped) {
|
||||
image->internalFormat = GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_TWID_KOS;
|
||||
} else {
|
||||
image->internalFormat = GL_COMPRESSED_ARGB_1555_VQ_TWID_KOS;
|
||||
}
|
||||
} break;
|
||||
case 1: {
|
||||
if(mipmapped) {
|
||||
return 1;
|
||||
|
||||
case 1:
|
||||
puts("Compressed & Twiddled - RGB 565");
|
||||
if(image->mipmapped) {
|
||||
image->internalFormat = GL_COMPRESSED_RGB_565_VQ_MIPMAP_TWID_KOS;
|
||||
} else {
|
||||
image->internalFormat = GL_COMPRESSED_RGB_565_VQ_TWID_KOS;
|
||||
}
|
||||
} break;
|
||||
case 2: {
|
||||
if(mipmapped) {
|
||||
return 1;
|
||||
|
||||
case 2:
|
||||
puts("Compressed & Twiddled - ARGB 4444");
|
||||
if(image->mipmapped) {
|
||||
image->internalFormat = GL_COMPRESSED_ARGB_4444_VQ_MIPMAP_TWID_KOS;
|
||||
} else {
|
||||
image->internalFormat = GL_COMPRESSED_ARGB_4444_VQ_TWID_KOS;
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Invalid texture format");
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
} else if (image->compressed) {
|
||||
switch(format) {
|
||||
case 0: {
|
||||
if(mipmapped) {
|
||||
case 0:
|
||||
puts("Compressed - ARGB 1555");
|
||||
if(image->mipmapped) {
|
||||
image->internalFormat = GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_KOS;
|
||||
} else {
|
||||
image->internalFormat = GL_COMPRESSED_ARGB_1555_VQ_KOS;
|
||||
}
|
||||
} break;
|
||||
case 1: {
|
||||
if(mipmapped) {
|
||||
return 1;
|
||||
|
||||
case 1:
|
||||
puts("Compressed - RGB 565");
|
||||
if(image->mipmapped) {
|
||||
image->internalFormat = GL_COMPRESSED_RGB_565_VQ_MIPMAP_KOS;
|
||||
} else {
|
||||
image->internalFormat = GL_COMPRESSED_RGB_565_VQ_KOS;
|
||||
}
|
||||
} break;
|
||||
case 2: {
|
||||
if(mipmapped) {
|
||||
return 1;
|
||||
|
||||
case 2:
|
||||
puts("Compressed - ARGB 4444");
|
||||
if(image->mipmapped) {
|
||||
image->internalFormat = GL_COMPRESSED_ARGB_4444_VQ_MIPMAP_KOS;
|
||||
} else {
|
||||
image->internalFormat = GL_COMPRESSED_ARGB_4444_VQ_KOS;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Invalid texture format");
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
printf("Uncompressed - ");
|
||||
//printf("Color:%u -", format);
|
||||
switch(format) {
|
||||
|
||||
switch (format) {
|
||||
case 0:
|
||||
image->internalFormat = GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS;
|
||||
//image->internalFormat = GL_UNSIGNED_SHORT_1_5_5_5_REV;
|
||||
break;
|
||||
puts("Uncompressed - ARGB 1555");
|
||||
image->internalFormat = GL_ARGB1555_TWID_KOS;
|
||||
image->transferFormat = GL_BGRA;
|
||||
image->transferType = GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS;
|
||||
return 1;
|
||||
|
||||
case 1:
|
||||
image->internalFormat = GL_UNSIGNED_SHORT_5_6_5_REV;
|
||||
break;
|
||||
puts("Uncompressed - RGB 565");
|
||||
image->internalFormat = GL_RGB565_TWID_KOS;
|
||||
image->transferFormat = GL_RGB;
|
||||
image->transferType = GL_UNSIGNED_SHORT_5_6_5_TWID_KOS;
|
||||
return 1;
|
||||
|
||||
case 2:
|
||||
image->internalFormat = GL_UNSIGNED_SHORT_4_4_4_4_REV;
|
||||
break;
|
||||
puts("Uncompressed - ARGB 4444");
|
||||
image->internalFormat = GL_ARGB4444_TWID_KOS;
|
||||
image->transferFormat = GL_BGRA;
|
||||
image->transferType = GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
fprintf(stderr, "Invalid texture format %u\n", header.type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dtex_to_gl_texture(texture *tex, char* filename) {
|
||||
// Load Texture
|
||||
Image image = { 0 };
|
||||
|
||||
FILE* file = NULL;
|
||||
|
||||
// make sure the file is there.
|
||||
if ((file = fopen(filename, "rb")) == NULL)
|
||||
{
|
||||
printf("File not found");
|
||||
return 0;
|
||||
}
|
||||
|
||||
decode_dtex(&image, file);
|
||||
|
||||
// Create Texture
|
||||
GLuint texture_id;
|
||||
glGenTextures(1, &texture_id);
|
||||
glBindTexture(GL_TEXTURE_2D, texture_id); // 2d texture (x and y size)
|
||||
|
||||
GLint newFormat = format;
|
||||
GLint colorType = GL_RGB;
|
||||
|
||||
if (image->internalFormat == GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS ||
|
||||
image->internalFormat == GL_UNSIGNED_SHORT_4_4_4_4_REV){
|
||||
newFormat = GL_BGRA;
|
||||
colorType = GL_RGBA;
|
||||
printf("Reversing RGBA\n");
|
||||
}
|
||||
|
||||
if (image->internalFormat == GL_UNSIGNED_SHORT_5_6_5_REV){
|
||||
newFormat = GL_RGB;
|
||||
colorType = GL_RGB;
|
||||
printf("Reversing RGB\n");
|
||||
}
|
||||
|
||||
if (image.compressed) {
|
||||
glCompressedTexImage2D(GL_TEXTURE_2D, 0,
|
||||
image.internalFormat, image.sizeX, image.sizeY,
|
||||
0, image.dataSize, image.data);
|
||||
} else {
|
||||
glTexImage2D(GL_TEXTURE_2D, 0,
|
||||
colorType, image->sizeX, image->sizeY, 0,
|
||||
newFormat, image->internalFormat, image->data);
|
||||
image.internalFormat, image.sizeX, image.sizeY, 0,
|
||||
image.transferFormat, image.transferType, image.data);
|
||||
}
|
||||
|
||||
tex->id = texture_id;
|
||||
tex->w = image->sizeX;
|
||||
tex->h = image->sizeY;
|
||||
tex->w = image.sizeX;
|
||||
tex->h = image.sizeY;
|
||||
tex->u = 0.f;
|
||||
tex->v = 0.f;
|
||||
tex->a = tex->light = 1;
|
||||
tex->color[0] = tex->color[1] = tex->color[2] = 1.0f;
|
||||
tex->uSize = tex->vSize = 1.0f;
|
||||
tex->xScale = tex->yScale = 1.0f;
|
||||
tex->format = image->internalFormat;
|
||||
tex->format = image.internalFormat;
|
||||
tex->min_filter = tex->mag_filter = GL_NEAREST;
|
||||
tex->blend_source = GL_SRC_ALPHA;
|
||||
tex->blend_dest = GL_ONE_MINUS_SRC_ALPHA;
|
||||
strcpy(tex->path, filename);
|
||||
|
||||
printf("Texture size: %lu x %lu\n", image->sizeX, image->sizeY);
|
||||
GLuint expected = 2 * image.sizeX * image.sizeY;
|
||||
GLuint ratio = (GLuint) (((GLfloat) expected) / ((GLfloat) image.dataSize));
|
||||
|
||||
printf("Texture size: %lu x %lu\n", image.sizeX, image.sizeY);
|
||||
printf("Texture ratio: %d\n", ratio);
|
||||
printf("Texture size: %lu x %lu\n", image->sizeX, image->sizeY);
|
||||
printf("Texture size: %lu x %lu\n", image.sizeX, image.sizeY);
|
||||
printf("Texture %s loaded\n", tex->path);
|
||||
|
||||
return(1);
|
||||
|
@ -29,8 +29,8 @@ typedef struct Image {
|
||||
unsigned long sizeX;
|
||||
unsigned long sizeY;
|
||||
char *data;
|
||||
GLenum internalFormat;
|
||||
GLboolean mipmapped;
|
||||
GLenum internalFormat, transferFormat, transferType;
|
||||
unsigned int mipmapped, compressed, twiddled;
|
||||
unsigned int dataSize;
|
||||
} Image;
|
||||
|
||||
|
@ -88,7 +88,7 @@ void DrawGLScene()
|
||||
glLoadIdentity();
|
||||
glTranslated(-1 , -1, -5);
|
||||
glDepthFunc(GL_LESS);
|
||||
glEnable(GL_DEPTH_FUNC);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
glTranslated(0.5, 0, -0.2);
|
||||
|
Loading…
Reference in New Issue
Block a user