]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmain.c
now checks that a lightmap surfacechain is not NULL before dereferencing it
[xonotic/darkplaces.git] / gl_rmain.c
index 36a3905184af985e23b51c2316576b01965b63b5..45314004fa819b39995ca5920d138a4c706df78e 100644 (file)
@@ -37,7 +37,17 @@ int c_alias_polys, c_light_polys, c_faces, c_nodes, c_leafs, c_models, c_bmodels
 // true during envmap command capture
 qboolean envmap;
 
+// maximum visible distance (recalculated from world box each frame)
 float r_farclip;
+// brightness of world lightmaps and related lighting
+// (often reduced when world rtlights are enabled)
+float r_lightmapintensity;
+// whether to draw world lights realtime, dlights realtime, and their shadows
+qboolean r_rtworld;
+qboolean r_rtworldshadows;
+qboolean r_rtdlight;
+qboolean r_rtdlightshadows;
+
 
 // forces all rendering to draw triangle outlines
 int r_showtrispass;
@@ -440,10 +450,9 @@ static void R_MarkEntities (void)
                Matrix4x4_OriginFromMatrix(&ent->matrix, ent->origin);
                // some of the renderer still relies on scale...
                ent->scale = Matrix4x4_ScaleFromMatrix(&ent->matrix);
-               R_LerpAnimation(ent);
                R_UpdateEntLights(ent);
                if ((chase_active.integer || !(ent->flags & RENDER_EXTERIORMODEL))
-                && !VIS_CullBox(ent->mins, ent->maxs)
+                && (!VIS_CullBox(ent->mins, ent->maxs) || (ent->effects & EF_NODEPTHTEST))
                 && (!envmap || !(ent->flags & (RENDER_VIEWMODEL | RENDER_EXTERIORMODEL))))
                        ent->visframe = r_framecount;
        }
@@ -471,30 +480,6 @@ int R_DrawBrushModelsSky (void)
        return sky;
 }
 
-/*
-=============
-R_DrawViewModel
-=============
-*/
-/*
-void R_DrawViewModel (void)
-{
-       entity_render_t *ent;
-
-       // FIXME: move these checks to client
-       if (!r_drawviewmodel.integer || chase_active.integer || envmap || !r_drawentities.integer || cl.items & IT_INVISIBILITY || cl.stats[STAT_HEALTH] <= 0 || !cl.viewent.render.model)
-               return;
-
-       ent = &cl.viewent.render;
-       Mod_CheckLoaded(ent->model);
-       R_LerpAnimation(ent);
-       Matrix4x4_CreateFromQuakeEntity(&ent->matrix, ent->origin[0], ent->origin[1], ent->origin[2], -ent->angles[0], ent->angles[1], ent->angles[2], ent->scale);
-       Matrix4x4_Invert_Simple(&ent->inversematrix, &ent->matrix);
-       R_UpdateEntLights(ent);
-       ent->model->Draw(ent);
-}
-*/
-
 void R_DrawNoModel(entity_render_t *ent);
 void R_DrawModels(void)
 {
@@ -580,31 +565,6 @@ static void R_BlendView(void)
        R_Mesh_Draw(3, 1, polygonelements);
 }
 
-void R_UpdateWorld(void)
-{
-       if (!r_refdef.entities/* || !cl.worldmodel*/)
-               return; //Host_Error ("R_RenderView: NULL worldmodel");
-
-       if (r_shadow_realtime_world.integer && !gl_stencil)
-       {
-               Con_Print("Realtime world lighting requires 32bit color; turning off r_shadow_realtime_world, please type vid_bitsperpixel 32;vid_restart and try again\n");
-               Cvar_SetValueQuick(&r_shadow_realtime_world, 0);
-       }
-
-       // don't allow cheats in multiplayer
-       if (!cl.islocalgame && cl.worldmodel)
-       {
-               if (r_fullbright.integer != 0)
-                       Cvar_Set ("r_fullbright", "0");
-               if (r_ambient.value != 0)
-                       Cvar_Set ("r_ambient", "0");
-       }
-
-       R_Textures_Frame();
-       R_UpdateFog();
-       R_UpdateLights();
-}
-
 void R_RenderScene(void);
 
 /*
@@ -616,7 +576,7 @@ void R_RenderView(void)
 {
        if (!r_refdef.entities/* || !cl.worldmodel*/)
                return; //Host_Error ("R_RenderView: NULL worldmodel");
-       
+
        r_view_width = bound(0, r_refdef.width, vid.realwidth);
        r_view_height = bound(0, r_refdef.height, vid.realheight);
        r_view_depth = 1;
@@ -627,6 +587,11 @@ void R_RenderView(void)
        r_view_fov_y = bound(1, r_refdef.fov_y, 170);
        r_view_matrix = r_refdef.viewentitymatrix;
        GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 1);
+       r_rtworld = r_shadow_realtime_world.integer;
+       r_rtworldshadows = r_shadow_realtime_world_shadows.integer && gl_stencil;
+       r_rtdlight = r_shadow_realtime_world.integer || r_shadow_realtime_dlight.integer;
+       r_rtdlightshadows = r_rtdlight && (r_rtworld ? r_shadow_realtime_world_dlightshadows.integer : r_shadow_realtime_dlight_shadows.integer) && gl_stencil;
+       r_lightmapintensity = r_rtworld ? r_shadow_realtime_world_lightmaps.value : 1;
 
        // GL is weird because it's bottom to top, r_view_y is top to bottom
        qglViewport(r_view_x, vid.realheight - (r_view_y + r_view_height), r_view_width, r_view_height);
@@ -634,6 +599,9 @@ void R_RenderView(void)
        GL_ScissorTest(true);
        GL_DepthMask(true);
        R_ClearScreen();
+       R_Textures_Frame();
+       R_UpdateFog();
+       R_UpdateLights();
        R_TimeReport("setup");
 
        qglDepthFunc(GL_LEQUAL);
@@ -663,12 +631,14 @@ void R_RenderScene(void)
 
        r_framecount++;
 
+       R_MeshQueue_BeginScene();
+
        GL_ShowTrisColor(0.05, 0.05, 0.05, 1);
 
        R_SetFrustum();
 
        r_farclip = R_FarClip(r_vieworigin, r_viewforward, 768.0f) + 256.0f;
-       if (gl_stencil && (r_shadow_realtime_world.integer || (r_shadow_realtime_dlight.integer && r_shadow_realtime_dlight_shadows.integer)))
+       if (r_rtworldshadows || r_rtdlightshadows)
                GL_SetupView_Mode_PerspectiveInfiniteFarClip(r_view_fov_x, r_view_fov_y, 1.0f);
        else
                GL_SetupView_Mode_Perspective(r_view_fov_x, r_view_fov_y, 1.0f, r_farclip);
@@ -686,8 +656,6 @@ void R_RenderScene(void)
        R_MarkEntities();
        R_TimeReport("markentity");
 
-       R_MeshQueue_BeginScene();
-
        R_Shadow_UpdateWorldLightSelection();
 
        // don't let sound skip if going slow
@@ -867,7 +835,7 @@ void R_DrawNoModelCallback(const void *calldata1, int calldata2)
                GL_BlendFunc(GL_ONE, GL_ZERO);
                GL_DepthMask(true);
        }
-       GL_DepthTest(true);
+       GL_DepthTest(!(ent->effects & EF_NODEPTHTEST));
        if (fogenabled)
        {
                memcpy(color4f, nomodelcolor4f, sizeof(float[6*4]));
@@ -899,7 +867,7 @@ void R_DrawNoModelCallback(const void *calldata1, int calldata2)
 void R_DrawNoModel(entity_render_t *ent)
 {
        //if ((ent->effects & EF_ADDITIVE) || (ent->alpha < 1))
-               R_MeshQueue_AddTransparent(ent->origin, R_DrawNoModelCallback, ent, 0);
+               R_MeshQueue_AddTransparent(ent->effects & EF_NODEPTHTEST ? r_vieworigin : ent->origin, R_DrawNoModelCallback, ent, 0);
        //else
        //      R_DrawNoModelCallback(ent, 0);
 }