AxesTransfer.cs 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Numerics;
  5. using System.Runtime.CompilerServices;
  6. using System.Text;
  7. using Veldrid.Common.VeldridRender;
  8. namespace Veldrid.Common.Tools
  9. {
  10. public static class AxesTransfer
  11. {
  12. public static PointF LocalPointToVirtualPoint<T>(this T render, Vector2 point) where T :IRender
  13. {
  14. return LocalPointToVirtualPoint(render.Margin, render.LineRange, render.WindowSize, point);
  15. }
  16. internal static PointF LocalPointToVirtualPoint(this BaseVeldridRender render, Vector2 point)
  17. {
  18. return LocalPointToVirtualPoint(render.Margin, render.Range, render.WindowSize, point);
  19. }
  20. private static PointF LocalPointToVirtualPoint(Veldrid.Common.Padding margin,LineRange range,Vector2 windowsize, Vector2 point)
  21. {
  22. float left = point.X - margin.Left;
  23. float top = point.Y - margin.Top;
  24. left = range.XLenght / (windowsize.X - margin.Left - margin.Right) * left + range.MinX;
  25. top = range.YLenght / (windowsize.Y - margin.Top - margin.Bottom) * top;
  26. top = range.MaxY - top;
  27. return new PointF(left, top);
  28. }
  29. public static Vector2 LocalSizeToVirtualSize<T>(this T render, Vector2 size) where T :IRender
  30. {
  31. SizeF sizeF = render.LocalSizeToVirtualSize(size.X, size.Y);
  32. return Unsafe.As<SizeF, Vector2>(ref sizeF);
  33. }
  34. public static Vector2 VirtualSizeToLocalSize<T>(this T render, float width, float height) where T :IRender
  35. {
  36. return VirtualSizeToLocalSize(render.Margin, render.LineRange, render.WindowSize, width, height);
  37. }
  38. internal static Vector2 LocalSizeToVirtualSize(this BaseVeldridRender render, Vector2 size)
  39. {
  40. SizeF sizeF = render.LocalSizeToVirtualSize(size.X, size.Y);
  41. return Unsafe.As<SizeF, Vector2>(ref sizeF);
  42. }
  43. internal static Vector2 VirtualSizeToLocalSize(this BaseVeldridRender render, float width, float height)
  44. {
  45. return VirtualSizeToLocalSize(render.Margin, render.Range, render.WindowSize, width, height);
  46. }
  47. internal static Vector2 VirtualSizeToLocalSize(Padding margin,LineRange range,Vector2 windowsize, float width, float height)
  48. {
  49. Vector2 rect = new Vector2(windowsize.X - margin.Left - margin.Right, windowsize.Y - margin.Top - margin.Bottom);
  50. float w = width / range.XLenght * (rect.X / windowsize.X) * 2;
  51. float h = height / range.YLenght * (rect.Y / windowsize.Y) * 2;
  52. return new Vector2(w, h);
  53. }
  54. public static Vector2 VirtualPointToLocalPoint<T>(this T render, float x, float y) where T:IRender
  55. {
  56. return VirtualPointToLocalPoint(render.Camera.OrthographicMatrix, render.Camera.GetLineMatrix(render.Margin, render.LineRange),x,y);
  57. }
  58. internal static Vector2 VirtualPointToLocalPoint(this BaseVeldridRender render, float x, float y)
  59. {
  60. return VirtualPointToLocalPoint(render.Camera.OrthographicMatrix, render.Camera.GetLineMatrix(render.Margin, render.Range), x, y);
  61. }
  62. internal static Vector2 VirtualPointToLocalPoint(Matrix4x4 orth,Matrix4x4 view, float x, float y)
  63. {
  64. Matrix4x4 matrix = new Matrix4x4();
  65. matrix.M11 = x;
  66. matrix.M21 = y;
  67. matrix.M41 = 1;
  68. matrix = view*orth*matrix;
  69. return new Vector2(matrix.M11-1, matrix.M21*2+1);
  70. }
  71. public static SizeF LocalSizeToVirtualSize<T>(this T render, float width, float height) where T:IRender
  72. {
  73. return LocalSizeToVirtualSize(render.Rectangle, render.LineRange, width, height);
  74. }
  75. internal static SizeF LocalSizeToVirtualSize(this BaseVeldridRender render, float width, float height)
  76. {
  77. return LocalSizeToVirtualSize(render.Rectangle, render.Range, width, height);
  78. }
  79. private static SizeF LocalSizeToVirtualSize(RectangleF rect,LineRange range, float width, float height)
  80. {
  81. return new SizeF(width / rect.Width * (range.MaxX - range.MinX), height / rect.Height * (range.MaxY -range.MinY));
  82. }
  83. }
  84. }