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; } }