]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rsurf.c
Fixed FS code so that unpacked files are handled normally when AKVERSION isn't defined
[xonotic/darkplaces.git] / gl_rsurf.c
index ba73451ba69273f16f9b0a44af7d25acfc8592e8..dd32b9bc0fc001de1f39c16ab805fecfd326e654 100644 (file)
@@ -753,7 +753,6 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2)
 {
        const entity_render_t *ent = calldata1;
        const msurface_t *surf = ent->model->brushq1.surfaces + calldata2;
-       float colorscale;
        rmeshstate_t m;
        float alpha;
        float modelorg[3];
@@ -761,15 +760,17 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2)
        matrix4x4_t tempmatrix;
        float   args[4] = {0.05f,0,0,0.04f};
 
-       if (r_waterscroll.value)
+       if (gl_textureshader && r_watershader.value && !fogenabled)
+       {
+               Matrix4x4_CreateTranslate(&tempmatrix, sin(cl.time) * 0.025 * r_waterscroll.value, sin(cl.time * 0.8f) * 0.025 * r_waterscroll.value, 0);
+               R_Mesh_TextureMatrix(1, &tempmatrix);
+               Matrix4x4_CreateFromQuakeEntity(&tempmatrix, 0, 0, 0, 0, 0, 0, r_watershader.value);
+               R_Mesh_TextureMatrix(0, &tempmatrix);
+       }
+       else if (r_waterscroll.value)
        {
                // scrolling in texture matrix
                Matrix4x4_CreateTranslate(&tempmatrix, sin(cl.time) * 0.025 * r_waterscroll.value, sin(cl.time * 0.8f) * 0.025 * r_waterscroll.value, 0);
-               if (gl_textureshader && r_watershader.integer)
-               {
-                       R_Mesh_TextureMatrix(1, &tempmatrix);
-                       Matrix4x4_CreateTranslate(&tempmatrix, -sin(cl.time) * 0.025 * r_waterscroll.value, -sin(cl.time * 0.8f) * 0.025 * r_waterscroll.value, 0);
-               }
                R_Mesh_TextureMatrix(0, &tempmatrix);
        }
 
@@ -794,25 +795,19 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2)
                GL_BlendFunc(GL_ONE, GL_ZERO);
                GL_DepthMask(true);
        }
-       if (gl_textureshader && r_watershader.integer)
+       if (gl_textureshader && r_watershader.value && !fogenabled)
        {
-               m.tex[0] = R_GetTexture(mod_shared_distorttexture);
+               m.tex[0] = R_GetTexture(mod_shared_distorttexture[(int)(cl.time * 16)&63]);
                m.tex[1] = R_GetTexture(texture->skin.base);
        }
        else
                m.tex[0] = R_GetTexture(texture->skin.base);
-       colorscale = 1;
-       if (gl_combine.integer)
-       {
-               m.texrgbscale[0] = 4;
-               colorscale *= 0.25f;
-       }
        GL_DepthTest(true);
        if (fogenabled)
                GL_ColorPointer(varray_color4f);
        else
                GL_Color(1, 1, 1, alpha);
-       if (gl_textureshader && r_watershader.integer)
+       if (gl_textureshader && r_watershader.value && !fogenabled)
        {
                GL_ActiveTexture (0);
                qglTexEnvi (GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
@@ -832,11 +827,11 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2)
        if (fogenabled)
        {
                R_FillColors(varray_color4f, surf->mesh.num_vertices, 1, 1, 1, alpha);
-               RSurf_FogColors_Vertex3f_Color4f(surf->mesh.data_vertex3f, varray_color4f, colorscale, surf->mesh.num_vertices, modelorg);
+               RSurf_FogColors_Vertex3f_Color4f(surf->mesh.data_vertex3f, varray_color4f, 1, surf->mesh.num_vertices, modelorg);
        }
        R_Mesh_Draw(surf->mesh.num_vertices, surf->mesh.num_triangles, surf->mesh.data_element3i);
 
-       if (gl_textureshader && r_watershader.integer)
+       if (gl_textureshader && r_watershader.value && !fogenabled)
        {
                qglDisable (GL_TEXTURE_SHADER_NV);
                GL_ActiveTexture (0);
@@ -857,7 +852,7 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2)
                R_Mesh_Draw(surf->mesh.num_vertices, surf->mesh.num_triangles, surf->mesh.data_element3i);
        }
 
-       if (r_waterscroll.value)
+       if ((gl_textureshader && r_watershader.value && !fogenabled) || r_waterscroll.value)
        {
                Matrix4x4_CreateIdentity(&tempmatrix);
                R_Mesh_TextureMatrix(0, &tempmatrix);
@@ -1666,8 +1661,13 @@ void R_DrawWorld(entity_render_t *ent)
 {
        if (ent->model == NULL)
                return;
-       if (!ent->model->brushq1.numleafs && ent->model->Draw)
-               ent->model->Draw(ent);
+       if (!ent->model->brushq1.numleafs)
+       {
+               if (ent->model->DrawSky)
+                       ent->model->DrawSky(ent);
+               if (ent->model->Draw)
+                       ent->model->Draw(ent);
+       }
        else
        {
                R_PrepareSurfaces(ent);
@@ -1797,49 +1797,54 @@ void R_DrawCollisionBrush(colbrushf_t *brush)
        R_Mesh_Draw(brush->numpoints, brush->numtriangles, brush->elements);
 }
 
-void R_Q3BSP_DrawFace(entity_render_t *ent, q3mface_t *face)
+void R_Q3BSP_DrawSkyFace(entity_render_t *ent, q3mface_t *face)
 {
        rmeshstate_t m;
        if (!face->num_triangles)
                return;
-       if (face->texture->renderflags)
+       if (skyrendernow)
        {
-               if (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY)
-               {
-                       if (skyrendernow)
-                       {
-                               skyrendernow = false;
-                               if (skyrendermasked)
-                                       R_Sky();
-                       }
+               skyrendernow = false;
+               if (skyrendermasked)
+                       R_Sky();
+       }
 
-                       R_Mesh_Matrix(&ent->matrix);
+       R_Mesh_Matrix(&ent->matrix);
 
-                       GL_Color(fogcolor[0], fogcolor[1], fogcolor[2], 1);
-                       if (skyrendermasked)
-                       {
-                               // depth-only (masking)
-                               qglColorMask(0,0,0,0);
-                               // just to make sure that braindead drivers don't draw anything
-                               // despite that colormask...
-                               GL_BlendFunc(GL_ZERO, GL_ONE);
-                       }
-                       else
-                       {
-                               // fog sky
-                               GL_BlendFunc(GL_ONE, GL_ZERO);
-                       }
-                       GL_DepthMask(true);
-                       GL_DepthTest(true);
+       GL_Color(fogcolor[0], fogcolor[1], fogcolor[2], 1);
+       if (skyrendermasked)
+       {
+               // depth-only (masking)
+               qglColorMask(0,0,0,0);
+               // just to make sure that braindead drivers don't draw anything
+               // despite that colormask...
+               GL_BlendFunc(GL_ZERO, GL_ONE);
+       }
+       else
+       {
+               // fog sky
+               GL_BlendFunc(GL_ONE, GL_ZERO);
+       }
+       GL_DepthMask(true);
+       GL_DepthTest(true);
 
-                       memset(&m, 0, sizeof(m));
-                       R_Mesh_State_Texture(&m);
+       memset(&m, 0, sizeof(m));
+       R_Mesh_State_Texture(&m);
 
-                       GL_VertexPointer(face->data_vertex3f);
-                       R_Mesh_Draw(face->num_vertices, face->num_triangles, face->data_element3i);
-                       qglColorMask(1,1,1,1);
+       GL_VertexPointer(face->data_vertex3f);
+       R_Mesh_Draw(face->num_vertices, face->num_triangles, face->data_element3i);
+       qglColorMask(1,1,1,1);
+}
+
+void R_Q3BSP_DrawFace(entity_render_t *ent, q3mface_t *face)
+{
+       rmeshstate_t m;
+       if (!face->num_triangles)
+               return;
+       if (face->texture->renderflags)
+       {
+               if (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY)
                        return;
-               }
                if (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_NODRAW)
                        return;
        }
@@ -1868,17 +1873,10 @@ void R_Q3BSP_DrawFace(entity_render_t *ent, q3mface_t *face)
        R_Mesh_Draw(face->num_vertices, face->num_triangles, face->data_element3i);
 }
 
-/*
-void R_Q3BSP_DrawSky(entity_render_t *ent)
-{
-}
-*/
-
 void R_Q3BSP_RecursiveWorldNode(entity_render_t *ent, q3mnode_t *node, const vec3_t modelorg, qbyte *pvs, int markframe)
 {
        int i;
        q3mleaf_t *leaf;
-       q3mface_t *face;
        while (node->isnode)
        {
                if (R_CullBox(node->mins, node->maxs))
@@ -1890,22 +1888,42 @@ void R_Q3BSP_RecursiveWorldNode(entity_render_t *ent, q3mnode_t *node, const vec
                return;
        leaf = (q3mleaf_t *)node;
        if (pvs[leaf->clusterindex >> 3] & (1 << (leaf->clusterindex & 7)))
-       {
                for (i = 0;i < leaf->numleaffaces;i++)
+                       leaf->firstleafface[i]->markframe = markframe;
+}
+
+static int r_q3bsp_framecount = -1;
+
+void R_Q3BSP_DrawSky(entity_render_t *ent)
+{
+       int i;
+       q3mface_t *face;
+       vec3_t modelorg;
+       model_t *model;
+       qbyte *pvs;
+       R_Mesh_Matrix(&ent->matrix);
+       model = ent->model;
+       if (r_drawcollisionbrushes.integer < 2)
+       {
+               Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
+               if (ent == &cl_entities[0].render && model->brushq3.num_pvsclusters && !r_novis.integer && (pvs = model->brush.GetPVS(model, modelorg)))
                {
-                       face = leaf->firstleafface[i];
-                       if (face->markframe != markframe)
+                       if (r_q3bsp_framecount != r_framecount)
                        {
-                               face->markframe = markframe;
-                               if (!R_CullBox(face->mins, face->maxs))
-                                       R_Q3BSP_DrawFace(ent, face);
+                               r_q3bsp_framecount = r_framecount;
+                               R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, r_framecount);
                        }
+                       for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++)
+                               if (face->markframe == r_framecount && (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY) && !R_CullBox(face->mins, face->maxs))
+                                       R_Q3BSP_DrawSkyFace(ent, face);
                }
+               else
+                       for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++)
+                               if ((face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY))
+                                       R_Q3BSP_DrawSkyFace(ent, face);
        }
 }
 
-
-
 void R_Q3BSP_Draw(entity_render_t *ent)
 {
        int i;
@@ -1913,14 +1931,22 @@ void R_Q3BSP_Draw(entity_render_t *ent)
        vec3_t modelorg;
        model_t *model;
        qbyte *pvs;
-       static int markframe = 0;
        R_Mesh_Matrix(&ent->matrix);
        model = ent->model;
        if (r_drawcollisionbrushes.integer < 2)
        {
                Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
                if (ent == &cl_entities[0].render && model->brushq3.num_pvsclusters && !r_novis.integer && (pvs = model->brush.GetPVS(model, modelorg)))
-                       R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, ++markframe);
+               {
+                       if (r_q3bsp_framecount != r_framecount)
+                       {
+                               r_q3bsp_framecount = r_framecount;
+                               R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, r_framecount);
+                       }
+                       for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++)
+                               if (face->markframe == r_framecount && !R_CullBox(face->mins, face->maxs))
+                                       R_Q3BSP_DrawFace(ent, face);
+               }
                else
                        for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++)
                                R_Q3BSP_DrawFace(ent, face);