优化侧边栏菜单 UI细节

This commit is contained in:
ALIENJACK 2024-12-04 23:15:05 +08:00
parent 0b7d6c640d
commit 31099c1900
81 changed files with 6544 additions and 5445 deletions

View File

@ -1,5 +1,4 @@
using AxibugEmuOnline.Client; using AxibugEmuOnline.Client;
using System;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
namespace AxibugEmuOnline.Editors namespace AxibugEmuOnline.Editors

View File

@ -1,6 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using UnityEngine;
namespace AxiReplay namespace AxiReplay
{ {

View File

@ -4,7 +4,7 @@ using System.Text;
namespace AxiReplay namespace AxiReplay
{ {
[StructLayout(LayoutKind.Explicit,Size = 44)] [StructLayout(LayoutKind.Explicit, Size = 44)]
public struct ReplayHandler public struct ReplayHandler
{ {
[FieldOffset(0)] [FieldOffset(0)]
@ -51,7 +51,7 @@ namespace AxiReplay
FM32IP32, FM32IP32,
FM32IP64, 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); data = encoding.GetBytes(str);
lenghtWithEnd = data.Length + 1; lenghtWithEnd = data.Length + 1;

View File

@ -79,7 +79,7 @@ namespace AxiReplay
} }
} }
void UpdateNextFrame(int targetFrame) void UpdateNextFrame(int targetFrame)
{ {
//如果已经超过 //如果已经超过
@ -128,14 +128,14 @@ namespace AxiReplay
/// </summary> /// </summary>
public bool NextFrame(out ReplayStep data) public bool NextFrame(out ReplayStep data)
{ {
return TakeFrame(1,out data); return TakeFrame(1, out data);
} }
/// <summary> /// <summary>
/// 往前推进指定帧数量的Input (返回是否变化) /// 往前推进指定帧数量的Input (返回是否变化)
/// </summary> /// </summary>
/// <param name="addFrame"></param> /// <param name="addFrame"></param>
public bool TakeFrame(int addFrame,out ReplayStep data) public bool TakeFrame(int addFrame, out ReplayStep data)
{ {
bool Changed = false; bool Changed = false;
mCurrFrame += addFrame; mCurrFrame += addFrame;

View File

@ -57,7 +57,7 @@ namespace AxiReplay
/// 往前推进帧的,指定帧下标 /// 往前推进帧的,指定帧下标
/// </summary> /// </summary>
/// <param name="frameInput"></param> /// <param name="frameInput"></param>
public void NextFramebyFrameIdx(int FrameID,UInt64 frameInput) public void NextFramebyFrameIdx(int FrameID, UInt64 frameInput)
{ {
TakeFrame(FrameID - byFrameIdx, frameInput); TakeFrame(FrameID - byFrameIdx, frameInput);
byFrameIdx = FrameID; byFrameIdx = FrameID;
@ -80,7 +80,7 @@ namespace AxiReplay
{ {
if (addFrame < 0) if (addFrame < 0)
{ {
} }
mCurrFrame += addFrame; mCurrFrame += addFrame;
if (mCurrInput == frameInput) if (mCurrInput == frameInput)
@ -140,7 +140,7 @@ namespace AxiReplay
temp.Add($"CreateTime => {handler.CreateTime}"); temp.Add($"CreateTime => {handler.CreateTime}");
temp.Add($"AllFrame => {handler.AllFrame}"); temp.Add($"AllFrame => {handler.AllFrame}");
temp.Add($"SingleLenght => {handler.SingleLenght}"); temp.Add($"SingleLenght => {handler.SingleLenght}");
dbgList.InsertRange(0,temp); dbgList.InsertRange(0, temp);
File.WriteAllLines(dumppath, dbgList); File.WriteAllLines(dumppath, dbgList);
} }
} }

View File

@ -14,23 +14,23 @@ using System.Linq;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Base class for effects that modify the generated Mesh. /// 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. /// It works well not only for standard Graphic components (Image, RawImage, Text, etc.) but also for TextMeshPro and TextMeshProUGUI.
/// </summary> /// </summary>
[ExecuteInEditMode] [ExecuteInEditMode]
public abstract class BaseMeshEffect : UIBehaviour, IMeshModifier public abstract class BaseMeshEffect : UIBehaviour, IMeshModifier
{ {
//################################ //################################
// Constant or Static Members. // Constant or Static Members.
//################################ //################################
#if TMP_PRESENT #if TMP_PRESENT
static readonly List<Vector2> s_Uv0 = new List<Vector2> (4096); static readonly List<Vector2> s_Uv0 = new List<Vector2> (4096);
static readonly List<Vector2> s_Uv1 = 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_Uv2 = new List<Vector2> (4096);
static readonly List<Vector2> s_Uv3 = 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<Vector3> s_Vertices = new List<Vector3> (4096);
static readonly List<int> s_Indices = new List<int> (4096); static readonly List<int> s_Indices = new List<int> (4096);
static readonly List<Vector3> s_Normals = new List<Vector3> (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<UIVertex> s_UIVertices = new List<UIVertex> (4096);
static readonly List<BaseMeshEffect> s_TmpEffects = new List<BaseMeshEffect>(4); static readonly List<BaseMeshEffect> s_TmpEffects = new List<BaseMeshEffect>(4);
#endif #endif
static readonly Material [] s_EmptyMaterials = new Material [0]; static readonly Material[] s_EmptyMaterials = new Material[0];
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
/// <summary> /// <summary>
/// The Graphic attached to this GameObject. /// The Graphic attached to this GameObject.
/// </summary> /// </summary>
public Graphic graphic { get { Initialize (); return _graphic; } } public Graphic graphic { get { Initialize(); return _graphic; } }
/// <summary> /// <summary>
/// The CanvasRenderer attached to this GameObject. /// The CanvasRenderer attached to this GameObject.
/// </summary> /// </summary>
public CanvasRenderer canvasRenderer { get { Initialize (); return _canvasRenderer; } } public CanvasRenderer canvasRenderer { get { Initialize(); return _canvasRenderer; } }
#if TMP_PRESENT #if TMP_PRESENT
/// <summary> /// <summary>
@ -65,40 +65,40 @@ namespace Coffee.UIExtensions
public TMP_Text textMeshPro { get { Initialize (); return _textMeshPro; } } public TMP_Text textMeshPro { get { Initialize (); return _textMeshPro; } }
#endif #endif
/// <summary> /// <summary>
/// The RectTransform attached to this GameObject. /// The RectTransform attached to this GameObject.
/// </summary> /// </summary>
public RectTransform rectTransform { get { Initialize (); return _rectTransform; } } public RectTransform rectTransform { get { Initialize(); return _rectTransform; } }
#if UNITY_5_6_OR_NEWER #if UNITY_5_6_OR_NEWER
/// <summary> /// <summary>
/// Additional canvas shader channels to use this component. /// Additional canvas shader channels to use this component.
/// </summary> /// </summary>
public virtual AdditionalCanvasShaderChannels requiredChannels { get { return AdditionalCanvasShaderChannels.None; } } public virtual AdditionalCanvasShaderChannels requiredChannels { get { return AdditionalCanvasShaderChannels.None; } }
#endif #endif
/// <summary> /// <summary>
/// Is TextMeshPro or TextMeshProUGUI attached to this GameObject? /// Is TextMeshPro or TextMeshProUGUI attached to this GameObject?
/// </summary> /// </summary>
public bool isTMPro public bool isTMPro
{ {
get get
{ {
#if TMP_PRESENT #if TMP_PRESENT
return textMeshPro != null; return textMeshPro != null;
#else #else
return false; return false;
#endif #endif
} }
} }
/// <summary> /// <summary>
/// The material for rendering. /// The material for rendering.
/// </summary> /// </summary>
public virtual Material material public virtual Material material
{ {
get get
{ {
#if TMP_PRESENT #if TMP_PRESENT
if (textMeshPro) if (textMeshPro)
@ -107,17 +107,17 @@ namespace Coffee.UIExtensions
} }
else else
#endif #endif
if (graphic) if (graphic)
{ {
return graphic.material; return graphic.material;
} }
else else
{ {
return null; return null;
} }
} }
set set
{ {
#if TMP_PRESENT #if TMP_PRESENT
if (textMeshPro) if (textMeshPro)
{ {
@ -125,17 +125,17 @@ namespace Coffee.UIExtensions
} }
else else
#endif #endif
if (graphic) if (graphic)
{ {
graphic.material = value; graphic.material = value;
} }
} }
} }
public virtual Material[] materials public virtual Material[] materials
{ {
get get
{ {
#if TMP_PRESENT #if TMP_PRESENT
if (textMeshPro) if (textMeshPro)
@ -144,39 +144,39 @@ namespace Coffee.UIExtensions
} }
else else
#endif #endif
if (graphic) if (graphic)
{ {
_materials [0] = graphic.material; _materials[0] = graphic.material;
return _materials; return _materials;
} }
else else
{ {
return s_EmptyMaterials; return s_EmptyMaterials;
} }
} }
} }
/// <summary> /// <summary>
/// Call used to modify mesh. (legacy) /// Call used to modify mesh. (legacy)
/// </summary> /// </summary>
/// <param name="mesh">Mesh.</param> /// <param name="mesh">Mesh.</param>
public virtual void ModifyMesh (Mesh mesh) public virtual void ModifyMesh(Mesh mesh)
{ {
} }
/// <summary> /// <summary>
/// Call used to modify mesh. /// Call used to modify mesh.
/// </summary> /// </summary>
/// <param name="vh">VertexHelper.</param> /// <param name="vh">VertexHelper.</param>
public virtual void ModifyMesh (VertexHelper vh) public virtual void ModifyMesh(VertexHelper vh)
{ {
} }
/// <summary> /// <summary>
/// Mark the vertices as dirty. /// Mark the vertices as dirty.
/// </summary> /// </summary>
public virtual void SetVerticesDirty () public virtual void SetVerticesDirty()
{ {
#if TMP_PRESENT #if TMP_PRESENT
if (textMeshPro) if (textMeshPro)
{ {
@ -211,14 +211,14 @@ namespace Coffee.UIExtensions
} }
else else
#endif #endif
if (graphic) if (graphic)
{ {
graphic.SetVerticesDirty (); 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 UNITY_EDITOR && TMP_PRESENT
if(!textMeshPro || !textMeshPro.fontSharedMaterial) if(!textMeshPro || !textMeshPro.fontSharedMaterial)
{ {
@ -312,39 +312,39 @@ namespace Coffee.UIExtensions
EditorUtility.SetDirty (spriteAsset); EditorUtility.SetDirty (spriteAsset);
return spriteAsset; return spriteAsset;
#endif #endif
} }
//################################ //################################
// Protected Members. // Protected Members.
//################################ //################################
/// <summary> /// <summary>
/// Should the effect modify the mesh directly for TMPro? /// Should the effect modify the mesh directly for TMPro?
/// </summary> /// </summary>
protected virtual bool isLegacyMeshModifier { get { return false; } } protected virtual bool isLegacyMeshModifier { get { return false; } }
protected virtual void Initialize () protected virtual void Initialize()
{ {
if (!_initialized) if (!_initialized)
{ {
_initialized = true; _initialized = true;
_graphic = _graphic ?? GetComponent<Graphic> (); _graphic = _graphic ?? GetComponent<Graphic>();
_canvasRenderer = _canvasRenderer ?? GetComponent<CanvasRenderer> (); _canvasRenderer = _canvasRenderer ?? GetComponent<CanvasRenderer>();
_rectTransform = _rectTransform ?? GetComponent<RectTransform> (); _rectTransform = _rectTransform ?? GetComponent<RectTransform>();
#if TMP_PRESENT #if TMP_PRESENT
_textMeshPro = _textMeshPro ?? GetComponent<TMP_Text> (); _textMeshPro = _textMeshPro ?? GetComponent<TMP_Text> ();
#endif #endif
} }
} }
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable () protected override void OnEnable()
{ {
_initialized = false; _initialized = false;
SetVerticesDirty (); SetVerticesDirty();
#if TMP_PRESENT #if TMP_PRESENT
if (textMeshPro) if (textMeshPro)
{ {
@ -360,27 +360,27 @@ namespace Coffee.UIExtensions
#endif #endif
#if UNITY_5_6_OR_NEWER #if UNITY_5_6_OR_NEWER
if (graphic) if (graphic)
{ {
AdditionalCanvasShaderChannels channels = requiredChannels; AdditionalCanvasShaderChannels channels = requiredChannels;
var canvas = graphic.canvas; var canvas = graphic.canvas;
if (canvas && (canvas.additionalShaderChannels & channels) != channels) if (canvas && (canvas.additionalShaderChannels & channels) != channels)
{ {
Debug.LogWarningFormat (this, "Enable {1} of Canvas.additionalShaderChannels to use {0}.", GetType ().Name, channels); Debug.LogWarningFormat(this, "Enable {1} of Canvas.additionalShaderChannels to use {0}.", GetType().Name, channels);
} }
} }
#endif #endif
} }
/// <summary> /// <summary>
/// This function is called when the behaviour becomes disabled () or inactive. /// This function is called when the behaviour becomes disabled () or inactive.
/// </summary> /// </summary>
protected override void OnDisable () protected override void OnDisable()
{ {
#if TMP_PRESENT #if TMP_PRESENT
TMPro_EventManager.TEXT_CHANGED_EVENT.Remove (OnTextChanged); TMPro_EventManager.TEXT_CHANGED_EVENT.Remove (OnTextChanged);
#endif #endif
SetVerticesDirty (); SetVerticesDirty();
#if UNITY_EDITOR && TMP_PRESENT #if UNITY_EDITOR && TMP_PRESENT
if (graphic && textMeshPro) if (graphic && textMeshPro)
@ -388,14 +388,14 @@ namespace Coffee.UIExtensions
GraphicRebuildTracker.UnTrackGraphic (graphic); GraphicRebuildTracker.UnTrackGraphic (graphic);
} }
#endif #endif
} }
/// <summary> /// <summary>
/// LateUpdate is called every frame, if the Behaviour is enabled. /// LateUpdate is called every frame, if the Behaviour is enabled.
/// </summary> /// </summary>
protected virtual void LateUpdate () protected virtual void LateUpdate()
{ {
#if TMP_PRESENT #if TMP_PRESENT
if (textMeshPro) if (textMeshPro)
{ {
@ -406,35 +406,35 @@ namespace Coffee.UIExtensions
_isTextMeshProActive = textMeshPro.isActiveAndEnabled; _isTextMeshProActive = textMeshPro.isActiveAndEnabled;
} }
#endif #endif
} }
/// <summary> /// <summary>
/// Callback for when properties have been changed by animation. /// Callback for when properties have been changed by animation.
/// </summary> /// </summary>
protected override void OnDidApplyAnimationProperties () protected override void OnDidApplyAnimationProperties()
{ {
SetVerticesDirty (); SetVerticesDirty();
} }
#if UNITY_EDITOR #if UNITY_EDITOR
/// <summary> /// <summary>
/// This function is called when the script is loaded or a value is changed in the inspector (Called in the editor only). /// This function is called when the script is loaded or a value is changed in the inspector (Called in the editor only).
/// </summary> /// </summary>
protected override void OnValidate () protected override void OnValidate()
{ {
SetVerticesDirty (); SetVerticesDirty();
} }
#endif #endif
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
bool _initialized; bool _initialized;
CanvasRenderer _canvasRenderer; CanvasRenderer _canvasRenderer;
RectTransform _rectTransform; RectTransform _rectTransform;
Graphic _graphic; Graphic _graphic;
Material [] _materials = new Material [1]; Material[] _materials = new Material[1];
#if TMP_PRESENT #if TMP_PRESENT
bool _isTextMeshProActive; bool _isTextMeshProActive;
@ -532,12 +532,12 @@ namespace Coffee.UIExtensions
mesh.GetTangents (s_Tangents); mesh.GetTangents (s_Tangents);
mesh.GetIndices (s_Indices, 0); mesh.GetIndices (s_Indices, 0);
#if UNITY_2017_1_OR_NEWER #if UNITY_2017_1_OR_NEWER
mesh.GetUVs (2, s_Uv2); mesh.GetUVs (2, s_Uv2);
mesh.GetUVs (3, s_Uv3); mesh.GetUVs (3, s_Uv3);
bool useUv2 = 0 < s_Uv2.Count; bool useUv2 = 0 < s_Uv2.Count;
bool useUv3 = 0 < s_Uv3.Count; bool useUv3 = 0 < s_Uv3.Count;
#endif #endif
s_UIVertices.Clear(); s_UIVertices.Clear();
UIVertex v = default(UIVertex); UIVertex v = default(UIVertex);
@ -547,12 +547,12 @@ namespace Coffee.UIExtensions
v.color = s_Colors[i]; v.color = s_Colors[i];
v.uv0 = s_Uv0[i]; v.uv0 = s_Uv0[i];
v.uv1 = s_Uv1[i]; v.uv1 = s_Uv1[i];
#if UNITY_2017_1_OR_NEWER #if UNITY_2017_1_OR_NEWER
if (useUv2 && i < s_Uv2.Count) if (useUv2 && i < s_Uv2.Count)
v.uv2 = s_Uv2[i]; v.uv2 = s_Uv2[i];
if (useUv3 && i < s_Uv3.Count) if (useUv3 && i < s_Uv3.Count)
v.uv3 = s_Uv3[i]; v.uv3 = s_Uv3[i];
#endif #endif
v.normal = s_Normals[i]; v.normal = s_Normals[i];
v.tangent = s_Tangents[i]; v.tangent = s_Tangents[i];
@ -561,5 +561,5 @@ namespace Coffee.UIExtensions
s_VertexHelper.AddUIVertexStream(s_UIVertices, s_Indices); s_VertexHelper.AddUIVertexStream(s_UIVertices, s_Indices);
} }
#endif #endif
} }
} }

View File

@ -1,13 +1,13 @@
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Blur effect mode. /// Blur effect mode.
/// </summary> /// </summary>
public enum BlurMode public enum BlurMode
{ {
None = 0, None = 0,
FastBlur = 1, FastBlur = 1,
MediumBlur = 2, MediumBlur = 2,
DetailBlur = 3, DetailBlur = 3,
} }
} }

View File

@ -1,13 +1,13 @@
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Color effect mode. /// Color effect mode.
/// </summary> /// </summary>
public enum ColorMode public enum ColorMode
{ {
Multiply = 0, Multiply = 0,
Fill = 1, Fill = 1,
Add = 2, Add = 2,
Subtract = 3, Subtract = 3,
} }
} }

View File

@ -3,110 +3,110 @@ using UnityEngine.UI;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Area for effect. /// Area for effect.
/// </summary> /// </summary>
public enum EffectArea public enum EffectArea
{ {
RectTransform, RectTransform,
Fit, Fit,
Character, Character,
} }
public static class EffectAreaExtensions public static class EffectAreaExtensions
{ {
static readonly Rect rectForCharacter = new Rect(0, 0, 1, 1); static readonly Rect rectForCharacter = new Rect(0, 0, 1, 1);
static readonly Vector2 [] splitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero }; static readonly Vector2[] splitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero };
/// <summary> /// <summary>
/// Gets effect for area. /// Gets effect for area.
/// </summary> /// </summary>
public static Rect GetEffectArea (this EffectArea area, VertexHelper vh, Rect rectangle, float aspectRatio = -1) public static Rect GetEffectArea(this EffectArea area, VertexHelper vh, Rect rectangle, float aspectRatio = -1)
{ {
Rect rect = default(Rect); Rect rect = default(Rect);
switch (area) switch (area)
{ {
case EffectArea.RectTransform: case EffectArea.RectTransform:
rect = rectangle; rect = rectangle;
break; break;
case EffectArea.Character: case EffectArea.Character:
rect = rectForCharacter; rect = rectForCharacter;
break; break;
case EffectArea.Fit: case EffectArea.Fit:
// Fit to contents. // Fit to contents.
UIVertex vertex = default (UIVertex); UIVertex vertex = default(UIVertex);
float xMin = float.MaxValue; float xMin = float.MaxValue;
float yMin = float.MaxValue; float yMin = float.MaxValue;
float xMax = float.MinValue; float xMax = float.MinValue;
float yMax = float.MinValue; float yMax = float.MinValue;
for (int i = 0; i < vh.currentVertCount; i++) for (int i = 0; i < vh.currentVertCount; i++)
{ {
vh.PopulateUIVertex(ref vertex, i); vh.PopulateUIVertex(ref vertex, i);
float x = vertex.position.x; float x = vertex.position.x;
float y = vertex.position.y; float y = vertex.position.y;
xMin = Mathf.Min(xMin, x); xMin = Mathf.Min(xMin, x);
yMin = Mathf.Min(yMin, y); yMin = Mathf.Min(yMin, y);
xMax = Mathf.Max(xMax, x); xMax = Mathf.Max(xMax, x);
yMax = Mathf.Max(yMax, y); yMax = Mathf.Max(yMax, y);
} }
rect.Set (xMin, yMin, xMax - xMin, yMax - yMin); rect.Set(xMin, yMin, xMax - xMin, yMax - yMin);
break; break;
default: default:
rect = rectangle; rect = rectangle;
break; break;
} }
if(0 < aspectRatio) if (0 < aspectRatio)
{ {
if (rect.width < rect.height) if (rect.width < rect.height)
{ {
rect.width = rect.height * aspectRatio; rect.width = rect.height * aspectRatio;
} }
else else
{ {
rect.height = rect.width / aspectRatio; rect.height = rect.width / aspectRatio;
} }
} }
return rect; return rect;
} }
/// <summary> /// <summary>
/// Gets position factor for area. /// Gets position factor for area.
/// </summary> /// </summary>
public static void GetPositionFactor (this EffectArea area, int index, Rect rect, Vector2 position, bool isText, bool isTMPro, out float x, out float y) 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) if (isText && area == EffectArea.Character)
{ {
index = isTMPro ? (index + 3) % 4 : index % 4; index = isTMPro ? (index + 3) % 4 : index % 4;
x = splitedCharacterPosition [index].x; x = splitedCharacterPosition[index].x;
y = splitedCharacterPosition [index].y; y = splitedCharacterPosition[index].y;
} }
else if (area == EffectArea.Fit) else if (area == EffectArea.Fit)
{ {
x = Mathf.Clamp01 ((position.x - rect.xMin) / rect.width); x = Mathf.Clamp01((position.x - rect.xMin) / rect.width);
y = Mathf.Clamp01 ((position.y - rect.yMin) / rect.height); y = Mathf.Clamp01((position.y - rect.yMin) / rect.height);
} }
else else
{ {
x = Mathf.Clamp01 (position.x / rect.width + 0.5f); x = Mathf.Clamp01(position.x / rect.width + 0.5f);
y = Mathf.Clamp01 (position.y / rect.height + 0.5f); y = Mathf.Clamp01(position.y / rect.height + 0.5f);
} }
} }
/// <summary> /// <summary>
/// Normalize vertex position by local matrix. /// Normalize vertex position by local matrix.
/// </summary> /// </summary>
public static void GetNormalizedFactor (this EffectArea area, int index, Matrix2x3 matrix, Vector2 position, bool isText, out Vector2 nomalizedPos) public static void GetNormalizedFactor(this EffectArea area, int index, Matrix2x3 matrix, Vector2 position, bool isText, out Vector2 nomalizedPos)
{ {
if (isText && area == EffectArea.Character) if (isText && area == EffectArea.Character)
{ {
nomalizedPos = matrix * splitedCharacterPosition [(index + 3) % 4]; nomalizedPos = matrix * splitedCharacterPosition[(index + 3) % 4];
} }
else else
{ {
nomalizedPos = matrix * position; nomalizedPos = matrix * position;
} }
} }
} }
} }

View File

@ -1,156 +1,156 @@
using UnityEngine; using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Effect player. /// Effect player.
/// </summary> /// </summary>
[Serializable] [Serializable]
public class EffectPlayer public class EffectPlayer
{ {
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
/// <summary> /// <summary>
/// Gets or sets a value indicating whether is playing. /// Gets or sets a value indicating whether is playing.
/// </summary> /// </summary>
[Header("Effect Player")] [Header("Effect Player")]
[Tooltip("Playing.")] [Tooltip("Playing.")]
public bool play = false; public bool play = false;
/// <summary> /// <summary>
/// Gets or sets the delay before looping. /// Gets or sets the delay before looping.
/// </summary> /// </summary>
[Tooltip("Initial play delay.")] [Tooltip("Initial play delay.")]
[Range(0f, 10f)] [Range(0f, 10f)]
public float initialPlayDelay = 0; public float initialPlayDelay = 0;
/// <summary> /// <summary>
/// Gets or sets the duration. /// Gets or sets the duration.
/// </summary> /// </summary>
[Tooltip("Duration.")] [Tooltip("Duration.")]
[Range(0.01f,10f)] [Range(0.01f, 10f)]
public float duration = 1; public float duration = 1;
/// <summary> /// <summary>
/// Gets or sets a value indicating whether can loop. /// Gets or sets a value indicating whether can loop.
/// </summary> /// </summary>
[Tooltip("Loop.")] [Tooltip("Loop.")]
public bool loop = false; public bool loop = false;
/// <summary> /// <summary>
/// Gets or sets the delay before looping. /// Gets or sets the delay before looping.
/// </summary> /// </summary>
[Tooltip("Delay before looping.")] [Tooltip("Delay before looping.")]
[Range(0f,10f)] [Range(0f, 10f)]
public float loopDelay = 0; public float loopDelay = 0;
/// <summary> /// <summary>
/// Gets or sets the update mode. /// Gets or sets the update mode.
/// </summary> /// </summary>
[Tooltip("Update mode")] [Tooltip("Update mode")]
public AnimatorUpdateMode updateMode = AnimatorUpdateMode.Normal; public AnimatorUpdateMode updateMode = AnimatorUpdateMode.Normal;
static List<Action> s_UpdateActions; static List<Action> s_UpdateActions;
/// <summary> /// <summary>
/// Register player. /// Register player.
/// </summary> /// </summary>
public void OnEnable(Action<float> callback = null) public void OnEnable(Action<float> callback = null)
{ {
if (s_UpdateActions == null) if (s_UpdateActions == null)
{ {
s_UpdateActions = new List<Action>(); s_UpdateActions = new List<Action>();
Canvas.willRenderCanvases += () => Canvas.willRenderCanvases += () =>
{ {
var count = s_UpdateActions.Count; var count = s_UpdateActions.Count;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
s_UpdateActions[i].Invoke(); s_UpdateActions[i].Invoke();
} }
}; };
} }
s_UpdateActions.Add(OnWillRenderCanvases); s_UpdateActions.Add(OnWillRenderCanvases);
if (play) if (play)
{ {
_time = -initialPlayDelay; _time = -initialPlayDelay;
} }
else else
{ {
_time = 0; _time = 0;
} }
_callback = callback; _callback = callback;
} }
/// <summary> /// <summary>
/// Unregister player. /// Unregister player.
/// </summary> /// </summary>
public void OnDisable() public void OnDisable()
{ {
_callback = null; _callback = null;
s_UpdateActions.Remove(OnWillRenderCanvases); s_UpdateActions.Remove(OnWillRenderCanvases);
} }
/// <summary> /// <summary>
/// Start playing. /// Start playing.
/// </summary> /// </summary>
public void Play(bool reset, Action<float> callback = null) public void Play(bool reset, Action<float> callback = null)
{ {
if (reset) if (reset)
{ {
_time = 0; _time = 0;
} }
play = true; play = true;
if (callback != null) if (callback != null)
{ {
_callback = callback; _callback = callback;
} }
} }
/// <summary> /// <summary>
/// Stop playing. /// Stop playing.
/// </summary> /// </summary>
public void Stop(bool reset) public void Stop(bool reset)
{ {
if (reset) if (reset)
{ {
_time = 0; _time = 0;
if (_callback != null) if (_callback != null)
{ {
_callback(_time); _callback(_time);
} }
} }
play = false; play = false;
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
float _time = 0; float _time = 0;
Action<float> _callback; Action<float> _callback;
void OnWillRenderCanvases() void OnWillRenderCanvases()
{ {
if (!play || !Application.isPlaying || _callback == null) if (!play || !Application.isPlaying || _callback == null)
{ {
return; return;
} }
_time += updateMode == AnimatorUpdateMode.UnscaledTime _time += updateMode == AnimatorUpdateMode.UnscaledTime
? Time.unscaledDeltaTime ? Time.unscaledDeltaTime
: Time.deltaTime; : Time.deltaTime;
var current = _time / duration; var current = _time / duration;
if (duration <= _time) if (duration <= _time)
{ {
play = loop; play = loop;
_time = loop ? -loopDelay : 0; _time = loop ? -loopDelay : 0;
} }
_callback(current); _callback(current);
} }
} }
} }

View File

@ -4,92 +4,92 @@ using UnityEngine;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
public class MaterialCache public class MaterialCache
{ {
public ulong hash { get; private set; } 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 #if UNITY_EDITOR
[UnityEditor.InitializeOnLoadMethod] [UnityEditor.InitializeOnLoadMethod]
static void ClearCache() static void ClearCache()
{ {
foreach (var cache in materialCaches) foreach (var cache in materialCaches)
{ {
cache.material = null; cache.material = null;
} }
materialCaches.Clear(); materialCaches.Clear();
} }
#endif #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) public static MaterialCache Register(ulong hash, Texture texture, System.Func<Material> onCreateMaterial)
{ {
var cache = materialCaches.FirstOrDefault(x => x.hash == hash); var cache = materialCaches.FirstOrDefault(x => x.hash == hash);
if (cache != null && cache.material) if (cache != null && cache.material)
{ {
if (cache.material) if (cache.material)
{ {
cache.referenceCount++; cache.referenceCount++;
} }
else 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, System.Func<Material> onCreateMaterial) materialCaches.Remove(cache);
{ cache = null;
var cache = materialCaches.FirstOrDefault(x => x.hash == hash); }
if (cache != null) }
{ if (cache == null)
cache.referenceCount++; {
} cache = new MaterialCache()
if (cache == null) {
{ hash = hash,
cache = new MaterialCache() material = onCreateMaterial(),
{ referenceCount = 1,
hash = hash, };
material = onCreateMaterial(), materialCaches.Add(cache);
referenceCount = 1, }
}; return cache;
materialCaches.Add(cache); }
}
return cache;
}
public static void Unregister(MaterialCache cache) public static MaterialCache Register(ulong hash, System.Func<Material> onCreateMaterial)
{ {
if (cache == null) var cache = materialCaches.FirstOrDefault(x => x.hash == hash);
{ if (cache != null)
return; {
} cache.referenceCount++;
}
if (cache == null)
{
cache = new MaterialCache()
{
hash = hash,
material = onCreateMaterial(),
referenceCount = 1,
};
materialCaches.Add(cache);
}
return cache;
}
cache.referenceCount--; public static void Unregister(MaterialCache cache)
if (cache.referenceCount <= 0) {
{ if (cache == null)
MaterialCache.materialCaches.Remove(cache); {
cache.material = null; return;
} }
}
} cache.referenceCount--;
if (cache.referenceCount <= 0)
{
MaterialCache.materialCaches.Remove(cache);
cache.material = null;
}
}
}
} }

View File

@ -1,6 +1,6 @@
#if UNITY_EDITOR #if UNITY_EDITOR
using System.IO;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using UnityEditor; using UnityEditor;
@ -8,119 +8,119 @@ using UnityEngine;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
public class MaterialResolver public class MaterialResolver
{ {
static readonly StringBuilder s_StringBuilder = new StringBuilder(); 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) public static Material GetOrGenerateMaterialVariant(Shader shader, params object[] append)
{ {
if (!shader) if (!shader)
{ {
return null; return null;
} }
Material mat = null; Material mat = null;
string variantName = GetVariantName(shader, append); string variantName = GetVariantName(shader, append);
if (s_MaterialMap.TryGetValue(variantName, out mat) && mat) if (s_MaterialMap.TryGetValue(variantName, out mat) && mat)
{ {
return mat; return mat;
} }
string[] keywords = append.Where(x => 0 < (int)x) string[] keywords = append.Where(x => 0 < (int)x)
.Select(x => x.ToString().ToUpper()) .Select(x => x.ToString().ToUpper())
.ToArray(); .ToArray();
mat = GetMaterial(shader, append); mat = GetMaterial(shader, append);
if (mat) if (mat)
{ {
if (!mat.shaderKeywords.OrderBy(x => x).SequenceEqual(keywords.OrderBy(x => x))) if (!mat.shaderKeywords.OrderBy(x => x).SequenceEqual(keywords.OrderBy(x => x)))
{ {
mat.shaderKeywords = keywords; mat.shaderKeywords = keywords;
EditorUtility.SetDirty(mat); EditorUtility.SetDirty(mat);
if (!Application.isPlaying) if (!Application.isPlaying)
{ {
EditorApplication.delayCall += AssetDatabase.SaveAssets; EditorApplication.delayCall += AssetDatabase.SaveAssets;
} }
} }
return mat; return mat;
} }
if (s_MaterialMap.TryGetValue(variantName, out mat) && mat) if (s_MaterialMap.TryGetValue(variantName, out mat) && mat)
{ {
return mat; return mat;
} }
Debug.Log("Generate material : " + variantName); Debug.Log("Generate material : " + variantName);
mat = new Material(shader); mat = new Material(shader);
mat.shaderKeywords = keywords; mat.shaderKeywords = keywords;
mat.name = variantName; mat.name = variantName;
mat.hideFlags |= HideFlags.NotEditable; mat.hideFlags |= HideFlags.NotEditable;
s_MaterialMap[variantName] = mat; s_MaterialMap[variantName] = mat;
bool isMainAsset = append.Cast<int>().All(x => x == 0); bool isMainAsset = append.Cast<int>().All(x => x == 0);
EditorApplication.delayCall += () => SaveMaterial(mat, shader, isMainAsset); EditorApplication.delayCall += () => SaveMaterial(mat, shader, isMainAsset);
return mat; return mat;
} }
static void SaveMaterial(Material mat, Shader shader, bool isMainAsset) static void SaveMaterial(Material mat, Shader shader, bool isMainAsset)
{ {
string materialPath = GetDefaultMaterialPath(shader); string materialPath = GetDefaultMaterialPath(shader);
#if UIEFFECT_SEPARATE #if UIEFFECT_SEPARATE
string dir = Path.GetDirectoryName(materialPath); string dir = Path.GetDirectoryName(materialPath);
materialPath = Path.Combine(Path.Combine(dir, "Separated"), mat.name + ".mat"); materialPath = Path.Combine(Path.Combine(dir, "Separated"), mat.name + ".mat");
isMainAsset = true; isMainAsset = true;
#endif #endif
if (isMainAsset) if (isMainAsset)
{ {
Directory.CreateDirectory(Path.GetDirectoryName(materialPath)); Directory.CreateDirectory(Path.GetDirectoryName(materialPath));
AssetDatabase.CreateAsset(mat, materialPath); AssetDatabase.CreateAsset(mat, materialPath);
} }
else else
{ {
GetOrGenerateMaterialVariant(shader); GetOrGenerateMaterialVariant(shader);
mat.hideFlags |= HideFlags.HideInHierarchy; mat.hideFlags |= HideFlags.HideInHierarchy;
AssetDatabase.AddObjectToAsset(mat, materialPath); AssetDatabase.AddObjectToAsset(mat, materialPath);
} }
AssetDatabase.SaveAssets(); AssetDatabase.SaveAssets();
} }
public static Material GetMaterial(Shader shader, params object[] append) public static Material GetMaterial(Shader shader, params object[] append)
{ {
string variantName = GetVariantName(shader, append); string variantName = GetVariantName(shader, append);
return AssetDatabase.FindAssets("t:Material " + Path.GetFileName(shader.name)) return AssetDatabase.FindAssets("t:Material " + Path.GetFileName(shader.name))
.Select(x => AssetDatabase.GUIDToAssetPath(x)) .Select(x => AssetDatabase.GUIDToAssetPath(x))
.SelectMany(x => AssetDatabase.LoadAllAssetsAtPath(x)) .SelectMany(x => AssetDatabase.LoadAllAssetsAtPath(x))
.OfType<Material>() .OfType<Material>()
.FirstOrDefault(x => x.name == variantName); .FirstOrDefault(x => x.name == variantName);
} }
public static string GetDefaultMaterialPath(Shader shader) public static string GetDefaultMaterialPath(Shader shader)
{ {
var name = Path.GetFileName(shader.name); var name = Path.GetFileName(shader.name);
return AssetDatabase.FindAssets("t:Material " + name) return AssetDatabase.FindAssets("t:Material " + name)
.Select(x => AssetDatabase.GUIDToAssetPath(x)) .Select(x => AssetDatabase.GUIDToAssetPath(x))
.FirstOrDefault(x => Path.GetFileNameWithoutExtension(x) == name) .FirstOrDefault(x => Path.GetFileNameWithoutExtension(x) == name)
?? ("Assets/" + name + ".mat"); ?? ("Assets/" + name + ".mat");
} }
public static string GetVariantName(Shader shader, params object[] append) public static string GetVariantName(Shader shader, params object[] append)
{ {
s_StringBuilder.Length = 0; s_StringBuilder.Length = 0;
#if UIEFFECT_SEPARATE #if UIEFFECT_SEPARATE
s_StringBuilder.Append("[Separated] "); s_StringBuilder.Append("[Separated] ");
#endif #endif
s_StringBuilder.Append(Path.GetFileName(shader.name)); s_StringBuilder.Append(Path.GetFileName(shader.name));
foreach (object mode in append.Where(x=>0<(int)x)) foreach (object mode in append.Where(x => 0 < (int)x))
{ {
s_StringBuilder.Append("-"); s_StringBuilder.Append("-");
s_StringBuilder.Append(mode.ToString()); s_StringBuilder.Append(mode.ToString());
} }
return s_StringBuilder.ToString(); return s_StringBuilder.ToString();
} }
} }
} }
#endif #endif

View File

@ -2,32 +2,32 @@
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Matrix2x3. /// Matrix2x3.
/// </summary> /// </summary>
public struct Matrix2x3 public struct Matrix2x3
{ {
public float m00, m01, m02, m10, m11, m12; public float m00, m01, m02, m10, m11, m12;
public Matrix2x3(Rect rect, float cos, float sin) public Matrix2x3(Rect rect, float cos, float sin)
{ {
const float center = 0.5f; const float center = 0.5f;
float dx = -rect.xMin / rect.width - center; float dx = -rect.xMin / rect.width - center;
float dy = -rect.yMin / rect.height - center; float dy = -rect.yMin / rect.height - center;
m00 = cos / rect.width; m00 = cos / rect.width;
m01 = -sin / rect.height; m01 = -sin / rect.height;
m02 = dx * cos - dy * sin + center; m02 = dx * cos - dy * sin + center;
m10 = sin / rect.width; m10 = sin / rect.width;
m11 = cos / rect.height; m11 = cos / rect.height;
m12 = dx * sin + dy * cos + center; m12 = dx * sin + dy * cos + center;
} }
public static Vector2 operator*(Matrix2x3 m, Vector2 v) public static Vector2 operator *(Matrix2x3 m, Vector2 v)
{ {
return new Vector2( return new Vector2(
(m.m00 * v.x) + (m.m01 * v.y) + m.m02, (m.m00 * v.x) + (m.m01 * v.y) + m.m02,
(m.m10 * v.x) + (m.m11 * v.y) + m.m12 (m.m10 * v.x) + (m.m11 * v.y) + m.m12
); );
} }
} }
} }

View File

@ -1,60 +1,58 @@
using System.Collections; using UnityEngine;
using System.Collections.Generic;
using UnityEngine;
public static class Packer public static class Packer
{ {
/// <summary> /// <summary>
/// Pack 4 low-precision [0-1] floats values to a float. /// Pack 4 low-precision [0-1] floats values to a float.
/// Each value [0-1] has 64 steps(6 bits). /// Each value [0-1] has 64 steps(6 bits).
/// </summary> /// </summary>
public static float ToFloat(float x, float y, float z, float w) public static float ToFloat(float x, float y, float z, float w)
{ {
x = x < 0 ? 0 : 1 < x ? 1 : x; x = x < 0 ? 0 : 1 < x ? 1 : x;
y = y < 0 ? 0 : 1 < y ? 1 : y; y = y < 0 ? 0 : 1 < y ? 1 : y;
z = z < 0 ? 0 : 1 < z ? 1 : z; z = z < 0 ? 0 : 1 < z ? 1 : z;
w = w < 0 ? 0 : 1 < w ? 1 : w; w = w < 0 ? 0 : 1 < w ? 1 : w;
const int PRECISION = (1 << 6) - 1; const int PRECISION = (1 << 6) - 1;
return (Mathf.FloorToInt(w * PRECISION) << 18) return (Mathf.FloorToInt(w * PRECISION) << 18)
+ (Mathf.FloorToInt(z * PRECISION) << 12) + (Mathf.FloorToInt(z * PRECISION) << 12)
+ (Mathf.FloorToInt(y * PRECISION) << 6) + (Mathf.FloorToInt(y * PRECISION) << 6)
+ Mathf.FloorToInt(x * PRECISION); + Mathf.FloorToInt(x * PRECISION);
} }
/// <summary> /// <summary>
/// Pack 4 low-precision [0-1] floats values to a float. /// Pack 4 low-precision [0-1] floats values to a float.
/// Each value [0-1] has 64 steps(6 bits). /// Each value [0-1] has 64 steps(6 bits).
/// </summary> /// </summary>
public static float ToFloat(Vector4 factor) public static float ToFloat(Vector4 factor)
{ {
return ToFloat(Mathf.Clamp01(factor.x), Mathf.Clamp01(factor.y), Mathf.Clamp01(factor.z), Mathf.Clamp01(factor.w)); return ToFloat(Mathf.Clamp01(factor.x), Mathf.Clamp01(factor.y), Mathf.Clamp01(factor.z), Mathf.Clamp01(factor.w));
} }
/// <summary> /// <summary>
/// Pack 1 middle-precision & 2 low-precision [0-1] floats values to a float. /// 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). /// z value [0-1] has 4096 steps(12 bits) and xy value [0-1] has 64 steps(6 bits).
/// </summary> /// </summary>
public static float ToFloat(float x, float y, float z) public static float ToFloat(float x, float y, float z)
{ {
x = x < 0 ? 0 : 1 < x ? 1 : x; x = x < 0 ? 0 : 1 < x ? 1 : x;
y = y < 0 ? 0 : 1 < y ? 1 : y; y = y < 0 ? 0 : 1 < y ? 1 : y;
z = z < 0 ? 0 : 1 < z ? 1 : z; z = z < 0 ? 0 : 1 < z ? 1 : z;
const int PRECISION = (1 << 8) - 1; const int PRECISION = (1 << 8) - 1;
return (Mathf.FloorToInt(z * PRECISION) << 16) return (Mathf.FloorToInt(z * PRECISION) << 16)
+ (Mathf.FloorToInt(y * PRECISION) << 8) + (Mathf.FloorToInt(y * PRECISION) << 8)
+ Mathf.FloorToInt(x * PRECISION); + Mathf.FloorToInt(x * PRECISION);
} }
/// <summary> /// <summary>
/// Pack 2 low-precision [0-1] floats values to a float. /// Pack 2 low-precision [0-1] floats values to a float.
/// Each value [0-1] has 4096 steps(12 bits). /// Each value [0-1] has 4096 steps(12 bits).
/// </summary> /// </summary>
public static float ToFloat(float x, float y) public static float ToFloat(float x, float y)
{ {
x = x < 0 ? 0 : 1 < x ? 1 : x; x = x < 0 ? 0 : 1 < x ? 1 : x;
y = y < 0 ? 0 : 1 < y ? 1 : y; y = y < 0 ? 0 : 1 < y ? 1 : y;
const int PRECISION = (1 << 12) - 1; const int PRECISION = (1 << 12) - 1;
return (Mathf.FloorToInt(y * PRECISION) << 12) return (Mathf.FloorToInt(y * PRECISION) << 12)
+ Mathf.FloorToInt(x * PRECISION); + Mathf.FloorToInt(x * PRECISION);
} }
} }

View File

@ -1,190 +1,188 @@
using System.Collections; using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.Rendering;
using System;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
public interface IParameterTexture public interface IParameterTexture
{ {
int parameterIndex { get; set; } int parameterIndex { get; set; }
ParameterTexture ptex { get; } ParameterTexture ptex { get; }
} }
/// <summary> /// <summary>
/// Parameter texture. /// Parameter texture.
/// </summary> /// </summary>
[System.Serializable] [System.Serializable]
public class ParameterTexture public class ParameterTexture
{ {
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="Coffee.UIExtensions.ParameterTexture"/> class. /// Initializes a new instance of the <see cref="Coffee.UIExtensions.ParameterTexture"/> class.
/// </summary> /// </summary>
/// <param name="channels">Channels.</param> /// <param name="channels">Channels.</param>
/// <param name="instanceLimit">Instance limit.</param> /// <param name="instanceLimit">Instance limit.</param>
/// <param name="propertyName">Property name.</param> /// <param name="propertyName">Property name.</param>
public ParameterTexture(int channels, int instanceLimit, string propertyName) public ParameterTexture(int channels, int instanceLimit, string propertyName)
{ {
_propertyName = propertyName; _propertyName = propertyName;
_channels = ((channels - 1) / 4 + 1) * 4; _channels = ((channels - 1) / 4 + 1) * 4;
_instanceLimit = ((instanceLimit - 1) / 2 + 1) * 2; _instanceLimit = ((instanceLimit - 1) / 2 + 1) * 2;
_data = new byte[_channels * _instanceLimit]; _data = new byte[_channels * _instanceLimit];
_stack = new Stack<int>(_instanceLimit); _stack = new Stack<int>(_instanceLimit);
for (int i = 1; i < _instanceLimit + 1; i++) for (int i = 1; i < _instanceLimit + 1; i++)
{ {
_stack.Push(i); _stack.Push(i);
} }
} }
/// <summary> /// <summary>
/// Register the specified target. /// Register the specified target.
/// </summary> /// </summary>
/// <param name="target">Target.</param> /// <param name="target">Target.</param>
public void Register(IParameterTexture target) public void Register(IParameterTexture target)
{ {
Initialize(); Initialize();
if (target.parameterIndex <= 0 && 0 < _stack.Count) if (target.parameterIndex <= 0 && 0 < _stack.Count)
{ {
target.parameterIndex = _stack.Pop(); target.parameterIndex = _stack.Pop();
// Debug.LogFormat("<color=green>@@@ Register {0} : {1}</color>", target, target.parameterIndex); // Debug.LogFormat("<color=green>@@@ Register {0} : {1}</color>", target, target.parameterIndex);
} }
} }
/// <summary> /// <summary>
/// Unregister the specified target. /// Unregister the specified target.
/// </summary> /// </summary>
/// <param name="target">Target.</param> /// <param name="target">Target.</param>
public void Unregister(IParameterTexture target) public void Unregister(IParameterTexture target)
{ {
if (0 < target.parameterIndex) if (0 < target.parameterIndex)
{ {
// Debug.LogFormat("<color=red>@@@ Unregister {0} : {1}</color>", target, target.parameterIndex); // Debug.LogFormat("<color=red>@@@ Unregister {0} : {1}</color>", target, target.parameterIndex);
_stack.Push(target.parameterIndex); _stack.Push(target.parameterIndex);
target.parameterIndex = 0; target.parameterIndex = 0;
} }
} }
/// <summary> /// <summary>
/// Sets the data. /// Sets the data.
/// </summary> /// </summary>
/// <param name="target">Target.</param> /// <param name="target">Target.</param>
/// <param name="channelId">Channel identifier.</param> /// <param name="channelId">Channel identifier.</param>
/// <param name="value">Value.</param> /// <param name="value">Value.</param>
public void SetData(IParameterTexture target, int channelId, byte value) public void SetData(IParameterTexture target, int channelId, byte value)
{ {
int index = (target.parameterIndex - 1) * _channels + channelId; int index = (target.parameterIndex - 1) * _channels + channelId;
if (0 < target.parameterIndex && _data[index] != value) if (0 < target.parameterIndex && _data[index] != value)
{ {
_data[index] = value; _data[index] = value;
_needUpload = true; _needUpload = true;
} }
} }
/// <summary> /// <summary>
/// Sets the data. /// Sets the data.
/// </summary> /// </summary>
/// <param name="target">Target.</param> /// <param name="target">Target.</param>
/// <param name="channelId">Channel identifier.</param> /// <param name="channelId">Channel identifier.</param>
/// <param name="value">Value.</param> /// <param name="value">Value.</param>
public void SetData(IParameterTexture target, int channelId, float value) public void SetData(IParameterTexture target, int channelId, float value)
{ {
SetData(target, channelId, (byte)(Mathf.Clamp01(value) * 255)); SetData(target, channelId, (byte)(Mathf.Clamp01(value) * 255));
} }
/// <summary> /// <summary>
/// Registers the material. /// Registers the material.
/// </summary> /// </summary>
/// <param name="mat">Mat.</param> /// <param name="mat">Mat.</param>
public void RegisterMaterial(Material mat) public void RegisterMaterial(Material mat)
{ {
if (_propertyId == 0) if (_propertyId == 0)
{ {
_propertyId = Shader.PropertyToID(_propertyName); _propertyId = Shader.PropertyToID(_propertyName);
} }
if (mat) if (mat)
{ {
mat.SetTexture(_propertyId, _texture); mat.SetTexture(_propertyId, _texture);
} }
} }
/// <summary> /// <summary>
/// Gets the index of the normalized. /// Gets the index of the normalized.
/// </summary> /// </summary>
/// <returns>The normalized index.</returns> /// <returns>The normalized index.</returns>
/// <param name="target">Target.</param> /// <param name="target">Target.</param>
public float GetNormalizedIndex(IParameterTexture target) public float GetNormalizedIndex(IParameterTexture target)
{ {
return ((float)target.parameterIndex - 0.5f) / _instanceLimit; return ((float)target.parameterIndex - 0.5f) / _instanceLimit;
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
Texture2D _texture; Texture2D _texture;
bool _needUpload; bool _needUpload;
int _propertyId; int _propertyId;
readonly string _propertyName; readonly string _propertyName;
readonly int _channels; readonly int _channels;
readonly int _instanceLimit; readonly int _instanceLimit;
readonly byte[] _data; readonly byte[] _data;
readonly Stack<int> _stack; readonly Stack<int> _stack;
static List<Action> updates; static List<Action> updates;
/// <summary> /// <summary>
/// Initialize this instance. /// Initialize this instance.
/// </summary> /// </summary>
void Initialize() void Initialize()
{ {
#if UNITY_EDITOR #if UNITY_EDITOR
if (!UnityEditor.EditorApplication.isPlaying && UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode) if (!UnityEditor.EditorApplication.isPlaying && UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode)
{ {
return; return;
} }
#endif #endif
if (updates == null) if (updates == null)
{ {
updates = new List<Action>(); updates = new List<Action>();
Canvas.willRenderCanvases += () => Canvas.willRenderCanvases += () =>
{ {
var count = updates.Count; var count = updates.Count;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
updates[i].Invoke(); updates[i].Invoke();
} }
}; };
} }
if (!_texture) if (!_texture)
{ {
bool isLinear = QualitySettings.activeColorSpace == ColorSpace.Linear; bool isLinear = QualitySettings.activeColorSpace == ColorSpace.Linear;
_texture = new Texture2D(_channels / 4, _instanceLimit, TextureFormat.RGBA32, false, isLinear); _texture = new Texture2D(_channels / 4, _instanceLimit, TextureFormat.RGBA32, false, isLinear);
_texture.filterMode = FilterMode.Point; _texture.filterMode = FilterMode.Point;
_texture.wrapMode = TextureWrapMode.Clamp; _texture.wrapMode = TextureWrapMode.Clamp;
updates.Add(UpdateParameterTexture); updates.Add(UpdateParameterTexture);
_needUpload = true; _needUpload = true;
} }
} }
void UpdateParameterTexture() void UpdateParameterTexture()
{ {
if (_needUpload && _texture) if (_needUpload && _texture)
{ {
_needUpload = false; _needUpload = false;
_texture.LoadRawTextureData(_data); _texture.LoadRawTextureData(_data);
_texture.Apply(false, false); _texture.Apply(false, false);
} }
} }
} }
} }

View File

@ -1,14 +1,14 @@
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Shadow effect style. /// Shadow effect style.
/// </summary> /// </summary>
public enum ShadowStyle public enum ShadowStyle
{ {
None = 0, None = 0,
Shadow, Shadow,
Outline, Outline,
Outline8, Outline8,
Shadow3, Shadow3,
} }
} }

View File

@ -1,14 +1,14 @@
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Effect mode. /// Effect mode.
/// </summary> /// </summary>
public enum EffectMode public enum EffectMode
{ {
None = 0, None = 0,
Grayscale = 1, Grayscale = 1,
Sepia = 2, Sepia = 2,
Nega = 3, Nega = 3,
Pixel = 4, Pixel = 4,
} }
} }

View File

@ -4,162 +4,162 @@ using UnityEngine.UI;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Abstract effect base for UI. /// Abstract effect base for UI.
/// </summary> /// </summary>
[DisallowMultipleComponent] [DisallowMultipleComponent]
public abstract class UIEffectBase : BaseMeshEffect, IParameterTexture public abstract class UIEffectBase : BaseMeshEffect, IParameterTexture
#if UNITY_EDITOR #if UNITY_EDITOR
, ISerializationCallbackReceiver , ISerializationCallbackReceiver
#endif #endif
{ {
protected static readonly Vector2[] splitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero }; 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 List<UIVertex> tempVerts = new List<UIVertex>();
[HideInInspector] [HideInInspector]
[SerializeField] int m_Version; [SerializeField] int m_Version;
[SerializeField] protected Material m_EffectMaterial; [SerializeField] protected Material m_EffectMaterial;
/// <summary> /// <summary>
/// Gets or sets the parameter index. /// Gets or sets the parameter index.
/// </summary> /// </summary>
public int parameterIndex { get; set; } public int parameterIndex { get; set; }
/// <summary> /// <summary>
/// Gets the parameter texture. /// Gets the parameter texture.
/// </summary> /// </summary>
public virtual ParameterTexture ptex { get { return null; } } public virtual ParameterTexture ptex { get { return null; } }
/// <summary> /// <summary>
/// Gets target graphic for effect. /// Gets target graphic for effect.
/// </summary> /// </summary>
public Graphic targetGraphic { get { return graphic; } } public Graphic targetGraphic { get { return graphic; } }
/// <summary> /// <summary>
/// Gets material for effect. /// Gets material for effect.
/// </summary> /// </summary>
public Material effectMaterial { get { return m_EffectMaterial; } } public Material effectMaterial { get { return m_EffectMaterial; } }
#if UNITY_EDITOR #if UNITY_EDITOR
protected override void Reset() protected override void Reset()
{ {
m_Version = 300; m_Version = 300;
OnValidate(); OnValidate();
} }
/// <summary> /// <summary>
/// Raises the validate event. /// Raises the validate event.
/// </summary> /// </summary>
protected override void OnValidate() protected override void OnValidate()
{ {
base.OnValidate (); base.OnValidate();
var mat = GetMaterial(); var mat = GetMaterial();
if (m_EffectMaterial != mat) if (m_EffectMaterial != mat)
{ {
m_EffectMaterial = mat; m_EffectMaterial = mat;
UnityEditor.EditorUtility.SetDirty(this); UnityEditor.EditorUtility.SetDirty(this);
} }
ModifyMaterial(); ModifyMaterial();
SetVerticesDirty (); SetVerticesDirty();
SetDirty (); SetDirty();
} }
public void OnBeforeSerialize() public void OnBeforeSerialize()
{ {
} }
public void OnAfterDeserialize() public void OnAfterDeserialize()
{ {
UnityEditor.EditorApplication.delayCall += UpgradeIfNeeded; UnityEditor.EditorApplication.delayCall += UpgradeIfNeeded;
} }
protected bool IsShouldUpgrade(int expectedVersion) protected bool IsShouldUpgrade(int expectedVersion)
{ {
if (m_Version < 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); Debug.LogFormat(gameObject, "<b>{0}({1})</b> has been upgraded: <i>version {2} -> {3}</i>", name, GetType().Name, m_Version, expectedVersion);
m_Version = expectedVersion; m_Version = expectedVersion;
//UnityEditor.EditorApplication.delayCall += () => //UnityEditor.EditorApplication.delayCall += () =>
{ {
UnityEditor.EditorUtility.SetDirty(this); UnityEditor.EditorUtility.SetDirty(this);
if (!Application.isPlaying && gameObject && gameObject.scene.IsValid()) if (!Application.isPlaying && gameObject && gameObject.scene.IsValid())
{ {
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(gameObject.scene); UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(gameObject.scene);
} }
} }
; ;
return true; return true;
} }
return false; return false;
} }
protected virtual void UpgradeIfNeeded() protected virtual void UpgradeIfNeeded()
{ {
} }
/// <summary> /// <summary>
/// Gets the material. /// Gets the material.
/// </summary> /// </summary>
/// <returns>The material.</returns> /// <returns>The material.</returns>
protected virtual Material GetMaterial() protected virtual Material GetMaterial()
{ {
return null; return null;
} }
#endif #endif
/// <summary> /// <summary>
/// Modifies the material. /// Modifies the material.
/// </summary> /// </summary>
public virtual void ModifyMaterial() public virtual void ModifyMaterial()
{ {
targetGraphic.material = isActiveAndEnabled ? m_EffectMaterial : null; targetGraphic.material = isActiveAndEnabled ? m_EffectMaterial : null;
} }
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable (); base.OnEnable();
if (ptex != null) if (ptex != null)
{ {
ptex.Register(this); ptex.Register(this);
} }
ModifyMaterial(); ModifyMaterial();
SetVerticesDirty(); SetVerticesDirty();
SetDirty(); SetDirty();
} }
/// <summary> /// <summary>
/// This function is called when the behaviour becomes disabled () or inactive. /// This function is called when the behaviour becomes disabled () or inactive.
/// </summary> /// </summary>
protected override void OnDisable() protected override void OnDisable()
{ {
base.OnDisable (); base.OnDisable();
ModifyMaterial (); ModifyMaterial();
SetVerticesDirty(); SetVerticesDirty();
if (ptex != null) if (ptex != null)
{ {
ptex.Unregister(this); ptex.Unregister(this);
} }
} }
/// <summary> /// <summary>
/// Mark the UIEffect as dirty. /// Mark the UIEffect as dirty.
/// </summary> /// </summary>
protected virtual void SetDirty() protected virtual void SetDirty()
{ {
SetVerticesDirty(); SetVerticesDirty();
} }
protected override void OnDidApplyAnimationProperties() protected override void OnDidApplyAnimationProperties()
{ {
SetDirty(); SetDirty();
} }
} }
} }

View File

@ -1,86 +1,85 @@
using System.Collections; using System.Collections.Generic;
using System.Collections.Generic;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
namespace Coffee.UIExtensions.Editors namespace Coffee.UIExtensions.Editors
{ {
public class BaseMeshEffectEditor : Editor public class BaseMeshEffectEditor : Editor
{ {
List<MaterialEditor> _materialEditors = new List<MaterialEditor> (); List<MaterialEditor> _materialEditors = new List<MaterialEditor>();
protected virtual void OnEnable () protected virtual void OnEnable()
{ {
ClearMaterialEditors (); ClearMaterialEditors();
} }
protected virtual void OnDisable () protected virtual void OnDisable()
{ {
ClearMaterialEditors (); ClearMaterialEditors();
} }
void ClearMaterialEditors () void ClearMaterialEditors()
{ {
foreach (var e in _materialEditors) foreach (var e in _materialEditors)
{ {
if (e) if (e)
{ {
DestroyImmediate (e); DestroyImmediate(e);
} }
} }
_materialEditors.Clear (); _materialEditors.Clear();
} }
protected void ShowMaterialEditors (Material [] materials, int startIndex, int count) protected void ShowMaterialEditors(Material[] materials, int startIndex, int count)
{ {
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
if (_materialEditors.Count == i) if (_materialEditors.Count == i)
{ {
_materialEditors.Add (null); _materialEditors.Add(null);
} }
var mat = materials [startIndex + i]; var mat = materials[startIndex + i];
var editor = _materialEditors [i]; var editor = _materialEditors[i];
if (editor && editor.target != mat) if (editor && editor.target != mat)
{ {
DestroyImmediate (editor); DestroyImmediate(editor);
editor = null; editor = null;
} }
if (!editor) if (!editor)
{ {
editor = _materialEditors [i] = Editor.CreateEditor (mat) as MaterialEditor; editor = _materialEditors[i] = Editor.CreateEditor(mat) as MaterialEditor;
} }
editor.DrawHeader (); editor.DrawHeader();
editor.OnInspectorGUI (); editor.OnInspectorGUI();
} }
} }
protected void ShowCanvasChannelsWarning () protected void ShowCanvasChannelsWarning()
{ {
BaseMeshEffect effect = target as BaseMeshEffect; BaseMeshEffect effect = target as BaseMeshEffect;
if (!effect || !effect.graphic) if (!effect || !effect.graphic)
{ {
return; return;
} }
#if UNITY_5_6_OR_NEWER #if UNITY_5_6_OR_NEWER
AdditionalCanvasShaderChannels channels = effect.requiredChannels; AdditionalCanvasShaderChannels channels = effect.requiredChannels;
var canvas = effect.graphic.canvas; var canvas = effect.graphic.canvas;
if (canvas && (canvas.additionalShaderChannels & channels) != channels) if (canvas && (canvas.additionalShaderChannels & channels) != channels)
{ {
EditorGUILayout.BeginHorizontal (); EditorGUILayout.BeginHorizontal();
EditorGUILayout.HelpBox (string.Format ("Enable {1} of Canvas.additionalShaderChannels to use {0}.", effect.GetType ().Name, channels), MessageType.Warning); EditorGUILayout.HelpBox(string.Format("Enable {1} of Canvas.additionalShaderChannels to use {0}.", effect.GetType().Name, channels), MessageType.Warning);
if (GUILayout.Button ("Fix")) if (GUILayout.Button("Fix"))
{ {
canvas.additionalShaderChannels |= channels; canvas.additionalShaderChannels |= channels;
} }
EditorGUILayout.EndHorizontal (); EditorGUILayout.EndHorizontal();
} }
#endif #endif
} }
} }
} }

View File

@ -1,53 +1,51 @@
using System.Collections; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using UnityEditor; using UnityEditor;
using UnityEngine;
namespace Coffee.UIExtensions.Editors namespace Coffee.UIExtensions.Editors
{ {
/// <summary> /// <summary>
/// Remove deprecated files in old .unitypackage, after compiling. /// Remove deprecated files in old .unitypackage, after compiling.
/// </summary> /// </summary>
public class DeprecatedRemover public class DeprecatedRemover
{ {
/// <summary> /// <summary>
/// GUIDs of deprecated files. /// GUIDs of deprecated files.
/// </summary> /// </summary>
static readonly List<string> DeprecatedFiles = new List<string>() static readonly List<string> DeprecatedFiles = new List<string>()
{ {
"156b57fee6ef941958e66a129ce387e2", // UICustomEffect.cs "156b57fee6ef941958e66a129ce387e2", // UICustomEffect.cs
"a4961e148a8cd4fe0b84dddc2741894a", // UICustomEffectEditor.cs "a4961e148a8cd4fe0b84dddc2741894a", // UICustomEffectEditor.cs
"7b1ed09bdf5e54042b5cd1fbe69361bf", // MaterialBundle.cs "7b1ed09bdf5e54042b5cd1fbe69361bf", // MaterialBundle.cs
}; };
#if UNITY_EDITOR #if UNITY_EDITOR
[UnityEditor.InitializeOnLoadMethod] [UnityEditor.InitializeOnLoadMethod]
static void RemoveFiles() static void RemoveFiles()
{ {
// The deprecated file path that exists. // The deprecated file path that exists.
var files = DeprecatedFiles.Select(x => AssetDatabase.GUIDToAssetPath(x)) var files = DeprecatedFiles.Select(x => AssetDatabase.GUIDToAssetPath(x))
.Where(x => File.Exists(x)) .Where(x => File.Exists(x))
.ToArray(); .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);
foreach (var path in files) if (files.Any())
{ {
AssetDatabase.DeleteAsset(path); StringBuilder sb = new StringBuilder();
sb.AppendFormat(" - {0}\n", path); sb.AppendFormat("<b><color=orange>[{0}]</color></b> {1} files have been removed.\n", typeof(DeprecatedRemover).Name, files.Length);
}
AssetDatabase.Refresh(); foreach (var path in files)
UnityEngine.Debug.Log(sb); {
} AssetDatabase.DeleteAsset(path);
} sb.AppendFormat(" - {0}\n", path);
#endif }
}
AssetDatabase.Refresh();
UnityEngine.Debug.Log(sb);
}
}
#endif
}
} }

View File

@ -1,181 +1,179 @@
using UnityEditor; using System.Linq;
using UnityEditorInternal; using UnityEditor;
using UnityEngine; using UnityEngine;
using System.Linq;
using System.Collections.Generic;
using UnityEngine.UI;
namespace Coffee.UIExtensions.Editors namespace Coffee.UIExtensions.Editors
{ {
/// <summary> /// <summary>
/// UIEffect editor. /// UIEffect editor.
/// </summary> /// </summary>
[CustomEditor(typeof(UIDissolve))] [CustomEditor(typeof(UIDissolve))]
[CanEditMultipleObjects] [CanEditMultipleObjects]
public class UIDissolveEditor : BaseMeshEffectEditor public class UIDissolveEditor : BaseMeshEffectEditor
{ {
static int s_NoiseTexId; static int s_NoiseTexId;
//################################ //################################
// Public/Protected Members. // Public/Protected Members.
//################################ //################################
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable (); base.OnEnable();
_spMaterial = serializedObject.FindProperty("m_EffectMaterial"); _spMaterial = serializedObject.FindProperty("m_EffectMaterial");
_spEffectFactor = serializedObject.FindProperty("m_EffectFactor"); _spEffectFactor = serializedObject.FindProperty("m_EffectFactor");
_spEffectArea = serializedObject.FindProperty("m_EffectArea"); _spEffectArea = serializedObject.FindProperty("m_EffectArea");
_spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio"); _spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio");
_spWidth = serializedObject.FindProperty("m_Width"); _spWidth = serializedObject.FindProperty("m_Width");
_spColor = serializedObject.FindProperty("m_Color"); _spColor = serializedObject.FindProperty("m_Color");
_spSoftness = serializedObject.FindProperty("m_Softness"); _spSoftness = serializedObject.FindProperty("m_Softness");
_spColorMode = serializedObject.FindProperty("m_ColorMode"); _spColorMode = serializedObject.FindProperty("m_ColorMode");
_spNoiseTexture = serializedObject.FindProperty("m_NoiseTexture"); _spNoiseTexture = serializedObject.FindProperty("m_NoiseTexture");
_spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio"); _spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio");
_spReverse = serializedObject.FindProperty("m_Reverse"); _spReverse = serializedObject.FindProperty("m_Reverse");
var player = serializedObject.FindProperty("m_Player"); var player = serializedObject.FindProperty("m_Player");
_spPlay = player.FindPropertyRelative("play"); _spPlay = player.FindPropertyRelative("play");
_spDuration = player.FindPropertyRelative("duration"); _spDuration = player.FindPropertyRelative("duration");
_spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay"); _spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay");
_spLoop = player.FindPropertyRelative("loop"); _spLoop = player.FindPropertyRelative("loop");
_spLoopDelay = player.FindPropertyRelative("loopDelay"); _spLoopDelay = player.FindPropertyRelative("loopDelay");
_spUpdateMode = player.FindPropertyRelative("updateMode"); _spUpdateMode = player.FindPropertyRelative("updateMode");
s_NoiseTexId = Shader.PropertyToID ("_NoiseTex"); s_NoiseTexId = Shader.PropertyToID("_NoiseTex");
_shader = Shader.Find ("TextMeshPro/Distance Field (UIDissolve)"); _shader = Shader.Find("TextMeshPro/Distance Field (UIDissolve)");
_mobileShader = Shader.Find ("TextMeshPro/Mobile/Distance Field (UIDissolve)"); _mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UIDissolve)");
_spriteShader = Shader.Find ("TextMeshPro/Sprite (UIDissolve)"); _spriteShader = Shader.Find("TextMeshPro/Sprite (UIDissolve)");
} }
/// <summary> /// <summary>
/// Implement this function to make a custom inspector. /// Implement this function to make a custom inspector.
/// </summary> /// </summary>
public override void OnInspectorGUI() public override void OnInspectorGUI()
{ {
foreach (var d in targets.Cast<UIDissolve> ()) foreach (var d in targets.Cast<UIDissolve>())
{ {
var mat = d.material; var mat = d.material;
if (d.isTMPro && mat && mat.HasProperty(s_NoiseTexId)) if (d.isTMPro && mat && mat.HasProperty(s_NoiseTexId))
{ {
ColorMode colorMode = ColorMode colorMode =
mat.IsKeywordEnabled ("ADD") ? ColorMode.Add mat.IsKeywordEnabled("ADD") ? ColorMode.Add
: mat.IsKeywordEnabled ("SUBTRACT") ? ColorMode.Subtract : mat.IsKeywordEnabled("SUBTRACT") ? ColorMode.Subtract
: mat.IsKeywordEnabled ("FILL") ? ColorMode.Fill : mat.IsKeywordEnabled("FILL") ? ColorMode.Fill
: ColorMode.Multiply; : ColorMode.Multiply;
Texture noiseTexture = mat.GetTexture(s_NoiseTexId); Texture noiseTexture = mat.GetTexture(s_NoiseTexId);
if (d.colorMode != colorMode || d.noiseTexture != noiseTexture) if (d.colorMode != colorMode || d.noiseTexture != noiseTexture)
{ {
var so = new SerializedObject (d); var so = new SerializedObject(d);
so.FindProperty ("m_ColorMode").intValue = (int)colorMode; so.FindProperty("m_ColorMode").intValue = (int)colorMode;
so.FindProperty ("m_NoiseTexture").objectReferenceValue = noiseTexture; so.FindProperty("m_NoiseTexture").objectReferenceValue = noiseTexture;
so.ApplyModifiedProperties (); so.ApplyModifiedProperties();
} }
} }
} }
serializedObject.Update(); serializedObject.Update();
//================ //================
// Effect material. // Effect material.
//================ //================
EditorGUI.BeginDisabledGroup(true); EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.PropertyField(_spMaterial); EditorGUILayout.PropertyField(_spMaterial);
EditorGUI.EndDisabledGroup(); EditorGUI.EndDisabledGroup();
//================ //================
// Effect setting. // Effect setting.
//================ //================
EditorGUILayout.PropertyField(_spEffectFactor); EditorGUILayout.PropertyField(_spEffectFactor);
EditorGUILayout.PropertyField(_spWidth); EditorGUILayout.PropertyField(_spWidth);
EditorGUILayout.PropertyField(_spSoftness); EditorGUILayout.PropertyField(_spSoftness);
EditorGUILayout.PropertyField(_spColor); EditorGUILayout.PropertyField(_spColor);
bool isAnyTMPro = targets.Cast<UIDissolve>().Any(x => x.isTMPro); bool isAnyTMPro = targets.Cast<UIDissolve>().Any(x => x.isTMPro);
using (new EditorGUI.DisabledGroupScope (isAnyTMPro)) using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
{ {
EditorGUILayout.PropertyField (_spColorMode); EditorGUILayout.PropertyField(_spColorMode);
EditorGUILayout.PropertyField (_spNoiseTexture); EditorGUILayout.PropertyField(_spNoiseTexture);
} }
//================ //================
// Advanced option. // Advanced option.
//================ //================
EditorGUILayout.PropertyField(_spEffectArea); EditorGUILayout.PropertyField(_spEffectArea);
EditorGUILayout.PropertyField(_spKeepAspectRatio); EditorGUILayout.PropertyField(_spKeepAspectRatio);
//================ //================
// Effect player. // Effect player.
//================ //================
EditorGUILayout.PropertyField(_spPlay); EditorGUILayout.PropertyField(_spPlay);
EditorGUILayout.PropertyField(_spDuration); EditorGUILayout.PropertyField(_spDuration);
EditorGUILayout.PropertyField(_spInitialPlayDelay); EditorGUILayout.PropertyField(_spInitialPlayDelay);
EditorGUILayout.PropertyField(_spLoop); EditorGUILayout.PropertyField(_spLoop);
EditorGUILayout.PropertyField(_spLoopDelay); EditorGUILayout.PropertyField(_spLoopDelay);
EditorGUILayout.PropertyField(_spUpdateMode); EditorGUILayout.PropertyField(_spUpdateMode);
EditorGUILayout.PropertyField(_spReverse); EditorGUILayout.PropertyField(_spReverse);
// Debug. // Debug.
using (new EditorGUI.DisabledGroupScope(!Application.isPlaying)) using (new EditorGUI.DisabledGroupScope(!Application.isPlaying))
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox)) using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
{ {
GUILayout.Label("Debug"); GUILayout.Label("Debug");
if (GUILayout.Button("Play", "ButtonLeft")) if (GUILayout.Button("Play", "ButtonLeft"))
{ {
(target as UIDissolve).Play(); (target as UIDissolve).Play();
} }
if (GUILayout.Button("Stop", "ButtonRight")) if (GUILayout.Button("Stop", "ButtonRight"))
{ {
(target as UIDissolve).Stop(); (target as UIDissolve).Stop();
} }
} }
var c = target as UIDissolve; var c = target as UIDissolve;
c.ShowTMProWarning (_shader, _mobileShader, _spriteShader, mat => { c.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat =>
if(mat.shader == _spriteShader) {
{ if (mat.shader == _spriteShader)
mat.shaderKeywords = c.material.shaderKeywords; {
mat.SetTexture ("_NoiseTex", c.material.GetTexture ("_NoiseTex")); mat.shaderKeywords = c.material.shaderKeywords;
} mat.SetTexture("_NoiseTex", c.material.GetTexture("_NoiseTex"));
}); }
ShowCanvasChannelsWarning (); });
ShowCanvasChannelsWarning();
ShowMaterialEditors (c.materials, 1, c.materials.Length - 1); ShowMaterialEditors(c.materials, 1, c.materials.Length - 1);
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
SerializedProperty _spMaterial; SerializedProperty _spMaterial;
SerializedProperty _spEffectFactor; SerializedProperty _spEffectFactor;
SerializedProperty _spWidth; SerializedProperty _spWidth;
SerializedProperty _spColor; SerializedProperty _spColor;
SerializedProperty _spSoftness; SerializedProperty _spSoftness;
SerializedProperty _spColorMode; SerializedProperty _spColorMode;
SerializedProperty _spNoiseTexture; SerializedProperty _spNoiseTexture;
SerializedProperty _spEffectArea; SerializedProperty _spEffectArea;
SerializedProperty _spKeepAspectRatio; SerializedProperty _spKeepAspectRatio;
SerializedProperty _spReverse; SerializedProperty _spReverse;
SerializedProperty _spPlay; SerializedProperty _spPlay;
SerializedProperty _spLoop; SerializedProperty _spLoop;
SerializedProperty _spLoopDelay; SerializedProperty _spLoopDelay;
SerializedProperty _spDuration; SerializedProperty _spDuration;
SerializedProperty _spInitialPlayDelay; SerializedProperty _spInitialPlayDelay;
SerializedProperty _spUpdateMode; SerializedProperty _spUpdateMode;
Shader _shader; Shader _shader;
Shader _mobileShader; Shader _mobileShader;
Shader _spriteShader; Shader _spriteShader;
} }
} }

View File

@ -5,184 +5,184 @@ using DesamplingRate = Coffee.UIExtensions.UIEffectCapturedImage.DesamplingRate;
namespace Coffee.UIExtensions.Editors namespace Coffee.UIExtensions.Editors
{ {
/// <summary> /// <summary>
/// UIEffectCapturedImage editor. /// UIEffectCapturedImage editor.
/// </summary> /// </summary>
[CustomEditor(typeof(UIEffectCapturedImage))] [CustomEditor(typeof(UIEffectCapturedImage))]
[CanEditMultipleObjects] [CanEditMultipleObjects]
public class UIEffectCapturedImageEditor : RawImageEditor public class UIEffectCapturedImageEditor : RawImageEditor
{ {
//################################ //################################
// Constant or Static Members. // Constant or Static Members.
//################################ //################################
public enum QualityMode : int public enum QualityMode : int
{ {
Fast = (DesamplingRate.x2 << 0) + (DesamplingRate.x2 << 4) + (FilterMode.Bilinear << 8) + (2 << 10), Fast = (DesamplingRate.x2 << 0) + (DesamplingRate.x2 << 4) + (FilterMode.Bilinear << 8) + (2 << 10),
Medium = (DesamplingRate.x1 << 0) + (DesamplingRate.x1 << 4) + (FilterMode.Bilinear << 8) + (3 << 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), Detail = (DesamplingRate.None << 0) + (DesamplingRate.x1 << 4) + (FilterMode.Bilinear << 8) + (5 << 10),
Custom = -1, Custom = -1,
} }
//################################ //################################
// Public/Protected Members. // Public/Protected Members.
//################################ //################################
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable(); base.OnEnable();
_spTexture = serializedObject.FindProperty("m_Texture"); _spTexture = serializedObject.FindProperty("m_Texture");
_spColor = serializedObject.FindProperty("m_Color"); _spColor = serializedObject.FindProperty("m_Color");
_spRaycastTarget = serializedObject.FindProperty("m_RaycastTarget"); _spRaycastTarget = serializedObject.FindProperty("m_RaycastTarget");
_spDesamplingRate = serializedObject.FindProperty("m_DesamplingRate"); _spDesamplingRate = serializedObject.FindProperty("m_DesamplingRate");
_spReductionRate = serializedObject.FindProperty("m_ReductionRate"); _spReductionRate = serializedObject.FindProperty("m_ReductionRate");
_spFilterMode = serializedObject.FindProperty("m_FilterMode"); _spFilterMode = serializedObject.FindProperty("m_FilterMode");
_spIterations = serializedObject.FindProperty("m_BlurIterations"); _spIterations = serializedObject.FindProperty("m_BlurIterations");
_spKeepSizeToRootCanvas = serializedObject.FindProperty("m_FitToScreen"); _spKeepSizeToRootCanvas = serializedObject.FindProperty("m_FitToScreen");
_spBlurMode = serializedObject.FindProperty("m_BlurMode"); _spBlurMode = serializedObject.FindProperty("m_BlurMode");
_spCaptureOnEnable = serializedObject.FindProperty("m_CaptureOnEnable"); _spCaptureOnEnable = serializedObject.FindProperty("m_CaptureOnEnable");
_customAdvancedOption = (qualityMode == QualityMode.Custom); _customAdvancedOption = (qualityMode == QualityMode.Custom);
} }
/// <summary> /// <summary>
/// Implement this function to make a custom inspector. /// Implement this function to make a custom inspector.
/// </summary> /// </summary>
public override void OnInspectorGUI() public override void OnInspectorGUI()
{ {
var graphic = (target as UIEffectCapturedImage); var graphic = (target as UIEffectCapturedImage);
serializedObject.Update(); serializedObject.Update();
//================ //================
// Basic properties. // Basic properties.
//================ //================
EditorGUILayout.PropertyField(_spTexture); EditorGUILayout.PropertyField(_spTexture);
EditorGUILayout.PropertyField(_spColor); EditorGUILayout.PropertyField(_spColor);
EditorGUILayout.PropertyField(_spRaycastTarget); EditorGUILayout.PropertyField(_spRaycastTarget);
//================ //================
// Capture effect. // Capture effect.
//================ //================
GUILayout.Space(10); GUILayout.Space(10);
EditorGUILayout.LabelField("Capture Effect", EditorStyles.boldLabel); EditorGUILayout.LabelField("Capture Effect", EditorStyles.boldLabel);
UIEffectEditor.DrawEffectProperties(serializedObject, "m_EffectColor"); UIEffectEditor.DrawEffectProperties(serializedObject, "m_EffectColor");
//================ //================
// Advanced option. // Advanced option.
//================ //================
GUILayout.Space(10); GUILayout.Space(10);
EditorGUILayout.LabelField("Advanced Option", EditorStyles.boldLabel); EditorGUILayout.LabelField("Advanced Option", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_spCaptureOnEnable);// CaptureOnEnable. EditorGUILayout.PropertyField(_spCaptureOnEnable);// CaptureOnEnable.
EditorGUILayout.PropertyField(_spKeepSizeToRootCanvas);// Keep Graphic Size To RootCanvas. EditorGUILayout.PropertyField(_spKeepSizeToRootCanvas);// Keep Graphic Size To RootCanvas.
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
QualityMode quality = qualityMode; QualityMode quality = qualityMode;
quality = (QualityMode)EditorGUILayout.EnumPopup("Quality Mode", quality); quality = (QualityMode)EditorGUILayout.EnumPopup("Quality Mode", quality);
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
_customAdvancedOption = (quality == QualityMode.Custom); _customAdvancedOption = (quality == QualityMode.Custom);
qualityMode = quality; qualityMode = quality;
} }
// When qualityMode is `Custom`, show advanced option. // When qualityMode is `Custom`, show advanced option.
if (_customAdvancedOption) if (_customAdvancedOption)
{ {
if (_spBlurMode.intValue != 0) if (_spBlurMode.intValue != 0)
{ {
EditorGUILayout.PropertyField(_spIterations);// Iterations. EditorGUILayout.PropertyField(_spIterations);// Iterations.
} }
DrawDesamplingRate(_spReductionRate);// Reduction rate. DrawDesamplingRate(_spReductionRate);// Reduction rate.
EditorGUILayout.Space(); EditorGUILayout.Space();
EditorGUILayout.LabelField("Result Texture Setting", EditorStyles.boldLabel); EditorGUILayout.LabelField("Result Texture Setting", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_spFilterMode);// Filter Mode. EditorGUILayout.PropertyField(_spFilterMode);// Filter Mode.
DrawDesamplingRate(_spDesamplingRate);// Desampling rate. DrawDesamplingRate(_spDesamplingRate);// Desampling rate.
} }
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
// Debug. // Debug.
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox)) using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
{ {
GUILayout.Label("Debug"); GUILayout.Label("Debug");
if (GUILayout.Button("Capture", "ButtonLeft")) if (GUILayout.Button("Capture", "ButtonLeft"))
{ {
graphic.Release(); graphic.Release();
EditorApplication.delayCall += graphic.Capture; EditorApplication.delayCall += graphic.Capture;
} }
EditorGUI.BeginDisabledGroup(!(target as UIEffectCapturedImage).capturedTexture); EditorGUI.BeginDisabledGroup(!(target as UIEffectCapturedImage).capturedTexture);
if (GUILayout.Button("Release", "ButtonRight")) if (GUILayout.Button("Release", "ButtonRight"))
{ {
graphic.Release(); graphic.Release();
} }
EditorGUI.EndDisabledGroup(); EditorGUI.EndDisabledGroup();
} }
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
const int Bits4 = (1 << 4) - 1; const int Bits4 = (1 << 4) - 1;
const int Bits2 = (1 << 2) - 1; const int Bits2 = (1 << 2) - 1;
bool _customAdvancedOption = false; bool _customAdvancedOption = false;
SerializedProperty _spTexture; SerializedProperty _spTexture;
SerializedProperty _spColor; SerializedProperty _spColor;
SerializedProperty _spRaycastTarget; SerializedProperty _spRaycastTarget;
SerializedProperty _spDesamplingRate; SerializedProperty _spDesamplingRate;
SerializedProperty _spReductionRate; SerializedProperty _spReductionRate;
SerializedProperty _spFilterMode; SerializedProperty _spFilterMode;
SerializedProperty _spBlurMode; SerializedProperty _spBlurMode;
SerializedProperty _spIterations; SerializedProperty _spIterations;
SerializedProperty _spKeepSizeToRootCanvas; SerializedProperty _spKeepSizeToRootCanvas;
SerializedProperty _spCaptureOnEnable; SerializedProperty _spCaptureOnEnable;
QualityMode qualityMode QualityMode qualityMode
{ {
get get
{ {
if (_customAdvancedOption) if (_customAdvancedOption)
return QualityMode.Custom; return QualityMode.Custom;
int qualityValue = (_spDesamplingRate.intValue << 0) int qualityValue = (_spDesamplingRate.intValue << 0)
+ (_spReductionRate.intValue << 4) + (_spReductionRate.intValue << 4)
+ (_spFilterMode.intValue << 8) + (_spFilterMode.intValue << 8)
+ (_spIterations.intValue << 10); + (_spIterations.intValue << 10);
return System.Enum.IsDefined(typeof(QualityMode), qualityValue) ? (QualityMode)qualityValue : QualityMode.Custom; return System.Enum.IsDefined(typeof(QualityMode), qualityValue) ? (QualityMode)qualityValue : QualityMode.Custom;
} }
set set
{ {
if (value != QualityMode.Custom) if (value != QualityMode.Custom)
{ {
int qualityValue = (int)value; int qualityValue = (int)value;
_spDesamplingRate.intValue = (qualityValue >> 0) & Bits4; _spDesamplingRate.intValue = (qualityValue >> 0) & Bits4;
_spReductionRate.intValue = (qualityValue >> 4) & Bits4; _spReductionRate.intValue = (qualityValue >> 4) & Bits4;
_spFilterMode.intValue = (qualityValue >> 8) & Bits2; _spFilterMode.intValue = (qualityValue >> 8) & Bits2;
_spIterations.intValue = (qualityValue >> 10) & Bits4; _spIterations.intValue = (qualityValue >> 10) & Bits4;
} }
} }
} }
/// <summary> /// <summary>
/// Draws the desampling rate. /// Draws the desampling rate.
/// </summary> /// </summary>
void DrawDesamplingRate(SerializedProperty sp) void DrawDesamplingRate(SerializedProperty sp)
{ {
using (new EditorGUILayout.HorizontalScope()) using (new EditorGUILayout.HorizontalScope())
{ {
EditorGUILayout.PropertyField(sp); EditorGUILayout.PropertyField(sp);
int w, h; int w, h;
(target as UIEffectCapturedImage).GetDesamplingSize((UIEffectCapturedImage.DesamplingRate)sp.intValue, out w, out h); (target as UIEffectCapturedImage).GetDesamplingSize((UIEffectCapturedImage.DesamplingRate)sp.intValue, out w, out h);
GUILayout.Label(string.Format("{0}x{1}", w, h), EditorStyles.miniLabel); GUILayout.Label(string.Format("{0}x{1}", w, h), EditorStyles.miniLabel);
} }
} }
} }
} }

View File

@ -1,253 +1,256 @@
using UnityEditor; using System;
using UnityEditorInternal;
using UnityEngine;
using System.Linq; using System.Linq;
using System; using UnityEditor;
using UnityEngine;
namespace Coffee.UIExtensions.Editors namespace Coffee.UIExtensions.Editors
{ {
/// <summary> /// <summary>
/// UIEffect editor. /// UIEffect editor.
/// </summary> /// </summary>
[CustomEditor(typeof(UIEffect))] [CustomEditor(typeof(UIEffect))]
[CanEditMultipleObjects] [CanEditMultipleObjects]
public class UIEffectEditor : BaseMeshEffectEditor public class UIEffectEditor : BaseMeshEffectEditor
{ {
static readonly GUIContent contentEffectColor = new GUIContent ("Effect Color"); static readonly GUIContent contentEffectColor = new GUIContent("Effect Color");
//################################ //################################
// Public/Protected Members. // Public/Protected Members.
//################################ //################################
/// <summary> /// <summary>
/// Draw effect properties. /// Draw effect properties.
/// </summary> /// </summary>
public static void DrawEffectProperties(SerializedObject serializedObject, string colorProperty = "m_Color") public static void DrawEffectProperties(SerializedObject serializedObject, string colorProperty = "m_Color")
{ {
//================ //================
// Effect material. // Effect material.
//================ //================
var spMaterial = serializedObject.FindProperty("m_EffectMaterial"); var spMaterial = serializedObject.FindProperty("m_EffectMaterial");
EditorGUI.BeginDisabledGroup(true); EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.PropertyField(spMaterial); EditorGUILayout.PropertyField(spMaterial);
EditorGUI.EndDisabledGroup(); EditorGUI.EndDisabledGroup();
//================ //================
// Effect setting. // Effect setting.
//================ //================
var spToneMode = serializedObject.FindProperty("m_EffectMode"); var spToneMode = serializedObject.FindProperty("m_EffectMode");
EditorGUILayout.PropertyField(spToneMode); EditorGUILayout.PropertyField(spToneMode);
// When tone is enable, show parameters. // When tone is enable, show parameters.
if (spToneMode.intValue != (int)EffectMode.None) if (spToneMode.intValue != (int)EffectMode.None)
{ {
EditorGUI.indentLevel++; EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectFactor")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectFactor"));
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
} }
//================ //================
// Color setting. // Color setting.
//================ //================
var spColorMode = serializedObject.FindProperty("m_ColorMode"); var spColorMode = serializedObject.FindProperty("m_ColorMode");
EditorGUILayout.PropertyField(spColorMode); EditorGUILayout.PropertyField(spColorMode);
// When color is enable, show parameters. // When color is enable, show parameters.
//if (spColorMode.intValue != (int)ColorMode.Multiply) //if (spColorMode.intValue != (int)ColorMode.Multiply)
{ {
EditorGUI.indentLevel++; EditorGUI.indentLevel++;
SerializedProperty spColor = serializedObject.FindProperty(colorProperty); SerializedProperty spColor = serializedObject.FindProperty(colorProperty);
if (spColor == null && serializedObject.targetObject is UIEffect) { if (spColor == null && serializedObject.targetObject is UIEffect)
spColor = new SerializedObject (serializedObject.targetObjects.Select(x=>(x as UIEffect).targetGraphic).ToArray()).FindProperty(colorProperty); {
} spColor = new SerializedObject(serializedObject.targetObjects.Select(x => (x as UIEffect).targetGraphic).ToArray()).FindProperty(colorProperty);
}
EditorGUI.BeginChangeCheck (); EditorGUI.BeginChangeCheck();
EditorGUI.showMixedValue = spColor.hasMultipleDifferentValues; EditorGUI.showMixedValue = spColor.hasMultipleDifferentValues;
#if UNITY_2018_1_OR_NEWER #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 #else
spColor.colorValue = EditorGUILayout.ColorField (contentEffectColor, spColor.colorValue, true, false, false, null); spColor.colorValue = EditorGUILayout.ColorField (contentEffectColor, spColor.colorValue, true, false, false, null);
#endif #endif
if (EditorGUI.EndChangeCheck ()) { if (EditorGUI.EndChangeCheck())
spColor.serializedObject.ApplyModifiedProperties (); {
} spColor.serializedObject.ApplyModifiedProperties();
}
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorFactor")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorFactor"));
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
} }
//================ //================
// Blur setting. // Blur setting.
//================ //================
var spBlurMode = serializedObject.FindProperty("m_BlurMode"); var spBlurMode = serializedObject.FindProperty("m_BlurMode");
EditorGUILayout.PropertyField(spBlurMode); EditorGUILayout.PropertyField(spBlurMode);
// When blur is enable, show parameters. // When blur is enable, show parameters.
if (spBlurMode.intValue != (int)BlurMode.None) if (spBlurMode.intValue != (int)BlurMode.None)
{ {
EditorGUI.indentLevel++; EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor"));
var spAdvancedBlur = serializedObject.FindProperty("m_AdvancedBlur"); var spAdvancedBlur = serializedObject.FindProperty("m_AdvancedBlur");
if (spAdvancedBlur != null) if (spAdvancedBlur != null)
{ {
EditorGUILayout.PropertyField(spAdvancedBlur); EditorGUILayout.PropertyField(spAdvancedBlur);
} }
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
} }
} }
int GetEnum<T>(Material mat) int GetEnum<T>(Material mat)
{ {
Type type = typeof(T); Type type = typeof(T);
string[] names = System.Enum.GetNames (type); string[] names = System.Enum.GetNames(type);
int[] values = System.Enum.GetValues (type) as int[]; int[] values = System.Enum.GetValues(type) as int[];
int mode = 0; int mode = 0;
for(int i=0;i<names.Length;i++) for (int i = 0; i < names.Length; i++)
{ {
if (mat.IsKeywordEnabled (names [i].ToUpper())) if (mat.IsKeywordEnabled(names[i].ToUpper()))
mode = values [i]; mode = values[i];
} }
return mode; return mode;
} }
/// <summary> /// <summary>
/// Implement this function to make a custom inspector. /// Implement this function to make a custom inspector.
/// </summary> /// </summary>
public override void OnInspectorGUI() public override void OnInspectorGUI()
{ {
foreach (var d in targets.Cast<UIEffect> ()) foreach (var d in targets.Cast<UIEffect>())
{ {
var mat = d.material; var mat = d.material;
if (d.isTMPro && mat) if (d.isTMPro && mat)
{ {
var so = new SerializedObject (d); var so = new SerializedObject(d);
EffectMode eMode = (EffectMode)GetEnum<EffectMode> (mat); EffectMode eMode = (EffectMode)GetEnum<EffectMode>(mat);
ColorMode cMode = (ColorMode)GetEnum<ColorMode> (mat); ColorMode cMode = (ColorMode)GetEnum<ColorMode>(mat);
BlurMode bMode = (BlurMode)GetEnum<BlurMode> (mat); BlurMode bMode = (BlurMode)GetEnum<BlurMode>(mat);
bool aBlur = mat.IsKeywordEnabled("EX"); bool aBlur = mat.IsKeywordEnabled("EX");
if (d.effectMode != eMode || d.colorMode != cMode || d.blurMode != bMode || so.FindProperty ("m_AdvancedBlur").boolValue != aBlur) 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_EffectMode").intValue = (int)eMode;
so.FindProperty ("m_ColorMode").intValue = (int)cMode; so.FindProperty("m_ColorMode").intValue = (int)cMode;
so.FindProperty ("m_BlurMode").intValue = (int)bMode; so.FindProperty("m_BlurMode").intValue = (int)bMode;
so.FindProperty ("m_AdvancedBlur").boolValue = aBlur; so.FindProperty("m_AdvancedBlur").boolValue = aBlur;
so.ApplyModifiedProperties (); so.ApplyModifiedProperties();
} }
} }
} }
serializedObject.Update(); serializedObject.Update();
bool isAnyTMPro = targets.Cast<UIEffect>().Any(x => x.isTMPro); bool isAnyTMPro = targets.Cast<UIEffect>().Any(x => x.isTMPro);
var c = target as UIEffect; var c = target as UIEffect;
//================ //================
// Effect material. // Effect material.
//================ //================
var spMaterial = serializedObject.FindProperty("m_EffectMaterial"); var spMaterial = serializedObject.FindProperty("m_EffectMaterial");
EditorGUI.BeginDisabledGroup(true); EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.PropertyField(spMaterial); EditorGUILayout.PropertyField(spMaterial);
EditorGUI.EndDisabledGroup(); EditorGUI.EndDisabledGroup();
//================ //================
// Effect setting. // Effect setting.
//================ //================
var spToneMode = serializedObject.FindProperty("m_EffectMode"); var spToneMode = serializedObject.FindProperty("m_EffectMode");
using (new EditorGUI.DisabledGroupScope(isAnyTMPro)) using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
EditorGUILayout.PropertyField(spToneMode); EditorGUILayout.PropertyField(spToneMode);
// When tone is enable, show parameters. // When tone is enable, show parameters.
if (spToneMode.intValue != (int)EffectMode.None) if (spToneMode.intValue != (int)EffectMode.None)
{ {
EditorGUI.indentLevel++; EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectFactor")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectFactor"));
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
} }
//================ //================
// Color setting. // Color setting.
//================ //================
var spColorMode = serializedObject.FindProperty("m_ColorMode"); var spColorMode = serializedObject.FindProperty("m_ColorMode");
using (new EditorGUI.DisabledGroupScope(isAnyTMPro)) using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
EditorGUILayout.PropertyField(spColorMode); EditorGUILayout.PropertyField(spColorMode);
// When color is enable, show parameters. // When color is enable, show parameters.
//if (spColorMode.intValue != (int)ColorMode.Multiply) //if (spColorMode.intValue != (int)ColorMode.Multiply)
{ {
EditorGUI.indentLevel++; EditorGUI.indentLevel++;
SerializedProperty spColor = serializedObject.FindProperty("m_Color"); SerializedProperty spColor = serializedObject.FindProperty("m_Color");
if (spColor == null && serializedObject.targetObject is UIEffect) { 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"); {
} spColor = new SerializedObject(serializedObject.targetObjects.Select(x => (x as UIEffect).targetGraphic).ToArray()).FindProperty(!isAnyTMPro ? "m_Color" : "m_fontColor");
}
EditorGUI.BeginChangeCheck (); EditorGUI.BeginChangeCheck();
EditorGUI.showMixedValue = spColor.hasMultipleDifferentValues; EditorGUI.showMixedValue = spColor.hasMultipleDifferentValues;
#if UNITY_2018_1_OR_NEWER #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 #else
spColor.colorValue = EditorGUILayout.ColorField (contentEffectColor, spColor.colorValue, true, false, false, null); spColor.colorValue = EditorGUILayout.ColorField (contentEffectColor, spColor.colorValue, true, false, false, null);
#endif #endif
if (EditorGUI.EndChangeCheck ()) { if (EditorGUI.EndChangeCheck())
spColor.serializedObject.ApplyModifiedProperties (); {
} spColor.serializedObject.ApplyModifiedProperties();
}
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorFactor")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorFactor"));
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
} }
//================ //================
// Blur setting. // Blur setting.
//================ //================
var spBlurMode = serializedObject.FindProperty("m_BlurMode"); var spBlurMode = serializedObject.FindProperty("m_BlurMode");
using (new EditorGUI.DisabledGroupScope(isAnyTMPro)) using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
EditorGUILayout.PropertyField(spBlurMode); EditorGUILayout.PropertyField(spBlurMode);
// When blur is enable, show parameters. // When blur is enable, show parameters.
if (spBlurMode.intValue != (int)BlurMode.None) if (spBlurMode.intValue != (int)BlurMode.None)
{ {
EditorGUI.indentLevel++; EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor"));
var spAdvancedBlur = serializedObject.FindProperty("m_AdvancedBlur"); var spAdvancedBlur = serializedObject.FindProperty("m_AdvancedBlur");
using (new EditorGUI.DisabledGroupScope(isAnyTMPro)) using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
EditorGUILayout.PropertyField(spAdvancedBlur); EditorGUILayout.PropertyField(spAdvancedBlur);
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
} }
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
c.ShowTMProWarning (_shader, _mobileShader, _spriteShader, mat => {}); c.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat => { });
ShowCanvasChannelsWarning (); ShowCanvasChannelsWarning();
ShowMaterialEditors (c.materials, 1, c.materials.Length - 1); ShowMaterialEditors(c.materials, 1, c.materials.Length - 1);
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
} }
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable (); base.OnEnable();
_shader = Shader.Find ("TextMeshPro/Distance Field (UIEffect)"); _shader = Shader.Find("TextMeshPro/Distance Field (UIEffect)");
_mobileShader = Shader.Find ("TextMeshPro/Mobile/Distance Field (UIEffect)"); _mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UIEffect)");
_spriteShader = Shader.Find ("TextMeshPro/Sprite (UIEffect)"); _spriteShader = Shader.Find("TextMeshPro/Sprite (UIEffect)");
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
Shader _shader; Shader _shader;
Shader _mobileShader; Shader _mobileShader;
Shader _spriteShader; Shader _spriteShader;
} }
} }

View File

@ -1,102 +1,101 @@
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
using UnityEngine.UI;
namespace Coffee.UIExtensions.Editors namespace Coffee.UIExtensions.Editors
{ {
/// <summary> /// <summary>
/// UIEffect editor. /// UIEffect editor.
/// </summary> /// </summary>
[CustomEditor(typeof(UIGradient))] [CustomEditor(typeof(UIGradient))]
[CanEditMultipleObjects] [CanEditMultipleObjects]
public class UIGradientEditor : Editor public class UIGradientEditor : Editor
{ {
public override void OnInspectorGUI() public override void OnInspectorGUI()
{ {
serializedObject.Update(); serializedObject.Update();
//================ //================
// Direction. // Direction.
//================ //================
var spDirection = serializedObject.FindProperty("m_Direction"); var spDirection = serializedObject.FindProperty("m_Direction");
EditorGUILayout.PropertyField(spDirection); EditorGUILayout.PropertyField(spDirection);
//================ //================
// Color. // Color.
//================ //================
var spColor1 = serializedObject.FindProperty("m_Color1"); var spColor1 = serializedObject.FindProperty("m_Color1");
var spColor2 = serializedObject.FindProperty("m_Color2"); var spColor2 = serializedObject.FindProperty("m_Color2");
var spColor3 = serializedObject.FindProperty("m_Color3"); var spColor3 = serializedObject.FindProperty("m_Color3");
var spColor4 = serializedObject.FindProperty("m_Color4"); var spColor4 = serializedObject.FindProperty("m_Color4");
switch ((UIGradient.Direction)spDirection.intValue) switch ((UIGradient.Direction)spDirection.intValue)
{ {
case UIGradient.Direction.Horizontal: case UIGradient.Direction.Horizontal:
EditorGUILayout.PropertyField(spColor1, new GUIContent("Left")); EditorGUILayout.PropertyField(spColor1, new GUIContent("Left"));
EditorGUILayout.PropertyField(spColor2, new GUIContent("Right")); EditorGUILayout.PropertyField(spColor2, new GUIContent("Right"));
break; break;
case UIGradient.Direction.Vertical: case UIGradient.Direction.Vertical:
EditorGUILayout.PropertyField(spColor1, new GUIContent("Top")); EditorGUILayout.PropertyField(spColor1, new GUIContent("Top"));
EditorGUILayout.PropertyField(spColor2, new GUIContent("Bottom")); EditorGUILayout.PropertyField(spColor2, new GUIContent("Bottom"));
break; break;
case UIGradient.Direction.Angle: case UIGradient.Direction.Angle:
EditorGUILayout.PropertyField(spColor1, new GUIContent("Color 1")); EditorGUILayout.PropertyField(spColor1, new GUIContent("Color 1"));
EditorGUILayout.PropertyField(spColor2, new GUIContent("Color 2")); EditorGUILayout.PropertyField(spColor2, new GUIContent("Color 2"));
break; break;
case UIGradient.Direction.Diagonal: case UIGradient.Direction.Diagonal:
Rect r = EditorGUILayout.GetControlRect(false, 34); Rect r = EditorGUILayout.GetControlRect(false, 34);
r = EditorGUI.PrefixLabel(r, new GUIContent("Diagonal Color")); r = EditorGUI.PrefixLabel(r, new GUIContent("Diagonal Color"));
float w = r.width / 2; float w = r.width / 2;
EditorGUI.PropertyField(new Rect(r.x, r.y, w, 16), spColor3, GUIContent.none); 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 + 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, r.y + 18, w, 16), spColor1, GUIContent.none);
EditorGUI.PropertyField(new Rect(r.x + w, r.y + 18, w, 16), spColor2, GUIContent.none); EditorGUI.PropertyField(new Rect(r.x + w, r.y + 18, w, 16), spColor2, GUIContent.none);
break; break;
} }
//================ //================
// Angle. // Angle.
//================ //================
if ((int)UIGradient.Direction.Angle <= spDirection.intValue) if ((int)UIGradient.Direction.Angle <= spDirection.intValue)
{ {
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Rotation")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Rotation"));
} }
//================ //================
// Offset. // Offset.
//================ //================
if ((int)UIGradient.Direction.Diagonal == spDirection.intValue) if ((int)UIGradient.Direction.Diagonal == spDirection.intValue)
{ {
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset1"), new GUIContent("Vertical Offset")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset1"), new GUIContent("Vertical Offset"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset2"), new GUIContent("Horizontal Offset")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset2"), new GUIContent("Horizontal Offset"));
} }
else else
{ {
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset1"), new GUIContent("Offset")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Offset1"), new GUIContent("Offset"));
} }
//================ //================
// Advanced options. // Advanced options.
//================ //================
EditorGUILayout.Space(); EditorGUILayout.Space();
EditorGUILayout.LabelField("Advanced Options", EditorStyles.boldLabel); EditorGUILayout.LabelField("Advanced Options", EditorStyles.boldLabel);
EditorGUI.indentLevel++; EditorGUI.indentLevel++;
{ {
//if ((target as UIGradient).targetGraphic is Text) //if ((target as UIGradient).targetGraphic is Text)
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_GradientStyle")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_GradientStyle"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorSpace"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_IgnoreAspectRatio"));
}
EditorGUI.indentLevel--;
serializedObject.ApplyModifiedProperties(); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_ColorSpace"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_IgnoreAspectRatio"));
}
EditorGUI.indentLevel--;
} serializedObject.ApplyModifiedProperties();
}
}
}
} }

View File

@ -1,84 +1,82 @@
using UnityEditor; using UnityEditor;
using UnityEditorInternal;
using UnityEngine; using UnityEngine;
using System.Linq;
namespace Coffee.UIExtensions.Editors namespace Coffee.UIExtensions.Editors
{ {
/// <summary> /// <summary>
/// UIEffect editor. /// UIEffect editor.
/// </summary> /// </summary>
[CustomEditor(typeof(UIHsvModifier))] [CustomEditor(typeof(UIHsvModifier))]
[CanEditMultipleObjects] [CanEditMultipleObjects]
public class UIHsvModifierEditor : BaseMeshEffectEditor public class UIHsvModifierEditor : BaseMeshEffectEditor
{ {
//################################ //################################
// Public/Protected Members. // Public/Protected Members.
//################################ //################################
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable (); base.OnEnable();
_spMaterial = serializedObject.FindProperty("m_EffectMaterial"); _spMaterial = serializedObject.FindProperty("m_EffectMaterial");
_spTargetColor = serializedObject.FindProperty("m_TargetColor"); _spTargetColor = serializedObject.FindProperty("m_TargetColor");
_spRange = serializedObject.FindProperty("m_Range"); _spRange = serializedObject.FindProperty("m_Range");
_spHue = serializedObject.FindProperty("m_Hue"); _spHue = serializedObject.FindProperty("m_Hue");
_spSaturation = serializedObject.FindProperty("m_Saturation"); _spSaturation = serializedObject.FindProperty("m_Saturation");
_spValue = serializedObject.FindProperty("m_Value"); _spValue = serializedObject.FindProperty("m_Value");
_shader = Shader.Find ("TextMeshPro/Distance Field (UIHsvModifier)"); _shader = Shader.Find("TextMeshPro/Distance Field (UIHsvModifier)");
_mobileShader = Shader.Find ("TextMeshPro/Mobile/Distance Field (UIHsvModifier)"); _mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UIHsvModifier)");
_spriteShader = Shader.Find ("TextMeshPro/Sprite (UIHsvModifier)"); _spriteShader = Shader.Find("TextMeshPro/Sprite (UIHsvModifier)");
} }
/// <summary> /// <summary>
/// Implement this function to make a custom inspector. /// Implement this function to make a custom inspector.
/// </summary> /// </summary>
public override void OnInspectorGUI() public override void OnInspectorGUI()
{ {
serializedObject.Update(); serializedObject.Update();
//================ //================
// Effect material. // Effect material.
//================ //================
EditorGUI.BeginDisabledGroup(true); EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.PropertyField(_spMaterial); EditorGUILayout.PropertyField(_spMaterial);
EditorGUI.EndDisabledGroup(); EditorGUI.EndDisabledGroup();
//================ //================
// Effect setting. // Effect setting.
//================ //================
EditorGUILayout.PropertyField(_spTargetColor); EditorGUILayout.PropertyField(_spTargetColor);
EditorGUILayout.PropertyField(_spRange); EditorGUILayout.PropertyField(_spRange);
EditorGUILayout.PropertyField(_spHue); EditorGUILayout.PropertyField(_spHue);
EditorGUILayout.PropertyField(_spSaturation); EditorGUILayout.PropertyField(_spSaturation);
EditorGUILayout.PropertyField(_spValue); EditorGUILayout.PropertyField(_spValue);
var c = target as UIHsvModifier; var c = target as UIHsvModifier;
c.ShowTMProWarning (_shader, _mobileShader, _spriteShader, mat => {}); c.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat => { });
ShowCanvasChannelsWarning (); ShowCanvasChannelsWarning();
ShowMaterialEditors (c.materials, 1, c.materials.Length - 1); ShowMaterialEditors(c.materials, 1, c.materials.Length - 1);
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
SerializedProperty _spMaterial; SerializedProperty _spMaterial;
SerializedProperty _spTargetColor; SerializedProperty _spTargetColor;
SerializedProperty _spRange; SerializedProperty _spRange;
SerializedProperty _spHue; SerializedProperty _spHue;
SerializedProperty _spSaturation; SerializedProperty _spSaturation;
SerializedProperty _spValue; SerializedProperty _spValue;
Shader _shader; Shader _shader;
Shader _mobileShader; Shader _mobileShader;
Shader _spriteShader; Shader _spriteShader;
} }
} }

View File

@ -1,54 +1,52 @@
using UnityEditor; using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
namespace Coffee.UIExtensions.Editors namespace Coffee.UIExtensions.Editors
{ {
/// <summary> /// <summary>
/// UIShadow editor. /// UIShadow editor.
/// </summary> /// </summary>
[CustomEditor(typeof(UIShadow))] [CustomEditor(typeof(UIShadow))]
[CanEditMultipleObjects] [CanEditMultipleObjects]
public class UIShadowEditor : Editor public class UIShadowEditor : Editor
{ {
UIEffect uiEffect; UIEffect uiEffect;
void OnEnable() void OnEnable()
{ {
uiEffect = (target as UIShadow).GetComponent<UIEffect>(); uiEffect = (target as UIShadow).GetComponent<UIEffect>();
} }
/// <summary> /// <summary>
/// Implement this function to make a custom inspector. /// Implement this function to make a custom inspector.
/// </summary> /// </summary>
public override void OnInspectorGUI() public override void OnInspectorGUI()
{ {
serializedObject.Update(); serializedObject.Update();
//================ //================
// Shadow setting. // Shadow setting.
//================ //================
var spShadowMode = serializedObject.FindProperty("m_Style"); var spShadowMode = serializedObject.FindProperty("m_Style");
EditorGUILayout.PropertyField(spShadowMode); EditorGUILayout.PropertyField(spShadowMode);
// When shadow is enable, show parameters. // When shadow is enable, show parameters.
if (spShadowMode.intValue != (int)ShadowStyle.None) if (spShadowMode.intValue != (int)ShadowStyle.None)
{ {
EditorGUI.indentLevel++; EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectDistance")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectDistance"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectColor")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_EffectColor"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_UseGraphicAlpha")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_UseGraphicAlpha"));
if (uiEffect && uiEffect.blurMode != BlurMode.None) if (uiEffect && uiEffect.blurMode != BlurMode.None)
{ {
EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor")); EditorGUILayout.PropertyField(serializedObject.FindProperty("m_BlurFactor"));
} }
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
} }
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
} }
} }
} }

View File

@ -1,135 +1,133 @@
using UnityEditor; using UnityEditor;
using UnityEditorInternal;
using UnityEngine; using UnityEngine;
using System.Linq;
namespace Coffee.UIExtensions.Editors namespace Coffee.UIExtensions.Editors
{ {
/// <summary> /// <summary>
/// UIEffect editor. /// UIEffect editor.
/// </summary> /// </summary>
[CustomEditor(typeof(UIShiny))] [CustomEditor(typeof(UIShiny))]
[CanEditMultipleObjects] [CanEditMultipleObjects]
public class UIShinyEditor : BaseMeshEffectEditor public class UIShinyEditor : BaseMeshEffectEditor
{ {
//################################ //################################
// Public/Protected Members. // Public/Protected Members.
//################################ //################################
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable (); base.OnEnable();
_spMaterial = serializedObject.FindProperty("m_EffectMaterial"); _spMaterial = serializedObject.FindProperty("m_EffectMaterial");
_spEffectFactor = serializedObject.FindProperty("m_EffectFactor"); _spEffectFactor = serializedObject.FindProperty("m_EffectFactor");
_spEffectArea = serializedObject.FindProperty("m_EffectArea"); _spEffectArea = serializedObject.FindProperty("m_EffectArea");
_spWidth = serializedObject.FindProperty("m_Width"); _spWidth = serializedObject.FindProperty("m_Width");
_spRotation = serializedObject.FindProperty("m_Rotation"); _spRotation = serializedObject.FindProperty("m_Rotation");
_spSoftness = serializedObject.FindProperty("m_Softness"); _spSoftness = serializedObject.FindProperty("m_Softness");
_spBrightness = serializedObject.FindProperty("m_Brightness"); _spBrightness = serializedObject.FindProperty("m_Brightness");
_spGloss = serializedObject.FindProperty("m_Gloss"); _spGloss = serializedObject.FindProperty("m_Gloss");
var player = serializedObject.FindProperty("m_Player"); var player = serializedObject.FindProperty("m_Player");
_spPlay = player.FindPropertyRelative("play"); _spPlay = player.FindPropertyRelative("play");
_spDuration = player.FindPropertyRelative("duration"); _spDuration = player.FindPropertyRelative("duration");
_spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay"); _spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay");
_spLoop = player.FindPropertyRelative("loop"); _spLoop = player.FindPropertyRelative("loop");
_spLoopDelay = player.FindPropertyRelative("loopDelay"); _spLoopDelay = player.FindPropertyRelative("loopDelay");
_spUpdateMode = player.FindPropertyRelative("updateMode"); _spUpdateMode = player.FindPropertyRelative("updateMode");
_shader = Shader.Find ("TextMeshPro/Distance Field (UIShiny)"); _shader = Shader.Find("TextMeshPro/Distance Field (UIShiny)");
_mobileShader = Shader.Find ("TextMeshPro/Mobile/Distance Field (UIShiny)"); _mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UIShiny)");
_spriteShader = Shader.Find ("TextMeshPro/Sprite (UIShiny)"); _spriteShader = Shader.Find("TextMeshPro/Sprite (UIShiny)");
} }
/// <summary> /// <summary>
/// Implement this function to make a custom inspector. /// Implement this function to make a custom inspector.
/// </summary> /// </summary>
public override void OnInspectorGUI() public override void OnInspectorGUI()
{ {
serializedObject.Update(); serializedObject.Update();
//================ //================
// Effect material. // Effect material.
//================ //================
EditorGUI.BeginDisabledGroup(true); EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.PropertyField(_spMaterial); EditorGUILayout.PropertyField(_spMaterial);
EditorGUI.EndDisabledGroup(); EditorGUI.EndDisabledGroup();
//================ //================
// Effect setting. // Effect setting.
//================ //================
EditorGUILayout.PropertyField(_spEffectFactor); EditorGUILayout.PropertyField(_spEffectFactor);
EditorGUILayout.PropertyField(_spWidth); EditorGUILayout.PropertyField(_spWidth);
EditorGUILayout.PropertyField(_spRotation); EditorGUILayout.PropertyField(_spRotation);
EditorGUILayout.PropertyField(_spSoftness); EditorGUILayout.PropertyField(_spSoftness);
EditorGUILayout.PropertyField(_spBrightness); EditorGUILayout.PropertyField(_spBrightness);
EditorGUILayout.PropertyField(_spGloss); EditorGUILayout.PropertyField(_spGloss);
//================ //================
// Advanced option. // Advanced option.
//================ //================
EditorGUILayout.PropertyField(_spEffectArea); EditorGUILayout.PropertyField(_spEffectArea);
//================ //================
// Effect player. // Effect player.
//================ //================
EditorGUILayout.PropertyField(_spPlay); EditorGUILayout.PropertyField(_spPlay);
EditorGUILayout.PropertyField(_spDuration); EditorGUILayout.PropertyField(_spDuration);
EditorGUILayout.PropertyField(_spInitialPlayDelay); EditorGUILayout.PropertyField(_spInitialPlayDelay);
EditorGUILayout.PropertyField(_spLoop); EditorGUILayout.PropertyField(_spLoop);
EditorGUILayout.PropertyField(_spLoopDelay); EditorGUILayout.PropertyField(_spLoopDelay);
EditorGUILayout.PropertyField(_spUpdateMode); EditorGUILayout.PropertyField(_spUpdateMode);
// Debug. // Debug.
using (new EditorGUI.DisabledGroupScope(!Application.isPlaying)) using (new EditorGUI.DisabledGroupScope(!Application.isPlaying))
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox)) using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
{ {
GUILayout.Label("Debug"); GUILayout.Label("Debug");
if (GUILayout.Button("Play", "ButtonLeft")) if (GUILayout.Button("Play", "ButtonLeft"))
{ {
(target as UIShiny).Play(); (target as UIShiny).Play();
} }
if (GUILayout.Button("Stop", "ButtonRight")) if (GUILayout.Button("Stop", "ButtonRight"))
{ {
(target as UIShiny).Stop(); (target as UIShiny).Stop();
} }
} }
var c = target as UIShiny; var c = target as UIShiny;
c.ShowTMProWarning (_shader, _mobileShader, _spriteShader, mat => {}); c.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat => { });
ShowCanvasChannelsWarning (); ShowCanvasChannelsWarning();
ShowMaterialEditors (c.materials, 1, c.materials.Length - 1); ShowMaterialEditors(c.materials, 1, c.materials.Length - 1);
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
SerializedProperty _spMaterial; SerializedProperty _spMaterial;
SerializedProperty _spEffectFactor; SerializedProperty _spEffectFactor;
SerializedProperty _spWidth; SerializedProperty _spWidth;
SerializedProperty _spRotation; SerializedProperty _spRotation;
SerializedProperty _spSoftness; SerializedProperty _spSoftness;
SerializedProperty _spBrightness; SerializedProperty _spBrightness;
SerializedProperty _spGloss; SerializedProperty _spGloss;
SerializedProperty _spEffectArea; SerializedProperty _spEffectArea;
SerializedProperty _spPlay; SerializedProperty _spPlay;
SerializedProperty _spLoop; SerializedProperty _spLoop;
SerializedProperty _spLoopDelay; SerializedProperty _spLoopDelay;
SerializedProperty _spDuration; SerializedProperty _spDuration;
SerializedProperty _spInitialPlayDelay; SerializedProperty _spInitialPlayDelay;
SerializedProperty _spUpdateMode; SerializedProperty _spUpdateMode;
Shader _shader; Shader _shader;
Shader _mobileShader; Shader _mobileShader;
Shader _spriteShader; Shader _spriteShader;
} }
} }

View File

@ -1,190 +1,189 @@
using UnityEditor; using System.Linq;
using UnityEditorInternal; using UnityEditor;
using UnityEngine; using UnityEngine;
using System.Linq;
namespace Coffee.UIExtensions.Editors namespace Coffee.UIExtensions.Editors
{ {
/// <summary> /// <summary>
/// UIEffect editor. /// UIEffect editor.
/// </summary> /// </summary>
[CustomEditor(typeof(UITransitionEffect))] [CustomEditor(typeof(UITransitionEffect))]
[CanEditMultipleObjects] [CanEditMultipleObjects]
public class UITransitionEffectEditor : BaseMeshEffectEditor public class UITransitionEffectEditor : BaseMeshEffectEditor
{ {
static int s_NoiseTexId; static int s_NoiseTexId;
//################################ //################################
// Public/Protected Members. // Public/Protected Members.
//################################ //################################
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable(); base.OnEnable();
_spMaterial = serializedObject.FindProperty("m_EffectMaterial"); _spMaterial = serializedObject.FindProperty("m_EffectMaterial");
_spEffectMode = serializedObject.FindProperty("m_EffectMode"); _spEffectMode = serializedObject.FindProperty("m_EffectMode");
_spEffectFactor = serializedObject.FindProperty("m_EffectFactor"); _spEffectFactor = serializedObject.FindProperty("m_EffectFactor");
_spEffectArea = serializedObject.FindProperty("m_EffectArea"); _spEffectArea = serializedObject.FindProperty("m_EffectArea");
_spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio"); _spKeepAspectRatio = serializedObject.FindProperty("m_KeepAspectRatio");
_spDissolveWidth = serializedObject.FindProperty("m_DissolveWidth"); _spDissolveWidth = serializedObject.FindProperty("m_DissolveWidth");
_spDissolveSoftness = serializedObject.FindProperty("m_DissolveSoftness"); _spDissolveSoftness = serializedObject.FindProperty("m_DissolveSoftness");
_spDissolveColor = serializedObject.FindProperty("m_DissolveColor"); _spDissolveColor = serializedObject.FindProperty("m_DissolveColor");
_spTransitionTexture = serializedObject.FindProperty("m_TransitionTexture"); _spTransitionTexture = serializedObject.FindProperty("m_TransitionTexture");
var player = serializedObject.FindProperty("m_Player"); var player = serializedObject.FindProperty("m_Player");
_spPlay = player.FindPropertyRelative("play"); _spPlay = player.FindPropertyRelative("play");
_spDuration = player.FindPropertyRelative("duration"); _spDuration = player.FindPropertyRelative("duration");
_spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay"); _spInitialPlayDelay = player.FindPropertyRelative("initialPlayDelay");
_spLoop = player.FindPropertyRelative("loop"); _spLoop = player.FindPropertyRelative("loop");
_spLoopDelay = player.FindPropertyRelative("loopDelay"); _spLoopDelay = player.FindPropertyRelative("loopDelay");
_spUpdateMode = player.FindPropertyRelative("updateMode"); _spUpdateMode = player.FindPropertyRelative("updateMode");
_spPassRayOnHidden = serializedObject.FindProperty("m_PassRayOnHidden"); _spPassRayOnHidden = serializedObject.FindProperty("m_PassRayOnHidden");
s_NoiseTexId = Shader.PropertyToID("_NoiseTex"); s_NoiseTexId = Shader.PropertyToID("_NoiseTex");
_shader = Shader.Find("TextMeshPro/Distance Field (UITransition)"); _shader = Shader.Find("TextMeshPro/Distance Field (UITransition)");
_mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UITransition)"); _mobileShader = Shader.Find("TextMeshPro/Mobile/Distance Field (UITransition)");
_spriteShader = Shader.Find("TextMeshPro/Sprite (UITransition)"); _spriteShader = Shader.Find("TextMeshPro/Sprite (UITransition)");
} }
/// <summary> /// <summary>
/// Implement this function to make a custom inspector. /// Implement this function to make a custom inspector.
/// </summary> /// </summary>
public override void OnInspectorGUI() public override void OnInspectorGUI()
{ {
foreach (var d in targets.Cast<UITransitionEffect> ()) foreach (var d in targets.Cast<UITransitionEffect>())
{ {
var mat = d.material; var mat = d.material;
if (d.isTMPro && mat && mat.HasProperty (s_NoiseTexId)) if (d.isTMPro && mat && mat.HasProperty(s_NoiseTexId))
{ {
Texture noiseTexture = mat.GetTexture (s_NoiseTexId); Texture noiseTexture = mat.GetTexture(s_NoiseTexId);
UITransitionEffect.EffectMode mode = UITransitionEffect.EffectMode mode =
mat.IsKeywordEnabled ("CUTOFF") ? UITransitionEffect.EffectMode.Cutoff mat.IsKeywordEnabled("CUTOFF") ? UITransitionEffect.EffectMode.Cutoff
: mat.IsKeywordEnabled ("FADE") ? UITransitionEffect.EffectMode.Fade : mat.IsKeywordEnabled("FADE") ? UITransitionEffect.EffectMode.Fade
: mat.IsKeywordEnabled ("DISSOLVE") ? UITransitionEffect.EffectMode.Dissolve : mat.IsKeywordEnabled("DISSOLVE") ? UITransitionEffect.EffectMode.Dissolve
: (UITransitionEffect.EffectMode)0; : (UITransitionEffect.EffectMode)0;
if (mode == (UITransitionEffect.EffectMode)0) if (mode == (UITransitionEffect.EffectMode)0)
{ {
mode = UITransitionEffect.EffectMode.Cutoff; mode = UITransitionEffect.EffectMode.Cutoff;
mat.EnableKeyword ("CUTOFF"); mat.EnableKeyword("CUTOFF");
} }
bool hasChanged = d.transitionTexture != noiseTexture || d.effectMode != mode; bool hasChanged = d.transitionTexture != noiseTexture || d.effectMode != mode;
if (hasChanged) if (hasChanged)
{ {
var so = new SerializedObject (d); var so = new SerializedObject(d);
so.FindProperty ("m_TransitionTexture").objectReferenceValue = noiseTexture; so.FindProperty("m_TransitionTexture").objectReferenceValue = noiseTexture;
so.FindProperty ("m_EffectMode").intValue = (int)mode; so.FindProperty("m_EffectMode").intValue = (int)mode;
so.ApplyModifiedProperties (); so.ApplyModifiedProperties();
} }
} }
} }
serializedObject.Update(); serializedObject.Update();
//================ //================
// Effect material. // Effect material.
//================ //================
EditorGUI.BeginDisabledGroup(true); EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.PropertyField(_spMaterial); EditorGUILayout.PropertyField(_spMaterial);
EditorGUI.EndDisabledGroup(); EditorGUI.EndDisabledGroup();
//================ //================
// Effect setting. // Effect setting.
//================ //================
bool isAnyTMPro = targets.Cast<UITransitionEffect>().Any(x => x.isTMPro); bool isAnyTMPro = targets.Cast<UITransitionEffect>().Any(x => x.isTMPro);
using (new EditorGUI.DisabledGroupScope(isAnyTMPro)) using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
EditorGUILayout.PropertyField(_spEffectMode); EditorGUILayout.PropertyField(_spEffectMode);
EditorGUI.indentLevel++; EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(_spEffectFactor); EditorGUILayout.PropertyField(_spEffectFactor);
if (_spEffectMode.intValue == (int)UITransitionEffect.EffectMode.Dissolve) if (_spEffectMode.intValue == (int)UITransitionEffect.EffectMode.Dissolve)
{ {
EditorGUILayout.PropertyField(_spDissolveWidth); EditorGUILayout.PropertyField(_spDissolveWidth);
EditorGUILayout.PropertyField(_spDissolveSoftness); EditorGUILayout.PropertyField(_spDissolveSoftness);
EditorGUILayout.PropertyField(_spDissolveColor); EditorGUILayout.PropertyField(_spDissolveColor);
} }
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
//================ //================
// Advanced option. // Advanced option.
//================ //================
EditorGUILayout.PropertyField(_spEffectArea); EditorGUILayout.PropertyField(_spEffectArea);
using (new EditorGUI.DisabledGroupScope(isAnyTMPro)) using (new EditorGUI.DisabledGroupScope(isAnyTMPro))
EditorGUILayout.PropertyField(_spTransitionTexture); EditorGUILayout.PropertyField(_spTransitionTexture);
EditorGUILayout.PropertyField(_spKeepAspectRatio); EditorGUILayout.PropertyField(_spKeepAspectRatio);
EditorGUILayout.PropertyField(_spPassRayOnHidden); EditorGUILayout.PropertyField(_spPassRayOnHidden);
//================ //================
// Effect player. // Effect player.
//================ //================
EditorGUILayout.PropertyField(_spPlay); EditorGUILayout.PropertyField(_spPlay);
EditorGUILayout.PropertyField(_spDuration); EditorGUILayout.PropertyField(_spDuration);
EditorGUILayout.PropertyField(_spInitialPlayDelay); EditorGUILayout.PropertyField(_spInitialPlayDelay);
EditorGUILayout.PropertyField(_spLoop); EditorGUILayout.PropertyField(_spLoop);
EditorGUILayout.PropertyField(_spLoopDelay); EditorGUILayout.PropertyField(_spLoopDelay);
EditorGUILayout.PropertyField(_spUpdateMode); EditorGUILayout.PropertyField(_spUpdateMode);
// Debug. // Debug.
using (new EditorGUI.DisabledGroupScope(!Application.isPlaying)) using (new EditorGUI.DisabledGroupScope(!Application.isPlaying))
using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox)) using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox))
{ {
GUILayout.Label("Debug"); GUILayout.Label("Debug");
if (GUILayout.Button("Show", "ButtonLeft")) if (GUILayout.Button("Show", "ButtonLeft"))
{ {
(target as UITransitionEffect).Show(); (target as UITransitionEffect).Show();
} }
if (GUILayout.Button("Hide", "ButtonRight")) if (GUILayout.Button("Hide", "ButtonRight"))
{ {
(target as UITransitionEffect).Hide(); (target as UITransitionEffect).Hide();
} }
} }
var current = target as UITransitionEffect; var current = target as UITransitionEffect;
current.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat => current.ShowTMProWarning(_shader, _mobileShader, _spriteShader, mat =>
{ {
if (mat.shader == _spriteShader) if (mat.shader == _spriteShader)
{ {
mat.shaderKeywords = current.material.shaderKeywords; mat.shaderKeywords = current.material.shaderKeywords;
mat.SetTexture(s_NoiseTexId, current.material.GetTexture(s_NoiseTexId)); mat.SetTexture(s_NoiseTexId, current.material.GetTexture(s_NoiseTexId));
} }
}); });
ShowCanvasChannelsWarning(); ShowCanvasChannelsWarning();
ShowMaterialEditors(current.materials, 1, current.materials.Length - 1); ShowMaterialEditors(current.materials, 1, current.materials.Length - 1);
serializedObject.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties();
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
SerializedProperty _spMaterial; SerializedProperty _spMaterial;
SerializedProperty _spEffectMode; SerializedProperty _spEffectMode;
SerializedProperty _spEffectFactor; SerializedProperty _spEffectFactor;
SerializedProperty _spEffectArea; SerializedProperty _spEffectArea;
SerializedProperty _spKeepAspectRatio; SerializedProperty _spKeepAspectRatio;
SerializedProperty _spDissolveWidth; SerializedProperty _spDissolveWidth;
SerializedProperty _spDissolveSoftness; SerializedProperty _spDissolveSoftness;
SerializedProperty _spDissolveColor; SerializedProperty _spDissolveColor;
SerializedProperty _spTransitionTexture; SerializedProperty _spTransitionTexture;
SerializedProperty _spPlay; SerializedProperty _spPlay;
SerializedProperty _spLoop; SerializedProperty _spLoop;
SerializedProperty _spLoopDelay; SerializedProperty _spLoopDelay;
SerializedProperty _spDuration; SerializedProperty _spDuration;
SerializedProperty _spInitialPlayDelay; SerializedProperty _spInitialPlayDelay;
SerializedProperty _spUpdateMode; SerializedProperty _spUpdateMode;
SerializedProperty _spPassRayOnHidden; SerializedProperty _spPassRayOnHidden;
Shader _shader; Shader _shader;
Shader _mobileShader; Shader _mobileShader;
Shader _spriteShader; Shader _spriteShader;
} }
} }

View File

@ -1,432 +1,434 @@
using System; using System;
using UnityEngine; using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Serialization; using UnityEngine.Serialization;
using UnityEngine.UI;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Dissolve effect for uGUI. /// Dissolve effect for uGUI.
/// </summary> /// </summary>
[AddComponentMenu("UI/UIEffect/UIDissolve", 3)] [AddComponentMenu("UI/UIEffect/UIDissolve", 3)]
public class UIDissolve : UIEffectBase public class UIDissolve : UIEffectBase
{ {
//################################ //################################
// Constant or Static Members. // Constant or Static Members.
//################################ //################################
public const string shaderName = "UI/Hidden/UI-Effect-Dissolve"; public const string shaderName = "UI/Hidden/UI-Effect-Dissolve";
static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex"); static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex");
//################################ //################################
// Serialize Members. // Serialize Members.
//################################ //################################
[Tooltip("Current location[0-1] for dissolve effect. 0 is not dissolved, 1 is completely dissolved.")] [Tooltip("Current location[0-1] for dissolve effect. 0 is not dissolved, 1 is completely dissolved.")]
[FormerlySerializedAs("m_Location")] [FormerlySerializedAs("m_Location")]
[SerializeField] [Range(0, 1)] float m_EffectFactor = 0.5f; [SerializeField][Range(0, 1)] float m_EffectFactor = 0.5f;
[Tooltip("Edge width.")] [Tooltip("Edge width.")]
[SerializeField] [Range(0, 1)] float m_Width = 0.5f; [SerializeField][Range(0, 1)] float m_Width = 0.5f;
[Tooltip("Edge softness.")] [Tooltip("Edge softness.")]
[SerializeField] [Range(0, 1)] float m_Softness = 0.5f; [SerializeField][Range(0, 1)] float m_Softness = 0.5f;
[Tooltip("Edge color.")] [Tooltip("Edge color.")]
[SerializeField] [ColorUsage(false)] Color m_Color = new Color(0.0f, 0.25f, 1.0f); [SerializeField][ColorUsage(false)] Color m_Color = new Color(0.0f, 0.25f, 1.0f);
[Tooltip("Edge color effect mode.")] [Tooltip("Edge color effect mode.")]
[SerializeField] ColorMode m_ColorMode = ColorMode.Add; [SerializeField] ColorMode m_ColorMode = ColorMode.Add;
[Tooltip("Noise texture for dissolving (single channel texture).")] [Tooltip("Noise texture for dissolving (single channel texture).")]
[SerializeField] Texture m_NoiseTexture; [SerializeField] Texture m_NoiseTexture;
[Header("Advanced Option")] [Header("Advanced Option")]
[Tooltip("The area for effect.")] [Tooltip("The area for effect.")]
[SerializeField] protected EffectArea m_EffectArea; [SerializeField] protected EffectArea m_EffectArea;
[Tooltip("Keep effect aspect ratio.")] [Tooltip("Keep effect aspect ratio.")]
[SerializeField] bool m_KeepAspectRatio; [SerializeField] bool m_KeepAspectRatio;
[Header("Effect Player")] [Header("Effect Player")]
[SerializeField] EffectPlayer m_Player; [SerializeField] EffectPlayer m_Player;
[Tooltip("Reverse the dissolve effect.")] [Tooltip("Reverse the dissolve effect.")]
[FormerlySerializedAs("m_ReverseAnimation")] [FormerlySerializedAs("m_ReverseAnimation")]
[SerializeField] bool m_Reverse = false; [SerializeField] bool m_Reverse = false;
#pragma warning disable 0414 #pragma warning disable 0414
[Obsolete][HideInInspector] [Obsolete]
[SerializeField][Range(0.1f, 10)] float m_Duration = 1; [HideInInspector]
[Obsolete][HideInInspector] [SerializeField][Range(0.1f, 10)] float m_Duration = 1;
[SerializeField] AnimatorUpdateMode m_UpdateMode = AnimatorUpdateMode.Normal; [Obsolete]
#pragma warning restore 0414 [HideInInspector]
[SerializeField] AnimatorUpdateMode m_UpdateMode = AnimatorUpdateMode.Normal;
#pragma warning restore 0414
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
/// <summary> /// <summary>
/// Effect factor between 0(start) and 1(end). /// Effect factor between 0(start) and 1(end).
/// </summary> /// </summary>
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")] [System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
public float location public float location
{ {
get { return m_EffectFactor; } get { return m_EffectFactor; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_EffectFactor, value)) if (!Mathf.Approximately(m_EffectFactor, value))
{ {
m_EffectFactor = value; m_EffectFactor = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Effect factor between 0(start) and 1(end). /// Effect factor between 0(start) and 1(end).
/// </summary> /// </summary>
public float effectFactor public float effectFactor
{ {
get { return m_EffectFactor; } get { return m_EffectFactor; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_EffectFactor, value)) if (!Mathf.Approximately(m_EffectFactor, value))
{ {
m_EffectFactor = value; m_EffectFactor = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Edge width. /// Edge width.
/// </summary> /// </summary>
public float width public float width
{ {
get { return m_Width; } get { return m_Width; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_Width, value)) if (!Mathf.Approximately(m_Width, value))
{ {
m_Width = value; m_Width = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Edge softness. /// Edge softness.
/// </summary> /// </summary>
public float softness public float softness
{ {
get { return m_Softness; } get { return m_Softness; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_Softness, value)) if (!Mathf.Approximately(m_Softness, value))
{ {
m_Softness = value; m_Softness = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Edge color. /// Edge color.
/// </summary> /// </summary>
public Color color public Color color
{ {
get { return m_Color; } get { return m_Color; }
set set
{ {
if (m_Color != value) if (m_Color != value)
{ {
m_Color = value; m_Color = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Noise texture. /// Noise texture.
/// </summary> /// </summary>
public Texture noiseTexture public Texture noiseTexture
{ {
get { return m_NoiseTexture ?? material.GetTexture("_NoiseTex"); } get { return m_NoiseTexture ?? material.GetTexture("_NoiseTex"); }
set set
{ {
if (m_NoiseTexture != value) if (m_NoiseTexture != value)
{ {
m_NoiseTexture = value; m_NoiseTexture = value;
if (graphic) if (graphic)
{ {
ModifyMaterial(); ModifyMaterial();
} }
} }
} }
} }
/// <summary> /// <summary>
/// The area for effect. /// The area for effect.
/// </summary> /// </summary>
public EffectArea effectArea public EffectArea effectArea
{ {
get { return m_EffectArea; } get { return m_EffectArea; }
set set
{ {
if (m_EffectArea != value) if (m_EffectArea != value)
{ {
m_EffectArea = value; m_EffectArea = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Keep aspect ratio. /// Keep aspect ratio.
/// </summary> /// </summary>
public bool keepAspectRatio public bool keepAspectRatio
{ {
get { return m_KeepAspectRatio; } get { return m_KeepAspectRatio; }
set set
{ {
if (m_KeepAspectRatio != value) if (m_KeepAspectRatio != value)
{ {
m_KeepAspectRatio = value; m_KeepAspectRatio = value;
SetVerticesDirty (); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Color effect mode. /// Color effect mode.
/// </summary> /// </summary>
public ColorMode colorMode { get { return m_ColorMode; } } public ColorMode colorMode { get { return m_ColorMode; } }
/// <summary> /// <summary>
/// Play effect on enable. /// Play effect on enable.
/// </summary> /// </summary>
[System.Obsolete("Use Play/Stop method instead")] [System.Obsolete("Use Play/Stop method instead")]
public bool play { get { return _player.play; } set { _player.play = value; } } public bool play { get { return _player.play; } set { _player.play = value; } }
/// <summary> /// <summary>
/// Play effect loop. /// Play effect loop.
/// </summary> /// </summary>
[System.Obsolete] [System.Obsolete]
public bool loop { get { return _player.loop; } set { _player.loop = value; } } public bool loop { get { return _player.loop; } set { _player.loop = value; } }
/// <summary> /// <summary>
/// The duration for playing effect. /// The duration for playing effect.
/// </summary> /// </summary>
public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } } public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } }
/// <summary> /// <summary>
/// Delay on loop effect. /// Delay on loop effect.
/// </summary> /// </summary>
[System.Obsolete] [System.Obsolete]
public float loopDelay { get { return _player.loopDelay; } set { _player.loopDelay = Mathf.Max(value, 0); } } public float loopDelay { get { return _player.loopDelay; } set { _player.loopDelay = Mathf.Max(value, 0); } }
/// <summary> /// <summary>
/// Update mode for playing effect. /// Update mode for playing effect.
/// </summary> /// </summary>
public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } } public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } }
/// <summary> /// <summary>
/// Reverse the dissolve effect. /// Reverse the dissolve effect.
/// </summary> /// </summary>
public bool reverse { get { return m_Reverse; } set { m_Reverse = value; } } public bool reverse { get { return m_Reverse; } set { m_Reverse = value; } }
/// <summary> /// <summary>
/// Gets the parameter texture. /// Gets the parameter texture.
/// </summary> /// </summary>
public override ParameterTexture ptex { get { return _ptex; } } public override ParameterTexture ptex { get { return _ptex; } }
/// <summary> /// <summary>
/// Modifies the material. /// Modifies the material.
/// </summary> /// </summary>
public override void ModifyMaterial() public override void ModifyMaterial()
{ {
if (isTMPro) if (isTMPro)
{ {
return; return;
} }
ulong hash = (m_NoiseTexture ? (uint)m_NoiseTexture.GetInstanceID() : 0) + ((ulong)1 << 32) + ((ulong)m_ColorMode << 36); 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)) if (_materialCache != null && (_materialCache.hash != hash || !isActiveAndEnabled || !m_EffectMaterial))
{ {
MaterialCache.Unregister(_materialCache); MaterialCache.Unregister(_materialCache);
_materialCache = null; _materialCache = null;
} }
if (!isActiveAndEnabled || !m_EffectMaterial) if (!isActiveAndEnabled || !m_EffectMaterial)
{ {
material = null; material = null;
} }
else if (!m_NoiseTexture) else if (!m_NoiseTexture)
{ {
material = m_EffectMaterial; material = m_EffectMaterial;
} }
else if (_materialCache != null && _materialCache.hash == hash) else if (_materialCache != null && _materialCache.hash == hash)
{ {
material = _materialCache.material; material = _materialCache.material;
} }
else else
{ {
_materialCache = MaterialCache.Register(hash, m_NoiseTexture, () => _materialCache = MaterialCache.Register(hash, m_NoiseTexture, () =>
{ {
var mat = new Material(m_EffectMaterial); var mat = new Material(m_EffectMaterial);
mat.name += "_" + m_NoiseTexture.name; mat.name += "_" + m_NoiseTexture.name;
mat.SetTexture("_NoiseTex", m_NoiseTexture); mat.SetTexture("_NoiseTex", m_NoiseTexture);
return mat; return mat;
}); });
material = _materialCache.material; material = _materialCache.material;
} }
} }
/// <summary> /// <summary>
/// Modifies the mesh. /// Modifies the mesh.
/// </summary> /// </summary>
public override void ModifyMesh(VertexHelper vh) public override void ModifyMesh(VertexHelper vh)
{ {
if (!isActiveAndEnabled) if (!isActiveAndEnabled)
return; return;
bool isText = isTMPro || graphic is Text; bool isText = isTMPro || graphic is Text;
float normalizedIndex = ptex.GetNormalizedIndex(this); float normalizedIndex = ptex.GetNormalizedIndex(this);
// rect. // rect.
var tex = noiseTexture; var tex = noiseTexture;
var aspectRatio = m_KeepAspectRatio && tex ? ((float)tex.width) / tex.height : -1; var aspectRatio = m_KeepAspectRatio && tex ? ((float)tex.width) / tex.height : -1;
Rect rect = m_EffectArea.GetEffectArea(vh, rectTransform.rect, aspectRatio); Rect rect = m_EffectArea.GetEffectArea(vh, rectTransform.rect, aspectRatio);
// Calculate vertex position. // Calculate vertex position.
UIVertex vertex = default(UIVertex); UIVertex vertex = default(UIVertex);
float x, y; float x, y;
int count = vh.currentVertCount; int count = vh.currentVertCount;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
vh.PopulateUIVertex(ref vertex, i); vh.PopulateUIVertex(ref vertex, i);
m_EffectArea.GetPositionFactor (i, rect, vertex.position, isText, isTMPro, out x, out y); m_EffectArea.GetPositionFactor(i, rect, vertex.position, isText, isTMPro, out x, out y);
vertex.uv0 = new Vector2( vertex.uv0 = new Vector2(
Packer.ToFloat(vertex.uv0.x, vertex.uv0.y), Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
Packer.ToFloat(x, y, normalizedIndex) Packer.ToFloat(x, y, normalizedIndex)
); );
// if(!isTMPro) // if(!isTMPro)
// { // {
// vertex.uv0 = new Vector2( // vertex.uv0 = new Vector2(
// Packer.ToFloat(vertex.uv0.x, vertex.uv0.y), // Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
// Packer.ToFloat(x, y, normalizedIndex) // Packer.ToFloat(x, y, normalizedIndex)
// ); // );
// } // }
// #if UNITY_5_6_OR_NEWER // #if UNITY_5_6_OR_NEWER
// else // else
// { // {
// vertex.uv2 = new Vector2 ( // vertex.uv2 = new Vector2 (
// Packer.ToFloat (x, y, normalizedIndex), // Packer.ToFloat (x, y, normalizedIndex),
// 0 // 0
// ); // );
// } // }
// #endif // #endif
vh.SetUIVertex(vertex, i); vh.SetUIVertex(vertex, i);
} }
} }
protected override void SetDirty() protected override void SetDirty()
{ {
foreach(var m in materials) foreach (var m in materials)
{ {
ptex.RegisterMaterial (m); ptex.RegisterMaterial(m);
} }
ptex.SetData(this, 0, m_EffectFactor); // param1.x : location ptex.SetData(this, 0, m_EffectFactor); // param1.x : location
ptex.SetData(this, 1, m_Width); // param1.y : width ptex.SetData(this, 1, m_Width); // param1.y : width
ptex.SetData(this, 2, m_Softness); // param1.z : softness ptex.SetData(this, 2, m_Softness); // param1.z : softness
ptex.SetData(this, 4, m_Color.r); // param2.x : red ptex.SetData(this, 4, m_Color.r); // param2.x : red
ptex.SetData(this, 5, m_Color.g); // param2.y : green ptex.SetData(this, 5, m_Color.g); // param2.y : green
ptex.SetData(this, 6, m_Color.b); // param2.z : blue ptex.SetData(this, 6, m_Color.b); // param2.z : blue
} }
/// <summary> /// <summary>
/// Play effect. /// Play effect.
/// </summary> /// </summary>
public void Play(bool reset = true) public void Play(bool reset = true)
{ {
_player.Play(reset); _player.Play(reset);
} }
/// <summary> /// <summary>
/// Stop effect. /// Stop effect.
/// </summary> /// </summary>
public void Stop(bool reset = true) public void Stop(bool reset = true)
{ {
_player.Stop(reset); _player.Stop(reset);
} }
//################################ //################################
// Protected Members. // Protected Members.
//################################ //################################
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable(); base.OnEnable();
_player.OnEnable((f) => _player.OnEnable((f) =>
{ {
effectFactor = m_Reverse ? 1f - f : f; effectFactor = m_Reverse ? 1f - f : f;
}); });
} }
protected override void OnDisable() protected override void OnDisable()
{ {
base.OnDisable (); base.OnDisable();
MaterialCache.Unregister(_materialCache); MaterialCache.Unregister(_materialCache);
_materialCache = null; _materialCache = null;
_player.OnDisable(); _player.OnDisable();
} }
#if UNITY_EDITOR #if UNITY_EDITOR
/// <summary> /// <summary>
/// Gets the material. /// Gets the material.
/// </summary> /// </summary>
/// <returns>The material.</returns> /// <returns>The material.</returns>
protected override Material GetMaterial() protected override Material GetMaterial()
{ {
if (isTMPro) if (isTMPro)
{ {
return null; return null;
} }
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_ColorMode); return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_ColorMode);
} }
#pragma warning disable 0612 #pragma warning disable 0612
protected override void UpgradeIfNeeded() protected override void UpgradeIfNeeded()
{ {
// Upgrade for v3.0.0 // Upgrade for v3.0.0
if (IsShouldUpgrade(300)) if (IsShouldUpgrade(300))
{ {
_player.play = false; _player.play = false;
_player.duration = m_Duration; _player.duration = m_Duration;
_player.loop = false; _player.loop = false;
_player.loopDelay = 1; _player.loopDelay = 1;
_player.updateMode = m_UpdateMode; _player.updateMode = m_UpdateMode;
} }
} }
#pragma warning restore 0612 #pragma warning restore 0612
#endif #endif
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
MaterialCache _materialCache = null; MaterialCache _materialCache = null;
EffectPlayer _player{ get { return m_Player ?? (m_Player = new EffectPlayer()); } } EffectPlayer _player { get { return m_Player ?? (m_Player = new EffectPlayer()); } }
} }
} }

View File

@ -5,484 +5,490 @@ using UnityEngine.UI;
using UnityEngine.Serialization; using UnityEngine.Serialization;
#if UNITY_EDITOR #if UNITY_EDITOR
using System.IO;
using System.Linq; using System.Linq;
using UnityEditor; using UnityEditor;
#endif #endif
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// UIEffect. /// UIEffect.
/// </summary> /// </summary>
[ExecuteInEditMode] [ExecuteInEditMode]
[RequireComponent(typeof(Graphic))] [RequireComponent(typeof(Graphic))]
[DisallowMultipleComponent] [DisallowMultipleComponent]
[AddComponentMenu("UI/UIEffect/UIEffect", 1)] [AddComponentMenu("UI/UIEffect/UIEffect", 1)]
public class UIEffect : UIEffectBase public class UIEffect : UIEffectBase
{ {
//################################ //################################
// Constant or Static Members. // Constant or Static Members.
//################################ //################################
public const string shaderName = "UI/Hidden/UI-Effect"; public const string shaderName = "UI/Hidden/UI-Effect";
static readonly ParameterTexture _ptex = new ParameterTexture(4, 1024, "_ParamTex"); static readonly ParameterTexture _ptex = new ParameterTexture(4, 1024, "_ParamTex");
//################################ //################################
// Serialize Members. // Serialize Members.
//################################ //################################
[FormerlySerializedAs("m_ToneLevel")] [FormerlySerializedAs("m_ToneLevel")]
[Tooltip("Effect factor between 0(no effect) and 1(complete effect).")] [Tooltip("Effect factor between 0(no effect) and 1(complete effect).")]
[SerializeField][Range(0, 1)] float m_EffectFactor = 1; [SerializeField][Range(0, 1)] float m_EffectFactor = 1;
[Tooltip("Color effect factor between 0(no effect) and 1(complete effect).")] [Tooltip("Color effect factor between 0(no effect) and 1(complete effect).")]
[SerializeField][Range(0, 1)] float m_ColorFactor = 1; [SerializeField][Range(0, 1)] float m_ColorFactor = 1;
[FormerlySerializedAs("m_Blur")] [FormerlySerializedAs("m_Blur")]
[Tooltip("How far is the blurring from the graphic.")] [Tooltip("How far is the blurring from the graphic.")]
[SerializeField][Range(0, 1)] float m_BlurFactor = 1; [SerializeField][Range(0, 1)] float m_BlurFactor = 1;
[FormerlySerializedAs("m_ToneMode")] [FormerlySerializedAs("m_ToneMode")]
[Tooltip("Effect mode")] [Tooltip("Effect mode")]
[SerializeField] EffectMode m_EffectMode = EffectMode.None; [SerializeField] EffectMode m_EffectMode = EffectMode.None;
[Tooltip("Color effect mode")] [Tooltip("Color effect mode")]
[SerializeField] ColorMode m_ColorMode = ColorMode.Multiply; [SerializeField] ColorMode m_ColorMode = ColorMode.Multiply;
[Tooltip("Blur effect mode")] [Tooltip("Blur effect mode")]
[SerializeField] BlurMode m_BlurMode = BlurMode.None; [SerializeField] BlurMode m_BlurMode = BlurMode.None;
[Tooltip("Advanced blurring remove common artifacts in the blur effect for uGUI.")] [Tooltip("Advanced blurring remove common artifacts in the blur effect for uGUI.")]
[SerializeField] bool m_AdvancedBlur = false; [SerializeField] bool m_AdvancedBlur = false;
#pragma warning disable 0414 #pragma warning disable 0414
[Obsolete][HideInInspector] [Obsolete]
[SerializeField][Range(0, 1)] float m_ShadowBlur = 1; [HideInInspector]
[Obsolete][HideInInspector] [SerializeField][Range(0, 1)] float m_ShadowBlur = 1;
[SerializeField] ShadowStyle m_ShadowStyle; [Obsolete]
[Obsolete][HideInInspector] [HideInInspector]
[SerializeField] Color m_ShadowColor = Color.black; [SerializeField] ShadowStyle m_ShadowStyle;
[Obsolete][HideInInspector] [Obsolete]
[SerializeField] Vector2 m_EffectDistance = new Vector2(1f, -1f); [HideInInspector]
[Obsolete][HideInInspector] [SerializeField] Color m_ShadowColor = Color.black;
[SerializeField] bool m_UseGraphicAlpha = true; [Obsolete]
[Obsolete][HideInInspector] [HideInInspector]
[SerializeField] Color m_EffectColor = Color.white; [SerializeField] Vector2 m_EffectDistance = new Vector2(1f, -1f);
[Obsolete][HideInInspector] [Obsolete]
[SerializeField] List<UIShadow.AdditionalShadow> m_AdditionalShadows = new List<UIShadow.AdditionalShadow>(); [HideInInspector]
#pragma warning restore 0414 [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 public enum BlurEx
{ {
None = 0, None = 0,
Ex = 1, Ex = 1,
} }
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
#if UNITY_2017_1_OR_NEWER #if UNITY_2017_1_OR_NEWER
public override AdditionalCanvasShaderChannels requiredChannels public override AdditionalCanvasShaderChannels requiredChannels
{ {
get get
{ {
if (advancedBlur) if (advancedBlur)
{ {
return isTMPro return isTMPro
? AdditionalCanvasShaderChannels.TexCoord1 | AdditionalCanvasShaderChannels.TexCoord2 ? AdditionalCanvasShaderChannels.TexCoord1 | AdditionalCanvasShaderChannels.TexCoord2
: AdditionalCanvasShaderChannels.TexCoord1; : AdditionalCanvasShaderChannels.TexCoord1;
} }
return AdditionalCanvasShaderChannels.None; return AdditionalCanvasShaderChannels.None;
} }
} }
#endif #endif
/// <summary> /// <summary>
/// Effect factor between 0(no effect) and 1(complete effect). /// Effect factor between 0(no effect) and 1(complete effect).
/// </summary> /// </summary>
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")] [System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
public float toneLevel public float toneLevel
{ {
get { return m_EffectFactor; } get { return m_EffectFactor; }
set set
{ {
m_EffectFactor = Mathf.Clamp(value, 0, 1); m_EffectFactor = Mathf.Clamp(value, 0, 1);
SetDirty(); SetDirty();
} }
} }
/// <summary> /// <summary>
/// Effect factor between 0(no effect) and 1(complete effect). /// Effect factor between 0(no effect) and 1(complete effect).
/// </summary> /// </summary>
public float effectFactor public float effectFactor
{ {
get { return m_EffectFactor; } get { return m_EffectFactor; }
set set
{ {
m_EffectFactor = Mathf.Clamp(value, 0, 1); m_EffectFactor = Mathf.Clamp(value, 0, 1);
SetDirty(); SetDirty();
} }
} }
/// <summary> /// <summary>
/// Color effect factor between 0(no effect) and 1(complete effect). /// Color effect factor between 0(no effect) and 1(complete effect).
/// </summary> /// </summary>
public float colorFactor public float colorFactor
{ {
get { return m_ColorFactor; } get { return m_ColorFactor; }
set set
{ {
m_ColorFactor = Mathf.Clamp(value, 0, 1); m_ColorFactor = Mathf.Clamp(value, 0, 1);
SetDirty(); SetDirty();
} }
} }
/// <summary> /// <summary>
/// How far is the blurring from the graphic. /// How far is the blurring from the graphic.
/// </summary> /// </summary>
[System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")] [System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")]
public float blur public float blur
{ {
get { return m_BlurFactor; } get { return m_BlurFactor; }
set set
{ {
m_BlurFactor = Mathf.Clamp(value, 0, 1); m_BlurFactor = Mathf.Clamp(value, 0, 1);
SetDirty(); SetDirty();
} }
} }
/// <summary> /// <summary>
/// How far is the blurring from the graphic. /// How far is the blurring from the graphic.
/// </summary> /// </summary>
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")] [System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
public float blurFactor public float blurFactor
{ {
get { return m_BlurFactor; } get { return m_BlurFactor; }
set set
{ {
m_BlurFactor = Mathf.Clamp(value, 0, 1); m_BlurFactor = Mathf.Clamp(value, 0, 1);
SetDirty(); SetDirty();
} }
} }
/// <summary> /// <summary>
/// Effect mode(readonly). /// Effect mode(readonly).
/// </summary> /// </summary>
[System.Obsolete("Use effectMode instead (UnityUpgradable) -> effectMode")] [System.Obsolete("Use effectMode instead (UnityUpgradable) -> effectMode")]
public EffectMode toneMode { get { return m_EffectMode; } } public EffectMode toneMode { get { return m_EffectMode; } }
/// <summary> /// <summary>
/// Effect mode(readonly). /// Effect mode(readonly).
/// </summary> /// </summary>
public EffectMode effectMode { get { return m_EffectMode; } } public EffectMode effectMode { get { return m_EffectMode; } }
/// <summary> /// <summary>
/// Color effect mode(readonly). /// Color effect mode(readonly).
/// </summary> /// </summary>
public ColorMode colorMode { get { return m_ColorMode; } } public ColorMode colorMode { get { return m_ColorMode; } }
/// <summary> /// <summary>
/// Blur effect mode(readonly). /// Blur effect mode(readonly).
/// </summary> /// </summary>
public BlurMode blurMode { get { return m_BlurMode; } } public BlurMode blurMode { get { return m_BlurMode; } }
/// <summary> /// <summary>
/// Color for the color effect. /// Color for the color effect.
/// </summary> /// </summary>
public Color effectColor public Color effectColor
{ {
get { return graphic.color; } get { return graphic.color; }
set set
{ {
graphic.color = value; graphic.color = value;
SetDirty(); SetDirty();
} }
} }
/// <summary> /// <summary>
/// Gets the parameter texture. /// Gets the parameter texture.
/// </summary> /// </summary>
public override ParameterTexture ptex { get { return _ptex; } } public override ParameterTexture ptex { get { return _ptex; } }
/// <summary> /// <summary>
/// Advanced blurring remove common artifacts in the blur effect for uGUI. /// Advanced blurring remove common artifacts in the blur effect for uGUI.
/// </summary> /// </summary>
public bool advancedBlur { get { return isTMPro ? (material && material.IsKeywordEnabled("EX")) : m_AdvancedBlur; } } public bool advancedBlur { get { return isTMPro ? (material && material.IsKeywordEnabled("EX")) : m_AdvancedBlur; } }
/// <summary> /// <summary>
/// Modifies the mesh. /// Modifies the mesh.
/// </summary> /// </summary>
public override void ModifyMesh(VertexHelper vh) public override void ModifyMesh(VertexHelper vh)
{ {
if (!isActiveAndEnabled) if (!isActiveAndEnabled)
{ {
return; return;
} }
float normalizedIndex = ptex.GetNormalizedIndex(this); float normalizedIndex = ptex.GetNormalizedIndex(this);
if (m_BlurMode != BlurMode.None && advancedBlur) if (m_BlurMode != BlurMode.None && advancedBlur)
{ {
vh.GetUIVertexStream(tempVerts); vh.GetUIVertexStream(tempVerts);
vh.Clear(); vh.Clear();
var count = tempVerts.Count; var count = tempVerts.Count;
// Bundle // Bundle
int bundleSize = (targetGraphic is Text || isTMPro) ? 6 : count; int bundleSize = (targetGraphic is Text || isTMPro) ? 6 : count;
Rect posBounds = default(Rect); Rect posBounds = default(Rect);
Rect uvBounds = default(Rect); Rect uvBounds = default(Rect);
Vector3 size = default(Vector3); Vector3 size = default(Vector3);
Vector3 tPos = default(Vector3); Vector3 tPos = default(Vector3);
Vector3 tUV = default(Vector3); Vector3 tUV = default(Vector3);
float expand = (float)blurMode * 6 * 2; float expand = (float)blurMode * 6 * 2;
for (int i = 0; i < count; i += bundleSize) for (int i = 0; i < count; i += bundleSize)
{ {
// min/max for bundled-quad // min/max for bundled-quad
GetBounds(tempVerts, i, bundleSize, ref posBounds, ref uvBounds, true); GetBounds(tempVerts, i, bundleSize, ref posBounds, ref uvBounds, true);
// Pack uv mask. // Pack uv mask.
Vector2 uvMask = new Vector2(Packer.ToFloat(uvBounds.xMin, uvBounds.yMin), Packer.ToFloat(uvBounds.xMax, uvBounds.yMax)); Vector2 uvMask = new Vector2(Packer.ToFloat(uvBounds.xMin, uvBounds.yMin), Packer.ToFloat(uvBounds.xMax, uvBounds.yMax));
// Quad // Quad
for (int j = 0; j < bundleSize; j += 6) for (int j = 0; j < bundleSize; j += 6)
{ {
Vector3 cornerPos1 = tempVerts[i + j + 1].position; Vector3 cornerPos1 = tempVerts[i + j + 1].position;
Vector3 cornerPos2 = tempVerts[i + j + 4].position; Vector3 cornerPos2 = tempVerts[i + j + 4].position;
// Is outer quad? // Is outer quad?
bool hasOuterEdge = (bundleSize == 6) bool hasOuterEdge = (bundleSize == 6)
|| !posBounds.Contains(cornerPos1) || !posBounds.Contains(cornerPos1)
|| !posBounds.Contains(cornerPos2); || !posBounds.Contains(cornerPos2);
if (hasOuterEdge) if (hasOuterEdge)
{ {
Vector3 cornerUv1 = tempVerts[i + j + 1].uv0; Vector3 cornerUv1 = tempVerts[i + j + 1].uv0;
Vector3 cornerUv2 = tempVerts[i + j + 4].uv0; Vector3 cornerUv2 = tempVerts[i + j + 4].uv0;
Vector3 centerPos = (cornerPos1 + cornerPos2) / 2; Vector3 centerPos = (cornerPos1 + cornerPos2) / 2;
Vector3 centerUV = (cornerUv1 + cornerUv2) / 2; Vector3 centerUV = (cornerUv1 + cornerUv2) / 2;
size = (cornerPos1 - cornerPos2); size = (cornerPos1 - cornerPos2);
size.x = 1 + expand / Mathf.Abs(size.x); size.x = 1 + expand / Mathf.Abs(size.x);
size.y = 1 + expand / Mathf.Abs(size.y); size.y = 1 + expand / Mathf.Abs(size.y);
size.z = 1 + expand / Mathf.Abs(size.z); size.z = 1 + expand / Mathf.Abs(size.z);
tPos = centerPos - Vector3.Scale(size, centerPos); tPos = centerPos - Vector3.Scale(size, centerPos);
tUV = centerUV - Vector3.Scale(size, centerUV); tUV = centerUV - Vector3.Scale(size, centerUV);
} }
// Vertex // Vertex
for (int k = 0; k < 6; k++) for (int k = 0; k < 6; k++)
{ {
UIVertex vt = tempVerts[i + j + k]; UIVertex vt = tempVerts[i + j + k];
Vector3 pos = vt.position; Vector3 pos = vt.position;
Vector2 uv0 = vt.uv0; Vector2 uv0 = vt.uv0;
if (hasOuterEdge && (pos.x < posBounds.xMin || posBounds.xMax < pos.x)) if (hasOuterEdge && (pos.x < posBounds.xMin || posBounds.xMax < pos.x))
{ {
pos.x = pos.x * size.x + tPos.x; pos.x = pos.x * size.x + tPos.x;
uv0.x = uv0.x * size.x + tUV.x; uv0.x = uv0.x * size.x + tUV.x;
} }
if (hasOuterEdge && (pos.y < posBounds.yMin || posBounds.yMax < pos.y)) if (hasOuterEdge && (pos.y < posBounds.yMin || posBounds.yMax < pos.y))
{ {
pos.y = pos.y * size.y + tPos.y; pos.y = pos.y * size.y + tPos.y;
uv0.y = uv0.y * size.y + tUV.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.uv0 = new Vector2(Packer.ToFloat((uv0.x + 0.5f) / 2f, (uv0.y + 0.5f) / 2f), normalizedIndex);
vt.position = pos; vt.position = pos;
if (isTMPro) if (isTMPro)
{ {
#if UNITY_2017_1_OR_NEWER #if UNITY_2017_1_OR_NEWER
vt.uv2 = uvMask; vt.uv2 = uvMask;
#endif #endif
} }
else else
{ {
vt.uv1 = uvMask; vt.uv1 = uvMask;
} }
tempVerts[i + j + k] = vt; tempVerts[i + j + k] = vt;
} }
} }
} }
vh.AddUIVertexTriangleStream(tempVerts); vh.AddUIVertexTriangleStream(tempVerts);
tempVerts.Clear(); tempVerts.Clear();
} }
else else
{ {
int count = vh.currentVertCount; int count = vh.currentVertCount;
UIVertex vt = default(UIVertex); UIVertex vt = default(UIVertex);
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
vh.PopulateUIVertex(ref vt, i); vh.PopulateUIVertex(ref vt, i);
Vector2 uv0 = vt.uv0; Vector2 uv0 = vt.uv0;
vt.uv0 = new Vector2( vt.uv0 = new Vector2(
Packer.ToFloat((uv0.x + 0.5f) / 2f, (uv0.y + 0.5f) / 2f), Packer.ToFloat((uv0.x + 0.5f) / 2f, (uv0.y + 0.5f) / 2f),
normalizedIndex normalizedIndex
); );
vh.SetUIVertex(vt, i); vh.SetUIVertex(vt, i);
} }
} }
} }
protected override void SetDirty() protected override void SetDirty()
{ {
foreach (var m in materials) foreach (var m in materials)
{ {
ptex.RegisterMaterial (m); ptex.RegisterMaterial(m);
} }
ptex.SetData(this, 0, m_EffectFactor); // param.x : effect factor ptex.SetData(this, 0, m_EffectFactor); // param.x : effect factor
ptex.SetData(this, 1, m_ColorFactor); // param.y : color factor ptex.SetData(this, 1, m_ColorFactor); // param.y : color factor
ptex.SetData(this, 2, m_BlurFactor); // param.z : blur factor ptex.SetData(this, 2, m_BlurFactor); // param.z : blur factor
} }
#if UNITY_EDITOR #if UNITY_EDITOR
/// <summary> /// <summary>
/// Gets the material. /// Gets the material.
/// </summary> /// </summary>
/// <returns>The material.</returns> /// <returns>The material.</returns>
protected override Material GetMaterial() protected override Material GetMaterial()
{ {
if (isTMPro) if (isTMPro)
{ {
return null; return null;
} }
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode, m_ColorMode, m_BlurMode, m_AdvancedBlur ? BlurEx.Ex : BlurEx.None); return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode, m_ColorMode, m_BlurMode, m_AdvancedBlur ? BlurEx.Ex : BlurEx.None);
} }
#pragma warning disable 0612 #pragma warning disable 0612
protected override void UpgradeIfNeeded() protected override void UpgradeIfNeeded()
{ {
// Upgrade for v3.0.0 // Upgrade for v3.0.0
if (IsShouldUpgrade(300)) if (IsShouldUpgrade(300))
{ {
if (m_ColorMode != ColorMode.Multiply) if (m_ColorMode != ColorMode.Multiply)
{ {
Color col = targetGraphic.color; Color col = targetGraphic.color;
col.r = m_EffectColor.r; col.r = m_EffectColor.r;
col.g = m_EffectColor.g; col.g = m_EffectColor.g;
col.b = m_EffectColor.b; col.b = m_EffectColor.b;
targetGraphic.color = col; targetGraphic.color = col;
m_ColorFactor = m_EffectColor.a; m_ColorFactor = m_EffectColor.a;
} }
if (m_ShadowStyle != ShadowStyle.None || m_AdditionalShadows.Any(x => x.style != ShadowStyle.None)) if (m_ShadowStyle != ShadowStyle.None || m_AdditionalShadows.Any(x => x.style != ShadowStyle.None))
{ {
if (m_ShadowStyle != ShadowStyle.None) if (m_ShadowStyle != ShadowStyle.None)
{ {
var shadow = gameObject.GetComponent<UIShadow>() ?? gameObject.AddComponent<UIShadow>(); var shadow = gameObject.GetComponent<UIShadow>() ?? gameObject.AddComponent<UIShadow>();
shadow.style = m_ShadowStyle; shadow.style = m_ShadowStyle;
shadow.effectDistance = m_EffectDistance; shadow.effectDistance = m_EffectDistance;
shadow.effectColor = m_ShadowColor; shadow.effectColor = m_ShadowColor;
shadow.useGraphicAlpha = m_UseGraphicAlpha; shadow.useGraphicAlpha = m_UseGraphicAlpha;
shadow.blurFactor = m_ShadowBlur; shadow.blurFactor = m_ShadowBlur;
} }
foreach (var s in m_AdditionalShadows) foreach (var s in m_AdditionalShadows)
{ {
if (s.style == ShadowStyle.None) if (s.style == ShadowStyle.None)
{ {
continue; continue;
} }
var shadow = gameObject.AddComponent<UIShadow>(); var shadow = gameObject.AddComponent<UIShadow>();
shadow.style = s.style; shadow.style = s.style;
shadow.effectDistance = s.effectDistance; shadow.effectDistance = s.effectDistance;
shadow.effectColor = s.effectColor; shadow.effectColor = s.effectColor;
shadow.useGraphicAlpha = s.useGraphicAlpha; shadow.useGraphicAlpha = s.useGraphicAlpha;
shadow.blurFactor = s.blur; shadow.blurFactor = s.blur;
} }
m_ShadowStyle = ShadowStyle.None; m_ShadowStyle = ShadowStyle.None;
m_AdditionalShadows = null; m_AdditionalShadows = null;
if (m_EffectMode == EffectMode.None && m_ColorMode == ColorMode.Multiply && m_BlurMode == BlurMode.None) if (m_EffectMode == EffectMode.None && m_ColorMode == ColorMode.Multiply && m_BlurMode == BlurMode.None)
{ {
DestroyImmediate(this, true); DestroyImmediate(this, true);
} }
} }
int tone = (int)m_EffectMode; int tone = (int)m_EffectMode;
const int Mono = 5; const int Mono = 5;
const int Cutoff = 6; const int Cutoff = 6;
const int Hue = 7; const int Hue = 7;
if (tone == Hue) if (tone == Hue)
{ {
var go = gameObject; var go = gameObject;
var hue = m_EffectFactor; var hue = m_EffectFactor;
DestroyImmediate(this, true); DestroyImmediate(this, true);
var hsv = go.GetComponent<UIHsvModifier>() ?? go.AddComponent<UIHsvModifier>(); var hsv = go.GetComponent<UIHsvModifier>() ?? go.AddComponent<UIHsvModifier>();
hsv.hue = hue; hsv.hue = hue;
hsv.range = 1; hsv.range = 1;
} }
// Cutoff/Mono // Cutoff/Mono
if (tone == Cutoff || tone == Mono) if (tone == Cutoff || tone == Mono)
{ {
var go = gameObject; var go = gameObject;
var factor = m_EffectFactor; var factor = m_EffectFactor;
var transitionMode = tone == Cutoff var transitionMode = tone == Cutoff
? UITransitionEffect.EffectMode.Cutoff ? UITransitionEffect.EffectMode.Cutoff
: UITransitionEffect.EffectMode.Fade; : UITransitionEffect.EffectMode.Fade;
DestroyImmediate(this, true); DestroyImmediate(this, true);
var trans = go.GetComponent<UITransitionEffect>() ?? go.AddComponent<UITransitionEffect>(); var trans = go.GetComponent<UITransitionEffect>() ?? go.AddComponent<UITransitionEffect>();
trans.effectFactor = factor; trans.effectFactor = factor;
var sp = new SerializedObject(trans).FindProperty("m_EffectMode"); var sp = new SerializedObject(trans).FindProperty("m_EffectMode");
sp.intValue = (int)transitionMode; sp.intValue = (int)transitionMode;
sp.serializedObject.ApplyModifiedProperties(); sp.serializedObject.ApplyModifiedProperties();
} }
} }
} }
#pragma warning restore 0612 #pragma warning restore 0612
#endif #endif
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
static void GetBounds(List<UIVertex> verts, int start, int count, ref Rect posBounds, ref Rect uvBounds, bool global) 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 minPos = new Vector2(float.MaxValue, float.MaxValue);
Vector2 maxPos = new Vector2(float.MinValue, float.MinValue); Vector2 maxPos = new Vector2(float.MinValue, float.MinValue);
Vector2 minUV = new Vector2(float.MaxValue, float.MaxValue); Vector2 minUV = new Vector2(float.MaxValue, float.MaxValue);
Vector2 maxUV = new Vector2(float.MinValue, float.MinValue); Vector2 maxUV = new Vector2(float.MinValue, float.MinValue);
for (int i = start; i < start + count; i++) for (int i = start; i < start + count; i++)
{ {
UIVertex vt = verts[i]; UIVertex vt = verts[i];
Vector2 uv = vt.uv0; Vector2 uv = vt.uv0;
Vector3 pos = vt.position; Vector3 pos = vt.position;
// Left-Bottom // Left-Bottom
if (minPos.x >= pos.x && minPos.y >= pos.y) if (minPos.x >= pos.x && minPos.y >= pos.y)
{ {
minPos = pos; minPos = pos;
} }
// Right-Top // Right-Top
else if (maxPos.x <= pos.x && maxPos.y <= pos.y) else if (maxPos.x <= pos.x && maxPos.y <= pos.y)
{ {
maxPos = pos; maxPos = pos;
} }
// Left-Bottom // Left-Bottom
if (minUV.x >= uv.x && minUV.y >= uv.y) if (minUV.x >= uv.x && minUV.y >= uv.y)
{ {
minUV = uv; minUV = uv;
} }
// Right-Top // Right-Top
else if (maxUV.x <= uv.x && maxUV.y <= uv.y) else if (maxUV.x <= uv.x && maxUV.y <= uv.y)
{ {
maxUV = uv; maxUV = uv;
} }
} }
// Shrink coordinate for detect edge // 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); 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); uvBounds.Set(minUV.x, minUV.y, maxUV.x - minUV.x, maxUV.y - minUV.y);
} }
} }
} }

View File

@ -1,552 +1,552 @@
using System.Collections; using System.Collections;
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.Rendering; using UnityEngine.Rendering;
using UnityEngine.Serialization;
using UnityEngine.UI; using UnityEngine.UI;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// UIEffectCapturedImage /// UIEffectCapturedImage
/// </summary> /// </summary>
[AddComponentMenu("UI/UIEffect/UIEffectCapturedImage", 200)] [AddComponentMenu("UI/UIEffect/UIEffectCapturedImage", 200)]
public class UIEffectCapturedImage : RawImage public class UIEffectCapturedImage : RawImage
#if UNITY_EDITOR #if UNITY_EDITOR
, ISerializationCallbackReceiver , ISerializationCallbackReceiver
#endif #endif
{ {
//################################ //################################
// Constant or Static Members. // Constant or Static Members.
//################################ //################################
public const string shaderName = "UI/Hidden/UI-EffectCapture"; public const string shaderName = "UI/Hidden/UI-EffectCapture";
/// <summary> /// <summary>
/// Desampling rate. /// Desampling rate.
/// </summary> /// </summary>
public enum DesamplingRate public enum DesamplingRate
{ {
None = 0, None = 0,
x1 = 1, x1 = 1,
x2 = 2, x2 = 2,
x4 = 4, x4 = 4,
x8 = 8, x8 = 8,
} }
//################################ //################################
// Serialize Members. // Serialize Members.
//################################ //################################
[Tooltip("Effect factor between 0(no effect) and 1(complete effect).")] [Tooltip("Effect factor between 0(no effect) and 1(complete effect).")]
[FormerlySerializedAs("m_ToneLevel")] [FormerlySerializedAs("m_ToneLevel")]
[SerializeField][Range(0, 1)] float m_EffectFactor = 1; [SerializeField][Range(0, 1)] float m_EffectFactor = 1;
[Tooltip("Color effect factor between 0(no effect) and 1(complete effect).")] [Tooltip("Color effect factor between 0(no effect) and 1(complete effect).")]
[SerializeField][Range(0, 1)] float m_ColorFactor = 1; [SerializeField][Range(0, 1)] float m_ColorFactor = 1;
[Tooltip("How far is the blurring from the graphic.")] [Tooltip("How far is the blurring from the graphic.")]
[FormerlySerializedAs("m_Blur")] [FormerlySerializedAs("m_Blur")]
[SerializeField][Range(0, 1)] float m_BlurFactor = 1; [SerializeField][Range(0, 1)] float m_BlurFactor = 1;
[Tooltip("Effect mode.")] [Tooltip("Effect mode.")]
[FormerlySerializedAs("m_ToneMode")] [FormerlySerializedAs("m_ToneMode")]
[SerializeField] EffectMode m_EffectMode = EffectMode.None; [SerializeField] EffectMode m_EffectMode = EffectMode.None;
[Tooltip("Color effect mode.")] [Tooltip("Color effect mode.")]
[SerializeField] ColorMode m_ColorMode = ColorMode.Multiply; [SerializeField] ColorMode m_ColorMode = ColorMode.Multiply;
[Tooltip("Blur effect mode.")] [Tooltip("Blur effect mode.")]
[SerializeField] BlurMode m_BlurMode = BlurMode.DetailBlur; [SerializeField] BlurMode m_BlurMode = BlurMode.DetailBlur;
[Tooltip("Color for the color effect.")] [Tooltip("Color for the color effect.")]
[SerializeField] Color m_EffectColor = Color.white; [SerializeField] Color m_EffectColor = Color.white;
[Tooltip("Desampling rate of the generated RenderTexture.")] [Tooltip("Desampling rate of the generated RenderTexture.")]
[SerializeField] DesamplingRate m_DesamplingRate = DesamplingRate.x1; [SerializeField] DesamplingRate m_DesamplingRate = DesamplingRate.x1;
[Tooltip("Desampling rate of reduction buffer to apply effect.")] [Tooltip("Desampling rate of reduction buffer to apply effect.")]
[SerializeField] DesamplingRate m_ReductionRate = DesamplingRate.x1; [SerializeField] DesamplingRate m_ReductionRate = DesamplingRate.x1;
[Tooltip("FilterMode for capturing.")] [Tooltip("FilterMode for capturing.")]
[SerializeField] FilterMode m_FilterMode = FilterMode.Bilinear; [SerializeField] FilterMode m_FilterMode = FilterMode.Bilinear;
[Tooltip("Effect material.")] [Tooltip("Effect material.")]
[SerializeField] Material m_EffectMaterial = null; [SerializeField] Material m_EffectMaterial = null;
[Tooltip("Blur iterations.")] [Tooltip("Blur iterations.")]
[FormerlySerializedAs("m_Iterations")] [FormerlySerializedAs("m_Iterations")]
[SerializeField][Range(1, 8)] int m_BlurIterations = 3; [SerializeField][Range(1, 8)] int m_BlurIterations = 3;
[Tooltip("Fits graphic size to screen on captured.")] [Tooltip("Fits graphic size to screen on captured.")]
[FormerlySerializedAs("m_KeepCanvasSize")] [FormerlySerializedAs("m_KeepCanvasSize")]
[SerializeField] bool m_FitToScreen = true; [SerializeField] bool m_FitToScreen = true;
[Tooltip("Capture automatically on enable.")] [Tooltip("Capture automatically on enable.")]
[SerializeField] bool m_CaptureOnEnable = false; [SerializeField] bool m_CaptureOnEnable = false;
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
/// <summary> /// <summary>
/// Effect factor between 0(no effect) and 1(complete effect). /// Effect factor between 0(no effect) and 1(complete effect).
/// </summary> /// </summary>
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")] [System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
public float toneLevel { get { return m_EffectFactor; } set { m_EffectFactor = Mathf.Clamp(value, 0, 1); } } public float toneLevel { get { return m_EffectFactor; } set { m_EffectFactor = Mathf.Clamp(value, 0, 1); } }
/// <summary> /// <summary>
/// Effect factor between 0(no effect) and 1(complete effect). /// Effect factor between 0(no effect) and 1(complete effect).
/// </summary> /// </summary>
public float effectFactor { get { return m_EffectFactor; } set { m_EffectFactor = Mathf.Clamp(value, 0, 1); } } public float effectFactor { get { return m_EffectFactor; } set { m_EffectFactor = Mathf.Clamp(value, 0, 1); } }
/// <summary> /// <summary>
/// Color effect factor between 0(no effect) and 1(complete effect). /// Color effect factor between 0(no effect) and 1(complete effect).
/// </summary> /// </summary>
public float colorFactor { get { return m_ColorFactor; } set { m_ColorFactor = Mathf.Clamp(value, 0, 1); } } public float colorFactor { get { return m_ColorFactor; } set { m_ColorFactor = Mathf.Clamp(value, 0, 1); } }
/// <summary> /// <summary>
/// How far is the blurring from the graphic. /// How far is the blurring from the graphic.
/// </summary> /// </summary>
[System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")] [System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")]
public float blur { get { return m_BlurFactor; } set { m_BlurFactor = Mathf.Clamp(value, 0, 4); } } public float blur { get { return m_BlurFactor; } set { m_BlurFactor = Mathf.Clamp(value, 0, 4); } }
/// <summary> /// <summary>
/// How far is the blurring from the graphic. /// How far is the blurring from the graphic.
/// </summary> /// </summary>
public float blurFactor { get { return m_BlurFactor; } set { m_BlurFactor = Mathf.Clamp(value, 0, 4); } } public float blurFactor { get { return m_BlurFactor; } set { m_BlurFactor = Mathf.Clamp(value, 0, 4); } }
/// <summary> /// <summary>
/// Tone effect mode. /// Tone effect mode.
/// </summary> /// </summary>
[System.Obsolete("Use effectMode instead (UnityUpgradable) -> effectMode")] [System.Obsolete("Use effectMode instead (UnityUpgradable) -> effectMode")]
public EffectMode toneMode { get { return m_EffectMode; } } public EffectMode toneMode { get { return m_EffectMode; } }
/// <summary> /// <summary>
/// Effect mode. /// Effect mode.
/// </summary> /// </summary>
public EffectMode effectMode { get { return m_EffectMode; } } public EffectMode effectMode { get { return m_EffectMode; } }
/// <summary> /// <summary>
/// Color effect mode. /// Color effect mode.
/// </summary> /// </summary>
public ColorMode colorMode { get { return m_ColorMode; } } public ColorMode colorMode { get { return m_ColorMode; } }
/// <summary> /// <summary>
/// Blur effect mode. /// Blur effect mode.
/// </summary> /// </summary>
public BlurMode blurMode { get { return m_BlurMode; } } public BlurMode blurMode { get { return m_BlurMode; } }
/// <summary> /// <summary>
/// Color for the color effect. /// Color for the color effect.
/// </summary> /// </summary>
public Color effectColor { get { return m_EffectColor; } set { m_EffectColor = value; } } public Color effectColor { get { return m_EffectColor; } set { m_EffectColor = value; } }
/// <summary> /// <summary>
/// Effect material. /// Effect material.
/// </summary> /// </summary>
public virtual Material effectMaterial { get { return m_EffectMaterial; } } public virtual Material effectMaterial { get { return m_EffectMaterial; } }
/// <summary> /// <summary>
/// Desampling rate of the generated RenderTexture. /// Desampling rate of the generated RenderTexture.
/// </summary> /// </summary>
public DesamplingRate desamplingRate { get { return m_DesamplingRate; } set { m_DesamplingRate = value; } } public DesamplingRate desamplingRate { get { return m_DesamplingRate; } set { m_DesamplingRate = value; } }
/// <summary> /// <summary>
/// Desampling rate of reduction buffer to apply effect. /// Desampling rate of reduction buffer to apply effect.
/// </summary> /// </summary>
public DesamplingRate reductionRate { get { return m_ReductionRate; } set { m_ReductionRate = value; } } public DesamplingRate reductionRate { get { return m_ReductionRate; } set { m_ReductionRate = value; } }
/// <summary> /// <summary>
/// FilterMode for capturing. /// FilterMode for capturing.
/// </summary> /// </summary>
public FilterMode filterMode { get { return m_FilterMode; } set { m_FilterMode = value; } } public FilterMode filterMode { get { return m_FilterMode; } set { m_FilterMode = value; } }
/// <summary> /// <summary>
/// Captured texture. /// Captured texture.
/// </summary> /// </summary>
public RenderTexture capturedTexture { get { return _rt; } } public RenderTexture capturedTexture { get { return _rt; } }
/// <summary> /// <summary>
/// Blur iterations. /// Blur iterations.
/// </summary> /// </summary>
[System.Obsolete("Use blurIterations instead (UnityUpgradable) -> blurIterations")] [System.Obsolete("Use blurIterations instead (UnityUpgradable) -> blurIterations")]
public int iterations { get { return m_BlurIterations; } set { m_BlurIterations = value; } } public int iterations { get { return m_BlurIterations; } set { m_BlurIterations = value; } }
/// <summary> /// <summary>
/// Blur iterations. /// Blur iterations.
/// </summary> /// </summary>
public int blurIterations { get { return m_BlurIterations; } set { m_BlurIterations = value; } } public int blurIterations { get { return m_BlurIterations; } set { m_BlurIterations = value; } }
/// <summary> /// <summary>
/// Fits graphic size to screen. /// Fits graphic size to screen.
/// </summary> /// </summary>
[System.Obsolete("Use fitToScreen instead (UnityUpgradable) -> fitToScreen")] [System.Obsolete("Use fitToScreen instead (UnityUpgradable) -> fitToScreen")]
public bool keepCanvasSize { get { return m_FitToScreen; } set { m_FitToScreen = value; } } public bool keepCanvasSize { get { return m_FitToScreen; } set { m_FitToScreen = value; } }
/// <summary> /// <summary>
/// Fits graphic size to screen on captured. /// Fits graphic size to screen on captured.
/// </summary> /// </summary>
public bool fitToScreen { get { return m_FitToScreen; } set { m_FitToScreen = value; } } public bool fitToScreen { get { return m_FitToScreen; } set { m_FitToScreen = value; } }
/// <summary> /// <summary>
/// Target RenderTexture to capture. /// Target RenderTexture to capture.
/// </summary> /// </summary>
[System.Obsolete] [System.Obsolete]
public RenderTexture targetTexture { get { return null; } set { } } public RenderTexture targetTexture { get { return null; } set { } }
/// <summary> /// <summary>
/// Capture automatically on enable. /// Capture automatically on enable.
/// </summary> /// </summary>
public bool captureOnEnable { get { return m_CaptureOnEnable; } set { m_CaptureOnEnable = value; } } public bool captureOnEnable { get { return m_CaptureOnEnable; } set { m_CaptureOnEnable = value; } }
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable(); base.OnEnable();
if (m_CaptureOnEnable && Application.isPlaying) if (m_CaptureOnEnable && Application.isPlaying)
{ {
Capture(); Capture();
} }
} }
protected override void OnDisable() protected override void OnDisable()
{ {
base.OnDisable(); base.OnDisable();
if (m_CaptureOnEnable && Application.isPlaying) if (m_CaptureOnEnable && Application.isPlaying)
{ {
_Release(false); _Release(false);
texture = null; texture = null;
} }
} }
/// <summary> /// <summary>
/// This function is called when the MonoBehaviour will be destroyed. /// This function is called when the MonoBehaviour will be destroyed.
/// </summary> /// </summary>
protected override void OnDestroy() protected override void OnDestroy()
{ {
Release(); Release();
base.OnDestroy(); base.OnDestroy();
} }
/// <summary> /// <summary>
/// Callback function when a UI element needs to generate vertices. /// Callback function when a UI element needs to generate vertices.
/// </summary> /// </summary>
protected override void OnPopulateMesh(VertexHelper vh) protected override void OnPopulateMesh(VertexHelper vh)
{ {
// When not displaying, clear vertex. // When not displaying, clear vertex.
if (texture == null || color.a < 1 / 255f || canvasRenderer.GetAlpha() < 1 / 255f) if (texture == null || color.a < 1 / 255f || canvasRenderer.GetAlpha() < 1 / 255f)
{ {
vh.Clear(); vh.Clear();
} }
else else
{ {
base.OnPopulateMesh(vh); base.OnPopulateMesh(vh);
int count = vh.currentVertCount; int count = vh.currentVertCount;
UIVertex vt = default(UIVertex); UIVertex vt = default(UIVertex);
Color c = color; Color c = color;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
vh.PopulateUIVertex(ref vt, i); vh.PopulateUIVertex(ref vt, i);
vt.color = c; vt.color = c;
vh.SetUIVertex(vt, i); vh.SetUIVertex(vt, i);
} }
} }
} }
/// <summary> /// <summary>
/// Gets the size of the desampling. /// Gets the size of the desampling.
/// </summary> /// </summary>
public void GetDesamplingSize(DesamplingRate rate, out int w, out int h) public void GetDesamplingSize(DesamplingRate rate, out int w, out int h)
{ {
#if UNITY_EDITOR #if UNITY_EDITOR
if (!Application.isPlaying) if (!Application.isPlaying)
{ {
var res = UnityEditor.UnityStats.screenRes.Split('x'); var res = UnityEditor.UnityStats.screenRes.Split('x');
w = int.Parse(res[0]); w = int.Parse(res[0]);
h = int.Parse(res[1]); h = int.Parse(res[1]);
} }
else else
#endif #endif
{ {
w = Screen.width; w = Screen.width;
h = Screen.height; h = Screen.height;
} }
if (rate == DesamplingRate.None) if (rate == DesamplingRate.None)
return; return;
float aspect = (float)w / h; float aspect = (float)w / h;
if (w < h) if (w < h)
{ {
h = Mathf.ClosestPowerOfTwo(h / (int)rate); h = Mathf.ClosestPowerOfTwo(h / (int)rate);
w = Mathf.CeilToInt(h * aspect); w = Mathf.CeilToInt(h * aspect);
} }
else else
{ {
w = Mathf.ClosestPowerOfTwo(w / (int)rate); w = Mathf.ClosestPowerOfTwo(w / (int)rate);
h = Mathf.CeilToInt(w / aspect); h = Mathf.CeilToInt(w / aspect);
} }
} }
/// <summary> /// <summary>
/// Capture rendering result. /// Capture rendering result.
/// </summary> /// </summary>
public void Capture() public void Capture()
{ {
// Fit to screen. // Fit to screen.
var rootCanvas = canvas.rootCanvas; var rootCanvas = canvas.rootCanvas;
if (m_FitToScreen) if (m_FitToScreen)
{ {
var rootTransform = rootCanvas.transform as RectTransform; var rootTransform = rootCanvas.transform as RectTransform;
var size = rootTransform.rect.size; var size = rootTransform.rect.size;
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, size.x); rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, size.x);
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, size.y); rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, size.y);
rectTransform.position = rootTransform.position; rectTransform.position = rootTransform.position;
} }
// Cache some ids. // Cache some ids.
if (s_CopyId == 0) if (s_CopyId == 0)
{ {
s_CopyId = Shader.PropertyToID("_UIEffectCapturedImage_ScreenCopyId"); s_CopyId = Shader.PropertyToID("_UIEffectCapturedImage_ScreenCopyId");
s_EffectId1 = Shader.PropertyToID("_UIEffectCapturedImage_EffectId1"); s_EffectId1 = Shader.PropertyToID("_UIEffectCapturedImage_EffectId1");
s_EffectId2 = Shader.PropertyToID("_UIEffectCapturedImage_EffectId2"); s_EffectId2 = Shader.PropertyToID("_UIEffectCapturedImage_EffectId2");
s_EffectFactorId = Shader.PropertyToID("_EffectFactor"); s_EffectFactorId = Shader.PropertyToID("_EffectFactor");
s_ColorFactorId = Shader.PropertyToID("_ColorFactor"); s_ColorFactorId = Shader.PropertyToID("_ColorFactor");
s_CommandBuffer = new CommandBuffer(); s_CommandBuffer = new CommandBuffer();
} }
// If size of result RT has changed, release it. // If size of result RT has changed, release it.
int w, h; int w, h;
GetDesamplingSize(m_DesamplingRate, out w, out h); GetDesamplingSize(m_DesamplingRate, out w, out h);
if (_rt && (_rt.width != w || _rt.height != h)) if (_rt && (_rt.width != w || _rt.height != h))
{ {
_Release(ref _rt); _Release(ref _rt);
} }
// Generate RT for result. // Generate RT for result.
if (_rt == null) if (_rt == null)
{ {
_rt = RenderTexture.GetTemporary(w, h, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default); _rt = RenderTexture.GetTemporary(w, h, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default);
_rt.filterMode = m_FilterMode; _rt.filterMode = m_FilterMode;
_rt.useMipMap = false; _rt.useMipMap = false;
_rt.wrapMode = TextureWrapMode.Clamp; _rt.wrapMode = TextureWrapMode.Clamp;
_rtId = new RenderTargetIdentifier(_rt); _rtId = new RenderTargetIdentifier(_rt);
} }
SetupCommandBuffer(); SetupCommandBuffer();
} }
void SetupCommandBuffer() void SetupCommandBuffer()
{ {
// Material for effect. // Material for effect.
Material mat = m_EffectMaterial; Material mat = m_EffectMaterial;
if (s_CommandBuffer == null) if (s_CommandBuffer == null)
{ {
s_CommandBuffer = new CommandBuffer(); s_CommandBuffer = new CommandBuffer();
} }
// [1] Capture from back buffer (back buffer -> copied screen). // [1] Capture from back buffer (back buffer -> copied screen).
int w, h; int w, h;
GetDesamplingSize(DesamplingRate.None, out w, out h); GetDesamplingSize(DesamplingRate.None, out w, out h);
s_CommandBuffer.GetTemporaryRT(s_CopyId, w, h, 0, m_FilterMode); s_CommandBuffer.GetTemporaryRT(s_CopyId, w, h, 0, m_FilterMode);
#if UNITY_EDITOR #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 #else
s_CommandBuffer.Blit(BuiltinRenderTextureType.BindableTexture, s_CopyId); s_CommandBuffer.Blit(BuiltinRenderTextureType.BindableTexture, s_CopyId);
#endif #endif
// Set properties for effect. // Set properties for effect.
s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(m_EffectFactor, 0)); 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)); 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). // [2] Apply base effect with reduction buffer (copied screen -> effect1).
GetDesamplingSize(m_ReductionRate, out w, out h); GetDesamplingSize(m_ReductionRate, out w, out h);
s_CommandBuffer.GetTemporaryRT(s_EffectId1, w, h, 0, m_FilterMode); s_CommandBuffer.GetTemporaryRT(s_EffectId1, w, h, 0, m_FilterMode);
s_CommandBuffer.Blit(s_CopyId, s_EffectId1, mat, 0); s_CommandBuffer.Blit(s_CopyId, s_EffectId1, mat, 0);
s_CommandBuffer.ReleaseTemporaryRT(s_CopyId); s_CommandBuffer.ReleaseTemporaryRT(s_CopyId);
// Iterate blurring operation. // Iterate blurring operation.
if (m_BlurMode != BlurMode.None) if (m_BlurMode != BlurMode.None)
{ {
s_CommandBuffer.GetTemporaryRT(s_EffectId2, w, h, 0, m_FilterMode); s_CommandBuffer.GetTemporaryRT(s_EffectId2, w, h, 0, m_FilterMode);
for (int i = 0; i < m_BlurIterations; i++) for (int i = 0; i < m_BlurIterations; i++)
{ {
// [3] Apply blurring with reduction buffer (effect1 -> effect2, or effect2 -> effect1). // [3] Apply blurring with reduction buffer (effect1 -> effect2, or effect2 -> effect1).
s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(m_BlurFactor, 0)); s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(m_BlurFactor, 0));
s_CommandBuffer.Blit(s_EffectId1, s_EffectId2, mat, 1); s_CommandBuffer.Blit(s_EffectId1, s_EffectId2, mat, 1);
s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(0, m_BlurFactor)); s_CommandBuffer.SetGlobalVector(s_EffectFactorId, new Vector4(0, m_BlurFactor));
s_CommandBuffer.Blit(s_EffectId2, s_EffectId1, mat, 1); s_CommandBuffer.Blit(s_EffectId2, s_EffectId1, mat, 1);
} }
s_CommandBuffer.ReleaseTemporaryRT(s_EffectId2); s_CommandBuffer.ReleaseTemporaryRT(s_EffectId2);
} }
// [4] Copy to result RT. // [4] Copy to result RT.
s_CommandBuffer.Blit(s_EffectId1, _rtId); s_CommandBuffer.Blit(s_EffectId1, _rtId);
s_CommandBuffer.ReleaseTemporaryRT(s_EffectId1); s_CommandBuffer.ReleaseTemporaryRT(s_EffectId1);
#if UNITY_EDITOR #if UNITY_EDITOR
if (!Application.isPlaying) if (!Application.isPlaying)
{ {
Graphics.ExecuteCommandBuffer(s_CommandBuffer); Graphics.ExecuteCommandBuffer(s_CommandBuffer);
UpdateTexture(); UpdateTexture();
return; return;
} }
#endif #endif
// Execute command buffer. // Execute command buffer.
canvas.rootCanvas.GetComponent<CanvasScaler> ().StartCoroutine (_CoUpdateTextureOnNextFrame ()); canvas.rootCanvas.GetComponent<CanvasScaler>().StartCoroutine(_CoUpdateTextureOnNextFrame());
} }
/// <summary> /// <summary>
/// Release captured image. /// Release captured image.
/// </summary> /// </summary>
public void Release() public void Release()
{ {
_Release(true); _Release(true);
texture = null; texture = null;
_SetDirty(); _SetDirty();
} }
#if UNITY_EDITOR #if UNITY_EDITOR
protected override void Reset() protected override void Reset()
{ {
// Set parameters as 'Medium'. // Set parameters as 'Medium'.
m_BlurIterations = 3; m_BlurIterations = 3;
m_FilterMode = FilterMode.Bilinear; m_FilterMode = FilterMode.Bilinear;
m_DesamplingRate = DesamplingRate.x1; m_DesamplingRate = DesamplingRate.x1;
m_ReductionRate = DesamplingRate.x1; m_ReductionRate = DesamplingRate.x1;
base.Reset(); base.Reset();
} }
/// <summary> /// <summary>
/// Raises the before serialize event. /// Raises the before serialize event.
/// </summary> /// </summary>
public void OnBeforeSerialize() public void OnBeforeSerialize()
{ {
} }
/// <summary> /// <summary>
/// Raises the after deserialize event. /// Raises the after deserialize event.
/// </summary> /// </summary>
public void OnAfterDeserialize() public void OnAfterDeserialize()
{ {
UnityEditor.EditorApplication.delayCall += () => UpdateMaterial(true); UnityEditor.EditorApplication.delayCall += () => UpdateMaterial(true);
} }
/// <summary> /// <summary>
/// Raises the validate event. /// Raises the validate event.
/// </summary> /// </summary>
protected override void OnValidate() protected override void OnValidate()
{ {
base.OnValidate(); base.OnValidate();
UnityEditor.EditorApplication.delayCall += () => UpdateMaterial(false); UnityEditor.EditorApplication.delayCall += () => UpdateMaterial(false);
} }
/// <summary> /// <summary>
/// Updates the material. /// Updates the material.
/// </summary> /// </summary>
/// <param name="ignoreInPlayMode">If set to <c>true</c> ignore in play mode.</param> /// <param name="ignoreInPlayMode">If set to <c>true</c> ignore in play mode.</param>
protected void UpdateMaterial(bool ignoreInPlayMode) protected void UpdateMaterial(bool ignoreInPlayMode)
{ {
if (!this || ignoreInPlayMode && Application.isPlaying) if (!this || ignoreInPlayMode && Application.isPlaying)
{ {
return; return;
} }
var mat = MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode, m_ColorMode, m_BlurMode); var mat = MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode, m_ColorMode, m_BlurMode);
if (m_EffectMaterial != mat) if (m_EffectMaterial != mat)
{ {
material = null; material = null;
m_EffectMaterial = mat; m_EffectMaterial = mat;
_SetDirty(); _SetDirty();
} }
} }
#endif #endif
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
RenderTexture _rt; RenderTexture _rt;
RenderTargetIdentifier _rtId; RenderTargetIdentifier _rtId;
static int s_CopyId; static int s_CopyId;
static int s_EffectId1; static int s_EffectId1;
static int s_EffectId2; static int s_EffectId2;
static int s_EffectFactorId; static int s_EffectFactorId;
static int s_ColorFactorId; static int s_ColorFactorId;
static CommandBuffer s_CommandBuffer; static CommandBuffer s_CommandBuffer;
/// <summary> /// <summary>
/// Release genarated objects. /// Release genarated objects.
/// </summary> /// </summary>
/// <param name="releaseRT">If set to <c>true</c> release cached RenderTexture.</param> /// <param name="releaseRT">If set to <c>true</c> release cached RenderTexture.</param>
void _Release(bool releaseRT) void _Release(bool releaseRT)
{ {
if (releaseRT) if (releaseRT)
{ {
texture = null; texture = null;
_Release(ref _rt); _Release(ref _rt);
} }
if (s_CommandBuffer != null) if (s_CommandBuffer != null)
{ {
s_CommandBuffer.Clear(); s_CommandBuffer.Clear();
if (releaseRT) if (releaseRT)
{ {
s_CommandBuffer.Release(); s_CommandBuffer.Release();
s_CommandBuffer = null; s_CommandBuffer = null;
} }
} }
} }
[System.Diagnostics.Conditional("UNITY_EDITOR")] [System.Diagnostics.Conditional("UNITY_EDITOR")]
void _SetDirty() void _SetDirty()
{ {
#if UNITY_EDITOR #if UNITY_EDITOR
if (!Application.isPlaying) if (!Application.isPlaying)
{ {
UnityEditor.EditorUtility.SetDirty(this); UnityEditor.EditorUtility.SetDirty(this);
} }
#endif #endif
} }
void _Release(ref RenderTexture obj) void _Release(ref RenderTexture obj)
{ {
if (obj) if (obj)
{ {
obj.Release(); obj.Release();
RenderTexture.ReleaseTemporary (obj); RenderTexture.ReleaseTemporary(obj);
obj = null; obj = null;
} }
} }
/// <summary> /// <summary>
/// Set texture on next frame. /// Set texture on next frame.
/// </summary> /// </summary>
IEnumerator _CoUpdateTextureOnNextFrame() IEnumerator _CoUpdateTextureOnNextFrame()
{ {
yield return new WaitForEndOfFrame(); yield return new WaitForEndOfFrame();
UpdateTexture(); UpdateTexture();
} }
void UpdateTexture() void UpdateTexture()
{ {
#if !UNITY_EDITOR #if !UNITY_EDITOR
// Execute command buffer. // Execute command buffer.
Graphics.ExecuteCommandBuffer (s_CommandBuffer); Graphics.ExecuteCommandBuffer (s_CommandBuffer);
#endif #endif
_Release(false); _Release(false);
texture = capturedTexture; texture = capturedTexture;
_SetDirty(); _SetDirty();
} }
} }
} }

View File

@ -1,61 +1,59 @@
using System; using UnityEngine;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
//[RequireComponent(typeof(Graphic))] //[RequireComponent(typeof(Graphic))]
[DisallowMultipleComponent] [DisallowMultipleComponent]
[AddComponentMenu("UI/MeshEffectForTextMeshPro/UIFlip", 102)] [AddComponentMenu("UI/MeshEffectForTextMeshPro/UIFlip", 102)]
public class UIFlip : BaseMeshEffect public class UIFlip : BaseMeshEffect
{ {
//################################ //################################
// Serialize Members. // Serialize Members.
//################################ //################################
[Tooltip("Flip horizontally.")] [Tooltip("Flip horizontally.")]
[SerializeField] private bool m_Horizontal = false; [SerializeField] private bool m_Horizontal = false;
[Tooltip("Flip vertically.")] [Tooltip("Flip vertically.")]
[SerializeField] private bool m_Veritical = false; [SerializeField] private bool m_Veritical = false;
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
/// <summary> /// <summary>
/// Gets or sets a value indicating whether this <see cref="Coffee.UIExtensions.UIFlip"/> should be flipped horizontally. /// Gets or sets a value indicating whether this <see cref="Coffee.UIExtensions.UIFlip"/> should be flipped horizontally.
/// </summary> /// </summary>
/// <value><c>true</c> if be flipped horizontally; otherwise, <c>false</c>.</value> /// <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 bool horizontal { get { return this.m_Horizontal; } set { this.m_Horizontal = value; SetVerticesDirty(); } }
/// <summary> /// <summary>
/// Gets or sets a value indicating whether this <see cref="Coffee.UIExtensions.UIFlip"/> should be flipped vertically. /// Gets or sets a value indicating whether this <see cref="Coffee.UIExtensions.UIFlip"/> should be flipped vertically.
/// </summary> /// </summary>
/// <value><c>true</c> if be flipped horizontally; otherwise, <c>false</c>.</value> /// <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 (); } } public bool vertical { get { return this.m_Veritical; } set { this.m_Veritical = value; SetVerticesDirty(); } }
/// <summary> /// <summary>
/// Call used to modify mesh. /// Call used to modify mesh.
/// </summary> /// </summary>
/// <param name="vh">VertexHelper.</param> /// <param name="vh">VertexHelper.</param>
public override void ModifyMesh(VertexHelper vh) public override void ModifyMesh(VertexHelper vh)
{ {
RectTransform rt = graphic.rectTransform; RectTransform rt = graphic.rectTransform;
UIVertex vt = default(UIVertex); UIVertex vt = default(UIVertex);
Vector3 pos; Vector3 pos;
Vector2 center = rt.rect.center; Vector2 center = rt.rect.center;
for (int i = 0; i < vh.currentVertCount; i++) for (int i = 0; i < vh.currentVertCount; i++)
{ {
vh.PopulateUIVertex(ref vt, i); vh.PopulateUIVertex(ref vt, i);
pos = vt.position; pos = vt.position;
vt.position = new Vector3( vt.position = new Vector3(
m_Horizontal ? -pos.x : pos.x, m_Horizontal ? -pos.x : pos.x,
m_Veritical ? -pos.y : pos.y m_Veritical ? -pos.y : pos.y
); );
vh.SetUIVertex(vt, i); vh.SetUIVertex(vt, i);
} }
} }
} }
} }

View File

@ -3,384 +3,384 @@ using UnityEngine.UI;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// UIGradient. /// UIGradient.
/// </summary> /// </summary>
[DisallowMultipleComponent] [DisallowMultipleComponent]
[AddComponentMenu("UI/MeshEffectForTextMeshPro/UIGradient", 101)] [AddComponentMenu("UI/MeshEffectForTextMeshPro/UIGradient", 101)]
public class UIGradient : BaseMeshEffect public class UIGradient : BaseMeshEffect
{ {
//################################ //################################
// Constant or Static Members. // Constant or Static Members.
//################################ //################################
/// <summary> /// <summary>
/// Gradient direction. /// Gradient direction.
/// </summary> /// </summary>
public enum Direction public enum Direction
{ {
Horizontal, Horizontal,
Vertical, Vertical,
Angle, Angle,
Diagonal, Diagonal,
} }
/// <summary> /// <summary>
/// Gradient space for Text. /// Gradient space for Text.
/// </summary> /// </summary>
public enum GradientStyle public enum GradientStyle
{ {
Rect, Rect,
Fit, Fit,
Split, Split,
} }
//################################ //################################
// Serialize Members. // Serialize Members.
//################################ //################################
[Tooltip("Gradient Direction.")] [Tooltip("Gradient Direction.")]
[SerializeField] Direction m_Direction; [SerializeField] Direction m_Direction;
[Tooltip("Color1: Top or Left.")] [Tooltip("Color1: Top or Left.")]
[SerializeField] Color m_Color1 = Color.white; [SerializeField] Color m_Color1 = Color.white;
[Tooltip("Color2: Bottom or Right.")] [Tooltip("Color2: Bottom or Right.")]
[SerializeField] Color m_Color2 = Color.white; [SerializeField] Color m_Color2 = Color.white;
[Tooltip("Color3: For diagonal.")] [Tooltip("Color3: For diagonal.")]
[SerializeField] Color m_Color3 = Color.white; [SerializeField] Color m_Color3 = Color.white;
[Tooltip("Color4: For diagonal.")] [Tooltip("Color4: For diagonal.")]
[SerializeField] Color m_Color4 = Color.white; [SerializeField] Color m_Color4 = Color.white;
[Tooltip("Gradient rotation.")] [Tooltip("Gradient rotation.")]
[SerializeField][Range(-180, 180)] float m_Rotation; [SerializeField][Range(-180, 180)] float m_Rotation;
[Tooltip("Gradient offset for Horizontal, Vertical or Angle.")] [Tooltip("Gradient offset for Horizontal, Vertical or Angle.")]
[SerializeField][Range(-1, 1)] float m_Offset1; [SerializeField][Range(-1, 1)] float m_Offset1;
[Tooltip("Gradient offset for Diagonal.")] [Tooltip("Gradient offset for Diagonal.")]
[SerializeField][Range(-1, 1)] float m_Offset2; [SerializeField][Range(-1, 1)] float m_Offset2;
[Tooltip("Gradient style for Text.")] [Tooltip("Gradient style for Text.")]
[SerializeField] GradientStyle m_GradientStyle; [SerializeField] GradientStyle m_GradientStyle;
[Tooltip("Color space to correct color.")] [Tooltip("Color space to correct color.")]
[SerializeField] ColorSpace m_ColorSpace = ColorSpace.Uninitialized; [SerializeField] ColorSpace m_ColorSpace = ColorSpace.Uninitialized;
[Tooltip("Ignore aspect ratio.")] [Tooltip("Ignore aspect ratio.")]
[SerializeField] bool m_IgnoreAspectRatio = true; [SerializeField] bool m_IgnoreAspectRatio = true;
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
public Graphic targetGraphic { get { return base.graphic; } } public Graphic targetGraphic { get { return base.graphic; } }
/// <summary> /// <summary>
/// Gradient Direction. /// Gradient Direction.
/// </summary> /// </summary>
public Direction direction public Direction direction
{ {
get { return m_Direction; } get { return m_Direction; }
set set
{ {
if (m_Direction != value) if (m_Direction != value)
{ {
m_Direction = value; m_Direction = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Color1: Top or Left. /// Color1: Top or Left.
/// </summary> /// </summary>
public Color color1 public Color color1
{ {
get { return m_Color1; } get { return m_Color1; }
set set
{ {
if (m_Color1 != value) if (m_Color1 != value)
{ {
m_Color1 = value; m_Color1 = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Color2: Bottom or Right. /// Color2: Bottom or Right.
/// </summary> /// </summary>
public Color color2 public Color color2
{ {
get { return m_Color2; } get { return m_Color2; }
set set
{ {
if (m_Color2 != value) if (m_Color2 != value)
{ {
m_Color2 = value; m_Color2 = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Color3: For diagonal. /// Color3: For diagonal.
/// </summary> /// </summary>
public Color color3 public Color color3
{ {
get { return m_Color3; } get { return m_Color3; }
set set
{ {
if (m_Color3 != value) if (m_Color3 != value)
{ {
m_Color3 = value; m_Color3 = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Color4: For diagonal. /// Color4: For diagonal.
/// </summary> /// </summary>
public Color color4 public Color color4
{ {
get { return m_Color4; } get { return m_Color4; }
set set
{ {
if (m_Color4 != value) if (m_Color4 != value)
{ {
m_Color4 = value; m_Color4 = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Gradient rotation. /// Gradient rotation.
/// </summary> /// </summary>
public float rotation public float rotation
{ {
get get
{ {
return m_Direction == Direction.Horizontal ? -90 return m_Direction == Direction.Horizontal ? -90
: m_Direction == Direction.Vertical ? 0 : m_Direction == Direction.Vertical ? 0
: m_Rotation; : m_Rotation;
} }
set set
{ {
if (!Mathf.Approximately(m_Rotation, value)) if (!Mathf.Approximately(m_Rotation, value))
{ {
m_Rotation = value; m_Rotation = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Gradient offset for Horizontal, Vertical or Angle. /// Gradient offset for Horizontal, Vertical or Angle.
/// </summary> /// </summary>
public float offset public float offset
{ {
get { return m_Offset1; } get { return m_Offset1; }
set set
{ {
if (m_Offset1 != value) if (m_Offset1 != value)
{ {
m_Offset1 = value; m_Offset1 = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Gradient offset for Diagonal. /// Gradient offset for Diagonal.
/// </summary> /// </summary>
public Vector2 offset2 public Vector2 offset2
{ {
get { return new Vector2(m_Offset2, m_Offset1); } get { return new Vector2(m_Offset2, m_Offset1); }
set set
{ {
if (m_Offset1 != value.y || m_Offset2 != value.x) if (m_Offset1 != value.y || m_Offset2 != value.x)
{ {
m_Offset1 = value.y; m_Offset1 = value.y;
m_Offset2 = value.x; m_Offset2 = value.x;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Gradient style for Text. /// Gradient style for Text.
/// </summary> /// </summary>
public GradientStyle gradientStyle public GradientStyle gradientStyle
{ {
get { return m_GradientStyle; } get { return m_GradientStyle; }
set set
{ {
if (m_GradientStyle != value) if (m_GradientStyle != value)
{ {
m_GradientStyle = value; m_GradientStyle = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Color space to correct color. /// Color space to correct color.
/// </summary> /// </summary>
public ColorSpace colorSpace public ColorSpace colorSpace
{ {
get { return m_ColorSpace; } get { return m_ColorSpace; }
set set
{ {
if (m_ColorSpace != value) if (m_ColorSpace != value)
{ {
m_ColorSpace = value; m_ColorSpace = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Ignore aspect ratio. /// Ignore aspect ratio.
/// </summary> /// </summary>
public bool ignoreAspectRatio public bool ignoreAspectRatio
{ {
get { return m_IgnoreAspectRatio; } get { return m_IgnoreAspectRatio; }
set set
{ {
if (m_IgnoreAspectRatio != value) if (m_IgnoreAspectRatio != value)
{ {
m_IgnoreAspectRatio = value; m_IgnoreAspectRatio = value;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Call used to modify mesh. /// Call used to modify mesh.
/// </summary> /// </summary>
public override void ModifyMesh(VertexHelper vh) public override void ModifyMesh(VertexHelper vh)
{ {
if (!IsActive()) if (!IsActive())
return; return;
// Gradient space. // Gradient space.
Rect rect = default(Rect); Rect rect = default(Rect);
UIVertex vertex = default(UIVertex); UIVertex vertex = default(UIVertex);
if (m_GradientStyle == GradientStyle.Rect) if (m_GradientStyle == GradientStyle.Rect)
{ {
// RectTransform. // RectTransform.
rect = graphic.rectTransform.rect; rect = graphic.rectTransform.rect;
} }
else if (m_GradientStyle == GradientStyle.Split) else if (m_GradientStyle == GradientStyle.Split)
{ {
// Each characters. // Each characters.
rect.Set(0, 0, 1, 1); rect.Set(0, 0, 1, 1);
} }
else if (m_GradientStyle == GradientStyle.Fit) else if (m_GradientStyle == GradientStyle.Fit)
{ {
// Fit to contents. // Fit to contents.
rect.xMin = rect.yMin = float.MaxValue; rect.xMin = rect.yMin = float.MaxValue;
rect.xMax = rect.yMax = float.MinValue; rect.xMax = rect.yMax = float.MinValue;
for (int i = 0; i < vh.currentVertCount; i++) for (int i = 0; i < vh.currentVertCount; i++)
{ {
vh.PopulateUIVertex(ref vertex, i); vh.PopulateUIVertex(ref vertex, i);
rect.xMin = Mathf.Min(rect.xMin, vertex.position.x); rect.xMin = Mathf.Min(rect.xMin, vertex.position.x);
rect.yMin = Mathf.Min(rect.yMin, vertex.position.y); rect.yMin = Mathf.Min(rect.yMin, vertex.position.y);
rect.xMax = Mathf.Max(rect.xMax, vertex.position.x); rect.xMax = Mathf.Max(rect.xMax, vertex.position.x);
rect.yMax = Mathf.Max(rect.yMax, vertex.position.y); rect.yMax = Mathf.Max(rect.yMax, vertex.position.y);
} }
} }
// Gradient rotation. // Gradient rotation.
float rad = rotation * Mathf.Deg2Rad; float rad = rotation * Mathf.Deg2Rad;
Vector2 dir = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad)); Vector2 dir = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad));
if (!m_IgnoreAspectRatio && Direction.Angle <= m_Direction) if (!m_IgnoreAspectRatio && Direction.Angle <= m_Direction)
{ {
dir.x *= rect.height / rect.width; dir.x *= rect.height / rect.width;
dir = dir.normalized; dir = dir.normalized;
} }
// Calculate vertex color. // Calculate vertex color.
Color color; Color color;
Vector2 nomalizedPos; Vector2 nomalizedPos;
Matrix2x3 localMatrix = new Matrix2x3(rect, dir.x, dir.y); // Get local matrix. Matrix2x3 localMatrix = new Matrix2x3(rect, dir.x, dir.y); // Get local matrix.
for (int i = 0; i < vh.currentVertCount; i++) for (int i = 0; i < vh.currentVertCount; i++)
{ {
vh.PopulateUIVertex(ref vertex, i); vh.PopulateUIVertex(ref vertex, i);
// Normalize vertex position by local matrix. // Normalize vertex position by local matrix.
if (m_GradientStyle == GradientStyle.Split) if (m_GradientStyle == GradientStyle.Split)
{ {
// Each characters. // Each characters.
nomalizedPos = localMatrix * s_SplitedCharacterPosition[i % 4] + offset2; nomalizedPos = localMatrix * s_SplitedCharacterPosition[i % 4] + offset2;
} }
else else
{ {
nomalizedPos = localMatrix * vertex.position + offset2; nomalizedPos = localMatrix * vertex.position + offset2;
} }
// Interpolate vertex color. // Interpolate vertex color.
if (direction == Direction.Diagonal) if (direction == Direction.Diagonal)
{ {
color = Color.LerpUnclamped( color = Color.LerpUnclamped(
Color.LerpUnclamped(m_Color1, m_Color2, nomalizedPos.x), Color.LerpUnclamped(m_Color1, m_Color2, nomalizedPos.x),
Color.LerpUnclamped(m_Color3, m_Color4, nomalizedPos.x), Color.LerpUnclamped(m_Color3, m_Color4, nomalizedPos.x),
nomalizedPos.y); nomalizedPos.y);
} }
else else
{ {
color = Color.LerpUnclamped(m_Color2, m_Color1, nomalizedPos.y); color = Color.LerpUnclamped(m_Color2, m_Color1, nomalizedPos.y);
} }
// Correct color. // Correct color.
vertex.color *= (m_ColorSpace == ColorSpace.Gamma) ? color.gamma vertex.color *= (m_ColorSpace == ColorSpace.Gamma) ? color.gamma
: (m_ColorSpace == ColorSpace.Linear) ? color.linear : (m_ColorSpace == ColorSpace.Linear) ? color.linear
: color; : color;
vh.SetUIVertex(vertex, i); vh.SetUIVertex(vertex, i);
} }
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
static readonly Vector2[] s_SplitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero }; static readonly Vector2[] s_SplitedCharacterPosition = { Vector2.up, Vector2.one, Vector2.right, Vector2.zero };
/// <summary> /// <summary>
/// Matrix2x3. /// Matrix2x3.
/// </summary> /// </summary>
struct Matrix2x3 struct Matrix2x3
{ {
public float m00, m01, m02, m10, m11, m12; public float m00, m01, m02, m10, m11, m12;
public Matrix2x3(Rect rect, float cos, float sin) public Matrix2x3(Rect rect, float cos, float sin)
{ {
const float center = 0.5f; const float center = 0.5f;
float dx = -rect.xMin / rect.width - center; float dx = -rect.xMin / rect.width - center;
float dy = -rect.yMin / rect.height - center; float dy = -rect.yMin / rect.height - center;
m00 = cos / rect.width; m00 = cos / rect.width;
m01 = -sin / rect.height; m01 = -sin / rect.height;
m02 = dx * cos - dy * sin + center; m02 = dx * cos - dy * sin + center;
m10 = sin / rect.width; m10 = sin / rect.width;
m11 = cos / rect.height; m11 = cos / rect.height;
m12 = dx * sin + dy * cos + center; m12 = dx * sin + dy * cos + center;
} }
public static Vector2 operator*(Matrix2x3 m, Vector2 v) public static Vector2 operator *(Matrix2x3 m, Vector2 v)
{ {
return new Vector2( return new Vector2(
(m.m00 * v.x) + (m.m01 * v.y) + m.m02, (m.m00 * v.x) + (m.m01 * v.y) + m.m02,
(m.m10 * v.x) + (m.m11 * v.y) + m.m12 (m.m10 * v.x) + (m.m11 * v.y) + m.m12
); );
} }
} }
} }
} }

View File

@ -1,194 +1,193 @@
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI; using UnityEngine.UI;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// HSV Modifier. /// HSV Modifier.
/// </summary> /// </summary>
[AddComponentMenu("UI/UIEffect/UIHsvModifier", 4)] [AddComponentMenu("UI/UIEffect/UIHsvModifier", 4)]
public class UIHsvModifier : UIEffectBase public class UIHsvModifier : UIEffectBase
{ {
//################################ //################################
// Constant or Static Members. // Constant or Static Members.
//################################ //################################
public const string shaderName = "UI/Hidden/UI-Effect-HSV"; public const string shaderName = "UI/Hidden/UI-Effect-HSV";
static readonly ParameterTexture _ptex = new ParameterTexture(7, 128, "_ParamTex"); static readonly ParameterTexture _ptex = new ParameterTexture(7, 128, "_ParamTex");
//################################ //################################
// Serialize Members. // Serialize Members.
//################################ //################################
[Header("Target")] [Header("Target")]
[Tooltip("Target color to affect hsv shift.")] [Tooltip("Target color to affect hsv shift.")]
[SerializeField] [ColorUsage(false)] Color m_TargetColor = Color.red; [SerializeField][ColorUsage(false)] Color m_TargetColor = Color.red;
[Tooltip("Color range to affect hsv shift [0 ~ 1].")] [Tooltip("Color range to affect hsv shift [0 ~ 1].")]
[SerializeField] [Range(0, 1)] float m_Range = 0.1f; [SerializeField][Range(0, 1)] float m_Range = 0.1f;
[Header("Adjustment")] [Header("Adjustment")]
[Tooltip("Hue shift [-0.5 ~ 0.5].")] [Tooltip("Hue shift [-0.5 ~ 0.5].")]
[SerializeField] [Range(-0.5f, 0.5f)] float m_Hue; [SerializeField][Range(-0.5f, 0.5f)] float m_Hue;
[Tooltip("Saturation shift [-0.5 ~ 0.5].")] [Tooltip("Saturation shift [-0.5 ~ 0.5].")]
[SerializeField] [Range(-0.5f, 0.5f)] float m_Saturation; [SerializeField][Range(-0.5f, 0.5f)] float m_Saturation;
[Tooltip("Value shift [-0.5 ~ 0.5].")] [Tooltip("Value shift [-0.5 ~ 0.5].")]
[SerializeField] [Range(-0.5f, 0.5f)] float m_Value; [SerializeField][Range(-0.5f, 0.5f)] float m_Value;
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
/// <summary> /// <summary>
/// Target color to affect hsv shift. /// Target color to affect hsv shift.
/// </summary> /// </summary>
public Color targetColor public Color targetColor
{ {
get { return m_TargetColor; } get { return m_TargetColor; }
set set
{ {
if (m_TargetColor != value) if (m_TargetColor != value)
{ {
m_TargetColor = value; m_TargetColor = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Color range to affect hsv shift [0 ~ 1]. /// Color range to affect hsv shift [0 ~ 1].
/// </summary> /// </summary>
public float range public float range
{ {
get { return m_Range; } get { return m_Range; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_Range, value)) if (!Mathf.Approximately(m_Range, value))
{ {
m_Range = value; m_Range = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Saturation shift [-0.5 ~ 0.5]. /// Saturation shift [-0.5 ~ 0.5].
/// </summary> /// </summary>
public float saturation public float saturation
{ {
get { return m_Saturation; } get { return m_Saturation; }
set set
{ {
value = Mathf.Clamp(value, -0.5f, 0.5f); value = Mathf.Clamp(value, -0.5f, 0.5f);
if (!Mathf.Approximately(m_Saturation, value)) if (!Mathf.Approximately(m_Saturation, value))
{ {
m_Saturation = value; m_Saturation = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Value shift [-0.5 ~ 0.5]. /// Value shift [-0.5 ~ 0.5].
/// </summary> /// </summary>
public float value public float value
{ {
get { return m_Value; } get { return m_Value; }
set set
{ {
value = Mathf.Clamp(value, -0.5f, 0.5f); value = Mathf.Clamp(value, -0.5f, 0.5f);
if (!Mathf.Approximately(m_Value, value)) if (!Mathf.Approximately(m_Value, value))
{ {
m_Value = value; m_Value = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Hue shift [-0.5 ~ 0.5]. /// Hue shift [-0.5 ~ 0.5].
/// </summary> /// </summary>
public float hue public float hue
{ {
get { return m_Hue; } get { return m_Hue; }
set set
{ {
value = Mathf.Clamp(value, -0.5f, 0.5f); value = Mathf.Clamp(value, -0.5f, 0.5f);
if (!Mathf.Approximately(m_Hue, value)) if (!Mathf.Approximately(m_Hue, value))
{ {
m_Hue = value; m_Hue = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Gets the parameter texture. /// Gets the parameter texture.
/// </summary> /// </summary>
public override ParameterTexture ptex { get { return _ptex; } } public override ParameterTexture ptex { get { return _ptex; } }
#if UNITY_EDITOR #if UNITY_EDITOR
protected override Material GetMaterial() protected override Material GetMaterial()
{ {
if (isTMPro) if (isTMPro)
{ {
return null; return null;
} }
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName)); return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName));
} }
#endif #endif
/// <summary> /// <summary>
/// Modifies the mesh. /// Modifies the mesh.
/// </summary> /// </summary>
public override void ModifyMesh(VertexHelper vh) public override void ModifyMesh(VertexHelper vh)
{ {
if (!isActiveAndEnabled) if (!isActiveAndEnabled)
return; return;
float normalizedIndex = ptex.GetNormalizedIndex(this); float normalizedIndex = ptex.GetNormalizedIndex(this);
UIVertex vertex = default(UIVertex); UIVertex vertex = default(UIVertex);
int count = vh.currentVertCount; int count = vh.currentVertCount;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
vh.PopulateUIVertex(ref vertex, i); vh.PopulateUIVertex(ref vertex, i);
vertex.uv0 = new Vector2( vertex.uv0 = new Vector2(
Packer.ToFloat(vertex.uv0.x, vertex.uv0.y), Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
normalizedIndex normalizedIndex
); );
vh.SetUIVertex(vertex, i); vh.SetUIVertex(vertex, i);
} }
} }
protected override void SetDirty() protected override void SetDirty()
{ {
float h, s, v; float h, s, v;
Color.RGBToHSV(m_TargetColor, out h, out s, out v); Color.RGBToHSV(m_TargetColor, out h, out s, out v);
foreach (var m in materials) foreach (var m in materials)
{ {
ptex.RegisterMaterial (m); ptex.RegisterMaterial(m);
} }
ptex.SetData(this, 0, h); // param1.x : target hue ptex.SetData(this, 0, h); // param1.x : target hue
ptex.SetData(this, 1, s); // param1.y : target saturation ptex.SetData(this, 1, s); // param1.y : target saturation
ptex.SetData(this, 2, v); // param1.z : target value ptex.SetData(this, 2, v); // param1.z : target value
ptex.SetData(this, 3, m_Range); // param1.w : target range 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, 4, m_Hue + 0.5f); // param2.x : hue shift
ptex.SetData(this, 5, m_Saturation + 0.5f); // param2.y : saturation 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, 6, m_Value + 0.5f); // param2.z : value shift
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
} }
} }

View File

@ -5,230 +5,229 @@ using UnityEngine.Serialization;
using UnityEngine.UI; using UnityEngine.UI;
#if UNITY_EDITOR #if UNITY_EDITOR
using System.IO;
using System.Linq;
using UnityEditor; using UnityEditor;
#endif #endif
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// UIEffect. /// UIEffect.
/// </summary> /// </summary>
[RequireComponent(typeof(Graphic))] [RequireComponent(typeof(Graphic))]
[AddComponentMenu("UI/UIEffect/UIShadow", 100)] [AddComponentMenu("UI/UIEffect/UIShadow", 100)]
public class UIShadow : BaseMeshEffect, IParameterTexture public class UIShadow : BaseMeshEffect, IParameterTexture
#if UNITY_EDITOR #if UNITY_EDITOR
, ISerializationCallbackReceiver , ISerializationCallbackReceiver
#endif #endif
{ {
/// <summary> /// <summary>
/// Additional shadow. /// Additional shadow.
/// </summary> /// </summary>
[System.Obsolete] [System.Obsolete]
[System.Serializable] [System.Serializable]
public class AdditionalShadow public class AdditionalShadow
{ {
/// <summary> /// <summary>
/// How far is the blurring shadow from the graphic. /// How far is the blurring shadow from the graphic.
/// </summary> /// </summary>
[FormerlySerializedAs("shadowBlur")] [FormerlySerializedAs("shadowBlur")]
[Range(0, 1)] public float blur = 0.25f; [Range(0, 1)] public float blur = 0.25f;
/// <summary> /// <summary>
/// Shadow effect mode. /// Shadow effect mode.
/// </summary> /// </summary>
[FormerlySerializedAs("shadowMode")] [FormerlySerializedAs("shadowMode")]
public ShadowStyle style = ShadowStyle.Shadow; public ShadowStyle style = ShadowStyle.Shadow;
/// <summary> /// <summary>
/// Color for the shadow effect. /// Color for the shadow effect.
/// </summary> /// </summary>
[FormerlySerializedAs("shadowColor")] [FormerlySerializedAs("shadowColor")]
public Color effectColor = Color.black; public Color effectColor = Color.black;
/// <summary> /// <summary>
/// How far is the shadow from the graphic. /// How far is the shadow from the graphic.
/// </summary> /// </summary>
public Vector2 effectDistance = new Vector2(1f, -1f); public Vector2 effectDistance = new Vector2(1f, -1f);
/// <summary> /// <summary>
/// Should the shadow inherit the alpha from the graphic? /// Should the shadow inherit the alpha from the graphic?
/// </summary> /// </summary>
public bool useGraphicAlpha = true; public bool useGraphicAlpha = true;
} }
//################################ //################################
// Serialize Members. // Serialize Members.
//################################ //################################
[Tooltip("How far is the blurring shadow from the graphic.")] [Tooltip("How far is the blurring shadow from the graphic.")]
[FormerlySerializedAs("m_Blur")] [FormerlySerializedAs("m_Blur")]
[SerializeField][Range(0, 1)] float m_BlurFactor = 1; [SerializeField][Range(0, 1)] float m_BlurFactor = 1;
[Tooltip("Shadow effect style.")] [Tooltip("Shadow effect style.")]
[SerializeField] ShadowStyle m_Style = ShadowStyle.Shadow; [SerializeField] ShadowStyle m_Style = ShadowStyle.Shadow;
#pragma warning disable 0414 #pragma warning disable 0414
[HideInInspector][System.Obsolete] [HideInInspector]
[SerializeField] List<AdditionalShadow> m_AdditionalShadows = new List<AdditionalShadow>(); [System.Obsolete]
#pragma warning restore 0414 [SerializeField] List<AdditionalShadow> m_AdditionalShadows = new List<AdditionalShadow>();
#pragma warning restore 0414
[SerializeField] [SerializeField]
private Color m_EffectColor = new Color (0f, 0f, 0f, 0.5f); private Color m_EffectColor = new Color(0f, 0f, 0f, 0.5f);
[SerializeField] [SerializeField]
private Vector2 m_EffectDistance = new Vector2 (1f, -1f); private Vector2 m_EffectDistance = new Vector2(1f, -1f);
[SerializeField] [SerializeField]
private bool m_UseGraphicAlpha = true; private bool m_UseGraphicAlpha = true;
private const float kMaxEffectDistance = 600f; private const float kMaxEffectDistance = 600f;
public Color effectColor public Color effectColor
{ {
get { return m_EffectColor; } get { return m_EffectColor; }
set set
{ {
m_EffectColor = value; m_EffectColor = value;
if (graphic != null) if (graphic != null)
graphic.SetVerticesDirty (); graphic.SetVerticesDirty();
} }
} }
public Vector2 effectDistance public Vector2 effectDistance
{ {
get { return m_EffectDistance; } get { return m_EffectDistance; }
set set
{ {
if (value.x > kMaxEffectDistance) if (value.x > kMaxEffectDistance)
value.x = kMaxEffectDistance; value.x = kMaxEffectDistance;
if (value.x < -kMaxEffectDistance) if (value.x < -kMaxEffectDistance)
value.x = -kMaxEffectDistance; value.x = -kMaxEffectDistance;
if (value.y > kMaxEffectDistance) if (value.y > kMaxEffectDistance)
value.y = kMaxEffectDistance; value.y = kMaxEffectDistance;
if (value.y < -kMaxEffectDistance) if (value.y < -kMaxEffectDistance)
value.y = -kMaxEffectDistance; value.y = -kMaxEffectDistance;
if (m_EffectDistance == value) if (m_EffectDistance == value)
return; return;
m_EffectDistance = value; m_EffectDistance = value;
if (graphic != null) if (graphic != null)
graphic.SetVerticesDirty (); graphic.SetVerticesDirty();
} }
} }
public bool useGraphicAlpha public bool useGraphicAlpha
{ {
get { return m_UseGraphicAlpha; } get { return m_UseGraphicAlpha; }
set set
{ {
m_UseGraphicAlpha = value; m_UseGraphicAlpha = value;
if (graphic != null) if (graphic != null)
graphic.SetVerticesDirty (); graphic.SetVerticesDirty();
} }
} }
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
/// <summary> /// <summary>
/// How far is the blurring shadow from the graphic. /// How far is the blurring shadow from the graphic.
/// </summary> /// </summary>
[System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")] [System.Obsolete("Use blurFactor instead (UnityUpgradable) -> blurFactor")]
public float blur public float blur
{ {
get { return m_BlurFactor; } get { return m_BlurFactor; }
set set
{ {
m_BlurFactor = Mathf.Clamp(value, 0, 2); m_BlurFactor = Mathf.Clamp(value, 0, 2);
_SetDirty(); _SetDirty();
} }
} }
/// <summary> /// <summary>
/// How far is the blurring shadow from the graphic. /// How far is the blurring shadow from the graphic.
/// </summary> /// </summary>
public float blurFactor public float blurFactor
{ {
get { return m_BlurFactor; } get { return m_BlurFactor; }
set set
{ {
m_BlurFactor = Mathf.Clamp(value, 0, 2); m_BlurFactor = Mathf.Clamp(value, 0, 2);
_SetDirty(); _SetDirty();
} }
} }
/// <summary> /// <summary>
/// Shadow effect style. /// Shadow effect style.
/// </summary> /// </summary>
public ShadowStyle style public ShadowStyle style
{ {
get { return m_Style; } get { return m_Style; }
set set
{ {
m_Style = value; m_Style = value;
_SetDirty(); _SetDirty();
} }
} }
/// <summary> /// <summary>
/// Gets or sets the parameter index. /// Gets or sets the parameter index.
/// </summary> /// </summary>
public int parameterIndex { get; set; } public int parameterIndex { get; set; }
/// <summary> /// <summary>
/// Gets the parameter texture. /// Gets the parameter texture.
/// </summary> /// </summary>
public ParameterTexture ptex{ get; private set; } public ParameterTexture ptex { get; private set; }
int _graphicVertexCount; int _graphicVertexCount;
static readonly List<UIShadow> tmpShadows = new List<UIShadow>(); static readonly List<UIShadow> tmpShadows = new List<UIShadow>();
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable(); base.OnEnable();
_uiEffect = GetComponent<UIEffect>(); _uiEffect = GetComponent<UIEffect>();
if (_uiEffect) if (_uiEffect)
{ {
ptex = _uiEffect.ptex; ptex = _uiEffect.ptex;
ptex.Register(this); ptex.Register(this);
} }
#if TMP_PRESENT #if TMP_PRESENT
if (isTMPro) if (isTMPro)
{ {
textMeshPro.onCullStateChanged.AddListener (OnCullStateChanged); textMeshPro.onCullStateChanged.AddListener (OnCullStateChanged);
} }
#endif #endif
} }
protected override void OnDisable() protected override void OnDisable()
{ {
base.OnDisable(); base.OnDisable();
_uiEffect = null; _uiEffect = null;
if (ptex != null) if (ptex != null)
{ {
ptex.Unregister(this); ptex.Unregister(this);
ptex = null; ptex = null;
} }
} }
#if UNITY_EDITOR #if UNITY_EDITOR
protected override void OnValidate () protected override void OnValidate()
{ {
effectDistance = m_EffectDistance; effectDistance = m_EffectDistance;
base.OnValidate (); base.OnValidate();
} }
#endif #endif
#if TMP_PRESENT #if TMP_PRESENT
protected void OnCullStateChanged (bool state) protected void OnCullStateChanged (bool state)
{ {
SetVerticesDirty (); SetVerticesDirty ();
@ -249,213 +248,213 @@ namespace Coffee.UIExtensions
} }
base.LateUpdate (); base.LateUpdate ();
} }
#endif #endif
/// <summary> /// <summary>
/// Modifies the mesh. /// Modifies the mesh.
/// </summary> /// </summary>
public override void ModifyMesh(VertexHelper vh) public override void ModifyMesh(VertexHelper vh)
{ {
if (!isActiveAndEnabled || vh.currentVertCount <= 0 || m_Style == ShadowStyle.None) if (!isActiveAndEnabled || vh.currentVertCount <= 0 || m_Style == ShadowStyle.None)
{ {
return; return;
} }
vh.GetUIVertexStream(s_Verts); vh.GetUIVertexStream(s_Verts);
GetComponents<UIShadow>(tmpShadows); GetComponents<UIShadow>(tmpShadows);
foreach (var s in tmpShadows) foreach (var s in tmpShadows)
{ {
if (s.isActiveAndEnabled) if (s.isActiveAndEnabled)
{ {
if (s == this) if (s == this)
{ {
foreach (var s2 in tmpShadows) foreach (var s2 in tmpShadows)
{ {
s2._graphicVertexCount = s_Verts.Count; s2._graphicVertexCount = s_Verts.Count;
} }
} }
break; break;
} }
} }
tmpShadows.Clear(); tmpShadows.Clear();
//================================ //================================
// Append shadow vertices. // Append shadow vertices.
//================================ //================================
{ {
_uiEffect = _uiEffect ?? GetComponent<UIEffect>(); _uiEffect = _uiEffect ?? GetComponent<UIEffect>();
var start = s_Verts.Count - _graphicVertexCount; var start = s_Verts.Count - _graphicVertexCount;
var end = s_Verts.Count; var end = s_Verts.Count;
if (ptex != null && _uiEffect && _uiEffect.isActiveAndEnabled) if (ptex != null && _uiEffect && _uiEffect.isActiveAndEnabled)
{ {
ptex.SetData(this, 0, _uiEffect.effectFactor); // param.x : effect factor ptex.SetData(this, 0, _uiEffect.effectFactor); // param.x : effect factor
ptex.SetData(this, 1, 255); // param.y : color factor ptex.SetData(this, 1, 255); // param.y : color factor
ptex.SetData(this, 2, m_BlurFactor); // param.z : blur 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.Clear();
vh.AddUIVertexTriangleStream(s_Verts); vh.AddUIVertexTriangleStream(s_Verts);
s_Verts.Clear(); s_Verts.Clear();
} }
UIEffect _uiEffect; UIEffect _uiEffect;
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
static readonly List<UIVertex> s_Verts = new List<UIVertex>(4096); static readonly List<UIVertex> s_Verts = new List<UIVertex>(4096);
/// <summary> /// <summary>
/// Append shadow vertices. /// Append shadow vertices.
/// * It is similar to Shadow component implementation. /// * It is similar to Shadow component implementation.
/// </summary> /// </summary>
void _ApplyShadow(List<UIVertex> verts, Color color, ref int start, ref int end, Vector2 effectDistance, ShadowStyle style, bool useGraphicAlpha) 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) if (style == ShadowStyle.None || color.a <= 0)
return; return;
// Append Shadow. // Append Shadow.
_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 Shadow3. // Append Shadow3.
if (ShadowStyle.Shadow3 == style) if (ShadowStyle.Shadow3 == style)
{ {
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, effectDistance.x, 0, 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, 0, effectDistance.y, useGraphicAlpha);
} }
// Append Outline. // Append Outline.
else if (ShadowStyle.Outline == style) 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); _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. // Append Outline8.
else if (ShadowStyle.Outline8 == style) 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, 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, -effectDistance.x, 0, useGraphicAlpha);
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, 0, -effectDistance.y, 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, effectDistance.x, 0, useGraphicAlpha);
_ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, 0, effectDistance.y, useGraphicAlpha); _ApplyShadowZeroAlloc(s_Verts, color, ref start, ref end, 0, effectDistance.y, useGraphicAlpha);
} }
} }
/// <summary> /// <summary>
/// Append shadow vertices. /// Append shadow vertices.
/// * It is similar to Shadow component implementation. /// * It is similar to Shadow component implementation.
/// </summary> /// </summary>
void _ApplyShadowZeroAlloc(List<UIVertex> verts, Color color, ref int start, ref int end, float x, float y, bool useGraphicAlpha) void _ApplyShadowZeroAlloc(List<UIVertex> verts, Color color, ref int start, ref int end, float x, float y, bool useGraphicAlpha)
{ {
// Check list capacity. // Check list capacity.
int count = end - start; int count = end - start;
var neededCapacity = verts.Count + count; var neededCapacity = verts.Count + count;
if (verts.Capacity < neededCapacity) if (verts.Capacity < neededCapacity)
verts.Capacity *= 2; verts.Capacity *= 2;
float normalizedIndex = ptex != null && _uiEffect && _uiEffect.isActiveAndEnabled float normalizedIndex = ptex != null && _uiEffect && _uiEffect.isActiveAndEnabled
? ptex.GetNormalizedIndex(this) ? ptex.GetNormalizedIndex(this)
: -1; : -1;
// Add // Add
UIVertex vt = default(UIVertex); UIVertex vt = default(UIVertex);
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
verts.Add(vt); verts.Add(vt);
} }
// Move // Move
for (int i = verts.Count - 1; count <= i; i--) for (int i = verts.Count - 1; count <= i; i--)
{ {
verts[i] = verts[i - count]; verts[i] = verts[i - count];
} }
// Append shadow vertices to the front of list. // Append shadow vertices to the front of list.
// * The original vertex is pushed backward. // * The original vertex is pushed backward.
for (int i = 0; i < count; ++i) for (int i = 0; i < count; ++i)
{ {
vt = verts[i + start + count]; vt = verts[i + start + count];
Vector3 v = vt.position; Vector3 v = vt.position;
vt.position.Set(v.x + x, v.y + y, v.z); vt.position.Set(v.x + x, v.y + y, v.z);
Color vertColor = effectColor; Color vertColor = effectColor;
vertColor.a = useGraphicAlpha ? color.a * vt.color.a / 255 : color.a; vertColor.a = useGraphicAlpha ? color.a * vt.color.a / 255 : color.a;
vt.color = vertColor; vt.color = vertColor;
// Set UIEffect prameters // Set UIEffect prameters
if (0 <= normalizedIndex) if (0 <= normalizedIndex)
{ {
vt.uv0 = new Vector2( vt.uv0 = new Vector2(
vt.uv0.x, vt.uv0.x,
normalizedIndex normalizedIndex
); );
} }
verts[i] = vt; verts[i] = vt;
} }
// Update next shadow offset. // Update next shadow offset.
start = end; start = end;
end = verts.Count; end = verts.Count;
} }
/// <summary> /// <summary>
/// Mark the UIEffect as dirty. /// Mark the UIEffect as dirty.
/// </summary> /// </summary>
void _SetDirty() void _SetDirty()
{ {
if (graphic) if (graphic)
graphic.SetVerticesDirty(); graphic.SetVerticesDirty();
} }
#if UNITY_EDITOR #if UNITY_EDITOR
public void OnBeforeSerialize() public void OnBeforeSerialize()
{ {
} }
public void OnAfterDeserialize() public void OnAfterDeserialize()
{ {
EditorApplication.delayCall += UpgradeIfNeeded; EditorApplication.delayCall += UpgradeIfNeeded;
} }
#pragma warning disable 0612 #pragma warning disable 0612
void UpgradeIfNeeded() void UpgradeIfNeeded()
{ {
if (0 < m_AdditionalShadows.Count) if (0 < m_AdditionalShadows.Count)
{ {
foreach (var s in m_AdditionalShadows) foreach (var s in m_AdditionalShadows)
{ {
if (s.style == ShadowStyle.None) if (s.style == ShadowStyle.None)
{ {
continue; continue;
} }
var shadow = gameObject.AddComponent<UIShadow>(); var shadow = gameObject.AddComponent<UIShadow>();
shadow.style = s.style; shadow.style = s.style;
shadow.effectDistance = s.effectDistance; shadow.effectDistance = s.effectDistance;
shadow.effectColor = s.effectColor; shadow.effectColor = s.effectColor;
shadow.useGraphicAlpha = s.useGraphicAlpha; shadow.useGraphicAlpha = s.useGraphicAlpha;
shadow.blurFactor = s.blur; shadow.blurFactor = s.blur;
} }
m_AdditionalShadows = null; m_AdditionalShadows = null;
} }
} }
#pragma warning restore 0612 #pragma warning restore 0612
#endif #endif
} }
} }

View File

@ -1,408 +1,408 @@
using System; using System;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization; using UnityEngine.Serialization;
using UnityEngine.UI; using UnityEngine.UI;
using System.Collections;
#if UNITY_EDITOR #if UNITY_EDITOR
using System.IO;
using System.Linq;
using UnityEditor;
#endif #endif
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// UIEffect. /// UIEffect.
/// </summary> /// </summary>
[AddComponentMenu("UI/UIEffect/UIShiny", 2)] [AddComponentMenu("UI/UIEffect/UIShiny", 2)]
public class UIShiny : UIEffectBase public class UIShiny : UIEffectBase
{ {
//################################ //################################
// Constant or Static Members. // Constant or Static Members.
//################################ //################################
public const string shaderName = "UI/Hidden/UI-Effect-Shiny"; public const string shaderName = "UI/Hidden/UI-Effect-Shiny";
static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex"); static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex");
//################################ //################################
// Serialize Members. // Serialize Members.
//################################ //################################
[Tooltip("Location for shiny effect.")] [Tooltip("Location for shiny effect.")]
[FormerlySerializedAs("m_Location")] [FormerlySerializedAs("m_Location")]
[SerializeField] [Range(0, 1)] float m_EffectFactor = 0; [SerializeField][Range(0, 1)] float m_EffectFactor = 0;
[Tooltip("Width for shiny effect.")] [Tooltip("Width for shiny effect.")]
[SerializeField] [Range(0, 1)] float m_Width = 0.25f; [SerializeField][Range(0, 1)] float m_Width = 0.25f;
[Tooltip("Rotation for shiny effect.")] [Tooltip("Rotation for shiny effect.")]
[SerializeField] [Range(-180, 180)] float m_Rotation; [SerializeField][Range(-180, 180)] float m_Rotation;
[Tooltip("Softness for shiny effect.")] [Tooltip("Softness for shiny effect.")]
[SerializeField][Range(0.01f, 1)] float m_Softness = 1f; [SerializeField][Range(0.01f, 1)] float m_Softness = 1f;
[Tooltip("Brightness for shiny effect.")] [Tooltip("Brightness for shiny effect.")]
[FormerlySerializedAs("m_Alpha")] [FormerlySerializedAs("m_Alpha")]
[SerializeField][Range(0, 1)] float m_Brightness = 1f; [SerializeField][Range(0, 1)] float m_Brightness = 1f;
[Tooltip("Gloss factor for shiny effect.")] [Tooltip("Gloss factor for shiny effect.")]
[FormerlySerializedAs("m_Highlight")] [FormerlySerializedAs("m_Highlight")]
[SerializeField][Range(0, 1)] float m_Gloss = 1; [SerializeField][Range(0, 1)] float m_Gloss = 1;
[Header("Advanced Option")] [Header("Advanced Option")]
[Tooltip("The area for effect.")] [Tooltip("The area for effect.")]
[SerializeField] protected EffectArea m_EffectArea; [SerializeField] protected EffectArea m_EffectArea;
[SerializeField] EffectPlayer m_Player; [SerializeField] EffectPlayer m_Player;
#pragma warning disable 0414 #pragma warning disable 0414
[Obsolete][HideInInspector] [Obsolete]
[SerializeField] bool m_Play = false; [HideInInspector]
[Obsolete][HideInInspector] [SerializeField] bool m_Play = false;
[SerializeField] bool m_Loop = false; [Obsolete]
[Obsolete][HideInInspector] [HideInInspector]
[SerializeField][Range(0.1f, 10)] float m_Duration = 1; [SerializeField] bool m_Loop = false;
[Obsolete][HideInInspector] [Obsolete]
[SerializeField][Range(0, 10)] float m_LoopDelay = 1; [HideInInspector]
[Obsolete][HideInInspector] [SerializeField][Range(0.1f, 10)] float m_Duration = 1;
[SerializeField] AnimatorUpdateMode m_UpdateMode = AnimatorUpdateMode.Normal; [Obsolete]
#pragma warning restore 0414 [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> /// <summary>
/// Effect factor between 0(start) and 1(end). /// Effect factor between 0(start) and 1(end).
/// </summary> /// </summary>
[System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")] [System.Obsolete("Use effectFactor instead (UnityUpgradable) -> effectFactor")]
public float location public float location
{ {
get { return m_EffectFactor; } get { return m_EffectFactor; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_EffectFactor, value)) if (!Mathf.Approximately(m_EffectFactor, value))
{ {
m_EffectFactor = value; m_EffectFactor = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Effect factor between 0(start) and 1(end). /// Effect factor between 0(start) and 1(end).
/// </summary> /// </summary>
public float effectFactor public float effectFactor
{ {
get { return m_EffectFactor; } get { return m_EffectFactor; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_EffectFactor, value)) if (!Mathf.Approximately(m_EffectFactor, value))
{ {
m_EffectFactor = value; m_EffectFactor = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Width for shiny effect. /// Width for shiny effect.
/// </summary> /// </summary>
public float width public float width
{ {
get { return m_Width; } get { return m_Width; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_Width, value)) if (!Mathf.Approximately(m_Width, value))
{ {
m_Width = value; m_Width = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Softness for shiny effect. /// Softness for shiny effect.
/// </summary> /// </summary>
public float softness public float softness
{ {
get { return m_Softness; } get { return m_Softness; }
set set
{ {
value = Mathf.Clamp(value, 0.01f, 1); value = Mathf.Clamp(value, 0.01f, 1);
if (!Mathf.Approximately(m_Softness, value)) if (!Mathf.Approximately(m_Softness, value))
{ {
m_Softness = value; m_Softness = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Brightness for shiny effect. /// Brightness for shiny effect.
/// </summary> /// </summary>
[System.Obsolete("Use brightness instead (UnityUpgradable) -> brightness")] [System.Obsolete("Use brightness instead (UnityUpgradable) -> brightness")]
public float alpha public float alpha
{ {
get { return m_Brightness; } get { return m_Brightness; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_Brightness, value)) if (!Mathf.Approximately(m_Brightness, value))
{ {
m_Brightness = value; m_Brightness = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Brightness for shiny effect. /// Brightness for shiny effect.
/// </summary> /// </summary>
public float brightness public float brightness
{ {
get { return m_Brightness; } get { return m_Brightness; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_Brightness, value)) if (!Mathf.Approximately(m_Brightness, value))
{ {
m_Brightness = value; m_Brightness = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Gloss factor for shiny effect. /// Gloss factor for shiny effect.
/// </summary> /// </summary>
[System.Obsolete("Use gloss instead (UnityUpgradable) -> gloss")] [System.Obsolete("Use gloss instead (UnityUpgradable) -> gloss")]
public float highlight public float highlight
{ {
get { return m_Gloss; } get { return m_Gloss; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_Gloss, value)) if (!Mathf.Approximately(m_Gloss, value))
{ {
m_Gloss = value; m_Gloss = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Gloss factor for shiny effect. /// Gloss factor for shiny effect.
/// </summary> /// </summary>
public float gloss public float gloss
{ {
get { return m_Gloss; } get { return m_Gloss; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_Gloss, value)) if (!Mathf.Approximately(m_Gloss, value))
{ {
m_Gloss = value; m_Gloss = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Rotation for shiny effect. /// Rotation for shiny effect.
/// </summary> /// </summary>
public float rotation public float rotation
{ {
get { return m_Rotation; } get { return m_Rotation; }
set set
{ {
if (!Mathf.Approximately(m_Rotation, value)) if (!Mathf.Approximately(m_Rotation, value))
{ {
m_Rotation = _lastRotation = value; m_Rotation = _lastRotation = value;
SetVerticesDirty (); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// The area for effect. /// The area for effect.
/// </summary> /// </summary>
public EffectArea effectArea public EffectArea effectArea
{ {
get { return m_EffectArea; } get { return m_EffectArea; }
set set
{ {
if (m_EffectArea != value) if (m_EffectArea != value)
{ {
m_EffectArea = value; m_EffectArea = value;
SetVerticesDirty (); SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Play shinning on enable. /// Play shinning on enable.
/// </summary> /// </summary>
[System.Obsolete ("Use Play/Stop method instead")] [System.Obsolete("Use Play/Stop method instead")]
public bool play { get { return _player.play; } set { _player.play = value; } } public bool play { get { return _player.play; } set { _player.play = value; } }
/// <summary> /// <summary>
/// Play shinning loop. /// Play shinning loop.
/// </summary> /// </summary>
[System.Obsolete] [System.Obsolete]
public bool loop { get { return _player.loop; } set { _player.loop = value; } } public bool loop { get { return _player.loop; } set { _player.loop = value; } }
/// <summary> /// <summary>
/// Shinning duration. /// Shinning duration.
/// </summary> /// </summary>
public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } } public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } }
/// <summary> /// <summary>
/// Delay on loop. /// Delay on loop.
/// </summary> /// </summary>
[System.Obsolete] [System.Obsolete]
public float loopDelay { get { return _player.loopDelay; } set { _player.loopDelay = Mathf.Max(value, 0); } } public float loopDelay { get { return _player.loopDelay; } set { _player.loopDelay = Mathf.Max(value, 0); } }
/// <summary> /// <summary>
/// Shinning update mode. /// Shinning update mode.
/// </summary> /// </summary>
public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } } public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } }
/// <summary> /// <summary>
/// Gets the parameter texture. /// Gets the parameter texture.
/// </summary> /// </summary>
public override ParameterTexture ptex { get { return _ptex; } } public override ParameterTexture ptex { get { return _ptex; } }
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable(); base.OnEnable();
_player.OnEnable(f => effectFactor = f); _player.OnEnable(f => effectFactor = f);
} }
/// <summary> /// <summary>
/// This function is called when the behaviour becomes disabled () or inactive. /// This function is called when the behaviour becomes disabled () or inactive.
/// </summary> /// </summary>
protected override void OnDisable() protected override void OnDisable()
{ {
base.OnDisable(); base.OnDisable();
_player.OnDisable(); _player.OnDisable();
} }
#if UNITY_EDITOR #if UNITY_EDITOR
protected override Material GetMaterial() protected override Material GetMaterial()
{ {
if (isTMPro) if (isTMPro)
{ {
return null; return null;
} }
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName)); return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName));
} }
#pragma warning disable 0612 #pragma warning disable 0612
protected override void UpgradeIfNeeded() protected override void UpgradeIfNeeded()
{ {
// Upgrade for v3.0.0 // Upgrade for v3.0.0
if (IsShouldUpgrade(300)) if (IsShouldUpgrade(300))
{ {
_player.play = m_Play; _player.play = m_Play;
_player.duration = m_Duration; _player.duration = m_Duration;
_player.loop = m_Loop; _player.loop = m_Loop;
_player.loopDelay = m_LoopDelay; _player.loopDelay = m_LoopDelay;
_player.updateMode = m_UpdateMode; _player.updateMode = m_UpdateMode;
} }
} }
#pragma warning restore 0612 #pragma warning restore 0612
#endif #endif
/// <summary> /// <summary>
/// Modifies the mesh. /// Modifies the mesh.
/// </summary> /// </summary>
public override void ModifyMesh(VertexHelper vh) public override void ModifyMesh(VertexHelper vh)
{ {
if (!isActiveAndEnabled) if (!isActiveAndEnabled)
return; return;
bool isText = isTMPro || graphic is Text; bool isText = isTMPro || graphic is Text;
float normalizedIndex = ptex.GetNormalizedIndex(this); float normalizedIndex = ptex.GetNormalizedIndex(this);
// rect. // rect.
Rect rect = m_EffectArea.GetEffectArea (vh, rectTransform.rect); Rect rect = m_EffectArea.GetEffectArea(vh, rectTransform.rect);
// rotation. // rotation.
float rad = m_Rotation * Mathf.Deg2Rad; float rad = m_Rotation * Mathf.Deg2Rad;
Vector2 dir = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad)); Vector2 dir = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad));
dir.x *= rect.height / rect.width; dir.x *= rect.height / rect.width;
dir = dir.normalized; dir = dir.normalized;
// Calculate vertex position. // Calculate vertex position.
UIVertex vertex = default(UIVertex); UIVertex vertex = default(UIVertex);
Vector2 nomalizedPos; Vector2 nomalizedPos;
Matrix2x3 localMatrix = new Matrix2x3(rect, dir.x, dir.y); // Get local matrix. Matrix2x3 localMatrix = new Matrix2x3(rect, dir.x, dir.y); // Get local matrix.
for (int i = 0; i < vh.currentVertCount; i++) for (int i = 0; i < vh.currentVertCount; i++)
{ {
vh.PopulateUIVertex(ref vertex, i); vh.PopulateUIVertex(ref vertex, i);
m_EffectArea.GetNormalizedFactor (i, localMatrix, vertex.position, isText, out nomalizedPos); m_EffectArea.GetNormalizedFactor(i, localMatrix, vertex.position, isText, out nomalizedPos);
vertex.uv0 = new Vector2 ( vertex.uv0 = new Vector2(
Packer.ToFloat (vertex.uv0.x, vertex.uv0.y), Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
Packer.ToFloat (nomalizedPos.y, normalizedIndex) Packer.ToFloat(nomalizedPos.y, normalizedIndex)
); );
vh.SetUIVertex(vertex, i); vh.SetUIVertex(vertex, i);
} }
} }
/// <summary> /// <summary>
/// Play effect. /// Play effect.
/// </summary> /// </summary>
public void Play(bool reset = true) public void Play(bool reset = true)
{ {
_player.Play(reset); _player.Play(reset);
} }
/// <summary> /// <summary>
/// Stop effect. /// Stop effect.
/// </summary> /// </summary>
public void Stop(bool reset = true) public void Stop(bool reset = true)
{ {
_player.Stop(reset); _player.Stop(reset);
} }
protected override void SetDirty() protected override void SetDirty()
{ {
foreach (var m in materials) foreach (var m in materials)
{ {
ptex.RegisterMaterial (m); ptex.RegisterMaterial(m);
} }
ptex.SetData(this, 0, m_EffectFactor); // param1.x : location ptex.SetData(this, 0, m_EffectFactor); // param1.x : location
ptex.SetData(this, 1, m_Width); // param1.y : width ptex.SetData(this, 1, m_Width); // param1.y : width
ptex.SetData(this, 2, m_Softness); // param1.z : softness ptex.SetData(this, 2, m_Softness); // param1.z : softness
ptex.SetData(this, 3, m_Brightness);// param1.w : blightness ptex.SetData(this, 3, m_Brightness);// param1.w : blightness
ptex.SetData(this, 4, m_Gloss); // param2.x : gloss ptex.SetData(this, 4, m_Gloss); // param2.x : gloss
if (!Mathf.Approximately(_lastRotation, m_Rotation) && targetGraphic) if (!Mathf.Approximately(_lastRotation, m_Rotation) && targetGraphic)
{ {
_lastRotation = m_Rotation; _lastRotation = m_Rotation;
SetVerticesDirty(); SetVerticesDirty();
} }
} }
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
float _lastRotation; float _lastRotation;
EffectPlayer _player{ get { return m_Player ?? (m_Player = new EffectPlayer()); } } EffectPlayer _player { get { return m_Player ?? (m_Player = new EffectPlayer()); } }
} }
} }

View File

@ -1,356 +1,355 @@
using UnityEngine; using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;
using UnityEngine.Serialization;
namespace Coffee.UIExtensions namespace Coffee.UIExtensions
{ {
/// <summary> /// <summary>
/// Transition effect. /// Transition effect.
/// </summary> /// </summary>
[AddComponentMenu("UI/UIEffect/UITransitionEffect", 5)] [AddComponentMenu("UI/UIEffect/UITransitionEffect", 5)]
public class UITransitionEffect : UIEffectBase public class UITransitionEffect : UIEffectBase
{ {
//################################ //################################
// Constant or Static Members. // Constant or Static Members.
//################################ //################################
public const string shaderName = "UI/Hidden/UI-Effect-Transition"; public const string shaderName = "UI/Hidden/UI-Effect-Transition";
static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex"); static readonly ParameterTexture _ptex = new ParameterTexture(8, 128, "_ParamTex");
/// <summary> /// <summary>
/// Effect mode. /// Effect mode.
/// </summary> /// </summary>
public enum EffectMode public enum EffectMode
{ {
Fade = 1, Fade = 1,
Cutoff = 2, Cutoff = 2,
Dissolve = 3, Dissolve = 3,
} }
//################################ //################################
// Serialize Members. // Serialize Members.
//################################ //################################
[Tooltip("Effect mode.")] [Tooltip("Effect mode.")]
[SerializeField] EffectMode m_EffectMode = EffectMode.Cutoff; [SerializeField] EffectMode m_EffectMode = EffectMode.Cutoff;
[Tooltip("Effect factor between 0(hidden) and 1(shown).")] [Tooltip("Effect factor between 0(hidden) and 1(shown).")]
[SerializeField][Range(0, 1)] float m_EffectFactor = 1; [SerializeField][Range(0, 1)] float m_EffectFactor = 1;
[Tooltip("Transition texture (single channel texture).")] [Tooltip("Transition texture (single channel texture).")]
[SerializeField] Texture m_TransitionTexture; [SerializeField] Texture m_TransitionTexture;
[Header("Advanced Option")] [Header("Advanced Option")]
[Tooltip("The area for effect.")] [Tooltip("The area for effect.")]
[SerializeField] EffectArea m_EffectArea = EffectArea.RectTransform; [SerializeField] EffectArea m_EffectArea = EffectArea.RectTransform;
[Tooltip("Keep effect aspect ratio.")] [Tooltip("Keep effect aspect ratio.")]
[SerializeField] bool m_KeepAspectRatio; [SerializeField] bool m_KeepAspectRatio;
[Tooltip("Dissolve edge width.")] [Tooltip("Dissolve edge width.")]
[SerializeField] [Range(0, 1)] float m_DissolveWidth = 0.5f; [SerializeField][Range(0, 1)] float m_DissolveWidth = 0.5f;
[Tooltip("Dissolve edge softness.")] [Tooltip("Dissolve edge softness.")]
[SerializeField] [Range(0, 1)] float m_DissolveSoftness = 0.5f; [SerializeField][Range(0, 1)] float m_DissolveSoftness = 0.5f;
[Tooltip("Dissolve edge color.")] [Tooltip("Dissolve edge color.")]
[SerializeField] [ColorUsage(false)] Color m_DissolveColor = new Color(0.0f, 0.25f, 1.0f); [SerializeField][ColorUsage(false)] Color m_DissolveColor = new Color(0.0f, 0.25f, 1.0f);
[Tooltip("Disable graphic's raycast target on hidden.")] [Tooltip("Disable graphic's raycast target on hidden.")]
[SerializeField] bool m_PassRayOnHidden; [SerializeField] bool m_PassRayOnHidden;
[Header("Effect Player")] [Header("Effect Player")]
[SerializeField] EffectPlayer m_Player; [SerializeField] EffectPlayer m_Player;
//################################ //################################
// Public Members. // Public Members.
//################################ //################################
/// <summary> /// <summary>
/// Effect factor between 0(no effect) and 1(complete effect). /// Effect factor between 0(no effect) and 1(complete effect).
/// </summary> /// </summary>
public float effectFactor public float effectFactor
{ {
get { return m_EffectFactor; } get { return m_EffectFactor; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_EffectFactor, value)) if (!Mathf.Approximately(m_EffectFactor, value))
{ {
m_EffectFactor = value; m_EffectFactor = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Transition texture. /// Transition texture.
/// </summary> /// </summary>
public Texture transitionTexture public Texture transitionTexture
{ {
get { return m_TransitionTexture; } get { return m_TransitionTexture; }
set set
{ {
if (m_TransitionTexture != value) if (m_TransitionTexture != value)
{ {
m_TransitionTexture = value; m_TransitionTexture = value;
if (graphic) if (graphic)
{ {
ModifyMaterial(); ModifyMaterial();
} }
} }
} }
} }
/// <summary> /// <summary>
/// Effect mode. /// Effect mode.
/// </summary> /// </summary>
public EffectMode effectMode { get { return m_EffectMode; } } public EffectMode effectMode { get { return m_EffectMode; } }
/// <summary> /// <summary>
/// Keep aspect ratio. /// Keep aspect ratio.
/// </summary> /// </summary>
public bool keepAspectRatio public bool keepAspectRatio
{ {
get { return m_KeepAspectRatio; } get { return m_KeepAspectRatio; }
set set
{ {
if (m_KeepAspectRatio != value) if (m_KeepAspectRatio != value)
{ {
m_KeepAspectRatio = value; m_KeepAspectRatio = value;
targetGraphic.SetVerticesDirty(); targetGraphic.SetVerticesDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Gets the parameter texture. /// Gets the parameter texture.
/// </summary> /// </summary>
public override ParameterTexture ptex { get { return _ptex; } } public override ParameterTexture ptex { get { return _ptex; } }
/// <summary> /// <summary>
/// Dissolve edge width. /// Dissolve edge width.
/// </summary> /// </summary>
public float dissolveWidth public float dissolveWidth
{ {
get { return m_DissolveWidth; } get { return m_DissolveWidth; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_DissolveWidth, value)) if (!Mathf.Approximately(m_DissolveWidth, value))
{ {
m_DissolveWidth = value; m_DissolveWidth = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Dissolve edge softness. /// Dissolve edge softness.
/// </summary> /// </summary>
public float dissolveSoftness public float dissolveSoftness
{ {
get { return m_DissolveSoftness; } get { return m_DissolveSoftness; }
set set
{ {
value = Mathf.Clamp(value, 0, 1); value = Mathf.Clamp(value, 0, 1);
if (!Mathf.Approximately(m_DissolveSoftness, value)) if (!Mathf.Approximately(m_DissolveSoftness, value))
{ {
m_DissolveSoftness = value; m_DissolveSoftness = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Dissolve edge color. /// Dissolve edge color.
/// </summary> /// </summary>
public Color dissolveColor public Color dissolveColor
{ {
get { return m_DissolveColor; } get { return m_DissolveColor; }
set set
{ {
if (m_DissolveColor != value) if (m_DissolveColor != value)
{ {
m_DissolveColor = value; m_DissolveColor = value;
SetDirty(); SetDirty();
} }
} }
} }
/// <summary> /// <summary>
/// Duration for showing/hiding. /// Duration for showing/hiding.
/// </summary> /// </summary>
public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } } public float duration { get { return _player.duration; } set { _player.duration = Mathf.Max(value, 0.1f); } }
/// <summary> /// <summary>
/// Disable graphic's raycast target on hidden. /// Disable graphic's raycast target on hidden.
/// </summary> /// </summary>
public bool passRayOnHidden { get { return m_PassRayOnHidden; } set { m_PassRayOnHidden = value; } } public bool passRayOnHidden { get { return m_PassRayOnHidden; } set { m_PassRayOnHidden = value; } }
/// <summary> /// <summary>
/// Update mode for showing/hiding. /// Update mode for showing/hiding.
/// </summary> /// </summary>
public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } } public AnimatorUpdateMode updateMode { get { return _player.updateMode; } set { _player.updateMode = value; } }
/// <summary> /// <summary>
/// Show transition. /// Show transition.
/// </summary> /// </summary>
public void Show(bool reset = true) public void Show(bool reset = true)
{ {
_player.loop = false; _player.loop = false;
_player.Play(reset, f => effectFactor = f); _player.Play(reset, f => effectFactor = f);
} }
/// <summary> /// <summary>
/// Hide transition. /// Hide transition.
/// </summary> /// </summary>
public void Hide(bool reset = true) public void Hide(bool reset = true)
{ {
_player.loop = false; _player.loop = false;
_player.Play(reset, f => effectFactor = 1 - f); _player.Play(reset, f => effectFactor = 1 - f);
} }
/// <summary> /// <summary>
/// Modifies the material. /// Modifies the material.
/// </summary> /// </summary>
public override void ModifyMaterial() public override void ModifyMaterial()
{ {
if (isTMPro) if (isTMPro)
{ {
return; return;
} }
ulong hash = (m_TransitionTexture ? (uint)m_TransitionTexture.GetInstanceID() : 0) + ((ulong)2 << 32) + ((ulong)m_EffectMode << 36); 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)) if (_materialCache != null && (_materialCache.hash != hash || !isActiveAndEnabled || !m_EffectMaterial))
{ {
MaterialCache.Unregister(_materialCache); MaterialCache.Unregister(_materialCache);
_materialCache = null; _materialCache = null;
} }
if (!isActiveAndEnabled || !m_EffectMaterial) if (!isActiveAndEnabled || !m_EffectMaterial)
{ {
material = null; material = null;
} }
else if (!m_TransitionTexture) else if (!m_TransitionTexture)
{ {
material = m_EffectMaterial; material = m_EffectMaterial;
} }
else if (_materialCache != null && _materialCache.hash == hash) else if (_materialCache != null && _materialCache.hash == hash)
{ {
material = _materialCache.material; material = _materialCache.material;
} }
else else
{ {
_materialCache = MaterialCache.Register(hash, m_TransitionTexture, () => _materialCache = MaterialCache.Register(hash, m_TransitionTexture, () =>
{ {
var mat = new Material(m_EffectMaterial); var mat = new Material(m_EffectMaterial);
mat.name += "_" + m_TransitionTexture.name; mat.name += "_" + m_TransitionTexture.name;
mat.SetTexture("_NoiseTex", m_TransitionTexture); mat.SetTexture("_NoiseTex", m_TransitionTexture);
return mat; return mat;
}); });
material = _materialCache.material; material = _materialCache.material;
} }
} }
/// <summary> /// <summary>
/// Modifies the mesh. /// Modifies the mesh.
/// </summary> /// </summary>
public override void ModifyMesh(VertexHelper vh) public override void ModifyMesh(VertexHelper vh)
{ {
if (!isActiveAndEnabled) if (!isActiveAndEnabled)
{ {
return; return;
} }
bool isText = isTMPro || graphic is Text; bool isText = isTMPro || graphic is Text;
float normalizedIndex = ptex.GetNormalizedIndex (this); float normalizedIndex = ptex.GetNormalizedIndex(this);
// rect. // rect.
var tex = transitionTexture; var tex = transitionTexture;
var aspectRatio = m_KeepAspectRatio && tex ? ((float)tex.width) / tex.height : -1; var aspectRatio = m_KeepAspectRatio && tex ? ((float)tex.width) / tex.height : -1;
Rect rect = m_EffectArea.GetEffectArea (vh, rectTransform.rect, aspectRatio); Rect rect = m_EffectArea.GetEffectArea(vh, rectTransform.rect, aspectRatio);
// Set prameters to vertex. // Set prameters to vertex.
UIVertex vertex = default(UIVertex); UIVertex vertex = default(UIVertex);
float x, y; float x, y;
int count = vh.currentVertCount; int count = vh.currentVertCount;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
vh.PopulateUIVertex(ref vertex, i); vh.PopulateUIVertex(ref vertex, i);
m_EffectArea.GetPositionFactor (i, rect, vertex.position, isText, isTMPro, out x, out y); m_EffectArea.GetPositionFactor(i, rect, vertex.position, isText, isTMPro, out x, out y);
vertex.uv0 = new Vector2 ( vertex.uv0 = new Vector2(
Packer.ToFloat (vertex.uv0.x, vertex.uv0.y), Packer.ToFloat(vertex.uv0.x, vertex.uv0.y),
Packer.ToFloat (x, y, normalizedIndex) Packer.ToFloat(x, y, normalizedIndex)
); );
vh.SetUIVertex(vertex, i); vh.SetUIVertex(vertex, i);
} }
} }
//################################ //################################
// Protected Members. // Protected Members.
//################################ //################################
/// <summary> /// <summary>
/// This function is called when the object becomes enabled and active. /// This function is called when the object becomes enabled and active.
/// </summary> /// </summary>
protected override void OnEnable() protected override void OnEnable()
{ {
base.OnEnable(); base.OnEnable();
_player.OnEnable(null); _player.OnEnable(null);
_player.loop = false; _player.loop = false;
} }
/// <summary> /// <summary>
/// This function is called when the behaviour becomes disabled () or inactive. /// This function is called when the behaviour becomes disabled () or inactive.
/// </summary> /// </summary>
protected override void OnDisable() protected override void OnDisable()
{ {
base.OnDisable (); base.OnDisable();
MaterialCache.Unregister(_materialCache); MaterialCache.Unregister(_materialCache);
_materialCache = null; _materialCache = null;
_player.OnDisable(); _player.OnDisable();
} }
protected override void SetDirty() protected override void SetDirty()
{ {
foreach (var m in materials) foreach (var m in materials)
{ {
ptex.RegisterMaterial (m); ptex.RegisterMaterial(m);
} }
ptex.SetData(this, 0, m_EffectFactor); // param1.x : effect factor ptex.SetData(this, 0, m_EffectFactor); // param1.x : effect factor
if (m_EffectMode == EffectMode.Dissolve) if (m_EffectMode == EffectMode.Dissolve)
{ {
ptex.SetData(this, 1, m_DissolveWidth); // param1.y : width ptex.SetData(this, 1, m_DissolveWidth); // param1.y : width
ptex.SetData(this, 2, m_DissolveSoftness); // param1.z : softness ptex.SetData(this, 2, m_DissolveSoftness); // param1.z : softness
ptex.SetData(this, 4, m_DissolveColor.r); // param2.x : red ptex.SetData(this, 4, m_DissolveColor.r); // param2.x : red
ptex.SetData(this, 5, m_DissolveColor.g); // param2.y : green ptex.SetData(this, 5, m_DissolveColor.g); // param2.y : green
ptex.SetData(this, 6, m_DissolveColor.b); // param2.z : blue ptex.SetData(this, 6, m_DissolveColor.b); // param2.z : blue
} }
// Disable graphic's raycastTarget on hidden. // Disable graphic's raycastTarget on hidden.
if (m_PassRayOnHidden) if (m_PassRayOnHidden)
{ {
targetGraphic.raycastTarget = 0 < m_EffectFactor; targetGraphic.raycastTarget = 0 < m_EffectFactor;
} }
} }
#if UNITY_EDITOR #if UNITY_EDITOR
/// <summary> /// <summary>
/// Gets the material. /// Gets the material.
/// </summary> /// </summary>
/// <returns>The material.</returns> /// <returns>The material.</returns>
protected override Material GetMaterial() protected override Material GetMaterial()
{ {
return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode); return MaterialResolver.GetOrGenerateMaterialVariant(Shader.Find(shaderName), m_EffectMode);
} }
#endif #endif
//################################ //################################
// Private Members. // Private Members.
//################################ //################################
MaterialCache _materialCache = null; MaterialCache _materialCache = null;
EffectPlayer _player{ get { return m_Player ?? (m_Player = new EffectPlayer()); } } EffectPlayer _player { get { return m_Player ?? (m_Player = new EffectPlayer()); } }
} }
} }

View File

@ -2,7 +2,6 @@
// Created: 2018/07/13 // Created: 2018/07/13
#if true // MODULE_MARKER #if true // MODULE_MARKER
using System;
using DG.Tweening.Core; using DG.Tweening.Core;
using DG.Tweening.Plugins.Options; using DG.Tweening.Plugins.Options;
using UnityEngine; using UnityEngine;
@ -11,7 +10,7 @@ using UnityEngine.Audio; // Required for AudioMixer
#pragma warning disable 1591 #pragma warning disable 1591
namespace DG.Tweening namespace DG.Tweening
{ {
public static class DOTweenModuleAudio public static class DOTweenModuleAudio
{ {
#region Shortcuts #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> /// <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) public static TweenerCore<float, float, FloatOptions> DOSetFloat(this AudioMixer target, string floatName, float endValue, float duration)
{ {
TweenerCore<float, float, FloatOptions> t = DOTween.To(()=> { TweenerCore<float, float, FloatOptions> t = DOTween.To(() =>
float currVal; {
target.GetFloat(floatName, out currVal); float currVal;
return currVal; target.GetFloat(floatName, out currVal);
}, x=> target.SetFloat(floatName, x), endValue, duration); return currVal;
}, x => target.SetFloat(floatName, x), endValue, duration);
t.SetTarget(target); t.SetTarget(target);
return t; return t;
} }

View File

@ -1,6 +1,4 @@
using UnityEngine; #if false || EPO_DOTWEEN // MODULE_MARKER
#if false || EPO_DOTWEEN // MODULE_MARKER
using EPOOutline; using EPOOutline;
using DG.Tweening.Plugins.Options; using DG.Tweening.Plugins.Options;

View File

@ -2,7 +2,6 @@
// Created: 2018/07/13 // Created: 2018/07/13
#if true // MODULE_MARKER #if true // MODULE_MARKER
using System;
using DG.Tweening.Core; using DG.Tweening.Core;
using DG.Tweening.Core.Enums; using DG.Tweening.Core.Enums;
using DG.Tweening.Plugins; using DG.Tweening.Plugins;
@ -13,7 +12,7 @@ using UnityEngine;
#pragma warning disable 1591 #pragma warning disable 1591
namespace DG.Tweening namespace DG.Tweening
{ {
public static class DOTweenModulePhysics public static class DOTweenModulePhysics
{ {
#region Shortcuts #region Shortcuts
@ -116,8 +115,10 @@ namespace DG.Tweening
.SetOptions(AxisConstraint.Z, snapping).SetEase(Ease.Linear) .SetOptions(AxisConstraint.Z, snapping).SetEase(Ease.Linear)
).Join(yTween) ).Join(yTween)
.SetTarget(target).SetEase(DOTween.defaultEaseType); .SetTarget(target).SetEase(DOTween.defaultEaseType);
yTween.OnUpdate(() => { yTween.OnUpdate(() =>
if (!offsetYSet) { {
if (!offsetYSet)
{
offsetYSet = true; offsetYSet = true;
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; offsetY = s.isRelative ? endValue.y : endValue.y - startPosY;
} }
@ -211,6 +212,6 @@ namespace DG.Tweening
#endregion #endregion
#endregion #endregion
} }
} }
#endif #endif

View File

@ -2,7 +2,6 @@
// Created: 2018/07/13 // Created: 2018/07/13
#if true // MODULE_MARKER #if true // MODULE_MARKER
using System;
using DG.Tweening.Core; using DG.Tweening.Core;
using DG.Tweening.Plugins; using DG.Tweening.Plugins;
using DG.Tweening.Plugins.Core.PathCore; using DG.Tweening.Plugins.Core.PathCore;
@ -12,7 +11,7 @@ using UnityEngine;
#pragma warning disable 1591 #pragma warning disable 1591
namespace DG.Tweening namespace DG.Tweening
{ {
public static class DOTweenModulePhysics2D public static class DOTweenModulePhysics2D
{ {
#region Shortcuts #region Shortcuts
@ -87,8 +86,10 @@ namespace DG.Tweening
.SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear)
).Join(yTween) ).Join(yTween)
.SetTarget(target).SetEase(DOTween.defaultEaseType); .SetTarget(target).SetEase(DOTween.defaultEaseType);
yTween.OnUpdate(() => { yTween.OnUpdate(() =>
if (!offsetYSet) { {
if (!offsetYSet)
{
offsetYSet = true; offsetYSet = true;
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; offsetY = s.isRelative ? endValue.y : endValue.y - startPosY;
} }
@ -188,6 +189,6 @@ namespace DG.Tweening
#endregion #endregion
#endregion #endregion
} }
} }
#endif #endif

View File

@ -2,15 +2,14 @@
// Created: 2018/07/13 // Created: 2018/07/13
#if true // MODULE_MARKER #if true // MODULE_MARKER
using System;
using UnityEngine;
using DG.Tweening.Core; using DG.Tweening.Core;
using DG.Tweening.Plugins.Options; using DG.Tweening.Plugins.Options;
using UnityEngine;
#pragma warning disable 1591 #pragma warning disable 1591
namespace DG.Tweening namespace DG.Tweening
{ {
public static class DOTweenModuleSprite public static class DOTweenModuleSprite
{ {
#region Shortcuts #region Shortcuts
@ -45,9 +44,11 @@ namespace DG.Tweening
Sequence s = DOTween.Sequence(); Sequence s = DOTween.Sequence();
GradientColorKey[] colors = gradient.colorKeys; GradientColorKey[] colors = gradient.colorKeys;
int len = colors.Length; int len = colors.Length;
for (int i = 0; i < len; ++i) { for (int i = 0; i < len; ++i)
{
GradientColorKey c = colors[i]; GradientColorKey c = colors[i];
if (i == 0 && c.time <= 0) { if (i == 0 && c.time <= 0)
{
target.color = c.color; target.color = c.color;
continue; continue;
} }
@ -75,11 +76,12 @@ namespace DG.Tweening
{ {
endValue = endValue - target.color; endValue = endValue - target.color;
Color to = new Color(0, 0, 0, 0); Color to = new Color(0, 0, 0, 0);
return DOTween.To(() => to, x => { return DOTween.To(() => to, x =>
Color diff = x - to; {
to = x; Color diff = x - to;
target.color += diff; to = x;
}, endValue, duration) target.color += diff;
}, endValue, duration)
.Blendable().SetTarget(target); .Blendable().SetTarget(target);
} }
@ -88,6 +90,6 @@ namespace DG.Tweening
#endregion #endregion
#endregion #endregion
} }
} }
#endif #endif

View File

@ -3,21 +3,20 @@
#if true // MODULE_MARKER #if true // MODULE_MARKER
using System;
using System.Globalization;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening.Core; using DG.Tweening.Core;
using DG.Tweening.Core.Enums; using DG.Tweening.Core.Enums;
using DG.Tweening.Plugins; using DG.Tweening.Plugins;
using DG.Tweening.Plugins.Options; using DG.Tweening.Plugins.Options;
using System.Globalization;
using UnityEngine;
using UnityEngine.UI;
using Outline = UnityEngine.UI.Outline; using Outline = UnityEngine.UI.Outline;
using Text = UnityEngine.UI.Text; using Text = UnityEngine.UI.Text;
#pragma warning disable 1591 #pragma warning disable 1591
namespace DG.Tweening namespace DG.Tweening
{ {
public static class DOTweenModuleUI public static class DOTweenModuleUI
{ {
#region Shortcuts #region Shortcuts
@ -102,9 +101,11 @@ namespace DG.Tweening
Sequence s = DOTween.Sequence(); Sequence s = DOTween.Sequence();
GradientColorKey[] colors = gradient.colorKeys; GradientColorKey[] colors = gradient.colorKeys;
int len = colors.Length; int len = colors.Length;
for (int i = 0; i < len; ++i) { for (int i = 0; i < len; ++i)
{
GradientColorKey c = colors[i]; GradientColorKey c = colors[i];
if (i == 0 && c.time <= 0) { if (i == 0 && c.time <= 0)
{
target.color = c.color; target.color = c.color;
continue; continue;
} }
@ -127,10 +128,11 @@ namespace DG.Tweening
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param> /// <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) 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 => { TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.flexibleWidth, target.flexibleHeight), x =>
target.flexibleWidth = x.x; {
target.flexibleHeight = x.y; target.flexibleWidth = x.x;
}, endValue, duration); target.flexibleHeight = x.y;
}, endValue, duration);
t.SetOptions(snapping).SetTarget(target); t.SetOptions(snapping).SetTarget(target);
return t; return t;
} }
@ -141,7 +143,8 @@ namespace DG.Tweening
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param> /// <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) 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.minWidth = x.x;
target.minHeight = x.y; target.minHeight = x.y;
}, endValue, duration); }, endValue, duration);
@ -155,7 +158,8 @@ namespace DG.Tweening
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param> /// <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) 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.preferredWidth = x.x;
target.preferredHeight = x.y; target.preferredHeight = x.y;
}, endValue, duration); }, 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)) 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() .SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative()
.SetLoops(numJumps * 2, LoopType.Yoyo) .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) s.Append(DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue.x, 0), duration)
.SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear) .SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear)
).Join(yTween) ).Join(yTween)
.SetTarget(target).SetEase(DOTween.defaultEaseType); .SetTarget(target).SetEase(DOTween.defaultEaseType);
s.OnUpdate(() => { s.OnUpdate(() =>
if (!offsetYSet) { {
if (!offsetYSet)
{
offsetYSet = true; offsetYSet = true;
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY; 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) public static Tweener DONormalizedPos(this ScrollRect target, Vector2 endValue, float duration, bool snapping = false)
{ {
return DOTween.To(() => new Vector2(target.horizontalNormalizedPosition, target.verticalNormalizedPosition), return DOTween.To(() => new Vector2(target.horizontalNormalizedPosition, target.verticalNormalizedPosition),
x => { x =>
{
target.horizontalNormalizedPosition = x.x; target.horizontalNormalizedPosition = x.x;
target.verticalNormalizedPosition = x.y; target.verticalNormalizedPosition = x.y;
}, endValue, duration) }, endValue, duration)
@ -498,10 +505,12 @@ namespace DG.Tweening
/// <param name="culture">The <see cref="CultureInfo"/> to use (InvariantCulture if NULL)</param> /// <param name="culture">The <see cref="CultureInfo"/> to use (InvariantCulture if NULL)</param>
public static TweenerCore<int, int, NoOptions> DOCounter( public static TweenerCore<int, int, NoOptions> DOCounter(
this Text target, int fromValue, int endValue, float duration, bool addThousandsSeparator = true, CultureInfo culture = null this Text target, int fromValue, int endValue, float duration, bool addThousandsSeparator = true, CultureInfo culture = null
){ )
{
int v = fromValue; int v = fromValue;
CultureInfo cInfo = !addThousandsSeparator ? null : culture ?? CultureInfo.InvariantCulture; 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; v = x;
target.text = addThousandsSeparator target.text = addThousandsSeparator
? v.ToString("N0", cInfo) ? v.ToString("N0", cInfo)
@ -532,7 +541,8 @@ namespace DG.Tweening
/// Leave it to NULL (default) to use default ones</param> /// 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) 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"); 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 = ""; endValue = "";
} }
@ -557,7 +567,8 @@ namespace DG.Tweening
{ {
endValue = endValue - target.color; endValue = endValue - target.color;
Color to = new Color(0, 0, 0, 0); Color to = new Color(0, 0, 0, 0);
return DOTween.To(() => to, x => { return DOTween.To(() => to, x =>
{
Color diff = x - to; Color diff = x - to;
to = x; to = x;
target.color += diff; target.color += diff;
@ -578,7 +589,8 @@ namespace DG.Tweening
{ {
endValue = endValue - target.color; endValue = endValue - target.color;
Color to = new Color(0, 0, 0, 0); Color to = new Color(0, 0, 0, 0);
return DOTween.To(() => to, x => { return DOTween.To(() => to, x =>
{
Color diff = x - to; Color diff = x - to;
to = x; to = x;
target.color += diff; target.color += diff;
@ -599,7 +611,8 @@ namespace DG.Tweening
{ {
endValue = endValue - target.color; endValue = endValue - target.color;
Color to = new Color(0, 0, 0, 0); Color to = new Color(0, 0, 0, 0);
return DOTween.To(() => to, x => { return DOTween.To(() => to, x =>
{
Color diff = x - to; Color diff = x - to;
to = x; to = x;
target.color += diff; target.color += diff;
@ -657,6 +670,6 @@ namespace DG.Tweening
return to.anchoredPosition + localPoint - pivotDerivedOffset; return to.anchoredPosition + localPoint - pivotDerivedOffset;
} }
} }
} }
} }
#endif #endif

View File

@ -1,10 +1,9 @@
// Author: Daniele Giardini - http://www.demigiant.com // Author: Daniele Giardini - http://www.demigiant.com
// Created: 2018/07/13 // Created: 2018/07/13
using System;
using UnityEngine;
using DG.Tweening.Core; using DG.Tweening.Core;
using DG.Tweening.Plugins.Options; using DG.Tweening.Plugins.Options;
using UnityEngine;
//#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0) //#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0)
//using Task = System.Threading.Tasks.Task; //using Task = System.Threading.Tasks.Task;
//#endif //#endif
@ -29,9 +28,11 @@ namespace DG.Tweening
Sequence s = DOTween.Sequence(); Sequence s = DOTween.Sequence();
GradientColorKey[] colors = gradient.colorKeys; GradientColorKey[] colors = gradient.colorKeys;
int len = colors.Length; int len = colors.Length;
for (int i = 0; i < len; ++i) { for (int i = 0; i < len; ++i)
{
GradientColorKey c = colors[i]; GradientColorKey c = colors[i];
if (i == 0 && c.time <= 0) { if (i == 0 && c.time <= 0)
{
target.color = c.color; target.color = c.color;
continue; continue;
} }
@ -54,9 +55,11 @@ namespace DG.Tweening
Sequence s = DOTween.Sequence(); Sequence s = DOTween.Sequence();
GradientColorKey[] colors = gradient.colorKeys; GradientColorKey[] colors = gradient.colorKeys;
int len = colors.Length; int len = colors.Length;
for (int i = 0; i < len; ++i) { for (int i = 0; i < len; ++i)
{
GradientColorKey c = colors[i]; GradientColorKey c = colors[i];
if (i == 0 && c.time <= 0) { if (i == 0 && c.time <= 0)
{
target.SetColor(property, c.color); target.SetColor(property, c.color);
continue; continue;
} }
@ -80,7 +83,8 @@ namespace DG.Tweening
/// </summary> /// </summary>
public static CustomYieldInstruction WaitForCompletion(this Tween t, bool returnCustomYieldInstruction) public static CustomYieldInstruction WaitForCompletion(this Tween t, bool returnCustomYieldInstruction)
{ {
if (!t.active) { if (!t.active)
{
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return null; return null;
} }
@ -94,7 +98,8 @@ namespace DG.Tweening
/// </summary> /// </summary>
public static CustomYieldInstruction WaitForRewind(this Tween t, bool returnCustomYieldInstruction) public static CustomYieldInstruction WaitForRewind(this Tween t, bool returnCustomYieldInstruction)
{ {
if (!t.active) { if (!t.active)
{
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return null; return null;
} }
@ -108,7 +113,8 @@ namespace DG.Tweening
/// </summary> /// </summary>
public static CustomYieldInstruction WaitForKill(this Tween t, bool returnCustomYieldInstruction) public static CustomYieldInstruction WaitForKill(this Tween t, bool returnCustomYieldInstruction)
{ {
if (!t.active) { if (!t.active)
{
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return null; return null;
} }
@ -123,7 +129,8 @@ namespace DG.Tweening
/// <param name="elapsedLoops">Elapsed loops to wait for</param> /// <param name="elapsedLoops">Elapsed loops to wait for</param>
public static CustomYieldInstruction WaitForElapsedLoops(this Tween t, int elapsedLoops, bool returnCustomYieldInstruction) public static CustomYieldInstruction WaitForElapsedLoops(this Tween t, int elapsedLoops, bool returnCustomYieldInstruction)
{ {
if (!t.active) { if (!t.active)
{
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return null; return null;
} }
@ -139,7 +146,8 @@ namespace DG.Tweening
/// <param name="position">Position (loops included, delays excluded) to wait for</param> /// <param name="position">Position (loops included, delays excluded) to wait for</param>
public static CustomYieldInstruction WaitForPosition(this Tween t, float position, bool returnCustomYieldInstruction) public static CustomYieldInstruction WaitForPosition(this Tween t, float position, bool returnCustomYieldInstruction)
{ {
if (!t.active) { if (!t.active)
{
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return null; return null;
} }
@ -154,7 +162,8 @@ namespace DG.Tweening
/// </summary> /// </summary>
public static CustomYieldInstruction WaitForStart(this Tween t, bool returnCustomYieldInstruction) public static CustomYieldInstruction WaitForStart(this Tween t, bool returnCustomYieldInstruction)
{ {
if (!t.active) { if (!t.active)
{
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return null; return null;
} }
@ -175,7 +184,8 @@ namespace DG.Tweening
/// <param name="duration">The duration of the tween</param> /// <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) 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); if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID);
return null; return null;
} }
@ -191,7 +201,8 @@ namespace DG.Tweening
/// <param name="duration">The duration of the tween</param> /// <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) 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); if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID);
return null; return null;
} }
@ -215,7 +226,8 @@ namespace DG.Tweening
/// </summary> /// </summary>
public static async System.Threading.Tasks.Task AsyncWaitForCompletion(this Tween t) public static async System.Threading.Tasks.Task AsyncWaitForCompletion(this Tween t)
{ {
if (!t.active) { if (!t.active)
{
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return; return;
} }
@ -229,7 +241,8 @@ namespace DG.Tweening
/// </summary> /// </summary>
public static async System.Threading.Tasks.Task AsyncWaitForRewind(this Tween t) public static async System.Threading.Tasks.Task AsyncWaitForRewind(this Tween t)
{ {
if (!t.active) { if (!t.active)
{
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return; return;
} }
@ -243,7 +256,8 @@ namespace DG.Tweening
/// </summary> /// </summary>
public static async System.Threading.Tasks.Task AsyncWaitForKill(this Tween t) public static async System.Threading.Tasks.Task AsyncWaitForKill(this Tween t)
{ {
if (!t.active) { if (!t.active)
{
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return; return;
} }
@ -258,7 +272,8 @@ namespace DG.Tweening
/// <param name="elapsedLoops">Elapsed loops to wait for</param> /// <param name="elapsedLoops">Elapsed loops to wait for</param>
public static async System.Threading.Tasks.Task AsyncWaitForElapsedLoops(this Tween t, int elapsedLoops) 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); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return; return;
} }
@ -274,7 +289,8 @@ namespace DG.Tweening
/// <param name="position">Position (loops included, delays excluded) to wait for</param> /// <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) 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); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return; return;
} }
@ -288,7 +304,8 @@ namespace DG.Tweening
/// </summary> /// </summary>
public static async System.Threading.Tasks.Task AsyncWaitForStart(this Tween t) public static async System.Threading.Tasks.Task AsyncWaitForStart(this Tween t)
{ {
if (!t.active) { if (!t.active)
{
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t); if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return; return;
} }
@ -312,9 +329,13 @@ namespace DG.Tweening
{ {
public class WaitForCompletion : CustomYieldInstruction public class WaitForCompletion : CustomYieldInstruction
{ {
public override bool keepWaiting { get { public override bool keepWaiting
return t.active && !t.IsComplete(); {
}} get
{
return t.active && !t.IsComplete();
}
}
readonly Tween t; readonly Tween t;
public WaitForCompletion(Tween tween) public WaitForCompletion(Tween tween)
{ {
@ -324,9 +345,13 @@ namespace DG.Tweening
public class WaitForRewind : CustomYieldInstruction public class WaitForRewind : CustomYieldInstruction
{ {
public override bool keepWaiting { get { public override bool keepWaiting
return t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0); {
}} get
{
return t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0);
}
}
readonly Tween t; readonly Tween t;
public WaitForRewind(Tween tween) public WaitForRewind(Tween tween)
{ {
@ -336,9 +361,13 @@ namespace DG.Tweening
public class WaitForKill : CustomYieldInstruction public class WaitForKill : CustomYieldInstruction
{ {
public override bool keepWaiting { get { public override bool keepWaiting
return t.active; {
}} get
{
return t.active;
}
}
readonly Tween t; readonly Tween t;
public WaitForKill(Tween tween) public WaitForKill(Tween tween)
{ {
@ -348,9 +377,13 @@ namespace DG.Tweening
public class WaitForElapsedLoops : CustomYieldInstruction public class WaitForElapsedLoops : CustomYieldInstruction
{ {
public override bool keepWaiting { get { public override bool keepWaiting
return t.active && t.CompletedLoops() < elapsedLoops; {
}} get
{
return t.active && t.CompletedLoops() < elapsedLoops;
}
}
readonly Tween t; readonly Tween t;
readonly int elapsedLoops; readonly int elapsedLoops;
public WaitForElapsedLoops(Tween tween, int elapsedLoops) public WaitForElapsedLoops(Tween tween, int elapsedLoops)
@ -362,9 +395,13 @@ namespace DG.Tweening
public class WaitForPosition : CustomYieldInstruction public class WaitForPosition : CustomYieldInstruction
{ {
public override bool keepWaiting { get { public override bool keepWaiting
return t.active && t.position * (t.CompletedLoops() + 1) < position; {
}} get
{
return t.active && t.position * (t.CompletedLoops() + 1) < position;
}
}
readonly Tween t; readonly Tween t;
readonly float position; readonly float position;
public WaitForPosition(Tween tween, float position) public WaitForPosition(Tween tween, float position)
@ -376,9 +413,13 @@ namespace DG.Tweening
public class WaitForStart : CustomYieldInstruction public class WaitForStart : CustomYieldInstruction
{ {
public override bool keepWaiting { get { public override bool keepWaiting
return t.active && !t.playedOnce; {
}} get
{
return t.active && !t.playedOnce;
}
}
readonly Tween t; readonly Tween t;
public WaitForStart(Tween tween) public WaitForStart(Tween tween)
{ {

View File

@ -1,12 +1,12 @@
// Author: Daniele Giardini - http://www.demigiant.com // Author: Daniele Giardini - http://www.demigiant.com
// Created: 2018/07/13 // Created: 2018/07/13
using System;
using System.Reflection;
using UnityEngine;
using DG.Tweening.Core; using DG.Tweening.Core;
using DG.Tweening.Plugins.Core.PathCore; using DG.Tweening.Plugins.Core.PathCore;
using DG.Tweening.Plugins.Options; using DG.Tweening.Plugins.Options;
using System;
using System.Reflection;
using UnityEngine;
#pragma warning disable 1591 #pragma warning disable 1591
namespace DG.Tweening 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) // 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 #if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1
static void PlaymodeStateChanged() static void PlaymodeStateChanged()
#else #else
static void PlaymodeStateChanged(UnityEditor.PlayModeStateChange state) static void PlaymodeStateChanged(UnityEditor.PlayModeStateChange state)
#endif #endif
{ {
@ -128,13 +128,16 @@ namespace DG.Tweening
#endif #endif
public static TweenerCore<Vector3, Path, PathOptions> CreateDOTweenPathTween( public static TweenerCore<Vector3, Path, PathOptions> CreateDOTweenPathTween(
MonoBehaviour target, bool tweenRigidbody, bool isLocal, Path path, float duration, PathMode pathMode MonoBehaviour target, bool tweenRigidbody, bool isLocal, Path path, float duration, PathMode pathMode
){ )
{
TweenerCore<Vector3, Path, PathOptions> t = null; TweenerCore<Vector3, Path, PathOptions> t = null;
bool rBodyFoundAndTweened = false; bool rBodyFoundAndTweened = false;
#if true // PHYSICS_MARKER #if true // PHYSICS_MARKER
if (tweenRigidbody) { if (tweenRigidbody)
{
Rigidbody rBody = target.GetComponent<Rigidbody>(); Rigidbody rBody = target.GetComponent<Rigidbody>();
if (rBody != null) { if (rBody != null)
{
rBodyFoundAndTweened = true; rBodyFoundAndTweened = true;
t = isLocal t = isLocal
? rBody.DOLocalPath(path, duration, pathMode) ? rBody.DOLocalPath(path, duration, pathMode)
@ -143,9 +146,11 @@ namespace DG.Tweening
} }
#endif #endif
#if true // PHYSICS2D_MARKER #if true // PHYSICS2D_MARKER
if (!rBodyFoundAndTweened && tweenRigidbody) { if (!rBodyFoundAndTweened && tweenRigidbody)
{
Rigidbody2D rBody2D = target.GetComponent<Rigidbody2D>(); Rigidbody2D rBody2D = target.GetComponent<Rigidbody2D>();
if (rBody2D != null) { if (rBody2D != null)
{
rBodyFoundAndTweened = true; rBodyFoundAndTweened = true;
t = isLocal t = isLocal
? rBody2D.DOLocalPath(path, duration, pathMode) ? rBody2D.DOLocalPath(path, duration, pathMode)
@ -153,7 +158,8 @@ namespace DG.Tweening
} }
} }
#endif #endif
if (!rBodyFoundAndTweened) { if (!rBodyFoundAndTweened)
{
t = isLocal t = isLocal
? target.transform.DOLocalPath(path, duration, pathMode) ? target.transform.DOLocalPath(path, duration, pathMode)
: target.transform.DOPath(path, duration, pathMode); : target.transform.DOPath(path, duration, pathMode);

View 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: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 25f1c28c99920124189b7173731c38b5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -528,6 +528,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 5f9054446a969bf4eaf7998f3ba23334, type: 3} m_Script: {fileID: 11500000, guid: 5f9054446a969bf4eaf7998f3ba23334, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
animator: {fileID: 8744505332349586225}
--- !u!1 &2500436782395572584 --- !u!1 &2500436782395572584
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -649,7 +650,7 @@ RectTransform:
m_AnchorMin: {x: 1, y: 0} m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0} 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} m_Pivot: {x: 0, y: 0.5}
--- !u!114 &4478785627166277611 --- !u!114 &4478785627166277611
MonoBehaviour: MonoBehaviour:

View File

@ -1,5 +1,57 @@
%YAML 1.1 %YAML 1.1
%TAG !u! tag:unity3d.com,2011: %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 --- !u!91 &9100000
AnimatorController: AnimatorController:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -8,7 +60,19 @@ AnimatorController:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: SelectBorder m_Name: SelectBorder
serializedVersion: 5 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: m_AnimatorLayers:
- serializedVersion: 5 - serializedVersion: 5
m_Name: Base Layer m_Name: Base Layer
@ -33,7 +97,10 @@ AnimatorStateMachine:
m_ChildStates: m_ChildStates:
- serializedVersion: 1 - serializedVersion: 1
m_State: {fileID: 5956899137579874003} 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_ChildStateMachines: []
m_AnyStateTransitions: [] m_AnyStateTransitions: []
m_EntryTransitions: [] m_EntryTransitions: []
@ -44,6 +111,31 @@ AnimatorStateMachine:
m_ExitPosition: {x: 800, y: 120, z: 0} m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 5956899137579874003} 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 --- !u!1102 &5956899137579874003
AnimatorState: AnimatorState:
serializedVersion: 6 serializedVersion: 6
@ -51,10 +143,12 @@ AnimatorState:
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: DEFAULT m_Name: Enable
m_Speed: 1.6 m_Speed: 1.6
m_CycleOffset: 0 m_CycleOffset: 0
m_Transitions: [] m_Transitions:
- {fileID: -6499513247890378152}
- {fileID: 1182501105974621518}
m_StateMachineBehaviours: [] m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0} m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0 m_IKOnFeet: 0
@ -70,3 +164,28 @@ AnimatorState:
m_MirrorParameter: m_MirrorParameter:
m_CycleOffsetParameter: m_CycleOffsetParameter:
m_TimeParameter: 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

View File

@ -1,27 +1,27 @@
using AxibugEmuOnline.Client.Manager; using AxibugEmuOnline.Client.Manager;
using AxibugEmuOnline.Client.Network; using AxibugEmuOnline.Client.Network;
using System.Collections; using System.Collections;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using UnityEngine; using UnityEngine;
using UnityEngine.Networking; using UnityEngine.Networking;
using static AxibugEmuOnline.Client.HttpAPI; using static AxibugEmuOnline.Client.HttpAPI;
using static AxibugEmuOnline.Client.Manager.LogManager; using static AxibugEmuOnline.Client.Manager.LogManager;
namespace AxibugEmuOnline.Client.ClientCore namespace AxibugEmuOnline.Client.ClientCore
{ {
public static class App public static class App
{ {
public static string TokenStr; public static string TokenStr;
public static string IP; public static string IP;
public static int Port; public static int Port;
public static LogManager log; public static LogManager log;
public static NetworkHelper network; public static NetworkHelper network;
public static AppLogin login; public static AppLogin login;
public static AppChat chat; public static AppChat chat;
public static UserDataManager user; public static UserDataManager user;
//public static AppNetGame netgame; //public static AppNetGame netgame;
public static AppEmu emu; public static AppEmu emu;
public static RomLib nesRomLib; public static RomLib nesRomLib;
public static HttpAPI httpAPI; public static HttpAPI httpAPI;
public static CacheManager CacheMgr; public static CacheManager CacheMgr;
@ -39,50 +39,50 @@ namespace AxibugEmuOnline.Client.ClientCore
#else #else
public static string PersistentDataPath => Application.persistentDataPath; public static string PersistentDataPath => Application.persistentDataPath;
#endif #endif
public static void Init(Initer initer) public static void Init(Initer initer)
{ {
settings = new AppSettings(); settings = new AppSettings();
log = new LogManager(); log = new LogManager();
LogManager.OnLog += OnNoSugarNetLog; LogManager.OnLog += OnNoSugarNetLog;
network = new NetworkHelper(); network = new NetworkHelper();
login = new AppLogin(); login = new AppLogin();
chat = new AppChat(); chat = new AppChat();
user = new UserDataManager(); user = new UserDataManager();
emu = new AppEmu(); emu = new AppEmu();
//netgame = new AppNetGame(); //netgame = new AppNetGame();
httpAPI = new HttpAPI(); httpAPI = new HttpAPI();
nesRomLib = new RomLib(EnumPlatform.NES); nesRomLib = new RomLib(EnumPlatform.NES);
CacheMgr = new CacheManager(); CacheMgr = new CacheManager();
roomMgr = new AppRoom(); roomMgr = new AppRoom();
share = new AppShare(); share = new AppShare();
filter = new FilterManager(initer.m_filterVolume, initer.m_filterPreview, initer.m_xmbBg); filter = new FilterManager(initer.m_filterVolume, initer.m_filterPreview, initer.m_xmbBg);
var go = new GameObject("[AppAxibugEmuOnline]"); var go = new GameObject("[AppAxibugEmuOnline]");
GameObject.DontDestroyOnLoad(go); GameObject.DontDestroyOnLoad(go);
tickLoop = go.AddComponent<TickLoop>(); tickLoop = go.AddComponent<TickLoop>();
coRunner = go.AddComponent<CoroutineRunner>(); coRunner = go.AddComponent<CoroutineRunner>();
if (UnityEngine.Application.platform == RuntimePlatform.PSP2) if (UnityEngine.Application.platform == RuntimePlatform.PSP2)
{ {
//PSV 等平台需要手动创建目录 //PSV 等平台需要手动创建目录
PersistentDataPathDir(); PersistentDataPathDir();
} }
var importNode = GameObject.Find("IMPORTENT"); var importNode = GameObject.Find("IMPORTENT");
if (importNode != null) GameObject.DontDestroyOnLoad(importNode); if (importNode != null) GameObject.DontDestroyOnLoad(importNode);
StartCoroutine(AppTickFlow()); StartCoroutine(AppTickFlow());
RePullNetInfo(); RePullNetInfo();
} }
private static void PersistentDataPathDir() private static void PersistentDataPathDir()
{ {
if (!Directory.Exists(PersistentDataPath)) if (!Directory.Exists(PersistentDataPath))
{ {
Directory.CreateDirectory(PersistentDataPath); Directory.CreateDirectory(PersistentDataPath);
} }
} }
private static IEnumerator AppTickFlow() private static IEnumerator AppTickFlow()
{ {
while (true) while (true)
@ -93,7 +93,7 @@ namespace AxibugEmuOnline.Client.ClientCore
} }
public static void RePullNetInfo() public static void RePullNetInfo()
{ {
StartCoroutine(StartNetInit()); StartCoroutine(StartNetInit());
} }
@ -103,12 +103,12 @@ namespace AxibugEmuOnline.Client.ClientCore
yield break; yield break;
int platform = 0; int platform = 0;
bool bTest = false; bool bTest = false;
if (bTest) if (bTest)
{ {
yield return null; yield return null;
Connect("192.168.0.47", 10492); Connect("192.168.0.47", 10492);
yield break; yield break;
} }
UnityWebRequest request = UnityWebRequest.Get($"{App.httpAPI.WebSiteApi}/CheckStandInfo?platform={platform}&version={Application.version}"); 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) public static Coroutine StartCoroutine(IEnumerator itor)
{ {
return coRunner.StartCoroutine(itor); return coRunner.StartCoroutine(itor);
} }
public static void StopCoroutine(Coroutine cor) public static void StopCoroutine(Coroutine cor)
{ {
coRunner.StopCoroutine(cor); coRunner.StopCoroutine(cor);
} }
public static void Connect(string IP, int port) public static void Connect(string IP, int port)
{ {
Task task = new Task(() => Task task = new Task(() =>
{ {
network.Init(IP, port); network.Init(IP, port);
}); });
task.Start(); task.Start();
} }
public static void Close() public static void Close()
{
App.log.Info("停止");
}
static void OnNoSugarNetLog(int LogLevel, string msg)
{ {
E_LogType logType = (E_LogType)LogLevel; App.log.Info("停止");
}
static void OnNoSugarNetLog(int LogLevel, string msg)
{
E_LogType logType = (E_LogType)LogLevel;
switch (logType) switch (logType)
{ {
case E_LogType.Debug: case E_LogType.Debug:
case E_LogType.Info: case E_LogType.Info:
Debug.Log("[AxiEmu]:" + msg); Debug.Log("[AxiEmu]:" + msg);
break; break;
case E_LogType.Warning: case E_LogType.Warning:
Debug.LogWarning("[AxiEmu]:" + msg); Debug.LogWarning("[AxiEmu]:" + msg);
break; break;
case E_LogType.Error: case E_LogType.Error:
Debug.LogError("[AxiEmu]:" + msg); Debug.LogError("[AxiEmu]:" + msg);
break; break;
} }
} }
} }
} }

View File

@ -1,7 +1,3 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client
{ {
public static class EventInvoker public static class EventInvoker

View File

@ -1,6 +1,4 @@
using AxibugEmuOnline.Client; using AxibugEmuOnline.Client;
using AxibugEmuOnline.Client.ClientCore;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.Rendering.PostProcessing; using UnityEngine.Rendering.PostProcessing;

View File

@ -6,7 +6,7 @@ using UnityEngine.Rendering.PostProcessing;
[PostProcess(typeof(MattiasCRTRenderer), PostProcessEvent.BeforeStack, "Filter/MattiasCRT")] [PostProcess(typeof(MattiasCRTRenderer), PostProcessEvent.BeforeStack, "Filter/MattiasCRT")]
public sealed class MattiasCRT : FilterEffect public sealed class MattiasCRT : FilterEffect
{ {
public override string Name => nameof(MattiasCRT); public override string Name => nameof(MattiasCRT);
} }
public sealed class MattiasCRTRenderer : PostProcessEffectRenderer<MattiasCRT> public sealed class MattiasCRTRenderer : PostProcessEffectRenderer<MattiasCRT>

View File

@ -1,7 +1,4 @@
using System.Collections.Generic; namespace AxibugEmuOnline.Client
using UnityEngine;
namespace AxibugEmuOnline.Client
{ {
public abstract class CommandChanger : IKeyMapperChanger public abstract class CommandChanger : IKeyMapperChanger
{ {

View File

@ -3,7 +3,6 @@ using AxibugEmuOnline.Client.Common;
using AxibugEmuOnline.Client.Event; using AxibugEmuOnline.Client.Event;
using AxibugEmuOnline.Client.Network; using AxibugEmuOnline.Client.Network;
using AxibugProtobuf; using AxibugProtobuf;
using System;
namespace AxibugEmuOnline.Client.Manager namespace AxibugEmuOnline.Client.Manager
{ {

View File

@ -1,9 +1,9 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Event; using AxibugEmuOnline.Client.Event;
using UnityEngine; using UnityEngine;
namespace AxibugEmuOnline.Client.Manager namespace AxibugEmuOnline.Client.Manager
{ {
public class AppEmu public class AppEmu
{ {
/// <summary> /// <summary>
@ -58,8 +58,8 @@ namespace AxibugEmuOnline.Client.Manager
InGameUI.Instance.Show(romFile, m_emuCore); InGameUI.Instance.Show(romFile, m_emuCore);
m_emuCore.SetupScheme(); m_emuCore.SetupScheme();
} }
public void StopGame() public void StopGame()
{ {
if (m_emuCore.IsNull()) return; if (m_emuCore.IsNull()) return;
@ -76,5 +76,5 @@ namespace AxibugEmuOnline.Client.Manager
m_emuCore.DoReset(); m_emuCore.DoReset();
} }
} }
} }

View File

@ -74,7 +74,7 @@ namespace AxibugEmuOnline.Client.Manager
long TestFrameID = 0; long TestFrameID = 0;
void TestEmuUpdate() void TestEmuUpdate()
{ {
} }
#endregion #endregion

View File

@ -1,5 +1,4 @@
using DG.Tweening; using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;

View File

@ -5,8 +5,6 @@ using AxibugEmuOnline.Client.Network;
using AxibugProtobuf; using AxibugProtobuf;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using UnityEngine.EventSystems;
using static AxibugEmuOnline.Client.ClientCore.RomDB;
namespace AxibugEmuOnline.Client.Manager namespace AxibugEmuOnline.Client.Manager
{ {

View File

@ -1,6 +1,4 @@
using System; using UnityEngine;
using System.Text;
using UnityEngine;
using VirtualNes.Core; using VirtualNes.Core;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client

View File

@ -1,11 +1,8 @@
using AxibugEmuOnline.Client.Common;
using System; using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text;
using UnityEngine; using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;
using VirtualNes.Core; using VirtualNes.Core;
using static UnityEngine.UI.CanvasScaler;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client
{ {

View File

@ -4,7 +4,6 @@ using HaoYueNet.ClientNetworkNet.Standard2;
using System; using System;
using System.Net.Sockets; using System.Net.Sockets;
using System.Threading; using System.Threading;
using System.Threading.Tasks;
namespace AxibugEmuOnline.Client.Network namespace AxibugEmuOnline.Client.Network
{ {

View File

@ -1,8 +1,6 @@
using DG.Tweening; using DG.Tweening;
using DG.Tweening.Core; using DG.Tweening.Core;
using DG.Tweening.Plugins.Options; using DG.Tweening.Plugins.Options;
using System.Collections;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client

View File

@ -18,7 +18,7 @@ namespace AxibugEmuOnline.Client
{ {
App.filter.ShutDownFilterPreview(); App.filter.ShutDownFilterPreview();
App.filter.ShutDownFilter(); App.filter.ShutDownFilter();
return base.OnExitItem(); return base.OnExitItem();
} }

View File

@ -1,9 +1,5 @@
using AxibugEmuOnline.Client.ClientCore;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client
{ {

View File

@ -1,6 +1,4 @@
using AxibugEmuOnline.Client.UI; using AxibugEmuOnline.Client.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client

View File

@ -38,7 +38,7 @@ namespace AxibugEmuOnline.Client
m_stepPerformer = new StepPerformer(this); 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_Reset(this));
menus.Add(new InGameUI_SaveState(this)); menus.Add(new InGameUI_SaveState(this));
menus.Add(new InGameUI_LoadState(this)); menus.Add(new InGameUI_LoadState(this));

View File

@ -1,7 +1,6 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using UnityEngine;
using static AxibugEmuOnline.Client.FilterManager; using static AxibugEmuOnline.Client.FilterManager;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client

View File

@ -1,8 +1,4 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client
{ {

View File

@ -1,8 +1,5 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client
{ {

View File

@ -1,4 +1,3 @@
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;

View File

@ -1,6 +1,4 @@
using System.Collections; using UnityEditor;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.UI; using UnityEditor.UI;
using UnityEngine; using UnityEngine;

View File

@ -1,4 +1,3 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;

View File

@ -1,7 +1,6 @@
using DG.Tweening; using DG.Tweening;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using UnityEngine; using UnityEngine;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client
@ -71,6 +70,7 @@ namespace AxibugEmuOnline.Client
protected override void Update() protected override void Update()
{ {
SelectBorder.Active = Enable;
UpdateMenuState(); UpdateMenuState();
base.Update(); base.Update();
@ -177,6 +177,7 @@ namespace AxibugEmuOnline.Client
var itemUIRect = optionUI_MenuItem.transform as RectTransform; var itemUIRect = optionUI_MenuItem.transform as RectTransform;
SelectBorder.Target = itemUIRect; SelectBorder.Target = itemUIRect;
SelectBorder.RefreshPosition();
if (!m_bPoped) if (!m_bPoped)
{ {

View File

@ -1,6 +1,4 @@
using DG.Tweening; using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client

View File

@ -2,7 +2,6 @@ using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Event; using AxibugEmuOnline.Client.Event;
using AxibugEmuOnline.Client.UI; using AxibugEmuOnline.Client.UI;
using AxibugProtobuf; using AxibugProtobuf;
using System;
using UnityEngine; using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;

View File

@ -1,4 +1,4 @@
using DG.Tweening; using DG.Tweening;
using DG.Tweening.Core; using DG.Tweening.Core;
using DG.Tweening.Plugins.Options; using DG.Tweening.Plugins.Options;
using UnityEngine; using UnityEngine;
@ -7,6 +7,8 @@ namespace AxibugEmuOnline.Client
{ {
public class Selector : MonoBehaviour public class Selector : MonoBehaviour
{ {
[SerializeField]
private Animator animator;
private RectTransform m_rect => transform as RectTransform; private RectTransform m_rect => transform as RectTransform;
private RectTransform m_target; private RectTransform m_target;
@ -21,15 +23,13 @@ namespace AxibugEmuOnline.Client
m_target = value; m_target = value;
//重置选择游标的动画
gameObject.SetActive(false);
gameObject.SetActive(true);
var itemUIRect = m_target.transform as RectTransform; var itemUIRect = m_target.transform as RectTransform;
m_rect.pivot = itemUIRect.pivot; m_rect.pivot = itemUIRect.pivot;
m_rect.sizeDelta = itemUIRect.rect.size; m_rect.sizeDelta = itemUIRect.rect.size;
m_rect.SetAsLastSibling(); m_rect.SetAsLastSibling();
animator.SetTrigger("reactive");
if (m_trackTween != null) if (m_trackTween != null)
{ {
m_trackTween.Kill(); 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() 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; if (Target == null) return;
m_rect.position = Target.position;
} }
} }
} }

View File

@ -1,4 +1,3 @@
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;

View File

@ -20,7 +20,7 @@ namespace AxibugEmuOnline.Client
base.Awake(); base.Awake();
RomGroupRoot.gameObject.SetActive(false); RomGroupRoot.gameObject.SetActive(false);
RomGroupRoot.alpha = 0; RomGroupRoot.alpha = 0;
} }
public override void SetSelectState(bool selected) public override void SetSelectState(bool selected)
@ -58,7 +58,7 @@ namespace AxibugEmuOnline.Client
thirdMenuGroup.itemGroup.Clear(); thirdMenuGroup.itemGroup.Clear();
RefreshUI(); RefreshUI();
if (SubMenuItemGroup != null) SubMenuItemGroup.SetSelect(true); if (SubMenuItemGroup != null) SubMenuItemGroup.SetSelect(true);
return true; return true;

View File

@ -1,7 +1,6 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using AxibugProtobuf; using AxibugProtobuf;
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
@ -42,7 +41,7 @@ namespace AxibugEmuOnline.Client
{ {
if (s_RomFileCahcesInRoomInfo.TryGetValue(roomInfo.GameRomID, out RomFile romFile)) if (s_RomFileCahcesInRoomInfo.TryGetValue(roomInfo.GameRomID, out RomFile romFile))
{ {
callback.Invoke(roomInfo,romFile); callback.Invoke(roomInfo, romFile);
return; return;
} }
switch (platform) switch (platform)
@ -53,8 +52,8 @@ namespace AxibugEmuOnline.Client
RomFile romFile = new RomFile(EnumPlatform.NES, 0, 0); RomFile romFile = new RomFile(EnumPlatform.NES, 0, 0);
romFile.SetWebData(romWebData); romFile.SetWebData(romWebData);
s_RomFileCahcesInRoomInfo[roomInfo.GameRomID] = romFile; s_RomFileCahcesInRoomInfo[roomInfo.GameRomID] = romFile;
callback.Invoke(roomInfo,romFile); callback.Invoke(roomInfo, romFile);
})); }));
break; break;
} }