]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmisc.c
Small fixes to tab completion
[xonotic/darkplaces.git] / gl_rmisc.c
index ceb79089998ed44b0a5f949b85b03170223374a6..5cf56120ec71628880160189ebd16a1dd6e7e266 100644 (file)
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -22,41 +22,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "quakedef.h"
 
 
-
-/*
-==================
-R_InitTextures
-==================
-*/
-void   R_InitTextures (void)
-{
-       int             x,y, m;
-       byte    *dest;
-
-// create a simple checkerboard texture for the default
-       r_notexture_mip = Hunk_AllocName (sizeof(texture_t) + 16*16+8*8+4*4+2*2, "notexture");
-       
-       r_notexture_mip->width = r_notexture_mip->height = 16;
-       r_notexture_mip->offsets[0] = sizeof(texture_t);
-       r_notexture_mip->offsets[1] = r_notexture_mip->offsets[0] + 16*16;
-       r_notexture_mip->offsets[2] = r_notexture_mip->offsets[1] + 8*8;
-       r_notexture_mip->offsets[3] = r_notexture_mip->offsets[2] + 4*4;
-       r_notexture_mip->transparent = FALSE;
-       
-       for (m=0 ; m<4 ; m++)
-       {
-               dest = (byte *)r_notexture_mip + r_notexture_mip->offsets[m];
-               for (y=0 ; y< (16>>m) ; y++)
-                       for (x=0 ; x< (16>>m) ; x++)
-                       {
-                               if (  (y< (8>>m) ) ^ (x< (8>>m) ) )
-                                       *dest++ = 0;
-                               else
-                                       *dest++ = 0xff;
-                       }
-       }       
-}
-
 /*
 ===============
 R_Envmap_f
@@ -64,302 +29,140 @@ R_Envmap_f
 Grab six views for environment mapping tests
 ===============
 */
-void R_Envmap_f (void)
+float CalcFov (float fov_x, float width, float height);
+struct
 {
-       byte    buffer[256*256*4];
-
-       glDrawBuffer  (GL_FRONT);
-       glReadBuffer  (GL_FRONT);
-       envmap = true;
-
-       r_refdef.vrect.x = 0;
-       r_refdef.vrect.y = 0;
-       r_refdef.vrect.width = 256;
-       r_refdef.vrect.height = 256;
-
-       r_refdef.viewangles[0] = 0;
-       r_refdef.viewangles[1] = 0;
-       r_refdef.viewangles[2] = 0;
-       GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
-       R_RenderView ();
-       glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-       COM_WriteFile ("env0.rgb", buffer, sizeof(buffer));             
-
-       r_refdef.viewangles[1] = 90;
-       GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
-       R_RenderView ();
-       glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-       COM_WriteFile ("env1.rgb", buffer, sizeof(buffer));             
-
-       r_refdef.viewangles[1] = 180;
-       GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
-       R_RenderView ();
-       glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-       COM_WriteFile ("env2.rgb", buffer, sizeof(buffer));             
-
-       r_refdef.viewangles[1] = 270;
-       GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
-       R_RenderView ();
-       glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-       COM_WriteFile ("env3.rgb", buffer, sizeof(buffer));             
-
-       r_refdef.viewangles[0] = -90;
-       r_refdef.viewangles[1] = 0;
-       GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
-       R_RenderView ();
-       glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-       COM_WriteFile ("env4.rgb", buffer, sizeof(buffer));             
-
-       r_refdef.viewangles[0] = 90;
-       r_refdef.viewangles[1] = 0;
-       GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
-       R_RenderView ();
-       glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-       COM_WriteFile ("env5.rgb", buffer, sizeof(buffer));             
-
-       envmap = false;
-       glDrawBuffer  (GL_BACK);
-       glReadBuffer  (GL_BACK);
-       GL_EndRendering ();
+       float angles[3];
+       char *name;
 }
-
-void R_InitParticles (void);
-
-/*
-===============
-R_Init
-===============
-*/
-void R_Init (void)
-{      
-//     extern cvar_t gl_finish;
-
-       Cmd_AddCommand ("timerefresh", R_TimeRefresh_f);        
-       Cmd_AddCommand ("envmap", R_Envmap_f);  
-       Cmd_AddCommand ("pointfile", R_ReadPointFile_f);        
-
-//     Cvar_RegisterVariable (&r_norefresh);
-//     Cvar_RegisterVariable (&r_lightmap);
-       Cvar_RegisterVariable (&r_drawentities);
-       Cvar_RegisterVariable (&r_drawviewmodel);
-       Cvar_RegisterVariable (&r_shadows);
-       Cvar_RegisterVariable (&r_wateralpha);
-       Cvar_RegisterVariable (&r_dynamic);
-       Cvar_RegisterVariable (&r_novis);
-       Cvar_RegisterVariable (&r_speeds);
-       Cvar_RegisterVariable (&r_waterripple); // LordHavoc: added waterripple
-
-//     Cvar_RegisterVariable (&gl_cull);
-//     Cvar_RegisterVariable (&gl_affinemodels);
-//     Cvar_RegisterVariable (&gl_polyblend);
-//     Cvar_RegisterVariable (&gl_flashblend);
-       Cvar_RegisterVariable (&gl_playermip);
-//     Cvar_RegisterVariable (&gl_nocolors);
-
-//     Cvar_RegisterVariable (&gl_keeptjunctions);
-//     Cvar_RegisterVariable (&gl_reporttjunctions);
-
-       R_InitParticles ();
-
-       playertextures = texture_extension_number;
-       texture_extension_number += 64; // LordHavoc: increased number of players from 16 to 64
-}
-
-qboolean VID_Is8bit(void);
-void GL_Upload8_EXT (byte *data, int width, int height,  qboolean mipmap, qboolean alpha);
-
-/*
-===============
-R_TranslatePlayerSkin
-
-Translates a skin texture by the per-player color lookup
-===============
-*/
-void R_TranslatePlayerSkin (int playernum)
+envmapinfo[6] =
 {
-       int             top, bottom;
-       byte    translate[256];
-       unsigned        translate32[256];
-       int             i, j, s;
-       model_t *model;
-       aliashdr_t *paliashdr;
-       byte    *original;
-       unsigned        pixels[512*256], *out;
-       unsigned        scaled_width, scaled_height;
-       int                     inwidth, inheight;
-       byte            *inrow;
-       unsigned        frac, fracstep;
-
-       top = cl.scores[playernum].colors & 0xf0;
-       bottom = (cl.scores[playernum].colors &15)<<4;
+       {{  0,   0, 0}, "ft"},
+       {{  0,  90, 0}, "rt"},
+       {{  0, 180, 0}, "bk"},
+       {{  0, 270, 0}, "lf"},
+       {{-90,  90, 0}, "up"},
+       {{ 90,  90, 0}, "dn"}
+};
+void R_Envmap_f (void)
+{
+       int             i, size;
+       char    filename[256];
+       char    basename[256];
+       byte    *buffer, gamma[256];
 
-       for (i=0 ; i<256 ; i++)
-               translate[i] = i;
+       if (Cmd_Argc() != 3)
+       {
+               Con_Printf ("envmap <basename> <size>: save out 6 cubic environment map images, usable with loadsky, note that size must one of 128, 256, 512, or 1024 and can't be bigger than your current resolution\n");
+               return;
+       }
+
+       if (!r_render.value)
+               return;
 
-       for (i=0 ; i<16 ; i++)
+       strcpy(basename, Cmd_Argv(1));
+       size = atoi(Cmd_Argv(2));
+       if (size != 128 && size != 256 && size != 512 && size != 1024)
+       {
+               Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n");
+               return;
+       }
+       if (size > vid.realwidth || size > vid.realheight)
        {
-               // LordHavoc: corrected color ranges
-               if (top < 128 || (top >= 224 && top < 240))     // the artists made some backwards ranges.  sigh.
-                       translate[TOP_RANGE+i] = top+i;
-               else
-                       translate[TOP_RANGE+i] = top+15-i;
-
-               // LordHavoc: corrected color ranges
-               if (bottom < 128 || (bottom >= 224 && bottom < 240))
-                       translate[BOTTOM_RANGE+i] = bottom+i;
-               else
-                       translate[BOTTOM_RANGE+i] = bottom+15-i;
+               Con_Printf("envmap: your resolution is not big enough to render that size\n");
+               return;
        }
 
-       //
-       // locate the original skin pixels
-       //
-       currententity = &cl_entities[1+playernum];
-       model = currententity->model;
-       if (!model)
-               return;         // player doesn't have a model yet
-       if (model->type != mod_alias)
-               return; // only translate skins on alias models
-
-       paliashdr = (aliashdr_t *)Mod_Extradata (model);
-       s = paliashdr->skinwidth * paliashdr->skinheight;
-       if (currententity->skinnum < 0 || currententity->skinnum >= paliashdr->numskins)
+       buffer = malloc(size*size*3);
+       if (buffer == NULL)
        {
-               Con_Printf("(%d): Invalid player skin #%d\n", playernum, currententity->skinnum);
-               original = (byte *)paliashdr + paliashdr->texels[0];
+               Con_Printf("envmap: unable to allocate memory for image\n");
+               return;
        }
-       else
-               original = (byte *)paliashdr + paliashdr->texels[currententity->skinnum];
-       if (s & 3)
-               Sys_Error ("R_TranslateSkin: s&3");
 
-       inwidth = paliashdr->skinwidth;
-       inheight = paliashdr->skinheight;
+       BuildGammaTable8((lighthalf && hardwaregammasupported) ? 2.0f : 1.0f, 1, 1, 0, gamma);
+
+//     glDrawBuffer  (GL_FRONT);
+//     glReadBuffer  (GL_FRONT);
+       glDrawBuffer  (GL_BACK);
+       glReadBuffer  (GL_BACK);
+       envmap = true;
 
-       // because this happens during gameplay, do it fast
-       // instead of sending it through gl_upload 8
-    glBindTexture(GL_TEXTURE_2D, playertextures + playernum);
+       r_refdef.x = 0;
+       r_refdef.y = 0;
+       r_refdef.width = size;
+       r_refdef.height = size;
 
-#if 0
-       byte    translated[320*200];
+       r_refdef.fov_x = 90;
+       r_refdef.fov_y = 90;
 
-       for (i=0 ; i<s ; i+=4)
+       for (i = 0;i < 6;i++)
        {
-               translated[i] = translate[original[i]];
-               translated[i+1] = translate[original[i+1]];
-               translated[i+2] = translate[original[i+2]];
-               translated[i+3] = translate[original[i+3]];
+               VectorCopy(envmapinfo[i].angles, r_refdef.viewangles);
+               glClearColor(0,0,0,0);
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // LordHavoc: clear the screen (around the view as well)
+               R_RenderView ();
+               glReadPixels (0, 0, size, size, GL_RGB, GL_UNSIGNED_BYTE, buffer);
+               sprintf(filename, "env/%s%s.tga", basename, envmapinfo[i].name);
+               Image_GammaRemapRGB(buffer, buffer, size * size, gamma, gamma, gamma);
+               Image_WriteTGARGB_preflipped(filename, size, size, buffer);
        }
 
+       envmap = false;
+       glDrawBuffer  (GL_BACK);
+       glReadBuffer  (GL_BACK);
 
-       // don't mipmap these, because it takes too long
-       GL_Upload8 (translated, paliashdr->skinwidth, paliashdr->skinheight, false, false, true);
-#else
-       scaled_width = gl_max_size.value < 512 ? gl_max_size.value : 512;
-       scaled_height = gl_max_size.value < 256 ? gl_max_size.value : 256;
-
-       // allow users to crunch sizes down even more if they want
-       scaled_width >>= (int)gl_playermip.value;
-       scaled_height >>= (int)gl_playermip.value;
-
-       if (VID_Is8bit())
-       { // 8bit texture upload
-               byte *out2;
-
-               out2 = (byte *)pixels;
-               memset(pixels, 0, sizeof(pixels));
-               fracstep = inwidth*0x10000/scaled_width;
-               for (i=0 ; i<scaled_height ; i++, out2 += scaled_width)
-               {
-                       inrow = original + inwidth*(i*inheight/scaled_height);
-                       frac = fracstep >> 1;
-                       for (j=0 ; j<scaled_width ; j+=4)
-                       {
-                               out2[j] = translate[inrow[frac>>16]];
-                               frac += fracstep;
-                               out2[j+1] = translate[inrow[frac>>16]];
-                               frac += fracstep;
-                               out2[j+2] = translate[inrow[frac>>16]];
-                               frac += fracstep;
-                               out2[j+3] = translate[inrow[frac>>16]];
-                               frac += fracstep;
-                       }
-               }
-
-               GL_Upload8_EXT ((byte *)pixels, scaled_width, scaled_height, false, false);
-               return;
-       }
+       free(buffer);
 
-       for (i=0 ; i<256 ; i++)
-               translate32[i] = d_8to24table[translate[i]];
+       // cause refdef to be fixed
+//     vid.recalc_refdef = 1;
+}
 
-       out = pixels;
-       fracstep = inwidth*0x10000/scaled_width;
-       for (i=0 ; i<scaled_height ; i++, out += scaled_width)
-       {
-               inrow = original + inwidth*(i*inheight/scaled_height);
-               frac = fracstep >> 1;
-               for (j=0 ; j<scaled_width ; j+=4)
-               {
-                       out[j] = translate32[inrow[frac>>16]];
-                       frac += fracstep;
-                       out[j+1] = translate32[inrow[frac>>16]];
-                       frac += fracstep;
-                       out[j+2] = translate32[inrow[frac>>16]];
-                       frac += fracstep;
-                       out[j+3] = translate32[inrow[frac>>16]];
-                       frac += fracstep;
-               }
-       }
-       glTexImage2D (GL_TEXTURE_2D, 0, gl_solid_format, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+static void gl_misc_start(void)
+{
+}
 
-       glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-#endif
+static void gl_misc_shutdown(void)
+{
+}
 
+static void gl_misc_newmap(void)
+{
 }
 
-void R_ClearParticles (void);
-void GL_BuildLightmaps (void);
+/*
+===============
+R_Init
+===============
+*/
+static void R_TimeRefresh_f (void);
+void GL_Misc_Init (void)
+{
+       Cmd_AddCommand ("envmap", R_Envmap_f);
+       Cmd_AddCommand ("timerefresh", R_TimeRefresh_f);
+
+       R_RegisterModule("GL_Misc", gl_misc_start, gl_misc_shutdown, gl_misc_newmap);
+}
+
+extern void GL_BuildLightmaps (void);
 
 /*
 ===============
 R_NewMap
 ===============
 */
-void SHOWLMP_clear();
 void R_NewMap (void)
 {
        int             i;
-       
+
        for (i=0 ; i<256 ; i++)
                d_lightstylevalue[i] = 264;             // normal light value
 
-       memset (&r_worldentity, 0, sizeof(r_worldentity));
-       r_worldentity.model = cl.worldmodel;
-       currententity = &r_worldentity;
-
-// clear out efrags in case the level hasn't been reloaded
-// FIXME: is this one short?
-       for (i=0 ; i<cl.worldmodel->numleafs ; i++)
-               cl.worldmodel->leafs[i].efrags = NULL;
-                       
        r_viewleaf = NULL;
-       R_ClearParticles ();
+       R_Modules_NewMap();
 
        GL_BuildLightmaps ();
 
-       // identify sky texture
-       skytexturenum = -1;
-       for (i=0 ; i<cl.worldmodel->numtextures ; i++)
-       {
-               if (!cl.worldmodel->textures[i])
-                       continue;
-               if (!strncmp(cl.worldmodel->textures[i]->name,"sky",3) )
-                       skytexturenum = i;
-               cl.worldmodel->textures[i]->texturechain = NULL;
-       }
        SHOWLMP_clear();
 }
 
@@ -371,25 +174,28 @@ R_TimeRefresh_f
 For program optimization
 ====================
 */
-void R_TimeRefresh_f (void)
+qboolean intimerefresh = 0;
+static void R_TimeRefresh_f (void)
 {
        int                     i;
        float           start, stop, time;
 
-       start = Sys_FloatTime ();
-       for (i=0 ; i<128 ; i++)
+       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;
-               SCR_UpdateScreen();
+               r_refdef.viewangles[2] = 0;
+               R_RenderView();
        }
+       glDrawBuffer  (GL_BACK);
 
-       stop = Sys_FloatTime ();
+       stop = Sys_DoubleTime ();
+       intimerefresh = 0;
        time = stop-start;
        Con_Printf ("%f seconds (%f fps)\n", time, 128/time);
 }
 
-void D_FlushCaches (void)
-{
-}
-