]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmain.c
added some (not yet used) key config menu code, part of a redesign for loading the...
[xonotic/darkplaces.git] / gl_rmain.c
index c84eb7ea19e44e120a2e64c38742fa3d278feb02..ceae807bf46b4b2efd07296d5b2d92b576459c1b 100644 (file)
@@ -61,7 +61,6 @@ unsigned short        d_lightstylevalue[256]; // 8.8 fraction of base light value
 cvar_t r_drawentities = {0, "r_drawentities","1"};
 cvar_t r_drawviewmodel = {0, "r_drawviewmodel","1"};
 cvar_t r_speeds = {0, "r_speeds","0"};
-cvar_t r_speeds2 = {0, "r_speeds2","0"};
 cvar_t r_fullbright = {0, "r_fullbright","0"};
 //cvar_t       r_lightmap = {0, "r_lightmap","0"};
 cvar_t r_wateralpha = {CVAR_SAVE, "r_wateralpha","1"};
@@ -69,7 +68,6 @@ cvar_t        r_dynamic = {CVAR_SAVE, "r_dynamic","1"};
 cvar_t r_waterripple = {CVAR_SAVE, "r_waterripple","0"};
 cvar_t r_fullbrights = {CVAR_SAVE, "r_fullbrights", "1"};
 
-cvar_t gl_lightmode = {CVAR_SAVE, "gl_lightmode", "1"}; // LordHavoc: overbright lighting
 //cvar_t       r_dynamicbothsides = {CVAR_SAVE, "r_dynamicbothsides", "1"}; // LordHavoc: can disable dynamic lighting of backfaces, but quake maps are weird so it doesn't always work right...
 
 cvar_t gl_fogenable = {0, "gl_fogenable", "0"};
@@ -81,7 +79,7 @@ cvar_t        gl_fogstart = {0, "gl_fogstart", "0"};
 cvar_t gl_fogend = {0, "gl_fogend","0"};
 
 cvar_t r_ser = {CVAR_SAVE, "r_ser", "1"};
-cvar_t gl_viewmodeldepthhack = {0, "gl_viewmodeldepthhack", "1"};
+//cvar_t       gl_viewmodeldepthhack = {0, "gl_viewmodeldepthhack", "1"};
 
 cvar_t r_multitexture = {0, "r_multitexture", "1"};
 
@@ -162,8 +160,6 @@ loc0:
        goto loc0;
 }
 
-qboolean lighthalf;
-
 vec3_t fogcolor;
 vec_t fogdensity;
 float fog_density, fog_red, fog_green, fog_blue;
@@ -256,8 +252,6 @@ void GL_Main_Init(void)
        Cvar_RegisterVariable (&r_drawentities);
        Cvar_RegisterVariable (&r_drawviewmodel);
        Cvar_RegisterVariable (&r_speeds);
-       Cvar_RegisterVariable (&r_speeds2);
-       Cvar_RegisterVariable (&gl_lightmode);
 //     Cvar_RegisterVariable (&r_dynamicwater);
 //     Cvar_RegisterVariable (&r_dynamicbothsides);
        Cvar_RegisterVariable (&r_fullbrights);
@@ -266,7 +260,7 @@ void GL_Main_Init(void)
        Cvar_RegisterVariable (&r_waterripple);
        Cvar_RegisterVariable (&r_fullbright);
        Cvar_RegisterVariable (&r_ser);
-       Cvar_RegisterVariable (&gl_viewmodeldepthhack);
+//     Cvar_RegisterVariable (&gl_viewmodeldepthhack);
        Cvar_RegisterVariable (&r_multitexture);
        if (gamemode == GAME_NEHAHRA)
                Cvar_SetValue("r_fullbrights", 0);
@@ -299,7 +293,6 @@ extern void GL_Main_Init(void);
 extern void GL_Models_Init(void);
 extern void R_Sky_Init(void);
 extern void GL_Surf_Init(void);
-extern void GL_Screen_Init(void);
 extern void R_Crosshairs_Init(void);
 extern void R_Light_Init(void);
 extern void R_Particles_Init(void);
@@ -320,12 +313,10 @@ void Render_Init(void)
        GL_Models_Init();
        R_Sky_Init();
        GL_Surf_Init();
-       GL_Screen_Init();
        R_Crosshairs_Init();
        R_Light_Init();
        R_Particles_Init();
        R_Explosion_Init();
-       R_Decals_Init();
        ui_init();
        R_Modules_Start();
 }
@@ -377,9 +368,9 @@ static void R_MarkEntities (void)
        if (!r_drawentities.integer)
                return;
 
-       for (i = 0;i < cl_numvisedicts;i++)
+       for (i = 0;i < r_refdef.numentities;i++)
        {
-               currentrenderentity = &cl_visedicts[i]->render;
+               currentrenderentity = r_refdef.entities[i];
                Mod_CheckLoaded(currentrenderentity->model);
 
                // move view-relative models to where they should be
@@ -430,9 +421,9 @@ int R_DrawBModelSky (void)
        if (!r_drawentities.integer)
                return false;
 
-       for (i = 0;i < cl_numvisedicts;i++)
+       for (i = 0;i < r_refdef.numentities;i++)
        {
-               currentrenderentity = &cl_visedicts[i]->render;
+               currentrenderentity = r_refdef.entities[i];
                if (currentrenderentity->visframe == r_framecount && currentrenderentity->model->DrawSky)
                {
                        currentrenderentity->model->DrawSky();
@@ -449,9 +440,9 @@ void R_DrawModels (void)
        if (!r_drawentities.integer)
                return;
 
-       for (i = 0;i < cl_numvisedicts;i++)
+       for (i = 0;i < r_refdef.numentities;i++)
        {
-               currentrenderentity = &cl_visedicts[i]->render;
+               currentrenderentity = r_refdef.entities[i];
                if (currentrenderentity->visframe == r_framecount && currentrenderentity->model->Draw)
                        currentrenderentity->model->Draw();
        }
@@ -474,17 +465,17 @@ void R_DrawViewModel (void)
        R_LerpAnimation(currentrenderentity);
 
        // hack the depth range to prevent view model from poking into walls
-       if (gl_viewmodeldepthhack.integer)
-       {
-               R_Mesh_Render();
-               glDepthRange (gldepthmin, gldepthmin + 0.3*(gldepthmax-gldepthmin));
-       }
+//     if (gl_viewmodeldepthhack.integer)
+//     {
+//             R_Mesh_Render();
+//             glDepthRange (gldepthmin, gldepthmin + 0.3*(gldepthmax-gldepthmin));
+//     }
        currentrenderentity->model->Draw();
-       if (gl_viewmodeldepthhack.integer)
-       {
-               R_Mesh_Render();
-               glDepthRange (gldepthmin, gldepthmax);
-       }
+//     if (gl_viewmodeldepthhack.integer)
+//     {
+//             R_Mesh_Render();
+//             glDepthRange (gldepthmin, gldepthmax);
+//     }
 }
 
 static void R_SetFrustum (void)
@@ -541,108 +532,53 @@ static void R_SetupFrame (void)
        r_oldviewleaf = r_viewleaf;
        r_viewleaf = Mod_PointInLeaf (r_origin, cl.worldmodel);
 
-       V_SetContentsColor (r_viewleaf->contents);
-       V_CalcBlend ();
-
 //     r_cache_thrash = false;
 
-       c_brush_polys = 0;
-       c_alias_polys = 0;
-       c_light_polys = 0;
-       c_faces = 0;
-       c_nodes = 0;
-       c_leafs = 0;
-       c_models = 0;
-       c_bmodels = 0;
-       c_sprites = 0;
-       c_particles = 0;
-//     c_dlights = 0;
-
        R_AnimateLight ();
 }
 
 
-static void MYgluPerspective(GLdouble fovx, GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar )
-{
-       GLdouble xmax, ymax;
-
-       xmax = zNear * tan( fovx * M_PI / 360.0 ) * aspect;
-       ymax = zNear * tan( fovy * M_PI / 360.0 );
-
-       if (r_viewleaf->contents != CONTENTS_EMPTY && r_viewleaf->contents != CONTENTS_SOLID)
-       {
-               xmax *= (sin(cl.time * 4.7) * 0.03 + 0.97);
-               ymax *= (sin(cl.time * 3.0) * 0.03 + 0.97);
-       }
-
-       glFrustum(-xmax, xmax, -ymax, ymax, zNear, zFar );
-}
-
-
-/*
-=============
-R_SetupGL
-=============
-*/
-static void R_SetupGL (void)
-{
-       if (!r_render.integer)
-               return;
-
-//     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // LordHavoc: moved to SCR_UpdateScreen
-       gldepthmin = 0;
-       gldepthmax = 1;
-       glDepthFunc (GL_LEQUAL);
-
-       glDepthRange (gldepthmin, gldepthmax);
-
-       // update farclip based on previous frame
-       r_farclip = r_newfarclip;
-
-       // set up viewpoint
-       glMatrixMode(GL_PROJECTION);
-       glLoadIdentity ();
-
-       // y is weird beause OpenGL is bottom to top, we use top to bottom
-       glViewport(r_refdef.x, vid.realheight - (r_refdef.y + r_refdef.height), r_refdef.width, r_refdef.height);
-//     yfov = 2*atan((float)r_refdef.height/r_refdef.width)*180/M_PI;
-       MYgluPerspective (r_refdef.fov_x, r_refdef.fov_y, r_refdef.width/r_refdef.height, 4, r_farclip);
-
-       glCullFace(GL_FRONT);
-
-       glMatrixMode(GL_MODELVIEW);
-       glLoadIdentity ();
-
-       glRotatef (-90,  1, 0, 0);          // put Z going up
-       glRotatef (90,  0, 0, 1);           // put Z going up
-       glRotatef (-r_refdef.viewangles[2],  1, 0, 0);
-       glRotatef (-r_refdef.viewangles[0],  0, 1, 0);
-       glRotatef (-r_refdef.viewangles[1],  0, 0, 1);
-       glTranslatef (-r_refdef.vieworg[0],  -r_refdef.vieworg[1],  -r_refdef.vieworg[2]);
-
-//     glGetFloatv (GL_MODELVIEW_MATRIX, r_world_matrix);
-
-       //
-       // set drawing parms
-       //
-//     if (gl_cull.integer)
-               glEnable(GL_CULL_FACE);
-//     else
-//             glDisable(GL_CULL_FACE);
-
-       glEnable(GL_BLEND); // was Disable
-       glEnable(GL_DEPTH_TEST);
-       glDepthMask(1);
-}
+static int blendviewpolyindex[3] = {0, 1, 2};
 
 static void R_BlendView(void)
 {
+       rmeshinfo_t m;
+       float tvxyz[3][4], r;
+
        if (!r_render.integer)
                return;
 
-       if (v_blend[3] < 0.01f)
+       if (r_refdef.viewblend[3] < 0.01f)
                return;
 
+       memset(&m, 0, sizeof(m));
+       m.transparent = false;
+       m.blendfunc1 = GL_SRC_ALPHA;
+       m.blendfunc2 = GL_ONE;
+       m.depthdisable = true; // magic
+       m.numtriangles = 1;
+       m.numverts = 3;
+       m.index = blendviewpolyindex;
+       m.vertex = &tvxyz[0][0];
+       m.vertexstep = sizeof(float[4]);
+       m.cr = r_refdef.viewblend[0];
+       m.cg = r_refdef.viewblend[1];
+       m.cb = r_refdef.viewblend[2];
+       m.ca = r_refdef.viewblend[3];
+       r = 64000;
+       tvxyz[0][0] = r_origin[0] + vpn[0] * 1.5 - vright[0] * r - vup[0] * r;
+       tvxyz[0][1] = r_origin[1] + vpn[1] * 1.5 - vright[1] * r - vup[1] * r;
+       tvxyz[0][2] = r_origin[2] + vpn[2] * 1.5 - vright[2] * r - vup[2] * r;
+       r *= 3;
+       tvxyz[1][0] = tvxyz[0][0] + vup[0] * r;
+       tvxyz[1][1] = tvxyz[0][1] + vup[1] * r;
+       tvxyz[1][2] = tvxyz[0][2] + vup[2] * r;
+       tvxyz[2][0] = tvxyz[0][0] + vright[0] * r;
+       tvxyz[2][1] = tvxyz[0][1] + vright[1] * r;
+       tvxyz[2][2] = tvxyz[0][2] + vright[2] * r;
+       R_Mesh_Draw(&m);
+
+       /*
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity ();
        glOrtho  (0, 1, 1, 0, -99999, 99999);
@@ -654,10 +590,7 @@ static void R_BlendView(void)
        glEnable(GL_BLEND);
        glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glBegin (GL_TRIANGLES);
-       if (lighthalf)
-               glColor4f (v_blend[0] * 0.5f, v_blend[1] * 0.5f, v_blend[2] * 0.5f, v_blend[3]);
-       else
-               glColor4fv (v_blend);
+       glColor4f (r_refdef.viewblend[0] * overbrightscale, r_refdef.viewblend[1] * overbrightscale, r_refdef.viewblend[2] * overbrightscale, r_refdef.viewblend[3]);
        glVertex2f (-5, -5);
        glVertex2f (10, -5);
        glVertex2f (-5, 10);
@@ -667,6 +600,7 @@ static void R_BlendView(void)
        glEnable (GL_DEPTH_TEST);
        glDisable(GL_BLEND);
        glEnable(GL_TEXTURE_2D);
+       */
 }
 
 /*
@@ -679,7 +613,7 @@ r_refdef must be set before the first call
 void R_RenderView (void)
 {
        if (!cl.worldmodel)
-               Host_Error ("R_RenderView: NULL worldmodel");
+               return; //Host_Error ("R_RenderView: NULL worldmodel");
 
        // FIXME: move to client
        R_MoveExplosions();
@@ -687,14 +621,14 @@ void R_RenderView (void)
 
        R_SetupFrame();
        R_SetFrustum();
-       R_SetupGL();
        R_SetupFog();
        R_SkyStartFrame();
-       R_Mesh_Clear();
        if (r_ser.integer)
                R_Clip_StartFrame();
        R_BuildLightList();
 
+       R_Mesh_Start();
+
        R_TimeReport("setup");
 
        R_DrawWorld();
@@ -712,16 +646,24 @@ void R_RenderView (void)
        R_MarkWorldLights();
        R_TimeReport("marklights");
 
-       if (skyrendermasked && R_DrawBModelSky())
+       if (skyrendermasked)
+       {
+               if (R_DrawBModelSky())
+                       R_TimeReport("bmodelsky");
+       }
+       else
        {
-               R_TimeReport("bmodelsky");
+               R_DrawViewModel();
+               R_TimeReport("viewmodel");
        }
 
        R_SetupForWorldRendering();
        R_PrepareSurfaces();
        R_TimeReport("surfprep");
 
-       R_DrawSurfacesAll();
+       R_DrawSurfaces(SHADERSTAGE_SKY);
+       R_DrawSurfaces(SHADERSTAGE_NORMAL);
+       R_DrawSurfaces(SHADERSTAGE_FOG);
        R_TimeReport("surfdraw");
 
        if (r_drawportals.integer)
@@ -731,16 +673,18 @@ void R_RenderView (void)
        }
 
        // don't let sound skip if going slow
-       if (!intimerefresh && !r_speeds2.integer)
+       if (!intimerefresh && !r_speeds.integer)
                S_ExtraUpdate ();
 
-       R_DrawViewModel();
+       if (skyrendermasked)
+       {
+               R_DrawViewModel();
+               R_TimeReport("viewmodel");
+       }
+
        R_DrawModels();
        R_TimeReport("models");
 
-       R_DrawDecals();
-       R_TimeReport("decals");
-
        R_DrawParticles();
        R_TimeReport("particles");
 
@@ -749,15 +693,18 @@ void R_RenderView (void)
 
        // draw transparent meshs
        R_Mesh_AddTransparent();
-       R_TimeReport("sorttrans");
+       R_TimeReport("addtrans");
 
-       // render any queued meshs
-       R_Mesh_Render();
-       R_TimeReport("meshrender");
+       R_DrawCoronas();
+       R_TimeReport("coronas");
 
        R_BlendView();
        R_TimeReport("blendview");
 
-       Mem_CheckSentinelsGlobal();
-       R_TimeReport("memtest");
+       // render any queued meshs
+       R_Mesh_Finish();
+       R_TimeReport("meshfinish");
+
+       //Mem_CheckSentinelsGlobal();
+       //R_TimeReport("memtest");
 }