public void Step(float timestep, out MultiSourceCombinedSnapshot snapshotOut) { // Update transforms held by each source foreach (var source in _sources.Values) { // Update current state source.Step(timestep); // Reset rigid body iterator source.ResetIterator(); } MultiSourceCombinedSnapshot snapshot = new MultiSourceCombinedSnapshot(); // Prepare rigid bodies for output foreach (var rb in _rigidBodySourceMap) { var source = _sources[rb.Value]; SnapshotBuffer.RigidBodyData data; if (source.Find(rb.Key, out data)) { snapshot.RigidBodies.Add(rb.Key, new MultiSourceCombinedSnapshot.RigidBodyState( rb.Key, source.CurrentLocalTime, data.Transform, data.LinearVelocity, data.AngularVelocity, source.HasUpdate, data.MotionType)); } } snapshotOut = snapshot; }
/// <summary> /// Generate next snapshot with specified timestep. /// </summary> /// <param name="timestep"></param> /// <returns></returns> public MultiSourceCombinedSnapshot GetNextSnapshot(float timestep) { MultiSourceCombinedSnapshot snapshot = new MultiSourceCombinedSnapshot(); foreach (SourceInfo source in Sources.Values) { // move snapshot forward for specified timestep source.step(timestep); // if it's new source, it may have no snapshot if (source.CurrentSnapshot != null) { foreach (var t in source.CurrentSnapshot.Transforms) { snapshot.RigidBodies.Add(t.Id, new MultiSourceCombinedSnapshot.RigidBodyState(t.Id, source.CurrentSnapshot.Time, t.Transform, source.HasUpdate, t.motionType)); } } } return(snapshot); }