MPImage.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. using UnityEngine.UI.MPUIKIT;
  5. #if UNITY_EDITOR
  6. using UnityEditor;
  7. #endif
  8. namespace MPUIKIT {
  9. [AddComponentMenu("UI/MPUI/MPImage")]
  10. public class MPImage : Image {
  11. #region Constants
  12. public const string MpShaderName = "MPUI/Procedural Image";
  13. #endregion
  14. #region SerializedFields
  15. [SerializeField] private DrawShape m_DrawShape = DrawShape.None;
  16. [SerializeField] private Type m_ImageType = Type.Simple;
  17. [SerializeField] private MaterialMode m_MaterialMode;
  18. [SerializeField] private float m_StrokeWidth;
  19. [SerializeField] private float m_OutlineWidth;
  20. [SerializeField] private Color m_OutlineColor = Color.black;
  21. [SerializeField] private float m_FalloffDistance = 0.5f;
  22. [SerializeField] private bool m_ConstrainRotation = true;
  23. [SerializeField] private float m_ShapeRotation;
  24. [SerializeField] private bool m_FlipHorizontal;
  25. [SerializeField] private bool m_FlipVertical;
  26. [SerializeField] private Triangle m_Triangle = new Triangle();
  27. [SerializeField] private Rectangle m_Rectangle = new Rectangle();
  28. [SerializeField] private Circle m_Circle = new Circle();
  29. [SerializeField] private Pentagon m_Pentagon = new Pentagon();
  30. [SerializeField] private Hexagon m_Hexagon = new Hexagon();
  31. [SerializeField] private NStarPolygon m_NStarPolygon = new NStarPolygon();
  32. [SerializeField] private GradientEffect m_GradientEffect = new GradientEffect();
  33. #endregion
  34. #region Public Properties
  35. #region Draw Settings
  36. /// <summary>
  37. /// Type of the shape to be drawn. ie: Rectangle, Circle
  38. /// </summary>
  39. public DrawShape DrawShape {
  40. get => m_DrawShape;
  41. set {
  42. m_DrawShape = value;
  43. if (material == m_Material) {
  44. m_Material.SetInt(SpDrawShape, (int) m_DrawShape);
  45. }
  46. base.SetMaterialDirty();
  47. }
  48. }
  49. /// <summary>
  50. /// Width of the stroke for the drawn shape. 0 is no stroke.
  51. /// </summary>
  52. public float StrokeWidth {
  53. get => m_StrokeWidth;
  54. set {
  55. m_StrokeWidth = value;
  56. m_StrokeWidth = m_StrokeWidth < 0 ? 0 : m_StrokeWidth;
  57. if (material == m_Material) {
  58. m_Material.SetFloat(SpStrokeWidth, m_StrokeWidth);
  59. }
  60. base.SetMaterialDirty();
  61. }
  62. }
  63. /// <summary>
  64. /// Width of the outline for the drawn shape. 0 is no outline.
  65. /// </summary>
  66. public float OutlineWidth {
  67. get => m_OutlineWidth;
  68. set {
  69. m_OutlineWidth = value;
  70. m_OutlineWidth = m_OutlineWidth < 0 ? 0 : m_OutlineWidth;
  71. if (m_Material == material) {
  72. m_Material.SetFloat(SpOutlineWidth, m_OutlineWidth);
  73. }
  74. base.SetMaterialDirty();
  75. }
  76. }
  77. /// <summary>
  78. /// Color of the Outline. Has no effect is teh value of the OutlineWidth is 0
  79. /// </summary>
  80. public Color OutlineColor {
  81. get => m_OutlineColor;
  82. set {
  83. m_OutlineColor = value;
  84. if (m_Material == material) {
  85. m_Material.SetColor(SpOutlineColor, m_OutlineColor);
  86. }
  87. base.SetMaterialDirty();
  88. }
  89. }
  90. /// <summary>
  91. /// Edge falloff distance of the shape
  92. /// </summary>
  93. public float FalloffDistance {
  94. get { return m_FalloffDistance; }
  95. set {
  96. m_FalloffDistance = Mathf.Max(value, 0f);
  97. if (material == m_Material) {
  98. m_Material.SetFloat(SpFalloffDistance, m_FalloffDistance);
  99. }
  100. base.SetMaterialDirty();
  101. }
  102. }
  103. /// <summary>
  104. /// Constrains rotation to 0, 90, 270 degrees angle if set to true. But the width and height of the shape
  105. /// is replaced as necessary to avoid clipping.
  106. /// If set to false, any shapes can be rotated in any arbitrary angle but will often result in
  107. /// clipping of the shape.
  108. /// </summary>
  109. public bool ConstrainRotation {
  110. get { return m_ConstrainRotation; }
  111. set {
  112. m_ConstrainRotation = value;
  113. if (m_Material == material) {
  114. m_Material.SetInt(SpConstrainedRotation, value?1:0);
  115. }
  116. if (value) {
  117. m_ShapeRotation = ConstrainRotationValue(m_ShapeRotation);
  118. }
  119. base.SetVerticesDirty();
  120. base.SetMaterialDirty();
  121. }
  122. }
  123. private float ConstrainRotationValue(float val) {
  124. float finalRotation = val - val % 90;
  125. if (Mathf.Abs(finalRotation) >= 360) finalRotation = 0;
  126. return finalRotation;
  127. }
  128. /// <summary>
  129. /// Rotation of the shape.
  130. /// </summary>
  131. public float ShapeRotation {
  132. get { return m_ShapeRotation; }
  133. set {
  134. m_ShapeRotation = m_ConstrainRotation ? ConstrainRotationValue(value) : value;
  135. if (m_Material == material) {
  136. m_Material.SetFloat(SpShapeRotation, m_ShapeRotation);
  137. }
  138. base.SetMaterialDirty();
  139. }
  140. }
  141. /// <summary>
  142. /// Flips the shape horizontally.
  143. /// </summary>
  144. public bool FlipHorizontal {
  145. get { return m_FlipHorizontal; }
  146. set {
  147. m_FlipHorizontal = value;
  148. if (m_Material == material) {
  149. m_Material.SetInt(SpFlipHorizontal, m_FlipHorizontal ? 1 : 0);
  150. }
  151. base.SetMaterialDirty();
  152. }
  153. }
  154. /// <summary>
  155. /// Flips the shape vertically
  156. /// </summary>
  157. public bool FlipVertical {
  158. get { return m_FlipVertical; }
  159. set {
  160. m_FlipVertical = value;
  161. if (m_Material == material) {
  162. m_Material.SetInt(SpFlipVertical, m_FlipVertical ? 1 : 0);
  163. }
  164. base.SetMaterialDirty();
  165. }
  166. }
  167. /// <summary>
  168. /// Defines what material type of use to render the shape. Dynamic or Shared.
  169. /// Default is Dynamic and will issue one draw call per image object. If set to shared, assigned
  170. /// material in the material slot will be used to render the image. It will fallback to dynamic
  171. /// if no material in the material slot is assigned
  172. /// </summary>
  173. public MaterialMode MaterialMode {
  174. get { return m_MaterialMode; }
  175. set {
  176. if (m_MaterialMode == value) return;
  177. m_MaterialMode = value;
  178. InitializeComponents();
  179. if (material == m_Material) {
  180. InitValuesFromSharedMaterial();
  181. #if UNITY_EDITOR
  182. _parseAgainOnValidate = true;
  183. #endif
  184. }
  185. base.SetMaterialDirty();
  186. }
  187. }
  188. /// <summary>
  189. /// Shared material to use to render the shape. the material must use the "MPUI/Procedural Sprite" shader
  190. /// </summary>
  191. public override Material material {
  192. get {
  193. if (m_Material && m_MaterialMode == MaterialMode.Shared) {
  194. return m_Material;
  195. }
  196. return DynamicMaterial;
  197. }
  198. set {
  199. m_Material = value;
  200. if (m_Material && m_MaterialMode == MaterialMode.Shared && m_Material.shader.name == MpShaderName) {
  201. InitValuesFromSharedMaterial();
  202. #if UNITY_EDITOR
  203. _parseAgainOnValidate = true;
  204. #endif
  205. }
  206. InitializeComponents();
  207. base.SetMaterialDirty();
  208. }
  209. }
  210. // ReSharper disable once InconsistentNaming
  211. /// <summary>
  212. /// Type of the image. Only two types are supported. Simple and Filled.
  213. /// Default and fallback value is Simple.
  214. /// </summary>
  215. public new Type type {
  216. get => m_ImageType;
  217. set {
  218. if (m_ImageType == value) return;
  219. switch (value) {
  220. case Type.Simple:
  221. case Type.Filled:
  222. m_ImageType = value;
  223. break;
  224. case Type.Tiled:
  225. case Type.Sliced:
  226. break;
  227. default:
  228. throw new ArgumentOutOfRangeException(value.ToString(), value, null);
  229. }
  230. base.type = m_ImageType;
  231. }
  232. }
  233. #endregion
  234. public Triangle Triangle {
  235. get => m_Triangle;
  236. set {
  237. m_Triangle = value;
  238. SetMaterialDirty();
  239. }
  240. }
  241. public Rectangle Rectangle {
  242. get => m_Rectangle;
  243. set {
  244. m_Rectangle = value;
  245. SetMaterialDirty();
  246. }
  247. }
  248. public Circle Circle{
  249. get => m_Circle;
  250. set {
  251. m_Circle = value;
  252. SetMaterialDirty();
  253. }
  254. }
  255. public Pentagon Pentagon {
  256. get => m_Pentagon;
  257. set {
  258. m_Pentagon = value;
  259. SetMaterialDirty();
  260. }
  261. }
  262. public Hexagon Hexagon {
  263. get => m_Hexagon;
  264. set {
  265. m_Hexagon = value;
  266. SetMaterialDirty();
  267. }
  268. }
  269. public NStarPolygon NStarPolygon {
  270. get => m_NStarPolygon;
  271. set {
  272. m_NStarPolygon = value;
  273. SetMaterialDirty();
  274. }
  275. }
  276. public GradientEffect GradientEffect {
  277. get => m_GradientEffect;
  278. set {
  279. m_GradientEffect = value;
  280. SetMaterialDirty();
  281. }
  282. }
  283. #endregion
  284. #region Private Variables
  285. private Material _dynamicMaterial;
  286. private Material DynamicMaterial {
  287. get {
  288. if (_dynamicMaterial == null) {
  289. _dynamicMaterial = new Material(Shader.Find(MpShaderName));
  290. _dynamicMaterial.name += " [Dynamic]";
  291. }
  292. return _dynamicMaterial;
  293. }
  294. }
  295. #if UNITY_EDITOR
  296. private bool _parseAgainOnValidate;
  297. #endif
  298. private Sprite ActiveSprite {
  299. get {
  300. Sprite overrideSprite1 = overrideSprite;
  301. return overrideSprite1 != null ? overrideSprite1 : sprite;
  302. }
  303. }
  304. #endregion
  305. #region Material PropertyIds
  306. private static readonly int SpPixelWorldScale = Shader.PropertyToID("_PixelWorldScale");
  307. private static readonly int SpDrawShape = Shader.PropertyToID("_DrawShape");
  308. private static readonly int SpStrokeWidth = Shader.PropertyToID("_StrokeWidth");
  309. private static readonly int SpOutlineWidth = Shader.PropertyToID("_OutlineWidth");
  310. private static readonly int SpOutlineColor = Shader.PropertyToID("_OutlineColor");
  311. private static readonly int SpFalloffDistance = Shader.PropertyToID("_FalloffDistance");
  312. private static readonly int SpShapeRotation = Shader.PropertyToID("_ShapeRotation");
  313. private static readonly int SpConstrainedRotation = Shader.PropertyToID("_ConstrainRotation");
  314. private static readonly int SpFlipHorizontal = Shader.PropertyToID("_FlipHorizontal");
  315. private static readonly int SpFlipVertical = Shader.PropertyToID("_FlipVertical");
  316. #endregion
  317. #if UNITY_EDITOR
  318. public void UpdateSerializedValuesFromSharedMaterial() {
  319. if (m_Material && MaterialMode == MaterialMode.Shared) {
  320. InitValuesFromSharedMaterial();
  321. base.SetMaterialDirty();
  322. }
  323. }
  324. protected override void OnValidate() {
  325. InitializeComponents();
  326. if (_parseAgainOnValidate) {
  327. InitValuesFromSharedMaterial();
  328. _parseAgainOnValidate = false;
  329. }
  330. DrawShape = m_DrawShape;
  331. StrokeWidth = m_StrokeWidth;
  332. OutlineWidth = m_OutlineWidth;
  333. OutlineColor = m_OutlineColor;
  334. FalloffDistance = m_FalloffDistance;
  335. ConstrainRotation = m_ConstrainRotation;
  336. ShapeRotation = m_ShapeRotation;
  337. FlipHorizontal = m_FlipHorizontal;
  338. FlipVertical = m_FlipVertical;
  339. m_Triangle.OnValidate();
  340. m_Circle.OnValidate();
  341. m_Rectangle.OnValidate();
  342. m_Pentagon.OnValidate();
  343. m_Hexagon.OnValidate();
  344. m_NStarPolygon.OnValidate();
  345. m_GradientEffect.OnValidate();
  346. base.OnValidate();
  347. base.SetMaterialDirty();
  348. }
  349. #endif
  350. private void InitializeComponents() {
  351. m_Circle.Init(m_Material, material, rectTransform);
  352. m_Triangle.Init(m_Material, material, rectTransform);
  353. m_Rectangle.Init(m_Material, material, rectTransform);
  354. m_Pentagon.Init(m_Material, material, rectTransform);
  355. m_Hexagon.Init(m_Material, material, rectTransform);
  356. m_NStarPolygon.Init(m_Material, material, rectTransform);
  357. m_GradientEffect.Init(m_Material, material, rectTransform);
  358. }
  359. void FixAdditionalShaderChannelsInCanvas()
  360. {
  361. Canvas c = canvas;
  362. if(canvas == null) return;
  363. AdditionalCanvasShaderChannels additionalShaderChannels = c.additionalShaderChannels;
  364. additionalShaderChannels |= AdditionalCanvasShaderChannels.TexCoord1;
  365. additionalShaderChannels |= AdditionalCanvasShaderChannels.TexCoord2;
  366. c.additionalShaderChannels = additionalShaderChannels;
  367. }
  368. #if UNITY_EDITOR
  369. protected override void Reset() {
  370. InitializeComponents();
  371. base.Reset();
  372. }
  373. #else
  374. void Reset() {
  375. InitializeComponents();
  376. }
  377. #endif
  378. protected override void Awake()
  379. {
  380. base.Awake();
  381. Init();
  382. }
  383. public void Init()
  384. {
  385. InitializeComponents();
  386. FixAdditionalShaderChannelsInCanvas();
  387. if (m_Material && MaterialMode == MaterialMode.Shared) {
  388. InitValuesFromSharedMaterial();
  389. }
  390. ListenToComponentChanges(true);
  391. base.SetAllDirty();
  392. }
  393. protected override void OnDestroy() {
  394. ListenToComponentChanges(false);
  395. base.OnDestroy();
  396. }
  397. protected void ListenToComponentChanges(bool toggle) {
  398. if (toggle) {
  399. m_Circle.OnComponentSettingsChanged += OnComponentSettingsChanged;
  400. m_Triangle.OnComponentSettingsChanged += OnComponentSettingsChanged;
  401. m_Rectangle.OnComponentSettingsChanged += OnComponentSettingsChanged;
  402. m_Pentagon.OnComponentSettingsChanged += OnComponentSettingsChanged;
  403. m_Hexagon.OnComponentSettingsChanged += OnComponentSettingsChanged;
  404. m_NStarPolygon.OnComponentSettingsChanged += OnComponentSettingsChanged;
  405. m_GradientEffect.OnComponentSettingsChanged += OnComponentSettingsChanged;
  406. }
  407. else {
  408. m_Circle.OnComponentSettingsChanged -= OnComponentSettingsChanged;
  409. m_Triangle.OnComponentSettingsChanged -= OnComponentSettingsChanged;
  410. m_Rectangle.OnComponentSettingsChanged -= OnComponentSettingsChanged;
  411. m_Pentagon.OnComponentSettingsChanged -= OnComponentSettingsChanged;
  412. m_Hexagon.OnComponentSettingsChanged -= OnComponentSettingsChanged;
  413. m_NStarPolygon.OnComponentSettingsChanged -= OnComponentSettingsChanged;
  414. m_GradientEffect.OnComponentSettingsChanged += OnComponentSettingsChanged;
  415. }
  416. }
  417. protected override void OnTransformParentChanged()
  418. {
  419. base.OnTransformParentChanged();
  420. FixAdditionalShaderChannelsInCanvas();
  421. }
  422. private void OnComponentSettingsChanged(object sender, EventArgs e) {
  423. base.SetMaterialDirty();
  424. }
  425. protected override void OnRectTransformDimensionsChange() {
  426. base.OnRectTransformDimensionsChange();
  427. m_Circle.UpdateCircleRadius(rectTransform);
  428. base.SetMaterialDirty();
  429. }
  430. protected override void OnPopulateMesh(VertexHelper vh) {
  431. switch (type) {
  432. case Type.Simple:
  433. case Type.Sliced:
  434. case Type.Tiled:
  435. MPImageHelper.GenerateSimpleSprite(vh, preserveAspect, canvas, rectTransform, ActiveSprite,
  436. color, m_FalloffDistance);
  437. break;
  438. case Type.Filled:
  439. MPImageHelper.GenerateFilledSprite(vh, preserveAspect, canvas, rectTransform, ActiveSprite,
  440. color, fillMethod, fillAmount, fillOrigin, fillClockwise, m_FalloffDistance);
  441. break;
  442. default:
  443. throw new ArgumentOutOfRangeException();
  444. }
  445. }
  446. public override Material GetModifiedMaterial(Material baseMaterial) {
  447. Material mat = base.GetModifiedMaterial(baseMaterial);
  448. if (m_Material && MaterialMode == MaterialMode.Shared) {
  449. InitValuesFromSharedMaterial();
  450. }
  451. DisableAllMaterialKeywords(mat);
  452. RectTransform rt = rectTransform;
  453. if (DrawShape != DrawShape.None) {
  454. mat.SetFloat(SpOutlineWidth, m_OutlineWidth);
  455. mat.SetFloat(SpStrokeWidth, m_StrokeWidth);
  456. mat.SetColor(SpOutlineColor, OutlineColor);
  457. mat.SetFloat(SpFalloffDistance, FalloffDistance);
  458. float pixelSize = 1/Mathf.Max(0, FalloffDistance);
  459. mat.SetFloat(SpPixelWorldScale, Mathf.Clamp(pixelSize, 0f, 999999f));
  460. if (m_StrokeWidth > 0 && m_OutlineWidth > 0) {
  461. mat.EnableKeyword("OUTLINED_STROKE");
  462. }
  463. else {
  464. if (m_StrokeWidth > 0) {
  465. mat.EnableKeyword("STROKE");
  466. }
  467. else if (m_OutlineWidth > 0) {
  468. mat.EnableKeyword("OUTLINED");
  469. }
  470. else {
  471. mat.DisableKeyword("OUTLINED_STROKE");
  472. mat.DisableKeyword("STROKE");
  473. mat.DisableKeyword("OUTLINED");
  474. }
  475. }
  476. }
  477. m_Triangle.ModifyMaterial(ref mat);
  478. m_Circle.ModifyMaterial(ref mat, m_FalloffDistance);
  479. m_Rectangle.ModifyMaterial(ref mat);
  480. m_Pentagon.ModifyMaterial(ref mat);
  481. m_Hexagon.ModifyMaterial(ref mat);
  482. m_NStarPolygon.ModifyMaterial(ref mat);
  483. m_GradientEffect.ModifyMaterial(ref mat);
  484. switch (DrawShape) {
  485. case DrawShape.None:
  486. mat.DisableKeyword("CIRCLE");
  487. mat.DisableKeyword("TRIANGLE");
  488. mat.DisableKeyword("RECTANGLE");
  489. mat.DisableKeyword("PENTAGON");
  490. mat.DisableKeyword("HEXAGON");
  491. mat.DisableKeyword("NSTAR_POLYGON");
  492. break;
  493. case DrawShape.Circle:
  494. mat.EnableKeyword("CIRCLE");
  495. break;
  496. case DrawShape.Triangle:
  497. mat.EnableKeyword("TRIANGLE");
  498. break;
  499. case DrawShape.Rectangle:
  500. mat.EnableKeyword("RECTANGLE");
  501. break;
  502. case DrawShape.Pentagon:
  503. mat.EnableKeyword("PENTAGON");
  504. break;
  505. case DrawShape.NStarPolygon:
  506. mat.EnableKeyword("NSTAR_POLYGON");
  507. break;
  508. case DrawShape.Hexagon:
  509. mat.EnableKeyword("HEXAGON");
  510. break;
  511. default:
  512. throw new ArgumentOutOfRangeException();
  513. }
  514. mat.SetInt(SpDrawShape, (int) DrawShape);
  515. mat.SetInt(SpFlipHorizontal, m_FlipHorizontal ? 1 : 0);
  516. mat.SetInt(SpFlipVertical, m_FlipVertical ? 1 : 0);
  517. mat.SetFloat(SpShapeRotation, m_ShapeRotation);
  518. mat.SetInt(SpConstrainedRotation, m_ConstrainRotation?1:0);
  519. return mat;
  520. }
  521. private void DisableAllMaterialKeywords(Material mat) {
  522. mat.DisableKeyword("PROCEDURAL");
  523. mat.DisableKeyword("HYBRID");
  524. mat.DisableKeyword("CIRCLE");
  525. mat.DisableKeyword("TRIANGLE");
  526. mat.DisableKeyword("RECTANGLE");
  527. mat.DisableKeyword("PENTAGON");
  528. mat.DisableKeyword("HEXAGON");
  529. mat.DisableKeyword("NSTAR_POLYGON");
  530. mat.DisableKeyword("STROKE");
  531. mat.DisableKeyword("OUTLINED");
  532. mat.DisableKeyword("OUTLINED_STROKE");
  533. mat.DisableKeyword("ROUNDED_CORNERS");
  534. mat.DisableKeyword("GRADIENT_LINEAR");
  535. mat.DisableKeyword("GRADIENT_CORNER");
  536. mat.DisableKeyword("GRADIENT_RADIAL");
  537. }
  538. public void InitValuesFromSharedMaterial() {
  539. if (m_Material == null) return;
  540. Material mat = m_Material;
  541. //Debug.Log("Parsing shared mat");
  542. //Basic Settings
  543. m_DrawShape = (DrawShape) mat.GetInt(SpDrawShape);
  544. m_StrokeWidth = mat.GetFloat(SpStrokeWidth);
  545. m_FalloffDistance = mat.GetFloat(SpFalloffDistance);
  546. m_OutlineWidth = mat.GetFloat(SpOutlineWidth);
  547. m_OutlineColor = mat.GetColor(SpOutlineColor);
  548. m_FlipHorizontal = mat.GetInt(SpFlipHorizontal) == 1;
  549. m_FlipVertical = mat.GetInt(SpFlipVertical) == 1;
  550. m_ConstrainRotation = mat.GetInt(SpConstrainedRotation) == 1;
  551. m_ShapeRotation = mat.GetFloat(SpShapeRotation);
  552. //Debug.Log($"Parsed Falloff Distance: {m_FalloffDistance}");
  553. m_Triangle.InitValuesFromMaterial(ref mat);
  554. m_Circle.InitValuesFromMaterial(ref mat);
  555. m_Rectangle.InitValuesFromMaterial(ref mat);
  556. m_Pentagon.InitValuesFromMaterial(ref mat);
  557. m_Hexagon.InitValuesFromMaterial(ref mat);
  558. m_NStarPolygon.InitValuesFromMaterial(ref mat);
  559. //GradientEffect
  560. m_GradientEffect.InitValuesFromMaterial(ref mat);
  561. }
  562. #if UNITY_EDITOR
  563. public Material CreateMaterialAssetFromComponentSettings() {
  564. Material matAsset = new Material(Shader.Find(MpShaderName));
  565. matAsset = GetModifiedMaterial(matAsset);
  566. string path = EditorUtility.SaveFilePanelInProject("Create Material for MPImage",
  567. "MPMaterial", "mat", "Choose location");
  568. AssetDatabase.CreateAsset(matAsset, path);
  569. AssetDatabase.SaveAssets();
  570. AssetDatabase.Refresh();
  571. return matAsset;
  572. }
  573. #endif
  574. }
  575. }