Showing the changes to interface/src/Application.cpp (1 of 15 files). Show all
Unified · Split
| @@ -63,7 +63,7 @@ · 62 unmodified lines | ||
| 63 | 63 | #include <UUID.h> |
| 64 | 64 | #include <OctreeSceneStats.h> |
| 65 | 65 | #include <LocalVoxelsList.h> |
| 66 | −#include <FstReader.h> | |
| 66 | +#include <ModelUploader.h> | |
| 67 | 67 | |
| 68 | 68 | #include "Application.h" |
| 69 | 69 | #include "InterfaceVersion.h" |
| @@ -81,6 +81,7 @@ · 11 unmodified lines | ||
| 81 | 81 | #include "ui/InfoView.h" |
| 82 | 82 | #include "ui/Snapshot.h" |
| 83 | 83 | #include "ui/TextRenderer.h" |
| 84 | +#include "ui/Stats.h" | |
| 84 | 85 | |
| 85 | 86 | using namespace std; |
| 86 | 87 | |
| @@ -110,8 +111,6 @@ const float MIRROR_FIELD_OF_VIEW = 30.0f; · 23 unmodified lines | ||
| 110 | 111 | const QString CHECK_VERSION_URL = "http://highfidelity.io/latestVersion.xml"; |
| 111 | 112 | const QString SKIP_FILENAME = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/hifi.skipversion"; |
| 112 | 113 | |
| 113 | −const int STATS_PELS_PER_LINE = 20; | |
| 114 | − | |
| 115 | 114 | void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString& message) { |
| 116 | 115 | if (message.size() > 0) { |
| 117 | 116 | QString dateString = QDateTime::currentDateTime().toTimeSpec(Qt::LocalTime).toString(Qt::ISODate); |
| @@ -135,7 +134,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : · 17 unmodified lines | ||
| 135 | 134 | QApplication(argc, argv), |
| 136 | 135 | _window(new QMainWindow(desktop())), |
| 137 | 136 | _glWidget(new GLCanvas()), |
| 138 | − _statsExpanded(false), | |
| 139 | 137 | _nodeThread(new QThread(this)), |
| 140 | 138 | _datagramProcessor(), |
| 141 | 139 | _frameCount(0), |
| @@ -149,7 +147,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : · 7 unmodified lines | ||
| 149 | 147 | _lastQueriedViewFrustum(), |
| 150 | 148 | _lastQueriedTime(usecTimestampNow()), |
| 151 | 149 | _audioScope(256, 200, true), |
| 152 | − _trailingAudioLoudness(0.f), | |
| 153 | 150 | _mirrorViewRect(QRect(MIRROR_VIEW_LEFT_PADDING, MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT)), |
| 154 | 151 | _mouseX(0), |
| 155 | 152 | _mouseY(0), |
| @@ -166,8 +163,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : · 10 unmodified lines | ||
| 166 | 163 | _voxelHideShowThread(&_voxels), |
| 167 | 164 | _packetsPerSecond(0), |
| 168 | 165 | _bytesPerSecond(0), |
| 169 | − _recentMaxPackets(0), | |
| 170 | − _resetRecentMaxPacketsSoon(true), | |
| 171 | 166 | _previousScriptLocation(), |
| 172 | 167 | _logger(new FileLogger(this)) |
| 173 | 168 | { |
| @@ -515,7 +510,7 @@ void Application::paintGL() { · 341 unmodified lines | ||
| 515 | 510 | _myCamera.setDistance(0.0f); |
| 516 | 511 | _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing |
| 517 | 512 | _myCamera.setTargetPosition(_myAvatar->getHead()->calculateAverageEyePosition()); |
| 518 | − _myCamera.setTargetRotation(_myAvatar->getHead()->getOrientation()); | |
| 513 | + _myCamera.setTargetRotation(_myAvatar->getHead()->getCameraOrientation()); | |
| 519 | 514 | |
| 520 | 515 | } else if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { |
| 521 | 516 | _myCamera.setTightness(0.0f); // In first person, camera follows (untweaked) head exactly without delay |
| @@ -617,6 +612,14 @@ void Application::resizeGL(int width, int height) { · 95 unmodified lines | ||
| 617 | 612 | |
| 618 | 613 | updateProjectionMatrix(); |
| 619 | 614 | glLoadIdentity(); |
| 615 | + | |
| 616 | + // update Stats width | |
| 617 | + int horizontalOffset = 0; | |
| 618 | + if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { | |
| 619 | + // mirror is enabled, let's set horizontal offset to give stats some margin | |
| 620 | + horizontalOffset += MIRROR_VIEW_WIDTH + MIRROR_VIEW_LEFT_PADDING * 2; | |
| 621 | + } | |
| 622 | + Stats::getInstance()->resetWidth(width, horizontalOffset); | |
| 620 | 623 | } |
| 621 | 624 | |
| 622 | 625 | void Application::updateProjectionMatrix() { |
| @@ -1059,7 +1062,11 @@ void Application::mouseReleaseEvent(QMouseEvent* event) { · 436 unmodified lines | ||
| 1059 | 1062 | _mousePressed = false; |
| 1060 | 1063 | checkBandwidthMeterClick(); |
| 1061 | 1064 | if (Menu::getInstance()->isOptionChecked(MenuOption::Stats)) { |
| 1062 | − checkStatsClick(); | |
| 1065 | + int horizontalOffset = 0; | |
| 1066 | + if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { | |
| 1067 | + horizontalOffset = MIRROR_VIEW_WIDTH; | |
| 1068 | + } | |
| 1069 | + Stats::getInstance()->checkClick(_mouseX, _mouseY, _mouseDragStartedX, _mouseDragStartedY, horizontalOffset); | |
| 1063 | 1070 | } |
| 1064 | 1071 | } |
| 1065 | 1072 | } |
| @@ -2598,11 +2605,17 @@ void Application::displayOverlay() { · 1532 unmodified lines | ||
| 2598 | 2605 | glPointSize(1.0f); |
| 2599 | 2606 | |
| 2600 | 2607 | if (Menu::getInstance()->isOptionChecked(MenuOption::Stats)) { |
| 2608 | + int horizontalOffset = 0; | |
| 2609 | + if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { | |
| 2610 | + // mirror is enabled, let's set horizontal offset to give stats some margin | |
| 2611 | + horizontalOffset += MIRROR_VIEW_WIDTH + MIRROR_VIEW_LEFT_PADDING * 2; | |
| 2612 | + } | |
| 2613 | + int voxelPacketsToProcess = _voxelProcessor.packetsToProcessCount(); | |
| 2601 | 2614 | // Onscreen text about position, servers, etc |
| 2602 | − displayStats(); | |
| 2615 | + Stats::getInstance()->display(WHITE_TEXT, horizontalOffset, _fps, _packetsPerSecond, _bytesPerSecond, voxelPacketsToProcess); | |
| 2603 | 2616 | // Bandwidth meter |
| 2604 | 2617 | if (Menu::getInstance()->isOptionChecked(MenuOption::Bandwidth)) { |
| 2605 | − displayStatsBackground(0x33333399, _glWidget->width() - 296, _glWidget->height() - 68, 296, 68); | |
| 2618 | + Stats::drawBackground(0x33333399, _glWidget->width() - 296, _glWidget->height() - 68, 296, 68); | |
| 2606 | 2619 | _bandwidthMeter.render(_glWidget->width(), _glWidget->height()); |
| 2607 | 2620 | } |
| 2608 | 2621 | } |
| @@ -2624,415 +2637,6 @@ void Application::displayOverlay() { · 15 unmodified lines | ||
| 2624 | 2637 | glPopMatrix(); |
| 2625 | 2638 | } |
| 2626 | 2639 | |
| 2627 | −// translucent background box that makes stats more readable | |
| 2628 | −void Application::displayStatsBackground(unsigned int rgba, int x, int y, int width, int height) { | |
| 2629 | − glBegin(GL_QUADS); | |
| 2630 | − glColor4f(((rgba >> 24) & 0xff) / 255.0f, | |
| 2631 | − ((rgba >> 16) & 0xff) / 255.0f, | |
| 2632 | − ((rgba >> 8) & 0xff) / 255.0f, | |
| 2633 | − (rgba & 0xff) / 255.0f); | |
| 2634 | − glVertex3f(x, y, 0); | |
| 2635 | − glVertex3f(x + width, y, 0); | |
| 2636 | − glVertex3f(x + width, y + height, 0); | |
| 2637 | − glVertex3f(x , y + height, 0); | |
| 2638 | − glEnd(); | |
| 2639 | − glColor4f(1, 1, 1, 1); | |
| 2640 | −} | |
| 2641 | − | |
| 2642 | −// display expanded or contracted stats | |
| 2643 | − | |
| 2644 | −void Application::displayStats() { | |
| 2645 | − unsigned int backgroundColor = 0x33333399; | |
| 2646 | − int verticalOffset = 0, horizontalOffset = 0, lines = 0; | |
| 2647 | − bool mirrorEnabled = Menu::getInstance()->isOptionChecked(MenuOption::Mirror); | |
| 2648 | − | |
| 2649 | − QLocale locale(QLocale::English); | |
| 2650 | − std::stringstream voxelStats; | |
| 2651 | − | |
| 2652 | − glPointSize(1.0f); | |
| 2653 | − | |
| 2654 | − // we need to take one avatar out so we don't include ourselves | |
| 2655 | − int totalAvatars = _avatarManager.size() - 1; | |
| 2656 | − int totalServers = NodeList::getInstance()->size(); | |
| 2657 | − | |
| 2658 | − if (mirrorEnabled) { | |
| 2659 | − horizontalOffset += MIRROR_VIEW_WIDTH + MIRROR_VIEW_LEFT_PADDING * 2; | |
| 2660 | − } | |
| 2661 | − | |
| 2662 | − lines = _statsExpanded ? 5 : 3; | |
| 2663 | − displayStatsBackground(backgroundColor, horizontalOffset, 0, 165, lines * STATS_PELS_PER_LINE + 10); | |
| 2664 | − horizontalOffset += 5; | |
| 2665 | − | |
| 2666 | − char serverNodes[30]; | |
| 2667 | − sprintf(serverNodes, "Servers: %d", totalServers); | |
| 2668 | − char avatarNodes[30]; | |
| 2669 | − sprintf(avatarNodes, "Avatars: %d", totalAvatars); | |
| 2670 | − char framesPerSecond[30]; | |
| 2671 | − sprintf(framesPerSecond, "Framerate: %3.0f FPS", _fps); | |
| 2672 | − | |
| 2673 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2674 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, serverNodes, WHITE_TEXT); | |
| 2675 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2676 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, avatarNodes, WHITE_TEXT); | |
| 2677 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2678 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, framesPerSecond, WHITE_TEXT); | |
| 2679 | − | |
| 2680 | − if (_statsExpanded) { | |
| 2681 | − char packetsPerSecond[30]; | |
| 2682 | − sprintf(packetsPerSecond, "Pkts/sec: %d", _packetsPerSecond); | |
| 2683 | − char averageMegabitsPerSecond[30]; | |
| 2684 | − sprintf(averageMegabitsPerSecond, "Mbps: %3.2f", (float)_bytesPerSecond * 8.f / 1000000.f); | |
| 2685 | − | |
| 2686 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2687 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, packetsPerSecond, WHITE_TEXT); | |
| 2688 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2689 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, averageMegabitsPerSecond, WHITE_TEXT); | |
| 2690 | − } | |
| 2691 | − | |
| 2692 | − verticalOffset = 0; | |
| 2693 | − horizontalOffset += 161; | |
| 2694 | − | |
| 2695 | − if (Menu::getInstance()->isOptionChecked(MenuOption::TestPing)) { | |
| 2696 | − int pingAudio = 0, pingAvatar = 0, pingVoxel = 0, pingVoxelMax = 0; | |
| 2697 | − | |
| 2698 | − NodeList* nodeList = NodeList::getInstance(); | |
| 2699 | − SharedNodePointer audioMixerNode = nodeList->soloNodeOfType(NodeType::AudioMixer); | |
| 2700 | − SharedNodePointer avatarMixerNode = nodeList->soloNodeOfType(NodeType::AvatarMixer); | |
| 2701 | − | |
| 2702 | − pingAudio = audioMixerNode ? audioMixerNode->getPingMs() : 0; | |
| 2703 | − pingAvatar = avatarMixerNode ? avatarMixerNode->getPingMs() : 0; | |
| 2704 | − | |
| 2705 | − // Now handle voxel servers, since there could be more than one, we average their ping times | |
| 2706 | − unsigned long totalPingVoxel = 0; | |
| 2707 | − int voxelServerCount = 0; | |
| 2708 | − | |
| 2709 | − foreach (const SharedNodePointer& node, nodeList->getNodeHash()) { | |
| 2710 | − if (node->getType() == NodeType::VoxelServer) { | |
| 2711 | − totalPingVoxel += node->getPingMs(); | |
| 2712 | − voxelServerCount++; | |
| 2713 | − if (pingVoxelMax < node->getPingMs()) { | |
| 2714 | − pingVoxelMax = node->getPingMs(); | |
| 2715 | − } | |
| 2716 | − } | |
| 2717 | − } | |
| 2718 | − | |
| 2719 | − if (voxelServerCount) { | |
| 2720 | − pingVoxel = totalPingVoxel/voxelServerCount; | |
| 2721 | − } | |
| 2722 | − | |
| 2723 | − lines = _statsExpanded ? 4 : 3; | |
| 2724 | − displayStatsBackground(backgroundColor, horizontalOffset, 0, 175, lines * STATS_PELS_PER_LINE + 10); | |
| 2725 | − horizontalOffset += 5; | |
| 2726 | − | |
| 2727 | − char audioJitter[30]; | |
| 2728 | − sprintf(audioJitter, | |
| 2729 | − "Buffer msecs %.1f", | |
| 2730 | − (float) (_audio.getNetworkBufferLengthSamplesPerChannel() + (float) _audio.getJitterBufferSamples()) / | |
| 2731 | − (float)_audio.getNetworkSampleRate() * 1000.f); | |
| 2732 | − drawText(30, _glWidget->height() - 22, 0.10f, 0.f, 2.f, audioJitter, WHITE_TEXT); | |
| 2733 | − | |
| 2734 | − | |
| 2735 | − char audioPing[30]; | |
| 2736 | − sprintf(audioPing, "Audio ping: %d", pingAudio); | |
| 2737 | − | |
| 2738 | − | |
| 2739 | − char avatarPing[30]; | |
| 2740 | − sprintf(avatarPing, "Avatar ping: %d", pingAvatar); | |
| 2741 | − char voxelAvgPing[30]; | |
| 2742 | − sprintf(voxelAvgPing, "Voxel avg ping: %d", pingVoxel); | |
| 2743 | − | |
| 2744 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2745 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, audioPing, WHITE_TEXT); | |
| 2746 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2747 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, avatarPing, WHITE_TEXT); | |
| 2748 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2749 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, voxelAvgPing, WHITE_TEXT); | |
| 2750 | − | |
| 2751 | − if (_statsExpanded) { | |
| 2752 | − char voxelMaxPing[30]; | |
| 2753 | − sprintf(voxelMaxPing, "Voxel max ping: %d", pingVoxelMax); | |
| 2754 | − | |
| 2755 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2756 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, voxelMaxPing, WHITE_TEXT); | |
| 2757 | − } | |
| 2758 | − | |
| 2759 | − verticalOffset = 0; | |
| 2760 | − horizontalOffset += 171; | |
| 2761 | − } | |
| 2762 | − | |
| 2763 | − glm::vec3 avatarPos = _myAvatar->getPosition(); | |
| 2764 | − | |
| 2765 | − lines = _statsExpanded ? 5 : 3; | |
| 2766 | − displayStatsBackground(backgroundColor, horizontalOffset, 0, _glWidget->width() - (mirrorEnabled ? 301 : 411) - horizontalOffset, lines * STATS_PELS_PER_LINE + 10); | |
| 2767 | − horizontalOffset += 5; | |
| 2768 | − | |
| 2769 | − char avatarPosition[200]; | |
| 2770 | − if (mirrorEnabled) { | |
| 2771 | − // shorthand formatting | |
| 2772 | − sprintf(avatarPosition, "Pos: %.0f,%.0f,%.0f", avatarPos.x, avatarPos.y, avatarPos.z); | |
| 2773 | − } else { | |
| 2774 | − // longhand way | |
| 2775 | − sprintf(avatarPosition, "Position: %.1f, %.1f, %.1f", avatarPos.x, avatarPos.y, avatarPos.z); | |
| 2776 | − } | |
| 2777 | − char avatarVelocity[30]; | |
| 2778 | − sprintf(avatarVelocity, "Velocity: %.1f", glm::length(_myAvatar->getVelocity())); | |
| 2779 | − char avatarBodyYaw[30]; | |
| 2780 | − sprintf(avatarBodyYaw, "Yaw: %.1f", _myAvatar->getBodyYaw()); | |
| 2781 | − char avatarMixerStats[200]; | |
| 2782 | − | |
| 2783 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2784 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, avatarPosition, WHITE_TEXT); | |
| 2785 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2786 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, avatarVelocity, WHITE_TEXT); | |
| 2787 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2788 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, avatarBodyYaw, WHITE_TEXT); | |
| 2789 | − | |
| 2790 | − if (_statsExpanded) { | |
| 2791 | − SharedNodePointer avatarMixer = NodeList::getInstance()->soloNodeOfType(NodeType::AvatarMixer); | |
| 2792 | − if (avatarMixer) { | |
| 2793 | − sprintf(avatarMixerStats, "Avatar Mixer: %.f kbps, %.f pps", | |
| 2794 | − roundf(avatarMixer->getAverageKilobitsPerSecond()), | |
| 2795 | − roundf(avatarMixer->getAveragePacketsPerSecond())); | |
| 2796 | − } else { | |
| 2797 | − sprintf(avatarMixerStats, "No Avatar Mixer"); | |
| 2798 | − } | |
| 2799 | − | |
| 2800 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2801 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, avatarMixerStats, WHITE_TEXT); | |
| 2802 | − | |
| 2803 | − stringstream downloadStats; | |
| 2804 | − downloadStats << "Downloads: "; | |
| 2805 | − foreach (Resource* resource, ResourceCache::getLoadingRequests()) { | |
| 2806 | − const float MAXIMUM_PERCENTAGE = 100.0f; | |
| 2807 | − downloadStats << roundf(resource->getProgress() * MAXIMUM_PERCENTAGE) << "% "; | |
| 2808 | − } | |
| 2809 | − downloadStats << "(" << ResourceCache::getPendingRequestCount() << " pending)"; | |
| 2810 | − | |
| 2811 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2812 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, downloadStats.str().c_str(), WHITE_TEXT); | |
| 2813 | − } | |
| 2814 | − | |
| 2815 | − verticalOffset = 0; | |
| 2816 | − horizontalOffset = _glWidget->width() - (mirrorEnabled ? 300 : 410); | |
| 2817 | − | |
| 2818 | − lines = _statsExpanded ? 12 : 3; | |
| 2819 | − displayStatsBackground(backgroundColor, horizontalOffset, 0, _glWidget->width() - horizontalOffset, lines * STATS_PELS_PER_LINE + 10); | |
| 2820 | − horizontalOffset += 5; | |
| 2821 | − | |
| 2822 | − if (_statsExpanded) { | |
| 2823 | − // Local Voxel Memory Usage | |
| 2824 | − voxelStats.str(""); | |
| 2825 | − voxelStats << "Voxels Memory Nodes: " << VoxelTreeElement::getTotalMemoryUsage() / 1000000.f << "MB"; | |
| 2826 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2827 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)voxelStats.str().c_str(), WHITE_TEXT); | |
| 2828 | − | |
| 2829 | − voxelStats.str(""); | |
| 2830 | − voxelStats << | |
| 2831 | − "Geometry RAM: " << _voxels.getVoxelMemoryUsageRAM() / 1000000.f << "MB / " << | |
| 2832 | − "VBO: " << _voxels.getVoxelMemoryUsageVBO() / 1000000.f << "MB"; | |
| 2833 | − if (_voxels.hasVoxelMemoryUsageGPU()) { | |
| 2834 | − voxelStats << " / GPU: " << _voxels.getVoxelMemoryUsageGPU() / 1000000.f << "MB"; | |
| 2835 | − } | |
| 2836 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2837 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)voxelStats.str().c_str(), WHITE_TEXT); | |
| 2838 | − | |
| 2839 | − // Voxel Rendering | |
| 2840 | − voxelStats.str(""); | |
| 2841 | − voxelStats.precision(4); | |
| 2842 | − voxelStats << "Voxel Rendering Slots Max: " << _voxels.getMaxVoxels() / 1000.f << "K"; | |
| 2843 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2844 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)voxelStats.str().c_str(), WHITE_TEXT); | |
| 2845 | − } | |
| 2846 | − | |
| 2847 | − voxelStats.str(""); | |
| 2848 | − voxelStats.precision(4); | |
| 2849 | − voxelStats << "Drawn: " << _voxels.getVoxelsWritten() / 1000.f << "K " << | |
| 2850 | − "Abandoned: " << _voxels.getAbandonedVoxels() / 1000.f << "K "; | |
| 2851 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2852 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)voxelStats.str().c_str(), WHITE_TEXT); | |
| 2853 | − | |
| 2854 | − // iterate all the current voxel stats, and list their sending modes, and total voxel counts | |
| 2855 | − std::stringstream sendingMode(""); | |
| 2856 | − sendingMode << "Octree Sending Mode: ["; | |
| 2857 | − int serverCount = 0; | |
| 2858 | − int movingServerCount = 0; | |
| 2859 | − unsigned long totalNodes = 0; | |
| 2860 | − unsigned long totalInternal = 0; | |
| 2861 | − unsigned long totalLeaves = 0; | |
| 2862 | − for(NodeToOctreeSceneStatsIterator i = _octreeServerSceneStats.begin(); i != _octreeServerSceneStats.end(); i++) { | |
| 2863 | − //const QUuid& uuid = i->first; | |
| 2864 | − OctreeSceneStats& stats = i->second; | |
| 2865 | − serverCount++; | |
| 2866 | − if (_statsExpanded) { | |
| 2867 | − if (serverCount > 1) { | |
| 2868 | − sendingMode << ","; | |
| 2869 | − } | |
| 2870 | − if (stats.isMoving()) { | |
| 2871 | − sendingMode << "M"; | |
| 2872 | − movingServerCount++; | |
| 2873 | − } else { | |
| 2874 | − sendingMode << "S"; | |
| 2875 | − } | |
| 2876 | − } | |
| 2877 | − | |
| 2878 | − // calculate server node totals | |
| 2879 | − totalNodes += stats.getTotalElements(); | |
| 2880 | − if (_statsExpanded) { | |
| 2881 | − totalInternal += stats.getTotalInternal(); | |
| 2882 | − totalLeaves += stats.getTotalLeaves(); | |
| 2883 | − } | |
| 2884 | − } | |
| 2885 | − if (_statsExpanded) { | |
| 2886 | − if (serverCount == 0) { | |
| 2887 | − sendingMode << "---"; | |
| 2888 | − } | |
| 2889 | − sendingMode << "] " << serverCount << " servers"; | |
| 2890 | − if (movingServerCount > 0) { | |
| 2891 | − sendingMode << " <SCENE NOT STABLE>"; | |
| 2892 | − } else { | |
| 2893 | − sendingMode << " <SCENE STABLE>"; | |
| 2894 | − } | |
| 2895 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2896 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)sendingMode.str().c_str(), WHITE_TEXT); | |
| 2897 | − } | |
| 2898 | − | |
| 2899 | − // Incoming packets | |
| 2900 | − int voxelPacketsToProcess = _voxelProcessor.packetsToProcessCount(); | |
| 2901 | − if (_statsExpanded) { | |
| 2902 | − voxelStats.str(""); | |
| 2903 | − QString packetsString = locale.toString((int)voxelPacketsToProcess); | |
| 2904 | − QString maxString = locale.toString((int)_recentMaxPackets); | |
| 2905 | − voxelStats << "Voxel Packets to Process: " << qPrintable(packetsString) | |
| 2906 | − << " [Recent Max: " << qPrintable(maxString) << "]"; | |
| 2907 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2908 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)voxelStats.str().c_str(), WHITE_TEXT); | |
| 2909 | − } | |
| 2910 | − | |
| 2911 | − if (_resetRecentMaxPacketsSoon && voxelPacketsToProcess > 0) { | |
| 2912 | − _recentMaxPackets = 0; | |
| 2913 | − _resetRecentMaxPacketsSoon = false; | |
| 2914 | − } | |
| 2915 | − if (voxelPacketsToProcess == 0) { | |
| 2916 | − _resetRecentMaxPacketsSoon = true; | |
| 2917 | − } else { | |
| 2918 | − if (voxelPacketsToProcess > _recentMaxPackets) { | |
| 2919 | − _recentMaxPackets = voxelPacketsToProcess; | |
| 2920 | − } | |
| 2921 | − } | |
| 2922 | − | |
| 2923 | − verticalOffset += (_statsExpanded ? STATS_PELS_PER_LINE : 0); | |
| 2924 | − | |
| 2925 | − QString serversTotalString = locale.toString((uint)totalNodes); // consider adding: .rightJustified(10, ' '); | |
| 2926 | − | |
| 2927 | − // Server Voxels | |
| 2928 | − voxelStats.str(""); | |
| 2929 | − voxelStats << "Server voxels: " << qPrintable(serversTotalString); | |
| 2930 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2931 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)voxelStats.str().c_str(), WHITE_TEXT); | |
| 2932 | − | |
| 2933 | − if (_statsExpanded) { | |
| 2934 | − QString serversInternalString = locale.toString((uint)totalInternal); | |
| 2935 | − QString serversLeavesString = locale.toString((uint)totalLeaves); | |
| 2936 | − | |
| 2937 | − voxelStats.str(""); | |
| 2938 | − voxelStats << | |
| 2939 | − "Internal: " << qPrintable(serversInternalString) << " " << | |
| 2940 | − "Leaves: " << qPrintable(serversLeavesString) << ""; | |
| 2941 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2942 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)voxelStats.str().c_str(), WHITE_TEXT); | |
| 2943 | − } | |
| 2944 | − | |
| 2945 | − unsigned long localTotal = VoxelTreeElement::getNodeCount(); | |
| 2946 | − QString localTotalString = locale.toString((uint)localTotal); // consider adding: .rightJustified(10, ' '); | |
| 2947 | − | |
| 2948 | − // Local Voxels | |
| 2949 | − voxelStats.str(""); | |
| 2950 | − voxelStats << "Local voxels: " << qPrintable(localTotalString); | |
| 2951 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2952 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)voxelStats.str().c_str(), WHITE_TEXT); | |
| 2953 | − | |
| 2954 | − if (_statsExpanded) { | |
| 2955 | − unsigned long localInternal = VoxelTreeElement::getInternalNodeCount(); | |
| 2956 | − unsigned long localLeaves = VoxelTreeElement::getLeafNodeCount(); | |
| 2957 | − QString localInternalString = locale.toString((uint)localInternal); | |
| 2958 | − QString localLeavesString = locale.toString((uint)localLeaves); | |
| 2959 | − | |
| 2960 | − voxelStats.str(""); | |
| 2961 | − voxelStats << | |
| 2962 | − "Internal: " << qPrintable(localInternalString) << " " << | |
| 2963 | − "Leaves: " << qPrintable(localLeavesString) << ""; | |
| 2964 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2965 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0, 2, (char*)voxelStats.str().c_str(), WHITE_TEXT); | |
| 2966 | − } | |
| 2967 | − | |
| 2968 | − // LOD Details | |
| 2969 | − if (_statsExpanded) { | |
| 2970 | − voxelStats.str(""); | |
| 2971 | − QString displayLODDetails = Menu::getInstance()->getLODFeedbackText(); | |
| 2972 | − voxelStats << "LOD: You can see " << qPrintable(displayLODDetails.trimmed()); | |
| 2973 | − verticalOffset += STATS_PELS_PER_LINE; | |
| 2974 | − drawText(horizontalOffset, verticalOffset, 0.10f, 0.f, 2.f, (char*)voxelStats.str().c_str(), WHITE_TEXT); | |
| 2975 | − } | |
| 2976 | −} | |
| 2977 | − | |
| 2978 | −// called on mouse click release | |
| 2979 | −// check for clicks over stats in order to expand or contract them | |
| 2980 | −void Application::checkStatsClick() { | |
| 2981 | − if (0 != glm::compMax(glm::abs(glm::ivec2(_mouseX - _mouseDragStartedX, _mouseY - _mouseDragStartedY)))) { | |
| 2982 | − // not worried about dragging on stats | |
| 2983 | − return; | |
| 2984 | − } | |
| 2985 | − | |
| 2986 | − int statsHeight = 0, statsWidth = 0, statsX = 0, statsY = 0, lines = 0; | |
| 2987 | − | |
| 2988 | − if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { | |
| 2989 | − statsX += MIRROR_VIEW_WIDTH; | |
| 2990 | − } | |
| 2991 | − | |
| 2992 | − // top-left stats click | |
| 2993 | − lines = _statsExpanded ? 5 : 3; | |
| 2994 | − statsHeight = lines * STATS_PELS_PER_LINE + 10; | |
| 2995 | − statsWidth = 165; | |
| 2996 | − if (_mouseX > statsX && _mouseX < statsX + statsWidth && _mouseY > statsY && _mouseY < statsY + statsHeight) { | |
| 2997 | − toggleStatsExpanded(); | |
| 2998 | − return; | |
| 2999 | − } | |
| 3000 | − | |
| 3001 | − // ping stats click | |
| 3002 | − lines = _statsExpanded ? 4 : 3; | |
| 3003 | − statsX += statsWidth; | |
| 3004 | − statsHeight = lines * STATS_PELS_PER_LINE + 10; | |
| 3005 | − statsWidth = 175; | |
| 3006 | − if (_mouseX > statsX && _mouseX < statsX + statsWidth && _mouseY > statsY && _mouseY < statsY + statsHeight) { | |
| 3007 | − toggleStatsExpanded(); | |
| 3008 | − return; | |
| 3009 | − } | |
| 3010 | − | |
| 3011 | − // top-center stats panel click | |
| 3012 | − lines = _statsExpanded ? 4 : 3; | |
| 3013 | − statsX += statsWidth; | |
| 3014 | − statsHeight = lines * STATS_PELS_PER_LINE + 10; | |
| 3015 | − statsWidth = _glWidget->width() - 411 - statsX; | |
| 3016 | − if (_mouseX > statsX && _mouseX < statsX + statsWidth && _mouseY > statsY && _mouseY < statsY + statsHeight) { | |
| 3017 | − toggleStatsExpanded(); | |
| 3018 | − return; | |
| 3019 | − } | |
| 3020 | − | |
| 3021 | − // top-right stats click | |
| 3022 | − lines = _statsExpanded ? 11 : 3; | |
| 3023 | − statsX = _glWidget->width() - 410; | |
| 3024 | − statsHeight = lines * STATS_PELS_PER_LINE + 10; | |
| 3025 | − statsWidth = _glWidget->width() - statsX; | |
| 3026 | − if (_mouseX > statsX && _mouseX < statsX + statsWidth && _mouseY > statsY && _mouseY < statsY + statsHeight) { | |
| 3027 | − toggleStatsExpanded(); | |
| 3028 | − return; | |
| 3029 | − } | |
| 3030 | −} | |
| 3031 | − | |
| 3032 | −void Application::toggleStatsExpanded() { | |
| 3033 | − _statsExpanded = !_statsExpanded; | |
| 3034 | −} | |
| 3035 | − | |
| 3036 | 2640 | glm::vec2 Application::getScaledScreenPoint(glm::vec2 projectedPoint) { |
| 3037 | 2641 | float horizontalScale = _glWidget->width() / 2.0f; |
| 3038 | 2642 | float verticalScale = _glWidget->height() / 2.0f; |
| @@ -3640,9 +3244,9 @@ void Application::toggleRunningScriptsWidget() · 601 unmodified lines | ||
| 3640 | 3244 | } |
| 3641 | 3245 | |
| 3642 | 3246 | void Application::uploadFST(bool isHead) { |
| 3643 | − FstReader reader(isHead); | |
| 3644 | − if (reader.zip()) { | |
| 3645 | − reader.send(); | |
| 3247 | + ModelUploader* uploader = new ModelUploader(isHead); | |
| 3248 | + if (uploader->zip()) { | |
| 3249 | + uploader->send(); | |
| 3646 | 3250 | } |
| 3647 | 3251 | } |
| 3648 | 3252 | |