diff --git a/Quake/gl_sky.c b/Quake/gl_sky.c index b81e4a01..6cc522c1 100644 --- a/Quake/gl_sky.c +++ b/Quake/gl_sky.c @@ -63,8 +63,8 @@ int st_to_vec[6][3] = {-3,1,2}, {1,3,2}, {-1,-3,2}, - {-2,-1,3}, // straight up - {2,-1,-3} // straight down + {-2,-1,3}, // straight up + {2,-1,-3} // straight down }; int vec_to_st[6][3] = @@ -95,44 +95,38 @@ A sky texture is 256*128, with the left side being a masked overlay void Sky_LoadTexture (texture_t *mt) { char texturename[64]; - int i, j, p, r, g, b, count; - byte *src; - static byte front_data[128*128]; //FIXME: Hunk_Alloc - static byte back_data[128*128]; //FIXME: Hunk_Alloc - unsigned *rgba; + unsigned x, y, p, r, g, b, count, halfwidth, *rgba; + byte *src, *front_data, *back_data; if (mt->width != 256 || mt->height != 128) - Sys_Error ("Sky texture %s has wrong size (%d x %d)", mt->name, mt->width, mt->height); + { + Con_Warning ("Sky texture %s is %d x %d, expected 256 x 128\n", mt->name, mt->width, mt->height); + if (mt->width < 2 || mt->height < 1) + return; + } + halfwidth = mt->width / 2; + back_data = (byte *) Hunk_AllocName (halfwidth*mt->height*2, "skytex"); + front_data = back_data + halfwidth*mt->height; src = (byte *)(mt + 1); // extract back layer and upload - for (i=0 ; i<128 ; i++) - for (j=0 ; j<128 ; j++) - back_data[(i*128) + j] = src[i*256 + j + 128]; + for (y=0 ; yheight ; y++) + memcpy (back_data + y*halfwidth, src + halfwidth + y*mt->width, halfwidth); q_snprintf(texturename, sizeof(texturename), "%s:%s_back", loadmodel->name, mt->name); - solidskytexture = TexMgr_LoadImage (loadmodel, texturename, 128, 128, SRC_INDEXED, back_data, "", (src_offset_t)back_data, TEXPREF_NONE); + solidskytexture = TexMgr_LoadImage (loadmodel, texturename, halfwidth, mt->height, SRC_INDEXED, back_data, "", (src_offset_t)back_data, TEXPREF_NONE); // extract front layer and upload - for (i=0 ; i<128 ; i++) - for (j=0 ; j<128 ; j++) - { - front_data[(i*128) + j] = src[i*256 + j]; - if (front_data[(i*128) + j] == 0) - front_data[(i*128) + j] = 255; - } - - q_snprintf(texturename, sizeof(texturename), "%s:%s_front", loadmodel->name, mt->name); - alphaskytexture = TexMgr_LoadImage (loadmodel, texturename, 128, 128, SRC_INDEXED, front_data, "", (src_offset_t)front_data, TEXPREF_ALPHA); - -// calculate r_fastsky color based on average of all opaque foreground colors r = g = b = count = 0; - for (i=0 ; i<128 ; i++) - for (j=0 ; j<128 ; j++) + for (y=0 ; yheight ; src+=mt->width, front_data+=halfwidth, y++) + { + for (x=0 ; xheight; + q_snprintf(texturename, sizeof(texturename), "%s:%s_front", loadmodel->name, mt->name); + alphaskytexture = TexMgr_LoadImage (loadmodel, texturename, halfwidth, mt->height, SRC_INDEXED, front_data, "", (src_offset_t)front_data, TEXPREF_ALPHA); + +// calculate r_fastsky color based on average of all opaque foreground colors skyflatcolor[0] = (float)r/(count*255); skyflatcolor[1] = (float)g/(count*255); skyflatcolor[2] = (float)b/(count*255); @@ -156,23 +158,30 @@ Quake64 sky textures are 32*64 void Sky_LoadTextureQ64 (texture_t *mt) { char texturename[64]; - int i, p, r, g, b, count; + unsigned i, p, r, g, b, count, halfheight, *rgba; byte *front, *back, *front_rgba; - unsigned *rgba; + + if (mt->width != 32 || mt->height != 64) + { + Con_DWarning ("Q64 sky texture %s is %d x %d, expected 32 x 64\n", mt->name, mt->width, mt->height); + if (mt->width < 1 || mt->height < 2) + return; + } // pointers to both layer textures + halfheight = mt->height / 2; front = (byte *)(mt+1); - back = (byte *)(mt+1) + (32*32); - front_rgba = (byte *) Hunk_Alloc(4*(32*32)); + back = (byte *)(mt+1) + mt->width*halfheight; + front_rgba = (byte *) Hunk_AllocName (4*mt->width*halfheight, "q64_skytex"); // Normal indexed texture for the back layer q_snprintf(texturename, sizeof(texturename), "%s:%s_back", loadmodel->name, mt->name); - solidskytexture = TexMgr_LoadImage (loadmodel, texturename, 32, 32, SRC_INDEXED, back, "", (src_offset_t)back, TEXPREF_NONE); - + solidskytexture = TexMgr_LoadImage (loadmodel, texturename, mt->width, halfheight, SRC_INDEXED, back, "", (src_offset_t)back, TEXPREF_NONE); + // front layer, convert to RGBA and upload p = r = g = b = count = 0; - for (i=0 ; i < (32*32) ; i++) + for (i=mt->width*halfheight ; i!=0 ; i--) { rgba = &d_8to24table[*front++]; @@ -182,7 +191,7 @@ void Sky_LoadTextureQ64 (texture_t *mt) front_rgba[p++] = ((byte*)rgba)[2]; // Alpha front_rgba[p++] = 128; // this look ok to me! - + // Fast sky r += ((byte *)rgba)[0]; g += ((byte *)rgba)[1]; @@ -191,7 +200,7 @@ void Sky_LoadTextureQ64 (texture_t *mt) } q_snprintf(texturename, sizeof(texturename), "%s:%s_front", loadmodel->name, mt->name); - alphaskytexture = TexMgr_LoadImage (loadmodel, texturename, 32, 32, SRC_RGBA, front_rgba, "", (src_offset_t)front_rgba, TEXPREF_NONE); + alphaskytexture = TexMgr_LoadImage (loadmodel, texturename, mt->width, halfheight, SRC_RGBA, front_rgba, "", (src_offset_t)front_rgba, TEXPREF_ALPHA); // calculate r_fastsky color based on average of all opaque foreground colors skyflatcolor[0] = (float)r/(count*255); @@ -331,7 +340,7 @@ void Sky_NewMap (void) if (!strcmp("skyfog", key)) skyfog = atof(value); -#if 1 //also accept non-standard keys +#if 1 /* also accept non-standard keys */ else if (!strcmp("skyname", key)) //half-life Sky_LoadSkyBox(value); else if (!strcmp("qlsky", key)) //quake lives @@ -768,7 +777,7 @@ void Sky_DrawSkyBox (void) GL_Bind (skybox_textures[skytexorder[i]]); -#if 1 //FIXME: this is to avoid tjunctions until i can do it the right way +#if 1 /* FIXME: this is to avoid tjunctions until i can do it the right way */ skymins[0][i] = -1; skymins[1][i] = -1; skymaxs[0][i] = 1;