aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine/Controller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/Controller.cpp')
-rw-r--r--src/engine/Controller.cpp105
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 {