Annotation of doom/p_maputl.c, revision 1.1

1.1     ! root        1: 
        !             2: /* P_maputl.c */
        !             3: 
        !             4: #include "doomdef.h"
        !             5: #include "p_local.h"
        !             6: 
        !             7: 
        !             8: /*
        !             9: ===================
        !            10: =
        !            11: = P_AproxDistance
        !            12: =
        !            13: = Gives an estimation of distance (not exact)
        !            14: =
        !            15: ===================
        !            16: */
        !            17: 
        !            18: fixed_t P_AproxDistance (fixed_t dx, fixed_t dy)
        !            19: {
        !            20:        dx = abs(dx);
        !            21:        dy = abs(dy);
        !            22:        if (dx < dy)
        !            23:                return dx+dy-(dx>>1);
        !            24:        return dx+dy-(dy>>1);
        !            25: }
        !            26: 
        !            27: 
        !            28: /*
        !            29: ==================
        !            30: =
        !            31: = P_PointOnLineSide
        !            32: =
        !            33: = Returns 0 or 1
        !            34: ==================
        !            35: */
        !            36: 
        !            37: int P_PointOnLineSide (fixed_t x, fixed_t y, line_t *line)
        !            38: {
        !            39:        fixed_t dx,dy;
        !            40:        fixed_t left, right;
        !            41:        
        !            42:        if (!line->dx)
        !            43:        {
        !            44:                if (x <= line->v1->x)
        !            45:                        return line->dy > 0;
        !            46:                return line->dy < 0;
        !            47:        }
        !            48:        if (!line->dy)
        !            49:        {
        !            50:                if (y <= line->v1->y)
        !            51:                        return line->dx < 0;
        !            52:                return line->dx > 0;
        !            53:        }
        !            54:        
        !            55:        dx = (x - line->v1->x);
        !            56:        dy = (y - line->v1->y);
        !            57:        
        !            58:        left = (line->dy>>16) * (dx>>16);
        !            59:        right = (dy>>16) * (line->dx>>16);
        !            60:        
        !            61:        if (right < left)
        !            62:                return 0;               /* front side */
        !            63:        return 1;                       /* back side */
        !            64: }
        !            65: 
        !            66: 
        !            67: /*
        !            68: ==================
        !            69: =
        !            70: = P_PointOnDivlineSide
        !            71: =
        !            72: = Returns 0 or 1
        !            73: ==================
        !            74: */
        !            75: 
        !            76: int P_PointOnDivlineSide (fixed_t x, fixed_t y, divline_t *line)
        !            77: {
        !            78:        fixed_t dx,dy;
        !            79:        fixed_t left, right;
        !            80:        
        !            81:        if (!line->dx)
        !            82:        {
        !            83:                if (x <= line->x)
        !            84:                        return line->dy > 0;
        !            85:                return line->dy < 0;
        !            86:        }
        !            87:        if (!line->dy)
        !            88:        {
        !            89:                if (y <= line->y)
        !            90:                        return line->dx < 0;
        !            91:                return line->dx > 0;
        !            92:        }
        !            93:        
        !            94:        dx = (x - line->x);
        !            95:        dy = (y - line->y);
        !            96:        
        !            97: /* try to quickly decide by looking at sign bits */
        !            98:        if ( (line->dy ^ line->dx ^ dx ^ dy)&0x80000000 )
        !            99:        {
        !           100:                if ( (line->dy ^ dx) & 0x80000000 )
        !           101:                        return 1;       /* (left is negative) */
        !           102:                return 0;
        !           103:        }
        !           104:        
        !           105:        left = FixedMul ( line->dy>>8, dx>>8 );
        !           106:        right = FixedMul ( dy>>8 , line->dx>>8 );
        !           107:        
        !           108:        if (right < left)
        !           109:                return 0;               /* front side */
        !           110:        return 1;                       /* back side */
        !           111: }
        !           112: 
        !           113: 
        !           114: 
        !           115: /*
        !           116: ==============
        !           117: =
        !           118: = P_MakeDivline
        !           119: =
        !           120: ==============
        !           121: */
        !           122: 
        !           123: void P_MakeDivline (line_t *li, divline_t *dl)
        !           124: {
        !           125:        dl->x = li->v1->x;
        !           126:        dl->y = li->v1->y;
        !           127:        dl->dx = li->dx;
        !           128:        dl->dy = li->dy;
        !           129: }
        !           130: 
        !           131: 
        !           132: /*
        !           133: ==================
        !           134: =
        !           135: = P_LineOpening
        !           136: =
        !           137: = Sets opentop and openbottom to the window through a two sided line
        !           138: = OPTIMIZE: keep this precalculated
        !           139: ==================
        !           140: */
        !           141: 
        !           142: fixed_t opentop, openbottom, openrange;
        !           143: fixed_t        lowfloor;
        !           144: 
        !           145: void P_LineOpening (line_t *linedef)
        !           146: {
        !           147:        sector_t        *front, *back;
        !           148:        
        !           149:        if (linedef->sidenum[1] == -1)
        !           150:        {       /* single sided line */
        !           151:                openrange = 0;
        !           152:                return;
        !           153:        }
        !           154:         
        !           155:        front = linedef->frontsector;
        !           156:        back = linedef->backsector;
        !           157:        
        !           158:        if (front->ceilingheight < back->ceilingheight)
        !           159:                opentop = front->ceilingheight;
        !           160:        else
        !           161:                opentop = back->ceilingheight;
        !           162:        if (front->floorheight > back->floorheight)
        !           163:        {
        !           164:                openbottom = front->floorheight;
        !           165:                lowfloor = back->floorheight;
        !           166:        }
        !           167:        else
        !           168:        {
        !           169:                openbottom = back->floorheight;
        !           170:                lowfloor = front->floorheight;
        !           171:        }
        !           172:        
        !           173:        openrange = opentop - openbottom;
        !           174: }
        !           175: 
        !           176: /*
        !           177: ===============================================================================
        !           178: 
        !           179:                                                THING POSITION SETTING
        !           180: 
        !           181: ===============================================================================
        !           182: */
        !           183: 
        !           184: /*
        !           185: ===================
        !           186: =
        !           187: = P_UnsetThingPosition 
        !           188: =
        !           189: = Unlinks a thing from block map and sectors
        !           190: =
        !           191: ===================
        !           192: */
        !           193: 
        !           194: void P_UnsetThingPosition (mobj_t *thing)
        !           195: {
        !           196:        int                             blockx, blocky;
        !           197: 
        !           198:        if ( ! (thing->flags & MF_NOSECTOR) )
        !           199:        {       /* inert things don't need to be in blockmap */
        !           200: /* unlink from subsector */
        !           201:                if (thing->snext)
        !           202:                        thing->snext->sprev = thing->sprev;
        !           203:                if (thing->sprev)
        !           204:                        thing->sprev->snext = thing->snext;
        !           205:                else
        !           206:                        thing->subsector->sector->thinglist = thing->snext;
        !           207:        }
        !           208:        
        !           209:        if ( ! (thing->flags & MF_NOBLOCKMAP) )
        !           210:        {       /* inert things don't need to be in blockmap */
        !           211: /* unlink from block map */
        !           212:                if (thing->bnext)
        !           213:                        thing->bnext->bprev = thing->bprev;
        !           214:                if (thing->bprev)
        !           215:                        thing->bprev->bnext = thing->bnext;
        !           216:                else
        !           217:                {
        !           218:                        blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT;
        !           219:                        blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT;
        !           220:                        blocklinks[blocky*bmapwidth+blockx] = thing->bnext;
        !           221:                }
        !           222:        }
        !           223: }
        !           224: 
        !           225: 
        !           226: /*
        !           227: ===================
        !           228: =
        !           229: = P_SetThingPosition 
        !           230: =
        !           231: = Links a thing into both a block and a subsector based on it's x y
        !           232: = Sets thing->subsector properly
        !           233: =
        !           234: ===================
        !           235: */
        !           236: 
        !           237: void P_SetThingPosition (mobj_t *thing)
        !           238: {
        !           239:        subsector_t             *ss;
        !           240:        sector_t                *sec;
        !           241:        int                             blockx, blocky;
        !           242:        mobj_t                  **link;
        !           243:        
        !           244: /* */
        !           245: /* link into subsector */
        !           246: /* */
        !           247:        ss = R_PointInSubsector (thing->x,thing->y);
        !           248:        thing->subsector = ss;
        !           249:        if ( ! (thing->flags & MF_NOSECTOR) )
        !           250:        {       /* invisible things don't go into the sector links */
        !           251:                sec = ss->sector;
        !           252:        
        !           253:                thing->sprev = NULL;
        !           254:                thing->snext = sec->thinglist;
        !           255:                if (sec->thinglist)
        !           256:                        sec->thinglist->sprev = thing;
        !           257:                sec->thinglist = thing;
        !           258:        }
        !           259:        
        !           260: /* */
        !           261: /* link into blockmap */
        !           262: /* */
        !           263:        if ( ! (thing->flags & MF_NOBLOCKMAP) )
        !           264:        {       /* inert things don't need to be in blockmap             */
        !           265:                blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT;
        !           266:                blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT;
        !           267:                if (blockx>=0 && blockx < bmapwidth && blocky>=0 && blocky <bmapheight)
        !           268:                {
        !           269:                        link = &blocklinks[blocky*bmapwidth+blockx];
        !           270:                        thing->bprev = NULL;
        !           271:                        thing->bnext = *link;
        !           272:                        if (*link)
        !           273:                                (*link)->bprev = thing;
        !           274:                        *link = thing;
        !           275:                }
        !           276:                else
        !           277:                {       /* thing is off the map */
        !           278:                        thing->bnext = thing->bprev = NULL;
        !           279:                }
        !           280:        }
        !           281: }
        !           282: 
        !           283: 
        !           284: 
        !           285: /*
        !           286: ===============================================================================
        !           287: 
        !           288:                                                BLOCK MAP ITERATORS
        !           289: 
        !           290: For each line/thing in the given mapblock, call the passed function.
        !           291: If the function returns false, exit with false without checking anything else.
        !           292: 
        !           293: ===============================================================================
        !           294: */
        !           295: 
        !           296: /*
        !           297: ==================
        !           298: =
        !           299: = P_BlockLinesIterator
        !           300: =
        !           301: = The validcount flags are used to avoid checking lines
        !           302: = that are marked in multiple mapblocks, so increment validcount before
        !           303: = the first call to P_BlockLinesIterator, then make one or more calls to it
        !           304: ===================
        !           305: */
        !           306: 
        !           307: boolean P_BlockLinesIterator (int x, int y, boolean(*func)(line_t*) )
        !           308: {
        !           309:        int                     offset;
        !           310:        short           *list;
        !           311:        line_t          *ld;
        !           312:        
        !           313:        if (x<0 || y<0 || x>=bmapwidth || y>=bmapheight)
        !           314:                return true;
        !           315:        offset = y*bmapwidth+x;
        !           316:        
        !           317:        offset = *(blockmap+offset);
        !           318: 
        !           319:        for ( list = blockmaplump+offset ; *list != -1 ; list++)
        !           320:        {
        !           321:                ld = &lines[*list];
        !           322:                if (ld->validcount == validcount)
        !           323:                        continue;               /* line has already been checked */
        !           324:                ld->validcount = validcount;
        !           325:                
        !           326:                if ( !func(ld) )
        !           327:                        return false;
        !           328:        }
        !           329:        
        !           330:        return true;            /* everything was checked */
        !           331: }
        !           332: 
        !           333: 
        !           334: /*
        !           335: ==================
        !           336: =
        !           337: = P_BlockThingsIterator
        !           338: =
        !           339: ==================
        !           340: */
        !           341: 
        !           342: boolean P_BlockThingsIterator (int x, int y, boolean(*func)(mobj_t*) )
        !           343: {
        !           344:        mobj_t          *mobj;
        !           345:        
        !           346:        if (x<0 || y<0 || x>=bmapwidth || y>=bmapheight)
        !           347:                return true;
        !           348: 
        !           349:        for (mobj = blocklinks[y*bmapwidth+x] ; mobj ; mobj = mobj->bnext)
        !           350:                if (!func( mobj ) )
        !           351:                        return false;   
        !           352: 
        !           353:        return true;
        !           354: }
        !           355: 

unix.superglobalmegacorp.com

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