Annotation of quakeworld/client/d_scan.c, revision 1.1

1.1     ! root        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: // d_scan.c
        !            21: //
        !            22: // Portable C scan-level rasterization code, all pixel depths.
        !            23: 
        !            24: #include "quakedef.h"
        !            25: #include "r_local.h"
        !            26: #include "d_local.h"
        !            27: 
        !            28: unsigned char  *r_turb_pbase, *r_turb_pdest;
        !            29: fixed16_t              r_turb_s, r_turb_t, r_turb_sstep, r_turb_tstep;
        !            30: int                            *r_turb_turb;
        !            31: int                            r_turb_spancount;
        !            32: 
        !            33: void D_DrawTurbulent8Span (void);
        !            34: 
        !            35: 
        !            36: /*
        !            37: =============
        !            38: D_WarpScreen
        !            39: 
        !            40: // this performs a slight compression of the screen at the same time as
        !            41: // the sine warp, to keep the edges from wrapping
        !            42: =============
        !            43: */
        !            44: void D_WarpScreen (void)
        !            45: {
        !            46:        int             w, h;
        !            47:        int             u,v;
        !            48:        byte    *dest;
        !            49:        int             *turb;
        !            50:        int             *col;
        !            51:        byte    **row;
        !            52:        byte    *rowptr[1024];
        !            53:        int             column[1280];
        !            54:        float   wratio, hratio;
        !            55: 
        !            56:        w = r_refdef.vrect.width;
        !            57:        h = r_refdef.vrect.height;
        !            58: 
        !            59:        wratio = w / (float)scr_vrect.width;
        !            60:        hratio = h / (float)scr_vrect.height;
        !            61: 
        !            62:        for (v=0 ; v<scr_vrect.height+AMP2*2 ; v++)
        !            63:        {
        !            64:                rowptr[v] = d_viewbuffer + (r_refdef.vrect.y * screenwidth) +
        !            65:                                 (screenwidth * (int)((float)v * hratio * h / (h + AMP2 * 2)));
        !            66:        }
        !            67: 
        !            68:        for (u=0 ; u<scr_vrect.width+AMP2*2 ; u++)
        !            69:        {
        !            70:                column[u] = r_refdef.vrect.x +
        !            71:                                (int)((float)u * wratio * w / (w + AMP2 * 2));
        !            72:        }
        !            73: 
        !            74:        turb = intsintable + ((int)(cl.time*SPEED)&(CYCLE-1));
        !            75:        dest = vid.buffer + scr_vrect.y * vid.rowbytes + scr_vrect.x;
        !            76: 
        !            77:        for (v=0 ; v<scr_vrect.height ; v++, dest += vid.rowbytes)
        !            78:        {
        !            79:                col = &column[turb[v]];
        !            80:                row = &rowptr[v];
        !            81:                for (u=0 ; u<scr_vrect.width ; u+=4)
        !            82:                {
        !            83:                        dest[u+0] = row[turb[u+0]][col[u+0]];
        !            84:                        dest[u+1] = row[turb[u+1]][col[u+1]];
        !            85:                        dest[u+2] = row[turb[u+2]][col[u+2]];
        !            86:                        dest[u+3] = row[turb[u+3]][col[u+3]];
        !            87:                }
        !            88:        }
        !            89: }
        !            90: 
        !            91: 
        !            92: #if    !id386
        !            93: 
        !            94: /*
        !            95: =============
        !            96: D_DrawTurbulent8Span
        !            97: =============
        !            98: */
        !            99: void D_DrawTurbulent8Span (void)
        !           100: {
        !           101:        int             sturb, tturb;
        !           102: 
        !           103:        do
        !           104:        {
        !           105:                sturb = ((r_turb_s + r_turb_turb[(r_turb_t>>16)&(CYCLE-1)])>>16)&63;
        !           106:                tturb = ((r_turb_t + r_turb_turb[(r_turb_s>>16)&(CYCLE-1)])>>16)&63;
        !           107:                *r_turb_pdest++ = *(r_turb_pbase + (tturb<<6) + sturb);
        !           108:                r_turb_s += r_turb_sstep;
        !           109:                r_turb_t += r_turb_tstep;
        !           110:        } while (--r_turb_spancount > 0);
        !           111: }
        !           112: 
        !           113: #endif // !id386
        !           114: 
        !           115: /*
        !           116: =============
        !           117: Turbulent8
        !           118: =============
        !           119: */
        !           120: void Turbulent8 (espan_t *pspan)
        !           121: {
        !           122:        int                             count;
        !           123:        fixed16_t               snext, tnext;
        !           124:        float                   sdivz, tdivz, zi, z, du, dv, spancountminus1;
        !           125:        float                   sdivz16stepu, tdivz16stepu, zi16stepu;
        !           126:        
        !           127:        r_turb_turb = sintable + ((int)(cl.time*SPEED)&(CYCLE-1));
        !           128: 
        !           129:        r_turb_sstep = 0;       // keep compiler happy
        !           130:        r_turb_tstep = 0;       // ditto
        !           131: 
        !           132:        r_turb_pbase = (unsigned char *)cacheblock;
        !           133: 
        !           134:        sdivz16stepu = d_sdivzstepu * 16;
        !           135:        tdivz16stepu = d_tdivzstepu * 16;
        !           136:        zi16stepu = d_zistepu * 16;
        !           137: 
        !           138:        do
        !           139:        {
        !           140:                r_turb_pdest = (unsigned char *)((byte *)d_viewbuffer +
        !           141:                                (screenwidth * pspan->v) + pspan->u);
        !           142: 
        !           143:                count = pspan->count;
        !           144: 
        !           145:        // calculate the initial s/z, t/z, 1/z, s, and t and clamp
        !           146:                du = (float)pspan->u;
        !           147:                dv = (float)pspan->v;
        !           148: 
        !           149:                sdivz = d_sdivzorigin + dv*d_sdivzstepv + du*d_sdivzstepu;
        !           150:                tdivz = d_tdivzorigin + dv*d_tdivzstepv + du*d_tdivzstepu;
        !           151:                zi = d_ziorigin + dv*d_zistepv + du*d_zistepu;
        !           152:                z = (float)0x10000 / zi;        // prescale to 16.16 fixed-point
        !           153: 
        !           154:                r_turb_s = (int)(sdivz * z) + sadjust;
        !           155:                if (r_turb_s > bbextents)
        !           156:                        r_turb_s = bbextents;
        !           157:                else if (r_turb_s < 0)
        !           158:                        r_turb_s = 0;
        !           159: 
        !           160:                r_turb_t = (int)(tdivz * z) + tadjust;
        !           161:                if (r_turb_t > bbextentt)
        !           162:                        r_turb_t = bbextentt;
        !           163:                else if (r_turb_t < 0)
        !           164:                        r_turb_t = 0;
        !           165: 
        !           166:                do
        !           167:                {
        !           168:                // calculate s and t at the far end of the span
        !           169:                        if (count >= 16)
        !           170:                                r_turb_spancount = 16;
        !           171:                        else
        !           172:                                r_turb_spancount = count;
        !           173: 
        !           174:                        count -= r_turb_spancount;
        !           175: 
        !           176:                        if (count)
        !           177:                        {
        !           178:                        // calculate s/z, t/z, zi->fixed s and t at far end of span,
        !           179:                        // calculate s and t steps across span by shifting
        !           180:                                sdivz += sdivz16stepu;
        !           181:                                tdivz += tdivz16stepu;
        !           182:                                zi += zi16stepu;
        !           183:                                z = (float)0x10000 / zi;        // prescale to 16.16 fixed-point
        !           184: 
        !           185:                                snext = (int)(sdivz * z) + sadjust;
        !           186:                                if (snext > bbextents)
        !           187:                                        snext = bbextents;
        !           188:                                else if (snext < 16)
        !           189:                                        snext = 16;     // prevent round-off error on <0 steps from
        !           190:                                                                //  from causing overstepping & running off the
        !           191:                                                                //  edge of the texture
        !           192: 
        !           193:                                tnext = (int)(tdivz * z) + tadjust;
        !           194:                                if (tnext > bbextentt)
        !           195:                                        tnext = bbextentt;
        !           196:                                else if (tnext < 16)
        !           197:                                        tnext = 16;     // guard against round-off error on <0 steps
        !           198: 
        !           199:                                r_turb_sstep = (snext - r_turb_s) >> 4;
        !           200:                                r_turb_tstep = (tnext - r_turb_t) >> 4;
        !           201:                        }
        !           202:                        else
        !           203:                        {
        !           204:                        // calculate s/z, t/z, zi->fixed s and t at last pixel in span (so
        !           205:                        // can't step off polygon), clamp, calculate s and t steps across
        !           206:                        // span by division, biasing steps low so we don't run off the
        !           207:                        // texture
        !           208:                                spancountminus1 = (float)(r_turb_spancount - 1);
        !           209:                                sdivz += d_sdivzstepu * spancountminus1;
        !           210:                                tdivz += d_tdivzstepu * spancountminus1;
        !           211:                                zi += d_zistepu * spancountminus1;
        !           212:                                z = (float)0x10000 / zi;        // prescale to 16.16 fixed-point
        !           213:                                snext = (int)(sdivz * z) + sadjust;
        !           214:                                if (snext > bbextents)
        !           215:                                        snext = bbextents;
        !           216:                                else if (snext < 16)
        !           217:                                        snext = 16;     // prevent round-off error on <0 steps from
        !           218:                                                                //  from causing overstepping & running off the
        !           219:                                                                //  edge of the texture
        !           220: 
        !           221:                                tnext = (int)(tdivz * z) + tadjust;
        !           222:                                if (tnext > bbextentt)
        !           223:                                        tnext = bbextentt;
        !           224:                                else if (tnext < 16)
        !           225:                                        tnext = 16;     // guard against round-off error on <0 steps
        !           226: 
        !           227:                                if (r_turb_spancount > 1)
        !           228:                                {
        !           229:                                        r_turb_sstep = (snext - r_turb_s) / (r_turb_spancount - 1);
        !           230:                                        r_turb_tstep = (tnext - r_turb_t) / (r_turb_spancount - 1);
        !           231:                                }
        !           232:                        }
        !           233: 
        !           234:                        r_turb_s = r_turb_s & ((CYCLE<<16)-1);
        !           235:                        r_turb_t = r_turb_t & ((CYCLE<<16)-1);
        !           236: 
        !           237:                        D_DrawTurbulent8Span ();
        !           238: 
        !           239:                        r_turb_s = snext;
        !           240:                        r_turb_t = tnext;
        !           241: 
        !           242:                } while (count > 0);
        !           243: 
        !           244:        } while ((pspan = pspan->pnext) != NULL);
        !           245: }
        !           246: 
        !           247: 
        !           248: #if    !id386
        !           249: 
        !           250: /*
        !           251: =============
        !           252: D_DrawSpans8
        !           253: =============
        !           254: */
        !           255: void D_DrawSpans8 (espan_t *pspan)
        !           256: {
        !           257:        int                             count, spancount;
        !           258:        unsigned char   *pbase, *pdest;
        !           259:        fixed16_t               s, t, snext, tnext, sstep, tstep;
        !           260:        float                   sdivz, tdivz, zi, z, du, dv, spancountminus1;
        !           261:        float                   sdivz8stepu, tdivz8stepu, zi8stepu;
        !           262: 
        !           263:        sstep = 0;      // keep compiler happy
        !           264:        tstep = 0;      // ditto
        !           265: 
        !           266:        pbase = (unsigned char *)cacheblock;
        !           267: 
        !           268:        sdivz8stepu = d_sdivzstepu * 8;
        !           269:        tdivz8stepu = d_tdivzstepu * 8;
        !           270:        zi8stepu = d_zistepu * 8;
        !           271: 
        !           272:        do
        !           273:        {
        !           274:                pdest = (unsigned char *)((byte *)d_viewbuffer +
        !           275:                                (screenwidth * pspan->v) + pspan->u);
        !           276: 
        !           277:                count = pspan->count;
        !           278: 
        !           279:        // calculate the initial s/z, t/z, 1/z, s, and t and clamp
        !           280:                du = (float)pspan->u;
        !           281:                dv = (float)pspan->v;
        !           282: 
        !           283:                sdivz = d_sdivzorigin + dv*d_sdivzstepv + du*d_sdivzstepu;
        !           284:                tdivz = d_tdivzorigin + dv*d_tdivzstepv + du*d_tdivzstepu;
        !           285:                zi = d_ziorigin + dv*d_zistepv + du*d_zistepu;
        !           286:                z = (float)0x10000 / zi;        // prescale to 16.16 fixed-point
        !           287: 
        !           288:                s = (int)(sdivz * z) + sadjust;
        !           289:                if (s > bbextents)
        !           290:                        s = bbextents;
        !           291:                else if (s < 0)
        !           292:                        s = 0;
        !           293: 
        !           294:                t = (int)(tdivz * z) + tadjust;
        !           295:                if (t > bbextentt)
        !           296:                        t = bbextentt;
        !           297:                else if (t < 0)
        !           298:                        t = 0;
        !           299: 
        !           300:                do
        !           301:                {
        !           302:                // calculate s and t at the far end of the span
        !           303:                        if (count >= 8)
        !           304:                                spancount = 8;
        !           305:                        else
        !           306:                                spancount = count;
        !           307: 
        !           308:                        count -= spancount;
        !           309: 
        !           310:                        if (count)
        !           311:                        {
        !           312:                        // calculate s/z, t/z, zi->fixed s and t at far end of span,
        !           313:                        // calculate s and t steps across span by shifting
        !           314:                                sdivz += sdivz8stepu;
        !           315:                                tdivz += tdivz8stepu;
        !           316:                                zi += zi8stepu;
        !           317:                                z = (float)0x10000 / zi;        // prescale to 16.16 fixed-point
        !           318: 
        !           319:                                snext = (int)(sdivz * z) + sadjust;
        !           320:                                if (snext > bbextents)
        !           321:                                        snext = bbextents;
        !           322:                                else if (snext < 8)
        !           323:                                        snext = 8;      // prevent round-off error on <0 steps from
        !           324:                                                                //  from causing overstepping & running off the
        !           325:                                                                //  edge of the texture
        !           326: 
        !           327:                                tnext = (int)(tdivz * z) + tadjust;
        !           328:                                if (tnext > bbextentt)
        !           329:                                        tnext = bbextentt;
        !           330:                                else if (tnext < 8)
        !           331:                                        tnext = 8;      // guard against round-off error on <0 steps
        !           332: 
        !           333:                                sstep = (snext - s) >> 3;
        !           334:                                tstep = (tnext - t) >> 3;
        !           335:                        }
        !           336:                        else
        !           337:                        {
        !           338:                        // calculate s/z, t/z, zi->fixed s and t at last pixel in span (so
        !           339:                        // can't step off polygon), clamp, calculate s and t steps across
        !           340:                        // span by division, biasing steps low so we don't run off the
        !           341:                        // texture
        !           342:                                spancountminus1 = (float)(spancount - 1);
        !           343:                                sdivz += d_sdivzstepu * spancountminus1;
        !           344:                                tdivz += d_tdivzstepu * spancountminus1;
        !           345:                                zi += d_zistepu * spancountminus1;
        !           346:                                z = (float)0x10000 / zi;        // prescale to 16.16 fixed-point
        !           347:                                snext = (int)(sdivz * z) + sadjust;
        !           348:                                if (snext > bbextents)
        !           349:                                        snext = bbextents;
        !           350:                                else if (snext < 8)
        !           351:                                        snext = 8;      // prevent round-off error on <0 steps from
        !           352:                                                                //  from causing overstepping & running off the
        !           353:                                                                //  edge of the texture
        !           354: 
        !           355:                                tnext = (int)(tdivz * z) + tadjust;
        !           356:                                if (tnext > bbextentt)
        !           357:                                        tnext = bbextentt;
        !           358:                                else if (tnext < 8)
        !           359:                                        tnext = 8;      // guard against round-off error on <0 steps
        !           360: 
        !           361:                                if (spancount > 1)
        !           362:                                {
        !           363:                                        sstep = (snext - s) / (spancount - 1);
        !           364:                                        tstep = (tnext - t) / (spancount - 1);
        !           365:                                }
        !           366:                        }
        !           367: 
        !           368:                        do
        !           369:                        {
        !           370:                                *pdest++ = *(pbase + (s >> 16) + (t >> 16) * cachewidth);
        !           371:                                s += sstep;
        !           372:                                t += tstep;
        !           373:                        } while (--spancount > 0);
        !           374: 
        !           375:                        s = snext;
        !           376:                        t = tnext;
        !           377: 
        !           378:                } while (count > 0);
        !           379: 
        !           380:        } while ((pspan = pspan->pnext) != NULL);
        !           381: }
        !           382: 
        !           383: #endif
        !           384: 
        !           385: 
        !           386: #if    !id386
        !           387: 
        !           388: /*
        !           389: =============
        !           390: D_DrawZSpans
        !           391: =============
        !           392: */
        !           393: void D_DrawZSpans (espan_t *pspan)
        !           394: {
        !           395:        int                             count, doublecount, izistep;
        !           396:        int                             izi;
        !           397:        short                   *pdest;
        !           398:        unsigned                ltemp;
        !           399:        double                  zi;
        !           400:        float                   du, dv;
        !           401: 
        !           402: // FIXME: check for clamping/range problems
        !           403: // we count on FP exceptions being turned off to avoid range problems
        !           404:        izistep = (int)(d_zistepu * 0x8000 * 0x10000);
        !           405: 
        !           406:        do
        !           407:        {
        !           408:                pdest = d_pzbuffer + (d_zwidth * pspan->v) + pspan->u;
        !           409: 
        !           410:                count = pspan->count;
        !           411: 
        !           412:        // calculate the initial 1/z
        !           413:                du = (float)pspan->u;
        !           414:                dv = (float)pspan->v;
        !           415: 
        !           416:                zi = d_ziorigin + dv*d_zistepv + du*d_zistepu;
        !           417:        // we count on FP exceptions being turned off to avoid range problems
        !           418:                izi = (int)(zi * 0x8000 * 0x10000);
        !           419: 
        !           420:                if ((long)pdest & 0x02)
        !           421:                {
        !           422:                        *pdest++ = (short)(izi >> 16);
        !           423:                        izi += izistep;
        !           424:                        count--;
        !           425:                }
        !           426: 
        !           427:                if ((doublecount = count >> 1) > 0)
        !           428:                {
        !           429:                        do
        !           430:                        {
        !           431:                                ltemp = izi >> 16;
        !           432:                                izi += izistep;
        !           433:                                ltemp |= izi & 0xFFFF0000;
        !           434:                                izi += izistep;
        !           435:                                *(int *)pdest = ltemp;
        !           436:                                pdest += 2;
        !           437:                        } while (--doublecount > 0);
        !           438:                }
        !           439: 
        !           440:                if (count & 1)
        !           441:                        *pdest = (short)(izi >> 16);
        !           442: 
        !           443:        } while ((pspan = pspan->pnext) != NULL);
        !           444: }
        !           445: 
        !           446: #endif

unix.superglobalmegacorp.com

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