close ; Camera movement affects the mask rendering when on a World Space Canvas

pull/87/head
mob-sakai 2019-05-01 17:00:46 +09:00
parent ecce86f1fa
commit 3d5ce6c241
1 changed files with 35 additions and 1 deletions

View File

@ -388,7 +388,10 @@ namespace Coffee.UIExtensions
List<SoftMask> _children = new List<SoftMask>();
bool _hasChanged = false;
bool _hasStencilStateChanged = false;
#if !UNITY_2018_1_OR_NEWER
static readonly Dictionary<int, Matrix4x4> s_previousViewProjectionMatrices = new Dictionary<int, Matrix4x4> ();
static readonly Dictionary<int, Matrix4x4> s_nowViewProjectionMatrices = new Dictionary<int, Matrix4x4> ();
#endif
Material material { get { return _material ? _material : _material = new Material(s_SoftMaskShader ? s_SoftMaskShader : s_SoftMaskShader = Resources.Load<Shader>("SoftMask")){ hideFlags = HideFlags.HideAndDontSave }; } }
@ -404,6 +407,27 @@ namespace Coffee.UIExtensions
if (!sm || sm._hasChanged)
continue;
var canvas = sm.graphic.canvas;
if (canvas.renderMode == RenderMode.WorldSpace)
{
var cam = canvas.worldCamera;
Matrix4x4 nowsVP = cam.projectionMatrix * cam.worldToCameraMatrix;
#if UNITY_2018_1_OR_NEWER
Matrix4x4 previousVP = cam.reviousViewProjectionMatrix;
#else
Matrix4x4 previousVP = default(Matrix4x4);
int id = cam.GetInstanceID ();
s_previousViewProjectionMatrices.TryGetValue (id, out previousVP);
s_nowViewProjectionMatrices[id] = nowsVP;
#endif
if (previousVP != nowsVP)
{
sm.hasChanged = true;
}
}
var rt = sm.rectTransform;
if (rt.hasChanged)
{
@ -434,6 +458,16 @@ namespace Coffee.UIExtensions
}
}
}
#if !UNITY_2018_1_OR_NEWER
s_previousViewProjectionMatrices.Clear ();
foreach (int id in s_previousViewProjectionMatrices.Keys)
{
s_previousViewProjectionMatrices [id] = s_nowViewProjectionMatrices [id];
}
s_nowViewProjectionMatrices.Clear ();
#endif
}
/// <summary>