static void LoadSectors (sectortype *bsec) { FDynamicColormap *map = GetSpecialLights (PalEntry (255,255,255), level.fadeto, 0); sector_t *sec; char tnam[9]; sec = sectors = new sector_t[numsectors]; memset (sectors, 0, sizeof(sector_t)*numsectors); sectors[0].e = new extsector_t[numsectors]; for (int i = 0; i < numsectors; ++i, ++bsec, ++sec) { bsec->wallptr = WORD(bsec->wallptr); bsec->wallnum = WORD(bsec->wallnum); bsec->ceilingstat = WORD(bsec->ceilingstat); bsec->floorstat = WORD(bsec->floorstat); sec->e = §ors[0].e[i]; sec->SetPlaneTexZ(sector_t::floor, -(LittleLong(bsec->floorz) << 8)); sec->floorplane.d = -sec->GetPlaneTexZ(sector_t::floor); sec->floorplane.c = FRACUNIT; sec->floorplane.ic = FRACUNIT; mysnprintf (tnam, countof(tnam), "BTIL%04d", LittleShort(bsec->floorpicnum)); sec->SetTexture(sector_t::floor, TexMan.GetTexture (tnam, FTexture::TEX_Build)); sec->SetXScale(sector_t::floor, (bsec->floorstat & 8) ? FRACUNIT*2 : FRACUNIT); sec->SetYScale(sector_t::floor, (bsec->floorstat & 8) ? FRACUNIT*2 : FRACUNIT); sec->SetXOffset(sector_t::floor, (bsec->floorxpanning << FRACBITS) + (32 << FRACBITS)); sec->SetYOffset(sector_t::floor, bsec->floorypanning << FRACBITS); sec->SetPlaneLight(sector_t::floor, SHADE2LIGHT (bsec->floorshade)); sec->ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING); sec->SetPlaneTexZ(sector_t::ceiling, -(LittleLong(bsec->ceilingz) << 8)); sec->ceilingplane.d = sec->GetPlaneTexZ(sector_t::ceiling); sec->ceilingplane.c = -FRACUNIT; sec->ceilingplane.ic = -FRACUNIT; mysnprintf (tnam, countof(tnam), "BTIL%04d", LittleShort(bsec->ceilingpicnum)); sec->SetTexture(sector_t::ceiling, TexMan.GetTexture (tnam, FTexture::TEX_Build)); if (bsec->ceilingstat & 1) { sky1texture = sky2texture = sec->GetTexture(sector_t::ceiling); sec->SetTexture(sector_t::ceiling, skyflatnum); } sec->SetXScale(sector_t::ceiling, (bsec->ceilingstat & 8) ? FRACUNIT*2 : FRACUNIT); sec->SetYScale(sector_t::ceiling, (bsec->ceilingstat & 8) ? FRACUNIT*2 : FRACUNIT); sec->SetXOffset(sector_t::ceiling, (bsec->ceilingxpanning << FRACBITS) + (32 << FRACBITS)); sec->SetYOffset(sector_t::ceiling, bsec->ceilingypanning << FRACBITS); sec->SetPlaneLight(sector_t::ceiling, SHADE2LIGHT (bsec->ceilingshade)); sec->ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING); sec->lightlevel = (sec->GetPlaneLight(sector_t::floor) + sec->GetPlaneLight(sector_t::ceiling)) / 2; sec->seqType = -1; sec->SeqName = NAME_None; sec->nextsec = -1; sec->prevsec = -1; sec->gravity = 1.f; sec->friction = ORIG_FRICTION; sec->movefactor = ORIG_FRICTION_FACTOR; sec->ColorMap = map; sec->ZoneNumber = 0xFFFF; if (bsec->floorstat & 4) { sec->SetAngle(sector_t::floor, ANGLE_90); sec->SetXScale(sector_t::floor, -sec->GetXScale(sector_t::floor)); } if (bsec->floorstat & 16) { sec->SetXScale(sector_t::floor, -sec->GetXScale(sector_t::floor)); } if (bsec->floorstat & 32) { sec->SetYScale(sector_t::floor, -sec->GetYScale(sector_t::floor)); } if (bsec->ceilingstat & 4) { sec->SetAngle(sector_t::ceiling, ANGLE_90); sec->SetYScale(sector_t::ceiling, -sec->GetYScale(sector_t::ceiling)); } if (bsec->ceilingstat & 16) { sec->SetXScale(sector_t::ceiling, -sec->GetXScale(sector_t::ceiling)); } if (bsec->ceilingstat & 32) { sec->SetYScale(sector_t::ceiling, -sec->GetYScale(sector_t::ceiling)); } } }
static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec) { int i, j; // Setting numvertexes to the same as numwalls is overly conservative, // but the extra vertices will be removed during the BSP building pass. numsides = numvertexes = numwalls; numlines = 0; sides = new side_t[numsides]; memset (sides, 0, numsides*sizeof(side_t)); vertexes = new vertex_t[numvertexes]; numvertexes = 0; // First mark each sidedef with the sector it belongs to for (i = 0; i < numsectors; ++i) { if (bsec[i].wallptr >= 0) { for (j = 0; j < bsec[i].wallnum; ++j) { sides[j + bsec[i].wallptr].sector = sectors + i; } } } // Now copy wall properties to their matching sidedefs for (i = 0; i < numwalls; ++i) { char tnam[9]; FTextureID overpic, pic; mysnprintf (tnam, countof(tnam), "BTIL%04d", LittleShort(walls[i].picnum)); pic = TexMan.GetTexture (tnam, FTexture::TEX_Build); mysnprintf (tnam, countof(tnam), "BTIL%04d", LittleShort(walls[i].overpicnum)); overpic = TexMan.GetTexture (tnam, FTexture::TEX_Build); walls[i].x = LittleLong(walls[i].x); walls[i].y = LittleLong(walls[i].y); walls[i].point2 = LittleShort(walls[i].point2); walls[i].cstat = LittleShort(walls[i].cstat); walls[i].nextwall = LittleShort(walls[i].nextwall); walls[i].nextsector = LittleShort(walls[i].nextsector); sides[i].SetTextureXOffset(walls[i].xpanning << FRACBITS); sides[i].SetTextureYOffset(walls[i].ypanning << FRACBITS); sides[i].SetTexture(side_t::top, pic); sides[i].SetTexture(side_t::bottom, pic); if (walls[i].nextsector < 0 || (walls[i].cstat & 32)) { sides[i].SetTexture(side_t::mid, pic); } else if (walls[i].cstat & 16) { sides[i].SetTexture(side_t::mid, overpic); } else { sides[i].SetTexture(side_t::mid, FNullTextureID()); } sides[i].TexelLength = walls[i].xrepeat * 8; sides[i].SetTextureYScale(walls[i].yrepeat << (FRACBITS - 3)); sides[i].SetTextureXScale(FRACUNIT); sides[i].SetLight(SHADE2LIGHT(walls[i].shade)); sides[i].Flags = WALLF_ABSLIGHTING; sides[i].RightSide = walls[i].point2; sides[walls[i].point2].LeftSide = i; if (walls[i].nextwall >= 0 && walls[i].nextwall <= i) { sides[i].linedef = sides[walls[i].nextwall].linedef; } else { sides[i].linedef = (line_t*)(intptr_t)(numlines++); } } // Set line properties that Doom doesn't store per-sidedef lines = new line_t[numlines]; memset (lines, 0, numlines*sizeof(line_t)); for (i = 0, j = -1; i < numwalls; ++i) { if (walls[i].nextwall >= 0 && walls[i].nextwall <= i) { continue; } j = int(intptr_t(sides[i].linedef)); lines[j].sidedef[0] = (side_t*)(intptr_t)i; lines[j].sidedef[1] = (side_t*)(intptr_t)walls[i].nextwall; lines[j].v1 = FindVertex (walls[i].x, walls[i].y); lines[j].v2 = FindVertex (walls[walls[i].point2].x, walls[walls[i].point2].y); lines[j].frontsector = sides[i].sector; lines[j].flags |= ML_WRAP_MIDTEX; if (walls[i].nextsector >= 0) { lines[j].backsector = sectors + walls[i].nextsector; lines[j].flags |= ML_TWOSIDED; } else { lines[j].backsector = NULL; } P_AdjustLine (&lines[j]); if (walls[i].cstat & 128) { if (walls[i].cstat & 512) { lines[j].Alpha = FRACUNIT/3; } else { lines[j].Alpha = FRACUNIT*2/3; } } if (walls[i].cstat & 1) { lines[j].flags |= ML_BLOCKING; } if (walls[i].nextwall < 0) { if (walls[i].cstat & 4) { lines[j].flags |= ML_DONTPEGBOTTOM; } } else { if (walls[i].cstat & 4) { lines[j].flags |= ML_DONTPEGTOP; } else { lines[j].flags |= ML_DONTPEGBOTTOM; } } if (walls[i].cstat & 64) { lines[j].flags |= ML_BLOCKEVERYTHING; } } // Finish setting sector properties that depend on walls for (i = 0; i < numsectors; ++i, ++bsec) { SlopeWork slope; slope.wal = &walls[bsec->wallptr]; slope.wal2 = &walls[slope.wal->point2]; slope.dx = slope.wal2->x - slope.wal->x; slope.dy = slope.wal2->y - slope.wal->y; slope.i = long (sqrt ((double)(slope.dx*slope.dx+slope.dy*slope.dy))) << 5; if (slope.i == 0) { continue; } if ((bsec->floorstat & 2) && (bsec->floorheinum != 0)) { // floor is sloped slope.heinum = -LittleShort(bsec->floorheinum); slope.z[0] = slope.z[1] = slope.z[2] = -bsec->floorz; CalcPlane (slope, sectors[i].floorplane); } if ((bsec->ceilingstat & 2) && (bsec->ceilingheinum != 0)) { // ceiling is sloped slope.heinum = -LittleShort(bsec->ceilingheinum); slope.z[0] = slope.z[1] = slope.z[2] = -bsec->ceilingz; CalcPlane (slope, sectors[i].ceilingplane); } int linenum = int(intptr_t(sides[bsec->wallptr].linedef)); int sidenum = int(intptr_t(lines[linenum].sidedef[1])); if (bsec->floorstat & 64) { // floor is aligned to first wall P_AlignFlat (linenum, sidenum == bsec->wallptr, 0); } if (bsec->ceilingstat & 64) { // ceiling is aligned to first wall P_AlignFlat (linenum, sidenum == bsec->wallptr, 0); } } for (i = 0; i < numlines; i++) { intptr_t front = intptr_t(lines[i].sidedef[0]); intptr_t back = intptr_t(lines[i].sidedef[1]); lines[i].sidedef[0] = front >= 0 ? &sides[front] : NULL; lines[i].sidedef[1] = back >= 0 ? &sides[back] : NULL; } for (i = 0; i < numsides; i++) { assert(sides[i].sector != NULL); sides[i].linedef = &lines[intptr_t(sides[i].linedef)]; } }
static void LoadSectors (sectortype *bsec, int count) { FDynamicColormap *map = GetSpecialLights (PalEntry (255,255,255), level.fadeto, 0); sector_t *sec; char tnam[9]; level.sectors.Alloc(count); sec = &level.sectors[0]; memset (sec, 0, sizeof(sector_t)*count); sec->e = new extsector_t[count]; for (int i = 0; i < count; ++i, ++bsec, ++sec) { bsec->wallptr = WORD(bsec->wallptr); bsec->wallnum = WORD(bsec->wallnum); bsec->ceilingstat = WORD(bsec->ceilingstat); bsec->floorstat = WORD(bsec->floorstat); sec->e = &sec->e[i]; double floorheight = -LittleLong(bsec->floorZ) / 256.; sec->SetPlaneTexZ(sector_t::floor, floorheight); sec->floorplane.SetAtHeight(floorheight, sector_t::floor); mysnprintf (tnam, countof(tnam), "BTIL%04d", LittleShort(bsec->floorpicnum)); sec->SetTexture(sector_t::floor, TexMan.GetTexture (tnam, FTexture::TEX_Build)); sec->SetXScale(sector_t::floor, (bsec->floorstat & 8) ? 2. : 1.); sec->SetYScale(sector_t::floor, (bsec->floorstat & 8) ? 2. : 1.); sec->SetXOffset(sector_t::floor, bsec->floorxpanning + 32.); sec->SetYOffset(sector_t::floor, bsec->floorypanning + 0.); sec->SetPlaneLight(sector_t::floor, SHADE2LIGHT (bsec->floorshade)); sec->ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING); double ceilingheight = -LittleLong(bsec->ceilingZ) / 256.; sec->SetPlaneTexZ(sector_t::ceiling, ceilingheight); sec->ceilingplane.SetAtHeight(ceilingheight, sector_t::ceiling); mysnprintf (tnam, countof(tnam), "BTIL%04d", LittleShort(bsec->ceilingpicnum)); sec->SetTexture(sector_t::ceiling, TexMan.GetTexture (tnam, FTexture::TEX_Build)); if (bsec->ceilingstat & 1) { sky1texture = sky2texture = sec->GetTexture(sector_t::ceiling); sec->SetTexture(sector_t::ceiling, skyflatnum); } sec->SetXScale(sector_t::ceiling, (bsec->ceilingstat & 8) ? 2. : 1.); sec->SetYScale(sector_t::ceiling, (bsec->ceilingstat & 8) ? 2. : 1.); sec->SetXOffset(sector_t::ceiling, bsec->ceilingxpanning + 32.); sec->SetYOffset(sector_t::ceiling, bsec->ceilingypanning + 0.); sec->SetPlaneLight(sector_t::ceiling, SHADE2LIGHT (bsec->ceilingshade)); sec->ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING); sec->lightlevel = (sec->GetPlaneLight(sector_t::floor) + sec->GetPlaneLight(sector_t::ceiling)) / 2; sec->seqType = -1; sec->SeqName = NAME_None; sec->nextsec = -1; sec->prevsec = -1; sec->gravity = 1.f; sec->friction = ORIG_FRICTION; sec->movefactor = ORIG_FRICTION_FACTOR; sec->ColorMap = map; sec->ZoneNumber = 0xFFFF; sec->terrainnum[sector_t::ceiling] = sec->terrainnum[sector_t::floor] = -1; if (bsec->floorstat & 4) { sec->SetAngle(sector_t::floor, DAngle(90.)); sec->SetXScale(sector_t::floor, -sec->GetXScale(sector_t::floor)); } if (bsec->floorstat & 16) { sec->SetXScale(sector_t::floor, -sec->GetXScale(sector_t::floor)); } if (bsec->floorstat & 32) { sec->SetYScale(sector_t::floor, -sec->GetYScale(sector_t::floor)); } if (bsec->ceilingstat & 4) { sec->SetAngle(sector_t::ceiling, DAngle(90.)); sec->SetYScale(sector_t::ceiling, -sec->GetYScale(sector_t::ceiling)); } if (bsec->ceilingstat & 16) { sec->SetXScale(sector_t::ceiling, -sec->GetXScale(sector_t::ceiling)); } if (bsec->ceilingstat & 32) { sec->SetYScale(sector_t::ceiling, -sec->GetYScale(sector_t::ceiling)); } } }