// Constructor public VisualSidedefParts(VisualMiddleSingle m) { this.upper = null; this.lower = null; this.middledouble = null; this.middlesingle = m; this.middle3d = null; this.middleback = null; //mxd this.fogboundary = null; //mxd }
public readonly VisualFogBoundary fogboundary; //mxd // Constructor public VisualSidedefParts(VisualUpper u, VisualLower l, VisualMiddleDouble m, VisualFogBoundary f, List <VisualMiddle3D> e, List <VisualMiddleBack> eb) { this.upper = u; this.lower = l; this.middledouble = m; this.middlesingle = null; this.fogboundary = f; this.middle3d = e; this.middleback = eb; //mxd }
// This (re)builds the visual sector, calculating all geometry from scratch public void Rebuild() { // Forget old geometry base.ClearGeometry(); // Get sector data SectorData data = GetSectorData(); if (!data.Updated) { data.Update(); } // Create floor floor = (floor ?? new VisualFloor(mode, this)); if (floor.Setup(data.Floor, null)) { AddGeometry(floor); } // Create ceiling ceiling = (ceiling ?? new VisualCeiling(mode, this)); if (ceiling.Setup(data.Ceiling, null)) { AddGeometry(ceiling); } // Create 3D floors for (int i = 0; i < data.ExtraFloors.Count; i++) { Effect3DFloor ef = data.ExtraFloors[i]; bool floorRequired = ef.VavoomType; //mxd bool ceilingRequired = ef.VavoomType; //mxd if (ef.VavoomType || !ef.IgnoreBottomHeight) { //mxd. check if 3d floor is between real floor and ceiling if (!ef.VavoomType) { if (ef.Ceiling.plane.GetInverted().Normal != floor.Level.plane.Normal || ef.Ceiling.plane.Normal != ceiling.Level.plane.Normal) { //mxd. check if at least one vertex of 3d floor is between floor and ceiling floorRequired = Check3dFloorPlane(floor.Vertices, ceiling.Vertices, ef.Ceiling.plane); } //if floor, ceiling and 3d floor are not sloped, compare offsets else if (-floor.Level.plane.Offset < ef.Ceiling.plane.Offset && ceiling.Level.plane.Offset > ef.Ceiling.plane.Offset) { floorRequired = true; } } //mxd. Create a floor if (floorRequired && ef.Ceiling.sector.IsDisposed == false) { VisualFloor vf = (i < extrafloors.Count) ? extrafloors[i] : new VisualFloor(mode, this); if (vf.Setup(ef.Ceiling, ef)) { base.AddGeometry(vf); //mxd. add backside as well if (!ef.VavoomType && ef.RenderInside) { VisualFloor vfb = (i < extrabackfloors.Count) ? extrabackfloors[i] : new VisualFloor(mode, this); if (vfb.Setup(ef.Ceiling, ef, true)) { base.AddGeometry(vfb); } if (i >= extrabackfloors.Count) { extrabackfloors.Add(vfb); } } } if (i >= extrafloors.Count) { extrafloors.Add(vf); } } } //mxd. check if 3d ceiling is between real floor and ceiling if (!ef.VavoomType) { if (ef.Floor.plane.GetInverted().Normal != ceiling.Level.plane.Normal || ef.Floor.plane.Normal != floor.Level.plane.Normal) { //mxd. check if at least one vertex of 3d ceiling is between floor and ceiling ceilingRequired = Check3dFloorPlane(floor.Vertices, ceiling.Vertices, ef.Floor.plane); } //if floor, ceiling and 3d ceiling are not sloped, compare offsets else if (ceiling.Level.plane.Offset > -ef.Floor.plane.Offset && floor.Level.plane.Offset > ef.Floor.plane.Offset) { ceilingRequired = true; } } //mxd. Create a ceiling if (ceilingRequired && ef.Floor.sector.IsDisposed == false) { VisualCeiling vc = (i < extraceilings.Count) ? extraceilings[i] : new VisualCeiling(mode, this); if (vc.Setup(ef.Floor, ef)) { base.AddGeometry(vc); //mxd. add backside as well if (!ef.VavoomType && (ef.RenderInside || ef.IgnoreBottomHeight)) { VisualCeiling vcb = (i < extrabackceilings.Count) ? extrabackceilings[i] : new VisualCeiling(mode, this); if (vcb.Setup(ef.Floor, ef, true)) { base.AddGeometry(vcb); } if (i >= extrabackceilings.Count) { extrabackceilings.Add(vcb); } } } if (i >= extraceilings.Count) { extraceilings.Add(vc); } } } // Go for all sidedefs Dictionary <Sidedef, VisualSidedefParts> oldsides = sides ?? new Dictionary <Sidedef, VisualSidedefParts>(1); sides = new Dictionary <Sidedef, VisualSidedefParts>(base.Sector.Sidedefs.Count); foreach (Sidedef sd in base.Sector.Sidedefs) { // VisualSidedef already exists? VisualSidedefParts parts = oldsides.ContainsKey(sd) ? oldsides[sd] : new VisualSidedefParts(); // Doublesided or singlesided? if (sd.Other != null && sd.Line.IsFlagSet(General.Map.Config.DoubleSidedFlag)) { // Create upper part VisualUpper vu = parts.upper ?? new VisualUpper(mode, this, sd); if (vu.Setup()) { base.AddGeometry(vu); } // Create lower part VisualLower vl = parts.lower ?? new VisualLower(mode, this, sd); if (vl.Setup()) { base.AddGeometry(vl); } // Create middle part VisualMiddleDouble vm = parts.middledouble ?? new VisualMiddleDouble(mode, this, sd); if (vm.Setup()) { base.AddGeometry(vm); } //mxd. Create fog boundary VisualFogBoundary vb = parts.fogboundary ?? new VisualFogBoundary(mode, this, sd); if (vb.Setup()) { vm.FogFactor = 0; // Avoid double-fogging the middle part base.AddGeometry(vb); } // Create 3D wall parts SectorData osd = mode.GetSectorData(sd.Other.Sector); if (!osd.Updated) { osd.Update(); } List <VisualMiddle3D> middles = parts.middle3d ?? new List <VisualMiddle3D>(osd.ExtraFloors.Count); for (int i = 0; i < osd.ExtraFloors.Count; i++) { Effect3DFloor ef = osd.ExtraFloors[i]; if (!ef.VavoomType && ef.IgnoreBottomHeight) { continue; //mxd } VisualMiddle3D vm3 = (i < middles.Count) ? middles[i] : new VisualMiddle3D(mode, this, sd); if (vm3.Setup(ef)) { base.AddGeometry(vm3); } if (i >= middles.Count) { middles.Add(vm3); } } //mxd. Create backsides List <VisualMiddleBack> middlebacks = new List <VisualMiddleBack>(); for (int i = 0; i < data.ExtraFloors.Count; i++) { Effect3DFloor ef = data.ExtraFloors[i]; if (!ef.VavoomType && ef.RenderInside && !ef.IgnoreBottomHeight) { VisualMiddleBack vms = new VisualMiddleBack(mode, this, sd); if (vms.Setup(ef)) { base.AddGeometry(vms); } middlebacks.Add(vms); } } // Store sides.Add(sd, new VisualSidedefParts(vu, vl, vm, vb, middles, middlebacks)); } else { // Create middle part VisualMiddleSingle vm = parts.middlesingle ?? new VisualMiddleSingle(mode, this, sd); if (vm.Setup()) { base.AddGeometry(vm); } // Store sides.Add(sd, new VisualSidedefParts(vm)); } } // Done changed = false; }