]> git.tdb.fi Git - netvis.git/blob - source/port.cpp
1c940af8a4c69e4ea5808cd668dfe42238b51060
[netvis.git] / source / port.cpp
1 /* $Id$
2
3 This file is part of NetVis
4 Copyright @ 2008 Mikko Rasa, Mikkosoft Productions
5 Distributed unter the GPL
6 */
7
8 #include <cstdlib>
9 #include <netinet/in.h>
10 #include <netdb.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>
16 #include "port.h"
17 #include "netvis.h"
18
19 using namespace std;
20 using namespace Msp;
21
22 Port::Port(NetVis &v, unsigned n):
23         netvis(v),
24         number(n),
25         mesh((GL::COLOR4_UBYTE, GL::VERTEX2))
26 {
27         char buf[128];
28         sockaddr_in addr;
29         addr.sin_family = AF_INET;
30         addr.sin_port = ntohs(number);
31         addr.sin_addr.s_addr = 0;
32         int err = getnameinfo(reinterpret_cast<sockaddr *>(&addr), sizeof(sockaddr_in), 0, 0, buf, sizeof(buf), 0);
33         if(err==0)
34                 name = buf;
35         else
36                 name = Msp::lexical_cast(number);
37
38         const map<unsigned, Port *> &ports = netvis.get_ports();
39         unsigned tries = 100;
40         if(ports.size()>100 && number>=1024)
41                 tries = 10000/ports.size()+1;
42         float best_score = 0;
43         for(unsigned i=0; (i<tries && best_score<1); ++i)
44         {
45                 GL::Color c;
46                 c.r = rand()*1.0/RAND_MAX;
47                 c.g = rand()*1.0/RAND_MAX;
48                 c.b = rand()*1.0/RAND_MAX;
49                 float high = max(max(c.r, c.g), c.b);
50                 c = c*(1.0/high);
51                 if(number<1024)
52                 {
53                         float low = min(min(c.r, c.g), c.b);
54                         c = (c+-low)*(1/(1-low));
55                 }
56                 else
57                         c = c*0.6+0.4;
58
59                 float score = 2;
60                 for(map<unsigned, Port *>::const_iterator j=ports.begin(); j!=ports.end(); ++j)
61                 {
62                         if(number<1024 && j->first>1024)
63                                 break;
64                         const GL::Color &other = j->second->get_color();
65                         float dr = c.r-other.r;
66                         float dg = c.g-other.g;
67                         float db = c.b-other.b;
68                         score = min(score, dr*dr+dg*dg+db*db);
69                 }
70                 if(score>best_score)
71                 {
72                         best_score = score;
73                         color = c;
74                 }
75         }
76         color.a = 0.4f;
77
78         GL::MeshBuilder bld(mesh);
79         bld.begin(GL::QUADS);
80         bld.color(color.r, color.g, color.b, color.a);
81         for(unsigned x=0; x<=4; x+=2)
82         {
83                 bld.vertex(x+0, 0);
84                 bld.vertex(x+10, 0);
85                 bld.vertex(x+10, 10);
86                 bld.vertex(x+0, 10);
87         }
88         bld.end();
89 }
90
91 void Port::render() const
92 {
93         GL::PushMatrix push_;
94         mesh.draw();
95         GL::translate(16, 1, 0);
96         GL::scale_uniform(10);
97         GL::Immediate imm((GL::COLOR4_UBYTE, GL::TEXCOORD2, GL::VERTEX2));
98         netvis.get_font().draw_string(name, imm);
99         GL::Texture::unbind();
100 }