21 #include <QtCore/QJsonObject>
23 #include <shared/ReadWriteLockable.h>
24 #include <SimpleMovingAverage.h>
25 #include <ViewFrustum.h>
27 #include "OctreeElement.h"
28 #include "OctreeElementBag.h"
29 #include "OctreePacketData.h"
30 #include "OctreeSceneStats.h"
31 #include "OctreeUtils.h"
33 class ReadBitstreamToTreeParams;
38 using OctreePointer = std::shared_ptr<Octree>;
40 extern QVector<QString> PERSIST_EXTENSIONS;
45 virtual bool preRecursion(
const OctreeElementPointer& element) = 0;
46 virtual bool postRecursion(
const OctreeElementPointer& element) = 0;
47 virtual OctreeElementPointer possiblyCreateChildAt(
const OctreeElementPointer& element,
int childIndex) {
return NULL; }
51 using RecurseOctreeOperation = std::function<bool(
const OctreeElementPointer&,
void*)>;
53 using RecurseOctreeSortingOperation = std::function<float(
const OctreeElementPointer&,
void*)>;
54 using SortedChild = std::pair<float, OctreeElementPointer>;
55 typedef QHash<uint, AACube> CubeList;
57 const bool NO_EXISTS_BITS =
false;
58 const bool WANT_EXISTS_BITS =
true;
60 const int NO_BOUNDARY_ADJUST = 0;
61 const int LOW_RES_MOVING_ADJUST = 1;
63 class EncodeBitstreamParams {
65 bool includeExistsBits;
76 EncodeBitstreamParams(
bool includeExistsBits = WANT_EXISTS_BITS,
77 NodeData* nodeData =
nullptr) :
78 includeExistsBits(includeExistsBits),
84 void displayStopReason() {
85 printf(
"StopReason: ");
87 case UNKNOWN: qDebug(
"UNKNOWN");
break;
88 case DIDNT_FIT: qDebug(
"DIDNT_FIT");
break;
89 case FINISHED: qDebug(
"FINISHED");
break;
93 QString getStopReason() {
95 case UNKNOWN:
return QString(
"UNKNOWN");
break;
96 case DIDNT_FIT:
return QString(
"DIDNT_FIT");
break;
97 case FINISHED:
return QString(
"FINISHED");
break;
101 std::function<void(
const QUuid& dataID, quint64 itemLastEdited)> trackSend { [](
const QUuid&, quint64){} };
104 class ReadBitstreamToTreeParams {
106 bool includeExistsBits;
107 OctreeElementPointer destinationElement;
109 SharedNodePointer sourceNode;
110 int elementsPerPacket = 0;
111 int entitiesPerPacket = 0;
113 ReadBitstreamToTreeParams(
114 bool includeExistsBits = WANT_EXISTS_BITS,
115 OctreeElementPointer destinationElement = NULL,
116 QUuid sourceUUID = QUuid(),
117 SharedNodePointer sourceNode = SharedNodePointer()) :
118 includeExistsBits(includeExistsBits),
119 destinationElement(destinationElement),
120 sourceUUID(sourceUUID),
121 sourceNode(sourceNode)
125 class Octree :
public QObject,
public std::enable_shared_from_this<Octree>,
public ReadWriteLockable {
128 Octree(
bool shouldReaverage =
false);
132 virtual OctreeElementPointer createNewElement(
unsigned char * octalCode = NULL) = 0;
136 virtual PacketType expectedDataPacketType()
const {
return PacketType::Unknown; }
137 virtual PacketVersion expectedVersion()
const {
return versionForPacketType(expectedDataPacketType()); }
138 virtual bool handlesEditPacketType(PacketType packetType)
const {
return false; }
139 virtual int processEditPacketData(ReceivedMessage& message,
const unsigned char* editData,
int maxLength,
140 const SharedNodePointer& sourceNode) {
return 0; }
142 virtual bool rootElementHasData()
const {
return false; }
143 virtual void releaseSceneEncodeData(OctreeElementExtraEncodeData* extraEncodeData)
const { }
147 virtual void preUpdate() { }
148 virtual void update(
bool simulate =
true) { }
150 OctreeElementPointer getRoot() {
return _rootElement; }
152 virtual void eraseDomainAndNonOwnedEntities() { _isDirty =
true; };
153 virtual void eraseAllOctreeElements(
bool createNewRoot =
true);
155 virtual void readBitstreamToTree(
const unsigned char* bitstream, uint64_t bufferSizeBytes, ReadBitstreamToTreeParams& args);
156 void reaverageOctreeElements(OctreeElementPointer startElement = OctreeElementPointer());
160 OctreeElementPointer getOctreeElementAt(
float x,
float y,
float z,
float s)
const;
164 OctreeElementPointer getOctreeEnclosingElementAt(
float x,
float y,
float z,
float s)
const;
166 OctreeElementPointer getOrCreateChildElementAt(
float x,
float y,
float z,
float s);
167 OctreeElementPointer getOrCreateChildElementContaining(
const AACube& box);
169 void recurseTreeWithOperation(
const RecurseOctreeOperation& operation,
void* extraData = NULL);
170 void recurseTreeWithOperationSorted(
const RecurseOctreeOperation& operation,
const RecurseOctreeSortingOperation& sortingOperation,
void* extraData = NULL);
174 bool isDirty()
const {
return _isDirty; }
175 void clearDirtyBit() { _isDirty =
false; }
176 void setDirtyBit() { _isDirty =
true; }
185 bool findSpherePenetration(
const glm::vec3& center,
float radius, glm::vec3& penetration,
void** penetratedObject = NULL,
186 Octree::lockType lockType = Octree::TryLock,
bool* accurateResult = NULL);
188 bool findCapsulePenetration(
const glm::vec3& start,
const glm::vec3& end,
float radius, glm::vec3& penetration,
189 Octree::lockType lockType = Octree::TryLock,
bool* accurateResult = NULL);
193 bool findContentInCube(
const AACube& cube, CubeList& cubes);
198 OctreeElementPointer getElementEnclosingPoint(
const glm::vec3& point,
199 Octree::lockType lockType = Octree::TryLock,
bool* accurateResult = NULL);
202 void loadOctreeFile(
const char* fileName);
205 bool toJSONDocument(QJsonDocument* doc,
const OctreeElementPointer& element =
nullptr);
206 bool toJSONString(QString& jsonString,
const OctreeElementPointer& element =
nullptr);
207 bool toJSON(QByteArray* data,
const OctreeElementPointer& element =
nullptr,
bool doGzip =
false);
208 bool writeToFile(
const char* filename,
const OctreeElementPointer& element =
nullptr, QString persistAsFileType =
"json.gz");
209 bool writeToJSONFile(
const char* filename,
const OctreeElementPointer& element =
nullptr,
bool doGzip =
false);
210 virtual bool writeToMap(QVariantMap& entityDescription, OctreeElementPointer element,
bool skipDefaultValues,
211 bool skipThoseWithBadParents) = 0;
212 virtual bool writeToJSON(QString& jsonString,
const OctreeElementPointer& element) = 0;
215 bool readFromFile(
const char* filename);
216 bool readFromURL(
const QString& url,
const bool isObservable =
true,
const qint64 callerId = -1,
const bool isImport =
false);
217 bool readFromByteArray(
const QString& url,
const QByteArray& byteArray);
218 bool readFromStream(uint64_t streamLength, QDataStream& inputStream,
const bool isImport =
false,
const QUrl& urlString = QUrl());
219 bool readJSONFromStream(uint64_t streamLength, QDataStream& inputStream,
const bool isImport =
false,
const QUrl& urlString = QUrl());
220 bool readJSONFromGzippedFile(QString qFileName);
221 virtual bool readFromMap(QVariantMap& entityDescription,
const bool isImport =
false) = 0;
223 uint64_t getOctreeElementsCount();
225 bool getShouldReaverage()
const {
return _shouldReaverage; }
227 void recurseElementWithOperation(
const OctreeElementPointer& element,
const RecurseOctreeOperation& operation,
228 void* extraData,
int recursionCount = 0);
229 bool recurseElementWithOperationSorted(
const OctreeElementPointer& element,
const RecurseOctreeOperation& operation,
230 const RecurseOctreeSortingOperation& sortingOperation,
void* extraData,
int recursionCount = 0);
232 bool recurseElementWithOperator(
const OctreeElementPointer& element,
RecurseOctreeOperator* operatorObject,
int recursionCount = 0);
234 bool getIsViewing()
const {
return _isViewing; }
235 void setIsViewing(
bool isViewing) { _isViewing = isViewing; }
237 bool getIsServer()
const {
return _isServer; }
238 void setIsServer(
bool isServer) { _isServer = isServer; }
240 bool getIsClient()
const {
return !_isServer; }
241 void setIsClient(
bool isClient) { _isServer = !isClient; }
243 virtual void dumpTree() { }
244 virtual void pruneTree() { }
246 void setOctreeVersionInfo(QUuid
id, int64_t dataVersion) {
248 _persistDataVersion = dataVersion;
251 virtual void resetEditStats() { }
252 virtual quint64 getAverageDecodeTime()
const {
return 0; }
253 virtual quint64 getAverageLookupTime()
const {
return 0; }
254 virtual quint64 getAverageUpdateTime()
const {
return 0; }
255 virtual quint64 getAverageCreateTime()
const {
return 0; }
256 virtual quint64 getAverageLoggingTime()
const {
return 0; }
257 virtual quint64 getAverageFilterTime()
const {
return 0; }
259 void incrementPersistDataVersion() { _persistDataVersion++; }
263 void deleteOctalCodeFromTreeRecursion(
const OctreeElementPointer& element,
void* extraData);
265 static bool countOctreeElementsOperation(
const OctreeElementPointer& element,
void* extraData);
267 OctreeElementPointer nodeForOctalCode(
const OctreeElementPointer& ancestorElement,
const unsigned char* needleCode, OctreeElementPointer* parentOfFoundElement)
const;
268 OctreeElementPointer createMissingElement(
const OctreeElementPointer& lastParentElement,
const unsigned char* codeToReach,
int recursionCount = 0);
269 int readElementData(
const OctreeElementPointer& destinationElement,
const unsigned char* nodeData,
270 int bufferSizeBytes, ReadBitstreamToTreeParams& args);
272 OctreeElementPointer _rootElement =
nullptr;
274 QUuid _persistID { QUuid::createUuid() };
275 int _persistDataVersion { 0 };
278 bool _shouldReaverage;
Handles packing of the data portion of PacketType_OCTREE_DATA messages.
Definition: OctreePacketData.h:93
derive from this class to use the Octree::recurseTreeWithOperator() method
Definition: Octree.h:43