]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmain.c
Serious-Sam style crosshair (an actual sprite in the world, with slight variation...
[xonotic/darkplaces.git] / gl_rmain.c
index 6deea8eaebcf35d17e5bc23ab72f92d821fcd620..6c7deedefa65cd364bf325248b2e47cbf4c6cfde 100644 (file)
@@ -21,8 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "quakedef.h"
 
-//static qboolean      r_cache_thrash;         // compatability
-
 entity_render_t        *currentrenderentity;
 
 int                    r_framecount;           // used for dlight push checking
@@ -33,10 +31,6 @@ int                  c_brush_polys, c_alias_polys, c_light_polys, c_faces, c_nodes, c_leafs, c_
 
 qboolean       envmap;                         // true during envmap command capture
 
-// LordHavoc: moved all code related to particles into r_part.c
-//int                  particletexture;        // little dot for particles
-//int                  playertextures;         // up to 16 color translated skins
-
 //
 // view origin
 //
@@ -45,9 +39,6 @@ vec3_t        vpn;
 vec3_t vright;
 vec3_t r_origin;
 
-//float        r_world_matrix[16];
-//float        r_base_world_matrix[16];
-
 //
 // screen size info
 //
@@ -57,20 +48,15 @@ mleaf_t             *r_viewleaf, *r_oldviewleaf;
 
 unsigned short d_lightstylevalue[256]; // 8.8 fraction of base light value
 
-//cvar_t       r_norefresh = {0, "r_norefresh","0"};
 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_fullbright = {0, "r_fullbright","0"};
-//cvar_t       r_lightmap = {0, "r_lightmap","0"};
 cvar_t r_wateralpha = {CVAR_SAVE, "r_wateralpha","1"};
 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"};
 cvar_t gl_fogdensity = {0, "gl_fogdensity", "0.25"};
 cvar_t gl_fogred = {0, "gl_fogred","0.3"};
@@ -79,8 +65,7 @@ cvar_t        gl_fogblue = {0, "gl_fogblue","0.3"};
 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 r_ser = {CVAR_SAVE, "r_ser", "0"};
 
 cvar_t r_multitexture = {0, "r_multitexture", "1"};
 
@@ -99,15 +84,13 @@ static void R_TimeRefresh_f (void)
 
        intimerefresh = 1;
        start = Sys_DoubleTime ();
-       glDrawBuffer (GL_FRONT);
        for (i = 0;i < 128;i++)
        {
                r_refdef.viewangles[0] = 0;
                r_refdef.viewangles[1] = i/128.0*360.0;
                r_refdef.viewangles[2] = 0;
-               R_RenderView();
+               CL_UpdateScreen();
        }
-       glDrawBuffer  (GL_BACK);
 
        stop = Sys_DoubleTime ();
        intimerefresh = 0;
@@ -161,8 +144,6 @@ loc0:
        goto loc0;
 }
 
-qboolean lighthalf;
-
 vec3_t fogcolor;
 vec_t fogdensity;
 float fog_density, fog_red, fog_green, fog_blue;
@@ -255,16 +236,12 @@ void GL_Main_Init(void)
        Cvar_RegisterVariable (&r_drawentities);
        Cvar_RegisterVariable (&r_drawviewmodel);
        Cvar_RegisterVariable (&r_speeds);
-       Cvar_RegisterVariable (&gl_lightmode);
-//     Cvar_RegisterVariable (&r_dynamicwater);
-//     Cvar_RegisterVariable (&r_dynamicbothsides);
        Cvar_RegisterVariable (&r_fullbrights);
        Cvar_RegisterVariable (&r_wateralpha);
        Cvar_RegisterVariable (&r_dynamic);
        Cvar_RegisterVariable (&r_waterripple);
        Cvar_RegisterVariable (&r_fullbright);
        Cvar_RegisterVariable (&r_ser);
-       Cvar_RegisterVariable (&gl_viewmodeldepthhack);
        Cvar_RegisterVariable (&r_multitexture);
        if (gamemode == GAME_NEHAHRA)
                Cvar_SetValue("r_fullbrights", 0);
@@ -297,7 +274,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);
@@ -318,7 +294,6 @@ 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();
@@ -345,17 +320,13 @@ void GL_Init (void)
        gl_extensions = glGetString (GL_EXTENSIONS);
        Con_Printf ("GL_EXTENSIONS: %s\n", gl_extensions);
 
-//     Con_Printf ("%s %s\n", gl_renderer, gl_version);
-
        VID_CheckExtensions();
 
        // LordHavoc: report supported extensions
        Con_Printf ("\nengine extensions: %s\n", ENGINE_EXTENSIONS);
 
-       glCullFace(GL_FRONT);
-       glEnable(GL_TEXTURE_2D);
-
-//     glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
+       qglCullFace(GL_FRONT);
+       qglEnable(GL_TEXTURE_2D);
 }
 
 
@@ -470,18 +441,7 @@ 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));
-       }
        currentrenderentity->model->Draw();
-       if (gl_viewmodeldepthhack.integer)
-       {
-               R_Mesh_Render();
-               glDepthRange (gldepthmin, gldepthmax);
-       }
 }
 
 static void R_SetFrustum (void)
@@ -538,117 +498,46 @@ static void R_SetupFrame (void)
        r_oldviewleaf = r_viewleaf;
        r_viewleaf = Mod_PointInLeaf (r_origin, cl.worldmodel);
 
-//     r_cache_thrash = false;
-
        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)
 {
-       if (!r_render.integer)
-               return;
+       rmeshinfo_t m;
+       float tvxyz[3][4], r;
 
        if (r_refdef.viewblend[3] < 0.01f)
                return;
 
-       glMatrixMode(GL_PROJECTION);
-       glLoadIdentity ();
-       glOrtho  (0, 1, 1, 0, -99999, 99999);
-       glMatrixMode(GL_MODELVIEW);
-       glLoadIdentity ();
-       glDisable (GL_DEPTH_TEST);
-       glDisable (GL_CULL_FACE);
-       glDisable(GL_TEXTURE_2D);
-       glEnable(GL_BLEND);
-       glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-       glBegin (GL_TRIANGLES);
-       if (lighthalf)
-               glColor4f (r_refdef.viewblend[0] * 0.5f, r_refdef.viewblend[1] * 0.5f, r_refdef.viewblend[2] * 0.5f, r_refdef.viewblend[3]);
-       else
-               glColor4fv (r_refdef.viewblend);
-       glVertex2f (-5, -5);
-       glVertex2f (10, -5);
-       glVertex2f (-5, 10);
-       glEnd ();
-
-       glEnable (GL_CULL_FACE);
-       glEnable (GL_DEPTH_TEST);
-       glDisable(GL_BLEND);
-       glEnable(GL_TEXTURE_2D);
+       memset(&m, 0, sizeof(m));
+       m.transparent = false;
+       m.blendfunc1 = GL_SRC_ALPHA;
+       m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA;
+       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);
 }
 
 /*
@@ -661,7 +550,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();
@@ -669,14 +558,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();
@@ -711,7 +600,6 @@ void R_RenderView (void)
 
        R_DrawSurfaces(SHADERSTAGE_SKY);
        R_DrawSurfaces(SHADERSTAGE_NORMAL);
-       R_DrawSurfaces(SHADERSTAGE_FOG);
        R_TimeReport("surfdraw");
 
        if (r_drawportals.integer)
@@ -746,13 +634,14 @@ void R_RenderView (void)
        R_DrawCoronas();
        R_TimeReport("coronas");
 
-       // render any queued meshs
-       R_Mesh_Render();
-       R_TimeReport("meshrender");
-
        R_BlendView();
        R_TimeReport("blendview");
 
-       //Mem_CheckSentinelsGlobal();
-       //R_TimeReport("memtest");
+       R_DrawCrosshair();
+       R_TimeReport("crosshair");
+
+       // render any queued meshs
+       R_Mesh_Finish();
+       R_TimeReport("meshfinish");
 }
+