Send Entity Query via conical frustums

This commit is contained in:
Clement 2018-04-30 19:50:51 -07:00
parent e400eb4ed2
commit 67c119cd2e
6 changed files with 18 additions and 28 deletions

View file

@ -108,7 +108,7 @@ void EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O
DiffTraversal::View newView; DiffTraversal::View newView;
ViewFrustum viewFrustum; ConicalViewFrustum viewFrustum;
if (nodeData->hasMainViewFrustum()) { if (nodeData->hasMainViewFrustum()) {
nodeData->copyCurrentMainViewFrustum(viewFrustum); nodeData->copyCurrentMainViewFrustum(viewFrustum);
newView.viewFrustums.push_back(viewFrustum); newView.viewFrustums.push_back(viewFrustum);

View file

@ -245,7 +245,8 @@ enum class EntityQueryPacketVersion: PacketVersion {
JSONFilterWithFamilyTree = 19, JSONFilterWithFamilyTree = 19,
ConnectionIdentifier = 20, ConnectionIdentifier = 20,
RemovedJurisdictions = 21, RemovedJurisdictions = 21,
MultiFrustumQuery = 22 MultiFrustumQuery = 22,
ConicalFrustums = 23
}; };
enum class AssetServerPacketVersion: PacketVersion { enum class AssetServerPacketVersion: PacketVersion {

View file

@ -50,15 +50,11 @@ int OctreeQuery::getBroadcastData(unsigned char* destinationBuffer) {
destinationBuffer += sizeof(frustumFlags); destinationBuffer += sizeof(frustumFlags);
if (_hasMainFrustum) { if (_hasMainFrustum) {
auto byteArray = _mainViewFrustum.toByteArray(); destinationBuffer += _mainViewFrustum.serialize(destinationBuffer);
memcpy(destinationBuffer, byteArray.constData(), byteArray.size());
destinationBuffer += byteArray.size();
} }
if (_hasSecondaryFrustum) { if (_hasSecondaryFrustum) {
auto byteArray = _secondaryViewFrustum.toByteArray(); destinationBuffer += _secondaryViewFrustum.serialize(destinationBuffer);
memcpy(destinationBuffer, byteArray.constData(), byteArray.size());
destinationBuffer += byteArray.size();
} }
// desired Max Octree PPS // desired Max Octree PPS
@ -131,15 +127,11 @@ int OctreeQuery::parseData(ReceivedMessage& message) {
_hasSecondaryFrustum = frustumFlags & QUERY_HAS_SECONDARY_FRUSTUM; _hasSecondaryFrustum = frustumFlags & QUERY_HAS_SECONDARY_FRUSTUM;
if (_hasMainFrustum) { if (_hasMainFrustum) {
auto bytesLeft = endPosition - sourceBuffer; sourceBuffer += _mainViewFrustum.deserialize(sourceBuffer);
auto byteArray = QByteArray::fromRawData(reinterpret_cast<const char*>(sourceBuffer), bytesLeft);
sourceBuffer += _mainViewFrustum.fromByteArray(byteArray);
} }
if (_hasSecondaryFrustum) { if (_hasSecondaryFrustum) {
auto bytesLeft = endPosition - sourceBuffer; sourceBuffer += _secondaryViewFrustum.deserialize(sourceBuffer);
auto byteArray = QByteArray::fromRawData(reinterpret_cast<const char*>(sourceBuffer), bytesLeft);
sourceBuffer += _secondaryViewFrustum.fromByteArray(byteArray);
} }
// desired Max Octree PPS // desired Max Octree PPS

View file

@ -16,8 +16,7 @@
#include <QtCore/QReadWriteLock> #include <QtCore/QReadWriteLock>
#include <NodeData.h> #include <NodeData.h>
#include <shared/ConicalViewFrustum.h>
#include <ViewFrustum.h>
#include "OctreeConstants.h" #include "OctreeConstants.h"
@ -37,12 +36,10 @@ public:
bool hasMainViewFrustum() const { return _hasMainFrustum; } bool hasMainViewFrustum() const { return _hasMainFrustum; }
void setMainViewFrustum(const ViewFrustum& viewFrustum) { _hasMainFrustum = true; _mainViewFrustum = viewFrustum; } void setMainViewFrustum(const ViewFrustum& viewFrustum) { _hasMainFrustum = true; _mainViewFrustum = viewFrustum; }
void clearMainViewFrustum() { _hasMainFrustum = false; } void clearMainViewFrustum() { _hasMainFrustum = false; }
const ViewFrustum& getMainViewFrustum() const { return _mainViewFrustum; }
bool hasSecondaryViewFrustum() const { return _hasSecondaryFrustum; } bool hasSecondaryViewFrustum() const { return _hasSecondaryFrustum; }
void setSecondaryViewFrustum(const ViewFrustum& viewFrustum) { _hasSecondaryFrustum = true; _secondaryViewFrustum = viewFrustum; } void setSecondaryViewFrustum(const ViewFrustum& viewFrustum) { _hasSecondaryFrustum = true; _secondaryViewFrustum = viewFrustum; }
void clearSecondaryViewFrustum() { _hasSecondaryFrustum = false; } void clearSecondaryViewFrustum() { _hasSecondaryFrustum = false; }
const ViewFrustum& getSecondaryViewFrustum() const { return _secondaryViewFrustum; }
// getters/setters for JSON filter // getters/setters for JSON filter
QJsonObject getJSONParameters() { QReadLocker locker { &_jsonParametersLock }; return _jsonParameters; } QJsonObject getJSONParameters() { QReadLocker locker { &_jsonParametersLock }; return _jsonParameters; }
@ -68,9 +65,9 @@ public slots:
protected: protected:
bool _hasMainFrustum { false }; bool _hasMainFrustum { false };
ViewFrustum _mainViewFrustum; ConicalViewFrustum _mainViewFrustum;
bool _hasSecondaryFrustum { false }; bool _hasSecondaryFrustum { false };
ViewFrustum _secondaryViewFrustum; ConicalViewFrustum _secondaryViewFrustum;
// octree server sending items // octree server sending items
int _maxQueryPPS = DEFAULT_MAX_OCTREE_PPS; int _maxQueryPPS = DEFAULT_MAX_OCTREE_PPS;

View file

@ -139,12 +139,12 @@ void OctreeQueryNode::writeToPacket(const unsigned char* buffer, unsigned int by
} }
} }
void OctreeQueryNode::copyCurrentMainViewFrustum(ViewFrustum& viewOut) const { void OctreeQueryNode::copyCurrentMainViewFrustum(ConicalViewFrustum& viewOut) const {
QMutexLocker viewLocker(&_viewMutex); QMutexLocker viewLocker(&_viewMutex);
viewOut = _currentMainViewFrustum; viewOut = _currentMainViewFrustum;
} }
void OctreeQueryNode::copyCurrentSecondaryViewFrustum(ViewFrustum& viewOut) const { void OctreeQueryNode::copyCurrentSecondaryViewFrustum(ConicalViewFrustum& viewOut) const {
QMutexLocker viewLocker(&_viewMutex); QMutexLocker viewLocker(&_viewMutex);
viewOut = _currentSecondaryViewFrustum; viewOut = _currentSecondaryViewFrustum;
} }

View file

@ -14,14 +14,14 @@
#include <iostream> #include <iostream>
#include <NodeData.h> #include <qqueue.h>
#include "OctreeConstants.h" #include "OctreeConstants.h"
#include "OctreeElementBag.h" #include "OctreeElementBag.h"
#include "OctreePacketData.h" #include "OctreePacketData.h"
#include "OctreeQuery.h" #include "OctreeQuery.h"
#include "OctreeSceneStats.h" #include "OctreeSceneStats.h"
#include "SentPacketHistory.h" #include "SentPacketHistory.h"
#include <qqueue.h>
class OctreeSendThread; class OctreeSendThread;
class OctreeServer; class OctreeServer;
@ -49,8 +49,8 @@ public:
OctreeElementExtraEncodeData extraEncodeData; OctreeElementExtraEncodeData extraEncodeData;
void copyCurrentMainViewFrustum(ViewFrustum& viewOut) const; void copyCurrentMainViewFrustum(ConicalViewFrustum& viewOut) const;
void copyCurrentSecondaryViewFrustum(ViewFrustum& viewOut) const; void copyCurrentSecondaryViewFrustum(ConicalViewFrustum& viewOut) const;
// These are not classic setters because they are calculating and maintaining state // These are not classic setters because they are calculating and maintaining state
// which is set asynchronously through the network receive // which is set asynchronously through the network receive
@ -97,8 +97,8 @@ private:
quint64 _firstSuppressedPacket { usecTimestampNow() }; quint64 _firstSuppressedPacket { usecTimestampNow() };
mutable QMutex _viewMutex { QMutex::Recursive }; mutable QMutex _viewMutex { QMutex::Recursive };
ViewFrustum _currentMainViewFrustum; ConicalViewFrustum _currentMainViewFrustum;
ViewFrustum _currentSecondaryViewFrustum; ConicalViewFrustum _currentSecondaryViewFrustum;
bool _viewFrustumChanging { false }; bool _viewFrustumChanging { false };
bool _viewFrustumJustStoppedChanging { true }; bool _viewFrustumJustStoppedChanging { true };