X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=r_sky.c;h=fa9c0df2e5dcef4de198efb8048cc46522198c2f;hb=f884a4dc2bac759f71ee44d5d6e8040feda71e22;hp=505db1a50b5a9daf86530a568de088ba7927610d;hpb=699c77ca2c9fd357fbe479f00e778486becfd840;p=xonotic%2Fdarkplaces.git diff --git a/r_sky.c b/r_sky.c index 505db1a5..fa9c0df2 100644 --- a/r_sky.c +++ b/r_sky.c @@ -4,13 +4,11 @@ // FIXME: fix skybox after vid_restart cvar_t r_sky = {CVAR_SAVE, "r_sky", "1"}; -qboolean skyavailable_quake; -qboolean skyavailable_box; +cvar_t r_skyscroll1 = {CVAR_SAVE, "r_skyscroll1", "1"}; +cvar_t r_skyscroll2 = {CVAR_SAVE, "r_skyscroll2", "2"}; int skyrendernow; int skyrendermasked; -static rtexture_t *solidskytexture; -static rtexture_t *alphaskytexture; static int skyrendersphere; static int skyrenderbox; static rtexturepool_t *skytexturepool; @@ -41,12 +39,12 @@ static suffixinfo_t suffix[3][6] = {"negz", false, false, false} }, { - {"rt", true, false, true}, - {"lf", false, true, true}, - {"ft", true, true, false}, - {"bk", false, false, false}, - {"up", true, false, true}, - {"dn", true, false, true} + {"rt", false, false, true}, + {"lf", true, true, true}, + {"bk", false, true, false}, + {"ft", true, false, false}, + {"up", false, false, true}, + {"dn", false, false, true} } }; @@ -60,9 +58,9 @@ void R_SkyStartFrame(void) skyrendermasked = false; if (r_sky.integer && !fogenabled) { - if (skyavailable_box) + if (skyboxside[0] || skyboxside[1] || skyboxside[2] || skyboxside[3] || skyboxside[4] || skyboxside[5]) skyrenderbox = true; - else if (skyavailable_quake) + else if (r_refdef.worldmodel->brush.solidskytexture) skyrendersphere = true; // for depth-masked sky, render the sky on the first sky surface encountered skyrendernow = true; @@ -88,26 +86,29 @@ void R_UnloadSkyBox(void) void R_LoadSkyBox(void) { - int i, j; + int i, j, success; int indices[4] = {0,1,2,3}; char name[1024]; qbyte *image_rgba; qbyte *temp; + R_UnloadSkyBox(); + if (!skyname[0]) return; for (j=0; j<3; j++) { + success = 0; for (i=0; i<6; i++) { - if (snprintf(name, sizeof(name), "%s_%s", skyname, suffix[j][i].suffix) >= (int)sizeof(name) || !(image_rgba = loadimagepixels(name, false, 0, 0))) + if (dpsnprintf(name, sizeof(name), "%s_%s", skyname, suffix[j][i].suffix) < 0 || !(image_rgba = loadimagepixels(name, false, 0, 0))) { - if (snprintf(name, sizeof(name), "%s%s", skyname, suffix[j][i].suffix) >= (int)sizeof(name) || !(image_rgba = loadimagepixels(name, false, 0, 0))) + if (dpsnprintf(name, sizeof(name), "%s%s", skyname, suffix[j][i].suffix) < 0 || !(image_rgba = loadimagepixels(name, false, 0, 0))) { - if (snprintf(name, sizeof(name), "env/%s%s", skyname, suffix[j][i].suffix) >= (int)sizeof(name) || !(image_rgba = loadimagepixels(name, false, 0, 0))) + if (dpsnprintf(name, sizeof(name), "env/%s%s", skyname, suffix[j][i].suffix) < 0 || !(image_rgba = loadimagepixels(name, false, 0, 0))) { - if (snprintf(name, sizeof(name), "gfx/env/%s%s", skyname, suffix[j][i].suffix) >= (int)sizeof(name) || !(image_rgba = loadimagepixels(name, false, 0, 0))) + if (dpsnprintf(name, sizeof(name), "gfx/env/%s%s", skyname, suffix[j][i].suffix) < 0 || !(image_rgba = loadimagepixels(name, false, 0, 0))) continue; } } @@ -117,22 +118,15 @@ void R_LoadSkyBox(void) skyboxside[i] = R_LoadTexture2D(skytexturepool, va("skyboxside%d", i), image_width, image_height, temp, TEXTYPE_RGBA, TEXF_CLAMP | TEXF_PRECACHE, NULL); Mem_Free(image_rgba); Mem_Free(temp); + success++; } - for (i=0; i<6; i++) - { - if (skyboxside[i] == NULL) - { - R_UnloadSkyBox(); - break; - } - } - - if (skyboxside[0] != NULL) - return; + if (success) + break; } - Con_Printf ("Failed to load %s as skybox\n", skyname); + if (j == 3) + Con_Printf ("Failed to load %s as skybox\n", skyname); } int R_SetSkyBox(const char *sky) @@ -146,20 +140,12 @@ int R_SetSkyBox(const char *sky) return false; } - skyavailable_box = false; strcpy(skyname, sky); - R_UnloadSkyBox(); R_LoadSkyBox(); if (!skyname[0]) return true; - - if (skyboxside[0] || skyboxside[1] || skyboxside[2] || skyboxside[3] || skyboxside[4] || skyboxside[5]) - { - skyavailable_box = true; - return true; - } return false; } @@ -288,7 +274,7 @@ static void R_SkyBox(void) GL_Color(1, 1, 1, 1); memset(&m, 0, sizeof(m)); GL_BlendFunc(GL_ONE, GL_ZERO); - GL_DepthMask(true); + GL_DepthMask(false); GL_DepthTest(false); // don't modify or read zbuffer m.pointer_vertex = skyboxvertex3f; m.pointer_texcoord[0] = skyboxtexcoord2f; @@ -297,7 +283,7 @@ static void R_SkyBox(void) { m.tex[0] = R_GetTexture(skyboxside[i]); R_Mesh_State(&m); - R_Mesh_Draw(6*4, 2, skyboxelements + i * 6); + R_Mesh_Draw(0, 6*4, 2, skyboxelements + i * 6); } GL_LockArrays(0, 0); } @@ -372,14 +358,16 @@ static void R_SkySphere(void) skyspherecalc(); } + // wrap the scroll values just to be extra kind to float accuracy + // scroll speed for upper layer - speedscale = cl.time*8.0/128.0; - // wrap the scroll just to be extra kind to float accuracy + speedscale = r_refdef.time*r_skyscroll1.value*8.0/128.0; speedscale -= (int)speedscale; - - // scroll the lower cloud layer twice as fast (just like quake did) Matrix4x4_CreateTranslate(&scroll1matrix, speedscale, speedscale, 0); - Matrix4x4_CreateTranslate(&scroll2matrix, speedscale * 2, speedscale * 2, 0); + // scroll speed for lower layer (transparent layer) + speedscale = r_refdef.time*r_skyscroll2.value*8.0/128.0; + speedscale -= (int)speedscale; + Matrix4x4_CreateTranslate(&scroll2matrix, speedscale, speedscale, 0); GL_Color(1, 1, 1, 1); GL_BlendFunc(GL_ONE, GL_ZERO); @@ -387,19 +375,19 @@ static void R_SkySphere(void) GL_DepthTest(false); // don't modify or read zbuffer memset(&m, 0, sizeof(m)); m.pointer_vertex = skysphere_vertex3f; - m.tex[0] = R_GetTexture(solidskytexture); + m.tex[0] = R_GetTexture(r_refdef.worldmodel->brush.solidskytexture); m.pointer_texcoord[0] = skysphere_texcoord2f; m.texmatrix[0] = scroll1matrix; if (r_textureunits.integer >= 2) { // one pass using GL_DECAL or GL_INTERPOLATE_ARB for alpha layer - m.tex[1] = R_GetTexture(alphaskytexture); + m.tex[1] = R_GetTexture(r_refdef.worldmodel->brush.alphaskytexture); m.texcombinergb[1] = gl_combine.integer ? GL_INTERPOLATE_ARB : GL_DECAL; m.pointer_texcoord[1] = skysphere_texcoord2f; m.texmatrix[1] = scroll2matrix; R_Mesh_State(&m); GL_LockArrays(0, skysphere_numverts); - R_Mesh_Draw(skysphere_numverts, skysphere_numtriangles, skysphere_element3i); + R_Mesh_Draw(0, skysphere_numverts, skysphere_numtriangles, skysphere_element3i); GL_LockArrays(0, 0); } else @@ -407,15 +395,15 @@ static void R_SkySphere(void) // two pass R_Mesh_State(&m); GL_LockArrays(0, skysphere_numverts); - R_Mesh_Draw(skysphere_numverts, skysphere_numtriangles, skysphere_element3i); + R_Mesh_Draw(0, skysphere_numverts, skysphere_numtriangles, skysphere_element3i); GL_LockArrays(0, 0); GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - m.tex[0] = R_GetTexture(alphaskytexture); + m.tex[0] = R_GetTexture(r_refdef.worldmodel->brush.alphaskytexture); m.texmatrix[0] = scroll2matrix; R_Mesh_State(&m); GL_LockArrays(0, skysphere_numverts); - R_Mesh_Draw(skysphere_numverts, skysphere_numtriangles, skysphere_element3i); + R_Mesh_Draw(0, skysphere_numverts, skysphere_numtriangles, skysphere_element3i); GL_LockArrays(0, 0); } } @@ -451,94 +439,16 @@ void R_Sky(void) //=============================================================== -/* -============= -R_InitSky - -A sky texture is 256*128, with the right side being a masked overlay -============== -*/ -void R_InitSky (qbyte *src, int bytesperpixel) -{ - int i, j; - unsigned solidpixels[128*128], alphapixels[128*128]; - - skyavailable_quake = true; - - // flush skytexturepool so we won't build up a leak from uploading textures multiple times - R_FreeTexturePool(&skytexturepool); - skytexturepool = R_AllocTexturePool(); - solidskytexture = NULL; - alphaskytexture = NULL; - - if (bytesperpixel == 4) - { - for (i = 0;i < 128;i++) - { - for (j = 0;j < 128;j++) - { - solidpixels[(i*128) + j] = ((unsigned *)src)[i*256+j+128]; - alphapixels[(i*128) + j] = ((unsigned *)src)[i*256+j]; - } - } - } - else - { - // make an average value for the back to avoid - // a fringe on the top level - int p, r, g, b; - union - { - unsigned int i; - unsigned char b[4]; - } - rgba; - r = g = b = 0; - for (i = 0;i < 128;i++) - { - for (j = 0;j < 128;j++) - { - rgba.i = palette_complete[src[i*256 + j + 128]]; - r += rgba.b[0]; - g += rgba.b[1]; - b += rgba.b[2]; - } - } - rgba.b[0] = r/(128*128); - rgba.b[1] = g/(128*128); - rgba.b[2] = b/(128*128); - rgba.b[3] = 0; - for (i = 0;i < 128;i++) - { - for (j = 0;j < 128;j++) - { - solidpixels[(i*128) + j] = palette_complete[src[i*256 + j + 128]]; - alphapixels[(i*128) + j] = (p = src[i*256 + j]) ? palette_complete[p] : rgba.i; - } - } - } - - solidskytexture = R_LoadTexture2D(skytexturepool, "sky_solidtexture", 128, 128, (qbyte *) solidpixels, TEXTYPE_RGBA, TEXF_PRECACHE, NULL); - alphaskytexture = R_LoadTexture2D(skytexturepool, "sky_alphatexture", 128, 128, (qbyte *) alphapixels, TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE, NULL); -} - -void R_ResetQuakeSky(void) -{ - skyavailable_quake = false; -} - void R_ResetSkyBox(void) { - skyboxside[0] = skyboxside[1] = skyboxside[2] = skyboxside[3] = skyboxside[4] = skyboxside[5] = NULL; + R_UnloadSkyBox(); skyname[0] = 0; - skyavailable_box = false; + R_LoadSkyBox(); } static void r_sky_start(void) { skytexturepool = R_AllocTexturePool(); - solidskytexture = NULL; - alphaskytexture = NULL; R_LoadSkyBox(); } @@ -546,20 +456,21 @@ static void r_sky_shutdown(void) { R_UnloadSkyBox(); R_FreeTexturePool(&skytexturepool); - solidskytexture = NULL; - alphaskytexture = NULL; } static void r_sky_newmap(void) { } + void R_Sky_Init(void) { Cmd_AddCommand ("loadsky", &LoadSky_f); Cvar_RegisterVariable (&r_sky); - R_ResetSkyBox(); - R_ResetQuakeSky(); + Cvar_RegisterVariable (&r_skyscroll1); + Cvar_RegisterVariable (&r_skyscroll2); + memset(&skyboxside, 0, sizeof(skyboxside)); + skyname[0] = 0; R_RegisterModule("R_Sky", r_sky_start, r_sky_shutdown, r_sky_newmap); }