优化侧边栏菜单 UI细节
This commit is contained in:
parent
4722473896
commit
c421466b84
@ -1,5 +1,4 @@
|
||||
using AxibugEmuOnline.Client;
|
||||
using System;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
namespace AxibugEmuOnline.Editors
|
||||
|
@ -1,6 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AxiReplay
|
||||
{
|
||||
|
@ -4,7 +4,7 @@ using System.Text;
|
||||
|
||||
namespace AxiReplay
|
||||
{
|
||||
[StructLayout(LayoutKind.Explicit,Size = 44)]
|
||||
[StructLayout(LayoutKind.Explicit, Size = 44)]
|
||||
public struct ReplayHandler
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
@ -51,7 +51,7 @@ namespace AxiReplay
|
||||
FM32IP32,
|
||||
FM32IP64,
|
||||
}
|
||||
public static void GetStringByteData(string str,out byte[] data,out int lenghtWithEnd,Encoding encoding)
|
||||
public static void GetStringByteData(string str, out byte[] data, out int lenghtWithEnd, Encoding encoding)
|
||||
{
|
||||
data = encoding.GetBytes(str);
|
||||
lenghtWithEnd = data.Length + 1;
|
||||
|
@ -79,7 +79,7 @@ namespace AxiReplay
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void UpdateNextFrame(int targetFrame)
|
||||
{
|
||||
//如果已经超过
|
||||
@ -128,14 +128,14 @@ namespace AxiReplay
|
||||
/// </summary>
|
||||
public bool NextFrame(out ReplayStep data)
|
||||
{
|
||||
return TakeFrame(1,out data);
|
||||
return TakeFrame(1, out data);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 往前推进指定帧数量的Input (返回是否变化)
|
||||
/// </summary>
|
||||
/// <param name="addFrame"></param>
|
||||
public bool TakeFrame(int addFrame,out ReplayStep data)
|
||||
public bool TakeFrame(int addFrame, out ReplayStep data)
|
||||
{
|
||||
bool Changed = false;
|
||||
mCurrFrame += addFrame;
|
||||
|
@ -57,7 +57,7 @@ namespace AxiReplay
|
||||
/// 往前推进帧的,指定帧下标
|
||||
/// </summary>
|
||||
/// <param name="frameInput"></param>
|
||||
public void NextFramebyFrameIdx(int FrameID,UInt64 frameInput)
|
||||
public void NextFramebyFrameIdx(int FrameID, UInt64 frameInput)
|
||||
{
|
||||
TakeFrame(FrameID - byFrameIdx, frameInput);
|
||||
byFrameIdx = FrameID;
|
||||
@ -80,7 +80,7 @@ namespace AxiReplay
|
||||
{
|
||||
if (addFrame < 0)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
mCurrFrame += addFrame;
|
||||
if (mCurrInput == frameInput)
|
||||
@ -140,7 +140,7 @@ namespace AxiReplay
|
||||
temp.Add($"CreateTime => {handler.CreateTime}");
|
||||
temp.Add($"AllFrame => {handler.AllFrame}");
|
||||
temp.Add($"SingleLenght => {handler.SingleLenght}");
|
||||
dbgList.InsertRange(0,temp);
|
||||
dbgList.InsertRange(0, temp);
|
||||
File.WriteAllLines(dumppath, dbgList);
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -14,23 +14,23 @@ using System.Linq;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Base class for effects that modify the generated Mesh.
|
||||
/// It works well not only for standard Graphic components (Image, RawImage, Text, etc.) but also for TextMeshPro and TextMeshProUGUI.
|
||||
/// </summary>
|
||||
[ExecuteInEditMode]
|
||||
public abstract class BaseMeshEffect : UIBehaviour, IMeshModifier
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Base class for effects that modify the generated Mesh.
|
||||
/// It works well not only for standard Graphic components (Image, RawImage, Text, etc.) but also for TextMeshPro and TextMeshProUGUI.
|
||||
/// </summary>
|
||||
[ExecuteInEditMode]
|
||||
public abstract class BaseMeshEffect : UIBehaviour, IMeshModifier
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
#if TMP_PRESENT
|
||||
static readonly List<Vector2> s_Uv0 = new List<Vector2> (4096);
|
||||
static readonly List<Vector2> s_Uv1 = new List<Vector2> (4096);
|
||||
#if UNITY_2017_1_OR_NEWER
|
||||
#if UNITY_2017_1_OR_NEWER
|
||||
static readonly List<Vector2> s_Uv2 = new List<Vector2> (4096);
|
||||
static readonly List<Vector2> s_Uv3 = new List<Vector2> (4096);
|
||||
#endif
|
||||
#endif
|
||||
static readonly List<Vector3> s_Vertices = new List<Vector3> (4096);
|
||||
static readonly List<int> s_Indices = new List<int> (4096);
|
||||
static readonly List<Vector3> s_Normals = new List<Vector3> (4096);
|
||||
@ -42,21 +42,21 @@ namespace Coffee.UIExtensions
|
||||
static readonly List<UIVertex> s_UIVertices = new List<UIVertex> (4096);
|
||||
static readonly List<BaseMeshEffect> s_TmpEffects = new List<BaseMeshEffect>(4);
|
||||
#endif
|
||||
static readonly Material [] s_EmptyMaterials = new Material [0];
|
||||
static readonly Material[] s_EmptyMaterials = new Material[0];
|
||||
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// The Graphic attached to this GameObject.
|
||||
/// </summary>
|
||||
public Graphic graphic { get { Initialize (); return _graphic; } }
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// The Graphic attached to this GameObject.
|
||||
/// </summary>
|
||||
public Graphic graphic { get { Initialize(); return _graphic; } }
|
||||
|
||||
/// <summary>
|
||||
/// The CanvasRenderer attached to this GameObject.
|
||||
/// </summary>
|
||||
public CanvasRenderer canvasRenderer { get { Initialize (); return _canvasRenderer; } }
|
||||
/// <summary>
|
||||
/// The CanvasRenderer attached to this GameObject.
|
||||
/// </summary>
|
||||
public CanvasRenderer canvasRenderer { get { Initialize(); return _canvasRenderer; } }
|
||||
|
||||
#if TMP_PRESENT
|
||||
/// <summary>
|
||||
@ -65,40 +65,40 @@ namespace Coffee.UIExtensions
|
||||
public TMP_Text textMeshPro { get { Initialize (); return _textMeshPro; } }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// The RectTransform attached to this GameObject.
|
||||
/// </summary>
|
||||
public RectTransform rectTransform { get { Initialize (); return _rectTransform; } }
|
||||
/// <summary>
|
||||
/// The RectTransform attached to this GameObject.
|
||||
/// </summary>
|
||||
public RectTransform rectTransform { get { Initialize(); return _rectTransform; } }
|
||||
|
||||
#if UNITY_5_6_OR_NEWER
|
||||
/// <summary>
|
||||
/// Additional canvas shader channels to use this component.
|
||||
/// </summary>
|
||||
public virtual AdditionalCanvasShaderChannels requiredChannels { get { return AdditionalCanvasShaderChannels.None; } }
|
||||
/// <summary>
|
||||
/// Additional canvas shader channels to use this component.
|
||||
/// </summary>
|
||||
public virtual AdditionalCanvasShaderChannels requiredChannels { get { return AdditionalCanvasShaderChannels.None; } }
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Is TextMeshPro or TextMeshProUGUI attached to this GameObject?
|
||||
/// </summary>
|
||||
public bool isTMPro
|
||||
{
|
||||
get
|
||||
{
|
||||
/// <summary>
|
||||
/// Is TextMeshPro or TextMeshProUGUI attached to this GameObject?
|
||||
/// </summary>
|
||||
public bool isTMPro
|
||||
{
|
||||
get
|
||||
{
|
||||
#if TMP_PRESENT
|
||||
return textMeshPro != null;
|
||||
#else
|
||||
return false;
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The material for rendering.
|
||||
/// </summary>
|
||||
public virtual Material material
|
||||
{
|
||||
get
|
||||
{
|
||||
/// <summary>
|
||||
/// The material for rendering.
|
||||
/// </summary>
|
||||
public virtual Material material
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
#if TMP_PRESENT
|
||||
if (textMeshPro)
|
||||
@ -107,17 +107,17 @@ namespace Coffee.UIExtensions
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (graphic)
|
||||
{
|
||||
return graphic.material;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
set
|
||||
{
|
||||
if (graphic)
|
||||
{
|
||||
return graphic.material;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
set
|
||||
{
|
||||
#if TMP_PRESENT
|
||||
if (textMeshPro)
|
||||
{
|
||||
@ -125,17 +125,17 @@ namespace Coffee.UIExtensions
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (graphic)
|
||||
{
|
||||
graphic.material = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (graphic)
|
||||
{
|
||||
graphic.material = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public virtual Material[] materials
|
||||
{
|
||||
get
|
||||
{
|
||||
public virtual Material[] materials
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
#if TMP_PRESENT
|
||||
if (textMeshPro)
|
||||
@ -144,39 +144,39 @@ namespace Coffee.UIExtensions
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (graphic)
|
||||
{
|
||||
_materials [0] = graphic.material;
|
||||
return _materials;
|
||||
}
|
||||
else
|
||||
{
|
||||
return s_EmptyMaterials;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (graphic)
|
||||
{
|
||||
_materials[0] = graphic.material;
|
||||
return _materials;
|
||||
}
|
||||
else
|
||||
{
|
||||
return s_EmptyMaterials;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Call used to modify mesh. (legacy)
|
||||
/// </summary>
|
||||
/// <param name="mesh">Mesh.</param>
|
||||
public virtual void ModifyMesh (Mesh mesh)
|
||||
{
|
||||
}
|
||||
/// <summary>
|
||||
/// Call used to modify mesh. (legacy)
|
||||
/// </summary>
|
||||
/// <param name="mesh">Mesh.</param>
|
||||
public virtual void ModifyMesh(Mesh mesh)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Call used to modify mesh.
|
||||
/// </summary>
|
||||
/// <param name="vh">VertexHelper.</param>
|
||||
public virtual void ModifyMesh (VertexHelper vh)
|
||||
{
|
||||
}
|
||||
/// <summary>
|
||||
/// Call used to modify mesh.
|
||||
/// </summary>
|
||||
/// <param name="vh">VertexHelper.</param>
|
||||
public virtual void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mark the vertices as dirty.
|
||||
/// </summary>
|
||||
public virtual void SetVerticesDirty ()
|
||||
{
|
||||
/// <summary>
|
||||
/// Mark the vertices as dirty.
|
||||
/// </summary>
|
||||
public virtual void SetVerticesDirty()
|
||||
{
|
||||
#if TMP_PRESENT
|
||||
if (textMeshPro)
|
||||
{
|
||||
@ -211,14 +211,14 @@ namespace Coffee.UIExtensions
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (graphic)
|
||||
{
|
||||
graphic.SetVerticesDirty ();
|
||||
}
|
||||
}
|
||||
if (graphic)
|
||||
{
|
||||
graphic.SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowTMProWarning (Shader shader, Shader mobileShader, Shader spriteShader, System.Action<Material> onCreatedMaterial)
|
||||
{
|
||||
public void ShowTMProWarning(Shader shader, Shader mobileShader, Shader spriteShader, System.Action<Material> onCreatedMaterial)
|
||||
{
|
||||
#if UNITY_EDITOR && TMP_PRESENT
|
||||
if(!textMeshPro || !textMeshPro.fontSharedMaterial)
|
||||
{
|
||||
@ -312,39 +312,39 @@ namespace Coffee.UIExtensions
|
||||
EditorUtility.SetDirty (spriteAsset);
|
||||
return spriteAsset;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//################################
|
||||
// Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Should the effect modify the mesh directly for TMPro?
|
||||
/// </summary>
|
||||
protected virtual bool isLegacyMeshModifier { get { return false; } }
|
||||
//################################
|
||||
// Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Should the effect modify the mesh directly for TMPro?
|
||||
/// </summary>
|
||||
protected virtual bool isLegacyMeshModifier { get { return false; } }
|
||||
|
||||
|
||||
protected virtual void Initialize ()
|
||||
{
|
||||
if (!_initialized)
|
||||
{
|
||||
_initialized = true;
|
||||
_graphic = _graphic ?? GetComponent<Graphic> ();
|
||||
_canvasRenderer = _canvasRenderer ?? GetComponent<CanvasRenderer> ();
|
||||
_rectTransform = _rectTransform ?? GetComponent<RectTransform> ();
|
||||
protected virtual void Initialize()
|
||||
{
|
||||
if (!_initialized)
|
||||
{
|
||||
_initialized = true;
|
||||
_graphic = _graphic ?? GetComponent<Graphic>();
|
||||
_canvasRenderer = _canvasRenderer ?? GetComponent<CanvasRenderer>();
|
||||
_rectTransform = _rectTransform ?? GetComponent<RectTransform>();
|
||||
#if TMP_PRESENT
|
||||
_textMeshPro = _textMeshPro ?? GetComponent<TMP_Text> ();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable ()
|
||||
{
|
||||
_initialized = false;
|
||||
SetVerticesDirty ();
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
_initialized = false;
|
||||
SetVerticesDirty();
|
||||
#if TMP_PRESENT
|
||||
if (textMeshPro)
|
||||
{
|
||||
@ -360,27 +360,27 @@ namespace Coffee.UIExtensions
|
||||
#endif
|
||||
|
||||
#if UNITY_5_6_OR_NEWER
|
||||
if (graphic)
|
||||
{
|
||||
AdditionalCanvasShaderChannels channels = requiredChannels;
|
||||
var canvas = graphic.canvas;
|
||||
if (canvas && (canvas.additionalShaderChannels & channels) != channels)
|
||||
{
|
||||
Debug.LogWarningFormat (this, "Enable {1} of Canvas.additionalShaderChannels to use {0}.", GetType ().Name, channels);
|
||||
}
|
||||
}
|
||||
if (graphic)
|
||||
{
|
||||
AdditionalCanvasShaderChannels channels = requiredChannels;
|
||||
var canvas = graphic.canvas;
|
||||
if (canvas && (canvas.additionalShaderChannels & channels) != channels)
|
||||
{
|
||||
Debug.LogWarningFormat(this, "Enable {1} of Canvas.additionalShaderChannels to use {0}.", GetType().Name, channels);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the behaviour becomes disabled () or inactive.
|
||||
/// </summary>
|
||||
protected override void OnDisable ()
|
||||
{
|
||||
/// <summary>
|
||||
/// This function is called when the behaviour becomes disabled () or inactive.
|
||||
/// </summary>
|
||||
protected override void OnDisable()
|
||||
{
|
||||
#if TMP_PRESENT
|
||||
TMPro_EventManager.TEXT_CHANGED_EVENT.Remove (OnTextChanged);
|
||||
#endif
|
||||
SetVerticesDirty ();
|
||||
SetVerticesDirty();
|
||||
|
||||
#if UNITY_EDITOR && TMP_PRESENT
|
||||
if (graphic && textMeshPro)
|
||||
@ -388,14 +388,14 @@ namespace Coffee.UIExtensions
|
||||
GraphicRebuildTracker.UnTrackGraphic (graphic);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// LateUpdate is called every frame, if the Behaviour is enabled.
|
||||
/// </summary>
|
||||
protected virtual void LateUpdate ()
|
||||
{
|
||||
/// <summary>
|
||||
/// LateUpdate is called every frame, if the Behaviour is enabled.
|
||||
/// </summary>
|
||||
protected virtual void LateUpdate()
|
||||
{
|
||||
#if TMP_PRESENT
|
||||
if (textMeshPro)
|
||||
{
|
||||
@ -406,35 +406,35 @@ namespace Coffee.UIExtensions
|
||||
_isTextMeshProActive = textMeshPro.isActiveAndEnabled;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Callback for when properties have been changed by animation.
|
||||
/// </summary>
|
||||
protected override void OnDidApplyAnimationProperties ()
|
||||
{
|
||||
SetVerticesDirty ();
|
||||
}
|
||||
/// <summary>
|
||||
/// Callback for when properties have been changed by animation.
|
||||
/// </summary>
|
||||
protected override void OnDidApplyAnimationProperties()
|
||||
{
|
||||
SetVerticesDirty();
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
/// <summary>
|
||||
/// This function is called when the script is loaded or a value is changed in the inspector (Called in the editor only).
|
||||
/// </summary>
|
||||
protected override void OnValidate ()
|
||||
{
|
||||
SetVerticesDirty ();
|
||||
}
|
||||
/// <summary>
|
||||
/// This function is called when the script is loaded or a value is changed in the inspector (Called in the editor only).
|
||||
/// </summary>
|
||||
protected override void OnValidate()
|
||||
{
|
||||
SetVerticesDirty();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
bool _initialized;
|
||||
CanvasRenderer _canvasRenderer;
|
||||
RectTransform _rectTransform;
|
||||
Graphic _graphic;
|
||||
Material [] _materials = new Material [1];
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
bool _initialized;
|
||||
CanvasRenderer _canvasRenderer;
|
||||
RectTransform _rectTransform;
|
||||
Graphic _graphic;
|
||||
Material[] _materials = new Material[1];
|
||||
|
||||
#if TMP_PRESENT
|
||||
bool _isTextMeshProActive;
|
||||
@ -532,12 +532,12 @@ namespace Coffee.UIExtensions
|
||||
mesh.GetTangents (s_Tangents);
|
||||
mesh.GetIndices (s_Indices, 0);
|
||||
|
||||
#if UNITY_2017_1_OR_NEWER
|
||||
#if UNITY_2017_1_OR_NEWER
|
||||
mesh.GetUVs (2, s_Uv2);
|
||||
mesh.GetUVs (3, s_Uv3);
|
||||
bool useUv2 = 0 < s_Uv2.Count;
|
||||
bool useUv3 = 0 < s_Uv3.Count;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
s_UIVertices.Clear();
|
||||
UIVertex v = default(UIVertex);
|
||||
@ -547,12 +547,12 @@ namespace Coffee.UIExtensions
|
||||
v.color = s_Colors[i];
|
||||
v.uv0 = s_Uv0[i];
|
||||
v.uv1 = s_Uv1[i];
|
||||
#if UNITY_2017_1_OR_NEWER
|
||||
#if UNITY_2017_1_OR_NEWER
|
||||
if (useUv2 && i < s_Uv2.Count)
|
||||
v.uv2 = s_Uv2[i];
|
||||
if (useUv3 && i < s_Uv3.Count)
|
||||
v.uv3 = s_Uv3[i];
|
||||
#endif
|
||||
#endif
|
||||
v.normal = s_Normals[i];
|
||||
v.tangent = s_Tangents[i];
|
||||
|
||||
@ -561,5 +561,5 @@ namespace Coffee.UIExtensions
|
||||
s_VertexHelper.AddUIVertexStream(s_UIVertices, s_Indices);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Blur effect mode.
|
||||
/// </summary>
|
||||
public enum BlurMode
|
||||
{
|
||||
None = 0,
|
||||
FastBlur = 1,
|
||||
MediumBlur = 2,
|
||||
DetailBlur = 3,
|
||||
}
|
||||
/// <summary>
|
||||
/// Blur effect mode.
|
||||
/// </summary>
|
||||
public enum BlurMode
|
||||
{
|
||||
None = 0,
|
||||
FastBlur = 1,
|
||||
MediumBlur = 2,
|
||||
DetailBlur = 3,
|
||||
}
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Color effect mode.
|
||||
/// </summary>
|
||||
public enum ColorMode
|
||||
{
|
||||
Multiply = 0,
|
||||
Fill = 1,
|
||||
Add = 2,
|
||||
Subtract = 3,
|
||||
}
|
||||
/// <summary>
|
||||
/// Color effect mode.
|
||||
/// </summary>
|
||||
public enum ColorMode
|
||||
{
|
||||
Multiply = 0,
|
||||
Fill = 1,
|
||||
Add = 2,
|
||||
Subtract = 3,
|
||||
}
|
||||
}
|
@ -3,110 +3,110 @@ using UnityEngine.UI;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Area for effect.
|
||||
/// </summary>
|
||||
public enum EffectArea
|
||||
{
|
||||
RectTransform,
|
||||
Fit,
|
||||
Character,
|
||||
}
|
||||
/// <summary>
|
||||
/// Area for effect.
|
||||
/// </summary>
|
||||
public enum EffectArea
|
||||
{
|
||||
RectTransform,
|
||||
Fit,
|
||||
Character,
|
||||
}
|
||||
|
||||
public static class EffectAreaExtensions
|
||||
{
|
||||
static readonly Rect rectForCharacter = new Rect(0, 0, 1, 1);
|
||||
static readonly Vector2 [] splitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero };
|
||||
public static class EffectAreaExtensions
|
||||
{
|
||||
static readonly Rect rectForCharacter = new Rect(0, 0, 1, 1);
|
||||
static readonly Vector2[] splitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero };
|
||||
|
||||
/// <summary>
|
||||
/// Gets effect for area.
|
||||
/// </summary>
|
||||
public static Rect GetEffectArea (this EffectArea area, VertexHelper vh, Rect rectangle, float aspectRatio = -1)
|
||||
{
|
||||
Rect rect = default(Rect);
|
||||
switch (area)
|
||||
{
|
||||
case EffectArea.RectTransform:
|
||||
rect = rectangle;
|
||||
break;
|
||||
case EffectArea.Character:
|
||||
rect = rectForCharacter;
|
||||
break;
|
||||
case EffectArea.Fit:
|
||||
// Fit to contents.
|
||||
UIVertex vertex = default (UIVertex);
|
||||
float xMin = float.MaxValue;
|
||||
float yMin = float.MaxValue;
|
||||
float xMax = float.MinValue;
|
||||
float yMax = float.MinValue;
|
||||
for (int i = 0; i < vh.currentVertCount; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
float x = vertex.position.x;
|
||||
float y = vertex.position.y;
|
||||
xMin = Mathf.Min(xMin, x);
|
||||
yMin = Mathf.Min(yMin, y);
|
||||
xMax = Mathf.Max(xMax, x);
|
||||
yMax = Mathf.Max(yMax, y);
|
||||
}
|
||||
rect.Set (xMin, yMin, xMax - xMin, yMax - yMin);
|
||||
break;
|
||||
default:
|
||||
rect = rectangle;
|
||||
break;
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets effect for area.
|
||||
/// </summary>
|
||||
public static Rect GetEffectArea(this EffectArea area, VertexHelper vh, Rect rectangle, float aspectRatio = -1)
|
||||
{
|
||||
Rect rect = default(Rect);
|
||||
switch (area)
|
||||
{
|
||||
case EffectArea.RectTransform:
|
||||
rect = rectangle;
|
||||
break;
|
||||
case EffectArea.Character:
|
||||
rect = rectForCharacter;
|
||||
break;
|
||||
case EffectArea.Fit:
|
||||
// Fit to contents.
|
||||
UIVertex vertex = default(UIVertex);
|
||||
float xMin = float.MaxValue;
|
||||
float yMin = float.MaxValue;
|
||||
float xMax = float.MinValue;
|
||||
float yMax = float.MinValue;
|
||||
for (int i = 0; i < vh.currentVertCount; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
float x = vertex.position.x;
|
||||
float y = vertex.position.y;
|
||||
xMin = Mathf.Min(xMin, x);
|
||||
yMin = Mathf.Min(yMin, y);
|
||||
xMax = Mathf.Max(xMax, x);
|
||||
yMax = Mathf.Max(yMax, y);
|
||||
}
|
||||
rect.Set(xMin, yMin, xMax - xMin, yMax - yMin);
|
||||
break;
|
||||
default:
|
||||
rect = rectangle;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if(0 < aspectRatio)
|
||||
{
|
||||
if (rect.width < rect.height)
|
||||
{
|
||||
rect.width = rect.height * aspectRatio;
|
||||
}
|
||||
else
|
||||
{
|
||||
rect.height = rect.width / aspectRatio;
|
||||
}
|
||||
}
|
||||
return rect;
|
||||
}
|
||||
if (0 < aspectRatio)
|
||||
{
|
||||
if (rect.width < rect.height)
|
||||
{
|
||||
rect.width = rect.height * aspectRatio;
|
||||
}
|
||||
else
|
||||
{
|
||||
rect.height = rect.width / aspectRatio;
|
||||
}
|
||||
}
|
||||
return rect;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets position factor for area.
|
||||
/// </summary>
|
||||
public static void GetPositionFactor (this EffectArea area, int index, Rect rect, Vector2 position, bool isText, bool isTMPro, out float x, out float y)
|
||||
{
|
||||
if (isText && area == EffectArea.Character)
|
||||
{
|
||||
index = isTMPro ? (index + 3) % 4 : index % 4;
|
||||
x = splitedCharacterPosition [index].x;
|
||||
y = splitedCharacterPosition [index].y;
|
||||
}
|
||||
else if (area == EffectArea.Fit)
|
||||
{
|
||||
x = Mathf.Clamp01 ((position.x - rect.xMin) / rect.width);
|
||||
y = Mathf.Clamp01 ((position.y - rect.yMin) / rect.height);
|
||||
}
|
||||
else
|
||||
{
|
||||
x = Mathf.Clamp01 (position.x / rect.width + 0.5f);
|
||||
y = Mathf.Clamp01 (position.y / rect.height + 0.5f);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets position factor for area.
|
||||
/// </summary>
|
||||
public static void GetPositionFactor(this EffectArea area, int index, Rect rect, Vector2 position, bool isText, bool isTMPro, out float x, out float y)
|
||||
{
|
||||
if (isText && area == EffectArea.Character)
|
||||
{
|
||||
index = isTMPro ? (index + 3) % 4 : index % 4;
|
||||
x = splitedCharacterPosition[index].x;
|
||||
y = splitedCharacterPosition[index].y;
|
||||
}
|
||||
else if (area == EffectArea.Fit)
|
||||
{
|
||||
x = Mathf.Clamp01((position.x - rect.xMin) / rect.width);
|
||||
y = Mathf.Clamp01((position.y - rect.yMin) / rect.height);
|
||||
}
|
||||
else
|
||||
{
|
||||
x = Mathf.Clamp01(position.x / rect.width + 0.5f);
|
||||
y = Mathf.Clamp01(position.y / rect.height + 0.5f);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Normalize vertex position by local matrix.
|
||||
/// </summary>
|
||||
public static void GetNormalizedFactor (this EffectArea area, int index, Matrix2x3 matrix, Vector2 position, bool isText, out Vector2 nomalizedPos)
|
||||
{
|
||||
if (isText && area == EffectArea.Character)
|
||||
{
|
||||
nomalizedPos = matrix * splitedCharacterPosition [(index + 3) % 4];
|
||||
}
|
||||
else
|
||||
{
|
||||
nomalizedPos = matrix * position;
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Normalize vertex position by local matrix.
|
||||
/// </summary>
|
||||
public static void GetNormalizedFactor(this EffectArea area, int index, Matrix2x3 matrix, Vector2 position, bool isText, out Vector2 nomalizedPos)
|
||||
{
|
||||
if (isText && area == EffectArea.Character)
|
||||
{
|
||||
nomalizedPos = matrix * splitedCharacterPosition[(index + 3) % 4];
|
||||
}
|
||||
else
|
||||
{
|
||||
nomalizedPos = matrix * position;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,156 +1,156 @@
|
||||
using UnityEngine;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Effect player.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class EffectPlayer
|
||||
{
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether is playing.
|
||||
/// </summary>
|
||||
[Header("Effect Player")]
|
||||
[Tooltip("Playing.")]
|
||||
public bool play = false;
|
||||
/// <summary>
|
||||
/// Effect player.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class EffectPlayer
|
||||
{
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether is playing.
|
||||
/// </summary>
|
||||
[Header("Effect Player")]
|
||||
[Tooltip("Playing.")]
|
||||
public bool play = false;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the delay before looping.
|
||||
/// </summary>
|
||||
[Tooltip("Initial play delay.")]
|
||||
[Range(0f, 10f)]
|
||||
public float initialPlayDelay = 0;
|
||||
/// <summary>
|
||||
/// Gets or sets the delay before looping.
|
||||
/// </summary>
|
||||
[Tooltip("Initial play delay.")]
|
||||
[Range(0f, 10f)]
|
||||
public float initialPlayDelay = 0;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the duration.
|
||||
/// </summary>
|
||||
[Tooltip("Duration.")]
|
||||
[Range(0.01f,10f)]
|
||||
public float duration = 1;
|
||||
/// <summary>
|
||||
/// Gets or sets the duration.
|
||||
/// </summary>
|
||||
[Tooltip("Duration.")]
|
||||
[Range(0.01f, 10f)]
|
||||
public float duration = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether can loop.
|
||||
/// </summary>
|
||||
[Tooltip("Loop.")]
|
||||
public bool loop = false;
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether can loop.
|
||||
/// </summary>
|
||||
[Tooltip("Loop.")]
|
||||
public bool loop = false;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the delay before looping.
|
||||
/// </summary>
|
||||
[Tooltip("Delay before looping.")]
|
||||
[Range(0f,10f)]
|
||||
public float loopDelay = 0;
|
||||
/// <summary>
|
||||
/// Gets or sets the delay before looping.
|
||||
/// </summary>
|
||||
[Tooltip("Delay before looping.")]
|
||||
[Range(0f, 10f)]
|
||||
public float loopDelay = 0;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the update mode.
|
||||
/// </summary>
|
||||
[Tooltip("Update mode")]
|
||||
public AnimatorUpdateMode updateMode = AnimatorUpdateMode.Normal;
|
||||
/// <summary>
|
||||
/// Gets or sets the update mode.
|
||||
/// </summary>
|
||||
[Tooltip("Update mode")]
|
||||
public AnimatorUpdateMode updateMode = AnimatorUpdateMode.Normal;
|
||||
|
||||
static List<Action> s_UpdateActions;
|
||||
static List<Action> s_UpdateActions;
|
||||
|
||||
/// <summary>
|
||||
/// Register player.
|
||||
/// </summary>
|
||||
public void OnEnable(Action<float> callback = null)
|
||||
{
|
||||
/// <summary>
|
||||
/// Register player.
|
||||
/// </summary>
|
||||
public void OnEnable(Action<float> callback = null)
|
||||
{
|
||||
|
||||
if (s_UpdateActions == null)
|
||||
{
|
||||
s_UpdateActions = new List<Action>();
|
||||
Canvas.willRenderCanvases += () =>
|
||||
{
|
||||
var count = s_UpdateActions.Count;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
s_UpdateActions[i].Invoke();
|
||||
}
|
||||
};
|
||||
}
|
||||
s_UpdateActions.Add(OnWillRenderCanvases);
|
||||
if (s_UpdateActions == null)
|
||||
{
|
||||
s_UpdateActions = new List<Action>();
|
||||
Canvas.willRenderCanvases += () =>
|
||||
{
|
||||
var count = s_UpdateActions.Count;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
s_UpdateActions[i].Invoke();
|
||||
}
|
||||
};
|
||||
}
|
||||
s_UpdateActions.Add(OnWillRenderCanvases);
|
||||
|
||||
if (play)
|
||||
{
|
||||
_time = -initialPlayDelay;
|
||||
}
|
||||
else
|
||||
{
|
||||
_time = 0;
|
||||
}
|
||||
_callback = callback;
|
||||
}
|
||||
if (play)
|
||||
{
|
||||
_time = -initialPlayDelay;
|
||||
}
|
||||
else
|
||||
{
|
||||
_time = 0;
|
||||
}
|
||||
_callback = callback;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unregister player.
|
||||
/// </summary>
|
||||
public void OnDisable()
|
||||
{
|
||||
_callback = null;
|
||||
s_UpdateActions.Remove(OnWillRenderCanvases);
|
||||
}
|
||||
/// <summary>
|
||||
/// Unregister player.
|
||||
/// </summary>
|
||||
public void OnDisable()
|
||||
{
|
||||
_callback = null;
|
||||
s_UpdateActions.Remove(OnWillRenderCanvases);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Start playing.
|
||||
/// </summary>
|
||||
public void Play(bool reset, Action<float> callback = null)
|
||||
{
|
||||
if (reset)
|
||||
{
|
||||
_time = 0;
|
||||
}
|
||||
play = true;
|
||||
if (callback != null)
|
||||
{
|
||||
_callback = callback;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Start playing.
|
||||
/// </summary>
|
||||
public void Play(bool reset, Action<float> callback = null)
|
||||
{
|
||||
if (reset)
|
||||
{
|
||||
_time = 0;
|
||||
}
|
||||
play = true;
|
||||
if (callback != null)
|
||||
{
|
||||
_callback = callback;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stop playing.
|
||||
/// </summary>
|
||||
public void Stop(bool reset)
|
||||
{
|
||||
if (reset)
|
||||
{
|
||||
_time = 0;
|
||||
if (_callback != null)
|
||||
{
|
||||
_callback(_time);
|
||||
}
|
||||
}
|
||||
play = false;
|
||||
}
|
||||
/// <summary>
|
||||
/// Stop playing.
|
||||
/// </summary>
|
||||
public void Stop(bool reset)
|
||||
{
|
||||
if (reset)
|
||||
{
|
||||
_time = 0;
|
||||
if (_callback != null)
|
||||
{
|
||||
_callback(_time);
|
||||
}
|
||||
}
|
||||
play = false;
|
||||
}
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
float _time = 0;
|
||||
Action<float> _callback;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
float _time = 0;
|
||||
Action<float> _callback;
|
||||
|
||||
void OnWillRenderCanvases()
|
||||
{
|
||||
if (!play || !Application.isPlaying || _callback == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
void OnWillRenderCanvases()
|
||||
{
|
||||
if (!play || !Application.isPlaying || _callback == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_time += updateMode == AnimatorUpdateMode.UnscaledTime
|
||||
? Time.unscaledDeltaTime
|
||||
: Time.deltaTime;
|
||||
var current = _time / duration;
|
||||
_time += updateMode == AnimatorUpdateMode.UnscaledTime
|
||||
? Time.unscaledDeltaTime
|
||||
: Time.deltaTime;
|
||||
var current = _time / duration;
|
||||
|
||||
if (duration <= _time)
|
||||
{
|
||||
play = loop;
|
||||
_time = loop ? -loopDelay : 0;
|
||||
}
|
||||
_callback(current);
|
||||
}
|
||||
}
|
||||
if (duration <= _time)
|
||||
{
|
||||
play = loop;
|
||||
_time = loop ? -loopDelay : 0;
|
||||
}
|
||||
_callback(current);
|
||||
}
|
||||
}
|
||||
}
|
@ -4,92 +4,92 @@ using UnityEngine;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
public class MaterialCache
|
||||
{
|
||||
public ulong hash { get; private set; }
|
||||
public class MaterialCache
|
||||
{
|
||||
public ulong hash { get; private set; }
|
||||
|
||||
public int referenceCount { get; private set; }
|
||||
public int referenceCount { get; private set; }
|
||||
|
||||
public Texture texture { get; private set; }
|
||||
public Texture texture { get; private set; }
|
||||
|
||||
public Material material { get; private set; }
|
||||
public Material material { get; private set; }
|
||||
|
||||
#if UNITY_EDITOR
|
||||
[UnityEditor.InitializeOnLoadMethod]
|
||||
static void ClearCache()
|
||||
{
|
||||
foreach (var cache in materialCaches)
|
||||
{
|
||||
cache.material = null;
|
||||
}
|
||||
materialCaches.Clear();
|
||||
}
|
||||
[UnityEditor.InitializeOnLoadMethod]
|
||||
static void ClearCache()
|
||||
{
|
||||
foreach (var cache in materialCaches)
|
||||
{
|
||||
cache.material = null;
|
||||
}
|
||||
materialCaches.Clear();
|
||||
}
|
||||
#endif
|
||||
|
||||
public static List<MaterialCache> materialCaches = new List<MaterialCache>();
|
||||
public static List<MaterialCache> materialCaches = new List<MaterialCache>();
|
||||
|
||||
public static MaterialCache Register(ulong hash, Texture texture, System.Func<Material> onCreateMaterial)
|
||||
{
|
||||
var cache = materialCaches.FirstOrDefault(x => x.hash == hash);
|
||||
if (cache != null && cache.material)
|
||||
{
|
||||
if (cache.material)
|
||||
{
|
||||
cache.referenceCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
materialCaches.Remove(cache);
|
||||
cache = null;
|
||||
}
|
||||
}
|
||||
if (cache == null)
|
||||
{
|
||||
cache = new MaterialCache()
|
||||
{
|
||||
hash = hash,
|
||||
material = onCreateMaterial(),
|
||||
referenceCount = 1,
|
||||
};
|
||||
materialCaches.Add(cache);
|
||||
}
|
||||
return cache;
|
||||
}
|
||||
public static MaterialCache Register(ulong hash, Texture texture, System.Func<Material> onCreateMaterial)
|
||||
{
|
||||
var cache = materialCaches.FirstOrDefault(x => x.hash == hash);
|
||||
if (cache != null && cache.material)
|
||||
{
|
||||
if (cache.material)
|
||||
{
|
||||
cache.referenceCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
public static MaterialCache Register(ulong hash, System.Func<Material> onCreateMaterial)
|
||||
{
|
||||
var cache = materialCaches.FirstOrDefault(x => x.hash == hash);
|
||||
if (cache != null)
|
||||
{
|
||||
cache.referenceCount++;
|
||||
}
|
||||
if (cache == null)
|
||||
{
|
||||
cache = new MaterialCache()
|
||||
{
|
||||
hash = hash,
|
||||
material = onCreateMaterial(),
|
||||
referenceCount = 1,
|
||||
};
|
||||
materialCaches.Add(cache);
|
||||
}
|
||||
return cache;
|
||||
}
|
||||
materialCaches.Remove(cache);
|
||||
cache = null;
|
||||
}
|
||||
}
|
||||
if (cache == null)
|
||||
{
|
||||
cache = new MaterialCache()
|
||||
{
|
||||
hash = hash,
|
||||
material = onCreateMaterial(),
|
||||
referenceCount = 1,
|
||||
};
|
||||
materialCaches.Add(cache);
|
||||
}
|
||||
return cache;
|
||||
}
|
||||
|
||||
public static void Unregister(MaterialCache cache)
|
||||
{
|
||||
if (cache == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
public static MaterialCache Register(ulong hash, System.Func<Material> onCreateMaterial)
|
||||
{
|
||||
var cache = materialCaches.FirstOrDefault(x => x.hash == hash);
|
||||
if (cache != null)
|
||||
{
|
||||
cache.referenceCount++;
|
||||
}
|
||||
if (cache == null)
|
||||
{
|
||||
cache = new MaterialCache()
|
||||
{
|
||||
hash = hash,
|
||||
material = onCreateMaterial(),
|
||||
referenceCount = 1,
|
||||
};
|
||||
materialCaches.Add(cache);
|
||||
}
|
||||
return cache;
|
||||
}
|
||||
|
||||
cache.referenceCount--;
|
||||
if (cache.referenceCount <= 0)
|
||||
{
|
||||
MaterialCache.materialCaches.Remove(cache);
|
||||
cache.material = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void Unregister(MaterialCache cache)
|
||||
{
|
||||
if (cache == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
cache.referenceCount--;
|
||||
if (cache.referenceCount <= 0)
|
||||
{
|
||||
MaterialCache.materialCaches.Remove(cache);
|
||||
cache.material = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
#if UNITY_EDITOR
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using UnityEditor;
|
||||
@ -8,119 +8,119 @@ using UnityEngine;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
public class MaterialResolver
|
||||
{
|
||||
static readonly StringBuilder s_StringBuilder = new StringBuilder();
|
||||
public class MaterialResolver
|
||||
{
|
||||
static readonly StringBuilder s_StringBuilder = new StringBuilder();
|
||||
|
||||
static readonly Dictionary<string, Material> s_MaterialMap = new Dictionary<string, Material>();
|
||||
static readonly Dictionary<string, Material> s_MaterialMap = new Dictionary<string, Material>();
|
||||
|
||||
public static Material GetOrGenerateMaterialVariant(Shader shader, params object[] append)
|
||||
{
|
||||
if (!shader)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
public static Material GetOrGenerateMaterialVariant(Shader shader, params object[] append)
|
||||
{
|
||||
if (!shader)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
Material mat = null;
|
||||
string variantName = GetVariantName(shader, append);
|
||||
if (s_MaterialMap.TryGetValue(variantName, out mat) && mat)
|
||||
{
|
||||
return mat;
|
||||
}
|
||||
Material mat = null;
|
||||
string variantName = GetVariantName(shader, append);
|
||||
if (s_MaterialMap.TryGetValue(variantName, out mat) && mat)
|
||||
{
|
||||
return mat;
|
||||
}
|
||||
|
||||
string[] keywords = append.Where(x => 0 < (int)x)
|
||||
.Select(x => x.ToString().ToUpper())
|
||||
.ToArray();
|
||||
mat = GetMaterial(shader, append);
|
||||
if (mat)
|
||||
{
|
||||
if (!mat.shaderKeywords.OrderBy(x => x).SequenceEqual(keywords.OrderBy(x => x)))
|
||||
{
|
||||
mat.shaderKeywords = keywords;
|
||||
EditorUtility.SetDirty(mat);
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
EditorApplication.delayCall += AssetDatabase.SaveAssets;
|
||||
}
|
||||
}
|
||||
return mat;
|
||||
}
|
||||
string[] keywords = append.Where(x => 0 < (int)x)
|
||||
.Select(x => x.ToString().ToUpper())
|
||||
.ToArray();
|
||||
mat = GetMaterial(shader, append);
|
||||
if (mat)
|
||||
{
|
||||
if (!mat.shaderKeywords.OrderBy(x => x).SequenceEqual(keywords.OrderBy(x => x)))
|
||||
{
|
||||
mat.shaderKeywords = keywords;
|
||||
EditorUtility.SetDirty(mat);
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
EditorApplication.delayCall += AssetDatabase.SaveAssets;
|
||||
}
|
||||
}
|
||||
return mat;
|
||||
}
|
||||
|
||||
if (s_MaterialMap.TryGetValue(variantName, out mat) && mat)
|
||||
{
|
||||
return mat;
|
||||
}
|
||||
if (s_MaterialMap.TryGetValue(variantName, out mat) && mat)
|
||||
{
|
||||
return mat;
|
||||
}
|
||||
|
||||
Debug.Log("Generate material : " + variantName);
|
||||
mat = new Material(shader);
|
||||
mat.shaderKeywords = keywords;
|
||||
Debug.Log("Generate material : " + variantName);
|
||||
mat = new Material(shader);
|
||||
mat.shaderKeywords = keywords;
|
||||
|
||||
mat.name = variantName;
|
||||
mat.hideFlags |= HideFlags.NotEditable;
|
||||
s_MaterialMap[variantName] = mat;
|
||||
mat.name = variantName;
|
||||
mat.hideFlags |= HideFlags.NotEditable;
|
||||
s_MaterialMap[variantName] = mat;
|
||||
|
||||
bool isMainAsset = append.Cast<int>().All(x => x == 0);
|
||||
EditorApplication.delayCall += () => SaveMaterial(mat, shader, isMainAsset);
|
||||
return mat;
|
||||
}
|
||||
bool isMainAsset = append.Cast<int>().All(x => x == 0);
|
||||
EditorApplication.delayCall += () => SaveMaterial(mat, shader, isMainAsset);
|
||||
return mat;
|
||||
}
|
||||
|
||||
static void SaveMaterial(Material mat, Shader shader, bool isMainAsset)
|
||||
{
|
||||
string materialPath = GetDefaultMaterialPath(shader);
|
||||
static void SaveMaterial(Material mat, Shader shader, bool isMainAsset)
|
||||
{
|
||||
string materialPath = GetDefaultMaterialPath(shader);
|
||||
|
||||
#if UIEFFECT_SEPARATE
|
||||
string dir = Path.GetDirectoryName(materialPath);
|
||||
materialPath = Path.Combine(Path.Combine(dir, "Separated"), mat.name + ".mat");
|
||||
isMainAsset = true;
|
||||
#endif
|
||||
if (isMainAsset)
|
||||
{
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(materialPath));
|
||||
AssetDatabase.CreateAsset(mat, materialPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetOrGenerateMaterialVariant(shader);
|
||||
mat.hideFlags |= HideFlags.HideInHierarchy;
|
||||
AssetDatabase.AddObjectToAsset(mat, materialPath);
|
||||
}
|
||||
AssetDatabase.SaveAssets();
|
||||
}
|
||||
if (isMainAsset)
|
||||
{
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(materialPath));
|
||||
AssetDatabase.CreateAsset(mat, materialPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetOrGenerateMaterialVariant(shader);
|
||||
mat.hideFlags |= HideFlags.HideInHierarchy;
|
||||
AssetDatabase.AddObjectToAsset(mat, materialPath);
|
||||
}
|
||||
AssetDatabase.SaveAssets();
|
||||
}
|
||||
|
||||
public static Material GetMaterial(Shader shader, params object[] append)
|
||||
{
|
||||
string variantName = GetVariantName(shader, append);
|
||||
return AssetDatabase.FindAssets("t:Material " + Path.GetFileName(shader.name))
|
||||
.Select(x => AssetDatabase.GUIDToAssetPath(x))
|
||||
.SelectMany(x => AssetDatabase.LoadAllAssetsAtPath(x))
|
||||
.OfType<Material>()
|
||||
.FirstOrDefault(x => x.name == variantName);
|
||||
}
|
||||
public static Material GetMaterial(Shader shader, params object[] append)
|
||||
{
|
||||
string variantName = GetVariantName(shader, append);
|
||||
return AssetDatabase.FindAssets("t:Material " + Path.GetFileName(shader.name))
|
||||
.Select(x => AssetDatabase.GUIDToAssetPath(x))
|
||||
.SelectMany(x => AssetDatabase.LoadAllAssetsAtPath(x))
|
||||
.OfType<Material>()
|
||||
.FirstOrDefault(x => x.name == variantName);
|
||||
}
|
||||
|
||||
public static string GetDefaultMaterialPath(Shader shader)
|
||||
{
|
||||
var name = Path.GetFileName(shader.name);
|
||||
return AssetDatabase.FindAssets("t:Material " + name)
|
||||
.Select(x => AssetDatabase.GUIDToAssetPath(x))
|
||||
.FirstOrDefault(x => Path.GetFileNameWithoutExtension(x) == name)
|
||||
?? ("Assets/" + name + ".mat");
|
||||
}
|
||||
public static string GetDefaultMaterialPath(Shader shader)
|
||||
{
|
||||
var name = Path.GetFileName(shader.name);
|
||||
return AssetDatabase.FindAssets("t:Material " + name)
|
||||
.Select(x => AssetDatabase.GUIDToAssetPath(x))
|
||||
.FirstOrDefault(x => Path.GetFileNameWithoutExtension(x) == name)
|
||||
?? ("Assets/" + name + ".mat");
|
||||
}
|
||||
|
||||
public static string GetVariantName(Shader shader, params object[] append)
|
||||
{
|
||||
s_StringBuilder.Length = 0;
|
||||
public static string GetVariantName(Shader shader, params object[] append)
|
||||
{
|
||||
s_StringBuilder.Length = 0;
|
||||
|
||||
#if UIEFFECT_SEPARATE
|
||||
s_StringBuilder.Append("[Separated] ");
|
||||
#endif
|
||||
s_StringBuilder.Append(Path.GetFileName(shader.name));
|
||||
foreach (object mode in append.Where(x=>0<(int)x))
|
||||
{
|
||||
s_StringBuilder.Append("-");
|
||||
s_StringBuilder.Append(mode.ToString());
|
||||
}
|
||||
return s_StringBuilder.ToString();
|
||||
}
|
||||
}
|
||||
s_StringBuilder.Append(Path.GetFileName(shader.name));
|
||||
foreach (object mode in append.Where(x => 0 < (int)x))
|
||||
{
|
||||
s_StringBuilder.Append("-");
|
||||
s_StringBuilder.Append(mode.ToString());
|
||||
}
|
||||
return s_StringBuilder.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -2,32 +2,32 @@
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Matrix2x3.
|
||||
/// </summary>
|
||||
public struct Matrix2x3
|
||||
{
|
||||
public float m00, m01, m02, m10, m11, m12;
|
||||
/// <summary>
|
||||
/// Matrix2x3.
|
||||
/// </summary>
|
||||
public struct Matrix2x3
|
||||
{
|
||||
public float m00, m01, m02, m10, m11, m12;
|
||||
|
||||
public Matrix2x3(Rect rect, float cos, float sin)
|
||||
{
|
||||
const float center = 0.5f;
|
||||
float dx = -rect.xMin / rect.width - center;
|
||||
float dy = -rect.yMin / rect.height - center;
|
||||
m00 = cos / rect.width;
|
||||
m01 = -sin / rect.height;
|
||||
m02 = dx * cos - dy * sin + center;
|
||||
m10 = sin / rect.width;
|
||||
m11 = cos / rect.height;
|
||||
m12 = dx * sin + dy * cos + center;
|
||||
}
|
||||
public Matrix2x3(Rect rect, float cos, float sin)
|
||||
{
|
||||
const float center = 0.5f;
|
||||
float dx = -rect.xMin / rect.width - center;
|
||||
float dy = -rect.yMin / rect.height - center;
|
||||
m00 = cos / rect.width;
|
||||
m01 = -sin / rect.height;
|
||||
m02 = dx * cos - dy * sin + center;
|
||||
m10 = sin / rect.width;
|
||||
m11 = cos / rect.height;
|
||||
m12 = dx * sin + dy * cos + center;
|
||||
}
|
||||
|
||||
public static Vector2 operator*(Matrix2x3 m, Vector2 v)
|
||||
{
|
||||
return new Vector2(
|
||||
(m.m00 * v.x) + (m.m01 * v.y) + m.m02,
|
||||
(m.m10 * v.x) + (m.m11 * v.y) + m.m12
|
||||
);
|
||||
}
|
||||
}
|
||||
public static Vector2 operator *(Matrix2x3 m, Vector2 v)
|
||||
{
|
||||
return new Vector2(
|
||||
(m.m00 * v.x) + (m.m01 * v.y) + m.m02,
|
||||
(m.m10 * v.x) + (m.m11 * v.y) + m.m12
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,60 +1,58 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine;
|
||||
|
||||
public static class Packer
|
||||
{
|
||||
/// <summary>
|
||||
/// Pack 4 low-precision [0-1] floats values to a float.
|
||||
/// Each value [0-1] has 64 steps(6 bits).
|
||||
/// </summary>
|
||||
public static float ToFloat(float x, float y, float z, float w)
|
||||
{
|
||||
x = x < 0 ? 0 : 1 < x ? 1 : x;
|
||||
y = y < 0 ? 0 : 1 < y ? 1 : y;
|
||||
z = z < 0 ? 0 : 1 < z ? 1 : z;
|
||||
w = w < 0 ? 0 : 1 < w ? 1 : w;
|
||||
const int PRECISION = (1 << 6) - 1;
|
||||
return (Mathf.FloorToInt(w * PRECISION) << 18)
|
||||
+ (Mathf.FloorToInt(z * PRECISION) << 12)
|
||||
+ (Mathf.FloorToInt(y * PRECISION) << 6)
|
||||
+ Mathf.FloorToInt(x * PRECISION);
|
||||
}
|
||||
/// <summary>
|
||||
/// Pack 4 low-precision [0-1] floats values to a float.
|
||||
/// Each value [0-1] has 64 steps(6 bits).
|
||||
/// </summary>
|
||||
public static float ToFloat(float x, float y, float z, float w)
|
||||
{
|
||||
x = x < 0 ? 0 : 1 < x ? 1 : x;
|
||||
y = y < 0 ? 0 : 1 < y ? 1 : y;
|
||||
z = z < 0 ? 0 : 1 < z ? 1 : z;
|
||||
w = w < 0 ? 0 : 1 < w ? 1 : w;
|
||||
const int PRECISION = (1 << 6) - 1;
|
||||
return (Mathf.FloorToInt(w * PRECISION) << 18)
|
||||
+ (Mathf.FloorToInt(z * PRECISION) << 12)
|
||||
+ (Mathf.FloorToInt(y * PRECISION) << 6)
|
||||
+ Mathf.FloorToInt(x * PRECISION);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Pack 4 low-precision [0-1] floats values to a float.
|
||||
/// Each value [0-1] has 64 steps(6 bits).
|
||||
/// </summary>
|
||||
public static float ToFloat(Vector4 factor)
|
||||
{
|
||||
return ToFloat(Mathf.Clamp01(factor.x), Mathf.Clamp01(factor.y), Mathf.Clamp01(factor.z), Mathf.Clamp01(factor.w));
|
||||
}
|
||||
/// <summary>
|
||||
/// Pack 4 low-precision [0-1] floats values to a float.
|
||||
/// Each value [0-1] has 64 steps(6 bits).
|
||||
/// </summary>
|
||||
public static float ToFloat(Vector4 factor)
|
||||
{
|
||||
return ToFloat(Mathf.Clamp01(factor.x), Mathf.Clamp01(factor.y), Mathf.Clamp01(factor.z), Mathf.Clamp01(factor.w));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Pack 1 middle-precision & 2 low-precision [0-1] floats values to a float.
|
||||
/// z value [0-1] has 4096 steps(12 bits) and xy value [0-1] has 64 steps(6 bits).
|
||||
/// </summary>
|
||||
public static float ToFloat(float x, float y, float z)
|
||||
{
|
||||
x = x < 0 ? 0 : 1 < x ? 1 : x;
|
||||
y = y < 0 ? 0 : 1 < y ? 1 : y;
|
||||
z = z < 0 ? 0 : 1 < z ? 1 : z;
|
||||
const int PRECISION = (1 << 8) - 1;
|
||||
return (Mathf.FloorToInt(z * PRECISION) << 16)
|
||||
+ (Mathf.FloorToInt(y * PRECISION) << 8)
|
||||
+ Mathf.FloorToInt(x * PRECISION);
|
||||
}
|
||||
/// <summary>
|
||||
/// Pack 1 middle-precision & 2 low-precision [0-1] floats values to a float.
|
||||
/// z value [0-1] has 4096 steps(12 bits) and xy value [0-1] has 64 steps(6 bits).
|
||||
/// </summary>
|
||||
public static float ToFloat(float x, float y, float z)
|
||||
{
|
||||
x = x < 0 ? 0 : 1 < x ? 1 : x;
|
||||
y = y < 0 ? 0 : 1 < y ? 1 : y;
|
||||
z = z < 0 ? 0 : 1 < z ? 1 : z;
|
||||
const int PRECISION = (1 << 8) - 1;
|
||||
return (Mathf.FloorToInt(z * PRECISION) << 16)
|
||||
+ (Mathf.FloorToInt(y * PRECISION) << 8)
|
||||
+ Mathf.FloorToInt(x * PRECISION);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Pack 2 low-precision [0-1] floats values to a float.
|
||||
/// Each value [0-1] has 4096 steps(12 bits).
|
||||
/// </summary>
|
||||
public static float ToFloat(float x, float y)
|
||||
{
|
||||
x = x < 0 ? 0 : 1 < x ? 1 : x;
|
||||
y = y < 0 ? 0 : 1 < y ? 1 : y;
|
||||
const int PRECISION = (1 << 12) - 1;
|
||||
return (Mathf.FloorToInt(y * PRECISION) << 12)
|
||||
+ Mathf.FloorToInt(x * PRECISION);
|
||||
}
|
||||
/// <summary>
|
||||
/// Pack 2 low-precision [0-1] floats values to a float.
|
||||
/// Each value [0-1] has 4096 steps(12 bits).
|
||||
/// </summary>
|
||||
public static float ToFloat(float x, float y)
|
||||
{
|
||||
x = x < 0 ? 0 : 1 < x ? 1 : x;
|
||||
y = y < 0 ? 0 : 1 < y ? 1 : y;
|
||||
const int PRECISION = (1 << 12) - 1;
|
||||
return (Mathf.FloorToInt(y * PRECISION) << 12)
|
||||
+ Mathf.FloorToInt(x * PRECISION);
|
||||
}
|
||||
}
|
||||
|
@ -1,190 +1,188 @@
|
||||
using System.Collections;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using System;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
public interface IParameterTexture
|
||||
{
|
||||
int parameterIndex { get; set; }
|
||||
public interface IParameterTexture
|
||||
{
|
||||
int parameterIndex { get; set; }
|
||||
|
||||
ParameterTexture ptex { get; }
|
||||
}
|
||||
ParameterTexture ptex { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parameter texture.
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
public class ParameterTexture
|
||||
{
|
||||
/// <summary>
|
||||
/// Parameter texture.
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
public class ParameterTexture
|
||||
{
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="Coffee.UIExtensions.ParameterTexture"/> class.
|
||||
/// </summary>
|
||||
/// <param name="channels">Channels.</param>
|
||||
/// <param name="instanceLimit">Instance limit.</param>
|
||||
/// <param name="propertyName">Property name.</param>
|
||||
public ParameterTexture(int channels, int instanceLimit, string propertyName)
|
||||
{
|
||||
_propertyName = propertyName;
|
||||
_channels = ((channels - 1) / 4 + 1) * 4;
|
||||
_instanceLimit = ((instanceLimit - 1) / 2 + 1) * 2;
|
||||
_data = new byte[_channels * _instanceLimit];
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="Coffee.UIExtensions.ParameterTexture"/> class.
|
||||
/// </summary>
|
||||
/// <param name="channels">Channels.</param>
|
||||
/// <param name="instanceLimit">Instance limit.</param>
|
||||
/// <param name="propertyName">Property name.</param>
|
||||
public ParameterTexture(int channels, int instanceLimit, string propertyName)
|
||||
{
|
||||
_propertyName = propertyName;
|
||||
_channels = ((channels - 1) / 4 + 1) * 4;
|
||||
_instanceLimit = ((instanceLimit - 1) / 2 + 1) * 2;
|
||||
_data = new byte[_channels * _instanceLimit];
|
||||
|
||||
_stack = new Stack<int>(_instanceLimit);
|
||||
for (int i = 1; i < _instanceLimit + 1; i++)
|
||||
{
|
||||
_stack.Push(i);
|
||||
}
|
||||
}
|
||||
_stack = new Stack<int>(_instanceLimit);
|
||||
for (int i = 1; i < _instanceLimit + 1; i++)
|
||||
{
|
||||
_stack.Push(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Register the specified target.
|
||||
/// </summary>
|
||||
/// <param name="target">Target.</param>
|
||||
public void Register(IParameterTexture target)
|
||||
{
|
||||
Initialize();
|
||||
if (target.parameterIndex <= 0 && 0 < _stack.Count)
|
||||
{
|
||||
target.parameterIndex = _stack.Pop();
|
||||
// Debug.LogFormat("<color=green>@@@ Register {0} : {1}</color>", target, target.parameterIndex);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Register the specified target.
|
||||
/// </summary>
|
||||
/// <param name="target">Target.</param>
|
||||
public void Register(IParameterTexture target)
|
||||
{
|
||||
Initialize();
|
||||
if (target.parameterIndex <= 0 && 0 < _stack.Count)
|
||||
{
|
||||
target.parameterIndex = _stack.Pop();
|
||||
// Debug.LogFormat("<color=green>@@@ Register {0} : {1}</color>", target, target.parameterIndex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unregister the specified target.
|
||||
/// </summary>
|
||||
/// <param name="target">Target.</param>
|
||||
public void Unregister(IParameterTexture target)
|
||||
{
|
||||
if (0 < target.parameterIndex)
|
||||
{
|
||||
// Debug.LogFormat("<color=red>@@@ Unregister {0} : {1}</color>", target, target.parameterIndex);
|
||||
_stack.Push(target.parameterIndex);
|
||||
target.parameterIndex = 0;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Unregister the specified target.
|
||||
/// </summary>
|
||||
/// <param name="target">Target.</param>
|
||||
public void Unregister(IParameterTexture target)
|
||||
{
|
||||
if (0 < target.parameterIndex)
|
||||
{
|
||||
// Debug.LogFormat("<color=red>@@@ Unregister {0} : {1}</color>", target, target.parameterIndex);
|
||||
_stack.Push(target.parameterIndex);
|
||||
target.parameterIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the data.
|
||||
/// </summary>
|
||||
/// <param name="target">Target.</param>
|
||||
/// <param name="channelId">Channel identifier.</param>
|
||||
/// <param name="value">Value.</param>
|
||||
public void SetData(IParameterTexture target, int channelId, byte value)
|
||||
{
|
||||
int index = (target.parameterIndex - 1) * _channels + channelId;
|
||||
if (0 < target.parameterIndex && _data[index] != value)
|
||||
{
|
||||
_data[index] = value;
|
||||
_needUpload = true;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Sets the data.
|
||||
/// </summary>
|
||||
/// <param name="target">Target.</param>
|
||||
/// <param name="channelId">Channel identifier.</param>
|
||||
/// <param name="value">Value.</param>
|
||||
public void SetData(IParameterTexture target, int channelId, byte value)
|
||||
{
|
||||
int index = (target.parameterIndex - 1) * _channels + channelId;
|
||||
if (0 < target.parameterIndex && _data[index] != value)
|
||||
{
|
||||
_data[index] = value;
|
||||
_needUpload = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the data.
|
||||
/// </summary>
|
||||
/// <param name="target">Target.</param>
|
||||
/// <param name="channelId">Channel identifier.</param>
|
||||
/// <param name="value">Value.</param>
|
||||
public void SetData(IParameterTexture target, int channelId, float value)
|
||||
{
|
||||
SetData(target, channelId, (byte)(Mathf.Clamp01(value) * 255));
|
||||
}
|
||||
/// <summary>
|
||||
/// Sets the data.
|
||||
/// </summary>
|
||||
/// <param name="target">Target.</param>
|
||||
/// <param name="channelId">Channel identifier.</param>
|
||||
/// <param name="value">Value.</param>
|
||||
public void SetData(IParameterTexture target, int channelId, float value)
|
||||
{
|
||||
SetData(target, channelId, (byte)(Mathf.Clamp01(value) * 255));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Registers the material.
|
||||
/// </summary>
|
||||
/// <param name="mat">Mat.</param>
|
||||
public void RegisterMaterial(Material mat)
|
||||
{
|
||||
if (_propertyId == 0)
|
||||
{
|
||||
_propertyId = Shader.PropertyToID(_propertyName);
|
||||
}
|
||||
if (mat)
|
||||
{
|
||||
mat.SetTexture(_propertyId, _texture);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Registers the material.
|
||||
/// </summary>
|
||||
/// <param name="mat">Mat.</param>
|
||||
public void RegisterMaterial(Material mat)
|
||||
{
|
||||
if (_propertyId == 0)
|
||||
{
|
||||
_propertyId = Shader.PropertyToID(_propertyName);
|
||||
}
|
||||
if (mat)
|
||||
{
|
||||
mat.SetTexture(_propertyId, _texture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the index of the normalized.
|
||||
/// </summary>
|
||||
/// <returns>The normalized index.</returns>
|
||||
/// <param name="target">Target.</param>
|
||||
public float GetNormalizedIndex(IParameterTexture target)
|
||||
{
|
||||
return ((float)target.parameterIndex - 0.5f) / _instanceLimit;
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets the index of the normalized.
|
||||
/// </summary>
|
||||
/// <returns>The normalized index.</returns>
|
||||
/// <param name="target">Target.</param>
|
||||
public float GetNormalizedIndex(IParameterTexture target)
|
||||
{
|
||||
return ((float)target.parameterIndex - 0.5f) / _instanceLimit;
|
||||
}
|
||||
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
|
||||
Texture2D _texture;
|
||||
bool _needUpload;
|
||||
int _propertyId;
|
||||
readonly string _propertyName;
|
||||
readonly int _channels;
|
||||
readonly int _instanceLimit;
|
||||
readonly byte[] _data;
|
||||
readonly Stack<int> _stack;
|
||||
static List<Action> updates;
|
||||
Texture2D _texture;
|
||||
bool _needUpload;
|
||||
int _propertyId;
|
||||
readonly string _propertyName;
|
||||
readonly int _channels;
|
||||
readonly int _instanceLimit;
|
||||
readonly byte[] _data;
|
||||
readonly Stack<int> _stack;
|
||||
static List<Action> updates;
|
||||
|
||||
/// <summary>
|
||||
/// Initialize this instance.
|
||||
/// </summary>
|
||||
void Initialize()
|
||||
{
|
||||
/// <summary>
|
||||
/// Initialize this instance.
|
||||
/// </summary>
|
||||
void Initialize()
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
if (!UnityEditor.EditorApplication.isPlaying && UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!UnityEditor.EditorApplication.isPlaying && UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if (updates == null)
|
||||
{
|
||||
updates = new List<Action>();
|
||||
Canvas.willRenderCanvases += () =>
|
||||
{
|
||||
var count = updates.Count;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
updates[i].Invoke();
|
||||
}
|
||||
};
|
||||
}
|
||||
if (updates == null)
|
||||
{
|
||||
updates = new List<Action>();
|
||||
Canvas.willRenderCanvases += () =>
|
||||
{
|
||||
var count = updates.Count;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
updates[i].Invoke();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if (!_texture)
|
||||
{
|
||||
bool isLinear = QualitySettings.activeColorSpace == ColorSpace.Linear;
|
||||
_texture = new Texture2D(_channels / 4, _instanceLimit, TextureFormat.RGBA32, false, isLinear);
|
||||
_texture.filterMode = FilterMode.Point;
|
||||
_texture.wrapMode = TextureWrapMode.Clamp;
|
||||
if (!_texture)
|
||||
{
|
||||
bool isLinear = QualitySettings.activeColorSpace == ColorSpace.Linear;
|
||||
_texture = new Texture2D(_channels / 4, _instanceLimit, TextureFormat.RGBA32, false, isLinear);
|
||||
_texture.filterMode = FilterMode.Point;
|
||||
_texture.wrapMode = TextureWrapMode.Clamp;
|
||||
|
||||
updates.Add(UpdateParameterTexture);
|
||||
_needUpload = true;
|
||||
}
|
||||
}
|
||||
updates.Add(UpdateParameterTexture);
|
||||
_needUpload = true;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateParameterTexture()
|
||||
{
|
||||
if (_needUpload && _texture)
|
||||
{
|
||||
_needUpload = false;
|
||||
_texture.LoadRawTextureData(_data);
|
||||
_texture.Apply(false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
void UpdateParameterTexture()
|
||||
{
|
||||
if (_needUpload && _texture)
|
||||
{
|
||||
_needUpload = false;
|
||||
_texture.LoadRawTextureData(_data);
|
||||
_texture.Apply(false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,14 +1,14 @@
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Shadow effect style.
|
||||
/// </summary>
|
||||
public enum ShadowStyle
|
||||
{
|
||||
None = 0,
|
||||
Shadow,
|
||||
Outline,
|
||||
Outline8,
|
||||
Shadow3,
|
||||
}
|
||||
/// <summary>
|
||||
/// Shadow effect style.
|
||||
/// </summary>
|
||||
public enum ShadowStyle
|
||||
{
|
||||
None = 0,
|
||||
Shadow,
|
||||
Outline,
|
||||
Outline8,
|
||||
Shadow3,
|
||||
}
|
||||
}
|
@ -1,14 +1,14 @@
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Effect mode.
|
||||
/// </summary>
|
||||
public enum EffectMode
|
||||
{
|
||||
None = 0,
|
||||
Grayscale = 1,
|
||||
Sepia = 2,
|
||||
Nega = 3,
|
||||
Pixel = 4,
|
||||
}
|
||||
/// <summary>
|
||||
/// Effect mode.
|
||||
/// </summary>
|
||||
public enum EffectMode
|
||||
{
|
||||
None = 0,
|
||||
Grayscale = 1,
|
||||
Sepia = 2,
|
||||
Nega = 3,
|
||||
Pixel = 4,
|
||||
}
|
||||
}
|
@ -4,162 +4,162 @@ using UnityEngine.UI;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Abstract effect base for UI.
|
||||
/// </summary>
|
||||
[DisallowMultipleComponent]
|
||||
public abstract class UIEffectBase : BaseMeshEffect, IParameterTexture
|
||||
/// <summary>
|
||||
/// Abstract effect base for UI.
|
||||
/// </summary>
|
||||
[DisallowMultipleComponent]
|
||||
public abstract class UIEffectBase : BaseMeshEffect, IParameterTexture
|
||||
#if UNITY_EDITOR
|
||||
, ISerializationCallbackReceiver
|
||||
, ISerializationCallbackReceiver
|
||||
#endif
|
||||
{
|
||||
protected static readonly Vector2[] splitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero };
|
||||
protected static readonly List<UIVertex> tempVerts = new List<UIVertex>();
|
||||
{
|
||||
protected static readonly Vector2[] splitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero };
|
||||
protected static readonly List<UIVertex> tempVerts = new List<UIVertex>();
|
||||
|
||||
[HideInInspector]
|
||||
[SerializeField] int m_Version;
|
||||
[SerializeField] protected Material m_EffectMaterial;
|
||||
[HideInInspector]
|
||||
[SerializeField] int m_Version;
|
||||
[SerializeField] protected Material m_EffectMaterial;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the parameter index.
|
||||
/// </summary>
|
||||
public int parameterIndex { get; set; }
|
||||
/// <summary>
|
||||
/// Gets or sets the parameter index.
|
||||
/// </summary>
|
||||
public int parameterIndex { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public virtual ParameterTexture ptex { get { return null; } }
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public virtual ParameterTexture ptex { get { return null; } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets target graphic for effect.
|
||||
/// </summary>
|
||||
public Graphic targetGraphic { get { return graphic; } }
|
||||
/// <summary>
|
||||
/// Gets target graphic for effect.
|
||||
/// </summary>
|
||||
public Graphic targetGraphic { get { return graphic; } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets material for effect.
|
||||
/// </summary>
|
||||
public Material effectMaterial { get { return m_EffectMaterial; } }
|
||||
/// <summary>
|
||||
/// Gets material for effect.
|
||||
/// </summary>
|
||||
public Material effectMaterial { get { return m_EffectMaterial; } }
|
||||
|
||||
#if UNITY_EDITOR
|
||||
protected override void Reset()
|
||||
{
|
||||
m_Version = 300;
|
||||
OnValidate();
|
||||
}
|
||||
protected override void Reset()
|
||||
{
|
||||
m_Version = 300;
|
||||
OnValidate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the validate event.
|
||||
/// </summary>
|
||||
protected override void OnValidate()
|
||||
{
|
||||
base.OnValidate ();
|
||||
/// <summary>
|
||||
/// Raises the validate event.
|
||||
/// </summary>
|
||||
protected override void OnValidate()
|
||||
{
|
||||
base.OnValidate();
|
||||
|
||||
var mat = GetMaterial();
|
||||
if (m_EffectMaterial != mat)
|
||||
{
|
||||
m_EffectMaterial = mat;
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
}
|
||||
var mat = GetMaterial();
|
||||
if (m_EffectMaterial != mat)
|
||||
{
|
||||
m_EffectMaterial = mat;
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
}
|
||||
|
||||
ModifyMaterial();
|
||||
SetVerticesDirty ();
|
||||
SetDirty ();
|
||||
}
|
||||
ModifyMaterial();
|
||||
SetVerticesDirty();
|
||||
SetDirty();
|
||||
}
|
||||
|
||||
public void OnBeforeSerialize()
|
||||
{
|
||||
}
|
||||
public void OnBeforeSerialize()
|
||||
{
|
||||
}
|
||||
|
||||
public void OnAfterDeserialize()
|
||||
{
|
||||
UnityEditor.EditorApplication.delayCall += UpgradeIfNeeded;
|
||||
}
|
||||
public void OnAfterDeserialize()
|
||||
{
|
||||
UnityEditor.EditorApplication.delayCall += UpgradeIfNeeded;
|
||||
}
|
||||
|
||||
protected bool IsShouldUpgrade(int expectedVersion)
|
||||
{
|
||||
if (m_Version < expectedVersion)
|
||||
{
|
||||
Debug.LogFormat(gameObject, "<b>{0}({1})</b> has been upgraded: <i>version {2} -> {3}</i>", name, GetType().Name, m_Version, expectedVersion);
|
||||
m_Version = expectedVersion;
|
||||
protected bool IsShouldUpgrade(int expectedVersion)
|
||||
{
|
||||
if (m_Version < expectedVersion)
|
||||
{
|
||||
Debug.LogFormat(gameObject, "<b>{0}({1})</b> has been upgraded: <i>version {2} -> {3}</i>", name, GetType().Name, m_Version, expectedVersion);
|
||||
m_Version = expectedVersion;
|
||||
|
||||
//UnityEditor.EditorApplication.delayCall += () =>
|
||||
{
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
if (!Application.isPlaying && gameObject && gameObject.scene.IsValid())
|
||||
{
|
||||
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(gameObject.scene);
|
||||
}
|
||||
}
|
||||
;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
//UnityEditor.EditorApplication.delayCall += () =>
|
||||
{
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
if (!Application.isPlaying && gameObject && gameObject.scene.IsValid())
|
||||
{
|
||||
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(gameObject.scene);
|
||||
}
|
||||
}
|
||||
;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected virtual void UpgradeIfNeeded()
|
||||
{
|
||||
}
|
||||
protected virtual void UpgradeIfNeeded()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the material.
|
||||
/// </summary>
|
||||
/// <returns>The material.</returns>
|
||||
protected virtual Material GetMaterial()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets the material.
|
||||
/// </summary>
|
||||
/// <returns>The material.</returns>
|
||||
protected virtual Material GetMaterial()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Modifies the material.
|
||||
/// </summary>
|
||||
public virtual void ModifyMaterial()
|
||||
{
|
||||
targetGraphic.material = isActiveAndEnabled ? m_EffectMaterial : null;
|
||||
}
|
||||
/// <summary>
|
||||
/// Modifies the material.
|
||||
/// </summary>
|
||||
public virtual void ModifyMaterial()
|
||||
{
|
||||
targetGraphic.material = isActiveAndEnabled ? m_EffectMaterial : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable ();
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
|
||||
if (ptex != null)
|
||||
{
|
||||
ptex.Register(this);
|
||||
}
|
||||
ModifyMaterial();
|
||||
SetVerticesDirty();
|
||||
SetDirty();
|
||||
}
|
||||
if (ptex != null)
|
||||
{
|
||||
ptex.Register(this);
|
||||
}
|
||||
ModifyMaterial();
|
||||
SetVerticesDirty();
|
||||
SetDirty();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the behaviour becomes disabled () or inactive.
|
||||
/// </summary>
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable ();
|
||||
/// <summary>
|
||||
/// This function is called when the behaviour becomes disabled () or inactive.
|
||||
/// </summary>
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable();
|
||||
|
||||
ModifyMaterial ();
|
||||
SetVerticesDirty();
|
||||
if (ptex != null)
|
||||
{
|
||||
ptex.Unregister(this);
|
||||
}
|
||||
}
|
||||
ModifyMaterial();
|
||||
SetVerticesDirty();
|
||||
if (ptex != null)
|
||||
{
|
||||
ptex.Unregister(this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mark the UIEffect as dirty.
|
||||
/// </summary>
|
||||
protected virtual void SetDirty()
|
||||
{
|
||||
SetVerticesDirty();
|
||||
}
|
||||
/// <summary>
|
||||
/// Mark the UIEffect as dirty.
|
||||
/// </summary>
|
||||
protected virtual void SetDirty()
|
||||
{
|
||||
SetVerticesDirty();
|
||||
}
|
||||
|
||||
protected override void OnDidApplyAnimationProperties()
|
||||
{
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
protected override void OnDidApplyAnimationProperties()
|
||||
{
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,86 +1,85 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Coffee.UIExtensions.Editors
|
||||
{
|
||||
public class BaseMeshEffectEditor : Editor
|
||||
{
|
||||
List<MaterialEditor> _materialEditors = new List<MaterialEditor> ();
|
||||
public class BaseMeshEffectEditor : Editor
|
||||
{
|
||||
List<MaterialEditor> _materialEditors = new List<MaterialEditor>();
|
||||
|
||||
protected virtual void OnEnable ()
|
||||
{
|
||||
ClearMaterialEditors ();
|
||||
}
|
||||
protected virtual void OnEnable()
|
||||
{
|
||||
ClearMaterialEditors();
|
||||
}
|
||||
|
||||
protected virtual void OnDisable ()
|
||||
{
|
||||
ClearMaterialEditors ();
|
||||
}
|
||||
protected virtual void OnDisable()
|
||||
{
|
||||
ClearMaterialEditors();
|
||||
}
|
||||
|
||||
void ClearMaterialEditors ()
|
||||
{
|
||||
foreach (var e in _materialEditors)
|
||||
{
|
||||
if (e)
|
||||
{
|
||||
DestroyImmediate (e);
|
||||
}
|
||||
}
|
||||
_materialEditors.Clear ();
|
||||
}
|
||||
void ClearMaterialEditors()
|
||||
{
|
||||
foreach (var e in _materialEditors)
|
||||
{
|
||||
if (e)
|
||||
{
|
||||
DestroyImmediate(e);
|
||||
}
|
||||
}
|
||||
_materialEditors.Clear();
|
||||
}
|
||||
|
||||
protected void ShowMaterialEditors (Material [] materials, int startIndex, int count)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
if (_materialEditors.Count == i)
|
||||
{
|
||||
_materialEditors.Add (null);
|
||||
}
|
||||
protected void ShowMaterialEditors(Material[] materials, int startIndex, int count)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
if (_materialEditors.Count == i)
|
||||
{
|
||||
_materialEditors.Add(null);
|
||||
}
|
||||
|
||||
var mat = materials [startIndex + i];
|
||||
var editor = _materialEditors [i];
|
||||
if (editor && editor.target != mat)
|
||||
{
|
||||
DestroyImmediate (editor);
|
||||
editor = null;
|
||||
}
|
||||
var mat = materials[startIndex + i];
|
||||
var editor = _materialEditors[i];
|
||||
if (editor && editor.target != mat)
|
||||
{
|
||||
DestroyImmediate(editor);
|
||||
editor = null;
|
||||
}
|
||||
|
||||
if (!editor)
|
||||
{
|
||||
editor = _materialEditors [i] = Editor.CreateEditor (mat) as MaterialEditor;
|
||||
}
|
||||
if (!editor)
|
||||
{
|
||||
editor = _materialEditors[i] = Editor.CreateEditor(mat) as MaterialEditor;
|
||||
}
|
||||
|
||||
editor.DrawHeader ();
|
||||
editor.OnInspectorGUI ();
|
||||
}
|
||||
}
|
||||
editor.DrawHeader();
|
||||
editor.OnInspectorGUI();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected void ShowCanvasChannelsWarning ()
|
||||
{
|
||||
BaseMeshEffect effect = target as BaseMeshEffect;
|
||||
if (!effect || !effect.graphic)
|
||||
{
|
||||
return;
|
||||
}
|
||||
protected void ShowCanvasChannelsWarning()
|
||||
{
|
||||
BaseMeshEffect effect = target as BaseMeshEffect;
|
||||
if (!effect || !effect.graphic)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#if UNITY_5_6_OR_NEWER
|
||||
AdditionalCanvasShaderChannels channels = effect.requiredChannels;
|
||||
var canvas = effect.graphic.canvas;
|
||||
if (canvas && (canvas.additionalShaderChannels & channels) != channels)
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal ();
|
||||
EditorGUILayout.HelpBox (string.Format ("Enable {1} of Canvas.additionalShaderChannels to use {0}.", effect.GetType ().Name, channels), MessageType.Warning);
|
||||
if (GUILayout.Button ("Fix"))
|
||||
{
|
||||
canvas.additionalShaderChannels |= channels;
|
||||
}
|
||||
EditorGUILayout.EndHorizontal ();
|
||||
}
|
||||
AdditionalCanvasShaderChannels channels = effect.requiredChannels;
|
||||
var canvas = effect.graphic.canvas;
|
||||
if (canvas && (canvas.additionalShaderChannels & channels) != channels)
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.HelpBox(string.Format("Enable {1} of Canvas.additionalShaderChannels to use {0}.", effect.GetType().Name, channels), MessageType.Warning);
|
||||
if (GUILayout.Button("Fix"))
|
||||
{
|
||||
canvas.additionalShaderChannels |= channels;
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,53 +1,51 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Coffee.UIExtensions.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// Remove deprecated files in old .unitypackage, after compiling.
|
||||
/// </summary>
|
||||
public class DeprecatedRemover
|
||||
{
|
||||
/// <summary>
|
||||
/// GUIDs of deprecated files.
|
||||
/// </summary>
|
||||
static readonly List<string> DeprecatedFiles = new List<string>()
|
||||
{
|
||||
"156b57fee6ef941958e66a129ce387e2", // UICustomEffect.cs
|
||||
/// <summary>
|
||||
/// Remove deprecated files in old .unitypackage, after compiling.
|
||||
/// </summary>
|
||||
public class DeprecatedRemover
|
||||
{
|
||||
/// <summary>
|
||||
/// GUIDs of deprecated files.
|
||||
/// </summary>
|
||||
static readonly List<string> DeprecatedFiles = new List<string>()
|
||||
{
|
||||
"156b57fee6ef941958e66a129ce387e2", // UICustomEffect.cs
|
||||
"a4961e148a8cd4fe0b84dddc2741894a", // UICustomEffectEditor.cs
|
||||
"7b1ed09bdf5e54042b5cd1fbe69361bf", // MaterialBundle.cs
|
||||
};
|
||||
|
||||
|
||||
#if UNITY_EDITOR
|
||||
[UnityEditor.InitializeOnLoadMethod]
|
||||
static void RemoveFiles()
|
||||
{
|
||||
// The deprecated file path that exists.
|
||||
var files = DeprecatedFiles.Select(x => AssetDatabase.GUIDToAssetPath(x))
|
||||
.Where(x => File.Exists(x))
|
||||
.ToArray();
|
||||
|
||||
if (files.Any())
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendFormat("<b><color=orange>[{0}]</color></b> {1} files have been removed.\n", typeof(DeprecatedRemover).Name, files.Length);
|
||||
#if UNITY_EDITOR
|
||||
[UnityEditor.InitializeOnLoadMethod]
|
||||
static void RemoveFiles()
|
||||
{
|
||||
// The deprecated file path that exists.
|
||||
var files = DeprecatedFiles.Select(x => AssetDatabase.GUIDToAssetPath(x))
|
||||
.Where(x => File.Exists(x))
|
||||
.ToArray();
|
||||
|
||||
foreach (var path in files)
|
||||
{
|
||||
AssetDatabase.DeleteAsset(path);
|
||||
sb.AppendFormat(" - {0}\n", path);
|
||||
}
|
||||
if (files.Any())
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendFormat("<b><color=orange>[{0}]</color></b> {1} files have been removed.\n", typeof(DeprecatedRemover).Name, files.Length);
|
||||
|
||||
AssetDatabase.Refresh();
|
||||
UnityEngine.Debug.Log(sb);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
foreach (var path in files)
|
||||
{
|
||||
AssetDatabase.DeleteAsset(path);
|
||||
sb.AppendFormat(" - {0}\n", path);
|
||||
}
|
||||
|
||||
AssetDatabase.Refresh();
|
||||
UnityEngine.Debug.Log(sb);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
@ -1,181 +1,179 @@
|
||||
using UnityEditor;
|
||||
using UnityEditorInternal;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Coffee.UIExtensions.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIDissolve))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIDissolveEditor : BaseMeshEffectEditor
|
||||
{
|
||||
static int s_NoiseTexId;
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIDissolve))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIDissolveEditor : BaseMeshEffectEditor
|
||||
{
|
||||
static int s_NoiseTexId;
|
||||
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable ();
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
|
||||
_spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
_spEffectFactor = serializedObject.FindProperty("m_EffectFactor");
|
||||
_spEffectArea = serializedObject.FindProperty("m_EffectArea");
|
||||
_spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio");
|
||||
_spWidth = serializedObject.FindProperty("m_Width");
|
||||
_spColor = serializedObject.FindProperty("m_Color");
|
||||
_spSoftness = serializedObject.FindProperty("m_Softness");
|
||||
_spColorMode = serializedObject.FindProperty("m_ColorMode");
|
||||
_spNoiseTexture = serializedObject.FindProperty("m_NoiseTexture");
|
||||
_spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio");
|
||||
_spReverse = serializedObject.FindProperty("m_Reverse");
|
||||
var player = serializedObject.FindProperty("m_Player");
|
||||
_spPlay = player.FindPropertyRelative("play");
|
||||
_spDuration = player.FindPropertyRelative("duration");
|
||||
_spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay");
|
||||
_spLoop = player.FindPropertyRelative("loop");
|
||||
_spLoopDelay = player.FindPropertyRelative("loopDelay");
|
||||
_spUpdateMode = player.FindPropertyRelative("updateMode");
|
||||
_spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
_spEffectFactor = serializedObject.FindProperty("m_EffectFactor");
|
||||
_spEffectArea = serializedObject.FindProperty("m_EffectArea");
|
||||
_spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio");
|
||||
_spWidth = serializedObject.FindProperty("m_Width");
|
||||
_spColor = serializedObject.FindProperty("m_Color");
|
||||
_spSoftness = serializedObject.FindProperty("m_Softness");
|
||||
_spColorMode = serializedObject.FindProperty("m_ColorMode");
|
||||
_spNoiseTexture = serializedObject.FindProperty("m_NoiseTexture");
|
||||
_spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio");
|
||||
_spReverse = serializedObject.FindProperty("m_Reverse");
|
||||
var player = serializedObject.FindProperty("m_Player");
|
||||
_spPlay = player.FindPropertyRelative("play");
|
||||
_spDuration = player.FindPropertyRelative("duration");
|
||||
_spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay");
|
||||
_spLoop = player.FindPropertyRelative("loop");
|
||||
_spLoopDelay = player.FindPropertyRelative("loopDelay");
|
||||
_spUpdateMode = player.FindPropertyRelative("updateMode");
|
||||
|
||||
s_NoiseTexId = Shader.PropertyToID ("_NoiseTex");
|
||||
s_NoiseTexId = Shader.PropertyToID("_NoiseTex");
|
||||
|
||||
_shader = Shader.Find ("TextMeshPro/Distance Field (UIDissolve)");
|
||||
_mobileShader = Shader.Find ("TextMeshPro/Mobile/Distance Field (UIDissolve)");
|
||||
_spriteShader = Shader.Find ("TextMeshPro/Sprite (UIDissolve)");
|
||||
}
|
||||
_shader = Shader.Find("TextMeshPro/Distance Field (UIDissolve)");
|
||||
_mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UIDissolve)");
|
||||
_spriteShader = Shader.Find("TextMeshPro/Sprite (UIDissolve)");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
foreach (var d in targets.Cast<UIDissolve> ())
|
||||
{
|
||||
var mat = d.material;
|
||||
if (d.isTMPro && mat && mat.HasProperty(s_NoiseTexId))
|
||||
{
|
||||
ColorMode colorMode =
|
||||
mat.IsKeywordEnabled ("ADD") ? ColorMode.Add
|
||||
: mat.IsKeywordEnabled ("SUBTRACT") ? ColorMode.Subtract
|
||||
: mat.IsKeywordEnabled ("FILL") ? ColorMode.Fill
|
||||
: ColorMode.Multiply;
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
foreach (var d in targets.Cast<UIDissolve>())
|
||||
{
|
||||
var mat = d.material;
|
||||
if (d.isTMPro && mat && mat.HasProperty(s_NoiseTexId))
|
||||
{
|
||||
ColorMode colorMode =
|
||||
mat.IsKeywordEnabled("ADD") ? ColorMode.Add
|
||||
: mat.IsKeywordEnabled("SUBTRACT") ? ColorMode.Subtract
|
||||
: mat.IsKeywordEnabled("FILL") ? ColorMode.Fill
|
||||
: ColorMode.Multiply;
|
||||
|
||||
Texture noiseTexture = mat.GetTexture(s_NoiseTexId);
|
||||
Texture noiseTexture = mat.GetTexture(s_NoiseTexId);
|
||||
|
||||
if (d.colorMode != colorMode || d.noiseTexture != noiseTexture)
|
||||
{
|
||||
var so = new SerializedObject (d);
|
||||
so.FindProperty ("m_ColorMode").intValue = (int)colorMode;
|
||||
so.FindProperty ("m_NoiseTexture").objectReferenceValue = noiseTexture;
|
||||
so.ApplyModifiedProperties ();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (d.colorMode != colorMode || d.noiseTexture != noiseTexture)
|
||||
{
|
||||
var so = new SerializedObject(d);
|
||||
so.FindProperty("m_ColorMode").intValue = (int)colorMode;
|
||||
so.FindProperty("m_NoiseTexture").objectReferenceValue = noiseTexture;
|
||||
so.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
serializedObject.Update();
|
||||
serializedObject.Update();
|
||||
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(_spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(_spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spEffectFactor);
|
||||
EditorGUILayout.PropertyField(_spWidth);
|
||||
EditorGUILayout.PropertyField(_spSoftness);
|
||||
EditorGUILayout.PropertyField(_spColor);
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spEffectFactor);
|
||||
EditorGUILayout.PropertyField(_spWidth);
|
||||
EditorGUILayout.PropertyField(_spSoftness);
|
||||
EditorGUILayout.PropertyField(_spColor);
|
||||
|
||||
bool isAnyTMPro = targets.Cast<UIDissolve>().Any(x => x.isTMPro);
|
||||
using (new EditorGUI.DisabledGroupScope (isAnyTMPro))
|
||||
{
|
||||
EditorGUILayout.PropertyField (_spColorMode);
|
||||
EditorGUILayout.PropertyField (_spNoiseTexture);
|
||||
}
|
||||
bool isAnyTMPro = targets.Cast<UIDissolve>().Any(x => x.isTMPro);
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
{
|
||||
EditorGUILayout.PropertyField(_spColorMode);
|
||||
EditorGUILayout.PropertyField(_spNoiseTexture);
|
||||
}
|
||||
|
||||
//================
|
||||
// Advanced option.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spEffectArea);
|
||||
EditorGUILayout.PropertyField(_spKeepAspectRatio);
|
||||
//================
|
||||
// Advanced option.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spEffectArea);
|
||||
EditorGUILayout.PropertyField(_spKeepAspectRatio);
|
||||
|
||||
//================
|
||||
// Effect player.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spPlay);
|
||||
EditorGUILayout.PropertyField(_spDuration);
|
||||
EditorGUILayout.PropertyField(_spInitialPlayDelay);
|
||||
EditorGUILayout.PropertyField(_spLoop);
|
||||
EditorGUILayout.PropertyField(_spLoopDelay);
|
||||
EditorGUILayout.PropertyField(_spUpdateMode);
|
||||
EditorGUILayout.PropertyField(_spReverse);
|
||||
//================
|
||||
// Effect player.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spPlay);
|
||||
EditorGUILayout.PropertyField(_spDuration);
|
||||
EditorGUILayout.PropertyField(_spInitialPlayDelay);
|
||||
EditorGUILayout.PropertyField(_spLoop);
|
||||
EditorGUILayout.PropertyField(_spLoopDelay);
|
||||
EditorGUILayout.PropertyField(_spUpdateMode);
|
||||
EditorGUILayout.PropertyField(_spReverse);
|
||||
|
||||
// Debug.
|
||||
using (new EditorGUI.DisabledGroupScope(!Application.isPlaying))
|
||||
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
|
||||
{
|
||||
GUILayout.Label("Debug");
|
||||
// Debug.
|
||||
using (new EditorGUI.DisabledGroupScope(!Application.isPlaying))
|
||||
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
|
||||
{
|
||||
GUILayout.Label("Debug");
|
||||
|
||||
if (GUILayout.Button("Play", "ButtonLeft"))
|
||||
{
|
||||
(target as UIDissolve).Play();
|
||||
}
|
||||
if (GUILayout.Button("Play", "ButtonLeft"))
|
||||
{
|
||||
(target as UIDissolve).Play();
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Stop", "ButtonRight"))
|
||||
{
|
||||
(target as UIDissolve).Stop();
|
||||
}
|
||||
}
|
||||
if (GUILayout.Button("Stop", "ButtonRight"))
|
||||
{
|
||||
(target as UIDissolve).Stop();
|
||||
}
|
||||
}
|
||||
|
||||
var c = target as UIDissolve;
|
||||
c.ShowTMProWarning (_shader, _mobileShader, _spriteShader, mat => {
|
||||
if(mat.shader == _spriteShader)
|
||||
{
|
||||
mat.shaderKeywords = c.material.shaderKeywords;
|
||||
mat.SetTexture ("_NoiseTex", c.material.GetTexture ("_NoiseTex"));
|
||||
}
|
||||
});
|
||||
ShowCanvasChannelsWarning ();
|
||||
var c = target as UIDissolve;
|
||||
c.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat =>
|
||||
{
|
||||
if (mat.shader == _spriteShader)
|
||||
{
|
||||
mat.shaderKeywords = c.material.shaderKeywords;
|
||||
mat.SetTexture("_NoiseTex", c.material.GetTexture("_NoiseTex"));
|
||||
}
|
||||
});
|
||||
ShowCanvasChannelsWarning();
|
||||
|
||||
ShowMaterialEditors (c.materials, 1, c.materials.Length - 1);
|
||||
ShowMaterialEditors(c.materials, 1, c.materials.Length - 1);
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
SerializedProperty _spMaterial;
|
||||
SerializedProperty _spEffectFactor;
|
||||
SerializedProperty _spWidth;
|
||||
SerializedProperty _spColor;
|
||||
SerializedProperty _spSoftness;
|
||||
SerializedProperty _spColorMode;
|
||||
SerializedProperty _spNoiseTexture;
|
||||
SerializedProperty _spEffectArea;
|
||||
SerializedProperty _spKeepAspectRatio;
|
||||
SerializedProperty _spReverse;
|
||||
SerializedProperty _spPlay;
|
||||
SerializedProperty _spLoop;
|
||||
SerializedProperty _spLoopDelay;
|
||||
SerializedProperty _spDuration;
|
||||
SerializedProperty _spInitialPlayDelay;
|
||||
SerializedProperty _spUpdateMode;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
SerializedProperty _spMaterial;
|
||||
SerializedProperty _spEffectFactor;
|
||||
SerializedProperty _spWidth;
|
||||
SerializedProperty _spColor;
|
||||
SerializedProperty _spSoftness;
|
||||
SerializedProperty _spColorMode;
|
||||
SerializedProperty _spNoiseTexture;
|
||||
SerializedProperty _spEffectArea;
|
||||
SerializedProperty _spKeepAspectRatio;
|
||||
SerializedProperty _spReverse;
|
||||
SerializedProperty _spPlay;
|
||||
SerializedProperty _spLoop;
|
||||
SerializedProperty _spLoopDelay;
|
||||
SerializedProperty _spDuration;
|
||||
SerializedProperty _spInitialPlayDelay;
|
||||
SerializedProperty _spUpdateMode;
|
||||
|
||||
Shader _shader;
|
||||
Shader _mobileShader;
|
||||
Shader _spriteShader;
|
||||
}
|
||||
Shader _shader;
|
||||
Shader _mobileShader;
|
||||
Shader _spriteShader;
|
||||
}
|
||||
}
|
@ -5,184 +5,184 @@ using DesamplingRate = Coffee.UIExtensions.UIEffectCapturedImage.DesamplingRate;
|
||||
|
||||
namespace Coffee.UIExtensions.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffectCapturedImage editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIEffectCapturedImage))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIEffectCapturedImageEditor : RawImageEditor
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// UIEffectCapturedImage editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIEffectCapturedImage))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIEffectCapturedImageEditor : RawImageEditor
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
|
||||
public enum QualityMode : int
|
||||
{
|
||||
Fast = (DesamplingRate.x2 << 0) + (DesamplingRate.x2 << 4) + (FilterMode.Bilinear << 8) + (2 << 10),
|
||||
Medium = (DesamplingRate.x1 << 0) + (DesamplingRate.x1 << 4) + (FilterMode.Bilinear << 8) + (3 << 10),
|
||||
Detail = (DesamplingRate.None << 0) + (DesamplingRate.x1 << 4) + (FilterMode.Bilinear << 8) + (5 << 10),
|
||||
Custom = -1,
|
||||
}
|
||||
public enum QualityMode : int
|
||||
{
|
||||
Fast = (DesamplingRate.x2 << 0) + (DesamplingRate.x2 << 4) + (FilterMode.Bilinear << 8) + (2 << 10),
|
||||
Medium = (DesamplingRate.x1 << 0) + (DesamplingRate.x1 << 4) + (FilterMode.Bilinear << 8) + (3 << 10),
|
||||
Detail = (DesamplingRate.None << 0) + (DesamplingRate.x1 << 4) + (FilterMode.Bilinear << 8) + (5 << 10),
|
||||
Custom = -1,
|
||||
}
|
||||
|
||||
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
_spTexture = serializedObject.FindProperty("m_Texture");
|
||||
_spColor = serializedObject.FindProperty("m_Color");
|
||||
_spRaycastTarget = serializedObject.FindProperty("m_RaycastTarget");
|
||||
_spDesamplingRate = serializedObject.FindProperty("m_DesamplingRate");
|
||||
_spReductionRate = serializedObject.FindProperty("m_ReductionRate");
|
||||
_spFilterMode = serializedObject.FindProperty("m_FilterMode");
|
||||
_spIterations = serializedObject.FindProperty("m_BlurIterations");
|
||||
_spKeepSizeToRootCanvas = serializedObject.FindProperty("m_FitToScreen");
|
||||
_spBlurMode = serializedObject.FindProperty("m_BlurMode");
|
||||
_spCaptureOnEnable = serializedObject.FindProperty("m_CaptureOnEnable");
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
_spTexture = serializedObject.FindProperty("m_Texture");
|
||||
_spColor = serializedObject.FindProperty("m_Color");
|
||||
_spRaycastTarget = serializedObject.FindProperty("m_RaycastTarget");
|
||||
_spDesamplingRate = serializedObject.FindProperty("m_DesamplingRate");
|
||||
_spReductionRate = serializedObject.FindProperty("m_ReductionRate");
|
||||
_spFilterMode = serializedObject.FindProperty("m_FilterMode");
|
||||
_spIterations = serializedObject.FindProperty("m_BlurIterations");
|
||||
_spKeepSizeToRootCanvas = serializedObject.FindProperty("m_FitToScreen");
|
||||
_spBlurMode = serializedObject.FindProperty("m_BlurMode");
|
||||
_spCaptureOnEnable = serializedObject.FindProperty("m_CaptureOnEnable");
|
||||
|
||||
|
||||
_customAdvancedOption = (qualityMode == QualityMode.Custom);
|
||||
}
|
||||
_customAdvancedOption = (qualityMode == QualityMode.Custom);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
var graphic = (target as UIEffectCapturedImage);
|
||||
serializedObject.Update();
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
var graphic = (target as UIEffectCapturedImage);
|
||||
serializedObject.Update();
|
||||
|
||||
//================
|
||||
// Basic properties.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spTexture);
|
||||
EditorGUILayout.PropertyField(_spColor);
|
||||
EditorGUILayout.PropertyField(_spRaycastTarget);
|
||||
//================
|
||||
// Basic properties.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spTexture);
|
||||
EditorGUILayout.PropertyField(_spColor);
|
||||
EditorGUILayout.PropertyField(_spRaycastTarget);
|
||||
|
||||
//================
|
||||
// Capture effect.
|
||||
//================
|
||||
GUILayout.Space(10);
|
||||
EditorGUILayout.LabelField("Capture Effect", EditorStyles.boldLabel);
|
||||
UIEffectEditor.DrawEffectProperties(serializedObject, "m_EffectColor");
|
||||
//================
|
||||
// Capture effect.
|
||||
//================
|
||||
GUILayout.Space(10);
|
||||
EditorGUILayout.LabelField("Capture Effect", EditorStyles.boldLabel);
|
||||
UIEffectEditor.DrawEffectProperties(serializedObject, "m_EffectColor");
|
||||
|
||||
//================
|
||||
// Advanced option.
|
||||
//================
|
||||
GUILayout.Space(10);
|
||||
EditorGUILayout.LabelField("Advanced Option", EditorStyles.boldLabel);
|
||||
//================
|
||||
// Advanced option.
|
||||
//================
|
||||
GUILayout.Space(10);
|
||||
EditorGUILayout.LabelField("Advanced Option", EditorStyles.boldLabel);
|
||||
|
||||
EditorGUILayout.PropertyField(_spCaptureOnEnable);// CaptureOnEnable.
|
||||
EditorGUILayout.PropertyField(_spKeepSizeToRootCanvas);// Keep Graphic Size To RootCanvas.
|
||||
EditorGUILayout.PropertyField(_spCaptureOnEnable);// CaptureOnEnable.
|
||||
EditorGUILayout.PropertyField(_spKeepSizeToRootCanvas);// Keep Graphic Size To RootCanvas.
|
||||
|
||||
EditorGUI.BeginChangeCheck();
|
||||
QualityMode quality = qualityMode;
|
||||
quality = (QualityMode)EditorGUILayout.EnumPopup("Quality Mode", quality);
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
_customAdvancedOption = (quality == QualityMode.Custom);
|
||||
qualityMode = quality;
|
||||
}
|
||||
EditorGUI.BeginChangeCheck();
|
||||
QualityMode quality = qualityMode;
|
||||
quality = (QualityMode)EditorGUILayout.EnumPopup("Quality Mode", quality);
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
_customAdvancedOption = (quality == QualityMode.Custom);
|
||||
qualityMode = quality;
|
||||
}
|
||||
|
||||
// When qualityMode is `Custom`, show advanced option.
|
||||
if (_customAdvancedOption)
|
||||
{
|
||||
if (_spBlurMode.intValue != 0)
|
||||
{
|
||||
EditorGUILayout.PropertyField(_spIterations);// Iterations.
|
||||
}
|
||||
DrawDesamplingRate(_spReductionRate);// Reduction rate.
|
||||
// When qualityMode is `Custom`, show advanced option.
|
||||
if (_customAdvancedOption)
|
||||
{
|
||||
if (_spBlurMode.intValue != 0)
|
||||
{
|
||||
EditorGUILayout.PropertyField(_spIterations);// Iterations.
|
||||
}
|
||||
DrawDesamplingRate(_spReductionRate);// Reduction rate.
|
||||
|
||||
EditorGUILayout.Space();
|
||||
EditorGUILayout.LabelField("Result Texture Setting", EditorStyles.boldLabel);
|
||||
EditorGUILayout.Space();
|
||||
EditorGUILayout.LabelField("Result Texture Setting", EditorStyles.boldLabel);
|
||||
|
||||
EditorGUILayout.PropertyField(_spFilterMode);// Filter Mode.
|
||||
DrawDesamplingRate(_spDesamplingRate);// Desampling rate.
|
||||
}
|
||||
EditorGUILayout.PropertyField(_spFilterMode);// Filter Mode.
|
||||
DrawDesamplingRate(_spDesamplingRate);// Desampling rate.
|
||||
}
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
|
||||
// Debug.
|
||||
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
|
||||
{
|
||||
GUILayout.Label("Debug");
|
||||
// Debug.
|
||||
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
|
||||
{
|
||||
GUILayout.Label("Debug");
|
||||
|
||||
if (GUILayout.Button("Capture", "ButtonLeft"))
|
||||
{
|
||||
graphic.Release();
|
||||
EditorApplication.delayCall += graphic.Capture;
|
||||
}
|
||||
if (GUILayout.Button("Capture", "ButtonLeft"))
|
||||
{
|
||||
graphic.Release();
|
||||
EditorApplication.delayCall += graphic.Capture;
|
||||
}
|
||||
|
||||
EditorGUI.BeginDisabledGroup(!(target as UIEffectCapturedImage).capturedTexture);
|
||||
if (GUILayout.Button("Release", "ButtonRight"))
|
||||
{
|
||||
graphic.Release();
|
||||
}
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
}
|
||||
EditorGUI.BeginDisabledGroup(!(target as UIEffectCapturedImage).capturedTexture);
|
||||
if (GUILayout.Button("Release", "ButtonRight"))
|
||||
{
|
||||
graphic.Release();
|
||||
}
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
}
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
const int Bits4 = (1 << 4) - 1;
|
||||
const int Bits2 = (1 << 2) - 1;
|
||||
bool _customAdvancedOption = false;
|
||||
SerializedProperty _spTexture;
|
||||
SerializedProperty _spColor;
|
||||
SerializedProperty _spRaycastTarget;
|
||||
SerializedProperty _spDesamplingRate;
|
||||
SerializedProperty _spReductionRate;
|
||||
SerializedProperty _spFilterMode;
|
||||
SerializedProperty _spBlurMode;
|
||||
SerializedProperty _spIterations;
|
||||
SerializedProperty _spKeepSizeToRootCanvas;
|
||||
SerializedProperty _spCaptureOnEnable;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
const int Bits4 = (1 << 4) - 1;
|
||||
const int Bits2 = (1 << 2) - 1;
|
||||
bool _customAdvancedOption = false;
|
||||
SerializedProperty _spTexture;
|
||||
SerializedProperty _spColor;
|
||||
SerializedProperty _spRaycastTarget;
|
||||
SerializedProperty _spDesamplingRate;
|
||||
SerializedProperty _spReductionRate;
|
||||
SerializedProperty _spFilterMode;
|
||||
SerializedProperty _spBlurMode;
|
||||
SerializedProperty _spIterations;
|
||||
SerializedProperty _spKeepSizeToRootCanvas;
|
||||
SerializedProperty _spCaptureOnEnable;
|
||||
|
||||
QualityMode qualityMode
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_customAdvancedOption)
|
||||
return QualityMode.Custom;
|
||||
QualityMode qualityMode
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_customAdvancedOption)
|
||||
return QualityMode.Custom;
|
||||
|
||||
int qualityValue = (_spDesamplingRate.intValue << 0)
|
||||
+ (_spReductionRate.intValue << 4)
|
||||
+ (_spFilterMode.intValue << 8)
|
||||
+ (_spIterations.intValue << 10);
|
||||
int qualityValue = (_spDesamplingRate.intValue << 0)
|
||||
+ (_spReductionRate.intValue << 4)
|
||||
+ (_spFilterMode.intValue << 8)
|
||||
+ (_spIterations.intValue << 10);
|
||||
|
||||
return System.Enum.IsDefined(typeof(QualityMode), qualityValue) ? (QualityMode)qualityValue : QualityMode.Custom;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != QualityMode.Custom)
|
||||
{
|
||||
int qualityValue = (int)value;
|
||||
_spDesamplingRate.intValue = (qualityValue >> 0) & Bits4;
|
||||
_spReductionRate.intValue = (qualityValue >> 4) & Bits4;
|
||||
_spFilterMode.intValue = (qualityValue >> 8) & Bits2;
|
||||
_spIterations.intValue = (qualityValue >> 10) & Bits4;
|
||||
}
|
||||
}
|
||||
}
|
||||
return System.Enum.IsDefined(typeof(QualityMode), qualityValue) ? (QualityMode)qualityValue : QualityMode.Custom;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != QualityMode.Custom)
|
||||
{
|
||||
int qualityValue = (int)value;
|
||||
_spDesamplingRate.intValue = (qualityValue >> 0) & Bits4;
|
||||
_spReductionRate.intValue = (qualityValue >> 4) & Bits4;
|
||||
_spFilterMode.intValue = (qualityValue >> 8) & Bits2;
|
||||
_spIterations.intValue = (qualityValue >> 10) & Bits4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the desampling rate.
|
||||
/// </summary>
|
||||
void DrawDesamplingRate(SerializedProperty sp)
|
||||
{
|
||||
using (new EditorGUILayout.HorizontalScope())
|
||||
{
|
||||
EditorGUILayout.PropertyField(sp);
|
||||
int w, h;
|
||||
(target as UIEffectCapturedImage).GetDesamplingSize((UIEffectCapturedImage.DesamplingRate)sp.intValue, out w, out h);
|
||||
GUILayout.Label(string.Format("{0}x{1}", w, h), EditorStyles.miniLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Draws the desampling rate.
|
||||
/// </summary>
|
||||
void DrawDesamplingRate(SerializedProperty sp)
|
||||
{
|
||||
using (new EditorGUILayout.HorizontalScope())
|
||||
{
|
||||
EditorGUILayout.PropertyField(sp);
|
||||
int w, h;
|
||||
(target as UIEffectCapturedImage).GetDesamplingSize((UIEffectCapturedImage.DesamplingRate)sp.intValue, out w, out h);
|
||||
GUILayout.Label(string.Format("{0}x{1}", w, h), EditorStyles.miniLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,253 +1,256 @@
|
||||
using UnityEditor;
|
||||
using UnityEditorInternal;
|
||||
using UnityEngine;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Coffee.UIExtensions.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIEffect))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIEffectEditor : BaseMeshEffectEditor
|
||||
{
|
||||
static readonly GUIContent contentEffectColor = new GUIContent ("Effect Color");
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIEffect))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIEffectEditor : BaseMeshEffectEditor
|
||||
{
|
||||
static readonly GUIContent contentEffectColor = new GUIContent("Effect Color");
|
||||
|
||||
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
|
||||
/// <summary>
|
||||
/// Draw effect properties.
|
||||
/// </summary>
|
||||
public static void DrawEffectProperties(SerializedObject serializedObject, string colorProperty = "m_Color")
|
||||
{
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
var spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
/// <summary>
|
||||
/// Draw effect properties.
|
||||
/// </summary>
|
||||
public static void DrawEffectProperties(SerializedObject serializedObject, string colorProperty = "m_Color")
|
||||
{
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
var spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
var spToneMode = serializedObject.FindProperty("m_EffectMode");
|
||||
EditorGUILayout.PropertyField(spToneMode);
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
var spToneMode = serializedObject.FindProperty("m_EffectMode");
|
||||
EditorGUILayout.PropertyField(spToneMode);
|
||||
|
||||
// When tone is enable, show parameters.
|
||||
if (spToneMode.intValue != (int)EffectMode.None)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectFactor"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
// When tone is enable, show parameters.
|
||||
if (spToneMode.intValue != (int)EffectMode.None)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectFactor"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
//================
|
||||
// Color setting.
|
||||
//================
|
||||
var spColorMode = serializedObject.FindProperty("m_ColorMode");
|
||||
EditorGUILayout.PropertyField(spColorMode);
|
||||
//================
|
||||
// Color setting.
|
||||
//================
|
||||
var spColorMode = serializedObject.FindProperty("m_ColorMode");
|
||||
EditorGUILayout.PropertyField(spColorMode);
|
||||
|
||||
// When color is enable, show parameters.
|
||||
//if (spColorMode.intValue != (int)ColorMode.Multiply)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
// When color is enable, show parameters.
|
||||
//if (spColorMode.intValue != (int)ColorMode.Multiply)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
|
||||
SerializedProperty spColor = serializedObject.FindProperty(colorProperty);
|
||||
if (spColor == null && serializedObject.targetObject is UIEffect) {
|
||||
spColor = new SerializedObject (serializedObject.targetObjects.Select(x=>(x as UIEffect).targetGraphic).ToArray()).FindProperty(colorProperty);
|
||||
}
|
||||
SerializedProperty spColor = serializedObject.FindProperty(colorProperty);
|
||||
if (spColor == null && serializedObject.targetObject is UIEffect)
|
||||
{
|
||||
spColor = new SerializedObject(serializedObject.targetObjects.Select(x => (x as UIEffect).targetGraphic).ToArray()).FindProperty(colorProperty);
|
||||
}
|
||||
|
||||
EditorGUI.BeginChangeCheck ();
|
||||
EditorGUI.showMixedValue = spColor.hasMultipleDifferentValues;
|
||||
EditorGUI.BeginChangeCheck();
|
||||
EditorGUI.showMixedValue = spColor.hasMultipleDifferentValues;
|
||||
#if UNITY_2018_1_OR_NEWER
|
||||
spColor.colorValue = EditorGUILayout.ColorField (contentEffectColor, spColor.colorValue, true, false, false);
|
||||
spColor.colorValue = EditorGUILayout.ColorField(contentEffectColor, spColor.colorValue, true, false, false);
|
||||
#else
|
||||
spColor.colorValue = EditorGUILayout.ColorField (contentEffectColor, spColor.colorValue, true, false, false, null);
|
||||
#endif
|
||||
if (EditorGUI.EndChangeCheck ()) {
|
||||
spColor.serializedObject.ApplyModifiedProperties ();
|
||||
}
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
spColor.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorFactor"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorFactor"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
//================
|
||||
// Blur setting.
|
||||
//================
|
||||
var spBlurMode = serializedObject.FindProperty("m_BlurMode");
|
||||
EditorGUILayout.PropertyField(spBlurMode);
|
||||
//================
|
||||
// Blur setting.
|
||||
//================
|
||||
var spBlurMode = serializedObject.FindProperty("m_BlurMode");
|
||||
EditorGUILayout.PropertyField(spBlurMode);
|
||||
|
||||
// When blur is enable, show parameters.
|
||||
if (spBlurMode.intValue != (int)BlurMode.None)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor"));
|
||||
// When blur is enable, show parameters.
|
||||
if (spBlurMode.intValue != (int)BlurMode.None)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor"));
|
||||
|
||||
var spAdvancedBlur = serializedObject.FindProperty("m_AdvancedBlur");
|
||||
if (spAdvancedBlur != null)
|
||||
{
|
||||
EditorGUILayout.PropertyField(spAdvancedBlur);
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
}
|
||||
var spAdvancedBlur = serializedObject.FindProperty("m_AdvancedBlur");
|
||||
if (spAdvancedBlur != null)
|
||||
{
|
||||
EditorGUILayout.PropertyField(spAdvancedBlur);
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
}
|
||||
|
||||
int GetEnum<T>(Material mat)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
string[] names = System.Enum.GetNames (type);
|
||||
int[] values = System.Enum.GetValues (type) as int[];
|
||||
int GetEnum<T>(Material mat)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
string[] names = System.Enum.GetNames(type);
|
||||
int[] values = System.Enum.GetValues(type) as int[];
|
||||
|
||||
int mode = 0;
|
||||
for(int i=0;i<names.Length;i++)
|
||||
{
|
||||
if (mat.IsKeywordEnabled (names [i].ToUpper()))
|
||||
mode = values [i];
|
||||
}
|
||||
return mode;
|
||||
}
|
||||
int mode = 0;
|
||||
for (int i = 0; i < names.Length; i++)
|
||||
{
|
||||
if (mat.IsKeywordEnabled(names[i].ToUpper()))
|
||||
mode = values[i];
|
||||
}
|
||||
return mode;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
foreach (var d in targets.Cast<UIEffect> ())
|
||||
{
|
||||
var mat = d.material;
|
||||
if (d.isTMPro && mat)
|
||||
{
|
||||
var so = new SerializedObject (d);
|
||||
EffectMode eMode = (EffectMode)GetEnum<EffectMode> (mat);
|
||||
ColorMode cMode = (ColorMode)GetEnum<ColorMode> (mat);
|
||||
BlurMode bMode = (BlurMode)GetEnum<BlurMode> (mat);
|
||||
bool aBlur = mat.IsKeywordEnabled("EX");
|
||||
if (d.effectMode != eMode || d.colorMode != cMode || d.blurMode != bMode || so.FindProperty ("m_AdvancedBlur").boolValue != aBlur)
|
||||
{
|
||||
so.FindProperty ("m_EffectMode").intValue = (int)eMode;
|
||||
so.FindProperty ("m_ColorMode").intValue = (int)cMode;
|
||||
so.FindProperty ("m_BlurMode").intValue = (int)bMode;
|
||||
so.FindProperty ("m_AdvancedBlur").boolValue = aBlur;
|
||||
so.ApplyModifiedProperties ();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
foreach (var d in targets.Cast<UIEffect>())
|
||||
{
|
||||
var mat = d.material;
|
||||
if (d.isTMPro && mat)
|
||||
{
|
||||
var so = new SerializedObject(d);
|
||||
EffectMode eMode = (EffectMode)GetEnum<EffectMode>(mat);
|
||||
ColorMode cMode = (ColorMode)GetEnum<ColorMode>(mat);
|
||||
BlurMode bMode = (BlurMode)GetEnum<BlurMode>(mat);
|
||||
bool aBlur = mat.IsKeywordEnabled("EX");
|
||||
if (d.effectMode != eMode || d.colorMode != cMode || d.blurMode != bMode || so.FindProperty("m_AdvancedBlur").boolValue != aBlur)
|
||||
{
|
||||
so.FindProperty("m_EffectMode").intValue = (int)eMode;
|
||||
so.FindProperty("m_ColorMode").intValue = (int)cMode;
|
||||
so.FindProperty("m_BlurMode").intValue = (int)bMode;
|
||||
so.FindProperty("m_AdvancedBlur").boolValue = aBlur;
|
||||
so.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
serializedObject.Update();
|
||||
bool isAnyTMPro = targets.Cast<UIEffect>().Any(x => x.isTMPro);
|
||||
var c = target as UIEffect;
|
||||
serializedObject.Update();
|
||||
bool isAnyTMPro = targets.Cast<UIEffect>().Any(x => x.isTMPro);
|
||||
var c = target as UIEffect;
|
||||
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
var spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
var spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
var spToneMode = serializedObject.FindProperty("m_EffectMode");
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(spToneMode);
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
var spToneMode = serializedObject.FindProperty("m_EffectMode");
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(spToneMode);
|
||||
|
||||
// When tone is enable, show parameters.
|
||||
if (spToneMode.intValue != (int)EffectMode.None)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectFactor"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
// When tone is enable, show parameters.
|
||||
if (spToneMode.intValue != (int)EffectMode.None)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectFactor"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
//================
|
||||
// Color setting.
|
||||
//================
|
||||
var spColorMode = serializedObject.FindProperty("m_ColorMode");
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(spColorMode);
|
||||
//================
|
||||
// Color setting.
|
||||
//================
|
||||
var spColorMode = serializedObject.FindProperty("m_ColorMode");
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(spColorMode);
|
||||
|
||||
// When color is enable, show parameters.
|
||||
//if (spColorMode.intValue != (int)ColorMode.Multiply)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
// When color is enable, show parameters.
|
||||
//if (spColorMode.intValue != (int)ColorMode.Multiply)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
|
||||
SerializedProperty spColor = serializedObject.FindProperty("m_Color");
|
||||
if (spColor == null && serializedObject.targetObject is UIEffect) {
|
||||
spColor = new SerializedObject (serializedObject.targetObjects.Select(x=>(x as UIEffect).targetGraphic).ToArray()).FindProperty(!isAnyTMPro ? "m_Color" : "m_fontColor");
|
||||
}
|
||||
SerializedProperty spColor = serializedObject.FindProperty("m_Color");
|
||||
if (spColor == null && serializedObject.targetObject is UIEffect)
|
||||
{
|
||||
spColor = new SerializedObject(serializedObject.targetObjects.Select(x => (x as UIEffect).targetGraphic).ToArray()).FindProperty(!isAnyTMPro ? "m_Color" : "m_fontColor");
|
||||
}
|
||||
|
||||
EditorGUI.BeginChangeCheck ();
|
||||
EditorGUI.showMixedValue = spColor.hasMultipleDifferentValues;
|
||||
#if UNITY_2018_1_OR_NEWER
|
||||
spColor.colorValue = EditorGUILayout.ColorField (contentEffectColor, spColor.colorValue, true, false, false);
|
||||
#else
|
||||
EditorGUI.BeginChangeCheck();
|
||||
EditorGUI.showMixedValue = spColor.hasMultipleDifferentValues;
|
||||
#if UNITY_2018_1_OR_NEWER
|
||||
spColor.colorValue = EditorGUILayout.ColorField(contentEffectColor, spColor.colorValue, true, false, false);
|
||||
#else
|
||||
spColor.colorValue = EditorGUILayout.ColorField (contentEffectColor, spColor.colorValue, true, false, false, null);
|
||||
#endif
|
||||
if (EditorGUI.EndChangeCheck ()) {
|
||||
spColor.serializedObject.ApplyModifiedProperties ();
|
||||
}
|
||||
#endif
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
spColor.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorFactor"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorFactor"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
//================
|
||||
// Blur setting.
|
||||
//================
|
||||
var spBlurMode = serializedObject.FindProperty("m_BlurMode");
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(spBlurMode);
|
||||
//================
|
||||
// Blur setting.
|
||||
//================
|
||||
var spBlurMode = serializedObject.FindProperty("m_BlurMode");
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(spBlurMode);
|
||||
|
||||
// When blur is enable, show parameters.
|
||||
if (spBlurMode.intValue != (int)BlurMode.None)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor"));
|
||||
// When blur is enable, show parameters.
|
||||
if (spBlurMode.intValue != (int)BlurMode.None)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor"));
|
||||
|
||||
var spAdvancedBlur = serializedObject.FindProperty("m_AdvancedBlur");
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(spAdvancedBlur);
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
var spAdvancedBlur = serializedObject.FindProperty("m_AdvancedBlur");
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(spAdvancedBlur);
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
|
||||
c.ShowTMProWarning (_shader, _mobileShader, _spriteShader, mat => {});
|
||||
ShowCanvasChannelsWarning ();
|
||||
c.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat => { });
|
||||
ShowCanvasChannelsWarning();
|
||||
|
||||
ShowMaterialEditors (c.materials, 1, c.materials.Length - 1);
|
||||
ShowMaterialEditors(c.materials, 1, c.materials.Length - 1);
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable ();
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
|
||||
_shader = Shader.Find ("TextMeshPro/Distance Field (UIEffect)");
|
||||
_mobileShader = Shader.Find ("TextMeshPro/Mobile/Distance Field (UIEffect)");
|
||||
_spriteShader = Shader.Find ("TextMeshPro/Sprite (UIEffect)");
|
||||
}
|
||||
_shader = Shader.Find("TextMeshPro/Distance Field (UIEffect)");
|
||||
_mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UIEffect)");
|
||||
_spriteShader = Shader.Find("TextMeshPro/Sprite (UIEffect)");
|
||||
}
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
Shader _shader;
|
||||
Shader _mobileShader;
|
||||
Shader _spriteShader;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
Shader _shader;
|
||||
Shader _mobileShader;
|
||||
Shader _spriteShader;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,102 +1,101 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Coffee.UIExtensions.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIGradient))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIGradientEditor : Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIGradient))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIGradientEditor : Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
|
||||
//================
|
||||
// Direction.
|
||||
//================
|
||||
var spDirection = serializedObject.FindProperty("m_Direction");
|
||||
EditorGUILayout.PropertyField(spDirection);
|
||||
//================
|
||||
// Direction.
|
||||
//================
|
||||
var spDirection = serializedObject.FindProperty("m_Direction");
|
||||
EditorGUILayout.PropertyField(spDirection);
|
||||
|
||||
|
||||
//================
|
||||
// Color.
|
||||
//================
|
||||
var spColor1 = serializedObject.FindProperty("m_Color1");
|
||||
var spColor2 = serializedObject.FindProperty("m_Color2");
|
||||
var spColor3 = serializedObject.FindProperty("m_Color3");
|
||||
var spColor4 = serializedObject.FindProperty("m_Color4");
|
||||
switch ((UIGradient.Direction)spDirection.intValue)
|
||||
{
|
||||
case UIGradient.Direction.Horizontal:
|
||||
EditorGUILayout.PropertyField(spColor1, new GUIContent("Left"));
|
||||
EditorGUILayout.PropertyField(spColor2, new GUIContent("Right"));
|
||||
break;
|
||||
case UIGradient.Direction.Vertical:
|
||||
EditorGUILayout.PropertyField(spColor1, new GUIContent("Top"));
|
||||
EditorGUILayout.PropertyField(spColor2, new GUIContent("Bottom"));
|
||||
break;
|
||||
case UIGradient.Direction.Angle:
|
||||
EditorGUILayout.PropertyField(spColor1, new GUIContent("Color 1"));
|
||||
EditorGUILayout.PropertyField(spColor2, new GUIContent("Color 2"));
|
||||
break;
|
||||
case UIGradient.Direction.Diagonal:
|
||||
Rect r = EditorGUILayout.GetControlRect(false, 34);
|
||||
//================
|
||||
// Color.
|
||||
//================
|
||||
var spColor1 = serializedObject.FindProperty("m_Color1");
|
||||
var spColor2 = serializedObject.FindProperty("m_Color2");
|
||||
var spColor3 = serializedObject.FindProperty("m_Color3");
|
||||
var spColor4 = serializedObject.FindProperty("m_Color4");
|
||||
switch ((UIGradient.Direction)spDirection.intValue)
|
||||
{
|
||||
case UIGradient.Direction.Horizontal:
|
||||
EditorGUILayout.PropertyField(spColor1, new GUIContent("Left"));
|
||||
EditorGUILayout.PropertyField(spColor2, new GUIContent("Right"));
|
||||
break;
|
||||
case UIGradient.Direction.Vertical:
|
||||
EditorGUILayout.PropertyField(spColor1, new GUIContent("Top"));
|
||||
EditorGUILayout.PropertyField(spColor2, new GUIContent("Bottom"));
|
||||
break;
|
||||
case UIGradient.Direction.Angle:
|
||||
EditorGUILayout.PropertyField(spColor1, new GUIContent("Color 1"));
|
||||
EditorGUILayout.PropertyField(spColor2, new GUIContent("Color 2"));
|
||||
break;
|
||||
case UIGradient.Direction.Diagonal:
|
||||
Rect r = EditorGUILayout.GetControlRect(false, 34);
|
||||
|
||||
r = EditorGUI.PrefixLabel(r, new GUIContent("Diagonal Color"));
|
||||
float w = r.width / 2;
|
||||
r = EditorGUI.PrefixLabel(r, new GUIContent("Diagonal Color"));
|
||||
float w = r.width / 2;
|
||||
|
||||
EditorGUI.PropertyField(new Rect(r.x, r.y, w, 16), spColor3, GUIContent.none);
|
||||
EditorGUI.PropertyField(new Rect(r.x + w, r.y, w, 16), spColor4, GUIContent.none);
|
||||
EditorGUI.PropertyField(new Rect(r.x, r.y + 18, w, 16), spColor1, GUIContent.none);
|
||||
EditorGUI.PropertyField(new Rect(r.x + w, r.y + 18, w, 16), spColor2, GUIContent.none);
|
||||
break;
|
||||
}
|
||||
EditorGUI.PropertyField(new Rect(r.x, r.y, w, 16), spColor3, GUIContent.none);
|
||||
EditorGUI.PropertyField(new Rect(r.x + w, r.y, w, 16), spColor4, GUIContent.none);
|
||||
EditorGUI.PropertyField(new Rect(r.x, r.y + 18, w, 16), spColor1, GUIContent.none);
|
||||
EditorGUI.PropertyField(new Rect(r.x + w, r.y + 18, w, 16), spColor2, GUIContent.none);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
//================
|
||||
// Angle.
|
||||
//================
|
||||
if ((int)UIGradient.Direction.Angle <= spDirection.intValue)
|
||||
{
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Rotation"));
|
||||
}
|
||||
//================
|
||||
// Angle.
|
||||
//================
|
||||
if ((int)UIGradient.Direction.Angle <= spDirection.intValue)
|
||||
{
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Rotation"));
|
||||
}
|
||||
|
||||
|
||||
//================
|
||||
// Offset.
|
||||
//================
|
||||
if ((int)UIGradient.Direction.Diagonal == spDirection.intValue)
|
||||
{
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset1"), new GUIContent("Vertical Offset"));
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset2"), new GUIContent("Horizontal Offset"));
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset1"), new GUIContent("Offset"));
|
||||
}
|
||||
//================
|
||||
// Offset.
|
||||
//================
|
||||
if ((int)UIGradient.Direction.Diagonal == spDirection.intValue)
|
||||
{
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset1"), new GUIContent("Vertical Offset"));
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset2"), new GUIContent("Horizontal Offset"));
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset1"), new GUIContent("Offset"));
|
||||
}
|
||||
|
||||
|
||||
//================
|
||||
// Advanced options.
|
||||
//================
|
||||
EditorGUILayout.Space();
|
||||
EditorGUILayout.LabelField("Advanced Options", EditorStyles.boldLabel);
|
||||
EditorGUI.indentLevel++;
|
||||
{
|
||||
//if ((target as UIGradient).targetGraphic is Text)
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_GradientStyle"));
|
||||
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorSpace"));
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_IgnoreAspectRatio"));
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
//================
|
||||
// Advanced options.
|
||||
//================
|
||||
EditorGUILayout.Space();
|
||||
EditorGUILayout.LabelField("Advanced Options", EditorStyles.boldLabel);
|
||||
EditorGUI.indentLevel++;
|
||||
{
|
||||
//if ((target as UIGradient).targetGraphic is Text)
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_GradientStyle"));
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorSpace"));
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_IgnoreAspectRatio"));
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
|
||||
}
|
||||
}
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,84 +1,82 @@
|
||||
using UnityEditor;
|
||||
using UnityEditorInternal;
|
||||
using UnityEngine;
|
||||
using System.Linq;
|
||||
|
||||
namespace Coffee.UIExtensions.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIHsvModifier))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIHsvModifierEditor : BaseMeshEffectEditor
|
||||
{
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable ();
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIHsvModifier))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIHsvModifierEditor : BaseMeshEffectEditor
|
||||
{
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
|
||||
_spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
_spTargetColor = serializedObject.FindProperty("m_TargetColor");
|
||||
_spRange = serializedObject.FindProperty("m_Range");
|
||||
_spHue = serializedObject.FindProperty("m_Hue");
|
||||
_spSaturation = serializedObject.FindProperty("m_Saturation");
|
||||
_spValue = serializedObject.FindProperty("m_Value");
|
||||
_spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
_spTargetColor = serializedObject.FindProperty("m_TargetColor");
|
||||
_spRange = serializedObject.FindProperty("m_Range");
|
||||
_spHue = serializedObject.FindProperty("m_Hue");
|
||||
_spSaturation = serializedObject.FindProperty("m_Saturation");
|
||||
_spValue = serializedObject.FindProperty("m_Value");
|
||||
|
||||
_shader = Shader.Find ("TextMeshPro/Distance Field (UIHsvModifier)");
|
||||
_mobileShader = Shader.Find ("TextMeshPro/Mobile/Distance Field (UIHsvModifier)");
|
||||
_spriteShader = Shader.Find ("TextMeshPro/Sprite (UIHsvModifier)");
|
||||
}
|
||||
_shader = Shader.Find("TextMeshPro/Distance Field (UIHsvModifier)");
|
||||
_mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UIHsvModifier)");
|
||||
_spriteShader = Shader.Find("TextMeshPro/Sprite (UIHsvModifier)");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(_spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(_spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spTargetColor);
|
||||
EditorGUILayout.PropertyField(_spRange);
|
||||
EditorGUILayout.PropertyField(_spHue);
|
||||
EditorGUILayout.PropertyField(_spSaturation);
|
||||
EditorGUILayout.PropertyField(_spValue);
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spTargetColor);
|
||||
EditorGUILayout.PropertyField(_spRange);
|
||||
EditorGUILayout.PropertyField(_spHue);
|
||||
EditorGUILayout.PropertyField(_spSaturation);
|
||||
EditorGUILayout.PropertyField(_spValue);
|
||||
|
||||
var c = target as UIHsvModifier;
|
||||
c.ShowTMProWarning (_shader, _mobileShader, _spriteShader, mat => {});
|
||||
ShowCanvasChannelsWarning ();
|
||||
var c = target as UIHsvModifier;
|
||||
c.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat => { });
|
||||
ShowCanvasChannelsWarning();
|
||||
|
||||
ShowMaterialEditors (c.materials, 1, c.materials.Length - 1);
|
||||
ShowMaterialEditors(c.materials, 1, c.materials.Length - 1);
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
SerializedProperty _spMaterial;
|
||||
SerializedProperty _spTargetColor;
|
||||
SerializedProperty _spRange;
|
||||
SerializedProperty _spHue;
|
||||
SerializedProperty _spSaturation;
|
||||
SerializedProperty _spValue;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
SerializedProperty _spMaterial;
|
||||
SerializedProperty _spTargetColor;
|
||||
SerializedProperty _spRange;
|
||||
SerializedProperty _spHue;
|
||||
SerializedProperty _spSaturation;
|
||||
SerializedProperty _spValue;
|
||||
|
||||
Shader _shader;
|
||||
Shader _mobileShader;
|
||||
Shader _spriteShader;
|
||||
}
|
||||
Shader _shader;
|
||||
Shader _mobileShader;
|
||||
Shader _spriteShader;
|
||||
}
|
||||
}
|
@ -1,54 +1,52 @@
|
||||
using UnityEditor;
|
||||
using UnityEditorInternal;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Coffee.UIExtensions.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// UIShadow editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIShadow))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIShadowEditor : Editor
|
||||
{
|
||||
UIEffect uiEffect;
|
||||
/// <summary>
|
||||
/// UIShadow editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIShadow))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIShadowEditor : Editor
|
||||
{
|
||||
UIEffect uiEffect;
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
uiEffect = (target as UIShadow).GetComponent<UIEffect>();
|
||||
void OnEnable()
|
||||
{
|
||||
uiEffect = (target as UIShadow).GetComponent<UIEffect>();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
|
||||
//================
|
||||
// Shadow setting.
|
||||
//================
|
||||
var spShadowMode = serializedObject.FindProperty("m_Style");
|
||||
EditorGUILayout.PropertyField(spShadowMode);
|
||||
//================
|
||||
// Shadow setting.
|
||||
//================
|
||||
var spShadowMode = serializedObject.FindProperty("m_Style");
|
||||
EditorGUILayout.PropertyField(spShadowMode);
|
||||
|
||||
// When shadow is enable, show parameters.
|
||||
if (spShadowMode.intValue != (int)ShadowStyle.None)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectDistance"));
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectColor"));
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_UseGraphicAlpha"));
|
||||
// When shadow is enable, show parameters.
|
||||
if (spShadowMode.intValue != (int)ShadowStyle.None)
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectDistance"));
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectColor"));
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_UseGraphicAlpha"));
|
||||
|
||||
if (uiEffect && uiEffect.blurMode != BlurMode.None)
|
||||
{
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor"));
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
if (uiEffect && uiEffect.blurMode != BlurMode.None)
|
||||
{
|
||||
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor"));
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,135 +1,133 @@
|
||||
using UnityEditor;
|
||||
using UnityEditorInternal;
|
||||
using UnityEngine;
|
||||
using System.Linq;
|
||||
|
||||
namespace Coffee.UIExtensions.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIShiny))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIShinyEditor : BaseMeshEffectEditor
|
||||
{
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable ();
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UIShiny))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UIShinyEditor : BaseMeshEffectEditor
|
||||
{
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
|
||||
_spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
_spEffectFactor = serializedObject.FindProperty("m_EffectFactor");
|
||||
_spEffectArea = serializedObject.FindProperty("m_EffectArea");
|
||||
_spWidth = serializedObject.FindProperty("m_Width");
|
||||
_spRotation = serializedObject.FindProperty("m_Rotation");
|
||||
_spSoftness = serializedObject.FindProperty("m_Softness");
|
||||
_spBrightness = serializedObject.FindProperty("m_Brightness");
|
||||
_spGloss = serializedObject.FindProperty("m_Gloss");
|
||||
var player = serializedObject.FindProperty("m_Player");
|
||||
_spPlay = player.FindPropertyRelative("play");
|
||||
_spDuration = player.FindPropertyRelative("duration");
|
||||
_spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay");
|
||||
_spLoop = player.FindPropertyRelative("loop");
|
||||
_spLoopDelay = player.FindPropertyRelative("loopDelay");
|
||||
_spUpdateMode = player.FindPropertyRelative("updateMode");
|
||||
_spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
_spEffectFactor = serializedObject.FindProperty("m_EffectFactor");
|
||||
_spEffectArea = serializedObject.FindProperty("m_EffectArea");
|
||||
_spWidth = serializedObject.FindProperty("m_Width");
|
||||
_spRotation = serializedObject.FindProperty("m_Rotation");
|
||||
_spSoftness = serializedObject.FindProperty("m_Softness");
|
||||
_spBrightness = serializedObject.FindProperty("m_Brightness");
|
||||
_spGloss = serializedObject.FindProperty("m_Gloss");
|
||||
var player = serializedObject.FindProperty("m_Player");
|
||||
_spPlay = player.FindPropertyRelative("play");
|
||||
_spDuration = player.FindPropertyRelative("duration");
|
||||
_spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay");
|
||||
_spLoop = player.FindPropertyRelative("loop");
|
||||
_spLoopDelay = player.FindPropertyRelative("loopDelay");
|
||||
_spUpdateMode = player.FindPropertyRelative("updateMode");
|
||||
|
||||
|
||||
_shader = Shader.Find ("TextMeshPro/Distance Field (UIShiny)");
|
||||
_mobileShader = Shader.Find ("TextMeshPro/Mobile/Distance Field (UIShiny)");
|
||||
_spriteShader = Shader.Find ("TextMeshPro/Sprite (UIShiny)");
|
||||
}
|
||||
_shader = Shader.Find("TextMeshPro/Distance Field (UIShiny)");
|
||||
_mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UIShiny)");
|
||||
_spriteShader = Shader.Find("TextMeshPro/Sprite (UIShiny)");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(_spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(_spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spEffectFactor);
|
||||
EditorGUILayout.PropertyField(_spWidth);
|
||||
EditorGUILayout.PropertyField(_spRotation);
|
||||
EditorGUILayout.PropertyField(_spSoftness);
|
||||
EditorGUILayout.PropertyField(_spBrightness);
|
||||
EditorGUILayout.PropertyField(_spGloss);
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spEffectFactor);
|
||||
EditorGUILayout.PropertyField(_spWidth);
|
||||
EditorGUILayout.PropertyField(_spRotation);
|
||||
EditorGUILayout.PropertyField(_spSoftness);
|
||||
EditorGUILayout.PropertyField(_spBrightness);
|
||||
EditorGUILayout.PropertyField(_spGloss);
|
||||
|
||||
//================
|
||||
// Advanced option.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spEffectArea);
|
||||
//================
|
||||
// Advanced option.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spEffectArea);
|
||||
|
||||
//================
|
||||
// Effect player.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spPlay);
|
||||
EditorGUILayout.PropertyField(_spDuration);
|
||||
EditorGUILayout.PropertyField(_spInitialPlayDelay);
|
||||
EditorGUILayout.PropertyField(_spLoop);
|
||||
EditorGUILayout.PropertyField(_spLoopDelay);
|
||||
EditorGUILayout.PropertyField(_spUpdateMode);
|
||||
//================
|
||||
// Effect player.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spPlay);
|
||||
EditorGUILayout.PropertyField(_spDuration);
|
||||
EditorGUILayout.PropertyField(_spInitialPlayDelay);
|
||||
EditorGUILayout.PropertyField(_spLoop);
|
||||
EditorGUILayout.PropertyField(_spLoopDelay);
|
||||
EditorGUILayout.PropertyField(_spUpdateMode);
|
||||
|
||||
// Debug.
|
||||
using (new EditorGUI.DisabledGroupScope(!Application.isPlaying))
|
||||
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
|
||||
{
|
||||
GUILayout.Label("Debug");
|
||||
// Debug.
|
||||
using (new EditorGUI.DisabledGroupScope(!Application.isPlaying))
|
||||
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
|
||||
{
|
||||
GUILayout.Label("Debug");
|
||||
|
||||
if (GUILayout.Button("Play", "ButtonLeft"))
|
||||
{
|
||||
(target as UIShiny).Play();
|
||||
}
|
||||
if (GUILayout.Button("Play", "ButtonLeft"))
|
||||
{
|
||||
(target as UIShiny).Play();
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Stop", "ButtonRight"))
|
||||
{
|
||||
(target as UIShiny).Stop();
|
||||
}
|
||||
}
|
||||
if (GUILayout.Button("Stop", "ButtonRight"))
|
||||
{
|
||||
(target as UIShiny).Stop();
|
||||
}
|
||||
}
|
||||
|
||||
var c = target as UIShiny;
|
||||
c.ShowTMProWarning (_shader, _mobileShader, _spriteShader, mat => {});
|
||||
ShowCanvasChannelsWarning ();
|
||||
var c = target as UIShiny;
|
||||
c.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat => { });
|
||||
ShowCanvasChannelsWarning();
|
||||
|
||||
ShowMaterialEditors (c.materials, 1, c.materials.Length - 1);
|
||||
ShowMaterialEditors(c.materials, 1, c.materials.Length - 1);
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
SerializedProperty _spMaterial;
|
||||
SerializedProperty _spEffectFactor;
|
||||
SerializedProperty _spWidth;
|
||||
SerializedProperty _spRotation;
|
||||
SerializedProperty _spSoftness;
|
||||
SerializedProperty _spBrightness;
|
||||
SerializedProperty _spGloss;
|
||||
SerializedProperty _spEffectArea;
|
||||
SerializedProperty _spPlay;
|
||||
SerializedProperty _spLoop;
|
||||
SerializedProperty _spLoopDelay;
|
||||
SerializedProperty _spDuration;
|
||||
SerializedProperty _spInitialPlayDelay;
|
||||
SerializedProperty _spUpdateMode;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
SerializedProperty _spMaterial;
|
||||
SerializedProperty _spEffectFactor;
|
||||
SerializedProperty _spWidth;
|
||||
SerializedProperty _spRotation;
|
||||
SerializedProperty _spSoftness;
|
||||
SerializedProperty _spBrightness;
|
||||
SerializedProperty _spGloss;
|
||||
SerializedProperty _spEffectArea;
|
||||
SerializedProperty _spPlay;
|
||||
SerializedProperty _spLoop;
|
||||
SerializedProperty _spLoopDelay;
|
||||
SerializedProperty _spDuration;
|
||||
SerializedProperty _spInitialPlayDelay;
|
||||
SerializedProperty _spUpdateMode;
|
||||
|
||||
Shader _shader;
|
||||
Shader _mobileShader;
|
||||
Shader _spriteShader;
|
||||
}
|
||||
Shader _shader;
|
||||
Shader _mobileShader;
|
||||
Shader _spriteShader;
|
||||
}
|
||||
}
|
@ -1,190 +1,189 @@
|
||||
using UnityEditor;
|
||||
using UnityEditorInternal;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using System.Linq;
|
||||
|
||||
namespace Coffee.UIExtensions.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UITransitionEffect))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UITransitionEffectEditor : BaseMeshEffectEditor
|
||||
{
|
||||
static int s_NoiseTexId;
|
||||
/// <summary>
|
||||
/// UIEffect editor.
|
||||
/// </summary>
|
||||
[CustomEditor(typeof(UITransitionEffect))]
|
||||
[CanEditMultipleObjects]
|
||||
public class UITransitionEffectEditor : BaseMeshEffectEditor
|
||||
{
|
||||
static int s_NoiseTexId;
|
||||
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
//################################
|
||||
// Public/Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
|
||||
_spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
_spEffectMode = serializedObject.FindProperty("m_EffectMode");
|
||||
_spEffectFactor = serializedObject.FindProperty("m_EffectFactor");
|
||||
_spEffectArea = serializedObject.FindProperty("m_EffectArea");
|
||||
_spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio");
|
||||
_spDissolveWidth = serializedObject.FindProperty("m_DissolveWidth");
|
||||
_spDissolveSoftness = serializedObject.FindProperty("m_DissolveSoftness");
|
||||
_spDissolveColor = serializedObject.FindProperty("m_DissolveColor");
|
||||
_spTransitionTexture = serializedObject.FindProperty("m_TransitionTexture");
|
||||
var player = serializedObject.FindProperty("m_Player");
|
||||
_spPlay = player.FindPropertyRelative("play");
|
||||
_spDuration = player.FindPropertyRelative("duration");
|
||||
_spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay");
|
||||
_spLoop = player.FindPropertyRelative("loop");
|
||||
_spLoopDelay = player.FindPropertyRelative("loopDelay");
|
||||
_spUpdateMode = player.FindPropertyRelative("updateMode");
|
||||
_spPassRayOnHidden = serializedObject.FindProperty("m_PassRayOnHidden");
|
||||
_spMaterial = serializedObject.FindProperty("m_EffectMaterial");
|
||||
_spEffectMode = serializedObject.FindProperty("m_EffectMode");
|
||||
_spEffectFactor = serializedObject.FindProperty("m_EffectFactor");
|
||||
_spEffectArea = serializedObject.FindProperty("m_EffectArea");
|
||||
_spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio");
|
||||
_spDissolveWidth = serializedObject.FindProperty("m_DissolveWidth");
|
||||
_spDissolveSoftness = serializedObject.FindProperty("m_DissolveSoftness");
|
||||
_spDissolveColor = serializedObject.FindProperty("m_DissolveColor");
|
||||
_spTransitionTexture = serializedObject.FindProperty("m_TransitionTexture");
|
||||
var player = serializedObject.FindProperty("m_Player");
|
||||
_spPlay = player.FindPropertyRelative("play");
|
||||
_spDuration = player.FindPropertyRelative("duration");
|
||||
_spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay");
|
||||
_spLoop = player.FindPropertyRelative("loop");
|
||||
_spLoopDelay = player.FindPropertyRelative("loopDelay");
|
||||
_spUpdateMode = player.FindPropertyRelative("updateMode");
|
||||
_spPassRayOnHidden = serializedObject.FindProperty("m_PassRayOnHidden");
|
||||
|
||||
s_NoiseTexId = Shader.PropertyToID("_NoiseTex");
|
||||
s_NoiseTexId = Shader.PropertyToID("_NoiseTex");
|
||||
|
||||
_shader = Shader.Find("TextMeshPro/Distance Field (UITransition)");
|
||||
_mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UITransition)");
|
||||
_spriteShader = Shader.Find("TextMeshPro/Sprite (UITransition)");
|
||||
}
|
||||
_shader = Shader.Find("TextMeshPro/Distance Field (UITransition)");
|
||||
_mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UITransition)");
|
||||
_spriteShader = Shader.Find("TextMeshPro/Sprite (UITransition)");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
foreach (var d in targets.Cast<UITransitionEffect> ())
|
||||
{
|
||||
var mat = d.material;
|
||||
if (d.isTMPro && mat && mat.HasProperty (s_NoiseTexId))
|
||||
{
|
||||
Texture noiseTexture = mat.GetTexture (s_NoiseTexId);
|
||||
UITransitionEffect.EffectMode mode =
|
||||
mat.IsKeywordEnabled ("CUTOFF") ? UITransitionEffect.EffectMode.Cutoff
|
||||
: mat.IsKeywordEnabled ("FADE") ? UITransitionEffect.EffectMode.Fade
|
||||
: mat.IsKeywordEnabled ("DISSOLVE") ? UITransitionEffect.EffectMode.Dissolve
|
||||
: (UITransitionEffect.EffectMode)0;
|
||||
/// <summary>
|
||||
/// Implement this function to make a custom inspector.
|
||||
/// </summary>
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
foreach (var d in targets.Cast<UITransitionEffect>())
|
||||
{
|
||||
var mat = d.material;
|
||||
if (d.isTMPro && mat && mat.HasProperty(s_NoiseTexId))
|
||||
{
|
||||
Texture noiseTexture = mat.GetTexture(s_NoiseTexId);
|
||||
UITransitionEffect.EffectMode mode =
|
||||
mat.IsKeywordEnabled("CUTOFF") ? UITransitionEffect.EffectMode.Cutoff
|
||||
: mat.IsKeywordEnabled("FADE") ? UITransitionEffect.EffectMode.Fade
|
||||
: mat.IsKeywordEnabled("DISSOLVE") ? UITransitionEffect.EffectMode.Dissolve
|
||||
: (UITransitionEffect.EffectMode)0;
|
||||
|
||||
if (mode == (UITransitionEffect.EffectMode)0)
|
||||
{
|
||||
mode = UITransitionEffect.EffectMode.Cutoff;
|
||||
mat.EnableKeyword ("CUTOFF");
|
||||
}
|
||||
if (mode == (UITransitionEffect.EffectMode)0)
|
||||
{
|
||||
mode = UITransitionEffect.EffectMode.Cutoff;
|
||||
mat.EnableKeyword("CUTOFF");
|
||||
}
|
||||
|
||||
bool hasChanged = d.transitionTexture != noiseTexture || d.effectMode != mode;
|
||||
bool hasChanged = d.transitionTexture != noiseTexture || d.effectMode != mode;
|
||||
|
||||
if (hasChanged)
|
||||
{
|
||||
var so = new SerializedObject (d);
|
||||
so.FindProperty ("m_TransitionTexture").objectReferenceValue = noiseTexture;
|
||||
so.FindProperty ("m_EffectMode").intValue = (int)mode;
|
||||
so.ApplyModifiedProperties ();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hasChanged)
|
||||
{
|
||||
var so = new SerializedObject(d);
|
||||
so.FindProperty("m_TransitionTexture").objectReferenceValue = noiseTexture;
|
||||
so.FindProperty("m_EffectMode").intValue = (int)mode;
|
||||
so.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
serializedObject.Update();
|
||||
serializedObject.Update();
|
||||
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(_spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
//================
|
||||
// Effect material.
|
||||
//================
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.PropertyField(_spMaterial);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
bool isAnyTMPro = targets.Cast<UITransitionEffect>().Any(x => x.isTMPro);
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(_spEffectMode);
|
||||
//================
|
||||
// Effect setting.
|
||||
//================
|
||||
bool isAnyTMPro = targets.Cast<UITransitionEffect>().Any(x => x.isTMPro);
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(_spEffectMode);
|
||||
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(_spEffectFactor);
|
||||
if (_spEffectMode.intValue == (int)UITransitionEffect.EffectMode.Dissolve)
|
||||
{
|
||||
EditorGUILayout.PropertyField(_spDissolveWidth);
|
||||
EditorGUILayout.PropertyField(_spDissolveSoftness);
|
||||
EditorGUILayout.PropertyField(_spDissolveColor);
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(_spEffectFactor);
|
||||
if (_spEffectMode.intValue == (int)UITransitionEffect.EffectMode.Dissolve)
|
||||
{
|
||||
EditorGUILayout.PropertyField(_spDissolveWidth);
|
||||
EditorGUILayout.PropertyField(_spDissolveSoftness);
|
||||
EditorGUILayout.PropertyField(_spDissolveColor);
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
|
||||
//================
|
||||
// Advanced option.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spEffectArea);
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(_spTransitionTexture);
|
||||
EditorGUILayout.PropertyField(_spKeepAspectRatio);
|
||||
EditorGUILayout.PropertyField(_spPassRayOnHidden);
|
||||
//================
|
||||
// Advanced option.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spEffectArea);
|
||||
using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
|
||||
EditorGUILayout.PropertyField(_spTransitionTexture);
|
||||
EditorGUILayout.PropertyField(_spKeepAspectRatio);
|
||||
EditorGUILayout.PropertyField(_spPassRayOnHidden);
|
||||
|
||||
//================
|
||||
// Effect player.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spPlay);
|
||||
EditorGUILayout.PropertyField(_spDuration);
|
||||
EditorGUILayout.PropertyField(_spInitialPlayDelay);
|
||||
EditorGUILayout.PropertyField(_spLoop);
|
||||
EditorGUILayout.PropertyField(_spLoopDelay);
|
||||
EditorGUILayout.PropertyField(_spUpdateMode);
|
||||
//================
|
||||
// Effect player.
|
||||
//================
|
||||
EditorGUILayout.PropertyField(_spPlay);
|
||||
EditorGUILayout.PropertyField(_spDuration);
|
||||
EditorGUILayout.PropertyField(_spInitialPlayDelay);
|
||||
EditorGUILayout.PropertyField(_spLoop);
|
||||
EditorGUILayout.PropertyField(_spLoopDelay);
|
||||
EditorGUILayout.PropertyField(_spUpdateMode);
|
||||
|
||||
// Debug.
|
||||
using (new EditorGUI.DisabledGroupScope(!Application.isPlaying))
|
||||
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
|
||||
{
|
||||
GUILayout.Label("Debug");
|
||||
// Debug.
|
||||
using (new EditorGUI.DisabledGroupScope(!Application.isPlaying))
|
||||
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
|
||||
{
|
||||
GUILayout.Label("Debug");
|
||||
|
||||
if (GUILayout.Button("Show", "ButtonLeft"))
|
||||
{
|
||||
(target as UITransitionEffect).Show();
|
||||
}
|
||||
if (GUILayout.Button("Show", "ButtonLeft"))
|
||||
{
|
||||
(target as UITransitionEffect).Show();
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Hide", "ButtonRight"))
|
||||
{
|
||||
(target as UITransitionEffect).Hide();
|
||||
}
|
||||
}
|
||||
if (GUILayout.Button("Hide", "ButtonRight"))
|
||||
{
|
||||
(target as UITransitionEffect).Hide();
|
||||
}
|
||||
}
|
||||
|
||||
var current = target as UITransitionEffect;
|
||||
current.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat =>
|
||||
{
|
||||
if (mat.shader == _spriteShader)
|
||||
{
|
||||
mat.shaderKeywords = current.material.shaderKeywords;
|
||||
mat.SetTexture(s_NoiseTexId, current.material.GetTexture(s_NoiseTexId));
|
||||
}
|
||||
});
|
||||
ShowCanvasChannelsWarning();
|
||||
var current = target as UITransitionEffect;
|
||||
current.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat =>
|
||||
{
|
||||
if (mat.shader == _spriteShader)
|
||||
{
|
||||
mat.shaderKeywords = current.material.shaderKeywords;
|
||||
mat.SetTexture(s_NoiseTexId, current.material.GetTexture(s_NoiseTexId));
|
||||
}
|
||||
});
|
||||
ShowCanvasChannelsWarning();
|
||||
|
||||
ShowMaterialEditors(current.materials, 1, current.materials.Length - 1);
|
||||
ShowMaterialEditors(current.materials, 1, current.materials.Length - 1);
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
SerializedProperty _spMaterial;
|
||||
SerializedProperty _spEffectMode;
|
||||
SerializedProperty _spEffectFactor;
|
||||
SerializedProperty _spEffectArea;
|
||||
SerializedProperty _spKeepAspectRatio;
|
||||
SerializedProperty _spDissolveWidth;
|
||||
SerializedProperty _spDissolveSoftness;
|
||||
SerializedProperty _spDissolveColor;
|
||||
SerializedProperty _spTransitionTexture;
|
||||
SerializedProperty _spPlay;
|
||||
SerializedProperty _spLoop;
|
||||
SerializedProperty _spLoopDelay;
|
||||
SerializedProperty _spDuration;
|
||||
SerializedProperty _spInitialPlayDelay;
|
||||
SerializedProperty _spUpdateMode;
|
||||
SerializedProperty _spPassRayOnHidden;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
SerializedProperty _spMaterial;
|
||||
SerializedProperty _spEffectMode;
|
||||
SerializedProperty _spEffectFactor;
|
||||
SerializedProperty _spEffectArea;
|
||||
SerializedProperty _spKeepAspectRatio;
|
||||
SerializedProperty _spDissolveWidth;
|
||||
SerializedProperty _spDissolveSoftness;
|
||||
SerializedProperty _spDissolveColor;
|
||||
SerializedProperty _spTransitionTexture;
|
||||
SerializedProperty _spPlay;
|
||||
SerializedProperty _spLoop;
|
||||
SerializedProperty _spLoopDelay;
|
||||
SerializedProperty _spDuration;
|
||||
SerializedProperty _spInitialPlayDelay;
|
||||
SerializedProperty _spUpdateMode;
|
||||
SerializedProperty _spPassRayOnHidden;
|
||||
|
||||
Shader _shader;
|
||||
Shader _mobileShader;
|
||||
Shader _spriteShader;
|
||||
}
|
||||
Shader _shader;
|
||||
Shader _mobileShader;
|
||||
Shader _spriteShader;
|
||||
}
|
||||
}
|
@ -1,432 +1,434 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.Serialization;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Dissolve effect for uGUI.
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/UIEffect/UIDissolve", 3)]
|
||||
public class UIDissolve : UIEffectBase
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-Effect-Dissolve";
|
||||
static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex");
|
||||
/// <summary>
|
||||
/// Dissolve effect for uGUI.
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/UIEffect/UIDissolve", 3)]
|
||||
public class UIDissolve : UIEffectBase
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-Effect-Dissolve";
|
||||
static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex");
|
||||
|
||||
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Current location[0-1] for dissolve effect. 0 is not dissolved, 1 is completely dissolved.")]
|
||||
[FormerlySerializedAs("m_Location")]
|
||||
[SerializeField] [Range(0, 1)] float m_EffectFactor = 0.5f;
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Current location[0-1] for dissolve effect. 0 is not dissolved, 1 is completely dissolved.")]
|
||||
[FormerlySerializedAs("m_Location")]
|
||||
[SerializeField][Range(0, 1)] float m_EffectFactor = 0.5f;
|
||||
|
||||
[Tooltip("Edge width.")]
|
||||
[SerializeField] [Range(0, 1)] float m_Width = 0.5f;
|
||||
[Tooltip("Edge width.")]
|
||||
[SerializeField][Range(0, 1)] float m_Width = 0.5f;
|
||||
|
||||
[Tooltip("Edge softness.")]
|
||||
[SerializeField] [Range(0, 1)] float m_Softness = 0.5f;
|
||||
[Tooltip("Edge softness.")]
|
||||
[SerializeField][Range(0, 1)] float m_Softness = 0.5f;
|
||||
|
||||
[Tooltip("Edge color.")]
|
||||
[SerializeField] [ColorUsage(false)] Color m_Color = new Color(0.0f, 0.25f, 1.0f);
|
||||
[Tooltip("Edge color.")]
|
||||
[SerializeField][ColorUsage(false)] Color m_Color = new Color(0.0f, 0.25f, 1.0f);
|
||||
|
||||
[Tooltip("Edge color effect mode.")]
|
||||
[SerializeField] ColorMode m_ColorMode = ColorMode.Add;
|
||||
[Tooltip("Edge color effect mode.")]
|
||||
[SerializeField] ColorMode m_ColorMode = ColorMode.Add;
|
||||
|
||||
[Tooltip("Noise texture for dissolving (single channel texture).")]
|
||||
[SerializeField] Texture m_NoiseTexture;
|
||||
[Tooltip("Noise texture for dissolving (single channel texture).")]
|
||||
[SerializeField] Texture m_NoiseTexture;
|
||||
|
||||
[Header("Advanced Option")]
|
||||
[Tooltip("The area for effect.")]
|
||||
[SerializeField] protected EffectArea m_EffectArea;
|
||||
[Header("Advanced Option")]
|
||||
[Tooltip("The area for effect.")]
|
||||
[SerializeField] protected EffectArea m_EffectArea;
|
||||
|
||||
[Tooltip("Keep effect aspect ratio.")]
|
||||
[SerializeField] bool m_KeepAspectRatio;
|
||||
[Tooltip("Keep effect aspect ratio.")]
|
||||
[SerializeField] bool m_KeepAspectRatio;
|
||||
|
||||
[Header("Effect Player")]
|
||||
[SerializeField] EffectPlayer m_Player;
|
||||
[Header("Effect Player")]
|
||||
[SerializeField] EffectPlayer m_Player;
|
||||
|
||||
[Tooltip("Reverse the dissolve effect.")]
|
||||
[FormerlySerializedAs("m_ReverseAnimation")]
|
||||
[SerializeField] bool m_Reverse = false;
|
||||
[Tooltip("Reverse the dissolve effect.")]
|
||||
[FormerlySerializedAs("m_ReverseAnimation")]
|
||||
[SerializeField] bool m_Reverse = false;
|
||||
|
||||
#pragma warning disable 0414
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField][Range(0.1f, 10)] float m_Duration = 1;
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField] AnimatorUpdateMode m_UpdateMode = AnimatorUpdateMode.Normal;
|
||||
#pragma warning restore 0414
|
||||
#pragma warning disable 0414
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField][Range(0.1f, 10)] float m_Duration = 1;
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField] AnimatorUpdateMode m_UpdateMode = AnimatorUpdateMode.Normal;
|
||||
#pragma warning restore 0414
|
||||
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
|
||||
/// <summary>
|
||||
/// Effect factor between 0(start) and 1(end).
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
|
||||
public float location
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_EffectFactor, value))
|
||||
{
|
||||
m_EffectFactor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Effect factor between 0(start) and 1(end).
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
|
||||
public float location
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_EffectFactor, value))
|
||||
{
|
||||
m_EffectFactor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Effect factor between 0(start) and 1(end).
|
||||
/// </summary>
|
||||
public float effectFactor
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_EffectFactor, value))
|
||||
{
|
||||
m_EffectFactor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Effect factor between 0(start) and 1(end).
|
||||
/// </summary>
|
||||
public float effectFactor
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_EffectFactor, value))
|
||||
{
|
||||
m_EffectFactor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Edge width.
|
||||
/// </summary>
|
||||
public float width
|
||||
{
|
||||
get { return m_Width; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Width, value))
|
||||
{
|
||||
m_Width = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Edge width.
|
||||
/// </summary>
|
||||
public float width
|
||||
{
|
||||
get { return m_Width; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Width, value))
|
||||
{
|
||||
m_Width = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Edge softness.
|
||||
/// </summary>
|
||||
public float softness
|
||||
{
|
||||
get { return m_Softness; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Softness, value))
|
||||
{
|
||||
m_Softness = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Edge softness.
|
||||
/// </summary>
|
||||
public float softness
|
||||
{
|
||||
get { return m_Softness; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Softness, value))
|
||||
{
|
||||
m_Softness = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Edge color.
|
||||
/// </summary>
|
||||
public Color color
|
||||
{
|
||||
get { return m_Color; }
|
||||
set
|
||||
{
|
||||
if (m_Color != value)
|
||||
{
|
||||
m_Color = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Edge color.
|
||||
/// </summary>
|
||||
public Color color
|
||||
{
|
||||
get { return m_Color; }
|
||||
set
|
||||
{
|
||||
if (m_Color != value)
|
||||
{
|
||||
m_Color = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Noise texture.
|
||||
/// </summary>
|
||||
public Texture noiseTexture
|
||||
{
|
||||
get { return m_NoiseTexture ?? material.GetTexture("_NoiseTex"); }
|
||||
set
|
||||
{
|
||||
if (m_NoiseTexture != value)
|
||||
{
|
||||
m_NoiseTexture = value;
|
||||
if (graphic)
|
||||
{
|
||||
ModifyMaterial();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Noise texture.
|
||||
/// </summary>
|
||||
public Texture noiseTexture
|
||||
{
|
||||
get { return m_NoiseTexture ?? material.GetTexture("_NoiseTex"); }
|
||||
set
|
||||
{
|
||||
if (m_NoiseTexture != value)
|
||||
{
|
||||
m_NoiseTexture = value;
|
||||
if (graphic)
|
||||
{
|
||||
ModifyMaterial();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The area for effect.
|
||||
/// </summary>
|
||||
public EffectArea effectArea
|
||||
{
|
||||
get { return m_EffectArea; }
|
||||
set
|
||||
{
|
||||
if (m_EffectArea != value)
|
||||
{
|
||||
m_EffectArea = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// The area for effect.
|
||||
/// </summary>
|
||||
public EffectArea effectArea
|
||||
{
|
||||
get { return m_EffectArea; }
|
||||
set
|
||||
{
|
||||
if (m_EffectArea != value)
|
||||
{
|
||||
m_EffectArea = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Keep aspect ratio.
|
||||
/// </summary>
|
||||
public bool keepAspectRatio
|
||||
{
|
||||
get { return m_KeepAspectRatio; }
|
||||
set
|
||||
{
|
||||
if (m_KeepAspectRatio != value)
|
||||
{
|
||||
m_KeepAspectRatio = value;
|
||||
SetVerticesDirty ();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Keep aspect ratio.
|
||||
/// </summary>
|
||||
public bool keepAspectRatio
|
||||
{
|
||||
get { return m_KeepAspectRatio; }
|
||||
set
|
||||
{
|
||||
if (m_KeepAspectRatio != value)
|
||||
{
|
||||
m_KeepAspectRatio = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Color effect mode.
|
||||
/// </summary>
|
||||
public ColorMode colorMode { get { return m_ColorMode; } }
|
||||
/// <summary>
|
||||
/// Color effect mode.
|
||||
/// </summary>
|
||||
public ColorMode colorMode { get { return m_ColorMode; } }
|
||||
|
||||
/// <summary>
|
||||
/// Play effect on enable.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use Play/Stop method instead")]
|
||||
public bool play { get { return _player.play; } set { _player.play = value; } }
|
||||
/// <summary>
|
||||
/// Play effect on enable.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use Play/Stop method instead")]
|
||||
public bool play { get { return _player.play; } set { _player.play = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Play effect loop.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
public bool loop { get { return _player.loop; } set { _player.loop = value; } }
|
||||
/// <summary>
|
||||
/// Play effect loop.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
public bool loop { get { return _player.loop; } set { _player.loop = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// The duration for playing effect.
|
||||
/// </summary>
|
||||
public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } }
|
||||
/// <summary>
|
||||
/// The duration for playing effect.
|
||||
/// </summary>
|
||||
public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } }
|
||||
|
||||
/// <summary>
|
||||
/// Delay on loop effect.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
public float loopDelay { get { return _player.loopDelay; } set { _player.loopDelay = Mathf.Max(value, 0); } }
|
||||
/// <summary>
|
||||
/// Delay on loop effect.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
public float loopDelay { get { return _player.loopDelay; } set { _player.loopDelay = Mathf.Max(value, 0); } }
|
||||
|
||||
/// <summary>
|
||||
/// Update mode for playing effect.
|
||||
/// </summary>
|
||||
public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } }
|
||||
/// <summary>
|
||||
/// Update mode for playing effect.
|
||||
/// </summary>
|
||||
public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Reverse the dissolve effect.
|
||||
/// </summary>
|
||||
public bool reverse { get { return m_Reverse; } set { m_Reverse = value; } }
|
||||
/// <summary>
|
||||
/// Reverse the dissolve effect.
|
||||
/// </summary>
|
||||
public bool reverse { get { return m_Reverse; } set { m_Reverse = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public override ParameterTexture ptex { get { return _ptex; } }
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public override ParameterTexture ptex { get { return _ptex; } }
|
||||
|
||||
/// <summary>
|
||||
/// Modifies the material.
|
||||
/// </summary>
|
||||
public override void ModifyMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return;
|
||||
}
|
||||
/// <summary>
|
||||
/// Modifies the material.
|
||||
/// </summary>
|
||||
public override void ModifyMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ulong hash = (m_NoiseTexture ? (uint)m_NoiseTexture.GetInstanceID() : 0) + ((ulong)1 << 32) + ((ulong)m_ColorMode << 36);
|
||||
if (_materialCache != null && (_materialCache.hash != hash || !isActiveAndEnabled || !m_EffectMaterial))
|
||||
{
|
||||
MaterialCache.Unregister(_materialCache);
|
||||
_materialCache = null;
|
||||
}
|
||||
ulong hash = (m_NoiseTexture ? (uint)m_NoiseTexture.GetInstanceID() : 0) + ((ulong)1 << 32) + ((ulong)m_ColorMode << 36);
|
||||
if (_materialCache != null && (_materialCache.hash != hash || !isActiveAndEnabled || !m_EffectMaterial))
|
||||
{
|
||||
MaterialCache.Unregister(_materialCache);
|
||||
_materialCache = null;
|
||||
}
|
||||
|
||||
if (!isActiveAndEnabled || !m_EffectMaterial)
|
||||
{
|
||||
material = null;
|
||||
}
|
||||
else if (!m_NoiseTexture)
|
||||
{
|
||||
material = m_EffectMaterial;
|
||||
}
|
||||
else if (_materialCache != null && _materialCache.hash == hash)
|
||||
{
|
||||
material = _materialCache.material;
|
||||
}
|
||||
else
|
||||
{
|
||||
_materialCache = MaterialCache.Register(hash, m_NoiseTexture, () =>
|
||||
{
|
||||
var mat = new Material(m_EffectMaterial);
|
||||
mat.name += "_" + m_NoiseTexture.name;
|
||||
mat.SetTexture("_NoiseTex", m_NoiseTexture);
|
||||
return mat;
|
||||
});
|
||||
material = _materialCache.material;
|
||||
}
|
||||
}
|
||||
if (!isActiveAndEnabled || !m_EffectMaterial)
|
||||
{
|
||||
material = null;
|
||||
}
|
||||
else if (!m_NoiseTexture)
|
||||
{
|
||||
material = m_EffectMaterial;
|
||||
}
|
||||
else if (_materialCache != null && _materialCache.hash == hash)
|
||||
{
|
||||
material = _materialCache.material;
|
||||
}
|
||||
else
|
||||
{
|
||||
_materialCache = MaterialCache.Register(hash, m_NoiseTexture, () =>
|
||||
{
|
||||
var mat = new Material(m_EffectMaterial);
|
||||
mat.name += "_" + m_NoiseTexture.name;
|
||||
mat.SetTexture("_NoiseTex", m_NoiseTexture);
|
||||
return mat;
|
||||
});
|
||||
material = _materialCache.material;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
return;
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
return;
|
||||
|
||||
bool isText = isTMPro || graphic is Text;
|
||||
float normalizedIndex = ptex.GetNormalizedIndex(this);
|
||||
bool isText = isTMPro || graphic is Text;
|
||||
float normalizedIndex = ptex.GetNormalizedIndex(this);
|
||||
|
||||
// rect.
|
||||
var tex = noiseTexture;
|
||||
var aspectRatio = m_KeepAspectRatio && tex ? ((float)tex.width) / tex.height : -1;
|
||||
Rect rect = m_EffectArea.GetEffectArea(vh, rectTransform.rect, aspectRatio);
|
||||
// rect.
|
||||
var tex = noiseTexture;
|
||||
var aspectRatio = m_KeepAspectRatio && tex ? ((float)tex.width) / tex.height : -1;
|
||||
Rect rect = m_EffectArea.GetEffectArea(vh, rectTransform.rect, aspectRatio);
|
||||
|
||||
// Calculate vertex position.
|
||||
UIVertex vertex = default(UIVertex);
|
||||
float x, y;
|
||||
int count = vh.currentVertCount;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
m_EffectArea.GetPositionFactor (i, rect, vertex.position, isText, isTMPro, out x, out y);
|
||||
// Calculate vertex position.
|
||||
UIVertex vertex = default(UIVertex);
|
||||
float x, y;
|
||||
int count = vh.currentVertCount;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
m_EffectArea.GetPositionFactor(i, rect, vertex.position, isText, isTMPro, out x, out y);
|
||||
|
||||
vertex.uv0 = new Vector2(
|
||||
Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
|
||||
Packer.ToFloat(x, y, normalizedIndex)
|
||||
);
|
||||
// if(!isTMPro)
|
||||
// {
|
||||
// vertex.uv0 = new Vector2(
|
||||
// Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
|
||||
// Packer.ToFloat(x, y, normalizedIndex)
|
||||
// );
|
||||
// }
|
||||
// #if UNITY_5_6_OR_NEWER
|
||||
// else
|
||||
// {
|
||||
// vertex.uv2 = new Vector2 (
|
||||
// Packer.ToFloat (x, y, normalizedIndex),
|
||||
// 0
|
||||
// );
|
||||
// }
|
||||
// #endif
|
||||
vertex.uv0 = new Vector2(
|
||||
Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
|
||||
Packer.ToFloat(x, y, normalizedIndex)
|
||||
);
|
||||
// if(!isTMPro)
|
||||
// {
|
||||
// vertex.uv0 = new Vector2(
|
||||
// Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
|
||||
// Packer.ToFloat(x, y, normalizedIndex)
|
||||
// );
|
||||
// }
|
||||
// #if UNITY_5_6_OR_NEWER
|
||||
// else
|
||||
// {
|
||||
// vertex.uv2 = new Vector2 (
|
||||
// Packer.ToFloat (x, y, normalizedIndex),
|
||||
// 0
|
||||
// );
|
||||
// }
|
||||
// #endif
|
||||
|
||||
vh.SetUIVertex(vertex, i);
|
||||
}
|
||||
}
|
||||
vh.SetUIVertex(vertex, i);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void SetDirty()
|
||||
{
|
||||
foreach(var m in materials)
|
||||
{
|
||||
ptex.RegisterMaterial (m);
|
||||
}
|
||||
ptex.SetData(this, 0, m_EffectFactor); // param1.x : location
|
||||
ptex.SetData(this, 1, m_Width); // param1.y : width
|
||||
ptex.SetData(this, 2, m_Softness); // param1.z : softness
|
||||
ptex.SetData(this, 4, m_Color.r); // param2.x : red
|
||||
ptex.SetData(this, 5, m_Color.g); // param2.y : green
|
||||
ptex.SetData(this, 6, m_Color.b); // param2.z : blue
|
||||
}
|
||||
protected override void SetDirty()
|
||||
{
|
||||
foreach (var m in materials)
|
||||
{
|
||||
ptex.RegisterMaterial(m);
|
||||
}
|
||||
ptex.SetData(this, 0, m_EffectFactor); // param1.x : location
|
||||
ptex.SetData(this, 1, m_Width); // param1.y : width
|
||||
ptex.SetData(this, 2, m_Softness); // param1.z : softness
|
||||
ptex.SetData(this, 4, m_Color.r); // param2.x : red
|
||||
ptex.SetData(this, 5, m_Color.g); // param2.y : green
|
||||
ptex.SetData(this, 6, m_Color.b); // param2.z : blue
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Play effect.
|
||||
/// </summary>
|
||||
public void Play(bool reset = true)
|
||||
{
|
||||
_player.Play(reset);
|
||||
}
|
||||
/// <summary>
|
||||
/// Play effect.
|
||||
/// </summary>
|
||||
public void Play(bool reset = true)
|
||||
{
|
||||
_player.Play(reset);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stop effect.
|
||||
/// </summary>
|
||||
public void Stop(bool reset = true)
|
||||
{
|
||||
_player.Stop(reset);
|
||||
}
|
||||
/// <summary>
|
||||
/// Stop effect.
|
||||
/// </summary>
|
||||
public void Stop(bool reset = true)
|
||||
{
|
||||
_player.Stop(reset);
|
||||
}
|
||||
|
||||
//################################
|
||||
// Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
//################################
|
||||
// Protected Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
|
||||
_player.OnEnable((f) =>
|
||||
{
|
||||
effectFactor = m_Reverse ? 1f - f : f;
|
||||
});
|
||||
}
|
||||
_player.OnEnable((f) =>
|
||||
{
|
||||
effectFactor = m_Reverse ? 1f - f : f;
|
||||
});
|
||||
}
|
||||
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable ();
|
||||
MaterialCache.Unregister(_materialCache);
|
||||
_materialCache = null;
|
||||
_player.OnDisable();
|
||||
}
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable();
|
||||
MaterialCache.Unregister(_materialCache);
|
||||
_materialCache = null;
|
||||
_player.OnDisable();
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
/// <summary>
|
||||
/// Gets the material.
|
||||
/// </summary>
|
||||
/// <returns>The material.</returns>
|
||||
protected override Material GetMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets the material.
|
||||
/// </summary>
|
||||
/// <returns>The material.</returns>
|
||||
protected override Material GetMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_ColorMode);
|
||||
}
|
||||
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_ColorMode);
|
||||
}
|
||||
|
||||
#pragma warning disable 0612
|
||||
protected override void UpgradeIfNeeded()
|
||||
{
|
||||
// Upgrade for v3.0.0
|
||||
if (IsShouldUpgrade(300))
|
||||
{
|
||||
_player.play = false;
|
||||
_player.duration = m_Duration;
|
||||
_player.loop = false;
|
||||
_player.loopDelay = 1;
|
||||
_player.updateMode = m_UpdateMode;
|
||||
}
|
||||
}
|
||||
#pragma warning restore 0612
|
||||
#pragma warning disable 0612
|
||||
protected override void UpgradeIfNeeded()
|
||||
{
|
||||
// Upgrade for v3.0.0
|
||||
if (IsShouldUpgrade(300))
|
||||
{
|
||||
_player.play = false;
|
||||
_player.duration = m_Duration;
|
||||
_player.loop = false;
|
||||
_player.loopDelay = 1;
|
||||
_player.updateMode = m_UpdateMode;
|
||||
}
|
||||
}
|
||||
#pragma warning restore 0612
|
||||
#endif
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
MaterialCache _materialCache = null;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
MaterialCache _materialCache = null;
|
||||
|
||||
EffectPlayer _player{ get { return m_Player ?? (m_Player = new EffectPlayer()); } }
|
||||
}
|
||||
EffectPlayer _player { get { return m_Player ?? (m_Player = new EffectPlayer()); } }
|
||||
}
|
||||
}
|
||||
|
@ -5,484 +5,490 @@ using UnityEngine.UI;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffect.
|
||||
/// </summary>
|
||||
[ExecuteInEditMode]
|
||||
[RequireComponent(typeof(Graphic))]
|
||||
[DisallowMultipleComponent]
|
||||
[AddComponentMenu("UI/UIEffect/UIEffect", 1)]
|
||||
public class UIEffect : UIEffectBase
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-Effect";
|
||||
static readonly ParameterTexture _ptex = new ParameterTexture(4, 1024, "_ParamTex");
|
||||
/// <summary>
|
||||
/// UIEffect.
|
||||
/// </summary>
|
||||
[ExecuteInEditMode]
|
||||
[RequireComponent(typeof(Graphic))]
|
||||
[DisallowMultipleComponent]
|
||||
[AddComponentMenu("UI/UIEffect/UIEffect", 1)]
|
||||
public class UIEffect : UIEffectBase
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-Effect";
|
||||
static readonly ParameterTexture _ptex = new ParameterTexture(4, 1024, "_ParamTex");
|
||||
|
||||
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[FormerlySerializedAs("m_ToneLevel")]
|
||||
[Tooltip("Effect factor between 0(no effect) and 1(complete effect).")]
|
||||
[SerializeField][Range(0, 1)] float m_EffectFactor = 1;
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[FormerlySerializedAs("m_ToneLevel")]
|
||||
[Tooltip("Effect factor between 0(no effect) and 1(complete effect).")]
|
||||
[SerializeField][Range(0, 1)] float m_EffectFactor = 1;
|
||||
|
||||
[Tooltip("Color effect factor between 0(no effect) and 1(complete effect).")]
|
||||
[SerializeField][Range(0, 1)] float m_ColorFactor = 1;
|
||||
[Tooltip("Color effect factor between 0(no effect) and 1(complete effect).")]
|
||||
[SerializeField][Range(0, 1)] float m_ColorFactor = 1;
|
||||
|
||||
[FormerlySerializedAs("m_Blur")]
|
||||
[Tooltip("How far is the blurring from the graphic.")]
|
||||
[SerializeField][Range(0, 1)] float m_BlurFactor = 1;
|
||||
[FormerlySerializedAs("m_Blur")]
|
||||
[Tooltip("How far is the blurring from the graphic.")]
|
||||
[SerializeField][Range(0, 1)] float m_BlurFactor = 1;
|
||||
|
||||
[FormerlySerializedAs("m_ToneMode")]
|
||||
[Tooltip("Effect mode")]
|
||||
[SerializeField] EffectMode m_EffectMode = EffectMode.None;
|
||||
[FormerlySerializedAs("m_ToneMode")]
|
||||
[Tooltip("Effect mode")]
|
||||
[SerializeField] EffectMode m_EffectMode = EffectMode.None;
|
||||
|
||||
[Tooltip("Color effect mode")]
|
||||
[SerializeField] ColorMode m_ColorMode = ColorMode.Multiply;
|
||||
[Tooltip("Color effect mode")]
|
||||
[SerializeField] ColorMode m_ColorMode = ColorMode.Multiply;
|
||||
|
||||
[Tooltip("Blur effect mode")]
|
||||
[SerializeField] BlurMode m_BlurMode = BlurMode.None;
|
||||
[Tooltip("Blur effect mode")]
|
||||
[SerializeField] BlurMode m_BlurMode = BlurMode.None;
|
||||
|
||||
[Tooltip("Advanced blurring remove common artifacts in the blur effect for uGUI.")]
|
||||
[SerializeField] bool m_AdvancedBlur = false;
|
||||
[Tooltip("Advanced blurring remove common artifacts in the blur effect for uGUI.")]
|
||||
[SerializeField] bool m_AdvancedBlur = false;
|
||||
|
||||
#pragma warning disable 0414
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField][Range(0, 1)] float m_ShadowBlur = 1;
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField] ShadowStyle m_ShadowStyle;
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField] Color m_ShadowColor = Color.black;
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField] Vector2 m_EffectDistance = new Vector2(1f, -1f);
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField] bool m_UseGraphicAlpha = true;
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField] Color m_EffectColor = Color.white;
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField] List<UIShadow.AdditionalShadow> m_AdditionalShadows = new List<UIShadow.AdditionalShadow>();
|
||||
#pragma warning restore 0414
|
||||
#pragma warning disable 0414
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField][Range(0, 1)] float m_ShadowBlur = 1;
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField] ShadowStyle m_ShadowStyle;
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField] Color m_ShadowColor = Color.black;
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField] Vector2 m_EffectDistance = new Vector2(1f, -1f);
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField] bool m_UseGraphicAlpha = true;
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField] Color m_EffectColor = Color.white;
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField] List<UIShadow.AdditionalShadow> m_AdditionalShadows = new List<UIShadow.AdditionalShadow>();
|
||||
#pragma warning restore 0414
|
||||
|
||||
public enum BlurEx
|
||||
{
|
||||
None = 0,
|
||||
Ex = 1,
|
||||
}
|
||||
public enum BlurEx
|
||||
{
|
||||
None = 0,
|
||||
Ex = 1,
|
||||
}
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
#if UNITY_2017_1_OR_NEWER
|
||||
public override AdditionalCanvasShaderChannels requiredChannels
|
||||
{
|
||||
get
|
||||
{
|
||||
if (advancedBlur)
|
||||
{
|
||||
return isTMPro
|
||||
? AdditionalCanvasShaderChannels.TexCoord1 | AdditionalCanvasShaderChannels.TexCoord2
|
||||
: AdditionalCanvasShaderChannels.TexCoord1;
|
||||
}
|
||||
return AdditionalCanvasShaderChannels.None;
|
||||
}
|
||||
}
|
||||
public override AdditionalCanvasShaderChannels requiredChannels
|
||||
{
|
||||
get
|
||||
{
|
||||
if (advancedBlur)
|
||||
{
|
||||
return isTMPro
|
||||
? AdditionalCanvasShaderChannels.TexCoord1 | AdditionalCanvasShaderChannels.TexCoord2
|
||||
: AdditionalCanvasShaderChannels.TexCoord1;
|
||||
}
|
||||
return AdditionalCanvasShaderChannels.None;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
|
||||
public float toneLevel
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
m_EffectFactor = Mathf.Clamp(value, 0, 1);
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
|
||||
public float toneLevel
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
m_EffectFactor = Mathf.Clamp(value, 0, 1);
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
public float effectFactor
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
m_EffectFactor = Mathf.Clamp(value, 0, 1);
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
public float effectFactor
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
m_EffectFactor = Mathf.Clamp(value, 0, 1);
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Color effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
public float colorFactor
|
||||
{
|
||||
get { return m_ColorFactor; }
|
||||
set
|
||||
{
|
||||
m_ColorFactor = Mathf.Clamp(value, 0, 1);
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Color effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
public float colorFactor
|
||||
{
|
||||
get { return m_ColorFactor; }
|
||||
set
|
||||
{
|
||||
m_ColorFactor = Mathf.Clamp(value, 0, 1);
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// How far is the blurring from the graphic.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")]
|
||||
public float blur
|
||||
{
|
||||
get { return m_BlurFactor; }
|
||||
set
|
||||
{
|
||||
m_BlurFactor = Mathf.Clamp(value, 0, 1);
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// How far is the blurring from the graphic.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")]
|
||||
public float blur
|
||||
{
|
||||
get { return m_BlurFactor; }
|
||||
set
|
||||
{
|
||||
m_BlurFactor = Mathf.Clamp(value, 0, 1);
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// How far is the blurring from the graphic.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
|
||||
public float blurFactor
|
||||
{
|
||||
get { return m_BlurFactor; }
|
||||
set
|
||||
{
|
||||
m_BlurFactor = Mathf.Clamp(value, 0, 1);
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// How far is the blurring from the graphic.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
|
||||
public float blurFactor
|
||||
{
|
||||
get { return m_BlurFactor; }
|
||||
set
|
||||
{
|
||||
m_BlurFactor = Mathf.Clamp(value, 0, 1);
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Effect mode(readonly).
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectMode instead (UnityUpgradable) -> effectMode")]
|
||||
public EffectMode toneMode { get { return m_EffectMode; } }
|
||||
/// <summary>
|
||||
/// Effect mode(readonly).
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectMode instead (UnityUpgradable) -> effectMode")]
|
||||
public EffectMode toneMode { get { return m_EffectMode; } }
|
||||
|
||||
/// <summary>
|
||||
/// Effect mode(readonly).
|
||||
/// </summary>
|
||||
public EffectMode effectMode { get { return m_EffectMode; } }
|
||||
/// <summary>
|
||||
/// Effect mode(readonly).
|
||||
/// </summary>
|
||||
public EffectMode effectMode { get { return m_EffectMode; } }
|
||||
|
||||
/// <summary>
|
||||
/// Color effect mode(readonly).
|
||||
/// </summary>
|
||||
public ColorMode colorMode { get { return m_ColorMode; } }
|
||||
/// <summary>
|
||||
/// Color effect mode(readonly).
|
||||
/// </summary>
|
||||
public ColorMode colorMode { get { return m_ColorMode; } }
|
||||
|
||||
/// <summary>
|
||||
/// Blur effect mode(readonly).
|
||||
/// </summary>
|
||||
public BlurMode blurMode { get { return m_BlurMode; } }
|
||||
/// <summary>
|
||||
/// Blur effect mode(readonly).
|
||||
/// </summary>
|
||||
public BlurMode blurMode { get { return m_BlurMode; } }
|
||||
|
||||
/// <summary>
|
||||
/// Color for the color effect.
|
||||
/// </summary>
|
||||
public Color effectColor
|
||||
{
|
||||
get { return graphic.color; }
|
||||
set
|
||||
{
|
||||
graphic.color = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Color for the color effect.
|
||||
/// </summary>
|
||||
public Color effectColor
|
||||
{
|
||||
get { return graphic.color; }
|
||||
set
|
||||
{
|
||||
graphic.color = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public override ParameterTexture ptex { get { return _ptex; } }
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public override ParameterTexture ptex { get { return _ptex; } }
|
||||
|
||||
/// <summary>
|
||||
/// Advanced blurring remove common artifacts in the blur effect for uGUI.
|
||||
/// </summary>
|
||||
public bool advancedBlur { get { return isTMPro ? (material && material.IsKeywordEnabled("EX")) : m_AdvancedBlur; } }
|
||||
/// <summary>
|
||||
/// Advanced blurring remove common artifacts in the blur effect for uGUI.
|
||||
/// </summary>
|
||||
public bool advancedBlur { get { return isTMPro ? (material && material.IsKeywordEnabled("EX")) : m_AdvancedBlur; } }
|
||||
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
float normalizedIndex = ptex.GetNormalizedIndex(this);
|
||||
float normalizedIndex = ptex.GetNormalizedIndex(this);
|
||||
|
||||
if (m_BlurMode != BlurMode.None && advancedBlur)
|
||||
{
|
||||
vh.GetUIVertexStream(tempVerts);
|
||||
vh.Clear();
|
||||
var count = tempVerts.Count;
|
||||
if (m_BlurMode != BlurMode.None && advancedBlur)
|
||||
{
|
||||
vh.GetUIVertexStream(tempVerts);
|
||||
vh.Clear();
|
||||
var count = tempVerts.Count;
|
||||
|
||||
// Bundle
|
||||
int bundleSize = (targetGraphic is Text || isTMPro) ? 6 : count;
|
||||
Rect posBounds = default(Rect);
|
||||
Rect uvBounds = default(Rect);
|
||||
Vector3 size = default(Vector3);
|
||||
Vector3 tPos = default(Vector3);
|
||||
Vector3 tUV = default(Vector3);
|
||||
float expand = (float)blurMode * 6 * 2;
|
||||
// Bundle
|
||||
int bundleSize = (targetGraphic is Text || isTMPro) ? 6 : count;
|
||||
Rect posBounds = default(Rect);
|
||||
Rect uvBounds = default(Rect);
|
||||
Vector3 size = default(Vector3);
|
||||
Vector3 tPos = default(Vector3);
|
||||
Vector3 tUV = default(Vector3);
|
||||
float expand = (float)blurMode * 6 * 2;
|
||||
|
||||
for (int i = 0; i < count; i += bundleSize)
|
||||
{
|
||||
// min/max for bundled-quad
|
||||
GetBounds(tempVerts, i, bundleSize, ref posBounds, ref uvBounds, true);
|
||||
for (int i = 0; i < count; i += bundleSize)
|
||||
{
|
||||
// min/max for bundled-quad
|
||||
GetBounds(tempVerts, i, bundleSize, ref posBounds, ref uvBounds, true);
|
||||
|
||||
// Pack uv mask.
|
||||
Vector2 uvMask = new Vector2(Packer.ToFloat(uvBounds.xMin, uvBounds.yMin), Packer.ToFloat(uvBounds.xMax, uvBounds.yMax));
|
||||
// Pack uv mask.
|
||||
Vector2 uvMask = new Vector2(Packer.ToFloat(uvBounds.xMin, uvBounds.yMin), Packer.ToFloat(uvBounds.xMax, uvBounds.yMax));
|
||||
|
||||
// Quad
|
||||
for (int j = 0; j < bundleSize; j += 6)
|
||||
{
|
||||
Vector3 cornerPos1 = tempVerts[i + j + 1].position;
|
||||
Vector3 cornerPos2 = tempVerts[i + j + 4].position;
|
||||
// Quad
|
||||
for (int j = 0; j < bundleSize; j += 6)
|
||||
{
|
||||
Vector3 cornerPos1 = tempVerts[i + j + 1].position;
|
||||
Vector3 cornerPos2 = tempVerts[i + j + 4].position;
|
||||
|
||||
// Is outer quad?
|
||||
bool hasOuterEdge = (bundleSize == 6)
|
||||
|| !posBounds.Contains(cornerPos1)
|
||||
|| !posBounds.Contains(cornerPos2);
|
||||
if (hasOuterEdge)
|
||||
{
|
||||
Vector3 cornerUv1 = tempVerts[i + j + 1].uv0;
|
||||
Vector3 cornerUv2 = tempVerts[i + j + 4].uv0;
|
||||
// Is outer quad?
|
||||
bool hasOuterEdge = (bundleSize == 6)
|
||||
|| !posBounds.Contains(cornerPos1)
|
||||
|| !posBounds.Contains(cornerPos2);
|
||||
if (hasOuterEdge)
|
||||
{
|
||||
Vector3 cornerUv1 = tempVerts[i + j + 1].uv0;
|
||||
Vector3 cornerUv2 = tempVerts[i + j + 4].uv0;
|
||||
|
||||
Vector3 centerPos = (cornerPos1 + cornerPos2) / 2;
|
||||
Vector3 centerUV = (cornerUv1 + cornerUv2) / 2;
|
||||
size = (cornerPos1 - cornerPos2);
|
||||
Vector3 centerPos = (cornerPos1 + cornerPos2) / 2;
|
||||
Vector3 centerUV = (cornerUv1 + cornerUv2) / 2;
|
||||
size = (cornerPos1 - cornerPos2);
|
||||
|
||||
size.x = 1 + expand / Mathf.Abs(size.x);
|
||||
size.y = 1 + expand / Mathf.Abs(size.y);
|
||||
size.z = 1 + expand / Mathf.Abs(size.z);
|
||||
size.x = 1 + expand / Mathf.Abs(size.x);
|
||||
size.y = 1 + expand / Mathf.Abs(size.y);
|
||||
size.z = 1 + expand / Mathf.Abs(size.z);
|
||||
|
||||
tPos = centerPos - Vector3.Scale(size, centerPos);
|
||||
tUV = centerUV - Vector3.Scale(size, centerUV);
|
||||
}
|
||||
tPos = centerPos - Vector3.Scale(size, centerPos);
|
||||
tUV = centerUV - Vector3.Scale(size, centerUV);
|
||||
}
|
||||
|
||||
// Vertex
|
||||
for (int k = 0; k < 6; k++)
|
||||
{
|
||||
UIVertex vt = tempVerts[i + j + k];
|
||||
// Vertex
|
||||
for (int k = 0; k < 6; k++)
|
||||
{
|
||||
UIVertex vt = tempVerts[i + j + k];
|
||||
|
||||
Vector3 pos = vt.position;
|
||||
Vector2 uv0 = vt.uv0;
|
||||
Vector3 pos = vt.position;
|
||||
Vector2 uv0 = vt.uv0;
|
||||
|
||||
if (hasOuterEdge && (pos.x < posBounds.xMin || posBounds.xMax < pos.x))
|
||||
{
|
||||
pos.x = pos.x * size.x + tPos.x;
|
||||
uv0.x = uv0.x * size.x + tUV.x;
|
||||
}
|
||||
if (hasOuterEdge && (pos.y < posBounds.yMin || posBounds.yMax < pos.y))
|
||||
{
|
||||
pos.y = pos.y * size.y + tPos.y;
|
||||
uv0.y = uv0.y * size.y + tUV.y;
|
||||
}
|
||||
if (hasOuterEdge && (pos.x < posBounds.xMin || posBounds.xMax < pos.x))
|
||||
{
|
||||
pos.x = pos.x * size.x + tPos.x;
|
||||
uv0.x = uv0.x * size.x + tUV.x;
|
||||
}
|
||||
if (hasOuterEdge && (pos.y < posBounds.yMin || posBounds.yMax < pos.y))
|
||||
{
|
||||
pos.y = pos.y * size.y + tPos.y;
|
||||
uv0.y = uv0.y * size.y + tUV.y;
|
||||
}
|
||||
|
||||
vt.uv0 = new Vector2(Packer.ToFloat((uv0.x + 0.5f) / 2f, (uv0.y + 0.5f) / 2f), normalizedIndex);
|
||||
vt.position = pos;
|
||||
vt.uv0 = new Vector2(Packer.ToFloat((uv0.x + 0.5f) / 2f, (uv0.y + 0.5f) / 2f), normalizedIndex);
|
||||
vt.position = pos;
|
||||
|
||||
if (isTMPro)
|
||||
{
|
||||
#if UNITY_2017_1_OR_NEWER
|
||||
vt.uv2 = uvMask;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
vt.uv1 = uvMask;
|
||||
}
|
||||
if (isTMPro)
|
||||
{
|
||||
#if UNITY_2017_1_OR_NEWER
|
||||
vt.uv2 = uvMask;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
vt.uv1 = uvMask;
|
||||
}
|
||||
|
||||
tempVerts[i + j + k] = vt;
|
||||
}
|
||||
}
|
||||
}
|
||||
tempVerts[i + j + k] = vt;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vh.AddUIVertexTriangleStream(tempVerts);
|
||||
tempVerts.Clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
int count = vh.currentVertCount;
|
||||
UIVertex vt = default(UIVertex);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vt, i);
|
||||
Vector2 uv0 = vt.uv0;
|
||||
vt.uv0 = new Vector2(
|
||||
Packer.ToFloat((uv0.x + 0.5f) / 2f, (uv0.y + 0.5f) / 2f),
|
||||
normalizedIndex
|
||||
);
|
||||
vh.SetUIVertex(vt, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
vh.AddUIVertexTriangleStream(tempVerts);
|
||||
tempVerts.Clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
int count = vh.currentVertCount;
|
||||
UIVertex vt = default(UIVertex);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vt, i);
|
||||
Vector2 uv0 = vt.uv0;
|
||||
vt.uv0 = new Vector2(
|
||||
Packer.ToFloat((uv0.x + 0.5f) / 2f, (uv0.y + 0.5f) / 2f),
|
||||
normalizedIndex
|
||||
);
|
||||
vh.SetUIVertex(vt, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void SetDirty()
|
||||
{
|
||||
foreach (var m in materials)
|
||||
{
|
||||
ptex.RegisterMaterial (m);
|
||||
}
|
||||
ptex.SetData(this, 0, m_EffectFactor); // param.x : effect factor
|
||||
ptex.SetData(this, 1, m_ColorFactor); // param.y : color factor
|
||||
ptex.SetData(this, 2, m_BlurFactor); // param.z : blur factor
|
||||
}
|
||||
protected override void SetDirty()
|
||||
{
|
||||
foreach (var m in materials)
|
||||
{
|
||||
ptex.RegisterMaterial(m);
|
||||
}
|
||||
ptex.SetData(this, 0, m_EffectFactor); // param.x : effect factor
|
||||
ptex.SetData(this, 1, m_ColorFactor); // param.y : color factor
|
||||
ptex.SetData(this, 2, m_BlurFactor); // param.z : blur factor
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
/// <summary>
|
||||
/// Gets the material.
|
||||
/// </summary>
|
||||
/// <returns>The material.</returns>
|
||||
protected override Material GetMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode, m_ColorMode, m_BlurMode, m_AdvancedBlur ? BlurEx.Ex : BlurEx.None);
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets the material.
|
||||
/// </summary>
|
||||
/// <returns>The material.</returns>
|
||||
protected override Material GetMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode, m_ColorMode, m_BlurMode, m_AdvancedBlur ? BlurEx.Ex : BlurEx.None);
|
||||
}
|
||||
|
||||
#pragma warning disable 0612
|
||||
protected override void UpgradeIfNeeded()
|
||||
{
|
||||
// Upgrade for v3.0.0
|
||||
if (IsShouldUpgrade(300))
|
||||
{
|
||||
if (m_ColorMode != ColorMode.Multiply)
|
||||
{
|
||||
Color col = targetGraphic.color;
|
||||
col.r = m_EffectColor.r;
|
||||
col.g = m_EffectColor.g;
|
||||
col.b = m_EffectColor.b;
|
||||
targetGraphic.color = col;
|
||||
m_ColorFactor = m_EffectColor.a;
|
||||
}
|
||||
#pragma warning disable 0612
|
||||
protected override void UpgradeIfNeeded()
|
||||
{
|
||||
// Upgrade for v3.0.0
|
||||
if (IsShouldUpgrade(300))
|
||||
{
|
||||
if (m_ColorMode != ColorMode.Multiply)
|
||||
{
|
||||
Color col = targetGraphic.color;
|
||||
col.r = m_EffectColor.r;
|
||||
col.g = m_EffectColor.g;
|
||||
col.b = m_EffectColor.b;
|
||||
targetGraphic.color = col;
|
||||
m_ColorFactor = m_EffectColor.a;
|
||||
}
|
||||
|
||||
if (m_ShadowStyle != ShadowStyle.None || m_AdditionalShadows.Any(x => x.style != ShadowStyle.None))
|
||||
{
|
||||
if (m_ShadowStyle != ShadowStyle.None)
|
||||
{
|
||||
var shadow = gameObject.GetComponent<UIShadow>() ?? gameObject.AddComponent<UIShadow>();
|
||||
shadow.style = m_ShadowStyle;
|
||||
shadow.effectDistance = m_EffectDistance;
|
||||
shadow.effectColor = m_ShadowColor;
|
||||
shadow.useGraphicAlpha = m_UseGraphicAlpha;
|
||||
shadow.blurFactor = m_ShadowBlur;
|
||||
}
|
||||
if (m_ShadowStyle != ShadowStyle.None || m_AdditionalShadows.Any(x => x.style != ShadowStyle.None))
|
||||
{
|
||||
if (m_ShadowStyle != ShadowStyle.None)
|
||||
{
|
||||
var shadow = gameObject.GetComponent<UIShadow>() ?? gameObject.AddComponent<UIShadow>();
|
||||
shadow.style = m_ShadowStyle;
|
||||
shadow.effectDistance = m_EffectDistance;
|
||||
shadow.effectColor = m_ShadowColor;
|
||||
shadow.useGraphicAlpha = m_UseGraphicAlpha;
|
||||
shadow.blurFactor = m_ShadowBlur;
|
||||
}
|
||||
|
||||
foreach (var s in m_AdditionalShadows)
|
||||
{
|
||||
if (s.style == ShadowStyle.None)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (var s in m_AdditionalShadows)
|
||||
{
|
||||
if (s.style == ShadowStyle.None)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var shadow = gameObject.AddComponent<UIShadow>();
|
||||
shadow.style = s.style;
|
||||
shadow.effectDistance = s.effectDistance;
|
||||
shadow.effectColor = s.effectColor;
|
||||
shadow.useGraphicAlpha = s.useGraphicAlpha;
|
||||
shadow.blurFactor = s.blur;
|
||||
}
|
||||
var shadow = gameObject.AddComponent<UIShadow>();
|
||||
shadow.style = s.style;
|
||||
shadow.effectDistance = s.effectDistance;
|
||||
shadow.effectColor = s.effectColor;
|
||||
shadow.useGraphicAlpha = s.useGraphicAlpha;
|
||||
shadow.blurFactor = s.blur;
|
||||
}
|
||||
|
||||
m_ShadowStyle = ShadowStyle.None;
|
||||
m_AdditionalShadows = null;
|
||||
m_ShadowStyle = ShadowStyle.None;
|
||||
m_AdditionalShadows = null;
|
||||
|
||||
if (m_EffectMode == EffectMode.None && m_ColorMode == ColorMode.Multiply && m_BlurMode == BlurMode.None)
|
||||
{
|
||||
DestroyImmediate(this, true);
|
||||
}
|
||||
}
|
||||
if (m_EffectMode == EffectMode.None && m_ColorMode == ColorMode.Multiply && m_BlurMode == BlurMode.None)
|
||||
{
|
||||
DestroyImmediate(this, true);
|
||||
}
|
||||
}
|
||||
|
||||
int tone = (int)m_EffectMode;
|
||||
const int Mono = 5;
|
||||
const int Cutoff = 6;
|
||||
const int Hue = 7;
|
||||
if (tone == Hue)
|
||||
{
|
||||
var go = gameObject;
|
||||
var hue = m_EffectFactor;
|
||||
DestroyImmediate(this, true);
|
||||
var hsv = go.GetComponent<UIHsvModifier>() ?? go.AddComponent<UIHsvModifier>();
|
||||
hsv.hue = hue;
|
||||
hsv.range = 1;
|
||||
}
|
||||
int tone = (int)m_EffectMode;
|
||||
const int Mono = 5;
|
||||
const int Cutoff = 6;
|
||||
const int Hue = 7;
|
||||
if (tone == Hue)
|
||||
{
|
||||
var go = gameObject;
|
||||
var hue = m_EffectFactor;
|
||||
DestroyImmediate(this, true);
|
||||
var hsv = go.GetComponent<UIHsvModifier>() ?? go.AddComponent<UIHsvModifier>();
|
||||
hsv.hue = hue;
|
||||
hsv.range = 1;
|
||||
}
|
||||
|
||||
// Cutoff/Mono
|
||||
if (tone == Cutoff || tone == Mono)
|
||||
{
|
||||
var go = gameObject;
|
||||
var factor = m_EffectFactor;
|
||||
var transitionMode = tone == Cutoff
|
||||
? UITransitionEffect.EffectMode.Cutoff
|
||||
: UITransitionEffect.EffectMode.Fade;
|
||||
DestroyImmediate(this, true);
|
||||
var trans = go.GetComponent<UITransitionEffect>() ?? go.AddComponent<UITransitionEffect>();
|
||||
trans.effectFactor = factor;
|
||||
// Cutoff/Mono
|
||||
if (tone == Cutoff || tone == Mono)
|
||||
{
|
||||
var go = gameObject;
|
||||
var factor = m_EffectFactor;
|
||||
var transitionMode = tone == Cutoff
|
||||
? UITransitionEffect.EffectMode.Cutoff
|
||||
: UITransitionEffect.EffectMode.Fade;
|
||||
DestroyImmediate(this, true);
|
||||
var trans = go.GetComponent<UITransitionEffect>() ?? go.AddComponent<UITransitionEffect>();
|
||||
trans.effectFactor = factor;
|
||||
|
||||
var sp = new SerializedObject(trans).FindProperty("m_EffectMode");
|
||||
sp.intValue = (int)transitionMode;
|
||||
sp.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
#pragma warning restore 0612
|
||||
var sp = new SerializedObject(trans).FindProperty("m_EffectMode");
|
||||
sp.intValue = (int)transitionMode;
|
||||
sp.serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
#pragma warning restore 0612
|
||||
#endif
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
static void GetBounds(List<UIVertex> verts, int start, int count, ref Rect posBounds, ref Rect uvBounds, bool global)
|
||||
{
|
||||
Vector2 minPos = new Vector2(float.MaxValue, float.MaxValue);
|
||||
Vector2 maxPos = new Vector2(float.MinValue, float.MinValue);
|
||||
Vector2 minUV = new Vector2(float.MaxValue, float.MaxValue);
|
||||
Vector2 maxUV = new Vector2(float.MinValue, float.MinValue);
|
||||
for (int i = start; i < start + count; i++)
|
||||
{
|
||||
UIVertex vt = verts[i];
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
static void GetBounds(List<UIVertex> verts, int start, int count, ref Rect posBounds, ref Rect uvBounds, bool global)
|
||||
{
|
||||
Vector2 minPos = new Vector2(float.MaxValue, float.MaxValue);
|
||||
Vector2 maxPos = new Vector2(float.MinValue, float.MinValue);
|
||||
Vector2 minUV = new Vector2(float.MaxValue, float.MaxValue);
|
||||
Vector2 maxUV = new Vector2(float.MinValue, float.MinValue);
|
||||
for (int i = start; i < start + count; i++)
|
||||
{
|
||||
UIVertex vt = verts[i];
|
||||
|
||||
Vector2 uv = vt.uv0;
|
||||
Vector3 pos = vt.position;
|
||||
Vector2 uv = vt.uv0;
|
||||
Vector3 pos = vt.position;
|
||||
|
||||
// Left-Bottom
|
||||
if (minPos.x >= pos.x && minPos.y >= pos.y)
|
||||
{
|
||||
minPos = pos;
|
||||
}
|
||||
// Right-Top
|
||||
else if (maxPos.x <= pos.x && maxPos.y <= pos.y)
|
||||
{
|
||||
maxPos = pos;
|
||||
}
|
||||
// Left-Bottom
|
||||
if (minPos.x >= pos.x && minPos.y >= pos.y)
|
||||
{
|
||||
minPos = pos;
|
||||
}
|
||||
// Right-Top
|
||||
else if (maxPos.x <= pos.x && maxPos.y <= pos.y)
|
||||
{
|
||||
maxPos = pos;
|
||||
}
|
||||
|
||||
// Left-Bottom
|
||||
if (minUV.x >= uv.x && minUV.y >= uv.y)
|
||||
{
|
||||
minUV = uv;
|
||||
}
|
||||
// Right-Top
|
||||
else if (maxUV.x <= uv.x && maxUV.y <= uv.y)
|
||||
{
|
||||
maxUV = uv;
|
||||
}
|
||||
}
|
||||
// Left-Bottom
|
||||
if (minUV.x >= uv.x && minUV.y >= uv.y)
|
||||
{
|
||||
minUV = uv;
|
||||
}
|
||||
// Right-Top
|
||||
else if (maxUV.x <= uv.x && maxUV.y <= uv.y)
|
||||
{
|
||||
maxUV = uv;
|
||||
}
|
||||
}
|
||||
|
||||
// Shrink coordinate for detect edge
|
||||
posBounds.Set(minPos.x + 0.001f, minPos.y + 0.001f, maxPos.x - minPos.x - 0.002f, maxPos.y - minPos.y - 0.002f);
|
||||
uvBounds.Set(minUV.x, minUV.y, maxUV.x - minUV.x, maxUV.y - minUV.y);
|
||||
}
|
||||
}
|
||||
// Shrink coordinate for detect edge
|
||||
posBounds.Set(minPos.x + 0.001f, minPos.y + 0.001f, maxPos.x - minPos.x - 0.002f, maxPos.y - minPos.y - 0.002f);
|
||||
uvBounds.Set(minUV.x, minUV.y, maxUV.x - minUV.x, maxUV.y - minUV.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,552 +1,552 @@
|
||||
using System.Collections;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Serialization;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.Serialization;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffectCapturedImage
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/UIEffect/UIEffectCapturedImage", 200)]
|
||||
public class UIEffectCapturedImage : RawImage
|
||||
/// <summary>
|
||||
/// UIEffectCapturedImage
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/UIEffect/UIEffectCapturedImage", 200)]
|
||||
public class UIEffectCapturedImage : RawImage
|
||||
#if UNITY_EDITOR
|
||||
, ISerializationCallbackReceiver
|
||||
, ISerializationCallbackReceiver
|
||||
#endif
|
||||
{
|
||||
{
|
||||
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-EffectCapture";
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-EffectCapture";
|
||||
|
||||
/// <summary>
|
||||
/// Desampling rate.
|
||||
/// </summary>
|
||||
public enum DesamplingRate
|
||||
{
|
||||
None = 0,
|
||||
x1 = 1,
|
||||
x2 = 2,
|
||||
x4 = 4,
|
||||
x8 = 8,
|
||||
}
|
||||
/// <summary>
|
||||
/// Desampling rate.
|
||||
/// </summary>
|
||||
public enum DesamplingRate
|
||||
{
|
||||
None = 0,
|
||||
x1 = 1,
|
||||
x2 = 2,
|
||||
x4 = 4,
|
||||
x8 = 8,
|
||||
}
|
||||
|
||||
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Effect factor between 0(no effect) and 1(complete effect).")]
|
||||
[FormerlySerializedAs("m_ToneLevel")]
|
||||
[SerializeField][Range(0, 1)] float m_EffectFactor = 1;
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Effect factor between 0(no effect) and 1(complete effect).")]
|
||||
[FormerlySerializedAs("m_ToneLevel")]
|
||||
[SerializeField][Range(0, 1)] float m_EffectFactor = 1;
|
||||
|
||||
[Tooltip("Color effect factor between 0(no effect) and 1(complete effect).")]
|
||||
[SerializeField][Range(0, 1)] float m_ColorFactor = 1;
|
||||
[Tooltip("Color effect factor between 0(no effect) and 1(complete effect).")]
|
||||
[SerializeField][Range(0, 1)] float m_ColorFactor = 1;
|
||||
|
||||
[Tooltip("How far is the blurring from the graphic.")]
|
||||
[FormerlySerializedAs("m_Blur")]
|
||||
[SerializeField][Range(0, 1)] float m_BlurFactor = 1;
|
||||
[Tooltip("How far is the blurring from the graphic.")]
|
||||
[FormerlySerializedAs("m_Blur")]
|
||||
[SerializeField][Range(0, 1)] float m_BlurFactor = 1;
|
||||
|
||||
[Tooltip("Effect mode.")]
|
||||
[FormerlySerializedAs("m_ToneMode")]
|
||||
[SerializeField] EffectMode m_EffectMode = EffectMode.None;
|
||||
[Tooltip("Effect mode.")]
|
||||
[FormerlySerializedAs("m_ToneMode")]
|
||||
[SerializeField] EffectMode m_EffectMode = EffectMode.None;
|
||||
|
||||
[Tooltip("Color effect mode.")]
|
||||
[SerializeField] ColorMode m_ColorMode = ColorMode.Multiply;
|
||||
[Tooltip("Color effect mode.")]
|
||||
[SerializeField] ColorMode m_ColorMode = ColorMode.Multiply;
|
||||
|
||||
[Tooltip("Blur effect mode.")]
|
||||
[SerializeField] BlurMode m_BlurMode = BlurMode.DetailBlur;
|
||||
[Tooltip("Blur effect mode.")]
|
||||
[SerializeField] BlurMode m_BlurMode = BlurMode.DetailBlur;
|
||||
|
||||
[Tooltip("Color for the color effect.")]
|
||||
[SerializeField] Color m_EffectColor = Color.white;
|
||||
[Tooltip("Color for the color effect.")]
|
||||
[SerializeField] Color m_EffectColor = Color.white;
|
||||
|
||||
[Tooltip("Desampling rate of the generated RenderTexture.")]
|
||||
[SerializeField] DesamplingRate m_DesamplingRate = DesamplingRate.x1;
|
||||
[Tooltip("Desampling rate of the generated RenderTexture.")]
|
||||
[SerializeField] DesamplingRate m_DesamplingRate = DesamplingRate.x1;
|
||||
|
||||
[Tooltip("Desampling rate of reduction buffer to apply effect.")]
|
||||
[SerializeField] DesamplingRate m_ReductionRate = DesamplingRate.x1;
|
||||
[Tooltip("Desampling rate of reduction buffer to apply effect.")]
|
||||
[SerializeField] DesamplingRate m_ReductionRate = DesamplingRate.x1;
|
||||
|
||||
[Tooltip("FilterMode for capturing.")]
|
||||
[SerializeField] FilterMode m_FilterMode = FilterMode.Bilinear;
|
||||
[Tooltip("FilterMode for capturing.")]
|
||||
[SerializeField] FilterMode m_FilterMode = FilterMode.Bilinear;
|
||||
|
||||
[Tooltip("Effect material.")]
|
||||
[SerializeField] Material m_EffectMaterial = null;
|
||||
[Tooltip("Effect material.")]
|
||||
[SerializeField] Material m_EffectMaterial = null;
|
||||
|
||||
[Tooltip("Blur iterations.")]
|
||||
[FormerlySerializedAs("m_Iterations")]
|
||||
[SerializeField][Range(1, 8)] int m_BlurIterations = 3;
|
||||
[Tooltip("Blur iterations.")]
|
||||
[FormerlySerializedAs("m_Iterations")]
|
||||
[SerializeField][Range(1, 8)] int m_BlurIterations = 3;
|
||||
|
||||
[Tooltip("Fits graphic size to screen on captured.")]
|
||||
[FormerlySerializedAs("m_KeepCanvasSize")]
|
||||
[SerializeField] bool m_FitToScreen = true;
|
||||
[Tooltip("Fits graphic size to screen on captured.")]
|
||||
[FormerlySerializedAs("m_KeepCanvasSize")]
|
||||
[SerializeField] bool m_FitToScreen = true;
|
||||
|
||||
[Tooltip("Capture automatically on enable.")]
|
||||
[SerializeField] bool m_CaptureOnEnable = false;
|
||||
[Tooltip("Capture automatically on enable.")]
|
||||
[SerializeField] bool m_CaptureOnEnable = false;
|
||||
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
|
||||
public float toneLevel { get { return m_EffectFactor; } set { m_EffectFactor = Mathf.Clamp(value, 0, 1); } }
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
|
||||
public float toneLevel { get { return m_EffectFactor; } set { m_EffectFactor = Mathf.Clamp(value, 0, 1); } }
|
||||
|
||||
/// <summary>
|
||||
/// Effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
public float effectFactor { get { return m_EffectFactor; } set { m_EffectFactor = Mathf.Clamp(value, 0, 1); } }
|
||||
/// <summary>
|
||||
/// Effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
public float effectFactor { get { return m_EffectFactor; } set { m_EffectFactor = Mathf.Clamp(value, 0, 1); } }
|
||||
|
||||
/// <summary>
|
||||
/// Color effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
public float colorFactor { get { return m_ColorFactor; } set { m_ColorFactor = Mathf.Clamp(value, 0, 1); } }
|
||||
/// <summary>
|
||||
/// Color effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
public float colorFactor { get { return m_ColorFactor; } set { m_ColorFactor = Mathf.Clamp(value, 0, 1); } }
|
||||
|
||||
/// <summary>
|
||||
/// How far is the blurring from the graphic.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")]
|
||||
public float blur { get { return m_BlurFactor; } set { m_BlurFactor = Mathf.Clamp(value, 0, 4); } }
|
||||
/// <summary>
|
||||
/// How far is the blurring from the graphic.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")]
|
||||
public float blur { get { return m_BlurFactor; } set { m_BlurFactor = Mathf.Clamp(value, 0, 4); } }
|
||||
|
||||
/// <summary>
|
||||
/// How far is the blurring from the graphic.
|
||||
/// </summary>
|
||||
public float blurFactor { get { return m_BlurFactor; } set { m_BlurFactor = Mathf.Clamp(value, 0, 4); } }
|
||||
/// <summary>
|
||||
/// How far is the blurring from the graphic.
|
||||
/// </summary>
|
||||
public float blurFactor { get { return m_BlurFactor; } set { m_BlurFactor = Mathf.Clamp(value, 0, 4); } }
|
||||
|
||||
/// <summary>
|
||||
/// Tone effect mode.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectMode instead (UnityUpgradable) -> effectMode")]
|
||||
public EffectMode toneMode { get { return m_EffectMode; } }
|
||||
/// <summary>
|
||||
/// Tone effect mode.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectMode instead (UnityUpgradable) -> effectMode")]
|
||||
public EffectMode toneMode { get { return m_EffectMode; } }
|
||||
|
||||
/// <summary>
|
||||
/// Effect mode.
|
||||
/// </summary>
|
||||
public EffectMode effectMode { get { return m_EffectMode; } }
|
||||
/// <summary>
|
||||
/// Effect mode.
|
||||
/// </summary>
|
||||
public EffectMode effectMode { get { return m_EffectMode; } }
|
||||
|
||||
/// <summary>
|
||||
/// Color effect mode.
|
||||
/// </summary>
|
||||
public ColorMode colorMode { get { return m_ColorMode; } }
|
||||
/// <summary>
|
||||
/// Color effect mode.
|
||||
/// </summary>
|
||||
public ColorMode colorMode { get { return m_ColorMode; } }
|
||||
|
||||
/// <summary>
|
||||
/// Blur effect mode.
|
||||
/// </summary>
|
||||
public BlurMode blurMode { get { return m_BlurMode; } }
|
||||
/// <summary>
|
||||
/// Blur effect mode.
|
||||
/// </summary>
|
||||
public BlurMode blurMode { get { return m_BlurMode; } }
|
||||
|
||||
/// <summary>
|
||||
/// Color for the color effect.
|
||||
/// </summary>
|
||||
public Color effectColor { get { return m_EffectColor; } set { m_EffectColor = value; } }
|
||||
/// <summary>
|
||||
/// Color for the color effect.
|
||||
/// </summary>
|
||||
public Color effectColor { get { return m_EffectColor; } set { m_EffectColor = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Effect material.
|
||||
/// </summary>
|
||||
public virtual Material effectMaterial { get { return m_EffectMaterial; } }
|
||||
/// <summary>
|
||||
/// Effect material.
|
||||
/// </summary>
|
||||
public virtual Material effectMaterial { get { return m_EffectMaterial; } }
|
||||
|
||||
/// <summary>
|
||||
/// Desampling rate of the generated RenderTexture.
|
||||
/// </summary>
|
||||
public DesamplingRate desamplingRate { get { return m_DesamplingRate; } set { m_DesamplingRate = value; } }
|
||||
/// <summary>
|
||||
/// Desampling rate of the generated RenderTexture.
|
||||
/// </summary>
|
||||
public DesamplingRate desamplingRate { get { return m_DesamplingRate; } set { m_DesamplingRate = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Desampling rate of reduction buffer to apply effect.
|
||||
/// </summary>
|
||||
public DesamplingRate reductionRate { get { return m_ReductionRate; } set { m_ReductionRate = value; } }
|
||||
/// <summary>
|
||||
/// Desampling rate of reduction buffer to apply effect.
|
||||
/// </summary>
|
||||
public DesamplingRate reductionRate { get { return m_ReductionRate; } set { m_ReductionRate = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// FilterMode for capturing.
|
||||
/// </summary>
|
||||
public FilterMode filterMode { get { return m_FilterMode; } set { m_FilterMode = value; } }
|
||||
/// <summary>
|
||||
/// FilterMode for capturing.
|
||||
/// </summary>
|
||||
public FilterMode filterMode { get { return m_FilterMode; } set { m_FilterMode = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Captured texture.
|
||||
/// </summary>
|
||||
public RenderTexture capturedTexture { get { return _rt; } }
|
||||
/// <summary>
|
||||
/// Captured texture.
|
||||
/// </summary>
|
||||
public RenderTexture capturedTexture { get { return _rt; } }
|
||||
|
||||
/// <summary>
|
||||
/// Blur iterations.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use blurIterations instead (UnityUpgradable) -> blurIterations")]
|
||||
public int iterations { get { return m_BlurIterations; } set { m_BlurIterations = value; } }
|
||||
/// <summary>
|
||||
/// Blur iterations.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use blurIterations instead (UnityUpgradable) -> blurIterations")]
|
||||
public int iterations { get { return m_BlurIterations; } set { m_BlurIterations = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Blur iterations.
|
||||
/// </summary>
|
||||
public int blurIterations { get { return m_BlurIterations; } set { m_BlurIterations = value; } }
|
||||
/// <summary>
|
||||
/// Blur iterations.
|
||||
/// </summary>
|
||||
public int blurIterations { get { return m_BlurIterations; } set { m_BlurIterations = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Fits graphic size to screen.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use fitToScreen instead (UnityUpgradable) -> fitToScreen")]
|
||||
public bool keepCanvasSize { get { return m_FitToScreen; } set { m_FitToScreen = value; } }
|
||||
/// <summary>
|
||||
/// Fits graphic size to screen.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use fitToScreen instead (UnityUpgradable) -> fitToScreen")]
|
||||
public bool keepCanvasSize { get { return m_FitToScreen; } set { m_FitToScreen = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Fits graphic size to screen on captured.
|
||||
/// </summary>
|
||||
public bool fitToScreen { get { return m_FitToScreen; } set { m_FitToScreen = value; } }
|
||||
/// <summary>
|
||||
/// Fits graphic size to screen on captured.
|
||||
/// </summary>
|
||||
public bool fitToScreen { get { return m_FitToScreen; } set { m_FitToScreen = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Target RenderTexture to capture.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
public RenderTexture targetTexture { get { return null; } set { } }
|
||||
/// <summary>
|
||||
/// Target RenderTexture to capture.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
public RenderTexture targetTexture { get { return null; } set { } }
|
||||
|
||||
/// <summary>
|
||||
/// Capture automatically on enable.
|
||||
/// </summary>
|
||||
public bool captureOnEnable { get { return m_CaptureOnEnable; } set { m_CaptureOnEnable = value; } }
|
||||
/// <summary>
|
||||
/// Capture automatically on enable.
|
||||
/// </summary>
|
||||
public bool captureOnEnable { get { return m_CaptureOnEnable; } set { m_CaptureOnEnable = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
if (m_CaptureOnEnable && Application.isPlaying)
|
||||
{
|
||||
Capture();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
if (m_CaptureOnEnable && Application.isPlaying)
|
||||
{
|
||||
Capture();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable();
|
||||
if (m_CaptureOnEnable && Application.isPlaying)
|
||||
{
|
||||
_Release(false);
|
||||
texture = null;
|
||||
}
|
||||
}
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable();
|
||||
if (m_CaptureOnEnable && Application.isPlaying)
|
||||
{
|
||||
_Release(false);
|
||||
texture = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the MonoBehaviour will be destroyed.
|
||||
/// </summary>
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
Release();
|
||||
base.OnDestroy();
|
||||
}
|
||||
/// <summary>
|
||||
/// This function is called when the MonoBehaviour will be destroyed.
|
||||
/// </summary>
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
Release();
|
||||
base.OnDestroy();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Callback function when a UI element needs to generate vertices.
|
||||
/// </summary>
|
||||
protected override void OnPopulateMesh(VertexHelper vh)
|
||||
{
|
||||
// When not displaying, clear vertex.
|
||||
if (texture == null || color.a < 1 / 255f || canvasRenderer.GetAlpha() < 1 / 255f)
|
||||
{
|
||||
vh.Clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
base.OnPopulateMesh(vh);
|
||||
int count = vh.currentVertCount;
|
||||
UIVertex vt = default(UIVertex);
|
||||
Color c = color;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vt, i);
|
||||
vt.color = c;
|
||||
vh.SetUIVertex(vt, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Callback function when a UI element needs to generate vertices.
|
||||
/// </summary>
|
||||
protected override void OnPopulateMesh(VertexHelper vh)
|
||||
{
|
||||
// When not displaying, clear vertex.
|
||||
if (texture == null || color.a < 1 / 255f || canvasRenderer.GetAlpha() < 1 / 255f)
|
||||
{
|
||||
vh.Clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
base.OnPopulateMesh(vh);
|
||||
int count = vh.currentVertCount;
|
||||
UIVertex vt = default(UIVertex);
|
||||
Color c = color;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vt, i);
|
||||
vt.color = c;
|
||||
vh.SetUIVertex(vt, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the size of the desampling.
|
||||
/// </summary>
|
||||
public void GetDesamplingSize(DesamplingRate rate, out int w, out int h)
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the size of the desampling.
|
||||
/// </summary>
|
||||
public void GetDesamplingSize(DesamplingRate rate, out int w, out int h)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
var res = UnityEditor.UnityStats.screenRes.Split('x');
|
||||
w = int.Parse(res[0]);
|
||||
h = int.Parse(res[1]);
|
||||
}
|
||||
else
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
var res = UnityEditor.UnityStats.screenRes.Split('x');
|
||||
w = int.Parse(res[0]);
|
||||
h = int.Parse(res[1]);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
w = Screen.width;
|
||||
h = Screen.height;
|
||||
}
|
||||
{
|
||||
w = Screen.width;
|
||||
h = Screen.height;
|
||||
}
|
||||
|
||||
if (rate == DesamplingRate.None)
|
||||
return;
|
||||
if (rate == DesamplingRate.None)
|
||||
return;
|
||||
|
||||
float aspect = (float)w / h;
|
||||
if (w < h)
|
||||
{
|
||||
h = Mathf.ClosestPowerOfTwo(h / (int)rate);
|
||||
w = Mathf.CeilToInt(h * aspect);
|
||||
}
|
||||
else
|
||||
{
|
||||
w = Mathf.ClosestPowerOfTwo(w / (int)rate);
|
||||
h = Mathf.CeilToInt(w / aspect);
|
||||
}
|
||||
}
|
||||
float aspect = (float)w / h;
|
||||
if (w < h)
|
||||
{
|
||||
h = Mathf.ClosestPowerOfTwo(h / (int)rate);
|
||||
w = Mathf.CeilToInt(h * aspect);
|
||||
}
|
||||
else
|
||||
{
|
||||
w = Mathf.ClosestPowerOfTwo(w / (int)rate);
|
||||
h = Mathf.CeilToInt(w / aspect);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Capture rendering result.
|
||||
/// </summary>
|
||||
public void Capture()
|
||||
{
|
||||
// Fit to screen.
|
||||
var rootCanvas = canvas.rootCanvas;
|
||||
if (m_FitToScreen)
|
||||
{
|
||||
var rootTransform = rootCanvas.transform as RectTransform;
|
||||
var size = rootTransform.rect.size;
|
||||
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, size.x);
|
||||
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, size.y);
|
||||
rectTransform.position = rootTransform.position;
|
||||
}
|
||||
/// <summary>
|
||||
/// Capture rendering result.
|
||||
/// </summary>
|
||||
public void Capture()
|
||||
{
|
||||
// Fit to screen.
|
||||
var rootCanvas = canvas.rootCanvas;
|
||||
if (m_FitToScreen)
|
||||
{
|
||||
var rootTransform = rootCanvas.transform as RectTransform;
|
||||
var size = rootTransform.rect.size;
|
||||
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, size.x);
|
||||
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, size.y);
|
||||
rectTransform.position = rootTransform.position;
|
||||
}
|
||||
|
||||
// Cache some ids.
|
||||
if (s_CopyId == 0)
|
||||
{
|
||||
s_CopyId = Shader.PropertyToID("_UIEffectCapturedImage_ScreenCopyId");
|
||||
s_EffectId1 = Shader.PropertyToID("_UIEffectCapturedImage_EffectId1");
|
||||
s_EffectId2 = Shader.PropertyToID("_UIEffectCapturedImage_EffectId2");
|
||||
// Cache some ids.
|
||||
if (s_CopyId == 0)
|
||||
{
|
||||
s_CopyId = Shader.PropertyToID("_UIEffectCapturedImage_ScreenCopyId");
|
||||
s_EffectId1 = Shader.PropertyToID("_UIEffectCapturedImage_EffectId1");
|
||||
s_EffectId2 = Shader.PropertyToID("_UIEffectCapturedImage_EffectId2");
|
||||
|
||||
s_EffectFactorId = Shader.PropertyToID("_EffectFactor");
|
||||
s_ColorFactorId = Shader.PropertyToID("_ColorFactor");
|
||||
s_CommandBuffer = new CommandBuffer();
|
||||
}
|
||||
s_EffectFactorId = Shader.PropertyToID("_EffectFactor");
|
||||
s_ColorFactorId = Shader.PropertyToID("_ColorFactor");
|
||||
s_CommandBuffer = new CommandBuffer();
|
||||
}
|
||||
|
||||
|
||||
// If size of result RT has changed, release it.
|
||||
int w, h;
|
||||
GetDesamplingSize(m_DesamplingRate, out w, out h);
|
||||
if (_rt && (_rt.width != w || _rt.height != h))
|
||||
{
|
||||
_Release(ref _rt);
|
||||
}
|
||||
// If size of result RT has changed, release it.
|
||||
int w, h;
|
||||
GetDesamplingSize(m_DesamplingRate, out w, out h);
|
||||
if (_rt && (_rt.width != w || _rt.height != h))
|
||||
{
|
||||
_Release(ref _rt);
|
||||
}
|
||||
|
||||
// Generate RT for result.
|
||||
if (_rt == null)
|
||||
{
|
||||
_rt = RenderTexture.GetTemporary(w, h, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default);
|
||||
_rt.filterMode = m_FilterMode;
|
||||
_rt.useMipMap = false;
|
||||
_rt.wrapMode = TextureWrapMode.Clamp;
|
||||
_rtId = new RenderTargetIdentifier(_rt);
|
||||
}
|
||||
SetupCommandBuffer();
|
||||
}
|
||||
// Generate RT for result.
|
||||
if (_rt == null)
|
||||
{
|
||||
_rt = RenderTexture.GetTemporary(w, h, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default);
|
||||
_rt.filterMode = m_FilterMode;
|
||||
_rt.useMipMap = false;
|
||||
_rt.wrapMode = TextureWrapMode.Clamp;
|
||||
_rtId = new RenderTargetIdentifier(_rt);
|
||||
}
|
||||
SetupCommandBuffer();
|
||||
}
|
||||
|
||||
void SetupCommandBuffer()
|
||||
{
|
||||
// Material for effect.
|
||||
Material mat = m_EffectMaterial;
|
||||
void SetupCommandBuffer()
|
||||
{
|
||||
// Material for effect.
|
||||
Material mat = m_EffectMaterial;
|
||||
|
||||
if (s_CommandBuffer == null)
|
||||
{
|
||||
s_CommandBuffer = new CommandBuffer();
|
||||
}
|
||||
if (s_CommandBuffer == null)
|
||||
{
|
||||
s_CommandBuffer = new CommandBuffer();
|
||||
}
|
||||
|
||||
// [1] Capture from back buffer (back buffer -> copied screen).
|
||||
int w, h;
|
||||
GetDesamplingSize(DesamplingRate.None, out w, out h);
|
||||
s_CommandBuffer.GetTemporaryRT(s_CopyId, w, h, 0, m_FilterMode);
|
||||
// [1] Capture from back buffer (back buffer -> copied screen).
|
||||
int w, h;
|
||||
GetDesamplingSize(DesamplingRate.None, out w, out h);
|
||||
s_CommandBuffer.GetTemporaryRT(s_CopyId, w, h, 0, m_FilterMode);
|
||||
#if UNITY_EDITOR
|
||||
s_CommandBuffer.Blit(Resources.FindObjectsOfTypeAll<RenderTexture>().FirstOrDefault(x => x.name == "GameView RT"), s_CopyId);
|
||||
s_CommandBuffer.Blit(Resources.FindObjectsOfTypeAll<RenderTexture>().FirstOrDefault(x => x.name == "GameView RT"), s_CopyId);
|
||||
#else
|
||||
s_CommandBuffer.Blit(BuiltinRenderTextureType.BindableTexture, s_CopyId);
|
||||
#endif
|
||||
|
||||
// Set properties for effect.
|
||||
s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(m_EffectFactor, 0));
|
||||
s_CommandBuffer.SetGlobalVector(s_ColorFactorId, new Vector4(m_EffectColor.r, m_EffectColor.g, m_EffectColor.b, m_EffectColor.a));
|
||||
// Set properties for effect.
|
||||
s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(m_EffectFactor, 0));
|
||||
s_CommandBuffer.SetGlobalVector(s_ColorFactorId, new Vector4(m_EffectColor.r, m_EffectColor.g, m_EffectColor.b, m_EffectColor.a));
|
||||
|
||||
// [2] Apply base effect with reduction buffer (copied screen -> effect1).
|
||||
GetDesamplingSize(m_ReductionRate, out w, out h);
|
||||
s_CommandBuffer.GetTemporaryRT(s_EffectId1, w, h, 0, m_FilterMode);
|
||||
s_CommandBuffer.Blit(s_CopyId, s_EffectId1, mat, 0);
|
||||
s_CommandBuffer.ReleaseTemporaryRT(s_CopyId);
|
||||
// [2] Apply base effect with reduction buffer (copied screen -> effect1).
|
||||
GetDesamplingSize(m_ReductionRate, out w, out h);
|
||||
s_CommandBuffer.GetTemporaryRT(s_EffectId1, w, h, 0, m_FilterMode);
|
||||
s_CommandBuffer.Blit(s_CopyId, s_EffectId1, mat, 0);
|
||||
s_CommandBuffer.ReleaseTemporaryRT(s_CopyId);
|
||||
|
||||
// Iterate blurring operation.
|
||||
if (m_BlurMode != BlurMode.None)
|
||||
{
|
||||
s_CommandBuffer.GetTemporaryRT(s_EffectId2, w, h, 0, m_FilterMode);
|
||||
for (int i = 0; i < m_BlurIterations; i++)
|
||||
{
|
||||
// [3] Apply blurring with reduction buffer (effect1 -> effect2, or effect2 -> effect1).
|
||||
s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(m_BlurFactor, 0));
|
||||
s_CommandBuffer.Blit(s_EffectId1, s_EffectId2, mat, 1);
|
||||
s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(0, m_BlurFactor));
|
||||
s_CommandBuffer.Blit(s_EffectId2, s_EffectId1, mat, 1);
|
||||
}
|
||||
s_CommandBuffer.ReleaseTemporaryRT(s_EffectId2);
|
||||
}
|
||||
// Iterate blurring operation.
|
||||
if (m_BlurMode != BlurMode.None)
|
||||
{
|
||||
s_CommandBuffer.GetTemporaryRT(s_EffectId2, w, h, 0, m_FilterMode);
|
||||
for (int i = 0; i < m_BlurIterations; i++)
|
||||
{
|
||||
// [3] Apply blurring with reduction buffer (effect1 -> effect2, or effect2 -> effect1).
|
||||
s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(m_BlurFactor, 0));
|
||||
s_CommandBuffer.Blit(s_EffectId1, s_EffectId2, mat, 1);
|
||||
s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(0, m_BlurFactor));
|
||||
s_CommandBuffer.Blit(s_EffectId2, s_EffectId1, mat, 1);
|
||||
}
|
||||
s_CommandBuffer.ReleaseTemporaryRT(s_EffectId2);
|
||||
}
|
||||
|
||||
// [4] Copy to result RT.
|
||||
s_CommandBuffer.Blit(s_EffectId1, _rtId);
|
||||
s_CommandBuffer.ReleaseTemporaryRT(s_EffectId1);
|
||||
// [4] Copy to result RT.
|
||||
s_CommandBuffer.Blit(s_EffectId1, _rtId);
|
||||
s_CommandBuffer.ReleaseTemporaryRT(s_EffectId1);
|
||||
|
||||
#if UNITY_EDITOR
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
Graphics.ExecuteCommandBuffer(s_CommandBuffer);
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
Graphics.ExecuteCommandBuffer(s_CommandBuffer);
|
||||
|
||||
UpdateTexture();
|
||||
return;
|
||||
}
|
||||
UpdateTexture();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
// Execute command buffer.
|
||||
canvas.rootCanvas.GetComponent<CanvasScaler> ().StartCoroutine (_CoUpdateTextureOnNextFrame ());
|
||||
}
|
||||
// Execute command buffer.
|
||||
canvas.rootCanvas.GetComponent<CanvasScaler>().StartCoroutine(_CoUpdateTextureOnNextFrame());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Release captured image.
|
||||
/// </summary>
|
||||
public void Release()
|
||||
{
|
||||
_Release(true);
|
||||
texture = null;
|
||||
_SetDirty();
|
||||
}
|
||||
/// <summary>
|
||||
/// Release captured image.
|
||||
/// </summary>
|
||||
public void Release()
|
||||
{
|
||||
_Release(true);
|
||||
texture = null;
|
||||
_SetDirty();
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
protected override void Reset()
|
||||
{
|
||||
// Set parameters as 'Medium'.
|
||||
m_BlurIterations = 3;
|
||||
m_FilterMode = FilterMode.Bilinear;
|
||||
m_DesamplingRate = DesamplingRate.x1;
|
||||
m_ReductionRate = DesamplingRate.x1;
|
||||
base.Reset();
|
||||
}
|
||||
protected override void Reset()
|
||||
{
|
||||
// Set parameters as 'Medium'.
|
||||
m_BlurIterations = 3;
|
||||
m_FilterMode = FilterMode.Bilinear;
|
||||
m_DesamplingRate = DesamplingRate.x1;
|
||||
m_ReductionRate = DesamplingRate.x1;
|
||||
base.Reset();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the before serialize event.
|
||||
/// </summary>
|
||||
public void OnBeforeSerialize()
|
||||
{
|
||||
}
|
||||
/// <summary>
|
||||
/// Raises the before serialize event.
|
||||
/// </summary>
|
||||
public void OnBeforeSerialize()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the after deserialize event.
|
||||
/// </summary>
|
||||
public void OnAfterDeserialize()
|
||||
{
|
||||
UnityEditor.EditorApplication.delayCall += () => UpdateMaterial(true);
|
||||
}
|
||||
/// <summary>
|
||||
/// Raises the after deserialize event.
|
||||
/// </summary>
|
||||
public void OnAfterDeserialize()
|
||||
{
|
||||
UnityEditor.EditorApplication.delayCall += () => UpdateMaterial(true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raises the validate event.
|
||||
/// </summary>
|
||||
protected override void OnValidate()
|
||||
{
|
||||
base.OnValidate();
|
||||
UnityEditor.EditorApplication.delayCall += () => UpdateMaterial(false);
|
||||
}
|
||||
/// <summary>
|
||||
/// Raises the validate event.
|
||||
/// </summary>
|
||||
protected override void OnValidate()
|
||||
{
|
||||
base.OnValidate();
|
||||
UnityEditor.EditorApplication.delayCall += () => UpdateMaterial(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the material.
|
||||
/// </summary>
|
||||
/// <param name="ignoreInPlayMode">If set to <c>true</c> ignore in play mode.</param>
|
||||
protected void UpdateMaterial(bool ignoreInPlayMode)
|
||||
{
|
||||
if (!this || ignoreInPlayMode && Application.isPlaying)
|
||||
{
|
||||
return;
|
||||
}
|
||||
/// <summary>
|
||||
/// Updates the material.
|
||||
/// </summary>
|
||||
/// <param name="ignoreInPlayMode">If set to <c>true</c> ignore in play mode.</param>
|
||||
protected void UpdateMaterial(bool ignoreInPlayMode)
|
||||
{
|
||||
if (!this || ignoreInPlayMode && Application.isPlaying)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var mat = MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode, m_ColorMode, m_BlurMode);
|
||||
if (m_EffectMaterial != mat)
|
||||
{
|
||||
material = null;
|
||||
m_EffectMaterial = mat;
|
||||
_SetDirty();
|
||||
}
|
||||
}
|
||||
var mat = MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode, m_ColorMode, m_BlurMode);
|
||||
if (m_EffectMaterial != mat)
|
||||
{
|
||||
material = null;
|
||||
m_EffectMaterial = mat;
|
||||
_SetDirty();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
RenderTexture _rt;
|
||||
RenderTargetIdentifier _rtId;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
RenderTexture _rt;
|
||||
RenderTargetIdentifier _rtId;
|
||||
|
||||
static int s_CopyId;
|
||||
static int s_EffectId1;
|
||||
static int s_EffectId2;
|
||||
static int s_EffectFactorId;
|
||||
static int s_ColorFactorId;
|
||||
static CommandBuffer s_CommandBuffer;
|
||||
static int s_CopyId;
|
||||
static int s_EffectId1;
|
||||
static int s_EffectId2;
|
||||
static int s_EffectFactorId;
|
||||
static int s_ColorFactorId;
|
||||
static CommandBuffer s_CommandBuffer;
|
||||
|
||||
/// <summary>
|
||||
/// Release genarated objects.
|
||||
/// </summary>
|
||||
/// <param name="releaseRT">If set to <c>true</c> release cached RenderTexture.</param>
|
||||
void _Release(bool releaseRT)
|
||||
{
|
||||
if (releaseRT)
|
||||
{
|
||||
texture = null;
|
||||
_Release(ref _rt);
|
||||
}
|
||||
/// <summary>
|
||||
/// Release genarated objects.
|
||||
/// </summary>
|
||||
/// <param name="releaseRT">If set to <c>true</c> release cached RenderTexture.</param>
|
||||
void _Release(bool releaseRT)
|
||||
{
|
||||
if (releaseRT)
|
||||
{
|
||||
texture = null;
|
||||
_Release(ref _rt);
|
||||
}
|
||||
|
||||
if (s_CommandBuffer != null)
|
||||
{
|
||||
s_CommandBuffer.Clear();
|
||||
if (s_CommandBuffer != null)
|
||||
{
|
||||
s_CommandBuffer.Clear();
|
||||
|
||||
if (releaseRT)
|
||||
{
|
||||
s_CommandBuffer.Release();
|
||||
s_CommandBuffer = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (releaseRT)
|
||||
{
|
||||
s_CommandBuffer.Release();
|
||||
s_CommandBuffer = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[System.Diagnostics.Conditional("UNITY_EDITOR")]
|
||||
void _SetDirty()
|
||||
{
|
||||
[System.Diagnostics.Conditional("UNITY_EDITOR")]
|
||||
void _SetDirty()
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
}
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void _Release(ref RenderTexture obj)
|
||||
{
|
||||
if (obj)
|
||||
{
|
||||
obj.Release();
|
||||
RenderTexture.ReleaseTemporary (obj);
|
||||
obj = null;
|
||||
}
|
||||
}
|
||||
void _Release(ref RenderTexture obj)
|
||||
{
|
||||
if (obj)
|
||||
{
|
||||
obj.Release();
|
||||
RenderTexture.ReleaseTemporary(obj);
|
||||
obj = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set texture on next frame.
|
||||
/// </summary>
|
||||
IEnumerator _CoUpdateTextureOnNextFrame()
|
||||
{
|
||||
yield return new WaitForEndOfFrame();
|
||||
UpdateTexture();
|
||||
}
|
||||
/// <summary>
|
||||
/// Set texture on next frame.
|
||||
/// </summary>
|
||||
IEnumerator _CoUpdateTextureOnNextFrame()
|
||||
{
|
||||
yield return new WaitForEndOfFrame();
|
||||
UpdateTexture();
|
||||
}
|
||||
|
||||
void UpdateTexture()
|
||||
{
|
||||
void UpdateTexture()
|
||||
{
|
||||
#if !UNITY_EDITOR
|
||||
// Execute command buffer.
|
||||
Graphics.ExecuteCommandBuffer (s_CommandBuffer);
|
||||
#endif
|
||||
_Release(false);
|
||||
texture = capturedTexture;
|
||||
_SetDirty();
|
||||
}
|
||||
_Release(false);
|
||||
texture = capturedTexture;
|
||||
_SetDirty();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,61 +1,59 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
|
||||
//[RequireComponent(typeof(Graphic))]
|
||||
[DisallowMultipleComponent]
|
||||
[AddComponentMenu("UI/MeshEffectForTextMeshPro/UIFlip", 102)]
|
||||
public class UIFlip : BaseMeshEffect
|
||||
{
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
//[RequireComponent(typeof(Graphic))]
|
||||
[DisallowMultipleComponent]
|
||||
[AddComponentMenu("UI/MeshEffectForTextMeshPro/UIFlip", 102)]
|
||||
public class UIFlip : BaseMeshEffect
|
||||
{
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
|
||||
[Tooltip("Flip horizontally.")]
|
||||
[SerializeField] private bool m_Horizontal = false;
|
||||
[Tooltip("Flip horizontally.")]
|
||||
[SerializeField] private bool m_Horizontal = false;
|
||||
|
||||
[Tooltip("Flip vertically.")]
|
||||
[SerializeField] private bool m_Veritical = false;
|
||||
[Tooltip("Flip vertically.")]
|
||||
[SerializeField] private bool m_Veritical = false;
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether this <see cref="Coffee.UIExtensions.UIFlip"/> should be flipped horizontally.
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if be flipped horizontally; otherwise, <c>false</c>.</value>
|
||||
public bool horizontal { get { return this.m_Horizontal; } set { this.m_Horizontal = value; SetVerticesDirty (); } }
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether this <see cref="Coffee.UIExtensions.UIFlip"/> should be flipped horizontally.
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if be flipped horizontally; otherwise, <c>false</c>.</value>
|
||||
public bool horizontal { get { return this.m_Horizontal; } set { this.m_Horizontal = value; SetVerticesDirty(); } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether this <see cref="Coffee.UIExtensions.UIFlip"/> should be flipped vertically.
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if be flipped horizontally; otherwise, <c>false</c>.</value>
|
||||
public bool vertical { get { return this.m_Veritical; } set { this.m_Veritical = value; SetVerticesDirty (); } }
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether this <see cref="Coffee.UIExtensions.UIFlip"/> should be flipped vertically.
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if be flipped horizontally; otherwise, <c>false</c>.</value>
|
||||
public bool vertical { get { return this.m_Veritical; } set { this.m_Veritical = value; SetVerticesDirty(); } }
|
||||
|
||||
/// <summary>
|
||||
/// Call used to modify mesh.
|
||||
/// </summary>
|
||||
/// <param name="vh">VertexHelper.</param>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
RectTransform rt = graphic.rectTransform;
|
||||
UIVertex vt = default(UIVertex);
|
||||
Vector3 pos;
|
||||
Vector2 center = rt.rect.center;
|
||||
for (int i = 0; i < vh.currentVertCount; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vt, i);
|
||||
pos = vt.position;
|
||||
vt.position = new Vector3(
|
||||
m_Horizontal ? -pos.x : pos.x,
|
||||
m_Veritical ? -pos.y : pos.y
|
||||
);
|
||||
vh.SetUIVertex(vt, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Call used to modify mesh.
|
||||
/// </summary>
|
||||
/// <param name="vh">VertexHelper.</param>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
RectTransform rt = graphic.rectTransform;
|
||||
UIVertex vt = default(UIVertex);
|
||||
Vector3 pos;
|
||||
Vector2 center = rt.rect.center;
|
||||
for (int i = 0; i < vh.currentVertCount; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vt, i);
|
||||
pos = vt.position;
|
||||
vt.position = new Vector3(
|
||||
m_Horizontal ? -pos.x : pos.x,
|
||||
m_Veritical ? -pos.y : pos.y
|
||||
);
|
||||
vh.SetUIVertex(vt, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -3,384 +3,384 @@ using UnityEngine.UI;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// UIGradient.
|
||||
/// </summary>
|
||||
[DisallowMultipleComponent]
|
||||
[AddComponentMenu("UI/MeshEffectForTextMeshPro/UIGradient", 101)]
|
||||
public class UIGradient : BaseMeshEffect
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// UIGradient.
|
||||
/// </summary>
|
||||
[DisallowMultipleComponent]
|
||||
[AddComponentMenu("UI/MeshEffectForTextMeshPro/UIGradient", 101)]
|
||||
public class UIGradient : BaseMeshEffect
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
|
||||
/// <summary>
|
||||
/// Gradient direction.
|
||||
/// </summary>
|
||||
public enum Direction
|
||||
{
|
||||
Horizontal,
|
||||
Vertical,
|
||||
Angle,
|
||||
Diagonal,
|
||||
}
|
||||
/// <summary>
|
||||
/// Gradient direction.
|
||||
/// </summary>
|
||||
public enum Direction
|
||||
{
|
||||
Horizontal,
|
||||
Vertical,
|
||||
Angle,
|
||||
Diagonal,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gradient space for Text.
|
||||
/// </summary>
|
||||
public enum GradientStyle
|
||||
{
|
||||
Rect,
|
||||
Fit,
|
||||
Split,
|
||||
}
|
||||
/// <summary>
|
||||
/// Gradient space for Text.
|
||||
/// </summary>
|
||||
public enum GradientStyle
|
||||
{
|
||||
Rect,
|
||||
Fit,
|
||||
Split,
|
||||
}
|
||||
|
||||
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
|
||||
[Tooltip("Gradient Direction.")]
|
||||
[SerializeField] Direction m_Direction;
|
||||
[Tooltip("Gradient Direction.")]
|
||||
[SerializeField] Direction m_Direction;
|
||||
|
||||
[Tooltip("Color1: Top or Left.")]
|
||||
[SerializeField] Color m_Color1 = Color.white;
|
||||
[Tooltip("Color1: Top or Left.")]
|
||||
[SerializeField] Color m_Color1 = Color.white;
|
||||
|
||||
[Tooltip("Color2: Bottom or Right.")]
|
||||
[SerializeField] Color m_Color2 = Color.white;
|
||||
[Tooltip("Color2: Bottom or Right.")]
|
||||
[SerializeField] Color m_Color2 = Color.white;
|
||||
|
||||
[Tooltip("Color3: For diagonal.")]
|
||||
[SerializeField] Color m_Color3 = Color.white;
|
||||
[Tooltip("Color3: For diagonal.")]
|
||||
[SerializeField] Color m_Color3 = Color.white;
|
||||
|
||||
[Tooltip("Color4: For diagonal.")]
|
||||
[SerializeField] Color m_Color4 = Color.white;
|
||||
[Tooltip("Color4: For diagonal.")]
|
||||
[SerializeField] Color m_Color4 = Color.white;
|
||||
|
||||
[Tooltip("Gradient rotation.")]
|
||||
[SerializeField][Range(-180, 180)] float m_Rotation;
|
||||
[Tooltip("Gradient rotation.")]
|
||||
[SerializeField][Range(-180, 180)] float m_Rotation;
|
||||
|
||||
[Tooltip("Gradient offset for Horizontal, Vertical or Angle.")]
|
||||
[SerializeField][Range(-1, 1)] float m_Offset1;
|
||||
[Tooltip("Gradient offset for Horizontal, Vertical or Angle.")]
|
||||
[SerializeField][Range(-1, 1)] float m_Offset1;
|
||||
|
||||
[Tooltip("Gradient offset for Diagonal.")]
|
||||
[SerializeField][Range(-1, 1)] float m_Offset2;
|
||||
[Tooltip("Gradient offset for Diagonal.")]
|
||||
[SerializeField][Range(-1, 1)] float m_Offset2;
|
||||
|
||||
[Tooltip("Gradient style for Text.")]
|
||||
[SerializeField] GradientStyle m_GradientStyle;
|
||||
[Tooltip("Gradient style for Text.")]
|
||||
[SerializeField] GradientStyle m_GradientStyle;
|
||||
|
||||
[Tooltip("Color space to correct color.")]
|
||||
[SerializeField] ColorSpace m_ColorSpace = ColorSpace.Uninitialized;
|
||||
[Tooltip("Color space to correct color.")]
|
||||
[SerializeField] ColorSpace m_ColorSpace = ColorSpace.Uninitialized;
|
||||
|
||||
[Tooltip("Ignore aspect ratio.")]
|
||||
[SerializeField] bool m_IgnoreAspectRatio = true;
|
||||
[Tooltip("Ignore aspect ratio.")]
|
||||
[SerializeField] bool m_IgnoreAspectRatio = true;
|
||||
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
public Graphic targetGraphic { get { return base.graphic; } }
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
public Graphic targetGraphic { get { return base.graphic; } }
|
||||
|
||||
/// <summary>
|
||||
/// Gradient Direction.
|
||||
/// </summary>
|
||||
public Direction direction
|
||||
{
|
||||
get { return m_Direction; }
|
||||
set
|
||||
{
|
||||
if (m_Direction != value)
|
||||
{
|
||||
m_Direction = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gradient Direction.
|
||||
/// </summary>
|
||||
public Direction direction
|
||||
{
|
||||
get { return m_Direction; }
|
||||
set
|
||||
{
|
||||
if (m_Direction != value)
|
||||
{
|
||||
m_Direction = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Color1: Top or Left.
|
||||
/// </summary>
|
||||
public Color color1
|
||||
{
|
||||
get { return m_Color1; }
|
||||
set
|
||||
{
|
||||
if (m_Color1 != value)
|
||||
{
|
||||
m_Color1 = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Color1: Top or Left.
|
||||
/// </summary>
|
||||
public Color color1
|
||||
{
|
||||
get { return m_Color1; }
|
||||
set
|
||||
{
|
||||
if (m_Color1 != value)
|
||||
{
|
||||
m_Color1 = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Color2: Bottom or Right.
|
||||
/// </summary>
|
||||
public Color color2
|
||||
{
|
||||
get { return m_Color2; }
|
||||
set
|
||||
{
|
||||
if (m_Color2 != value)
|
||||
{
|
||||
m_Color2 = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Color2: Bottom or Right.
|
||||
/// </summary>
|
||||
public Color color2
|
||||
{
|
||||
get { return m_Color2; }
|
||||
set
|
||||
{
|
||||
if (m_Color2 != value)
|
||||
{
|
||||
m_Color2 = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Color3: For diagonal.
|
||||
/// </summary>
|
||||
public Color color3
|
||||
{
|
||||
get { return m_Color3; }
|
||||
set
|
||||
{
|
||||
if (m_Color3 != value)
|
||||
{
|
||||
m_Color3 = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Color3: For diagonal.
|
||||
/// </summary>
|
||||
public Color color3
|
||||
{
|
||||
get { return m_Color3; }
|
||||
set
|
||||
{
|
||||
if (m_Color3 != value)
|
||||
{
|
||||
m_Color3 = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Color4: For diagonal.
|
||||
/// </summary>
|
||||
public Color color4
|
||||
{
|
||||
get { return m_Color4; }
|
||||
set
|
||||
{
|
||||
if (m_Color4 != value)
|
||||
{
|
||||
m_Color4 = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Color4: For diagonal.
|
||||
/// </summary>
|
||||
public Color color4
|
||||
{
|
||||
get { return m_Color4; }
|
||||
set
|
||||
{
|
||||
if (m_Color4 != value)
|
||||
{
|
||||
m_Color4 = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gradient rotation.
|
||||
/// </summary>
|
||||
public float rotation
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Direction == Direction.Horizontal ? -90
|
||||
: m_Direction == Direction.Vertical ? 0
|
||||
: m_Rotation;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (!Mathf.Approximately(m_Rotation, value))
|
||||
{
|
||||
m_Rotation = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gradient rotation.
|
||||
/// </summary>
|
||||
public float rotation
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Direction == Direction.Horizontal ? -90
|
||||
: m_Direction == Direction.Vertical ? 0
|
||||
: m_Rotation;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (!Mathf.Approximately(m_Rotation, value))
|
||||
{
|
||||
m_Rotation = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gradient offset for Horizontal, Vertical or Angle.
|
||||
/// </summary>
|
||||
public float offset
|
||||
{
|
||||
get { return m_Offset1; }
|
||||
set
|
||||
{
|
||||
if (m_Offset1 != value)
|
||||
{
|
||||
m_Offset1 = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gradient offset for Horizontal, Vertical or Angle.
|
||||
/// </summary>
|
||||
public float offset
|
||||
{
|
||||
get { return m_Offset1; }
|
||||
set
|
||||
{
|
||||
if (m_Offset1 != value)
|
||||
{
|
||||
m_Offset1 = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gradient offset for Diagonal.
|
||||
/// </summary>
|
||||
public Vector2 offset2
|
||||
{
|
||||
get { return new Vector2(m_Offset2, m_Offset1); }
|
||||
set
|
||||
{
|
||||
if (m_Offset1 != value.y || m_Offset2 != value.x)
|
||||
{
|
||||
m_Offset1 = value.y;
|
||||
m_Offset2 = value.x;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gradient offset for Diagonal.
|
||||
/// </summary>
|
||||
public Vector2 offset2
|
||||
{
|
||||
get { return new Vector2(m_Offset2, m_Offset1); }
|
||||
set
|
||||
{
|
||||
if (m_Offset1 != value.y || m_Offset2 != value.x)
|
||||
{
|
||||
m_Offset1 = value.y;
|
||||
m_Offset2 = value.x;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gradient style for Text.
|
||||
/// </summary>
|
||||
public GradientStyle gradientStyle
|
||||
{
|
||||
get { return m_GradientStyle; }
|
||||
set
|
||||
{
|
||||
if (m_GradientStyle != value)
|
||||
{
|
||||
m_GradientStyle = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gradient style for Text.
|
||||
/// </summary>
|
||||
public GradientStyle gradientStyle
|
||||
{
|
||||
get { return m_GradientStyle; }
|
||||
set
|
||||
{
|
||||
if (m_GradientStyle != value)
|
||||
{
|
||||
m_GradientStyle = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Color space to correct color.
|
||||
/// </summary>
|
||||
public ColorSpace colorSpace
|
||||
{
|
||||
get { return m_ColorSpace; }
|
||||
set
|
||||
{
|
||||
if (m_ColorSpace != value)
|
||||
{
|
||||
m_ColorSpace = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Color space to correct color.
|
||||
/// </summary>
|
||||
public ColorSpace colorSpace
|
||||
{
|
||||
get { return m_ColorSpace; }
|
||||
set
|
||||
{
|
||||
if (m_ColorSpace != value)
|
||||
{
|
||||
m_ColorSpace = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ignore aspect ratio.
|
||||
/// </summary>
|
||||
public bool ignoreAspectRatio
|
||||
{
|
||||
get { return m_IgnoreAspectRatio; }
|
||||
set
|
||||
{
|
||||
if (m_IgnoreAspectRatio != value)
|
||||
{
|
||||
m_IgnoreAspectRatio = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Ignore aspect ratio.
|
||||
/// </summary>
|
||||
public bool ignoreAspectRatio
|
||||
{
|
||||
get { return m_IgnoreAspectRatio; }
|
||||
set
|
||||
{
|
||||
if (m_IgnoreAspectRatio != value)
|
||||
{
|
||||
m_IgnoreAspectRatio = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Call used to modify mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!IsActive())
|
||||
return;
|
||||
/// <summary>
|
||||
/// Call used to modify mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!IsActive())
|
||||
return;
|
||||
|
||||
// Gradient space.
|
||||
Rect rect = default(Rect);
|
||||
UIVertex vertex = default(UIVertex);
|
||||
if (m_GradientStyle == GradientStyle.Rect)
|
||||
{
|
||||
// RectTransform.
|
||||
rect = graphic.rectTransform.rect;
|
||||
}
|
||||
else if (m_GradientStyle == GradientStyle.Split)
|
||||
{
|
||||
// Each characters.
|
||||
rect.Set(0, 0, 1, 1);
|
||||
}
|
||||
else if (m_GradientStyle == GradientStyle.Fit)
|
||||
{
|
||||
// Fit to contents.
|
||||
rect.xMin = rect.yMin = float.MaxValue;
|
||||
rect.xMax = rect.yMax = float.MinValue;
|
||||
for (int i = 0; i < vh.currentVertCount; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
rect.xMin = Mathf.Min(rect.xMin, vertex.position.x);
|
||||
rect.yMin = Mathf.Min(rect.yMin, vertex.position.y);
|
||||
rect.xMax = Mathf.Max(rect.xMax, vertex.position.x);
|
||||
rect.yMax = Mathf.Max(rect.yMax, vertex.position.y);
|
||||
}
|
||||
}
|
||||
// Gradient space.
|
||||
Rect rect = default(Rect);
|
||||
UIVertex vertex = default(UIVertex);
|
||||
if (m_GradientStyle == GradientStyle.Rect)
|
||||
{
|
||||
// RectTransform.
|
||||
rect = graphic.rectTransform.rect;
|
||||
}
|
||||
else if (m_GradientStyle == GradientStyle.Split)
|
||||
{
|
||||
// Each characters.
|
||||
rect.Set(0, 0, 1, 1);
|
||||
}
|
||||
else if (m_GradientStyle == GradientStyle.Fit)
|
||||
{
|
||||
// Fit to contents.
|
||||
rect.xMin = rect.yMin = float.MaxValue;
|
||||
rect.xMax = rect.yMax = float.MinValue;
|
||||
for (int i = 0; i < vh.currentVertCount; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
rect.xMin = Mathf.Min(rect.xMin, vertex.position.x);
|
||||
rect.yMin = Mathf.Min(rect.yMin, vertex.position.y);
|
||||
rect.xMax = Mathf.Max(rect.xMax, vertex.position.x);
|
||||
rect.yMax = Mathf.Max(rect.yMax, vertex.position.y);
|
||||
}
|
||||
}
|
||||
|
||||
// Gradient rotation.
|
||||
float rad = rotation * Mathf.Deg2Rad;
|
||||
Vector2 dir = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad));
|
||||
if (!m_IgnoreAspectRatio && Direction.Angle <= m_Direction)
|
||||
{
|
||||
dir.x *= rect.height / rect.width;
|
||||
dir = dir.normalized;
|
||||
}
|
||||
// Gradient rotation.
|
||||
float rad = rotation * Mathf.Deg2Rad;
|
||||
Vector2 dir = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad));
|
||||
if (!m_IgnoreAspectRatio && Direction.Angle <= m_Direction)
|
||||
{
|
||||
dir.x *= rect.height / rect.width;
|
||||
dir = dir.normalized;
|
||||
}
|
||||
|
||||
// Calculate vertex color.
|
||||
Color color;
|
||||
Vector2 nomalizedPos;
|
||||
Matrix2x3 localMatrix = new Matrix2x3(rect, dir.x, dir.y); // Get local matrix.
|
||||
for (int i = 0; i < vh.currentVertCount; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
// Calculate vertex color.
|
||||
Color color;
|
||||
Vector2 nomalizedPos;
|
||||
Matrix2x3 localMatrix = new Matrix2x3(rect, dir.x, dir.y); // Get local matrix.
|
||||
for (int i = 0; i < vh.currentVertCount; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
|
||||
// Normalize vertex position by local matrix.
|
||||
if (m_GradientStyle == GradientStyle.Split)
|
||||
{
|
||||
// Each characters.
|
||||
nomalizedPos = localMatrix * s_SplitedCharacterPosition[i % 4] + offset2;
|
||||
}
|
||||
else
|
||||
{
|
||||
nomalizedPos = localMatrix * vertex.position + offset2;
|
||||
}
|
||||
// Normalize vertex position by local matrix.
|
||||
if (m_GradientStyle == GradientStyle.Split)
|
||||
{
|
||||
// Each characters.
|
||||
nomalizedPos = localMatrix * s_SplitedCharacterPosition[i % 4] + offset2;
|
||||
}
|
||||
else
|
||||
{
|
||||
nomalizedPos = localMatrix * vertex.position + offset2;
|
||||
}
|
||||
|
||||
// Interpolate vertex color.
|
||||
if (direction == Direction.Diagonal)
|
||||
{
|
||||
color = Color.LerpUnclamped(
|
||||
Color.LerpUnclamped(m_Color1, m_Color2, nomalizedPos.x),
|
||||
Color.LerpUnclamped(m_Color3, m_Color4, nomalizedPos.x),
|
||||
nomalizedPos.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
color = Color.LerpUnclamped(m_Color2, m_Color1, nomalizedPos.y);
|
||||
}
|
||||
// Interpolate vertex color.
|
||||
if (direction == Direction.Diagonal)
|
||||
{
|
||||
color = Color.LerpUnclamped(
|
||||
Color.LerpUnclamped(m_Color1, m_Color2, nomalizedPos.x),
|
||||
Color.LerpUnclamped(m_Color3, m_Color4, nomalizedPos.x),
|
||||
nomalizedPos.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
color = Color.LerpUnclamped(m_Color2, m_Color1, nomalizedPos.y);
|
||||
}
|
||||
|
||||
// Correct color.
|
||||
vertex.color *= (m_ColorSpace == ColorSpace.Gamma) ? color.gamma
|
||||
: (m_ColorSpace == ColorSpace.Linear) ? color.linear
|
||||
: color;
|
||||
// Correct color.
|
||||
vertex.color *= (m_ColorSpace == ColorSpace.Gamma) ? color.gamma
|
||||
: (m_ColorSpace == ColorSpace.Linear) ? color.linear
|
||||
: color;
|
||||
|
||||
vh.SetUIVertex(vertex, i);
|
||||
}
|
||||
}
|
||||
vh.SetUIVertex(vertex, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
static readonly Vector2[] s_SplitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero };
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
static readonly Vector2[] s_SplitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero };
|
||||
|
||||
/// <summary>
|
||||
/// Matrix2x3.
|
||||
/// </summary>
|
||||
struct Matrix2x3
|
||||
{
|
||||
public float m00, m01, m02, m10, m11, m12;
|
||||
/// <summary>
|
||||
/// Matrix2x3.
|
||||
/// </summary>
|
||||
struct Matrix2x3
|
||||
{
|
||||
public float m00, m01, m02, m10, m11, m12;
|
||||
|
||||
public Matrix2x3(Rect rect, float cos, float sin)
|
||||
{
|
||||
const float center = 0.5f;
|
||||
float dx = -rect.xMin / rect.width - center;
|
||||
float dy = -rect.yMin / rect.height - center;
|
||||
m00 = cos / rect.width;
|
||||
m01 = -sin / rect.height;
|
||||
m02 = dx * cos - dy * sin + center;
|
||||
m10 = sin / rect.width;
|
||||
m11 = cos / rect.height;
|
||||
m12 = dx * sin + dy * cos + center;
|
||||
}
|
||||
public Matrix2x3(Rect rect, float cos, float sin)
|
||||
{
|
||||
const float center = 0.5f;
|
||||
float dx = -rect.xMin / rect.width - center;
|
||||
float dy = -rect.yMin / rect.height - center;
|
||||
m00 = cos / rect.width;
|
||||
m01 = -sin / rect.height;
|
||||
m02 = dx * cos - dy * sin + center;
|
||||
m10 = sin / rect.width;
|
||||
m11 = cos / rect.height;
|
||||
m12 = dx * sin + dy * cos + center;
|
||||
}
|
||||
|
||||
public static Vector2 operator*(Matrix2x3 m, Vector2 v)
|
||||
{
|
||||
return new Vector2(
|
||||
(m.m00 * v.x) + (m.m01 * v.y) + m.m02,
|
||||
(m.m10 * v.x) + (m.m11 * v.y) + m.m12
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
public static Vector2 operator *(Matrix2x3 m, Vector2 v)
|
||||
{
|
||||
return new Vector2(
|
||||
(m.m00 * v.x) + (m.m01 * v.y) + m.m02,
|
||||
(m.m10 * v.x) + (m.m11 * v.y) + m.m12
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,194 +1,193 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Serialization;
|
||||
using UnityEngine.UI;
|
||||
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// HSV Modifier.
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/UIEffect/UIHsvModifier", 4)]
|
||||
public class UIHsvModifier : UIEffectBase
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-Effect-HSV";
|
||||
static readonly ParameterTexture _ptex = new ParameterTexture(7, 128, "_ParamTex");
|
||||
/// <summary>
|
||||
/// HSV Modifier.
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/UIEffect/UIHsvModifier", 4)]
|
||||
public class UIHsvModifier : UIEffectBase
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-Effect-HSV";
|
||||
static readonly ParameterTexture _ptex = new ParameterTexture(7, 128, "_ParamTex");
|
||||
|
||||
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Header("Target")]
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Header("Target")]
|
||||
|
||||
[Tooltip("Target color to affect hsv shift.")]
|
||||
[SerializeField] [ColorUsage(false)] Color m_TargetColor = Color.red;
|
||||
[Tooltip("Target color to affect hsv shift.")]
|
||||
[SerializeField][ColorUsage(false)] Color m_TargetColor = Color.red;
|
||||
|
||||
[Tooltip("Color range to affect hsv shift [0 ~ 1].")]
|
||||
[SerializeField] [Range(0, 1)] float m_Range = 0.1f;
|
||||
[Tooltip("Color range to affect hsv shift [0 ~ 1].")]
|
||||
[SerializeField][Range(0, 1)] float m_Range = 0.1f;
|
||||
|
||||
[Header("Adjustment")]
|
||||
[Header("Adjustment")]
|
||||
|
||||
[Tooltip("Hue shift [-0.5 ~ 0.5].")]
|
||||
[SerializeField] [Range(-0.5f, 0.5f)] float m_Hue;
|
||||
[Tooltip("Hue shift [-0.5 ~ 0.5].")]
|
||||
[SerializeField][Range(-0.5f, 0.5f)] float m_Hue;
|
||||
|
||||
[Tooltip("Saturation shift [-0.5 ~ 0.5].")]
|
||||
[SerializeField] [Range(-0.5f, 0.5f)] float m_Saturation;
|
||||
[Tooltip("Saturation shift [-0.5 ~ 0.5].")]
|
||||
[SerializeField][Range(-0.5f, 0.5f)] float m_Saturation;
|
||||
|
||||
[Tooltip("Value shift [-0.5 ~ 0.5].")]
|
||||
[SerializeField] [Range(-0.5f, 0.5f)] float m_Value;
|
||||
[Tooltip("Value shift [-0.5 ~ 0.5].")]
|
||||
[SerializeField][Range(-0.5f, 0.5f)] float m_Value;
|
||||
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
|
||||
/// <summary>
|
||||
/// Target color to affect hsv shift.
|
||||
/// </summary>
|
||||
public Color targetColor
|
||||
{
|
||||
get { return m_TargetColor; }
|
||||
set
|
||||
{
|
||||
if (m_TargetColor != value)
|
||||
{
|
||||
m_TargetColor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Target color to affect hsv shift.
|
||||
/// </summary>
|
||||
public Color targetColor
|
||||
{
|
||||
get { return m_TargetColor; }
|
||||
set
|
||||
{
|
||||
if (m_TargetColor != value)
|
||||
{
|
||||
m_TargetColor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Color range to affect hsv shift [0 ~ 1].
|
||||
/// </summary>
|
||||
public float range
|
||||
{
|
||||
get { return m_Range; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Range, value))
|
||||
{
|
||||
m_Range = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Color range to affect hsv shift [0 ~ 1].
|
||||
/// </summary>
|
||||
public float range
|
||||
{
|
||||
get { return m_Range; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Range, value))
|
||||
{
|
||||
m_Range = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saturation shift [-0.5 ~ 0.5].
|
||||
/// </summary>
|
||||
public float saturation
|
||||
{
|
||||
get { return m_Saturation; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, -0.5f, 0.5f);
|
||||
if (!Mathf.Approximately(m_Saturation, value))
|
||||
{
|
||||
m_Saturation = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Saturation shift [-0.5 ~ 0.5].
|
||||
/// </summary>
|
||||
public float saturation
|
||||
{
|
||||
get { return m_Saturation; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, -0.5f, 0.5f);
|
||||
if (!Mathf.Approximately(m_Saturation, value))
|
||||
{
|
||||
m_Saturation = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Value shift [-0.5 ~ 0.5].
|
||||
/// </summary>
|
||||
public float value
|
||||
{
|
||||
get { return m_Value; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, -0.5f, 0.5f);
|
||||
if (!Mathf.Approximately(m_Value, value))
|
||||
{
|
||||
m_Value = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Value shift [-0.5 ~ 0.5].
|
||||
/// </summary>
|
||||
public float value
|
||||
{
|
||||
get { return m_Value; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, -0.5f, 0.5f);
|
||||
if (!Mathf.Approximately(m_Value, value))
|
||||
{
|
||||
m_Value = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Hue shift [-0.5 ~ 0.5].
|
||||
/// </summary>
|
||||
public float hue
|
||||
{
|
||||
get { return m_Hue; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, -0.5f, 0.5f);
|
||||
if (!Mathf.Approximately(m_Hue, value))
|
||||
{
|
||||
m_Hue = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Hue shift [-0.5 ~ 0.5].
|
||||
/// </summary>
|
||||
public float hue
|
||||
{
|
||||
get { return m_Hue; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, -0.5f, 0.5f);
|
||||
if (!Mathf.Approximately(m_Hue, value))
|
||||
{
|
||||
m_Hue = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public override ParameterTexture ptex { get { return _ptex; } }
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public override ParameterTexture ptex { get { return _ptex; } }
|
||||
|
||||
#if UNITY_EDITOR
|
||||
protected override Material GetMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName));
|
||||
}
|
||||
protected override Material GetMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName));
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
return;
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
return;
|
||||
|
||||
float normalizedIndex = ptex.GetNormalizedIndex(this);
|
||||
UIVertex vertex = default(UIVertex);
|
||||
int count = vh.currentVertCount;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
float normalizedIndex = ptex.GetNormalizedIndex(this);
|
||||
UIVertex vertex = default(UIVertex);
|
||||
int count = vh.currentVertCount;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
|
||||
vertex.uv0 = new Vector2(
|
||||
Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
|
||||
normalizedIndex
|
||||
);
|
||||
vh.SetUIVertex(vertex, i);
|
||||
}
|
||||
}
|
||||
vertex.uv0 = new Vector2(
|
||||
Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
|
||||
normalizedIndex
|
||||
);
|
||||
vh.SetUIVertex(vertex, i);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void SetDirty()
|
||||
{
|
||||
float h, s, v;
|
||||
Color.RGBToHSV(m_TargetColor, out h, out s, out v);
|
||||
protected override void SetDirty()
|
||||
{
|
||||
float h, s, v;
|
||||
Color.RGBToHSV(m_TargetColor, out h, out s, out v);
|
||||
|
||||
foreach (var m in materials)
|
||||
{
|
||||
ptex.RegisterMaterial (m);
|
||||
}
|
||||
foreach (var m in materials)
|
||||
{
|
||||
ptex.RegisterMaterial(m);
|
||||
}
|
||||
|
||||
ptex.SetData(this, 0, h); // param1.x : target hue
|
||||
ptex.SetData(this, 1, s); // param1.y : target saturation
|
||||
ptex.SetData(this, 2, v); // param1.z : target value
|
||||
ptex.SetData(this, 3, m_Range); // param1.w : target range
|
||||
ptex.SetData(this, 4, m_Hue + 0.5f); // param2.x : hue shift
|
||||
ptex.SetData(this, 5, m_Saturation + 0.5f); // param2.y : saturation shift
|
||||
ptex.SetData(this, 6, m_Value + 0.5f); // param2.z : value shift
|
||||
}
|
||||
ptex.SetData(this, 0, h); // param1.x : target hue
|
||||
ptex.SetData(this, 1, s); // param1.y : target saturation
|
||||
ptex.SetData(this, 2, v); // param1.z : target value
|
||||
ptex.SetData(this, 3, m_Range); // param1.w : target range
|
||||
ptex.SetData(this, 4, m_Hue + 0.5f); // param2.x : hue shift
|
||||
ptex.SetData(this, 5, m_Saturation + 0.5f); // param2.y : saturation shift
|
||||
ptex.SetData(this, 6, m_Value + 0.5f); // param2.z : value shift
|
||||
}
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
}
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
}
|
||||
}
|
||||
|
@ -5,230 +5,229 @@ using UnityEngine.Serialization;
|
||||
using UnityEngine.UI;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffect.
|
||||
/// </summary>
|
||||
[RequireComponent(typeof(Graphic))]
|
||||
[AddComponentMenu("UI/UIEffect/UIShadow", 100)]
|
||||
public class UIShadow : BaseMeshEffect, IParameterTexture
|
||||
/// <summary>
|
||||
/// UIEffect.
|
||||
/// </summary>
|
||||
[RequireComponent(typeof(Graphic))]
|
||||
[AddComponentMenu("UI/UIEffect/UIShadow", 100)]
|
||||
public class UIShadow : BaseMeshEffect, IParameterTexture
|
||||
#if UNITY_EDITOR
|
||||
, ISerializationCallbackReceiver
|
||||
, ISerializationCallbackReceiver
|
||||
#endif
|
||||
{
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Additional shadow.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
[System.Serializable]
|
||||
public class AdditionalShadow
|
||||
{
|
||||
/// <summary>
|
||||
/// How far is the blurring shadow from the graphic.
|
||||
/// </summary>
|
||||
[FormerlySerializedAs("shadowBlur")]
|
||||
[Range(0, 1)] public float blur = 0.25f;
|
||||
/// <summary>
|
||||
/// Additional shadow.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
[System.Serializable]
|
||||
public class AdditionalShadow
|
||||
{
|
||||
/// <summary>
|
||||
/// How far is the blurring shadow from the graphic.
|
||||
/// </summary>
|
||||
[FormerlySerializedAs("shadowBlur")]
|
||||
[Range(0, 1)] public float blur = 0.25f;
|
||||
|
||||
/// <summary>
|
||||
/// Shadow effect mode.
|
||||
/// </summary>
|
||||
[FormerlySerializedAs("shadowMode")]
|
||||
public ShadowStyle style = ShadowStyle.Shadow;
|
||||
/// <summary>
|
||||
/// Shadow effect mode.
|
||||
/// </summary>
|
||||
[FormerlySerializedAs("shadowMode")]
|
||||
public ShadowStyle style = ShadowStyle.Shadow;
|
||||
|
||||
/// <summary>
|
||||
/// Color for the shadow effect.
|
||||
/// </summary>
|
||||
[FormerlySerializedAs("shadowColor")]
|
||||
public Color effectColor = Color.black;
|
||||
/// <summary>
|
||||
/// Color for the shadow effect.
|
||||
/// </summary>
|
||||
[FormerlySerializedAs("shadowColor")]
|
||||
public Color effectColor = Color.black;
|
||||
|
||||
/// <summary>
|
||||
/// How far is the shadow from the graphic.
|
||||
/// </summary>
|
||||
public Vector2 effectDistance = new Vector2(1f, -1f);
|
||||
/// <summary>
|
||||
/// How far is the shadow from the graphic.
|
||||
/// </summary>
|
||||
public Vector2 effectDistance = new Vector2(1f, -1f);
|
||||
|
||||
/// <summary>
|
||||
/// Should the shadow inherit the alpha from the graphic?
|
||||
/// </summary>
|
||||
public bool useGraphicAlpha = true;
|
||||
}
|
||||
/// <summary>
|
||||
/// Should the shadow inherit the alpha from the graphic?
|
||||
/// </summary>
|
||||
public bool useGraphicAlpha = true;
|
||||
}
|
||||
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("How far is the blurring shadow from the graphic.")]
|
||||
[FormerlySerializedAs("m_Blur")]
|
||||
[SerializeField][Range(0, 1)] float m_BlurFactor = 1;
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("How far is the blurring shadow from the graphic.")]
|
||||
[FormerlySerializedAs("m_Blur")]
|
||||
[SerializeField][Range(0, 1)] float m_BlurFactor = 1;
|
||||
|
||||
[Tooltip("Shadow effect style.")]
|
||||
[SerializeField] ShadowStyle m_Style = ShadowStyle.Shadow;
|
||||
[Tooltip("Shadow effect style.")]
|
||||
[SerializeField] ShadowStyle m_Style = ShadowStyle.Shadow;
|
||||
|
||||
#pragma warning disable 0414
|
||||
[HideInInspector][System.Obsolete]
|
||||
[SerializeField] List<AdditionalShadow> m_AdditionalShadows = new List<AdditionalShadow>();
|
||||
#pragma warning restore 0414
|
||||
#pragma warning disable 0414
|
||||
[HideInInspector]
|
||||
[System.Obsolete]
|
||||
[SerializeField] List<AdditionalShadow> m_AdditionalShadows = new List<AdditionalShadow>();
|
||||
#pragma warning restore 0414
|
||||
|
||||
|
||||
[SerializeField]
|
||||
private Color m_EffectColor = new Color (0f, 0f, 0f, 0.5f);
|
||||
[SerializeField]
|
||||
private Color m_EffectColor = new Color(0f, 0f, 0f, 0.5f);
|
||||
|
||||
[SerializeField]
|
||||
private Vector2 m_EffectDistance = new Vector2 (1f, -1f);
|
||||
[SerializeField]
|
||||
private Vector2 m_EffectDistance = new Vector2(1f, -1f);
|
||||
|
||||
[SerializeField]
|
||||
private bool m_UseGraphicAlpha = true;
|
||||
[SerializeField]
|
||||
private bool m_UseGraphicAlpha = true;
|
||||
|
||||
private const float kMaxEffectDistance = 600f;
|
||||
private const float kMaxEffectDistance = 600f;
|
||||
|
||||
public Color effectColor
|
||||
{
|
||||
get { return m_EffectColor; }
|
||||
set
|
||||
{
|
||||
m_EffectColor = value;
|
||||
if (graphic != null)
|
||||
graphic.SetVerticesDirty ();
|
||||
}
|
||||
}
|
||||
public Color effectColor
|
||||
{
|
||||
get { return m_EffectColor; }
|
||||
set
|
||||
{
|
||||
m_EffectColor = value;
|
||||
if (graphic != null)
|
||||
graphic.SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
|
||||
public Vector2 effectDistance
|
||||
{
|
||||
get { return m_EffectDistance; }
|
||||
set
|
||||
{
|
||||
if (value.x > kMaxEffectDistance)
|
||||
value.x = kMaxEffectDistance;
|
||||
if (value.x < -kMaxEffectDistance)
|
||||
value.x = -kMaxEffectDistance;
|
||||
public Vector2 effectDistance
|
||||
{
|
||||
get { return m_EffectDistance; }
|
||||
set
|
||||
{
|
||||
if (value.x > kMaxEffectDistance)
|
||||
value.x = kMaxEffectDistance;
|
||||
if (value.x < -kMaxEffectDistance)
|
||||
value.x = -kMaxEffectDistance;
|
||||
|
||||
if (value.y > kMaxEffectDistance)
|
||||
value.y = kMaxEffectDistance;
|
||||
if (value.y < -kMaxEffectDistance)
|
||||
value.y = -kMaxEffectDistance;
|
||||
if (value.y > kMaxEffectDistance)
|
||||
value.y = kMaxEffectDistance;
|
||||
if (value.y < -kMaxEffectDistance)
|
||||
value.y = -kMaxEffectDistance;
|
||||
|
||||
if (m_EffectDistance == value)
|
||||
return;
|
||||
if (m_EffectDistance == value)
|
||||
return;
|
||||
|
||||
m_EffectDistance = value;
|
||||
m_EffectDistance = value;
|
||||
|
||||
if (graphic != null)
|
||||
graphic.SetVerticesDirty ();
|
||||
}
|
||||
}
|
||||
if (graphic != null)
|
||||
graphic.SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
|
||||
public bool useGraphicAlpha
|
||||
{
|
||||
get { return m_UseGraphicAlpha; }
|
||||
set
|
||||
{
|
||||
m_UseGraphicAlpha = value;
|
||||
if (graphic != null)
|
||||
graphic.SetVerticesDirty ();
|
||||
}
|
||||
}
|
||||
public bool useGraphicAlpha
|
||||
{
|
||||
get { return m_UseGraphicAlpha; }
|
||||
set
|
||||
{
|
||||
m_UseGraphicAlpha = value;
|
||||
if (graphic != null)
|
||||
graphic.SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// How far is the blurring shadow from the graphic.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")]
|
||||
public float blur
|
||||
{
|
||||
get { return m_BlurFactor; }
|
||||
set
|
||||
{
|
||||
m_BlurFactor = Mathf.Clamp(value, 0, 2);
|
||||
_SetDirty();
|
||||
}
|
||||
}
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
/// <summary>
|
||||
/// How far is the blurring shadow from the graphic.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")]
|
||||
public float blur
|
||||
{
|
||||
get { return m_BlurFactor; }
|
||||
set
|
||||
{
|
||||
m_BlurFactor = Mathf.Clamp(value, 0, 2);
|
||||
_SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// How far is the blurring shadow from the graphic.
|
||||
/// </summary>
|
||||
public float blurFactor
|
||||
{
|
||||
get { return m_BlurFactor; }
|
||||
set
|
||||
{
|
||||
m_BlurFactor = Mathf.Clamp(value, 0, 2);
|
||||
_SetDirty();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// How far is the blurring shadow from the graphic.
|
||||
/// </summary>
|
||||
public float blurFactor
|
||||
{
|
||||
get { return m_BlurFactor; }
|
||||
set
|
||||
{
|
||||
m_BlurFactor = Mathf.Clamp(value, 0, 2);
|
||||
_SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shadow effect style.
|
||||
/// </summary>
|
||||
public ShadowStyle style
|
||||
{
|
||||
get { return m_Style; }
|
||||
set
|
||||
{
|
||||
m_Style = value;
|
||||
_SetDirty();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Shadow effect style.
|
||||
/// </summary>
|
||||
public ShadowStyle style
|
||||
{
|
||||
get { return m_Style; }
|
||||
set
|
||||
{
|
||||
m_Style = value;
|
||||
_SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the parameter index.
|
||||
/// </summary>
|
||||
public int parameterIndex { get; set; }
|
||||
/// <summary>
|
||||
/// Gets or sets the parameter index.
|
||||
/// </summary>
|
||||
public int parameterIndex { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public ParameterTexture ptex{ get; private set; }
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public ParameterTexture ptex { get; private set; }
|
||||
|
||||
int _graphicVertexCount;
|
||||
static readonly List<UIShadow> tmpShadows = new List<UIShadow>();
|
||||
int _graphicVertexCount;
|
||||
static readonly List<UIShadow> tmpShadows = new List<UIShadow>();
|
||||
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
|
||||
_uiEffect = GetComponent<UIEffect>();
|
||||
if (_uiEffect)
|
||||
{
|
||||
ptex = _uiEffect.ptex;
|
||||
ptex.Register(this);
|
||||
}
|
||||
_uiEffect = GetComponent<UIEffect>();
|
||||
if (_uiEffect)
|
||||
{
|
||||
ptex = _uiEffect.ptex;
|
||||
ptex.Register(this);
|
||||
}
|
||||
|
||||
#if TMP_PRESENT
|
||||
#if TMP_PRESENT
|
||||
if (isTMPro)
|
||||
{
|
||||
textMeshPro.onCullStateChanged.AddListener (OnCullStateChanged);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable();
|
||||
_uiEffect = null;
|
||||
if (ptex != null)
|
||||
{
|
||||
ptex.Unregister(this);
|
||||
ptex = null;
|
||||
}
|
||||
}
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable();
|
||||
_uiEffect = null;
|
||||
if (ptex != null)
|
||||
{
|
||||
ptex.Unregister(this);
|
||||
ptex = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if UNITY_EDITOR
|
||||
protected override void OnValidate ()
|
||||
{
|
||||
effectDistance = m_EffectDistance;
|
||||
base.OnValidate ();
|
||||
}
|
||||
#endif
|
||||
#if UNITY_EDITOR
|
||||
protected override void OnValidate()
|
||||
{
|
||||
effectDistance = m_EffectDistance;
|
||||
base.OnValidate();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TMP_PRESENT
|
||||
#if TMP_PRESENT
|
||||
protected void OnCullStateChanged (bool state)
|
||||
{
|
||||
SetVerticesDirty ();
|
||||
@ -249,213 +248,213 @@ namespace Coffee.UIExtensions
|
||||
}
|
||||
base.LateUpdate ();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled || vh.currentVertCount <= 0 || m_Style == ShadowStyle.None)
|
||||
{
|
||||
return;
|
||||
}
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled || vh.currentVertCount <= 0 || m_Style == ShadowStyle.None)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
vh.GetUIVertexStream(s_Verts);
|
||||
vh.GetUIVertexStream(s_Verts);
|
||||
|
||||
GetComponents<UIShadow>(tmpShadows);
|
||||
GetComponents<UIShadow>(tmpShadows);
|
||||
|
||||
foreach (var s in tmpShadows)
|
||||
{
|
||||
if (s.isActiveAndEnabled)
|
||||
{
|
||||
if (s == this)
|
||||
{
|
||||
foreach (var s2 in tmpShadows)
|
||||
{
|
||||
s2._graphicVertexCount = s_Verts.Count;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
foreach (var s in tmpShadows)
|
||||
{
|
||||
if (s.isActiveAndEnabled)
|
||||
{
|
||||
if (s == this)
|
||||
{
|
||||
foreach (var s2 in tmpShadows)
|
||||
{
|
||||
s2._graphicVertexCount = s_Verts.Count;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tmpShadows.Clear();
|
||||
tmpShadows.Clear();
|
||||
|
||||
//================================
|
||||
// Append shadow vertices.
|
||||
//================================
|
||||
{
|
||||
_uiEffect = _uiEffect ?? GetComponent<UIEffect>();
|
||||
var start = s_Verts.Count - _graphicVertexCount;
|
||||
var end = s_Verts.Count;
|
||||
//================================
|
||||
// Append shadow vertices.
|
||||
//================================
|
||||
{
|
||||
_uiEffect = _uiEffect ?? GetComponent<UIEffect>();
|
||||
var start = s_Verts.Count - _graphicVertexCount;
|
||||
var end = s_Verts.Count;
|
||||
|
||||
if (ptex != null && _uiEffect && _uiEffect.isActiveAndEnabled)
|
||||
{
|
||||
ptex.SetData(this, 0, _uiEffect.effectFactor); // param.x : effect factor
|
||||
ptex.SetData(this, 1, 255); // param.y : color factor
|
||||
ptex.SetData(this, 2, m_BlurFactor); // param.z : blur factor
|
||||
}
|
||||
if (ptex != null && _uiEffect && _uiEffect.isActiveAndEnabled)
|
||||
{
|
||||
ptex.SetData(this, 0, _uiEffect.effectFactor); // param.x : effect factor
|
||||
ptex.SetData(this, 1, 255); // param.y : color factor
|
||||
ptex.SetData(this, 2, m_BlurFactor); // param.z : blur factor
|
||||
}
|
||||
|
||||
_ApplyShadow(s_Verts, effectColor, ref start, ref end, effectDistance, style, useGraphicAlpha);
|
||||
}
|
||||
_ApplyShadow(s_Verts, effectColor, ref start, ref end, effectDistance, style, useGraphicAlpha);
|
||||
}
|
||||
|
||||
vh.Clear();
|
||||
vh.AddUIVertexTriangleStream(s_Verts);
|
||||
vh.Clear();
|
||||
vh.AddUIVertexTriangleStream(s_Verts);
|
||||
|
||||
s_Verts.Clear();
|
||||
}
|
||||
s_Verts.Clear();
|
||||
}
|
||||
|
||||
UIEffect _uiEffect;
|
||||
UIEffect _uiEffect;
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
static readonly List<UIVertex> s_Verts = new List<UIVertex>(4096);
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
static readonly List<UIVertex> s_Verts = new List<UIVertex>(4096);
|
||||
|
||||
/// <summary>
|
||||
/// Append shadow vertices.
|
||||
/// * It is similar to Shadow component implementation.
|
||||
/// </summary>
|
||||
void _ApplyShadow(List<UIVertex> verts, Color color, ref int start, ref int end, Vector2 effectDistance, ShadowStyle style, bool useGraphicAlpha)
|
||||
{
|
||||
if (style == ShadowStyle.None || color.a <= 0)
|
||||
return;
|
||||
/// <summary>
|
||||
/// Append shadow vertices.
|
||||
/// * It is similar to Shadow component implementation.
|
||||
/// </summary>
|
||||
void _ApplyShadow(List<UIVertex> verts, Color color, ref int start, ref int end, Vector2 effectDistance, ShadowStyle style, bool useGraphicAlpha)
|
||||
{
|
||||
if (style == ShadowStyle.None || color.a <= 0)
|
||||
return;
|
||||
|
||||
// Append Shadow.
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, effectDistance.y, useGraphicAlpha);
|
||||
// Append Shadow.
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, effectDistance.y, useGraphicAlpha);
|
||||
|
||||
// Append Shadow3.
|
||||
if (ShadowStyle.Shadow3 == style)
|
||||
{
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, 0, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, 0, effectDistance.y, useGraphicAlpha);
|
||||
}
|
||||
// Append Shadow3.
|
||||
if (ShadowStyle.Shadow3 == style)
|
||||
{
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, 0, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, 0, effectDistance.y, useGraphicAlpha);
|
||||
}
|
||||
|
||||
// Append Outline.
|
||||
else if (ShadowStyle.Outline == style)
|
||||
{
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, -effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, -effectDistance.x, effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, -effectDistance.x, -effectDistance.y, useGraphicAlpha);
|
||||
}
|
||||
// Append Outline.
|
||||
else if (ShadowStyle.Outline == style)
|
||||
{
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, -effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, -effectDistance.x, effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, -effectDistance.x, -effectDistance.y, useGraphicAlpha);
|
||||
}
|
||||
|
||||
// Append Outline8.
|
||||
else if (ShadowStyle.Outline8 == style)
|
||||
{
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, -effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, -effectDistance.x, effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, -effectDistance.x, -effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, -effectDistance.x, 0, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, 0, -effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, 0, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, 0, effectDistance.y, useGraphicAlpha);
|
||||
}
|
||||
}
|
||||
// Append Outline8.
|
||||
else if (ShadowStyle.Outline8 == style)
|
||||
{
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, -effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, -effectDistance.x, effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, -effectDistance.x, -effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, -effectDistance.x, 0, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, 0, -effectDistance.y, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, 0, useGraphicAlpha);
|
||||
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, 0, effectDistance.y, useGraphicAlpha);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Append shadow vertices.
|
||||
/// * It is similar to Shadow component implementation.
|
||||
/// </summary>
|
||||
void _ApplyShadowZeroAlloc(List<UIVertex> verts, Color color, ref int start, ref int end, float x, float y, bool useGraphicAlpha)
|
||||
{
|
||||
// Check list capacity.
|
||||
int count = end - start;
|
||||
var neededCapacity = verts.Count + count;
|
||||
if (verts.Capacity < neededCapacity)
|
||||
verts.Capacity *= 2;
|
||||
/// <summary>
|
||||
/// Append shadow vertices.
|
||||
/// * It is similar to Shadow component implementation.
|
||||
/// </summary>
|
||||
void _ApplyShadowZeroAlloc(List<UIVertex> verts, Color color, ref int start, ref int end, float x, float y, bool useGraphicAlpha)
|
||||
{
|
||||
// Check list capacity.
|
||||
int count = end - start;
|
||||
var neededCapacity = verts.Count + count;
|
||||
if (verts.Capacity < neededCapacity)
|
||||
verts.Capacity *= 2;
|
||||
|
||||
float normalizedIndex = ptex != null && _uiEffect && _uiEffect.isActiveAndEnabled
|
||||
? ptex.GetNormalizedIndex(this)
|
||||
: -1;
|
||||
float normalizedIndex = ptex != null && _uiEffect && _uiEffect.isActiveAndEnabled
|
||||
? ptex.GetNormalizedIndex(this)
|
||||
: -1;
|
||||
|
||||
// Add
|
||||
UIVertex vt = default(UIVertex);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
verts.Add(vt);
|
||||
}
|
||||
// Add
|
||||
UIVertex vt = default(UIVertex);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
verts.Add(vt);
|
||||
}
|
||||
|
||||
// Move
|
||||
for (int i = verts.Count - 1; count <= i; i--)
|
||||
{
|
||||
verts[i] = verts[i - count];
|
||||
}
|
||||
// Move
|
||||
for (int i = verts.Count - 1; count <= i; i--)
|
||||
{
|
||||
verts[i] = verts[i - count];
|
||||
}
|
||||
|
||||
// Append shadow vertices to the front of list.
|
||||
// * The original vertex is pushed backward.
|
||||
for (int i = 0; i < count; ++i)
|
||||
{
|
||||
vt = verts[i + start + count];
|
||||
// Append shadow vertices to the front of list.
|
||||
// * The original vertex is pushed backward.
|
||||
for (int i = 0; i < count; ++i)
|
||||
{
|
||||
vt = verts[i + start + count];
|
||||
|
||||
Vector3 v = vt.position;
|
||||
vt.position.Set(v.x + x, v.y + y, v.z);
|
||||
Vector3 v = vt.position;
|
||||
vt.position.Set(v.x + x, v.y + y, v.z);
|
||||
|
||||
Color vertColor = effectColor;
|
||||
vertColor.a = useGraphicAlpha ? color.a * vt.color.a / 255 : color.a;
|
||||
vt.color = vertColor;
|
||||
Color vertColor = effectColor;
|
||||
vertColor.a = useGraphicAlpha ? color.a * vt.color.a / 255 : color.a;
|
||||
vt.color = vertColor;
|
||||
|
||||
|
||||
// Set UIEffect prameters
|
||||
if (0 <= normalizedIndex)
|
||||
{
|
||||
vt.uv0 = new Vector2(
|
||||
vt.uv0.x,
|
||||
normalizedIndex
|
||||
);
|
||||
}
|
||||
// Set UIEffect prameters
|
||||
if (0 <= normalizedIndex)
|
||||
{
|
||||
vt.uv0 = new Vector2(
|
||||
vt.uv0.x,
|
||||
normalizedIndex
|
||||
);
|
||||
}
|
||||
|
||||
verts[i] = vt;
|
||||
}
|
||||
verts[i] = vt;
|
||||
}
|
||||
|
||||
// Update next shadow offset.
|
||||
start = end;
|
||||
end = verts.Count;
|
||||
}
|
||||
// Update next shadow offset.
|
||||
start = end;
|
||||
end = verts.Count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mark the UIEffect as dirty.
|
||||
/// </summary>
|
||||
void _SetDirty()
|
||||
{
|
||||
if (graphic)
|
||||
graphic.SetVerticesDirty();
|
||||
}
|
||||
/// <summary>
|
||||
/// Mark the UIEffect as dirty.
|
||||
/// </summary>
|
||||
void _SetDirty()
|
||||
{
|
||||
if (graphic)
|
||||
graphic.SetVerticesDirty();
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
public void OnBeforeSerialize()
|
||||
{
|
||||
}
|
||||
public void OnBeforeSerialize()
|
||||
{
|
||||
}
|
||||
|
||||
public void OnAfterDeserialize()
|
||||
{
|
||||
EditorApplication.delayCall += UpgradeIfNeeded;
|
||||
}
|
||||
public void OnAfterDeserialize()
|
||||
{
|
||||
EditorApplication.delayCall += UpgradeIfNeeded;
|
||||
}
|
||||
|
||||
|
||||
#pragma warning disable 0612
|
||||
void UpgradeIfNeeded()
|
||||
{
|
||||
if (0 < m_AdditionalShadows.Count)
|
||||
{
|
||||
foreach (var s in m_AdditionalShadows)
|
||||
{
|
||||
if (s.style == ShadowStyle.None)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
#pragma warning disable 0612
|
||||
void UpgradeIfNeeded()
|
||||
{
|
||||
if (0 < m_AdditionalShadows.Count)
|
||||
{
|
||||
foreach (var s in m_AdditionalShadows)
|
||||
{
|
||||
if (s.style == ShadowStyle.None)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var shadow = gameObject.AddComponent<UIShadow>();
|
||||
shadow.style = s.style;
|
||||
shadow.effectDistance = s.effectDistance;
|
||||
shadow.effectColor = s.effectColor;
|
||||
shadow.useGraphicAlpha = s.useGraphicAlpha;
|
||||
shadow.blurFactor = s.blur;
|
||||
}
|
||||
m_AdditionalShadows = null;
|
||||
}
|
||||
}
|
||||
#pragma warning restore 0612
|
||||
var shadow = gameObject.AddComponent<UIShadow>();
|
||||
shadow.style = s.style;
|
||||
shadow.effectDistance = s.effectDistance;
|
||||
shadow.effectColor = s.effectColor;
|
||||
shadow.useGraphicAlpha = s.useGraphicAlpha;
|
||||
shadow.blurFactor = s.blur;
|
||||
}
|
||||
m_AdditionalShadows = null;
|
||||
}
|
||||
}
|
||||
#pragma warning restore 0612
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,408 +1,408 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Serialization;
|
||||
using UnityEngine.UI;
|
||||
using System.Collections;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// UIEffect.
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/UIEffect/UIShiny", 2)]
|
||||
public class UIShiny : UIEffectBase
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-Effect-Shiny";
|
||||
static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex");
|
||||
/// <summary>
|
||||
/// UIEffect.
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/UIEffect/UIShiny", 2)]
|
||||
public class UIShiny : UIEffectBase
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-Effect-Shiny";
|
||||
static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex");
|
||||
|
||||
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Location for shiny effect.")]
|
||||
[FormerlySerializedAs("m_Location")]
|
||||
[SerializeField] [Range(0, 1)] float m_EffectFactor = 0;
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Location for shiny effect.")]
|
||||
[FormerlySerializedAs("m_Location")]
|
||||
[SerializeField][Range(0, 1)] float m_EffectFactor = 0;
|
||||
|
||||
[Tooltip("Width for shiny effect.")]
|
||||
[SerializeField] [Range(0, 1)] float m_Width = 0.25f;
|
||||
[Tooltip("Width for shiny effect.")]
|
||||
[SerializeField][Range(0, 1)] float m_Width = 0.25f;
|
||||
|
||||
[Tooltip("Rotation for shiny effect.")]
|
||||
[SerializeField] [Range(-180, 180)] float m_Rotation;
|
||||
[Tooltip("Rotation for shiny effect.")]
|
||||
[SerializeField][Range(-180, 180)] float m_Rotation;
|
||||
|
||||
[Tooltip("Softness for shiny effect.")]
|
||||
[SerializeField][Range(0.01f, 1)] float m_Softness = 1f;
|
||||
[Tooltip("Softness for shiny effect.")]
|
||||
[SerializeField][Range(0.01f, 1)] float m_Softness = 1f;
|
||||
|
||||
[Tooltip("Brightness for shiny effect.")]
|
||||
[FormerlySerializedAs("m_Alpha")]
|
||||
[SerializeField][Range(0, 1)] float m_Brightness = 1f;
|
||||
[Tooltip("Brightness for shiny effect.")]
|
||||
[FormerlySerializedAs("m_Alpha")]
|
||||
[SerializeField][Range(0, 1)] float m_Brightness = 1f;
|
||||
|
||||
[Tooltip("Gloss factor for shiny effect.")]
|
||||
[FormerlySerializedAs("m_Highlight")]
|
||||
[SerializeField][Range(0, 1)] float m_Gloss = 1;
|
||||
[Tooltip("Gloss factor for shiny effect.")]
|
||||
[FormerlySerializedAs("m_Highlight")]
|
||||
[SerializeField][Range(0, 1)] float m_Gloss = 1;
|
||||
|
||||
[Header("Advanced Option")]
|
||||
[Tooltip("The area for effect.")]
|
||||
[SerializeField] protected EffectArea m_EffectArea;
|
||||
[Header("Advanced Option")]
|
||||
[Tooltip("The area for effect.")]
|
||||
[SerializeField] protected EffectArea m_EffectArea;
|
||||
|
||||
[SerializeField] EffectPlayer m_Player;
|
||||
[SerializeField] EffectPlayer m_Player;
|
||||
|
||||
#pragma warning disable 0414
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField] bool m_Play = false;
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField] bool m_Loop = false;
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField][Range(0.1f, 10)] float m_Duration = 1;
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField][Range(0, 10)] float m_LoopDelay = 1;
|
||||
[Obsolete][HideInInspector]
|
||||
[SerializeField] AnimatorUpdateMode m_UpdateMode = AnimatorUpdateMode.Normal;
|
||||
#pragma warning restore 0414
|
||||
#pragma warning disable 0414
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField] bool m_Play = false;
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField] bool m_Loop = false;
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField][Range(0.1f, 10)] float m_Duration = 1;
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField][Range(0, 10)] float m_LoopDelay = 1;
|
||||
[Obsolete]
|
||||
[HideInInspector]
|
||||
[SerializeField] AnimatorUpdateMode m_UpdateMode = AnimatorUpdateMode.Normal;
|
||||
#pragma warning restore 0414
|
||||
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
|
||||
/// <summary>
|
||||
/// Effect factor between 0(start) and 1(end).
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
|
||||
public float location
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_EffectFactor, value))
|
||||
{
|
||||
m_EffectFactor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Effect factor between 0(start) and 1(end).
|
||||
/// </summary>
|
||||
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
|
||||
public float location
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_EffectFactor, value))
|
||||
{
|
||||
m_EffectFactor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Effect factor between 0(start) and 1(end).
|
||||
/// </summary>
|
||||
public float effectFactor
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_EffectFactor, value))
|
||||
{
|
||||
m_EffectFactor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Effect factor between 0(start) and 1(end).
|
||||
/// </summary>
|
||||
public float effectFactor
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_EffectFactor, value))
|
||||
{
|
||||
m_EffectFactor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Width for shiny effect.
|
||||
/// </summary>
|
||||
public float width
|
||||
{
|
||||
get { return m_Width; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Width, value))
|
||||
{
|
||||
m_Width = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Width for shiny effect.
|
||||
/// </summary>
|
||||
public float width
|
||||
{
|
||||
get { return m_Width; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Width, value))
|
||||
{
|
||||
m_Width = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Softness for shiny effect.
|
||||
/// </summary>
|
||||
public float softness
|
||||
{
|
||||
get { return m_Softness; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0.01f, 1);
|
||||
if (!Mathf.Approximately(m_Softness, value))
|
||||
{
|
||||
m_Softness = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Softness for shiny effect.
|
||||
/// </summary>
|
||||
public float softness
|
||||
{
|
||||
get { return m_Softness; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0.01f, 1);
|
||||
if (!Mathf.Approximately(m_Softness, value))
|
||||
{
|
||||
m_Softness = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Brightness for shiny effect.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use brightness instead (UnityUpgradable) -> brightness")]
|
||||
public float alpha
|
||||
{
|
||||
get { return m_Brightness; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Brightness, value))
|
||||
{
|
||||
m_Brightness = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Brightness for shiny effect.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use brightness instead (UnityUpgradable) -> brightness")]
|
||||
public float alpha
|
||||
{
|
||||
get { return m_Brightness; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Brightness, value))
|
||||
{
|
||||
m_Brightness = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Brightness for shiny effect.
|
||||
/// </summary>
|
||||
public float brightness
|
||||
{
|
||||
get { return m_Brightness; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Brightness, value))
|
||||
{
|
||||
m_Brightness = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Brightness for shiny effect.
|
||||
/// </summary>
|
||||
public float brightness
|
||||
{
|
||||
get { return m_Brightness; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Brightness, value))
|
||||
{
|
||||
m_Brightness = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gloss factor for shiny effect.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use gloss instead (UnityUpgradable) -> gloss")]
|
||||
public float highlight
|
||||
{
|
||||
get { return m_Gloss; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Gloss, value))
|
||||
{
|
||||
m_Gloss = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gloss factor for shiny effect.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use gloss instead (UnityUpgradable) -> gloss")]
|
||||
public float highlight
|
||||
{
|
||||
get { return m_Gloss; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Gloss, value))
|
||||
{
|
||||
m_Gloss = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gloss factor for shiny effect.
|
||||
/// </summary>
|
||||
public float gloss
|
||||
{
|
||||
get { return m_Gloss; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Gloss, value))
|
||||
{
|
||||
m_Gloss = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gloss factor for shiny effect.
|
||||
/// </summary>
|
||||
public float gloss
|
||||
{
|
||||
get { return m_Gloss; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_Gloss, value))
|
||||
{
|
||||
m_Gloss = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Rotation for shiny effect.
|
||||
/// </summary>
|
||||
public float rotation
|
||||
{
|
||||
get { return m_Rotation; }
|
||||
set
|
||||
{
|
||||
if (!Mathf.Approximately(m_Rotation, value))
|
||||
{
|
||||
m_Rotation = _lastRotation = value;
|
||||
SetVerticesDirty ();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Rotation for shiny effect.
|
||||
/// </summary>
|
||||
public float rotation
|
||||
{
|
||||
get { return m_Rotation; }
|
||||
set
|
||||
{
|
||||
if (!Mathf.Approximately(m_Rotation, value))
|
||||
{
|
||||
m_Rotation = _lastRotation = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The area for effect.
|
||||
/// </summary>
|
||||
public EffectArea effectArea
|
||||
{
|
||||
get { return m_EffectArea; }
|
||||
set
|
||||
{
|
||||
if (m_EffectArea != value)
|
||||
{
|
||||
m_EffectArea = value;
|
||||
SetVerticesDirty ();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// The area for effect.
|
||||
/// </summary>
|
||||
public EffectArea effectArea
|
||||
{
|
||||
get { return m_EffectArea; }
|
||||
set
|
||||
{
|
||||
if (m_EffectArea != value)
|
||||
{
|
||||
m_EffectArea = value;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Play shinning on enable.
|
||||
/// </summary>
|
||||
[System.Obsolete ("Use Play/Stop method instead")]
|
||||
public bool play { get { return _player.play; } set { _player.play = value; } }
|
||||
/// <summary>
|
||||
/// Play shinning on enable.
|
||||
/// </summary>
|
||||
[System.Obsolete("Use Play/Stop method instead")]
|
||||
public bool play { get { return _player.play; } set { _player.play = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Play shinning loop.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
public bool loop { get { return _player.loop; } set { _player.loop = value; } }
|
||||
/// <summary>
|
||||
/// Play shinning loop.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
public bool loop { get { return _player.loop; } set { _player.loop = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Shinning duration.
|
||||
/// </summary>
|
||||
public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } }
|
||||
/// <summary>
|
||||
/// Shinning duration.
|
||||
/// </summary>
|
||||
public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } }
|
||||
|
||||
/// <summary>
|
||||
/// Delay on loop.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
public float loopDelay { get { return _player.loopDelay; } set { _player.loopDelay = Mathf.Max(value, 0); } }
|
||||
/// <summary>
|
||||
/// Delay on loop.
|
||||
/// </summary>
|
||||
[System.Obsolete]
|
||||
public float loopDelay { get { return _player.loopDelay; } set { _player.loopDelay = Mathf.Max(value, 0); } }
|
||||
|
||||
/// <summary>
|
||||
/// Shinning update mode.
|
||||
/// </summary>
|
||||
public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } }
|
||||
/// <summary>
|
||||
/// Shinning update mode.
|
||||
/// </summary>
|
||||
public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public override ParameterTexture ptex { get { return _ptex; } }
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public override ParameterTexture ptex { get { return _ptex; } }
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
_player.OnEnable(f => effectFactor = f);
|
||||
}
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
_player.OnEnable(f => effectFactor = f);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the behaviour becomes disabled () or inactive.
|
||||
/// </summary>
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable();
|
||||
_player.OnDisable();
|
||||
}
|
||||
/// <summary>
|
||||
/// This function is called when the behaviour becomes disabled () or inactive.
|
||||
/// </summary>
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable();
|
||||
_player.OnDisable();
|
||||
}
|
||||
|
||||
|
||||
#if UNITY_EDITOR
|
||||
protected override Material GetMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
protected override Material GetMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName));
|
||||
}
|
||||
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName));
|
||||
}
|
||||
|
||||
#pragma warning disable 0612
|
||||
protected override void UpgradeIfNeeded()
|
||||
{
|
||||
// Upgrade for v3.0.0
|
||||
if (IsShouldUpgrade(300))
|
||||
{
|
||||
_player.play = m_Play;
|
||||
_player.duration = m_Duration;
|
||||
_player.loop = m_Loop;
|
||||
_player.loopDelay = m_LoopDelay;
|
||||
_player.updateMode = m_UpdateMode;
|
||||
}
|
||||
}
|
||||
#pragma warning restore 0612
|
||||
#pragma warning disable 0612
|
||||
protected override void UpgradeIfNeeded()
|
||||
{
|
||||
// Upgrade for v3.0.0
|
||||
if (IsShouldUpgrade(300))
|
||||
{
|
||||
_player.play = m_Play;
|
||||
_player.duration = m_Duration;
|
||||
_player.loop = m_Loop;
|
||||
_player.loopDelay = m_LoopDelay;
|
||||
_player.updateMode = m_UpdateMode;
|
||||
}
|
||||
}
|
||||
#pragma warning restore 0612
|
||||
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
return;
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
return;
|
||||
|
||||
bool isText = isTMPro || graphic is Text;
|
||||
float normalizedIndex = ptex.GetNormalizedIndex(this);
|
||||
bool isText = isTMPro || graphic is Text;
|
||||
float normalizedIndex = ptex.GetNormalizedIndex(this);
|
||||
|
||||
// rect.
|
||||
Rect rect = m_EffectArea.GetEffectArea (vh, rectTransform.rect);
|
||||
// rect.
|
||||
Rect rect = m_EffectArea.GetEffectArea(vh, rectTransform.rect);
|
||||
|
||||
// rotation.
|
||||
float rad = m_Rotation * Mathf.Deg2Rad;
|
||||
Vector2 dir = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad));
|
||||
dir.x *= rect.height / rect.width;
|
||||
dir = dir.normalized;
|
||||
// rotation.
|
||||
float rad = m_Rotation * Mathf.Deg2Rad;
|
||||
Vector2 dir = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad));
|
||||
dir.x *= rect.height / rect.width;
|
||||
dir = dir.normalized;
|
||||
|
||||
// Calculate vertex position.
|
||||
UIVertex vertex = default(UIVertex);
|
||||
Vector2 nomalizedPos;
|
||||
Matrix2x3 localMatrix = new Matrix2x3(rect, dir.x, dir.y); // Get local matrix.
|
||||
for (int i = 0; i < vh.currentVertCount; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
m_EffectArea.GetNormalizedFactor (i, localMatrix, vertex.position, isText, out nomalizedPos);
|
||||
// Calculate vertex position.
|
||||
UIVertex vertex = default(UIVertex);
|
||||
Vector2 nomalizedPos;
|
||||
Matrix2x3 localMatrix = new Matrix2x3(rect, dir.x, dir.y); // Get local matrix.
|
||||
for (int i = 0; i < vh.currentVertCount; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
m_EffectArea.GetNormalizedFactor(i, localMatrix, vertex.position, isText, out nomalizedPos);
|
||||
|
||||
vertex.uv0 = new Vector2 (
|
||||
Packer.ToFloat (vertex.uv0.x, vertex.uv0.y),
|
||||
Packer.ToFloat (nomalizedPos.y, normalizedIndex)
|
||||
);
|
||||
vertex.uv0 = new Vector2(
|
||||
Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
|
||||
Packer.ToFloat(nomalizedPos.y, normalizedIndex)
|
||||
);
|
||||
|
||||
vh.SetUIVertex(vertex, i);
|
||||
}
|
||||
}
|
||||
vh.SetUIVertex(vertex, i);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Play effect.
|
||||
/// </summary>
|
||||
public void Play(bool reset = true)
|
||||
{
|
||||
_player.Play(reset);
|
||||
}
|
||||
/// <summary>
|
||||
/// Play effect.
|
||||
/// </summary>
|
||||
public void Play(bool reset = true)
|
||||
{
|
||||
_player.Play(reset);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stop effect.
|
||||
/// </summary>
|
||||
public void Stop(bool reset = true)
|
||||
{
|
||||
_player.Stop(reset);
|
||||
}
|
||||
/// <summary>
|
||||
/// Stop effect.
|
||||
/// </summary>
|
||||
public void Stop(bool reset = true)
|
||||
{
|
||||
_player.Stop(reset);
|
||||
}
|
||||
|
||||
protected override void SetDirty()
|
||||
{
|
||||
foreach (var m in materials)
|
||||
{
|
||||
ptex.RegisterMaterial (m);
|
||||
}
|
||||
ptex.SetData(this, 0, m_EffectFactor); // param1.x : location
|
||||
ptex.SetData(this, 1, m_Width); // param1.y : width
|
||||
ptex.SetData(this, 2, m_Softness); // param1.z : softness
|
||||
ptex.SetData(this, 3, m_Brightness);// param1.w : blightness
|
||||
ptex.SetData(this, 4, m_Gloss); // param2.x : gloss
|
||||
protected override void SetDirty()
|
||||
{
|
||||
foreach (var m in materials)
|
||||
{
|
||||
ptex.RegisterMaterial(m);
|
||||
}
|
||||
ptex.SetData(this, 0, m_EffectFactor); // param1.x : location
|
||||
ptex.SetData(this, 1, m_Width); // param1.y : width
|
||||
ptex.SetData(this, 2, m_Softness); // param1.z : softness
|
||||
ptex.SetData(this, 3, m_Brightness);// param1.w : blightness
|
||||
ptex.SetData(this, 4, m_Gloss); // param2.x : gloss
|
||||
|
||||
if (!Mathf.Approximately(_lastRotation, m_Rotation) && targetGraphic)
|
||||
{
|
||||
_lastRotation = m_Rotation;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
if (!Mathf.Approximately(_lastRotation, m_Rotation) && targetGraphic)
|
||||
{
|
||||
_lastRotation = m_Rotation;
|
||||
SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
float _lastRotation;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
float _lastRotation;
|
||||
|
||||
EffectPlayer _player{ get { return m_Player ?? (m_Player = new EffectPlayer()); } }
|
||||
}
|
||||
EffectPlayer _player { get { return m_Player ?? (m_Player = new EffectPlayer()); } }
|
||||
}
|
||||
}
|
||||
|
@ -1,356 +1,355 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
namespace Coffee.UIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Transition effect.
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/UIEffect/UITransitionEffect", 5)]
|
||||
public class UITransitionEffect : UIEffectBase
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-Effect-Transition";
|
||||
static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex");
|
||||
/// <summary>
|
||||
/// Transition effect.
|
||||
/// </summary>
|
||||
[AddComponentMenu("UI/UIEffect/UITransitionEffect", 5)]
|
||||
public class UITransitionEffect : UIEffectBase
|
||||
{
|
||||
//################################
|
||||
// Constant or Static Members.
|
||||
//################################
|
||||
public const string shaderName = "UI/Hidden/UI-Effect-Transition";
|
||||
static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex");
|
||||
|
||||
/// <summary>
|
||||
/// Effect mode.
|
||||
/// </summary>
|
||||
public enum EffectMode
|
||||
{
|
||||
Fade = 1,
|
||||
Cutoff = 2,
|
||||
Dissolve = 3,
|
||||
}
|
||||
/// <summary>
|
||||
/// Effect mode.
|
||||
/// </summary>
|
||||
public enum EffectMode
|
||||
{
|
||||
Fade = 1,
|
||||
Cutoff = 2,
|
||||
Dissolve = 3,
|
||||
}
|
||||
|
||||
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Effect mode.")]
|
||||
[SerializeField] EffectMode m_EffectMode = EffectMode.Cutoff;
|
||||
//################################
|
||||
// Serialize Members.
|
||||
//################################
|
||||
[Tooltip("Effect mode.")]
|
||||
[SerializeField] EffectMode m_EffectMode = EffectMode.Cutoff;
|
||||
|
||||
[Tooltip("Effect factor between 0(hidden) and 1(shown).")]
|
||||
[SerializeField][Range(0, 1)] float m_EffectFactor = 1;
|
||||
[Tooltip("Effect factor between 0(hidden) and 1(shown).")]
|
||||
[SerializeField][Range(0, 1)] float m_EffectFactor = 1;
|
||||
|
||||
[Tooltip("Transition texture (single channel texture).")]
|
||||
[SerializeField] Texture m_TransitionTexture;
|
||||
[Tooltip("Transition texture (single channel texture).")]
|
||||
[SerializeField] Texture m_TransitionTexture;
|
||||
|
||||
[Header("Advanced Option")]
|
||||
[Tooltip("The area for effect.")]
|
||||
[SerializeField] EffectArea m_EffectArea = EffectArea.RectTransform;
|
||||
[Header("Advanced Option")]
|
||||
[Tooltip("The area for effect.")]
|
||||
[SerializeField] EffectArea m_EffectArea = EffectArea.RectTransform;
|
||||
|
||||
[Tooltip("Keep effect aspect ratio.")]
|
||||
[SerializeField] bool m_KeepAspectRatio;
|
||||
[Tooltip("Keep effect aspect ratio.")]
|
||||
[SerializeField] bool m_KeepAspectRatio;
|
||||
|
||||
[Tooltip("Dissolve edge width.")]
|
||||
[SerializeField] [Range(0, 1)] float m_DissolveWidth = 0.5f;
|
||||
[Tooltip("Dissolve edge width.")]
|
||||
[SerializeField][Range(0, 1)] float m_DissolveWidth = 0.5f;
|
||||
|
||||
[Tooltip("Dissolve edge softness.")]
|
||||
[SerializeField] [Range(0, 1)] float m_DissolveSoftness = 0.5f;
|
||||
[Tooltip("Dissolve edge softness.")]
|
||||
[SerializeField][Range(0, 1)] float m_DissolveSoftness = 0.5f;
|
||||
|
||||
[Tooltip("Dissolve edge color.")]
|
||||
[SerializeField] [ColorUsage(false)] Color m_DissolveColor = new Color(0.0f, 0.25f, 1.0f);
|
||||
[Tooltip("Dissolve edge color.")]
|
||||
[SerializeField][ColorUsage(false)] Color m_DissolveColor = new Color(0.0f, 0.25f, 1.0f);
|
||||
|
||||
[Tooltip("Disable graphic's raycast target on hidden.")]
|
||||
[SerializeField] bool m_PassRayOnHidden;
|
||||
[Tooltip("Disable graphic's raycast target on hidden.")]
|
||||
[SerializeField] bool m_PassRayOnHidden;
|
||||
|
||||
[Header("Effect Player")]
|
||||
[SerializeField] EffectPlayer m_Player;
|
||||
[Header("Effect Player")]
|
||||
[SerializeField] EffectPlayer m_Player;
|
||||
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
//################################
|
||||
// Public Members.
|
||||
//################################
|
||||
|
||||
/// <summary>
|
||||
/// Effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
public float effectFactor
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_EffectFactor, value))
|
||||
{
|
||||
m_EffectFactor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Effect factor between 0(no effect) and 1(complete effect).
|
||||
/// </summary>
|
||||
public float effectFactor
|
||||
{
|
||||
get { return m_EffectFactor; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_EffectFactor, value))
|
||||
{
|
||||
m_EffectFactor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Transition texture.
|
||||
/// </summary>
|
||||
public Texture transitionTexture
|
||||
{
|
||||
get { return m_TransitionTexture; }
|
||||
set
|
||||
{
|
||||
if (m_TransitionTexture != value)
|
||||
{
|
||||
m_TransitionTexture = value;
|
||||
if (graphic)
|
||||
{
|
||||
ModifyMaterial();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Transition texture.
|
||||
/// </summary>
|
||||
public Texture transitionTexture
|
||||
{
|
||||
get { return m_TransitionTexture; }
|
||||
set
|
||||
{
|
||||
if (m_TransitionTexture != value)
|
||||
{
|
||||
m_TransitionTexture = value;
|
||||
if (graphic)
|
||||
{
|
||||
ModifyMaterial();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Effect mode.
|
||||
/// </summary>
|
||||
public EffectMode effectMode { get { return m_EffectMode; } }
|
||||
/// <summary>
|
||||
/// Effect mode.
|
||||
/// </summary>
|
||||
public EffectMode effectMode { get { return m_EffectMode; } }
|
||||
|
||||
/// <summary>
|
||||
/// Keep aspect ratio.
|
||||
/// </summary>
|
||||
public bool keepAspectRatio
|
||||
{
|
||||
get { return m_KeepAspectRatio; }
|
||||
set
|
||||
{
|
||||
if (m_KeepAspectRatio != value)
|
||||
{
|
||||
m_KeepAspectRatio = value;
|
||||
targetGraphic.SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Keep aspect ratio.
|
||||
/// </summary>
|
||||
public bool keepAspectRatio
|
||||
{
|
||||
get { return m_KeepAspectRatio; }
|
||||
set
|
||||
{
|
||||
if (m_KeepAspectRatio != value)
|
||||
{
|
||||
m_KeepAspectRatio = value;
|
||||
targetGraphic.SetVerticesDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public override ParameterTexture ptex { get { return _ptex; } }
|
||||
/// <summary>
|
||||
/// Gets the parameter texture.
|
||||
/// </summary>
|
||||
public override ParameterTexture ptex { get { return _ptex; } }
|
||||
|
||||
/// <summary>
|
||||
/// Dissolve edge width.
|
||||
/// </summary>
|
||||
public float dissolveWidth
|
||||
{
|
||||
get { return m_DissolveWidth; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_DissolveWidth, value))
|
||||
{
|
||||
m_DissolveWidth = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Dissolve edge width.
|
||||
/// </summary>
|
||||
public float dissolveWidth
|
||||
{
|
||||
get { return m_DissolveWidth; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_DissolveWidth, value))
|
||||
{
|
||||
m_DissolveWidth = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dissolve edge softness.
|
||||
/// </summary>
|
||||
public float dissolveSoftness
|
||||
{
|
||||
get { return m_DissolveSoftness; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_DissolveSoftness, value))
|
||||
{
|
||||
m_DissolveSoftness = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Dissolve edge softness.
|
||||
/// </summary>
|
||||
public float dissolveSoftness
|
||||
{
|
||||
get { return m_DissolveSoftness; }
|
||||
set
|
||||
{
|
||||
value = Mathf.Clamp(value, 0, 1);
|
||||
if (!Mathf.Approximately(m_DissolveSoftness, value))
|
||||
{
|
||||
m_DissolveSoftness = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dissolve edge color.
|
||||
/// </summary>
|
||||
public Color dissolveColor
|
||||
{
|
||||
get { return m_DissolveColor; }
|
||||
set
|
||||
{
|
||||
if (m_DissolveColor != value)
|
||||
{
|
||||
m_DissolveColor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Dissolve edge color.
|
||||
/// </summary>
|
||||
public Color dissolveColor
|
||||
{
|
||||
get { return m_DissolveColor; }
|
||||
set
|
||||
{
|
||||
if (m_DissolveColor != value)
|
||||
{
|
||||
m_DissolveColor = value;
|
||||
SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Duration for showing/hiding.
|
||||
/// </summary>
|
||||
public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } }
|
||||
/// <summary>
|
||||
/// Duration for showing/hiding.
|
||||
/// </summary>
|
||||
public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } }
|
||||
|
||||
/// <summary>
|
||||
/// Disable graphic's raycast target on hidden.
|
||||
/// </summary>
|
||||
public bool passRayOnHidden { get { return m_PassRayOnHidden; } set { m_PassRayOnHidden = value; } }
|
||||
/// <summary>
|
||||
/// Disable graphic's raycast target on hidden.
|
||||
/// </summary>
|
||||
public bool passRayOnHidden { get { return m_PassRayOnHidden; } set { m_PassRayOnHidden = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Update mode for showing/hiding.
|
||||
/// </summary>
|
||||
public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } }
|
||||
/// <summary>
|
||||
/// Update mode for showing/hiding.
|
||||
/// </summary>
|
||||
public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// Show transition.
|
||||
/// </summary>
|
||||
public void Show(bool reset = true)
|
||||
{
|
||||
_player.loop = false;
|
||||
_player.Play(reset, f => effectFactor = f);
|
||||
}
|
||||
/// <summary>
|
||||
/// Show transition.
|
||||
/// </summary>
|
||||
public void Show(bool reset = true)
|
||||
{
|
||||
_player.loop = false;
|
||||
_player.Play(reset, f => effectFactor = f);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Hide transition.
|
||||
/// </summary>
|
||||
public void Hide(bool reset = true)
|
||||
{
|
||||
_player.loop = false;
|
||||
_player.Play(reset, f => effectFactor = 1 - f);
|
||||
}
|
||||
/// <summary>
|
||||
/// Hide transition.
|
||||
/// </summary>
|
||||
public void Hide(bool reset = true)
|
||||
{
|
||||
_player.loop = false;
|
||||
_player.Play(reset, f => effectFactor = 1 - f);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Modifies the material.
|
||||
/// </summary>
|
||||
public override void ModifyMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return;
|
||||
}
|
||||
/// <summary>
|
||||
/// Modifies the material.
|
||||
/// </summary>
|
||||
public override void ModifyMaterial()
|
||||
{
|
||||
if (isTMPro)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ulong hash = (m_TransitionTexture ? (uint)m_TransitionTexture.GetInstanceID() : 0) + ((ulong)2 << 32) + ((ulong)m_EffectMode << 36);
|
||||
if (_materialCache != null && (_materialCache.hash != hash || !isActiveAndEnabled || !m_EffectMaterial))
|
||||
{
|
||||
MaterialCache.Unregister(_materialCache);
|
||||
_materialCache = null;
|
||||
}
|
||||
ulong hash = (m_TransitionTexture ? (uint)m_TransitionTexture.GetInstanceID() : 0) + ((ulong)2 << 32) + ((ulong)m_EffectMode << 36);
|
||||
if (_materialCache != null && (_materialCache.hash != hash || !isActiveAndEnabled || !m_EffectMaterial))
|
||||
{
|
||||
MaterialCache.Unregister(_materialCache);
|
||||
_materialCache = null;
|
||||
}
|
||||
|
||||
if (!isActiveAndEnabled || !m_EffectMaterial)
|
||||
{
|
||||
material = null;
|
||||
}
|
||||
else if (!m_TransitionTexture)
|
||||
{
|
||||
material = m_EffectMaterial;
|
||||
}
|
||||
else if (_materialCache != null && _materialCache.hash == hash)
|
||||
{
|
||||
material = _materialCache.material;
|
||||
}
|
||||
else
|
||||
{
|
||||
_materialCache = MaterialCache.Register(hash, m_TransitionTexture, () =>
|
||||
{
|
||||
var mat = new Material(m_EffectMaterial);
|
||||
mat.name += "_" + m_TransitionTexture.name;
|
||||
mat.SetTexture("_NoiseTex", m_TransitionTexture);
|
||||
return mat;
|
||||
});
|
||||
material = _materialCache.material;
|
||||
}
|
||||
}
|
||||
if (!isActiveAndEnabled || !m_EffectMaterial)
|
||||
{
|
||||
material = null;
|
||||
}
|
||||
else if (!m_TransitionTexture)
|
||||
{
|
||||
material = m_EffectMaterial;
|
||||
}
|
||||
else if (_materialCache != null && _materialCache.hash == hash)
|
||||
{
|
||||
material = _materialCache.material;
|
||||
}
|
||||
else
|
||||
{
|
||||
_materialCache = MaterialCache.Register(hash, m_TransitionTexture, () =>
|
||||
{
|
||||
var mat = new Material(m_EffectMaterial);
|
||||
mat.name += "_" + m_TransitionTexture.name;
|
||||
mat.SetTexture("_NoiseTex", m_TransitionTexture);
|
||||
return mat;
|
||||
});
|
||||
material = _materialCache.material;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
/// <summary>
|
||||
/// Modifies the mesh.
|
||||
/// </summary>
|
||||
public override void ModifyMesh(VertexHelper vh)
|
||||
{
|
||||
if (!isActiveAndEnabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bool isText = isTMPro || graphic is Text;
|
||||
float normalizedIndex = ptex.GetNormalizedIndex (this);
|
||||
bool isText = isTMPro || graphic is Text;
|
||||
float normalizedIndex = ptex.GetNormalizedIndex(this);
|
||||
|
||||
// rect.
|
||||
var tex = transitionTexture;
|
||||
var aspectRatio = m_KeepAspectRatio && tex ? ((float)tex.width) / tex.height : -1;
|
||||
Rect rect = m_EffectArea.GetEffectArea (vh, rectTransform.rect, aspectRatio);
|
||||
// rect.
|
||||
var tex = transitionTexture;
|
||||
var aspectRatio = m_KeepAspectRatio && tex ? ((float)tex.width) / tex.height : -1;
|
||||
Rect rect = m_EffectArea.GetEffectArea(vh, rectTransform.rect, aspectRatio);
|
||||
|
||||
// Set prameters to vertex.
|
||||
UIVertex vertex = default(UIVertex);
|
||||
float x, y;
|
||||
int count = vh.currentVertCount;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
m_EffectArea.GetPositionFactor (i, rect, vertex.position, isText, isTMPro, out x, out y);
|
||||
// Set prameters to vertex.
|
||||
UIVertex vertex = default(UIVertex);
|
||||
float x, y;
|
||||
int count = vh.currentVertCount;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vh.PopulateUIVertex(ref vertex, i);
|
||||
m_EffectArea.GetPositionFactor(i, rect, vertex.position, isText, isTMPro, out x, out y);
|
||||
|
||||
vertex.uv0 = new Vector2 (
|
||||
Packer.ToFloat (vertex.uv0.x, vertex.uv0.y),
|
||||
Packer.ToFloat (x, y, normalizedIndex)
|
||||
);
|
||||
vh.SetUIVertex(vertex, i);
|
||||
}
|
||||
}
|
||||
vertex.uv0 = new Vector2(
|
||||
Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
|
||||
Packer.ToFloat(x, y, normalizedIndex)
|
||||
);
|
||||
vh.SetUIVertex(vertex, i);
|
||||
}
|
||||
}
|
||||
|
||||
//################################
|
||||
// Protected Members.
|
||||
//################################
|
||||
//################################
|
||||
// Protected Members.
|
||||
//################################
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
_player.OnEnable(null);
|
||||
_player.loop = false;
|
||||
}
|
||||
/// <summary>
|
||||
/// This function is called when the object becomes enabled and active.
|
||||
/// </summary>
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
_player.OnEnable(null);
|
||||
_player.loop = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This function is called when the behaviour becomes disabled () or inactive.
|
||||
/// </summary>
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable ();
|
||||
MaterialCache.Unregister(_materialCache);
|
||||
_materialCache = null;
|
||||
_player.OnDisable();
|
||||
}
|
||||
/// <summary>
|
||||
/// This function is called when the behaviour becomes disabled () or inactive.
|
||||
/// </summary>
|
||||
protected override void OnDisable()
|
||||
{
|
||||
base.OnDisable();
|
||||
MaterialCache.Unregister(_materialCache);
|
||||
_materialCache = null;
|
||||
_player.OnDisable();
|
||||
}
|
||||
|
||||
protected override void SetDirty()
|
||||
{
|
||||
foreach (var m in materials)
|
||||
{
|
||||
ptex.RegisterMaterial (m);
|
||||
}
|
||||
ptex.SetData(this, 0, m_EffectFactor); // param1.x : effect factor
|
||||
if (m_EffectMode == EffectMode.Dissolve)
|
||||
{
|
||||
ptex.SetData(this, 1, m_DissolveWidth); // param1.y : width
|
||||
ptex.SetData(this, 2, m_DissolveSoftness); // param1.z : softness
|
||||
ptex.SetData(this, 4, m_DissolveColor.r); // param2.x : red
|
||||
ptex.SetData(this, 5, m_DissolveColor.g); // param2.y : green
|
||||
ptex.SetData(this, 6, m_DissolveColor.b); // param2.z : blue
|
||||
}
|
||||
protected override void SetDirty()
|
||||
{
|
||||
foreach (var m in materials)
|
||||
{
|
||||
ptex.RegisterMaterial(m);
|
||||
}
|
||||
ptex.SetData(this, 0, m_EffectFactor); // param1.x : effect factor
|
||||
if (m_EffectMode == EffectMode.Dissolve)
|
||||
{
|
||||
ptex.SetData(this, 1, m_DissolveWidth); // param1.y : width
|
||||
ptex.SetData(this, 2, m_DissolveSoftness); // param1.z : softness
|
||||
ptex.SetData(this, 4, m_DissolveColor.r); // param2.x : red
|
||||
ptex.SetData(this, 5, m_DissolveColor.g); // param2.y : green
|
||||
ptex.SetData(this, 6, m_DissolveColor.b); // param2.z : blue
|
||||
}
|
||||
|
||||
// Disable graphic's raycastTarget on hidden.
|
||||
if (m_PassRayOnHidden)
|
||||
{
|
||||
targetGraphic.raycastTarget = 0 < m_EffectFactor;
|
||||
}
|
||||
}
|
||||
// Disable graphic's raycastTarget on hidden.
|
||||
if (m_PassRayOnHidden)
|
||||
{
|
||||
targetGraphic.raycastTarget = 0 < m_EffectFactor;
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
/// <summary>
|
||||
/// Gets the material.
|
||||
/// </summary>
|
||||
/// <returns>The material.</returns>
|
||||
protected override Material GetMaterial()
|
||||
{
|
||||
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode);
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets the material.
|
||||
/// </summary>
|
||||
/// <returns>The material.</returns>
|
||||
protected override Material GetMaterial()
|
||||
{
|
||||
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode);
|
||||
}
|
||||
#endif
|
||||
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
MaterialCache _materialCache = null;
|
||||
//################################
|
||||
// Private Members.
|
||||
//################################
|
||||
MaterialCache _materialCache = null;
|
||||
|
||||
EffectPlayer _player{ get { return m_Player ?? (m_Player = new EffectPlayer()); } }
|
||||
}
|
||||
EffectPlayer _player { get { return m_Player ?? (m_Player = new EffectPlayer()); } }
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
// Created: 2018/07/13
|
||||
|
||||
#if true // MODULE_MARKER
|
||||
using System;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using UnityEngine;
|
||||
@ -11,7 +10,7 @@ using UnityEngine.Audio; // Required for AudioMixer
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModuleAudio
|
||||
public static class DOTweenModuleAudio
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
@ -50,11 +49,12 @@ namespace DG.Tweening
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<float, float, FloatOptions> DOSetFloat(this AudioMixer target, string floatName, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<float, float, FloatOptions> t = DOTween.To(()=> {
|
||||
float currVal;
|
||||
target.GetFloat(floatName, out currVal);
|
||||
return currVal;
|
||||
}, x=> target.SetFloat(floatName, x), endValue, duration);
|
||||
TweenerCore<float, float, FloatOptions> t = DOTween.To(() =>
|
||||
{
|
||||
float currVal;
|
||||
target.GetFloat(floatName, out currVal);
|
||||
return currVal;
|
||||
}, x => target.SetFloat(floatName, x), endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
@ -1,6 +1,4 @@
|
||||
using UnityEngine;
|
||||
|
||||
#if false || EPO_DOTWEEN // MODULE_MARKER
|
||||
#if false || EPO_DOTWEEN // MODULE_MARKER
|
||||
|
||||
using EPOOutline;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
|
@ -2,7 +2,6 @@
|
||||
// Created: 2018/07/13
|
||||
|
||||
#if true // MODULE_MARKER
|
||||
using System;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Core.Enums;
|
||||
using DG.Tweening.Plugins;
|
||||
@ -13,7 +12,7 @@ using UnityEngine;
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModulePhysics
|
||||
public static class DOTweenModulePhysics
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
@ -116,8 +115,10 @@ namespace DG.Tweening
|
||||
.SetOptions(AxisConstraint.Z, snapping).SetEase(Ease.Linear)
|
||||
).Join(yTween)
|
||||
.SetTarget(target).SetEase(DOTween.defaultEaseType);
|
||||
yTween.OnUpdate(() => {
|
||||
if (!offsetYSet) {
|
||||
yTween.OnUpdate(() =>
|
||||
{
|
||||
if (!offsetYSet)
|
||||
{
|
||||
offsetYSet = true;
|
||||
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY;
|
||||
}
|
||||
@ -211,6 +212,6 @@ namespace DG.Tweening
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -2,7 +2,6 @@
|
||||
// Created: 2018/07/13
|
||||
|
||||
#if true // MODULE_MARKER
|
||||
using System;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins;
|
||||
using DG.Tweening.Plugins.Core.PathCore;
|
||||
@ -12,7 +11,7 @@ using UnityEngine;
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModulePhysics2D
|
||||
public static class DOTweenModulePhysics2D
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
@ -87,8 +86,10 @@ namespace DG.Tweening
|
||||
.SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear)
|
||||
).Join(yTween)
|
||||
.SetTarget(target).SetEase(DOTween.defaultEaseType);
|
||||
yTween.OnUpdate(() => {
|
||||
if (!offsetYSet) {
|
||||
yTween.OnUpdate(() =>
|
||||
{
|
||||
if (!offsetYSet)
|
||||
{
|
||||
offsetYSet = true;
|
||||
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY;
|
||||
}
|
||||
@ -188,6 +189,6 @@ namespace DG.Tweening
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -2,15 +2,14 @@
|
||||
// Created: 2018/07/13
|
||||
|
||||
#if true // MODULE_MARKER
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using UnityEngine;
|
||||
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModuleSprite
|
||||
public static class DOTweenModuleSprite
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
@ -45,9 +44,11 @@ namespace DG.Tweening
|
||||
Sequence s = DOTween.Sequence();
|
||||
GradientColorKey[] colors = gradient.colorKeys;
|
||||
int len = colors.Length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
for (int i = 0; i < len; ++i)
|
||||
{
|
||||
GradientColorKey c = colors[i];
|
||||
if (i == 0 && c.time <= 0) {
|
||||
if (i == 0 && c.time <= 0)
|
||||
{
|
||||
target.color = c.color;
|
||||
continue;
|
||||
}
|
||||
@ -75,11 +76,12 @@ namespace DG.Tweening
|
||||
{
|
||||
endValue = endValue - target.color;
|
||||
Color to = new Color(0, 0, 0, 0);
|
||||
return DOTween.To(() => to, x => {
|
||||
Color diff = x - to;
|
||||
to = x;
|
||||
target.color += diff;
|
||||
}, endValue, duration)
|
||||
return DOTween.To(() => to, x =>
|
||||
{
|
||||
Color diff = x - to;
|
||||
to = x;
|
||||
target.color += diff;
|
||||
}, endValue, duration)
|
||||
.Blendable().SetTarget(target);
|
||||
}
|
||||
|
||||
@ -88,6 +90,6 @@ namespace DG.Tweening
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -3,21 +3,20 @@
|
||||
|
||||
#if true // MODULE_MARKER
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Core.Enums;
|
||||
using DG.Tweening.Plugins;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using System.Globalization;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using Outline = UnityEngine.UI.Outline;
|
||||
using Text = UnityEngine.UI.Text;
|
||||
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModuleUI
|
||||
public static class DOTweenModuleUI
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
@ -102,9 +101,11 @@ namespace DG.Tweening
|
||||
Sequence s = DOTween.Sequence();
|
||||
GradientColorKey[] colors = gradient.colorKeys;
|
||||
int len = colors.Length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
for (int i = 0; i < len; ++i)
|
||||
{
|
||||
GradientColorKey c = colors[i];
|
||||
if (i == 0 && c.time <= 0) {
|
||||
if (i == 0 && c.time <= 0)
|
||||
{
|
||||
target.color = c.color;
|
||||
continue;
|
||||
}
|
||||
@ -127,10 +128,11 @@ namespace DG.Tweening
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOFlexibleSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.flexibleWidth, target.flexibleHeight), x => {
|
||||
target.flexibleWidth = x.x;
|
||||
target.flexibleHeight = x.y;
|
||||
}, endValue, duration);
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.flexibleWidth, target.flexibleHeight), x =>
|
||||
{
|
||||
target.flexibleWidth = x.x;
|
||||
target.flexibleHeight = x.y;
|
||||
}, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
@ -141,7 +143,8 @@ namespace DG.Tweening
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOMinSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.minWidth, target.minHeight), x => {
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.minWidth, target.minHeight), x =>
|
||||
{
|
||||
target.minWidth = x.x;
|
||||
target.minHeight = x.y;
|
||||
}, endValue, duration);
|
||||
@ -155,7 +158,8 @@ namespace DG.Tweening
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOPreferredSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.preferredWidth, target.preferredHeight), x => {
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.preferredWidth, target.preferredHeight), x =>
|
||||
{
|
||||
target.preferredWidth = x.x;
|
||||
target.preferredHeight = x.y;
|
||||
}, endValue, duration);
|
||||
@ -404,13 +408,15 @@ namespace DG.Tweening
|
||||
Tween yTween = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, jumpPower), duration / (numJumps * 2))
|
||||
.SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative()
|
||||
.SetLoops(numJumps * 2, LoopType.Yoyo)
|
||||
.OnStart(()=> startPosY = target.anchoredPosition.y);
|
||||
.OnStart(() => startPosY = target.anchoredPosition.y);
|
||||
s.Append(DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue.x, 0), duration)
|
||||
.SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear)
|
||||
).Join(yTween)
|
||||
.SetTarget(target).SetEase(DOTween.defaultEaseType);
|
||||
s.OnUpdate(() => {
|
||||
if (!offsetYSet) {
|
||||
s.OnUpdate(() =>
|
||||
{
|
||||
if (!offsetYSet)
|
||||
{
|
||||
offsetYSet = true;
|
||||
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY;
|
||||
}
|
||||
@ -434,7 +440,8 @@ namespace DG.Tweening
|
||||
public static Tweener DONormalizedPos(this ScrollRect target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
return DOTween.To(() => new Vector2(target.horizontalNormalizedPosition, target.verticalNormalizedPosition),
|
||||
x => {
|
||||
x =>
|
||||
{
|
||||
target.horizontalNormalizedPosition = x.x;
|
||||
target.verticalNormalizedPosition = x.y;
|
||||
}, endValue, duration)
|
||||
@ -498,10 +505,12 @@ namespace DG.Tweening
|
||||
/// <param name="culture">The <see cref="CultureInfo"/> to use (InvariantCulture if NULL)</param>
|
||||
public static TweenerCore<int, int, NoOptions> DOCounter(
|
||||
this Text target, int fromValue, int endValue, float duration, bool addThousandsSeparator = true, CultureInfo culture = null
|
||||
){
|
||||
)
|
||||
{
|
||||
int v = fromValue;
|
||||
CultureInfo cInfo = !addThousandsSeparator ? null : culture ?? CultureInfo.InvariantCulture;
|
||||
TweenerCore<int, int, NoOptions> t = DOTween.To(() => v, x => {
|
||||
TweenerCore<int, int, NoOptions> t = DOTween.To(() => v, x =>
|
||||
{
|
||||
v = x;
|
||||
target.text = addThousandsSeparator
|
||||
? v.ToString("N0", cInfo)
|
||||
@ -532,7 +541,8 @@ namespace DG.Tweening
|
||||
/// Leave it to NULL (default) to use default ones</param>
|
||||
public static TweenerCore<string, string, StringOptions> DOText(this Text target, string endValue, float duration, bool richTextEnabled = true, ScrambleMode scrambleMode = ScrambleMode.None, string scrambleChars = null)
|
||||
{
|
||||
if (endValue == null) {
|
||||
if (endValue == null)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogWarning("You can't pass a NULL string to DOText: an empty string will be used instead to avoid errors");
|
||||
endValue = "";
|
||||
}
|
||||
@ -557,7 +567,8 @@ namespace DG.Tweening
|
||||
{
|
||||
endValue = endValue - target.color;
|
||||
Color to = new Color(0, 0, 0, 0);
|
||||
return DOTween.To(() => to, x => {
|
||||
return DOTween.To(() => to, x =>
|
||||
{
|
||||
Color diff = x - to;
|
||||
to = x;
|
||||
target.color += diff;
|
||||
@ -578,7 +589,8 @@ namespace DG.Tweening
|
||||
{
|
||||
endValue = endValue - target.color;
|
||||
Color to = new Color(0, 0, 0, 0);
|
||||
return DOTween.To(() => to, x => {
|
||||
return DOTween.To(() => to, x =>
|
||||
{
|
||||
Color diff = x - to;
|
||||
to = x;
|
||||
target.color += diff;
|
||||
@ -599,7 +611,8 @@ namespace DG.Tweening
|
||||
{
|
||||
endValue = endValue - target.color;
|
||||
Color to = new Color(0, 0, 0, 0);
|
||||
return DOTween.To(() => to, x => {
|
||||
return DOTween.To(() => to, x =>
|
||||
{
|
||||
Color diff = x - to;
|
||||
to = x;
|
||||
target.color += diff;
|
||||
@ -657,6 +670,6 @@ namespace DG.Tweening
|
||||
return to.anchoredPosition + localPoint - pivotDerivedOffset;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -1,10 +1,9 @@
|
||||
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
// Created: 2018/07/13
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using UnityEngine;
|
||||
//#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0)
|
||||
//using Task = System.Threading.Tasks.Task;
|
||||
//#endif
|
||||
@ -29,9 +28,11 @@ namespace DG.Tweening
|
||||
Sequence s = DOTween.Sequence();
|
||||
GradientColorKey[] colors = gradient.colorKeys;
|
||||
int len = colors.Length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
for (int i = 0; i < len; ++i)
|
||||
{
|
||||
GradientColorKey c = colors[i];
|
||||
if (i == 0 && c.time <= 0) {
|
||||
if (i == 0 && c.time <= 0)
|
||||
{
|
||||
target.color = c.color;
|
||||
continue;
|
||||
}
|
||||
@ -54,9 +55,11 @@ namespace DG.Tweening
|
||||
Sequence s = DOTween.Sequence();
|
||||
GradientColorKey[] colors = gradient.colorKeys;
|
||||
int len = colors.Length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
for (int i = 0; i < len; ++i)
|
||||
{
|
||||
GradientColorKey c = colors[i];
|
||||
if (i == 0 && c.time <= 0) {
|
||||
if (i == 0 && c.time <= 0)
|
||||
{
|
||||
target.SetColor(property, c.color);
|
||||
continue;
|
||||
}
|
||||
@ -80,7 +83,8 @@ namespace DG.Tweening
|
||||
/// </summary>
|
||||
public static CustomYieldInstruction WaitForCompletion(this Tween t, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
@ -94,7 +98,8 @@ namespace DG.Tweening
|
||||
/// </summary>
|
||||
public static CustomYieldInstruction WaitForRewind(this Tween t, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
@ -108,7 +113,8 @@ namespace DG.Tweening
|
||||
/// </summary>
|
||||
public static CustomYieldInstruction WaitForKill(this Tween t, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
@ -123,7 +129,8 @@ namespace DG.Tweening
|
||||
/// <param name="elapsedLoops">Elapsed loops to wait for</param>
|
||||
public static CustomYieldInstruction WaitForElapsedLoops(this Tween t, int elapsedLoops, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
@ -139,7 +146,8 @@ namespace DG.Tweening
|
||||
/// <param name="position">Position (loops included, delays excluded) to wait for</param>
|
||||
public static CustomYieldInstruction WaitForPosition(this Tween t, float position, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
@ -154,7 +162,8 @@ namespace DG.Tweening
|
||||
/// </summary>
|
||||
public static CustomYieldInstruction WaitForStart(this Tween t, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
@ -175,7 +184,8 @@ namespace DG.Tweening
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOOffset(this Material target, Vector2 endValue, int propertyID, float duration)
|
||||
{
|
||||
if (!target.HasProperty(propertyID)) {
|
||||
if (!target.HasProperty(propertyID))
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID);
|
||||
return null;
|
||||
}
|
||||
@ -191,7 +201,8 @@ namespace DG.Tweening
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOTiling(this Material target, Vector2 endValue, int propertyID, float duration)
|
||||
{
|
||||
if (!target.HasProperty(propertyID)) {
|
||||
if (!target.HasProperty(propertyID))
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID);
|
||||
return null;
|
||||
}
|
||||
@ -215,7 +226,8 @@ namespace DG.Tweening
|
||||
/// </summary>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForCompletion(this Tween t)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
@ -229,7 +241,8 @@ namespace DG.Tweening
|
||||
/// </summary>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForRewind(this Tween t)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
@ -243,7 +256,8 @@ namespace DG.Tweening
|
||||
/// </summary>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForKill(this Tween t)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
@ -258,7 +272,8 @@ namespace DG.Tweening
|
||||
/// <param name="elapsedLoops">Elapsed loops to wait for</param>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForElapsedLoops(this Tween t, int elapsedLoops)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
@ -274,7 +289,8 @@ namespace DG.Tweening
|
||||
/// <param name="position">Position (loops included, delays excluded) to wait for</param>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForPosition(this Tween t, float position)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
@ -288,7 +304,8 @@ namespace DG.Tweening
|
||||
/// </summary>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForStart(this Tween t)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (!t.active)
|
||||
{
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
@ -312,9 +329,13 @@ namespace DG.Tweening
|
||||
{
|
||||
public class WaitForCompletion : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active && !t.IsComplete();
|
||||
}}
|
||||
public override bool keepWaiting
|
||||
{
|
||||
get
|
||||
{
|
||||
return t.active && !t.IsComplete();
|
||||
}
|
||||
}
|
||||
readonly Tween t;
|
||||
public WaitForCompletion(Tween tween)
|
||||
{
|
||||
@ -324,9 +345,13 @@ namespace DG.Tweening
|
||||
|
||||
public class WaitForRewind : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0);
|
||||
}}
|
||||
public override bool keepWaiting
|
||||
{
|
||||
get
|
||||
{
|
||||
return t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0);
|
||||
}
|
||||
}
|
||||
readonly Tween t;
|
||||
public WaitForRewind(Tween tween)
|
||||
{
|
||||
@ -336,9 +361,13 @@ namespace DG.Tweening
|
||||
|
||||
public class WaitForKill : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active;
|
||||
}}
|
||||
public override bool keepWaiting
|
||||
{
|
||||
get
|
||||
{
|
||||
return t.active;
|
||||
}
|
||||
}
|
||||
readonly Tween t;
|
||||
public WaitForKill(Tween tween)
|
||||
{
|
||||
@ -348,9 +377,13 @@ namespace DG.Tweening
|
||||
|
||||
public class WaitForElapsedLoops : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active && t.CompletedLoops() < elapsedLoops;
|
||||
}}
|
||||
public override bool keepWaiting
|
||||
{
|
||||
get
|
||||
{
|
||||
return t.active && t.CompletedLoops() < elapsedLoops;
|
||||
}
|
||||
}
|
||||
readonly Tween t;
|
||||
readonly int elapsedLoops;
|
||||
public WaitForElapsedLoops(Tween tween, int elapsedLoops)
|
||||
@ -362,9 +395,13 @@ namespace DG.Tweening
|
||||
|
||||
public class WaitForPosition : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active && t.position * (t.CompletedLoops() + 1) < position;
|
||||
}}
|
||||
public override bool keepWaiting
|
||||
{
|
||||
get
|
||||
{
|
||||
return t.active && t.position * (t.CompletedLoops() + 1) < position;
|
||||
}
|
||||
}
|
||||
readonly Tween t;
|
||||
readonly float position;
|
||||
public WaitForPosition(Tween tween, float position)
|
||||
@ -376,9 +413,13 @@ namespace DG.Tweening
|
||||
|
||||
public class WaitForStart : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active && !t.playedOnce;
|
||||
}}
|
||||
public override bool keepWaiting
|
||||
{
|
||||
get
|
||||
{
|
||||
return t.active && !t.playedOnce;
|
||||
}
|
||||
}
|
||||
readonly Tween t;
|
||||
public WaitForStart(Tween tween)
|
||||
{
|
||||
|
@ -1,12 +1,12 @@
|
||||
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
// Created: 2018/07/13
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using UnityEngine;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins.Core.PathCore;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using UnityEngine;
|
||||
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
@ -69,7 +69,7 @@ namespace DG.Tweening
|
||||
// Fires OnApplicationPause in DOTweenComponent even when Editor is paused (otherwise it's only fired at runtime)
|
||||
#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1
|
||||
static void PlaymodeStateChanged()
|
||||
#else
|
||||
#else
|
||||
static void PlaymodeStateChanged(UnityEditor.PlayModeStateChange state)
|
||||
#endif
|
||||
{
|
||||
@ -128,13 +128,16 @@ namespace DG.Tweening
|
||||
#endif
|
||||
public static TweenerCore<Vector3, Path, PathOptions> CreateDOTweenPathTween(
|
||||
MonoBehaviour target, bool tweenRigidbody, bool isLocal, Path path, float duration, PathMode pathMode
|
||||
){
|
||||
)
|
||||
{
|
||||
TweenerCore<Vector3, Path, PathOptions> t = null;
|
||||
bool rBodyFoundAndTweened = false;
|
||||
#if true // PHYSICS_MARKER
|
||||
if (tweenRigidbody) {
|
||||
if (tweenRigidbody)
|
||||
{
|
||||
Rigidbody rBody = target.GetComponent<Rigidbody>();
|
||||
if (rBody != null) {
|
||||
if (rBody != null)
|
||||
{
|
||||
rBodyFoundAndTweened = true;
|
||||
t = isLocal
|
||||
? rBody.DOLocalPath(path, duration, pathMode)
|
||||
@ -143,9 +146,11 @@ namespace DG.Tweening
|
||||
}
|
||||
#endif
|
||||
#if true // PHYSICS2D_MARKER
|
||||
if (!rBodyFoundAndTweened && tweenRigidbody) {
|
||||
if (!rBodyFoundAndTweened && tweenRigidbody)
|
||||
{
|
||||
Rigidbody2D rBody2D = target.GetComponent<Rigidbody2D>();
|
||||
if (rBody2D != null) {
|
||||
if (rBody2D != null)
|
||||
{
|
||||
rBodyFoundAndTweened = true;
|
||||
t = isLocal
|
||||
? rBody2D.DOLocalPath(path, duration, pathMode)
|
||||
@ -153,7 +158,8 @@ namespace DG.Tweening
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (!rBodyFoundAndTweened) {
|
||||
if (!rBodyFoundAndTweened)
|
||||
{
|
||||
t = isLocal
|
||||
? target.transform.DOLocalPath(path, duration, pathMode)
|
||||
: target.transform.DOPath(path, duration, pathMode);
|
||||
|
104
AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/Disable.anim
Normal file
104
AxibugEmuOnline.Client/Assets/Resources/UIPrefabs/Disable.anim
Normal file
@ -0,0 +1,104 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!74 &7400000
|
||||
AnimationClip:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Disable
|
||||
serializedVersion: 7
|
||||
m_Legacy: 0
|
||||
m_Compressed: 0
|
||||
m_UseHighQualityCurve: 1
|
||||
m_RotationCurves: []
|
||||
m_CompressedRotationCurves: []
|
||||
m_EulerCurves: []
|
||||
m_PositionCurves: []
|
||||
m_ScaleCurves: []
|
||||
m_FloatCurves:
|
||||
- serializedVersion: 2
|
||||
curve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 1
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 136
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
attribute: m_Alpha
|
||||
path:
|
||||
classID: 225
|
||||
script: {fileID: 0}
|
||||
flags: 0
|
||||
m_PPtrCurves: []
|
||||
m_SampleRate: 60
|
||||
m_WrapMode: 0
|
||||
m_Bounds:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_ClipBindingConstant:
|
||||
genericBindings:
|
||||
- serializedVersion: 2
|
||||
path: 0
|
||||
attribute: 1574349066
|
||||
script: {fileID: 0}
|
||||
typeID: 225
|
||||
customType: 0
|
||||
isPPtrCurve: 0
|
||||
isIntCurve: 0
|
||||
isSerializeReferenceCurve: 0
|
||||
pptrCurveMapping: []
|
||||
m_AnimationClipSettings:
|
||||
serializedVersion: 2
|
||||
m_AdditiveReferencePoseClip: {fileID: 0}
|
||||
m_AdditiveReferencePoseTime: 0
|
||||
m_StartTime: 0
|
||||
m_StopTime: 0
|
||||
m_OrientationOffsetY: 0
|
||||
m_Level: 0
|
||||
m_CycleOffset: 0
|
||||
m_HasAdditiveReferencePose: 0
|
||||
m_LoopTime: 1
|
||||
m_LoopBlend: 0
|
||||
m_LoopBlendOrientation: 0
|
||||
m_LoopBlendPositionY: 0
|
||||
m_LoopBlendPositionXZ: 0
|
||||
m_KeepOriginalOrientation: 0
|
||||
m_KeepOriginalPositionY: 1
|
||||
m_KeepOriginalPositionXZ: 0
|
||||
m_HeightFromFeet: 0
|
||||
m_Mirror: 0
|
||||
m_EditorCurves:
|
||||
- serializedVersion: 2
|
||||
curve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 1
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 136
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
attribute: m_Alpha
|
||||
path:
|
||||
classID: 225
|
||||
script: {fileID: 0}
|
||||
flags: 0
|
||||
m_EulerEditorCurves: []
|
||||
m_HasGenericRootTransform: 0
|
||||
m_HasMotionFloatCurves: 0
|
||||
m_Events: []
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 25f1c28c99920124189b7173731c38b5
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -528,6 +528,7 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 5f9054446a969bf4eaf7998f3ba23334, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
animator: {fileID: 8744505332349586225}
|
||||
--- !u!1 &2500436782395572584
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@ -649,7 +650,7 @@ RectTransform:
|
||||
m_AnchorMin: {x: 1, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 300, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0, y: 0.5}
|
||||
--- !u!114 &4478785627166277611
|
||||
MonoBehaviour:
|
||||
|
@ -1,5 +1,57 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1101 &-6499513247890378152
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: active
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: -2169522966389634846}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0.1
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.875
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1102 &-2169522966389634846
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Disable
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions:
|
||||
- {fileID: 8949275168816232509}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 7400000, guid: 25f1c28c99920124189b7173731c38b5, type: 2}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!91 &9100000
|
||||
AnimatorController:
|
||||
m_ObjectHideFlags: 0
|
||||
@ -8,7 +60,19 @@ AnimatorController:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: SelectBorder
|
||||
serializedVersion: 5
|
||||
m_AnimatorParameters: []
|
||||
m_AnimatorParameters:
|
||||
- m_Name: active
|
||||
m_Type: 4
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
- m_Name: reactive
|
||||
m_Type: 9
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
m_AnimatorLayers:
|
||||
- serializedVersion: 5
|
||||
m_Name: Base Layer
|
||||
@ -33,7 +97,10 @@ AnimatorStateMachine:
|
||||
m_ChildStates:
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: 5956899137579874003}
|
||||
m_Position: {x: 340, y: 100, z: 0}
|
||||
m_Position: {x: 380, y: 70, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -2169522966389634846}
|
||||
m_Position: {x: 350, y: 200, z: 0}
|
||||
m_ChildStateMachines: []
|
||||
m_AnyStateTransitions: []
|
||||
m_EntryTransitions: []
|
||||
@ -44,6 +111,31 @@ AnimatorStateMachine:
|
||||
m_ExitPosition: {x: 800, y: 120, z: 0}
|
||||
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
|
||||
m_DefaultState: {fileID: 5956899137579874003}
|
||||
--- !u!1101 &1182501105974621518
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 1
|
||||
m_ConditionEvent: reactive
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 5956899137579874003}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.875
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1102 &5956899137579874003
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
@ -51,10 +143,12 @@ AnimatorState:
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: DEFAULT
|
||||
m_Name: Enable
|
||||
m_Speed: 1.6
|
||||
m_CycleOffset: 0
|
||||
m_Transitions: []
|
||||
m_Transitions:
|
||||
- {fileID: -6499513247890378152}
|
||||
- {fileID: 1182501105974621518}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
@ -70,3 +164,28 @@ AnimatorState:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1101 &8949275168816232509
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 1
|
||||
m_ConditionEvent: active
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 5956899137579874003}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0.1
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.75
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
|
@ -1,27 +1,27 @@
|
||||
using AxibugEmuOnline.Client.Manager;
|
||||
using AxibugEmuOnline.Client.Network;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
using static AxibugEmuOnline.Client.HttpAPI;
|
||||
using static AxibugEmuOnline.Client.Manager.LogManager;
|
||||
|
||||
namespace AxibugEmuOnline.Client.ClientCore
|
||||
{
|
||||
public static class App
|
||||
{
|
||||
public static string TokenStr;
|
||||
public static string IP;
|
||||
public static int Port;
|
||||
public static LogManager log;
|
||||
public static NetworkHelper network;
|
||||
public static AppLogin login;
|
||||
public static AppChat chat;
|
||||
public static UserDataManager user;
|
||||
//public static AppNetGame netgame;
|
||||
public static AppEmu emu;
|
||||
using AxibugEmuOnline.Client.Manager;
|
||||
using AxibugEmuOnline.Client.Network;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
using static AxibugEmuOnline.Client.HttpAPI;
|
||||
using static AxibugEmuOnline.Client.Manager.LogManager;
|
||||
|
||||
namespace AxibugEmuOnline.Client.ClientCore
|
||||
{
|
||||
public static class App
|
||||
{
|
||||
public static string TokenStr;
|
||||
public static string IP;
|
||||
public static int Port;
|
||||
public static LogManager log;
|
||||
public static NetworkHelper network;
|
||||
public static AppLogin login;
|
||||
public static AppChat chat;
|
||||
public static UserDataManager user;
|
||||
//public static AppNetGame netgame;
|
||||
public static AppEmu emu;
|
||||
public static RomLib nesRomLib;
|
||||
public static HttpAPI httpAPI;
|
||||
public static CacheManager CacheMgr;
|
||||
@ -39,50 +39,50 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
#else
|
||||
public static string PersistentDataPath => Application.persistentDataPath;
|
||||
#endif
|
||||
public static void Init(Initer initer)
|
||||
{
|
||||
settings = new AppSettings();
|
||||
|
||||
log = new LogManager();
|
||||
LogManager.OnLog += OnNoSugarNetLog;
|
||||
network = new NetworkHelper();
|
||||
login = new AppLogin();
|
||||
chat = new AppChat();
|
||||
user = new UserDataManager();
|
||||
emu = new AppEmu();
|
||||
//netgame = new AppNetGame();
|
||||
httpAPI = new HttpAPI();
|
||||
nesRomLib = new RomLib(EnumPlatform.NES);
|
||||
CacheMgr = new CacheManager();
|
||||
public static void Init(Initer initer)
|
||||
{
|
||||
settings = new AppSettings();
|
||||
|
||||
log = new LogManager();
|
||||
LogManager.OnLog += OnNoSugarNetLog;
|
||||
network = new NetworkHelper();
|
||||
login = new AppLogin();
|
||||
chat = new AppChat();
|
||||
user = new UserDataManager();
|
||||
emu = new AppEmu();
|
||||
//netgame = new AppNetGame();
|
||||
httpAPI = new HttpAPI();
|
||||
nesRomLib = new RomLib(EnumPlatform.NES);
|
||||
CacheMgr = new CacheManager();
|
||||
roomMgr = new AppRoom();
|
||||
share = new AppShare();
|
||||
filter = new FilterManager(initer.m_filterVolume, initer.m_filterPreview, initer.m_xmbBg);
|
||||
var go = new GameObject("[AppAxibugEmuOnline]");
|
||||
GameObject.DontDestroyOnLoad(go);
|
||||
tickLoop = go.AddComponent<TickLoop>();
|
||||
coRunner = go.AddComponent<CoroutineRunner>();
|
||||
|
||||
var go = new GameObject("[AppAxibugEmuOnline]");
|
||||
GameObject.DontDestroyOnLoad(go);
|
||||
tickLoop = go.AddComponent<TickLoop>();
|
||||
coRunner = go.AddComponent<CoroutineRunner>();
|
||||
|
||||
if (UnityEngine.Application.platform == RuntimePlatform.PSP2)
|
||||
{
|
||||
//PSV 等平台需要手动创建目录
|
||||
PersistentDataPathDir();
|
||||
{
|
||||
//PSV 等平台需要手动创建目录
|
||||
PersistentDataPathDir();
|
||||
}
|
||||
|
||||
var importNode = GameObject.Find("IMPORTENT");
|
||||
if (importNode != null) GameObject.DontDestroyOnLoad(importNode);
|
||||
|
||||
StartCoroutine(AppTickFlow());
|
||||
RePullNetInfo();
|
||||
}
|
||||
|
||||
var importNode = GameObject.Find("IMPORTENT");
|
||||
if (importNode != null) GameObject.DontDestroyOnLoad(importNode);
|
||||
|
||||
StartCoroutine(AppTickFlow());
|
||||
RePullNetInfo();
|
||||
}
|
||||
|
||||
private static void PersistentDataPathDir()
|
||||
{
|
||||
{
|
||||
if (!Directory.Exists(PersistentDataPath))
|
||||
{
|
||||
Directory.CreateDirectory(PersistentDataPath);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
Directory.CreateDirectory(PersistentDataPath);
|
||||
}
|
||||
}
|
||||
|
||||
private static IEnumerator AppTickFlow()
|
||||
{
|
||||
while (true)
|
||||
@ -93,7 +93,7 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
}
|
||||
|
||||
public static void RePullNetInfo()
|
||||
{
|
||||
{
|
||||
StartCoroutine(StartNetInit());
|
||||
}
|
||||
|
||||
@ -103,12 +103,12 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
yield break;
|
||||
|
||||
int platform = 0;
|
||||
bool bTest = false;
|
||||
if (bTest)
|
||||
{
|
||||
yield return null;
|
||||
Connect("192.168.0.47", 10492);
|
||||
yield break;
|
||||
bool bTest = false;
|
||||
if (bTest)
|
||||
{
|
||||
yield return null;
|
||||
Connect("192.168.0.47", 10492);
|
||||
yield break;
|
||||
}
|
||||
|
||||
UnityWebRequest request = UnityWebRequest.Get($"{App.httpAPI.WebSiteApi}/CheckStandInfo?platform={platform}&version={Application.version}");
|
||||
@ -138,43 +138,43 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
public static Coroutine StartCoroutine(IEnumerator itor)
|
||||
{
|
||||
return coRunner.StartCoroutine(itor);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void StopCoroutine(Coroutine cor)
|
||||
{
|
||||
coRunner.StopCoroutine(cor);
|
||||
}
|
||||
|
||||
public static void Connect(string IP, int port)
|
||||
{
|
||||
}
|
||||
|
||||
public static void Connect(string IP, int port)
|
||||
{
|
||||
Task task = new Task(() =>
|
||||
{
|
||||
network.Init(IP, port);
|
||||
});
|
||||
task.Start();
|
||||
}
|
||||
|
||||
public static void Close()
|
||||
{
|
||||
App.log.Info("停止");
|
||||
}
|
||||
static void OnNoSugarNetLog(int LogLevel, string msg)
|
||||
});
|
||||
task.Start();
|
||||
}
|
||||
|
||||
public static void Close()
|
||||
{
|
||||
E_LogType logType = (E_LogType)LogLevel;
|
||||
App.log.Info("停止");
|
||||
}
|
||||
static void OnNoSugarNetLog(int LogLevel, string msg)
|
||||
{
|
||||
E_LogType logType = (E_LogType)LogLevel;
|
||||
switch (logType)
|
||||
{
|
||||
{
|
||||
case E_LogType.Debug:
|
||||
case E_LogType.Info:
|
||||
Debug.Log("[AxiEmu]:" + msg);
|
||||
Debug.Log("[AxiEmu]:" + msg);
|
||||
break;
|
||||
case E_LogType.Warning:
|
||||
Debug.LogWarning("[AxiEmu]:" + msg);
|
||||
Debug.LogWarning("[AxiEmu]:" + msg);
|
||||
break;
|
||||
case E_LogType.Error:
|
||||
Debug.LogError("[AxiEmu]:" + msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Debug.LogError("[AxiEmu]:" + msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,7 +1,3 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public static class EventInvoker
|
||||
|
@ -1,6 +1,4 @@
|
||||
using AxibugEmuOnline.Client;
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering.PostProcessing;
|
||||
|
||||
|
@ -6,7 +6,7 @@ using UnityEngine.Rendering.PostProcessing;
|
||||
[PostProcess(typeof(MattiasCRTRenderer), PostProcessEvent.BeforeStack, "Filter/MattiasCRT")]
|
||||
public sealed class MattiasCRT : FilterEffect
|
||||
{
|
||||
public override string Name => nameof(MattiasCRT);
|
||||
public override string Name => nameof(MattiasCRT);
|
||||
}
|
||||
|
||||
public sealed class MattiasCRTRenderer : PostProcessEffectRenderer<MattiasCRT>
|
||||
|
@ -1,7 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public abstract class CommandChanger : IKeyMapperChanger
|
||||
{
|
||||
|
@ -3,7 +3,6 @@ using AxibugEmuOnline.Client.Common;
|
||||
using AxibugEmuOnline.Client.Event;
|
||||
using AxibugEmuOnline.Client.Network;
|
||||
using AxibugProtobuf;
|
||||
using System;
|
||||
|
||||
namespace AxibugEmuOnline.Client.Manager
|
||||
{
|
||||
|
@ -1,9 +1,9 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using AxibugEmuOnline.Client.Event;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client.Manager
|
||||
{
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using AxibugEmuOnline.Client.Event;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client.Manager
|
||||
{
|
||||
public class AppEmu
|
||||
{
|
||||
/// <summary>
|
||||
@ -58,8 +58,8 @@ namespace AxibugEmuOnline.Client.Manager
|
||||
InGameUI.Instance.Show(romFile, m_emuCore);
|
||||
|
||||
m_emuCore.SetupScheme();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void StopGame()
|
||||
{
|
||||
if (m_emuCore.IsNull()) return;
|
||||
@ -76,5 +76,5 @@ namespace AxibugEmuOnline.Client.Manager
|
||||
|
||||
m_emuCore.DoReset();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ namespace AxibugEmuOnline.Client.Manager
|
||||
long TestFrameID = 0;
|
||||
void TestEmuUpdate()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
using DG.Tweening;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
@ -5,8 +5,6 @@ using AxibugEmuOnline.Client.Network;
|
||||
using AxibugProtobuf;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine.EventSystems;
|
||||
using static AxibugEmuOnline.Client.ClientCore.RomDB;
|
||||
|
||||
namespace AxibugEmuOnline.Client.Manager
|
||||
{
|
||||
|
@ -1,6 +1,4 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
using UnityEngine;
|
||||
using VirtualNes.Core;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
|
@ -1,11 +1,8 @@
|
||||
using AxibugEmuOnline.Client.Common;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using VirtualNes.Core;
|
||||
using static UnityEngine.UI.CanvasScaler;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
|
@ -4,7 +4,6 @@ using HaoYueNet.ClientNetworkNet.Standard2;
|
||||
using System;
|
||||
using System.Net.Sockets;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AxibugEmuOnline.Client.Network
|
||||
{
|
||||
|
@ -1,8 +1,6 @@
|
||||
using DG.Tweening;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
|
@ -18,7 +18,7 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
App.filter.ShutDownFilterPreview();
|
||||
App.filter.ShutDownFilter();
|
||||
|
||||
|
||||
return base.OnExitItem();
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,5 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
|
@ -1,6 +1,4 @@
|
||||
using AxibugEmuOnline.Client.UI;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
|
@ -38,7 +38,7 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
m_stepPerformer = new StepPerformer(this);
|
||||
|
||||
//menus.Add(new InGameUI_FilterSetting(this));
|
||||
menus.Add(new InGameUI_FilterSetting(this));
|
||||
menus.Add(new InGameUI_Reset(this));
|
||||
menus.Add(new InGameUI_SaveState(this));
|
||||
menus.Add(new InGameUI_LoadState(this));
|
||||
|
@ -1,7 +1,6 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using static AxibugEmuOnline.Client.FilterManager;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
|
@ -1,8 +1,4 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
|
@ -1,8 +1,5 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
|
@ -1,4 +1,3 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEditor;
|
||||
using UnityEditor.UI;
|
||||
using UnityEngine;
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
@ -1,7 +1,6 @@
|
||||
using DG.Tweening;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
@ -71,6 +70,7 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
protected override void Update()
|
||||
{
|
||||
SelectBorder.Active = Enable;
|
||||
UpdateMenuState();
|
||||
|
||||
base.Update();
|
||||
@ -177,6 +177,7 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
var itemUIRect = optionUI_MenuItem.transform as RectTransform;
|
||||
SelectBorder.Target = itemUIRect;
|
||||
SelectBorder.RefreshPosition();
|
||||
|
||||
if (!m_bPoped)
|
||||
{
|
||||
|
@ -1,6 +1,4 @@
|
||||
using DG.Tweening;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
|
@ -2,7 +2,6 @@ using AxibugEmuOnline.Client.ClientCore;
|
||||
using AxibugEmuOnline.Client.Event;
|
||||
using AxibugEmuOnline.Client.UI;
|
||||
using AxibugProtobuf;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
using DG.Tweening;
|
||||
using DG.Tweening;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using UnityEngine;
|
||||
@ -7,6 +7,8 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public class Selector : MonoBehaviour
|
||||
{
|
||||
[SerializeField]
|
||||
private Animator animator;
|
||||
private RectTransform m_rect => transform as RectTransform;
|
||||
|
||||
private RectTransform m_target;
|
||||
@ -21,15 +23,13 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
m_target = value;
|
||||
|
||||
//重置选择游标的动画
|
||||
gameObject.SetActive(false);
|
||||
gameObject.SetActive(true);
|
||||
|
||||
var itemUIRect = m_target.transform as RectTransform;
|
||||
m_rect.pivot = itemUIRect.pivot;
|
||||
m_rect.sizeDelta = itemUIRect.rect.size;
|
||||
m_rect.SetAsLastSibling();
|
||||
|
||||
animator.SetTrigger("reactive");
|
||||
|
||||
if (m_trackTween != null)
|
||||
{
|
||||
m_trackTween.Kill();
|
||||
@ -40,15 +40,34 @@ namespace AxibugEmuOnline.Client
|
||||
}
|
||||
}
|
||||
|
||||
private bool m_active;
|
||||
public bool Active
|
||||
{
|
||||
get => m_active;
|
||||
set
|
||||
{
|
||||
if (m_active == value) return;
|
||||
m_active = value;
|
||||
|
||||
animator.SetBool("active", value);
|
||||
}
|
||||
}
|
||||
|
||||
public void RefreshPosition()
|
||||
{
|
||||
if (Target != null)
|
||||
{
|
||||
m_rect.position = Target.position;
|
||||
}
|
||||
}
|
||||
|
||||
private void LateUpdate()
|
||||
{
|
||||
if (m_trackTween != null)
|
||||
if (m_trackTween != null && m_trackTween.endValue != Target.position)
|
||||
{
|
||||
m_trackTween.endValue = Target.position;
|
||||
m_trackTween.ChangeEndValue(Target.position, true);
|
||||
}
|
||||
if (Target == null) return;
|
||||
|
||||
m_rect.position = Target.position;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,3 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
@ -20,7 +20,7 @@ namespace AxibugEmuOnline.Client
|
||||
base.Awake();
|
||||
|
||||
RomGroupRoot.gameObject.SetActive(false);
|
||||
RomGroupRoot.alpha = 0;
|
||||
RomGroupRoot.alpha = 0;
|
||||
}
|
||||
|
||||
public override void SetSelectState(bool selected)
|
||||
@ -58,7 +58,7 @@ namespace AxibugEmuOnline.Client
|
||||
thirdMenuGroup.itemGroup.Clear();
|
||||
|
||||
RefreshUI();
|
||||
|
||||
|
||||
if (SubMenuItemGroup != null) SubMenuItemGroup.SetSelect(true);
|
||||
|
||||
return true;
|
||||
|
@ -1,7 +1,6 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using AxibugProtobuf;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
@ -42,7 +41,7 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
if (s_RomFileCahcesInRoomInfo.TryGetValue(roomInfo.GameRomID, out RomFile romFile))
|
||||
{
|
||||
callback.Invoke(roomInfo,romFile);
|
||||
callback.Invoke(roomInfo, romFile);
|
||||
return;
|
||||
}
|
||||
switch (platform)
|
||||
@ -53,8 +52,8 @@ namespace AxibugEmuOnline.Client
|
||||
RomFile romFile = new RomFile(EnumPlatform.NES, 0, 0);
|
||||
romFile.SetWebData(romWebData);
|
||||
s_RomFileCahcesInRoomInfo[roomInfo.GameRomID] = romFile;
|
||||
|
||||
callback.Invoke(roomInfo,romFile);
|
||||
|
||||
callback.Invoke(roomInfo, romFile);
|
||||
}));
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user