home *** CD-ROM | disk | FTP | other *** search
/ WADS of WADS / WadsOfWads.1994.zip / OTHER / DOOMBSP / SAVESCTR.M < prev    next >
Text File  |  1994-04-06  |  5KB  |  233 lines

  1. // savebsp.m
  2.  
  3. #import "doombsp.h"
  4.  
  5. id        secdefstore_i;
  6.  
  7. #define        MAXVERTEX        8192
  8. #define        MAXTOUCHSECS    16
  9. #define        MAXSECTORS        2048
  10. #define        MAXSUBSECTORS    2048
  11.  
  12. int            vertexsubcount[MAXVERTEX];
  13. short        vertexsublist[MAXVERTEX][MAXTOUCHSECS];
  14.  
  15. int            subsectordef[MAXSUBSECTORS];
  16. int            subsectornum[MAXSUBSECTORS];
  17.  
  18. int            buildsector;
  19.  
  20.  
  21. /*
  22. ==========================
  23. =
  24. = RecursiveGroupSubsector
  25. =
  26. ==========================
  27. */
  28.  
  29. void RecursiveGroupSubsector (int ssnum)
  30. {
  31.     int                i, l, count;
  32.     int                vertex;
  33.     int                checkss;
  34.     short            *vertsub;
  35.     int                vt;
  36.     mapseg_t        *seg;
  37.     mapsubsector_t    *ss;
  38.     maplinedef_t    *ld;
  39.     mapsidedef_t    *sd;
  40.     
  41.     ss = [subsecstore_i elementAt:ssnum];
  42.     subsectornum[ssnum] = buildsector;
  43.     
  44.     for (l=0 ; l<ss->numsegs ; l++)
  45.     {
  46.         seg = [maplinestore_i elementAt: ss->firstseg+l];
  47.         ld = [ldefstore_i elementAt: seg->linedef];
  48. DrawLineDef (ld);
  49.         sd = [sdefstore_i elementAt: ld->sidenum[seg->side]];
  50.         sd->sector = buildsector;
  51.         
  52.         for (vt=0 ; vt<2 ; vt++)
  53.         {
  54.             if (vt)
  55.                 vertex = seg->v1;
  56.             else
  57.                 vertex = seg->v2;
  58.             
  59.             vertsub = vertexsublist[vertex];
  60.             count = vertexsubcount[vertex];
  61.             for (i=0 ; i<count ; i++)
  62.             {
  63.                 checkss = vertsub[i];
  64.                 if (subsectordef[checkss] == subsectordef[ssnum])
  65.                 {
  66.                     if (subsectornum[checkss] == -1)
  67.                     {
  68.                         RecursiveGroupSubsector (checkss);
  69.                         continue;
  70.                     }
  71.                     if ( subsectornum[checkss] != buildsector)
  72.                         Error ("RecusiveGroup: regrouped a sector");
  73.                 }
  74.             }
  75.         }
  76.     }
  77. }
  78.  
  79. /*
  80. =================
  81. =
  82. = UniqueSector
  83. =
  84. = Returns the sector number, adding a new sector if needed 
  85. =================
  86. */
  87.  
  88. int UniqueSector (sectordef_t *def)
  89. {
  90.     int        i, count;
  91.     mapsector_t        ms, *msp;
  92.     
  93.     ms.floorheight = def->floorheight;
  94.     ms.ceilingheight = def->ceilingheight;
  95.     memcpy (ms.floorpic,def->floorflat,8);
  96.     memcpy (ms.ceilingpic,def->ceilingflat,8);
  97.     ms.lightlevel = def->lightlevel;
  98.     ms.special = def->special;
  99.     ms.tag = def->tag;
  100.     
  101. // see if an identical sector already exists
  102.     count = [secdefstore_i count];
  103.     msp = [secdefstore_i elementAt:0];
  104.     for (i=0 ; i<count ; i++, msp++)
  105.         if (!bcmp(msp, &ms, sizeof(ms)))
  106.             return i;
  107.  
  108.     [secdefstore_i addElement: &ms];
  109.     
  110.     return count;    
  111. }
  112.  
  113.  
  114.  
  115.  
  116. void AddSubsectorToVertex (int subnum, int vertex)
  117. {
  118.     int        j;
  119.     
  120.     for (j=0 ; j< vertexsubcount[vertex] ; j++)
  121.         if (vertexsublist[vertex][j] == subnum)
  122.             return;
  123.     vertexsublist[vertex][j] = subnum;
  124.     vertexsubcount[vertex]++;
  125. }
  126.  
  127.  
  128. /*
  129. ================
  130. =
  131. = BuildSectordefs
  132. =
  133. = Call before ProcessNodes
  134. ================
  135. */
  136.  
  137. void BuildSectordefs (void)
  138. {
  139.     int                i;
  140.     worldline_t        *wl;
  141.     int                count;
  142.     mapseg_t        *seg;
  143.     
  144. //
  145. // build sectordef list
  146. //
  147.     secdefstore_i = [[Storage alloc]
  148.         initCount:        0
  149.         elementSize:    sizeof(mapsector_t)
  150.         description:    NULL];
  151.     
  152.     count = [linestore_i count];
  153.     wl= [linestore_i elementAt:0];
  154.     for (i=0 ; i<count ; i++, wl++)
  155.     {
  156.         seg = [maplinestore_i elementAt: i];
  157.         wl->side[0].sector = UniqueSector(&wl->side[0].sectordef);
  158.         if (wl->flags & ML_TWOSIDED)
  159.         {
  160.             wl->side[1].sector = UniqueSector(&wl->side[1].sectordef);
  161.         }
  162.     }
  163. }
  164.  
  165.  
  166. /*
  167. ================
  168. =
  169. = ProcessSectors
  170. =
  171. = Must be called after ProcessNodes, because it references the subsector list
  172. ================
  173. */
  174.  
  175. void ProcessSectors (void)
  176. {
  177.     int                i,l;
  178.     int                numss;
  179.     mapsubsector_t    *ss;    
  180.     mapsector_t        sec;
  181.     mapseg_t        *seg;
  182.     maplinedef_t    *ml;
  183.     mapsidedef_t    *ms;
  184.     
  185. //
  186. // build a connection matrix that lists all the subsectors that touch
  187. // each vertex
  188. //
  189.     memset (vertexsubcount, 0, sizeof(vertexsubcount));
  190.     memset (vertexsublist, 0, sizeof(vertexsublist));
  191.     numss = [subsecstore_i count];
  192.     for (i=0 ; i<numss ; i++)
  193.     {
  194.         ss = [subsecstore_i elementAt: i];
  195.         for (l=0 ; l<ss->numsegs ; l++)
  196.         {
  197.             seg = [maplinestore_i elementAt: ss->firstseg+l];
  198.             AddSubsectorToVertex (i, seg->v1);
  199.             AddSubsectorToVertex (i, seg->v2);
  200.         }
  201.         subsectornum[i] = -1;        // ungrouped
  202.         ml = [ldefstore_i elementAt: seg->linedef];
  203.         ms = [sdefstore_i elementAt: ml->sidenum[seg->side]];
  204.         subsectordef[i] = ms->sector;
  205.     }
  206.     
  207. //
  208. // recursively build final sectors
  209. //
  210.     secstore_i = [[Storage alloc]
  211.         initCount:        0
  212.         elementSize:    sizeof(mapsector_t)
  213.         description:    NULL];
  214.     
  215.     buildsector = 0;
  216.     if (draw)
  217.         PSsetgray (0);
  218.     for (i=0 ; i<numss ; i++)
  219.     {
  220.         if (subsectornum[i] == -1)
  221.         {
  222.     EraseWindow ();
  223.             RecursiveGroupSubsector (i);
  224.             sec = *(mapsector_t *)[secdefstore_i elementAt: subsectordef[i]];
  225.             [secstore_i addElement: &sec];
  226.             buildsector++;
  227.         }
  228.     }
  229.  
  230. }
  231.  
  232.  
  233.