Showing the changes to interface/src/MetavoxelSystem.cpp (1 of 5 files). Show all
Unified · Split
| @@ -39,6 +39,13 @@ REGISTER_META_OBJECT(StaticModelRenderer) · 38 unmodified lines | ||
| 39 | 39 | |
| 40 | 40 | static int bufferPointVectorMetaTypeId = qRegisterMetaType<BufferPointVector>(); |
| 41 | 41 | |
| 42 | +MetavoxelSystem::NetworkSimulation::NetworkSimulation(float dropRate, float repeatRate, int minimumDelay, int maximumDelay) : | |
| 43 | + dropRate(dropRate), | |
| 44 | + repeatRate(repeatRate), | |
| 45 | + minimumDelay(minimumDelay), | |
| 46 | + maximumDelay(maximumDelay) { | |
| 47 | +} | |
| 48 | + | |
| 42 | 49 | void MetavoxelSystem::init() { |
| 43 | 50 | MetavoxelClientManager::init(); |
| 44 | 51 | DefaultMetavoxelRendererImplementation::init(); |
| @@ -61,6 +68,16 @@ MetavoxelLOD MetavoxelSystem::getLOD() { · 16 unmodified lines | ||
| 61 | 68 | return _lod; |
| 62 | 69 | } |
| 63 | 70 | |
| 71 | +void MetavoxelSystem::setNetworkSimulation(const NetworkSimulation& simulation) { | |
| 72 | + QWriteLocker locker(&_networkSimulationLock); | |
| 73 | + _networkSimulation = simulation; | |
| 74 | +} | |
| 75 | + | |
| 76 | +MetavoxelSystem::NetworkSimulation MetavoxelSystem::getNetworkSimulation() { | |
| 77 | + QReadLocker locker(&_networkSimulationLock); | |
| 78 | + return _networkSimulation; | |
| 79 | +} | |
| 80 | + | |
| 64 | 81 | class SimulateVisitor : public MetavoxelVisitor { |
| 65 | 82 | public: |
| 66 | 83 | |
| @@ -692,10 +709,53 @@ MetavoxelData MetavoxelSystemClient::getAugmentedData() { · 625 unmodified lines | ||
| 692 | 709 | return _augmentedData; |
| 693 | 710 | } |
| 694 | 711 | |
| 712 | +class ReceiveDelayer : public QObject { | |
| 713 | +public: | |
| 714 | + | |
| 715 | + ReceiveDelayer(const SharedNodePointer& node, const QByteArray& packet); | |
| 716 | + | |
| 717 | +protected: | |
| 718 | + | |
| 719 | + virtual void timerEvent(QTimerEvent* event); | |
| 720 | + | |
| 721 | +private: | |
| 722 | + | |
| 723 | + SharedNodePointer _node; | |
| 724 | + QByteArray _packet; | |
| 725 | +}; | |
| 726 | + | |
| 727 | +ReceiveDelayer::ReceiveDelayer(const SharedNodePointer& node, const QByteArray& packet) : | |
| 728 | + _node(node), | |
| 729 | + _packet(packet) { | |
| 730 | +} | |
| 731 | + | |
| 732 | +void 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 | + | |
| 695 | 741 | int MetavoxelSystemClient::parseData(const QByteArray& packet) { |
| 696 | 742 | // process through sequencer |
| 697 | − QMetaObject::invokeMethod(&_sequencer, "receivedDatagram", Q_ARG(const QByteArray&, packet)); | |
| 698 | − Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::METAVOXELS).updateValue(packet.size()); | |
| 743 | + MetavoxelSystem::NetworkSimulation simulation = Application::getInstance()->getMetavoxels()->getNetworkSimulation(); | |
| 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 | 759 | return packet.size(); |
| 700 | 760 | } |
| 701 | 761 | |
| @@ -774,9 +834,46 @@ void MetavoxelSystemClient::dataChanged(const MetavoxelData& oldData) { · 72 unmodified lines | ||
| 774 | 834 | QThreadPool::globalInstance()->start(new Augmenter(_node, _data, getAugmentedData(), _remoteDataLOD)); |
| 775 | 835 | } |
| 776 | 836 | |
| 837 | +class SendDelayer : public QObject { | |
| 838 | +public: | |
| 839 | + | |
| 840 | + SendDelayer(const SharedNodePointer& node, const QByteArray& data); | |
| 841 | + | |
| 842 | + virtual void timerEvent(QTimerEvent* event); | |
| 843 | + | |
| 844 | +private: | |
| 845 | + | |
| 846 | + SharedNodePointer _node; | |
| 847 | + QByteArray _data; | |
| 848 | +}; | |
| 849 | + | |
| 850 | +SendDelayer::SendDelayer(const SharedNodePointer& node, const QByteArray& data) : | |
| 851 | + _node(node), | |
| 852 | + _data(data) { | |
| 853 | +} | |
| 854 | + | |
| 855 | +void SendDelayer::timerEvent(QTimerEvent* event) { | |
| 856 | + NodeList::getInstance()->writeDatagram(_data, _node); | |
| 857 | + deleteLater(); | |
| 858 | +} | |
| 859 | + | |
| 777 | 860 | void MetavoxelSystemClient::sendDatagram(const QByteArray& data) { |
| 778 | − NodeList::getInstance()->writeDatagram(data, _node); | |
| 779 | − Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::METAVOXELS).updateValue(data.size()); | |
| 861 | + MetavoxelSystem::NetworkSimulation simulation = Application::getInstance()->getMetavoxels()->getNetworkSimulation(); | |
| 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 | |
| 782 | 879 | BufferData::~BufferData() { |