]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmisc.c
Small fixes to tab completion
[xonotic/darkplaces.git] / gl_rmisc.c
index 6089fa1b94a96160612384b1e5ff6e7642f3c3f3..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.
 
@@ -29,79 +29,104 @@ R_Envmap_f
 Grab six views for environment mapping tests
 ===============
 */
+float CalcFov (float fov_x, float width, float height);
+struct
+{
+       float angles[3];
+       char *name;
+}
+envmapinfo[6] =
+{
+       {{  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)
 {
-       byte    buffer[256*256*4];
+       int             i, size;
+       char    filename[256];
+       char    basename[256];
+       byte    *buffer, gamma[256];
+
+       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;
 
-       glDrawBuffer  (GL_FRONT);
-       glReadBuffer  (GL_FRONT);
+       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)
+       {
+               Con_Printf("envmap: your resolution is not big enough to render that size\n");
+               return;
+       }
+
+       buffer = malloc(size*size*3);
+       if (buffer == NULL)
+       {
+               Con_Printf("envmap: unable to allocate memory for image\n");
+               return;
+       }
+
+       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;
 
-       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));             
+       r_refdef.x = 0;
+       r_refdef.y = 0;
+       r_refdef.width = size;
+       r_refdef.height = size;
+
+       r_refdef.fov_x = 90;
+       r_refdef.fov_y = 90;
+
+       for (i = 0;i < 6;i++)
+       {
+               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);
-       GL_EndRendering ();
-}
 
-void R_InitParticles (void);
+       free(buffer);
 
-void gl_misc_start()
+       // cause refdef to be fixed
+//     vid.recalc_refdef = 1;
+}
+
+static void gl_misc_start(void)
 {
 }
 
-void gl_misc_shutdown()
+static void gl_misc_shutdown(void)
 {
 }
 
-void gl_misc_newmap()
+static void gl_misc_newmap(void)
 {
 }
 
@@ -110,53 +135,34 @@ void gl_misc_newmap()
 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);        
+{
+       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);
 }
 
-void R_ClearParticles (void);
-void GL_BuildLightmaps (void);
+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.render.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_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;
-       }
        SHOWLMP_clear();
 }
 
@@ -169,22 +175,24 @@ For program optimization
 ====================
 */
 qboolean intimerefresh = 0;
-void R_TimeRefresh_f (void)
+static void R_TimeRefresh_f (void)
 {
        int                     i;
        float           start, stop, time;
 
        intimerefresh = 1;
-       start = Sys_FloatTime ();
+       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;
-               SCR_UpdateScreen();
+               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);