static public float WrapPosition(BaseSpline.SplineWrapMode wrapmode, float pos, float len) { switch(wrapmode) { case BaseSpline.SplineWrapMode.Loop: if(pos < 0) { int tms = (int)(-pos / len) + 1; pos += tms * len; } else if(pos >= len) { int tms = (int)(pos / len); pos -= tms * len; } break; case BaseSpline.SplineWrapMode.Once: if(pos < 0) { pos = 0; } else if(pos > len) { pos = len; } break; } return pos; }
internal SplineIterator(BaseSpline spline, bool reverse, int startidx, int endidx) { m_spline = spline; m_reverse = reverse; m_startidx = Mathf.Min(startidx, endidx); m_endidx = Mathf.Max(startidx, endidx); Reset(); }
/// <summary> /// Calculates the point each animation curve point. /// </summary> private void CalculatePoint(float _point, int _loopNumber, BaseSpline.SplineIterator _iterator, SplineParticles _target, float _offset) { _iterator.SetOffsetPercent(_point); //Calc modifiers float lifeTimeModifier = _target.GetComponent<ParticleSystem>().startLifetime; float loopsModifier = _target.loopNumber; Vector3 currentPosition = _target.transform.TransformPoint(_iterator.GetPosition()); Vector3 tangentAtPoint = (_iterator.GetTangent().normalized); Vector3 velocityAtPoint = Vector3.zero; if (_point == 0 && _target.Spline.WrapMode == BaseSpline.SplineWrapMode.Loop) { _iterator.SetOffsetPercent(1-_target.pathQuality); previousPoint = _target.transform.TransformPoint(_iterator.GetPosition()); } else if (_point == 0 && _target.Spline.WrapMode != BaseSpline.SplineWrapMode.Loop) { _iterator.SetOffsetPercent(_point+_target.pathQuality); previousPoint = _target.transform.TransformPoint(_iterator.GetPosition()); } velocityAtPoint = (currentPosition - previousPoint).magnitude * tangentAtPoint; previousPoint = currentPosition; velocityAtPoint *= loopsModifier*(1/_target.pathQuality)/lifeTimeModifier; _target.velocityCurveX.AddKey(_point/_loopNumber + _offset,velocityAtPoint.x); _target.velocityCurveY.AddKey(_point/_loopNumber + _offset,velocityAtPoint.y); _target.velocityCurveZ.AddKey(_point/_loopNumber + _offset,velocityAtPoint.z); }
/// <summary> /// Sets the curve points. /// </summary> private void SetCurvePoints(int _loopNumber, BaseSpline.SplineIterator _iterator, SplineParticles _target, float _offset) { previousPoint = Vector3.zero; for (float i = 0; i<=1; i += _target.pathQuality) { CalculatePoint(i, _loopNumber, _iterator, _target, _offset); } }