/* savebsp.m */ #include "idbsp.h" /* id secdefstore_i; */ STORAGE *secdefstore_i; /* #define MAXVERTEX 8192 #define MAXTOUCHSECS 16 #define MAXSECTORS 2048 #define MAXSUBSECTORS 2048 */ int vertexsubcount[MAXVERTEX]; short vertexsublist[MAXVERTEX][MAXTOUCHSECS]; /* short **vertexsublist; */ int subsectordef[MAXSUBSECTORS]; int subsectornum[MAXSUBSECTORS]; int buildsector; /* ========================== = = RecursiveGroupSubsector = ========================== */ void RecursiveGroupSubsector (int ssnum) { int i, l, count; int vertex; int checkss; short *vertsub; /* short vertsub[MAXTOUCHSECS]; */ int vt; mapseg_t *seg; mapsubsector_t *ss; maplinedef_t *ld; mapsidedef_t *sd; /* ss = [subsecstore_i elementAt:ssnum]; */ ss = (mapsubsector_t *)subsecstore_i->data + ssnum; subsectornum[ssnum] = buildsector; for (l=0 ; lnumsegs ; l++) { /* seg = [maplinestore_i elementAt: ss->firstseg+l]; ld = [ldefstore_i elementAt: seg->linedef]; */ seg = (mapseg_t *)maplinestore_i->data + ss->firstseg + l; ld = (maplinedef_t *)ldefstore_i->data + seg->linedef; DrawLineDef (ld); /* sd = [sdefstore_i elementAt: ld->sidenum[seg->side]]; */ sd = (mapsidedef_t *)sdefstore_i->data + ld->sidenum[seg->side]; sd->sector = buildsector; for (vt=0 ; vt<2 ; vt++) { if (vt) vertex = seg->v1; else vertex = seg->v2; vertsub = vertexsublist[vertex]; /* fseek(vertexsublist, vertex * MAXTOUCHSECS, SEEK_SET); fread(vertsub,sizeof(short),MAXTOUCHSECS,vertexsublist); */ count = vertexsubcount[vertex]; for (i=0 ; ifloorheight; ms.ceilingheight = def->ceilingheight; memcpy (ms.floorpic,def->floorflat,8); memcpy (ms.ceilingpic,def->ceilingflat,8); ms.lightlevel = def->lightlevel; ms.special = def->special; ms.tag = def->tag; /* see if an identical sector already exists count = [secdefstore_i count]; msp = [secdefstore_i elementAt:0]; */ count = secdefstore_i->count; msp = (mapsector_t *)secdefstore_i->data; for (i=0 ; idata + secdefstore_i->count, &ms, sizeof(mapsector_t)); secdefstore_i->count += 1; secdefstore_i->data = (mapsector_t *)realloc(secdefstore_i->data, sizeof(mapsector_t) * (secdefstore_i->count + 1)); return count; } void AddSubsectorToVertex (int subnum, int vertex) { int j; /* short vsl[MAXTOUCHSECS]; */ for (j=0 ; j< vertexsubcount[vertex] ; j++) if (vertexsublist[vertex][j] == subnum) return; vertexsublist[vertex][j] = subnum; vertexsubcount[vertex]++; /* fseek(vertexsublist, vertex * MAXTOUCHSECS, SEEK_SET); fread(vsl,sizeof(short),MAXTOUCHSECS, vertexsublist); for (j=0;jdata = (mapsector_t *)SafeMalloc(sizeof(mapsector_t)); secdefstore_i->count = 0; secdefstore_i->size = sizeof(mapsector_t); /* count = [linestore_i count]; wl= [linestore_i elementAt:0]; */ count = linestore_i->count; wl = linestore_i->data; for (i=0 ; idata + i; */ wl->side[0].sector = UniqueSector(&wl->side[0].sectordef); if (wl->flags & ML_TWOSIDED) { wl->side[1].sector = UniqueSector(&wl->side[1].sectordef); } } } /* ================ = = ProcessSectors = = Must be called after ProcessNodes, because it references the subsector list ================ */ void ProcessSectors (void) { int i,l; int numss; mapsubsector_t *ss; mapsector_t sec; mapseg_t *seg; maplinedef_t *ml; mapsidedef_t *ms; /* build a connection matrix that lists all the subsectors that touch each vertex */ memset (vertexsubcount, 0, sizeof(vertexsubcount)); memset (vertexsublist, 0, sizeof(vertexsublist)); /* memset(vertexsublist, 0, MAXVERTEX * MAXTOUCHSECS); */ /* numss = [subsecstore_i count]; */ numss = subsecstore_i->count; printf("\n"); for (i=0 ; idata + i; for (l=0 ; lnumsegs ; l++) { /* seg = [maplinestore_i elementAt: ss->firstseg+l]; */ seg = (mapseg_t *)maplinestore_i->data + ss->firstseg + l; AddSubsectorToVertex (i, seg->v1); AddSubsectorToVertex (i, seg->v2); } subsectornum[i] = -1; /* ungrouped */ /* ml = [ldefstore_i elementAt: seg->linedef]; ms = [sdefstore_i elementAt: ml->sidenum[seg->side]]; */ ml = (maplinedef_t *)ldefstore_i->data + seg->linedef; ms = (mapsidedef_t *)sdefstore_i->data + ml->sidenum[seg->side]; subsectordef[i] = ms->sector; } /* recursively build final sectors */ /* secstore_i = [[Storage alloc] initCount: 0 elementSize: sizeof(mapsector_t) description: NULL]; */ secstore_i = (STORAGE *)SafeMalloc(sizeof(STORAGE)); secstore_i->data = (mapsector_t *)SafeMalloc(sizeof(mapsector_t)); secstore_i->count = 0; secstore_i->size = sizeof(mapsector_t); buildsector = 0; /* if (draw) PSsetgray (0); */ for (i=0 ; idata + subsectordef[i]); /* sec = *(mapsector_t *)[secdefstore_i elementAt: subsectordef[i]]; */ /* [secstore_i addElement: &sec]; */ memcpy((mapsector_t *)secstore_i->data + secstore_i->count, &sec, sizeof(mapsector_t)); secstore_i->count += 1; secstore_i->data = (mapsector_t *)realloc(secstore_i->data, sizeof(mapsector_t) * (secstore_i->count + 1)); buildsector++; } } }