SizeModifierCollection.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using UnityEngine;
  6. namespace TheraBytes.BetterUi
  7. {
  8. [Serializable]
  9. public class SizeModifierCollection
  10. {
  11. [Serializable]
  12. public class SizeModifier
  13. {
  14. public ImpactMode Mode;
  15. [Range(0, 1)]
  16. public float Impact = 1;
  17. public SizeModifier()
  18. {
  19. }
  20. public SizeModifier(ImpactMode mode, float impact)
  21. {
  22. this.Mode = mode;
  23. this.Impact = impact;
  24. }
  25. internal float GetFactor(Component caller, Vector2 optimizedResolution, Vector2 actualResolution, float optimizedDpi, float actualDpi)
  26. {
  27. float result;
  28. switch (Mode)
  29. {
  30. case ImpactMode.PixelWidth:
  31. result = CalculateSize(optimizedResolution.x, actualResolution.x, Impact);
  32. break;
  33. case ImpactMode.PixelHeight:
  34. result = CalculateSize(optimizedResolution.y, actualResolution.y, Impact);
  35. break;
  36. case ImpactMode.AspectRatio:
  37. {
  38. float optRatio = optimizedResolution.x / optimizedResolution.y;
  39. float actRatio = actualResolution.x / actualResolution.y;
  40. result = CalculateSize(optRatio, actRatio, Impact);
  41. }
  42. break;
  43. case ImpactMode.InverseAspectRatio:
  44. {
  45. float optRatio = optimizedResolution.y / optimizedResolution.x;
  46. float actRatio = actualResolution.y / actualResolution.x;
  47. result = CalculateSize(optRatio, actRatio, Impact);
  48. }
  49. break;
  50. case ImpactMode.Dpi:
  51. result = CalculateSize(optimizedDpi, actualDpi, Impact);
  52. break;
  53. case ImpactMode.StaticMethod1:
  54. case ImpactMode.StaticMethod2:
  55. case ImpactMode.StaticMethod3:
  56. case ImpactMode.StaticMethod4:
  57. case ImpactMode.StaticMethod5:
  58. result = 1 - ResolutionMonitor.InvokeStaticMethod(Mode, caller, optimizedResolution, actualResolution, optimizedDpi, actualDpi);
  59. break;
  60. default:
  61. result = 0;
  62. break;
  63. }
  64. return result;
  65. }
  66. float CalculateSize(float optimizedValue, float actualValue, float impact)
  67. {
  68. if (impact == 0 || optimizedValue == actualValue)
  69. return 0;
  70. float val = actualValue / optimizedValue;
  71. return 1 - Mathf.Lerp(1, val, impact);
  72. }
  73. }
  74. public float ExponentialScale = 1;
  75. public List<SizeModifier> SizeModifiers = new List<SizeModifier>() { new SizeModifier() };
  76. public SizeModifierCollection(params SizeModifier[] mods)
  77. : this(1, mods)
  78. { }
  79. public SizeModifierCollection(float exponentialScale, params SizeModifier[] mods)
  80. {
  81. //this.screenConfig = screenConfig;
  82. this.ExponentialScale = exponentialScale;
  83. this.SizeModifiers = mods.ToList();
  84. }
  85. public float CalculateFactor(Component caller, string screenConfig)
  86. {
  87. OverrideScreenProperties parentOverride = caller.GetComponentInParent<OverrideScreenProperties>();
  88. ScreenInfo info = (parentOverride != null)
  89. ? parentOverride.OptimizedOverride
  90. : ResolutionMonitor.GetOpimizedScreenInfo(screenConfig);
  91. Vector2 optimizedRes = info.Resolution;
  92. float optimizedDpi = info.Dpi;
  93. Vector2 actualRes = (parentOverride != null)
  94. ? parentOverride.CurrentSize.Resolution
  95. : ResolutionMonitor.CurrentResolution;
  96. float actualDpi = (parentOverride != null)
  97. ? parentOverride.CurrentSize.Dpi
  98. : ResolutionMonitor.CurrentDpi;
  99. float factor = 0;
  100. float max = (SizeModifiers.Count > 0) ? SizeModifiers.Max((o) => o.Impact) : 1;
  101. float scale = 0;
  102. foreach (var entry in SizeModifiers)
  103. {
  104. factor += entry.GetFactor(caller, optimizedRes, actualRes, optimizedDpi, actualDpi);
  105. scale += entry.Impact / max;
  106. }
  107. if (factor == 0) // nothing in list
  108. {
  109. factor = 1;
  110. }
  111. else
  112. {
  113. factor /= scale;
  114. factor = 1 - factor;
  115. }
  116. if (ExponentialScale != 1)
  117. {
  118. factor = Mathf.Pow(factor, ExponentialScale);
  119. }
  120. return factor;
  121. }
  122. public SizeModifierCollection Clone()
  123. {
  124. SizeModifierCollection clone = new SizeModifierCollection();
  125. this.CopyTo(clone);
  126. return Clone();
  127. }
  128. public void CopyTo(SizeModifierCollection other)
  129. {
  130. other.SizeModifiers.Clear();
  131. other.ExponentialScale = this.ExponentialScale;
  132. foreach (var mod in this.SizeModifiers)
  133. {
  134. other.SizeModifiers.Add(new SizeModifier(mod.Mode, mod.Impact));
  135. }
  136. }
  137. }
  138. }