X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fhost.cpp;h=c18f117ba11d3dc360328ad0eb539c3d4e8939ed;hb=cc29ebb178d4695573f10a829534cb660e14e79d;hp=be24f05360d05060455228e66b6492dbb2160397;hpb=229e1d6ab66a9e987ffe3cd4a8de7c7f874f6de1;p=netvis.git diff --git a/source/host.cpp b/source/host.cpp index be24f05..c18f117 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,138 @@ using namespace Msp; Host::Host(NetVis &nv, unsigned a): netvis(nv), - addr(a) + addr(a), + local(false), + active(true), + 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::set_active(bool a) +{ + active = a; } -void Host::add_connection(Connection &) +void Host::add_activity(unsigned bytes) { + activity.add_bytes(bytes); } -Connection *Host::get_connection(Host &) +float Host::send_packet() { - return 0; + 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; - const map &hosts=netvis.get_hosts(); - float fx=-pos.x*0.1; - float fy=-pos.y*0.1; + activity.tick(td); + throttle -= dt; + if(throttle<0) + throttle = 0; + + 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 { - GL::push_matrix(); + if(!active) + return; + + GL::PushMatrix push_; GL::translate(static_cast(pos.x), static_cast(pos.y), 0); - GL::Immediate imm((GL::COLOR4_UBYTE, GL::VERTEX2)); + GL::Immediate imm((GL::COLOR4_UBYTE, GL::TEXCOORD2, 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.get_average()/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); + const GL::Font &font = netvis.get_font(); + GL::translate(-static_cast(font.get_string_width(short_name)*5), 6, 0); GL::scale_uniform(10); - font.draw_string(name); - GL::Texture::unbind(); - GL::pop_matrix(); + imm.color(1.0f, 1.0f, 1.0f); + font.draw_string(short_name, imm); + GL::Texture::unbind(); }