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); } }
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); }
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); }
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); } }
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); }
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); }
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); } }
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); } }
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); }
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); } } }
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); } }
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); } }
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); }
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); }
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); }
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); }
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); } }