Overte C++ Documentation
OctreeQuery.h
1 //
2 // OctreeQuery.h
3 // libraries/octree/src
4 //
5 // Created by Stephen Birarda on 4/9/13.
6 // Copyright 2013 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_OctreeQuery_h
13 #define hifi_OctreeQuery_h
14 
15 #include <QtCore/QJsonObject>
16 #include <QtCore/QReadWriteLock>
17 
18 #include <NodeData.h>
19 #include <shared/ConicalViewFrustum.h>
20 
21 #include "OctreeConstants.h"
22 
23 class OctreeQuery : public NodeData {
24  Q_OBJECT
25 
26 public:
27  OctreeQuery(bool randomizeConnectionID = false);
28  virtual ~OctreeQuery() {}
29 
30  OctreeQuery(const OctreeQuery&) = delete;
31  OctreeQuery& operator=(const OctreeQuery&) = delete;
32 
33  int getBroadcastData(unsigned char* destinationBuffer);
34  int parseData(ReceivedMessage& message) override;
35 
36  bool hasConicalViews() const { QMutexLocker lock(&_conicalViewsLock); return !_conicalViews.empty(); }
37  void setConicalViews(ConicalViewFrustums views)
38  { QMutexLocker lock(&_conicalViewsLock); _conicalViews = views; }
39  void clearConicalViews() { QMutexLocker lock(&_conicalViewsLock); _conicalViews.clear(); }
40 
41  // getters/setters for JSON filter
42  QJsonObject getJSONParameters() { QReadLocker locker { &_jsonParametersLock }; return _jsonParameters; }
43  void setJSONParameters(const QJsonObject& jsonParameters)
44  { QWriteLocker locker { &_jsonParametersLock }; _jsonParameters = jsonParameters; }
45 
46  // related to Octree Sending strategies
47  int getMaxQueryPacketsPerSecond() const { return _maxQueryPPS; }
48  float getOctreeSizeScale() const { return _octreeElementSizeScale; }
49  int getBoundaryLevelAdjust() const { return _boundaryLevelAdjust; }
50 
51  void incrementConnectionID() { ++_connectionID; }
52 
53  bool hasReceivedFirstQuery() const { return _hasReceivedFirstQuery; }
54 
55  // Want a report when the initial query is complete.
56  bool wantReportInitialCompletion() const { return _reportInitialCompletion; }
57  void setReportInitialCompletion(bool reportInitialCompletion) { _reportInitialCompletion = reportInitialCompletion; }
58 
59 signals:
60  void incomingConnectionIDChanged();
61 
62 public slots:
63  void setMaxQueryPacketsPerSecond(int maxQueryPPS) { _maxQueryPPS = maxQueryPPS; }
64  void setOctreeSizeScale(float octreeSizeScale) { _octreeElementSizeScale = octreeSizeScale; }
65  void setBoundaryLevelAdjust(int boundaryLevelAdjust) { _boundaryLevelAdjust = boundaryLevelAdjust; }
66 
67 protected:
68  mutable QMutex _conicalViewsLock;
69  ConicalViewFrustums _conicalViews;
70 
71  // octree server sending items
72  int _maxQueryPPS = DEFAULT_MAX_OCTREE_PPS;
73  float _octreeElementSizeScale = DEFAULT_OCTREE_SIZE_SCALE;
74  int _boundaryLevelAdjust = 0;
75 
76  uint16_t _connectionID; // query connection ID, randomized to start, increments with each new connection to server
77 
78  QJsonObject _jsonParameters;
79  QReadWriteLock _jsonParametersLock;
80 
81  enum OctreeQueryFlags : uint16_t { NoFlags = 0x0, WantInitialCompletion = 0x1 };
82  friend OctreeQuery::OctreeQueryFlags operator|=(OctreeQuery::OctreeQueryFlags& lhs, const int rhs);
83 
84  bool _hasReceivedFirstQuery { false };
85  bool _reportInitialCompletion { false };
86 };
87 
88 #endif // hifi_OctreeQuery_h