Mercurial > repos > public > sbplib
annotate +anim/animate.m @ 396:3fdfad20037e feature/SBPinTimeClarity
Remove whitespace.
| author | Jonatan Werpers <jonatan@werpers.com> |
|---|---|
| date | Thu, 02 Feb 2017 09:46:22 +0100 |
| parents | 2fe13db674da |
| children |
| rev | line source |
|---|---|
| 0 | 1 % Calls F(t) repeatedly |
| 2 % Should there be a Fsetup and a F, two function, to allow creating a plot and then updating it? | |
| 3 % F takes the time to generate the frame for and returns the actual time for the generated frame. | |
| 4 % t = F(t_r) is a function that paints a frame for time t. t is the closest time <=t_r | |
| 5 % it will be called for increasnig t. | |
| 6 | |
| 7 %Todo: make it catch up and produce warnings if it lags behind? Instead of just requesting the next target time | |
|
132
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
8 |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
9 |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
10 % If adapt is true time_modifier is treated as an upper bound |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
11 function animate(F, tstart, tend, time_modifier, target_frame_rate) |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
12 default_arg('time_modifier', 1); |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
13 default_arg('target_frame_rate',30); |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
14 |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
15 % t is simulation time |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
16 % tau is real time |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
17 |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
18 time_modifier_bound = time_modifier; |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
19 dTau_target = 1/target_frame_rate; % Real time between frames |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
20 |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
21 rs = util.ReplaceableString(); |
|
144
2fe13db674da
animate: Show the simulation time.
Jonatan Werpers <jonatan@werpers.com>
parents:
133
diff
changeset
|
22 rs.appendFormat(' t: %d\n'); |
|
133
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
23 rs.appendFormat(' tau: %d\n'); |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
24 rs.appendFormat(' target tau: %d\n'); |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
25 rs.appendFormat(' Target fps: %.2f\n'); |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
26 rs.appendFormat(' Actual fps: %.2f\n'); |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
27 rs.appendFormat('Target time_modifier: %d\n'); |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
28 rs.appendFormat('actual time_modifier: %d\n'); |
| 0 | 29 |
|
132
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
30 animation_start = tic(); |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
31 prevTau = 0; |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
32 targetTau = 0; |
|
133
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
33 tauFrameStart = -dTau_target; |
|
132
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
34 t = F(tstart); |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
35 |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
36 while t < tend |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
37 % Sleep until the frame should start |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
38 pause(targetTau-toc(animation_start)); |
|
133
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
39 tau = toc(animation_start); |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
40 dTau = tau - tauFrameStart; |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
41 |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
42 % Calculate error in tau |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
43 e_Tau = tau - targetTau; |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
44 |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
45 % Regulate time_modifier based on e_Tau |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
46 % time_modifier = min(time_modifier_bound, max(0.5, abs(1-e_Tau/dTau)) * time_modifier); |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
47 |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
48 % Mark the start of the frame |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
49 tauFrameStart = tau; |
|
132
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
50 |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
51 dt_target = dTau_target*time_modifier; % Targeted simulation time between frames |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
52 |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
53 t_prev = t; |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
54 t = F(t + dt_target); % Run simulation |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
55 |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
56 % Calculate when this frame should end and the next start. (this depends on what simulation time we ended up on) |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
57 dt = t-t_prev; |
|
133
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
58 % targetTau = targetTau + dt/time_modifier; |
|
43f8df3595cf
Prepared for dynamic workload in animation.
Jonatan Werpers <jonatan@werpers.com>
parents:
132
diff
changeset
|
59 targetTau = targetTau + dTau_target; |
|
132
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
60 |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
61 % Update information about this frame |
|
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
62 tau = toc(animation_start); |
|
144
2fe13db674da
animate: Show the simulation time.
Jonatan Werpers <jonatan@werpers.com>
parents:
133
diff
changeset
|
63 rs.updateParam(t, tau, targetTau, 1/dTau_target, 1/dTau, time_modifier_bound, time_modifier); |
| 0 | 64 end |
| 65 | |
| 66 | |
|
132
6ec2248b83c4
Refactored +anim.animate to be more clear.
Jonatan Werpers <jonatan@werpers.com>
parents:
79
diff
changeset
|
67 % Final time reporting |
| 0 | 68 time_to_animate = toc(animation_start); |
| 69 expected_time = tend/time_modifier; | |
|
71
1edee9e1ea41
Updated printing stuff for animation functions.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
70 fprintf('\n'); |
| 0 | 71 fprintf('Time to animate: %.3f\n', time_to_animate) |
| 72 fprintf('Expected time : %.3f\n', expected_time) | |
| 73 end |
