]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_sky.c
fix view blends so they are alpha, not additive
[xonotic/darkplaces.git] / r_sky.c
diff --git a/r_sky.c b/r_sky.c
index 72da6c915eac9797e823231363e59f53e4515ecc..deec343915c83d07bc49406215345ae01786f461 100644 (file)
--- a/r_sky.c
+++ b/r_sky.c
@@ -1,3 +1,4 @@
+
 #include "quakedef.h"
 
 void LoadSky_f(void);
@@ -231,27 +232,29 @@ static void R_SkyBox(void)
        R_SkyBoxPolyVec(2, 0, 1, -1, -1, -1);
        R_SkyBoxPolyVec(3, 0, 0, -1,  1, -1);
        R_Mesh_Draw(&m);
-       R_Mesh_Render();
-       if (r_skyflush.integer)
-               glFlush();
-       // clear the zbuffer that was used while rendering the sky
-       glClear(GL_DEPTH_BUFFER_BIT);
-       if (r_skyflush.integer)
-               glFlush();
 }
 
-static float skysphere[33*33*5];
-static int skysphereindices[32*32*6];
+#define skygridx 16
+#define skygridx1 (skygridx + 1)
+#define skygridxrecip (1.0f / (skygridx))
+#define skygridy 32
+#define skygridy1 (skygridy + 1)
+#define skygridyrecip (1.0f / (skygridy))
+
+static float skysphere[skygridx1*skygridy1*5];
+static int skysphereindices[skygridx*skygridy*6];
 static void skyspherecalc(float *sphere, float dx, float dy, float dz)
 {
        float a, b, x, ax, ay, v[3], length;
        int i, j, *index;
-       for (a = 0;a <= 1;a += (1.0 / 32.0))
+       for (j = 0;j <= skygridy;j++)
        {
+               a = j * skygridyrecip;
                ax = cos(a * M_PI * 2);
                ay = -sin(a * M_PI * 2);
-               for (b = 0;b <= 1;b += (1.0 / 32.0))
+               for (i = 0;i <= skygridx;i++)
                {
+                       b = i * skygridxrecip;
                        x = cos(b * M_PI * 2);
                        v[0] = ax*x * dx;
                        v[1] = ay*x * dy;
@@ -265,17 +268,17 @@ static void skyspherecalc(float *sphere, float dx, float dy, float dz)
                }
        }
        index = skysphereindices;
-       for (j = 0;j < 32;j++)
+       for (j = 0;j < skygridy;j++)
        {
-               for (i = 0;i < 32;i++)
+               for (i = 0;i < skygridx;i++)
                {
-                       *index++ =  j      * 33 + i;
-                       *index++ =  j      * 33 + i + 1;
-                       *index++ = (j + 1) * 33 + i;
+                       *index++ =  j      * skygridx1 + i;
+                       *index++ =  j      * skygridx1 + i + 1;
+                       *index++ = (j + 1) * skygridx1 + i;
 
-                       *index++ =  j      * 33 + i + 1;
-                       *index++ = (j + 1) * 33 + i + 1;
-                       *index++ = (j + 1) * 33 + i;
+                       *index++ =  j      * skygridx1 + i + 1;
+                       *index++ = (j + 1) * skygridx1 + i + 1;
+                       *index++ = (j + 1) * skygridx1 + i;
                }
                i++;
        }
@@ -289,7 +292,7 @@ static void skyspherearrays(float *vert, float *tex, float *tex2, float *source,
        t = tex;
        t2 = tex2;
        radius = r_farclip - 8;
-       for (i = 0;i < (33*33);i++)
+       for (i = 0;i < (skygridx1*skygridy1);i++)
        {
                *t++ = source[0] + s;
                *t++ = source[1] + s;
@@ -306,7 +309,7 @@ static void skyspherearrays(float *vert, float *tex, float *tex2, float *source,
 static void R_SkySphere(void)
 {
        float speedscale, speedscale2;
-       float vert[33*33*4], tex[33*33*2], tex2[33*33*2];
+       float vert[skygridx1*skygridy1*4], tex[skygridx1*skygridy1*2], tex2[skygridx1*skygridy1*2];
        static qboolean skysphereinitialized = false;
        rmeshinfo_t m;
        if (!skysphereinitialized)
@@ -318,8 +321,8 @@ static void R_SkySphere(void)
        m.transparent = false;
        m.blendfunc1 = GL_ONE;
        m.blendfunc2 = GL_ZERO;
-       m.numtriangles = 32*32*2;
-       m.numverts = 33*33;
+       m.numtriangles = skygridx*skygridy*2;
+       m.numverts = skygridx1*skygridy1;
        m.index = skysphereindices;
        m.vertex = vert;
        m.vertexstep = sizeof(float[4]);
@@ -342,21 +345,20 @@ static void R_SkySphere(void)
        m.tex[0] = R_GetTexture(alphaskytexture);
        m.texcoords[0] = tex2;
        R_Mesh_Draw(&m);
-       R_Mesh_Render();
-       if (r_skyflush.integer)
-               glFlush();
-       // clear the zbuffer that was used while rendering the sky
-       glClear(GL_DEPTH_BUFFER_BIT);
-       if (r_skyflush.integer)
-               glFlush();
 }
 
 void R_Sky(void)
 {
-       if (skyrendersphere)
-               R_SkySphere();
-       else if (skyrenderbox)
-               R_SkyBox();
+       if (skyrendermasked)
+       {
+               if (skyrendersphere)
+                       R_SkySphere();
+               else if (skyrenderbox)
+                       R_SkyBox();
+
+               // clear the zbuffer that was used while rendering the sky
+               R_Mesh_ClearDepth();
+       }
 }
 
 //===============================================================
@@ -415,15 +417,6 @@ void R_InitSky (qbyte *src, int bytesperpixel)
        memcpy(skyupperlayerpixels, trans, 128*128*4);
 
        solidskytexture = R_LoadTexture (skytexturepool, "sky_solidtexture", 128, 128, (qbyte *) trans, TEXTYPE_RGBA, TEXF_PRECACHE);
-       /*
-       for (i = 0;i < 128*128;i++)
-       {
-               ((qbyte *)&trans[i])[0] >>= 1;
-               ((qbyte *)&trans[i])[1] >>= 1;
-               ((qbyte *)&trans[i])[2] >>= 1;
-       }
-       solidskytexture_half = R_LoadTexture (skytexturepool, "sky_solidtexture_half", 128, 128, (qbyte *) trans, TEXTYPE_RGBA, TEXF_PRECACHE);
-       */
 
        if (bytesperpixel == 4)
        {
@@ -449,13 +442,5 @@ void R_InitSky (qbyte *src, int bytesperpixel)
        memcpy(skylowerlayerpixels, trans, 128*128*4);
 
        alphaskytexture = R_LoadTexture (skytexturepool, "sky_alphatexture", 128, 128, (qbyte *) trans, TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE);
-       /*
-       for (i = 0;i < 128*128;i++)
-       {
-               ((qbyte *)&trans[i])[0] >>= 1;
-               ((qbyte *)&trans[i])[1] >>= 1;
-               ((qbyte *)&trans[i])[2] >>= 1;
-       }
-       alphaskytexture_half = R_LoadTexture (skytexturepool, "sky_alphatexture_half", 128, 128, (qbyte *) trans, TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE);
-       */
 }
+