Subversion Repositories eduke32

Rev

Rev 5024 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5024 Rev 5035
Line 14647... Line 14647...
14647
void getzrange(const vec3_t *pos, int16_t sectnum,
14647
void getzrange(const vec3_t *pos, int16_t sectnum,
14648
               int32_t *ceilz, int32_t *ceilhit, int32_t *florz, int32_t *florhit,
14648
               int32_t *ceilz, int32_t *ceilhit, int32_t *florz, int32_t *florhit,
14649
               int32_t walldist, uint32_t cliptype)
14649
               int32_t walldist, uint32_t cliptype)
14650
{
14650
{
14651
    int32_t clipsectcnt;
14651
    int32_t clipsectcnt;
14652
    int32_t dax, day, daz, daz2;
-
 
14653
    int32_t i, j, k, dx, dy;
-
 
14654
    int32_t x1, y1, x2, y2;
14652
    int32_t daz, daz2, i, j, x1, y1, x2, y2;
14655
14653
14656
#ifdef YAX_ENABLE
14654
#ifdef YAX_ENABLE
14657
    // YAX round, -1:center, 0:ceiling, 1:floor
14655
    // YAX round, -1:center, 0:ceiling, 1:floor
14658
    int32_t mcf=-1;
14656
    int32_t mcf=-1;
14659
#endif
14657
#endif
Line 14700... Line 14698...
14700
#ifdef YAX_ENABLE
14698
#ifdef YAX_ENABLE
14701
restart_grand:
14699
restart_grand:
14702
#endif
14700
#endif
14703
    do  //Collect sectors inside your square first
14701
    do  //Collect sectors inside your square first
14704
    {
14702
    {
14705
        const walltype *wal;
-
 
14706
        const sectortype *sec;
-
 
14707
        int32_t startwall, endwall;
-
 
14708
-
 
14709
#ifdef HAVE_CLIPSHAPE_FEATURE
14703
#ifdef HAVE_CLIPSHAPE_FEATURE
14710
        if (clipsectcnt>=clipsectnum)
14704
        if (clipsectcnt>=clipsectnum)
14711
        {
14705
        {
14712
            // one set of clip-sprite sectors completed, prepare the next
14706
            // one set of clip-sprite sectors completed, prepare the next
14713
14707
Line 14723... Line 14717...
14723
14717
14724
            clipsprite_initindex(curidx, curspr, &clipsectcnt, pos);
14718
            clipsprite_initindex(curidx, curspr, &clipsectcnt, pos);
14725
14719
14726
            for (i=0; i<clipsectnum; i++)
14720
            for (i=0; i<clipsectnum; i++)
14727
            {
14721
            {
14728
                int32_t fz,cz, hitwhat;
-
 
14729
                k = clipsectorlist[i];
14722
                const int k = clipsectorlist[i];
14730
14723
14731
                if (k==sectq[clipinfo[curidx].qend])
14724
                if (k==sectq[clipinfo[curidx].qend])
14732
                    continue;
14725
                    continue;
14733
14726
-
 
14727
                int32_t fz, cz;
14734
                getzsofslope((int16_t)k,pos->x,pos->y,&daz,&daz2);
14728
                getzsofslope(k,pos->x,pos->y,&daz,&daz2);
14735
                getzsofslope(sectq[clipinfo[curidx].qend],pos->x,pos->y,&cz,&fz);
14729
                getzsofslope(sectq[clipinfo[curidx].qend],pos->x,pos->y,&cz,&fz);
14736
                hitwhat = (curspr-sprite)+49152;
14730
                const int hitwhat = (curspr-sprite)+49152;
14737
14731
14738
                if ((sector[k].ceilingstat&1)==0)
14732
                if ((sector[k].ceilingstat&1)==0)
14739
                {
14733
                {
14740
                    if (pos->z < cz && cz < *florz) { *florz = cz; *florhit = hitwhat; }
14734
                    if (pos->z < cz && cz < *florz) { *florz = cz; *florhit = hitwhat; }
14741
                    if (pos->z > daz && daz > *ceilz) { *ceilz = daz; *ceilhit = hitwhat; }
14735
                    if (pos->z > daz && daz > *ceilz) { *ceilz = daz; *ceilhit = hitwhat; }
Line 14748... Line 14742...
14748
            }
14742
            }
14749
        }
14743
        }
14750
#endif
14744
#endif
14751
        ////////// Walls //////////
14745
        ////////// Walls //////////
14752
14746
-
 
14747
        const walltype *wal;
14753
        sec = &sector[clipsectorlist[clipsectcnt]];
14748
        const sectortype *const startsec = &sector[clipsectorlist[clipsectcnt]];
-
 
14749
        const int startwall = startsec->wallptr;
14754
        startwall = sec->wallptr; endwall = startwall + sec->wallnum;
14750
        const int endwall = startwall + startsec->wallnum;
-
 
14751
14755
        for (j=startwall,wal=&wall[startwall]; j<endwall; j++,wal++)
14752
        for (j=startwall,wal=&wall[startwall]; j<endwall; j++,wal++)
14756
        {
14753
        {
14757
            k = wal->nextsector;
14754
            const int k = wal->nextsector;
-
 
14755
14758
            if (k >= 0)
14756
            if (k >= 0)
14759
            {
14757
            {
14760
                const walltype *const wal2 = &wall[wal->point2];
14758
                const walltype *const wal2 = &wall[wal->point2];
14761
14759
14762
                x1 = wal->x; x2 = wal2->x;
14760
                x1 = wal->x; x2 = wal2->x;
Line 14764... Line 14762...
14764
                if ((x1 > xmax) && (x2 > xmax)) continue;
14762
                if ((x1 > xmax) && (x2 > xmax)) continue;
14765
                y1 = wal->y; y2 = wal2->y;
14763
                y1 = wal->y; y2 = wal2->y;
14766
                if ((y1 < ymin) && (y2 < ymin)) continue;
14764
                if ((y1 < ymin) && (y2 < ymin)) continue;
14767
                if ((y1 > ymax) && (y2 > ymax)) continue;
14765
                if ((y1 > ymax) && (y2 > ymax)) continue;
14768
14766
14769
                dx = x2-x1; dy = y2-y1;
14767
                const int32_t dx = x2-x1, dy = y2-y1;
14770
                if (dx*(pos->y-y1) < (pos->x-x1)*dy) continue; //back
14768
                if (dx*(pos->y-y1) < (pos->x-x1)*dy) continue; //back
-
 
14769
14771
                if (dx > 0) dax = dx*(ymin-y1); else dax = dx*(ymax-y1);
14770
                int32_t dax = (dx > 0) ? dx*(ymin-y1) : dx*(ymax-y1);
14772
                if (dy > 0) day = dy*(xmax-x1); else day = dy*(xmin-x1);
14771
                int32_t day = (dy > 0) ? dy*(xmax-x1) : dy*(xmin-x1);
14773
                if (dax >= day) continue;
14772
                if (dax >= day)
-
 
14773
                    continue;
14774
14774
14775
                if (wal->cstat&dawalclipmask) continue;  // XXX?
14775
                if (wal->cstat&dawalclipmask) continue;  // XXX?
14776
                sec = &sector[k];
14776
                const sectortype *const sec = &sector[k];
14777
14777
14778
#ifdef HAVE_CLIPSHAPE_FEATURE
14778
#ifdef HAVE_CLIPSHAPE_FEATURE
14779
                if (curspr)
14779
                if (curspr)
14780
                {
14780
                {
14781
                    if (k==sectq[clipinfo[curidx].qend])
14781
                    if (k==sectq[clipinfo[curidx].qend])
Line 14797... Line 14797...
14797
14797
14798
                if ((x1 < xmin+MAXCLIPDIST) && (x2 < xmin+MAXCLIPDIST)) continue;
14798
                if ((x1 < xmin+MAXCLIPDIST) && (x2 < xmin+MAXCLIPDIST)) continue;
14799
                if ((x1 > xmax-MAXCLIPDIST) && (x2 > xmax-MAXCLIPDIST)) continue;
14799
                if ((x1 > xmax-MAXCLIPDIST) && (x2 > xmax-MAXCLIPDIST)) continue;
14800
                if ((y1 < ymin+MAXCLIPDIST) && (y2 < ymin+MAXCLIPDIST)) continue;
14800
                if ((y1 < ymin+MAXCLIPDIST) && (y2 < ymin+MAXCLIPDIST)) continue;
14801
                if ((y1 > ymax-MAXCLIPDIST) && (y2 > ymax-MAXCLIPDIST)) continue;
14801
                if ((y1 > ymax-MAXCLIPDIST) && (y2 > ymax-MAXCLIPDIST)) continue;
-
 
14802
14802
                if (dx > 0) dax += dx*MAXCLIPDIST; else dax -= dx*MAXCLIPDIST;
14803
                if (dx > 0) dax += dx*MAXCLIPDIST; else dax -= dx*MAXCLIPDIST;
14803
                if (dy > 0) day -= dy*MAXCLIPDIST; else day += dy*MAXCLIPDIST;
14804
                if (dy > 0) day -= dy*MAXCLIPDIST; else day += dy*MAXCLIPDIST;
14804
                if (dax >= day) continue;
14805
                if (dax >= day)
-
 
14806
                    continue;
14805
#ifdef YAX_ENABLE
14807
#ifdef YAX_ENABLE
14806
                if (mcf==-1 && curspr==NULL)
14808
                if (mcf==-1 && curspr==NULL)
14807
                    origclipsectorlist[origclipsectnum++] = k;
14809
                    origclipsectorlist[origclipsectnum++] = k;
14808
#endif
14810
#endif
14809
                //It actually got here, through all the continue's!!!
14811
                //It actually got here, through all the continue's!!!
Line 14882... Line 14884...
14882
                x1 = spr->x; y1 = spr->y;
14884
                x1 = spr->x; y1 = spr->y;
14883
14885
14884
                switch (cstat&48)
14886
                switch (cstat&48)
14885
                {
14887
                {
14886
                case 0:
14888
                case 0:
-
 
14889
                {
14887
                    k = walldist+(spr->clipdist<<2)+1;
14890
                    int32_t k = walldist+(spr->clipdist<<2)+1;
14888
                    if ((klabs(x1-pos->x) <= k) && (klabs(y1-pos->y) <= k))
14891
                    if ((klabs(x1-pos->x) <= k) && (klabs(y1-pos->y) <= k))
14889
                    {
14892
                    {
14890
                        daz = spr->z + spriteheightofs(j, &k, 1);
14893
                        daz = spr->z + spriteheightofs(j, &k, 1);
14891
                        daz2 = daz - k;
14894
                        daz2 = daz - k;
14892
                        clipyou = 1;
14895
                        clipyou = 1;
14893
                    }
14896
                    }
14894
                    break;
14897
                    break;
-
 
14898
                }
14895
14899
14896
                case 16:
14900
                case 16:
14897
                {
14901
                {
14898
                    get_wallspr_points(spr, &x1, &x2, &y1, &y2);
14902
                    get_wallspr_points(spr, &x1, &x2, &y1, &y2);
14899
14903
14900
                    if (clipinsideboxline(pos->x,pos->y,x1,y1,x2,y2,walldist+1) != 0)
14904
                    if (clipinsideboxline(pos->x,pos->y,x1,y1,x2,y2,walldist+1) != 0)
14901
                    {
14905
                    {
-
 
14906
                        int32_t k;
14902
                        daz = spr->z + spriteheightofs(j, &k, 1);
14907
                        daz = spr->z + spriteheightofs(j, &k, 1);
14903
                        daz2 = daz-k;
14908
                        daz2 = daz-k;
14904
                        clipyou = 1;
14909
                        clipyou = 1;
14905
                    }
14910
                    }
14906
                    break;
14911
                    break;
Line 14911... Line 14916...
14911
                    int32_t x3, y3, x4, y4;
14916
                    int32_t x3, y3, x4, y4;
14912
14917
14913
                    daz = spr->z; daz2 = daz;
14918
                    daz = spr->z; daz2 = daz;
14914
14919
14915
                    if ((cstat&64) != 0)
14920
                    if ((cstat&64) != 0)
14916
                        if ((pos->z > daz) == ((cstat&8)==0)) continue;
14921
                        if ((pos->z > daz) == ((cstat&8)==0))
-
 
14922
                            continue;
14917
14923
14918
                    get_floorspr_points(spr, pos->x, pos->y, &x1, &x2, &x3, &x4,
14924
                    get_floorspr_points(spr, pos->x, pos->y, &x1, &x2, &x3, &x4,
14919
                                        &y1, &y2, &y3, &y4);
14925
                                        &y1, &y2, &y3, &y4);
14920
14926
14921
                    dax = mulscale14(sintable[(spr->ang-256+512)&2047],walldist+4);
14927
                    const int32_t dax = mulscale14(sintable[(spr->ang-256+512)&2047],walldist+4);
14922
                    day = mulscale14(sintable[(spr->ang-256)&2047],walldist+4);
14928
                    const int32_t day = mulscale14(sintable[(spr->ang-256)&2047],walldist+4);
14923
                    x1 += dax; x2 -= day; x3 -= dax; x4 += day;
14929
                    x1 += dax; x2 -= day; x3 -= dax; x4 += day;
14924
                    y1 += day; y2 += dax; y3 -= day; y4 -= dax;
14930
                    y1 += day; y2 += dax; y3 -= day; y4 -= dax;
14925
14931
14926
                    clipyou = get_floorspr_clipyou(x1, x2, x3, x4, y1, y2, y3, y4);
14932
                    clipyou = get_floorspr_clipyou(x1, x2, x3, x4, y1, y2, y3, y4);
14927
                    break;
14933
                    break;