private static TData RandomRecord <TData>(Random random, Recorder <TData> recorder, int time) { // Destroy an old actor randomly if (random.NextDouble() < RemoveActorOdds) { var endTime = random.Next(time, time + RecordInterval); var actor = recorder.Scene.Actors.FirstOrDefault(); if (actor != null && actor.EndTime < 0) { recorder.RemoveActor(actor, endTime); } } // Move exising actor randomly foreach (var actor in recorder.Scene.Actors) { if (random.NextDouble() >= ChangeActorOdds) { continue; } var x = actor.GetVariable <float>(1); var y = actor.GetVariable <float>(2); var z = actor.GetVariable <float>(3); var keyFrameStartTime = random.Next(time, time + RecordInterval); var keyFrameEndTime = keyFrameStartTime + random.Next(1, 1000); switch (random.Next(0, 4)) { case 1: // Linear movement recorder.AddLine(x, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100)); recorder.AddLine(y, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100)); recorder.AddLine(z, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100)); break; case 2: // Step movement recorder.AddStep(x, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100)); recorder.AddStep(y, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100)); recorder.AddStep(z, keyFrameStartTime, keyFrameEndTime, (float)(random.NextDouble() * 100)); break; default: // No movement; break; } } // Create a new actor randomly if (random.NextDouble() < CreateActorOdds) { var startTime = random.Next(time, time + RecordInterval); var actor = recorder.AddActor(startTime, f => { f.AddFloat(1, (float)(random.NextDouble() * 10)); f.AddFloat(2, (float)(random.NextDouble() * 10)); f.AddFloat(3, (float)(random.NextDouble() * 10)); }); } return(recorder.Record(time + RecordInterval)); }