|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.