]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rsurf.c
changed behavior of r_showtris (now only affects geometry in the game view, not sky...
[xonotic/darkplaces.git] / gl_rsurf.c
index 2c90085192605571413461560f5e9a8665784746..065e77019a880e5ba2456ca5fe90b374c29cb119 100644 (file)
@@ -25,14 +25,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #define MAX_LIGHTMAP_SIZE 256
 
-cvar_t r_ambient = {0, "r_ambient", "0"};
-cvar_t r_drawportals = {0, "r_drawportals", "0"};
-cvar_t r_lockpvs = {0, "r_lockpvs", "0"};
-cvar_t r_lockvisibility = {0, "r_lockvisibility", "0"};
-cvar_t r_useportalculling = {0, "r_useportalculling", "1"};
-cvar_t r_drawcollisionbrushes_polygonfactor = {0, "r_drawcollisionbrushes_polygonfactor", "-1"};
-cvar_t r_drawcollisionbrushes_polygonoffset = {0, "r_drawcollisionbrushes_polygonoffset", "0"};
-cvar_t r_q3bsp_renderskydepth = {0, "r_q3bsp_renderskydepth", "0"};
+cvar_t r_ambient = {0, "r_ambient", "0", "brighter world cheat (not allowed in multiplayer), value is 0-128"};
+cvar_t r_drawportals = {0, "r_drawportals", "0", "shows portals (separating polygons) in world interior in quake1 maps"};
+cvar_t r_lockpvs = {0, "r_lockpvs", "0", "disables pvs switching, allows you to walk around and inspect what is visible from a given location in the map (anything not visible from your current location will not be drawn)"};
+cvar_t r_lockvisibility = {0, "r_lockvisibility", "0", "disables visibility updates, allows you to walk around and inspect what is visible from a given viewpoint in the map (anything offscreen at the moment this is enabled will not be drawn)"};
+cvar_t r_useportalculling = {0, "r_useportalculling", "1", "use advanced portal culling visibility method to improve performance over just Potentially Visible Set, provides an even more significant speed improvement in unvised maps"};
+cvar_t r_q3bsp_renderskydepth = {0, "r_q3bsp_renderskydepth", "0", "draws sky depth masking in q3 maps (as in q1 maps), this means for example that sky polygons can hide other things"};
 
 // flag arrays used for visibility checking on world model
 // (all other entities have no per-surface/per-leaf visibility checks)
@@ -501,8 +499,7 @@ void R_Q1BSP_DrawSky(entity_render_t *ent)
 {
        if (ent->model == NULL)
                return;
-       if (r_drawcollisionbrushes.integer < 2)
-               R_DrawSurfaces(ent, true);
+       R_DrawSurfaces(ent, true);
 }
 
 void R_Q1BSP_Draw(entity_render_t *ent)
@@ -510,9 +507,8 @@ void R_Q1BSP_Draw(entity_render_t *ent)
        model_t *model = ent->model;
        if (model == NULL)
                return;
-       if (r_drawcollisionbrushes.integer < 2)
-               R_DrawSurfaces(ent, false);
-       if (r_drawcollisionbrushes.integer >= 1 && model->brush.num_brushes)
+       R_DrawSurfaces(ent, false);
+       if (r_showcollisionbrushes.integer && model->brush.num_brushes && !r_showtrispass)
        {
                int i;
                msurface_t *surface;
@@ -520,8 +516,8 @@ void R_Q1BSP_Draw(entity_render_t *ent)
                R_Mesh_Matrix(&ent->matrix);
                GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
                GL_DepthMask(false);
-               GL_DepthTest(true);
-               qglPolygonOffset(r_drawcollisionbrushes_polygonfactor.value, r_drawcollisionbrushes_polygonoffset.value);
+               GL_DepthTest(!r_showdisabledepthtest.integer);
+               qglPolygonOffset(r_showcollisionbrushes_polygonfactor.value, r_showcollisionbrushes_polygonoffset.value);
                for (i = 0, brush = model->brush.data_brushes + model->firstmodelbrush;i < model->nummodelbrushes;i++, brush++)
                        if (brush->colbrushf && brush->colbrushf->numtriangles)
                                R_DrawCollisionBrush(brush->colbrushf);
@@ -571,6 +567,8 @@ void R_Q1BSP_RecursiveGetLightInfo(r_q1bsp_getlightinfo_t *info, mnode_t *node)
                        R_Q1BSP_RecursiveGetLightInfo(info, node->children[0]);
                        node = node->children[1];
                }
+               else if (sides == 0)
+                       return; // ERROR: NAN bounding box!
                else
                        node = node->children[sides - 1];
        }
@@ -728,8 +726,6 @@ void R_Q1BSP_DrawShadowVolume(entity_render_t *ent, vec3_t relativelightorigin,
        // check the box in modelspace, it was already checked in worldspace
        if (!BoxesOverlap(ent->model->normalmins, ent->model->normalmaxs, lightmins, lightmaxs))
                return;
-       if (r_drawcollisionbrushes.integer >= 2)
-               return;
        R_UpdateAllTextureInfo(ent);
        if (model->brush.shadowmesh)
        {
@@ -780,6 +776,22 @@ static void R_Q1BSP_DrawLight_TransparentCallback(const entity_render_t *ent, in
        R_Shadow_RenderMode_End();
 }
 
+static void R_Q1BSP_DrawLight_TransparentBatch(const entity_render_t *ent, texture_t *texture, int batchnumsurfaces, msurface_t **batchsurfacelist)
+{
+       int batchsurfaceindex;
+       msurface_t *batchsurface;
+       vec3_t tempcenter, center;
+       for (batchsurfaceindex = 0;batchsurfaceindex < batchnumsurfaces;batchsurfaceindex++)
+       {
+               batchsurface = batchsurfacelist[batchsurfaceindex];
+               tempcenter[0] = (batchsurface->mins[0] + batchsurface->maxs[0]) * 0.5f;
+               tempcenter[1] = (batchsurface->mins[1] + batchsurface->maxs[1]) * 0.5f;
+               tempcenter[2] = (batchsurface->mins[2] + batchsurface->maxs[2]) * 0.5f;
+               Matrix4x4_Transform(&ent->matrix, tempcenter, center);
+               R_MeshQueue_AddTransparent(texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST ? r_vieworigin : center, R_Q1BSP_DrawLight_TransparentCallback, ent, batchsurface - ent->model->data_surfaces, r_shadow_rtlight);
+       }
+}
+
 #define RSURF_MAX_BATCHSURFACES 1024
 
 void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surfacelist)
@@ -792,8 +804,6 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
        vec3_t modelorg;
        texture_t *tex;
        qboolean skip;
-       if (r_drawcollisionbrushes.integer >= 2)
-               return;
        R_UpdateAllTextureInfo(ent);
        Matrix4x4_Transform(&ent->inversematrix, r_vieworigin, modelorg);
        tex = NULL;
@@ -811,19 +821,7 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
                        if (batchnumsurfaces > 0)
                        {
                                if (texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT)
-                               {
-                                       int batchsurfaceindex;
-                                       for (batchsurfaceindex = 0;batchsurfaceindex < batchnumsurfaces;batchsurfaceindex++)
-                                       {
-                                               msurface_t *batchsurface = batchsurfacelist[batchsurfaceindex];
-                                               vec3_t tempcenter, center;
-                                               tempcenter[0] = (batchsurface->mins[0] + batchsurface->maxs[0]) * 0.5f;
-                                               tempcenter[1] = (batchsurface->mins[1] + batchsurface->maxs[1]) * 0.5f;
-                                               tempcenter[2] = (batchsurface->mins[2] + batchsurface->maxs[2]) * 0.5f;
-                                               Matrix4x4_Transform(&ent->matrix, tempcenter, center);
-                                               R_MeshQueue_AddTransparent(texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST ? r_vieworigin : center, R_Q1BSP_DrawLight_TransparentCallback, ent, batchsurface - ent->model->data_surfaces, r_shadow_rtlight);
-                                       }
-                               }
+                                       R_Q1BSP_DrawLight_TransparentBatch(ent, texture, batchnumsurfaces, batchsurfacelist);
                                else
                                        R_Shadow_RenderSurfacesLighting(ent, texture, batchnumsurfaces, batchsurfacelist);
                                batchnumsurfaces = 0;
@@ -839,19 +837,7 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
                        if (batchnumsurfaces == RSURF_MAX_BATCHSURFACES)
                        {
                                if (texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT)
-                               {
-                                       int batchsurfaceindex;
-                                       for (batchsurfaceindex = 0;batchsurfaceindex < batchnumsurfaces;batchsurfaceindex++)
-                                       {
-                                               msurface_t *batchsurface = batchsurfacelist[batchsurfaceindex];
-                                               vec3_t tempcenter, center;
-                                               tempcenter[0] = (batchsurface->mins[0] + batchsurface->maxs[0]) * 0.5f;
-                                               tempcenter[1] = (batchsurface->mins[1] + batchsurface->maxs[1]) * 0.5f;
-                                               tempcenter[2] = (batchsurface->mins[2] + batchsurface->maxs[2]) * 0.5f;
-                                               Matrix4x4_Transform(&ent->matrix, tempcenter, center);
-                                               R_MeshQueue_AddTransparent(texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST ? r_vieworigin : center, R_Q1BSP_DrawLight_TransparentCallback, ent, batchsurface - ent->model->data_surfaces, r_shadow_rtlight);
-                                       }
-                               }
+                                       R_Q1BSP_DrawLight_TransparentBatch(ent, texture, batchnumsurfaces, batchsurfacelist);
                                else
                                        R_Shadow_RenderSurfacesLighting(ent, texture, batchnumsurfaces, batchsurfacelist);
                                batchnumsurfaces = 0;
@@ -861,12 +847,72 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
        }
        if (batchnumsurfaces > 0)
        {
-               R_Shadow_RenderSurfacesLighting(ent, texture, batchnumsurfaces, batchsurfacelist);
+               if (texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT)
+                       R_Q1BSP_DrawLight_TransparentBatch(ent, texture, batchnumsurfaces, batchsurfacelist);
+               else
+                       R_Shadow_RenderSurfacesLighting(ent, texture, batchnumsurfaces, batchsurfacelist);
                batchnumsurfaces = 0;
        }
        qglEnable(GL_CULL_FACE);
 }
 
+//Made by [515]
+void R_ReplaceWorldTexture (void)
+{
+       model_t         *m;
+       texture_t       *t;
+       int                     i;
+       const char      *r, *newt;
+       m = r_refdef.worldmodel;
+
+       if(Cmd_Argc() < 2)
+       {
+               Con_Print("r_replacemaptexture <texname> <newtexname> - replaces texture\n");
+               Con_Print("r_replacemaptexture <texname> - switch back to default texture\n");
+               return;
+       }
+       if(!cl.islocalgame || !cl.worldmodel)
+       {
+               Con_Print("This command works only in singleplayer\n");
+               return;
+       }
+       r = Cmd_Argv(1);
+       newt = Cmd_Argv(2);
+       if(!newt[0])
+               newt = r;
+       for(i=0,t=m->data_textures;i<m->num_textures;i++,t++)
+       {
+               if(t->width && !strcasecmp(t->name, r))
+               {
+                       if(Mod_LoadSkinFrame(&t->skin, (char*)newt, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, r_fullbrights.integer))
+                       {
+                               Con_Printf("%s replaced with %s\n", r, newt);
+                               return;
+                       }
+                       else
+                       {
+                               Con_Printf("%s was not found\n", newt);
+                               Mod_LoadSkinFrame(&t->skin, (char*)r, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, r_fullbrights.integer);//back to default
+                               return;
+                       }
+               }
+       }
+}
+
+//Made by [515]
+void R_ListWorldTextures (void)
+{
+       model_t         *m;
+       texture_t       *t;
+       int                     i;
+       m = r_refdef.worldmodel;
+
+       Con_Print("Worldmodel textures :\n");
+       for(i=0,t=m->data_textures;i<m->num_textures;i++,t++)
+               if(t->skin.base != r_texture_notexture)
+                       Con_Printf("%s\n", t->name);
+}
+
 #if 0
 static void gl_surf_start(void)
 {
@@ -889,10 +935,11 @@ void GL_Surf_Init(void)
        Cvar_RegisterVariable(&r_lockpvs);
        Cvar_RegisterVariable(&r_lockvisibility);
        Cvar_RegisterVariable(&r_useportalculling);
-       Cvar_RegisterVariable(&r_drawcollisionbrushes_polygonfactor);
-       Cvar_RegisterVariable(&r_drawcollisionbrushes_polygonoffset);
        Cvar_RegisterVariable(&r_q3bsp_renderskydepth);
 
+       Cmd_AddCommand ("r_replacemaptexture", R_ReplaceWorldTexture, "override a map texture for testing purposes");   // By [515]
+       Cmd_AddCommand ("r_listmaptextures", R_ListWorldTextures, "list all textures used by the current map"); // By [515]
+
        //R_RegisterModule("GL_Surf", gl_surf_start, gl_surf_shutdown, gl_surf_newmap);
 }