internal SortedVisualSide(BaseVisualGeometrySidedef side) { Side = side; Bounds = BuilderModesTools.GetSidedefPartSize(side); Index = index++; if (side.Sidedef.Line.Front == side.Sidedef) { Start = side.Sidedef.Line.Start.Position; End = side.Sidedef.Line.End.Position; } else { Start = side.Sidedef.Line.End.Position; End = side.Sidedef.Line.Start.Position; } switch (side.GeometryType) { case VisualGeometryType.WALL_UPPER: OffsetX = UniFields.GetFloat(side.Sidedef.Fields, "offsetx_top"); OffsetY = UniFields.GetFloat(side.Sidedef.Fields, "offsety_top"); ScaleX = UniFields.GetFloat(side.Sidedef.Fields, "scalex_top", 1.0f); ScaleY = UniFields.GetFloat(side.Sidedef.Fields, "scaley_top", 1.0f); break; case VisualGeometryType.WALL_MIDDLE: OffsetX = UniFields.GetFloat(side.Sidedef.Fields, "offsetx_mid"); OffsetY = UniFields.GetFloat(side.Sidedef.Fields, "offsety_mid"); ScaleX = UniFields.GetFloat(side.Sidedef.Fields, "scalex_mid", 1.0f); ScaleY = UniFields.GetFloat(side.Sidedef.Fields, "scaley_mid", 1.0f); break; case VisualGeometryType.WALL_MIDDLE_3D: Sidedef cs = side.GetControlLinedef().Front; ControlSideOffsetX = cs.OffsetX + UniFields.GetFloat(cs.Fields, "offsetx_mid"); OffsetX = UniFields.GetFloat(side.Sidedef.Fields, "offsetx_mid"); ControlSideOffsetY = cs.OffsetY + UniFields.GetFloat(cs.Fields, "offsety_mid"); OffsetY = UniFields.GetFloat(side.Sidedef.Fields, "offsety_mid"); ScaleX = UniFields.GetFloat(cs.Fields, "scalex_mid", 1.0f); ScaleY = UniFields.GetFloat(cs.Fields, "scaley_mid", 1.0f); break; case VisualGeometryType.WALL_LOWER: OffsetX = UniFields.GetFloat(side.Sidedef.Fields, "offsetx_bottom"); OffsetY = UniFields.GetFloat(side.Sidedef.Fields, "offsety_bottom"); ScaleX = UniFields.GetFloat(side.Sidedef.Fields, "scalex_bottom", 1.0f); ScaleY = UniFields.GetFloat(side.Sidedef.Fields, "scaley_bottom", 1.0f); break; } NextSides = new Dictionary <SortedVisualSide, bool>(); PreviousSides = new Dictionary <SortedVisualSide, bool>(); }
internal static Rectangle GetSidedefPartSize(BaseVisualGeometrySidedef side) { // We are interested in width, height and vertical position only float miny = float.MaxValue; float maxy = float.MinValue; foreach (WorldVertex v in side.Vertices) { if (v.z < miny) { miny = v.z; } else if (v.z > maxy) { maxy = v.z; } } return(new Rectangle(0, (int)Math.Round(-maxy), Math.Max(1, (int)Math.Round(side.Sidedef.Line.Length)), (int)Math.Round(maxy - miny))); }