BaseRender.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Diagnostics.CodeAnalysis;
  5. using System.Drawing;
  6. using System.Numerics;
  7. using System.Runtime.CompilerServices;
  8. using System.Text;
  9. using Veldrid.Common;
  10. using Veldrid.Common.VeldridRender;
  11. using Veldrid.Sdl2;
  12. using Veldrid.Common.Tools;
  13. namespace Veldrid.Common.Plot
  14. {
  15. public abstract class BaseRender:IRender
  16. {
  17. private Camera _camera;
  18. private Sdl2Window _window;
  19. [AllowNull]
  20. protected CommandList CommandList { get; }
  21. private protected GraphicsDevice GraphicsDevice { get; }
  22. private protected abstract BaseVeldridRender Renderer { get; }
  23. public BaseRender(IVeldridContent control)
  24. {
  25. if (control == null)
  26. {
  27. throw new ArgumentNullException(nameof(control));
  28. }
  29. _camera = control.GraphicsManger.Camera;
  30. CommandList = control.GraphicsManger.CommandList;
  31. GraphicsDevice = control.GraphicsManger.Device;
  32. _window= control.GraphicsManger.Window;
  33. }
  34. protected void SetCursor(SDL_SystemCursor cursor)=>_window.Cursor = cursor;
  35. public Boolean Visibily { get=>Renderer.Visibily; set=>Renderer.Visibily =value; }
  36. public int ZIndex { get; set; } = 0;
  37. internal virtual Boolean Skip => !Visibily;
  38. Boolean IRender.Skip => Skip;
  39. public virtual Padding Margin
  40. {
  41. get => Renderer.Margin;
  42. set
  43. {
  44. Renderer.Margin = value;
  45. (this as IRender).Children.ForEach(x => x.Margin = value);
  46. }
  47. }
  48. Camera IRender.Camera => _camera;
  49. Vector2 IRender.WindowSize => new Vector2(GraphicsDevice.MainSwapchain.Framebuffer.Width, GraphicsDevice.MainSwapchain.Framebuffer.Height);
  50. public RectangleF Rectangle => Renderer.Rectangle;
  51. public virtual LineRange LineRange
  52. {
  53. get => Renderer.Range;
  54. set
  55. {
  56. Renderer.Range = value;
  57. (this as IRender).Children.ForEach(x => x.Range = value);
  58. }
  59. }
  60. public virtual void Draw()
  61. {
  62. if (!Visibily) return;
  63. Renderer?.Draw();
  64. (this as IRender).Children.ForEach(x => x.Draw());
  65. }
  66. public virtual void CursorDraw()
  67. {
  68. //if (!Visibily) return;
  69. Renderer?.Draw();
  70. (this as IRender).Children.ForEach(x => x.Draw());
  71. }
  72. List<BaseVeldridRender> IRender.Children { get; } = new List<BaseVeldridRender>();
  73. [AllowNull]
  74. public Object Tag { get; set; }
  75. protected virtual void SetWindowSizeState(Boolean state)
  76. {
  77. Renderer.WindowSizeState = state;
  78. (this as IRender).Children.ForEach(x => x.WindowSizeState = state);
  79. }
  80. bool IRender.WindowSizeState
  81. {
  82. get => Renderer.WindowSizeState;
  83. set
  84. {
  85. SetWindowSizeState(value);
  86. }
  87. }
  88. protected virtual void Dispose(bool disposing)
  89. {
  90. if (!disposedValue)
  91. {
  92. if (disposing)
  93. {
  94. this.ClearEventHandle();
  95. Renderer?.DisposeResources();
  96. (this as IRender).Children.ForEach((x) => x.DisposeResources());
  97. // TODO: 释放托管状态(托管对象)
  98. }
  99. // TODO: 释放未托管的资源(未托管的对象)并重写终结器
  100. // TODO: 将大型字段设置为 null
  101. disposedValue = true;
  102. }
  103. }
  104. // // TODO: 仅当“Dispose(bool disposing)”拥有用于释放未托管资源的代码时才替代终结器
  105. // ~BaseRenderer()
  106. // {
  107. // // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
  108. // Dispose(disposing: false);
  109. // }
  110. public void Dispose()
  111. {
  112. // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
  113. this.Dispose(disposing: true);
  114. GC.SuppressFinalize(this);
  115. }
  116. private bool disposedValue;
  117. }
  118. }