X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fhost.cpp;h=991e7741a04eb9a4acef1292992c707f08456b40;hb=69bcc0683c313b952981a50a6d66a6ee218ba755;hp=be24f05360d05060455228e66b6492dbb2160397;hpb=229e1d6ab66a9e987ffe3cd4a8de7c7f874f6de1;p=netvis.git diff --git a/source/host.cpp b/source/host.cpp index be24f05..991e774 100644 --- a/source/host.cpp +++ b/source/host.cpp @@ -1,3 +1,10 @@ +/* $Id$ + +This file is part of NetVis +Copyright @ 2008 Mikko Rasa, Mikkosoft Productions +Distributed unter the GPL +*/ + #include #include #include @@ -14,82 +21,149 @@ using namespace Msp; Host::Host(NetVis &nv, unsigned a): netvis(nv), - addr(a) + addr(a), + local(false), + active(true), + activity(0), + throttle(0) { in_addr ina; - ina.s_addr=htonl(addr); - name=inet_ntoa(ina); + ina.s_addr = htonl(addr); + name = inet_ntoa(ina); + short_name = name; +} + +void Host::set_name(const string &n) +{ + name = n; + + if(local) + { + unsigned dot = name.find('.'); + short_name = name.substr(0, dot); + } + else + { + unsigned dot = name.size(); + for(unsigned i=0; (dot>0 && dot!=string::npos); ++i) + { + unsigned prev = name.rfind('.', dot-1); + if(prev+151) + break; + dot = prev; + } + + if(dot==string::npos) + short_name = name; + else + short_name = "..."+name.substr(dot+1); + } +} + +void Host::set_local(bool l) +{ + local = l; } void Host::set_position(const Vector2 &p) { - pos=p; + pos = p; } -void Host::add_connection(Connection &) +void Host::set_active(bool a) { + active = a; } -Connection *Host::get_connection(Host &) +void Host::add_activity(unsigned bytes) { - return 0; + activity += bytes*0.06935; +} + +float Host::send_packet() +{ + float ret = throttle; + if(throttle<1) + throttle += 0.025; + return ret; } void Host::tick(const Msp::Time::TimeDelta &td) { - float dt=td/Msp::Time::sec; + float dt = td/Msp::Time::sec; + + activity *= pow(0.933f, dt); + throttle -= dt; + if(throttle<0) + throttle = 0; - const map &hosts=netvis.get_hosts(); - float fx=-pos.x*0.1; - float fy=-pos.y*0.1; + if(!active) + return; + + const map &hosts = netvis.get_hosts(); + float fx = -pos.x*0.1; + float fy = -pos.y*0.1; for(map::const_iterator i=hosts.begin(); i!=hosts.end(); ++i) { if(i->second!=this) { - const Vector2 &other_pos=i->second->get_position(); - float dx=other_pos.x-pos.x; - float dy=other_pos.y-pos.y; - float d2=dx*dx+dy*dy; - float d=sqrt(d2); - - unsigned other_addr=i->second->get_address(); - unsigned matching_bits=0; + const Vector2 &other_pos = i->second->get_position(); + float dx = other_pos.x-pos.x; + float dy = other_pos.y-pos.y; + float d2 = dx*dx+dy*dy; + float d = sqrt(d2); + + unsigned other_addr = i->second->get_address(); + unsigned matching_bits = 0; for(unsigned j=32; (j-- && !((addr^other_addr)>>j));) ++matching_bits; - float nearness=24-min(matching_bits, 24U); - float f=10000.0*(1.0/(60+nearness*15)-1.0/d); + float optimal_dist = 100+(24-min(matching_bits, 24U))*12; + float f = 5000.0*(1.0/optimal_dist-1.0/d); - fx+=dx/d*f; - fy+=dy/d*f; + fx += dx/d*f; + fy += dy/d*f; } } if(fx<-4 || fx>4) - pos.x+=fx*dt; + pos.x += fx*dt; if(fy<-4 || fy>4) - pos.y+=fy*dt; + pos.y += fy*dt; } void Host::render() const { + if(!active) + return; + GL::push_matrix(); GL::translate(static_cast(pos.x), static_cast(pos.y), 0); GL::Immediate imm((GL::COLOR4_UBYTE, GL::VERTEX2)); imm.begin(GL::QUADS); - imm.color(1.0f, 1.0f, 1.0f, 1.0f); + imm.color(1.0f, 1.0f, 1.0f, max(min(static_cast(activity/10000), 1.0f), 0.2f)); imm.vertex(-5, -5); imm.vertex(5, -5); imm.vertex(5, 5); imm.vertex(-5, 5); imm.end(); - const GL::Font &font=netvis.get_font(); - GL::translate(-static_cast(font.get_string_width(name)*5), 6, 0); + GL::pop_matrix(); +} + +void Host::render_label() const +{ + if(!active) + return; + + const GL::Font &font = netvis.get_font(); + + GL::push_matrix(); + GL::translate(static_cast(pos.x)-static_cast(font.get_string_width(short_name)*5), static_cast(pos.y)+6, 0); GL::scale_uniform(10); - font.draw_string(name); - GL::Texture::unbind(); + + font.draw_string(short_name); GL::pop_matrix(); }