Beispiel #1
0
        private void DrawOn2DControl(int numQSteps)
        {
            if (!_lockPositions)
            {
                _marioState = MarioState.CreateMarioState();
            }
            MarioState marioStateCenter   = AirMovementCalculator.ApplyInputRepeatedly(_marioState, RelativeDirection.Center, numQSteps);
            MarioState marioStateForward  = AirMovementCalculator.ApplyInputRepeatedly(_marioState, RelativeDirection.Forward, numQSteps);
            MarioState marioStateBackward = AirMovementCalculator.ApplyInputRepeatedly(_marioState, RelativeDirection.Backward, numQSteps);
            MarioState marioStateLeft     = AirMovementCalculator.ApplyInputRepeatedly(_marioState, RelativeDirection.Left, numQSteps);

            ushort marioAngle = _marioState.MarioAngle;

            (float cx, float cz) = (marioStateCenter.X, marioStateCenter.Z);
            (float fx, float fz) = (marioStateForward.X, marioStateForward.Z);
            (float bx, float bz) = (marioStateBackward.X, marioStateBackward.Z);
            (float lx, float lz) = (marioStateLeft.X, marioStateLeft.Z);

            double sideDist     = MoreMath.GetDistanceBetween(cx, cz, lx, lz);
            double forwardDist  = MoreMath.GetDistanceBetween(cx, cz, fx, fz);
            double backwardDist = MoreMath.GetDistanceBetween(cx, cz, bx, bz);

            (float controlCenterX, float controlCenterZ) = MapUtilities.ConvertCoordsForControlTopDownView(cx, cz, UseRelativeCoordinates);
            List <(float pointX, float pointZ)> controlPoints = Enumerable.Range(0, MapConfig.MapCircleNumPoints2D).ToList()
                                                                .ConvertAll(index => (index / (float)MapConfig.MapCircleNumPoints2D) * 65536)
                                                                .ConvertAll(angle => GetEllipsePoint(cx, cz, sideDist, forwardDist, backwardDist, marioAngle, angle))
                                                                .ConvertAll(point => MapUtilities.ConvertCoordsForControlTopDownView((float)point.x, (float)point.z, UseRelativeCoordinates));

            GL.BindTexture(TextureTarget.Texture2D, -1);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();

            // Draw circle
            GL.Color4(Color.R, Color.G, Color.B, OpacityByte);
            GL.Begin(PrimitiveType.TriangleFan);
            GL.Vertex2(controlCenterX, controlCenterZ);
            foreach ((float x, float z) in controlPoints)
            {
                GL.Vertex2(x, z);
            }
            GL.Vertex2(controlPoints[0].pointX, controlPoints[0].pointZ);
            GL.End();

            // Draw outline
            if (LineWidth != 0)
            {
                GL.Color4(LineColor.R, LineColor.G, LineColor.B, (byte)255);
                GL.LineWidth(LineWidth);
                GL.Begin(PrimitiveType.LineLoop);
                foreach ((float x, float z) in controlPoints)
                {
                    GL.Vertex2(x, z);
                }
                GL.End();
            }

            GL.Color4(1, 1, 1, 1.0f);
        }
        public override void DrawOn2DControlTopDownView()
        {
            (double x, double y, double z, double angle) = GetPositionAngle().GetValues();
            (float xPosPixels, float zPosPixels)         = MapUtilities.ConvertCoordsForControlTopDownView((float)x, (float)z);
            float angleDegrees = Rotates ? MapUtilities.ConvertAngleForControl(angle) : 0;
            SizeF size         = MapUtilities.ScaleImageSizeForControl(Image.Size, Size);

            MapUtilities.DrawTexture(TextureId, new PointF(xPosPixels, zPosPixels), size, angleDegrees, Opacity);
        }
        public override void DrawOn2DControlTopDownView(MapObjectHoverData hoverData)
        {
            (double x, double y, double z, double angle) = GetPositionAngle().GetValues();
            (float xPosPixels, float zPosPixels)         = MapUtilities.ConvertCoordsForControlTopDownView((float)x, (float)z, UseRelativeCoordinates);
            float  angleDegrees = Rotates ? MapUtilities.ConvertAngleForControl(angle) : 0;
            SizeF  size         = MapUtilities.ScaleImageSizeForControl(Image.Size, GetSize(), Scales);
            double opacity      = Opacity;

            if (this == hoverData?.MapObject)
            {
                opacity = MapUtilities.GetHoverOpacity();
            }
            MapUtilities.DrawTexture(TextureId, new PointF(xPosPixels, zPosPixels), size, angleDegrees, opacity);
        }
        public override void DrawOn2DControlTopDownView()
        {
            List <(float x, float y, float z, float angle, int tex)> data = GetData();

            data.Reverse();
            foreach (var dataPoint in data)
            {
                (float x, float y, float z, float angle, int tex) = dataPoint;
                (float x, float z)positionOnControl = MapUtilities.ConvertCoordsForControlTopDownView(x, z);
                float  angleDegrees = Rotates ? MapUtilities.ConvertAngleForControl(angle) : 0;
                SizeF  size         = MapUtilities.ScaleImageSizeForControl(Config.ObjectAssociations.BlueMarioMapImage.Size, Size);
                PointF point        = new PointF(positionOnControl.x, positionOnControl.z);
                MapUtilities.DrawTexture(tex, point, size, angleDegrees, Opacity);
            }
        }
Beispiel #5
0
        public override void DrawOn2DControlTopDownView()
        {
            List <(float centerX, float centerZ, float radius, float angle, float angleRadius)> dimenstionList = GetDimensions();

            foreach ((float centerX, float centerZ, float radius, float angle, float angleRadius) in dimenstionList)
            {
                (float controlCenterX, float controlCenterZ) = MapUtilities.ConvertCoordsForControlTopDownView(centerX, centerZ);
                float controlAngle  = angle + 32768 - Config.MapGraphics.MapViewYawValue;
                float controlRadius = radius * Config.MapGraphics.MapViewScaleValue;
                List <(float pointX, float pointZ)> outerPoints = Enumerable.Range(0, NUM_POINTS_2D).ToList()
                                                                  .ConvertAll(index => (index - NUM_POINTS_2D / 2) / (float)(NUM_POINTS_2D / 2))
                                                                  .ConvertAll(proportion => controlAngle + proportion * angleRadius)
                                                                  .ConvertAll(ang => ((float, float))MoreMath.AddVectorToPoint(controlRadius, ang, controlCenterX, controlCenterZ));

                GL.BindTexture(TextureTarget.Texture2D, -1);
                GL.MatrixMode(MatrixMode.Modelview);
                GL.LoadIdentity();

                // Draw circle
                GL.Color4(Color.R, Color.G, Color.B, OpacityByte);
                GL.Begin(PrimitiveType.TriangleFan);
                GL.Vertex2(controlCenterX, controlCenterZ);
                foreach ((float x, float z) in outerPoints)
                {
                    GL.Vertex2(x, z);
                }
                GL.End();

                // Draw outline
                if (OutlineWidth != 0)
                {
                    GL.Color4(OutlineColor.R, OutlineColor.G, OutlineColor.B, (byte)255);
                    GL.LineWidth(OutlineWidth);
                    GL.Begin(PrimitiveType.LineLoop);
                    GL.Vertex2(controlCenterX, controlCenterZ);
                    foreach ((float x, float z) in outerPoints)
                    {
                        GL.Vertex2(x, z);
                    }
                    GL.Vertex2(controlCenterX, controlCenterZ);
                    GL.End();
                }
            }

            GL.Color4(1, 1, 1, 1.0f);
        }
Beispiel #6
0
        public override void DrawOn2DControlTopDownView(MapObjectHoverData hoverData)
        {
            List <List <(float x, float y, float z, Color color, bool isHovered)> > quadList           = GetQuadList(hoverData);
            List <List <(float x, float z, Color color, bool isHovered)> >          quadListForControl =
                quadList.ConvertAll(quad => quad.ConvertAll(
                                        vertex =>
            {
                (float x, float z) = MapUtilities.ConvertCoordsForControlTopDownView(vertex.x, vertex.z, UseRelativeCoordinates);
                return(x, z, vertex.color, vertex.isHovered);
            }));

            GL.BindTexture(TextureTarget.Texture2D, -1);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();

            // Draw quad
            GL.Begin(PrimitiveType.Quads);
            foreach (List <(float x, float z, Color color, bool isHovered)> quad in quadListForControl)
            {
                foreach ((float x, float z, Color color, bool isHovered) in quad)
                {
                    byte opacityByte = isHovered ? MapUtilities.GetHoverOpacityByte() : OpacityByte;
                    GL.Color4(color.R, color.G, color.B, opacityByte);
                    GL.Vertex2(x, z);
                }
            }
            GL.End();

            // Draw outline
            if (LineWidth != 0)
            {
                GL.Color4(LineColor.R, LineColor.G, LineColor.B, (byte)255);
                GL.LineWidth(LineWidth);
                foreach (List <(float x, float z, Color color, bool isHovered)> quad in quadListForControl)
                {
                    GL.Begin(PrimitiveType.LineLoop);
                    foreach ((float x, float z, Color color, bool isHovered) in quad)
                    {
                        GL.Vertex2(x, z);
                    }
                    GL.End();
                }
            }

            GL.Color4(1, 1, 1, 1.0f);
        }
Beispiel #7
0
        public override MapObjectHoverData GetHoverDataTopDownView(bool isForObjectDrag, bool forceCursorPosition)
        {
            Point?relPosMaybe = MapObjectHoverData.GetPositionMaybe(isForObjectDrag, forceCursorPosition);

            if (!relPosMaybe.HasValue)
            {
                return(null);
            }
            Point relPos = relPosMaybe.Value;

            (float inGameX, float inGameZ) = MapUtilities.ConvertCoordsForInGameTopDownView(relPos.X, relPos.Y);

            List <(float centerX, float centerY, float centerZ, float radius, Color color)> dimensionList = Get2DDimensions();

            for (int i = dimensionList.Count - 1; i >= 0; i--)
            {
                var   dimension = dimensionList[i];
                float y         = dimension.centerY;

                if (_customImage != null)
                {
                    List <(float x, float z)> positions        = MapUtilities.GetFloatPositions(10_000);
                    List <(float x, float z)> controlPositions = positions.ConvertAll(
                        p => MapUtilities.ConvertCoordsForControlTopDownView(p.x, p.z, UseRelativeCoordinates));
                    for (int j = controlPositions.Count - 1; j >= 0; j--)
                    {
                        var    position        = positions[j];
                        var    controlPosition = controlPositions[j];
                        double controlDist     = MoreMath.GetDistanceBetween(controlPosition.x, controlPosition.z, relPos.X, relPos.Y);
                        double radius          = Scales ? _imageSize * Config.CurrentMapGraphics.MapViewScaleValue : _imageSize;
                        if (controlDist <= radius || forceCursorPosition)
                        {
                            return(new MapObjectHoverData(this, position.x, y, position.z, index: i, index2: j));
                        }
                    }
                }

                double dist = MoreMath.GetDistanceBetween(dimension.centerX, dimension.centerZ, inGameX, inGameZ);
                if (dist <= dimension.radius)
                {
                    return(new MapObjectHoverData(this, dimension.centerX, y, dimension.centerZ, index: i));
                }
            }
            return(null);
        }
        public override void DrawOn2DControlTopDownView(MapObjectHoverData hoverData)
        {
            base.DrawOn2DControlTopDownView(hoverData);

            if (_customImage != null)
            {
                (float x, float y, float z)      = ((float, float, float))PositionAngle.GetMidPoint(_posAngle1, _posAngle2);
                (float controlX, float controlZ) = MapUtilities.ConvertCoordsForControlTopDownView(x, z, UseRelativeCoordinates);
                PointF point   = new PointF(controlX, controlZ);
                SizeF  size    = MapUtilities.ScaleImageSizeForControl(_customImage.Size, _iconSize, Scales);
                double opacity = Opacity;
                if (this == hoverData?.MapObject)
                {
                    opacity = MapUtilities.GetHoverOpacity();
                }
                MapUtilities.DrawTexture(_customImageTex.Value, point, size, 0, opacity);
            }
        }
Beispiel #9
0
        public override void DrawOn2DControlTopDownView()
        {
            List <(float centerX, float centerZ, float radius)> dimensionList = Get2DDimensions();

            foreach ((float centerX, float centerZ, float radius) in dimensionList)
            {
                (float controlCenterX, float controlCenterZ) = MapUtilities.ConvertCoordsForControlTopDownView(centerX, centerZ);
                float controlRadius = radius * Config.MapGraphics.MapViewScaleValue;
                List <(float pointX, float pointZ)> controlPoints = Enumerable.Range(0, SpecialConfig.MapCircleNumPoints2D).ToList()
                                                                    .ConvertAll(index => (index / (float)SpecialConfig.MapCircleNumPoints2D) * 65536)
                                                                    .ConvertAll(angle => ((float, float))MoreMath.AddVectorToPoint(controlRadius, angle, controlCenterX, controlCenterZ));

                GL.BindTexture(TextureTarget.Texture2D, -1);
                GL.MatrixMode(MatrixMode.Modelview);
                GL.LoadIdentity();

                // Draw circle
                GL.Color4(Color.R, Color.G, Color.B, OpacityByte);
                GL.Begin(PrimitiveType.TriangleFan);
                GL.Vertex2(controlCenterX, controlCenterZ);
                foreach ((float x, float z) in controlPoints)
                {
                    GL.Vertex2(x, z);
                }
                GL.Vertex2(controlPoints[0].pointX, controlPoints[0].pointZ);
                GL.End();

                // Draw outline
                if (OutlineWidth != 0)
                {
                    GL.Color4(OutlineColor.R, OutlineColor.G, OutlineColor.B, (byte)255);
                    GL.LineWidth(OutlineWidth);
                    GL.Begin(PrimitiveType.LineLoop);
                    foreach ((float x, float z) in controlPoints)
                    {
                        GL.Vertex2(x, z);
                    }
                    GL.End();
                }
            }

            GL.Color4(1, 1, 1, 1.0f);
        }
Beispiel #10
0
        public override MapObjectHoverData GetHoverDataTopDownView(bool isForObjectDrag, bool forceCursorPosition)
        {
            Point?relPosMaybe = MapObjectHoverData.GetPositionMaybe(isForObjectDrag, forceCursorPosition);

            if (!relPosMaybe.HasValue)
            {
                return(null);
            }
            Point relPos = relPosMaybe.Value;

            (float inGameX, float inGameY, float inGameZ) = GetArrowHeadPosition();
            (double controlX, double controlZ)            = MapUtilities.ConvertCoordsForControlTopDownView(inGameX, inGameZ, UseRelativeCoordinates);
            double dist = MoreMath.GetDistanceBetween(controlX, controlZ, relPos.X, relPos.Y);

            if (dist <= 20 || forceCursorPosition)
            {
                return(new MapObjectHoverData(this, inGameX, inGameY, inGameZ));
            }
            return(null);
        }
Beispiel #11
0
        public override void DrawOn2DControlTopDownView(MapObjectHoverData hoverData)
        {
            List <(float x, float y, float z, float angle, bool rotates, Image image, int tex, uint objAddress)> data = GetData();

            data.Reverse();
            foreach (var dataPoint in data)
            {
                (float x, float y, float z, float angle, bool rotates, Image image, int tex, uint objAddress) = dataPoint;
                (float x, float z)positionOnControl = MapUtilities.ConvertCoordsForControlTopDownView(x, z, UseRelativeCoordinates);
                float  angleDegrees = (CustomRotates ?? rotates) ? MapUtilities.ConvertAngleForControl(angle) : 0;
                SizeF  size         = MapUtilities.ScaleImageSizeForControl(image.Size, Size, Scales);
                PointF point        = new PointF(positionOnControl.x, positionOnControl.z);
                double opacity      = Opacity;
                if (this == hoverData?.MapObject && dataPoint.objAddress == hoverData?.ObjAddress)
                {
                    opacity = MapUtilities.GetHoverOpacity();
                }
                MapUtilities.DrawTexture(tex, point, size, angleDegrees, opacity);
            }
        }
Beispiel #12
0
        public override void DrawOn2DControlTopDownView(MapObjectHoverData hoverData)
        {
            List <(float x, float y, float z, float angle, int tex)> data = GetData();

            for (int i = data.Count - 1; i >= 0; i--)
            {
                var dataPoint = data[i];
                (float x, float y, float z, float angle, int tex) = dataPoint;
                (float x, float z)positionOnControl = MapUtilities.ConvertCoordsForControlTopDownView(x, z, UseRelativeCoordinates);
                float  angleDegrees = Rotates ? MapUtilities.ConvertAngleForControl(angle) : 0;
                SizeF  size         = MapUtilities.ScaleImageSizeForControl(Config.ObjectAssociations.BlueMarioMapImage.Size, Size, Scales);
                PointF point        = new PointF(positionOnControl.x, positionOnControl.z);
                double opacity      = Opacity;
                if (this == hoverData?.MapObject && i == hoverData?.Index)
                {
                    opacity = MapUtilities.GetHoverOpacity();
                }
                MapUtilities.DrawTexture(tex, point, size, angleDegrees, opacity);
            }
        }
Beispiel #13
0
        protected override List <(PointF loc, SizeF size)> GetDimensions()
        {
            RectangleF rectangle        = GetMapLayout().Coordinates;
            float      rectangleCenterX = rectangle.X + rectangle.Width / 2;
            float      rectangleCenterZ = rectangle.Y + rectangle.Height / 2;
            List <(float x, float z)> rectangleCenters = Config.MapGraphics.MapViewEnablePuView ?
                                                         MapUtilities.GetPuCoordinates(rectangleCenterX, rectangleCenterZ) :
                                                         new List <(float x, float z)>()
            {
                (rectangleCenterX, rectangleCenterZ)
            };
            List <(float x, float z)> controlCenters = rectangleCenters.ConvertAll(
                rectangleCenter => MapUtilities.ConvertCoordsForControlTopDownView(rectangleCenter.x, rectangleCenter.z));
            float sizeX = rectangle.Width * Config.MapGraphics.MapViewScaleValue;
            float sizeZ = rectangle.Height * Config.MapGraphics.MapViewScaleValue;
            List <(PointF loc, SizeF size)> dimensions = controlCenters.ConvertAll(
                controlCenter => (new PointF(controlCenter.x, controlCenter.z), new SizeF(sizeX, sizeZ)));

            return(dimensions);
        }
        private void DrawOn2DControlTopDownViewWithoutUnits(float?minHeight, float?maxHeight, Color color)
        {
            List <List <(float x, float y, float z)> > vertexLists           = GetVertexListsWithSplicing(minHeight, maxHeight);
            List <List <(float x, float y, float z)> > vertexListsForControl =
                vertexLists.ConvertAll(vertexList => vertexList.ConvertAll(
                                           vertex => MapUtilities.ConvertCoordsForControlTopDownView(vertex.x, vertex.y, vertex.z)));

            GL.BindTexture(TextureTarget.Texture2D, -1);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();

            // Draw triangle
            GL.Color4(color.R, color.G, color.B, OpacityByte);
            foreach (List <(float x, float y, float z)> vertexList in vertexListsForControl)
            {
                GL.Begin(PrimitiveType.Polygon);
                foreach ((float x, float y, float z) in vertexList)
                {
                    GL.Vertex2(x, z);
                }
                GL.End();
            }

            // Draw outline
            if (OutlineWidth != 0)
            {
                GL.Color4(OutlineColor.R, OutlineColor.G, OutlineColor.B, (byte)255);
                GL.LineWidth(OutlineWidth);
                foreach (List <(float x, float y, float z)> vertexList in vertexListsForControl)
                {
                    GL.Begin(PrimitiveType.LineLoop);
                    foreach ((float x, float y, float z) in vertexList)
                    {
                        GL.Vertex2(x, z);
                    }
                    GL.End();
                }
            }

            GL.Color4(1, 1, 1, 1.0f);
        }
Beispiel #15
0
        public override void DrawOn2DControlTopDownView()
        {
            List <List <(float x, float y, float z)> > quadList           = GetQuadList();
            List <List <(float x, float z)> >          quadListForControl =
                quadList.ConvertAll(quad => quad.ConvertAll(
                                        vertex => MapUtilities.ConvertCoordsForControlTopDownView(vertex.x, vertex.z)));

            GL.BindTexture(TextureTarget.Texture2D, -1);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();

            // Draw quad
            GL.Color4(Color.R, Color.G, Color.B, OpacityByte);
            GL.Begin(PrimitiveType.Quads);
            foreach (List <(float x, float z)> quad in quadListForControl)
            {
                foreach ((float x, float z) in quad)
                {
                    GL.Vertex2(x, z);
                }
            }
            GL.End();

            // Draw outline
            if (OutlineWidth != 0)
            {
                GL.Color4(OutlineColor.R, OutlineColor.G, OutlineColor.B, (byte)255);
                GL.LineWidth(OutlineWidth);
                foreach (List <(float x, float z)> quad in quadListForControl)
                {
                    GL.Begin(PrimitiveType.LineLoop);
                    foreach ((float x, float z) in quad)
                    {
                        GL.Vertex2(x, z);
                    }
                    GL.End();
                }
            }

            GL.Color4(1, 1, 1, 1.0f);
        }
        public override void DrawOn2DControlTopDownView(MapObjectHoverData hoverData)
        {
            base.DrawOn2DControlTopDownView(hoverData);

            if (_customImage != null)
            {
                List <(float x, float y, float z)> positions = GetGridlineIntersectionPositionsTopDownView();
                for (int i = 0; i < positions.Count; i++)
                {
                    (float x, float y, float z)      = positions[i];
                    (float controlX, float controlZ) = MapUtilities.ConvertCoordsForControlTopDownView(x, z, UseRelativeCoordinates);
                    SizeF  size    = MapUtilities.ScaleImageSizeForControl(_customImage.Size, _imageSize, Scales);
                    double opacity = Opacity;
                    if (this == hoverData?.MapObject && i == hoverData?.Index)
                    {
                        opacity = MapUtilities.GetHoverOpacity();
                    }
                    MapUtilities.DrawTexture(_customImageTex.Value, new PointF(controlX, controlZ), size, 0, opacity);
                }
            }
        }
Beispiel #17
0
        public override void DrawOn2DControlTopDownView(MapObjectHoverData hoverData)
        {
            List <(float x, float y, float z)> data = GetData();

            for (int i = 0; i < data.Count; i++)
            {
                var dataPoint = data[i];
                (float x, float y, float z)         = dataPoint;
                (float x, float z)positionOnControl = MapUtilities.ConvertCoordsForControlTopDownView(x, z, UseRelativeCoordinates);
                SizeF  size    = MapUtilities.ScaleImageSizeForControl(Config.ObjectAssociations.BlueMarioMapImage.Size, Size, Scales);
                PointF point   = new PointF(positionOnControl.x, positionOnControl.z);
                double opacity = Opacity;
                if (this == hoverData?.MapObject && i == hoverData?.Index)
                {
                    opacity = MapUtilities.GetHoverOpacity();
                }
                MapUtilities.DrawTexture(_customImageTex ?? _tex, point, size, 0, opacity);
            }

            if (LineWidth != 0)
            {
                GL.BindTexture(TextureTarget.Texture2D, -1);
                GL.MatrixMode(MatrixMode.Modelview);
                GL.LoadIdentity();
                GL.Color4(LineColor.R, LineColor.G, LineColor.B, OpacityByte);
                GL.LineWidth(LineWidth);
                GL.Begin(PrimitiveType.Lines);
                for (int i = 0; i < data.Count - 1; i++)
                {
                    (float x1, float y1, float z1)      = data[i];
                    (float x2, float y2, float z2)      = data[i + 1];
                    (float x, float z)vertex1ForControl = MapUtilities.ConvertCoordsForControlTopDownView(x1, z1, UseRelativeCoordinates);
                    (float x, float z)vertex2ForControl = MapUtilities.ConvertCoordsForControlTopDownView(x2, z2, UseRelativeCoordinates);
                    GL.Vertex2(vertex1ForControl.x, vertex1ForControl.z);
                    GL.Vertex2(vertex2ForControl.x, vertex2ForControl.z);
                }
                GL.End();
                GL.Color4(1, 1, 1, 1.0f);
            }
        }
Beispiel #18
0
        public override void DrawOn2DControlTopDownView()
        {
            List <(float x, float y, float z, float angle, int tex, bool show)> data = GetData();

            foreach (var dataPoint in data)
            {
                (float x, float y, float z, float angle, int tex, bool show) = dataPoint;
                if (!show)
                {
                    continue;
                }
                (float x, float z)positionOnControl = MapUtilities.ConvertCoordsForControlTopDownView(x, z);
                float  angleDegrees = Rotates ? MapUtilities.ConvertAngleForControl(angle) : 0;
                SizeF  size         = MapUtilities.ScaleImageSizeForControl(Config.ObjectAssociations.BlueMarioMapImage.Size, Size);
                PointF point        = new PointF(positionOnControl.x, positionOnControl.z);
                MapUtilities.DrawTexture(tex, point, size, angleDegrees, Opacity);
            }

            if (OutlineWidth != 0)
            {
                GL.BindTexture(TextureTarget.Texture2D, -1);
                GL.MatrixMode(MatrixMode.Modelview);
                GL.LoadIdentity();
                GL.Color4(OutlineColor.R, OutlineColor.G, OutlineColor.B, OpacityByte);
                GL.LineWidth(OutlineWidth);
                GL.Begin(PrimitiveType.Lines);
                for (int i = 0; i < data.Count - 1; i++)
                {
                    (float x1, float y1, float z1, float angle1, int tex1, bool show1) = data[i];
                    (float x2, float y2, float z2, float angle2, int tex2, bool show2) = data[i + 1];
                    (float x, float z)vertex1ForControl = MapUtilities.ConvertCoordsForControlTopDownView(x1, z1);
                    (float x, float z)vertex2ForControl = MapUtilities.ConvertCoordsForControlTopDownView(x2, z2);
                    GL.Vertex2(vertex1ForControl.x, vertex1ForControl.z);
                    GL.Vertex2(vertex2ForControl.x, vertex2ForControl.z);
                }
                GL.End();
                GL.Color4(1, 1, 1, 1.0f);
            }
        }
Beispiel #19
0
        protected override List <(PointF loc, SizeF size)> GetDimensions()
        {
            MapLayout  mapLayout        = GetMapLayout();
            RectangleF rectangle        = mapLayout.Coordinates;
            float      rectangleCenterX = rectangle.X + rectangle.Width / 2;
            float      rectangleCenterZ = rectangle.Y + rectangle.Height / 2;
            int        size             = Math.Max(1, (int)Size);
            List <(float x, float z)> rectangleCenters =
                Config.MapGui.checkBoxMapOptionsEnablePuView.Checked && mapLayout.Id != "000" ?
                MapUtilities.GetPuCoordinates(rectangleCenterX, rectangleCenterZ, size) :
                new List <(float x, float z)>()
            {
                (rectangleCenterX, rectangleCenterZ)
            };
            List <(float x, float z)> controlCenters = rectangleCenters.ConvertAll(
                rectangleCenter => MapUtilities.ConvertCoordsForControlTopDownView(rectangleCenter.x, rectangleCenter.z, UseRelativeCoordinates));
            float sizeX = rectangle.Width * Config.CurrentMapGraphics.MapViewScaleValue;
            float sizeZ = rectangle.Height * Config.CurrentMapGraphics.MapViewScaleValue;
            List <(PointF loc, SizeF size)> dimensions = controlCenters.ConvertAll(
                controlCenter => (new PointF(controlCenter.x, controlCenter.z), new SizeF(sizeX, sizeZ)));

            return(dimensions);
        }
Beispiel #20
0
        public override void DrawOn2DControlTopDownView()
        {
            if (OutlineWidth == 0)
            {
                return;
            }

            List <(float x, float y, float z)> vertices            = GetVerticesTopDownView();
            List <(float x, float z)>          veriticesForControl =
                vertices.ConvertAll(vertex => MapUtilities.ConvertCoordsForControlTopDownView(vertex.x, vertex.z));

            GL.BindTexture(TextureTarget.Texture2D, -1);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();
            GL.Color4(OutlineColor.R, OutlineColor.G, OutlineColor.B, OpacityByte);
            GL.LineWidth(OutlineWidth);
            GL.Begin(PrimitiveType.Lines);
            foreach ((float x, float z) in veriticesForControl)
            {
                GL.Vertex2(x, z);
            }
            GL.End();
            GL.Color4(1, 1, 1, 1.0f);
        }
        private void DrawOn2DControlTopDownViewWithUnits(float?minHeight, float?maxHeight, Color color)
        {
            List <TriangleDataModel> triangles  = GetFilteredTriangles();
            List <(int x, int z)>    unitPoints = triangles.ConvertAll(triangle =>
            {
                int xMin = (int)Math.Max(triangle.GetMinX(), Config.MapGraphics.MapViewXMin - 1);
                int xMax = (int)Math.Min(triangle.GetMaxX(), Config.MapGraphics.MapViewXMax + 1);
                int zMin = (int)Math.Max(triangle.GetMinZ(), Config.MapGraphics.MapViewZMin - 1);
                int zMax = (int)Math.Min(triangle.GetMaxZ(), Config.MapGraphics.MapViewZMax + 1);

                List <(int x, int z)> points = new List <(int x, int z)>();
                for (int x = xMin; x <= xMax; x++)
                {
                    for (int z = zMin; z <= zMax; z++)
                    {
                        float?y = triangle.GetTruncatedHeightOnTriangleIfInsideTriangle(x, z);
                        if (y.HasValue &&
                            (!minHeight.HasValue || y.Value >= minHeight.Value) &&
                            (!maxHeight.HasValue || y.Value <= maxHeight.Value))
                        {
                            points.Add((x, z));
                        }
                    }
                }
                return(points);
            }).SelectMany(points => points).Distinct().ToList();

            List <List <(float x, float y, float z)> > quadList           = MapUtilities.ConvertUnitPointsToQuads(unitPoints);
            List <List <(float x, float z)> >          quadListForControl =
                quadList.ConvertAll(quad => quad.ConvertAll(
                                        vertex => MapUtilities.ConvertCoordsForControlTopDownView(vertex.x, vertex.z)));

            GL.BindTexture(TextureTarget.Texture2D, -1);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();

            // Draw quad
            GL.Color4(color.R, color.G, color.B, OpacityByte);
            GL.Begin(PrimitiveType.Quads);
            foreach (List <(float x, float z)> quad in quadListForControl)
            {
                foreach ((float x, float z) in quad)
                {
                    GL.Vertex2(x, z);
                }
            }
            GL.End();

            // Draw outline
            if (OutlineWidth != 0)
            {
                GL.Color4(OutlineColor.R, OutlineColor.G, OutlineColor.B, (byte)255);
                GL.LineWidth(OutlineWidth);
                foreach (List <(float x, float z)> quad in quadListForControl)
                {
                    GL.Begin(PrimitiveType.LineLoop);
                    foreach ((float x, float z) in quad)
                    {
                        GL.Vertex2(x, z);
                    }
                    GL.End();
                }
            }

            GL.Color4(1, 1, 1, 1.0f);
        }
Beispiel #22
0
        public override void DrawOn2DControlTopDownView(MapObjectHoverData hoverData)
        {
            List <(float centerX, float centerY, float centerZ, float radius, Color color)> dimensionList = Get2DDimensions();

            for (int i = 0; i < dimensionList.Count; i++)
            {
                (float centerX, float centerY, float centerZ, float radius, Color color) = dimensionList[i];
                (float controlCenterX, float controlCenterZ) = MapUtilities.ConvertCoordsForControlTopDownView(centerX, centerZ, UseRelativeCoordinates);
                float controlRadius = radius * Config.CurrentMapGraphics.MapViewScaleValue;
                List <(float pointX, float pointZ)> controlPoints = Enumerable.Range(0, MapConfig.MapCircleNumPoints2D).ToList()
                                                                    .ConvertAll(index => (index / (float)MapConfig.MapCircleNumPoints2D) * 65536)
                                                                    .ConvertAll(angle => ((float, float))MoreMath.AddVectorToPoint(controlRadius, angle, controlCenterX, controlCenterZ));

                GL.BindTexture(TextureTarget.Texture2D, -1);
                GL.MatrixMode(MatrixMode.Modelview);
                GL.LoadIdentity();

                // Draw circle
                byte opacityByte = OpacityByte;
                if (this == hoverData?.MapObject && i == hoverData?.Index && hoverData.Index2 == null)
                {
                    opacityByte = MapUtilities.GetHoverOpacityByte();
                }
                GL.Color4(color.R, color.G, color.B, opacityByte);
                GL.Begin(PrimitiveType.TriangleFan);
                GL.Vertex2(controlCenterX, controlCenterZ);
                foreach ((float x, float z) in controlPoints)
                {
                    GL.Vertex2(x, z);
                }
                GL.Vertex2(controlPoints[0].pointX, controlPoints[0].pointZ);
                GL.End();

                // Draw outline
                if (LineWidth != 0)
                {
                    GL.Color4(LineColor.R, LineColor.G, LineColor.B, (byte)255);
                    GL.LineWidth(LineWidth);
                    GL.Begin(PrimitiveType.LineLoop);
                    foreach ((float x, float z) in controlPoints)
                    {
                        GL.Vertex2(x, z);
                    }
                    GL.End();
                }

                if (_customImage != null)
                {
                    List <(float x, float z)> positions = MapUtilities.GetFloatPositions(10_000);
                    for (int j = 0; j < positions.Count; j++)
                    {
                        (float x, float z) = positions[j];
                        float dist = (float)MoreMath.GetDistanceBetween(centerX, centerZ, x, z);
                        if (dist >= radius)
                        {
                            continue;
                        }
                        (float controlX, float controlZ) = MapUtilities.ConvertCoordsForControlTopDownView(x, z, UseRelativeCoordinates);
                        SizeF  size    = MapUtilities.ScaleImageSizeForControl(_customImage.Size, _imageSize, Scales);
                        double opacity = 1;
                        if (this == hoverData?.MapObject && i == hoverData?.Index && j == hoverData?.Index2)
                        {
                            opacity = MapUtilities.GetHoverOpacity();
                        }
                        MapUtilities.DrawTexture(_customImageTex.Value, new PointF(controlX, controlZ), size, 0, opacity);
                    }
                }
            }

            GL.Color4(1, 1, 1, 1.0f);
        }
Beispiel #23
0
        public override MapObjectHoverData GetHoverDataTopDownView(bool isForObjectDrag, bool forceCursorPosition)
        {
            Point?relPosMaybe = MapObjectHoverData.GetPositionMaybe(isForObjectDrag, forceCursorPosition);

            if (!relPosMaybe.HasValue)
            {
                return(null);
            }
            Point relPos = relPosMaybe.Value;

            float marioHeight = Config.Stream.GetFloat(MarioConfig.StructAddress + MarioConfig.YOffset);
            float?height      = _relativeHeight.HasValue ? marioHeight - _relativeHeight.Value : _absoluteHeight;

            List <TriangleMapData> wallDataList = GetFilteredTriangles()
                                                  .ConvertAll(tri => MapUtilities.Get2DWallDataFromTri(tri, height))
                                                  .FindAll(wallDataNullable => wallDataNullable != null);

            for (int i = wallDataList.Count - 1; i >= 0; i--)
            {
                TriangleMapData wallData = wallDataList[i];

                float angle          = (float)MoreMath.AngleTo_Radians(wallData.X1, wallData.Z1, wallData.X2, wallData.Z2);
                float projectionDist = Size / (float)Math.Abs(wallData.Tri.XProjection ? Math.Cos(angle) : Math.Sin(angle));
                List <List <(float x, float z)> > quads = new List <List <(float x, float z)> >();
                void addQuad(float xAdd, float zAdd)
                {
                    quads.Add(new List <(float x, float z)>()
                    {
                        (wallData.X1, wallData.Z1),
                        (wallData.X1 + xAdd, wallData.Z1 + zAdd),
                        (wallData.X2 + xAdd, wallData.Z2 + zAdd),
                        (wallData.X2, wallData.Z2),
                    });
                };
                if (wallData.Tri.XProjection)
                {
                    addQuad(projectionDist, 0);
                    addQuad(-1 * projectionDist, 0);
                }
                else
                {
                    addQuad(0, projectionDist);
                    addQuad(0, -1 * projectionDist);
                }

                List <List <(float x, float z)> > quadsForControl =
                    quads.ConvertAll(quad => quad.ConvertAll(
                                         vertex => MapUtilities.ConvertCoordsForControlTopDownView(vertex.x, vertex.z, UseRelativeCoordinates)));

                for (int j = 0; j < quadsForControl.Count; j++)
                {
                    List <(float x, float z)> quadForControl = quadsForControl[j];
                    if (_customImage != null)
                    {
                        for (int k = 0; k < quadForControl.Count; k++)
                        {
                            var    vertex = quadForControl[k];
                            double dist   = MoreMath.GetDistanceBetween(vertex.x, vertex.z, relPos.X, relPos.Y);
                            double radius = Scales ? _iconSize * Config.CurrentMapGraphics.MapViewScaleValue : _iconSize;
                            if (dist <= radius || forceCursorPosition)
                            {
                                (float x, float z) = MapUtilities.ConvertCoordsForInGameTopDownView(vertex.x, vertex.z);
                                return(new MapObjectHoverData(this, x, 0, z, tri: wallData.Tri, index: j, index2: k));
                            }
                        }
                    }
                    if (MapUtilities.IsWithinShapeForControl(quadForControl, relPos.X, relPos.Y) || forceCursorPosition)
                    {
                        return(new MapObjectHoverData(
                                   this, wallData.Tri.GetMidpointX(), wallData.Tri.GetMidpointY(), wallData.Tri.GetMidpointZ(), tri: wallData.Tri));
                    }
                }
            }

            return(null);
        }
Beispiel #24
0
        public override void DrawOn2DControlTopDownView(MapObjectHoverData hoverData)
        {
            float marioHeight = Config.Stream.GetFloat(MarioConfig.StructAddress + MarioConfig.YOffset);
            float?height      = _relativeHeight.HasValue ? marioHeight - _relativeHeight.Value : _absoluteHeight;

            List <TriangleMapData> wallDataList = GetFilteredTriangles()
                                                  .ConvertAll(tri => MapUtilities.Get2DWallDataFromTri(tri, height))
                                                  .FindAll(wallDataNullable => wallDataNullable != null);

            foreach (TriangleMapData wallData in wallDataList)
            {
                float angle          = (float)MoreMath.AngleTo_Radians(wallData.X1, wallData.Z1, wallData.X2, wallData.Z2);
                float projectionDist = Size / (float)Math.Abs(wallData.Tri.XProjection ? Math.Cos(angle) : Math.Sin(angle));
                List <List <(float x, float z)> > quads = new List <List <(float x, float z)> >();
                void addQuad(float xAdd, float zAdd)
                {
                    quads.Add(new List <(float x, float z)>()
                    {
                        (wallData.X1, wallData.Z1),
                        (wallData.X1 + xAdd, wallData.Z1 + zAdd),
                        (wallData.X2 + xAdd, wallData.Z2 + zAdd),
                        (wallData.X2, wallData.Z2),
                    });
                };
                if (wallData.Tri.XProjection)
                {
                    addQuad(projectionDist, 0);
                    addQuad(-1 * projectionDist, 0);
                }
                else
                {
                    addQuad(0, projectionDist);
                    addQuad(0, -1 * projectionDist);
                }

                List <List <(float x, float z)> > quadsForControl =
                    quads.ConvertAll(quad => quad.ConvertAll(
                                         vertex => MapUtilities.ConvertCoordsForControlTopDownView(vertex.x, vertex.z, UseRelativeCoordinates)));

                GL.BindTexture(TextureTarget.Texture2D, -1);
                GL.MatrixMode(MatrixMode.Modelview);
                GL.LoadIdentity();

                // Draw quad
                byte opacityByte = OpacityByte;
                if (this == hoverData?.MapObject && hoverData?.Tri == wallData.Tri && !hoverData.Index.HasValue)
                {
                    opacityByte = MapUtilities.GetHoverOpacityByte();
                }
                GL.Color4(Color.R, Color.G, Color.B, opacityByte);
                GL.Begin(PrimitiveType.Quads);
                foreach (List <(float x, float z)> quad in quadsForControl)
                {
                    foreach ((float x, float z) in quad)
                    {
                        GL.Vertex2(x, z);
                    }
                }
                GL.End();

                if (_showArrows)
                {
                    double totalDistance = MoreMath.GetDistanceBetween(
                        wallData.X1, wallData.Z1, wallData.X2, wallData.Z2);
                    List <double> markDistances = new List <double>();
                    if (totalDistance < 100)
                    {
                        markDistances.Add(totalDistance / 2);
                    }
                    else
                    {
                        int    cardinalAngle        = wallData.Tri.XProjection ? 16384 : 0;
                        double angleDiffCoefficient = 1 / Math.Abs(Math.Cos(MoreMath.AngleUnitsToRadians(wallData.Tri.GetPushAngle() - cardinalAngle)));
                        double firstDistance        = 25 * angleDiffCoefficient;
                        double lastDistance         = totalDistance - 25 * angleDiffCoefficient;
                        double distanceDiff         = lastDistance - firstDistance;
                        int    numMarks             = (int)Math.Truncate(distanceDiff / 50 + 0.25) + 1;
                        int    numBetweens          = numMarks - 1;
                        double betweenDistance      = distanceDiff / numBetweens;
                        for (int i = 0; i < numMarks; i++)
                        {
                            markDistances.Add(firstDistance + i * betweenDistance);
                        }
                    }

                    List <(float x, float z)> markPoints = new List <(float x, float z)>();
                    foreach (double dist in markDistances)
                    {
                        double portion = dist / totalDistance;
                        (double x, double z)pointOnMidpoint =
                            (wallData.X1 + portion * (wallData.X2 - wallData.X1), wallData.Z1 + portion * (wallData.Z2 - wallData.Z1));
                        (double x, double z)pointOnSide1 = wallData.Tri.XProjection ?
                                                           (pointOnMidpoint.x - projectionDist / 2, pointOnMidpoint.z) :
                                                           (pointOnMidpoint.x, pointOnMidpoint.z - projectionDist / 2);
                        (double x, double z)pointOnSide2 = wallData.Tri.XProjection ?
                                                           (pointOnMidpoint.x + projectionDist / 2, pointOnMidpoint.z) :
                                                           (pointOnMidpoint.x, pointOnMidpoint.z + projectionDist / 2);
                        markPoints.Add(((float x, float z))pointOnSide1);
                        markPoints.Add(((float x, float z))pointOnSide2);
                    }

                    markPoints = markPoints.FindAll(p => MapUtilities.IsInVisibleSpace(p.x, p.z, 200));

                    double pushAngle      = wallData.Tri.GetPushAngle();
                    double angleUp        = pushAngle;
                    double angleDown      = pushAngle + 32768;
                    double angleLeft      = pushAngle + 16384;
                    double angleRight     = pushAngle - 16384;
                    double angleUpLeft    = pushAngle + 8192;
                    double angleUpRight   = pushAngle - 8192;
                    double angleDownLeft  = pushAngle + 24576;
                    double angleDownRight = pushAngle - 24576;

                    double arrowBaseLength = 0.4 * Math.Min(Size, 50);
                    double arrowSideLength = 0.2 * Math.Min(Size, 50);

                    List <List <(float x, float z)> > arrowPoints = markPoints.ConvertAll(midPoint =>
                    {
                        (float x, float z)frontPoint = ((float, float))MoreMath.AddVectorToPoint(
                            arrowBaseLength, angleUp, midPoint.x, midPoint.z);
                        (float x, float z)leftOuterPoint = ((float, float))MoreMath.AddVectorToPoint(
                            arrowBaseLength / 2 + arrowSideLength, angleLeft, midPoint.x, midPoint.z);
                        (float x, float z)leftInnerPoint = ((float, float))MoreMath.AddVectorToPoint(
                            arrowBaseLength / 2, angleLeft, midPoint.x, midPoint.z);
                        (float x, float z)rightOuterPoint = ((float, float))MoreMath.AddVectorToPoint(
                            arrowBaseLength / 2 + arrowSideLength, angleRight, midPoint.x, midPoint.z);
                        (float x, float z)rightInnerPoint = ((float, float))MoreMath.AddVectorToPoint(
                            arrowBaseLength / 2, angleRight, midPoint.x, midPoint.z);
                        (float x, float z)backLeftPoint = ((float, float))MoreMath.AddVectorToPoint(
                            arrowBaseLength, angleDown, leftInnerPoint.x, leftInnerPoint.z);
                        (float x, float z)backRightPoint = ((float, float))MoreMath.AddVectorToPoint(
                            arrowBaseLength, angleDown, rightInnerPoint.x, rightInnerPoint.z);

                        return(new List <(float x, float z)>()
                        {
                            frontPoint,
                            leftOuterPoint,
                            leftInnerPoint,
                            backLeftPoint,
                            backRightPoint,
                            rightInnerPoint,
                            rightOuterPoint,
                        });
                    });

                    List <List <(float x, float z)> > arrowsForControl =
                        arrowPoints.ConvertAll(arrow => arrow.ConvertAll(
                                                   vertex => MapUtilities.ConvertCoordsForControlTopDownView(vertex.x, vertex.z, UseRelativeCoordinates)));

                    // Draw arrow
                    Color arrowColor = Color.Darken(0.5);
                    GL.Color4(arrowColor.R, arrowColor.G, arrowColor.B, opacityByte);
                    foreach (List <(float x, float z)> arrow in arrowsForControl)
                    {
                        GL.Begin(PrimitiveType.Polygon);
                        foreach ((float x, float z) in arrow)
                        {
                            GL.Vertex2(x, z);
                        }
                        GL.End();
                    }
                }

                // Draw outline
                if (LineWidth != 0)
                {
                    GL.Color4(LineColor.R, LineColor.G, LineColor.B, (byte)255);
                    GL.LineWidth(LineWidth);
                    foreach (List <(float x, float z)> quad in quadsForControl)
                    {
                        GL.Begin(PrimitiveType.LineLoop);
                        foreach ((float x, float z) in quad)
                        {
                            GL.Vertex2(x, z);
                        }
                        GL.End();
                    }
                }

                if (_customImage != null)
                {
                    for (int i = 0; i < quadsForControl.Count; i++)
                    {
                        var quad = quadsForControl[i];
                        for (int j = 0; j < quad.Count; j++)
                        {
                            var    vertex  = quad[j];
                            PointF point   = new PointF(vertex.x, vertex.z);
                            SizeF  size    = MapUtilities.ScaleImageSizeForControl(_customImage.Size, _iconSize, Scales);
                            double opacity = 1;
                            if (this == hoverData?.MapObject && hoverData?.Tri == wallData.Tri && i == hoverData?.Index && j == hoverData?.Index2)
                            {
                                opacity = MapUtilities.GetHoverOpacity();
                            }
                            MapUtilities.DrawTexture(_customImageTex.Value, point, size, 0, opacity);
                        }
                    }
                }

                GL.Color4(1, 1, 1, 1.0f);
            }
        }