3 This file is part of NetVis
4 Copyright @ 2008 Mikko Rasa, Mikkosoft Productions
5 Distributed unter the GPL
9 #include <netinet/in.h>
11 #include <msp/gl/immediate.h>
12 #include <msp/gl/matrix.h>
13 #include <msp/gl/meshbuilder.h>
14 #include <msp/gl/texture.h>
15 #include <msp/strings/lexicalcast.h>
22 Port::Port(NetVis &v, unsigned n):
26 mesh((GL::COLOR4_UBYTE, GL::VERTEX2))
30 addr.sin_family = AF_INET;
31 addr.sin_port = ntohs(number);
32 addr.sin_addr.s_addr = 0;
33 int err = getnameinfo(reinterpret_cast<sockaddr *>(&addr), sizeof(sockaddr_in), 0, 0, buf, sizeof(buf), 0);
37 registered = !isdigit(name[0]);
40 name = Msp::lexical_cast<string>(number);
42 const map<unsigned, Port *> &ports = netvis.get_ports();
44 if(ports.size()>100 && !registered)
45 tries = 10000/ports.size()+1;
47 for(unsigned i=0; (i<tries && best_score<1); ++i)
50 c.r = rand()*1.0/RAND_MAX;
51 c.g = rand()*1.0/RAND_MAX;
52 c.b = rand()*1.0/RAND_MAX;
53 float high = max(max(c.r, c.g), c.b);
57 float low = min(min(c.r, c.g), c.b);
58 c = (c+-low)*(1/(1-low));
64 for(map<unsigned, Port *>::const_iterator j=ports.begin(); j!=ports.end(); ++j)
66 if(registered && !j->second->is_registered())
68 const GL::Color &other = j->second->get_color();
69 float dr = c.r-other.r;
70 float dg = c.g-other.g;
71 float db = c.b-other.b;
72 score = min(score, dr*dr+dg*dg+db*db);
82 GL::MeshBuilder bld(mesh);
84 bld.color(color.r, color.g, color.b, color.a);
85 for(unsigned x=0; x<=4; x+=2)
95 void Port::add_activity(unsigned bytes)
97 activity.add_bytes(bytes);
100 void Port::tick(const Time::TimeDelta &dt)
105 void Port::render() const
107 GL::MatrixStack::Push push_(GL::MatrixStack::modelview());
110 GL::Immediate imm((GL::COLOR4_UBYTE, GL::VERTEX2));
111 imm.begin(GL::QUADS);
112 imm.color(color.r, color.g, color.b, color.a);
113 unsigned x = static_cast<unsigned>(activity.get_average()/4096);
116 imm.vertex(14+x, 10);
120 GL::MatrixStack::modelview() *= GL::Matrix::translation(16, 1, 0);
121 GL::MatrixStack::modelview() *= GL::Matrix::scaling(10);
122 netvis.get_font().draw_string(name);
123 GL::Texture::unbind();