History

Basic network simulation for metavoxels.

Andrzej Kapolka committed 12 years ago

Commit 45fb31c1 parent b796e1b5 files · +132 −5Browse files

Showing the changes to interface/src/MetavoxelSystem.cpp (1 of 5 files). Show all

Unified · Split

interface/src/MetavoxelSystem.cpp+101−4
@@ -39,6 +39,13 @@ REGISTER_META_OBJECT(StaticModelRenderer) · 38 unmodified lines
39 39
40static int bufferPointVectorMetaTypeId = qRegisterMetaType<BufferPointVector>();40static int bufferPointVectorMetaTypeId = qRegisterMetaType<BufferPointVector>();
41 41
42MetavoxelSystem::NetworkSimulation::NetworkSimulation(float dropRate, float repeatRate, int minimumDelay, int maximumDelay) :
43 dropRate(dropRate),
44 repeatRate(repeatRate),
45 minimumDelay(minimumDelay),
46 maximumDelay(maximumDelay) {
47}
48
42void MetavoxelSystem::init() {49void MetavoxelSystem::init() {
43 MetavoxelClientManager::init();50 MetavoxelClientManager::init();
44 DefaultMetavoxelRendererImplementation::init();51 DefaultMetavoxelRendererImplementation::init();
@@ -61,6 +68,16 @@ MetavoxelLOD MetavoxelSystem::getLOD() { · 16 unmodified lines
61 return _lod;68 return _lod;
62}69}
63 70
71void MetavoxelSystem::setNetworkSimulation(const NetworkSimulation& simulation) {
72 QWriteLocker locker(&_networkSimulationLock);
73 _networkSimulation = simulation;
74}
75
76MetavoxelSystem::NetworkSimulation MetavoxelSystem::getNetworkSimulation() {
77 QReadLocker locker(&_networkSimulationLock);
78 return _networkSimulation;
79}
80
64class SimulateVisitor : public MetavoxelVisitor {81class SimulateVisitor : public MetavoxelVisitor {
65public:82public:
66 83
@@ -692,10 +709,53 @@ MetavoxelData MetavoxelSystemClient::getAugmentedData() { · 625 unmodified lines
692 return _augmentedData;709 return _augmentedData;
693}710}
694 711
712class ReceiveDelayer : public QObject {
713public:
714
715 ReceiveDelayer(const SharedNodePointer& node, const QByteArray& packet);
716
717protected:
718
719 virtual void timerEvent(QTimerEvent* event);
720
721private:
722
723 SharedNodePointer _node;
724 QByteArray _packet;
725};
726
727ReceiveDelayer::ReceiveDelayer(const SharedNodePointer& node, const QByteArray& packet) :
728 _node(node),
729 _packet(packet) {
730}
731
732void ReceiveDelayer::timerEvent(QTimerEvent* event) {
733 QMutexLocker locker(&_node->getMutex());
734 MetavoxelClient* client = static_cast<MetavoxelClient*>(_node->getLinkedData());
735 if (client) {
736 QMetaObject::invokeMethod(&client->getSequencer(), "receivedDatagram", Q_ARG(const QByteArray&, _packet));
737 }
738 deleteLater();
739}
740
695int MetavoxelSystemClient::parseData(const QByteArray& packet) {741int MetavoxelSystemClient::parseData(const QByteArray& packet) {
696 // process through sequencer742 // process through sequencer
697 QMetaObject::invokeMethod(&_sequencer, "receivedDatagram", Q_ARG(const QByteArray&, packet));743 MetavoxelSystem::NetworkSimulation simulation = Application::getInstance()->getMetavoxels()->getNetworkSimulation();
698 Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::METAVOXELS).updateValue(packet.size());744 if (randFloat() < simulation.dropRate) {
745 return packet.size();
746 }
747 int count = (randFloat() < simulation.repeatRate) ? 2 : 1;
748 for (int i = 0; i < count; i++) {
749 int delay = randIntInRange(simulation.minimumDelay, simulation.maximumDelay);
750 if (delay > 0) {
751 ReceiveDelayer* delayer = new ReceiveDelayer(_node, packet);
752 delayer->startTimer(delay);
753
754 } else {
755 QMetaObject::invokeMethod(&_sequencer, "receivedDatagram", Q_ARG(const QByteArray&, packet));
756 }
757 Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::METAVOXELS).updateValue(packet.size());
758 }
699 return packet.size();759 return packet.size();
700}760}
701 761
@@ -774,9 +834,46 @@ void MetavoxelSystemClient::dataChanged(const MetavoxelData& oldData) { · 72 unmodified lines
774 QThreadPool::globalInstance()->start(new Augmenter(_node, _data, getAugmentedData(), _remoteDataLOD));834 QThreadPool::globalInstance()->start(new Augmenter(_node, _data, getAugmentedData(), _remoteDataLOD));
775}835}
776 836
837class SendDelayer : public QObject {
838public:
839
840 SendDelayer(const SharedNodePointer& node, const QByteArray& data);
841
842 virtual void timerEvent(QTimerEvent* event);
843
844private:
845
846 SharedNodePointer _node;
847 QByteArray _data;
848};
849
850SendDelayer::SendDelayer(const SharedNodePointer& node, const QByteArray& data) :
851 _node(node),
852 _data(data) {
853}
854
855void SendDelayer::timerEvent(QTimerEvent* event) {
856 NodeList::getInstance()->writeDatagram(_data, _node);
857 deleteLater();
858}
859
777void MetavoxelSystemClient::sendDatagram(const QByteArray& data) {860void MetavoxelSystemClient::sendDatagram(const QByteArray& data) {
778 NodeList::getInstance()->writeDatagram(data, _node);861 MetavoxelSystem::NetworkSimulation simulation = Application::getInstance()->getMetavoxels()->getNetworkSimulation();
779 Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::METAVOXELS).updateValue(data.size());862 if (randFloat() < simulation.dropRate) {
863 return;
864 }
865 int count = (randFloat() < simulation.repeatRate) ? 2 : 1;
866 for (int i = 0; i < count; i++) {
867 int delay = randIntInRange(simulation.minimumDelay, simulation.maximumDelay);
868 if (delay > 0) {
869 SendDelayer* delayer = new SendDelayer(_node, data);
870 delayer->startTimer(delay);
871
872 } else {
873 NodeList::getInstance()->writeDatagram(data, _node);
874 }
875 Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::METAVOXELS).updateValue(data.size());
876 }
780}877}
781 878
782BufferData::~BufferData() {879BufferData::~BufferData() {