public void Update(ref RigidBodyData entry)
            {
                while (_nextIndex < _next.Transforms.Count &&
                       _next.Transforms[_nextIndex].RigidBodyId.CompareTo(entry.RigidBodyId) < 0)
                {
                    _nextIndex++;
                }

                while (_prevIndex < _prev.Transforms.Count &&
                       _prev.Transforms[_prevIndex].RigidBodyId.CompareTo(entry.RigidBodyId) < 0)
                {
                    _prevIndex++;
                }

                if (_nextIndex >= _next.Transforms.Count ||
                    _next.Transforms[_nextIndex].RigidBodyId != entry.RigidBodyId)
                {
                    // velocity is zero
                    entry.SetZeroVelocities();

                    if (entry.MotionType == MotionType.Sleeping)
                    {
                        entry.Time    = _timestamp;
                        entry.Updated = true;
                    }
                    else
                    {
                        entry.Updated = false;
                    }
                    return;
                }

                if (_prevIndex < _prev.Transforms.Count &&
                    _prev.Transforms[_prevIndex].RigidBodyId == _next.Transforms[_nextIndex].RigidBodyId)
                {
                    RigidBodyTransform t = new RigidBodyTransform();
                    {
                        t.Lerp(_prev.Transforms[_prevIndex].Transform, _next.Transforms[_nextIndex].Transform, _frac);
                    }
                    entry.Transform = t;
                    entry.SetZeroVelocities();
                    // estimate velocity
                    float DT       = _next.Time - _prev.Time;
                    var   prevT    = _prev.Transforms[_prevIndex].Transform;
                    var   currentT = _next.Transforms[_nextIndex].Transform;
                    entry.SetVelocitiesFromTransformsDiff(DT, currentT, prevT);
                }
                else
                {
                    entry.Transform = _next.Transforms[_nextIndex].Transform;
                    entry.SetZeroVelocities();
                }

                entry.Time       = _timestamp;
                entry.MotionType = _next.Transforms[_nextIndex].MotionType;
                entry.Updated    = true;
            }
            public void Update(ref RigidBodyData entry)
            {
                if (_prevSnapshot != null)
                {
                    while (_prevIndex < _prevSnapshot.Transforms.Count &&
                           _prevSnapshot.Transforms[_prevIndex].RigidBodyId.CompareTo(entry.RigidBodyId) < 0)
                    {
                        _prevIndex++;
                    }
                }

                while (_iteratorIndex < _snapshot.Transforms.Count &&
                       _snapshot.Transforms[_iteratorIndex].RigidBodyId.CompareTo(entry.RigidBodyId) < 0)
                {
                    _iteratorIndex++;
                }

                //Debug.Log(" SnapshotSource Update cI:" + _iteratorIndex + " pI:" + _prevIndex +
                //	" DT=" + (_snapshot.Time - _prevSnapshot.Time));

                if (_iteratorIndex < _snapshot.Transforms.Count &&
                    _snapshot.Transforms[_iteratorIndex].RigidBodyId == entry.RigidBodyId)
                {
                    var rb = _snapshot.Transforms[_iteratorIndex];

                    entry.MotionType = rb.MotionType;
                    entry.Transform  = rb.Transform;
                    entry.Time       = _snapshot.Time;
                    entry.SetZeroVelocities();

                    if (_prevSnapshot != null)
                    {
                        if (_prevIndex < _prevSnapshot.Transforms.Count &&
                            _prevSnapshot.Transforms[_prevIndex].RigidBodyId == entry.RigidBodyId)
                        {
                            // estimate velocity
                            float DT     = _snapshot.Time - _prevSnapshot.Time;
                            var   prevRB = _prevSnapshot.Transforms[_prevIndex].Transform;
                            entry.SetVelocitiesFromTransformsDiff(DT, rb.Transform, prevRB);
                        }
                    }

                    entry.Updated = true;
                }
                else if (entry.MotionType == MotionType.Sleeping)
                {
                    entry.Time    = _snapshot.Time;
                    entry.Updated = true;
                    entry.SetZeroVelocities();
                }
                else
                {
                    entry.Updated = false;
                }
            }