Annotation of quake1/gl_rmisc.c, revision 1.1.1.1

1.1       root        1: // r_misc.c
                      2: 
                      3: #include "quakedef.h"
                      4: 
                      5: 
                      6: 
                      7: /*
                      8: ==================
                      9: R_InitTextures
                     10: ==================
                     11: */
                     12: void   R_InitTextures (void)
                     13: {
                     14:        int             x,y, m;
                     15:        byte    *dest;
                     16: 
                     17: // create a simple checkerboard texture for the default
                     18:        r_notexture_mip = Hunk_AllocName (sizeof(texture_t) + 16*16+8*8+4*4+2*2, "notexture");
                     19:        
                     20:        r_notexture_mip->width = r_notexture_mip->height = 16;
                     21:        r_notexture_mip->offsets[0] = sizeof(texture_t);
                     22:        r_notexture_mip->offsets[1] = r_notexture_mip->offsets[0] + 16*16;
                     23:        r_notexture_mip->offsets[2] = r_notexture_mip->offsets[1] + 8*8;
                     24:        r_notexture_mip->offsets[3] = r_notexture_mip->offsets[2] + 4*4;
                     25:        
                     26:        for (m=0 ; m<4 ; m++)
                     27:        {
                     28:                dest = (byte *)r_notexture_mip + r_notexture_mip->offsets[m];
                     29:                for (y=0 ; y< (16>>m) ; y++)
                     30:                        for (x=0 ; x< (16>>m) ; x++)
                     31:                        {
                     32:                                if (  (y< (8>>m) ) ^ (x< (8>>m) ) )
                     33:                                        *dest++ = 0;
                     34:                                else
                     35:                                        *dest++ = 0xff;
                     36:                        }
                     37:        }       
                     38: }
                     39: 
                     40: byte   dottexture[8][8] =
                     41: {
                     42:        {0,1,1,0,0,0,0,0},
                     43:        {1,1,1,1,0,0,0,0},
                     44:        {1,1,1,1,0,0,0,0},
                     45:        {0,1,1,0,0,0,0,0},
                     46:        {0,0,0,0,0,0,0,0},
                     47:        {0,0,0,0,0,0,0,0},
                     48:        {0,0,0,0,0,0,0,0},
                     49:        {0,0,0,0,0,0,0,0},
                     50: };
                     51: void R_InitParticleTexture (void)
                     52: {
                     53:        int             x,y;
                     54:        byte    data[8][8][4];
                     55: 
                     56:        //
                     57:        // particle texture
                     58:        //
                     59:        particletexture = texture_extension_number++;
                     60:     GL_Bind(particletexture);
                     61: 
                     62:        for (x=0 ; x<8 ; x++)
                     63:        {
                     64:                for (y=0 ; y<8 ; y++)
                     65:                {
                     66:                        data[y][x][0] = 255;
                     67:                        data[y][x][1] = 255;
                     68:                        data[y][x][2] = 255;
                     69:                        data[y][x][3] = dottexture[x][y]*255;
                     70:                }
                     71:        }
                     72:        glTexImage2D (GL_TEXTURE_2D, 0, gl_alpha_format, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
                     73: 
                     74:        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
                     75: 
                     76:        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                     77:        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
                     78: }
                     79: 
                     80: /*
                     81: ===============
                     82: R_Envmap_f
                     83: 
                     84: Grab six views for environment mapping tests
                     85: ===============
                     86: */
                     87: void R_Envmap_f (void)
                     88: {
                     89:        byte    buffer[256*256*4];
                     90:        char    name[1024];
                     91: 
                     92:        glDrawBuffer  (GL_FRONT);
                     93:        glReadBuffer  (GL_FRONT);
                     94:        envmap = true;
                     95: 
                     96:        r_refdef.vrect.x = 0;
                     97:        r_refdef.vrect.y = 0;
                     98:        r_refdef.vrect.width = 256;
                     99:        r_refdef.vrect.height = 256;
                    100: 
                    101:        r_refdef.viewangles[0] = 0;
                    102:        r_refdef.viewangles[1] = 0;
                    103:        r_refdef.viewangles[2] = 0;
                    104:        GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
                    105:        R_RenderView ();
                    106:        glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
                    107:        COM_WriteFile ("env0.rgb", buffer, sizeof(buffer));             
                    108: 
                    109:        r_refdef.viewangles[1] = 90;
                    110:        GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
                    111:        R_RenderView ();
                    112:        glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
                    113:        COM_WriteFile ("env1.rgb", buffer, sizeof(buffer));             
                    114: 
                    115:        r_refdef.viewangles[1] = 180;
                    116:        GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
                    117:        R_RenderView ();
                    118:        glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
                    119:        COM_WriteFile ("env2.rgb", buffer, sizeof(buffer));             
                    120: 
                    121:        r_refdef.viewangles[1] = 270;
                    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 ("env3.rgb", buffer, sizeof(buffer));             
                    126: 
                    127:        r_refdef.viewangles[0] = -90;
                    128:        r_refdef.viewangles[1] = 0;
                    129:        GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
                    130:        R_RenderView ();
                    131:        glReadPixels (0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
                    132:        COM_WriteFile ("env4.rgb", buffer, sizeof(buffer));             
                    133: 
                    134:        r_refdef.viewangles[0] = 90;
                    135:        r_refdef.viewangles[1] = 0;
                    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 ("env5.rgb", buffer, sizeof(buffer));             
                    140: 
                    141:        envmap = false;
                    142:        glDrawBuffer  (GL_BACK);
                    143:        glReadBuffer  (GL_BACK);
                    144:        GL_EndRendering ();
                    145: }
                    146: 
                    147: /*
                    148: ===============
                    149: R_Init
                    150: ===============
                    151: */
                    152: void R_Init (void)
                    153: {      
                    154:        extern byte *hunk_base;
                    155: 
                    156:        Cmd_AddCommand ("timerefresh", R_TimeRefresh_f);        
                    157:        Cmd_AddCommand ("envmap", R_Envmap_f);  
                    158:        Cmd_AddCommand ("pointfile", R_ReadPointFile_f);        
                    159: 
                    160:        Cvar_RegisterVariable (&r_norefresh);
                    161:        Cvar_RegisterVariable (&r_lightmap);
                    162:        Cvar_RegisterVariable (&r_fullbright);
                    163:        Cvar_RegisterVariable (&r_drawentities);
                    164:        Cvar_RegisterVariable (&r_drawviewmodel);
                    165:        Cvar_RegisterVariable (&r_shadows);
                    166:        Cvar_RegisterVariable (&r_mirroralpha);
                    167:        Cvar_RegisterVariable (&r_wateralpha);
                    168:        Cvar_RegisterVariable (&r_dynamic);
                    169:        Cvar_RegisterVariable (&r_novis);
                    170:        Cvar_RegisterVariable (&r_speeds);
                    171: 
                    172:        Cvar_RegisterVariable (&gl_clear);
                    173:        Cvar_RegisterVariable (&gl_texsort);
                    174:        Cvar_RegisterVariable (&gl_cull);
                    175:        Cvar_RegisterVariable (&gl_smoothmodels);
                    176:        Cvar_RegisterVariable (&gl_affinemodels);
                    177:        Cvar_RegisterVariable (&gl_polyblend);
                    178:        Cvar_RegisterVariable (&gl_flashblend);
                    179:        Cvar_RegisterVariable (&gl_playermip);
                    180:        Cvar_RegisterVariable (&gl_nocolors);
                    181: 
                    182:        Cvar_RegisterVariable (&gl_keeptjunctions);
                    183:        Cvar_RegisterVariable (&gl_reporttjunctions);
                    184: 
                    185:        R_InitParticles ();
                    186:        R_InitParticleTexture ();
                    187: 
                    188: #ifdef GLTEST
                    189:        Test_Init ();
                    190: #endif
                    191: 
                    192:        playertextures = texture_extension_number;
                    193:        texture_extension_number += 16;
                    194: }
                    195: 
                    196: /*
                    197: ===============
                    198: R_TranslatePlayerSkin
                    199: 
                    200: Translates a skin texture by the per-player color lookup
                    201: ===============
                    202: */
                    203: void R_TranslatePlayerSkin (int playernum)
                    204: {
                    205:        int             top, bottom;
                    206:        byte    translate[256];
                    207:        unsigned        translate32[256];
                    208:        int             i, j, s;
                    209:        model_t *model;
                    210:        aliashdr_t *paliashdr;
                    211:        byte    *original;
                    212:        unsigned        pixels[512*256], *out;
                    213:        unsigned        scaled_width, scaled_height;
                    214:        int                     inwidth, inheight;
                    215:        byte            *inrow;
                    216:        unsigned        frac, fracstep;
                    217:        extern  byte            player_8bit_texels[320*200];
                    218: 
                    219:        top = cl.scores[playernum].colors & 0xf0;
                    220:        bottom = (cl.scores[playernum].colors &15)<<4;
                    221: 
                    222:        for (i=0 ; i<256 ; i++)
                    223:                translate[i] = i;
                    224: 
                    225:        for (i=0 ; i<16 ; i++)
                    226:        {
                    227:                if (top < 128)  // the artists made some backwards ranges.  sigh.
                    228:                        translate[TOP_RANGE+i] = top+i;
                    229:                else
                    230:                        translate[TOP_RANGE+i] = top+15-i;
                    231:                                
                    232:                if (bottom < 128)
                    233:                        translate[BOTTOM_RANGE+i] = bottom+i;
                    234:                else
                    235:                        translate[BOTTOM_RANGE+i] = bottom+15-i;
                    236:        }
                    237: 
                    238:        //
                    239:        // locate the original skin pixels
                    240:        //
                    241:        currententity = &cl_entities[1+playernum];
                    242:        model = currententity->model;
                    243:        if (!model)
                    244:                return;         // player doesn't have a model yet
                    245:        paliashdr = (aliashdr_t *)Mod_Extradata (model);
                    246:        s = paliashdr->skinwidth * paliashdr->skinheight;
                    247:        original = player_8bit_texels;
                    248:        if (s & 3)
                    249:                Sys_Error ("R_TranslateSkin: s&3");
                    250: 
                    251:        // because this happens during gameplay, do it fast
                    252:        // instead of sending it through gl_upload 8
                    253:     GL_Bind(playertextures + playernum);
                    254: 
                    255: #if 0
                    256:        byte    translated[320*200];
                    257: 
                    258:        for (i=0 ; i<s ; i+=4)
                    259:        {
                    260:                translated[i] = translate[original[i]];
                    261:                translated[i+1] = translate[original[i+1]];
                    262:                translated[i+2] = translate[original[i+2]];
                    263:                translated[i+3] = translate[original[i+3]];
                    264:        }
                    265: 
                    266: 
                    267:        // don't mipmap these, because it takes too long
                    268:        GL_Upload8 (translated, paliashdr->skinwidth, paliashdr->skinheight, false, false, true);
                    269: #else
                    270:        for (i=0 ; i<256 ; i++)
                    271:                translate32[i] = d_8to24table[translate[i]];
                    272:        scaled_width = gl_max_size.value < 512 ? gl_max_size.value : 512;
                    273:        scaled_height = gl_max_size.value < 256 ? gl_max_size.value : 256;
                    274: 
                    275:        // allow users to crunch sizes down even more if they want
                    276:        scaled_width >>= (int)gl_playermip.value;
                    277:        scaled_height >>= (int)gl_playermip.value;
                    278: 
                    279:        inwidth = paliashdr->skinwidth;
                    280:        inheight = paliashdr->skinheight;
                    281:        out = pixels;
                    282:        fracstep = inwidth*0x10000/scaled_width;
                    283:        for (i=0 ; i<scaled_height ; i++, out += scaled_width)
                    284:        {
                    285:                inrow = original + inwidth*(i*inheight/scaled_height);
                    286:                frac = fracstep >> 1;
                    287:                for (j=0 ; j<scaled_width ; j+=4)
                    288:                {
                    289:                        out[j] = translate32[inrow[frac>>16]];
                    290:                        frac += fracstep;
                    291:                        out[j+1] = translate32[inrow[frac>>16]];
                    292:                        frac += fracstep;
                    293:                        out[j+2] = translate32[inrow[frac>>16]];
                    294:                        frac += fracstep;
                    295:                        out[j+3] = translate32[inrow[frac>>16]];
                    296:                        frac += fracstep;
                    297:                }
                    298:        }
                    299:        glTexImage2D (GL_TEXTURE_2D, 0, gl_solid_format, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
                    300: 
                    301:        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
                    302:        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                    303:        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
                    304: #endif
                    305: 
                    306: }
                    307: 
                    308: 
                    309: /*
                    310: ===============
                    311: R_NewMap
                    312: ===============
                    313: */
                    314: void R_NewMap (void)
                    315: {
                    316:        int             i;
                    317:        
                    318:        for (i=0 ; i<256 ; i++)
                    319:                d_lightstylevalue[i] = 264;             // normal light value
                    320: 
                    321:        memset (&r_worldentity, 0, sizeof(r_worldentity));
                    322:        r_worldentity.model = cl.worldmodel;
                    323: 
                    324: // clear out efrags in case the level hasn't been reloaded
                    325: // FIXME: is this one short?
                    326:        for (i=0 ; i<cl.worldmodel->numleafs ; i++)
                    327:                cl.worldmodel->leafs[i].efrags = NULL;
                    328:                        
                    329:        r_viewleaf = NULL;
                    330:        R_ClearParticles ();
                    331: 
                    332:        GL_BuildLightmaps ();
                    333: 
                    334:        // identify sky texture
                    335:        skytexturenum = -1;
                    336:        mirrortexturenum = -1;
                    337:        for (i=0 ; i<cl.worldmodel->numtextures ; i++)
                    338:        {
                    339:                if (!cl.worldmodel->textures[i])
                    340:                        continue;
                    341:                if (!Q_strncmp(cl.worldmodel->textures[i]->name,"sky",3) )
                    342:                        skytexturenum = i;
                    343:                if (!Q_strncmp(cl.worldmodel->textures[i]->name,"window02_1",10) )
                    344:                        mirrortexturenum = i;
                    345:        }
                    346: #ifdef QUAKE2
                    347:        R_LoadSkys ();
                    348: #endif
                    349: }
                    350: 
                    351: 
                    352: /*
                    353: ====================
                    354: R_TimeRefresh_f
                    355: 
                    356: For program optimization
                    357: ====================
                    358: */
                    359: void R_TimeRefresh_f (void)
                    360: {
                    361:        int                     i;
                    362:        float           start, stop, time;
                    363:        int                     startangle;
                    364:        vrect_t         vr;
                    365: 
                    366:        glDrawBuffer  (GL_FRONT);
                    367:        glFinish ();
                    368: 
                    369:        start = Sys_FloatTime ();
                    370:        for (i=0 ; i<128 ; i++)
                    371:        {
                    372:                r_refdef.viewangles[1] = i/128.0*360.0;
                    373:                R_RenderView ();
                    374:        }
                    375: 
                    376:        glFinish ();
                    377:        stop = Sys_FloatTime ();
                    378:        time = stop-start;
                    379:        Con_Printf ("%f seconds (%f fps)\n", time, 128/time);
                    380: 
                    381:        glDrawBuffer  (GL_BACK);
                    382:        GL_EndRendering ();
                    383: }
                    384: 
                    385: void D_FlushCaches (void)
                    386: {
                    387: }
                    388: 
                    389: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.