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 | static int bufferPointVectorMetaTypeId = qRegisterMetaType<BufferPointVector>(); | 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 | void MetavoxelSystem::init() { | 49 | void 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 | ||
| 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 | class SimulateVisitor : public MetavoxelVisitor { | 81 | class SimulateVisitor : public MetavoxelVisitor { |
| 65 | public: | 82 | public: |
| 66 | 83 | ||
| @@ -692,10 +709,53 @@ MetavoxelData MetavoxelSystemClient::getAugmentedData() { · 625 unmodified lines | |||
| 692 | return _augmentedData; | 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 | int MetavoxelSystemClient::parseData(const QByteArray& packet) { | 741 | int MetavoxelSystemClient::parseData(const QByteArray& packet) { |
| 696 | // process through sequencer | 742 | // 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 | ||
| 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 | void MetavoxelSystemClient::sendDatagram(const QByteArray& data) { | 860 | void 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 | ||
| 782 | BufferData::~BufferData() { | 879 | BufferData::~BufferData() { |