X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fsequencer.cpp;h=8bca70bb368764d7a94058b95aaf595623a95913;hb=7857d6ec5961f94bc926b1a969f2c841713f9650;hp=d9d35614dbf4ed9fd897b60e5c5df67ee68d5f11;hpb=8ffa42fba0e6a13286b465473fd399cac7c77dcf;p=libs%2Fdemoscene.git diff --git a/source/sequencer.cpp b/source/sequencer.cpp index d9d3561..8bca70b 100644 --- a/source/sequencer.cpp +++ b/source/sequencer.cpp @@ -1,7 +1,9 @@ #include #include -#include "action.h" +#include +#include "fadeoverlay.h" #include "sequencer.h" +#include "stage.h" using namespace std; using namespace Msp; @@ -12,6 +14,9 @@ Sequencer::Sequencer(float bpm): next_event(0) { set_beats_per_minute(bpm); + + register_action_type("fade"); + register_action_type("use_stage"); } void Sequencer::set_beats_per_minute(float bpm) @@ -29,12 +34,12 @@ void Sequencer::add_action(Action &act, float sb, float eb) if(sb<0 || sb>eb) throw invalid_argument("Sequencer::add_action"); - Segment seq_act; - seq_act.action = &act; - seq_act.start_beat = sb; - seq_act.end_beat = eb; + Segment seg; + seg.action = &act; + seg.start_beat = sb; + seg.end_beat = eb; auto i = find_if(segments, [=](const Segment &s){ return s.start_beat>sb; }); - segments.insert(i, seq_act); + segments.insert(i, seg); } void Sequencer::start() @@ -126,3 +131,60 @@ void Sequencer::update_next_event() if(i->end_beat>beat) next_event = min(next_event, i->end_beat); } + + +Sequencer::Loader::Loader(Sequencer &s, Demo &d): + DataFile::ObjectLoader(s), + demo(d) +{ + add("define_action", &Loader::define_action); + add("instant", &Loader::instant); + add("segment", &Loader::segment); +} + +void Sequencer::Loader::define_action(const string &n) +{ + ActionDefLoader ldr(obj, demo); + load_sub_with(ldr); + obj.named_actions[n] = ldr.get_action(); +} + +void Sequencer::Loader::instant(float beat) +{ + segment(beat, beat); +} + +void Sequencer::Loader::segment(float start, float end) +{ + SegmentLoader ldr(obj, start, end); + load_sub_with(ldr); +} + + +Sequencer::ActionDefLoader::ActionDefLoader(Sequencer &s, Demo &d): + DataFile::ObjectLoader(s), + demo(d) +{ + for(const auto &t: obj.action_types) + add(t.first, t.second->get_loader_func()); +} + +void Sequencer::ActionDefLoader::finished() +{ + if(action) + action->validate(); +} + + +Sequencer::SegmentLoader::SegmentLoader(Sequencer &s, float b, float e): + ObjectLoader(s), + start_beat(b), + end_beat(e) +{ + add("apply", &SegmentLoader::apply); +} + +void Sequencer::SegmentLoader::apply(const string &n) +{ + obj.add_action(*get_item(obj.named_actions, n), start_beat, end_beat); +}