Annotation of quake1/gl_rmisc.c, revision 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.