|
|
1.1 ! root 1: // d_sky.c ! 2: ! 3: #include "quakedef.h" ! 4: #include "r_local.h" ! 5: #include "d_local.h" ! 6: ! 7: #define SKY_SPAN_SHIFT 5 ! 8: #define SKY_SPAN_MAX (1 << SKY_SPAN_SHIFT) ! 9: ! 10: ! 11: /* ! 12: ================= ! 13: D_Sky_uv_To_st ! 14: ================= ! 15: */ ! 16: void D_Sky_uv_To_st (int u, int v, fixed16_t *s, fixed16_t *t) ! 17: { ! 18: float wu, wv, temp; ! 19: vec3_t end; ! 20: ! 21: if (r_refdef.vrect.width >= r_refdef.vrect.height) ! 22: temp = (float)r_refdef.vrect.width; ! 23: else ! 24: temp = (float)r_refdef.vrect.height; ! 25: ! 26: wu = 8192.0 * (float)(u-((int)vid.width>>1)) / temp; ! 27: wv = 8192.0 * (float)(((int)vid.height>>1)-v) / temp; ! 28: ! 29: end[0] = 4096*vpn[0] + wu*vright[0] + wv*vup[0]; ! 30: end[1] = 4096*vpn[1] + wu*vright[1] + wv*vup[1]; ! 31: end[2] = 4096*vpn[2] + wu*vright[2] + wv*vup[2]; ! 32: end[2] *= 3; ! 33: VectorNormalize (end); ! 34: ! 35: temp = skytime*skyspeed; // TODO: add D_SetupFrame & set this there ! 36: *s = (int)((temp + 6*(SKYSIZE/2-1)*end[0]) * 0x10000); ! 37: *t = (int)((temp + 6*(SKYSIZE/2-1)*end[1]) * 0x10000); ! 38: } ! 39: ! 40: ! 41: /* ! 42: ================= ! 43: D_DrawSkyScans8 ! 44: ================= ! 45: */ ! 46: void D_DrawSkyScans8 (espan_t *pspan) ! 47: { ! 48: int count, spancount, u, v; ! 49: unsigned char *pdest; ! 50: fixed16_t s, t, snext, tnext, sstep, tstep; ! 51: int spancountminus1; ! 52: ! 53: sstep = 0; // keep compiler happy ! 54: tstep = 0; // ditto ! 55: ! 56: do ! 57: { ! 58: pdest = (unsigned char *)((byte *)d_viewbuffer + ! 59: (screenwidth * pspan->v) + pspan->u); ! 60: ! 61: count = pspan->count; ! 62: ! 63: // calculate the initial s & t ! 64: u = pspan->u; ! 65: v = pspan->v; ! 66: D_Sky_uv_To_st (u, v, &s, &t); ! 67: ! 68: do ! 69: { ! 70: if (count >= SKY_SPAN_MAX) ! 71: spancount = SKY_SPAN_MAX; ! 72: else ! 73: spancount = count; ! 74: ! 75: count -= spancount; ! 76: ! 77: if (count) ! 78: { ! 79: u += spancount; ! 80: ! 81: // calculate s and t at far end of span, ! 82: // calculate s and t steps across span by shifting ! 83: D_Sky_uv_To_st (u, v, &snext, &tnext); ! 84: ! 85: sstep = (snext - s) >> SKY_SPAN_SHIFT; ! 86: tstep = (tnext - t) >> SKY_SPAN_SHIFT; ! 87: } ! 88: else ! 89: { ! 90: // calculate s and t at last pixel in span, ! 91: // calculate s and t steps across span by division ! 92: spancountminus1 = (float)(spancount - 1); ! 93: ! 94: if (spancountminus1 > 0) ! 95: { ! 96: u += spancountminus1; ! 97: D_Sky_uv_To_st (u, v, &snext, &tnext); ! 98: ! 99: sstep = (snext - s) / spancountminus1; ! 100: tstep = (tnext - t) / spancountminus1; ! 101: } ! 102: } ! 103: ! 104: do ! 105: { ! 106: *pdest++ = r_skysource[((t & R_SKY_TMASK) >> 8) + ! 107: ((s & R_SKY_SMASK) >> 16)]; ! 108: s += sstep; ! 109: t += tstep; ! 110: } while (--spancount > 0); ! 111: ! 112: s = snext; ! 113: t = tnext; ! 114: ! 115: } while (count > 0); ! 116: ! 117: } while ((pspan = pspan->pnext) != NULL); ! 118: } ! 119:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.