]> git.tdb.fi Git - libs/demoscene.git/blob - source/demo.cpp
08a92b4f0d6bd925709de855a30cec20201adcf2
[libs/demoscene.git] / source / demo.cpp
1 #include <msp/time/utils.h>
2 #include "demo.h"
3
4 using namespace std;
5 using namespace Msp;
6
7 Demo::Demo(Graphics::Window &window, Graphics::GLContext &gl_ctx, DataFile::Collection &r):
8         resources(r),
9         view(window, gl_ctx),
10         anim_action(anim_player),
11         music_source(0),
12         streamer(0),
13         music_io(0),
14         music_decoder(0)
15 {
16         things["window"] = static_cast<GL::View *>(&view);
17
18         sequencer.add_static_action(anim_action);
19         sequencer.signal_finished.connect(signal_finished);
20 }
21
22 Demo::~Demo()
23 {
24         delete streamer;
25         delete music_decoder;
26         delete music_io;
27         delete music_source;
28 }
29
30 void Demo::set_fixed_framerate(float fps)
31 {
32         frame_interval = Time::sec/fps;
33 }
34
35 void Demo::enable_music()
36 {
37         if(!music_source)
38                 music_source = new AL::Source;
39         if(!streamer)
40                 streamer = new AL::Streamer(*music_source);
41 }
42
43 void Demo::play_music(const string &fn)
44 {
45         if(!streamer)
46                 return;
47
48         streamer->stop();
49         delete music_decoder;
50         delete music_io;
51         music_io = resources.open_raw(fn);
52         music_decoder = AL::SoundDecoder::open_io(*music_io);
53         float beat = sequencer.get_current_beat();
54         if(beat)
55         {
56                 float time = beat*60/sequencer.get_beats_per_minute();
57                 unsigned bytes_per_sec = music_decoder->get_frequency()*get_unit_size(music_decoder->get_format());
58                 music_decoder->seek(time*bytes_per_sec);
59         }
60         streamer->play(*music_decoder);
61 }
62
63 void Demo::tick()
64 {
65         Time::TimeStamp t = Time::now();
66         Time::TimeDelta dt = (last_tick ? frame_interval ? frame_interval : t-last_tick : Time::zero);
67         last_tick = t;
68
69         if(frame_interval)
70                 next_frame = t+frame_interval;
71
72         sequencer.tick(dt);
73         if(streamer)
74                 streamer->tick();
75         view.render();
76 }
77
78 void Demo::seek(const Time::TimeDelta &pos)
79 {
80         sequencer.seek(pos*sequencer.get_beats_per_minute()/Time::min);
81 }
82
83
84 Demo::AnimationAction::AnimationAction(GL::AnimationPlayer &p):
85         player(p)
86 { }
87
88 void Demo::AnimationAction::tick(float, float d)
89 {
90         player.tick(d*Time::sec);
91 }