home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / glquake_src / gl_rmisc.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-02-19  |  11.8 KB  |  460 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.  
  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, (GLint)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. /*                                         30/01/2000 removed: M.Tretene
  109.   byte  buffer[256*256*4];
  110.   char  name[1024];
  111.  
  112.   glDrawBuffer  (GL_FRONT);
  113.   glReadBuffer  (GL_FRONT);
  114.   envmap = true;
  115.  
  116.   r_refdef.vrect.x = 0;
  117.   r_refdef.vrect.y = 0;
  118.   r_refdef.vrect.width = 256;
  119.   r_refdef.vrect.height = 256;
  120.  
  121.   r_refdef.viewangles[0] = 0;
  122.   r_refdef.viewangles[1] = 0;
  123.   r_refdef.viewangles[2] = 0;
  124.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  125.   R_RenderView ();
  126.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  127.   COM_WriteFile ("env0.rgb", buffer, sizeof(buffer));   
  128.  
  129.   r_refdef.viewangles[1] = 90;
  130.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  131.   R_RenderView ();
  132.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  133.   COM_WriteFile ("env1.rgb", buffer, sizeof(buffer));   
  134.  
  135.   r_refdef.viewangles[1] = 180;
  136.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  137.   R_RenderView ();
  138.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  139.   COM_WriteFile ("env2.rgb", buffer, sizeof(buffer));   
  140.  
  141.   r_refdef.viewangles[1] = 270;
  142.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  143.   R_RenderView ();
  144.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  145.   COM_WriteFile ("env3.rgb", buffer, sizeof(buffer));   
  146.  
  147.   r_refdef.viewangles[0] = -90;
  148.   r_refdef.viewangles[1] = 0;
  149.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  150.   R_RenderView ();
  151.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  152.   COM_WriteFile ("env4.rgb", buffer, sizeof(buffer));   
  153.  
  154.   r_refdef.viewangles[0] = 90;
  155.   r_refdef.viewangles[1] = 0;
  156.   GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
  157.   R_RenderView ();
  158.   glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  159.   COM_WriteFile ("env5.rgb", buffer, sizeof(buffer));   
  160.  
  161.   envmap = false;
  162.   glDrawBuffer  (GL_BACK);
  163.   glReadBuffer  (GL_BACK);
  164.   GL_EndRendering ();
  165. */  
  166. }
  167.  
  168. /*
  169. ===============
  170. R_Init
  171. ===============
  172. */
  173. void R_Init (void)
  174.   extern byte *hunk_base;
  175.   extern cvar_t gl_finish;
  176.   extern cvar_t gl_fog;
  177.  
  178.   Cmd_AddCommand ("timerefresh", R_TimeRefresh_f);  
  179.   //Cmd_AddCommand ("envmap", R_Envmap_f);  
  180.   Cmd_AddCommand ("pointfile", R_ReadPointFile_f);  
  181.  
  182.   Cvar_RegisterVariable (&r_norefresh);
  183.   Cvar_RegisterVariable (&r_lightmap);
  184.   Cvar_RegisterVariable (&r_fullbright);
  185.   Cvar_RegisterVariable (&r_drawentities);
  186.   Cvar_RegisterVariable (&r_drawviewmodel);
  187.   Cvar_RegisterVariable (&r_shadows);
  188.   Cvar_RegisterVariable (&r_mirroralpha);
  189.   Cvar_RegisterVariable (&r_wateralpha);
  190.   Cvar_RegisterVariable (&r_dynamic);
  191.   Cvar_RegisterVariable (&r_novis);
  192.   Cvar_RegisterVariable (&r_speeds);
  193.  
  194.   Cvar_RegisterVariable (&gl_finish);
  195.   Cvar_RegisterVariable (&gl_clear);
  196.   Cvar_RegisterVariable (&gl_texsort);
  197.  
  198.   if (gl_mtexable)
  199.     Cvar_SetValue ("gl_texsort", 0.0);
  200.  
  201.   Cvar_RegisterVariable (&gl_cull);
  202.   Cvar_RegisterVariable (&gl_smoothmodels);
  203.   Cvar_RegisterVariable (&gl_affinemodels);
  204.   Cvar_RegisterVariable (&gl_polyblend);
  205.   Cvar_RegisterVariable (&gl_flashblend);
  206.   Cvar_RegisterVariable (&gl_playermip);
  207.   Cvar_RegisterVariable (&gl_nocolors);
  208.  
  209.   Cvar_RegisterVariable (&gl_keeptjunctions);
  210.   Cvar_RegisterVariable (&gl_reporttjunctions);
  211.  
  212.   Cvar_RegisterVariable (&gl_doubleeyes);
  213.   Cvar_RegisterVariable (&gl_fog);
  214.  
  215.   R_InitParticles ();
  216.   R_InitParticleTexture ();
  217.  
  218. #ifdef GLTEST
  219.   Test_Init ();
  220. #endif
  221.  
  222.   playertextures = texture_extension_number;
  223.   texture_extension_number += 16;
  224. }
  225.  
  226. /*
  227. ===============
  228. R_TranslatePlayerSkin
  229.  
  230. Translates a skin texture by the per-player color lookup
  231. ===============
  232. */
  233. void R_TranslatePlayerSkin (int playernum)
  234. {
  235.   int   top, bottom;
  236.   byte  translate[256];
  237.   unsigned  translate32[256];
  238.   int   i, j, s;
  239.   model_t *model;
  240.   aliashdr_t *paliashdr;
  241.   byte  *original;
  242.   unsigned  pixels[512*256], *out;
  243.   unsigned  scaled_width, scaled_height;
  244.   int     inwidth, inheight;
  245.   byte    *inrow;
  246.   unsigned  frac, fracstep;
  247.   extern  byte    **player_8bit_texels_tbl;
  248.  
  249.   GL_DisableMultitexture();
  250.  
  251.   top = cl.scores[playernum].colors & 0xf0;
  252.   bottom = (cl.scores[playernum].colors &15)<<4;
  253.  
  254.   for (i=0 ; i<256 ; i++)
  255.     translate[i] = i;
  256.  
  257.   for (i=0 ; i<16 ; i++)
  258.   {
  259.     if (top < 128)  // the artists made some backwards ranges.  sigh.
  260.       translate[TOP_RANGE+i] = top+i;
  261.     else
  262.       translate[TOP_RANGE+i] = top+15-i;
  263.         
  264.     if (bottom < 128)
  265.       translate[BOTTOM_RANGE+i] = bottom+i;
  266.     else
  267.       translate[BOTTOM_RANGE+i] = bottom+15-i;
  268.   }
  269.  
  270.   //
  271.   // locate the original skin pixels
  272.   //
  273.   currententity = &cl_entities[1+playernum];
  274.   model = currententity->model;
  275.   if (!model)
  276.     return;   // player doesn't have a model yet
  277.   if (model->type != mod_alias)
  278.     return; // only translate skins on alias models
  279.  
  280.   paliashdr = (aliashdr_t *)Mod_Extradata (model);
  281.   s = paliashdr->skinwidth * paliashdr->skinheight;
  282.   if (currententity->skinnum < 0 || currententity->skinnum >= paliashdr->numskins) {
  283.     Con_Printf("(%d): Invalid player skin #%d\n", playernum, currententity->skinnum);
  284.     original = (byte *)paliashdr + paliashdr->texels[0];
  285.   } else
  286.     original = (byte *)paliashdr + paliashdr->texels[currententity->skinnum];
  287.   if (s & 3)
  288.     Sys_Error ("R_TranslateSkin: s&3");
  289.  
  290.   inwidth = paliashdr->skinwidth;
  291.   inheight = paliashdr->skinheight;
  292.  
  293.   // because this happens during gameplay, do it fast
  294.   // instead of sending it through gl_upload 8
  295.     GL_Bind(playertextures + playernum);
  296.  
  297. #if 0
  298.   byte  translated[320*200];
  299.  
  300.   for (i=0 ; i<s ; i+=4)
  301.   {
  302.     translated[i] = translate[original[i]];
  303.     translated[i+1] = translate[original[i+1]];
  304.     translated[i+2] = translate[original[i+2]];
  305.     translated[i+3] = translate[original[i+3]];
  306.   }
  307.  
  308.  
  309.   // don't mipmap these, because it takes too long
  310.   GL_Upload8 (translated, paliashdr->skinwidth, paliashdr->skinheight, false, false, true);
  311. #else
  312.   scaled_width = gl_max_size.value < 512 ? gl_max_size.value : 512;
  313.   scaled_height = gl_max_size.value < 256 ? gl_max_size.value : 256;
  314.  
  315.   // allow users to crunch sizes down even more if they want
  316.   scaled_width >>= (int)gl_playermip.value;
  317.   scaled_height >>= (int)gl_playermip.value;
  318.  
  319.   if (VID_Is8bit()) { // 8bit texture upload
  320.     byte *out2;
  321.  
  322.     out2 = (byte *)pixels;
  323.     memset(pixels, 0, sizeof(pixels));
  324.     fracstep = inwidth*0x10000/scaled_width;
  325.     for (i=0 ; i<scaled_height ; i++, out2 += scaled_width)
  326.     {
  327.       inrow = original + inwidth*(i*inheight/scaled_height);
  328.       frac = fracstep >> 1;
  329.       for (j=0 ; j<scaled_width ; j+=4)
  330.       {
  331.         out2[j] = translate[inrow[frac>>16]];
  332.         frac += fracstep;
  333.         out2[j+1] = translate[inrow[frac>>16]];
  334.         frac += fracstep;
  335.         out2[j+2] = translate[inrow[frac>>16]];
  336.         frac += fracstep;
  337.         out2[j+3] = translate[inrow[frac>>16]];
  338.         frac += fracstep;
  339.       }
  340.     }
  341.  
  342.     GL_Upload8_EXT ((byte *)pixels, scaled_width, scaled_height, false, false);
  343.     return;
  344.   }
  345.  
  346.   for (i=0 ; i<256 ; i++)
  347.     translate32[i] = d_8to24table[translate[i]];
  348.  
  349.   out = pixels;
  350.   fracstep = inwidth*0x10000/scaled_width;
  351.   for (i=0 ; i<scaled_height ; i++, out += scaled_width)
  352.   {
  353.     inrow = original + inwidth*(i*inheight/scaled_height);
  354.     frac = fracstep >> 1;
  355.     for (j=0 ; j<scaled_width ; j+=4)
  356.     {
  357.       out[j] = translate32[inrow[frac>>16]];
  358.       frac += fracstep;
  359.       out[j+1] = translate32[inrow[frac>>16]];
  360.       frac += fracstep;
  361.       out[j+2] = translate32[inrow[frac>>16]];
  362.       frac += fracstep;
  363.       out[j+3] = translate32[inrow[frac>>16]];
  364.       frac += fracstep;
  365.     }
  366.   }
  367.   glTexImage2D (GL_TEXTURE_2D, 0, gl_solid_format, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
  368.  
  369.   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, (GLint)GL_MODULATE);
  370.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  371.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  372. #endif
  373.  
  374. }
  375.  
  376.  
  377. /*
  378. ===============
  379. R_NewMap
  380. ===============
  381. */
  382. void R_NewMap (void)
  383. {
  384.   int   i;
  385.   
  386.   for (i=0 ; i<256 ; i++)
  387.     d_lightstylevalue[i] = 264;   // normal light value
  388.  
  389.   memset (&r_worldentity, 0, sizeof(r_worldentity));
  390.   r_worldentity.model = cl.worldmodel;
  391.  
  392. // clear out efrags in case the level hasn't been reloaded
  393. // FIXME: is this one short?
  394.   for (i=0 ; i<cl.worldmodel->numleafs ; i++)
  395.     cl.worldmodel->leafs[i].efrags = NULL;
  396.       
  397.   r_viewleaf = NULL;
  398.   R_ClearParticles ();
  399.  
  400.   GL_BuildLightmaps ();
  401.  
  402.   // identify sky texture
  403.   skytexturenum = -1;
  404.   mirrortexturenum = -1;
  405.   for (i=0 ; i<cl.worldmodel->numtextures ; i++)
  406.   {
  407.     if (!cl.worldmodel->textures[i])
  408.       continue;
  409.     if (!Q_strncmp(cl.worldmodel->textures[i]->name,"sky",3) )
  410.       skytexturenum = i;
  411.     if (!Q_strncmp(cl.worldmodel->textures[i]->name,"window02_1",10) )
  412.       mirrortexturenum = i;
  413.     cl.worldmodel->textures[i]->texturechain = NULL;
  414.   }
  415. #ifdef QUAKE2
  416.   R_LoadSkys ();
  417. #endif
  418. }
  419.  
  420.  
  421. /*
  422. ====================
  423. R_TimeRefresh_f
  424.  
  425. For program optimization
  426. ====================
  427. */
  428. void R_TimeRefresh_f (void)
  429. {
  430.   int     i;
  431.   float   start, stop, time;
  432.   int     startangle;
  433.   vrect_t   vr;
  434.  
  435.   glDrawBuffer  (GL_FRONT);
  436.   glFinish ();
  437.  
  438.   start = Sys_FloatTime ();
  439.   for (i=0 ; i<128 ; i++)
  440.   {
  441.     r_refdef.viewangles[1] = i/128.0*360.0;
  442.     R_RenderView ();
  443.   }
  444.  
  445.   glFinish ();
  446.   stop = Sys_FloatTime ();
  447.   time = stop-start;
  448.   Con_Printf ("%f seconds (%f fps)\n", time, 128/time);
  449.  
  450.   glDrawBuffer  (GL_BACK);
  451.   GL_EndRendering ();
  452. }
  453.  
  454. void D_FlushCaches (void)
  455. {
  456. }
  457.  
  458.  
  459.