From 40f87817bf2f2db9267536b55772857877949f8a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 18 Jul 2013 11:03:46 -0700 Subject: [PATCH 01/32] first cut at scene stats --- libraries/voxels/src/VoxelSceneStats.cpp | 76 ++++++++++++++++++++++++ libraries/voxels/src/VoxelSceneStats.h | 51 ++++++++++++++++ voxel-server/src/VoxelNodeData.h | 3 + voxel-server/src/main.cpp | 6 +- 4 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 libraries/voxels/src/VoxelSceneStats.cpp create mode 100644 libraries/voxels/src/VoxelSceneStats.h diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp new file mode 100644 index 0000000000..37422e471d --- /dev/null +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -0,0 +1,76 @@ +// +// VoxelSceneStats.cpp +// hifi +// +// Created by Brad Hefta-Gaub on 7/18/13. +// +// + +#include "VoxelSceneStats.h" + +VoxelSceneStats::VoxelSceneStats() : + start(0), + end(0), + elapsed(0), + total(0), + traversed(0), + internal(0), + internalOutOfView(0), + internalOccluded(0), + internalDirty(0), + leaves(0), + leavesOutOfView(0), + leavesOccluded(0), + leavesDirty(0), + packets(0), + bytes(0), + passes(0), + elapsedUsecsToSend(0), + wasFinished(false), + wasMoving(false), + hadDeltaView(false), + hadOcclusionCulling(false) +{ +} + +VoxelSceneStats::~VoxelSceneStats() { +} + +void VoxelSceneStats::sceneStarted() { + start = usecTimestampNow(); +} + +void VoxelSceneStats::sceneCompleted() { + end = usecTimestampNow(); + elapsed = end - start; +} + +void VoxelSceneStats::reset() { + start = 0; + end= 0; + elapsed= 0; + + + total = 0; + traversed = 0; + internal = 0; + internalOutOfView = 0; + internalOccluded = 0; + internalDirty = 0; + leaves = 0; + leavesOutOfView = 0; + leavesOccluded = 0; + leavesDirty = 0; + packets = 0; + bytes = 0; + passes = 0; + wasFinished = false; + wasMoving = false; + hadDeltaView = false; + hadOcclusionCulling = false; +} + + +void VoxelSceneStats::printDebugDetails() { + qDebug("VoxelSceneStats: start: %llu, end: %llu, elapsed: %llu \n", start, end, elapsed); +} diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h new file mode 100644 index 0000000000..c91e757236 --- /dev/null +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -0,0 +1,51 @@ +// +// VoxelSceneStats.h +// hifi +// +// Created by Brad Hefta-Gaub on 7/18/13. +// +// + +#ifndef __hifi__VoxelSceneStats__ +#define __hifi__VoxelSceneStats__ + + +class VoxelSceneStats { +public: + VoxelSceneStats(); + ~VoxelSceneStats(); + void reset(); + void sceneStarted(); + void sceneCompleted(); + void printDebugDetails(); + + // scene timing data in usecs + uint64_t start; + uint64_t end; + uint64_t elapsed; + + // scene voxel related data + unsigned long total; + unsigned long traversed; + unsigned long internal; + unsigned long internalOutOfView; + unsigned long internalOccluded; + unsigned long internalDirty; + unsigned long leaves; + unsigned long leavesOutOfView; + unsigned long leavesOccluded; + unsigned long leavesDirty; + + // scene network related data + unsigned int packets; + unsigned int bytes; + unsigned int passes; + + // features related items + bool wasFinished; + bool wasMoving; + bool hadDeltaView; + bool hadOcclusionCulling; +}; + +#endif /* defined(__hifi__VoxelSceneStats__) */ diff --git a/voxel-server/src/VoxelNodeData.h b/voxel-server/src/VoxelNodeData.h index 96b61db963..988fcb5330 100644 --- a/voxel-server/src/VoxelNodeData.h +++ b/voxel-server/src/VoxelNodeData.h @@ -58,6 +58,9 @@ public: void setLastTimeBagEmpty(uint64_t lastTimeBagEmpty) { _lastTimeBagEmpty = lastTimeBagEmpty; }; bool getCurrentPacketIsColor() const { return _currentPacketIsColor; }; + + VoxelSceneStats stats; + private: VoxelNodeData(const VoxelNodeData &); VoxelNodeData& operator= (const VoxelNodeData&); diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 5b1ad57861..65b3f5c5c4 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -204,9 +204,13 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, printf("ENTIRE SCENE SENT! nodeData->setLastTimeBagEmpty(now=[%lld])\n", now); } } - + + nodeData->stats.sceneCompleted(); + nodeData->stats.printDebugDetails(); + // This is the start of "resending" the scene. nodeData->nodeBag.insert(serverTree.rootNode); + nodeData->stats.sceneStarted(); } // If we have something in our nodeBag, then turn them into packets and send them out... From b90fc9cc0d5567e14f97ac65750c25c8d4d798e8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 18 Jul 2013 11:21:14 -0700 Subject: [PATCH 02/32] more --- libraries/voxels/src/VoxelSceneStats.cpp | 3 ++- libraries/voxels/src/VoxelSceneStats.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 37422e471d..26ec66c32b 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -6,6 +6,8 @@ // // +#include + #include "VoxelSceneStats.h" VoxelSceneStats::VoxelSceneStats() : @@ -25,7 +27,6 @@ VoxelSceneStats::VoxelSceneStats() : packets(0), bytes(0), passes(0), - elapsedUsecsToSend(0), wasFinished(false), wasMoving(false), hadDeltaView(false), diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index c91e757236..a90de6e7a9 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -9,6 +9,8 @@ #ifndef __hifi__VoxelSceneStats__ #define __hifi__VoxelSceneStats__ +#include + class VoxelSceneStats { public: From d5812c8f3477630cf7a6f92ac402977b2e1f2bbc Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 18 Jul 2013 11:21:23 -0700 Subject: [PATCH 03/32] more --- voxel-server/src/VoxelNodeData.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/voxel-server/src/VoxelNodeData.h b/voxel-server/src/VoxelNodeData.h index 988fcb5330..746db6da93 100644 --- a/voxel-server/src/VoxelNodeData.h +++ b/voxel-server/src/VoxelNodeData.h @@ -12,9 +12,11 @@ #include #include #include -#include "VoxelNodeBag.h" -#include "VoxelConstants.h" -#include "CoverageMap.h" + +#include +#include +#include +#include class VoxelNodeData : public AvatarData { public: From 3aa6af21b1f2fb385702816b71d8345f459b4943 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 18 Jul 2013 14:13:45 -0700 Subject: [PATCH 04/32] more voxel scene stats --- libraries/voxels/src/VoxelSceneStats.cpp | 203 +++++++++++++++++------ libraries/voxels/src/VoxelSceneStats.h | 70 ++++++-- libraries/voxels/src/VoxelTree.cpp | 84 +++++++++- libraries/voxels/src/VoxelTree.h | 16 +- voxel-server/src/main.cpp | 16 +- 5 files changed, 312 insertions(+), 77 deletions(-) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 26ec66c32b..44c10e2bf9 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -8,70 +8,179 @@ #include +#include "VoxelNode.h" #include "VoxelSceneStats.h" -VoxelSceneStats::VoxelSceneStats() : - start(0), - end(0), - elapsed(0), - total(0), - traversed(0), - internal(0), - internalOutOfView(0), - internalOccluded(0), - internalDirty(0), - leaves(0), - leavesOutOfView(0), - leavesOccluded(0), - leavesDirty(0), - packets(0), - bytes(0), - passes(0), - wasFinished(false), - wasMoving(false), - hadDeltaView(false), - hadOcclusionCulling(false) -{ +VoxelSceneStats::VoxelSceneStats() { + reset(); } VoxelSceneStats::~VoxelSceneStats() { } -void VoxelSceneStats::sceneStarted() { - start = usecTimestampNow(); +void VoxelSceneStats::sceneStarted(bool fullScene, bool moving) { + _start = usecTimestampNow(); + reset(); // resets packet and voxel stats + _fullSceneDraw = fullScene; + _moving = moving; } void VoxelSceneStats::sceneCompleted() { - end = usecTimestampNow(); - elapsed = end - start; + _end = usecTimestampNow(); + _elapsed = _end - _start; } void VoxelSceneStats::reset() { - start = 0; - end= 0; - elapsed= 0; + _packets = 0; + _bytes = 0; + _passes = 0; + _traversed = 0; + _internal = 0; + _leaves = 0; + + _skippedDistance = 0; + _internalSkippedDistance = 0; + _leavesSkippedDistance = 0; + + _skippedOutOfView = 0; + _internalSkippedOutOfView = 0; + _leavesSkippedOutOfView = 0; + + _skippedWasInView = 0; + _internalSkippedWasInView = 0; + _leavesSkippedWasInView = 0; + + _skippedNoChange = 0; + _internalSkippedNoChange = 0; + _leavesSkippedNoChange = 0; + + _skippedOccluded = 0; + _internalSkippedOccluded = 0; + _leavesSkippedOccluded = 0; + + _colorSent = 0; + _internalColorSent = 0; + _leavesColorSent = 0; + + _didntFit = 0; + _internalDidntFit = 0; + _leavesDidntFit = 0; - total = 0; - traversed = 0; - internal = 0; - internalOutOfView = 0; - internalOccluded = 0; - internalDirty = 0; - leaves = 0; - leavesOutOfView = 0; - leavesOccluded = 0; - leavesDirty = 0; - packets = 0; - bytes = 0; - passes = 0; - wasFinished = false; - wasMoving = false; - hadDeltaView = false; - hadOcclusionCulling = false; } +void VoxelSceneStats::packetSent(int bytes) { + _packets++; + _bytes += bytes; +} + +void VoxelSceneStats::traversed(const VoxelNode* node) { + _traversed++; + if (node->isLeaf()) { + _leaves++; + } else { + _internal++; + } +} + +void VoxelSceneStats::skippedDistance(const VoxelNode* node) { + _skippedDistance++; + if (node->isLeaf()) { + _leavesSkippedDistance++; + } else { + _internalSkippedDistance++; + } +} + +void VoxelSceneStats::skippedOutOfView(const VoxelNode* node) { + _skippedOutOfView++; + if (node->isLeaf()) { + _leavesSkippedOutOfView++; + } else { + _internalSkippedOutOfView++; + } +} + +void VoxelSceneStats::skippedWasInView(const VoxelNode* node) { + _skippedWasInView++; + if (node->isLeaf()) { + _leavesSkippedWasInView++; + } else { + _internalSkippedWasInView++; + } +} + +void VoxelSceneStats::skippedNoChange(const VoxelNode* node) { + _skippedNoChange++; + if (node->isLeaf()) { + _leavesSkippedNoChange++; + } else { + _internalSkippedNoChange++; + } +} + +void VoxelSceneStats::skippedOccluded(const VoxelNode* node) { + _skippedOccluded++; + if (node->isLeaf()) { + _leavesSkippedOccluded++; + } else { + _internalSkippedOccluded++; + } +} + +void VoxelSceneStats::colorSent(const VoxelNode* node) { + _colorSent++; + if (node->isLeaf()) { + _leavesColorSent++; + } else { + _internalColorSent++; + } +} + +void VoxelSceneStats::didntFit(const VoxelNode* node) { + _didntFit++; + if (node->isLeaf()) { + _leavesDidntFit++; + } else { + _internalDidntFit++; + } +} void VoxelSceneStats::printDebugDetails() { - qDebug("VoxelSceneStats: start: %llu, end: %llu, elapsed: %llu \n", start, end, elapsed); + qDebug("\n------------------------------\n"); + qDebug("VoxelSceneStats:\n"); + qDebug(" start : %llu \n", _start); + qDebug(" end : %llu \n", _end); + qDebug(" elapsed: %llu \n", _elapsed); + qDebug("\n"); + qDebug(" full scene: %s\n", debug::valueOf(_fullSceneDraw)); + qDebug(" moving: %s\n", debug::valueOf(_moving)); + qDebug("\n"); + qDebug(" packets: %d\n", _packets); + qDebug(" bytes : %d\n", _bytes); + qDebug("\n"); + qDebug(" traversed : %lu\n", _traversed ); + qDebug(" internal : %lu\n", _internal ); + qDebug(" leaves : %lu\n", _leaves ); + qDebug(" skipped distance : %lu\n", _skippedDistance ); + qDebug(" internal : %lu\n", _internalSkippedDistance ); + qDebug(" leaves : %lu\n", _leavesSkippedDistance ); + qDebug(" skipped out of view : %lu\n", _skippedOutOfView ); + qDebug(" internal : %lu\n", _internalSkippedOutOfView ); + qDebug(" leaves : %lu\n", _leavesSkippedOutOfView ); + qDebug(" skipped was in view : %lu\n", _skippedWasInView ); + qDebug(" internal : %lu\n", _internalSkippedWasInView ); + qDebug(" leaves : %lu\n", _leavesSkippedWasInView ); + qDebug(" skipped no change : %lu\n", _skippedNoChange ); + qDebug(" internal : %lu\n", _internalSkippedNoChange ); + qDebug(" leaves : %lu\n", _leavesSkippedNoChange ); + qDebug(" skipped occluded : %lu\n", _skippedOccluded ); + qDebug(" internal : %lu\n", _internalSkippedOccluded ); + qDebug(" leaves : %lu\n", _leavesSkippedOccluded ); + qDebug(" color sent : %lu\n", _colorSent ); + qDebug(" internal : %lu\n", _internalColorSent ); + qDebug(" leaves : %lu\n", _leavesColorSent ); + qDebug(" Didn't Fit : %lu\n", _didntFit ); + qDebug(" internal : %lu\n", _internalDidntFit ); + qDebug(" leaves : %lu\n", _leavesDidntFit ); } diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index a90de6e7a9..d41091ae80 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -11,43 +11,85 @@ #include +class VoxelNode; class VoxelSceneStats { public: VoxelSceneStats(); ~VoxelSceneStats(); void reset(); - void sceneStarted(); + void sceneStarted(bool fullScene, bool moving); void sceneCompleted(); void printDebugDetails(); + void packetSent(int bytes); + void traversed(const VoxelNode* node); + void skippedDistance(const VoxelNode* node); + void skippedOutOfView(const VoxelNode* node); + void skippedWasInView(const VoxelNode* node); + void skippedNoChange(const VoxelNode* node); + void skippedOccluded(const VoxelNode* node); + void colorSent(const VoxelNode* node); + void didntFit(const VoxelNode* node); + void colorBitsWritten(const VoxelNode* node); + void existsBitsWritten(const VoxelNode* node); + void existsInPacketBitsWritten(const VoxelNode* node); + +private: // scene timing data in usecs - uint64_t start; - uint64_t end; - uint64_t elapsed; + uint64_t _start; + uint64_t _end; + uint64_t _elapsed; // scene voxel related data + unsigned long _traversed; + unsigned long _internal; + unsigned long _leaves; + + unsigned long _skippedDistance; + unsigned long _internalSkippedDistance; + unsigned long _leavesSkippedDistance; + + unsigned long _skippedOutOfView; + unsigned long _internalSkippedOutOfView; + unsigned long _leavesSkippedOutOfView; + + unsigned long _skippedWasInView; + unsigned long _internalSkippedWasInView; + unsigned long _leavesSkippedWasInView; + + unsigned long _skippedNoChange; + unsigned long _internalSkippedNoChange; + unsigned long _leavesSkippedNoChange; + + unsigned long _skippedOccluded; + unsigned long _internalSkippedOccluded; + unsigned long _leavesSkippedOccluded; + + unsigned long _colorSent; + unsigned long _internalColorSent; + unsigned long _leavesColorSent; + + unsigned long _didntFit; + unsigned long _internalDidntFit; + unsigned long _leavesDidntFit; + unsigned long total; - unsigned long traversed; - unsigned long internal; unsigned long internalOutOfView; unsigned long internalOccluded; unsigned long internalDirty; - unsigned long leaves; unsigned long leavesOutOfView; unsigned long leavesOccluded; unsigned long leavesDirty; // scene network related data - unsigned int packets; - unsigned int bytes; - unsigned int passes; + unsigned int _packets; + unsigned int _bytes; + unsigned int _passes; // features related items - bool wasFinished; - bool wasMoving; - bool hadDeltaView; - bool hadOcclusionCulling; + bool _moving; + bool _fullSceneDraw; }; #endif /* defined(__hifi__VoxelSceneStats__) */ diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 9cb6a85f93..13e55bea0f 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -1037,6 +1037,13 @@ int VoxelTree::encodeTreeBitstream(VoxelNode* node, unsigned char* outputBuffer, availableBytes -= codeLength; // keep track or remaining space int currentEncodeLevel = 0; + + // record some stats, this is the one node that we won't record below in the recursion function, so we need to + // track it here + if (params.stats) { + params.stats->traversed(node); + } + int childBytesWritten = encodeTreeBitstreamRecursion(node, outputBuffer, availableBytes, bag, params, currentEncodeLevel); // if childBytesWritten == 1 then something went wrong... that's not possible @@ -1081,6 +1088,9 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp // If we're too far away for our render level, then just return if (distance >= boundaryDistance) { + if (params.stats) { + params.stats->skippedDistance(node); + } return bytesAtThisLevel; } @@ -1088,6 +1098,9 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp // although technically, we really shouldn't ever be here, because our callers shouldn't be calling us if // we're out of view if (!node->isInView(*params.viewFrustum)) { + if (params.stats) { + params.stats->skippedOutOfView(node); + } return bytesAtThisLevel; } @@ -1110,6 +1123,9 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp // if we're in deltaViewFrustum mode, and this node has changed since it was last sent, then we do // need to send it. if (wasInView && !(params.deltaViewFrustum && node->hasChangedSince(params.lastViewFrustumSent - CHANGE_FUDGE))) { + if (params.stats) { + params.stats->skippedWasInView(node); + } return bytesAtThisLevel; } @@ -1117,6 +1133,9 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp // then we can also bail early and save bits if (!params.forceSendScene && !params.deltaViewFrustum && !node->hasChangedSince(params.lastViewFrustumSent - CHANGE_FUDGE)) { + if (params.stats) { + params.stats->skippedNoChange(node); + } return bytesAtThisLevel; } @@ -1136,6 +1155,9 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp CoverageMapStorageResult result = params.map->checkMap(voxelPolygon, false); delete voxelPolygon; // cleanup if (result == OCCLUDED) { + if (params.stats) { + params.stats->skippedOccluded(node); + } return bytesAtThisLevel; } } else { @@ -1201,6 +1223,12 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp distancesToChildren[i] = 0.0f; currentCount++; } + + // track stats + if (params.stats && childNode) { + params.stats->traversed(childNode); + } + } // for each child node in Distance sorted order..., check to see if they exist, are colored, and in view, and if so @@ -1211,13 +1239,21 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp bool childIsInView = (childNode && (!params.viewFrustum || childNode->isInView(*params.viewFrustum))); - if (childIsInView) { + if (!childIsInView) { + if (params.stats) { + params.stats->skippedOutOfView(childNode); + } + } else { // Before we determine consider this further, let's see if it's in our LOD scope... float distance = distancesToChildren[i]; // params.viewFrustum ? childNode->distanceToCamera(*params.viewFrustum) : 0; float boundaryDistance = !params.viewFrustum ? 1 : boundaryDistanceForRenderLevel(childNode->getLevel() + params.boundaryLevelAdjust); - if (distance < boundaryDistance) { + if (!(distance < boundaryDistance)) { + if (params.stats) { + params.stats->skippedDistance(childNode); + } + } else { inViewCount++; // track children in view as existing and not a leaf, if they're a leaf, @@ -1261,7 +1297,18 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp } // wants occlusion culling & isLeaf() - bool shouldRender = !params.viewFrustum ? true : childNode->calculateShouldRender(params.viewFrustum, params.boundaryLevelAdjust); + bool shouldRender = !params.viewFrustum ? true : + childNode->calculateShouldRender(params.viewFrustum, params.boundaryLevelAdjust); + + // track some stats + if (params.stats) { + if (!shouldRender) { + params.stats->skippedDistance(childNode); + } + if (childIsOccluded) { + params.stats->skippedOccluded(childNode); + } + } // track children with actual color, only if the child wasn't previously in view! if (shouldRender && !childIsOccluded) { @@ -1288,7 +1335,14 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp inViewWithColorCount++; } else { // otherwise just track stats of the items we discarded - params.childWasInViewDiscarded++; + if (params.stats) { + if (childWasInView) { + params.stats->skippedWasInView(childNode); + } else { + params.stats->skippedNoChange(childNode); + } + } + } } } @@ -1297,14 +1351,23 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp *writeToThisLevelBuffer = childrenColoredBits; writeToThisLevelBuffer += sizeof(childrenColoredBits); // move the pointer bytesAtThisLevel += sizeof(childrenColoredBits); // keep track of byte count + if (params.stats) { + params.stats->colorBitsWritten(node); + } // write the color data... if (params.includeColor) { for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { if (oneAtBit(childrenColoredBits, i)) { - memcpy(writeToThisLevelBuffer, &node->getChildAtIndex(i)->getColor(), BYTES_PER_COLOR); + VoxelNode* childNode = node->getChildAtIndex(i); + memcpy(writeToThisLevelBuffer, &childNode->getColor(), BYTES_PER_COLOR); writeToThisLevelBuffer += BYTES_PER_COLOR; // move the pointer for color bytesAtThisLevel += BYTES_PER_COLOR; // keep track of byte count for color + + if (params.stats) { + params.stats->colorSent(childNode); + } + } } } @@ -1315,12 +1378,18 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp *writeToThisLevelBuffer = childrenExistInTreeBits; writeToThisLevelBuffer += sizeof(childrenExistInTreeBits); // move the pointer bytesAtThisLevel += sizeof(childrenExistInTreeBits); // keep track of byte count + if (params.stats) { + params.stats->existsBitsWritten(node); + } } // write the child exist bits *writeToThisLevelBuffer = childrenExistInPacketBits; writeToThisLevelBuffer += sizeof(childrenExistInPacketBits); // move the pointer bytesAtThisLevel += sizeof(childrenExistInPacketBits); // keep track of byte count + if (params.stats) { + params.stats->existsInPacketBitsWritten(node); + } // We only need to keep digging, if there is at least one child that is inView, and not a leaf. keepDiggingDeeper = (inViewNotLeafCount > 0); @@ -1333,6 +1402,11 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp availableBytes -= bytesAtThisLevel; } else { bag.insert(node); + + if (params.stats) { + params.stats->didntFit(node); + } + return 0; } diff --git a/libraries/voxels/src/VoxelTree.h b/libraries/voxels/src/VoxelTree.h index e5db6526e9..199942605e 100644 --- a/libraries/voxels/src/VoxelTree.h +++ b/libraries/voxels/src/VoxelTree.h @@ -9,12 +9,14 @@ #ifndef __hifi__VoxelTree__ #define __hifi__VoxelTree__ -#include "SimpleMovingAverage.h" +#include +#include + +#include "CoverageMap.h" #include "ViewFrustum.h" #include "VoxelNode.h" #include "VoxelNodeBag.h" -#include "CoverageMap.h" -#include "PointerStack.h" +#include "VoxelSceneStats.h" // Callback function, for recuseTreeWithOperation typedef bool (*RecurseVoxelTreeOperation)(VoxelNode* node, void* extraData); @@ -36,6 +38,7 @@ typedef enum {GRADIENT, RANDOM, NATURAL} creationMode; #define NO_BOUNDARY_ADJUST 0 #define LOW_RES_MOVING_ADJUST 1 #define IGNORE_LAST_SENT 0 +#define IGNORE_SCENE_STATS NULL class EncodeBitstreamParams { public: @@ -48,10 +51,10 @@ public: bool deltaViewFrustum; const ViewFrustum* lastViewFrustum; bool wantOcclusionCulling; - long childWasInViewDiscarded; int boundaryLevelAdjust; uint64_t lastViewFrustumSent; bool forceSendScene; + VoxelSceneStats* stats; CoverageMap* map; EncodeBitstreamParams( @@ -66,7 +69,8 @@ public: CoverageMap* map = IGNORE_COVERAGE_MAP, int boundaryLevelAdjust = NO_BOUNDARY_ADJUST, uint64_t lastViewFrustumSent = IGNORE_LAST_SENT, - bool forceSendScene = true) : + bool forceSendScene = true, + VoxelSceneStats* stats = IGNORE_SCENE_STATS) : maxEncodeLevel (maxEncodeLevel), maxLevelReached (0), viewFrustum (viewFrustum), @@ -76,10 +80,10 @@ public: deltaViewFrustum (deltaViewFrustum), lastViewFrustum (lastViewFrustum), wantOcclusionCulling (wantOcclusionCulling), - childWasInViewDiscarded (0), boundaryLevelAdjust (boundaryLevelAdjust), lastViewFrustumSent (lastViewFrustumSent), forceSendScene (forceSendScene), + stats (stats), map (map) {} }; diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 65b3f5c5c4..0c13d6620a 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -200,9 +200,6 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, // only set our last sent time if we weren't resetting due to frustum change uint64_t now = usecTimestampNow(); nodeData->setLastTimeBagEmpty(now); - if (::debugVoxelSending) { - printf("ENTIRE SCENE SENT! nodeData->setLastTimeBagEmpty(now=[%lld])\n", now); - } } nodeData->stats.sceneCompleted(); @@ -210,7 +207,10 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, // This is the start of "resending" the scene. nodeData->nodeBag.insert(serverTree.rootNode); - nodeData->stats.sceneStarted(); + + // start tracking our stats + bool fullScene = (!viewFrustumChanged || !nodeData->getWantDelta()) && nodeData->getViewFrustumJustStoppedChanging(); + nodeData->stats.sceneStarted(fullScene, viewFrustumChanged); } // If we have something in our nodeBag, then turn them into packets and send them out... @@ -243,12 +243,15 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, CoverageMap* coverageMap = wantOcclusionCulling ? &nodeData->map : IGNORE_COVERAGE_MAP; int boundaryLevelAdjust = viewFrustumChanged && nodeData->getWantLowResMoving() ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST; + + bool fullScene = (!viewFrustumChanged || !nodeData->getWantDelta()) && + nodeData->getViewFrustumJustStoppedChanging(); EncodeBitstreamParams params(INT_MAX, &nodeData->getCurrentViewFrustum(), wantColor, WANT_EXISTS_BITS, DONT_CHOP, wantDelta, lastViewFrustum, wantOcclusionCulling, coverageMap, boundaryLevelAdjust, nodeData->getLastTimeBagEmpty(), - nodeData->getViewFrustumJustStoppedChanging()); + fullScene, &nodeData->stats); bytesWritten = serverTree.encodeTreeBitstream(subTree, &tempOutputBuffer[0], MAX_VOXEL_PACKET_SIZE - 1, nodeData->nodeBag, params); @@ -258,6 +261,8 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, } else { nodeList->getNodeSocket()->send(node->getActiveSocket(), nodeData->getPacket(), nodeData->getPacketLength()); + + nodeData->stats.packetSent(nodeData->getPacketLength()); trueBytesSent += nodeData->getPacketLength(); truePacketsSent++; packetsSentThisInterval++; @@ -268,6 +273,7 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, if (nodeData->isPacketWaiting()) { nodeList->getNodeSocket()->send(node->getActiveSocket(), nodeData->getPacket(), nodeData->getPacketLength()); + nodeData->stats.packetSent(nodeData->getPacketLength()); trueBytesSent += nodeData->getPacketLength(); truePacketsSent++; nodeData->resetVoxelPacket(); From 4d1ae4308546214abbd5be295a2cc002fab91d44 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 18 Jul 2013 15:13:55 -0700 Subject: [PATCH 05/32] adjust server sleep time to allow 60fps --- voxel-server/src/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 0c13d6620a..770a22bd23 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -44,9 +44,9 @@ const int MIN_BRIGHTNESS = 64; const float DEATH_STAR_RADIUS = 4.0; const float MAX_CUBE = 0.05f; -const int VOXEL_SEND_INTERVAL_USECS = 100 * 1000; -int PACKETS_PER_CLIENT_PER_INTERVAL = 30; -const int SENDING_TIME_TO_SPARE = 20 * 1000; // usec of sending interval to spare for calculating voxels +const int VOXEL_SEND_INTERVAL_USECS = 17 * 1000; // approximately 60fps +int PACKETS_PER_CLIENT_PER_INTERVAL = 20; +const int SENDING_TIME_TO_SPARE = 5 * 1000; // usec of sending interval to spare for calculating voxels const int MAX_VOXEL_TREE_DEPTH_LEVELS = 4; From 11eabf3c5137b3a52274708e51bfb8a584934694 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 18 Jul 2013 15:14:11 -0700 Subject: [PATCH 06/32] more stats --- libraries/voxels/src/VoxelSceneStats.cpp | 52 ++++++++++++++++++++++++ libraries/voxels/src/VoxelSceneStats.h | 12 ++++++ 2 files changed, 64 insertions(+) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 44c10e2bf9..254f099e3f 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -67,6 +67,18 @@ void VoxelSceneStats::reset() { _internalDidntFit = 0; _leavesDidntFit = 0; + _colorBitsWritten = 0; + _internalColorBitsWritten = 0; + _leavesColorBitsWritten = 0; + + _existsBitsWritten = 0; + _internalExistsBitsWritten = 0; + _leavesExistsBitsWritten = 0; + + _existsInPacketBitsWritten = 0; + _internalExistsInPacketBitsWritten = 0; + _leavesExistsInPacketBitsWritten = 0; + } void VoxelSceneStats::packetSent(int bytes) { @@ -146,6 +158,35 @@ void VoxelSceneStats::didntFit(const VoxelNode* node) { } } +void VoxelSceneStats::colorBitsWritten(const VoxelNode* node) { + _colorBitsWritten++; + if (node->isLeaf()) { + _leavesColorBitsWritten++; + } else { + _internalColorBitsWritten++; + } +} + +void VoxelSceneStats::existsBitsWritten(const VoxelNode* node) { + _existsBitsWritten++; + if (node->isLeaf()) { + _leavesExistsBitsWritten++; + } else { + _internalExistsBitsWritten++; + } +} + +void VoxelSceneStats::existsInPacketBitsWritten(const VoxelNode* node) { + _existsInPacketBitsWritten++; + if (node->isLeaf()) { + _leavesExistsInPacketBitsWritten++; + } else { + _internalExistsInPacketBitsWritten++; + } +} + + + void VoxelSceneStats::printDebugDetails() { qDebug("\n------------------------------\n"); qDebug("VoxelSceneStats:\n"); @@ -177,10 +218,21 @@ void VoxelSceneStats::printDebugDetails() { qDebug(" skipped occluded : %lu\n", _skippedOccluded ); qDebug(" internal : %lu\n", _internalSkippedOccluded ); qDebug(" leaves : %lu\n", _leavesSkippedOccluded ); + + qDebug("\n"); qDebug(" color sent : %lu\n", _colorSent ); qDebug(" internal : %lu\n", _internalColorSent ); qDebug(" leaves : %lu\n", _leavesColorSent ); qDebug(" Didn't Fit : %lu\n", _didntFit ); qDebug(" internal : %lu\n", _internalDidntFit ); qDebug(" leaves : %lu\n", _leavesDidntFit ); + qDebug(" color bits : %lu\n", _colorBitsWritten ); + qDebug(" internal : %lu\n", _internalColorBitsWritten ); + qDebug(" leaves : %lu\n", _leavesColorBitsWritten ); + qDebug(" exists bits : %lu\n", _existsBitsWritten ); + qDebug(" internal : %lu\n", _internalExistsBitsWritten); + qDebug(" leaves : %lu\n", _leavesExistsBitsWritten ); + qDebug(" in packet bit : %lu\n", _existsInPacketBitsWritten ); + qDebug(" internal : %lu\n", _internalExistsInPacketBitsWritten); + qDebug(" leaves : %lu\n", _leavesExistsInPacketBitsWritten ); } diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index d41091ae80..29461996b3 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -74,6 +74,18 @@ private: unsigned long _internalDidntFit; unsigned long _leavesDidntFit; + unsigned long _colorBitsWritten; + unsigned long _internalColorBitsWritten; + unsigned long _leavesColorBitsWritten; + + unsigned long _existsBitsWritten; + unsigned long _internalExistsBitsWritten; + unsigned long _leavesExistsBitsWritten; + + unsigned long _existsInPacketBitsWritten; + unsigned long _internalExistsInPacketBitsWritten; + unsigned long _leavesExistsInPacketBitsWritten; + unsigned long total; unsigned long internalOutOfView; unsigned long internalOccluded; From c2ab5c4d9827d4e6fadf860bd459e667d8515c65 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 19 Jul 2013 11:42:37 -0700 Subject: [PATCH 07/32] more work on voxel stats --- libraries/voxels/src/VoxelSceneStats.cpp | 47 +++++++----------------- libraries/voxels/src/VoxelSceneStats.h | 32 +++++++--------- libraries/voxels/src/VoxelTree.cpp | 20 +++++++--- voxel-server/src/main.cpp | 2 +- 4 files changed, 43 insertions(+), 58 deletions(-) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 254f099e3f..7d91a363c5 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -68,17 +68,8 @@ void VoxelSceneStats::reset() { _leavesDidntFit = 0; _colorBitsWritten = 0; - _internalColorBitsWritten = 0; - _leavesColorBitsWritten = 0; - _existsBitsWritten = 0; - _internalExistsBitsWritten = 0; - _leavesExistsBitsWritten = 0; - _existsInPacketBitsWritten = 0; - _internalExistsInPacketBitsWritten = 0; - _leavesExistsInPacketBitsWritten = 0; - } void VoxelSceneStats::packetSent(int bytes) { @@ -158,33 +149,27 @@ void VoxelSceneStats::didntFit(const VoxelNode* node) { } } -void VoxelSceneStats::colorBitsWritten(const VoxelNode* node) { +void VoxelSceneStats::colorBitsWritten() { _colorBitsWritten++; - if (node->isLeaf()) { - _leavesColorBitsWritten++; - } else { - _internalColorBitsWritten++; - } } -void VoxelSceneStats::existsBitsWritten(const VoxelNode* node) { +void VoxelSceneStats::existsBitsWritten() { _existsBitsWritten++; - if (node->isLeaf()) { - _leavesExistsBitsWritten++; - } else { - _internalExistsBitsWritten++; - } } -void VoxelSceneStats::existsInPacketBitsWritten(const VoxelNode* node) { +void VoxelSceneStats::existsInPacketBitsWritten() { _existsInPacketBitsWritten++; - if (node->isLeaf()) { - _leavesExistsInPacketBitsWritten++; - } else { - _internalExistsInPacketBitsWritten++; - } } +void VoxelSceneStats::childBitsRemoved(bool includesExistsBits, bool includesColors) { + _existsInPacketBitsWritten--; + if (includesExistsBits) { + _existsBitsWritten--; + } + if (includesColors) { + _colorBitsWritten--; + } +} void VoxelSceneStats::printDebugDetails() { @@ -227,12 +212,6 @@ void VoxelSceneStats::printDebugDetails() { qDebug(" internal : %lu\n", _internalDidntFit ); qDebug(" leaves : %lu\n", _leavesDidntFit ); qDebug(" color bits : %lu\n", _colorBitsWritten ); - qDebug(" internal : %lu\n", _internalColorBitsWritten ); - qDebug(" leaves : %lu\n", _leavesColorBitsWritten ); qDebug(" exists bits : %lu\n", _existsBitsWritten ); - qDebug(" internal : %lu\n", _internalExistsBitsWritten); - qDebug(" leaves : %lu\n", _leavesExistsBitsWritten ); - qDebug(" in packet bit : %lu\n", _existsInPacketBitsWritten ); - qDebug(" internal : %lu\n", _internalExistsInPacketBitsWritten); - qDebug(" leaves : %lu\n", _leavesExistsInPacketBitsWritten ); + qDebug(" in packet bit : %lu\n", _existsInPacketBitsWritten); } diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index 29461996b3..526d7f38a6 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -31,9 +31,10 @@ public: void skippedOccluded(const VoxelNode* node); void colorSent(const VoxelNode* node); void didntFit(const VoxelNode* node); - void colorBitsWritten(const VoxelNode* node); - void existsBitsWritten(const VoxelNode* node); - void existsInPacketBitsWritten(const VoxelNode* node); + void colorBitsWritten(); + void existsBitsWritten(); + void existsInPacketBitsWritten(); + void childBitsRemoved(bool includesExistsBits, bool includesColors); private: // scene timing data in usecs @@ -75,24 +76,19 @@ private: unsigned long _leavesDidntFit; unsigned long _colorBitsWritten; - unsigned long _internalColorBitsWritten; - unsigned long _leavesColorBitsWritten; - unsigned long _existsBitsWritten; - unsigned long _internalExistsBitsWritten; - unsigned long _leavesExistsBitsWritten; - unsigned long _existsInPacketBitsWritten; - unsigned long _internalExistsInPacketBitsWritten; - unsigned long _leavesExistsInPacketBitsWritten; - unsigned long total; - unsigned long internalOutOfView; - unsigned long internalOccluded; - unsigned long internalDirty; - unsigned long leavesOutOfView; - unsigned long leavesOccluded; - unsigned long leavesDirty; + // Accounting Notes: + // + // 1) number of voxels sent can be calculated as _colorSent + _colorBitsWritten. This works because each internal + // node in a packet will have a _colorBitsWritten included for it and each "leaf" in the packet will have a + // _colorSent written for it. Note that these "leaf" nodes in the packets may not be actual leaves in the full + // tree, because LOD may cause us to send an average color for an internal node instead of recursing deeper to + // the leaves. + // + // 2) the stats balance if: _traversed = all skipped + all sent + // // scene network related data unsigned int _packets; diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 13e55bea0f..2939cd3258 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -1302,7 +1302,7 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp // track some stats if (params.stats) { - if (!shouldRender) { + if (!shouldRender && childNode->isLeaf()) { params.stats->skippedDistance(childNode); } if (childIsOccluded) { @@ -1352,7 +1352,7 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp writeToThisLevelBuffer += sizeof(childrenColoredBits); // move the pointer bytesAtThisLevel += sizeof(childrenColoredBits); // keep track of byte count if (params.stats) { - params.stats->colorBitsWritten(node); + params.stats->colorBitsWritten(); } // write the color data... @@ -1379,7 +1379,7 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp writeToThisLevelBuffer += sizeof(childrenExistInTreeBits); // move the pointer bytesAtThisLevel += sizeof(childrenExistInTreeBits); // keep track of byte count if (params.stats) { - params.stats->existsBitsWritten(node); + params.stats->existsBitsWritten(); } } @@ -1388,7 +1388,7 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp writeToThisLevelBuffer += sizeof(childrenExistInPacketBits); // move the pointer bytesAtThisLevel += sizeof(childrenExistInPacketBits); // keep track of byte count if (params.stats) { - params.stats->existsInPacketBitsWritten(node); + params.stats->existsInPacketBitsWritten(); } // We only need to keep digging, if there is at least one child that is inView, and not a leaf. @@ -1467,7 +1467,12 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp // so, if the child returns 2 bytes out, we can actually consider that an empty tree also!! // // we can make this act like no bytes out, by just resetting the bytes out in this case - if (params.includeColor && childTreeBytesOut == 2) { + if (params.includeColor && !params.includeExistsBits && childTreeBytesOut == 2) { + childTreeBytesOut = 0; // this is the degenerate case of a tree with no colors and no child trees + } + // If we've asked for existBits, this is also true, except that the tree will output 3 bytes + // NOTE: does this introduce a problem with detecting deletion?? + if (params.includeColor && params.includeExistsBits && childTreeBytesOut == 3) { childTreeBytesOut = 0; // this is the degenerate case of a tree with no colors and no child trees } @@ -1482,6 +1487,11 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp childrenExistInPacketBits -= (1 << (7 - originalIndex)); // repair the child exists mask *childExistsPlaceHolder = childrenExistInPacketBits; + + if (params.stats) { + params.stats->childBitsRemoved(params.includeExistsBits, params.includeColor); + } + // Note: no need to move the pointer, cause we already stored this } // end if (childTreeBytesOut == 0) } // end if (oneAtBit(childrenExistInPacketBits, originalIndex)) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 770a22bd23..92c835d776 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -143,6 +143,7 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, } nodeList->getNodeSocket()->send(node->getActiveSocket(), nodeData->getPacket(), nodeData->getPacketLength()); + nodeData->stats.packetSent(nodeData->getPacketLength()); trueBytesSent += nodeData->getPacketLength(); truePacketsSent++; nodeData->resetVoxelPacket(); @@ -261,7 +262,6 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, } else { nodeList->getNodeSocket()->send(node->getActiveSocket(), nodeData->getPacket(), nodeData->getPacketLength()); - nodeData->stats.packetSent(nodeData->getPacketLength()); trueBytesSent += nodeData->getPacketLength(); truePacketsSent++; From 92f7f06af9eb1513b077275b8583649c118dc528 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 19 Jul 2013 12:00:51 -0700 Subject: [PATCH 08/32] more stats --- libraries/voxels/src/VoxelSceneStats.cpp | 3 +++ libraries/voxels/src/VoxelSceneStats.h | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 7d91a363c5..c5586ef957 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -70,6 +70,7 @@ void VoxelSceneStats::reset() { _colorBitsWritten = 0; _existsBitsWritten = 0; _existsInPacketBitsWritten = 0; + _treesRemoved = 0; } void VoxelSceneStats::packetSent(int bytes) { @@ -169,6 +170,7 @@ void VoxelSceneStats::childBitsRemoved(bool includesExistsBits, bool includesCol if (includesColors) { _colorBitsWritten--; } + _treesRemoved++; } @@ -214,4 +216,5 @@ void VoxelSceneStats::printDebugDetails() { qDebug(" color bits : %lu\n", _colorBitsWritten ); qDebug(" exists bits : %lu\n", _existsBitsWritten ); qDebug(" in packet bit : %lu\n", _existsInPacketBitsWritten); + qDebug(" trees removed : %lu\n", _treesRemoved ); } diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index 526d7f38a6..e31b53a8ae 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -78,6 +78,7 @@ private: unsigned long _colorBitsWritten; unsigned long _existsBitsWritten; unsigned long _existsInPacketBitsWritten; + unsigned long _treesRemoved; // Accounting Notes: // @@ -87,7 +88,11 @@ private: // tree, because LOD may cause us to send an average color for an internal node instead of recursing deeper to // the leaves. // - // 2) the stats balance if: _traversed = all skipped + all sent + // 2) the stats balance if: (working assumption) + // if _colorSent > 0 + / _traversed = all skipped + _colorSent + _colorBitsWritten + // else + // _traversed = all skipped + _colorSent + _colorBitsWritten + _treesRemoved // // scene network related data From 787c448856a5bf9fdc423cbb5339931186fd24d3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 19 Jul 2013 12:29:54 -0700 Subject: [PATCH 09/32] include elapsed encoding time in voxel stats, fixed issue with subtree removal stats --- libraries/voxels/src/VoxelSceneStats.cpp | 19 ++++++++++++++++--- libraries/voxels/src/VoxelSceneStats.h | 8 +++++++- libraries/voxels/src/VoxelTree.cpp | 3 ++- voxel-server/src/main.cpp | 4 +++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index c5586ef957..bf3d59a3db 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -29,8 +29,20 @@ void VoxelSceneStats::sceneCompleted() { _end = usecTimestampNow(); _elapsed = _end - _start; } + +void VoxelSceneStats::encodeStarted() { + _encodeStart = usecTimestampNow(); +} + +void VoxelSceneStats::encodeStopped() { + _totalEncodeTime += (usecTimestampNow() - _encodeStart); +} + void VoxelSceneStats::reset() { + _totalEncodeTime = 0; + _encodeStart = 0; + _packets = 0; _bytes = 0; _passes = 0; @@ -177,9 +189,10 @@ void VoxelSceneStats::childBitsRemoved(bool includesExistsBits, bool includesCol void VoxelSceneStats::printDebugDetails() { qDebug("\n------------------------------\n"); qDebug("VoxelSceneStats:\n"); - qDebug(" start : %llu \n", _start); - qDebug(" end : %llu \n", _end); - qDebug(" elapsed: %llu \n", _elapsed); + qDebug(" start : %llu \n", _start); + qDebug(" end : %llu \n", _end); + qDebug(" elapsed : %llu \n", _elapsed); + qDebug(" encoding : %llu \n", _totalEncodeTime); qDebug("\n"); qDebug(" full scene: %s\n", debug::valueOf(_fullSceneDraw)); qDebug(" moving: %s\n", debug::valueOf(_moving)); diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index e31b53a8ae..2310e5e199 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -22,6 +22,9 @@ public: void sceneCompleted(); void printDebugDetails(); void packetSent(int bytes); + + void encodeStarted(); + void encodeStopped(); void traversed(const VoxelNode* node); void skippedDistance(const VoxelNode* node); @@ -41,6 +44,9 @@ private: uint64_t _start; uint64_t _end; uint64_t _elapsed; + + uint64_t _totalEncodeTime; + uint64_t _encodeStart; // scene voxel related data unsigned long _traversed; @@ -90,7 +96,7 @@ private: // // 2) the stats balance if: (working assumption) // if _colorSent > 0 - / _traversed = all skipped + _colorSent + _colorBitsWritten + // _traversed = all skipped + _colorSent + _colorBitsWritten // else // _traversed = all skipped + _colorSent + _colorBitsWritten + _treesRemoved // diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 2939cd3258..11297313f8 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -1488,7 +1488,8 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp // repair the child exists mask *childExistsPlaceHolder = childrenExistInPacketBits; - if (params.stats) { + // If this is the last of the child exists bits, then we're actually be rolling out the entire tree + if (params.stats && childrenExistInPacketBits == 0) { params.stats->childBitsRemoved(params.includeExistsBits, params.includeColor); } diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 92c835d776..69abbcdcce 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -253,9 +253,11 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, wantOcclusionCulling, coverageMap, boundaryLevelAdjust, nodeData->getLastTimeBagEmpty(), fullScene, &nodeData->stats); - + + nodeData->stats.encodeStarted(); bytesWritten = serverTree.encodeTreeBitstream(subTree, &tempOutputBuffer[0], MAX_VOXEL_PACKET_SIZE - 1, nodeData->nodeBag, params); + nodeData->stats.encodeStopped(); if (nodeData->getAvailable() >= bytesWritten) { nodeData->writeToPacket(&tempOutputBuffer[0], bytesWritten); From b97ef2a2c63131c0a34a11fe1dd049964678e44f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 19 Jul 2013 13:54:20 -0700 Subject: [PATCH 10/32] made voxel stats a command line option --- voxel-server/src/main.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 69abbcdcce..502563a9ef 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -60,6 +60,7 @@ bool wantLocalDomain = false; bool wantColorRandomizer = false; bool debugVoxelSending = false; bool shouldShowAnimationDebug = false; +bool displayVoxelStats = false; EnvironmentData environmentData[3]; @@ -204,7 +205,10 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, } nodeData->stats.sceneCompleted(); - nodeData->stats.printDebugDetails(); + + if (::displayVoxelStats) { + nodeData->stats.printDebugDetails(); + } // This is the start of "resending" the scene. nodeData->nodeBag.insert(serverTree.rootNode); @@ -380,7 +384,9 @@ void *distributeVoxelsToListeners(void *args) { if (usecToSleep > 0) { usleep(usecToSleep); } else { - std::cout << "Last send took too much time, not sleeping!\n"; + if (::debugVoxelSending) { + std::cout << "Last send took too much time, not sleeping!\n"; + } } } @@ -413,6 +419,10 @@ int main(int argc, const char * argv[]) { nodeList->startSilentNodeRemovalThread(); srand((unsigned)time(0)); + + const char* DISPLAY_VOXEL_STATS = "--displayVoxelStats"; + ::displayVoxelStats = cmdOptionExists(argc, argv, DISPLAY_VOXEL_STATS); + printf("displayVoxelStats=%s\n", debug::valueOf(::displayVoxelStats)); const char* DEBUG_VOXEL_SENDING = "--debugVoxelSending"; ::debugVoxelSending = cmdOptionExists(argc, argv, DEBUG_VOXEL_SENDING); From d9c8a59929ec4d87e9574b63504f5c4f1fc162d6 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 19 Jul 2013 15:09:38 -0700 Subject: [PATCH 11/32] send voxel scene stats from server to client --- interface/src/Application.cpp | 8 ++ libraries/shared/src/PacketHeaders.h | 1 + libraries/voxels/src/VoxelSceneStats.cpp | 151 +++++++++++++++++++++++ libraries/voxels/src/VoxelSceneStats.h | 3 + voxel-server/src/main.cpp | 5 + 5 files changed, 168 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index adb88147e9..524b5ccd09 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -56,6 +56,8 @@ #include #include +#include + #include "Application.h" #include "InterfaceConfig.h" #include "LogDisplay.h" @@ -3337,6 +3339,12 @@ void* Application::networkReceive(void* args) { if (packetVersionMatch(app->_incomingPacket)) { // only process this packet if we have a match on the packet version switch (app->_incomingPacket[0]) { + case PACKET_TYPE_VOXEL_STATS:{ + VoxelSceneStats stats; + int statsMessageLength = stats.unpackFromMessage(app->_incomingPacket, bytesReceived); + stats.printDebugDetails(); + break; + } case PACKET_TYPE_TRANSMITTER_DATA_V2: // V2 = IOS transmitter app app->_myTransmitter.processIncomingData(app->_incomingPacket, bytesReceived); diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index 041303f2b5..16cda5ce1e 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -33,6 +33,7 @@ const PACKET_TYPE PACKET_TYPE_TRANSMITTER_DATA_V2 = 'T'; const PACKET_TYPE PACKET_TYPE_ENVIRONMENT_DATA = 'e'; const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L'; const PACKET_TYPE PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY = 'C'; +const PACKET_TYPE PACKET_TYPE_VOXEL_STATS = '#'; typedef char PACKET_VERSION; diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index bf3d59a3db..0368c530ec 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -6,6 +6,7 @@ // // +#include #include #include "VoxelNode.h" @@ -185,6 +186,156 @@ void VoxelSceneStats::childBitsRemoved(bool includesExistsBits, bool includesCol _treesRemoved++; } +int VoxelSceneStats::packIntoMessage(unsigned char* destinationBuffer, int availableBytes) { + unsigned char* bufferStart = destinationBuffer; + + int headerLength = populateTypeAndVersion(destinationBuffer, PACKET_TYPE_VOXEL_STATS); + destinationBuffer += headerLength; + + memcpy(destinationBuffer, &_start, sizeof(_start)); + destinationBuffer += sizeof(_start); + memcpy(destinationBuffer, &_end, sizeof(_end)); + destinationBuffer += sizeof(_end); + memcpy(destinationBuffer, &_elapsed, sizeof(_elapsed)); + destinationBuffer += sizeof(_elapsed); + memcpy(destinationBuffer, &_totalEncodeTime, sizeof(_totalEncodeTime)); + destinationBuffer += sizeof(_totalEncodeTime); + memcpy(destinationBuffer, &_fullSceneDraw, sizeof(_fullSceneDraw)); + destinationBuffer += sizeof(_fullSceneDraw); + memcpy(destinationBuffer, &_moving, sizeof(_moving)); + destinationBuffer += sizeof(_moving); + memcpy(destinationBuffer, &_packets, sizeof(_packets)); + destinationBuffer += sizeof(_packets); + memcpy(destinationBuffer, &_bytes, sizeof(_bytes)); + destinationBuffer += sizeof(_bytes); + + memcpy(destinationBuffer, &_internal, sizeof(_internal)); + destinationBuffer += sizeof(_internal); + memcpy(destinationBuffer, &_leaves, sizeof(_leaves)); + destinationBuffer += sizeof(_leaves); + memcpy(destinationBuffer, &_internalSkippedDistance, sizeof(_internalSkippedDistance)); + destinationBuffer += sizeof(_internalSkippedDistance); + memcpy(destinationBuffer, &_leavesSkippedDistance, sizeof(_leavesSkippedDistance)); + destinationBuffer += sizeof(_leavesSkippedDistance); + memcpy(destinationBuffer, &_internalSkippedOutOfView, sizeof(_internalSkippedOutOfView)); + destinationBuffer += sizeof(_internalSkippedOutOfView); + memcpy(destinationBuffer, &_leavesSkippedOutOfView, sizeof(_leavesSkippedOutOfView)); + destinationBuffer += sizeof(_leavesSkippedOutOfView); + memcpy(destinationBuffer, &_internalSkippedWasInView, sizeof(_internalSkippedWasInView)); + destinationBuffer += sizeof(_internalSkippedWasInView); + memcpy(destinationBuffer, &_leavesSkippedWasInView, sizeof(_leavesSkippedWasInView)); + destinationBuffer += sizeof(_leavesSkippedWasInView); + memcpy(destinationBuffer, &_internalSkippedNoChange, sizeof(_internalSkippedNoChange)); + destinationBuffer += sizeof(_internalSkippedNoChange); + memcpy(destinationBuffer, &_leavesSkippedNoChange, sizeof(_leavesSkippedNoChange)); + destinationBuffer += sizeof(_leavesSkippedNoChange); + memcpy(destinationBuffer, &_internalSkippedOccluded, sizeof(_internalSkippedOccluded)); + destinationBuffer += sizeof(_internalSkippedOccluded); + memcpy(destinationBuffer, &_leavesSkippedOccluded, sizeof(_leavesSkippedOccluded)); + destinationBuffer += sizeof(_leavesSkippedOccluded); + memcpy(destinationBuffer, &_internalColorSent, sizeof(_internalColorSent)); + destinationBuffer += sizeof(_internalColorSent); + memcpy(destinationBuffer, &_leavesColorSent, sizeof(_leavesColorSent)); + destinationBuffer += sizeof(_leavesColorSent); + memcpy(destinationBuffer, &_internalDidntFit, sizeof(_internalDidntFit)); + destinationBuffer += sizeof(_internalDidntFit); + memcpy(destinationBuffer, &_leavesDidntFit, sizeof(_leavesDidntFit)); + destinationBuffer += sizeof(_leavesDidntFit); + memcpy(destinationBuffer, &_colorBitsWritten, sizeof(_colorBitsWritten)); + destinationBuffer += sizeof(_colorBitsWritten); + memcpy(destinationBuffer, &_existsBitsWritten, sizeof(_existsBitsWritten)); + destinationBuffer += sizeof(_existsBitsWritten); + memcpy(destinationBuffer, &_existsInPacketBitsWritten, sizeof(_existsInPacketBitsWritten)); + destinationBuffer += sizeof(_existsInPacketBitsWritten); + memcpy(destinationBuffer, &_treesRemoved, sizeof(_treesRemoved)); + destinationBuffer += sizeof(_treesRemoved); + + return destinationBuffer - bufferStart; // includes header! +} + +int VoxelSceneStats::unpackFromMessage(unsigned char* sourceBuffer, int availableBytes) { + unsigned char* startPosition = sourceBuffer; + + // increment to push past the packet header + int numBytesPacketHeader = numBytesForPacketHeader(sourceBuffer); + sourceBuffer += numBytesPacketHeader; + + memcpy(&_start, sourceBuffer, sizeof(_start)); + sourceBuffer += sizeof(_start); + memcpy(&_end, sourceBuffer, sizeof(_end)); + sourceBuffer += sizeof(_end); + memcpy(&_elapsed, sourceBuffer, sizeof(_elapsed)); + sourceBuffer += sizeof(_elapsed); + memcpy(&_totalEncodeTime, sourceBuffer, sizeof(_totalEncodeTime)); + sourceBuffer += sizeof(_totalEncodeTime); + memcpy(&_fullSceneDraw, sourceBuffer, sizeof(_fullSceneDraw)); + sourceBuffer += sizeof(_fullSceneDraw); + memcpy(&_moving, sourceBuffer, sizeof(_moving)); + sourceBuffer += sizeof(_moving); + memcpy(&_packets, sourceBuffer, sizeof(_packets)); + sourceBuffer += sizeof(_packets); + memcpy(&_bytes, sourceBuffer, sizeof(_bytes)); + sourceBuffer += sizeof(_bytes); + memcpy(&_internal, sourceBuffer, sizeof(_internal)); + sourceBuffer += sizeof(_internal); + memcpy(&_leaves, sourceBuffer, sizeof(_leaves)); + sourceBuffer += sizeof(_leaves); + _traversed = _internal + _leaves; + + memcpy(&_internalSkippedDistance, sourceBuffer, sizeof(_internalSkippedDistance)); + sourceBuffer += sizeof(_internalSkippedDistance); + memcpy(&_leavesSkippedDistance, sourceBuffer, sizeof(_leavesSkippedDistance)); + sourceBuffer += sizeof(_leavesSkippedDistance); + _skippedDistance = _internalSkippedDistance + _leavesSkippedDistance; + + memcpy(&_internalSkippedOutOfView, sourceBuffer, sizeof(_internalSkippedOutOfView)); + sourceBuffer += sizeof(_internalSkippedOutOfView); + memcpy(&_leavesSkippedOutOfView, sourceBuffer, sizeof(_leavesSkippedOutOfView)); + sourceBuffer += sizeof(_leavesSkippedOutOfView); + _skippedOutOfView = _internalSkippedOutOfView + _leavesSkippedOutOfView; + + memcpy(&_internalSkippedWasInView, sourceBuffer, sizeof(_internalSkippedWasInView)); + sourceBuffer += sizeof(_internalSkippedWasInView); + memcpy(&_leavesSkippedWasInView, sourceBuffer, sizeof(_leavesSkippedWasInView)); + sourceBuffer += sizeof(_leavesSkippedWasInView); + _skippedWasInView = _internalSkippedWasInView + _leavesSkippedWasInView; + + memcpy(&_internalSkippedNoChange, sourceBuffer, sizeof(_internalSkippedNoChange)); + sourceBuffer += sizeof(_internalSkippedNoChange); + memcpy(&_leavesSkippedNoChange, sourceBuffer, sizeof(_leavesSkippedNoChange)); + sourceBuffer += sizeof(_leavesSkippedNoChange); + _skippedNoChange = _internalSkippedNoChange + _leavesSkippedNoChange; + + memcpy(&_internalSkippedOccluded, sourceBuffer, sizeof(_internalSkippedOccluded)); + sourceBuffer += sizeof(_internalSkippedOccluded); + memcpy(&_leavesSkippedOccluded, sourceBuffer, sizeof(_leavesSkippedOccluded)); + sourceBuffer += sizeof(_leavesSkippedOccluded); + _skippedOccluded = _internalSkippedOccluded + _leavesSkippedOccluded; + + memcpy(&_internalColorSent, sourceBuffer, sizeof(_internalColorSent)); + sourceBuffer += sizeof(_internalColorSent); + memcpy(&_leavesColorSent, sourceBuffer, sizeof(_leavesColorSent)); + sourceBuffer += sizeof(_leavesColorSent); + _colorSent = _internalColorSent + _leavesColorSent; + + memcpy(&_internalDidntFit, sourceBuffer, sizeof(_internalDidntFit)); + sourceBuffer += sizeof(_internalDidntFit); + memcpy(&_leavesDidntFit, sourceBuffer, sizeof(_leavesDidntFit)); + sourceBuffer += sizeof(_leavesDidntFit); + _didntFit = _internalDidntFit + _leavesDidntFit; + + memcpy(&_colorBitsWritten, sourceBuffer, sizeof(_colorBitsWritten)); + sourceBuffer += sizeof(_colorBitsWritten); + memcpy(&_existsBitsWritten, sourceBuffer, sizeof(_existsBitsWritten)); + sourceBuffer += sizeof(_existsBitsWritten); + memcpy(&_existsInPacketBitsWritten, sourceBuffer, sizeof(_existsInPacketBitsWritten)); + sourceBuffer += sizeof(_existsInPacketBitsWritten); + memcpy(&_treesRemoved, sourceBuffer, sizeof(_treesRemoved)); + sourceBuffer += sizeof(_treesRemoved); + + return sourceBuffer - startPosition; // includes header! +} + void VoxelSceneStats::printDebugDetails() { qDebug("\n------------------------------\n"); diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index 2310e5e199..93146ffa88 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -38,6 +38,9 @@ public: void existsBitsWritten(); void existsInPacketBitsWritten(); void childBitsRemoved(bool includesExistsBits, bool includesColors); + + int packIntoMessage(unsigned char* destinationBuffer, int availableBytes); + int unpackFromMessage(unsigned char* sourceBuffer, int availableBytes); private: // scene timing data in usecs diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 502563a9ef..5ae2874a34 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -209,6 +209,11 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, if (::displayVoxelStats) { nodeData->stats.printDebugDetails(); } + + // Send the stats message to the client + unsigned char statsMessage[MAX_PACKET_SIZE]; + int statsMessageLength = nodeData->stats.packIntoMessage(statsMessage, sizeof(statsMessage)); + nodeList->getNodeSocket()->send(node->getActiveSocket(), statsMessage, statsMessageLength); // This is the start of "resending" the scene. nodeData->nodeBag.insert(serverTree.rootNode); From 2cc42f67738313e9a63b0bcccd1f6bd23fc4c4ac Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 19 Jul 2013 15:59:47 -0700 Subject: [PATCH 12/32] support piggybacking voxel and voxel stats messages into single packet --- interface/src/Application.cpp | 35 +++++++++---- libraries/voxels/src/VoxelSceneStats.cpp | 4 ++ libraries/voxels/src/VoxelSceneStats.h | 12 +++++ voxel-server/src/main.cpp | 64 ++++++++++++++++-------- 4 files changed, 85 insertions(+), 30 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 524b5ccd09..345ede0274 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3339,12 +3339,6 @@ void* Application::networkReceive(void* args) { if (packetVersionMatch(app->_incomingPacket)) { // only process this packet if we have a match on the packet version switch (app->_incomingPacket[0]) { - case PACKET_TYPE_VOXEL_STATS:{ - VoxelSceneStats stats; - int statsMessageLength = stats.unpackFromMessage(app->_incomingPacket, bytesReceived); - stats.printDebugDetails(); - break; - } case PACKET_TYPE_TRANSMITTER_DATA_V2: // V2 = IOS transmitter app app->_myTransmitter.processIncomingData(app->_incomingPacket, bytesReceived); @@ -3357,16 +3351,39 @@ void* Application::networkReceive(void* args) { case PACKET_TYPE_VOXEL_DATA_MONOCHROME: case PACKET_TYPE_Z_COMMAND: case PACKET_TYPE_ERASE_VOXEL: + case PACKET_TYPE_VOXEL_STATS: case PACKET_TYPE_ENVIRONMENT_DATA: { + + unsigned char* messageData = app->_incomingPacket; + ssize_t messageLength = bytesReceived; + + // note: PACKET_TYPE_VOXEL_STATS can have PACKET_TYPE_VOXEL_DATA or PACKET_TYPE_VOXEL_DATA_MONOCHROME + // immediately following them inside the same packet. So, we process the PACKET_TYPE_VOXEL_STATS first + // then process any remaining bytes as if it was another packet + if (messageData[0] == PACKET_TYPE_VOXEL_STATS) { + VoxelSceneStats stats; + int statsMessageLength = stats.unpackFromMessage(messageData, messageLength); + stats.printDebugDetails(); + if (messageLength > statsMessageLength) { + messageData += statsMessageLength; + messageLength -= statsMessageLength; + if (!packetVersionMatch(messageData)) { + break; // bail since piggyback data doesn't match our versioning + } + } else { + break; // bail since no piggyback data + } + } // fall through to piggyback message + if (app->_renderVoxels->isChecked()) { Node* voxelServer = NodeList::getInstance()->soloNodeOfType(NODE_TYPE_VOXEL_SERVER); if (voxelServer) { voxelServer->lock(); - if (app->_incomingPacket[0] == PACKET_TYPE_ENVIRONMENT_DATA) { - app->_environment.parseData(&senderAddress, app->_incomingPacket, bytesReceived); + if (messageData[0] == PACKET_TYPE_ENVIRONMENT_DATA) { + app->_environment.parseData(&senderAddress, messageData, messageLength); } else { - app->_voxels.parseData(app->_incomingPacket, bytesReceived); + app->_voxels.parseData(messageData, messageLength); } voxelServer->unlock(); diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 0368c530ec..ab25b725bb 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -14,6 +14,7 @@ VoxelSceneStats::VoxelSceneStats() { reset(); + _readyToSend = false; } VoxelSceneStats::~VoxelSceneStats() { @@ -29,6 +30,9 @@ void VoxelSceneStats::sceneStarted(bool fullScene, bool moving) { void VoxelSceneStats::sceneCompleted() { _end = usecTimestampNow(); _elapsed = _end - _start; + + _statsMessageLength = packIntoMessage(_statsMessage, sizeof(_statsMessage)); + _readyToSend = true; } void VoxelSceneStats::encodeStarted() { diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index 93146ffa88..05545f3320 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -10,6 +10,7 @@ #define __hifi__VoxelSceneStats__ #include +#include class VoxelNode; @@ -20,6 +21,7 @@ public: void reset(); void sceneStarted(bool fullScene, bool moving); void sceneCompleted(); + void printDebugDetails(); void packetSent(int bytes); @@ -41,8 +43,18 @@ public: int packIntoMessage(unsigned char* destinationBuffer, int availableBytes); int unpackFromMessage(unsigned char* sourceBuffer, int availableBytes); + + bool readyToSend() const { return _readyToSend; } + void markAsSent() { _readyToSend = false; } + unsigned char* getStatsMessage() { return &_statsMessage[0]; } + int getStatsMessageLength() const { return _statsMessageLength; } + private: + bool _readyToSend; + unsigned char _statsMessage[MAX_PACKET_SIZE]; + int _statsMessageLength; + // scene timing data in usecs uint64_t _start; uint64_t _end; diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 5ae2874a34..6244ee190d 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -112,6 +112,44 @@ void eraseVoxelTreeAndCleanupNodeVisitData() { pthread_mutex_t treeLock; +void handlePacketSend(NodeList* nodeList, + NodeList::iterator& node, + VoxelNodeData* nodeData, + int& trueBytesSent, int& truePacketsSent) { + // If we've got a stats message ready to send, then see if we can piggyback them together + if (nodeData->stats.readyToSend()) { + // Send the stats message to the client + unsigned char* statsMessage = nodeData->stats.getStatsMessage(); + int statsMessageLength = nodeData->stats.getStatsMessageLength(); + + // If the size of the stats message and the voxel message will fit in a packet, then piggyback them + if (nodeData->getPacketLength() + statsMessageLength < MAX_PACKET_SIZE) { + + // copy voxel message to back of stats message + memcpy(statsMessage + statsMessageLength, nodeData->getPacket(), nodeData->getPacketLength()); + statsMessageLength += nodeData->getPacketLength(); + + // actually send it + nodeList->getNodeSocket()->send(node->getActiveSocket(), statsMessage, statsMessageLength); + } else { + // not enough room in the packet, send two packets + nodeList->getNodeSocket()->send(node->getActiveSocket(), statsMessage, statsMessageLength); + nodeList->getNodeSocket()->send(node->getActiveSocket(), + nodeData->getPacket(), nodeData->getPacketLength()); + } + } else { + // just send the voxel packet + nodeList->getNodeSocket()->send(node->getActiveSocket(), + nodeData->getPacket(), nodeData->getPacketLength()); + } + // remember to track our stats + nodeData->stats.packetSent(nodeData->getPacketLength()); + trueBytesSent += nodeData->getPacketLength(); + truePacketsSent++; + nodeData->resetVoxelPacket(); +} + + // Version of voxel distributor that sends the deepest LOD level at once void deepestLevelVoxelDistributor(NodeList* nodeList, NodeList::iterator& node, @@ -142,12 +180,9 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, printf("wantColor=%s --- SENDING PARTIAL PACKET! nodeData->getCurrentPacketIsColor()=%s\n", debug::valueOf(wantColor), debug::valueOf(nodeData->getCurrentPacketIsColor())); } - nodeList->getNodeSocket()->send(node->getActiveSocket(), - nodeData->getPacket(), nodeData->getPacketLength()); - nodeData->stats.packetSent(nodeData->getPacketLength()); - trueBytesSent += nodeData->getPacketLength(); - truePacketsSent++; - nodeData->resetVoxelPacket(); + + handlePacketSend(nodeList, node, nodeData, trueBytesSent, truePacketsSent); + } else { if (::debugVoxelSending) { printf("wantColor=%s --- FIXING HEADER! nodeData->getCurrentPacketIsColor()=%s\n", @@ -209,11 +244,6 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, if (::displayVoxelStats) { nodeData->stats.printDebugDetails(); } - - // Send the stats message to the client - unsigned char statsMessage[MAX_PACKET_SIZE]; - int statsMessageLength = nodeData->stats.packIntoMessage(statsMessage, sizeof(statsMessage)); - nodeList->getNodeSocket()->send(node->getActiveSocket(), statsMessage, statsMessageLength); // This is the start of "resending" the scene. nodeData->nodeBag.insert(serverTree.rootNode); @@ -271,22 +301,14 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, if (nodeData->getAvailable() >= bytesWritten) { nodeData->writeToPacket(&tempOutputBuffer[0], bytesWritten); } else { - nodeList->getNodeSocket()->send(node->getActiveSocket(), - nodeData->getPacket(), nodeData->getPacketLength()); - nodeData->stats.packetSent(nodeData->getPacketLength()); - trueBytesSent += nodeData->getPacketLength(); - truePacketsSent++; + handlePacketSend(nodeList, node, nodeData, trueBytesSent, truePacketsSent); packetsSentThisInterval++; nodeData->resetVoxelPacket(); nodeData->writeToPacket(&tempOutputBuffer[0], bytesWritten); } } else { if (nodeData->isPacketWaiting()) { - nodeList->getNodeSocket()->send(node->getActiveSocket(), - nodeData->getPacket(), nodeData->getPacketLength()); - nodeData->stats.packetSent(nodeData->getPacketLength()); - trueBytesSent += nodeData->getPacketLength(); - truePacketsSent++; + handlePacketSend(nodeList, node, nodeData, trueBytesSent, truePacketsSent); nodeData->resetVoxelPacket(); } packetsSentThisInterval = PACKETS_PER_CLIENT_PER_INTERVAL; // done for now, no nodes left From 83290bc8b7ac0a769c43b4df216ea2f289c12fe7 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 19 Jul 2013 17:28:37 -0700 Subject: [PATCH 13/32] first cut at real voxel stats dialog box --- interface/CMakeLists.txt | 2 +- interface/src/Application.cpp | 25 +++++++- interface/src/Application.h | 7 +++ interface/src/ui/VoxelStatsDialog.cpp | 74 ++++++++++++++++++++++++ interface/src/ui/VoxelStatsDialog.h | 45 ++++++++++++++ libraries/voxels/src/VoxelSceneStats.cpp | 27 +++++++++ libraries/voxels/src/VoxelSceneStats.h | 21 +++++++ 7 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 interface/src/ui/VoxelStatsDialog.cpp create mode 100644 interface/src/ui/VoxelStatsDialog.h diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 829ccbff06..9625c1b78d 100755 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -75,7 +75,7 @@ add_subdirectory(external/fervor/) include_directories(external/fervor/) # run qt moc on qt-enabled headers -qt4_wrap_cpp(INTERFACE_SRCS src/Application.h src/AvatarVoxelSystem.h src/Webcam.h src/ui/BandwidthDialog.h) +qt4_wrap_cpp(INTERFACE_SRCS src/Application.h src/AvatarVoxelSystem.h src/Webcam.h src/ui/BandwidthDialog.h src/ui/VoxelStatsDialog.h) # create the executable, make it a bundle on OS X add_executable(${TARGET_NAME} MACOSX_BUNDLE ${INTERFACE_SRCS}) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 345ede0274..fddfdfef07 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -176,6 +176,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _window(new QMainWindow(desktop())), _glWidget(new GLCanvas()), _bandwidthDialog(NULL), + _voxelStatsDialog(NULL), _displayLevels(false), _frameCount(0), _fps(120.0f), @@ -1097,6 +1098,21 @@ void Application::bandwidthDetailsClosed() { delete dlg; } +void Application::voxelStatsDetails() { + if (!_voxelStatsDialog) { + _voxelStatsDialog = new VoxelStatsDialog(_glWidget, &_voxelSceneStats); + connect(_voxelStatsDialog, SIGNAL(closed()), SLOT(voxelStatsDetailsClosed())); + _voxelStatsDialog->show(); + } + _voxelStatsDialog->raise(); +} + +void Application::voxelStatsDetailsClosed() { + QDialog* dlg = _voxelStatsDialog; + _voxelStatsDialog = NULL; + delete dlg; +} + void Application::editPreferences() { QDialog dialog(_glWidget); dialog.setWindowTitle("Interface Preferences"); @@ -1695,6 +1711,7 @@ void Application::initMenu() { (_bandwidthDisplayOn = toolsMenu->addAction("Bandwidth Display"))->setCheckable(true); _bandwidthDisplayOn->setChecked(true); toolsMenu->addAction("Bandwidth Details", this, SLOT(bandwidthDetails())); + toolsMenu->addAction("Voxel Stats Details", this, SLOT(voxelStatsDetails())); QMenu* voxelMenu = menuBar->addMenu("Voxels"); @@ -2128,6 +2145,9 @@ void Application::update(float deltaTime) { if (_bandwidthDialog) { _bandwidthDialog->update(); } + if (_voxelStatsDialog) { + _voxelStatsDialog->update(); + } // Update audio stats for procedural sounds #ifndef _WIN32 @@ -3361,9 +3381,8 @@ void* Application::networkReceive(void* args) { // immediately following them inside the same packet. So, we process the PACKET_TYPE_VOXEL_STATS first // then process any remaining bytes as if it was another packet if (messageData[0] == PACKET_TYPE_VOXEL_STATS) { - VoxelSceneStats stats; - int statsMessageLength = stats.unpackFromMessage(messageData, messageLength); - stats.printDebugDetails(); + int statsMessageLength = app->_voxelSceneStats.unpackFromMessage(messageData, messageLength); + app->_voxelSceneStats.printDebugDetails(); if (messageLength > statsMessageLength) { messageData += statsMessageLength; messageLength -= statsMessageLength; diff --git a/interface/src/Application.h b/interface/src/Application.h index 9333808a27..05df195a3e 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -39,6 +39,7 @@ #include "ToolsPalette.h" #include "ui/ChatEntry.h" #include "ui/BandwidthDialog.h" +#include "ui/VoxelStatsDialog.h" #include "ViewFrustum.h" #include "VoxelSystem.h" #include "Webcam.h" @@ -116,6 +117,9 @@ private slots: void bandwidthDetails(); void editPreferences(); void bandwidthDetailsClosed(); + + void voxelStatsDetails(); + void voxelStatsDetailsClosed(); void pair(); @@ -277,6 +281,7 @@ private: BandwidthMeter _bandwidthMeter; BandwidthDialog* _bandwidthDialog; + VoxelStatsDialog* _voxelStatsDialog; SerialInterface _serialHeadSensor; QNetworkAccessManager* _networkAccessManager; @@ -406,6 +411,8 @@ private: ToolsPalette _palette; Swatch _swatch; + + VoxelSceneStats _voxelSceneStats; }; #endif /* defined(__interface__Application__) */ diff --git a/interface/src/ui/VoxelStatsDialog.cpp b/interface/src/ui/VoxelStatsDialog.cpp new file mode 100644 index 0000000000..455ea0cfb0 --- /dev/null +++ b/interface/src/ui/VoxelStatsDialog.cpp @@ -0,0 +1,74 @@ +// +// VoxelStatsDialog.cpp +// interface +// +// Created by Brad Hefta-Gaub on 7/19/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +#include +#include + +#include +#include + +#include + +#include "ui/VoxelStatsDialog.h" + + +VoxelStatsDialog::VoxelStatsDialog(QWidget* parent, VoxelSceneStats* model) : + QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint), + _model(model) { + + char strBuf[64]; + + this->setWindowTitle("Voxel Statistics"); + + // Create layouter + QFormLayout* form = new QFormLayout(); + this->QDialog::setLayout(form); + + // Setup labels + for (int i = 0; i < VoxelSceneStats::ITEM_COUNT; ++i) { + VoxelSceneStats::ItemInfo& itemInfo = _model->getItemInfo(i); + QLabel* label = _labels[i] = new QLabel(); + label->setAlignment(Qt::AlignRight); + + // Set foreground color to 62.5% brightness of the meter (otherwise will be hard to read on the bright background) + QPalette palette = label->palette(); + unsigned rgb = itemInfo.colorRGBA >> 8; + rgb = ((rgb & 0xfefefeu) >> 1) + ((rgb & 0xf8f8f8) >> 3); + palette.setColor(QPalette::WindowText, QColor::fromRgb(rgb)); + label->setPalette(palette); + + snprintf(strBuf, sizeof(strBuf), " %s:", itemInfo.caption); + form->addRow(strBuf, label); + } +} + +void VoxelStatsDialog::paintEvent(QPaintEvent* event) { + + // Update labels + char strBuf[64]; + for (int i = 0; i < VoxelSceneStats::ITEM_COUNT; ++i) { + QLabel* label = _labels[i]; + snprintf(strBuf, sizeof(strBuf), "%s", _model->getItemValue(i)); + label->setText(strBuf); + } + + this->QDialog::paintEvent(event); + this->setFixedSize(this->width(), this->height()); +} + +void VoxelStatsDialog::reject() { + // Just regularly close upon ESC + this->QDialog::close(); +} + +void VoxelStatsDialog::closeEvent(QCloseEvent* event) { + this->QDialog::closeEvent(event); + emit closed(); +} + + diff --git a/interface/src/ui/VoxelStatsDialog.h b/interface/src/ui/VoxelStatsDialog.h new file mode 100644 index 0000000000..1d30ec8881 --- /dev/null +++ b/interface/src/ui/VoxelStatsDialog.h @@ -0,0 +1,45 @@ +// +// VoxelStatsDialog.h +// interface +// +// Created by Brad Hefta-Gaub on 7/19/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +#ifndef __hifi__VoxelStatsDialog__ +#define __hifi__VoxelStatsDialog__ + +#include +#include + +#include + +class VoxelStatsDialog : public QDialog { + Q_OBJECT +public: + + // Sets up the UI + VoxelStatsDialog(QWidget* parent, VoxelSceneStats* model); + +signals: + void closed(); + +public slots: + + void reject(); + +protected: + + // State <- data model held by BandwidthMeter + void paintEvent(QPaintEvent*); + + // Emits a 'closed' signal when this dialog is closed. + void closeEvent(QCloseEvent*); + +private: + QLabel* _labels[VoxelSceneStats::ITEM_COUNT]; + VoxelSceneStats* _model; +}; + +#endif /* defined(__interface__VoxelStatsDialog__) */ + diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index ab25b725bb..02ee47c6c1 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -12,6 +12,7 @@ #include "VoxelNode.h" #include "VoxelSceneStats.h" + VoxelSceneStats::VoxelSceneStats() { reset(); _readyToSend = false; @@ -386,3 +387,29 @@ void VoxelSceneStats::printDebugDetails() { qDebug(" in packet bit : %lu\n", _existsInPacketBitsWritten); qDebug(" trees removed : %lu\n", _treesRemoved ); } + + +VoxelSceneStats::ItemInfo VoxelSceneStats::_ITEMS[] = { + { "Elapsed" , "usecs", 0x40ff40d0 }, + { "Encode" , "usecs", 0xffef40c0 }, + { "Packets" , "" , 0xd0d0d0a0 } +}; + +char* VoxelSceneStats::getItemValue(int item) { + switch(item) { + case ITEM_ELAPSED: + sprintf(_itemValueBuffer, "%llu", _elapsed); + break; + case ITEM_ENCODE: + sprintf(_itemValueBuffer, "%llu", _totalEncodeTime); + break; + case ITEM_PACKETS: + sprintf(_itemValueBuffer, "%d", _packets); + break; + default: + sprintf(_itemValueBuffer, ""); + break; + } + return _itemValueBuffer; +} + diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index 05545f3320..99880c591d 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -49,6 +49,22 @@ public: unsigned char* getStatsMessage() { return &_statsMessage[0]; } int getStatsMessageLength() const { return _statsMessageLength; } + enum { + ITEM_ELAPSED, + ITEM_ENCODE, + ITEM_PACKETS, + ITEM_COUNT + }; + + // Meta information about each stats item + struct ItemInfo { + char const* const caption; + char const* unitCaption; + unsigned colorRGBA; + }; + + ItemInfo& getItemInfo(int item) { return _ITEMS[item]; }; + char* getItemValue(int item); private: bool _readyToSend; @@ -124,6 +140,11 @@ private: // features related items bool _moving; bool _fullSceneDraw; + + + static ItemInfo _ITEMS[]; + static int const MAX_ITEM_VALUE_LENGTH = 40; + char _itemValueBuffer[MAX_ITEM_VALUE_LENGTH]; }; #endif /* defined(__hifi__VoxelSceneStats__) */ From 4e8ce1b193600cea126be7d95f9b6d0c118a10df Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 19 Jul 2013 18:15:06 -0700 Subject: [PATCH 14/32] tweaks to stats dialog --- interface/src/ui/VoxelStatsDialog.cpp | 3 ++- libraries/voxels/src/VoxelSceneStats.cpp | 24 ++++++++++++++++-------- libraries/voxels/src/VoxelSceneStats.h | 5 ++--- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/interface/src/ui/VoxelStatsDialog.cpp b/interface/src/ui/VoxelStatsDialog.cpp index 455ea0cfb0..d365990dcf 100644 --- a/interface/src/ui/VoxelStatsDialog.cpp +++ b/interface/src/ui/VoxelStatsDialog.cpp @@ -41,6 +41,7 @@ VoxelStatsDialog::VoxelStatsDialog(QWidget* parent, VoxelSceneStats* model) : rgb = ((rgb & 0xfefefeu) >> 1) + ((rgb & 0xf8f8f8) >> 3); palette.setColor(QPalette::WindowText, QColor::fromRgb(rgb)); label->setPalette(palette); + label->setText(" "); snprintf(strBuf, sizeof(strBuf), " %s:", itemInfo.caption); form->addRow(strBuf, label); @@ -50,7 +51,7 @@ VoxelStatsDialog::VoxelStatsDialog(QWidget* parent, VoxelSceneStats* model) : void VoxelStatsDialog::paintEvent(QPaintEvent* event) { // Update labels - char strBuf[64]; + char strBuf[256]; for (int i = 0; i < VoxelSceneStats::ITEM_COUNT; ++i) { QLabel* label = _labels[i]; snprintf(strBuf, sizeof(strBuf), "%s", _model->getItemValue(i)); diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 02ee47c6c1..3251c607f1 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -354,7 +354,7 @@ void VoxelSceneStats::printDebugDetails() { qDebug(" moving: %s\n", debug::valueOf(_moving)); qDebug("\n"); qDebug(" packets: %d\n", _packets); - qDebug(" bytes : %d\n", _bytes); + qDebug(" bytes : %ld\n", _bytes); qDebug("\n"); qDebug(" traversed : %lu\n", _traversed ); qDebug(" internal : %lu\n", _internal ); @@ -390,22 +390,30 @@ void VoxelSceneStats::printDebugDetails() { VoxelSceneStats::ItemInfo VoxelSceneStats::_ITEMS[] = { - { "Elapsed" , "usecs", 0x40ff40d0 }, - { "Encode" , "usecs", 0xffef40c0 }, - { "Packets" , "" , 0xd0d0d0a0 } + { "Elapsed" , 0x40ff40d0 }, + { "Encode" , 0xffef40c0 }, + { "Network" , 0xd0d0d0a0 } }; char* VoxelSceneStats::getItemValue(int item) { + const uint64_t USECS_PER_SECOND = 1000 * 1000; + int calcFPS; + int calculatedKBPS; switch(item) { case ITEM_ELAPSED: - sprintf(_itemValueBuffer, "%llu", _elapsed); + calcFPS = (float)USECS_PER_SECOND / (float)_elapsed; + sprintf(_itemValueBuffer, "%llu usecs (%d fps)", _elapsed, calcFPS); break; case ITEM_ENCODE: - sprintf(_itemValueBuffer, "%llu", _totalEncodeTime); + calcFPS = (float)USECS_PER_SECOND / (float)_totalEncodeTime; + sprintf(_itemValueBuffer, "%llu usecs (%d fps)", _totalEncodeTime, calcFPS); break; - case ITEM_PACKETS: - sprintf(_itemValueBuffer, "%d", _packets); + case ITEM_PACKETS: { + float elapsedSecs = ((float)_elapsed / (float)USECS_PER_SECOND); + calculatedKBPS = elapsedSecs == 0 ? 0 : ((_bytes * 8) / elapsedSecs) / 1000; + sprintf(_itemValueBuffer, "%d packets %lu bytes (%d kbps)", _packets, _bytes, calculatedKBPS); break; + } default: sprintf(_itemValueBuffer, ""); break; diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index 99880c591d..d58d21d0e0 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -59,7 +59,6 @@ public: // Meta information about each stats item struct ItemInfo { char const* const caption; - char const* unitCaption; unsigned colorRGBA; }; @@ -134,7 +133,7 @@ private: // scene network related data unsigned int _packets; - unsigned int _bytes; + unsigned long _bytes; unsigned int _passes; // features related items @@ -143,7 +142,7 @@ private: static ItemInfo _ITEMS[]; - static int const MAX_ITEM_VALUE_LENGTH = 40; + static int const MAX_ITEM_VALUE_LENGTH = 128; char _itemValueBuffer[MAX_ITEM_VALUE_LENGTH]; }; From e0f115298dc533a61841d78a05d90028348c6604 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sat, 20 Jul 2013 11:28:12 -0700 Subject: [PATCH 15/32] additional stats items --- interface/src/Application.cpp | 1 - interface/src/ui/VoxelStatsDialog.cpp | 4 +- libraries/voxels/src/VoxelSceneStats.cpp | 89 +++++++++++++++++++++++- libraries/voxels/src/VoxelSceneStats.h | 12 ++++ 4 files changed, 101 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fddfdfef07..8126567ff5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3382,7 +3382,6 @@ void* Application::networkReceive(void* args) { // then process any remaining bytes as if it was another packet if (messageData[0] == PACKET_TYPE_VOXEL_STATS) { int statsMessageLength = app->_voxelSceneStats.unpackFromMessage(messageData, messageLength); - app->_voxelSceneStats.printDebugDetails(); if (messageLength > statsMessageLength) { messageData += statsMessageLength; messageLength -= statsMessageLength; diff --git a/interface/src/ui/VoxelStatsDialog.cpp b/interface/src/ui/VoxelStatsDialog.cpp index d365990dcf..8ab7df3ddd 100644 --- a/interface/src/ui/VoxelStatsDialog.cpp +++ b/interface/src/ui/VoxelStatsDialog.cpp @@ -41,7 +41,9 @@ VoxelStatsDialog::VoxelStatsDialog(QWidget* parent, VoxelSceneStats* model) : rgb = ((rgb & 0xfefefeu) >> 1) + ((rgb & 0xf8f8f8) >> 3); palette.setColor(QPalette::WindowText, QColor::fromRgb(rgb)); label->setPalette(palette); - label->setText(" "); + + // This is my hackery attempt at making QDialog auto-size to a width that will hold our info. It kinda works. + label->setText("123456789012345678901234567890123456789012345678901234567890"); snprintf(strBuf, sizeof(strBuf), " %s:", itemInfo.caption); form->addRow(strBuf, label); diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 3251c607f1..199068101e 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -390,9 +390,21 @@ void VoxelSceneStats::printDebugDetails() { VoxelSceneStats::ItemInfo VoxelSceneStats::_ITEMS[] = { - { "Elapsed" , 0x40ff40d0 }, - { "Encode" , 0xffef40c0 }, - { "Network" , 0xd0d0d0a0 } + { "Elapsed" , 0x40ff40d0 }, + { "Encode" , 0xffef40c0 }, + { "Network" , 0xd0d0d0a0 }, + { "Voxels Sent" , 0x40ff40d0 }, + { "Colors Sent" , 0xffef40c0 }, + { "Bitmasks Sent" , 0xd0d0d0a0 }, + { "Traversed" , 0x40ff40d0 }, + { "Skipped - Total" , 0xffef40c0 }, + { "Skipped - Distance" , 0xd0d0d0a0 }, + { "Skipped - Out of View", 0x40ff40d0 }, + { "Skipped - Was in View", 0xffef40c0 }, + { "Skipped - No Change" , 0xd0d0d0a0 }, + { "Skipped - Occluded" , 0x40ff40d0 }, + { "Didn't fit in packet" , 0xffef40c0 }, + { "Mode" , 0xd0d0d0a0 }, }; char* VoxelSceneStats::getItemValue(int item) { @@ -414,6 +426,77 @@ char* VoxelSceneStats::getItemValue(int item) { sprintf(_itemValueBuffer, "%d packets %lu bytes (%d kbps)", _packets, _bytes, calculatedKBPS); break; } + case ITEM_VOXELS: { + unsigned long total = _existsInPacketBitsWritten + _colorSent; + float calculatedBPV = total == 0 ? 0 : (_bytes * 8) / total; + sprintf(_itemValueBuffer, "%lu total (%.2f bits/voxel) %lu internal %lu leaves", + total, calculatedBPV, _existsInPacketBitsWritten, _colorSent); + break; + } + case ITEM_TRAVERSED: { + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + _traversed, _internal, _leaves); + break; + } + case ITEM_SKIPPED: { + unsigned long total = _skippedDistance + _skippedOutOfView + + _skippedWasInView + _skippedNoChange + _skippedOccluded; + + unsigned long internal = _internalSkippedDistance + _internalSkippedOutOfView + + _internalSkippedWasInView + _internalSkippedNoChange + _internalSkippedOccluded; + + unsigned long leaves = _leavesSkippedDistance + _leavesSkippedOutOfView + + _leavesSkippedWasInView + _leavesSkippedNoChange + _leavesSkippedOccluded; + + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + total, internal, leaves); + break; + } + case ITEM_SKIPPED_DISTANCE: { + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + _skippedDistance, _internalSkippedDistance, _leavesSkippedDistance); + break; + } + case ITEM_SKIPPED_OUT_OF_VIEW: { + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + _skippedOutOfView, _internalSkippedOutOfView, _leavesSkippedOutOfView); + break; + } + case ITEM_SKIPPED_WAS_IN_VIEW: { + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + _skippedWasInView, _internalSkippedWasInView, _leavesSkippedWasInView); + break; + } + case ITEM_SKIPPED_NO_CHANGE: { + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + _skippedNoChange, _internalSkippedNoChange, _leavesSkippedNoChange); + break; + } + case ITEM_SKIPPED_OCCLUDED: { + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + _skippedOccluded, _internalSkippedOccluded, _leavesSkippedOccluded); + break; + } + case ITEM_COLORS: { + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + _colorSent, _internalColorSent, _leavesColorSent); + break; + } + case ITEM_DIDNT_FIT: { + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves (removed: %lu)", + _didntFit, _internalDidntFit, _leavesDidntFit, _treesRemoved); + break; + } + case ITEM_BITS: { + sprintf(_itemValueBuffer, "colors: %lu, exists: %lu, in packets: %lu", + _colorBitsWritten, _existsBitsWritten, _existsInPacketBitsWritten); + break; + } + case ITEM_MODE: { + sprintf(_itemValueBuffer, "%s - %s", (_fullSceneDraw ? "Full Scene" : "Partial Scene"), + (_moving ? "Moving" : "Stationary")); + break; + } default: sprintf(_itemValueBuffer, ""); break; diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index d58d21d0e0..fb7931e6e7 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -53,6 +53,18 @@ public: ITEM_ELAPSED, ITEM_ENCODE, ITEM_PACKETS, + ITEM_VOXELS, + ITEM_COLORS, + ITEM_BITS, + ITEM_TRAVERSED, + ITEM_SKIPPED, + ITEM_SKIPPED_DISTANCE, + ITEM_SKIPPED_OUT_OF_VIEW, + ITEM_SKIPPED_WAS_IN_VIEW, + ITEM_SKIPPED_NO_CHANGE, + ITEM_SKIPPED_OCCLUDED, + ITEM_DIDNT_FIT, + ITEM_MODE, ITEM_COUNT }; From de7cd4db03c7b805e9f043c889f6812af6b6d3aa Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sat, 20 Jul 2013 15:49:04 -0700 Subject: [PATCH 16/32] added total voxel count to stats --- libraries/voxels/src/VoxelNode.cpp | 20 ++++++++ libraries/voxels/src/VoxelNode.h | 8 ++++ libraries/voxels/src/VoxelSceneStats.cpp | 60 +++++++++++++++++------- libraries/voxels/src/VoxelSceneStats.h | 7 ++- libraries/voxels/src/VoxelTree.cpp | 3 ++ voxel-server/src/main.cpp | 8 ++-- 6 files changed, 86 insertions(+), 20 deletions(-) diff --git a/libraries/voxels/src/VoxelNode.cpp b/libraries/voxels/src/VoxelNode.cpp index 1268449ac6..34eb2b2261 100644 --- a/libraries/voxels/src/VoxelNode.cpp +++ b/libraries/voxels/src/VoxelNode.cpp @@ -44,6 +44,8 @@ void VoxelNode::init(unsigned char * octalCode) { _children[i] = NULL; } _childCount = 0; + _subtreeNodeCount = 1; // that's me + _subtreeLeafNodeCount = 0; // that's me _glBufferIndex = GLBUFFER_INDEX_UNKNOWN; _isDirty = true; @@ -79,6 +81,24 @@ void VoxelNode::handleSubtreeChanged(VoxelTree* myTree) { if (myTree->getShouldReaverage()) { setColorFromAverageOfChildren(); } + + recalculateSubTreeNodeCount(); +} + +void VoxelNode::recalculateSubTreeNodeCount() { + // Assuming the tree below me as changed, I need to recalculate my node count + _subtreeNodeCount = 1; // that's me + if (isLeaf()) { + _subtreeLeafNodeCount = 1; + } else { + _subtreeLeafNodeCount = 0; + for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { + if (_children[i]) { + _subtreeNodeCount += _children[i]->_subtreeNodeCount; + _subtreeLeafNodeCount += _children[i]->_subtreeLeafNodeCount; + } + } + } } diff --git a/libraries/voxels/src/VoxelNode.h b/libraries/voxels/src/VoxelNode.h index 431592c2f9..c84ce3c7d6 100644 --- a/libraries/voxels/src/VoxelNode.h +++ b/libraries/voxels/src/VoxelNode.h @@ -107,6 +107,12 @@ public: static int addDeleteHook(VoxelNodeDeleteHook hook, void* extraData = NULL); static void removeDeleteHook(int hookID); + + void recalculateSubTreeNodeCount(); + unsigned long getSubTreeNodeCount() const { return _subtreeNodeCount; }; + unsigned long getSubTreeInternalNodeCount() const { return _subtreeNodeCount - _subtreeLeafNodeCount; }; + unsigned long getSubTreeLeafNodeCount() const { return _subtreeLeafNodeCount; }; + private: void calculateAABox(); void init(unsigned char * octalCode); @@ -126,6 +132,8 @@ private: unsigned char* _octalCode; VoxelNode* _children[8]; int _childCount; + unsigned long _subtreeNodeCount; + unsigned long _subtreeLeafNodeCount; float _density; // If leaf: density = 1, if internal node: 0-1 density of voxels inside static VoxelNodeDeleteHook _hooks[VOXEL_NODE_MAX_DELETE_HOOKS]; diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 199068101e..d00f746009 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -21,9 +21,13 @@ VoxelSceneStats::VoxelSceneStats() { VoxelSceneStats::~VoxelSceneStats() { } -void VoxelSceneStats::sceneStarted(bool fullScene, bool moving) { - _start = usecTimestampNow(); +void VoxelSceneStats::sceneStarted(bool fullScene, bool moving, VoxelNode* root) { reset(); // resets packet and voxel stats + _start = usecTimestampNow(); + _totalVoxels = root->getSubTreeNodeCount(); + _totalInternal = root->getSubTreeInternalNodeCount(); + _totalLeaves = root->getSubTreeLeafNodeCount(); + _fullSceneDraw = fullScene; _moving = moving; } @@ -53,6 +57,10 @@ void VoxelSceneStats::reset() { _bytes = 0; _passes = 0; + _totalVoxels = 0; + _totalInternal = 0; + _totalLeaves = 0; + _traversed = 0; _internal = 0; _leaves = 0; @@ -214,6 +222,10 @@ int VoxelSceneStats::packIntoMessage(unsigned char* destinationBuffer, int avail memcpy(destinationBuffer, &_bytes, sizeof(_bytes)); destinationBuffer += sizeof(_bytes); + memcpy(destinationBuffer, &_totalInternal, sizeof(_totalInternal)); + destinationBuffer += sizeof(_totalInternal); + memcpy(destinationBuffer, &_totalLeaves, sizeof(_totalLeaves)); + destinationBuffer += sizeof(_totalLeaves); memcpy(destinationBuffer, &_internal, sizeof(_internal)); destinationBuffer += sizeof(_internal); memcpy(destinationBuffer, &_leaves, sizeof(_leaves)); @@ -281,12 +293,19 @@ int VoxelSceneStats::unpackFromMessage(unsigned char* sourceBuffer, int availabl sourceBuffer += sizeof(_packets); memcpy(&_bytes, sourceBuffer, sizeof(_bytes)); sourceBuffer += sizeof(_bytes); + + memcpy(&_totalInternal, sourceBuffer, sizeof(_totalInternal)); + sourceBuffer += sizeof(_totalInternal); + memcpy(&_totalLeaves, sourceBuffer, sizeof(_totalLeaves)); + sourceBuffer += sizeof(_totalLeaves); + _totalVoxels = _totalInternal + _totalLeaves; + memcpy(&_internal, sourceBuffer, sizeof(_internal)); sourceBuffer += sizeof(_internal); memcpy(&_leaves, sourceBuffer, sizeof(_leaves)); sourceBuffer += sizeof(_leaves); _traversed = _internal + _leaves; - + memcpy(&_internalSkippedDistance, sourceBuffer, sizeof(_internalSkippedDistance)); sourceBuffer += sizeof(_internalSkippedDistance); memcpy(&_leavesSkippedDistance, sourceBuffer, sizeof(_leavesSkippedDistance)); @@ -356,6 +375,9 @@ void VoxelSceneStats::printDebugDetails() { qDebug(" packets: %d\n", _packets); qDebug(" bytes : %ld\n", _bytes); qDebug("\n"); + qDebug(" total voxels : %lu\n", _totalVoxels ); + qDebug(" internal : %lu\n", _totalInternal ); + qDebug(" leaves : %lu\n", _totalLeaves ); qDebug(" traversed : %lu\n", _traversed ); qDebug(" internal : %lu\n", _internal ); qDebug(" leaves : %lu\n", _leaves ); @@ -393,18 +415,19 @@ VoxelSceneStats::ItemInfo VoxelSceneStats::_ITEMS[] = { { "Elapsed" , 0x40ff40d0 }, { "Encode" , 0xffef40c0 }, { "Network" , 0xd0d0d0a0 }, - { "Voxels Sent" , 0x40ff40d0 }, - { "Colors Sent" , 0xffef40c0 }, - { "Bitmasks Sent" , 0xd0d0d0a0 }, - { "Traversed" , 0x40ff40d0 }, - { "Skipped - Total" , 0xffef40c0 }, - { "Skipped - Distance" , 0xd0d0d0a0 }, - { "Skipped - Out of View", 0x40ff40d0 }, - { "Skipped - Was in View", 0xffef40c0 }, - { "Skipped - No Change" , 0xd0d0d0a0 }, - { "Skipped - Occluded" , 0x40ff40d0 }, - { "Didn't fit in packet" , 0xffef40c0 }, - { "Mode" , 0xd0d0d0a0 }, + { "Voxels on Server" , 0x40ff40d0 }, + { "Voxels Sent" , 0xffef40c0 }, + { "Colors Sent" , 0xd0d0d0a0 }, + { "Bitmasks Sent" , 0x40ff40d0 }, + { "Traversed" , 0xffef40c0 }, + { "Skipped - Total" , 0xd0d0d0a0 }, + { "Skipped - Distance" , 0x40ff40d0 }, + { "Skipped - Out of View", 0xffef40c0 }, + { "Skipped - Was in View", 0xd0d0d0a0 }, + { "Skipped - No Change" , 0x40ff40d0 }, + { "Skipped - Occluded" , 0xffef40c0 }, + { "Didn't fit in packet" , 0xd0d0d0a0 }, + { "Mode" , 0x40ff40d0 }, }; char* VoxelSceneStats::getItemValue(int item) { @@ -426,10 +449,15 @@ char* VoxelSceneStats::getItemValue(int item) { sprintf(_itemValueBuffer, "%d packets %lu bytes (%d kbps)", _packets, _bytes, calculatedKBPS); break; } + case ITEM_VOXELS_SERVER: { + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + _totalVoxels, _totalInternal, _totalLeaves); + break; + } case ITEM_VOXELS: { unsigned long total = _existsInPacketBitsWritten + _colorSent; float calculatedBPV = total == 0 ? 0 : (_bytes * 8) / total; - sprintf(_itemValueBuffer, "%lu total (%.2f bits/voxel) %lu internal %lu leaves", + sprintf(_itemValueBuffer, "%lu (%.2f bits/voxel) %lu internal %lu leaves", total, calculatedBPV, _existsInPacketBitsWritten, _colorSent); break; } diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index fb7931e6e7..dbf60d3d67 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -19,7 +19,7 @@ public: VoxelSceneStats(); ~VoxelSceneStats(); void reset(); - void sceneStarted(bool fullScene, bool moving); + void sceneStarted(bool fullScene, bool moving, VoxelNode* root); void sceneCompleted(); void printDebugDetails(); @@ -53,6 +53,7 @@ public: ITEM_ELAPSED, ITEM_ENCODE, ITEM_PACKETS, + ITEM_VOXELS_SERVER, ITEM_VOXELS, ITEM_COLORS, ITEM_BITS, @@ -91,6 +92,10 @@ private: uint64_t _encodeStart; // scene voxel related data + unsigned long _totalVoxels; + unsigned long _totalInternal; + unsigned long _totalLeaves; + unsigned long _traversed; unsigned long _internal; unsigned long _leaves; diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 11297313f8..362df3b3f7 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -673,6 +673,9 @@ void VoxelTree::reaverageVoxelColors(VoxelNode *startNode) { if (hasChildren && !startNode->collapseIdenticalLeaves()) { startNode->setColorFromAverageOfChildren(); } + + // this is also a good time to recalculateSubTreeNodeCount() + startNode->recalculateSubTreeNodeCount(); } } diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 6244ee190d..e995012bef 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -250,7 +250,7 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, // start tracking our stats bool fullScene = (!viewFrustumChanged || !nodeData->getWantDelta()) && nodeData->getViewFrustumJustStoppedChanging(); - nodeData->stats.sceneStarted(fullScene, viewFrustumChanged); + nodeData->stats.sceneStarted(fullScene, viewFrustumChanged, ::serverTree.rootNode); } // If we have something in our nodeBag, then turn them into packets and send them out... @@ -486,8 +486,10 @@ int main(int argc, const char * argv[]) { ::serverTree.clearDirtyBit(); // the tree is clean since we just loaded it printf("DONE loading voxels from file... fileRead=%s\n", debug::valueOf(persistantFileRead)); - unsigned long nodeCount = ::serverTree.getVoxelCount(); - printf("Nodes after loading scene %ld nodes\n", nodeCount); + unsigned long nodeCount = ::serverTree.rootNode->getSubTreeNodeCount(); + unsigned long internalNodeCount = ::serverTree.rootNode->getSubTreeInternalNodeCount(); + unsigned long leafNodeCount = ::serverTree.rootNode->getSubTreeLeafNodeCount(); + printf("Nodes after loading scene %lu nodes %lu internal %lu leaves\n", nodeCount, internalNodeCount, leafNodeCount); } // Check to see if the user passed in a command line option for loading an old style local From c3fa37019eff9156c29d9b9105ab3bbe4f89eee5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sun, 21 Jul 2013 05:18:35 -0700 Subject: [PATCH 17/32] replaced old voxel stats with new voxel stats --- interface/src/Application.cpp | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 784954710b..0c7820d673 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2865,27 +2865,19 @@ void Application::displayStats() { drawtext(10, statsVerticalOffset + 230, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); voxelStats.str(""); - voxelStats << "Voxels Created: " << _voxels.getVoxelsCreated() / 1000.f << "K (" << _voxels.getVoxelsCreatedPerSecondAverage() / 1000.f - << "Kps) "; + char* voxelDetails = _voxelSceneStats.getItemValue(VoxelSceneStats::ITEM_VOXELS); + voxelStats << "Voxels Sent from Server: " << voxelDetails; drawtext(10, statsVerticalOffset + 250, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); - - voxelStats.str(""); - voxelStats << "Voxels Colored: " << _voxels.getVoxelsColored() / 1000.f << "K (" << _voxels.getVoxelsColoredPerSecondAverage() / 1000.f - << "Kps) "; - drawtext(10, statsVerticalOffset + 270, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); - - voxelStats.str(""); - voxelStats << "Voxel Bits Read: " << _voxels.getVoxelsBytesRead() * 8.f / 1000000.f - << "M (" << _voxels.getVoxelsBytesReadPerSecondAverage() * 8.f / 1000000.f << " Mbps)"; - drawtext(10, statsVerticalOffset + 290,0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); voxelStats.str(""); - float voxelsBytesPerColored = _voxels.getVoxelsColored() - ? ((float) _voxels.getVoxelsBytesRead() / _voxels.getVoxelsColored()) - : 0; - - voxelStats << "Voxels Bits per Colored: " << voxelsBytesPerColored * 8; - drawtext(10, statsVerticalOffset + 310, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); + voxelDetails = _voxelSceneStats.getItemValue(VoxelSceneStats::ITEM_ELAPSED); + voxelStats << "Scene Send Time from Server: " << voxelDetails; + drawtext(10, statsVerticalOffset + 270, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); + + voxelStats.str(""); + voxelDetails = _voxelSceneStats.getItemValue(VoxelSceneStats::ITEM_ENCODE); + voxelStats << "Encode Time on Server: " << voxelDetails; + drawtext(10, statsVerticalOffset + 290, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); Node *avatarMixer = NodeList::getInstance()->soloNodeOfType(NODE_TYPE_AVATAR_MIXER); char avatarMixerStats[200]; From 70c6ed040cbaf04f0601c7bd0f674a16df7d357b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sun, 21 Jul 2013 07:21:23 -0700 Subject: [PATCH 18/32] added averages for bits per voxel and elapsed time --- libraries/voxels/src/VoxelSceneStats.cpp | 40 +++++++++++++++++------- libraries/voxels/src/VoxelSceneStats.h | 4 +++ 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index d00f746009..c38057ec89 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -13,9 +13,10 @@ #include "VoxelSceneStats.h" -VoxelSceneStats::VoxelSceneStats() { +VoxelSceneStats::VoxelSceneStats() : _elapsedAverage(100), _bitsPerVoxelAverage(100) { reset(); _readyToSend = false; + _started = false; } VoxelSceneStats::~VoxelSceneStats() { @@ -23,6 +24,7 @@ VoxelSceneStats::~VoxelSceneStats() { void VoxelSceneStats::sceneStarted(bool fullScene, bool moving, VoxelNode* root) { reset(); // resets packet and voxel stats + _started = true; _start = usecTimestampNow(); _totalVoxels = root->getSubTreeNodeCount(); _totalInternal = root->getSubTreeInternalNodeCount(); @@ -33,11 +35,15 @@ void VoxelSceneStats::sceneStarted(bool fullScene, bool moving, VoxelNode* root) } void VoxelSceneStats::sceneCompleted() { - _end = usecTimestampNow(); - _elapsed = _end - _start; + if (_started) { + _end = usecTimestampNow(); + _elapsed = _end - _start; + _elapsedAverage.updateAverage((float)_elapsed); - _statsMessageLength = packIntoMessage(_statsMessage, sizeof(_statsMessage)); - _readyToSend = true; + _statsMessageLength = packIntoMessage(_statsMessage, sizeof(_statsMessage)); + _readyToSend = true; + _started = false; + } } void VoxelSceneStats::encodeStarted() { @@ -356,6 +362,13 @@ int VoxelSceneStats::unpackFromMessage(unsigned char* sourceBuffer, int availabl sourceBuffer += sizeof(_existsInPacketBitsWritten); memcpy(&_treesRemoved, sourceBuffer, sizeof(_treesRemoved)); sourceBuffer += sizeof(_treesRemoved); + + // running averages + _elapsedAverage.updateAverage((float)_elapsed); + unsigned long total = _existsInPacketBitsWritten + _colorSent; + float calculatedBPV = total == 0 ? 0 : (_bytes * 8) / total; + _bitsPerVoxelAverage.updateAverage(calculatedBPV); + return sourceBuffer - startPosition; // includes header! } @@ -432,13 +445,17 @@ VoxelSceneStats::ItemInfo VoxelSceneStats::_ITEMS[] = { char* VoxelSceneStats::getItemValue(int item) { const uint64_t USECS_PER_SECOND = 1000 * 1000; - int calcFPS; - int calculatedKBPS; + int calcFPS, calcAverageFPS, calculatedKBPS; switch(item) { - case ITEM_ELAPSED: + case ITEM_ELAPSED: { calcFPS = (float)USECS_PER_SECOND / (float)_elapsed; - sprintf(_itemValueBuffer, "%llu usecs (%d fps)", _elapsed, calcFPS); + float elapsedAverage = _elapsedAverage.getAverage(); + calcAverageFPS = (float)USECS_PER_SECOND / (float)elapsedAverage; + + sprintf(_itemValueBuffer, "%llu usecs (%d fps) Average: %.0f usecs (%d fps)", + _elapsed, calcFPS, elapsedAverage, calcAverageFPS); break; + } case ITEM_ENCODE: calcFPS = (float)USECS_PER_SECOND / (float)_totalEncodeTime; sprintf(_itemValueBuffer, "%llu usecs (%d fps)", _totalEncodeTime, calcFPS); @@ -457,8 +474,9 @@ char* VoxelSceneStats::getItemValue(int item) { case ITEM_VOXELS: { unsigned long total = _existsInPacketBitsWritten + _colorSent; float calculatedBPV = total == 0 ? 0 : (_bytes * 8) / total; - sprintf(_itemValueBuffer, "%lu (%.2f bits/voxel) %lu internal %lu leaves", - total, calculatedBPV, _existsInPacketBitsWritten, _colorSent); + float averageBPV = _bitsPerVoxelAverage.getAverage(); + sprintf(_itemValueBuffer, "%lu (%.2f bits/voxel Average: %.2f bits/voxel) %lu internal %lu leaves", + total, calculatedBPV, averageBPV, _existsInPacketBitsWritten, _colorSent); break; } case ITEM_TRAVERSED: { diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index dbf60d3d67..bf7b38f988 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -84,9 +84,13 @@ private: int _statsMessageLength; // scene timing data in usecs + bool _started; uint64_t _start; uint64_t _end; uint64_t _elapsed; + + SimpleMovingAverage _elapsedAverage; + SimpleMovingAverage _bitsPerVoxelAverage; uint64_t _totalEncodeTime; uint64_t _encodeStart; From 307cfcc7a295f1660c1f8b972b8e2da33d6e0998 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 22 Jul 2013 13:58:15 -0700 Subject: [PATCH 19/32] CR feedback --- interface/src/ui/VoxelStatsDialog.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/src/ui/VoxelStatsDialog.h b/interface/src/ui/VoxelStatsDialog.h index 1d30ec8881..eab5b6a45a 100644 --- a/interface/src/ui/VoxelStatsDialog.h +++ b/interface/src/ui/VoxelStatsDialog.h @@ -17,7 +17,6 @@ class VoxelStatsDialog : public QDialog { Q_OBJECT public: - // Sets up the UI VoxelStatsDialog(QWidget* parent, VoxelSceneStats* model); @@ -25,11 +24,9 @@ signals: void closed(); public slots: - void reject(); protected: - // State <- data model held by BandwidthMeter void paintEvent(QPaintEvent*); From d3c46cce8fd07fd1b511ed5306f4be22247ea14b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 22 Jul 2013 14:01:47 -0700 Subject: [PATCH 20/32] CR feedback --- interface/src/ui/VoxelStatsDialog.cpp | 4 +++- libraries/voxels/src/VoxelSceneStats.cpp | 1 + libraries/voxels/src/VoxelSceneStats.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/VoxelStatsDialog.cpp b/interface/src/ui/VoxelStatsDialog.cpp index 8ab7df3ddd..bfe93ec119 100644 --- a/interface/src/ui/VoxelStatsDialog.cpp +++ b/interface/src/ui/VoxelStatsDialog.cpp @@ -38,7 +38,9 @@ VoxelStatsDialog::VoxelStatsDialog(QWidget* parent, VoxelSceneStats* model) : // Set foreground color to 62.5% brightness of the meter (otherwise will be hard to read on the bright background) QPalette palette = label->palette(); unsigned rgb = itemInfo.colorRGBA >> 8; - rgb = ((rgb & 0xfefefeu) >> 1) + ((rgb & 0xf8f8f8) >> 3); + const unsigned colorpart1 = 0xfefefeu; + const unsigned colorpart2 = 0xf8f8f8; + rgb = ((rgb & colorpart1) >> 1) + ((rgb & colorpart2) >> 3); palette.setColor(QPalette::WindowText, QColor::fromRgb(rgb)); label->setPalette(palette); diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index c38057ec89..256d374171 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -3,6 +3,7 @@ // hifi // // Created by Brad Hefta-Gaub on 7/18/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. // // diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index bf7b38f988..c738d14d0f 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -3,6 +3,7 @@ // hifi // // Created by Brad Hefta-Gaub on 7/18/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. // // From 70516c8cb4f2ebfe0d8d1c71ff2fd46c1ac950b8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 22 Jul 2013 14:08:48 -0700 Subject: [PATCH 21/32] CR feedback --- libraries/voxels/src/VoxelSceneStats.cpp | 47 ++++++++++++------------ libraries/voxels/src/VoxelSceneStats.h | 7 ++-- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 256d374171..4f725193da 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -14,36 +14,37 @@ #include "VoxelSceneStats.h" -VoxelSceneStats::VoxelSceneStats() : _elapsedAverage(100), _bitsPerVoxelAverage(100) { +const int samples = 100; +VoxelSceneStats::VoxelSceneStats() : + _elapsedAverage(samples), + _bitsPerVoxelAverage(samples) +{ reset(); _readyToSend = false; - _started = false; + _isStarted = false; } -VoxelSceneStats::~VoxelSceneStats() { -} - -void VoxelSceneStats::sceneStarted(bool fullScene, bool moving, VoxelNode* root) { +void VoxelSceneStats::sceneStarted(bool isFullScene, bool isMoving, VoxelNode* root) { reset(); // resets packet and voxel stats - _started = true; + _isStarted = true; _start = usecTimestampNow(); _totalVoxels = root->getSubTreeNodeCount(); _totalInternal = root->getSubTreeInternalNodeCount(); _totalLeaves = root->getSubTreeLeafNodeCount(); - _fullSceneDraw = fullScene; - _moving = moving; + _isFullScene = isFullScene; + _isMoving = isMoving; } void VoxelSceneStats::sceneCompleted() { - if (_started) { + if (_isStarted) { _end = usecTimestampNow(); _elapsed = _end - _start; _elapsedAverage.updateAverage((float)_elapsed); _statsMessageLength = packIntoMessage(_statsMessage, sizeof(_statsMessage)); _readyToSend = true; - _started = false; + _isStarted = false; } } @@ -220,10 +221,10 @@ int VoxelSceneStats::packIntoMessage(unsigned char* destinationBuffer, int avail destinationBuffer += sizeof(_elapsed); memcpy(destinationBuffer, &_totalEncodeTime, sizeof(_totalEncodeTime)); destinationBuffer += sizeof(_totalEncodeTime); - memcpy(destinationBuffer, &_fullSceneDraw, sizeof(_fullSceneDraw)); - destinationBuffer += sizeof(_fullSceneDraw); - memcpy(destinationBuffer, &_moving, sizeof(_moving)); - destinationBuffer += sizeof(_moving); + memcpy(destinationBuffer, &_isFullScene, sizeof(_isFullScene)); + destinationBuffer += sizeof(_isFullScene); + memcpy(destinationBuffer, &_isMoving, sizeof(_isMoving)); + destinationBuffer += sizeof(_isMoving); memcpy(destinationBuffer, &_packets, sizeof(_packets)); destinationBuffer += sizeof(_packets); memcpy(destinationBuffer, &_bytes, sizeof(_bytes)); @@ -292,10 +293,10 @@ int VoxelSceneStats::unpackFromMessage(unsigned char* sourceBuffer, int availabl sourceBuffer += sizeof(_elapsed); memcpy(&_totalEncodeTime, sourceBuffer, sizeof(_totalEncodeTime)); sourceBuffer += sizeof(_totalEncodeTime); - memcpy(&_fullSceneDraw, sourceBuffer, sizeof(_fullSceneDraw)); - sourceBuffer += sizeof(_fullSceneDraw); - memcpy(&_moving, sourceBuffer, sizeof(_moving)); - sourceBuffer += sizeof(_moving); + memcpy(&_isFullScene, sourceBuffer, sizeof(_isFullScene)); + sourceBuffer += sizeof(_isFullScene); + memcpy(&_isMoving, sourceBuffer, sizeof(_isMoving)); + sourceBuffer += sizeof(_isMoving); memcpy(&_packets, sourceBuffer, sizeof(_packets)); sourceBuffer += sizeof(_packets); memcpy(&_bytes, sourceBuffer, sizeof(_bytes)); @@ -383,8 +384,8 @@ void VoxelSceneStats::printDebugDetails() { qDebug(" elapsed : %llu \n", _elapsed); qDebug(" encoding : %llu \n", _totalEncodeTime); qDebug("\n"); - qDebug(" full scene: %s\n", debug::valueOf(_fullSceneDraw)); - qDebug(" moving: %s\n", debug::valueOf(_moving)); + qDebug(" full scene: %s\n", debug::valueOf(_isFullScene)); + qDebug(" moving: %s\n", debug::valueOf(_isMoving)); qDebug("\n"); qDebug(" packets: %d\n", _packets); qDebug(" bytes : %ld\n", _bytes); @@ -540,8 +541,8 @@ char* VoxelSceneStats::getItemValue(int item) { break; } case ITEM_MODE: { - sprintf(_itemValueBuffer, "%s - %s", (_fullSceneDraw ? "Full Scene" : "Partial Scene"), - (_moving ? "Moving" : "Stationary")); + sprintf(_itemValueBuffer, "%s - %s", (_isFullScene ? "Full Scene" : "Partial Scene"), + (_isMoving ? "Moving" : "Stationary")); break; } default: diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index c738d14d0f..2bf71d7440 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -18,7 +18,6 @@ class VoxelNode; class VoxelSceneStats { public: VoxelSceneStats(); - ~VoxelSceneStats(); void reset(); void sceneStarted(bool fullScene, bool moving, VoxelNode* root); void sceneCompleted(); @@ -85,7 +84,7 @@ private: int _statsMessageLength; // scene timing data in usecs - bool _started; + bool _isStarted; uint64_t _start; uint64_t _end; uint64_t _elapsed; @@ -159,8 +158,8 @@ private: unsigned int _passes; // features related items - bool _moving; - bool _fullSceneDraw; + bool _isMoving; + bool _isFullScene; static ItemInfo _ITEMS[]; From 8186145d3510ae6dd63c7cd3357507cc9cab3bf6 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 22 Jul 2013 14:09:29 -0700 Subject: [PATCH 22/32] CR feedback --- libraries/voxels/src/VoxelSceneStats.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 4f725193da..2e12684dfb 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -56,7 +56,6 @@ void VoxelSceneStats::encodeStopped() { _totalEncodeTime += (usecTimestampNow() - _encodeStart); } - void VoxelSceneStats::reset() { _totalEncodeTime = 0; _encodeStart = 0; From 60750d1d804351dd5ebde3a47da647f184a253e2 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 22 Jul 2013 14:13:10 -0700 Subject: [PATCH 23/32] CR feedback --- libraries/voxels/src/VoxelSceneStats.cpp | 35 +++++++++++++----------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 2e12684dfb..0f22352eb9 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -424,24 +424,27 @@ void VoxelSceneStats::printDebugDetails() { qDebug(" trees removed : %lu\n", _treesRemoved ); } +const unsigned greenish = 0x40ff40d0; +const unsigned yellowish = 0xffef40c0; +const unsigned greyish = 0xd0d0d0a0; VoxelSceneStats::ItemInfo VoxelSceneStats::_ITEMS[] = { - { "Elapsed" , 0x40ff40d0 }, - { "Encode" , 0xffef40c0 }, - { "Network" , 0xd0d0d0a0 }, - { "Voxels on Server" , 0x40ff40d0 }, - { "Voxels Sent" , 0xffef40c0 }, - { "Colors Sent" , 0xd0d0d0a0 }, - { "Bitmasks Sent" , 0x40ff40d0 }, - { "Traversed" , 0xffef40c0 }, - { "Skipped - Total" , 0xd0d0d0a0 }, - { "Skipped - Distance" , 0x40ff40d0 }, - { "Skipped - Out of View", 0xffef40c0 }, - { "Skipped - Was in View", 0xd0d0d0a0 }, - { "Skipped - No Change" , 0x40ff40d0 }, - { "Skipped - Occluded" , 0xffef40c0 }, - { "Didn't fit in packet" , 0xd0d0d0a0 }, - { "Mode" , 0x40ff40d0 }, + { "Elapsed" , greenish }, + { "Encode" , yellowish }, + { "Network" , greyish }, + { "Voxels on Server" , greenish }, + { "Voxels Sent" , yellowish }, + { "Colors Sent" , greyish }, + { "Bitmasks Sent" , greenish }, + { "Traversed" , yellowish }, + { "Skipped - Total" , greyish }, + { "Skipped - Distance" , greenish }, + { "Skipped - Out of View", yellowish }, + { "Skipped - Was in View", greyish }, + { "Skipped - No Change" , greenish }, + { "Skipped - Occluded" , yellowish }, + { "Didn't fit in packet" , greyish }, + { "Mode" , greenish }, }; char* VoxelSceneStats::getItemValue(int item) { From 86aeaf175c61cdc747437bed15bd366e85e9711c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 22 Jul 2013 14:15:10 -0700 Subject: [PATCH 24/32] CR feedback --- voxel-server/src/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index e995012bef..c02211f182 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -249,8 +249,8 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, nodeData->nodeBag.insert(serverTree.rootNode); // start tracking our stats - bool fullScene = (!viewFrustumChanged || !nodeData->getWantDelta()) && nodeData->getViewFrustumJustStoppedChanging(); - nodeData->stats.sceneStarted(fullScene, viewFrustumChanged, ::serverTree.rootNode); + bool isFullScene = (!viewFrustumChanged || !nodeData->getWantDelta()) && nodeData->getViewFrustumJustStoppedChanging(); + nodeData->stats.sceneStarted(isFullScene, viewFrustumChanged, ::serverTree.rootNode); } // If we have something in our nodeBag, then turn them into packets and send them out... @@ -284,14 +284,14 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, int boundaryLevelAdjust = viewFrustumChanged && nodeData->getWantLowResMoving() ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST; - bool fullScene = (!viewFrustumChanged || !nodeData->getWantDelta()) && + bool isFullScene = (!viewFrustumChanged || !nodeData->getWantDelta()) && nodeData->getViewFrustumJustStoppedChanging(); EncodeBitstreamParams params(INT_MAX, &nodeData->getCurrentViewFrustum(), wantColor, WANT_EXISTS_BITS, DONT_CHOP, wantDelta, lastViewFrustum, wantOcclusionCulling, coverageMap, boundaryLevelAdjust, nodeData->getLastTimeBagEmpty(), - fullScene, &nodeData->stats); + isFullScene, &nodeData->stats); nodeData->stats.encodeStarted(); bytesWritten = serverTree.encodeTreeBitstream(subTree, &tempOutputBuffer[0], MAX_VOXEL_PACKET_SIZE - 1, From f4749aa916aad4b7921174e61bc347b81eebb08c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 22 Jul 2013 14:17:18 -0700 Subject: [PATCH 25/32] CR feedback --- libraries/voxels/src/VoxelSceneStats.cpp | 4 ++-- libraries/voxels/src/VoxelSceneStats.h | 6 +++--- voxel-server/src/main.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/voxels/src/VoxelSceneStats.cpp b/libraries/voxels/src/VoxelSceneStats.cpp index 0f22352eb9..b226886a25 100644 --- a/libraries/voxels/src/VoxelSceneStats.cpp +++ b/libraries/voxels/src/VoxelSceneStats.cpp @@ -20,7 +20,7 @@ VoxelSceneStats::VoxelSceneStats() : _bitsPerVoxelAverage(samples) { reset(); - _readyToSend = false; + _isReadyToSend = false; _isStarted = false; } @@ -43,7 +43,7 @@ void VoxelSceneStats::sceneCompleted() { _elapsedAverage.updateAverage((float)_elapsed); _statsMessageLength = packIntoMessage(_statsMessage, sizeof(_statsMessage)); - _readyToSend = true; + _isReadyToSend = true; _isStarted = false; } } diff --git a/libraries/voxels/src/VoxelSceneStats.h b/libraries/voxels/src/VoxelSceneStats.h index 2bf71d7440..ded2061a6e 100644 --- a/libraries/voxels/src/VoxelSceneStats.h +++ b/libraries/voxels/src/VoxelSceneStats.h @@ -44,8 +44,8 @@ public: int packIntoMessage(unsigned char* destinationBuffer, int availableBytes); int unpackFromMessage(unsigned char* sourceBuffer, int availableBytes); - bool readyToSend() const { return _readyToSend; } - void markAsSent() { _readyToSend = false; } + bool isReadyToSend() const { return _isReadyToSend; } + void markAsSent() { _isReadyToSend = false; } unsigned char* getStatsMessage() { return &_statsMessage[0]; } int getStatsMessageLength() const { return _statsMessageLength; } @@ -79,7 +79,7 @@ public: char* getItemValue(int item); private: - bool _readyToSend; + bool _isReadyToSend; unsigned char _statsMessage[MAX_PACKET_SIZE]; int _statsMessageLength; diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index c02211f182..c009eec2a5 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -117,7 +117,7 @@ void handlePacketSend(NodeList* nodeList, VoxelNodeData* nodeData, int& trueBytesSent, int& truePacketsSent) { // If we've got a stats message ready to send, then see if we can piggyback them together - if (nodeData->stats.readyToSend()) { + if (nodeData->stats.isReadyToSend()) { // Send the stats message to the client unsigned char* statsMessage = nodeData->stats.getStatsMessage(); int statsMessageLength = nodeData->stats.getStatsMessageLength(); From d5e62b0f5af4f589677e1e2e3d5843dc1c1bac22 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 22 Jul 2013 14:18:16 -0700 Subject: [PATCH 26/32] CR feedback --- libraries/voxels/src/VoxelTree.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 362df3b3f7..b26a70f34b 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -1300,8 +1300,9 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp } // wants occlusion culling & isLeaf() - bool shouldRender = !params.viewFrustum ? true : - childNode->calculateShouldRender(params.viewFrustum, params.boundaryLevelAdjust); + bool shouldRender = !params.viewFrustum + ? true + : childNode->calculateShouldRender(params.viewFrustum, params.boundaryLevelAdjust); // track some stats if (params.stats) { From e4169665a91333266a94f3340bd7279e01e876cc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 23 Jul 2013 20:23:32 -0700 Subject: [PATCH 27/32] changes to CMakeLists to up to qt5 --- cmake/macros/SetupHifiLibrary.cmake | 3 ++- cmake/macros/SetupHifiProject.cmake | 2 +- interface/CMakeLists.txt | 6 +++--- interface/external/fervor/CMakeLists.txt | 6 +++--- libraries/avatars/CMakeLists.txt | 4 ++++ libraries/shared/CMakeLists.txt | 4 ++++ 6 files changed, 17 insertions(+), 8 deletions(-) diff --git a/cmake/macros/SetupHifiLibrary.cmake b/cmake/macros/SetupHifiLibrary.cmake index b7d0af7499..c6a84e1838 100644 --- a/cmake/macros/SetupHifiLibrary.cmake +++ b/cmake/macros/SetupHifiLibrary.cmake @@ -3,11 +3,12 @@ MACRO(SETUP_HIFI_LIBRARY TARGET) # grab the implemenation and header files file(GLOB LIB_SRCS src/*.h src/*.cpp) + set(LIB_SRCS ${LIB_SRCS} ${WRAPPED_SRCS}) # create a library and set the property so it can be referenced later add_library(${TARGET} ${LIB_SRCS}) - find_package(Qt4 REQUIRED QtCore) + find_package(Qt5 REQUIRED QtCore) include(${QT_USE_FILE}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${QT_QTGUI_INCLUDE_DIR}") diff --git a/cmake/macros/SetupHifiProject.cmake b/cmake/macros/SetupHifiProject.cmake index 8360dc66b6..80ced2ab73 100644 --- a/cmake/macros/SetupHifiProject.cmake +++ b/cmake/macros/SetupHifiProject.cmake @@ -8,7 +8,7 @@ MACRO(SETUP_HIFI_PROJECT TARGET INCLUDE_QT) add_executable(${TARGET} ${TARGET_SRCS}) IF (${INCLUDE_QT}) - find_package(Qt4 REQUIRED QtCore) + find_package(Qt5 REQUIRED QtCore) include(${QT_USE_FILE}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${QT_QTGUI_INCLUDE_DIR}") ENDIF() diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index ae87d53939..bc8949cbb6 100755 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -67,7 +67,7 @@ if (APPLE) endif (APPLE) -find_package(Qt4 REQUIRED QtCore QtGui QtNetwork QtOpenGL QtWebKit QtSvg) +find_package(Qt5 REQUIRED QtCore QtGui QtNetwork QtOpenGL QtWebKit QtSvg) include(${QT_USE_FILE}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${QT_QTGUI_INCLUDE_DIR}") @@ -76,8 +76,8 @@ add_subdirectory(external/fervor/) include_directories(external/fervor/) # run qt moc on qt-enabled headers -qt4_wrap_cpp(INTERFACE_SRCS src/Application.h src/Webcam.h src/avatar/AvatarVoxelSystem.h - src/avatar/Face.h src/ui/BandwidthDialog.h src/ui/VoxelStatsDialog.h) +qt5_wrap_cpp(INTERFACE_SRCS src/Application.h src/Webcam.h src/avatar/AvatarVoxelSystem.h + src/avatar/Face.h src/ui/BandwidthDialog.h src/ui/VoxelStatsDialog.h) # create the executable, make it a bundle on OS X add_executable(${TARGET_NAME} MACOSX_BUNDLE ${INTERFACE_SRCS}) diff --git a/interface/external/fervor/CMakeLists.txt b/interface/external/fervor/CMakeLists.txt index f257bb4431..9cba3816f8 100644 --- a/interface/external/fervor/CMakeLists.txt +++ b/interface/external/fervor/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 2.8) project(Fervor) -find_package(Qt4 REQUIRED) +find_package(Qt5 REQUIRED) add_definitions(-DFV_GUI) @@ -13,8 +13,8 @@ list(REMOVE_ITEM FERVOR_HEADERS ${HEADER_PATH}/fvversioncomparator.h) file(GLOB FERVOR_UI *.ui) -qt4_wrap_ui(FERVOR_WRAPPED_UI ${FERVOR_UI}) -qt4_wrap_cpp(FERVOR_MOC_SOURCES ${FERVOR_HEADERS}) +qt5_wrap_ui(FERVOR_WRAPPED_UI ${FERVOR_UI}) +qt5_wrap_cpp(FERVOR_MOC_SOURCES ${FERVOR_HEADERS}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/") find_package(Quazip REQUIRED) diff --git a/libraries/avatars/CMakeLists.txt b/libraries/avatars/CMakeLists.txt index 207057e244..5827f94ebb 100644 --- a/libraries/avatars/CMakeLists.txt +++ b/libraries/avatars/CMakeLists.txt @@ -8,6 +8,10 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../../cm set(TARGET_NAME avatars) +find_package(Qt5 REQUIRED QtCore) +include(${QT_USE_FILE}) +qt5_wrap_cpp(WRAPPED_SRCS src/AvatarData.h) + include(${MACRO_DIR}/SetupHifiLibrary.cmake) setup_hifi_library(${TARGET_NAME}) diff --git a/libraries/shared/CMakeLists.txt b/libraries/shared/CMakeLists.txt index cf1c603b7d..328221ba60 100644 --- a/libraries/shared/CMakeLists.txt +++ b/libraries/shared/CMakeLists.txt @@ -6,6 +6,10 @@ set(MACRO_DIR ${ROOT_DIR}/cmake/macros) set(TARGET_NAME shared) project(${TARGET_NAME}) +find_package(Qt5 REQUIRED QtCore) +include(${QT_USE_FILE}) +qt5_wrap_cpp(WRAPPED_SRCS src/NodeData.h) + include(${MACRO_DIR}/SetupHifiLibrary.cmake) setup_hifi_library(${TARGET_NAME}) From a8afaea542e991487f779e2f7e5cdcca2dfae001 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 23 Jul 2013 20:49:08 -0700 Subject: [PATCH 28/32] switch to new qt5 find module setup --- cmake/macros/SetupHifiLibrary.cmake | 2 +- cmake/macros/SetupHifiProject.cmake | 2 +- interface/CMakeLists.txt | 8 +++++++- interface/external/fervor/CMakeLists.txt | 2 +- libraries/avatars/CMakeLists.txt | 2 +- libraries/shared/CMakeLists.txt | 2 +- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/cmake/macros/SetupHifiLibrary.cmake b/cmake/macros/SetupHifiLibrary.cmake index c6a84e1838..fc6bd9117f 100644 --- a/cmake/macros/SetupHifiLibrary.cmake +++ b/cmake/macros/SetupHifiLibrary.cmake @@ -8,7 +8,7 @@ MACRO(SETUP_HIFI_LIBRARY TARGET) # create a library and set the property so it can be referenced later add_library(${TARGET} ${LIB_SRCS}) - find_package(Qt5 REQUIRED QtCore) + find_package(Qt5Core REQUIRED) include(${QT_USE_FILE}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${QT_QTGUI_INCLUDE_DIR}") diff --git a/cmake/macros/SetupHifiProject.cmake b/cmake/macros/SetupHifiProject.cmake index 80ced2ab73..27d768e3f5 100644 --- a/cmake/macros/SetupHifiProject.cmake +++ b/cmake/macros/SetupHifiProject.cmake @@ -8,7 +8,7 @@ MACRO(SETUP_HIFI_PROJECT TARGET INCLUDE_QT) add_executable(${TARGET} ${TARGET_SRCS}) IF (${INCLUDE_QT}) - find_package(Qt5 REQUIRED QtCore) + find_package(Qt5Core REQUIRED) include(${QT_USE_FILE}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${QT_QTGUI_INCLUDE_DIR}") ENDIF() diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index bc8949cbb6..ca99dda2f5 100755 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -67,7 +67,13 @@ if (APPLE) endif (APPLE) -find_package(Qt5 REQUIRED QtCore QtGui QtNetwork QtOpenGL QtWebKit QtSvg) +find_package(Qt5Core REQUIRED) +find_package(Qt5Gui REQUIRED) +find_package(Qt5Network REQUIRED) +find_package(Qt5OpenGL REQUIRED) +find_package(Qt5WebKit REQUIRED) +find_package(Qt5Svg REQUIRED) + include(${QT_USE_FILE}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${QT_QTGUI_INCLUDE_DIR}") diff --git a/interface/external/fervor/CMakeLists.txt b/interface/external/fervor/CMakeLists.txt index 9cba3816f8..111e69a865 100644 --- a/interface/external/fervor/CMakeLists.txt +++ b/interface/external/fervor/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 2.8) project(Fervor) -find_package(Qt5 REQUIRED) +find_package(QtCore QtNetwork REQUIRED) add_definitions(-DFV_GUI) diff --git a/libraries/avatars/CMakeLists.txt b/libraries/avatars/CMakeLists.txt index 5827f94ebb..8afbae145b 100644 --- a/libraries/avatars/CMakeLists.txt +++ b/libraries/avatars/CMakeLists.txt @@ -8,7 +8,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../../cm set(TARGET_NAME avatars) -find_package(Qt5 REQUIRED QtCore) +find_package(Qt5Core) include(${QT_USE_FILE}) qt5_wrap_cpp(WRAPPED_SRCS src/AvatarData.h) diff --git a/libraries/shared/CMakeLists.txt b/libraries/shared/CMakeLists.txt index 328221ba60..0dcf13f418 100644 --- a/libraries/shared/CMakeLists.txt +++ b/libraries/shared/CMakeLists.txt @@ -6,7 +6,7 @@ set(MACRO_DIR ${ROOT_DIR}/cmake/macros) set(TARGET_NAME shared) project(${TARGET_NAME}) -find_package(Qt5 REQUIRED QtCore) +find_package(Qt5Core REQUIRED) include(${QT_USE_FILE}) qt5_wrap_cpp(WRAPPED_SRCS src/NodeData.h) From 7fde47655e44417af634895849d0c69168742757 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 24 Jul 2013 11:28:42 -0700 Subject: [PATCH 29/32] add Makefiles to the gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index cebf9eb113..9dc509bc19 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ CMakeFiles/ CMakeScripts/ cmake_install.cmake build/ +Makefile # Xcode *.xcodeproj From 9f2b2d09a9cc399807955a8b050e25d8a69c41f2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 24 Jul 2013 11:29:12 -0700 Subject: [PATCH 30/32] changes to CMakeLists for Qt5 --- CMakeLists.txt | 7 +++++++ cmake/macros/SetupHifiLibrary.cmake | 3 +-- cmake/macros/SetupHifiProject.cmake | 3 +-- interface/CMakeLists.txt | 9 ++++----- interface/external/fervor/CMakeLists.txt | 11 ++++++----- interface/external/fervor/fvplatform.h | 2 +- libraries/avatars/CMakeLists.txt | 4 ++-- libraries/shared/CMakeLists.txt | 4 ++-- libraries/shared/src/NodeList.cpp | 2 +- 9 files changed, 25 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8af8081975..34392a7c5d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,13 @@ cmake_minimum_required(VERSION 2.8) project(hifi) +set(CMAKE_PREFIX_PATH "/usr/local/Cellar/qt5/5.1.0/lib/cmake") + +# Find includes in corresponding build directories +set(CMAKE_INCLUDE_CURRENT_DIR ON) +# Instruct CMake to run moc automatically when needed. +set(CMAKE_AUTOMOC ON) + add_subdirectory(animation-server) add_subdirectory(avatar-mixer) add_subdirectory(audio-mixer) diff --git a/cmake/macros/SetupHifiLibrary.cmake b/cmake/macros/SetupHifiLibrary.cmake index fc6bd9117f..79bf16e1a0 100644 --- a/cmake/macros/SetupHifiLibrary.cmake +++ b/cmake/macros/SetupHifiLibrary.cmake @@ -9,8 +9,7 @@ MACRO(SETUP_HIFI_LIBRARY TARGET) add_library(${TARGET} ${LIB_SRCS}) find_package(Qt5Core REQUIRED) - include(${QT_USE_FILE}) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${QT_QTGUI_INCLUDE_DIR}") + qt5_use_modules(${TARGET} Core) target_link_libraries(${TARGET} ${QT_LIBRARIES}) ENDMACRO(SETUP_HIFI_LIBRARY _target) \ No newline at end of file diff --git a/cmake/macros/SetupHifiProject.cmake b/cmake/macros/SetupHifiProject.cmake index 27d768e3f5..455ca89701 100644 --- a/cmake/macros/SetupHifiProject.cmake +++ b/cmake/macros/SetupHifiProject.cmake @@ -9,8 +9,7 @@ MACRO(SETUP_HIFI_PROJECT TARGET INCLUDE_QT) IF (${INCLUDE_QT}) find_package(Qt5Core REQUIRED) - include(${QT_USE_FILE}) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${QT_QTGUI_INCLUDE_DIR}") + qt5_use_modules(${TARGET} Core) ENDIF() target_link_libraries(${TARGET} ${QT_LIBRARIES}) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index ca99dda2f5..b5fd7f8895 100755 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -74,20 +74,19 @@ find_package(Qt5OpenGL REQUIRED) find_package(Qt5WebKit REQUIRED) find_package(Qt5Svg REQUIRED) -include(${QT_USE_FILE}) -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${QT_QTGUI_INCLUDE_DIR}") - set(QUAZIP_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/quazip) add_subdirectory(external/fervor/) include_directories(external/fervor/) # run qt moc on qt-enabled headers -qt5_wrap_cpp(INTERFACE_SRCS src/Application.h src/Webcam.h src/avatar/AvatarVoxelSystem.h - src/avatar/Face.h src/ui/BandwidthDialog.h src/ui/VoxelStatsDialog.h) +# qt5_wrap_cpp(INTERFACE_SRCS src/Application.h src/Webcam.h src/avatar/AvatarVoxelSystem.h +# src/avatar/Face.h src/ui/BandwidthDialog.h src/ui/VoxelStatsDialog.h) # create the executable, make it a bundle on OS X add_executable(${TARGET_NAME} MACOSX_BUNDLE ${INTERFACE_SRCS}) +qt5_use_modules(${TARGET_NAME} Core Gui Network OpenGL WebKit Svg) + # link in the hifi shared library include(${MACRO_DIR}/LinkHifiLibrary.cmake) diff --git a/interface/external/fervor/CMakeLists.txt b/interface/external/fervor/CMakeLists.txt index 111e69a865..0568c32e51 100644 --- a/interface/external/fervor/CMakeLists.txt +++ b/interface/external/fervor/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 2.8) project(Fervor) -find_package(QtCore QtNetwork REQUIRED) +find_package(Qt5Core REQUIRED) +find_package(Qt5Network REQUIRED) +find_package(Qt5Widgets REQUIRED) add_definitions(-DFV_GUI) @@ -13,9 +15,6 @@ list(REMOVE_ITEM FERVOR_HEADERS ${HEADER_PATH}/fvversioncomparator.h) file(GLOB FERVOR_UI *.ui) -qt5_wrap_ui(FERVOR_WRAPPED_UI ${FERVOR_UI}) -qt5_wrap_cpp(FERVOR_MOC_SOURCES ${FERVOR_HEADERS}) - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/") find_package(Quazip REQUIRED) @@ -25,4 +24,6 @@ include_directories( ) add_library(fervor ${FERVOR_SOURCES} ${FERVOR_HEADERS} ${FERVOR_MOC_SOURCES} ${FERVOR_WRAPPED_UI}) -target_link_libraries(fervor ${QUAZIP_LIBRARIES}) \ No newline at end of file +target_link_libraries(fervor ${QUAZIP_LIBRARIES}) + +qt5_use_modules(fervor Core Network Widgets) \ No newline at end of file diff --git a/interface/external/fervor/fvplatform.h b/interface/external/fervor/fvplatform.h index a527518097..a98f04a1ce 100755 --- a/interface/external/fervor/fvplatform.h +++ b/interface/external/fervor/fvplatform.h @@ -1,7 +1,7 @@ #ifndef FVPLATFORM_H #define FVPLATFORM_H -#include +#include class FvPlatform : public QObject { diff --git a/libraries/avatars/CMakeLists.txt b/libraries/avatars/CMakeLists.txt index 8afbae145b..7968b5a003 100644 --- a/libraries/avatars/CMakeLists.txt +++ b/libraries/avatars/CMakeLists.txt @@ -9,12 +9,12 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../../cm set(TARGET_NAME avatars) find_package(Qt5Core) -include(${QT_USE_FILE}) -qt5_wrap_cpp(WRAPPED_SRCS src/AvatarData.h) include(${MACRO_DIR}/SetupHifiLibrary.cmake) setup_hifi_library(${TARGET_NAME}) +qt5_use_modules(${TARGET_NAME} Core) + include(${MACRO_DIR}/IncludeGLM.cmake) include_glm(${TARGET_NAME} ${ROOT_DIR}) diff --git a/libraries/shared/CMakeLists.txt b/libraries/shared/CMakeLists.txt index 0dcf13f418..b0c2771f48 100644 --- a/libraries/shared/CMakeLists.txt +++ b/libraries/shared/CMakeLists.txt @@ -7,12 +7,12 @@ set(TARGET_NAME shared) project(${TARGET_NAME}) find_package(Qt5Core REQUIRED) -include(${QT_USE_FILE}) -qt5_wrap_cpp(WRAPPED_SRCS src/NodeData.h) include(${MACRO_DIR}/SetupHifiLibrary.cmake) setup_hifi_library(${TARGET_NAME}) +qt5_use_modules(${TARGET_NAME} Core) + set(EXTERNAL_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external) if (WIN32) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 9406c6b14d..42aa024e9d 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -512,7 +512,7 @@ void NodeList::loadData(QSettings *settings) { if (domainServerHostname.size() > 0) { memset(_domainHostname, 0, MAX_HOSTNAME_BYTES); - memcpy(_domainHostname, domainServerHostname.toAscii().constData(), domainServerHostname.size()); + memcpy(_domainHostname, domainServerHostname.toLocal8Bit().constData(), domainServerHostname.size()); } settings->endGroup(); From f27eb5e1d8b90b4e534faca655b2be697e7f3aa0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 24 Jul 2013 12:06:55 -0700 Subject: [PATCH 31/32] small code changes for qt5 compatibility --- interface/external/fervor/CMakeLists.txt | 4 +++ interface/src/Application.cpp | 30 +++++++++++----------- interface/src/avatar/AvatarVoxelSystem.cpp | 4 +-- interface/src/ui/ChatEntry.cpp | 2 +- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/interface/external/fervor/CMakeLists.txt b/interface/external/fervor/CMakeLists.txt index 0568c32e51..62968d8833 100644 --- a/interface/external/fervor/CMakeLists.txt +++ b/interface/external/fervor/CMakeLists.txt @@ -9,6 +9,10 @@ add_definitions(-DFV_GUI) file(GLOB FERVOR_SOURCES *.cpp) file(GLOB FERVOR_HEADERS *.h) +file(GLOB FERVOR_UI *.ui) + +qt5_wrap_ui(FERVOR_WRAPPED_UI ${FERVOR_UI}) + LIST(GET FERVOR_HEADERS 1 FIRST_HEADER) GET_FILENAME_COMPONENT(HEADER_PATH ${FIRST_HEADER} PATH) list(REMOVE_ITEM FERVOR_HEADERS ${HEADER_PATH}/fvversioncomparator.h) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0c7820d673..958affebb5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -166,9 +166,9 @@ void GLCanvas::wheelEvent(QWheelEvent* event) { Application::getInstance()->wheelEvent(event); } -void messageHandler(QtMsgType type, const char* message) { - fprintf(stdout, "%s", message); - LogDisplay::instance.addMessage(message); +void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString &message) { + fprintf(stdout, "%s", message.toLocal8Bit().constData()); + LogDisplay::instance.addMessage(message.toLocal8Bit().constData()); } Application::Application(int& argc, char** argv, timeval &startup_time) : @@ -223,7 +223,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _applicationStartupTime = startup_time; _window->setWindowTitle("Interface"); - qInstallMsgHandler(messageHandler); + qInstallMessageHandler(messageHandler); unsigned int listenPort = 0; // bind to an ephemeral port by default const char** constArgv = const_cast(argv); @@ -1217,7 +1217,7 @@ void Application::editPreferences() { if (domainServerHostname->text().size() > 0) { // the user input a new hostname, use that - newHostname = domainServerHostname->text().toAscii(); + newHostname = domainServerHostname->text().toLocal8Bit(); } else { // the user left the field blank, use the default hostname newHostname = QByteArray(DEFAULT_DOMAIN_HOSTNAME); @@ -1513,12 +1513,12 @@ bool Application::sendVoxelsOperation(VoxelNode* node, void* extraData) { } void Application::exportVoxels() { - QString desktopLocation = QDesktopServices::storageLocation(QDesktopServices::DesktopLocation); + QString desktopLocation = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString suggestedName = desktopLocation.append("/voxels.svo"); QString fileNameString = QFileDialog::getSaveFileName(_glWidget, tr("Export Voxels"), suggestedName, tr("Sparse Voxel Octree Files (*.svo)")); - QByteArray fileNameAscii = fileNameString.toAscii(); + QByteArray fileNameAscii = fileNameString.toLocal8Bit(); const char* fileName = fileNameAscii.data(); VoxelNode* selectedNode = _voxels.getVoxelAt(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); if (selectedNode) { @@ -1533,11 +1533,11 @@ void Application::exportVoxels() { const char* IMPORT_FILE_TYPES = "Sparse Voxel Octree Files, Square PNG, Schematic Files (*.svo *.png *.schematic)"; void Application::importVoxelsToClipboard() { - QString desktopLocation = QDesktopServices::storageLocation(QDesktopServices::DesktopLocation); + QString desktopLocation = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString fileNameString = QFileDialog::getOpenFileName(_glWidget, tr("Import Voxels to Clipboard"), desktopLocation, tr(IMPORT_FILE_TYPES)); - QByteArray fileNameAscii = fileNameString.toAscii(); + QByteArray fileNameAscii = fileNameString.toLocal8Bit(); const char* fileName = fileNameAscii.data(); _clipboardTree.eraseAllVoxels(); @@ -1567,11 +1567,11 @@ void Application::importVoxelsToClipboard() { } void Application::importVoxels() { - QString desktopLocation = QDesktopServices::storageLocation(QDesktopServices::DesktopLocation); + QString desktopLocation = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString fileNameString = QFileDialog::getOpenFileName(_glWidget, tr("Import Voxels"), desktopLocation, tr(IMPORT_FILE_TYPES)); - QByteArray fileNameAscii = fileNameString.toAscii(); + QByteArray fileNameAscii = fileNameString.toLocal8Bit(); const char* fileName = fileNameAscii.data(); VoxelTree importVoxels; @@ -2005,7 +2005,7 @@ void Application::update(float deltaTime) { // Set where I am looking based on my mouse ray (so that other people can see) glm::vec3 eyePosition; - if (_isLookingAtOtherAvatar = isLookingAtOtherAvatar(mouseRayOrigin, mouseRayDirection, eyePosition)) { + if ((_isLookingAtOtherAvatar = isLookingAtOtherAvatar(mouseRayOrigin, mouseRayDirection, eyePosition))) { // If the mouse is over another avatar's head... glm::vec3 myLookAtFromMouse(eyePosition); _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); @@ -2270,7 +2270,7 @@ void Application::updateAvatar(float deltaTime) { _viewFrustum.computePickRay(MIDPOINT_OF_SCREEN, MIDPOINT_OF_SCREEN, screenCenterRayOrigin, screenCenterRayDirection); glm::vec3 eyePosition; - if (_isLookingAtOtherAvatar = isLookingAtOtherAvatar(screenCenterRayOrigin, screenCenterRayDirection, eyePosition)) { + if ((_isLookingAtOtherAvatar = isLookingAtOtherAvatar(screenCenterRayOrigin, screenCenterRayDirection, eyePosition))) { glm::vec3 myLookAtFromMouse(eyePosition); _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); } @@ -3584,7 +3584,7 @@ void Application::saveSettings(QSettings* settings) { } void Application::importSettings() { - QString locationDir(QDesktopServices::displayName(QDesktopServices::DesktopLocation)); + QString locationDir(QStandardPaths::displayName(QStandardPaths::DesktopLocation)); QString fileName = QFileDialog::getOpenFileName(_window, tr("Open .ini config file"), locationDir, @@ -3596,7 +3596,7 @@ void Application::importSettings() { } void Application::exportSettings() { - QString locationDir(QDesktopServices::displayName(QDesktopServices::DesktopLocation)); + QString locationDir(QStandardPaths::displayName(QStandardPaths::DesktopLocation)); QString fileName = QFileDialog::getSaveFileName(_window, tr("Save .ini config file"), locationDir, diff --git a/interface/src/avatar/AvatarVoxelSystem.cpp b/interface/src/avatar/AvatarVoxelSystem.cpp index c85ea1a343..a9f6b31072 100644 --- a/interface/src/avatar/AvatarVoxelSystem.cpp +++ b/interface/src/avatar/AvatarVoxelSystem.cpp @@ -121,7 +121,7 @@ void AvatarVoxelSystem::setVoxelURL(const QUrl& url) { // handle "file://" urls... if (url.isLocalFile()) { QString pathString = url.path(); - QByteArray pathAsAscii = pathString.toAscii(); + QByteArray pathAsAscii = pathString.toLocal8Bit(); const char* path = pathAsAscii.data(); readFromSVOFile(path); return; @@ -255,7 +255,7 @@ void AvatarVoxelSystem::handleVoxelDownloadProgress(qint64 bytesReceived, qint64 } void AvatarVoxelSystem::handleVoxelReplyError() { - qDebug("%s\n", _voxelReply->errorString().toAscii().constData()); + qDebug("%s\n", _voxelReply->errorString().toLocal8Bit().constData()); _voxelReply->disconnect(this); _voxelReply->deleteLater(); diff --git a/interface/src/ui/ChatEntry.cpp b/interface/src/ui/ChatEntry.cpp index 588c394eb1..f9ea4eb1f6 100644 --- a/interface/src/ui/ChatEntry.cpp +++ b/interface/src/ui/ChatEntry.cpp @@ -66,7 +66,7 @@ bool ChatEntry::keyPressEvent(QKeyEvent* event) { return true; } if (_contents.size() < MAX_CONTENT_LENGTH) { - _contents.insert(_cursorPos, 1, text.at(0).toAscii()); + _contents.insert(_cursorPos, 1, text.at(0).toLatin1()); _cursorPos++; } return true; From b8de278d9010e7d889ed2cf51dbcb14b1473bb2c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 24 Jul 2013 12:10:36 -0700 Subject: [PATCH 32/32] use env variable for QT cmake prefix path --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 34392a7c5d..afd0ed07f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,8 @@ cmake_minimum_required(VERSION 2.8) project(hifi) -set(CMAKE_PREFIX_PATH "/usr/local/Cellar/qt5/5.1.0/lib/cmake") +message($ENV{QT_CMAKE_PREFIX_PATH}) +set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} $ENV{QT_CMAKE_PREFIX_PATH}) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON)