예제 #1
0
        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>();
        }
예제 #2
0
        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)));
        }