]> git.tdb.fi Git - netvis.git/blobdiff - source/netvis.cpp
Refactor the rendering code
[netvis.git] / source / netvis.cpp
index cece749e9be6a2ab6003e5d02447673a5ad2d983..bcdba3f28c6314ff1ebf72a9891181e797dba08d 100644 (file)
@@ -91,6 +91,8 @@ NetVis::~NetVis()
                delete i->second;
        for(map<unsigned, Host *>::iterator i=disabled_hosts.begin(); i!=disabled_hosts.end(); ++i)
                delete i->second;
+       for(map<unsigned, Port *>::iterator i=ports.begin(); i!=ports.end(); ++i)
+               delete i->second;
        for(list<Packet *>::iterator i=packets.begin(); i!=packets.end(); ++i)
                delete *i;
 }
@@ -112,158 +114,116 @@ void NetVis::tick()
 
        wnd->get_display().tick();
 
+       while(pcap_dispatch(pcap, -1, &capture_handler, reinterpret_cast<unsigned char *>(this))>0) ;
+
+       resolver->tick();
+
+       float min_activity = numeric_limits<float>::max();
+       for(map<unsigned, Host *>::iterator i=hosts.begin(); i!=hosts.end(); ++i)
        {
-               Debug::ProfilingScope s(profiler, "capture");
-               while(pcap_dispatch(pcap, -1, &capture_handler, reinterpret_cast<unsigned char *>(this))>0) ;
+               i->second->tick(dt);
+               min_activity = min(min_activity, i->second->get_activity());
        }
-
+       float del_limit = pow(10, 6-0.1*(max_hosts-hosts.size()-disabled_hosts.size()));
+       for(map<unsigned, Host *>::iterator i=disabled_hosts.begin(); i!=disabled_hosts.end();)
        {
-               Debug::ProfilingScope s(profiler, "tick");
+               i->second->tick(dt);
 
-               resolver->tick();
-
-               float min_activity = numeric_limits<float>::max();
-               for(map<unsigned, Host *>::iterator i=hosts.begin(); i!=hosts.end(); ++i)
+               if(i->second->get_activity()>min_activity)
                {
-                       i->second->tick(dt);
-                       min_activity = min(min_activity, i->second->get_activity());
+                       i->second->set_active(true);
+                       hosts.insert(*i);
+                       disabled_hosts.erase(i++);
                }
-               float del_limit = pow(10, 6-0.1*(max_hosts-hosts.size()-disabled_hosts.size()));
-               for(map<unsigned, Host *>::iterator i=disabled_hosts.begin(); i!=disabled_hosts.end();)
+               else if(i->second->get_activity()<del_limit)
                {
-                       i->second->tick(dt);
-
-                       if(i->second->get_activity()>min_activity)
-                       {
-                               i->second->set_active(true);
-                               hosts.insert(*i);
-                               disabled_hosts.erase(i++);
-                       }
-                       else if(i->second->get_activity()<del_limit)
-                       {
-                               delete i->second;
-                               disabled_hosts.erase(i++);
-                       }
-                       else
-                               ++i;
+                       delete i->second;
+                       disabled_hosts.erase(i++);
                }
+               else
+                       ++i;
+       }
 
-               if(hosts.size()>max_visible_hosts)
-               {
-                       list<float> activity;
-                       for(map<unsigned, Host *>::iterator i=hosts.begin(); i!=hosts.end(); ++i)
-                               activity.push_back(i->second->get_activity());
-                       activity.sort();
-
-                       list<float>::iterator j = activity.begin();
-                       advance(j, activity.size()-max_visible_hosts);
-                       float limit = *j;
+       if(hosts.size()>max_visible_hosts)
+       {
+               list<float> activity;
+               for(map<unsigned, Host *>::iterator i=hosts.begin(); i!=hosts.end(); ++i)
+                       activity.push_back(i->second->get_activity());
+               activity.sort();
 
-                       for(map<unsigned, Host *>::iterator i=hosts.begin(); i!=hosts.end();)
-                       {
-                               if(i->second->get_activity()<limit)
-                               {
-                                       i->second->set_active(false);
-                                       disabled_hosts.insert(*i);
-                                       hosts.erase(i++);
-                               }
-                               else
-                                       ++i;
-                       }
-               }
+               list<float>::iterator j = activity.begin();
+               advance(j, activity.size()-max_visible_hosts);
+               float limit = *j;
 
-               for(list<Packet *>::iterator i=packets.begin(); i!=packets.end();)
+               for(map<unsigned, Host *>::iterator i=hosts.begin(); i!=hosts.end();)
                {
-                       (*i)->tick(dt);
-                       if((*i)->get_stale())
+                       if(i->second->get_activity()<limit)
                        {
-                               delete *i;
-                               i = packets.erase(i);
+                               i->second->set_active(false);
+                               disabled_hosts.insert(*i);
+                               hosts.erase(i++);
                        }
                        else
                                ++i;
                }
        }
 
+       for(list<Packet *>::iterator i=packets.begin(); i!=packets.end();)
        {
-               Debug::ProfilingScope s(profiler, "render");
-               GL::clear(GL::COLOR_BUFFER_BIT);
-
-               GL::matrix_mode(GL::PROJECTION);
-               GL::load_identity();
-               GL::ortho_centered(1024, 768);
-               GL::matrix_mode(GL::MODELVIEW);
-               GL::load_identity();
-
-               for(map<unsigned, Host *>::iterator i=hosts.begin(); i!=hosts.end(); ++i)
-                       i->second->render();
-               if(draw_labels)
+               (*i)->tick(dt);
+               if((*i)->get_stale())
                {
-                       for(map<unsigned, Host *>::iterator i=hosts.begin(); i!=hosts.end(); ++i)
-                               i->second->render_label();
-                       GL::Texture::unbind();
+                       delete *i;
+                       i = packets.erase(i);
                }
-               GL::Immediate imm((GL::COLOR4_UBYTE, GL::VERTEX2));
-               imm.begin(GL::QUADS);
-               for(list<Packet *>::iterator i=packets.begin(); i!=packets.end(); ++i)
-                       (*i)->render(imm);
-               imm.end();
+               else
+                       ++i;
+       }
 
-               GL::push_matrix();
-               GL::translate(-500, 360, 0);
-               unsigned n = 0;
-               for(map<unsigned, Port>::iterator i=ports.begin(); (i!=ports.end() && n<50); ++i, ++n)
-               {
-                       const GL::Color &color = i->second.get_color();
+       render();
+       wnd->swap_buffers();
 
-                       imm.begin(GL::QUADS);
-                       imm.color(color.r, color.g, color.b, color.a);
-                       for(unsigned x=0; x<=4; x+=2)
-                       {
-                               imm.vertex(x+0, 0);
-                               imm.vertex(x+10, 0);
-                               imm.vertex(x+10, 10);
-                               imm.vertex(x+0, 10);
-                       }
-                       imm.end();
+       ++frames;
+}
 
-                       GL::translate(0, -12, 0);
-               }
-               GL::pop_matrix();
+void NetVis::render()
+{
+       GL::clear(GL::COLOR_BUFFER_BIT);
 
-               GL::push_matrix();
-               if(draw_labels)
-               {
-                       GL::push_matrix();
-                       GL::translate(-484, 361, 0);
-                       GL::scale_uniform(10);
-                       n = 0;
-                       for(map<unsigned, Port>::iterator i=ports.begin(); (i!=ports.end() && n<50); ++i, ++n)
-                       {
-                               GL::Immediate imm2((GL::COLOR4_UBYTE, GL::TEXCOORD2, GL::VERTEX2));
-                               imm.color(1.0f, 1.0f, 1.0f);
-                               font->draw_string(i->second.get_name(), imm2);
+       GL::matrix_mode(GL::PROJECTION);
+       GL::load_identity();
+       GL::ortho_centered(1024, 768);
+       GL::matrix_mode(GL::MODELVIEW);
+       GL::load_identity();
 
-                               GL::translate(0, -1.2, 0);
-                       }
-                       GL::pop_matrix();
-                       GL::Texture::unbind();
-               }
-               GL::pop_matrix();
-
-               GL::push_matrix();
-               GL::translate(-500, -360, 0);
-               GL::scale_uniform(10);
-               font->draw_string(format("%d hosts", hosts.size()+disabled_hosts.size()));
-               GL::translate(0, -1.2, 0);
-               font->draw_string(format("%.2f fps", fps));
-               GL::pop_matrix();
-               GL::Texture::unbind();
-
-               wnd->swap_buffers();
+       for(map<unsigned, Host *>::iterator i=hosts.begin(); i!=hosts.end(); ++i)
+               i->second->render();
+       {
+               GL::Immediate imm((GL::COLOR4_UBYTE, GL::VERTEX2));
+               imm.begin(GL::QUADS);
+               for(list<Packet *>::iterator i=packets.begin(); i!=packets.end(); ++i)
+                       (*i)->render(imm);
+               imm.end();
        }
 
-       ++frames;
+       GL::push_matrix();
+       GL::translate(-500, 360, 0);
+       unsigned n = 0;
+       for(map<unsigned, Port *>::iterator i=ports.begin(); (i!=ports.end() && n<50); ++i, ++n)
+       {
+               i->second->render();
+               GL::translate(0, -12, 0);
+       }
+       GL::pop_matrix();
+
+       GL::push_matrix();
+       GL::translate(-500, -360, 0);
+       GL::scale_uniform(10);
+       font->draw_string(format("%d hosts", hosts.size()+disabled_hosts.size()));
+       GL::translate(0, -1.2, 0);
+       font->draw_string(format("%.2f fps", fps));
+       GL::Texture::unbind();
+       GL::pop_matrix();
 }
 
 Host &NetVis::get_host(unsigned a)
@@ -285,54 +245,14 @@ Host &NetVis::get_host(unsigned a)
        return *host;
 }
 
-GL::Color NetVis::generate_color(bool privileged) const
-{
-       GL::Color color;
-       color.r = rand()*1.0/RAND_MAX;
-       color.g = rand()*1.0/RAND_MAX;
-       color.b = rand()*1.0/RAND_MAX;
-       float high = max(max(color.r, color.g), color.b);
-       color = color*(1.0/high);
-       if(privileged)
-       {
-               float low = min(min(color.r, color.g), color.b);
-               color = (color+-low)*(1/(1-low));
-       }
-       else
-               color = color*0.6+0.4;
-       return color;
-}
-
 const Port &NetVis::get_port(unsigned number)
 {
-       map<unsigned, Port>::iterator i = ports.find(number);
+       map<unsigned, Port *>::iterator i = ports.find(number);
        if(i!=ports.end())
-               return i->second;
-
-       GL::Color best_color;
-       float best_score = 0;
-       for(unsigned j=0; (j<100 && best_score<1); ++j)
-       {
-               GL::Color color = generate_color(number<1024);
-
-               float score = 2;
-               for(i=ports.begin(); i!=ports.end(); ++i)
-               {
-                       const GL::Color &other = i->second.get_color();
-                       float dr = color.r-other.r;
-                       float dg = color.g-other.g;
-                       float db = color.b-other.b;
-                       score = min(score, dr*dr+dg*dg+db*db);
-               }
-               if(score>best_score)
-               {
-                       best_score = score;
-                       best_color = color;
-               }
-       }
-       best_color.a = 0.4f;
-       i = ports.insert(map<unsigned, Port>::value_type(number, Port(number, best_color))).first;
-       return i->second;
+               return *i->second;
+       Port *port = new Port(*this, number);
+       ports[number] = port;
+       return *port;
 }
 
 void NetVis::key_press(unsigned key, unsigned, wchar_t)