home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quakeworld_src / client / gl_rmisc.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-17  |  12.0 KB  |  474 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. // r_misc.c
  21.  
  22. #include "quakedef.h"
  23.  
  24. extern void R_InitBubble();
  25.  
  26. /*
  27. ==================
  28. R_InitTextures
  29. ==================
  30. */
  31. void  R_InitTextures (void)
  32. {
  33.   int   x,y, m;
  34.   byte  *dest;
  35.  
  36. // create a simple checkerboard texture for the default
  37.   r_notexture_mip = Hunk_AllocName (sizeof(texture_t) + 16*16+8*8+4*4+2*2, "notexture");
  38.   
  39.   r_notexture_mip->width = r_notexture_mip->height = 16;
  40.   r_notexture_mip->offsets[0] = sizeof(texture_t);
  41.   r_notexture_mip->offsets[1] = r_notexture_mip->offsets[0] + 16*16;
  42.   r_notexture_mip->offsets[2] = r_notexture_mip->offsets[1] + 8*8;
  43.   r_notexture_mip->offsets[3] = r_notexture_mip->offsets[2] + 4*4;
  44.   
  45.   for (m=0 ; m<4 ; m++)
  46.   {
  47.     dest = (byte *)r_notexture_mip + r_notexture_mip->offsets[m];
  48.     for (y=0 ; y< (16>>m) ; y++)
  49.       for (x=0 ; x< (16>>m) ; x++)
  50.       {
  51.         if (  (y< (8>>m) ) ^ (x< (8>>m) ) )
  52.           *dest++ = 0;
  53.         else
  54.           *dest++ = 0xff;
  55.       }
  56.   } 
  57. }
  58.  
  59. byte  dottexture[8][8] =
  60. {
  61.   {0,1,1,0,0,0,0,0},
  62.   {1,1,1,1,0,0,0,0},
  63.   {1,1,1,1,0,0,0,0},
  64.   {0,1,1,0,0,0,0,0},
  65.   {0,0,0,0,0,0,0,0},
  66.   {0,0,0,0,0,0,0,0},
  67.   {0,0,0,0,0,0,0,0},
  68.   {0,0,0,0,0,0,0,0},
  69. };
  70. void R_InitParticleTexture (void)
  71. {
  72.   int   x,y;
  73.   byte  data[8][8][4];
  74.  
  75.   //
  76.   // particle texture
  77.   //
  78.   particletexture = texture_extension_number++;
  79.     GL_Bind(particletexture);
  80.  
  81.   for (x=0 ; x<8 ; x++)
  82.   {
  83.     for (y=0 ; y<8 ; y++)
  84.     {
  85.       data[y][x][0] = 255;
  86.       data[y][x][1] = 255;
  87.       data[y][x][2] = 255;
  88.       data[y][x][3] = dottexture[x][y]*255;
  89.     }
  90.   }
  91.   glTexImage2D (GL_TEXTURE_2D, 0, gl_alpha_format, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
  92.  
  93.   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  94.  
  95.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  96.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  97. }
  98.  
  99. /*
  100. ===============
  101. R_Envmap_f
  102.  
  103. Grab six views for environment mapping tests
  104. ===============
  105. */
  106. void R_Envmap_f (void)
  107. {
  108.   byte  buffer[256*256*4];
  109.  
  110.   glDrawBuffer  (GL_FRONT);
  111.   glReadBuffer  (GL_FRONT);
  112.   envmap = true;
  113.  
  114.   r_refdef.vrect.x = 0;
  115.   r_refdef.vrect.y = 0;
  116.   r_refdef.vrect.width = 256;
  117.   r_refdef.vrect.height = 256;
  118.  
  119.   r_refdef.viewangles[0] = 0;
  120.   r_refdef.viewangles[1] = 0;
  121.   r_refdef.viewangles[2] = 0;
  122.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  123.   R_RenderView ();
  124.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  125.   COM_WriteFile ("env0.rgb", buffer, sizeof(buffer));   
  126.  
  127.   r_refdef.viewangles[1] = 90;
  128.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  129.   R_RenderView ();
  130.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  131.   COM_WriteFile ("env1.rgb", buffer, sizeof(buffer));   
  132.  
  133.   r_refdef.viewangles[1] = 180;
  134.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  135.   R_RenderView ();
  136.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  137.   COM_WriteFile ("env2.rgb", buffer, sizeof(buffer));   
  138.  
  139.   r_refdef.viewangles[1] = 270;
  140.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  141.   R_RenderView ();
  142.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  143.   COM_WriteFile ("env3.rgb", buffer, sizeof(buffer));   
  144.  
  145.   r_refdef.viewangles[0] = -90;
  146.   r_refdef.viewangles[1] = 0;
  147.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  148.   R_RenderView ();
  149.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  150.   COM_WriteFile ("env4.rgb", buffer, sizeof(buffer));   
  151.  
  152.   r_refdef.viewangles[0] = 90;
  153.   r_refdef.viewangles[1] = 0;
  154.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  155.   R_RenderView ();
  156.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  157.   COM_WriteFile ("env5.rgb", buffer, sizeof(buffer));   
  158.  
  159.   envmap = false;
  160.   glDrawBuffer  (GL_BACK);
  161.   glReadBuffer  (GL_BACK);
  162.   GL_EndRendering ();
  163. }
  164.  
  165. /*
  166. ===============
  167. R_Init
  168. ===============
  169. */
  170. void R_Init (void)
  171.   Cmd_AddCommand ("timerefresh", R_TimeRefresh_f);  
  172.   Cmd_AddCommand ("envmap", R_Envmap_f);  
  173.   Cmd_AddCommand ("pointfile", R_ReadPointFile_f);  
  174.  
  175.   Cvar_RegisterVariable (&r_norefresh);
  176.   Cvar_RegisterVariable (&r_lightmap);
  177.   Cvar_RegisterVariable (&r_fullbright);
  178.   Cvar_RegisterVariable (&r_drawentities);
  179.   Cvar_RegisterVariable (&r_drawviewmodel);
  180.   Cvar_RegisterVariable (&r_shadows);
  181.   Cvar_RegisterVariable (&r_mirroralpha);
  182.   Cvar_RegisterVariable (&r_wateralpha);
  183.   Cvar_RegisterVariable (&r_dynamic);
  184.   Cvar_RegisterVariable (&r_novis);
  185.   Cvar_RegisterVariable (&r_speeds);
  186.   Cvar_RegisterVariable (&r_netgraph);
  187.  
  188.   Cvar_RegisterVariable (&gl_clear);
  189.   Cvar_RegisterVariable (&gl_texsort);
  190.  
  191.   if (gl_mtexable)
  192.     Cvar_SetValue ("gl_texsort", 0.0);
  193.  
  194.   Cvar_RegisterVariable (&gl_cull);
  195.   Cvar_RegisterVariable (&gl_smoothmodels);
  196.   Cvar_RegisterVariable (&gl_affinemodels);
  197.   Cvar_RegisterVariable (&gl_polyblend);
  198.   Cvar_RegisterVariable (&gl_flashblend);
  199.   Cvar_RegisterVariable (&gl_playermip);
  200.   Cvar_RegisterVariable (&gl_nocolors);
  201.   Cvar_RegisterVariable (&gl_finish);
  202.  
  203.   Cvar_RegisterVariable (&gl_keeptjunctions);
  204.   Cvar_RegisterVariable (&gl_reporttjunctions);
  205.  
  206.   R_InitBubble();
  207.   
  208.   R_InitParticles ();
  209.   R_InitParticleTexture ();
  210.  
  211. #ifdef GLTEST
  212.   Test_Init ();
  213. #endif
  214.  
  215.   netgraphtexture = texture_extension_number;
  216.   texture_extension_number++;
  217.  
  218.   playertextures = texture_extension_number;
  219.   texture_extension_number += MAX_CLIENTS;
  220. }
  221.  
  222. /*
  223. ===============
  224. R_TranslatePlayerSkin
  225.  
  226. Translates a skin texture by the per-player color lookup
  227. ===============
  228. */
  229. void R_TranslatePlayerSkin (int playernum)
  230. {
  231.   int   top, bottom;
  232.   byte  translate[256];
  233.   unsigned  translate32[256];
  234.   int   i, j;
  235.   byte  *original;
  236.   unsigned  pixels[512*256], *out;
  237.   unsigned  scaled_width, scaled_height;
  238.   int     inwidth, inheight;
  239.   int     tinwidth, tinheight;
  240.   byte    *inrow;
  241.   unsigned  frac, fracstep;
  242.   player_info_t *player;
  243.   extern  byte    player_8bit_texels[320*200];
  244.   char s[512];
  245.  
  246.   GL_DisableMultitexture();
  247.  
  248.   player = &cl.players[playernum];
  249.   if (!player->name[0])
  250.     return;
  251.  
  252.   strcpy(s, Info_ValueForKey(player->userinfo, "skin"));
  253.   COM_StripExtension(s, s);
  254.   if (player->skin && !stricmp(s, player->skin->name))
  255.     player->skin = NULL;
  256.  
  257.   if (player->_topcolor != player->topcolor ||
  258.     player->_bottomcolor != player->bottomcolor || !player->skin) {
  259.     player->_topcolor = player->topcolor;
  260.     player->_bottomcolor = player->bottomcolor;
  261.  
  262.     top = player->topcolor;
  263.     bottom = player->bottomcolor;
  264.     top = (top < 0) ? 0 : ((top > 13) ? 13 : top);
  265.     bottom = (bottom < 0) ? 0 : ((bottom > 13) ? 13 : bottom);
  266.     top *= 16;
  267.     bottom *= 16;
  268.  
  269.     for (i=0 ; i<256 ; i++)
  270.       translate[i] = i;
  271.  
  272.     for (i=0 ; i<16 ; i++)
  273.     {
  274.       if (top < 128)  // the artists made some backwards ranges.  sigh.
  275.         translate[TOP_RANGE+i] = top+i;
  276.       else
  277.         translate[TOP_RANGE+i] = top+15-i;
  278.           
  279.       if (bottom < 128)
  280.         translate[BOTTOM_RANGE+i] = bottom+i;
  281.       else
  282.         translate[BOTTOM_RANGE+i] = bottom+15-i;
  283.     }
  284.  
  285.     //
  286.     // locate the original skin pixels
  287.     //
  288.     // real model width
  289.     tinwidth = 296;
  290.     tinheight = 194;
  291.  
  292.     if (!player->skin)
  293.       Skin_Find(player);
  294.     if ((original = Skin_Cache(player->skin)) != NULL) {
  295.       //skin data width
  296.       inwidth = 320;
  297.       inheight = 200;
  298.     } else {
  299.       original = player_8bit_texels;
  300.       inwidth = 296;
  301.       inheight = 194;
  302.     }
  303.  
  304.  
  305.     // because this happens during gameplay, do it fast
  306.     // instead of sending it through gl_upload 8
  307.     GL_Bind(playertextures + playernum);
  308.  
  309.   #if 0
  310.     s = 320*200;
  311.     byte  translated[320*200];
  312.  
  313.     for (i=0 ; i<s ; i+=4)
  314.     {
  315.       translated[i] = translate[original[i]];
  316.       translated[i+1] = translate[original[i+1]];
  317.       translated[i+2] = translate[original[i+2]];
  318.       translated[i+3] = translate[original[i+3]];
  319.     }
  320.  
  321.  
  322.     // don't mipmap these, because it takes too long
  323.     GL_Upload8 (translated, paliashdr->skinwidth, paliashdr->skinheight, 
  324.       false, false, true);
  325.   #endif
  326.  
  327.     scaled_width = gl_max_size.value < 512 ? gl_max_size.value : 512;
  328.     scaled_height = gl_max_size.value < 256 ? gl_max_size.value : 256;
  329.     // allow users to crunch sizes down even more if they want
  330.     scaled_width >>= (int)gl_playermip.value;
  331.     scaled_height >>= (int)gl_playermip.value;
  332.  
  333.     if (VID_Is8bit()) { // 8bit texture upload
  334.       byte *out2;
  335.  
  336.       out2 = (byte *)pixels;
  337.       memset(pixels, 0, sizeof(pixels));
  338.       fracstep = tinwidth*0x10000/scaled_width;
  339.       for (i=0 ; i<scaled_height ; i++, out2 += scaled_width)
  340.       {
  341.         inrow = original + inwidth*(i*tinheight/scaled_height);
  342.         frac = fracstep >> 1;
  343.         for (j=0 ; j<scaled_width ; j+=4)
  344.         {
  345.           out2[j] = translate[inrow[frac>>16]];
  346.           frac += fracstep;
  347.           out2[j+1] = translate[inrow[frac>>16]];
  348.           frac += fracstep;
  349.           out2[j+2] = translate[inrow[frac>>16]];
  350.           frac += fracstep;
  351.           out2[j+3] = translate[inrow[frac>>16]];
  352.           frac += fracstep;
  353.         }
  354.       }
  355.  
  356.       GL_Upload8_EXT ((byte *)pixels, scaled_width, scaled_height, false, false);
  357.       return;
  358.     }
  359.  
  360.     for (i=0 ; i<256 ; i++)
  361.       translate32[i] = d_8to24table[translate[i]];
  362.  
  363.     out = pixels;
  364.     memset(pixels, 0, sizeof(pixels));
  365.     fracstep = tinwidth*0x10000/scaled_width;
  366.     for (i=0 ; i<scaled_height ; i++, out += scaled_width)
  367.     {
  368.       inrow = original + inwidth*(i*tinheight/scaled_height);
  369.       frac = fracstep >> 1;
  370.       for (j=0 ; j<scaled_width ; j+=4)
  371.       {
  372.         out[j] = translate32[inrow[frac>>16]];
  373.         frac += fracstep;
  374.         out[j+1] = translate32[inrow[frac>>16]];
  375.         frac += fracstep;
  376.         out[j+2] = translate32[inrow[frac>>16]];
  377.         frac += fracstep;
  378.         out[j+3] = translate32[inrow[frac>>16]];
  379.         frac += fracstep;
  380.       }
  381.     }
  382.  
  383.     glTexImage2D (GL_TEXTURE_2D, 0, gl_solid_format, 
  384.       scaled_width, scaled_height, 0, GL_RGBA, 
  385.       GL_UNSIGNED_BYTE, pixels);
  386.  
  387.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  388.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  389.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  390.   }
  391. }
  392.  
  393. /*
  394. ===============
  395. R_NewMap
  396. ===============
  397. */
  398. void R_NewMap (void)
  399. {
  400.   int   i;
  401.   
  402.   for (i=0 ; i<256 ; i++)
  403.     d_lightstylevalue[i] = 264;   // normal light value
  404.  
  405.   memset (&r_worldentity, 0, sizeof(r_worldentity));
  406.   r_worldentity.model = cl.worldmodel;
  407.  
  408. // clear out efrags in case the level hasn't been reloaded
  409. // FIXME: is this one short?
  410.   for (i=0 ; i<cl.worldmodel->numleafs ; i++)
  411.     cl.worldmodel->leafs[i].efrags = NULL;
  412.       
  413.   r_viewleaf = NULL;
  414.   R_ClearParticles ();
  415.  
  416.   GL_BuildLightmaps ();
  417.  
  418.   // identify sky texture
  419.   skytexturenum = -1;
  420.   mirrortexturenum = -1;
  421.   for (i=0 ; i<cl.worldmodel->numtextures ; i++)
  422.   {
  423.     if (!cl.worldmodel->textures[i])
  424.       continue;
  425.     if (!Q_strncmp(cl.worldmodel->textures[i]->name,"sky",3) )
  426.       skytexturenum = i;
  427.     if (!Q_strncmp(cl.worldmodel->textures[i]->name,"window02_1",10) )
  428.       mirrortexturenum = i;
  429.     cl.worldmodel->textures[i]->texturechain = NULL;
  430.   }
  431. #ifdef QUAKE2
  432.   R_LoadSkys ();
  433. #endif
  434. }
  435.  
  436.  
  437. /*
  438. ====================
  439. R_TimeRefresh_f
  440.  
  441. For program optimization
  442. ====================
  443. */
  444. void R_TimeRefresh_f (void)
  445. {
  446.   int     i;
  447.   float   start, stop, time;
  448.  
  449.   glDrawBuffer  (GL_FRONT);
  450.   glFinish ();
  451.  
  452.   start = Sys_DoubleTime ();
  453.   for (i=0 ; i<128 ; i++)
  454.   {
  455.     r_refdef.viewangles[1] = i/128.0*360.0;
  456.     R_RenderView ();
  457.   }
  458.  
  459.   glFinish ();
  460.   stop = Sys_DoubleTime ();
  461.   time = stop-start;
  462.   Con_Printf ("%f seconds (%f fps)\n", time, 128/time);
  463.  
  464.   glDrawBuffer  (GL_BACK);
  465.   GL_EndRendering ();
  466. }
  467.  
  468. void D_FlushCaches (void)
  469. {
  470. }
  471.  
  472.  
  473.