]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmain.c
added r_rtworld, r_rtworldshadows, r_rtdlight, r_rtdlightshadows, and r_lightmapinten...
[xonotic/darkplaces.git] / gl_rmain.c
index 5216f4b2ae0baf60719cd2e89084221d52f07551..6816a436f5ef56e215767781c27e48ac557d8ba3 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;
@@ -50,8 +60,10 @@ vec3_t r_viewright;
 vec3_t r_viewup;
 int r_view_x;
 int r_view_y;
+int r_view_z;
 int r_view_width;
 int r_view_height;
+int r_view_depth;
 float r_view_fov_x;
 float r_view_fov_y;
 matrix4x4_t r_view_matrix;
@@ -239,7 +251,7 @@ void gl_main_newmap(void)
                if (l >= 0 && !strcmp(entname + l, ".bsp"))
                {
                        strcpy(entname + l, ".ent");
-                       if ((entities = FS_LoadFile(entname, true)))
+                       if ((entities = FS_LoadFile(entname, tempmempool, true)))
                        {
                                CL_ParseEntityLump(entities);
                                Mem_Free(entities);
@@ -469,30 +481,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)
 {
@@ -558,13 +546,12 @@ static void R_BlendView(void)
        R_Mesh_Matrix(&r_identitymatrix);
 
        memset(&m, 0, sizeof(m));
-       R_Mesh_State_Texture(&m);
+       m.pointer_vertex = vertex3f;
+       R_Mesh_State(&m);
 
        GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        GL_DepthMask(true);
        GL_DepthTest(false); // magic
-       GL_VertexPointer(vertex3f);
-       GL_ColorPointer(NULL);
        GL_Color(r_refdef.viewblend[0], r_refdef.viewblend[1], r_refdef.viewblend[2], r_refdef.viewblend[3]);
        r = 64;
        vertex3f[0] = r_vieworigin[0] + r_viewforward[0] * 1.5 + r_viewleft[0] * r - r_viewup[0] * r;
@@ -584,14 +571,16 @@ 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)
+       if (!cl.islocalgame && cl.worldmodel)
        {
                if (r_fullbright.integer != 0)
                        Cvar_Set ("r_fullbright", "0");
@@ -618,16 +607,25 @@ void R_RenderView(void)
        
        r_view_width = bound(0, r_refdef.width, vid.realwidth);
        r_view_height = bound(0, r_refdef.height, vid.realheight);
+       r_view_depth = 1;
        r_view_x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width);
        r_view_y = bound(0, r_refdef.y, vid.realheight - r_refdef.height);
+       r_view_z = 0;
        r_view_fov_x = bound(1, r_refdef.fov_x, 170);
        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_rtworld && r_shadow_realtime_world_shadows.integer;
+       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);
+       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);
        GL_Scissor(r_view_x, r_view_y, r_view_width, r_view_height);
        GL_ScissorTest(true);
+       GL_DepthMask(true);
        R_ClearScreen();
        R_TimeReport("setup");
 
@@ -658,12 +656,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_worldshadows.integer) || ((r_shadow_realtime_world.integer || r_shadow_realtime_dlight.integer) && r_shadow_dlightshadows.integer)))
+       if (gl_stencil && (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);
@@ -681,20 +681,28 @@ void R_RenderScene(void)
        R_MarkEntities();
        R_TimeReport("markentity");
 
-       R_MeshQueue_BeginScene();
-
        R_Shadow_UpdateWorldLightSelection();
 
        // don't let sound skip if going slow
        if (!intimerefresh && !r_speeds.integer)
                S_ExtraUpdate ();
 
+       GL_ShowTrisColor(0.025, 0.025, 0, 1);
+       if (world->model && world->model->DrawSky)
+       {
+               world->model->DrawSky(world);
+               R_TimeReport("worldsky");
+       }
+
        if (R_DrawBrushModelsSky())
                R_TimeReport("bmodelsky");
 
-       // must occur early because it can draw sky
-       R_DrawWorld(world);
-       R_TimeReport("world");
+       GL_ShowTrisColor(0.05, 0.05, 0.05, 1);
+       if (world->model && world->model->Draw)
+       {
+               world->model->Draw(world);
+               R_TimeReport("world");
+       }
 
        // don't let sound skip if going slow
        if (!intimerefresh && !r_speeds.integer)
@@ -764,10 +772,6 @@ void R_DrawBBoxMesh(vec3_t mins, vec3_t maxs, float cr, float cg, float cb, floa
        GL_DepthTest(true);
        R_Mesh_Matrix(&r_identitymatrix);
 
-       memset(&m, 0, sizeof(m));
-       R_Mesh_State_Texture(&m);
-
-       R_Mesh_GetSpace(8);
        vertex3f[ 0] = mins[0];vertex3f[ 1] = mins[1];vertex3f[ 2] = mins[2];
        vertex3f[ 3] = maxs[0];vertex3f[ 4] = mins[1];vertex3f[ 5] = mins[2];
        vertex3f[ 6] = mins[0];vertex3f[ 7] = maxs[1];vertex3f[ 8] = mins[2];
@@ -776,7 +780,6 @@ void R_DrawBBoxMesh(vec3_t mins, vec3_t maxs, float cr, float cg, float cb, floa
        vertex3f[15] = maxs[0];vertex3f[16] = mins[1];vertex3f[17] = maxs[2];
        vertex3f[18] = mins[0];vertex3f[19] = maxs[1];vertex3f[20] = maxs[2];
        vertex3f[21] = maxs[0];vertex3f[22] = maxs[1];vertex3f[23] = maxs[2];
-       GL_ColorPointer(color);
        R_FillColors(color, 8, cr, cg, cb, ca);
        if (fogenabled)
        {
@@ -790,6 +793,10 @@ void R_DrawBBoxMesh(vec3_t mins, vec3_t maxs, float cr, float cg, float cb, floa
                        c[2] = c[2] * f1 + fogcolor[2] * f2;
                }
        }
+       memset(&m, 0, sizeof(m));
+       m.pointer_vertex = vertex3f;
+       m.pointer_color = color;
+       R_Mesh_State(&m);
        R_Mesh_Draw(8, 12);
 }
 */
@@ -836,7 +843,7 @@ void R_DrawNoModelCallback(const void *calldata1, int calldata2)
        R_Mesh_Matrix(&ent->matrix);
 
        memset(&m, 0, sizeof(m));
-       R_Mesh_State_Texture(&m);
+       m.pointer_vertex = nomodelvertex3f;
 
        if (ent->flags & EF_ADDITIVE)
        {
@@ -854,11 +861,10 @@ void R_DrawNoModelCallback(const void *calldata1, int calldata2)
                GL_DepthMask(true);
        }
        GL_DepthTest(true);
-       GL_VertexPointer(nomodelvertex3f);
        if (fogenabled)
        {
                memcpy(color4f, nomodelcolor4f, sizeof(float[6*4]));
-               GL_ColorPointer(color4f);
+               m.pointer_color = color4f;
                VectorSubtract(ent->origin, r_vieworigin, diff);
                f2 = exp(fogdensity/DotProduct(diff, diff));
                f1 = 1 - f2;
@@ -873,12 +879,13 @@ void R_DrawNoModelCallback(const void *calldata1, int calldata2)
        else if (ent->alpha != 1)
        {
                memcpy(color4f, nomodelcolor4f, sizeof(float[6*4]));
-               GL_ColorPointer(color4f);
+               m.pointer_color = color4f;
                for (i = 0, c = color4f;i < 6;i++, c += 4)
                        c[3] *= ent->alpha;
        }
        else
-               GL_ColorPointer(nomodelcolor4f);
+               m.pointer_color = nomodelcolor4f;
+       R_Mesh_State(&m);
        R_Mesh_Draw(6, 8, nomodelelements);
 }
 
@@ -935,18 +942,10 @@ void R_DrawSprite(int blendfunc1, int blendfunc2, rtexture_t *texture, int depth
        }
 
        R_Mesh_Matrix(&r_identitymatrix);
-       GL_ColorPointer(NULL);
-       GL_Color(cr, cg, cb, ca);
-       GL_VertexPointer(varray_vertex3f);
        GL_BlendFunc(blendfunc1, blendfunc2);
        GL_DepthMask(false);
        GL_DepthTest(!depthdisable);
 
-       memset(&m, 0, sizeof(m));
-       m.tex[0] = R_GetTexture(texture);
-       m.pointer_texcoord[0] = spritetexcoord2f;
-       R_Mesh_State_Texture(&m);
-
        varray_vertex3f[ 0] = origin[0] + left[0] * scalex2 + up[0] * scaley1;
        varray_vertex3f[ 1] = origin[1] + left[1] * scalex2 + up[1] * scaley1;
        varray_vertex3f[ 2] = origin[2] + left[2] * scalex2 + up[2] * scaley1;
@@ -959,6 +958,13 @@ void R_DrawSprite(int blendfunc1, int blendfunc2, rtexture_t *texture, int depth
        varray_vertex3f[ 9] = origin[0] + left[0] * scalex1 + up[0] * scaley1;
        varray_vertex3f[10] = origin[1] + left[1] * scalex1 + up[1] * scaley1;
        varray_vertex3f[11] = origin[2] + left[2] * scalex1 + up[2] * scaley1;
+
+       memset(&m, 0, sizeof(m));
+       m.tex[0] = R_GetTexture(texture);
+       m.pointer_texcoord[0] = spritetexcoord2f;
+       m.pointer_vertex = varray_vertex3f;
+       R_Mesh_State(&m);
+       GL_Color(cr, cg, cb, ca);
        R_Mesh_Draw(4, 2, polygonelements);
 }