fix #47; World simulation bug

pull/77/head
mob-sakai 2019-05-07 23:37:39 +09:00
parent 888eac4e54
commit 66a0ab7ad5
1 changed files with 28 additions and 7 deletions

View File

@ -224,6 +224,13 @@ namespace Coffee.UIExtensions
_mesh.MarkDynamic (); _mesh.MarkDynamic ();
CheckTrail (); CheckTrail ();
if (cachedParticleSystem)
{
_oldPos = cachedParticleSystem.main.scalingMode == ParticleSystemScalingMode.Local
? rectTransform.localPosition
: rectTransform.position;
}
base.OnEnable (); base.OnEnable ();
} }
@ -324,7 +331,7 @@ namespace Coffee.UIExtensions
UIParticle _parent; UIParticle _parent;
List<UIParticle> _children = new List<UIParticle> (); List<UIParticle> _children = new List<UIParticle> ();
Matrix4x4 scaleaMatrix = default (Matrix4x4); Matrix4x4 scaleaMatrix = default (Matrix4x4);
Vector3 _worldPos; Vector3 _oldPos;
static ParticleSystem.Particle [] s_Particles = new ParticleSystem.Particle [4096]; static ParticleSystem.Particle [] s_Particles = new ParticleSystem.Particle [4096];
/// <summary> /// <summary>
@ -373,11 +380,12 @@ namespace Coffee.UIExtensions
Profiler.EndSample (); Profiler.EndSample ();
Profiler.BeginSample ("Make Matrix"); Profiler.BeginSample ("Make Matrix");
scaleaMatrix = m_ParticleSystem.main.scalingMode == ParticleSystemScalingMode.Hierarchy ParticleSystem.MainModule main = m_ParticleSystem.main;
scaleaMatrix = main.scalingMode == ParticleSystemScalingMode.Hierarchy
? Matrix4x4.Scale (scale * Vector3.one) ? Matrix4x4.Scale (scale * Vector3.one)
: Matrix4x4.Scale (scale * rootCanvas.transform.localScale); : Matrix4x4.Scale (scale * rootCanvas.transform.localScale);
Matrix4x4 matrix = default (Matrix4x4); Matrix4x4 matrix = default (Matrix4x4);
switch (m_ParticleSystem.main.simulationSpace) switch (main.simulationSpace)
{ {
case ParticleSystemSimulationSpace.Local: case ParticleSystemSimulationSpace.Local:
matrix = matrix =
@ -390,12 +398,25 @@ namespace Coffee.UIExtensions
scaleaMatrix scaleaMatrix
* rectTransform.worldToLocalMatrix; * rectTransform.worldToLocalMatrix;
bool isLocalScaling = main.scalingMode == ParticleSystemScalingMode.Local;
Vector3 newPos = rectTransform.position; Vector3 newPos = rectTransform.position;
Vector3 delta = (newPos - _worldPos); Vector3 delta = (newPos - _oldPos);
_worldPos = newPos; _oldPos = newPos;
if (canvas.renderMode != RenderMode.WorldSpace && !Mathf.Approximately (scale, 0) && 0 < delta.sqrMagnitude)
if (!Mathf.Approximately (scale, 0) && 0 < delta.sqrMagnitude)
{ {
delta *= (1 - 1 / scale); if(isLocalScaling)
{
var s = rootCanvas.transform.localScale * scale;
delta.x *= 1f - 1f / s.x;
delta.y *= 1f - 1f / s.y;
delta.z *= 1f - 1f / s.z;
}
else
{
delta = delta * (1 - 1 / scale);
}
int count = m_ParticleSystem.particleCount; int count = m_ParticleSystem.particleCount;
if (s_Particles.Length < count) if (s_Particles.Length < count)
{ {