diff options
Diffstat (limited to 'src/engine/Controller.cpp')
-rw-r--r-- | src/engine/Controller.cpp | 105 |
1 files changed, 57 insertions, 48 deletions
diff --git a/src/engine/Controller.cpp b/src/engine/Controller.cpp index cc3c0de..c63d11e 100644 --- a/src/engine/Controller.cpp +++ b/src/engine/Controller.cpp @@ -40,9 +40,10 @@ Controller::Controller(SPtr<Engine> engine, uint64_t Controller::create(const client::ClientObject& properties) { - TimeDuration dur(_engine->machine()->time().unit(), - properties.get(URIs::instance().machina_duration).get_float()); - SPtr<machina::Node> node(new machina::Node(dur)); + TimeDuration dur( + _engine->machine()->time().unit(), + properties.get(URIs::instance().machina_duration).get_float()); + SPtr<Node> node(new Node(dur)); SPtr<client::ClientObject> obj( new client::ClientObject(properties, node->id())); _objects.insert(node); @@ -56,48 +57,56 @@ Controller::announce(SPtr<Machine> machine) { Raul::Forge& forge = _engine->forge(); - for (machina::Machine::Nodes::const_iterator n = machine->nodes().begin(); - n != machine->nodes().end(); ++n) { - SPtr<machina::client::ClientObject> obj( - new machina::client::ClientObject((*n)->id())); - obj->set(URIs::instance().rdf_type, - forge.make_urid(URIs::instance().machina_Node)); - obj->set(URIs::instance().machina_duration, - forge.make(float((*n)->duration().to_double()))); - obj->set(URIs::instance().machina_canvas_x, forge.make(0.0f)); - obj->set(URIs::instance().machina_canvas_y, forge.make(0.0f)); - - SPtr<MidiAction> midi_action = dynamic_ptr_cast<MidiAction>( - (*n)->enter_action()); - if (midi_action) { - SPtr<machina::client::ClientObject> action( - new machina::client::ClientObject(midi_action->id())); - action->set(URIs::instance().machina_note_number, - forge.make((int32_t)midi_action->event()[1])); - _client_model.new_object(action); - obj->set(URIs::instance().machina_enter_action, - forge.make(int32_t((*n)->enter_action()->id()))); + for (const auto& n : machine->nodes()) { + // Find or create a new client object if necessary + SPtr<client::ClientObject> obj = _client_model.find(n->id()); + if (!obj) { + obj = SPtr<client::ClientObject>(new client::ClientObject(n->id())); + obj->set(URIs::instance().rdf_type, + forge.make_urid(URIs::instance().machina_Node)); + obj->set(URIs::instance().machina_duration, + forge.make(float(n->duration().to_double()))); + if (n->is_initial()) { + obj->set(URIs::instance().machina_initial, forge.make(true)); + } + + SPtr<MidiAction> midi_action = dynamic_ptr_cast<MidiAction>( + n->enter_action()); + if (midi_action) { + SPtr<client::ClientObject> action = _client_model.find( + midi_action->id()); + if (!action) { + action = SPtr<client::ClientObject>( + new client::ClientObject(midi_action->id())); + action->set(URIs::instance().machina_note_number, + forge.make((int32_t)midi_action->event()[1])); + _client_model.new_object(action); + } + obj->set(URIs::instance().machina_enter_action, + forge.make(int32_t(n->enter_action()->id()))); + } } - _objects.insert(*n); + _objects.insert(n); _client_model.new_object(obj); } - for (machina::Machine::Nodes::const_iterator n = machine->nodes().begin(); - n != machine->nodes().end(); ++n) { - for (machina::Node::Edges::const_iterator e = (*n)->edges().begin(); - e != (*n)->edges().end(); ++e) { - _objects.insert(*e); - SPtr<client::ClientObject> eobj( - new client::ClientObject((*e)->id())); - eobj->set(URIs::instance().rdf_type, - forge.make_urid(URIs::instance().machina_Edge)); - eobj->set(URIs::instance().machina_probability, - forge.make((*e)->probability())); - eobj->set(URIs::instance().machina_tail_id, - forge.make((int32_t)(*n)->id())); - eobj->set(URIs::instance().machina_head_id, - forge.make((int32_t)(*e)->head()->id())); - + for (const auto& n : machine->nodes()) { + for (const auto& e : n->edges()) { + SPtr<client::ClientObject> eobj = _client_model.find(e->id()); + if (!eobj) { + eobj = SPtr<client::ClientObject>( + new client::ClientObject(e->id())); + eobj->set(URIs::instance().rdf_type, + forge.make_urid(URIs::instance().machina_Edge)); + eobj->set(URIs::instance().machina_probability, + forge.make(e->probability())); + eobj->set(URIs::instance().machina_tail_id, + forge.make((int32_t)n->id())); + eobj->set(URIs::instance().machina_head_id, + forge.make((int32_t)e->head()->id())); + } + + _objects.insert(e); _client_model.new_object(eobj); } } @@ -117,7 +126,7 @@ Controller::find(uint64_t id) void Controller::learn(SPtr<Raul::Maid> maid, uint64_t node_id) { - SPtr<machina::Node> node = dynamic_ptr_cast<machina::Node>(find(node_id)); + SPtr<Node> node = dynamic_ptr_cast<Node>(find(node_id)); if (node) { _engine->machine()->learn(maid, node); } else { @@ -141,10 +150,10 @@ Controller::set_property(uint64_t object_id, uint64_t Controller::connect(uint64_t tail_id, uint64_t head_id) { - SPtr<machina::Node> tail = dynamic_ptr_cast<machina::Node>(find(tail_id)); - SPtr<machina::Node> head = dynamic_ptr_cast<machina::Node>(find(head_id)); + SPtr<Node> tail = dynamic_ptr_cast<Node>(find(tail_id)); + SPtr<Node> head = dynamic_ptr_cast<Node>(find(head_id)); - SPtr<machina::Edge> edge(new machina::Edge(tail, head)); + SPtr<Edge> edge(new Edge(tail, head)); tail->add_edge(edge); _objects.insert(edge); @@ -165,8 +174,8 @@ Controller::connect(uint64_t tail_id, uint64_t head_id) void Controller::disconnect(uint64_t tail_id, uint64_t head_id) { - SPtr<machina::Node> tail = dynamic_ptr_cast<machina::Node>(find(tail_id)); - SPtr<machina::Node> head = dynamic_ptr_cast<machina::Node>(find(head_id)); + SPtr<Node> tail = dynamic_ptr_cast<Node>(find(tail_id)); + SPtr<Node> head = dynamic_ptr_cast<Node>(find(head_id)); SPtr<Edge> edge = tail->remove_edge_to(head); if (edge) { @@ -204,7 +213,7 @@ Controller::process_updates() Raul::Atom value; for (uint32_t i = 0; i < read_space; ) { i += read_set(_updates, &subject, &key, &value); - SPtr<machina::client::ClientObject> obj = _client_model.find(subject); + SPtr<client::ClientObject> obj = _client_model.find(subject); if (obj) { obj->set(key, value); } else { |