diff --git a/DrawVisitor.cpp b/DrawVisitor.cpp index 9c6fa33..0943e84 100644 --- a/DrawVisitor.cpp +++ b/DrawVisitor.cpp @@ -1,3 +1,4 @@ +#include #include @@ -8,14 +9,21 @@ DrawVisitor::DrawVisitor(Node *nodetodraw, glm::mat4 projection, bool force): force_(force) { - target_ = nodetodraw; + targets_.push_back(nodetodraw); modelview_ = glm::identity(); projection_ = projection; - done_ = false; num_duplicat_ = 1; transform_duplicat_ = glm::identity(); } +DrawVisitor::DrawVisitor(std::vector nodestodraw, glm::mat4 projection, bool force): force_(force) +{ + targets_ = nodestodraw; + modelview_ = glm::identity(); + projection_ = projection; + num_duplicat_ = 1; + transform_duplicat_ = glm::identity(); +} void DrawVisitor::loop(int num, glm::mat4 transform) { @@ -30,22 +38,25 @@ void DrawVisitor::visit(Node &n) if (force_) n.visible_ = true; - // draw the target - if ( target_ && n.id() == target_->id()) { + // find the node with this id + std::vector::iterator it = std::find_if(targets_.begin(), targets_.end(), hasId(n.id())); + + // found this node in the list of targets: draw it + if (it != targets_.end()) { + + targets_.erase(it); for (int i = 0; i < num_duplicat_; ++i) { // draw multiple copies if requested n.draw(modelview_, projection_); modelview_ *= transform_duplicat_; } - - done_ = true; } // restore visibility n.visible_ = v; - if (done_) return; + if (targets_.empty()) return; // update transform modelview_ *= n.transform_; @@ -55,11 +66,11 @@ void DrawVisitor::visit(Node &n) void DrawVisitor::visit(Group &n) { // no need to traverse deeper if this node was drawn already - if (done_) return; + if (targets_.empty()) return; // traverse children glm::mat4 mv = modelview_; - for (NodeSet::iterator node = n.begin(); !done_ && node != n.end(); node++) { + for (NodeSet::iterator node = n.begin(); !targets_.empty() && node != n.end(); node++) { if ( (*node)->visible_ || force_) (*node)->accept(*this); modelview_ = mv; @@ -68,7 +79,6 @@ void DrawVisitor::visit(Group &n) void DrawVisitor::visit(Scene &n) { - done_ = false; modelview_ = glm::identity(); n.root()->accept(*this); } @@ -76,7 +86,7 @@ void DrawVisitor::visit(Scene &n) void DrawVisitor::visit(Switch &n) { // no need to traverse deeper if this node was drawn already - if (done_) return; + if (targets_.empty()) return; // traverse acive child glm::mat4 mv = modelview_; diff --git a/DrawVisitor.h b/DrawVisitor.h index 4f7fbc7..e7f5cfe 100644 --- a/DrawVisitor.h +++ b/DrawVisitor.h @@ -1,6 +1,8 @@ #ifndef DRAWVISITOR_H #define DRAWVISITOR_H +#include + #include #include "Visitor.h" @@ -8,14 +10,14 @@ class DrawVisitor : public Visitor { glm::mat4 modelview_; glm::mat4 projection_; - Node *target_; - bool done_; + std::vector targets_; bool force_; int num_duplicat_; glm::mat4 transform_duplicat_; public: DrawVisitor(Node *nodetodraw, glm::mat4 projection, bool force = false); + DrawVisitor(std::vector nodestodraw, glm::mat4 projection, bool force = false); void loop(int num, glm::mat4 transform);